diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/AUTHORS ns-3.36/AUTHORS
--- ns-3.35/AUTHORS	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/AUTHORS	2022-04-30 18:23:57.634732500 -0700
@@ -126,6 +126,7 @@
 Sourabh Jain (jainsourabh679@gmail.com)
 Vivek Jain (jain.vivek.anand@gmail.com)
 Sam Jansen (sam.jansen@gmail.com)
+Chandrakant Jena (chandrakant.barcelona@gmail.com)
 Liu Jian (liujatp@gmail.com)
 Sascha Alexander Jopen (jopen@informatik.uni-bonn.de)
 Piotr Jurkiewicz (piotr.jerzy.jurkiewicz@gmail.com)
@@ -137,6 +138,7 @@
 Bhaskar Kataria (www.bhaskar.com7@gmail.com)
 Morteza Kheirkhah (m.kheirkhah@sussex.ac.uk)
 JÃ¶rg Christian Kirchhof (christian.kirchhof@rwth-aachen.de)
+Ohad Klausner
 Katarina Koutlia (katerina.koutlia@cttc.es)
 Shravya Ks (shravya.ks0@gmail.com)
 Flavio Kubota (flaviokubota@gmail.com)
@@ -153,6 +155,7 @@
 Emmanuelle Laprise (emmmanuelle.laprise@bluekazoo.ca)
 Harsh Lara (harshapplefan@gmail.com)
 Mattia Lecci (mattia.lecci@gmail.com)
+Robin Lee (xinyashuai1987@163.com)
 Kristijan LenkoviÄ‡ (k.lenkovic@me.com)
 Daniel Lertpratchya (nikkipui@gmail.com)
 Brett Levasseur (brettl20@gmail.com)
@@ -182,6 +185,7 @@
 Faker Moatamri (faker.moatamri@inria.fr)
 Edvin MoÄ�ibob (edvin.mocibob@gmail.com)
 Amir Modarresi (amodarresi@ittc.ku.edu)
+Akash Mondal (a98mondal@gmail.com)
 Mike Moreton (mjvm_ns@hotmail.com)
 Michele Muccio (michelemuccio@virgilio.it)
 Esteban Municio (esteban.municio@urjc.es)
@@ -214,7 +218,7 @@
 Josh Pelkey (jpelkey@gatech.edu)
 Per (per_e_lists@rocketmail.com)
 Fernando Pereira (ferdonfeup@gmail.com)
-Colin Perkins (csp@csperkins.org) 
+Colin Perkins (csp@csperkins.org)
 Eduardo Pinto (epmcj@hotmail.com)
 Giuseppe Piro (g.piro@poliba.it)
 Randall Plate (rplate@spawar.navy.mil)
@@ -265,12 +269,13 @@
 Phillip Sitbon (phillip.sitbon@gmail.com)
 Pedro Silva (pmms@inesctec.pt)
 Siddharth Singh (siddharth12375@gmail.com)
-Anirudh Sivaraman (sk.anirudh@gmail.com) 
+Anirudh Sivaraman (sk.anirudh@gmail.com)
 Steven Smith (smith84@llnl.gov)
 Izydor Sokoler (Izydor.sokoler@gmail.com)
 SolomonAnn (thss15_anyz@163.com)
 Lauri Sormunen (lauri.sormunen@magister.fi)
 Akin Soysal (akinsoysal@gmail.com)
+Gard Spreemann (gard.spreemann@telenor.com)
 Andrew Stanton (acstanton515@gmail.com)
 Ewgenij Starostin (estar@cs.tu-berlin.de)
 Greg Steinbrecher (grs@fb.com)
@@ -298,6 +303,7 @@
 Danqi Wang (beyondwdq@gmail.com)
 Tinghui Wang (tinghui.wang@wsu.edu)
 Mitch Watrous (watrous@u.washington.edu)
+Pierre Wendling (pierre.wendling.4@gmail.com)
 Florian Westphal (fw@strlen.de)
 He Wu (mdzz@u.washington.edu)
 Xiuchao Wu (xiuchao@amazon.com)
@@ -306,6 +312,7 @@
 Menglei Zhang (menglei@nyu.edu)
 Theodore Zhang (harryzwh@gmail.com)
 Dizhi Zhou (dizhi.zhou@gmail.com)
+Tolik Zinovyev (tolik@bu.edu)
 Tommaso Zugno (tommasozugno@gmail.com)
 hax0kartik (GCI 2019)
 howie (GCI 2019)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/bindings/python/ns3modulescan-modular.py ns-3.36/bindings/python/ns3modulescan-modular.py
--- ns-3.35/bindings/python/ns3modulescan-modular.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/bindings/python/ns3modulescan-modular.py	2022-04-30 18:23:57.642732600 -0700
@@ -232,12 +232,12 @@
     #module_parser.add_post_scan_hook(post_scan_hook)
 
     castxml_options = dict(
-        include_paths=[top_builddir],
+        include_paths=[top_builddir, os.path.join(top_builddir, "include")],
          define_symbols={
             #'NS3_ASSERT_ENABLE': None,
             #'NS3_LOG_ENABLE': None,
             },
-        cflags=('-std=c++14 %s' % cflags)
+        cflags=('-std=c++17 %s' % cflags)
         )
 
     try:
@@ -256,6 +256,8 @@
     scan_header = os.path.join(os.path.dirname(output_file_name), "scan-header.h")
     if not os.path.exists(scan_header):
         scan_header = os.path.join(top_builddir, "ns3", "%s-module.h" % module_name)
+    if not os.path.exists(scan_header):
+        scan_header = os.path.join(top_builddir, "include", "ns3", "%s-module.h" % module_name)
 
     module_parser.parse_init([scan_header],
                              None, whitelist_paths=[top_builddir],
@@ -280,5 +282,11 @@
     if len(sys.argv) != 6:
         print("ns3modulescan-modular.py top_builddir module_path module_headers output_file_name cflags")
         sys.exit(1)
-    ns3_module_scan(sys.argv[1], sys.argv[2], eval(sys.argv[3]), sys.argv[4], sys.argv[5])
+    if os.path.exists(sys.argv[3]):
+        import json
+        with open(sys.argv[3], "r") as f:
+            module_headers = json.load(f)
+    else:
+        module_headers = eval(sys.argv[3])
+    ns3_module_scan(sys.argv[1], sys.argv[2], module_headers, sys.argv[4], sys.argv[5])
     sys.exit(0)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/bindings/python/_required_pybindgen_version.py ns-3.36/bindings/python/_required_pybindgen_version.py
--- ns-3.35/bindings/python/_required_pybindgen_version.py	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/bindings/python/_required_pybindgen_version.py	2022-04-30 18:23:57.642732600 -0700
@@ -0,0 +1,9 @@
+# Store version information for required pybindgen version, used by
+# ns-3-allinone/download.py.
+# If specifying a released pybindgen version, specify the required pybindgen
+# version as, e.g. '0.21.0'
+# If specifying a commit on the development tree, specify it like this based
+# on 'git describe --tags' command.  Example, if the latest release was 0.21.0,
+# and 'git describe --tags' reports "0.21.0-6-g8e7c0a9", then write the
+# version string below as '0.21.0.post6+ng8e7c0a9'
+__required_pybindgen_version__ = '0.22.1'
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/bindings/python/wscript ns-3.36/bindings/python/wscript
--- ns-3.35/bindings/python/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/bindings/python/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,547 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-from __future__ import print_function
-import types
-import re
-import os
-import subprocess
-import shutil
-import sys
-
-from waflib import Task, Options, Configure, TaskGen, Logs, Build, Utils, Errors
-from waflib.Errors import WafError
-
-# feature  = TaskGen.feature
-# after = TaskGen.after
-
-# https://github.com/gjcarneiro/pybindgen
-# If specifying a released pybindgen version, specify the required PYBINDGEN
-# version as, e.g. '0.21.0'
-# If specifying a commit on the development tree, specify it like this based
-# on 'git describe --tags' command.  Example, if the latest release was 0.21.0,
-# and 'git describe --tags' reports "0.21.0-6-g8e7c0a9", then write the
-# PYBINDGEN version string below as '0.21.0.post6+ng8e7c0a9'
-REQUIRED_PYBINDGEN_VERSION = '0.22.0'
-REQUIRED_PYGCCXML_VERSION = (2, 0, 1)
-REQUIRED_CASTXML_VERSION = '0.2'
-
-RUN_ME=-3
-
-# return types of some APIs differ in Python 2/3 (type string vs class bytes)
-# This method will decode('utf-8') a byte object in Python 3,
-# and do nothing in Python 2
-def maybe_decode(input):
-    if sys.version_info < (3,):
-        return input
-    else:
-        try: 
-            return input.decode('utf-8')
-        except:
-            sys.exc_clear()
-            return input
-
-def add_to_python_path(path):
-    if os.environ.get('PYTHONPATH', ''):
-        os.environ['PYTHONPATH'] = path + os.pathsep + os.environ.get('PYTHONPATH')
-    else:
-        os.environ['PYTHONPATH'] = path
-
-def set_pybindgen_pythonpath(env):
-    if env['WITH_PYBINDGEN']:
-        add_to_python_path(env['WITH_PYBINDGEN'])
-
-
-def options(opt):
-    opt.load('python')
-    opt.add_option('--disable-python',
-                   help=("Don't build Python bindings."),
-                   action="store_true", default=False,
-                   dest='python_disable')
-    opt.add_option('--apiscan',
-                   help=("Rescan the API for the indicated module(s), for Python bindings.  "
-                         "Needs working CastXML / pygccxml environment.  "
-                         "The metamodule 'all' expands to all available ns-3 modules."),
-                   default=None, dest='apiscan', metavar="MODULE[,MODULE...]")
-    opt.add_option('--with-pybindgen',
-                   help=('Path to an existing pybindgen source tree to use.'),
-                   default=None,
-                   dest='with_pybindgen', type="string")
-    opt.add_option('--with-python',
-                   help=('Path to the Python interpreter to use.'),
-                   default=None, dest='with_python', type="string")
-
-
-def split_version(version):
-    if (re.search ('post', version)):
-        # Version format such as '0.17.0.post58+ngcf00cc0'
-        ver = re.split('[.+]', version)[:4]
-        return (int(ver[0]), int(ver[1]), int(ver[2]), int(ver[3].split('post')[1]))
-    else:
-        # Version format such as '0.18.0'
-        ver = re.split('[.]', version)[:3]
-        return (int(ver[0]), int(ver[1]), int(ver[2]), 0)
-
-
-def configure(conf):
-    conf.env['ENABLE_PYTHON_BINDINGS'] = False
-    if Options.options.python_disable:
-        conf.report_optional_feature("python", "Python Bindings", False,
-                                     "disabled by user request")
-        return
-    # Disable python in static builds (bug #1253)
-    if ((conf.env['ENABLE_STATIC_NS3']) or \
-      (conf.env['ENABLE_SHARED_AND_STATIC_NS3'])):
-        conf.report_optional_feature("python", "Python Bindings", False,
-                                     "bindings incompatible with static build")
-        return
-
-    enabled_modules = list(conf.env['NS3_ENABLED_MODULES'])
-    enabled_modules.sort()
-    available_modules = list(conf.env['NS3_MODULES'])
-    available_modules.sort()
-    all_modules_enabled = (enabled_modules == available_modules)
-
-    conf.load('misc', tooldir=['waf-tools'])
-
-    if sys.platform == 'cygwin':
-        conf.report_optional_feature("python", "Python Bindings", False,
-                                     "unsupported platform 'cygwin'")
-        Logs.warn("Python is not supported in CygWin environment.  Try MingW instead.")
-        return
-
-
-    ## Check for Python
-
-    if Options.options.with_python is not None:
-        conf.env.PYTHON = Options.options.with_python
-
-    try:
-        conf.load('python')
-    except Errors.ConfigurationError as ex:
-        conf.report_optional_feature("python", "Python Bindings", False,
-                                     "The python interpreter was not found")
-        return
-    try:
-        conf.check_python_version((2,3))
-    except Errors.ConfigurationError as ex:
-        conf.report_optional_feature("python", "Python Bindings", False,
-                                     "The python found version is too low (2.3 required)")
-        return
-    try:
-        conf.check_python_headers()
-    except Errors.ConfigurationError as ex:
-        conf.report_optional_feature("python", "Python Bindings", False,
-                                     "Python library or headers missing")
-        return
-
-    # stupid Mac OSX Python wants to build extensions as "universal
-    # binaries", i386, x86_64, and ppc, but this way the type
-    # __uint128_t is not available.  We need to disable the multiarch
-    # crap by removing the -arch parameters.
-    for flags_var in ["CFLAGS_PYEXT", "CFLAGS_PYEMBED", "CXXFLAGS_PYEMBED",
-                      "CXXFLAGS_PYEXT", "LINKFLAGS_PYEMBED", "LINKFLAGS_PYEXT"]:
-        flags = conf.env[flags_var]
-        i = 0
-        while i < len(flags):
-            if flags[i] == '-arch':
-                del flags[i]
-                del flags[i]
-                continue
-            i += 1
-        conf.env[flags_var] = flags
-
-    # -fvisibility=hidden optimization
-    if (conf.env['CXX_NAME'] == 'gcc' and [int(x) for x in conf.env['CC_VERSION']] >= [4,0,0]
-        and conf.check_compilation_flag('-fvisibility=hidden')):
-        conf.env.append_value('CXXFLAGS_PYEXT', '-fvisibility=hidden')
-        conf.env.append_value('CCFLAGS_PYEXT', '-fvisibility=hidden')
-
-    if conf.check_compilation_flag('-Wno-array-bounds'):
-        conf.env.append_value('CXXFLAGS_PYEXT', '-Wno-array-bounds')
-
-    # Check for the location of pybindgen
-    if Options.options.with_pybindgen is not None:
-        if os.path.isdir(Options.options.with_pybindgen):
-            conf.msg("Checking for pybindgen location", ("%s (given)" % Options.options.with_pybindgen))
-            conf.env['WITH_PYBINDGEN'] = os.path.abspath(Options.options.with_pybindgen)
-    else:
-        # ns-3-dev uses ../pybindgen, while ns-3 releases use ../REQUIRED_PYBINDGEN_VERSION
-        pybindgen_dir = os.path.join('..', "pybindgen")
-        pybindgen_release_str = "pybindgen-" + REQUIRED_PYBINDGEN_VERSION
-        pybindgen_release_dir = os.path.join('..', pybindgen_release_str)
-        if os.path.isdir(pybindgen_dir):
-            conf.msg("Checking for pybindgen location", ("%s (guessed)" % pybindgen_dir))
-            conf.env['WITH_PYBINDGEN'] = os.path.abspath(pybindgen_dir)
-        elif os.path.isdir(pybindgen_release_dir):
-            conf.msg("Checking for pybindgen location", ("%s (guessed)" % pybindgen_release_dir))
-            conf.env['WITH_PYBINDGEN'] = os.path.abspath(pybindgen_release_dir)
-        del pybindgen_dir
-        del pybindgen_release_dir
-    if not conf.env['WITH_PYBINDGEN']:
-        conf.msg("Checking for pybindgen location", False)
-
-    # Check for pybindgen
-
-    set_pybindgen_pythonpath(conf.env)
-
-    try:
-        conf.check_python_module('pybindgen')
-    except Errors.ConfigurationError:
-        Logs.warn("pybindgen missing => no python bindings")
-        conf.report_optional_feature("python", "Python Bindings", False,
-                                     "PyBindGen missing")
-        return
-    else:
-        out = subprocess.Popen([conf.env['PYTHON'][0], "-c",
-                                "import pybindgen.version; "
-                                "print(pybindgen.__version__)"],
-                                stdout=subprocess.PIPE).communicate()[0]
-        pybindgen_version = maybe_decode(out.strip())
-        conf.msg('Checking for pybindgen version', pybindgen_version)
-        if not pybindgen_version:
-            Logs.warn("pybindgen_version is an empty string")
-            conf.report_optional_feature("python", "Python Bindings", False,
-                                         "PyBindGen version not found")
-            return
-        if not (split_version(pybindgen_version) >= split_version(REQUIRED_PYBINDGEN_VERSION)):
-            Logs.warn("pybindgen (found %r), (need %r)" %
-                      (pybindgen_version, REQUIRED_PYBINDGEN_VERSION))
-            conf.report_optional_feature("python", "Python Bindings", False,
-                                         "PyBindGen found but version %s is not the required version %s" % (pybindgen_version, REQUIRED_PYBINDGEN_VERSION))
-            return
-
-
-    def test(t1, t2):
-        test_program = '''
-#include <stdint.h>
-#include <vector>
-
-int main ()
-{
-   std::vector< %(type1)s > t = std::vector< %(type2)s > ();
-   return 0;
-}
-''' % dict(type1=t1, type2=t2)
-
-        try:
-            ret = conf.check(compiler='cxx', fragment=test_program, features='cxx')
-        except Errors.ConfigurationError:
-            ret = False
-        conf.msg('Checking for types %s and %s equivalence' % (t1, t2), (ret and 'no' or 'yes'))
-        return ret
-
-    uint64_is_long = test("uint64_t", "unsigned long")
-    uint64_is_long_long = test("uint64_t", "unsigned long long")
-
-    if uint64_is_long:
-        conf.env['PYTHON_BINDINGS_APIDEFS'] = 'gcc-LP64'
-    elif uint64_is_long_long:
-        conf.env['PYTHON_BINDINGS_APIDEFS'] = 'gcc-ILP32'
-    else:
-        conf.env['PYTHON_BINDINGS_APIDEFS'] = None
-    if conf.env['PYTHON_BINDINGS_APIDEFS'] is None:
-        msg = 'none available'
-    else:
-        msg = conf.env['PYTHON_BINDINGS_APIDEFS']
-
-    conf.msg('Checking for the apidefs that can be used for Python bindings', msg)
-
-    if conf.env['PYTHON_BINDINGS_APIDEFS'] is None:
-        conf.report_optional_feature("python", "Python Bindings", False,
-                                     "No apidefs are available that can be used in this system")
-        return
-
-
-    ## If all has gone well, we finally enable the Python bindings
-    conf.env['ENABLE_PYTHON_BINDINGS'] = True
-    conf.report_optional_feature("python", "Python Bindings", True, None)
-
-
-    # check cxxabi stuff (which Mac OS X Lion breaks)
-    fragment = r"""
-# include <cxxabi.h>
-int main ()
-{
-   const abi::__si_class_type_info *_typeinfo  __attribute__((unused)) = NULL;
-   return 0;
-}
-"""
-    gcc_rtti_abi = conf.check_nonfatal(fragment=fragment, msg="Checking for internal GCC cxxabi",
-                                       okmsg="complete", errmsg='incomplete',
-                                       mandatory=False)
-    conf.env["GCC_RTTI_ABI_COMPLETE"] = str(bool(gcc_rtti_abi))
-
-
-
-    ## Check for pygccxml
-    try:
-        conf.check_python_module('pygccxml')
-    except Errors.ConfigurationError:
-        conf.report_optional_feature("castxml", "Python API Scanning Support", False,
-                                     "Missing 'pygccxml' Python module")
-        return
-
-    try:
-        import pygccxml as pygccxml_imported
-        pygccxml_version_str = pygccxml_imported.__version__
-    except (ImportError, AttributeError):
-        Logs.warn("pygccxml version cannot be determined")
-        conf.report_optional_feature("castxml", "Python API Scanning Support", False,
-                                     "pygccxml Python module version is unknown")
-        return
-
-    # Bug 2013:  pygccxml versions > 1.0.0 prepend a 'v' to version number
-    pygccxml_version_str = pygccxml_version_str.lstrip('v')
-    pygccxml_version = tuple([int(x) for x in pygccxml_version_str.split('.')])
-    conf.msg('Checking for pygccxml version', pygccxml_version_str)
-    if not (pygccxml_version >= REQUIRED_PYGCCXML_VERSION):
-        Logs.warn("pygccxml (found %s) is too old (need %s) => "
-                "automatic scanning of API definitions will not be possible" %
-                (pygccxml_version_str,
-                 '.'.join([str(x) for x in REQUIRED_PYGCCXML_VERSION])))
-        conf.report_optional_feature("castxml", "Python API Scanning Support", False,
-                                     "pygccxml Python module too old")
-        return
-
-
-    ## Check castxml version
-    try:
-        castxml = conf.find_program('castxml', var='CASTXML')
-    except WafError:
-        castxml = None
-    if not castxml:
-        Logs.warn("castxml missing; automatic scanning of API definitions will not be possible")
-        conf.report_optional_feature("castxml", "Python API Scanning Support", False,
-                                     "castxml missing")
-        return
-
-    out = subprocess.Popen([castxml[0], '--version'], 
-                            stdout=subprocess.PIPE).communicate()[0]
-    castxml_version_line = maybe_decode(out).split('\n', 1)[0].strip()
-    ## Expecting version string such as 'castxml version 0.1-gfab9c47'
-    m = re.match( "^castxml version (\d\.\d)(-)?(\w+)?", castxml_version_line)
-    try:
-        castxml_version = m.group(1)
-        castxml_version_ok = castxml_version >= REQUIRED_CASTXML_VERSION
-    except AttributeError:
-        castxml_version = castxml_version_line
-        castxml_version_ok = False
-    conf.msg('Checking for castxml version', castxml_version)
-    if not castxml_version_ok:
-        Logs.warn("castxml version unknown or too old, need version >= %s; automatic scanning of API definitions will not be possible" % REQUIRED_CASTXML_VERSION)
-        conf.report_optional_feature("castxml", "Python API Scanning Support", False,
-                                     "castxml too old")
-        return
-
-    ## If we reached
-    conf.env['ENABLE_PYTHON_SCANNING'] = True
-    conf.report_optional_feature("castxml", "Python API Scanning Support", True, None)
-
-# ---------------------
-
-def get_headers_map(bld):
-    headers_map = {} # header => module
-    for ns3headers in bld.all_task_gen:
-        if 'ns3header' in getattr(ns3headers, "features", []):
-            if ns3headers.module.endswith('-test'):
-                continue
-            for h in ns3headers.to_list(ns3headers.headers):
-                headers_map[os.path.basename(h)] = ns3headers.module
-    return headers_map
-
-def get_module_path(bld, module):
-    for ns3headers in bld.all_task_gen:
-        if 'ns3header' in getattr(ns3headers, "features", []):
-            if ns3headers.module == module:
-                break
-    else:
-        raise ValueError("Module %r not found" % module)
-    return ns3headers.path.abspath()
-
-class apiscan_task(Task.Task):
-    """Uses castxml to scan the file 'everything.h' and extract API definitions.
-    """
-    before = ['cxxprogram', 'cxxshlib', 'cxxstlib', 'command']
-    after = ['gen_ns3_module_header', 'ns3header']
-    color = "BLUE"
-    def __init__(self, curdirnode, env, bld, target, cflags, module):
-        self.bld = bld
-        super(apiscan_task, self).__init__(generator=self, env=env)
-        self.curdirnode = curdirnode
-        self.env = env
-        self.target = target
-        self.cflags = cflags
-        self.module = module
-
-    def display(self):
-        return 'api-scan-%s\n' % (self.target,)
-
-    def uid(self):
-        try:
-            return self.uid_
-        except AttributeError:
-            m = Utils.md5()
-            up = m.update
-            up(self.__class__.__name__.encode())
-            up(self.curdirnode.abspath().encode())
-            up(self.target.encode())
-            self.uid_ = m.digest()
-            return self.uid_
-
-    def run(self):
-        self.inputs = [self.bld.bldnode.find_resource("ns3/{0}-module.h".format(self.module))]
-        self.outputs = [self.bld.srcnode.find_resource("src/{}/bindings/modulegen__{}.py".format(self.module, self.target))]
-        if self.outputs[0] is None:
-            self.outputs = [self.bld.srcnode.find_resource("contrib/{}/bindings/modulegen__{}.py".format(self.module, self.target))]
-        top_builddir = self.bld.bldnode.abspath()
-        module_path = get_module_path(self.bld, self.module)
-        headers_map = get_headers_map(self.bld)
-        scan_header = os.path.join(top_builddir, "ns3", "%s-module.h" % self.module)
-
-        if not os.path.exists(scan_header):
-            Logs.error("Cannot apiscan module %r: %s does not exist" % (self.module, scan_header))
-            return 0
-
-        argv = [
-            self.env['PYTHON'][0],
-            os.path.join(self.curdirnode.abspath(), 'ns3modulescan-modular.py'), # scanning script
-            top_builddir,
-            self.module,
-            repr(get_headers_map(self.bld)),
-            os.path.join(module_path, "bindings", 'modulegen__%s.py' % (self.target)), # output file
-            self.cflags,
-            ]
-        scan = subprocess.Popen(argv, stdin=subprocess.PIPE)
-        retval = scan.wait()
-
-        if retval >= 0 and "LP64" in self.target:
-            self.lp64_to_ilp32(
-                os.path.join(module_path, "bindings", 'modulegen__%s.py' % (self.target)),
-                os.path.join(module_path, "bindings", 'modulegen__%s.py' % "gcc_ILP32")
-                )
-
-        return retval
-
-    def runnable_status(self):
-        # By default, Waf Task will skip running a task if the signature of
-        # the build has not changed.  We want this task to always run if
-        # invoked by the user, particularly since --apiscan=all will require
-        # invoking this task many times, once per module.
-        return RUN_ME
-
-    def lp64_to_ilp32(self, lp64path, ilp32path):
-        lp64file = open(lp64path, "r")
-        lp64bindings = lp64file.read()
-        lp64file.close()
-        ilp32file = open(ilp32path, "w")
-        ilp32bindings = re.sub("unsigned long(?!( long))", "unsigned long long", lp64bindings)
-        ilp32file.write(ilp32bindings)
-        ilp32file.close()
-
-def get_modules_and_headers(bld):
-    """
-    Gets a dict of
-       module_name => ([module_dep1, module_dep2, ...], [module_header1, module_header2, ...])
-    tuples, one for each module.
-    """
-
-    retval = {}
-    for module in bld.all_task_gen:
-        if not module.name.startswith('ns3-'):
-            continue
-        if module.name.endswith('-test'):
-            continue
-        module_name = module.name[4:] # strip the ns3- prefix
-        ## find the headers object for this module
-        headers = []
-        for ns3headers in bld.all_task_gen:
-            if 'ns3header' not in getattr(ns3headers, "features", []):
-                continue
-            if ns3headers.module != module_name:
-                continue
-            for source in ns3headers.to_list(ns3headers.headers):
-                headers.append(os.path.basename(source))
-        retval[module_name] = (list(module.module_deps), headers)
-    return retval
-
-
-
-
-class gen_ns3_compat_pymod_task(Task.Task):
-    """Generates a 'ns3.py' compatibility module."""
-    before = ['cxxprogram', 'cxxshlib', 'cxxstlib']
-    color = 'BLUE'
-
-    def run(self):
-        assert len(self.outputs) == 1
-        outfile = open(self.outputs[0].abspath(), "w")
-        print("import warnings", file=outfile)
-        print('warnings.warn("the ns3 module is a compatibility layer '\
-            'and should not be used in newly written code", DeprecationWarning, stacklevel=2)', file=outfile)
-        print(file=outfile)
-        for module in self.bld.env['PYTHON_MODULES_BUILT']:
-            print("from ns.%s import *" % (module.replace('-', '_')), file=outfile)
-        outfile.close()
-        return 0
-
-
-
-def build(bld):
-    if Options.options.python_disable:
-        return
-
-    env = bld.env
-    set_pybindgen_pythonpath(env)
-
-    if Options.options.apiscan:
-        if not env['ENABLE_PYTHON_SCANNING']:
-            raise WafError("Cannot re-scan python bindings: (py)gccxml not available")
-        scan_targets = []
-        if sys.platform == 'cygwin':
-            scan_targets.append(('gcc_cygwin', ''))
-        else:
-            import struct
-            if struct.calcsize('I') == 4 and struct.calcsize('L') == 8 and struct.calcsize('P') == 8:
-                scan_targets.append(('gcc_LP64', '-m64'))
-            elif struct.calcsize('I') == 4 and struct.calcsize('L') == 4 and struct.calcsize('P') == 4:
-                scan_targets.append(('gcc_ILP32', ''))
-            else:
-                raise WafError("Cannot scan python bindings for unsupported data model")
-
-        test_module_path = bld.path.find_dir("../../src/test")
-        if Options.options.apiscan == 'all':
-            scan_modules = []
-            for mod in bld.all_task_gen:
-                if not mod.name.startswith('ns3-'):
-                    continue
-                if mod.path.is_child_of(test_module_path):
-                    continue
-                if mod.name.endswith('-test'):
-                    continue
-                bindings_enabled = (mod.name in env.MODULAR_BINDINGS_MODULES)
-                #print mod.name, bindings_enabled
-                if bindings_enabled:
-                    scan_modules.append(mod.name.split('ns3-')[1])
-        else:
-            scan_modules = Options.options.apiscan.split(',')
-        print("Modules to scan: ", scan_modules)
-        for target, cflags in scan_targets:
-            group = bld.get_group(bld.current_group)
-            for module in scan_modules:
-                group.append(apiscan_task(bld.path, env, bld, target, cflags, module))
-        return
-
-
-    if env['ENABLE_PYTHON_BINDINGS']:
-        task = gen_ns3_compat_pymod_task(env=env.derive())
-        task.set_outputs(bld.path.find_or_declare("ns3.py"))
-        task.dep_vars = ['PYTHON_MODULES_BUILT']
-        task.bld = bld
-        grp = bld.get_group(bld.current_group)
-        grp.append(task)
-
-        bld(features='copy', source="ns__init__.py", target='ns/__init__.py')
-        bld.install_as('${PYTHONARCHDIR}/ns/__init__.py', 'ns__init__.py')
-
-
-    # note: the actual build commands for the python bindings are in
-    # src/wscript, not here.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/build-support/3rd-party/colored-messages.cmake ns-3.36/build-support/3rd-party/colored-messages.cmake
--- ns-3.35/build-support/3rd-party/colored-messages.cmake	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/build-support/3rd-party/colored-messages.cmake	2022-04-30 18:23:57.642732600 -0700
@@ -0,0 +1,95 @@
+# Copyright (c) 2013 Fraser Hutchison
+#
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License version 2 as published by the Free
+# Software Foundation;
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
+# details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc., 59 Temple
+# Place, Suite 330, Boston, MA  02111-1307 USA
+# cmake-format: off
+#
+# Author: Fraser Hutchison <fraser@casperlabs.io>
+# Modified by: Gabriel Ferreira <gabrielcarvfer@gmail.com>
+#
+# Original code:
+#  https://stackoverflow.com/a/19578320
+# Used with permission of the author:
+#  https://gitlab.com/nsnam/ns-3-dev/-/merge_requests/913#note_884829396
+# cmake-format: on
+
+# Set empty values for colors
+set(ColourReset)
+set(Red)
+set(Green)
+set(Yellow)
+set(Blue)
+set(Magenta)
+set(Cyan)
+set(White)
+set(BoldRed)
+set(BoldGreen)
+set(BoldYellow)
+set(BoldBlue)
+set(BoldMagenta)
+set(BoldCyan)
+set(BoldWhite)
+
+# Custom message types fallback when not colorized
+set(HIGHLIGHTED_STATUS STATUS)
+
+if(${NS3_COLORED_OUTPUT} OR "$ENV{CLICOLOR}")
+  if(NOT WIN32)
+    # When colorized, set color values
+    string(ASCII 27 Esc)
+    set(ColourReset "${Esc}[0m")
+    set(ColourBold "${Esc}[1m")
+    set(Red "${Esc}[31m")
+    set(Green "${Esc}[32m")
+    set(Yellow "${Esc}[33m")
+    set(Blue "${Esc}[34m")
+    set(Magenta "${Esc}[35m")
+    set(Cyan "${Esc}[36m")
+    set(White "${Esc}[37m")
+    set(BoldRed "${Esc}[1;31m")
+    set(BoldGreen "${Esc}[1;32m")
+    set(BoldYellow "${Esc}[1;33m")
+    set(BoldBlue "${Esc}[1;34m")
+    set(BoldMagenta "${Esc}[1;35m")
+    set(BoldCyan "${Esc}[1;36m")
+    set(BoldWhite "${Esc}[1;37m")
+  endif()
+
+  # Set custom message type when colorized
+  set(HIGHLIGHTED_STATUS HIGHLIGHTED_STATUS)
+
+  # Replace the default message macro with a custom colored one
+  function(message)
+    list(GET ARGV 0 MessageType)
+    if((${MessageType} STREQUAL FATAL_ERROR) OR (${MessageType} STREQUAL
+                                                 SEND_ERROR)
+    )
+      list(REMOVE_AT ARGV 0)
+      _message(${MessageType} "${BoldRed}${ARGV}${ColourReset}")
+    elseif(MessageType STREQUAL WARNING)
+      list(REMOVE_AT ARGV 0)
+      _message(${MessageType} "${Yellow}${ARGV}${ColourReset}")
+    elseif(MessageType STREQUAL AUTHOR_WARNING)
+      list(REMOVE_AT ARGV 0)
+      _message(${MessageType} "${BoldCyan}${ARGV}${ColourReset}")
+    elseif(MessageType STREQUAL HIGHLIGHTED_STATUS) # Custom message type
+      list(REMOVE_AT ARGV 0)
+      _message(STATUS "${Yellow}${ARGV}${ColourReset}")
+    elseif(MessageType STREQUAL STATUS)
+      list(REMOVE_AT ARGV 0)
+      _message(${MessageType} "${ARGV}")
+    else()
+      _message(${ARGV})
+    endif()
+  endfunction()
+endif()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/build-support/3rd-party/FindGTK3.cmake ns-3.36/build-support/3rd-party/FindGTK3.cmake
--- ns-3.35/build-support/3rd-party/FindGTK3.cmake	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/build-support/3rd-party/FindGTK3.cmake	2022-04-30 18:23:57.642732600 -0700
@@ -0,0 +1,621 @@
+# * FindGTK3.cmake This module can find the GTK3 widget libraries and several of
+#   its other optional components like gtkmm, glade, and glademm.
+#
+# NOTE: If you intend to use version checking, CMake 2.6.2 or later is required.
+#
+# Specify one or more of the following components as you call this find module.
+# See example below.
+#
+# gtk gtkmm glade glademm
+#
+# The following variables will be defined for your use
+#
+# GTK3_FOUND - Were all of your specified components found? GTK3_INCLUDE_DIRS -
+# All include directories GTK3_LIBRARIES - All libraries
+#
+# GTK3_VERSION - The version of GTK3 found (x.y.z) GTK3_MAJOR_VERSION - The
+# major version of GTK3 GTK3_MINOR_VERSION - The minor version of GTK3
+# GTK3_PATCH_VERSION - The patch version of GTK3
+#
+# Optional variables you can define prior to calling this module:
+#
+# GTK3_DEBUG - Enables verbose debugging of the module
+# GTK3_SKIP_MARK_AS_ADVANCED - Disable marking cache variables as advanced
+# GTK3_ADDITIONAL_SUFFIXES - Allows defining additional directories to search
+# for include files
+#
+# =================
+# Example Usage:
+#
+# Call find_package() once, here are some examples to pick from:
+#
+# Require GTK 3.0 or later find_package(GTK3 3.0 REQUIRED gtk)
+#
+# if(GTK3_FOUND) include_directories(${GTK3_INCLUDE_DIRS}) add_executable(mygui
+# mygui.cc) target_link_libraries(mygui ${GTK3_LIBRARIES}) endif()
+#
+
+# =============================================================================
+# Copyright 2009 Kitware, Inc. Copyright 2008-2009 Philip Lowman
+# <philip@yhbt.com> Copyright 2014-2018 Ettercap Development Team
+# <info@ettercap-project.org>
+#
+# Distributed under the OSI-approved BSD License (the "License"); see
+# accompanying file Copyright.txt for details.
+#
+# This software is distributed WITHOUT ANY WARRANTY; without even the implied
+# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# License for more information.
+# =============================================================================
+# (To distribute this file outside of CMake, substitute the full License text
+# for the above reference.)
+
+# Version 0.1 (5/13/2011) * First cut at a GTK3 version (Heavily derived from
+# FindGTK2.cmake)
+
+# Version 0.2 (3/02/2018) * Run git diff against this file to see all changes
+# =============================================================
+# _GTK3_GET_VERSION Internal function to parse the version number in
+# gtkversion.h _OUT_major = Major version number _OUT_minor = Minor version
+# number _OUT_micro = Micro version number _gtkversion_hdr = Header file to
+# parse
+# =============================================================
+function(_GTK3_GET_VERSION _OUT_major _OUT_minor _OUT_micro _gtkversion_hdr)
+  file(READ ${_gtkversion_hdr} _contents)
+  if(_contents)
+    string(REGEX REPLACE ".*#define GTK_MAJOR_VERSION[ \t]+\\(([0-9]+)\\).*"
+                         "\\1" ${_OUT_major} "${_contents}"
+    )
+
+    string(REGEX REPLACE ".*#define GTK_MINOR_VERSION[ \t]+\\(([0-9]+)\\).*"
+                         "\\1" ${_OUT_minor} "${_contents}"
+    )
+
+    string(REGEX REPLACE ".*#define GTK_MICRO_VERSION[ \t]+\\(([0-9]+)\\).*"
+                         "\\1" ${_OUT_micro} "${_contents}"
+    )
+    if(NOT ${_OUT_major} MATCHES "[0-9]+")
+      message(FATAL_ERROR "Version parsing failed for GTK3_MAJOR_VERSION!")
+    endif()
+    if(NOT ${_OUT_minor} MATCHES "[0-9]+")
+      message(FATAL_ERROR "Version parsing failed for GTK3_MINOR_VERSION!")
+    endif()
+    if(NOT ${_OUT_micro} MATCHES "[0-9]+")
+      message(FATAL_ERROR "Version parsing failed for GTK3_MICRO_VERSION!")
+    endif()
+
+    set(${_OUT_major} ${${_OUT_major}} PARENT_SCOPE)
+    set(${_OUT_minor} ${${_OUT_minor}} PARENT_SCOPE)
+    set(${_OUT_micro} ${${_OUT_micro}} PARENT_SCOPE)
+  else()
+    message(FATAL_ERROR "Include file ${_gtkversion_hdr} does not exist")
+  endif()
+endfunction()
+
+# =============================================================
+# _GTK3_FIND_INCLUDE_DIR Internal function to find the GTK include directories
+# _var = variable to set _hdr = header file to look for
+# =============================================================
+function(_GTK3_FIND_INCLUDE_DIR _var _hdr)
+
+  if(GTK3_DEBUG)
+    message(STATUS "[FindGTK3.cmake:${CMAKE_CURRENT_LIST_LINE}] "
+                   "_GTK3_FIND_INCLUDE_DIR( ${_var} ${_hdr} )"
+    )
+  endif()
+
+  set(_relatives
+      # If these ever change, things will break.
+      ${GTK3_ADDITIONAL_SUFFIXES}
+      glibmm-2.0
+      glib-2.0
+      atk-1.0
+      atkmm-1.0
+      cairo
+      cairomm-1.0
+      gdk-pixbuf-2.0
+      gdkmm-2.4
+      giomm-2.4
+      gtk-3.0
+      gtkmm-2.4
+      libglade-2.0
+      libglademm-2.4
+      harfbuzz
+      pango-1.0
+      pangomm-1.4
+      sigc++-2.2
+      gtk-unix-print-2.0
+  )
+
+  set(_suffixes)
+  foreach(_d ${_relatives})
+    list(APPEND _suffixes ${_d})
+    list(APPEND _suffixes ${_d}/include) # for /usr/lib/gtk-2.0/include
+  endforeach()
+
+  if(GTK3_DEBUG)
+    message(STATUS "[FindGTK3.cmake:${CMAKE_CURRENT_LIST_LINE}]     "
+                   "include suffixes = ${_suffixes}"
+    )
+  endif()
+
+  find_path(
+    ${_var} ${_hdr}
+    PATHS # On Windows, glibconfig.h is located under
+          # $PREFIX/lib/glib-2.0/include.
+          C:/GTK/lib/glib-2.0/include
+          C:/msys64/$ENV{MSYSTEM}/lib/glib-2.0
+          # end
+          /usr/local/lib64
+          /usr/local/lib
+          # fix for Ubuntu == 11.04 (Natty Narwhal)
+          /usr/lib/i386-linux-gnu/
+          /usr/lib/x86_64-linux-gnu/
+          # end fix for Ubuntu >= 11.10 (Oneiric Ocelot)
+          /usr/lib/${CMAKE_LIBRARY_ARCHITECTURE}
+          # end
+          /usr/lib64
+          /usr
+          /opt/gnome
+          /usr/openwin
+          /sw
+          /opt/local
+          /opt/local/lib
+          $ENV{GTKMM_BASEPATH}
+          [HKEY_CURRENT_USER\\SOFTWARE\\gtkmm\\2.4;Path]
+          [HKEY_LOCAL_MACHINE\\SOFTWARE\\gtkmm\\2.4;Path]
+    PATH_SUFFIXES ${_suffixes} include lib
+  )
+
+  if(${_var})
+    set(GTK3_INCLUDE_DIRS ${GTK3_INCLUDE_DIRS} ${${_var}} PARENT_SCOPE)
+    if(NOT GTK3_SKIP_MARK_AS_ADVANCED)
+      mark_as_advanced(${_var})
+    endif()
+  endif()
+
+endfunction()
+
+# =============================================================
+# _GTK3_FIND_LIBRARY Internal function to find libraries packaged with GTK3 _var
+# = library variable to create
+# =============================================================
+function(_GTK3_FIND_LIBRARY _var _lib _expand_vc _append_version)
+
+  if(GTK3_DEBUG)
+    message(
+      STATUS
+        "[FindGTK3.cmake:${CMAKE_CURRENT_LIST_LINE}] "
+        "_GTK3_FIND_LIBRARY( ${_var} ${_lib} ${_expand_vc} ${_append_version} )"
+    )
+  endif()
+
+  # Not GTK versions per se but the versions encoded into Windows import
+  # libraries (GtkMM 2.14.1 has a gtkmm-vc80-2_4.lib for example) Also the MSVC
+  # libraries use _ for . (this is handled below)
+  # ********* SOMEONE WITH WINDOWS NEEDS TO CHECK THIS BIT FOR V3 *********
+  # ********* the plain 3 is needed to get Debian Sid to find the libraries
+  set(_versions
+      3.0
+      3
+      2.20
+      2.18
+      2.16
+      2.14
+      2.12
+      2.10
+      2.8
+      2.6
+      2.4
+      2.2
+      2.0
+      1.20
+      1.18
+      1.16
+      1.14
+      1.12
+      1.10
+      1.8
+      1.6
+      1.4
+      1.2
+      1.0
+  )
+
+  set(_library)
+  set(_library_d)
+
+  set(_library ${_lib})
+
+  if(_expand_vc AND MSVC)
+    # Add vc80/vc90/vc100 midfixes
+    if(MSVC80)
+      set(_library ${_library}-vc80)
+    elseif(MSVC90)
+      set(_library ${_library}-vc90)
+    elseif(MSVC10)
+      set(_library ${_library}-vc100)
+    endif()
+    set(_library_d ${_library}-d)
+  endif()
+
+  if(GTK3_DEBUG)
+    message(STATUS "[FindGTK3.cmake:${CMAKE_CURRENT_LIST_LINE}]     "
+                   "After midfix addition = ${_library} and ${_library_d}"
+    )
+  endif()
+
+  set(_lib_list)
+  set(_libd_list)
+  if(_append_version)
+    foreach(_ver ${_versions})
+      list(APPEND _lib_list "${_library}-${_ver}")
+      list(APPEND _libd_list "${_library_d}-${_ver}")
+    endforeach()
+  else()
+    set(_lib_list ${_library})
+    set(_libd_list ${_library_d})
+  endif()
+
+  if(GTK3_DEBUG)
+    message(
+      STATUS
+        "[FindGTK3.cmake:${CMAKE_CURRENT_LIST_LINE}]     "
+        "library list = ${_lib_list} and library debug list = ${_libd_list}"
+    )
+  endif()
+
+  # For some silly reason the MSVC libraries use _ instead of . in the version
+  # fields
+  if(_expand_vc AND MSVC)
+    set(_no_dots_lib_list)
+    set(_no_dots_libd_list)
+    foreach(_l ${_lib_list})
+      string(REPLACE "." "_" _no_dots_library ${_l})
+      list(APPEND _no_dots_lib_list ${_no_dots_library})
+    endforeach()
+    # And for debug
+    set(_no_dots_libsd_list)
+    foreach(_l ${_libd_list})
+      string(REPLACE "." "_" _no_dots_libraryd ${_l})
+      list(APPEND _no_dots_libd_list ${_no_dots_libraryd})
+    endforeach()
+    # Copy list back to original names
+    set(_lib_list ${_no_dots_lib_list})
+    set(_libd_list ${_no_dots_libd_list})
+  endif()
+
+  if(GTK3_DEBUG)
+    message(
+      STATUS
+        "[FindGTK3.cmake:${CMAKE_CURRENT_LIST_LINE}]     "
+        "While searching for ${_var}, our proposed library list is ${_lib_list}"
+    )
+  endif()
+
+  find_library(
+    ${_var}
+    NAMES ${_lib_list}
+    PATHS /opt/gnome /usr/openwin /sw $ENV{GTKMM_BASEPATH}
+          [HKEY_CURRENT_USER\\SOFTWARE\\gtkmm\\2.4;Path]
+          [HKEY_LOCAL_MACHINE\\SOFTWARE\\gtkmm\\2.4;Path]
+    PATH_SUFFIXES lib lib64
+  )
+
+  if(_expand_vc AND MSVC)
+    if(GTK3_DEBUG)
+      message(
+        STATUS
+          "[FindGTK3.cmake:${CMAKE_CURRENT_LIST_LINE}]     "
+          "While searching for ${_var}_DEBUG our proposed library list is ${_libd_list}"
+      )
+    endif()
+
+    find_library(
+      ${_var}_DEBUG
+      NAMES ${_libd_list}
+      PATHS $ENV{GTKMM_BASEPATH} [HKEY_CURRENT_USER\\SOFTWARE\\gtkmm\\2.4;Path]
+            [HKEY_LOCAL_MACHINE\\SOFTWARE\\gtkmm\\2.4;Path]
+      PATH_SUFFIXES lib
+    )
+
+    if(${_var} AND ${_var}_DEBUG)
+      if(NOT GTK3_SKIP_MARK_AS_ADVANCED)
+        mark_as_advanced(${_var}_DEBUG)
+      endif()
+      set(GTK3_LIBRARIES ${GTK3_LIBRARIES} optimized ${${_var}} debug
+                         ${${_var}_DEBUG}
+      )
+      set(GTK3_LIBRARIES ${GTK3_LIBRARIES} PARENT_SCOPE)
+    endif()
+  else()
+    if(NOT GTK3_SKIP_MARK_AS_ADVANCED)
+      mark_as_advanced(${_var})
+    endif()
+    set(GTK3_LIBRARIES ${GTK3_LIBRARIES} ${${_var}})
+    set(GTK3_LIBRARIES ${GTK3_LIBRARIES} PARENT_SCOPE)
+    # Set debug to release
+    set(${_var}_DEBUG ${${_var}})
+    set(${_var}_DEBUG ${${_var}} PARENT_SCOPE)
+  endif()
+endfunction()
+
+# =============================================================
+
+#
+# main()
+#
+
+set(GTK3_FOUND)
+set(GTK3_INCLUDE_DIRS)
+set(GTK3_LIBRARIES)
+
+if(NOT GTK3_FIND_COMPONENTS)
+  # Assume they only want GTK
+  set(GTK3_FIND_COMPONENTS gtk)
+endif()
+
+#
+# If not specified, enforce version number
+#
+if(GTK3_FIND_VERSION)
+  if(NOT DEFINED CMAKE_MINIMUM_REQUIRED_VERSION)
+    cmake_minimum_required(VERSION 2.6.2)
+  endif()
+  set(GTK3_FAILED_VERSION_CHECK true)
+  if(GTK3_DEBUG)
+    message(STATUS "[FindGTK3.cmake:${CMAKE_CURRENT_LIST_LINE}] "
+                   "Searching for version ${GTK3_FIND_VERSION}"
+    )
+  endif()
+  _gtk3_find_include_dir(GTK3_GTK_INCLUDE_DIR gtk/gtk.h)
+  if(GTK3_GTK_INCLUDE_DIR)
+    _gtk3_get_version(
+      GTK3_MAJOR_VERSION GTK3_MINOR_VERSION GTK3_PATCH_VERSION
+      ${GTK3_GTK_INCLUDE_DIR}/gtk/gtkversion.h
+    )
+    set(GTK3_VERSION
+        ${GTK3_MAJOR_VERSION}.${GTK3_MINOR_VERSION}.${GTK3_PATCH_VERSION}
+    )
+    if(GTK3_FIND_VERSION_EXACT)
+      if(GTK3_VERSION VERSION_EQUAL GTK3_FIND_VERSION)
+        set(GTK3_FAILED_VERSION_CHECK false)
+      endif()
+    else()
+      if(GTK3_VERSION VERSION_EQUAL GTK3_FIND_VERSION
+         OR GTK3_VERSION VERSION_GREATER GTK3_FIND_VERSION
+      )
+        set(GTK3_FAILED_VERSION_CHECK false)
+      endif()
+    endif()
+  else()
+    # If we can't find the GTK include dir, we can't do version checking
+    if(GTK3_FIND_REQUIRED AND NOT GTK3_FIND_QUIETLY)
+      message(FATAL_ERROR "Could not find GTK3 include directory")
+    endif()
+    return()
+  endif()
+
+  if(GTK3_FAILED_VERSION_CHECK)
+    if(GTK3_FIND_REQUIRED AND NOT GTK3_FIND_QUIETLY)
+      if(GTK3_FIND_VERSION_EXACT)
+        message(
+          FATAL_ERROR
+            "GTK3 version check failed.
+Version ${GTK3_VERSION} was found, \
+version ${GTK3_FIND_VERSION} is needed exactly."
+        )
+      else()
+        message(
+          FATAL_ERROR
+            "GTK3 version check failed.
+Version ${GTK3_VERSION} was found, \
+at least version ${GTK3_FIND_VERSION} is required"
+        )
+      endif()
+    endif()
+
+    # If the version check fails, exit out of the module here
+    return()
+  endif()
+endif()
+
+#
+# Find all components
+#
+
+find_package(Freetype QUIET)
+list(APPEND GTK3_INCLUDE_DIRS ${FREETYPE_INCLUDE_DIRS})
+list(APPEND GTK3_LIBRARIES ${FREETYPE_LIBRARIES})
+
+foreach(_GTK3_component ${GTK3_FIND_COMPONENTS})
+  if(_GTK3_component STREQUAL "gtk")
+    _gtk3_find_include_dir(GTK3_GLIB_INCLUDE_DIR glib.h)
+    _gtk3_find_include_dir(GTK3_GLIBCONFIG_INCLUDE_DIR glibconfig.h)
+    _gtk3_find_library(GTK3_GLIB_LIBRARY glib false true)
+
+    _gtk3_find_library(GTK3_GTHREAD_LIBRARY gthread false true)
+
+    _gtk3_find_include_dir(GTK3_GOBJECT_INCLUDE_DIR gobject/gobject.h)
+    _gtk3_find_library(GTK3_GOBJECT_LIBRARY gobject false true)
+
+    _gtk3_find_include_dir(GTK3_GIO_INCLUDE_DIR gio/gio.h)
+    _gtk3_find_library(GTK3_GIO_LIBRARY gio false true)
+
+    _gtk3_find_include_dir(GTK3_GDK_PIXBUF_INCLUDE_DIR gdk-pixbuf/gdk-pixbuf.h)
+    _gtk3_find_library(GTK3_GDK_PIXBUF_LIBRARY gdk_pixbuf false true)
+
+    _gtk3_find_include_dir(GTK3_GDK_INCLUDE_DIR gdk/gdk.h)
+    _gtk3_find_include_dir(GTK3_GDKCONFIG_INCLUDE_DIR gdk/gdkconfig.h)
+    _gtk3_find_include_dir(GTK3_GTK_INCLUDE_DIR gtk/gtk.h)
+
+    # ********* At least on Debian the gdk & gtk libraries ********* don't have
+    # the -x11 suffix.
+    if(UNIX)
+      _gtk3_find_library(GTK3_GDK_LIBRARY gdk false true)
+      _gtk3_find_library(GTK3_GTK_LIBRARY gtk false true)
+    else()
+      # ********* There are various gtk3 builds/packages/bundles *********
+      # available on Windows. Some of them follow the ********* classic naming
+      # scheme (libs with -win32 suffix) ********* and others prefer the
+      # original names. ********* Because we want to support as many packages
+      # ********* as possible, we search for both naming styles. *********
+      # Starting with the original names.
+      # *********
+      # ********* Tested with both vcpkg (gtk+-3.22.19) ********* and Msys2
+      # (gtk+-3.22.28)
+      _gtk3_find_library(GTK3_GDK_LIBRARY gdk false true)
+      _gtk3_find_library(GTK3_GTK_LIBRARY gtk false true)
+      _gtk3_find_library(GTK3_GDK_LIBRARY gdk-win32 false true)
+      _gtk3_find_library(GTK3_GTK_LIBRARY gtk-win32 false true)
+    endif()
+
+    _gtk3_find_include_dir(GTK3_CAIRO_INCLUDE_DIR cairo.h)
+    _gtk3_find_library(GTK3_CAIRO_LIBRARY cairo false false)
+
+    _gtk3_find_include_dir(GTK3_FONTCONFIG_INCLUDE_DIR fontconfig/fontconfig.h)
+
+    _gtk3_find_include_dir(GTK3_PANGO_INCLUDE_DIR pango/pango.h)
+    _gtk3_find_library(GTK3_PANGO_LIBRARY pango false true)
+
+    _gtk3_find_include_dir(GTK3_HARFBUZZ_INCLUDE_DIR hb.h)
+
+    _gtk3_find_include_dir(GTK3_ATK_INCLUDE_DIR atk/atk.h)
+    _gtk3_find_library(GTK3_ATK_LIBRARY atk false true)
+
+  elseif(_GTK3_component STREQUAL "gtkmm")
+
+    _gtk3_find_include_dir(GTK3_GLIBMM_INCLUDE_DIR glibmm.h)
+    _gtk3_find_include_dir(GTK3_GLIBMMCONFIG_INCLUDE_DIR glibmmconfig.h)
+    _gtk3_find_library(GTK3_GLIBMM_LIBRARY glibmm true true)
+
+    _gtk3_find_include_dir(GTK3_GDKMM_INCLUDE_DIR gdkmm.h)
+    _gtk3_find_include_dir(GTK3_GDKMMCONFIG_INCLUDE_DIR gdkmmconfig.h)
+    _gtk3_find_library(GTK3_GDKMM_LIBRARY gdkmm true true)
+
+    _gtk3_find_include_dir(GTK3_GTKMM_INCLUDE_DIR gtkmm.h)
+    _gtk3_find_include_dir(GTK3_GTKMMCONFIG_INCLUDE_DIR gtkmmconfig.h)
+    _gtk3_find_library(GTK3_GTKMM_LIBRARY gtkmm true true)
+
+    _gtk3_find_include_dir(GTK3_CAIROMM_INCLUDE_DIR cairomm/cairomm.h)
+    _gtk3_find_library(GTK3_CAIROMM_LIBRARY cairomm true true)
+
+    _gtk3_find_include_dir(GTK3_PANGOMM_INCLUDE_DIR pangomm.h)
+    _gtk3_find_include_dir(GTK3_PANGOMMCONFIG_INCLUDE_DIR pangommconfig.h)
+    _gtk3_find_library(GTK3_PANGOMM_LIBRARY pangomm true true)
+
+    _gtk3_find_include_dir(GTK3_SIGC++_INCLUDE_DIR sigc++/sigc++.h)
+    _gtk3_find_include_dir(GTK3_SIGC++CONFIG_INCLUDE_DIR sigc++config.h)
+    _gtk3_find_library(GTK3_SIGC++_LIBRARY sigc true true)
+
+    _gtk3_find_include_dir(GTK3_GIOMM_INCLUDE_DIR giomm.h)
+    _gtk3_find_include_dir(GTK3_GIOMMCONFIG_INCLUDE_DIR giommconfig.h)
+    _gtk3_find_library(GTK3_GIOMM_LIBRARY giomm true true)
+
+    _gtk3_find_include_dir(GTK3_ATKMM_INCLUDE_DIR atkmm.h)
+    _gtk3_find_library(GTK3_ATKMM_LIBRARY atkmm true true)
+
+  elseif(_GTK3_component STREQUAL "glade")
+
+    _gtk3_find_include_dir(GTK3_GLADE_INCLUDE_DIR glade/glade.h)
+    _gtk3_find_library(GTK3_GLADE_LIBRARY glade false true)
+
+  elseif(_GTK3_component STREQUAL "glademm")
+
+    _gtk3_find_include_dir(GTK3_GLADEMM_INCLUDE_DIR libglademm.h)
+    _gtk3_find_include_dir(GTK3_GLADEMMCONFIG_INCLUDE_DIR libglademmconfig.h)
+    _gtk3_find_library(GTK3_GLADEMM_LIBRARY glademm true true)
+
+  else()
+    message(FATAL_ERROR "Unknown GTK3 component ${_component}")
+  endif()
+endforeach()
+
+#
+# Solve for the GTK3 version if we haven't already
+#
+if(NOT GTK3_FIND_VERSION AND GTK3_GTK_INCLUDE_DIR)
+  _gtk3_get_version(
+    GTK3_MAJOR_VERSION GTK3_MINOR_VERSION GTK3_PATCH_VERSION
+    ${GTK3_GTK_INCLUDE_DIR}/gtk/gtkversion.h
+  )
+  set(GTK3_VERSION
+      ${GTK3_MAJOR_VERSION}.${GTK3_MINOR_VERSION}.${GTK3_PATCH_VERSION}
+  )
+
+endif()
+
+#
+# Try to enforce components
+#
+
+set(_GTK3_did_we_find_everything true) # This gets set to GTK3_FOUND
+
+include(FindPackageHandleStandardArgs)
+# include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake)
+
+foreach(_GTK3_component ${GTK3_FIND_COMPONENTS})
+  string(TOUPPER ${_GTK3_component} _COMPONENT_UPPER)
+
+  if(_GTK3_component STREQUAL "gtk")
+    find_package_handle_standard_args(
+      GTK3_${_COMPONENT_UPPER}
+      "Some or all of the gtk libraries were not found."
+      GTK3_GTK_LIBRARY
+      GTK3_GTK_INCLUDE_DIR
+      GTK3_GLIB_INCLUDE_DIR
+      GTK3_GLIBCONFIG_INCLUDE_DIR
+      GTK3_GLIB_LIBRARY
+      GTK3_GTHREAD_LIBRARY
+      GTK3_GDK_INCLUDE_DIR
+      GTK3_GDKCONFIG_INCLUDE_DIR
+      GTK3_GDK_LIBRARY
+    )
+  elseif(_GTK3_component STREQUAL "gtkmm")
+    find_package_handle_standard_args(
+      GTK3_${_COMPONENT_UPPER}
+      "Some or all of the gtkmm libraries were not found."
+      GTK3_GTKMM_LIBRARY
+      GTK3_GTKMM_INCLUDE_DIR
+      GTK3_GTKMMCONFIG_INCLUDE_DIR
+      GTK3_GLIBMM_INCLUDE_DIR
+      GTK3_GLIBMMCONFIG_INCLUDE_DIR
+      GTK3_GLIBMM_LIBRARY
+      GTK3_GDKMM_INCLUDE_DIR
+      GTK3_GDKMMCONFIG_INCLUDE_DIR
+      GTK3_GDKMM_LIBRARY
+    )
+  elseif(_GTK3_component STREQUAL "glade")
+    find_package_handle_standard_args(
+      GTK3_${_COMPONENT_UPPER} "The glade library was not found."
+      GTK3_GLADE_LIBRARY GTK3_GLADE_INCLUDE_DIR
+    )
+  elseif(_GTK3_component STREQUAL "glademm")
+    find_package_handle_standard_args(
+      GTK3_${_COMPONENT_UPPER} "The glademm library was not found."
+      GTK3_GLADEMM_LIBRARY GTK3_GLADEMM_INCLUDE_DIR
+      GTK3_GLADEMMCONFIG_INCLUDE_DIR
+    )
+  endif()
+
+  if(NOT GTK3_${_COMPONENT_UPPER}_FOUND)
+    set(_GTK3_did_we_find_everything false)
+  endif()
+endforeach()
+
+if(_GTK3_did_we_find_everything AND NOT GTK3_VERSION_CHECK_FAILED)
+  set(GTK3_FOUND true)
+else()
+  # Unset our variables.
+  set(GTK3_FOUND false)
+  set(GTK3_VERSION)
+  set(GTK3_VERSION_MAJOR)
+  set(GTK3_VERSION_MINOR)
+  set(GTK3_VERSION_PATCH)
+  set(GTK3_INCLUDE_DIRS)
+  set(GTK3_LIBRARIES)
+endif()
+
+if(GTK3_INCLUDE_DIRS)
+  list(REMOVE_DUPLICATES GTK3_INCLUDE_DIRS)
+endif()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/build-support/3rd-party/FindHarfBuzz.cmake ns-3.36/build-support/3rd-party/FindHarfBuzz.cmake
--- ns-3.35/build-support/3rd-party/FindHarfBuzz.cmake	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/build-support/3rd-party/FindHarfBuzz.cmake	2022-04-30 18:23:57.642732600 -0700
@@ -0,0 +1,196 @@
+# Copyright (c) 2012, Intel Corporation Copyright (c) 2019 Sony Interactive
+# Entertainment Inc.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+# * Redistributions of source code must retain the above copyright notice, this
+#   list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright notice,
+#   this list of conditions and the following disclaimer in the documentation
+#   and/or other materials provided with the distribution.
+# * Neither the name of Intel Corporation nor the names of its contributors may
+#   be used to endorse or promote products derived from this software without
+#   specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+# Try to find Harfbuzz include and library directories.
+#
+# After successful discovery, this will set for inclusion where needed:
+# HarfBuzz_INCLUDE_DIRS - contains the HarfBuzz headers HarfBuzz_LIBRARIES -
+# contains the HarfBuzz library
+
+#[=======================================================================[.rst:
+FindHarfBuzz
+--------------
+
+Find HarfBuzz headers and libraries.
+
+Imported Targets
+^^^^^^^^^^^^^^^^
+
+``HarfBuzz::HarfBuzz``
+  The HarfBuzz library, if found.
+
+``HarfBuzz::ICU``
+  The HarfBuzz ICU library, if found.
+
+Result Variables
+^^^^^^^^^^^^^^^^
+
+This will define the following variables in your project:
+
+``HarfBuzz_FOUND``
+  true if (the requested version of) HarfBuzz is available.
+``HarfBuzz_VERSION``
+  the version of HarfBuzz.
+``HarfBuzz_LIBRARIES``
+  the libraries to link against to use HarfBuzz.
+``HarfBuzz_INCLUDE_DIRS``
+  where to find the HarfBuzz headers.
+``HarfBuzz_COMPILE_OPTIONS``
+  this should be passed to target_compile_options(), if the
+  target is not used for linking
+
+#]=======================================================================]
+
+find_package(PkgConfig QUIET)
+pkg_check_modules(PC_HARFBUZZ QUIET harfbuzz)
+set(HarfBuzz_COMPILE_OPTIONS ${PC_HARFBUZZ_CFLAGS_OTHER})
+set(HarfBuzz_VERSION ${PC_HARFBUZZ_CFLAGS_VERSION})
+
+find_path(
+  HarfBuzz_INCLUDE_DIR
+  NAMES hb.h
+  HINTS ${PC_HARFBUZZ_INCLUDEDIR} ${PC_HARFBUZZ_INCLUDE_DIRS}
+  PATH_SUFFIXES harfbuzz
+)
+
+find_library(
+  HarfBuzz_LIBRARY NAMES ${HarfBuzz_NAMES} harfbuzz
+  HINTS ${PC_HARFBUZZ_LIBDIR} ${PC_HARFBUZZ_LIBRARY_DIRS}
+)
+
+if(HarfBuzz_INCLUDE_DIR AND NOT HarfBuzz_VERSION)
+  if(EXISTS "${HarfBuzz_INCLUDE_DIR}/hb-version.h")
+    file(READ "${HarfBuzz_INCLUDE_DIR}/hb-version.h" _harfbuzz_version_content)
+
+    string(REGEX MATCH
+                 "#define +HB_VERSION_STRING +\"([0-9]+\.[0-9]+\.[0-9]+)\""
+                 _dummy "${_harfbuzz_version_content}"
+    )
+    set(HarfBuzz_VERSION "${CMAKE_MATCH_1}")
+  endif()
+endif()
+
+if("${HarfBuzz_FIND_VERSION}" VERSION_GREATER "${HarfBuzz_VERSION}")
+  message(
+    FATAL_ERROR "Required version (" ${HarfBuzz_FIND_VERSION}
+                ") is higher than found version (" ${HarfBuzz_VERSION} ")"
+  )
+endif()
+
+# Find components
+if(HarfBuzz_INCLUDE_DIR AND HarfBuzz_LIBRARY)
+  set(_HarfBuzz_REQUIRED_LIBS_FOUND ON)
+  set(HarfBuzz_LIBS_FOUND "HarfBuzz (required): ${HarfBuzz_LIBRARY}")
+else()
+  set(_HarfBuzz_REQUIRED_LIBS_FOUND OFF)
+  set(HarfBuzz_LIBS_NOT_FOUND "HarfBuzz (required)")
+endif()
+
+if("ICU" IN_LIST HarfBuzz_FIND_COMPONENTS)
+  pkg_check_modules(PC_HARFBUZZ_ICU QUIET harfbuzz-icu)
+  set(HarfBuzz_ICU_COMPILE_OPTIONS ${PC_HARFBUZZ_ICU_CFLAGS_OTHER})
+
+  find_path(
+    HarfBuzz_ICU_INCLUDE_DIR
+    NAMES hb-icu.h
+    HINTS ${PC_HARFBUZZ_ICU_INCLUDEDIR} ${PC_HARFBUZZ_ICU_INCLUDE_DIRS}
+    PATH_SUFFIXES harfbuzz
+  )
+
+  find_library(
+    HarfBuzz_ICU_LIBRARY NAMES ${HarfBuzz_ICU_NAMES} harfbuzz-icu
+    HINTS ${PC_HARFBUZZ_ICU_LIBDIR} ${PC_HARFBUZZ_ICU_LIBRARY_DIRS}
+  )
+
+  if(HarfBuzz_ICU_LIBRARY)
+    if(HarfBuzz_FIND_REQUIRED_ICU)
+      list(APPEND HarfBuzz_LIBS_FOUND "ICU (required): ${HarfBuzz_ICU_LIBRARY}")
+    else()
+      list(APPEND HarfBuzz_LIBS_FOUND "ICU (optional): ${HarfBuzz_ICU_LIBRARY}")
+    endif()
+  else()
+    if(HarfBuzz_FIND_REQUIRED_ICU)
+      set(_HarfBuzz_REQUIRED_LIBS_FOUND OFF)
+      list(APPEND HarfBuzz_LIBS_NOT_FOUND "ICU (required)")
+    else()
+      list(APPEND HarfBuzz_LIBS_NOT_FOUND "ICU (optional)")
+    endif()
+  endif()
+endif()
+
+if(NOT HarfBuzz_FIND_QUIETLY)
+  if(HarfBuzz_LIBS_FOUND)
+    message(STATUS "Found the following HarfBuzz libraries:")
+    foreach(found ${HarfBuzz_LIBS_FOUND})
+      message(STATUS " ${found}")
+    endforeach()
+  endif()
+  if(HarfBuzz_LIBS_NOT_FOUND)
+    message(STATUS "The following HarfBuzz libraries were not found:")
+    foreach(found ${HarfBuzz_LIBS_NOT_FOUND})
+      message(STATUS " ${found}")
+    endforeach()
+  endif()
+endif()
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(
+  HarfBuzz
+  FOUND_VAR HarfBuzz_FOUND
+  REQUIRED_VARS HarfBuzz_INCLUDE_DIR HarfBuzz_LIBRARY
+                _HarfBuzz_REQUIRED_LIBS_FOUND
+  VERSION_VAR HarfBuzz_VERSION
+)
+
+if(HarfBuzz_LIBRARY AND NOT TARGET HarfBuzz::HarfBuzz)
+  add_library(HarfBuzz::HarfBuzz UNKNOWN IMPORTED GLOBAL)
+  set_target_properties(
+    HarfBuzz::HarfBuzz
+    PROPERTIES IMPORTED_LOCATION "${HarfBuzz_LIBRARY}"
+               INTERFACE_COMPILE_OPTIONS "${HarfBuzz_COMPILE_OPTIONS}"
+               INTERFACE_INCLUDE_DIRECTORIES "${HarfBuzz_INCLUDE_DIR}"
+  )
+endif()
+
+if(HarfBuzz_ICU_LIBRARY AND NOT TARGET HarfBuzz::ICU)
+  add_library(HarfBuzz::ICU UNKNOWN IMPORTED GLOBAL)
+  set_target_properties(
+    HarfBuzz::ICU
+    PROPERTIES IMPORTED_LOCATION "${HarfBuzz_ICU_LIBRARY}"
+               INTERFACE_COMPILE_OPTIONS "${HarfBuzz_ICU_COMPILE_OPTIONS}"
+               INTERFACE_INCLUDE_DIRECTORIES "${HarfBuzz_ICU_INCLUDE_DIR}"
+  )
+endif()
+
+mark_as_advanced(
+  HarfBuzz_INCLUDE_DIR HarfBuzz_ICU_INCLUDE_DIR HarfBuzz_LIBRARY
+  HarfBuzz_ICU_LIBRARY
+)
+
+if(HarfBuzz_FOUND)
+  set(HarfBuzz_LIBRARIES ${HarfBuzz_LIBRARY} ${HarfBuzz_ICU_LIBRARY})
+  set(HarfBuzz_INCLUDE_DIRS ${HarfBuzz_INCLUDE_DIR} ${HarfBuzz_ICU_INCLUDE_DIR})
+endif()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/build-support/3rd-party/FindSphinx.cmake ns-3.36/build-support/3rd-party/FindSphinx.cmake
--- ns-3.35/build-support/3rd-party/FindSphinx.cmake	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/build-support/3rd-party/FindSphinx.cmake	2022-04-30 18:23:57.642732600 -0700
@@ -0,0 +1,29 @@
+# CMake find_package() Module for Sphinx documentation generator
+# http://sphinx-doc.org/
+#
+# Example usage:
+#
+# find_package(Sphinx)
+#
+# If successful the following variables will be defined SPHINX_FOUND
+# SPHINX_EXECUTABLE
+
+find_program(
+  SPHINX_EXECUTABLE NAMES sphinx-build sphinx-build2
+  DOC "Path to sphinx-build executable"
+)
+
+# Handle REQUIRED and QUIET arguments this will also set SPHINX_FOUND to true if
+# SPHINX_EXECUTABLE exists
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(
+  Sphinx "Failed to locate sphinx-build executable" SPHINX_EXECUTABLE
+)
+
+# Provide options for controlling different types of output
+option(SPHINX_OUTPUT_HTML "Output standalone HTML files" ON)
+option(SPHINX_OUTPUT_MAN "Output man pages" ON)
+
+option(SPHINX_WARNINGS_AS_ERRORS
+       "When building documentation treat warnings as errors" ON
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/build-support/3rd-party/netanim-cmakelists.cmake ns-3.36/build-support/3rd-party/netanim-cmakelists.cmake
--- ns-3.35/build-support/3rd-party/netanim-cmakelists.cmake	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/build-support/3rd-party/netanim-cmakelists.cmake	2022-04-30 18:23:57.642732600 -0700
@@ -0,0 +1,191 @@
+# Copyright (c) 2017-2021 Universidade de BrasÃ­lia
+#
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License version 2 as published by the Free
+# Software Foundation;
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
+# details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc., 59 Temple
+# Place, Suite 330, Boston, MA  02111-1307 USA
+#
+# Author: Gabriel Ferreira <gabrielcarvfer@gmail.com>
+
+find_package(Qt4 COMPONENTS QtGui QUIET)
+find_package(Qt5 COMPONENTS Core Widgets PrintSupport Gui QUIET)
+
+if((NOT ${Qt4_FOUND}) AND (NOT ${Qt5_FOUND}))
+  message(FATAL_ERROR "You need Qt installed to build NetAnim")
+endif()
+
+# Qt 4 requires these inclusions
+if(NOT ${Qt5_found})
+  include(${QT_USE_FILE})
+  add_definitions(${QT_DEFINITIONS})
+  include_directories(${QT_INCLUDES})
+endif()
+
+# Used by qt
+set(CMAKE_AUTOMOC ON)
+set(CMAKE_AUTORCC ON)
+set(CMAKE_AUTOUIC ON)
+
+set(source_files
+    animatormode.cpp
+    animatorscene.cpp
+    animatorview.cpp
+    animlink.cpp
+    animnode.cpp
+    animpacket.cpp
+    animpropertybrowser.cpp
+    animresource.cpp
+    animxmlparser.cpp
+    countertablesscene.cpp
+    flowmonstatsscene.cpp
+    flowmonxmlparser.cpp
+    graphpacket.cpp
+    interfacestatsscene.cpp
+    log.cpp
+    logqt.cpp
+    main.cpp
+    mode.cpp
+    netanim.cpp
+    packetsmode.cpp
+    packetsscene.cpp
+    packetsview.cpp
+    qcustomplot.cpp
+    qtpropertybrowser/src/fileedit.cpp
+    qtpropertybrowser/src/fileeditfactory.cpp
+    qtpropertybrowser/src/filepathmanager.cpp
+    qtpropertybrowser/src/qtbuttonpropertybrowser.cpp
+    qtpropertybrowser/src/qteditorfactory.cpp
+    qtpropertybrowser/src/qtgroupboxpropertybrowser.cpp
+    qtpropertybrowser/src/qtpropertybrowser.cpp
+    qtpropertybrowser/src/qtpropertybrowserutils.cpp
+    qtpropertybrowser/src/qtpropertymanager.cpp
+    qtpropertybrowser/src/qttreepropertybrowser.cpp
+    qtpropertybrowser/src/qtvariantproperty.cpp
+    resizeableitem.cpp
+    routingstatsscene.cpp
+    routingxmlparser.cpp
+    statsmode.cpp
+    statsview.cpp
+    table.cpp
+    textbubble.cpp
+)
+
+set(header_files
+    abort.h
+    animatorconstants.h
+    animatormode.h
+    animatorscene.h
+    animatorview.h
+    animevent.h
+    animlink.h
+    animnode.h
+    animpacket.h
+    animpropertybrowser.h
+    animresource.h
+    animxmlparser.h
+    common.h
+    countertablesscene.h
+    flowmonstatsscene.h
+    flowmonxmlparser.h
+    graphpacket.h
+    interfacestatsscene.h
+    logqt.h
+    mode.h
+    netanim.h
+    packetsmode.h
+    packetsscene.h
+    packetsview.h
+    qcustomplot.h
+    qtpropertybrowser/src/QtAbstractEditorFactoryBase
+    qtpropertybrowser/src/QtAbstractPropertyBrowser
+    qtpropertybrowser/src/QtAbstractPropertyManager
+    qtpropertybrowser/src/QtBoolPropertyManager
+    qtpropertybrowser/src/QtBrowserItem
+    qtpropertybrowser/src/QtButtonPropertyBrowser
+    qtpropertybrowser/src/QtCharEditorFactory
+    qtpropertybrowser/src/QtCharPropertyManager
+    qtpropertybrowser/src/QtCheckBoxFactory
+    qtpropertybrowser/src/QtColorEditorFactory
+    qtpropertybrowser/src/QtColorPropertyManager
+    qtpropertybrowser/src/QtCursorEditorFactory
+    qtpropertybrowser/src/QtCursorPropertyManager
+    qtpropertybrowser/src/QtDateEditFactory
+    qtpropertybrowser/src/QtDatePropertyManager
+    qtpropertybrowser/src/QtDateTimeEditFactory
+    qtpropertybrowser/src/QtDateTimePropertyManager
+    qtpropertybrowser/src/QtDoublePropertyManager
+    qtpropertybrowser/src/QtDoubleSpinBoxFactory
+    qtpropertybrowser/src/QtEnumEditorFactory
+    qtpropertybrowser/src/QtEnumPropertyManager
+    qtpropertybrowser/src/QtFlagPropertyManager
+    qtpropertybrowser/src/QtFontEditorFactory
+    qtpropertybrowser/src/QtFontPropertyManager
+    qtpropertybrowser/src/QtGroupBoxPropertyBrowser
+    qtpropertybrowser/src/QtGroupPropertyManager
+    qtpropertybrowser/src/QtIntPropertyManager
+    qtpropertybrowser/src/QtKeySequenceEditorFactory
+    qtpropertybrowser/src/QtKeySequencePropertyManager
+    qtpropertybrowser/src/QtLineEditFactory
+    qtpropertybrowser/src/QtLocalePropertyManager
+    qtpropertybrowser/src/QtPointFPropertyManager
+    qtpropertybrowser/src/QtPointPropertyManager
+    qtpropertybrowser/src/QtProperty
+    qtpropertybrowser/src/QtRectFPropertyManager
+    qtpropertybrowser/src/QtRectPropertyManager
+    qtpropertybrowser/src/QtScrollBarFactory
+    qtpropertybrowser/src/QtSizeFPropertyManager
+    qtpropertybrowser/src/QtSizePolicyPropertyManager
+    qtpropertybrowser/src/QtSizePropertyManager
+    qtpropertybrowser/src/QtSliderFactory
+    qtpropertybrowser/src/QtSpinBoxFactory
+    qtpropertybrowser/src/QtStringPropertyManager
+    qtpropertybrowser/src/QtTimeEditFactory
+    qtpropertybrowser/src/QtTimePropertyManager
+    qtpropertybrowser/src/QtTreePropertyBrowser
+    qtpropertybrowser/src/QtVariantEditorFactory
+    qtpropertybrowser/src/QtVariantProperty
+    qtpropertybrowser/src/QtVariantPropertyManager
+    qtpropertybrowser/src/fileedit.h
+    qtpropertybrowser/src/fileeditfactory.h
+    qtpropertybrowser/src/filepathmanager.h
+    qtpropertybrowser/src/qtbuttonpropertybrowser.h
+    qtpropertybrowser/src/qteditorfactory.h
+    qtpropertybrowser/src/qtgroupboxpropertybrowser.h
+    qtpropertybrowser/src/qtpropertybrowser.h
+    qtpropertybrowser/src/qtpropertybrowserutils_p.h
+    qtpropertybrowser/src/qtpropertymanager.h
+    qtpropertybrowser/src/qttreepropertybrowser.h
+    qtpropertybrowser/src/qtvariantproperty.h
+    resizeableitem.h
+    routingstatsscene.h
+    routingxmlparser.h
+    statisticsconstants.h
+    statsmode.h
+    statsview.h
+    table.h
+    textbubble.h
+    timevalue.h
+)
+
+set(resource_files resources.qrc qtpropertybrowser/src/qtpropertybrowser.qrc)
+
+add_executable(netanim ${source_files} ${resource_files})
+
+if(Qt4_FOUND)
+  target_link_libraries(netanim PUBLIC ${libcore} Qt4::QtGui)
+else()
+  target_link_libraries(
+    netanim PUBLIC ${libcore} Qt5::Widgets Qt5::Core Qt5::PrintSupport Qt5::Gui
+  )
+endif()
+
+target_include_directories(netanim PUBLIC qtpropertybrowser/src)
+set_runtime_outputdirectory(netanim ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/bin "")
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/build-support/cmake-format-modules.txt ns-3.36/build-support/cmake-format-modules.txt
--- ns-3.35/build-support/cmake-format-modules.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/build-support/cmake-format-modules.txt	2022-04-30 18:23:57.642732600 -0700
@@ -0,0 +1,46 @@
+additional_commands:
+    build_lib:
+        flags: [IGNORE_PCH]
+        kwargs:
+            LIBNAME : '1'
+            SOURCE_FILES : '*'
+            HEADER_FILES : '*'
+            LIBRARIES_TO_LINK : '*'
+            TEST_SOURCES : '*'
+            DEPRECATED_HEADER_FILES : '*'
+            MODULE_ENABLED_FEATURES : '*'
+
+    build_lib_example:
+        flags: [IGNORE_PCH]
+        kwargs:
+            NAME : '1'
+            SOURCE_FILES : '*'
+            HEADER_FILES : '*'
+            LIBRARIES_TO_LINK : '*'
+
+    build_example:
+        kwargs:
+            NAME : '1'
+            SOURCE_FILES : '*'
+            HEADER_FILES : '*'
+            LIBRARIES_TO_LINK : '*'
+
+    find_external_library:
+        kwargs:
+            DEPENDENCY_NAME : '1'
+            HEADER_NAME : '1'
+            LIBRARY_NAME : '1'
+            HEADER_NAMES : '*'
+            LIBRARY_NAMES : '*'
+            PATH_SUFFIXES : '*'
+            SEARCH_PATHS : '*'
+
+format:
+  tab_size: 2
+  line_width: 80
+  dangle_parens: true
+  autosort: true
+  enable_sort: true
+  max_subgroups_hwrap: 1
+  max_pargs_hwrap: 1
+  max_lines_hwrap: 1
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/build-support/cmake-format.txt ns-3.36/build-support/cmake-format.txt
--- ns-3.35/build-support/cmake-format.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/build-support/cmake-format.txt	2022-04-30 18:23:57.642732600 -0700
@@ -0,0 +1,7 @@
+format:
+  tab_size: 2
+  line_width: 80
+  dangle_parens: true
+  autosort: true
+  enable_sort: true
+  max_subgroups_hwrap: 3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/build-support/Config.cmake.in ns-3.36/build-support/Config.cmake.in
--- ns-3.35/build-support/Config.cmake.in	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/build-support/Config.cmake.in	2022-04-30 18:23:57.642732600 -0700
@@ -0,0 +1,3 @@
+@PACKAGE_INIT@
+
+include("${CMAKE_CURRENT_LIST_DIR}/ns3Targets.cmake")
\ No newline at end of file
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/build-support/config-store-config-template.h ns-3.36/build-support/config-store-config-template.h
--- ns-3.35/build-support/config-store-config-template.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/build-support/config-store-config-template.h	2022-04-30 18:23:57.642732600 -0700
@@ -0,0 +1,10 @@
+#ifndef NS3_CONFIG_STORE_CONFIG_H
+#define NS3_CONFIG_STORE_CONFIG_H
+
+#cmakedefine PYTHONDIR "@PYTHONDIR@"
+#cmakedefine PYTHONARCHDIR "@PYTHONARCHDIR@"
+#cmakedefine HAVE_PYEMBED
+#cmakedefine HAVE_PYEXT
+#cmakedefine HAVE_PYTHON_H
+
+#endif //NS3_CONFIG_STORE_CONFIG_H
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/build-support/core-config-template.h ns-3.36/build-support/core-config-template.h
--- ns-3.35/build-support/core-config-template.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/build-support/core-config-template.h	2022-04-30 18:23:57.642732600 -0700
@@ -0,0 +1,21 @@
+#ifndef NS3_CORE_CONFIG_H
+#define NS3_CORE_CONFIG_H
+
+#cmakedefine   HAVE_UINT128_T
+#cmakedefine01 HAVE___UINT128_T
+#cmakedefine   INT64X64_USE_128
+#cmakedefine   INT64X64_USE_DOUBLE
+#cmakedefine   INT64X64_USE_CAIRO
+#cmakedefine01 HAVE_STDINT_H
+#cmakedefine01 HAVE_INTTYPES_H
+#cmakedefine   HAVE_SYS_INT_TYPES_H
+#cmakedefine01 HAVE_SYS_TYPES_H
+#cmakedefine01 HAVE_SYS_STAT_H
+#cmakedefine01 HAVE_DIRENT_H
+#cmakedefine01 HAVE_STDLIB_H
+#cmakedefine01 HAVE_GETENV
+#cmakedefine01 HAVE_SIGNAL_H
+#cmakedefine01 HAVE_PTHREAD_H
+#cmakedefine   HAVE_RT
+
+#endif //NS3_CORE_CONFIG_H
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/build-support/custom-modules/ns3-cmake-package.cmake ns-3.36/build-support/custom-modules/ns3-cmake-package.cmake
--- ns-3.35/build-support/custom-modules/ns3-cmake-package.cmake	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/build-support/custom-modules/ns3-cmake-package.cmake	2022-04-30 18:23:57.642732600 -0700
@@ -0,0 +1,151 @@
+# Copyright (c) 2017-2021 Universidade de BrasÃ­lia
+#
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License version 2 as published by the Free
+# Software Foundation;
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
+# details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc., 59 Temple
+# Place, Suite 330, Boston, MA  02111-1307 USA
+#
+# Author: Gabriel Ferreira <gabrielcarvfer@gmail.com>
+
+function(build_required_and_libs_lists module_name visibility libraries
+         all_ns3_libraries
+)
+  set(linked_libs_list)
+  set(required_modules_list)
+  foreach(lib ${libraries})
+    if(${lib} IN_LIST all_ns3_libraries)
+      get_target_property(lib_real_name ${lib} OUTPUT_NAME)
+      remove_lib_prefix(${lib} required_module_name)
+      set(required_modules_list
+          "${required_modules_list} ns3-${required_module_name}"
+      )
+    else()
+      set(lib_real_name ${lib})
+    endif()
+    set(linked_libs_list "${linked_libs_list} -l${lib_real_name}")
+  endforeach()
+  set(pkgconfig_${visibility}_libs ${linked_libs_list} PARENT_SCOPE)
+  set(pkgconfig_${visibility}_required ${required_modules_list} PARENT_SCOPE)
+endfunction()
+
+function(pkgconfig_module libname)
+  # Fetch all libraries that will be linked to module
+  get_target_property(all_libs ${libname} LINK_LIBRARIES)
+
+  # Then fetch public libraries
+  get_target_property(interface_libs ${libname} INTERFACE_LINK_LIBRARIES)
+
+  # Filter linking flags
+  string(REPLACE "${LIB_AS_NEEDED_PRE}" "" all_libs "${all_libs}")
+  string(REPLACE "${LIB_AS_NEEDED_POST}" "" all_libs "${all_libs}")
+  string(REPLACE "${LIB_AS_NEEDED_PRE}" "" interface_libs "${interface_libs}")
+  string(REPLACE "${LIB_AS_NEEDED_POST}" "" interface_libs "${interface_libs}")
+
+  foreach(interface_lib ${interface_libs})
+    list(REMOVE_ITEM all_libs ${interface_lib})
+  endforeach()
+  set(private_libs ${all_libs})
+
+  # Create two lists of publicly and privately linked libraries to this module
+  remove_lib_prefix(${libname} module_name)
+
+  # These filter out ns and non-ns libraries into public and private libraries
+  # linked against module_name
+  get_target_property(pkgconfig_target_lib ${libname} OUTPUT_NAME)
+
+  # pkgconfig_public_libs pkgconfig_public_required
+  build_required_and_libs_lists(
+    "${module_name}" public "${interface_libs}"
+    "${ns3-libs};${ns3-contrib-libs}"
+  )
+
+  # pkgconfig_private_libs pkgconfig_private_required
+  build_required_and_libs_lists(
+    "${module_name}" private "${private_libs}"
+    "${ns3-libs};${ns3-contrib-libs}"
+  )
+
+  set(pkgconfig_interface_include_directories)
+  if(${NS3_REEXPORT_THIRD_PARTY_LIBRARIES})
+    get_target_includes(${libname} pkgconfig_interface_include_directories)
+    string(REPLACE "-I${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/include" ""
+                   pkgconfig_interface_include_directories
+                   "${pkgconfig_interface_include_directories}"
+    )
+    string(REPLACE ";-I" " -I" pkgconfig_interface_include_directories
+                   "${pkgconfig_interface_include_directories}"
+    )
+  endif()
+
+  # Configure pkgconfig file for the module using pkgconfig variables
+  set(pkgconfig_file ${CMAKE_BINARY_DIR}/pkgconfig/ns3-${module_name}.pc)
+  configure_file(
+    ${PROJECT_SOURCE_DIR}/build-support/pkgconfig-template.pc.in
+    ${pkgconfig_file} @ONLY
+  )
+
+  # Set file to be installed
+  install(FILES ${pkgconfig_file} DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
+endfunction()
+
+function(ns3_cmake_package)
+  # Only create configuration to export if there is an module configured to be
+  # built
+  set(enabled_modules "${ns3-libs};${ns3-contrib-libs}")
+  if(enabled_modules STREQUAL ";")
+    message(
+      STATUS
+        "No modules were configured, so we cannot create installation artifacts"
+    )
+    return()
+  endif()
+
+  # CMake does not support '-' separated versions in config packages, so replace
+  # them with dots
+  string(REPLACE "-" "." ns3_version "${NS3_VER}")
+
+  foreach(library ${ns3-libs}${ns3-contrib-libs})
+    pkgconfig_module(${library})
+  endforeach()
+
+  install(
+    EXPORT ns3ExportTargets
+    NAMESPACE ns3::
+    DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/ns3
+    FILE ns3Targets.cmake
+  )
+
+  include(CMakePackageConfigHelpers)
+  configure_package_config_file(
+    "build-support/Config.cmake.in" "ns3Config.cmake"
+    INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/ns3
+    PATH_VARS CMAKE_INSTALL_LIBDIR
+  )
+
+  write_basic_package_version_file(
+    ${CMAKE_CURRENT_BINARY_DIR}/ns3ConfigVersion.cmake VERSION ${ns3_version}
+    COMPATIBILITY ExactVersion
+  )
+
+  install(FILES "${CMAKE_CURRENT_BINARY_DIR}/ns3Config.cmake"
+                "${CMAKE_CURRENT_BINARY_DIR}/ns3ConfigVersion.cmake"
+          DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/ns3
+  )
+endfunction()
+
+# You will need administrative privileges to run this
+add_custom_target(
+  uninstall
+  COMMAND
+    rm `ls ${CMAKE_INSTALL_FULL_LIBDIR}/libns3*` && rm -R
+    ${CMAKE_INSTALL_FULL_LIBDIR}/cmake/ns3 && rm -R
+    ${CMAKE_INSTALL_FULL_INCLUDEDIR}/ns3
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/build-support/custom-modules/ns3-configtable.cmake ns-3.36/build-support/custom-modules/ns3-configtable.cmake
--- ns-3.35/build-support/custom-modules/ns3-configtable.cmake	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/build-support/custom-modules/ns3-configtable.cmake	2022-04-30 18:23:57.642732600 -0700
@@ -0,0 +1,213 @@
+# cmake-format: off
+#
+# A sample of what Waf produced
+
+# ---- Summary of optional NS-3 features:
+# Build profile                 : debug
+# Build directory               :
+# BRITE Integration             : not enabled (BRITE not enabled (see option --with-brite))
+# DES Metrics event collection  : not enabled (defaults to disabled)
+# DPDK NetDevice                : not enabled (libdpdk not found, $RTE_SDK and/or $RTE_TARGET environment variable not set or incorrect)
+# Emulation FdNetDevice         : enabled
+# Examples                      : not enabled (defaults to disabled)
+# File descriptor NetDevice     : enabled
+# GNU Scientific Library (GSL)  : enabled
+# GtkConfigStore                : enabled
+# MPI Support                   : not enabled (option --enable-mpi not selected)
+# NS-3 Click Integration        : not enabled (nsclick not enabled (see option --with-nsclick))
+# NS-3 OpenFlow Integration     : not enabled (OpenFlow not enabled (see option --with-openflow))
+# Netmap emulation FdNetDevice  : not enabled (needs net/netmap_user.h)
+# PyViz visualizer              : not enabled (Missing python modules: pygraphviz, gi.repository.GooCanvas)
+# Python API Scanning Support   : not enabled (castxml too old)
+# Python Bindings               : enabled
+# Real Time Simulator           : enabled
+# SQLite stats support          : enabled
+# Tap Bridge                    : enabled
+# Tap FdNetDevice               : enabled
+# Tests                         : not enabled (defaults to disabled)
+# Threading Primitives          : enabled
+# Use sudo to set suid bit      : not enabled (option --enable-sudo not selected)
+# XmlIo                         : enabled
+#
+#
+# And now a sample after build
+#
+# Modules built:
+# antenna                   aodv                      applications
+# bridge                    buildings                 config-store
+# core                      csma                      csma-layout
+# dsdv                      dsr                       energy
+# fd-net-device             flow-monitor              internet
+# internet-apps             lr-wpan                   lte
+# mesh                      mobility                  netanim
+# network                   nix-vector-routing        olsr
+# point-to-point            point-to-point-layout     propagation
+# sixlowpan                 spectrum                  stats
+# tap-bridge                test (no Python)          topology-read
+# traffic-control           uan                       virtual-net-device
+# wave                      wifi                      wimax
+#
+# Modules not built (see ns-3 tutorial for explanation):
+# brite                     click                     dpdk-net-device
+# mpi                       openflow                  visualizer
+#
+# cmake-format: on
+
+# Now the CMake part
+
+macro(check_on_or_off user_config_switch confirmation_flag)
+  if(${user_config_switch})
+    if(${confirmation_flag})
+      string(APPEND out "${Green}ON${ColourReset}\n")
+    else()
+      string(APPEND out "${Red}OFF (missing dependency)${ColourReset}\n")
+    endif()
+  else()
+    string(APPEND out "OFF (not requested)\n")
+  endif()
+endmacro()
+
+function(print_formatted_table_with_modules table_name modules output)
+  set(temp)
+  string(APPEND temp "${table_name}:\n")
+  set(count 0) # Variable to count number of columns
+  set(width 26) # Variable with column width
+  string(REPLACE ";lib" ";" modules_to_print ";${modules}")
+  string(SUBSTRING "${modules_to_print}" 1 -1 modules_to_print)
+  list(SORT modules_to_print) # Sort for nice output
+  set(modules_with_large_names)
+  foreach(module ${modules_to_print})
+    # Get the size of the module string name
+    string(LENGTH ${module} module_name_length)
+
+    # Skip modules with names wider than 26 characters
+    if(${module_name_length} GREATER_EQUAL ${width})
+      list(APPEND modules_with_large_names ${module})
+      continue()
+    endif()
+
+    # Calculate trailing spaces to fill the column
+    math(EXPR num_trailing_spaces "${width} - ${module_name_length}")
+
+    # Get a string with spaces
+    string(RANDOM LENGTH ${num_trailing_spaces} ALPHABET " " trailing_spaces)
+
+    # Append module name and spaces to output
+    string(APPEND temp "${module}${trailing_spaces}")
+    math(EXPR count "${count} + 1") # Count number of column
+
+    # When counter hits the 3rd column, wrap to the nextline
+    if(${count} EQUAL 3)
+      string(APPEND temp "\n")
+      set(count 0)
+    endif()
+  endforeach()
+
+  # Print modules with large names one by one
+  foreach(module ${modules_with_large_names})
+    string(APPEND temp "${module}\n")
+  endforeach()
+  string(APPEND temp "\n")
+
+  # Save the table outer scope out variable
+  set(${output} ${${output}}${temp} PARENT_SCOPE)
+endfunction()
+
+macro(write_configtable)
+  set(out "---- Summary of optional NS-3 features:\n")
+  string(APPEND out "Build profile                 : ${build_profile}\n")
+  string(APPEND out
+         "Build directory               : ${CMAKE_OUTPUT_DIRECTORY}\n"
+  )
+  string(APPEND out "BRITE Integration             : ")
+  check_on_or_off("ON" "${NS3_BRITE}")
+
+  string(APPEND out "DES Metrics event collection  : ")
+  check_on_or_off("${NS3_DES_METRICS}" "${NS3_DES_METRICS}")
+
+  string(APPEND out "DPDK NetDevice                : ")
+  check_on_or_off("${NS3_DPDK}" "${ENABLE_DPDKDEVNET}")
+
+  string(APPEND out "Emulation FdNetDevice         : ")
+  check_on_or_off("${ENABLE_EMU}" "${ENABLE_EMUNETDEV}")
+
+  string(APPEND out "Examples                      : ")
+  check_on_or_off("${ENABLE_EXAMPLES}" "${ENABLE_EXAMPLES}")
+
+  string(APPEND out "File descriptor NetDevice     : ")
+  check_on_or_off("ON" "${ENABLE_FDNETDEV}")
+
+  string(APPEND out "GNU Scientific Library (GSL)  : ")
+  check_on_or_off("${NS3_GSL}" "${GSL_FOUND}")
+
+  string(APPEND out "GtkConfigStore                : ")
+  check_on_or_off("${NS3_GTK3}" "${GTK3_FOUND}")
+
+  string(APPEND out "MPI Support                   : ")
+  check_on_or_off("${NS3_MPI}" "${MPI_FOUND}")
+
+  string(APPEND out "NS-3 Click Integration        : ")
+  check_on_or_off("ON" "${NS3_CLICK}")
+
+  string(APPEND out "NS-3 OpenFlow Integration     : ")
+  check_on_or_off("ON" "${NS3_OPENFLOW}")
+
+  string(APPEND out "Netmap emulation FdNetDevice  : ")
+  check_on_or_off("${ENABLE_EMU}" "${ENABLE_NETMAP_EMU}")
+
+  string(APPEND out "PyViz visualizer              : ")
+  check_on_or_off("${NS3_VISUALIZER}" "${ENABLE_VISUALIZER}")
+
+  # string(APPEND out "Python API Scanning Support   : not enabled (castxml too
+  # old)
+  string(APPEND out "Python Bindings               : ")
+  check_on_or_off("${NS3_PYTHON_BINDINGS}" "${ENABLE_PYTHON_BINDINGS}")
+
+  string(APPEND out "Real Time Simulator           : ")
+  check_on_or_off("${NS3_REALTIME}" "${ENABLE_REALTIME}")
+
+  string(APPEND out "SQLite stats support          : ")
+  check_on_or_off("${NS3_SQLITE}" "${ENABLE_SQLITE}")
+
+  string(APPEND out "Tap Bridge                    : ")
+  check_on_or_off("${ENABLE_TAP}" "${ENABLE_TAP}")
+
+  string(APPEND out "Tap FdNetDevice               : ")
+  check_on_or_off("${ENABLE_TAP}" "${ENABLE_TAPNETDEV}")
+
+  string(APPEND out "Tests                         : ")
+  check_on_or_off("${ENABLE_TESTS}" "${ENABLE_TESTS}")
+
+  # string(APPEND out "Use sudo to set suid bit      : not enabled (option
+  # --enable-sudo not selected) string(APPEND out "XmlIo : enabled
+  string(APPEND out "\n\n")
+
+  set(really-enabled-modules ${ns3-libs};${ns3-contrib-libs})
+  if(${ENABLE_TESTS})
+    list(APPEND really-enabled-modules libtest) # test is an object library and
+                                                # is treated differently
+  endif()
+  if(really-enabled-modules)
+    print_formatted_table_with_modules(
+      "Modules configured to be built" "${really-enabled-modules}" "out"
+    )
+    string(APPEND out "\n")
+  endif()
+
+  set(disabled-modules)
+  foreach(module ${ns3-all-enabled-modules})
+    if(NOT (lib${module} IN_LIST really-enabled-modules))
+      list(APPEND disabled-modules ${module})
+    endif()
+  endforeach()
+
+  if(disabled-modules)
+    print_formatted_table_with_modules(
+      "Modules that cannot be built" "${disabled-modules}" "out"
+    )
+    string(APPEND out "\n")
+  endif()
+
+  file(WRITE ${PROJECT_BINARY_DIR}/ns3config.txt ${out})
+  message(STATUS ${out})
+endmacro()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/build-support/custom-modules/ns3-contributions.cmake ns-3.36/build-support/custom-modules/ns3-contributions.cmake
--- ns-3.35/build-support/custom-modules/ns3-contributions.cmake	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/build-support/custom-modules/ns3-contributions.cmake	2022-04-30 18:23:57.642732600 -0700
@@ -0,0 +1,38 @@
+# Copyright (c) 2017-2021 Universidade de BrasÃ­lia
+#
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License version 2 as published by the Free
+# Software Foundation;
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
+# details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc., 59 Temple
+# Place, Suite 330, Boston, MA  02111-1307 USA
+#
+# Author: Gabriel Ferreira <gabrielcarvfer@gmail.com>
+
+macro(process_contribution contribution_list)
+  # Create handles to reference contrib libraries
+  foreach(libname ${contribution_list})
+    library_target_name(${libname} targetname)
+    set(lib${libname} ${targetname} CACHE INTERNAL "")
+    set(lib${libname}-obj ${targetname}-obj CACHE INTERNAL "")
+  endforeach()
+
+  # Add contribution folders to be built
+  foreach(contribname ${contribution_list})
+    set(folder "contrib/${contribname}")
+    if(EXISTS ${PROJECT_SOURCE_DIR}/${folder}/CMakeLists.txt)
+      message(STATUS "Processing ${folder}")
+      add_subdirectory(${folder})
+    else()
+      message(${HIGHLIGHTED_STATUS}
+              "Skipping ${folder} : it does not contain a CMakeLists.txt file"
+      )
+    endif()
+  endforeach()
+endmacro()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/build-support/custom-modules/ns3-coverage.cmake ns-3.36/build-support/custom-modules/ns3-coverage.cmake
--- ns-3.35/build-support/custom-modules/ns3-coverage.cmake	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/build-support/custom-modules/ns3-coverage.cmake	2022-04-30 18:23:57.642732600 -0700
@@ -0,0 +1,50 @@
+# Copyright (c) 2017-2021 Universidade de BrasÃ­lia
+#
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License version 2 as published by the Free
+# Software Foundation;
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
+# details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc., 59 Temple
+# Place, Suite 330, Boston, MA  02111-1307 USA
+#
+# Author: Gabriel Ferreira <gabrielcarvfer@gmail.com>
+
+if(${NS3_COVERAGE})
+  mark_as_advanced(GCOV)
+  find_program(GCOV gcov)
+  if(NOT ("${GCOV}" STREQUAL "GCOV-NOTFOUND"))
+    add_definitions(--coverage)
+    link_libraries(-lgcov)
+  endif()
+
+  mark_as_advanced(LCOV)
+  find_program(LCOV lcov)
+  if("${LCOV}" STREQUAL "LCOV-NOTFOUND")
+    message(FATAL_ERROR "LCOV is required but it is not installed.")
+  endif()
+
+  if(${NS3_COVERAGE_ZERO_COUNTERS})
+    set(zero_counters "--lcov-zerocounters")
+  endif()
+  # The following target will run test.py --no-build to generate the code
+  # coverage files .gcno and .gcda output will be in ${CMAKE_BINARY_DIR} a.k.a.
+  # cmake-cache or cmake-build-${build_suffix}
+
+  # Create output directory for coverage info and html
+  file(MAKE_DIRECTORY ${CMAKE_OUTPUT_DIRECTORY}/coverage)
+
+  # Extract code coverage results and build html report
+  add_custom_target(
+    coverage_gcc
+    COMMAND lcov -o ns3.info -c --directory ${CMAKE_BINARY_DIR} ${zero_counters}
+    COMMAND genhtml ns3.info
+    WORKING_DIRECTORY ${CMAKE_OUTPUT_DIRECTORY}/coverage
+    DEPENDS run_test_py
+  )
+endif()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/build-support/custom-modules/ns3-lock.cmake ns-3.36/build-support/custom-modules/ns3-lock.cmake
--- ns-3.35/build-support/custom-modules/ns3-lock.cmake	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/build-support/custom-modules/ns3-lock.cmake	2022-04-30 18:23:57.642732600 -0700
@@ -0,0 +1,119 @@
+# Copyright (c) 2017-2021 Universidade de BrasÃ­lia
+#
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License version 2 as published by the Free
+# Software Foundation;
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
+# details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc., 59 Temple
+# Place, Suite 330, Boston, MA  02111-1307 USA
+#
+# Author: Gabriel Ferreira <gabrielcarvfer@gmail.com>
+
+function(cache_cmake_flag cmake_flag cache_entry output_string)
+  if(${${cmake_flag}})
+    set(${output_string} "${${output_string}}${cache_entry} = True\n"
+        PARENT_SCOPE
+    )
+  else()
+    set(${output_string} "${${output_string}}${cache_entry} = False\n"
+        PARENT_SCOPE
+    )
+  endif()
+endfunction(cache_cmake_flag)
+
+function(write_lock)
+  set(lock_contents "#! /usr/bin/env python3\n\n")
+
+  # Contents previously in ns-3-dev/.lock-waf_sys.platform_build
+  string(APPEND lock_contents "launch_dir = '${PROJECT_SOURCE_DIR}'\n")
+  string(APPEND lock_contents "run_dir = '${PROJECT_SOURCE_DIR}'\n")
+  string(APPEND lock_contents "top_dir = '${PROJECT_SOURCE_DIR}'\n")
+  string(APPEND lock_contents "out_dir = '${CMAKE_OUTPUT_DIRECTORY}'\n")
+  string(APPEND lock_contents "\n\n")
+
+  # Contents previously in ns-3-dev/build/c4che/_cache.py
+  string(APPEND lock_contents "NS3_ENABLED_MODULES = [")
+  foreach(module_library ${ns3-libs}) # fetch core module libraries
+    string(APPEND lock_contents "'")
+    remove_lib_prefix("${module_library}" module_name)
+    string(APPEND lock_contents "ns3-${module_name}', ")
+  endforeach()
+  string(APPEND lock_contents "]\n")
+
+  string(APPEND lock_contents "NS3_ENABLED_CONTRIBUTED_MODULES = [")
+  foreach(module_library ${ns3-contrib-libs}) # fetch core module libraries
+    string(APPEND lock_contents "'")
+    remove_lib_prefix("${module_library}" module_name)
+    string(APPEND lock_contents "ns3-${module_name}', ")
+  endforeach()
+  string(APPEND lock_contents "]\n")
+
+  string(REPLACE ":" "', '" PATH_LIST $ENV{PATH})
+  string(
+    APPEND
+    lock_contents
+    "NS3_MODULE_PATH = ['${PATH_LIST}', '${CMAKE_OUTPUT_DIRECTORY}', '${CMAKE_LIBRARY_OUTPUT_DIRECTORY}']\n"
+  )
+
+  cache_cmake_flag(ENABLE_REALTIME "ENABLE_REAL_TIME" lock_contents)
+  cache_cmake_flag(ENABLE_EXAMPLES "ENABLE_EXAMPLES" lock_contents)
+  cache_cmake_flag(ENABLE_TESTS "ENABLE_TESTS" lock_contents)
+  cache_cmake_flag(NS3_OPENFLOW "ENABLE_OPENFLOW" lock_contents)
+  cache_cmake_flag(NS3_CLICK "NSCLICK" lock_contents)
+  cache_cmake_flag(NS3_BRITE "ENABLE_BRITE" lock_contents)
+  cache_cmake_flag(NS3_ENABLE_SUDO "ENABLE_SUDO" lock_contents)
+  cache_cmake_flag(NS3_PYTHON_BINDINGS "ENABLE_PYTHON_BINDINGS" lock_contents)
+  cache_cmake_flag(
+    NS3_SCAN_PYTHON_BINDINGS "ENABLE_SCAN_PYTHON_BINDINGS" lock_contents
+  )
+
+  string(APPEND lock_contents "EXAMPLE_DIRECTORIES = [")
+  foreach(example_folder ${ns3-example-folders})
+    string(APPEND lock_contents "'${example_folder}', ")
+  endforeach()
+  string(APPEND lock_contents "]\n")
+
+  string(APPEND lock_contents "APPNAME = 'ns'\n")
+  string(APPEND lock_contents "BUILD_PROFILE = '${build_profile}'\n")
+  string(APPEND lock_contents "VERSION = '${NS3_VER}' \n")
+  string(APPEND lock_contents "PYTHON = ['${Python3_EXECUTABLE}']\n")
+
+  mark_as_advanced(VALGRIND)
+  find_program(VALGRIND valgrind)
+  if("${VALGRIND}" STREQUAL "VALGRIND-NOTFOUND")
+    string(APPEND lock_contents "VALGRIND_FOUND = False \n")
+  else()
+    string(APPEND lock_contents "VALGRIND_FOUND = True \n")
+  endif()
+
+  # Contents previously in ns-3-dev/build/build-status.py
+  string(APPEND lock_contents "\n\n")
+  string(APPEND lock_contents "ns3_runnable_programs = [")
+  foreach(executable ${ns3-execs})
+    string(APPEND lock_contents "'${executable}', ")
+  endforeach()
+  string(APPEND lock_contents "]\n\n")
+
+  string(APPEND lock_contents "ns3_runnable_scripts = [")
+  foreach(executable ${ns3-execs-py})
+    string(APPEND lock_contents "'${executable}', ")
+  endforeach()
+  string(APPEND lock_contents "]\n\n")
+
+  if(LINUX)
+    set(lock_filename .lock-ns3_linux_build)
+  elseif(APPLE)
+    set(lock_filename .lock-ns3_darwin_build)
+  elseif(WIN32)
+    set(lock_filename .lock-ns3_win32_build)
+  else()
+    message(FATAL_ERROR "Platform not supported")
+  endif()
+  file(WRITE ${PROJECT_SOURCE_DIR}/${lock_filename} ${lock_contents})
+endfunction(write_lock)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/build-support/custom-modules/ns3-module-macros.cmake ns-3.36/build-support/custom-modules/ns3-module-macros.cmake
--- ns-3.35/build-support/custom-modules/ns3-module-macros.cmake	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/build-support/custom-modules/ns3-module-macros.cmake	2022-04-30 18:23:57.642732600 -0700
@@ -0,0 +1,571 @@
+# Copyright (c) 2017-2021 Universidade de BrasÃ­lia
+#
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License version 2 as published by the Free
+# Software Foundation;
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
+# details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc., 59 Temple
+# Place, Suite 330, Boston, MA  02111-1307 USA
+#
+# Author: Gabriel Ferreira <gabrielcarvfer@gmail.com>
+
+# cmake-format: off
+#
+# This macro processes a ns-3 module
+#
+# Arguments:
+# LIBNAME = core, wifi, contributor_module
+# SOURCE_FILES = "list;of;.cc;files;"
+# HEADER_FILES = "list;of;public;.h;files;"
+# LIBRARIES_TO_LINK = "list;of;${library_names};"
+# TEST_SOURCES = "list;of;.cc;test;files;"
+#
+# DEPRECATED_HEADER_FILES = "list;of;deprecated;.h;files", copy won't get triggered if DEPRECATED_HEADER_FILES isn't set
+# IGNORE_PCH = TRUE or FALSE, prevents the PCH from including undesired system libraries (e.g. custom GLIBC for DCE)
+# MODULE_ENABLED_FEATURES = "list;of;enabled;features;for;this;module" (used by fd-net-device)
+# cmake-format: on
+
+function(build_lib)
+  # Argument parsing
+  set(options IGNORE_PCH)
+  set(oneValueArgs LIBNAME)
+  set(multiValueArgs SOURCE_FILES HEADER_FILES LIBRARIES_TO_LINK TEST_SOURCES
+                     DEPRECATED_HEADER_FILES MODULE_ENABLED_FEATURES
+  )
+  cmake_parse_arguments(
+    "BLIB" "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}
+  )
+
+  # Get path src/module or contrib/module
+  string(REPLACE "${PROJECT_SOURCE_DIR}/" "" FOLDER
+                 "${CMAKE_CURRENT_SOURCE_DIR}"
+  )
+
+  # Add library to a global list of libraries
+  if("${FOLDER}" MATCHES "src")
+    set(ns3-libs "${lib${BLIB_LIBNAME}};${ns3-libs}"
+        CACHE INTERNAL "list of processed upstream modules"
+    )
+  else()
+    set(ns3-contrib-libs "${lib${BLIB_LIBNAME}};${ns3-contrib-libs}"
+        CACHE INTERNAL "list of processed contrib modules"
+    )
+  endif()
+
+  if(NOT ${XCODE})
+    # Create object library with sources and headers, that will be used in
+    # lib-ns3-static and the shared library
+    add_library(
+      ${lib${BLIB_LIBNAME}-obj} OBJECT "${BLIB_SOURCE_FILES}"
+                                       "${BLIB_HEADER_FILES}"
+    )
+
+    if(${PRECOMPILE_HEADERS_ENABLED} AND (NOT ${IGNORE_PCH}))
+      target_precompile_headers(${lib${BLIB_LIBNAME}-obj} REUSE_FROM stdlib_pch)
+    endif()
+
+    # Create shared library with previously created object library (saving
+    # compilation time for static libraries)
+    add_library(
+      ${lib${BLIB_LIBNAME}} SHARED $<TARGET_OBJECTS:${lib${BLIB_LIBNAME}-obj}>
+    )
+  else()
+    # Xcode and CMake don't play well when using object libraries, so we have a
+    # specific path for that
+    add_library(${lib${BLIB_LIBNAME}} SHARED "${BLIB_SOURCE_FILES}")
+
+    if(${PRECOMPILE_HEADERS_ENABLED} AND (NOT ${IGNORE_PCH}))
+      target_precompile_headers(${lib${BLIB_LIBNAME}} REUSE_FROM stdlib_pch)
+    endif()
+  endif()
+
+  add_library(ns3::${lib${BLIB_LIBNAME}} ALIAS ${lib${BLIB_LIBNAME}})
+
+  # Associate public headers with library for installation purposes
+  if("${BLIB_LIBNAME}" STREQUAL "core")
+    set(config_headers ${CMAKE_HEADER_OUTPUT_DIRECTORY}/config-store-config.h
+                       ${CMAKE_HEADER_OUTPUT_DIRECTORY}/core-config.h
+    )
+    if(${ENABLE_BUILD_VERSION})
+      list(APPEND config_headers
+           ${CMAKE_HEADER_OUTPUT_DIRECTORY}/version-defines.h
+      )
+    endif()
+  endif()
+  set_target_properties(
+    ${lib${BLIB_LIBNAME}}
+    PROPERTIES
+      PUBLIC_HEADER
+      "${BLIB_HEADER_FILES};${BLIB_DEPRECATED_HEADER_FILES};${config_headers};${CMAKE_HEADER_OUTPUT_DIRECTORY}/${BLIB_LIBNAME}-module.h"
+  )
+
+  if(${NS3_CLANG_TIMETRACE})
+    add_dependencies(timeTraceReport ${lib${BLIB_LIBNAME}})
+  endif()
+
+  # Split ns and non-ns libraries to manage their propagation properly
+  set(non_ns_libraries_to_link)
+  set(ns_libraries_to_link)
+
+  foreach(library ${BLIB_LIBRARIES_TO_LINK})
+    remove_lib_prefix("${library}" module_name)
+
+    # Check if the module exists in the ns-3 modules list or if it is a
+    # 3rd-party library
+    if(${module_name} IN_LIST ns3-all-enabled-modules)
+      list(APPEND ns_libraries_to_link ${library})
+    else()
+      list(APPEND non_ns_libraries_to_link ${library})
+    endif()
+    unset(module_name)
+  endforeach()
+
+  if(NOT ${NS3_REEXPORT_THIRD_PARTY_LIBRARIES})
+    # ns-3 libraries are linked publicly, to make sure other modules can find
+    # each other without being directly linked
+    set(exported_libraries PUBLIC ${LIB_AS_NEEDED_PRE} ${ns_libraries_to_link}
+                           ${LIB_AS_NEEDED_POST}
+    )
+
+    # non-ns-3 libraries are linked privately, not propagating unnecessary
+    # libraries such as pthread, librt, etc
+    set(private_libraries PRIVATE ${LIB_AS_NEEDED_PRE}
+                          ${non_ns_libraries_to_link} ${LIB_AS_NEEDED_POST}
+    )
+
+    # we don't re-export included libraries from 3rd-party modules
+    set(exported_include_directories)
+  else()
+    # we export everything by default when NS3_REEXPORT_THIRD_PARTY_LIBRARIES=ON
+    set(exported_libraries PUBLIC ${LIB_AS_NEEDED_PRE} ${ns_libraries_to_link}
+                           ${non_ns_libraries_to_link} ${LIB_AS_NEEDED_POST}
+    )
+    set(private_libraries)
+
+    # with NS3_REEXPORT_THIRD_PARTY_LIBRARIES, we export all 3rd-party library
+    # include directories, allowing consumers of this module to include and link
+    # the 3rd-party code with no additional setup
+    get_target_includes(${lib${BLIB_LIBNAME}} exported_include_directories)
+    string(REPLACE "-I" "" exported_include_directories
+                   "${exported_include_directories}"
+    )
+    string(REPLACE "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/include" ""
+                   exported_include_directories
+                   "${exported_include_directories}"
+    )
+  endif()
+
+  target_link_libraries(
+    ${lib${BLIB_LIBNAME}} ${exported_libraries} ${private_libraries}
+  )
+
+  # set output name of library
+  set_target_properties(
+    ${lib${BLIB_LIBNAME}}
+    PROPERTIES OUTPUT_NAME ns${NS3_VER}-${BLIB_LIBNAME}${build_profile_suffix}
+  )
+
+  # export include directories used by this library so that it can be used by
+  # 3rd-party consumers of ns-3 using find_package(ns3) this will automatically
+  # add the build/include path to them, so that they can ns-3 headers with
+  # <ns3/something.h>
+  target_include_directories(
+    ${lib${BLIB_LIBNAME}}
+    PUBLIC $<BUILD_INTERFACE:${CMAKE_OUTPUT_DIRECTORY}/include>
+           $<INSTALL_INTERFACE:include>
+    INTERFACE ${exported_include_directories}
+  )
+
+  set(ns3-external-libs "${non_ns_libraries_to_link};${ns3-external-libs}"
+      CACHE INTERNAL
+            "list of non-ns libraries to link to NS3_STATIC and NS3_MONOLIB"
+  )
+  if(${NS3_STATIC} OR ${NS3_MONOLIB})
+    set(lib-ns3-static-objs
+        "$<TARGET_OBJECTS:${lib${BLIB_LIBNAME}-obj}>;${lib-ns3-static-objs}"
+        CACHE
+          INTERNAL
+          "list of object files from module used by NS3_STATIC and NS3_MONOLIB"
+    )
+  endif()
+
+  # Write a module header that includes all headers from that module
+  write_module_header("${BLIB_LIBNAME}" "${BLIB_HEADER_FILES}")
+
+  # Copy all header files to outputfolder/include before each build
+  copy_headers_before_building_lib(
+    ${BLIB_LIBNAME} ${CMAKE_HEADER_OUTPUT_DIRECTORY} "${BLIB_HEADER_FILES}"
+    public
+  )
+  if(BLIB_DEPRECATED_HEADER_FILES)
+    copy_headers_before_building_lib(
+      ${BLIB_LIBNAME} ${CMAKE_HEADER_OUTPUT_DIRECTORY}
+      "${BLIB_DEPRECATED_HEADER_FILES}" deprecated
+    )
+  endif()
+
+  # Build tests if requested
+  if(${ENABLE_TESTS})
+    list(LENGTH BLIB_TEST_SOURCES test_source_len)
+    if(${test_source_len} GREATER 0)
+      # Create BLIB_LIBNAME of output library test of module
+      set(test${BLIB_LIBNAME} lib${BLIB_LIBNAME}-test CACHE INTERNAL "")
+      set(ns3-libs-tests "${test${BLIB_LIBNAME}};${ns3-libs-tests}"
+          CACHE INTERNAL "list of test libraries"
+      )
+
+      # Create shared library containing tests of the module
+      add_library(${test${BLIB_LIBNAME}} SHARED "${BLIB_TEST_SOURCES}")
+
+      # Link test library to the module library
+      if(${NS3_MONOLIB})
+        target_link_libraries(
+          ${test${BLIB_LIBNAME}} ${LIB_AS_NEEDED_PRE} ${lib-ns3-monolib}
+          ${LIB_AS_NEEDED_POST}
+        )
+      else()
+        target_link_libraries(
+          ${test${BLIB_LIBNAME}} ${LIB_AS_NEEDED_PRE} ${lib${BLIB_LIBNAME}}
+          "${BLIB_LIBRARIES_TO_LINK}" ${LIB_AS_NEEDED_POST}
+        )
+      endif()
+      set_target_properties(
+        ${test${BLIB_LIBNAME}}
+        PROPERTIES OUTPUT_NAME
+                   ns${NS3_VER}-${BLIB_LIBNAME}-test${build_profile_suffix}
+      )
+
+      target_compile_definitions(
+        ${test${BLIB_LIBNAME}} PRIVATE NS_TEST_SOURCEDIR="${FOLDER}/test"
+      )
+      if(${PRECOMPILE_HEADERS_ENABLED} AND (NOT ${IGNORE_PCH}))
+        target_precompile_headers(${test${BLIB_LIBNAME}} REUSE_FROM stdlib_pch)
+      endif()
+    endif()
+  endif()
+
+  # Build lib examples if requested
+  foreach(example_folder example;examples)
+    if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${example_folder})
+      if(${ENABLE_EXAMPLES})
+        if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${example_folder}/CMakeLists.txt)
+          add_subdirectory(${example_folder})
+        endif()
+      endif()
+      scan_python_examples(${CMAKE_CURRENT_SOURCE_DIR}/${example_folder})
+    endif()
+  endforeach()
+
+  # Get architecture pair for python bindings
+  if((${CMAKE_SIZEOF_VOID_P} EQUAL 8) AND (NOT APPLE))
+    set(arch gcc_LP64)
+    set(arch_flags -m64)
+  else()
+    set(arch gcc_ILP32)
+    set(arch_flags)
+  endif()
+
+  # Add target to scan python bindings
+  if(${ENABLE_SCAN_PYTHON_BINDINGS}
+     AND (EXISTS ${CMAKE_HEADER_OUTPUT_DIRECTORY}/${BLIB_LIBNAME}-module.h)
+     AND (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/bindings")
+  )
+    set(bindings_output_folder ${PROJECT_SOURCE_DIR}/${FOLDER}/bindings)
+    file(MAKE_DIRECTORY ${bindings_output_folder})
+    set(module_api_ILP32 ${bindings_output_folder}/modulegen__gcc_ILP32.py)
+    set(module_api_LP64 ${bindings_output_folder}/modulegen__gcc_LP64.py)
+
+    set(modulescan_modular_command
+        ${Python3_EXECUTABLE}
+        ${PROJECT_SOURCE_DIR}/bindings/python/ns3modulescan-modular.py
+    )
+
+    set(header_map "")
+    # We need a python map that takes header.h to module e.g. "ptr.h": "core"
+    foreach(header ${BLIB_HEADER_FILES})
+      # header is a relative path to the current working directory
+      get_filename_component(
+        header_name ${CMAKE_CURRENT_SOURCE_DIR}/${header} NAME
+      )
+      string(APPEND header_map "\"${header_name}\":\"${BLIB_LIBNAME}\",")
+    endforeach()
+
+    set(ns3-headers-to-module-map "${ns3-headers-to-module-map}${header_map}"
+        CACHE INTERNAL "Map connecting headers to their modules"
+    )
+
+    # API scan needs the include directories to find a few headers (e.g. mpi.h)
+    get_target_includes(${lib${BLIB_LIBNAME}} modulegen_include_dirs)
+
+    set(module_to_generate_api ${module_api_ILP32})
+    set(LP64toILP32)
+    if("${arch}" STREQUAL "gcc_LP64")
+      set(module_to_generate_api ${module_api_LP64})
+      set(LP64toILP32
+          ${Python3_EXECUTABLE}
+          ${PROJECT_SOURCE_DIR}/build-support/pybindings-LP64-to-ILP32.py
+          ${module_api_LP64} ${module_api_ILP32}
+      )
+    endif()
+
+    add_custom_target(
+      ${lib${BLIB_LIBNAME}}-apiscan
+      COMMAND
+        ${modulescan_modular_command} ${CMAKE_OUTPUT_DIRECTORY} ${BLIB_LIBNAME}
+        ${PROJECT_BINARY_DIR}/header_map.json ${module_to_generate_api}
+        \"${arch_flags} ${modulegen_include_dirs}\" 2>
+        ${bindings_output_folder}/apiscan.log
+      COMMAND ${LP64toILP32}
+      WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+      DEPENDS ${lib${BLIB_LIBNAME}}
+    )
+    add_dependencies(apiscan-all ${lib${BLIB_LIBNAME}}-apiscan)
+  endif()
+
+  # Build pybindings if requested and if bindings subfolder exists in
+  # NS3/src/BLIB_LIBNAME
+  if(${ENABLE_PYTHON_BINDINGS} AND (EXISTS
+                                    "${CMAKE_CURRENT_SOURCE_DIR}/bindings")
+  )
+    set(bindings_output_folder ${CMAKE_OUTPUT_DIRECTORY}/${FOLDER}/bindings)
+    file(MAKE_DIRECTORY ${bindings_output_folder})
+    set(module_src ${bindings_output_folder}/ns3module.cc)
+    set(module_hdr ${bindings_output_folder}/ns3module.h)
+
+    string(REPLACE "-" "_" BLIB_LIBNAME_sub ${BLIB_LIBNAME}) # '-' causes
+                                                             # problems (e.g.
+    # csma-layout), replace with '_' (e.g. csma_layout)
+
+    # Set prefix of binding to _ if a ${BLIB_LIBNAME}.py exists, and copy the
+    # ${BLIB_LIBNAME}.py to the output folder
+    set(prefix)
+    if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/bindings/${BLIB_LIBNAME}.py)
+      set(prefix _)
+      file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/bindings/${BLIB_LIBNAME}.py
+           DESTINATION ${CMAKE_OUTPUT_DIRECTORY}/bindings/python/ns
+      )
+    endif()
+
+    # Run modulegen-modular to generate the bindings sources
+    if((NOT EXISTS ${module_hdr}) OR (NOT EXISTS ${module_src})) # OR TRUE) # to
+                                                                 # force
+                                                                 # reprocessing
+      string(REPLACE ";" "," ENABLED_FEATURES
+                     "${ns3-libs};${BLIB_MODULE_ENABLED_FEATURES}"
+      )
+      set(modulegen_modular_command
+          GCC_RTTI_ABI_COMPLETE=True NS3_ENABLED_FEATURES="${ENABLED_FEATURES}"
+          ${Python3_EXECUTABLE}
+          ${PROJECT_SOURCE_DIR}/bindings/python/ns3modulegen-modular.py
+      )
+      execute_process(
+        COMMAND
+          ${CMAKE_COMMAND} -E env
+          PYTHONPATH=${CMAKE_OUTPUT_DIRECTORY}:$ENV{PYTHONPATH}
+          ${modulegen_modular_command} ${CMAKE_CURRENT_SOURCE_DIR} ${arch}
+          ${prefix}${BLIB_LIBNAME_sub} ${module_src}
+        TIMEOUT 60
+        WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+        OUTPUT_FILE ${module_hdr}
+        ERROR_FILE ${bindings_output_folder}/ns3modulegen.log
+        RESULT_VARIABLE error_code
+      )
+      if(${error_code} OR NOT (EXISTS ${module_hdr}))
+        # Delete broken bindings to make sure we will his this error again if
+        # nothing changed
+        if(EXISTS ${module_src})
+          file(REMOVE ${module_src})
+        endif()
+        if(EXISTS ${module_hdr})
+          file(REMOVE ${module_hdr})
+        endif()
+        message(
+          FATAL_ERROR
+            "Something went wrong during processing of the python bindings of module ${BLIB_LIBNAME}."
+            " Make sure you have the latest version of Pybindgen."
+        )
+      endif()
+    endif()
+
+    # Add core module helper sources
+    set(python_module_files ${module_hdr} ${module_src})
+    file(GLOB custom_python_module_files
+         ${CMAKE_CURRENT_SOURCE_DIR}/bindings/*.cc
+         ${CMAKE_CURRENT_SOURCE_DIR}/bindings/*.h
+    )
+    list(APPEND python_module_files ${custom_python_module_files})
+    set(bindings-name lib${BLIB_LIBNAME}-bindings)
+    add_library(${bindings-name} SHARED "${python_module_files}")
+    target_include_directories(
+      ${bindings-name} PUBLIC ${Python3_INCLUDE_DIRS} ${bindings_output_folder}
+    )
+
+    # If there is any, remove the "lib" prefix of libraries (search for
+    # "set(lib${BLIB_LIBNAME}")
+    list(LENGTH ns_libraries_to_link num_libraries)
+    if(num_libraries GREATER "0")
+      string(REPLACE ";" "-bindings;" bindings_to_link
+                     "${ns_libraries_to_link};"
+      ) # add -bindings suffix to all lib${name}
+    endif()
+    target_link_libraries(
+      ${bindings-name}
+      PUBLIC ${LIB_AS_NEEDED_PRE} ${lib${BLIB_LIBNAME}} "${bindings_to_link}"
+             "${BLIB_LIBRARIES_TO_LINK}" ${LIB_AS_NEEDED_POST}
+      PRIVATE ${Python3_LIBRARIES}
+    )
+    target_include_directories(
+      ${bindings-name} PRIVATE ${PROJECT_SOURCE_DIR}/src/core/bindings
+    )
+
+    set(suffix)
+    if(APPLE)
+      # Python doesn't like Apple's .dylib and will refuse to load bindings
+      # unless its an .so
+      set(suffix SUFFIX .so)
+    endif()
+
+    # Set binding library name and output folder
+    set_target_properties(
+      ${bindings-name}
+      PROPERTIES OUTPUT_NAME ${prefix}${BLIB_LIBNAME_sub}
+                 PREFIX ""
+                 ${suffix} LIBRARY_OUTPUT_DIRECTORY
+                 ${CMAKE_OUTPUT_DIRECTORY}/bindings/python/ns
+    )
+
+    set(ns3-python-bindings-modules
+        "${bindings-name};${ns3-python-bindings-modules}"
+        CACHE INTERNAL "list of modules python bindings"
+    )
+
+    # Make sure all bindings are built before building the visualizer module
+    # that makes use of them
+    if(${ENABLE_VISUALIZER} AND (visualizer IN_LIST libs_to_build))
+      if(NOT (${BLIB_LIBNAME} STREQUAL visualizer))
+        add_dependencies(${libvisualizer} ${bindings-name})
+      endif()
+    endif()
+  endif()
+
+  # Handle package export
+  install(
+    TARGETS ${lib${BLIB_LIBNAME}}
+    EXPORT ns3ExportTargets
+    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}/
+    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}/
+    PUBLIC_HEADER DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/ns3"
+  )
+  if(${NS3_VERBOSE})
+    message(STATUS "Processed ${FOLDER}")
+  endif()
+endfunction()
+
+# cmake-format: off
+#
+# This macro processes a ns-3 module example
+#
+# Arguments:
+# NAME = example name (e.g. command-line-example)
+# LIBNAME = parent library (e.g. core)
+# SOURCE_FILES = "cmake;list;of;.cc;files;"
+# HEADER_FILES = "cmake;list;of;public;.h;files;"
+# LIBRARIES_TO_LINK = "cmake;list;of;${library_names};"
+#
+function(build_lib_example)
+  # Argument parsing
+  set(options IGNORE_PCH)
+  set(oneValueArgs NAME)
+  set(multiValueArgs SOURCE_FILES HEADER_FILES LIBRARIES_TO_LINK)
+  cmake_parse_arguments("BLIB_EXAMPLE" "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
+
+  # Get path src/module or contrib/module
+  string(REPLACE "${PROJECT_SOURCE_DIR}/" "" FOLDER "${CMAKE_CURRENT_SOURCE_DIR}")
+  get_filename_component(FOLDER ${FOLDER} DIRECTORY)
+
+  # cmake-format: on
+  check_for_missing_libraries(
+    missing_dependencies "${BLIB_EXAMPLE_LIBRARIES_TO_LINK}"
+  )
+  if(NOT missing_dependencies)
+    # Create shared library with sources and headers
+    add_executable(
+      "${BLIB_EXAMPLE_NAME}" ${BLIB_EXAMPLE_SOURCE_FILES}
+                             ${BLIB_EXAMPLE_HEADER_FILES}
+    )
+
+    if(${NS3_STATIC})
+      target_link_libraries(
+        ${BLIB_EXAMPLE_NAME} ${LIB_AS_NEEDED_PRE_STATIC} ${lib-ns3-static}
+      )
+    elseif(${NS3_MONOLIB})
+      target_link_libraries(
+        ${BLIB_EXAMPLE_NAME} ${LIB_AS_NEEDED_PRE} ${lib-ns3-monolib}
+        ${LIB_AS_NEEDED_POST}
+      )
+    else()
+      target_link_libraries(
+        ${BLIB_EXAMPLE_NAME} ${LIB_AS_NEEDED_PRE} ${lib${BLIB_EXAMPLE_LIBNAME}}
+        ${BLIB_EXAMPLE_LIBRARIES_TO_LINK} ${optional_visualizer_lib}
+        ${LIB_AS_NEEDED_POST}
+      )
+    endif()
+
+    if(${PRECOMPILE_HEADERS_ENABLED} AND (NOT ${BLIB_EXAMPLE_IGNORE_PCH}))
+      target_precompile_headers(${BLIB_EXAMPLE_NAME} REUSE_FROM stdlib_pch_exec)
+    endif()
+
+    set_runtime_outputdirectory(
+      ${BLIB_EXAMPLE_NAME}
+      ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${FOLDER}/examples/ ""
+    )
+  endif()
+endfunction()
+
+# This macro processes a ns-3 module header file (module_name-module.h)
+#
+# Arguments: name = module name (e.g. core, wifi) HEADER_FILES =
+# "cmake;list;of;public;.h;files;"
+function(write_module_header name header_files)
+  string(TOUPPER "${name}" uppercase_name)
+  string(REPLACE "-" "_" final_name "${uppercase_name}")
+  # Common module_header
+  list(APPEND contents "#ifdef NS3_MODULE_COMPILATION ")
+  list(
+    APPEND
+    contents
+    "
+    error \"Do not include ns3 module aggregator headers from other modules; these are meant only for end user scripts.\" "
+  )
+  list(APPEND contents "
+#endif "
+  )
+  list(APPEND contents "
+#ifndef NS3_MODULE_"
+  )
+  list(APPEND contents ${final_name})
+  list(APPEND contents "
+    // Module headers: "
+  )
+
+  # Write each header listed to the contents variable
+  foreach(header ${header_files})
+    get_filename_component(head ${header} NAME)
+    list(APPEND contents "
+    #include <ns3/${head}>"
+    )
+    # include \"ns3/${head}\"")
+  endforeach()
+
+  # Common module footer
+  list(APPEND contents "
+#endif "
+  )
+  file(WRITE ${CMAKE_HEADER_OUTPUT_DIRECTORY}/${name}-module.h ${contents})
+endfunction()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/build-support/custom-modules/ns3-versioning.cmake ns-3.36/build-support/custom-modules/ns3-versioning.cmake
--- ns-3.35/build-support/custom-modules/ns3-versioning.cmake	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/build-support/custom-modules/ns3-versioning.cmake	2022-04-30 18:23:57.642732600 -0700
@@ -0,0 +1,206 @@
+# Determine if the git repository is an ns-3 repository
+#
+# A repository is considered an ns-3 repository if it has at least one tag that
+# matches the regex ns-3*
+
+function(check_git_repo_has_ns3_tags HAS_TAGS GIT_VERSION_TAG)
+  execute_process(
+    COMMAND ${GIT} describe --tags --abbrev=0 --match ns-3.[0-9]*
+    OUTPUT_VARIABLE GIT_TAG_OUTPUT ERROR_QUIET
+  )
+
+  # Result will be empty in case of a shallow clone or no git repo
+  if(NOT GIT_TAG_OUTPUT)
+    return()
+  endif()
+
+  string(REPLACE "\r" "" GIT_TAG_OUTPUT ${GIT_TAG_OUTPUT}) # remove CR (carriage
+                                                           # return)
+  string(REPLACE "\n" "" GIT_TAG_OUTPUT ${GIT_TAG_OUTPUT}) # remove LF (line
+                                                           # feed)
+
+  # Check if tag exists and return values to the caller
+  string(LENGTH GIT_TAG_OUTPUT GIT_TAG_OUTPUT_LEN)
+  set(${HAS_TAGS} FALSE PARENT_SCOPE)
+  set(${GIT_VERSION_TAG} "" PARENT_SCOPE)
+  if(${GIT_TAG_OUTPUT_LEN} GREATER "0")
+    set(${HAS_TAGS} TRUE PARENT_SCOPE)
+    set(${GIT_VERSION_TAG} ${GIT_TAG_OUTPUT} PARENT_SCOPE)
+  endif()
+endfunction()
+
+# Function to generate version fields from an ns-3 git repository
+function(check_ns3_closest_tags CLOSEST_TAG VERSION_TAG_DISTANCE
+         VERSION_COMMIT_HASH VERSION_DIRTY_FLAG
+)
+  execute_process(
+    COMMAND ${GIT} describe --tags --dirty --long
+    OUTPUT_VARIABLE GIT_TAG_OUTPUT
+  )
+
+  string(REPLACE "\r" "" GIT_TAG_OUTPUT ${GIT_TAG_OUTPUT}) # remove CR (carriage
+                                                           # return)
+  string(REPLACE "\n" "" GIT_TAG_OUTPUT ${GIT_TAG_OUTPUT}) # remove LF (line
+                                                           # feed)
+
+  # Split ns-3.<version>.<patch>(-RC<digit>)-distance-commit(-dirty) into a list
+  # ns;3.<version>.<patch>;(RC<digit);distance;commit(;dirty)
+  string(REPLACE "-" ";" TAG_LIST "${GIT_TAG_OUTPUT}")
+
+  list(GET TAG_LIST 0 NS)
+  list(GET TAG_LIST 1 VERSION)
+
+  if(${GIT_TAG_OUTPUT} MATCHES "RC")
+    list(GET TAG_LIST 2 RC)
+    set(${CLOSEST_TAG} "${NS}-${VERSION}-${RC}" PARENT_SCOPE)
+    list(GET TAG_LIST 3 DISTANCE)
+    list(GET TAG_LIST 4 HASH)
+  else()
+    set(${CLOSEST_TAG} "${NS}-${VERSION}" PARENT_SCOPE)
+    list(GET TAG_LIST 2 DISTANCE)
+    list(GET TAG_LIST 3 HASH)
+  endif()
+
+  set(${VERSION_TAG_DISTANCE} ${DISTANCE} PARENT_SCOPE)
+  set(${VERSION_COMMIT_HASH} "${HASH}" PARENT_SCOPE)
+
+  set(${VERSION_DIRTY_FLAG} 0 PARENT_SCOPE)
+  if(${GIT_TAG_OUTPUT} MATCHES "dirty")
+    set(${VERSION_DIRTY_FLAG} 1 PARENT_SCOPE)
+  endif()
+endfunction()
+
+function(configure_embedded_version)
+  if(NOT ${NS3_ENABLE_BUILD_VERSION})
+    add_custom_target(
+      check-version COMMAND echo Build version feature disabled. Reconfigure
+                            ns-3 with NS3_ENABLE_BUILD_VERSION=ON
+    )
+    return()
+  endif()
+
+  mark_as_advanced(GIT)
+  find_program(GIT git)
+  if("${GIT}" STREQUAL "GIT-NOTFOUND")
+    message(
+      STATUS "Git was not found. Version related targets won't be enabled"
+    )
+    return()
+  endif()
+
+  check_git_repo_has_ns3_tags(HAS_NS3_TAGS NS3_VERSION_TAG)
+
+  set(version_cache_file_template
+      ${PROJECT_SOURCE_DIR}/build-support/version.cache.in
+  )
+  set(version_cache_file ${PROJECT_SOURCE_DIR}/src/core/model/version.cache)
+
+  # Check if ns-3 git tags were found or at least version.cache file exists in
+  # the src/core/model
+  if((NOT HAS_NS3_TAGS) AND (NOT (EXISTS ${version_cache_file})))
+    message(
+      FATAL_ERROR
+        "The ns-3 git commit history or the version.cache file are required to embed build version into libraries."
+    )
+    return()
+  endif()
+
+  # If git tags were found, extract the information
+  if(HAS_NS3_TAGS)
+    check_ns3_closest_tags(
+      NS3_VERSION_CLOSEST_TAG NS3_VERSION_TAG_DISTANCE NS3_VERSION_COMMIT_HASH
+      NS3_VERSION_DIRTY_FLAG
+    )
+    # Split commit tag (ns-3.<minor>[.patch][-RC<digit>]) into
+    # (ns;3.<minor>[.patch];[-RC<digit>]):
+    string(REPLACE "-" ";" NS3_VER_LIST ${NS3_VERSION_TAG})
+    list(LENGTH NS3_VER_LIST NS3_VER_LIST_LEN)
+
+    # Get last version tag fragment (RC<digit>)
+    set(RELEASE_CANDIDATE " ")
+    if(${NS3_VER_LIST_LEN} GREATER 2)
+      list(GET NS3_VER_LIST 2 RELEASE_CANDIDATE)
+    endif()
+
+    # Get 3.<minor>[.patch]
+    list(GET NS3_VER_LIST 1 VERSION_STRING)
+    # Split into a list 3;<minor>[;patch]
+    string(REPLACE "." ";" VERSION_LIST ${VERSION_STRING})
+    list(LENGTH VERSION_LIST VER_LIST_LEN)
+
+    list(GET VERSION_LIST 0 NS3_VERSION_MAJOR)
+    if(${VER_LIST_LEN} GREATER 1)
+      list(GET VERSION_LIST 1 NS3_VERSION_MINOR)
+      if(${VER_LIST_LEN} GREATER 2)
+        list(GET VERSION_LIST 2 NS3_VERSION_PATCH)
+      else()
+        set(NS3_VERSION_PATCH "00")
+      endif()
+    endif()
+
+    # Transform list with 1 entry into strings
+    set(NS3_VERSION_MAJOR "${NS3_VERSION_MAJOR}")
+    set(NS3_VERSION_MINOR "${NS3_VERSION_MINOR}")
+    set(NS3_VERSION_PATCH "${NS3_VERSION_PATCH}")
+    set(NS3_VERSION_TAG "${NS3_VERSION_TAG}")
+    set(NS3_VERSION_RELEASE_CANDIDATE "${RELEASE_CANDIDATE}")
+    if(${NS3_VERSION_RELEASE_CANDIDATE} STREQUAL " ")
+      set(NS3_VERSION_RELEASE_CANDIDATE \"\")
+    endif()
+    set(NS3_VERSION_BUILD_PROFILE ${cmakeBuildType})
+
+    # Create version.cache file
+    configure_file(${version_cache_file_template} ${version_cache_file} @ONLY)
+  else()
+    # Consume version.cache created previously
+    file(STRINGS ${version_cache_file} version_cache_contents)
+    foreach(line ${version_cache_contents})
+      # Remove white spaces e.g. CLOSEST_TAG = '"ns-3.35"' =>
+      # CLOSEST_TAG='"ns-3.35"'
+      string(REPLACE " " "" line "${line}")
+
+      # Transform line into list  CLOSEST_TAG='"ns-3.35"' =>
+      # CLOSEST_TAG;'"ns-3.35"'
+      string(REPLACE "=" ";" line "${line}")
+
+      # Replace single and double quotes used by python
+      string(REPLACE "'" "" line "${line}")
+      string(REPLACE "\"" "" line "${line}")
+
+      # Get key and value
+      list(GET line 0 varname)
+      list(GET line 1 varvalue)
+
+      # If value is empty, replace with an empty string, assume its the release
+      # candidate string
+      if(NOT varvalue)
+        set(varvalue "\"\"")
+      endif()
+
+      # Define version variables with the NS3_ prefix to configure
+      # version-defines.h header
+      set(NS3_${varname} ${varvalue})
+    endforeach()
+    set(NS3_VERSION_CLOSEST_TAG ${NS3_CLOSEST_TAG})
+  endif()
+
+  set(DIRTY)
+  if(${NS3_VERSION_DIRTY_FLAG})
+    set(DIRTY "-dirty")
+  endif()
+
+  # Add check-version target
+  set(version
+      ${NS3_VERSION_TAG}+${NS3_VERSION_TAG_DISTANCE}@${NS3_VERSION_COMMIT_HASH}${DIRTY}-${build_profile}
+  )
+  string(REPLACE "\"" "" version "${version}")
+  add_custom_target(check-version COMMAND echo ns-3 version: ${version})
+
+  # Enable embedding build version
+  add_definitions(-DENABLE_BUILD_VERSION=1)
+  configure_file(
+    build-support/version-defines-template.h
+    ${CMAKE_HEADER_OUTPUT_DIRECTORY}/version-defines.h
+  )
+  set(ENABLE_BUILD_VERSION True PARENT_SCOPE)
+endfunction()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/build-support/empty-main.cc ns-3.36/build-support/empty-main.cc
--- ns-3.35/build-support/empty-main.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/build-support/empty-main.cc	2022-04-30 18:23:57.642732600 -0700
@@ -0,0 +1 @@
+int main(){}
\ No newline at end of file
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/build-support/iwyu-wrapper.sh ns-3.36/build-support/iwyu-wrapper.sh
--- ns-3.35/build-support/iwyu-wrapper.sh	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/build-support/iwyu-wrapper.sh	2022-04-30 18:23:57.642732600 -0700
@@ -0,0 +1,3 @@
+#!/usr/bin/env bash
+echo >>"$1"/iwyu.log include-what-you-use  "${@:2}"
+exec include-what-you-use "${@:2}" 2> >(tee -a "$1"/iwyu.log >&2)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/build-support/macros-and-definitions.cmake ns-3.36/build-support/macros-and-definitions.cmake
--- ns-3.35/build-support/macros-and-definitions.cmake	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/build-support/macros-and-definitions.cmake	2022-04-30 18:23:57.642732600 -0700
@@ -0,0 +1,2115 @@
+# Copyright (c) 2017-2021 Universidade de BrasÃ­lia
+#
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License version 2 as published by the Free
+# Software Foundation;
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
+# details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc., 59 Temple
+# Place, Suite 330, Boston, MA  02111-1307 USA
+#
+# Author: Gabriel Ferreira <gabrielcarvfer@gmail.com>
+
+# Export compile time variable setting the directory to the NS3 root folder
+add_definitions(-DPROJECT_SOURCE_PATH="${PROJECT_SOURCE_DIR}")
+
+# Set INT128 as the default option for INT64X64 and register alternative
+# implementations
+set(NS3_INT64X64 "INT128" CACHE STRING "Int64x64 implementation")
+set_property(CACHE NS3_INT64X64 PROPERTY STRINGS INT128 CAIRO DOUBLE)
+
+# Purposefully hidden options:
+
+# for ease of use, export all libraries and include directories to ns-3 module
+# consumers by default
+option(NS3_REEXPORT_THIRD_PARTY_LIBRARIES "Export all third-party libraries
+and include directories to ns-3 module consumers" ON
+)
+
+# since we can't really do that safely from the CMake side
+option(NS3_ENABLE_SUDO
+       "Set executables ownership to root and enable the SUID flag" OFF
+)
+
+# Replace default CMake messages (logging) with custom colored messages as early
+# as possible
+include(${PROJECT_SOURCE_DIR}/build-support/3rd-party/colored-messages.cmake)
+
+# WSLv1 doesn't support tap features
+if(EXISTS "/proc/version")
+  file(READ "/proc/version" CMAKE_LINUX_DISTRO)
+  string(FIND ${CMAKE_LINUX_DISTRO} "Microsoft" res)
+  if(res EQUAL -1)
+    set(WSLv1 False)
+  else()
+    set(WSLv1 True)
+  endif()
+endif()
+
+# Set Linux flag if on Linux
+if(UNIX AND NOT APPLE)
+  set(LINUX TRUE)
+  add_definitions(-D__LINUX__)
+endif()
+
+if(APPLE)
+  add_definitions(-D__APPLE__)
+endif()
+
+set(cat_command cat)
+
+if(CMAKE_XCODE_BUILD_SYSTEM)
+  set(XCODE True)
+else()
+  set(XCODE False)
+endif()
+
+# Check the number of threads
+include(ProcessorCount)
+ProcessorCount(NumThreads)
+
+# Output folders
+if("${NS3_OUTPUT_DIRECTORY}" STREQUAL "")
+  message(STATUS "Using default output directory ${PROJECT_SOURCE_DIR}/build")
+  set(CMAKE_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/build) # default output
+                                                          # folder
+else()
+  # Check if NS3_OUTPUT_DIRECTORY is a relative path
+  set(absolute_ns3_output_directory "${NS3_OUTPUT_DIRECTORY}")
+  if(NOT IS_ABSOLUTE ${NS3_OUTPUT_DIRECTORY})
+    set(absolute_ns3_output_directory
+        "${PROJECT_SOURCE_DIR}/${NS3_OUTPUT_DIRECTORY}"
+    )
+  endif()
+  if(NOT (EXISTS ${absolute_ns3_output_directory}))
+    message(
+      STATUS
+        "User-defined output directory \"${NS3_OUTPUT_DIRECTORY}\" doesn't exist. Trying to create it"
+    )
+    file(MAKE_DIRECTORY ${absolute_ns3_output_directory})
+    if(NOT (EXISTS ${absolute_ns3_output_directory}))
+      message(
+        FATAL_ERROR
+          "User-defined output directory \"${absolute_ns3_output_directory}\" could not be created. "
+          "Try changing the value of NS3_OUTPUT_DIRECTORY"
+      )
+    endif()
+
+    # If this directory is not inside the ns-3-dev folder, alert users tests may
+    # break
+    if(NOT ("${absolute_ns3_output_directory}" MATCHES "${PROJECT_SOURCE_DIR}"))
+      message(
+        WARNING
+          "User-defined output directory \"${absolute_ns3_output_directory}\" is outside "
+          " of the ns-3 directory ${PROJECT_SOURCE_DIR}, which will break some tests"
+      )
+    endif()
+  endif()
+  message(
+    STATUS
+      "User-defined output directory \"${absolute_ns3_output_directory}\" will be used"
+  )
+  set(CMAKE_OUTPUT_DIRECTORY ${absolute_ns3_output_directory})
+endif()
+set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_OUTPUT_DIRECTORY}/lib)
+set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_OUTPUT_DIRECTORY}/lib)
+set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_OUTPUT_DIRECTORY})
+set(CMAKE_HEADER_OUTPUT_DIRECTORY ${CMAKE_OUTPUT_DIRECTORY}/include/ns3)
+set(THIRD_PARTY_DIRECTORY ${PROJECT_SOURCE_DIR}/3rd-party)
+set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
+
+# Get installation folder default values for each platform and include package
+# configuration macro
+include(GNUInstallDirs)
+include(build-support/custom-modules/ns3-cmake-package.cmake)
+
+if(${XCODE})
+  # Is that so hard not to break people's CI, AAPL? Why would you output the
+  # targets to a Debug/Release subfolder? Why?
+  foreach(OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES})
+    string(TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG)
+    set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG}
+        ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
+    )
+    set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG}
+        ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
+    )
+    set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG}
+        ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}
+    )
+  endforeach()
+endif()
+
+# fPIC (position-independent code) and fPIE (position-independent executable)
+set(CMAKE_POSITION_INDEPENDENT_CODE ON)
+
+# do not create a file-level dependency with shared libraries reducing
+# unnecessary relinking
+set(CMAKE_LINK_DEPENDS_NO_SHARED TRUE)
+
+# Identify compiler and check version
+set(below_minimum_msg "compiler is below the minimum required version")
+set(CLANG FALSE)
+if("${CMAKE_CXX_COMPILER_ID}" MATCHES "AppleClang")
+  if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS ${AppleClang_MinVersion})
+    message(
+      FATAL_ERROR
+        "Apple Clang ${CMAKE_CXX_COMPILER_VERSION} ${below_minimum_msg} ${AppleClang_MinVersion}"
+    )
+  endif()
+  set(CLANG TRUE)
+endif()
+
+if((NOT CLANG) AND ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang"))
+  if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS ${Clang_MinVersion})
+    message(
+      FATAL_ERROR
+        "Clang ${CMAKE_CXX_COMPILER_VERSION} ${below_minimum_msg} ${Clang_MinVersion}"
+    )
+  endif()
+  set(CLANG TRUE)
+endif()
+
+if(CLANG)
+  if(${NS3_COLORED_OUTPUT} OR "$ENV{CLICOLOR}")
+    add_definitions(-fcolor-diagnostics) # colorize clang++ output
+  endif()
+endif()
+
+set(GCC FALSE)
+if("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU")
+  if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS ${GNU_MinVersion})
+    message(
+      FATAL_ERROR
+        "GNU ${CMAKE_CXX_COMPILER_VERSION} ${below_minimum_msg} ${GNU_MinVersion}"
+    )
+  endif()
+  set(GCC TRUE)
+  add_definitions(-fno-semantic-interposition)
+  if(${NS3_COLORED_OUTPUT} OR "$ENV{CLICOLOR}")
+    add_definitions(-fdiagnostics-color=always) # colorize g++ output
+  endif()
+endif()
+unset(below_minimum_msg)
+
+# Set compiler options and get command to force unused function linkage (useful
+# for libraries)
+set(CXX_UNSUPPORTED_STANDARDS 98 11 14)
+set(CMAKE_CXX_STANDARD_MINIMUM 17)
+set(CMAKE_CXX_STANDARD_REQUIRED ON)
+set(LIB_AS_NEEDED_PRE)
+set(LIB_AS_NEEDED_POST)
+if(${GCC} AND NOT APPLE)
+  # using GCC
+  set(LIB_AS_NEEDED_PRE -Wl,--no-as-needed)
+  set(LIB_AS_NEEDED_POST -Wl,--as-needed)
+  set(LIB_AS_NEEDED_PRE_STATIC -Wl,--whole-archive,-Bstatic)
+  set(LIB_AS_NEEDED_POST_STATIC -Wl,--no-whole-archive)
+  set(LIB_AS_NEEDED_POST_STATIC_DYN -Wl,-Bdynamic,--no-whole-archive)
+endif()
+
+if(${CLANG} AND APPLE)
+  # using Clang set(LIB_AS_NEEDED_PRE -all_load)
+  set(LIB_AS_NEEDED_POST)
+endif()
+
+macro(SUBDIRLIST result curdir)
+  file(GLOB children RELATIVE ${curdir} ${curdir}/*)
+  set(dirlist "")
+  foreach(child ${children})
+    if(IS_DIRECTORY ${curdir}/${child})
+      list(APPEND dirlist ${child})
+    endif()
+  endforeach()
+  set(${result} ${dirlist})
+endmacro()
+
+macro(library_target_name libname targetname)
+  set(${targetname} lib${libname})
+endmacro()
+
+macro(clear_global_cached_variables)
+  # clear cache variables
+  unset(build_profile CACHE)
+  unset(build_profile_suffix CACHE)
+  unset(lib-ns3-static-objs CACHE)
+  unset(ns3-contrib-libs CACHE)
+  unset(ns3-example-folders CACHE)
+  unset(ns3-execs CACHE)
+  unset(ns3-execs-py CACHE)
+  unset(ns3-external-libs CACHE)
+  unset(ns3-headers-to-module-map CACHE)
+  unset(ns3-libs CACHE)
+  unset(ns3-libs-tests CACHE)
+  unset(ns3-python-bindings-modules CACHE)
+  mark_as_advanced(
+    build_profile
+    build_profile_suffix
+    lib-ns3-static-objs
+    ns3-contrib-libs
+    ns3-example-folders
+    ns3-execs
+    ns3-execs-py
+    ns3-external-libs
+    ns3-headers-to-module-map
+    ns3-libs
+    ns3-libs-tests
+    ns3-python-bindings-modules
+  )
+endmacro()
+
+# function used to search for package and program dependencies than store list
+# of missing dependencies in the list whose name is stored in missing_deps
+function(check_deps package_deps program_deps missing_deps)
+  set(local_missing_deps)
+  # Search for package dependencies
+  foreach(package ${package_deps})
+    find_package(${package})
+    if(NOT ${${package}_FOUND})
+      list(APPEND local_missing_deps ${package})
+    endif()
+  endforeach()
+
+  # And for program dependencies
+  foreach(program ${program_deps})
+    # CMake likes to cache find_* to speed things up, so we can't reuse names
+    # here or it won't check other dependencies
+    string(TOUPPER ${program} upper_${program})
+    mark_as_advanced(${upper_${program}})
+    find_program(${upper_${program}} ${program})
+    if("${${upper_${program}}}" STREQUAL "${upper_${program}}-NOTFOUND")
+      list(APPEND local_missing_deps ${program})
+    endif()
+  endforeach()
+
+  # Store list of missing dependencies in the parent scope
+  set(${missing_deps} ${local_missing_deps} PARENT_SCOPE)
+endfunction()
+
+# process all options passed in main cmakeLists
+macro(process_options)
+  clear_global_cached_variables()
+
+  # check if the include directory exists in the output directory
+  if((EXISTS ${CMAKE_OUTPUT_DIRECTORY}) AND (EXISTS
+                                             ${CMAKE_OUTPUT_DIRECTORY}/include)
+  )
+    # if it does, delete it to make sure we only have relevant header stubs
+    if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.17.0")
+      set(delete_directory_cmd rm -R) # introduced in CMake 3.17
+    else()
+      set(delete_directory_cmd remove_directory) # deprecated in CMake 3.17
+    endif()
+    execute_process(
+      COMMAND ${CMAKE_COMMAND} -E ${delete_directory_cmd}
+              ${CMAKE_OUTPUT_DIRECTORY}/include
+    )
+  endif()
+
+  # make sure to default to RelWithDebInfo if no build type is specified
+  if(NOT CMAKE_BUILD_TYPE)
+    set(CMAKE_BUILD_TYPE "default" CACHE STRING "Choose the type of build."
+                                         FORCE
+    )
+    set(NS3_ASSERT ON CACHE BOOL "Enable assert on failure" FORCE)
+    set(NS3_LOG ON CACHE BOOL "Enable logging to be built" FORCE)
+    set(NS3_WARNINGS_AS_ERRORS OFF
+        CACHE BOOL "Treat warnings as errors. Requires NS3_WARNINGS=ON" FORCE
+    )
+  endif()
+
+  # process debug switch Used in build-profile-test-suite
+  string(TOLOWER ${CMAKE_BUILD_TYPE} cmakeBuildType)
+  set(build_profile "${cmakeBuildType}" CACHE INTERNAL "")
+  if(${cmakeBuildType} STREQUAL "debug")
+    string(REPLACE "-g" "-Og -g" CMAKE_CXX_FLAGS_DEBUG
+                   "${CMAKE_CXX_FLAGS_DEBUG}"
+    )
+    add_definitions(-DNS3_BUILD_PROFILE_DEBUG)
+  elseif(${cmakeBuildType} STREQUAL "relwithdebinfo" OR ${cmakeBuildType}
+                                                        STREQUAL "default"
+  )
+    set(cmakeBuildType relwithdebinfo)
+    set(CMAKE_CXX_FLAGS_DEFAULT ${CMAKE_CXX_FLAGS_RELWITHDEBINFO})
+    add_definitions(-DNS3_BUILD_PROFILE_DEBUG)
+  elseif(${cmakeBuildType} STREQUAL "release")
+    if(${NS3_NATIVE_OPTIMIZATIONS})
+      add_definitions(-DNS3_BUILD_PROFILE_OPTIMIZED)
+      set(build_profile "optimized" CACHE INTERNAL "")
+    else()
+      add_definitions(-DNS3_BUILD_PROFILE_RELEASE)
+    endif()
+  else()
+    add_definitions(-DNS3_BUILD_PROFILE_RELEASE)
+  endif()
+
+  # Enable examples if activated via command line (NS3_EXAMPLES) or ns3rc config
+  # file
+  set(ENABLE_EXAMPLES OFF)
+  if(${NS3_EXAMPLES} OR ${ns3rc_examples_enabled})
+    set(ENABLE_EXAMPLES ON)
+  endif()
+
+  # Enable examples if activated via command line (NS3_TESTS) or ns3rc config
+  # file
+  set(ENABLE_TESTS OFF)
+  if(${NS3_TESTS} OR ${ns3rc_tests_enabled})
+    set(ENABLE_TESTS ON)
+    enable_testing()
+  endif()
+
+  set(profiles_without_suffixes release)
+  set(build_profile_suffix "" CACHE INTERNAL "")
+  if(NOT (${build_profile} IN_LIST profiles_without_suffixes))
+    set(build_profile_suffix -${build_profile} CACHE INTERNAL "")
+  endif()
+
+  # Set warning level and warning as errors
+  if(${NS3_WARNINGS})
+    if(MSVC)
+      add_compile_options(/W3) # /W4 = -Wall + -Wextra
+      if(${NS3_WARNINGS_AS_ERRORS})
+        add_compile_options(/WX)
+      endif()
+    else()
+      add_compile_options(-Wall) # -Wextra
+      if(${NS3_WARNINGS_AS_ERRORS})
+        add_compile_options(-Werror -Wno-error=deprecated-declarations)
+      endif()
+    endif()
+  endif()
+
+  include(build-support/custom-modules/ns3-versioning.cmake)
+  set(ENABLE_BUILD_VERSION False)
+  configure_embedded_version()
+
+  if(${NS3_CLANG_FORMAT})
+    find_program(CLANG_FORMAT clang-format)
+    if("${CLANG_FORMAT}" STREQUAL "CLANG_FORMAT-NOTFOUND")
+      message(${HIGHLIGHTED_STATUS} "Proceeding without clang-format")
+    else()
+      file(
+        GLOB_RECURSE
+        ALL_CXX_SOURCE_FILES
+        src/*.cc
+        src/*.h
+        examples/*.cc
+        examples/*.h
+        utils/*.cc
+        utils/*.h
+        scratch/*.cc
+        scratch/*.h
+      )
+      add_custom_target(
+        clang-format COMMAND clang-format -style=file -i
+                             ${ALL_CXX_SOURCE_FILES}
+      )
+      unset(ALL_CXX_SOURCE_FILES)
+    endif()
+  endif()
+
+  if(${NS3_CLANG_TIDY})
+    find_program(CLANG_TIDY clang-tidy)
+    if("${CLANG_TIDY}" STREQUAL "CLANG_TIDY-NOTFOUND")
+      message(${HIGHLIGHTED_STATUS}
+              "Proceeding without clang-tidy static analysis"
+      )
+    else()
+      set(CMAKE_CXX_CLANG_TIDY "clang-tidy")
+    endif()
+  endif()
+
+  if(${NS3_CLANG_TIMETRACE})
+    if(${CLANG})
+      # Fetch and build clang build analyzer
+      include(ExternalProject)
+      ExternalProject_Add(
+        ClangBuildAnalyzer
+        GIT_REPOSITORY "https://github.com/aras-p/ClangBuildAnalyzer.git"
+        GIT_TAG "47406981a1c5a89e8f8c62802b924c3e163e7cb4"
+        INSTALL_COMMAND cmake -E copy_if_different ClangBuildAnalyzer
+                        ${PROJECT_BINARY_DIR}
+      )
+
+      # Add compiler flag and create target to do everything automatically
+      add_definitions(-ftime-trace)
+      add_custom_target(
+        timeTraceReport
+        COMMAND
+          ${PROJECT_BINARY_DIR}/ClangBuildAnalyzer --all ${PROJECT_BINARY_DIR}
+          ${PROJECT_BINARY_DIR}/clangBuildAnalyzerReport.bin
+        COMMAND
+          ${PROJECT_BINARY_DIR}/ClangBuildAnalyzer --analyze
+          ${PROJECT_BINARY_DIR}/clangBuildAnalyzerReport.bin >
+          ${PROJECT_SOURCE_DIR}/ClangBuildAnalyzerReport.txt
+        DEPENDS ClangBuildAnalyzer
+      )
+    else()
+      message(
+        FATAL_ERROR
+          "TimeTrace is a Clang feature, but you're using a different compiler."
+      )
+    endif()
+  endif()
+
+  mark_as_advanced(CMAKE_FORMAT_PROGRAM)
+  find_program(CMAKE_FORMAT_PROGRAM cmake-format HINTS ~/.local/bin)
+  if("${CMAKE_FORMAT_PROGRAM}" STREQUAL "CMAKE_FORMAT_PROGRAM-NOTFOUND")
+    message(${HIGHLIGHTED_STATUS} "Proceeding without cmake-format")
+  else()
+    file(GLOB_RECURSE MODULES_CMAKE_FILES src/**/CMakeLists.txt
+         contrib/**/CMakeLists.txt examples/**/CMakeLists.txt
+    )
+    file(
+      GLOB
+      INTERNAL_CMAKE_FILES
+      CMakeLists.txt
+      utils/**/CMakeLists.txt
+      src/CMakeLists.txt
+      build-support/**/*.cmake
+      build-support/*.cmake
+    )
+    add_custom_target(
+      cmake-format
+      COMMAND
+        ${CMAKE_FORMAT_PROGRAM} -c
+        ${PROJECT_SOURCE_DIR}/build-support/cmake-format.txt -i
+        ${INTERNAL_CMAKE_FILES}
+      COMMAND
+        ${CMAKE_FORMAT_PROGRAM} -c
+        ${PROJECT_SOURCE_DIR}/build-support/cmake-format-modules.txt -i
+        ${MODULES_CMAKE_FILES}
+    )
+    unset(MODULES_CMAKE_FILES)
+    unset(INTERNAL_CMAKE_FILES)
+  endif()
+
+  # If the user has not set a CXX standard version, assume the minimum
+  if(NOT "${CMAKE_CXX_STANDARD}")
+    set(CMAKE_CXX_STANDARD ${CMAKE_CXX_STANDARD_MINIMUM})
+  endif()
+
+  # Search standard provided by the user in the unsupported standards list
+  list(FIND CXX_UNSUPPORTED_STANDARDS ${CMAKE_CXX_STANDARD} unsupported)
+  if(${unsupported} GREATER -1)
+    message(
+      FATAL_ERROR
+        "You're trying to use the unsupported C++ ${CMAKE_CXX_STANDARD}.\n"
+        "Try -DCMAKE_CXX_STANDARD=${CMAKE_CXX_STANDARD_MINIMUM}."
+    )
+  endif()
+
+  if(${NS3_DES_METRICS})
+    add_definitions(-DENABLE_DES_METRICS)
+  endif()
+
+  if(${NS3_SANITIZE} AND ${NS3_SANITIZE_MEMORY})
+    message(
+      FATAL_ERROR
+        "The memory sanitizer can't be used with other sanitizers. Disable one of them."
+    )
+  endif()
+
+  if(${NS3_SANITIZE})
+    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address,leak,undefined")
+  endif()
+
+  if(${NS3_SANITIZE_MEMORY})
+    if(${CLANG})
+      set(blacklistfile ${PROJECT_SOURCE_DIR}/memory-sanitizer-blacklist.txt)
+      if(EXISTS ${blacklistfile})
+        set(CMAKE_CXX_FLAGS
+            "${CMAKE_CXX_FLAGS} -fsanitize=memory -fsanitize-blacklist=${blacklistfile}"
+        )
+      else()
+        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=memory")
+      endif()
+
+      if(NOT ($ENV{MSAN_OPTIONS} MATCHES "strict_memcmp=0"))
+        message(
+          WARNING
+            "Please export MSAN_OPTIONS=strict_memcmp=0 "
+            "and call the generated buildsystem directly to proceed.\n"
+            "Trying to build with cmake or IDEs will probably fail since"
+            "CMake can't export environment variables to its parent process."
+        )
+      endif()
+      unset(blacklistfile)
+    else()
+      message(FATAL_ERROR "The memory sanitizer is only supported by Clang")
+    endif()
+  endif()
+
+  set(ENABLE_SQLITE False)
+  if(${NS3_SQLITE})
+    # find_package(SQLite3 QUIET) # unsupported in CMake 3.10 We emulate the
+    # behavior of find_package below
+    find_external_library(
+      DEPENDENCY_NAME SQLite3 HEADER_NAME sqlite3.h LIBRARY_NAME sqlite3
+    )
+
+    if(${SQLite3_FOUND})
+      set(ENABLE_SQLITE True)
+    else()
+      message(${HIGHLIGHTED_STATUS} "SQLite was not found")
+    endif()
+  endif()
+
+  if(${NS3_NATIVE_OPTIMIZATIONS} AND ${GCC})
+    add_compile_options(-march=native -mtune=native)
+  endif()
+
+  if(${NS3_LINK_TIME_OPTIMIZATION})
+    # Link-time optimization (LTO) if available
+    include(CheckIPOSupported)
+    check_ipo_supported(RESULT LTO_AVAILABLE OUTPUT output)
+    if(LTO_AVAILABLE)
+      set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)
+      message(STATUS "Link-time optimization (LTO) is supported.")
+    else()
+      message(
+        STATUS "Link-time optimization (LTO) is not supported: ${output}."
+      )
+    endif()
+  endif()
+
+  if(${NS3_LINK_WHAT_YOU_USE})
+    set(CMAKE_LINK_WHAT_YOU_USE TRUE)
+  else()
+    set(CMAKE_LINK_WHAT_YOU_USE FALSE)
+  endif()
+
+  if(${NS3_INCLUDE_WHAT_YOU_USE})
+    # Before using, install iwyu, run "strings /usr/bin/iwyu | grep LLVM" to
+    # find the appropriate clang version and install it. If you don't do that,
+    # it will fail. Worse than that: it will fail silently. We use the wrapper
+    # to get a iwyu.log file in the ns-3-dev folder.
+    find_program(INCLUDE_WHAT_YOU_USE_PROG iwyu)
+    if("${INCLUDE_WHAT_YOU_USE_PROG}" STREQUAL
+       "INCLUDE_WHAT_YOU_USE_PROG-NOTFOUND"
+    )
+      message(FATAL_ERROR "iwyu (include-what-you-use) was not found.")
+    endif()
+    message(STATUS "iwyu is enabled")
+    set(CMAKE_CXX_INCLUDE_WHAT_YOU_USE
+        ${PROJECT_SOURCE_DIR}/build-support/iwyu-wrapper.sh;${PROJECT_SOURCE_DIR}
+    )
+  else()
+    unset(CMAKE_CXX_INCLUDE_WHAT_YOU_USE)
+  endif()
+
+  if(${XCODE})
+    if(${NS3_STATIC} OR ${NS3_MONOLIB})
+      message(
+        FATAL_ERROR
+          "Xcode doesn't play nicely with CMake object libraries,"
+          "and those are used for NS3_STATIC and NS3_MONOLIB.\n"
+          "Disable them or try a different generator"
+      )
+    endif()
+    set(CMAKE_XCODE_GENERATE_TOP_LEVEL_PROJECT_ONLY ON)
+    set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_REQUIRED NO)
+    set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "")
+  else()
+    unset(CMAKE_XCODE_GENERATE_TOP_LEVEL_PROJECT_ONLY)
+    unset(CMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_REQUIRED)
+    unset(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY)
+  endif()
+
+  # Set common include folder (./build/include, where we find ns3/core-module.h)
+  include_directories(${CMAKE_OUTPUT_DIRECTORY}/include)
+
+  # find required dependencies
+  list(APPEND CMAKE_MODULE_PATH
+       "${PROJECT_SOURCE_DIR}/build-support/custom-modules"
+  )
+  list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/build-support/3rd-party")
+
+  # GTK3 Don't search for it if you don't have it installed, as it take an
+  # insane amount of time
+  if(${NS3_GTK3})
+    find_package(HarfBuzz QUIET)
+    if(NOT ${HarfBuzz_FOUND})
+      message(${HIGHLIGHTED_STATUS}
+              "Harfbuzz is required by GTK3 and was not found."
+      )
+    else()
+      set(CMAKE_SUPPRESS_DEVELOPER_WARNINGS 1 CACHE BOOL "")
+      find_package(GTK3 QUIET)
+      unset(CMAKE_SUPPRESS_DEVELOPER_WARNINGS CACHE)
+      if(NOT ${GTK3_FOUND})
+        message(${HIGHLIGHTED_STATUS}
+                "GTK3 was not found. Continuing without it."
+        )
+      else()
+        if(${GTK3_VERSION} VERSION_LESS 3.22)
+          set(GTK3_FOUND FALSE)
+          message(${HIGHLIGHTED_STATUS}
+                  "GTK3 found with incompatible version ${GTK3_VERSION}"
+          )
+        else()
+          message(STATUS "GTK3 was found.")
+        endif()
+      endif()
+
+    endif()
+  endif()
+
+  if(${NS3_STATIC})
+    # Warn users that they may be using shared libraries, which won't produce a
+    # standalone static library
+    set(ENABLE_REALTIME FALSE)
+    set(HAVE_RT FALSE)
+    message(
+      WARNING "Statically linking 3rd party libraries have not been tested.\n"
+              "Disable Brite, Click, Gtk, GSL, Mpi, Openflow and SQLite"
+              " if you want a standalone static ns-3 library."
+    )
+  else()
+    find_package(LibXml2 QUIET)
+    if(NOT ${LIBXML2_FOUND})
+      message(${HIGHLIGHTED_STATUS}
+              "LibXML2 was not found. Continuing without it."
+      )
+    else()
+      message(STATUS "LibXML2 was found.")
+      add_definitions(-DHAVE_LIBXML2)
+    endif()
+
+    # LibRT
+    mark_as_advanced(LIBRT)
+    set(ENABLE_REALTIME FALSE)
+    if(${NS3_REALTIME})
+      if(APPLE)
+        message(
+          STATUS "Lib RT is not supported on Mac OS X. Continuing without it."
+        )
+      else()
+        find_library(LIBRT rt QUIET)
+        if(NOT ${LIBRT_FOUND})
+          message(FATAL_ERROR "LibRT was not found.")
+        else()
+          message(STATUS "LibRT was found.")
+          set(ENABLE_REALTIME TRUE)
+          set(HAVE_RT TRUE) # for core-config.h
+        endif()
+      endif()
+    endif()
+  endif()
+
+  set(THREADS_PREFER_PTHREAD_FLAG)
+  find_package(Threads QUIET)
+  if(${CMAKE_USE_PTHREADS_INIT})
+    include_directories(${THREADS_PTHREADS_INCLUDE_DIR})
+    set(HAVE_PTHREAD_H TRUE) # for core-config.h
+    set(THREADS_ENABLED TRUE)
+    set(THREADS_FOUND TRUE)
+  else()
+    message(FATAL_ERROR Pthreads are required by ns-3)
+  endif()
+
+  set(Python3_LIBRARIES)
+  set(Python3_EXECUTABLE)
+  set(Python3_FOUND FALSE)
+  set(Python3_INCLUDE_DIRS)
+  if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.12.0")
+    find_package(Python3 COMPONENTS Interpreter Development)
+  else()
+    # cmake-format: off
+    set(Python_ADDITIONAL_VERSIONS 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9)
+    # cmake-format: on
+    find_package(PythonInterp)
+    find_package(PythonLibs)
+
+    # Move deprecated results into the FindPython3 resulting variables
+    set(Python3_Interpreter_FOUND ${PYTHONINTERP_FOUND})
+    set(Python3_Development_FOUND ${PYTHONLIBS_FOUND})
+    if(${PYTHONINTERP_FOUND})
+      set(Python3_EXECUTABLE ${PYTHON_EXECUTABLE})
+      set(Python3_FOUND TRUE)
+    endif()
+    if(${PYTHONLIBS_FOUND})
+      set(Python3_LIBRARIES ${PYTHON_LIBRARIES})
+      set(Python3_INCLUDE_DIRS ${PYTHON_INCLUDE_DIRS})
+    endif()
+  endif()
+
+  # Check if both Python interpreter and development libraries were found
+  if(${Python3_Interpreter_FOUND})
+    if(${Python3_Development_FOUND})
+      set(Python3_FOUND TRUE)
+      if(APPLE)
+        # Apple is very weird and there could be a lot of conflicting python
+        # versions which can generate conflicting rpaths preventing the python
+        # bindings from working
+
+        # To work around, we extract the /path/to/Frameworks from the library
+        # path
+        list(GET Python3_LIBRARIES 0 pylib)
+        string(REGEX REPLACE "(.*Frameworks)/Python(3.|.)framework.*" "\\1"
+                             DEVELOPER_DIR ${pylib}
+        )
+        if("${DEVELOPER_DIR}" MATCHES "Frameworks")
+          set(CMAKE_BUILD_RPATH "${DEVELOPER_DIR}" CACHE STRING "")
+          set(CMAKE_INSTALL_RPATH "${DEVELOPER_DIR}" CACHE STRING "")
+        endif()
+      endif()
+    else()
+      message(${HIGHLIGHTED_STATUS}
+              "Python: development libraries were not found"
+      )
+    endif()
+  else()
+    message(
+      ${HIGHLIGHTED_STATUS}
+      "Python: an incompatible version of Python was found, python bindings will be disabled"
+    )
+  endif()
+
+  set(ENABLE_PYTHON_BINDINGS OFF)
+  if(${NS3_PYTHON_BINDINGS})
+    if(NOT ${Python3_FOUND})
+      message(
+        FATAL_ERROR
+          "Bindings: python bindings require Python, but it could not be found"
+      )
+    else()
+      check_python_packages("pybindgen" missing_packages)
+      if(missing_packages)
+        message(
+          FATAL_ERROR
+            "Bindings: python bindings disabled due to the following missing dependencies: ${missing_packages}"
+        )
+      else()
+        set(ENABLE_PYTHON_BINDINGS ON)
+
+        set(destination_dir ${CMAKE_OUTPUT_DIRECTORY}/bindings/python/ns)
+        configure_file(
+          bindings/python/ns__init__.py ${destination_dir}/__init__.py COPYONLY
+        )
+      endif()
+    endif()
+  endif()
+
+  # Disable the below warning from bindings built in debug mode with clang++:
+  # "expression with side effects will be evaluated despite being used as an operand to 'typeid'"
+  if(${ENABLE_PYTHON_BINDINGS} AND ${CLANG})
+    add_compile_options(-Wno-potentially-evaluated-expression)
+  endif()
+
+  set(ENABLE_SCAN_PYTHON_BINDINGS OFF)
+  if(${NS3_SCAN_PYTHON_BINDINGS})
+    if(NOT ${Python3_FOUND})
+      message(
+        FATAL_ERROR
+          "Bindings: scanning python bindings require Python, but it could not be found"
+      )
+    else()
+      # Check if pybindgen, pygccxml, cxxfilt and castxml are installed
+      check_python_packages(
+        "pybindgen;pygccxml;cxxfilt;castxml" missing_packages
+      )
+
+      # If castxml has not been found via python import, fallback to searching
+      # the binary
+      if(castxml IN_LIST missing_packages)
+        mark_as_advanced(CASTXML)
+        find_program(CASTXML castxml)
+        if(NOT ("${CASTXML}" STREQUAL "CASTXML-NOTFOUND"))
+          list(REMOVE_ITEM missing_packages castxml)
+        endif()
+      endif()
+
+      # If packages were not found, print message
+      if(missing_packages)
+        message(
+          FATAL_ERROR
+            "Bindings: scanning of python bindings disabled due to the following missing dependencies: ${missing_packages}"
+        )
+      else()
+        set(ENABLE_SCAN_PYTHON_BINDINGS ON)
+        # empty scan target that will depend on other module scan targets to
+        # scan all of them
+        add_custom_target(apiscan-all)
+      endif()
+    endif()
+  endif()
+
+  set(ENABLE_VISUALIZER FALSE)
+  if(${NS3_VISUALIZER})
+    if((NOT ${ENABLE_PYTHON_BINDINGS}) OR (NOT ${Python3_FOUND}))
+      message(${HIGHLIGHTED_STATUS} "Visualizer requires Python bindings")
+    else()
+      set(ENABLE_VISUALIZER TRUE)
+    endif()
+  endif()
+
+  if(${NS3_COVERAGE} AND (NOT ${ENABLE_TESTS} OR NOT ${ENABLE_EXAMPLES}))
+    message(
+      FATAL_ERROR
+        "Code coverage requires examples and tests.\nTry reconfiguring CMake with -DNS3_TESTS=ON -DNS3_EXAMPLES=ON"
+    )
+  endif()
+
+  if(${ENABLE_TESTS})
+    add_custom_target(all-test-targets)
+
+    # Create a custom target to run test.py --no-build Target is also used to
+    # produce code coverage output
+    add_custom_target(
+      run_test_py
+      COMMAND ${Python3_EXECUTABLE} test.py --no-build
+      WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
+      DEPENDS all-test-targets
+    )
+    if(${ENABLE_EXAMPLES})
+      include(build-support/custom-modules/ns3-coverage.cmake)
+    endif()
+  endif()
+
+  # Process config-store-config
+  configure_file(
+    build-support/config-store-config-template.h
+    ${CMAKE_HEADER_OUTPUT_DIRECTORY}/config-store-config.h
+  )
+
+  set(ENABLE_MPI FALSE)
+  if(${NS3_MPI})
+    find_package(MPI QUIET)
+    if(NOT ${MPI_FOUND})
+      message(FATAL_ERROR "MPI was not found.")
+    else()
+      message(STATUS "MPI was found.")
+      add_definitions(-DNS3_MPI)
+      set(ENABLE_MPI TRUE)
+    endif()
+  endif()
+
+  if(${NS3_VERBOSE})
+    set_property(GLOBAL PROPERTY TARGET_MESSAGES TRUE)
+    set(CMAKE_FIND_DEBUG_MODE TRUE)
+    set(CMAKE_VERBOSE_MAKEFILE TRUE CACHE INTERNAL "")
+  else()
+    set_property(GLOBAL PROPERTY TARGET_MESSAGES OFF)
+    unset(CMAKE_FIND_DEBUG_MODE)
+    unset(CMAKE_VERBOSE_MAKEFILE CACHE)
+  endif()
+
+  mark_as_advanced(Boost_INCLUDE_DIR)
+  find_package(Boost)
+  if(${Boost_FOUND})
+    include_directories(${Boost_INCLUDE_DIRS})
+    set(CMAKE_REQUIRED_INCLUDES ${Boost_INCLUDE_DIRS})
+  endif()
+
+  if(${NS3_GSL})
+    find_package(GSL QUIET)
+    if(NOT ${GSL_FOUND})
+      message(${HIGHLIGHTED_STATUS} "GSL was not found. Continuing without it.")
+    else()
+      message(STATUS "GSL was found.")
+      add_definitions(-DHAVE_GSL)
+    endif()
+  endif()
+
+  if(${NS3_GNUPLOT})
+    find_package(Gnuplot-ios) # Not sure what package would contain the correct
+                              # header/library
+    if(NOT ${GNUPLOT_FOUND})
+      message(${HIGHLIGHTED_STATUS}
+              "GNUPLOT was not found. Continuing without it."
+      )
+    else()
+      message(STATUS "GNUPLOT was found.")
+      include_directories(${GNUPLOT_INCLUDE_DIRS})
+      link_directories(${GNUPLOT_LIBRARY})
+    endif()
+  endif()
+
+  # checking for documentation dependencies and creating targets
+
+  # First we check for doxygen dependencies
+  mark_as_advanced(DOXYGEN)
+  check_deps("" "doxygen;dot;dia" doxygen_docs_missing_deps)
+  if(doxygen_docs_missing_deps)
+    message(
+      ${HIGHLIGHTED_STATUS}
+      "docs: doxygen documentation not enabled due to missing dependencies: ${doxygen_docs_missing_deps}"
+    )
+    # cmake-format: off
+    set(doxygen_missing_msg
+        echo The following Doxygen dependencies are missing: ${doxygen_docs_missing_deps}.
+            Reconfigure the project after installing them.
+    )
+    # cmake-format: on
+
+    # Create stub targets to inform users about missing dependencies
+    add_custom_target(
+      run-print-introspected-doxygen COMMAND ${doxygen_missing_msg}
+    )
+    add_custom_target(
+      run-introspected-command-line COMMAND ${doxygen_missing_msg}
+    )
+    add_custom_target(
+      assemble-introspected-command-line COMMAND ${doxygen_missing_msg}
+    )
+    add_custom_target(update_doxygen_version COMMAND ${doxygen_missing_msg})
+    add_custom_target(doxygen COMMAND ${doxygen_missing_msg})
+    add_custom_target(doxygen-no-build COMMAND ${doxygen_missing_msg})
+  else()
+    # We checked this already exists, but we need the path to the executable
+    find_package(Doxygen QUIET)
+
+    # Get introspected doxygen
+    add_custom_target(
+      run-print-introspected-doxygen
+      COMMAND
+        ${CMAKE_OUTPUT_DIRECTORY}/utils/ns${NS3_VER}-print-introspected-doxygen${build_profile_suffix}
+        > ${PROJECT_SOURCE_DIR}/doc/introspected-doxygen.h
+      COMMAND
+        ${CMAKE_OUTPUT_DIRECTORY}/utils/ns${NS3_VER}-print-introspected-doxygen${build_profile_suffix}
+        --output-text > ${PROJECT_SOURCE_DIR}/doc/ns3-object.txt
+      DEPENDS print-introspected-doxygen
+    )
+    add_custom_target(
+      run-introspected-command-line
+      COMMAND ${CMAKE_COMMAND} -E env NS_COMMANDLINE_INTROSPECTION=..
+              ${Python3_EXECUTABLE} ./test.py --no-build --constrain=example
+      WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
+      DEPENDS all-test-targets # all-test-targets only exists if ENABLE_TESTS is
+                               # set to ON
+    )
+
+    file(
+      WRITE ${PROJECT_SOURCE_DIR}/doc/introspected-command-line.h
+      "/* This file is automatically generated by
+  CommandLine::PrintDoxygenUsage() from the CommandLine configuration
+  in various example programs.  Do not edit this file!  Edit the
+  CommandLine configuration in those files instead.
+  */
+  \n"
+    )
+    add_custom_target(
+      assemble-introspected-command-line
+      # works on CMake 3.18 or newer > COMMAND ${CMAKE_COMMAND} -E cat
+      # ${PROJECT_SOURCE_DIR}/testpy-output/*.command-line >
+      # ${PROJECT_SOURCE_DIR}/doc/introspected-command-line.h
+      COMMAND ${cat_command} ${PROJECT_SOURCE_DIR}/testpy-output/*.command-line
+              > ${PROJECT_SOURCE_DIR}/doc/introspected-command-line.h 2> NULL
+      DEPENDS run-introspected-command-line
+    )
+
+    add_custom_target(
+      update_doxygen_version
+      COMMAND ${PROJECT_SOURCE_DIR}/doc/ns3_html_theme/get_version.sh
+      WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
+    )
+
+    add_custom_target(
+      doxygen
+      COMMAND ${DOXYGEN_EXECUTABLE} ${PROJECT_SOURCE_DIR}/doc/doxygen.conf
+      WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
+      DEPENDS update_doxygen_version run-print-introspected-doxygen
+              assemble-introspected-command-line
+      USES_TERMINAL
+    )
+
+    add_custom_target(
+      doxygen-no-build
+      COMMAND ${DOXYGEN_EXECUTABLE} ${PROJECT_SOURCE_DIR}/doc/doxygen.conf
+      WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
+      DEPENDS update_doxygen_version
+      USES_TERMINAL
+    )
+  endif()
+
+  # Now we check for sphinx dependencies
+  mark_as_advanced(
+    SPHINX_EXECUTABLE SPHINX_OUTPUT_HTML SPHINX_OUTPUT_MAN
+    SPHINX_WARNINGS_AS_ERRORS
+  )
+
+  # Check deps accepts a list of packages, list of programs and name of the
+  # return variable
+  check_deps(
+    "Sphinx" "epstopdf;pdflatex;latexmk;convert;dvipng"
+    sphinx_docs_missing_deps
+  )
+  if(sphinx_docs_missing_deps)
+    message(
+      ${HIGHLIGHTED_STATUS}
+      "docs: sphinx documentation not enabled due to missing dependencies: ${sphinx_docs_missing_deps}"
+    )
+    # cmake-format: off
+    set(sphinx_missing_msg
+        echo The following Sphinx dependencies are missing: ${sphinx_docs_missing_deps}.
+            Reconfigure the project after installing them.
+    )
+    # cmake-format: on
+
+    # Create stub targets to inform users about missing dependencies
+    add_custom_target(sphinx COMMAND ${sphinx_missing_msg})
+    add_custom_target(sphinx_manual COMMAND ${sphinx_missing_msg})
+    add_custom_target(sphinx_models COMMAND ${sphinx_missing_msg})
+    add_custom_target(sphinx_tutorial COMMAND ${sphinx_missing_msg})
+    add_custom_target(sphinx_contributing COMMAND ${sphinx_missing_msg})
+  else()
+    add_custom_target(sphinx COMMENT "Building sphinx documents")
+
+    function(sphinx_target targetname)
+      # cmake-format: off
+      add_custom_target(
+        sphinx_${targetname}
+        COMMAND make SPHINXOPTS=-N -k html singlehtml latexpdf
+        WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/doc/${targetname}
+      )
+      # cmake-format: on
+      add_dependencies(sphinx sphinx_${targetname})
+    endfunction()
+    sphinx_target(manual)
+    sphinx_target(models)
+    sphinx_target(tutorial)
+    sphinx_target(contributing)
+  endif()
+  # end of checking for documentation dependencies and creating targets
+
+  # Adding this module manually is required by CMake 3.10
+  include(CheckCXXSourceCompiles)
+
+  # Process core-config If INT128 is not found, fallback to CAIRO
+  if(${NS3_INT64X64} MATCHES "INT128")
+    check_cxx_source_compiles(
+      "#include <stdint.h>
+       int main(int argc, char **argv)
+         {
+            (void)argc; (void)argv;
+            if ((uint128_t *) 0) return 0;
+            if (sizeof (uint128_t)) return 0;
+            return 1;
+         }"
+      HAVE_UINT128_T
+    )
+    check_cxx_source_compiles(
+      "#include <stdint.h>
+       int main(int argc, char **argv)
+         {
+           (void)argc; (void)argv;
+           if ((__uint128_t *) 0) return 0;
+           if (sizeof (__uint128_t)) return 0;
+           return 1;
+        }"
+      HAVE___UINT128_T
+    )
+    if(HAVE_UINT128_T OR HAVE___UINT128_T)
+      set(INT64X64_USE_128 TRUE)
+    else()
+      message(${HIGHLIGHTED_STATUS}
+              "Int128 was not found. Falling back to Cairo."
+      )
+      set(NS3_INT64X64 "CAIRO")
+    endif()
+  endif()
+
+  # If long double and double have different sizes, fallback to CAIRO
+  if(${NS3_INT64X64} MATCHES "DOUBLE")
+    # WSLv1 has a long double issue that will result in a few tests failing
+    # https://github.com/microsoft/WSL/issues/830
+    include(CheckTypeSize)
+    check_type_size("double" SIZEOF_DOUBLE)
+    check_type_size("long double" SIZEOF_LONG_DOUBLE)
+
+    if(${SIZEOF_LONG_DOUBLE} EQUAL ${SIZEOF_DOUBLE})
+      message(
+        STATUS
+          "Long double has the wrong size: LD ${SIZEOF_LONG_DOUBLE} vs D ${SIZEOF_DOUBLE}. Falling back to CAIRO."
+      )
+      set(NS3_INT64X64 "CAIRO")
+    else()
+      set(INT64X64_USE_DOUBLE TRUE)
+    endif()
+  endif()
+
+  # Fallback option
+  if(${NS3_INT64X64} MATCHES "CAIRO")
+    set(INT64X64_USE_CAIRO TRUE)
+  endif()
+
+  include(CheckIncludeFileCXX) # Used to check a single header at a time
+  include(CheckIncludeFiles) # Used to check multiple headers at once
+  include(CheckFunctionExists)
+
+  # Check for required headers and functions, set flags if they're found or warn
+  # if they're not found
+  check_include_file_cxx("stdint.h" "HAVE_STDINT_H")
+  check_include_file_cxx("inttypes.h" "HAVE_INTTYPES_H")
+  check_include_file_cxx("sys/types.h" "HAVE_SYS_TYPES_H")
+  check_include_file_cxx("sys/stat.h" "HAVE_SYS_STAT_H")
+  check_include_file_cxx("dirent.h" "HAVE_DIRENT_H")
+  check_include_file_cxx("stdlib.h" "HAVE_STDLIB_H")
+  check_include_file_cxx("signal.h" "HAVE_SIGNAL_H")
+  check_include_file_cxx("netpacket/packet.h" "HAVE_PACKETH")
+  check_include_file_cxx("semaphore.h" "HAVE_SEMAPHORE_H")
+  check_function_exists("getenv" "HAVE_GETENV")
+
+  configure_file(
+    build-support/core-config-template.h
+    ${CMAKE_HEADER_OUTPUT_DIRECTORY}/core-config.h
+  )
+
+  # Force enable ns-3 logging in debug builds and if requested for other build
+  # types
+  if(${NS3_LOG} OR (${build_profile} STREQUAL "debug"))
+    add_definitions(-DNS3_LOG_ENABLE)
+  endif()
+  # Force enable ns-3 asserts in debug builds and if requested for other build
+  # types
+  if(${NS3_ASSERT} OR (${build_profile} STREQUAL "debug"))
+    add_definitions(-DNS3_ASSERT_ENABLE)
+  endif()
+
+  # Enable examples as tests suites
+  if(${ENABLE_EXAMPLES})
+    set(NS3_ENABLE_EXAMPLES "1")
+    add_definitions(-DNS3_ENABLE_EXAMPLES -DCMAKE_EXAMPLE_AS_TEST)
+  endif()
+
+  set(ENABLE_TAP OFF)
+  if(${NS3_TAP})
+    set(ENABLE_TAP ON)
+  endif()
+
+  set(ENABLE_EMU OFF)
+  if(${NS3_EMU})
+    set(ENABLE_EMU ON)
+  endif()
+
+  set(PLATFORM_UNSUPPORTED_PRE "Platform doesn't support")
+  set(PLATFORM_UNSUPPORTED_POST "features. Continuing without them.")
+  # Remove from libs_to_build all incompatible libraries or the ones that
+  # dependencies couldn't be installed
+  if(APPLE OR WSLv1)
+    set(ENABLE_TAP OFF)
+    set(ENABLE_EMU OFF)
+    list(REMOVE_ITEM libs_to_build fd-net-device)
+    message(
+      STATUS
+        "${PLATFORM_UNSUPPORTED_PRE} TAP and EMU ${PLATFORM_UNSUPPORTED_POST}"
+    )
+  endif()
+
+  if(NOT ${ENABLE_MPI})
+    list(REMOVE_ITEM libs_to_build mpi)
+  endif()
+
+  if(NOT ${ENABLE_VISUALIZER})
+    list(REMOVE_ITEM libs_to_build visualizer)
+  endif()
+
+  if(NOT ${ENABLE_TAP})
+    list(REMOVE_ITEM libs_to_build tap-bridge)
+  endif()
+
+  # Create library names to solve dependency problems with macros that will be
+  # called at each lib subdirectory
+  set(ns3-libs)
+  set(ns3-all-enabled-modules)
+  set(ns3-libs-tests)
+  set(ns3-contrib-libs)
+  set(lib-ns3-static-objs)
+  set(ns3-external-libs)
+  set(ns3-python-bindings ns${NS3_VER}-pybindings${build_profile_suffix})
+  set(ns3-python-bindings-modules)
+
+  foreach(libname ${scanned_modules})
+    # Create libname of output library of module
+    library_target_name(${libname} targetname)
+    mark_as_advanced(lib${libname} lib${libname}-obj)
+    set(lib${libname} ${targetname} CACHE INTERNAL "")
+    set(lib${libname}-obj ${targetname}-obj CACHE INTERNAL "")
+  endforeach()
+
+  unset(optional_visualizer_lib)
+  if(${ENABLE_VISUALIZER} AND (visualizer IN_LIST libs_to_build))
+    set(optional_visualizer_lib ${libvisualizer})
+  endif()
+
+  set(PRECOMPILE_HEADERS_ENABLED OFF)
+  if(${NS3_PRECOMPILE_HEADERS})
+    if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.16.0")
+      set(PRECOMPILE_HEADERS_ENABLED ON)
+      message(STATUS "Precompiled headers were enabled")
+    else()
+      message(
+        STATUS
+          "CMake ${CMAKE_VERSION} does not support precompiled headers. Continuing without them"
+      )
+    endif()
+  endif()
+
+  if(${PRECOMPILE_HEADERS_ENABLED})
+    set(precompiled_header_libraries
+        <iostream>
+        <stdint.h>
+        <stdlib.h>
+        <map>
+        <unordered_map>
+        <vector>
+        <list>
+        <algorithm>
+        <string>
+        <set>
+        <sstream>
+        <fstream>
+        <cstdlib>
+        <exception>
+        <cstring>
+        <limits>
+        <math.h>
+    )
+    add_library(stdlib_pch OBJECT ${PROJECT_SOURCE_DIR}/build-support/empty.cc)
+    target_precompile_headers(
+      stdlib_pch PUBLIC "${precompiled_header_libraries}"
+    )
+
+    add_executable(
+      stdlib_pch_exec ${PROJECT_SOURCE_DIR}/build-support/empty-main.cc
+    )
+    target_precompile_headers(
+      stdlib_pch_exec PUBLIC "${precompiled_header_libraries}"
+    )
+    set_runtime_outputdirectory(stdlib_pch_exec ${CMAKE_BINARY_DIR}/ "")
+  endif()
+
+  # Create new lib for NS3 static builds
+  set(lib-ns3-static ns${NS3_VER}-static${build_profile_suffix})
+
+  # Create a new lib for NS3 monolibrary shared builds
+  set(lib-ns3-monolib ns${NS3_VER}-monolib${build_profile_suffix})
+
+  # All contrib libraries can be linked afterwards linking with
+  # ${ns3-contrib-libs}
+  process_contribution("${contrib_libs_to_build}")
+
+  # Netanim depends on ns-3 core, so we built it later
+  if(${NS3_NETANIM})
+    include(FetchContent)
+    FetchContent_Declare(
+      netanim GIT_REPOSITORY https://gitlab.com/nsnam/netanim.git
+      GIT_TAG netanim-3.108
+    )
+    FetchContent_Populate(netanim)
+    file(COPY build-support/3rd-party/netanim-cmakelists.cmake
+         DESTINATION ${netanim_SOURCE_DIR}
+    )
+    file(RENAME ${netanim_SOURCE_DIR}/netanim-cmakelists.cmake
+         ${netanim_SOURCE_DIR}/CMakeLists.txt
+    )
+    add_subdirectory(${netanim_SOURCE_DIR})
+  endif()
+endmacro()
+
+function(set_runtime_outputdirectory target_name output_directory target_prefix)
+  set(ns3-exec-outputname ns${NS3_VER}-${target_name}${build_profile_suffix})
+  set(ns3-execs "${output_directory}${ns3-exec-outputname};${ns3-execs}"
+      CACHE INTERNAL "list of c++ executables"
+  )
+
+  set_target_properties(
+    ${target_prefix}${target_name}
+    PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${output_directory}
+               RUNTIME_OUTPUT_NAME ${ns3-exec-outputname}
+  )
+  if(${XCODE})
+    # Is that so hard not to break people's CI, AAPL?? Why would you output the
+    # targets to a Debug/Release subfolder? Why?
+    foreach(OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES})
+      string(TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG)
+      set_target_properties(
+        ${target_prefix}${target_name}
+        PROPERTIES RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${output_directory}
+                   RUNTIME_OUTPUT_NAME_${OUTPUTCONFIG} ${ns3-exec-outputname}
+      )
+    endforeach(OUTPUTCONFIG CMAKE_CONFIGURATION_TYPES)
+  endif()
+
+  if(${ENABLE_TESTS})
+    add_dependencies(all-test-targets ${target_prefix}${target_name})
+    # Create a CTest entry for each executable
+    if(WIN32)
+      # Windows require this workaround to make sure the DLL files are located
+      add_test(
+        NAME ctest-${target_prefix}${target_name}
+        COMMAND
+          ${CMAKE_COMMAND} -E env
+          "PATH=$ENV{PATH};${CMAKE_RUNTIME_OUTPUT_DIRECTORY};${CMAKE_LIBRARY_OUTPUT_DIRECTORY}"
+          ${ns3-exec-outputname}
+        WORKING_DIRECTORY ${output_directory}
+      )
+    else()
+      add_test(NAME ctest-${target_prefix}${target_name}
+               COMMAND ${ns3-exec-outputname}
+               WORKING_DIRECTORY ${output_directory}
+      )
+    endif()
+  endif()
+
+  if(${NS3_CLANG_TIMETRACE})
+    add_dependencies(timeTraceReport ${target_prefix}${target_name})
+  endif()
+endfunction(set_runtime_outputdirectory)
+
+function(scan_python_examples path)
+  # Skip python examples search in case the bindings are disabled
+  if(NOT ${ENABLE_PYTHON_BINDINGS})
+    return()
+  endif()
+
+  # Search for python examples
+  file(GLOB_RECURSE python_examples ${path}/*.py)
+  foreach(python_example ${python_examples})
+    if(NOT (${python_example} MATCHES "examples-to-run"))
+      set(ns3-execs-py "${python_example};${ns3-execs-py}"
+          CACHE INTERNAL "list of python scripts"
+      )
+    endif()
+  endforeach()
+endfunction()
+
+add_custom_target(copy_all_headers)
+function(copy_headers_before_building_lib libname outputdir headers visibility)
+  # cmake-format: off
+  set(batch_symlinks)
+  foreach(header ${headers})
+    # Copy header to output directory on changes -> too darn slow
+    # configure_file(${CMAKE_CURRENT_SOURCE_DIR}/${header} ${outputdir}/
+    # COPYONLY)
+
+    get_filename_component(
+      header_name ${CMAKE_CURRENT_SOURCE_DIR}/${header} NAME
+    )
+    # CMake 3.13 cannot create symlinks on Windows, so we use stub headers as a
+    # fallback
+    if(WIN32 AND (${CMAKE_VERSION} VERSION_LESS "3.13.0"))
+      # Create a stub header in the output directory, including the real header
+      # inside their respective module
+
+      file(WRITE ${outputdir}/${header_name}
+           "#include \"${CMAKE_CURRENT_SOURCE_DIR}/${header}\"\n"
+      )
+    else()
+      # Create a symlink in the output directory to the original header Calling
+      # execute_process for each symlink is too slow too, so we create a batch
+      # with all headers execute_process(COMMAND ${CMAKE_COMMAND} -E
+      # create_symlink ${CMAKE_CURRENT_SOURCE_DIR}/${header}
+      # ${outputdir}/${header_name})
+      set(batch_symlinks
+          ${batch_symlinks}
+          COMMAND
+          ${CMAKE_COMMAND}
+          -E
+          create_symlink
+          ${CMAKE_CURRENT_SOURCE_DIR}/${header}
+          ${outputdir}/${header_name}
+      )
+    endif()
+  endforeach()
+
+  # Create all symlinks in a single call if there is a symlink to be done
+  if(batch_symlinks)
+    execute_process(${batch_symlinks})
+  endif()
+  # cmake-format: on
+endfunction(copy_headers_before_building_lib)
+
+function(remove_lib_prefix prefixed_library library)
+  # Check if there is a lib prefix
+  string(FIND "${prefixed_library}" "lib" lib_pos)
+
+  # If there is a lib prefix, try to remove it
+  if(${lib_pos} EQUAL 0)
+    # Check if we still have something remaining after removing the "lib" prefix
+    string(LENGTH ${prefixed_library} len)
+    if(${len} LESS 4)
+      message(FATAL_ERROR "Invalid library name: ${prefixed_library}")
+    endif()
+
+    # Remove lib prefix from module name (e.g. libcore -> core)
+    string(SUBSTRING "${prefixed_library}" 3 -1 unprefixed_library)
+  else()
+    set(unprefixed_library ${prefixed_library})
+  endif()
+
+  # Save the unprefixed library name to the parent scope
+  set(${library} ${unprefixed_library} PARENT_SCOPE)
+endfunction()
+
+function(check_for_missing_libraries output_variable_name libraries)
+  set(missing_dependencies)
+  foreach(lib ${libraries})
+    # skip check for ns-3 modules if its a path to a library
+    if(EXISTS ${lib})
+      continue()
+    endif()
+
+    # check if the example depends on disabled modules
+    remove_lib_prefix("${lib}" lib)
+
+    # Check if the module exists in the ns-3 modules list or if it is a
+    # 3rd-party library
+    if(NOT (${lib} IN_LIST ns3-all-enabled-modules))
+      list(APPEND missing_dependencies ${lib})
+    endif()
+  endforeach()
+  set(${output_variable_name} ${missing_dependencies} PARENT_SCOPE)
+endfunction()
+
+# Import macros used for modules and define specialized versions for src modules
+include(build-support/custom-modules/ns3-module-macros.cmake)
+
+# Contrib modules counterparts of macros above
+include(build-support/custom-modules/ns3-contributions.cmake)
+
+# Macro to build examples in ns-3-dev/examples/
+macro(build_example)
+  set(options)
+  set(oneValueArgs NAME)
+  set(multiValueArgs SOURCE_FILES HEADER_FILES LIBRARIES_TO_LINK)
+  cmake_parse_arguments(
+    "EXAMPLE" "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}
+  )
+
+  check_for_missing_libraries(
+    missing_dependencies "${EXAMPLE_LIBRARIES_TO_LINK}"
+  )
+
+  if(NOT missing_dependencies)
+    # Create shared library with sources and headers
+    add_executable(
+      ${EXAMPLE_NAME} "${EXAMPLE_SOURCE_FILES}" "${EXAMPLE_HEADER_FILES}"
+    )
+
+    if(${NS3_STATIC})
+      target_link_libraries(
+        ${EXAMPLE_NAME} ${LIB_AS_NEEDED_PRE_STATIC} ${lib-ns3-static}
+      )
+    elseif(${NS3_MONOLIB})
+      target_link_libraries(
+        ${EXAMPLE_NAME} ${LIB_AS_NEEDED_PRE} ${lib-ns3-monolib}
+        ${LIB_AS_NEEDED_POST}
+      )
+    else()
+      # Link the shared library with the libraries passed
+      target_link_libraries(
+        ${EXAMPLE_NAME} ${LIB_AS_NEEDED_PRE} ${EXAMPLE_LIBRARIES_TO_LINK}
+        ${optional_visualizer_lib} ${LIB_AS_NEEDED_POST}
+      )
+    endif()
+
+    if(${PRECOMPILE_HEADERS_ENABLED})
+      target_precompile_headers(${EXAMPLE_NAME} REUSE_FROM stdlib_pch_exec)
+    endif()
+
+    set_runtime_outputdirectory(
+      ${EXAMPLE_NAME}
+      ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/examples/${examplefolder}/ ""
+    )
+  endif()
+endmacro()
+
+function(filter_modules modules_to_filter all_modules_list filter_in)
+  set(new_modules_to_build)
+  # We are receiving variable names as arguments, so we have to "dereference"
+  # them first That is why we have the duplicated ${${}}
+  foreach(module ${${all_modules_list}})
+    if(${filter_in} (${module} IN_LIST ${modules_to_filter}))
+      list(APPEND new_modules_to_build ${module})
+    endif()
+  endforeach()
+  set(${all_modules_list} ${new_modules_to_build} PARENT_SCOPE)
+endfunction()
+
+function(resolve_dependencies module_name dependencies contrib_dependencies)
+  # Create cache variables to hold dependencies list and visited
+  set(dependency_visited "" CACHE INTERNAL "")
+  set(contrib_dependency_visited "" CACHE INTERNAL "")
+  recursive_dependency(${module_name})
+  if(${module_name} IN_LIST dependency_visited)
+    set(temp ${dependency_visited})
+    list(REMOVE_AT temp 0)
+    set(${dependencies} ${temp} PARENT_SCOPE)
+    set(${contrib_dependencies} ${contrib_dependency_visited} PARENT_SCOPE)
+  else()
+    set(temp ${contrib_dependency_visited})
+    list(REMOVE_AT temp 0)
+    set(${dependencies} ${dependency_visited} PARENT_SCOPE)
+    set(${contrib_dependencies} ${temp} PARENT_SCOPE)
+  endif()
+  unset(dependency_visited CACHE)
+  unset(contrib_dependency_visited CACHE)
+endfunction()
+
+function(filter_libraries cmakelists_contents libraries)
+  string(REGEX MATCHALL "{lib[^}]*[^obj]}" matches "${cmakelists_content}")
+  list(REMOVE_ITEM matches "{libraries_to_link}")
+  string(REPLACE "{lib\${name" "" matches "${matches}") # special case for
+                                                        # src/test
+  string(REPLACE "{lib" "" matches "${matches}")
+  string(REPLACE "}" "" matches "${matches}")
+  set(${libraries} ${matches} PARENT_SCOPE)
+endfunction()
+
+function(recursive_dependency module_name)
+  # Read module CMakeLists.txt and search for ns-3 modules
+  set(src_cmakelist ${PROJECT_SOURCE_DIR}/src/${module_name}/CMakeLists.txt)
+  set(contrib_cmakelist
+      ${PROJECT_SOURCE_DIR}/contrib/${module_name}/CMakeLists.txt
+  )
+  set(contrib FALSE)
+  if(EXISTS ${src_cmakelist})
+    file(READ ${src_cmakelist} cmakelists_content)
+  elseif(EXISTS ${contrib_cmakelist})
+    file(READ ${contrib_cmakelist} cmakelists_content)
+    set(contrib TRUE)
+  else()
+    set(cmakelists_content "")
+    message(${HIGHLIGHTED_STATUS}
+            "The CMakeLists.txt file for module ${module_name} was not found."
+    )
+  endif()
+
+  filter_libraries("${cmakelists_content}" matches)
+
+  # Add this visited module dependencies to the dependencies list
+  if(contrib)
+    set(contrib_dependency_visited
+        "${contrib_dependency_visited};${module_name}" CACHE INTERNAL ""
+    )
+    set(examples_cmakelists ${contrib_cmakelist})
+  else()
+    set(dependency_visited "${dependency_visited};${module_name}" CACHE INTERNAL
+                                                                        ""
+    )
+    set(examples_cmakelists ${src_cmakelist})
+  endif()
+
+  # cmake-format: off
+  # Scan dependencies required by this module examples
+  #if(${ENABLE_EXAMPLES})
+  #  string(REPLACE "${module_name}" "${module_name}/examples" examples_cmakelists ${examples_cmakelists})
+  #  if(EXISTS ${examples_cmakelists})
+  #    file(READ ${examples_cmakelists} cmakelists_content)
+  #    filter_libraries(${cmakelists_content} example_matches)
+  #  endif()
+  #endif()
+  # cmake-format: on
+
+  # For each dependency, call this same function
+  set(matches "${matches};${example_matches}")
+  foreach(match ${matches})
+    if(NOT ((${match} IN_LIST dependency_visited)
+            OR (${match} IN_LIST contrib_dependency_visited))
+    )
+      recursive_dependency(${match})
+    endif()
+  endforeach()
+endfunction()
+
+macro(filter_enabled_and_disabled_modules libs_to_build contrib_libs_to_build
+      NS3_ENABLED_MODULES NS3_DISABLED_MODULES ns3rc_enabled_modules
+)
+  mark_as_advanced(ns3-all-enabled-modules)
+
+  # Before filtering, we set a variable with all scanned modules in the src
+  # directory
+  set(scanned_modules ${${libs_to_build}})
+
+  # Ensure enabled and disable modules lists are using semicolons
+  string(REPLACE "," ";" ${NS3_ENABLED_MODULES} "${${NS3_ENABLED_MODULES}}")
+  string(REPLACE "," ";" ${NS3_DISABLED_MODULES} "${${NS3_DISABLED_MODULES}}")
+
+  # Now that scanning modules finished, we can remove the disabled modules or
+  # replace the modules list with the ones in the enabled list
+  if(${NS3_ENABLED_MODULES} OR ${ns3rc_enabled_modules})
+    # List of enabled modules passed by the command line overwrites list read
+    # from ns3rc
+    if(${NS3_ENABLED_MODULES})
+      set(ns3rc_enabled_modules ${${NS3_ENABLED_MODULES}})
+    endif()
+
+    # Filter enabled modules
+    filter_modules(ns3rc_enabled_modules libs_to_build "")
+    filter_modules(ns3rc_enabled_modules contrib_libs_to_build "")
+
+    # Use recursion to automatically determine dependencies required by the
+    # manually enabled modules
+    foreach(lib ${${contrib_libs_to_build}})
+      resolve_dependencies(${lib} dependencies contrib_dependencies)
+      list(APPEND ${contrib_libs_to_build} "${contrib_dependencies}")
+      list(APPEND ${libs_to_build} "${dependencies}")
+      unset(dependencies)
+      unset(contrib_dependencies)
+    endforeach()
+
+    foreach(lib ${${libs_to_build}})
+      resolve_dependencies(${lib} dependencies contrib_dependencies)
+      list(APPEND ${libs_to_build} "${dependencies}")
+      unset(dependencies)
+      unset(contrib_dependencies)
+    endforeach()
+
+    if(core IN_LIST ${libs_to_build})
+      list(APPEND ${libs_to_build} test) # include test module
+    endif()
+  endif()
+
+  if(${NS3_DISABLED_MODULES})
+    set(all_libs ${${libs_to_build}};${${contrib_libs_to_build}})
+
+    # We then use the recursive dependency finding to get all dependencies of
+    # all modules
+    foreach(lib ${all_libs})
+      resolve_dependencies(${lib} dependencies contrib_dependencies)
+      set(${lib}_dependencies "${dependencies};${contrib_dependencies}")
+      unset(dependencies)
+      unset(contrib_dependencies)
+    endforeach()
+
+    # Now we can begin removing libraries that require disabled dependencies
+    set(disabled_libs "${${NS3_DISABLED_MODULES}}")
+    foreach(libo ${all_libs})
+      foreach(lib ${all_libs})
+        foreach(disabled_lib ${disabled_libs})
+          if(${lib} STREQUAL ${disabled_lib})
+            continue()
+          endif()
+          if(${disabled_lib} IN_LIST ${lib}_dependencies)
+            list(APPEND disabled_libs ${lib})
+            break() # proceed to the next lib in all_libs
+          endif()
+        endforeach()
+      endforeach()
+    endforeach()
+
+    # Clean dependencies lists
+    foreach(lib ${all_libs})
+      unset(${lib}_dependencies)
+    endforeach()
+
+    # We can filter out disabled modules
+    filter_modules(disabled_libs libs_to_build "NOT")
+    filter_modules(disabled_libs contrib_libs_to_build "NOT")
+
+    if(core IN_LIST ${libs_to_build})
+      list(APPEND ${libs_to_build} test) # include test module
+    endif()
+  endif()
+
+  # Older CMake versions require this workaround for empty lists
+  if(NOT ${contrib_libs_to_build})
+    set(${contrib_libs_to_build} "")
+  endif()
+
+  # Filter out any eventual duplicates
+  list(REMOVE_DUPLICATES ${libs_to_build})
+  list(REMOVE_DUPLICATES ${contrib_libs_to_build})
+
+  # Export list with all enabled modules (used to separate ns libraries from
+  # non-ns libraries in ns3_module_macros)
+  set(ns3-all-enabled-modules "${${libs_to_build}};${${contrib_libs_to_build}}"
+      CACHE INTERNAL "list with all enabled modules"
+  )
+endmacro()
+
+# Parse .ns3rc
+function(parse_ns3rc enabled_modules examples_enabled tests_enabled)
+  set(ns3rc ${PROJECT_SOURCE_DIR}/.ns3rc)
+  # Set parent scope variables with default values (all modules, no examples nor
+  # tests)
+  set(${enabled_modules} "" PARENT_SCOPE)
+  set(${examples_enabled} "FALSE" PARENT_SCOPE)
+  set(${tests_enabled} "FALSE" PARENT_SCOPE)
+  if(EXISTS ${ns3rc})
+    # If ns3rc exists in ns-3-dev, read it
+    file(READ ${ns3rc} ns3rc_contents)
+
+    # Match modules_enabled list
+    if(ns3rc_contents MATCHES "modules_enabled.*\\[(.*).*\\]")
+      set(${enabled_modules} ${CMAKE_MATCH_1})
+      if(${enabled_modules} MATCHES "all_modules")
+        # If all modules, just clean the filter and all modules will get built
+        # by default
+        set(${enabled_modules})
+      else()
+        # If modules are listed, remove quotes and replace commas with
+        # semicolons transforming a string into a cmake list
+        string(REPLACE "," ";" ${enabled_modules} "${${enabled_modules}}")
+        string(REPLACE "'" "" ${enabled_modules} "${${enabled_modules}}")
+        string(REPLACE "\"" "" ${enabled_modules} "${${enabled_modules}}")
+        string(REPLACE " " "" ${enabled_modules} "${${enabled_modules}}")
+      endif()
+    endif()
+    # Match examples_enabled flag
+    if(ns3rc_contents MATCHES "examples_enabled = (True|False)")
+      set(${examples_enabled} ${CMAKE_MATCH_1})
+    endif()
+
+    # Match tests_enabled flag
+    if(ns3rc_contents MATCHES "tests_enabled = (True|False)")
+      set(${tests_enabled} ${CMAKE_MATCH_1})
+    endif()
+
+    # Save variables to parent scope
+    set(${enabled_modules} "${${enabled_modules}}" PARENT_SCOPE)
+    set(${examples_enabled} "${${examples_enabled}}" PARENT_SCOPE)
+    set(${tests_enabled} "${${tests_enabled}}" PARENT_SCOPE)
+  endif()
+endfunction(parse_ns3rc)
+
+function(log_find_searched_paths)
+  # Parse arguments
+  set(options)
+  set(oneValueArgs TARGET_TYPE TARGET_NAME SEARCH_RESULT SEARCH_SYSTEM_PREFIX)
+  set(multiValueArgs SEARCH_PATHS SEARCH_SUFFIXES)
+  cmake_parse_arguments(
+    "LOGFIND" "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}
+  )
+
+  # Get searched paths and add cmake_system_prefix_path if not explicitly marked
+  # not to include it
+  set(tsearch_paths ${LOGFIND_SEARCH_PATHS})
+  if("${LOGFIND_SEARCH_SYSTEM_PREFIX}" STREQUAL "")
+    list(APPEND tsearch_paths "${CMAKE_SYSTEM_PREFIX_PATH}")
+  endif()
+
+  set(log_find
+      "Looking for ${LOGFIND_TARGET_TYPE} ${LOGFIND_TARGET_NAME} in:\n"
+  )
+  # For each search path and suffix combination, print a line
+  foreach(tsearch_path ${tsearch_paths})
+    foreach(suffix ${LOGFIND_SEARCH_SUFFIXES})
+      string(APPEND log_find
+             "\t${tsearch_path}${suffix}/${LOGFIND_TARGET_NAME}\n"
+      )
+    endforeach()
+  endforeach()
+
+  # Add a final line saying if the file was found and where, or if it was not
+  # found
+  if("${${LOGFIND_SEARCH_RESULT}}" STREQUAL "${LOGFIND_SEARCH_RESULT}-NOTFOUND")
+    string(APPEND log_find
+           "\n\t${LOGFIND_TARGET_TYPE} ${LOGFIND_TARGET_NAME} was not found\n"
+    )
+  else()
+    string(
+      APPEND
+      log_find
+      "\n\t${LOGFIND_TARGET_TYPE} ${LOGFIND_TARGET_NAME} was found in ${${LOGFIND_SEARCH_RESULT}}\n"
+    )
+  endif()
+
+  # Replace duplicate path separators
+  string(REPLACE "//" "/" log_find "${log_find}")
+
+  # Print find debug message similar to the one produced by
+  # CMAKE_FIND_DEBUG_MODE=true in CMake >= 3.17
+  message(STATUS ${log_find})
+endfunction()
+
+function(find_external_library)
+  # Parse arguments
+  set(options QUIET)
+  set(oneValueArgs DEPENDENCY_NAME HEADER_NAME LIBRARY_NAME)
+  set(multiValueArgs HEADER_NAMES LIBRARY_NAMES PATH_SUFFIXES SEARCH_PATHS)
+  cmake_parse_arguments(
+    "FIND_LIB" "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}
+  )
+
+  # Set the external package/dependency name
+  set(name ${FIND_LIB_DEPENDENCY_NAME})
+
+  # We process individual and list of headers and libraries by transforming them
+  # into lists
+  set(library_names "${FIND_LIB_LIBRARY_NAME};${FIND_LIB_LIBRARY_NAMES}")
+  set(header_names "${FIND_LIB_HEADER_NAME};${FIND_LIB_HEADER_NAMES}")
+
+  # Just changing the parsed argument name back to something shorter
+  set(search_paths ${FIND_LIB_SEARCH_PATHS})
+  set(path_suffixes "${FIND_LIB_PATH_SUFFIXES}")
+
+  set(not_found_libraries)
+  set(library_dirs)
+  set(libraries)
+
+  # Paths and suffixes where libraries will be searched on
+  set(library_search_paths
+      ${search_paths}
+      ${CMAKE_OUTPUT_DIRECTORY} # Search for libraries in ns-3-dev/build
+      ${CMAKE_INSTALL_PREFIX} # Search for libraries in the install directory
+                              # (e.g. /usr/)
+      $ENV{LD_LIBRARY_PATH} # Search for libraries in LD_LIBRARY_PATH
+                            # directories
+      $ENV{PATH} # Search for libraries in PATH directories
+  )
+  set(suffixes /build /lib /build/lib / /bin ${path_suffixes})
+
+  # For each of the library names in LIBRARY_NAMES or LIBRARY_NAME
+  foreach(library ${library_names})
+    # We mark this value is advanced not to pollute the configuration with
+    # ccmake with the cache variables used internally
+    mark_as_advanced(${name}_library_internal_${library})
+
+    # We search for the library named ${library} and store the results in
+    # ${name}_library_internal_${library}
+    find_library(
+      ${name}_library_internal_${library} ${library}
+      HINTS ${library_search_paths} PATH_SUFFIXES ${suffixes}
+    )
+    # cmake-format: off
+    # Note: the PATH_SUFFIXES above apply to *ALL* PATHS and HINTS Which
+    # translates to CMake searching on standard library directories
+    # CMAKE_SYSTEM_PREFIX_PATH, user-settable CMAKE_PREFIX_PATH or
+    # CMAKE_LIBRARY_PATH and the directories listed above
+    #
+    # e.g.  from Ubuntu 22.04 CMAKE_SYSTEM_PREFIX_PATH =
+    # /usr/local;/usr;/;/usr/local;/usr/X11R6;/usr/pkg;/opt
+    #
+    # Searched directories without suffixes
+    #
+    # ${CMAKE_SYSTEM_PREFIX_PATH}[0] = /usr/local/
+    # ${CMAKE_SYSTEM_PREFIX_PATH}[1] = /usr
+    # ${CMAKE_SYSTEM_PREFIX_PATH}[2] = /
+    # ...
+    # ${CMAKE_SYSTEM_PREFIX_PATH}[6] = /opt
+    # ${LD_LIBRARY_PATH}[0]
+    # ...
+    # ${LD_LIBRARY_PATH}[m]
+    # ${PATH}[0]
+    # ...
+    # ${PATH}[m]
+    #
+    # Searched directories with suffixes include all of the directories above
+    # plus all suffixes
+    # PATH_SUFFIXES /build /lib /build/lib / /bin # ${path_suffixes}
+    #
+    # /usr/local/build
+    # /usr/local/lib
+    # /usr/local/build/lib
+    # /usr/local/bin
+    # ...
+    #
+    # cmake-format: on
+    # Or enable NS3_VERBOSE to print the searched paths
+
+    # Print tested paths to the searched library and if it was found
+    if(${NS3_VERBOSE} AND (${CMAKE_VERSION} VERSION_LESS "3.17.0"))
+      log_find_searched_paths(
+        TARGET_TYPE
+        Library
+        TARGET_NAME
+        ${library}
+        SEARCH_RESULT
+        ${name}_library_internal_${library}
+        SEARCH_PATHS
+        ${library_search_paths}
+        SEARCH_SUFFIXES
+        ${suffixes}
+      )
+    endif()
+
+    # After searching the library, the internal variable should have either the
+    # absolute path to the library or the name of the variable appended with
+    # -NOTFOUND
+    if("${${name}_library_internal_${library}}" STREQUAL
+       "${name}_library_internal_${library}-NOTFOUND"
+    )
+      # We keep track of libraries that were not found
+      list(APPEND not_found_libraries ${library})
+    else()
+      # We get the name of the parent directory of the library and append the
+      # library to a list of found libraries
+      get_filename_component(
+        ${name}_library_dir_internal ${${name}_library_internal_${library}}
+        DIRECTORY
+      ) # e.g. lib/openflow.(so|dll|dylib|a) -> lib
+      list(APPEND library_dirs ${${name}_library_dir_internal})
+      list(APPEND libraries ${${name}_library_internal_${library}})
+    endif()
+  endforeach()
+
+  # For each library that was found (e.g. /usr/lib/pthread.so), get their parent
+  # directory (/usr/lib) and its parent (/usr)
+  set(parent_dirs)
+  foreach(libdir ${library_dirs})
+    get_filename_component(parent_libdir ${libdir} DIRECTORY)
+    get_filename_component(parent_parent_libdir ${parent_libdir} DIRECTORY)
+    list(APPEND parent_dirs ${libdir} ${parent_libdir} ${parent_parent_libdir})
+  endforeach()
+
+  # If we already found a library somewhere, limit the search paths for the
+  # header
+  if(parent_dirs)
+    set(header_search_paths ${parent_dirs})
+    set(header_skip_system_prefix NO_CMAKE_SYSTEM_PATH)
+  else()
+    set(header_search_paths
+        ${search_paths} ${CMAKE_OUTPUT_DIRECTORY} # Search for headers in
+                                                  # ns-3-dev/build
+        ${CMAKE_INSTALL_PREFIX} # Search for headers in the install
+    )
+  endif()
+
+  set(not_found_headers)
+  set(include_dirs)
+  foreach(header ${header_names})
+    # The same way with libraries, we mark the internal variable as advanced not
+    # to pollute ccmake configuration with variables used internally
+    mark_as_advanced(${name}_header_internal_${header})
+    set(suffixes
+        /build
+        /include
+        /build/include
+        /build/include/${name}
+        /include/${name}
+        /${name}
+        /
+        ${path_suffixes}
+    )
+
+    # cmake-format: off
+    # Here we search for the header file named ${header} and store the result in
+    # ${name}_header_internal_${header}
+    #
+    # The same way we did with libraries, here we search on
+    # CMAKE_SYSTEM_PREFIX_PATH, along with user-settable ${search_paths}, the
+    # parent directories from the libraries, CMAKE_OUTPUT_DIRECTORY and
+    # CMAKE_INSTALL_PREFIX
+    #
+    # And again, for each of them, for every suffix listed /usr/local/build
+    # /usr/local/include
+    # /usr/local/build/include
+    # /usr/local/build/include/${name}
+    # /usr/local/include/${name}
+    # ...
+    #
+    # cmake-format: on
+    # Or enable NS3_VERBOSE to get the searched paths printed while configuring
+
+    find_file(${name}_header_internal_${header} ${header}
+              HINTS ${header_search_paths} # directory (e.g. /usr/)
+                    ${header_skip_system_prefix} PATH_SUFFIXES ${suffixes}
+    )
+
+    # Print tested paths to the searched header and if it was found
+    if(${NS3_VERBOSE} AND (${CMAKE_VERSION} VERSION_LESS "3.17.0"))
+      log_find_searched_paths(
+        TARGET_TYPE
+        Header
+        TARGET_NAME
+        ${header}
+        SEARCH_RESULT
+        ${name}_header_internal_${header}
+        SEARCH_PATHS
+        ${header_search_paths}
+        SEARCH_SUFFIXES
+        ${suffixes}
+        SEARCH_SYSTEM_PREFIX
+        ${header_skip_system_prefix}
+      )
+    endif()
+
+    # If the header file was not found, append to the not-found list
+    if("${${name}_header_internal_${header}}" STREQUAL
+       "${name}_header_internal_${header}-NOTFOUND"
+    )
+      list(APPEND not_found_headers ${header})
+    else()
+      # If the header file was found, get their directories and the parent of
+      # their directories to add as include directories
+      get_filename_component(
+        header_include_dir ${${name}_header_internal_${header}} DIRECTORY
+      ) # e.g. include/click/ (simclick.h) -> #include <simclick.h> should work
+      get_filename_component(
+        header_include_dir2 ${header_include_dir} DIRECTORY
+      ) # e.g. include/(click) -> #include <click/simclick.h> should work
+      list(APPEND include_dirs ${header_include_dir} ${header_include_dir2})
+    endif()
+  endforeach()
+
+  # Remove duplicate include directories
+  if(include_dirs)
+    list(REMOVE_DUPLICATES include_dirs)
+  endif()
+
+  # If we find both library and header, we export their values
+  if((NOT not_found_libraries}) AND (NOT not_found_headers))
+    set(${name}_INCLUDE_DIRS "${include_dirs}" PARENT_SCOPE)
+    set(${name}_LIBRARIES "${libraries}" PARENT_SCOPE)
+    set(${name}_HEADER ${${name}_header_internal} PARENT_SCOPE)
+    set(${name}_FOUND TRUE PARENT_SCOPE)
+    if(NOT ${FIND_LIB_QUIET})
+      message(STATUS "find_external_library: ${name} was found.")
+    endif()
+  else()
+    set(${name}_INCLUDE_DIRS PARENT_SCOPE)
+    set(${name}_LIBRARIES PARENT_SCOPE)
+    set(${name}_HEADER PARENT_SCOPE)
+    set(${name}_FOUND FALSE PARENT_SCOPE)
+    if(NOT ${FIND_LIB_QUIET})
+      message(
+        ${HIGHLIGHTED_STATUS}
+        "find_external_library: ${name} was not found. Missing headers: \"${not_found_headers}\" and missing libraries: \"${not_found_libraries}\"."
+      )
+    endif()
+  endif()
+endfunction()
+
+function(write_header_to_modules_map)
+  if(${ENABLE_SCAN_PYTHON_BINDINGS})
+    set(header_map ${ns3-headers-to-module-map})
+
+    # Trim last comma
+    string(LENGTH "${header_map}" header_map_len)
+    math(EXPR header_map_len "${header_map_len}-1")
+    string(SUBSTRING "${header_map}" 0 ${header_map_len} header_map)
+
+    # Then write to header_map.json for consumption of pybindgen
+    file(WRITE ${PROJECT_BINARY_DIR}/header_map.json "{${header_map}}")
+  endif()
+endfunction()
+
+function(get_target_includes target output)
+  set(include_directories)
+  get_target_property(include_dirs ${target} INCLUDE_DIRECTORIES)
+  foreach(include_dir ${include_dirs})
+    if(include_dir MATCHES "<")
+      # Skip CMake build and install interface includes
+      continue()
+    else()
+      # Append the include directory to a list
+      set(include_directories ${include_directories} -I${include_dir})
+    endif()
+  endforeach()
+  set(${output} ${include_directories} PARENT_SCOPE)
+endfunction()
+
+function(check_python_packages packages missing_packages)
+  set(missing)
+  foreach(package ${packages})
+    execute_process(
+      COMMAND ${Python3_EXECUTABLE} -c "import ${package}"
+      RESULT_VARIABLE return_code OUTPUT_QUIET ERROR_QUIET
+    )
+    if(NOT (${return_code} EQUAL 0))
+      list(APPEND missing ${package})
+    endif()
+  endforeach()
+  set(${missing_packages} "${missing}" PARENT_SCOPE)
+endfunction()
+
+include(build-support/custom-modules/ns3-lock.cmake)
+include(build-support/custom-modules/ns3-configtable.cmake)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/build-support/pkgconfig-template.pc.in ns-3.36/build-support/pkgconfig-template.pc.in
--- ns-3.35/build-support/pkgconfig-template.pc.in	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/build-support/pkgconfig-template.pc.in	2022-04-30 18:23:57.642732600 -0700
@@ -0,0 +1,13 @@
+exec_prefix="@CMAKE_INSTALL_FULL_BINDIR@"
+libdir="@CMAKE_INSTALL_FULL_LIBDIR@"
+includedir="@CMAKE_INSTALL_FULL_INCLUDEDIR@"
+
+Name: ns3-@module_name@
+Description: @CMAKE_PROJECT_DESCRIPTION@
+URL: @CMAKE_PROJECT_HOMEPAGE_URL@
+Version: @ns3_version@
+Requires: @pkgconfig_public_required@
+Requires.private: @pkgconfig_private_required@
+Cflags: -I"${includedir}" @pkgconfig_interface_include_directories@
+Libs: -L"${libdir}" -l@pkgconfig_target_lib@ @pkgconfig_public_libs@
+Libs.private: -L"${libdir}" @pkgconfig_private_libs@
\ No newline at end of file
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/build-support/pybindings-LP64-to-ILP32.py ns-3.36/build-support/pybindings-LP64-to-ILP32.py
--- ns-3.35/build-support/pybindings-LP64-to-ILP32.py	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/build-support/pybindings-LP64-to-ILP32.py	2022-04-30 18:23:57.642732600 -0700
@@ -0,0 +1,16 @@
+#! /usr/bin/env python3
+# -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
+
+def lp64_to_ilp32(lp64path, ilp32path):
+    import re
+    lp64bindings = None
+    with open(lp64path, "r") as lp64file:
+        lp64bindings = lp64file.read()
+    with open(ilp32path, "w") as ilp32file:
+        ilp32bindings = re.sub("unsigned long(?!( long))", "unsigned long long", lp64bindings)
+        ilp32file.write(ilp32bindings)
+
+if __name__ == "__main__":
+    import sys
+    print(sys.argv)
+    exit(lp64_to_ilp32(sys.argv[1], sys.argv[2]))
\ No newline at end of file
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/build-support/version.cache.in ns-3.36/build-support/version.cache.in
--- ns-3.35/build-support/version.cache.in	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/build-support/version.cache.in	2022-04-30 18:23:57.642732600 -0700
@@ -0,0 +1,10 @@
+CLOSEST_TAG = '"@NS3_VERSION_CLOSEST_TAG@"'
+VERSION_COMMIT_HASH = '"@NS3_VERSION_COMMIT_HASH@"'
+VERSION_DIRTY_FLAG = '@NS3_VERSION_DIRTY_FLAG@'
+VERSION_MAJOR = '@NS3_VERSION_MAJOR@'
+VERSION_MINOR = '@NS3_VERSION_MINOR@'
+VERSION_PATCH = '@NS3_VERSION_PATCH@'
+VERSION_RELEASE_CANDIDATE = '@NS3_VERSION_RELEASE_CANDIDATE@'
+VERSION_TAG = '"@NS3_VERSION_TAG@"'
+VERSION_TAG_DISTANCE = '@NS3_VERSION_TAG_DISTANCE@'
+VERSION_BUILD_PROFILE = '@NS3_VERSION_BUILD_PROFILE@'
\ No newline at end of file
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/build-support/version-defines-template.h ns-3.36/build-support/version-defines-template.h
--- ns-3.35/build-support/version-defines-template.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/build-support/version-defines-template.h	2022-04-30 18:23:57.642732600 -0700
@@ -0,0 +1,145 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2018 Lawrence Livermore National Laboratory
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Authors: Mathew Bielejeski <bielejeski1@llnl.gov>
+ */
+
+#ifndef NS3_VERSION_DEFINES_H_
+#define NS3_VERSION_DEFINES_H_
+
+/**
+  * \file
+  * \ingroup buildversion
+  * Defines the macro values for printing the build version.
+  * These will be populated by the build system.
+  */
+
+/**
+  * \ingroup buildversion
+  * @{
+  */
+
+/**
+ * The first tag found which matches the pattern ns-3*.
+ *
+ * The expected format of the ns-3 version tag is: ns-3.<minor>[.patch][-release_candidate]
+ *
+ * The tag is found by starting at the tip of the current branch and walking
+ * back towards the root.
+ *
+ * Type: string literal
+ */
+#cmakedefine NS3_VERSION_TAG "@NS3_VERSION_TAG@"
+
+/**
+ * The tag closest to the tip of the current branch
+ *
+ * The tag is found by starting at the tip of the current branch and
+ * walking back towards the root.
+ *
+ * This value will be the same as #NS3_VERSION_TAG when #NS3_VERSION_TAG is
+ * the closest tag.
+ *
+ * Type: string literal
+ */
+#cmakedefine NS3_VERSION_CLOSEST_TAG "@NS3_VERSION_CLOSEST_TAG@"
+
+/**
+ * The major version extracted from #NS3_VERSION_TAG
+ *
+ * For a tag with the format ns-<digit>.<digit>[.digit], the major
+ * version is the number after ns- and before the first period.
+ *
+ * Type: integer
+ */
+#cmakedefine NS3_VERSION_MAJOR @NS3_VERSION_MAJOR@
+
+/**
+ * The minor version extracted from #NS3_VERSION_TAG
+ *
+ * For a tag with the format ns-<digit>.<digit>[.digit], the minor
+ * version is the number after the first period.
+ *
+ * Type: integer
+ */
+#cmakedefine NS3_VERSION_MINOR @NS3_VERSION_MINOR@
+
+/**
+ * The patch number extracted from #NS3_VERSION_TAG
+ *
+ * For a tag with the format ns-<digit>.<digit>[.digit], the patch
+ * is the number after the last period.
+ *
+ * The patch value is optional and may not be present in the tag.
+ * In cases where the patch value is not present, the field will be set to 0
+ *
+ * Type: integer
+ */
+#cmakedefine NS3_VERSION_PATCH @NS3_VERSION_PATCH@
+
+/**
+ * The portion of the #NS3_VERSION_TAG indicating the version
+ * of the release candidate (if applicable).
+ *
+ * In order for this field to contain a value, the #NS3_VERSION_TAG
+ * must have the format ns-<digit>.<digit>[.digit][-RC<digit>].
+ * The contents of the release candidate will be the RC<digit>
+ * portion of the tag.
+ *
+ * Type: string literal
+ */
+#cmakedefine NS3_VERSION_RELEASE_CANDIDATE @NS3_VERSION_RELEASE_CANDIDATE@
+
+/**
+ * The number of repository commits between #NS3_VERSION_CLOSEST_TAG
+ * and the branch HEAD.
+ *
+ * Type: integer
+ */
+#cmakedefine NS3_VERSION_TAG_DISTANCE @NS3_VERSION_TAG_DISTANCE@
+
+/**
+ * Hash value which uniquely identifies the commit of the
+ * branch HEAD.
+ * The first character of the commit hash is 'g' to indicate this hash is
+ * a git hash
+ *
+ * Type: string literal
+ */
+#cmakedefine NS3_VERSION_COMMIT_HASH "@NS3_VERSION_COMMIT_HASH@"
+
+/**
+ * Flag indicating whether the repository working tree had uncommitted
+ * changes when the library was built.
+ *
+ * The flag will be 1 if there were uncommitted changes, 0 otherwise.
+ *
+ * Type: integer
+ */
+#cmakedefine01 NS3_VERSION_DIRTY_FLAG
+
+/**
+ * Indicates the build profile that was specified by the --build-profile option
+ * of "ns3 configure"
+ *
+ * Type: string literal
+ */
+#cmakedefine NS3_VERSION_BUILD_PROFILE "@NS3_VERSION_BUILD_PROFILE@"
+
+/** @} */
+
+#endif
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/CHANGES.html ns-3.36/CHANGES.html
--- ns-3.35/CHANGES.html	2021-10-01 13:27:51.000000000 -0700
+++ ns-3.36/CHANGES.html	1969-12-31 16:00:00.000000000 -0800
@@ -1,3382 +0,0 @@
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
-<html>
-<head>
-   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-   <title>ns-3 Change Log</title>
-</head>
-<body>
-
-<h1>
-ns-3: API and model change history</h1>
-<!--
-This ChangeLog is updated in the reverse order 
-with the most recent changes coming first.  Date format:  DD-MM-YYYY
--->
-<p>
-ns-3 is an evolving system and there will be API or behavioral changes
-from time to time.   Users who try to use scripts or models across
-versions of ns-3 may encounter problems at compile time, run time, or
-may see the simulation output change.  </p>
-<p>
-We have adopted the development policy that we are going to try to ease
-the impact of these changes on users by documenting these changes in a
-single place (this file), and not by providing a temporary or permanent
-backward-compatibility software layer.  </p>
-<p>
-A related file is the RELEASE_NOTES file in the top level directory.
-This file complements RELEASE_NOTES by focusing on API and behavioral
-changes that users upgrading from one release to the next may encounter.
-RELEASE_NOTES attempts to comprehensively list all of the changes
-that were made.  There is generally some overlap in the information 
-contained in RELEASE_NOTES and this file.  </p>
-<p>
-The goal is that users who encounter a problem when trying to use older
-code with newer code should be able to consult this file to find
-guidance as to how to fix the problem.  For instance, if a method name
-or signature has changed, it should be stated what the new replacement
-name is. </p>
-<p>
-Note that users who upgrade the simulator across versions, or who work
-directly out of the development tree, may find that simulation output
-changes even when the compilation doesn't break, such as when a
-simulator default value is changed.  Therefore, it is good practice for
-_anyone_ using code across multiple ns-3 releases to consult this file,
-as well as the RELEASE_NOTES, to understand what has changed over time.
-</p>
-<p>
-This file is a best-effort approach to solving this issue; we will do
-our best but can guarantee that there will be things that fall through
-the cracks, unfortunately.  If you, as a user, can suggest improvements
-to this file based on your experience, please contribute a patch or drop
-us a note on ns-developers mailing list.</p>
-
-<hr>
-<h1>Changes from ns-3.34 to ns-3.35</h1>
-<h2>New API:</h2>
-<ul>
-<li>In class <b>Ipv6Header</b>, new functions SetSource (), SetDestination (), GetSource () and GetDestination () are added, consistent with <b>Ipv4Header</b>. The existing functions had "Address" suffix in each of the function names, and are are deprecated now.</li>
-<li>In class <b>Ipv4InterfaceAddress</b>, new functions SetAddress () and GetAddress () are added, corresponding to SetLocal () and GetLocal () respectively. This is done to keep consistency with <b>Ipv4InterfaceAddress</b>.</li>
-<li>With the new support for IPv6 Nix-Vector routing, we have all the new APIs corresponding to IPv4 Nix-Vector routing. Specific to the user, there is an Ipv6NixVectorHelper class which can be set in the InternetStackHelper, and works similar to Ipv4NixVectorHelper.</li>
-<li>In class <b>Ipv4InterfaceAddress</b>, a new function IsInSameSubnet () is added to check if both the IPv4 addresses are in the same subnet. Also, it is consistent with <b>Ipv6InterfaceAddress::IsInSameSubnet ()</b>.</li>
-<li>In class <b>ConfigStore</b>, a new Attribue <b>SaveDeprecated</b> allows to not save DEPRECATED Attributes. The default value is <b>false</b> (save DEPRECATED Attributes).</li>
-<li>In class <b>TracedCallback</b>, a new function <b>IsEmpty</b> allows to know if the TracedCallback will call any callback.</li>
-<li>A new specialization of std::hash for Ptr allows one to use Ptrs as keys in unordered_map and unordered_set containers.</li>
-<li>A new <b>GroupMobilityHelper</b> mobility helper has been added to ease the configuration of group mobility (a form of hierarchical mobility in which multiple child mobility models move with reference to an underlying parent mobility model).  New example programs and animation scripts are also added to both the buildings and mobility modules.</li>
-</ul>
-<h2>Changes to existing API:</h2>
-<ul>
-<li>In class <b>Ipv6Header</b>, the functions SetSourceAddress (), SetDestinationAddress (), GetSourceAddress () and GetDestinationAddress () are deprecated. New corresponding functions are added by removing the "Address" suffix. This change is made for having consistency with <b>Ipv4Header</b>.</li>
-<li><b>ipv4-nix-vector-helper.h</b> and <b>ipv4-nix-vector-routing.h</b> have been deprecated in favour of <b>nix-vector-helper.h</b> and <b>nix-vector-routing.h</b> respectively.</li>
-</ul>
-<h2>Changes to build system:</h2>
-<ul>
-<li>The default C++ standard is now C++17.</li>
-<li>The minimum compiler versions have been raised to g++-7 and clang-10 (Linux) and Xcode 11 (macOS).</li>
-</ul>
-<h2>Changed behavior:</h2>
-<ul>
-<li>Nix-Vector routing supports topologies with multiple WiFi networks using the same WiFi channel object.</li>
-<li>ConfigStore no longer saves OBSOLETE attributes.</li>
-<li>The <b>Ipv4L3Protocol</b> Duplicate detection now accounts for transmitted packets, so a transmitting multicast node will not forward its own packets.</li>
-<li>Wi-Fi: A-MSDU aggregation now implies that constituent MSDUs are immediately dequeued
-from the EDCA queue and replaced by an MPDU containing the A-MSDU. Thus, aggregating N
-MSDUs triggers N dequeue operations and 1 enqueue operation on the EDCA queue.</li>
-<li>Wi-Fi: MPDUs being passed to the PHY layer for transmission are not dequeued, but
-are kept in the EDCA queue until they are acknowledged or discarded. Consequently, the
-BlockAckManager retransmit queue has been removed.</li>
-</ul>
-
-<hr>
-<h1>Changes from ns-3.33 to ns-3.34</h1>
-<h2>New features and API:</h2>
-<ul>
-<li>Support for Wi-Fi <b>802.11ax downlink and uplink OFDMA</b>, including multi-user OFDMA and a <b>round-robin multi-user scheduler</b>.</li>
-<li><b>FqCobalt</b> queue disc with L4S features and set associative hash.</li>
-<li><b>FqPIE</b> queue disc with L4S mode</li>
-<li><b>ThompsonSamplingWifiManager</b> Wi-Fi rate control algorithm.</li>
-<li>New <b>PhasedArrayModel</b>, providing a flexible interface for modeling a number of Phase Antenna Array (PAA) models.</li>
-<li>Added the ability to configure the <b>Wi-Fi primary 20 MHz channel</b> for 802.11 devices operating on channels of width greater than 20 MHz.</li>
-<li>A <b>TCP BBRv1</b> congestion control model.</li>
-<li><b>Improved support for bit fields</b> in header serialization/deserialization.</li>
-<li>Support for <b>IPv6 stateless address auto-configuration (SLAAC)</b>.</li>
-</ul>
-<h2>Changes to existing API:</h2>
-<ul>
-<li>The <b>WifiAckPolicySelector</b> class has been replaced by the <b>WifiAckManager</b> class. Correspondingly, the ConstantWifiAckPolicySelector has been replaced by the WifiDefaultAckManager class. A new WifiProtectionManager abstract base class and WifiDefaultProtectionManager concrete class have been added to implement different protection policies.</li>
-<li>The class <b>ThreeGppAntennaArrayModel</b> has been replaced by <b>UniformPlanarArray</b>, extending the PhasedArrayModel interface.</li>
-<li>The <b>Angles struct</b> is now a class, with robust setters and getters (public struct variables phi and theta are now private class variables m_azimuth and m_inclination), overloaded operator&lt;&lt; and operator&gt;&gt; and a number of utilities.</li>
-<li><b>AntennaModel</b> child classes have been extended to produce 3D radiation patterns. Attributes such as Beamwidth have thus been separated into Vertical/HorizontalBeamwidth.</li>
-<li>The attribute <b>UseVhtOnly</b> in <b>MinstrelHtWifiManager</b> has been replaced by a new attribute called <b>UseLatestAmendmentOnly</b>.
-<li> The wifi module has <b>removed HT Greenfield support, Holland (802.11a-like) PHY configuration, and Point Coordination Function (PCF)</b></li>
-<li> The wifi ErrorRateModel API has been extended to support <b>link-to-system models</b>.
-<li> <b>Nix-Vector routing</b> supports multiple interface addresses and can print out routing paths</b>.
-<li>The <b>TxOkHeader and TxErrHeader trace sources</b> of RegularWifiMac have been obsoleted and replaced by trace sources that better capture the result of a transmission: AckedMpdu (fired when an MPDU is successfully acknowledged, via either a Normal Ack or a Block Ack), NAckedMpdu (fired when an MPDU is negatively acknowledged via a Block Ack), DroppedMpdu (fired when an MPDU is dropped), MpduResponseTimeout (fired when a CTS is missing after an RTS or a Normal Ack is missing after an MPDU) and PsduResponseTimeout (fired when a BlockAck is missing after an A-MPDU or a BlockAckReq).</li>
-</ul>
-<h2>Changes to build system:</h2>
-<ul>
-<li> The handling of <b>Boost library/header dependencies</b> has been improved.</li>
-</ul>
-<h2>Changed behavior:</h2>
-<ul>
-<li>The default <b>TCP congestion control</b> has been changed from NewReno to CUBIC.</li>
-<li>The <b>PHY layer of the wifi module</b> has been refactored: the amendment-specific logic has been ported to <b>PhyEntity</b> classes and <b>WifiPpdu</b> classes.</li>
-<li>The <b>MAC layer of the wifi module</b> has been refactored. The MacLow class has been replaced by a hierarchy of FrameExchangeManager classes, each adding support for the frame exchange sequences introduced by a given amendment.</li>
-<li>The <b>wifi BCC AWGN error rate tables</b> have been aligned with the ones provided by MATLAB and users may note a few dB difference when using BCC at high SNR and high MCS.</li>
-<li><b>ThreeGppChannelModel has been fixed</b>: cluster and sub-cluster angles could have been generated with inclination angles outside the inclination range [0, pi], and have now been constrained to the correct range.</li>
-<li>The <b>LTE RLC Acknowledged Mode (AM) transmit buffer</b> is now limited by default to a size of (1024 * 10) bytes.  Configuration of unlimited behavior can still be made by passing the value of zero to the new attribute <b>MaxTxBufferSize</b>.</li>
-</ul>
-
-<hr>
-<h1>Changes from ns-3.32 to ns-3.33</h1>
-<h2>New API:</h2>
-<ul>
-<li>A model for <b>TCP CUBIC</b> (RFC 8312) has been added.</li>
-<li>New <b>channel models based on 3GPP TR 37.885</b> have been added to support vehicular simulations.</li>
-<li><b>Time::RoundTo (unit)</b> allows time to be rounded to the nearest integer multiple of unit</li>
-<li><b>UdpClient</b> now can report both transmitted and received bytes.</li>
-<li>A new <b>MPI Enable()</b> variant was introduced that takes a user-supplied MPI_Communicator, allowing for partitioning of the MPI processes.</li>
-<li>A <b>Length</b> class has been introduced to allow users to replace the use of raw numbers (ints, doubles) that have implicit lengths with a class that represents lengths with an explicit unit.</li>
-<li>A flexible <b>CsvReader</b> class has been introduced to allow users to read in csv- or tab-delimited data.</li>
-<li>The <b>ListPositionAllocator</b> can now input positions from a csv file.</li>
-<li>A new trace source for DCTCP alpha value has been added to <b>TcpDctcp</b>.</li>
-<li>A new <b>TableBasedErrorRateModel</b> has been added for Wi-Fi, and the default values are aligned with link-simulation results from MATLAB WLAN Toolbox and IEEE 802.11 TGn.
-</li>
-<li>A new <b>LdpcSupported</b> attribute has been added for Wi-Fi in <b>HtConfiguration</b>, in order to select LDPC FEC encoding instead of the default BCC FEC encoding.
-</li>
-</ul>
-<h2>Changes to existing API:</h2>
-<ul>
-<li> The signature of <b>WifiPhy::PsduTxBeginCallback</b> and <b>WifiPhy::PhyTxPsduBegin</b> have been changed to take a map of PSDUs instead of a single PSDU
-in order to support multi-users (MU) transmissions.
-</li>
-<li> The wifi trace <b>WifiPhy::PhyRxBegin</b> has been extended to report the received power for every band.
-</li>
-<li> The wifi trace <b>WifiPhy::PhyRxBegin</b> has been extended to report the received power for every band.
-</li>
-<li>New attributes <b>SpectrumWifiPhy::TxMaskInnerBandMinimumRejection</b>, <b>SpectrumWifiPhy::TxMaskOuterBandMinimumRejection</b> and <b>SpectrumWifiPhy::TxMaskOuterBandMaximumRejection</b> have been added to configure the OFDM transmit masks.
-</li>
-</ul>
-<h2>Changes to build system:</h2>
-<ul>
-<li>Waf has been upgraded to git development version waf-2.0.21-6-g60e3f5f4</li>
-</ul>
-<h2>Changed behavior:</h2>
-<ul>
-<li>The <b>default Wi-Fi ErrorRateModel</b> for the 802.11n/ac/ax standards has been changed from the NistErrorRateModel to a new TableBasedErrorRateModel.  Users may experience a shift in Wi-Fi link range due to the new default error model, as <b>the new model is more optimistic</b> (the PER for a given MCS will degrade at a lower SNR value). The Wi-Fi module documentation provides plots that compare the performance of the NIST and new table-based model.</li>
-<li>The default value of the <b>BerThreshold</b> attribute in <b>IdealWifiManager</b> was changed from 1e-5 to 1e-6, so as to correct behavior with high order MCS.</li>
-<li> <b>Time values that are created from an int64x64_t value</b> are now rounded to the nearest integer multiple of the unit, rather than truncated.  Issue #265 in the GitLab.com tracker describes the behavior that was fixed.  Some Time values that rely on this conversion may have changed due to this fix.</li>
-<li> TCP now implements the Linux-like <b>congestion window reduced (CWR)</b> state when explicit congestion notification (ECN) is enabled.</li>
-<li> <b>TcpDctcp</b> now inherits from <b>TcpLinuxReno</b>, making its congestion avoidance track more closely to that of Linux.</li>
-</ul>
-
-<hr>
-<h1>Changes from ns-3.31 to ns-3.32</h1>
-<h2>New API:</h2>
-<ul>
-<li>A new TCP congestion control, <b>TcpLinuxReno</b>, has been added.</li>
-<li>Added, to <b>PIE queue disc</b>, <b>queue delay calculation using timestamp</b> feature (Linux default behavior), <b>cap drop adjustment</b> feature (Section 5.5 of RFC 8033), <b>ECN</b> (Section 5.1 of RFC 8033) and <b>derandomization</b> feature (Section 5.4 of RFC 8033).</li>
-<li>Added <b>L4S Mode</b> to FqCoDel and CoDel queue discs</li>
-<li> A model for <b>dynamic pacing</b> has been added to TCP.</li>
-<li>Added <b>Active/Inactive feature</b> to PIE queue disc</li>
-<li>Added <b>netmap</b> and <b>DPDK</b> emulation device variants</li>
-<li>Added capability to configure <b>STL pair and containers as attributes</b></li>
-<li> Added <b>CartesianToGeographic</b> coordinate conversion capability</li>
-<li> Added <b>LollipopCounter</b>, a sequence number counter type</li>
-<li> Added <b>6 GHz band</b> support for Wi-Fi 802.11ax</li>
-</ul>
-<h2>Changes to existing API:</h2>
-<ul>
-<li>The <b>Sifs</b>, <b>Slot</b> and <b>Pifs</b> attributes have been moved from <b>WifiMac</b> to <b>WifiPhy</b> to better reflect that they are PHY characteristics, to decouple the MAC configuration from the PHY configuration and to ease the support for future standards.</li>
-<li>The Histogram class was moved from the flow-monitor module to the stats
-module to make it more easily accessed.  If you previously used Histogram by
-by including flow-monitor.h you will need to change that to stats-module.h.
-</li>
-<li>The <b>WifiHelper::SetStandard (WifiPhyStandard standard)</b> method no
-longer takes a WifiPhyStandard enum, but instead takes a similarly named 
-WifiStandard enum.  If before you specified a value such as WIFI_PHY_STANDARD_xxx, now you must specify WIFI_STANDARD_xxx.
-</li>
-<li> The <b>YansWifiPhyHelper::Default</b> and <b>SpectrumWifiPhyHelper::Default</b> methods have been removed; the default constructors may instead by used.</li>
-<li> <b>PIE</b> queue disc now uses <b>Timestamp</b> for queue delay calculation as default instead of <b>Dequeue Rate Estimator</b></li>
-</ul>
-<h2>Changes to build system:</h2>
-<ul>
-<li>Added "--enable-asserts" and "--enable-logs" to waf configure, to selectively enable asserts and/or logs in release and optimized builds.</li>
-<li>A build version reporting system has been added by extracting data from the 
-local git repository (or a standalone file if a git repository is not present).  </li>
-<li>Added support for EditorConfig</li>
-</ul>
-<h2>Changed behavior:</h2>
-<ul>
-<li>Support for <b>RIFS</b> has been dropped from wifi. RIFS has been obsoleted by the 802.11 standard and support for it was not implemented according to the standard.</li>
-<li>The default loss recovery algorithm for TCP has been changed from Classic Recovery to Proportional Rate Reduction (PRR).</li>
-<li>The behavior of <b>TcpPrrRecovery</b> algorithm was aligned to that of Linux.</li>
-<li> <b>PIE</b> queue disc now uses <b>Timestamp</b> for queue delay calculation as default instead of <b>Dequeue Rate Estimator</b></li>
-<li>TCP pacing, when enabled, now adjusts the rate dynamically based on the window size, rather than just enforcing a constant rate.</li>
-<li>WifiPhy forwards up MPDUs from an A-MPDU under reception as long as they arrive at the PHY, instead of forwarding up the whole A-MPDU once its reception is completed.</li>
-<li>The ns-3 TCP model was changed to set the initial congestion window to 10 segments instead of 1 segment (to align with default Linux configuration).</li>
-</ul>
-
-<hr>
-<h1>Changes from ns-3.30 to ns-3.31</h1>
-<h2>New API:</h2>
-<ul>
-<li> A <b>TCP DCTCP</b> model has been added.</li>
-<li> <b>3GPP TR 38.901</b> pathloss, channel condition, antenna array, and fast fading models have been added.</li>
-<li> New <b>...FailSafe ()</b> variants of the <b> Config </b> and <b>Config::MatchContainer</b> functions which set Attributes or connect TraceSources.  These all return a boolean indicating if any attributes could be set (or trace sources connected).  These are useful if you are not sure that the requested objects exist, for example in AnimationInterface.</li>
-<li> New attributes for <b> Ipv4L3Protocol</b> have been added to enable RFC 6621-based duplicate packet detection (DPD) (<b>EnableDuplicatePacketDetection</b>) and to control the cache expiration time (<b>DuplicateExpire</b>).</li>
-<li><b> MakeConsistent </b> method of <b> BuildingsHelper </b> class is 
-deprecated and moved to <b> MobilityBuildingInfo </b> class. <b> DoInitialize </b> 
-method of the <b> MobilityBuildingInfo </b> class would be responsible for making 
-the mobility model of a node consistent at the beginning of a simulation. 
-Therefore, there is no need for an explicit call to <b> MakeConsistent </b> in a simulation script.</li>
-<li> The <b> IsInside </b> method of <b> MobilityBuildingInfo </b> class is extended 
-to make the mobility model of a moving node consistent.</li>
-<li> The <b> IsOutside </b> method of <b> MobilityBuildingInfo </b> class is 
-deprecated. The <b> IsInside </b> method should be use to check the position of a node.</li>
-<li>A new abstract base class, <b>WifiAckPolicySelector</b>, is introduced to implement
-different techniques for selecting the acknowledgment policy for PSDUs containing
-QoS Data frames. Wifi, mesh and wave helpers provide a SetAckPolicySelectorForAc
-method to configure a specific ack policy selector for a given Access Category.</li>
-<ul>
-<li>The default ack policy selector is named <b>ConstantWifiAckPolicySelector</b>, which
-allows to choose between Block Ack policy and Implicit Block Ack Request policy and
-allows to request an acknowledgment after a configurable number of MPDUs have been
-transmitted.</li>
-</ul>
-<li>The <b>MaxSize</b> attribute is removed from the <b>QueueBase</b> base class and moved to subclasses. A new MaxSize attribute is therefore added to the DropTailQueue class, while the MaxQueueSize attribute of the WifiMacQueue class is renamed as MaxSize for API consistency.</li>
-<li> Two new <b>Application sequence number and timestamp</b> variants have been added, to support packet delivery tracing.
-<ul>
-<li> A new sequence and timestamp header variant for applications has been added.  The <b>SeqTsEchoHeader</b> contains an additional timestamp field for use in echoing a timestamp back to a sender.</li>
-<li> TCP-based applications (OnOffApplication, BulkSendApplication, and PacketSink) support a new header, <b>SeqTsSizeHeader</b>, to convey sequence number, timestamp, and size data.  Use is controlled by the "EnableSeqTsSizeHeader" attribute.</li>
-</ul>
-<li>Added a new trace source <b>PhyRxPayloadBegin</b> in WifiPhy for tracing begin of PSDU reception.</li>
-<li>Added the class <b>RandomWalk2dOutdoorMobilityModel</b> that models a random walk which does not enter any building.</li>
-<li>Added support for the <b>Cake set-associative hash</b> in the FqCoDel queue disc</li>
-<li>Added support for <b>ECN marking for CoDel and FqCoDel</b> queue discs</li>
-</ul>
-<h2>Changes to existing API:</h2>
-<ul>
-<li> The API for <b>enabling and disabling ECN</b> in TCP sockets has been refactored.</li>
-<li> The <b>LTE HARQ</b> related methods in LteEnbPhy and LteUePhy have been renamed, and the LteHelper updated.</li>
-<li> Previously the <b>Config::Connect</b> and <b>Config::Set</b> families of functions would fail silently if the attribute or trace source didn't exist on the path given (typically due to spelling errors). Now those functions will throw a fatal error.  If you need the old behavior use the new  <b>...FailSafe ()</b> variants.</li>
-<li>The internal TCP API for <b>TcpCongestionOps</b> has been extended to support the <b>CongControl</b> method to allow for delivery rate estimation feedback to the congestion control mechanism.</li>
-<li>Functions <b>LteEnbPhy::ReceiveUlHarqFeedback</b> and <b>LteUePhy::ReceiveLteDlHarqFeedback</b> are renamed to <b>LteEnbPhy::ReportUlHarqFeedback</b> and <b>LteUePhy::EnqueueDlHarqFeedback</b>, respectively to avoid confusion about their functionality. <b>LteHelper</b> is updated accordingly.</li>
-<li>Now on, instead of <b>uint8_t</b>, <b>uint16_t</b> would be used to store a bandwidth value in LTE.</li>
-<li>The preferred way to declare instances of <b>CommandLine</b> is now through a macro: <b>COMMANDLINE (cmd)</b>.  This enables us to add the <b>CommandLine::Usage()</b> message to the Doxygen for the program.</li>
-<li>New <b>...FailSafe ()</b> variants of the <b> Config </b> is used to connect PDCP TraceSources of eNB and UE in <b>RadioBearerStatsConnector</b> class. It is required for the simulations using RLC SM where PDCP objects are not created for data radio bearers.</li>
-<li><b>T310</b> timer in <b>LteUeRrc</b> class is stopped if the UE receives <b>RRCConnectionReconfiguration</b> including the <b>mobilityControlInfo</b>. This change is introduced following the 3GPP standard TS36331 sec 5.3.5.4.</li>
-<li>The wifi <b>High Latency tags</b> have been removed.  The only rate manager (Onoe) that was making use of them has been refactored.</li>
-<li>The wifi <b>MIMO diversity model</b> has been changed to better fit with MRC theory for AWGN channels when STBC is not used (since STBC is currently not supported).</li>
-<li> The <b>BuildingsHelper::MakeMobilityModelConsistent()</b> method is deprecated in favor of MobilityBuildingInfo::MakeConsistent</li>
-<li> The <b>MobilityBuildingInfo::IsOutdoor ()</b> method is deprecated; use the result of IsIndoor() method instead</li>
-<li> IsEqual() methods of class <b>Ipv4Address, Ipv4Mask, Ipv6Address, and Ipv6Prefix</b> are deprecated.</li>
-<li> The API around the <b>wifi Txop class</b> was refactored.</li>
-</ul>
-<h2>Changes to build system:</h2>
-<ul>
-<li>The <b>--lcov-report</b> option to Waf was fixed, and a new <b>--lcov-zerocounters</b> option was added to improve support for lcov.</li>
-<li>Python bindings were enabled for <b>netanim</b>.</li>
-</ul>
-<h2>Changed behavior:</h2>
-<ul>
-<li> The <b>EmpiricalRandomVariable</b> no longer linearly interpolates between values by default, but instead will default to treating the CDF as a histogram and return one of the specific inputs.  The previous interpolation mode can be configured by an attribute.</li>
-<li> (as reported above) previously the <b>Config::Connect</b> and <b>Config::Set</b> families of functions would fail silently if the attribute or trace source didn't exist on the path given (typically due to spelling errors). Now those functions will throw a fatal error.  If you need the old behavior use the new  <b>...FailSafe ()</b> variants.</li>
-<li> Attempting to deserialize an enum name which wasn't registered with <b>MakeEnumChecker</b> now causes a fatal error, rather failing silently. (This can be triggered by setting an enum Attribute from a StringValue.)</li>
-<li> As a result of the above API changes in <b> MobilityBuildingInfo </b> 
-and <b> BuildingsHelper </b> classes, a building aware pathloss models, e.g., 
-<b> HybridBuildingsPropagationLossModel </b> is now able to accurately compute 
-the pathloss for a node moving in and out of buildings in a simulation. See <a href=https://gitlab.com/nsnam/ns-3-dev/issues/80>issue 80</a> 
-for discussion.</li>
-<li> The implementation of the <b>Wi-Fi channel access</b> functions has been improved
-to make them more conformant to the IEEE 802.11-2016 standard. Concerning the DCF,
-the backoff procedure is no longer invoked when a packet is queued for transmission
-and the medium has not been idle for a DIFS, but it is invoked if the medium is busy
-or does not remain idle for a DIFS after the packet has been queued. Concerning the
-EDCAF, tranmissions are now correctly aligned at slot boundaries.</li>
-<li> Various wifi physical layer behavior around channel occupancy calculation, phy state calculation, and handling different channel widths has been updated.</li>
-</ul>
-
-<hr>
-<h1>Changes from ns-3.29 to ns-3.30</h1>
-<h2>New API:</h2>
-<ul>
-<li>Added the attribute <b>Release</b> to the class <b>EpsBearer</b>, to select the release (e.g., release 15)</li>
-<li>The attributes <b>RegularWifiMac::HtSupported</b>, <b>RegularWifiMac::VhtSupported</b>, <b>RegularWifiMac::HeSupported</b>, <b>RegularWifiMac::RifsSupported</b>, <b>WifiPhy::ShortGuardEnabled</b>, <b>WifiPhy::GuardInterval</b> and <b>WifiPhy::GreenfieldEnabled</b> have been deprecated. Instead, it is advised to use <b>WifiNetDevice::HtConfiguration</b>, <b>WifiNetDevice::VhtConfiguration</b> and <b>WifiNetDevice::HeConfiguration</b>.</li>
-<li>The attributes <b>{Ht,Vht,He}Configuration::{Vo,Vi,Be,Bk}MaxAmsduSize</b> and <b>{Ht,Vht,He}Configuration::{Vo,Vi,Be,Bk}MaxAmpduSize</b> have been removed. Instead, it is necessary to use <b>RegularWifiMac::{VO, VI, BE, BK}_MaxAmsduSize</b> and <b>RegularWifiMac::{VO, VI, BE, BK}_MaxAmpduSize</b>.</li>
-<li>A new attribute <b>WifiPhy::PostReceptionErrorModel</b> has been added to force specific packet drops.</li>
-<li>A new attribute <b>WifiPhy::PreambleDetectionModel</b> has been added to decide whether PHY preambles are successfully detected.</li>
-<li>New attributes <b>QosTxop::AddBaResponseTimeout</b> and <b>QosTxop::FailedAddBaTimeout</b> have been added to set the timeout to wait for an ADDBA response after the ACK to the ADDBA request is received and to set the timeout after a failed BA agreement, respectively.</li>
-<li>A new attribute <b>QosTxop::UseExpliciteBarAfterMissedBlockAck</b> has been added to specify whether explicit Block Ack Request should be sent upon missed Block Ack Response.</li>
-<li>Added a new trace source <b>EndOfHePreamble</b> in WifiPhy for tracing end of preamble (after training fields) for received 802.11ax packets.</li>
-<li>Added a new helper method to SpectrumWifiPhyHelper and YansWifiPhyHelper to set the <b>frame capture model</b>.</li>
-<li>Added a new helper method to SpectrumWifiPhyHelper and YansWifiPhyHelper to set the <b>preamble detection model</b>.</li>
-<li>Added a new helper method to WifiPhyHelper to disable the preamble detection model.</li>
-<li>Added a method to ObjectFactory to check whether a TypeId has been configured on the factory.</li>
-<li>Added a new helper method to WifiHelper to set the <b>802.11ax OBSS PD spatial reuse algorithm</b>.</li>
-<li>Added the <b>Cobalt queuing discipline</b>.</li>
-<li>Added <b>Simulator::GetEventCount ()</b> to return the number of events executed.</li> 
-<li>Added <b>ShowProgress</b> object to display simulation progress statistics.</li>
-<li>Add option to disable explicit Block Ack Request when a Block Ack Response is missed.</li>
-<li>Add API to be able to tag a subset of bytes in an ns3::Packet.</li>
-<li>New LTE helper API has been added to allow users to configure LTE backhaul links with any link technology, not just point-to-point links.</li>
-</ul>
-<h2>Changes to existing API:</h2>
-<ul>
-  <li>
-    Added the possibility of setting the z coordinate for many position-allocation classes: <b>GridPositionAllocator, RandomRectanglePositionAllocator, RandomDiscPositionAllocator, UniformDiscPositionAllocator</b>.
-  </li>
-  <li>
-    The WifiPhy attribute <b>CcaMode1Threshold</b> has been renamed to <b>CcaEdThreshold</b>, 
-    and the WifiPhy attribute <b>EnergyDetectionThreshold</b> has been replaced by a new attribute called <b>RxSensitivity</b>.
-  </li>
-  <li>
-    It is now possible to know the size of the SpectrumValue underlying std::vector, as well as
-    accessing read-only every element of it.
-  </li>
-  <li>
-    The <b>GetClosestSide</b> method of the Rectangle class returns the correct closest side also for positions outside the rectangle.
-  </li>
-  <li> The trace sources <b>BackoffTrace</b> and <b>CwTrace</b> were moved from class QosTxop to base class Txop, allowing these values to be traced for DCF operation.  In addition, the trace signature for BackoffTrace was changed from TracedValue to TracedCallback (callback taking one argument instead of two).  Most users of CwTrace for QosTxop configurations will not need to change existing programs, but users of BackoffTrace will need to adjust the callback signature to match.
-  </li>
-  <li> New trace sources, namely <b>DrbCreated, Srb1Created and DrbCreated</b> have beed implemented in LteEnbRrc and LteUeRrc classes repectively. These new traces are used to improve the connection of the RLC and PDCP stats in the RadioBearerStatsConnector API.
-  </li>
-  <li> <b>TraceFadingLossModel</b> has been moved from lte to spectrum module.
-  </li>
-</ul>
-<h2>Changes to build system:</h2>
-<ul>
-  <li><b>ns-3 now only supports Python 3</b>.  Use of Python 2 can be forced using the --with-python option provided to './waf configure', and may still work for many cases, but is no longer supported.  Waf does not default to Python 3 but the ns-3 wscript will default the build to Python 3.
-  </li>
-  <li>Waf upgraded from 2.0.9 to 2.0.18.
-  </li>
-  <li> Options to run a program through Waf without invoking a project rebuild have been added.  The command './waf --run-no-build <program-name>' parallels the behavior of './waf --run <program-name>' and, likewise, the command './waf --pyrun-no-build' parallels the behavior of './waf --pyrun <program-name>'.
-  </li>
-</ul>
-<h2>Changed behavior:</h2>
-<ul>
-  <li>The wifi ADDBA handshake process is now protected with the use of two timeouts who makes sure we do not end up in a blocked situation. If the handshake process is not established, packets that are in the queue are sent as normal MPDUs. Once handshake is successfully established, A-MPDUs can be transmitted.</li>
-  <li> In the wifi module, the default value of the <b>Margin</b> attribute in SimpleFrameCaptureModel was changed from 10 to 5 dB.</li>
-  <li> A <b>ThresholdPreambleDetectionModel</b> is added by default to the WifiPhy.  Using default values, this model will discard frames that fall below either -82 dBm RSSI or below 4 dB SNR.  Users may notice that weak wifi signals that were successfully received based on the error model alone (in previous ns-3 releases) are no longer received.  Previous behavior can be obtained by lowering both threshold values or by removing the preamble detection model (via WifiPhyHelper::DisablePreambleDetectionModel()).</li>
-  <li>The PHY model for Wi-Fi has been extended to handle reception of L-SIG and reception of non-legacy header differently.</li>
-  <li>LTE/EPC model has been enhanced to allow the simulation user to test more realistic topologies related to the core network:</li>
-    <ul>
-      <li>SGW, PGW and MME are full nodes.</li>
-      <li>There are P2P links between core network nodes.</li>
-      <li>New S5 interface between SGW and PGW nodes based on GTPv2-C protocol.</li>
-      <li>Allow simulations with multiple SGWs and PGWs.</li>
-    </ul>
-  </li>
-  <li>LTE eNB RRC is extended to support:</li>
-    <ul>
-      <li>S1 signalling with the core network is initiated after the RRC connection establishment procedure is finished.</li>
-      <li>New ATTACH_REQUEST state to wait for finalization of the S1 signalling with the core network.</li>
-      <li>New InitialContextSetupRequest primitive of the S1 SAP that is received by the eNB RRC when the S1 signalling from the core network is finished.</li>
-    </ul>
-  </li>
-  <li> A new buffer has been introduced in the LteEnbRrc class. This buffer will be used by a target eNB during handover to buffer the packets comming from a source eNB on X2 inteface. The target eNB will buffer this data until it receives RRC Connection Reconfiguration Complete from a UE.
-  </li>
-  <li> The default qdisc installed on single-queue devices (such as PointToPoint, Csma and Simple) is now <b>FqCoDel</b> (instead of PfifoFast). On multi-queue devices (such as Wifi), the default root qdisc is now <b>Mq</b> with as many FqCoDel child qdiscs as the number of device queues. The new defaults are motivated by the willingness to align with the behavior of major Linux distributions and by the need to preserve the effectiveness of Wifi EDCA Functions in differentiating Access Categories (see issue #35).</li>
-  <li>LTE RLC TM mode does not report anymore the layer-to-layer delay, as it misses (by standard) an header to which attach the timestamp tag. Users can switch to the PDCP layer delay measurements, which must be the same.</li>
-  <li> Token Bank Fair Queue Scheduler (ns3::FdTbfqFfMacScheduler) will not anymore schedule a UE, which does not have any RBG left after removng the RBG from its allocation map if the computed TB size is greater than the "budget" computed in the scheduler.
-  </li>
-  <li> LTE module now supports the <b>Radio Link Failure (RLF)</b> functionality. This implementation introduced following key behavioral changes:
-    <ul>
-      <li> The UE RRC state will not remain in "CONNECTED_NORMALLY" state if the DL control channel SINR is below a set threshold.</li>
-      <li> The LTE RRC protocol APIs of UE i.e., LteUeRrcProtocolIdeal, LteUeRrcProtocolReal have been extended to send an ideal (i.e., using SAPs instead to transmitting over the air) UE context remove request to the eNB. Similarly, the eNB RRC protocol APIs, i.e, LteEnbRrcProtocolIdeal and LteEnbRrcProtocolReal have been extended to receive this ideal UE context remove request.</li>
-      <li> The UE will not synchronize to a cell whose RSRP is less than -140 dBm.</li>
-      <li> The non-contention based preambles during a handover are re-assigning to an UE only if it has not been assign to another UE (An UE can be using the preamble even after the expiryTime duration).</li>
-      <li> The RachConfigCommon structure in LteRrcSap API has been extended to include "TxFailParam". This new field would enable an eNB to indicate how many times T300 timer can expire at the UE. Upon reaching this count, the UE aborts the connection establishment, and performs the cell selection again. See TS 36.331 5.3.3.6. </li>
-      <li> The timer T300 in LteUeRrc class is now bounded by the standard min and max values defined in 3GPP TS 36.331.</li>
-    </ul>
-  </li>
-</ul>
-
-<hr>
-<h1>Changes from ns-3.28 to ns-3.29</h1>
-<h2>New API:</h2>
-<ul>
-  <li> CommandLine can now handle non-option (positional) arguments. </li>
-  <li> Added CommandLine::Parse (const std::vector<std::string>> args) </li>
-  <li> NS_LOG_FUNCTION can now log the contents of vectors </li>
-  <li> A new position allocator has been added to the buildings module, allowing
-nodes to be placed outside of buildings defined in the scenario.</li>
-  <li> The Hash() method has been added to the QueueDiscItem class to compute the
-    hash of various fields of the packet header (depending on the packet type).</li>
-  <li> Added a priority queue disc (PrioQueueDisc).</li>
-  <li> Added 3GPP HTTP model
-  <li> Added TCP PRR as recovery algorithm
-  <li> Added a new trace source in StaWifiMac for tracing beacon arrivals</li>
-  <li> Added a new helper method to ApplicationContainer to start applications with some jitter around the start time</li>
-  <li> (network) Add a method to check whether a node with a given ID is within a NodeContainer.</li>
-
-</ul>
-<h2>Changes to existing API:</h2>
-<ul>
-  <li>TrafficControlHelper::Install now only includes root queue discs in the returned
-    QueueDiscContainer.</li>
-  <li>Recovery algorithms are now in a different class, instead of being tied to TcpSocketBase.
-    Take a look to TcpRecoveryOps for more information.</li>
-  <li>The Mode, MaxPackets and MaxBytes attributes of the Queue class, that had been deprecated in favor of the MaxSize attribute in ns-3.28, have now been removed and cannot be used anymore. Likewise, the methods to get/set the old attributes have been removed as well.  Commands such as:
-<pre>
-  Config::SetDefault ("ns3::QueueBase::MaxPackets", UintegerValue (4));
-</pre>
-should now be written as:
-<pre>
-  Config::SetDefault ("ns3::QueueBase::MaxSize", QueueSizeValue (QueueSize (QueueSizeUnit::PACKETS, 4)));
-</pre>
-or with a string value with 'b' (bytes) or 'p' (packets) suffix, such as:
-<pre>
-  Config::SetDefault ("ns3::QueueBase::MaxSize", StringValue ("4p"));
-</pre>
-  </li>
-  <li>The Limit attribute of the PfifoFastQueueDisc class, that had been deprecated in favor of the MaxSize attribute in ns-3.28, has now been removed and cannot be used anymore. Likewise, the methods to get/set the old Limit attribute have been removed as well. The GetMaxSize/SetMaxSize methods of the base QueueDisc class must be used instead.</li>
-  <li>The Mode, MaxPackets and MaxBytes attributes of the CoDelQueueDisc class, that had been deprecated in favor of the MaxSize attribute in ns-3.28, have now been removed and cannot be used anymore. Likewise, the methods to get/set the old attributes have been removed as well. The GetMaxSize/SetMaxSize methods of the base QueueDisc class must be used instead.</li>
-  <li>The PacketLimit attribute of the FqCoDelQueueDisc class, that had been deprecated in favor of the MaxSize attribute in ns-3.28, has now been removed and cannot be used anymore. Likewise, the methods to get/set the old PacketLimit attribute have been removed as well. The GetMaxSize/SetMaxSize methods of the base QueueDisc class must be used instead.</li>
-  <li>The Mode and QueueLimit attributes of the PieQueueDisc class, that had been deprecated in favor of the MaxSize attribute in ns-3.28, have now been removed and cannot be used anymore. Likewise, the methods to get/set the old attributes have been removed as well. The GetMaxSize/SetMaxSize methods of the base QueueDisc class must be used instead.</li>
-  <li>The Mode and QueueLimit attributes of the RedQueueDisc class, that had been deprecated in favor of the MaxSize attribute in ns-3.28, have now been removed and cannot be used anymore. Likewise, the methods to get/set the old attributes have been removed as well. The GetMaxSize/SetMaxSize methods of the base QueueDisc class must be used instead.</li>
-  <li> Several traffic generating applications have additional trace sources that export not only the transmitted or received packet but also the source and destination addresses.</li>
-  <li>The returned type of <b>GetNDevices</b> methods in <b>Channel</b> and subclasses derived from it were changed from uint32_t to std::size_t. Likewise, the input parameter type of <b>GetDevice</b> in <b>Channel</b> and its subclasses were changed from uint32_t to std::size_t.</li>
-  <li>Wifi classes <b>DcfManager</b>, <b>DcaTxop</b> and <b>EdcaTxopN</b> were renamed to <b>ChannelAccessManager</b>, <b>Txop</b> and <b>QosTxop</b>, respectively.</li>
-  <li>QueueDisc::DequeuePeeked has been merged into QueueDisc::Dequeue and hence no longer exists.</li>
-  <li>The QueueDisc base class now provides a default implementation of the DoPeek private method
-  based on the QueueDisc::PeekDequeue method, which is now no longer available.</li>
-  <li>The QueueDisc::SojournTime trace source is changed from a TracedValue to a TracedCallback; callbacks that hook this trace must provide one ns3::Time argument, not two.</li>
-  <li>To avoid the code duplication in SingleModelSpectrumChannel and MultiModelSpectrumChannel classes, the attributes MaxLossDb and PropagationLossModel, and the traces PathLoss and TxSigParams are moved to the base class SpectrumChannel. Similarly, the functions AddPropagationLossModel, AddSpectrumPropagationLossModel, SetPropagationDelayModel and GetSpectrumPropagationLossModel are now defined in SpectrumChannel class. Moreover, the TracedCallback signature of LossTracedCallback has been updated from :
-  <pre>
-   typedef void (* LossTracedCallback) (Ptr&#60;SpectrumPhy&#62 txPhy, Ptr&#60;SpectrumPhy&#62 rxPhy, double lossDb);
-  </pre>
-   To :
-  <pre>
-   typedef void (* LossTracedCallback) (Ptr&#60;const SpectrumPhy&#62 txPhy, Ptr&#60;const SpectrumPhy&#62 rxPhy, double lossDb);
-  </pre></li>
-  <li>For the sake of LTE module API consistency the IPV6 related functions AssignUeIpv6Address and GetUeDefaultGatewayAddress6 are now declared in EpcHelper base class. Thus, these functions are now declared as virtual in the child classes, i.e., EmuEpcHelper and PointToPointEpcHelper.</li>
-</ul>
-<h2>Changes to build system:</h2>
-<ul>
-  <li>Waf upgraded from 1.8.19 to 2.0.9, and ns-3 build scripts aligned to the new API.</li>
-  <li>The '--no32bit-scan' argument is removed from Waf apiscan; generation of ILP32 bindings is now automated from the LP64 bindings.</li>
-  <li> When using on newer compilers, new warnings may trigger build failures.
-The --disable-werror flag can be passed to Waf at configuration time to turn
-off the Werror behavior.</li>
-  <li> GTK+3 libraries (including PyGObject, GooCanvas2) are needed for the Pyviz visualizer, replacing GTK+2 libraries.</li>
-</ul>
-<h2>Changed behavior:</h2>
-<ul>
-  <li>FqCoDelQueueDisc now computes the hash of the packet's 5-tuple to determine
-    the flow the packet belongs to, unless a packet filter has been configured.
-    The previous behavior is simply obtained by not configuring any packet filter.
-    Consequently, the FqCoDelIpv{4,6}PacketFilter classes have been removed.</li>
-  <li> ARP packets now pass through the traffic control layer, as in Linux. </li>
-  <li> The maximum size UDP packet of the UdpClient application is no longer limited to 1500 bytes.</li>
-  <li> The default values of the <b>MaxSlrc</b> and <b>FragmentationThreshold</b> attributes in WifiRemoteStationManager were changed from 7 to 4 and from 2346 to 65535, respectively.
-</ul>
-
-<hr>
-<h1>Changes from ns-3.27 to ns-3.28</h1>
-<h2>New API:</h2>
-<ul>
-  <li> When deserializing Packet contents, <b>Header::Deserialize (Buffer::Iterator start)</b> and <b>Trailer::Deserialize (Buffer::Iterator start)</b> can not successfully deserialize variable-length headers and trailers.  New variants of these methods that also include an 'end' parameter are now provided.</li>
-  <li> Ipv[4,6]AddressGenerator can now check if an address is allocated (<b>Ipv[4,6]AddressGenerator::IsAddressAllocated</b>) or a network has some allocated address (<b>Ipv[4,6]AddressGenerator::IsNetworkAllocated</b>).</li>
-  <li> LTE UEs can now use IPv6 to send and receive traffic.</li>
-  <li> UAN module now supports an IP stack.</li>
-  <li> Class <b>TcpSocketBase</b> trace source <i>CongestionWindowInflated</i> shows the values with the in-recovery inflation and the post-recovery deflation.
-  <li> Added a FIFO queue disc (FifoQueueDisc) and the Token Bucket Filter (TbfQueueDisc).</li>
-</ul>
-<h2>Changes to existing API:</h2>
-<ul>
-  <li> Class <b>LrWpanMac</b> now supports extended addressing mode. Both <b>McpsDataRequest</b> and <b>PdDataIndication</b> methods will now use extended addressing if <b>McpsDataRequestParams::m_srcAddrMode</b> or <b>McpsDataRequestParams::m_dstAddrMode</b> are set to <b>EXT_ADDR</b>.</li>
-  <li> Class <b>LteUeNetDevice</b> MAC address is now a 64-bit address and can be set during construction.</li>
-  <li> Class <b>TcpSocketBase</b> trace source <i>CongestionWindow</i> shows the values without the in-recovery inflation and the post-recovery deflation; the old behavior has been moved to the new trace source <i>CongestionWindowInflated</i>.
-  <li>The Mode, MaxPackets and MaxBytes attributes of the Queue class have been deprecated in favor of the MaxSize attribute. Old attributes can still be used, but using them will be no longer possible in one of the next releases. The methods to get/set the old attributes will be removed as well.</li>
-  <li>The attributes of the QueueDisc subclasses that separately determine the mode and the limit of the QueueDisc have been deprecated in favor of the single MaxSize attribute.</li>
-  <li>The GetQueueSize method of some QueueDisc subclasses (e.g., RED) has been removed and replaced by the GetCurrentSize method of the QueueDisc base class.</li>
-</ul>
-<h2>Changes to build system:</h2>
-<ul>
-  <li> The C++ standard used during compilation (default std=c++11) can be now be changed via the CXXFLAGS variable.</li>
-</ul>
-<h2>Changed behavior:</h2>
-<ul>
-  <li>All Wi-Fi management frames are now transmitted using the lowest basic rate.</li>
-  <li>The Wi-Fi spectrum model now takes into account adjacent channels through OFDM transmit spectrum masks.</li>
-  <li> The CsmaNetDevice::PhyTxBeginTrace will trace all attempts to transmit, even those that result in drops. Previously, eventual channel drops were excluded from this trace.</l>
-  <li>The TCP congestion window trace now does not report on window inflation during fast recovery phase because it is no longer internally maintained as an inflated value (a separate trace called CongestionWindowInflated can be used to recover the old trace behavior).</li>
-</ul>
-
-<hr>
-<h1>Changes from ns-3.26 to ns-3.27</h1>
-<h2>New API:</h2>
-<ul>
-<li>Added <code>Vector{2,3}D.GetLength ()</code>.</li>
-<li>Overloaded <code>operator+</code> and <code>operator-</code> for <code>Vector{2,3}D</code>.</li>
-<li>Added iterator version of WifiHelper::Install() to install Wi-Fi devices on range of nodes.</li>
-<li>Added a new attribute in TcpSocketBase to track the advertised window.</li>
-<li>Included the model of <b>TCP Ledbat</b>.</li>
-<li>Included the TCP SACK-based loss recovery algorithm outlined in RFC 6675.</li>
-<li>Added <b>TCP SACK</b> and the <b>SACK emulation</b>. Added an Attribute to TcpSocketBase class,
-    called "Sack", to enable or disable the SACK option usage.</li>
-<li>In 'src/wifi', several changes were made to enable partial <b>802.11ax</b> High Efficiency (HE) support:
-    <ul>
-      <li>A new standard value has been added that enables the new 11ax data rates.</li>
-      <li>A new 11ax preamble has been added.</li>
-      <li>A new attribute was added to configure the guard interval duration for High Efficiency (HE) PHY entities. This attribute can be set using the YansWifiPhyHelper.</li>
-      <li>A new information element has been added:  HeCapabilities. This information element is added to the MAC frame header if the node is a HE node. This HeCapabilites information element is used to advertise the HE capabilities of the node to other nodes in the network.</li>
-    </ul>
-</li>
-<li> A new class were added for the RRPAA WiFi rate control mechanism.</li>
-<li>Included carrier aggregation feature in LTE module</li>
-    <ul>
-      <li>LTE model is extended to support carrier aggregation feature according to 3GPP Release 10, for up to 5 component 
-      carriers. </li>
-      <li>InstallSingleEnbDevice and InstalSingeUeDevice functions of LteHelper are now constructing LteEnbDevice and LteUeDevice 
-      according to CA architecture. Each device, UE and eNodeB contains an instance of component carrier manager, and may 
-      have several component carrier instances.</li>
-      <li>SAP interfaces are extended to include CA message exchange functionality.</li>
-      <li>RRC connection procedure is extended to allow RRC connection reconfiguration for the configuration of the secondary carriers.</li>
-      <li>RRC measurement reporting is extended to allow measurement reporting from the secondary carriers.</li>
-      <li>LTE traces are extended to include component carrier id.</li>
-    </ul>
-</li>
-<li>Function <b>PrintRoutingTable</b> has been extended to add an optional Time::Units
-    parameter to specify the time units used on the report.  The new parameter is
-    optional and if not specified defaults to the previous behavior (Time::S).
-</li>
-<li><b>TxopTrace</b>: new trace source exported by EdcaTxopN.</li>
-<li>A <b>GetDscpCounts</b> method is added to <b>Ipv4FlowClassifier</b> and <b>Ipv6FlowClassifier</b>
-    which returns a vector of pairs (dscp,count), each of which indicates how many packets with the
-    associated dscp value have been classified for a given flow.
-</li>
-<li>MqQueueDisc, a multi-queue aware queue disc modelled after the mq qdisc in Linux, has been introduced.
-</li>
-<li>Two new methods, <b>QueueDisc::DropBeforeEnqueue()</b> and <b>QueueDisc::DropAfterDequeue()</b> have
-    been introduced to replace <b>QueueDisc::Drop()</b>. These new methods require the caller to specify the
-    reason why a packet was dropped. Correspondingly, two new trace sources ("DropBeforeEnqueue" and
-    "DropAfterDequeue") have been added to the QueueDisc class, providing both the items that were dropped
-    and the reason why they were dropped. 
-</li>
-<li>Added <b>QueueDisc::GetStats()</b> which returns detailed statistics about the operations of
-    a queue disc. Statistics can be accessed through the member variables of the returned object and
-    by calling the <b>GetNDroppedPackets()</b>, <b>GetNDroppedBytes()</b>, <b>GetNMarkedPackets()</b> and <b>GetNMarkedBytes()</b> methods on the returned object. Such methods return the number of packets/bytes
-    dropped/marked for the specified reason (passed as argument). Consequently:
-    <ul>
-      <li>A number of methods of the QueueDisc class have been removed: <b>GetTotalReceivedPackets()</b>,
-      <b>GetTotalReceivedBytes()</b>, <b>GetTotalDroppedPackets()</b>, <b>GetTotalDroppedBytes()</b>,
-      <b>GetTotalRequeuedPackets()</b>, <b>GetTotalRequeuedBytes()</b>.</li>
-      <li>The <b>Stats</b> struct and the <b>GetStats()</b> method of <b>RedQueueDisc</b> and <b>PieQueueDisc</b> have been removed and replaced by those of the QueueDisc base class.</li>
-      <li>The <b>GetDropOverLimit</b> and <b>GetDropCount</b> methods of <b>CoDelQueueDisc</b> have been removed.
-      The values they returned can be obtained by calling, respectively,
-      GetStats ().GetNDroppedPackets (CoDelQueueDisc::OVERLIMIT_DROP) and
-      GetStats ().GetNDroppedPackets (CoDelQueueDisc::TARGET_EXCEEDED_DROP). The "DropCount" trace of
-      <b>CoDelQueueDisc</b> has been removed as well. Packets dropped because the target is exceeded can
-      be obtained through the new "DropAfterDequeue" trace of the QueueDisc class.</li>
-    </ul>
-</li>
-<li> The new <b>QueueDisc::Mark()</b> method has been introduced to allow subclasses to request to mark a packet.
-     The  caller must specify the reason why the packet must be marked. Correspondingly, a new trace source ("Mark")
-     has been added to the QueueDisc class, providing both the items that were marked and the reason why they
-     were marked.
-</li>
-<li>A new trace source, <b>SojournTime</b>, is exported by the QueueDisc base class to provide the
-    sojourn time of every packet dequeued from a queue disc. This has been made possible by adding a
-    timestamp to QueueDiscItem objects, which can be set/get through the new <b>GetTimeStamp()</b> and
-    <b>SetTimeStamp()</b> methods of the QueueDiscItem class. The <b>CoDel</b> queue disc now makes use of such feature of the base class, hence its Sojourn trace source and the CoDelTimestampTag class
-    have been removed.
-</li>
-</ul>
-<h2>Changes to existing API:</h2>
-<ul>
-<li><b>ParetoRandomVariable</b> "Mean" attribute has been deprecated, 
-    the "Scale" Attribute have to be used instead.
-    Changing the Mean attribute has no more an effect on the distribution.
-    See the documentation for the relationship between Mean, Scale and Shape. 
-</li>
-<li>The default logging timestamp precision has been changed from 6 digits
-    to 9 digits, with a fixed format to ensure that 9 digits to the right of
-    the decimal point are always printed.  Previously, default C++ iostream
-    precision and formatting was used.
-</li>
-<li>Abstract base class <b>WifiChannel</b> has been removed. As a result, a Channel type instead of a WifiChannel type
-is now exported by WifiNetDevice.</li>
-<li> The <b>GetPacketSize</b> method of <b>QueueItem</b> has been renamed <b>GetSize</b>
-</li>
-<li> The <b>DequeueAll</b> method of <b>Queue</b> has been renamed <b>Flush</b>
-</li>
-<li>The attributes <b>WifiPhy::TxAntennas</b> and <b>WifiPhy::RxAntennas</b>,
-    and the related accessor methods, were replaced by <b>WifiPhy::MaxSupportedTxSpatialStreams</b>
-    and <b>WifiPhy::MaxSupportedRxSpatialStreams</b>. A new attribute <b>WifiPhy::Antennas</b>
-    was added to allow users to define the number of physical antennas on the device.
-</li>
-<li>Sockets do not receive anymore broadcast packets, unless they are bound to an "Any" address (0.0.0.0)
-    or to a subnet-directed broadcast packet (e.g., x.y.z.0 for a /24 noterok).
-    As in Linux, the following rules are now enforced:
-    <ul>
-    <li> A socket bound to 0.0.0.0 will receive everything.</li>
-    <li> A socket bound to x.y.z.0/24 will receive subnet-directed broadcast (x.y.z.255) and unicast packets.</li>
-    <li> A socket bound to x.y.z.w will only receive unicast packets.</li>
-    </ul> 
-    <b>Previously, a socket bound to an unicast address received also subnet-directed broadcast packets. 
-    This is not anymore possible</b>.
-</li>
-<li>You can now Bind as many socket as you want to an address/port, provided that they are bound to different NetDevices.
-    Moreover, BindToNetDevice does not anymore call Bind. In other terms, Bind and BindToNetDevice can be called
-    in any order.
-    However, it is suggested to use BindToNetDevice <i>before</i> Bind in order to avoid conflicts.
-</li>
-</ul>
-<h2>Changes to build system:</h2>
-<ul>
-<li> The API scanning process for Python bindings now relies on CastXML, and only 64-bit scans are presently supported (Linux 64-bit systems).  Generation of 32-bit scans is documented in the Python chapter of the ns-3 manual.
-</li>
-<li> Modules can now be located in the 'contrib/' directory in addition to 'src/'
-</li>
-<li> Behavior for running Python programs was aligned with that of C++ programs; the list of modules built is no longer printed out.
-</li>
-</ul>
-<h2>Changed behavior:</h2>
-<ul>
-<li><b>MultiModelSpectrumChannel</b> does not call StartRx for receivers that
-    operate on subbands orthogonal to transmitter subbands. Models that depend
-    on receiving signals with zero power spectral density from orthogonal bands
-    may change their behavior.
-    See <a href=https://www.nsnam.org/bugzilla/show_bug.cgi?id=2467>bug 2467</a>
-    for discussion.
-</li>
-<li><b>Packet Tag objects</b> are no longer constrained to fit within 21 
-    bytes; a maximum size is no longer enforced.
-</li>
-  <li> The default value of the <b>TxGain</b> and <b>RxGain</b> attributes in WifiPhy was changed from 1 dB to 0 dB.
-  </li>
-  <li> The reported SNR by WifiPhy::MonitorSnifferRx did not include the RxNoiseFigure, but now does; see <a href=https://www.nsnam.org/bugzilla/show_bug.cgi?id=2783>bug 2783</a> for discussion.
-  </li>
-<li><b>Queue</b> has been redesigned as a template class object, where the type parameter
-    specifies the type of items to be stored in the queue. As a consequence:
-    <ul>
-      <li>Being a subclass of Queue, <b>DropTailQueue</b> is a template class as well.
-      <li>Network devices such as SimpleNetDevice, PointToPointNetDevice and CsmaNetDevice
-      use a queue of type Queue&lt;Packet&gt; to store the packets to transmit. The SetQueue
-      method of their helpers, however, can still be invoked as, e.g.,
-      SetQueue ("ns3::DropTailQueue") instead of, e.g., SetQueue
-      ("ns3::DropTailQueue&lt;Packet&gt;").</li>
-      <li>The attributes <b>Mode</b>, <b>MaxPackets</b> and <b>MaxBytes</b> are now
-      defined by the QueueBase class (which Queue is derived from).</li>
-    </ul>
-</li>
-<li>Queue discs that can operate both in packet mode and byte mode (Red, CoDel, Pie) define their own
-    enum QueueDiscMode instead of using QueueBase::QueueMode.
-</li>
-<li>The CoDel, PIE and RED queue discs require that the size of the internal queue is the same as
-    the queue disc limit (previously, it was allowed to be greater than or equal).
-</li>
-  <li> The default value of the <b>EnableBeaconJitter</b> attribute in ApWifiMac was changed from false to true.
-  </li>
-  <li> The NormalClose() callback of a TcpSocket object used to fire upon leaving TIME_WAIT state (2*MSL after FINs have been exchanged).  It now fires upon entering TIME_WAIT state.  Timing of the callback for the other path to state CLOSED (through LAST_ACK) has not been changed.
-  </li>
-</ul>
-
-<hr>
-<h1>Changes from ns-3.25 to ns-3.26</h1>
-<h2>New API:</h2>
-<ul>
-<li>A <b>SocketPriorityTag</b> is introduced to carry the packet priority. Such a tag
-    is added to packets by sockets that support this mechanism (UdpSocketImpl,
-    TcpSocketBase and PacketSocket). The base class Socket has a new SetPriority
-    method to set the socket priority. When the IPv4 protocol is used, the
-    priority is set based on the ToS. See the Socket options section of the
-    Network model for more information.
-</li>
-<li>A <b>WifiNetDevice::SelectQueue</b> method has been added to determine the user
-    priority of an MSDU. This method is called by the traffic control layer before
-    enqueuing a packet in the queue disc, if a queue disc is installed on
-    the outgoing device, or passing a packet to the device, otherwise. The
-    user priority is set to the three most significant bits of the DS field
-    (TOS field in case of IPv4 and Traffic Class field in case of IPv6). The
-    packet priority carried by the SocketPriorityTag is set to the user priority.
-</li>
-<li>The <b>PfifoFastQueueDisc</b> classifies packets into bands based on their priority.
-    See the pfifo_fast queue disc section of the Traffic Control Layer model
-    for more information.
-</li>
-<li>A new class <b>SpectrumWifiPhy</b> has been introduced that makes use of the 
-    Spectrum module.  Its functionality and API is currently very similar to that 
-    of the YansWifiPhy, especially because it reuses the same InterferenceHelper 
-    and ErrorModel classes (for this release).  Some example programs in the 
-    'examples/wireless/' directory, such as 'wifi-spectrum-per-example.cc', 
-    illustrate how the SpectrumWifiPhy class can be substituted for the default 
-    YansWifiPhy PHY model.
-</li>
-<li>We have added support for generating traces for the
-    <a href="https://wilseypa.github.io/desMetrics">DES Metrics</a> project.
-    These can be enabled by adding <tt>--enable-des-metrics</tt> at configuration;
-    you must also use <tt>CommandLine</tt> in your script.  See the API docs
-    for class <b>DesMetrics</b> for more details.
-</li>
-<li> The traffic control module now includes the <b>FQ-CoDel</b> and <b>PIE</b> queue disc 
-    models, and behavior corresponding to Linux <b>Byte Queue Limits (BQL)</b>.
-</li>
-<li> Several new TCP congestion control variants were introduced, including
-    <b>TCP Vegas, Scalable, Veno, Illinois, Bic, YeAH, and H-TCP</b> 
-    congestion control algorithms.
-</li>
-</ul>
-<h2>Changes to existing API:</h2>
-<ul>
-<li><b>SocketAddressTag</b> was a long-standing approach to approximate the POSIX
-    socket recvfrom behavior (i.e., to know the source address of a packet) 
-    without actually calling RecvFrom.  Experience with this revealed that
-    this option was difficult to use with tunnels (the new tag has to 
-    replace the old one).  Moreover, there is no real need 
-    to create a new API when there is a an existing one (i.e., RecvFrom).
-    As a consequence, SocketAddressTag has been completely removed from ns-3.
-    Users can use RecvFrom (for UDP), GetPeerName (for TCP), or similar. 
-</li>
-<li><b>InetSockAddress</b> can now store a ToS value, which can be set through its
-    SetTos method. The Bind and Connect methods of UDP (UdpSocketImpl) and
-    TCP (TcpSocketBase) sockets set the socket ToS value to the value provided
-    through the address input parameter (of type InetSockAddress). See the
-    Socket options section of the Network model for more information.
-</li>
-<li>The <b>QosTag</b> is removed as it has been superseded by the SocketPriorityTag.</li>
-<li>The <b>Ipv4L3Protocol::DefaultTos</b> attribute is removed.</li>
-<li>The attributes <b>YansWifiPhy::Frequency, YansWifiPhy::ChannelNumber, and 
-    YansWifiPhy::ChannelWidth</b>, and the related accessor methods, were moved to 
-    base class WifiPhy.  YansWifiPhy::GetChannelFrequencyMhz() was deleted.  
-    A new method WifiPhy::DefineChannelNumber () was added to allow users to 
-    define relationships between channel number, standard, frequency, and channel width.
-</li>
-<li>The class <b>WifiSpectrumValueHelper</b> has been refactored; previously it 
-    was an abstract base class supporting the WifiSpectrumValue5MhzFactory spectrum 
-    model.  It now contains various static member methods supporting the creation 
-    of power spectral densities with the granularity of a Wi-Fi OFDM subcarrier 
-    bandwidth.  The class <b>WifiSpectrumValue5MhzFactory</b> and its API remain but 
-    it is not subclassed.
- </li>
-<li>A new Wifi method <b>InterferenceHelper::AddForeignSignal</b> has been introduced to 
-    support use of the SpectrumWifiPhy (so that non-Wi-Fi signals may be handled 
-    as noise power).
-</li>
-<li>A new Wifi attribute <b>Dcf::TxopLimit</b> has been introduced to add support for 802.11e TXOP.
-</li>
-</ul>
-<h2>Changes to build system:</h2>
-<ul>
-  <li> A new waf build option, <tt>--check-config</tt>, was added to allow users to print the current configuration summary, as appears at the end of ./waf configure.  See bug 2459 for discussion.</li>
-  <li> The <tt>configure</tt> summary is now sorted, to make it easier to check the status of optional features.</li>
-</ul>
-<h2>Changed behavior:</h2>
-This section is for behavioral changes to the models that were not due to a bug fix.
-<ul>
-  <li>The relationship between Wi-Fi channel number, frequency, channel width, 
-      and Wi-Fi standard has been revised (see bug 2412).  Previously, ChannelNumber 
-      and Frequency were attributes of class YansWifiPhy, and the frequency was 
-      defined as the start of the band.  Now, Frequency has been redefined to be 
-      the center frequency of the channel, and the underlying device relies on 
-      the pair of frequency and channel width to control behavior; the channel 
-      number and Wi-Fi standard are used as attributes to configure frequency 
-      and channel width.  The wifi module documentation discusses this change 
-      and the new behavior.
-  </li>
-  <li>AODV now honors the TTL in RREQ/RREP and it uses a method 
-      compliant with <a href="http://www.ietf.org/rfc/rfc3561.txt">RFC 3561</a>.      The node search radius is increased progressively. This could increase 
-      slightly the node search time, but it also decreases the network 
-      congestion.
-  </li>
-</ul>
-
-<hr>
-<h1>Changes from ns-3.24 to ns-3.25</h1>
-<h2>New API:</h2>
-<ul>
-  <li> In 'src/internet/test', a new environment is created to test TCP properties.</li>
-  <li> The 'src/traffic-control' module has been added, with new API for adding and configuring queue discs and packet filters.</li>
-  <li> Related to traffic control, a new interface has been added to the
-NetDevice to provide a queue interface to access device queue state and
-register callbacks used for flow control.</li>
-  <li> In 'src/wifi', a new rate control (MinstrelHT) has been added for
-802.11n/ac modes.</li>
-  <li> In 'src/wifi', a new helper (WifiMacHelper) is added and is a merged helper from all previously existing MAC helpers (NqosWifiMacHelper, QosWifiMacHelper, HtWifiMacHelper and VhtWifiMacHelper).</li>
-  <li> It is now possible to use RIPv2 in IPv4 network simulations.</li>
-</ul>
-<h2>Changes to existing API:</h2>
-<ul>
-  <li>TCP-related changes:
-    <ul>
-      <li>Classes TcpRfc793, TcpTahoe, and TcpReno were removed.</li>
-      <li>The 'TcpNewReno' log component was effectively replaced by 'TcpCongestionOps'
-      <li>TCP Hybla and HighSpeed have been added.</li>
-      <li>Added the concept of Congestion State Machine inside TcpSocketBase.</li>
-      <li>Merged Fast Recovery and Fast Retransmit inside TcpSocketBase.</li>
-      <li>Some member variables have been moved from TcpSocketBase inside TcpSocketState. Attributes are not touched.</li>
-      <li>Congestion control split from TcpSocketBase as subclass of TcpCongestionOps.</li>
-      <li>Added Rx and Tx callbacks on TcpSocketBase.</li>
-      <li>Added BytesInFlight trace source on TcpSocketBase. The trace is updated when the implementation requests the value.</li>
-      <li>Added attributes about the number of connection and data retransmission attempts.</li>
-    </ul>
-  </li>
-  <li> ns-3 is now capable of serializing SLL (a.k.a. cooked) headers.
-       This is used in DCE to allow the generation of pcap directly readable by wireshark.
-  </li>
-  <li> In the WifiHelper class in the wifi module, Default has been declared deprecated. This is now immediately handled by the constructor of the class.</li>
-  <li> The API for configuring 802.11n/ac aggregation has been modified to be more user friendly. As any MAC layer attributes, aggregation parameters can now also be configured through WifiMacHelper::SetType. </li>
-  <li> The class Queue and subclasses derived from it have been changed in two ways:
-  <ul>
-    <li>Queues no longer enqueue simple Packets but instead enqueue QueueItem objects, which include Packet but possibly other information such as headers.</li>
-    <li>The attributes governing the mode of operation (packets or bytes) and the maximum size have been moved to base class Queue.</li>
-  </ul>
-  </li>
-  <li> Users of advanced queues (RED, CoDel) who have been using them directly in the NetDevice will need to adjust to the following changes:
-    <ul>
-      <li> RED and CoDel are no longer specializations of the Queue class, but are now specializations of the new QueueDisc class. This means that RED and CoDel can now be installed in the context of the new Traffic Control layer instead of as queues in (some) NetDevices. The reason for such a change is to make the ns-3 stack much more similar to that of real operating systems (Linux has been taken as a reference).  Queuing disciplines such as RED and CoDel can now be tested with all the NetDevices, including WifiNetDevices. </li>
-      <li> NetDevices still use queues to buffer packets. The only subclass of Queue currently available for this purpose is DropTailQueue. If one wants to approximate the old behavior, one needs to set the DropTailQueue MaxPackets attribute to very low values, e.g., 1.</li>
-      <li> The Traffic Control layer features a mechanism by which packets dropped by the NetDevice are requeued in the queue disc (more precisely: if NetDevice::Send returns false, the packet is requeued), so that they are retransmitted later. This means that the MAC drop traces may include packets that have not been actually lost, because they have been dropped by the device, requeued by the traffic control layer and successfully retransmitted. To get the correct number of packets that have been actually lost, one has to subtract the number of packets requeued from the number of packets dropped as reported by the MAC drop trace. </li>
-    </ul>
-  </li>
-</ul>
-<h2>Changes to build system:</h2>
-<ul>
-  <li> Waf was upgraded to 1.8.19</li>
-  <li> A new waf build option, --check-profile, was added to allow users to check the currently active build profile.  It is discussed in bug 2202 in the tracker.</li>
-</ul>
-<h2>Changed behavior:</h2>
-This section is for behavioral changes to the models that were not due to a bug fix.
-<ul>
-  <li>TCP behavioral changes:
-    <ul>
-      <li>TCP closes connection after a number of failed segment retries,
-        rather than trying indefinitely. The maximum number of retries, for both SYN
-        attempts and data attempts, is controlled by attributes.</li>
-      <li>Congestion algorithms not compliant with Fast Retransmit
-        and Fast Recovery (TCP 793, Reno, Tahoe) have been removed.</li>
-    </ul>
-  </li>
-  <li> 802.11n/ac MPDU aggregation is now enabled by default for both AC_BE and AC_VI.</li>
-  <li> The introduction of the traffic control layer leads to some additional buffering by default in the stack; when a device queue fills up, additional packets become enqueued at the traffic control layer.</li>
-</ul>
-
-<hr>
-<h1>Changes from ns-3.23 to ns-3.24</h1>
-<h2>New API:</h2>
-<ul>
-  <li>In 'src/wifi', several changes were made to enable partial 802.11ac support:
-    <ul>
-      <li>A new helper (VhtWifiMacHelper) was added to set up a Very high throughput (VHT) MAC entity.</li>
-      <li>A new standard value has been added that enables the new 11ac data rates.</li>
-      <li>A new 11ac preamble has been added.</li>
-      <li>A new information element has been added:  VhtCapabilities. This information element is added to the MAC frame header if the node is a VHT node. This VhtCapabilites information element is used to advertise the VHT capabilities of the node to other nodes in the network.</li>
-    </ul>
-  </li>
-  <li>The ArpCache API was extended to allow the manual removal of ArpCache entries and the addition of permanent (static) entries for IPv4.
-  </li>
-  <li> The SimpleChannel in the 'network' module now allows per-NetDevice blacklists, in order to do hidden terminal testcases.
-  </li>
-</ul>
-<h2>Changes to existing API:</h2>
-<ul>
-  <li> The signatures on several TcpHeader methods were changed to take const arguments.</li>
-  <li> class TcpL4Protocol replaces Send() methods with SendPacket(), and adds new methods to AddSocket() and RemoveSocket() from a node.  Also, a new PacketReceived() method was introduced to get the TCP header of an incoming packet and check its checksum.</li>
-  <li> The CongestionWindow and SlowStartThreshold trace sources have been moved from the TCP subclasses such as NewReno, Reno, Tahoe, and Westwood to the TcpSocketBase class.</li>
-  <li> The WifiMode object has been refactored:
-    <ul>
-      <li>11n data rates are now renamed according to their MCS value. E.g. OfdmRate65MbpsBW20MHz has been renamed into HtMcs7. 11ac data rates have been defined according to this new renaming.</li>
-      <li>HtWifiMacHelper and VhtWifiMacHelper provide a helper to convert a MCS value into a data rate value.</li>
-      <li>The channel width is no longer tied to the wifimode. It is now included in the TXVECTOR.</li>
-      <li>The physical bitrate is no longer tied to the wifimode. It is computed based on the selected wifimode and on the TXVECTOR parameters (channel width, guard interval and number of spatial streams).</li>
-    </ul>
-  </li>
-</ul>
-<h2>Changes to build system:</h2>
-<ul>
-  <li> Waf was upgraded to 1.8.12</li>
-  <li> Waf scripts and test.py test runner program were made compatible with Python 3</li>
-</ul>
-<h2>Changed behavior:</h2>
-This section is for behavioral changes to the models that were not due to a bug fix.
-<ul>
-</ul>
-
-<hr>
-<h1>Changes from ns-3.22 to ns-3.23</h1>
-<h2>New API:</h2>
-<ul>
-  <li> The mobility module includes a GeographicPositions class used to
-convert geographic to cartesian coordinates, and to generate randomly
-distributed geographic coordinates.
-  </li>
-  <li>  The spectrum module includes new TvSpectrumTransmitter classes and helpers to create television transmitter(s) that transmit PSD spectrums customized by attributes such as modulation type, power, antenna type, channel frequency, etc.
-  </li>
-</ul>
-<h2>Changes to existing API:</h2>
-<ul>
-  <li> In LteSpectrumPhy, LtePhyTxEndCallback and the corresponding methods have been removed, since they were unused.
-  </li>
-  <li> In the DataRate class in the network module, CalculateTxTime has been declared deprecated.  CalculateBytesTxTime and CalculateBitsTxTime are to be used instead.  The return value is a Time, instead of a double.
-  </li>
-  <li> In the Wi-Fi InterferenceHelper, the interference event now takes the WifiTxVector as an input parameter, instead of the WifiMode.  A similar change was made to the WifiPhy::RxOkCallback signature.
-  </li>
-</ul>
-<h2>Changes to build system:</h2>
-<ul>
-  <li> None </li>
-</ul>
-<h2>Changed behavior:</h2>
-This section is for behavioral changes to the models that were not due to a bug fix.
-<ul>
-  <li> In Wi-Fi, HT stations (802.11n) now support two-level aggregation. The InterferenceHelper now distinguishes between the PLCP and regular payload reception, for higher fidelity modeling.  ACKs are now sent using legacy rates and preambles.  Access points now establish BSSBasicRateSet for control frame transmissions.  PLCP header and PLCP payload reception have been decoupled to improve PHY layer modeling accuracy.  RTS/CTS with A-MPDU is now fully supported.  
-  </li>
-  <li> The mesh module was made more compliant to the IEEE 802.11s-2012 standard and packet traces are now parseable by Wireshark.  
-  </li>
-</ul>
-
-<hr>
-<h1>Changes from ns-3.21 to ns-3.22</h1>
-<h2>New API:</h2>
-<ul>
-  <li> New classes were added for the PARF and APARF WiFi power and rate control mechanisms. 
-  </li>
-  <li> Support for WiFi 802.11n MPDU aggregation has been added.
-  </li>
-  <li> Additional support for modeling of vehicular WiFi networks has been added, including the channel-access coordination feature of IEEE 1609.4.  In addition, a Basic Safety Message (BSM) packet generator and related statistics-gathering classes have been added to the wave module. 
-  </li>
-  <li> A complete LTE release bearer procedure is now implemented which can be invoked by calling the new helper method LteHelper::DeActivateDedicatedEpsBearer ().
-  </li>
-  <li> It is now possible to print the Neighbor Cache (ARP and NDISC) by using
-       the RoutingProtocolHelper
-  </li>
-  <li> A TimeProbe class has been added to the data collection framework in 
-       the stats module, enabling TracedValues emitting values of type 
-       ns3::Time to be handled by the framework.
-  </li>
-  <li> A new attribute 'ClockGranularity' was added to the TcpSocketBase class,
-to control modeling of RTO calculation.
-  </li>
-</ul>
-
-<h2>Changes to existing API:</h2>
-<ul>
-  <li> Several deprecated classes and class methods were removed, including EmuNetDevice, RandomVariable and derived classes, Packet::PeekData(), Ipv6AddressHelper::NewNetwork(Ipv6Address, Ipv6Prefix), Ipv6InterfaceContainer::SetRouter(), Ipv4Route::GetOutputTtl(), TestCase::AddTestCase(TestCase*), and TestCase::GetErrorStatus().
-  </li>
-  <li> Print methods involving routing tables and neighbor caches, in classes Ipv4RoutingHelper and Ipv6RoutingHelper, were converted to static methods.
-  </li>  
-  <li>PointerValue attribute types in class UanChannel (NoiseModel), UanPhyGen (PerModel and SinrModel), UanPhyDual (PerModelPhy1, PerModelPhy2, SinrModelPhy1, and SinrModelPhy2), and SimpleNetDevice (TxQueue), were changed from PointerValue type to StringValue type, making them configurable via the Config subsystem. 
-  </li>
-  <li> WifiPhy::CalculateTxDuration() and WifiPhy::GetPayloadDurationMicroSeconds () now take an additional frequency parameter.
-  </li>
-  <li> The attribute 'Recievers' in class YansWifiPhy was misspelled, so
-       this has been corrected to 'Receivers'.
-  </li>
-  <li> We have now documented the callback function signatures
-       for all TracedSources, using an extra (fourth) argument to
-       TypeId::AddTraceSource to pass the fully-qualified name
-       of the signature typedef.  To ensure that future TraceSources
-       are similarly documented, the three argument version of 
-       AddTraceSource has been deprecated.
-  </li>	
-  <li> The "MinRTO" attribute of the RttEstimator class was moved to the TcpSocketBase class.  The "Gain" attribute of the RttMeanDeviation class was replaced 
-by new "Alpha" and "Beta" attributes.  
-  </li>	
-  <li> Attributes of the TcpTxBuffer and TcpRxBuffer class are now accessible through the TcpSocketBase class.
-  </li>	
-  <li> The LrWpanHelper class has a new constructor allowing users to configure a MultiModelSpectrumChannel as an option, and also provides Set/Get API to allow users to access the underlying channel object. 
-  </li>
-</ul>
-
-<h2>Changes to build system:</h2>
-<ul>
-  <li> waf was upgraded to version 1.7.16
-  </li>
-</ul>
-
-<h2>Changed behavior:</h2>
-This section is for behavioral changes to the models that were not due to a bug fix.
-<ul>
-  <li> The default value of the `Speed` attribute of ConstantSpeedPropagationDelayModel was changed from 300,000,000 m/s to 299,792,458 m/s (speed of light in a vacuum), causing propagation delays using this model to vary slightly.
-  </li>
-  <li> The LrWpanHelper object was previously instantiating only a LogDistancePropagationLossModel on a SingleModelSpectrumChannel, but no PropagationDelayModel.  The constructor now adds by default a ConstantSpeedPropagationDelayModel.
-  </li>
-  <li> The Nix-vector routing implementation now uses a lazy flush mechanism,
-       which dramatically speeds up the creation of large topologies.
-  </li>
-</ul>
-
-<hr>
-<h1>Changes from ns-3.20 to ns-3.21</h1>
-<h2>New API:</h2>
-<ul>
-  <li> New "const double& SpectrumValue:: operator[] (size_t index) const".
-  </li>
-  <li> A new TraceSource has been added to TCP sockets: SlowStartThreshold.
-  </li>
-  <li> New method CommandLine::AddValue (name, attibutePath) to provide a
-       shorthand argument "name" for the Attribute "path".  This also has
-       the effect of including the help string for the Attribute in the
-       Usage message.
-  </li>
-  <li> The GSoC 2014 project in the LTE module has brought some additional APIs:
-    <ul>
-      <li>a new abstract class LteFfrAlgorithm, which every future
-          implementation of frequency reuse algorithm should inherit from</li>
-      <li>a new SAPs: one between MAC Scheduler and FrAlgorithm, one between
-	  RRC and FrAlgorithm</li>
-      <li>new attribute to enable Uplink Power Control in LteUePhy</li>
-      <li>new LteUePowerControl class, an implementation of Uplink Power Control, which is 
-          configurable by attributes. ReferenceSignalPower is sent by eNB in SIB2. 
-          Uplink Power Control in Closed Loop Accumulative Mode is enabled by default</li>
-      <li>seven different Frequency Reuse Algorithms (each has its own attributes): </li>
-        <ul>
-          <li>LteFrNoOpAlgorithm</li>
-          <li>LteFrHardAlgorithm</li>
-          <li>LteFrStrictAlgorithm</li>
-          <li>LteFrSoftAlgorithm</li>
-          <li>LteFfrSoftAlgorithm</li>
-          <li>LteFfrEnhancedAlgorithm</li>
-          <li>LteFfrDistributedAlgorithm</li>
-        </ul>
-      <li>attribute in LteFfrAlgorithm to set FrCellTypeId which is used in automatic 
-          Frequency Reuse algorithm configuration</li>
-      <li>LteHelper has been updated with new methods related to frequency reuse algorithm: 
-          SetFfrAlgorithmType and SetFfrAlgorithmAttribute</li>
-    </ul>
-  </li>
-  <li> A new SimpleNetDeviceHelper can now be used to install SimpleNetDevices.
-  </li>
-  <li> New PacketSocketServer and PacketSocketClient apps, meant to be used in tests.
-  </li>
-  <li> Tcp Timestamps and Window Scale options have been added and are enabled by default (controllable by attribute).
-  </li>
-  <li> A new CoDel queue model has been added to the 'internet' module.  
-  </li>
-  <li> New test macros NS_TEST_ASSERT_MSG_GT_OR_EQ() and NS_TEST_EXPECT_MSG_GT_OR_EQ() have been added.
-  </li>
-</ul>
-
-<h2>Changes to existing API:</h2>
-<ul>
-  <li> "Icmpv6L4Protocol::ForgeEchoRequest" is now returning a packet with the proper IPv6 header.
-  </li>
-  <li> The TCP socket Attribute "SlowStartThreshold" has been renamed "InitialSlowStartThreshold" to
-       clarify that the effect is only on the initial value.
-  </li>
-  <li> all schedulers were updated to interact with FR entity via FFR-SAP. Only PF, PSS, CQA, 
-       FD-TBFQ, TD-TBFQ schedulers supports Frequency Reuse functionality. In the beginning 
-       of scheduling process, schedulers ask FR entity for available RBGs and then ask if UE 
-       can be scheduled on RB</li>
-  <li> eNB RRC interacts with FFR entity via RRC-FFR SAP</li>
-  <li> new DL-CQI generation approach was implemented. Now DL-CQI is computed from control channel as signal
-       and data channel (if received) as interference. New attribute in LteHelper was added to specify 
-       DL-CQI generation approach. New approach is default one in LteHelper </li>
-  <li> RadioEnvironmentMap can be generated for Data or Control channel and for specified RbId;
-       Data or Control channel and RbId can be configured by new attributes in RadioEnvironmentMapHelper </li>
-  <li> lte-sinr-chunk-processor refactored to lte-chunk-processor. Removed all lte-xxx-chunk-processor 
-       implementations</li>
-  <li> BindToNetDevice affects also sockets using IPv6.</li>
-  <li> BindToNetDevice now calls implicitly Bind (). To bind a socket to a NetDevice and to a specific address,
-       the correct sequence is Bind (address) - BindToNetDevice (device). The opposite will raise an error.</li>
-</ul>
-
-<h2>Changes to build system:</h2>
-<ul>
-<li> None for this release. </li>
-</ul>
-
-<h2>Changed behavior:</h2>
-<ul>
-<li> Behavior will be changed due to the list of bugs fixed (listed in RELEASE_NOTES); users are requested to review that list as well.
-</ul>
-
-<hr>
-<h1>Changes from ns-3.19 to ns-3.20</h1>
-<h2>New API:</h2>
-<ul>
-  <li> Models have been added for low-rate, wireless personal area networks
-(LR-WPAN) as specified by IEEE standard 802.15.4 (2006).  The current 
-emphasis is on the unslotted mode of 802.15.4 operation for use in Zigbee, 
-and the scope is limited to enabling a single mode (CSMA/CA) with basic 
-data transfer capabilities. Association with PAN coordinators is not yet 
-supported, nor the use of extended addressing. Interference is modeled as 
-AWGN but this is currently not thoroughly tested.  The NetDevice Tx queue 
-is not limited, i.e., packets are never dropped due to queue becoming full. 
-They may be dropped due to excessive transmission retries or channel access 
-failure.  </li>
-  <li> A new IPv6 routing protocol has been added: RIPng. This protocol is
-  an Interior Gateway Protocol and it is available in the Internet module. </li>
-  <li> A new LTE MAC downlink scheduling algorithm named Channel and QoS 
-  Aware (CQA) Scheduler is provided by the new "ns3::CqaFfMacScheduler" object.
-  </li>
-  <li> Units may be attached to Time objects, to facilitate specific output
-  formats (see Time::As()) </li>
-  <li> FlowMonitor "SerializeToXml" functions are now directly available
-  from the helper.  </li>
-  <li> Access to OLSR's HNA table has been enabled </li>
-</ul>
-
-<h2>Changes to existing API:</h2>
-<ul>
-  <li> The SixLowPan model can now use uncompressed IPv6 headers. An option to
-  define the minimum compressed packet size has been added.  </li>
-  <li> MinDistance wsa replaced by MinLoss in FriisPropagationLossModel, to
-  better handle conditions outside of the assumed far field region. </li>
-  <li> In the DSR model, the attribute DsrOptionRerrHeader::ErrorType" has
-  been removed. </li>
-</ul>
-
-<h2>Changes to build system:</h2>
-<ul>
-  <li> Python 3.3 is now supported for Python bindings for ns-3.  Python 3.3 
-  support for API scanning is not supported.  Python 3.2 is not supported.</li>
-  <li>  Enable selection of high precision int64x64_t implementation
-  at configure time, for debugging purposes.</li>
-  <li> Optimized builds are now enabling signed overflow optimization 
-  (-fstrict-overflow) and for gcc 4.8.2 and greater, also warning for cases 
-  where an optimizization may occur due to compiler assumption that 
-  overflow will not occur. </li>
-</ul>
-
-<h2>Changed behavior:</h2>
-<ul>
-  <li> The Internet FlowMonitor can now track IPv6 packets.  </li>
-  <li> Ipv6Extension::m_dropTrace has been removed. Ipv6L3Protocol::m_dropTrace
-  is now fired when appropriate.  </li>
-  <li> IPv4 identification field value is now dependent on the protocol 
-  field.  </li>
-  <li> Point-to-point trace sources now contain PPP headers </li>
-</ul>
-
-<hr>
-<h1>Changes from ns-3.18.1 to ns-3.19</h1>
-
-<h2>New API:</h2>
-<ul>
-  <li> A new wifi extension for vehicular simulation support is available in the
-    src/wave directory.  The current code represents an interim capability to 
-    realize an IEEE 802.11p-compliant device, but without the WAVE extensions 
-    (which are planned for a later patch).  The WaveNetDevice modelled herein 
-    enforces that a WAVE-compliant physical layer (at 5.9 GHz) is selected, and 
-    does not require any association between devices (similar to an adhoc WiFi 
-    MAC), but is otherwise similar (at this time) to a WifiNetDevice.  WAVE 
-    capabililties of switching between control and service channels, or using 
-    multiple radios, are not yet modelled.
-  </li>
-  <li>New SixLowPanNetDevice class providing a shim between 
-    IPv6 and real NetDevices. The new module implements 6LoWPAN:
-    "Transmission of IPv6 Packets over IEEE 802.15.4 Networks" (see
-    <a href="http://www.ietf.org/rfc/rfc4944.txt">RFC 4944</a> and
-    <a href="http://www.ietf.org/rfc/rfc6262.txt">RFC 6262</a>), 
-    resulting in a heavy header compression for IPv6 packets.
-    The module is intended to be used on 802.15.4 NetDevices, but
-    it can be used over other NetDevices. See the manual for
-    further discussion.
-  </li>
-  <li> LteHelper has been updated with some new APIs:
-    <ul>
-      <li>new overloaded Attach methods to enable UE to automatically determine
-          the eNodeB to attach to (using initial cell selection);</li>
-      <li>new methods related to handover algorithm: SetHandoverAlgorithmType
-          and SetHandoverAlgorithmAttribute;</li>
-      <li>a new attribute AnrEnabled to activate/deactivate Automatic Neighbour
-          Relation (ANR) function; and</li>
-      <li>a new method SetUeDeviceAttribute for configuring LteUeNetDevice.</li>
-    </ul>
-  </li>
-  <li> The GSoC 2013 project in the LTE module has brought some additional APIs:
-    <ul>
-      <li>a new abstract class LteHandoverAlgorithm, which every future
-          implementation of automatic handover trigger should inherit from;</li>
-      <li>new classes LteHandoverAlgorithm and LteAnr as sub-modules of
-          LteEnbNetDevice class; both interfacing with the LteEnbRrc sub-module
-          through Handover Management SAP and ANR SAP;</li>
-      <li>new attributes in LteEnbNetDevice and LteUeNetDevice classes related
-          to Closed Subscriber Group (CSG) functionality in initial cell
-          selection;</li>
-      <li>new attributes in LteEnbRrc for configuring UE measurements' filtering
-          coefficient (i.e., quantity configuration);</li>
-      <li>a new public method AddUeMeasReportConfig in LteEnbRrc for setting up
-          custom UE measurements' reporting configuration; measurement reports
-          can then be captured from the RecvMeasurementReport trace source;
-          and</li>
-      <li>new trace sources in LteUeRrc to capture more events, such as System
-          Information messages (MIB, SIB1, SIB2), initial cell selection, random
-          access, and handover.</li>
-    </ul>
-  </li>
-  <li>A new parallel scheduling algorithm based on null messages, a common 
-  parallel DES scheduling algorithm, has been added.  The null message 
-  scheduler has better scaling properties when running on some scenarios
-  with large numbers of nodes since it does not require a global 
-  communication.
-  </li>
-</ul>
-
-<h2>Changes to existing API:</h2>
-<ul>
-    <li> It is now possible to use Ipv6PacketInfoTag from UDP applications in the
-      same way as with Ipv4PacketInfoTag. See Doxygen for current limitations in
-  	  using Ipv[4,6]PacketInfoTag to set IP properties.</li>
-    <li>A change is introduced for the usage of the EpcHelper
-      class. Previously, the EpcHelper class included both the API
-      definition and its (only) implementation; as such, users would
-      instantiate and use the EpcHelper class directly in their
-      simulation programs. From now on,
-      EpcHelper is just the base class defining the API, and the
-      implementation has been moved to derived classes; as such,
-      users are now expected to use one of the derived classes in
-      their simulation program. The implementation previously
-      provided by the EpcHelper class has been moved to the new
-      derived class PointToPointEpcHelper.</li>
-  <li> The automatic handover trigger and ANR functions in LTE module have been
-    moved from LteEnbRrc class to separate classes. As a result, the related
-    attributes, e.g., ServingCellHandoverThreshold, NeighbourCellHandoverOffset,
-    EventA2Threshold, and EventA4Threshold have been removed from LteEnbRrc
-    class. The equivalent attributes are now in A2A4RsrqHandoverAlgorithm and
-    LteAnr classes.</li>
-  <li> Master Information Block (MIB) and System Information Block Type 1 (SIB1)
-    are now transmitted as LTE control messages, so they are no longer part of
-    RRC protocol.</li>
-  <li> UE RRC state model in LTE module has been considerably modified and is
-    not backward compatible with the previous state model.</li>
-  <li> Additional time units (Year, Day, Hour, Minute) were added to the time
-  value class that represents simulation time; the largest unit prior to 
-  this addition was Second.
-  </li>
-  <li> SimpleNetDevice and SimpleChannel are not so simple anymore. SimpleNetDevice can be now a
-       Broadcast or PointToPoint NetDevice, it can have a limited bandwidth and it uses an output
-       queue.       
-  </li>
-</ul>
-
-<h2>Changes to build system:</h2>
-
-<h2>Changed behavior:</h2>
-<ul>
-  <li> For the TapBridge device, in UseLocal mode there is a MAC learning function. TapBridge has been waiting for the first packet received from tap interface to set the address of the bridged device to the source address of the first packet. This has caused problems with WiFi.  The new behavior is that after connection to the tap interface, ns-3 learns the MAC address of that interface with a system call and immediately sets the address of the bridged device to the learned one.  See <a href="https://www.nsnam.org/bugzilla/show_bug.cgi?id=1777">bug 1777</a> for more details.</li>
-  <li> TapBridge device now correctly implements IsLinkUp() method.</li>
-  <li> IPv6 addresses and routing tables are printed like in Linux "route -A inet6" command.</li>
-  <li> A change in Ipv[4,6]Interface enforces the correct behaviour of IP 
-    when a device do not support the minimum MTU requirements.
-    This is set to 68 and 1280 octects respectively.  IP simulations that
-    may have run over devices with smaller MTUs than 68 or 1280, respectively,
-    will no longer be able to use such devices.</li>
-</ul>
-
-<hr>
-<h1>Changes from ns-3.18 to ns-3.18.1</h1>
-<h2>New API:</h2>
-<ul>
-  <li> It is now possible to randomize the time of the first beacon from an
-  access point.  Use an attribute "EnableBeaconJitter" to enable/disable
-  this feature.
-  </li>
-  <li> A new FixedRoomPositionAllocator helper class is available; it
-  allows one to generate a random position uniformly distributed in the
-  volume of a chosen room inside a chosen building.
-  </li>
-</ul>
-
-<h2>Changes to existing API:</h2>
-<ul>
-  <li> Logging wildcards:  allow "***" as synonym for "*=**" to turn on all logging.
-  </li>
-  <li> The log component list ("NS_LOG=print-list") is now printed alphabetically.
-  </li>
-  <li> Some deprecated IEEE 802.11p code has been removed from the wifi module
-  </li>
-</ul>
-
-<h2>Changes to build system:</h2>
-<ul>
-  <li> The Python API scanning system (./waf --apiscan) has been fixed (bug 1622)
-  </li> 
-  <li> Waf has been upgraded from 1.7.11 to 1.7.13
-  </li> 
-</ul>
-
-<h2>Changed behavior:</h2>
-<ul>
-  <li> Wifi simulations have additional jitter on AP beaconing (see above) and some bug fixes have been applied to wifi module (see RELEASE_NOTES)
-  </li> 
-</ul>
-
-<hr>
-<h1>Changes from ns-3.17 to ns-3.18</h1>
-
-<h2>New API:</h2>
-<ul>
-  <li>New features have been added to the LTE module:
-  <ul>
-    <li>PHY support for UE measurements (RSRP and RSRQ)</li>
-    <li>RRC support for UE measurements (configuration, execution, reporting)</li>
-    <li>Automatic Handover trigger based on RRC UE measurement reports</li>
-  </ul>
-  <li>Data collection components have been added in the 'src/stats' module.
-      Data collection includes a Probe class that attaches to ns-3 trace
-      sources to filter their output, and two Aggregator classes for 
-      marshaling probed data into text files or gnuplot plots.  The ns-3
-      tutorial has been extended to illustrate basic functionality. </li>
-  <li>In 'src/wifi', several changes were made to enable partial 802.11n support:
-    <ul>
-      <li>A new helper (HtWifiMacHelper) was added to set up a High Throughput (HT) MAC entity</li>
-      <li>New attributes were added to help the user setup a High Throughput (HT) PHY entity. These attributes can be set using the YansWifiPhyHelper</li>
-      <li>A new standard value has been added that enables the new 11n data rates.</li>
-      <li>New 11n preambles has been added (Mixed format and greenfield). To be able to change Tx duration according to the preamble used, a new class TxVector has been added to carry the transmission parameters (mode, preamble, stbc,..).  Several functions have been updated to allow the passage of TxVector instead of WifiMode in MacLow, WifiRemoteStationManager, WifiPhy, YansWifiPhy,.. </li>
-      <li>A new information element has been added:  HTCapabilities. This information element is added to the MAC frame header if the node is an HT node. This HTCapabilites information element is used to advertise the HT capabilities of the node to other nodes in the network</li>
-    </ul>
-  <li>InternetStackHelper has two new functions:<tt>SetIpv4ArpJitter (bool enable)</tt>
-      and <tt>SetIpv6NsRsJitter (bool enable)</tt> to enable/disable
-      the random jitter on the tranmission of IPv4 ARP Request and IPv6 NS/RS. </li>
-  <li>Bounds on valid time inputs for time attributes can now be enabled.  
-      See <tt>attribute-test-suite.cc</tt> for an example.</li>
-  <li>New generic hash function interface provided in the simulation core.  
-      Two hash functions are provided: murmur3 (default), and the venerable 
-      FNV1a.  See the Hash Functions section in the ns-3 manual.</li>
-  <li>New Mac16Address has been added. It can be used with IPv6 to make
-      an Autoconfigured address.</li>
-  <li>Mac64Address support has been extended. It can now be used with 
-      IPv6 to make an Autoconfigured address.</li>
-  <li>IPv6 can now detect and use Path-MTU. See 
-      <tt>examples/ipv6/fragmentation-ipv6-two-MTU.cc</tt> for an example.</li>
-  <li>Radvd application has a new Helper. See the updated 
-      <tt>examples/ipv6/radvd.cc</tt> for an example.</li>
-</ul>
-
-<h2>Changes to existing API:</h2>
-<ul>
-  <li> The Ipv6InterfaceContainer functions to set a node in forwarding state (i.e., a router) 
-  and to install a default router in a group of nodes have been extensively changed.
-  The old function <tt>void Ipv6InterfaceContainer::SetRouter (uint32_t i, bool router)</tt>
-  is now DEPRECATED.
-  </li>
-  <li> The documentation's IPv6 addresses (2001:db8::/32, RFC 3849) are now
-  dropped by routers.
-  </li>
-  <li> The 'src/tools' module has been removed, and most files migrated to
-  'src/stats'.  For users of these programs (the statistics-processing 
-  in average.h, or the gnuplot support), the main change is likely to be
-  replacing the inclusion of "tools-module.h" with "stats-module.h".
-  Users of the event garbage collector, previously in tools, will now 
-  include it from the core module.
-  </li>
-  <li> The Ipv6 UnicastForwardCallback and  MulticastForwardCallback 
-  have a new parameter, the NetDevice the packet has been received from.
-  Existing Ipv6RoutingProtocols should update their RouteInput function
-  accordingly, e.g., from <tt>ucb (rtentry, p, header);</tt> to <tt>ucb (idev, rtentry, p, header);</tt>
-  </li>
-  <li> The previous buildings module relied on a specific MobilityModel called
-    BuildingsMobilityModel, which supported buildings but only allowed
-    static positions. This mobility model has been removed. Now, the
-    Buildings module instead relies on a new class called
-    MobilityBuildingInfo which can be aggregated to any MobilityModel. This
-    allows having moving nodes in presence of buildings with any of
-    the existing MobilityModels. 
-  </li>
-  <li>All functions in WifiRemoteStationManager named GetXxxMode have been changed to GetXxxTxVector </li>
-</ul>
-
-<h2>Changes to build system:</h2>
-<ul>
-  <li> Make references to bug id's in doxygen comments with
-    <tt>\bugid{num}</tt>, where <tt>num</tt> is the bug id number.  This
-    form will generate a link to the bug in the bug database.
-  </li>
-</ul>
-
-<h2>Changed behavior:</h2>
-<ul>
-  <li> Now it is possible to request printing command line arguments to the
-desired output stream using PrintHelp or operator &lt;&lt;
-<pre>
-  CommandLine cmd;
-  cmd.Parse (argc, argv);
-...
-
-  std::cerr << cmd;
-</pre>
-or
-<pre>
-  cmd.PrintHelp (std::cerr);
-</pre>
-  </li>
-  <li>Command line boolean arguments specified with no integer value (e.g. <tt>"--boolArg"</tt>) will toggle the value from the default, instead of always setting the value to true.
-  </li>
-  <li>IPv4's ARP Request and IPv6's NS/RS are now transmitted with a random delay.
-      The delay is, by default, a uniform random variable in time between 0 and 10ms.
-      This is aimed at preventing reception errors due to collisions during wifi broadcasts when the sending behavior is synchronized (e.g. due to applications starting at the same time on several different nodes).
-      This behaviour can be modified by using ArpL3Protocol's 
-      <tt>RequestJitter</tt> and Icmpv6L4Protocol's <tt>SolicitationJitter</tt>
-      attributes or by using the new InternetStackHelper functions.
-  </li>
-  <li>AODV Hellos are disabled by default. The performance with Hellos enabled and disabled are almost identical. With Hellos enabled, AODV will suppress hellos from transmission, if any recent broadcast such as RREQ was transmitted. The attribute <tt>ns3::aodv::RoutingProtocol::EnableHello</tt> can be used to enable/disable Hellos.
-</ul>
-
-<hr>
-<h1>Changes from ns-3.16 to ns-3.17</h1>
-
-<h2>New API:</h2>
-<ul>
-  <li>New TCP Westwood and Westwood+ models
-  <li>New FdNetDevice class providing a special NetDevice that is able to read
-      and write traffic from a file descriptor.  Three helpers are provided
-      to associate the file descriptor with different underlying devices:  
-    <ul> 
-    <li> EmuFdNetDeviceHelper (to associate the |ns3| device with a physical 
-         device in the host machine).  This helper is intended to
-         eventually replace the EmuNetDevice in src/emu. </li>
-    <li> TapFdNetDeviceHelper (to associate the ns-3 device with the file 
-         descriptor from a tap device in the host machine) </li>
-    <li> PlanteLabFdNetDeviceHelper (to automate the creation of tap devices 
-         in PlanetLab nodes, enabling |ns3| simulations that can send and 
-         receive traffic though the Internet using PlanetLab resource.</li>
-    </ul> 
-  </li>
-  <li>In Ipv4ClickRouting, the following APIs were added:
-    <ul>
-      <li>Ipv4ClickRouting::SetDefines(), accessible through ClickInternetStackHelper::SetDefines(), for the user to set Click defines from the ns-3 simulation file.</li>
-      <li>SIMCLICK_GET_RANDOM_INT click-to-simulator command for ns-3 to drive Click's random number generation.</li>
-    </ul>
-  </li>  
-  <li>LTE module
-    <ul>
-      <li> New user-visible LTE API
-      <ul>
-        <li>Two new methods have been added to LteHelper to enable the X2-based handover functionality: AddX2Interface, which setups the X2 interface between two eNBs, and HandoverRequest, which is  a convenience method that schedules an explicit handover event to be executed at a given point in the simulation. </li>
-        <li>the new LteHelper method EnablePhyTraces can now be used to enable the new PHY traces</li>
-      </ul>
-      </li> 
-      <li> New internal LTE API 
-      <ul>
-        <li>New LTE control message classes DlHarqFeedbackLteControlMessage, 
-         RachPreambleLteControlMessage, RarLteControlMessage, MibLteControlMessage</li>
-        <li>New class UeManager
-        <li>New LteRadioBearerInfo subclasses LteSignalingRadioBearerInfo, 
-         LteDataRadioBearerInfo</li>
-        <li>New LteSinrChunkProcessor subclasses LteRsReceivedPowerChunkProcessor, 
-         LteInterferencePowerChunkProcessor</li>
-      </ul>
-      </li>
-    </ul>
-  </li>
-  <li>New DSR API
-  <ul>
-    <li>Added PassiveBuffer class to save maintenance packet entry for passive acknowledgment option</li>
-    <li>Added FindSourceEntry function in RreqTable class to keep track of route request entry received from same source node</li>
-    <li>Added NotifyDataReciept function in DsrRouting class to notify the data receipt of the next hop from link layer.  This is used for the link layer acknowledgment.</li>
-  </ul>
-  </li>
-  <li>New Tag, PacketSocketTag, to carry the destination address of a packet and the packet type</li>
-  <li>New Tag, DeviceNameTag, to carry the ns3 device name from where a packet is coming</li>
-  <li>New Error Model, BurstError model, to determine which bursts of packets are errored corresponding to an underlying distribution, burst rate, and burst size</li>
-</ul>
-
-<h2>Changes to existing API:</h2>
-<ul>
-  <li>ns3::Object and subclasses DoStart has been renamed to DoInitialize</li>
-  <li>ns3::Object and subclasses Start has been renamed to Initialize</li>
-  <li>EnergySource StartDeviceModels renamed to InitializeDeviceModels</li>
-  <li>A typo was fixed in an LTE variable name. The variable ns3::AllocationRetentionPriority::preemprionVulnerability was changed to preemptionVulnerability.</li>
-  <li>Changes in TestCase API
-  <ul>
-    <li>TestCase has new enumeration TestDuration containing QUICK, EXTENSIVE, TAKES_FOREVER</li>
-    <li>TestCase constructor now requires TestDuration, old constructor marked deprecated</li>
- </ul>
- </li>
-  <li>Changes in LTE API
-  <ul>
-    <li> User-visible LTE API 
-    <ul>
-      <li>The previous LteHelper method ActivateEpsBearer has been now replaced by two alternative methods: ActivateDataRadioBearer (to be used when the EPC model is not used) and ActivateDedicatedEpsBearer (to be used when the EPC model is used). In the case where the EPC model is used, the default EPS bearer is not automatically activated without the need for a specific method to be called.</li>
-    </ul>
-    </li> 
-    <li> Internal LTE API 
-    <ul>
-      <li>EpcHelper added methods AddUe, AddX2Interface.  Method AddEnb now requires a cellId.  Signature of ActivateEpsBearer changed to void ActivateEpsBearer (Ptr<NetDevice> ueLteDevice, uint64_t imsi, Ptr<EpcTft> tft, EpsBearer bearer)</li>
-      <li>LteHelper added methods EnableDlPhyTraces, EnableUlPhyTraces, EnableDlTxPhyTraces, EnableUlTxPhyTraces, EnableDlRxPhyTraces, EnableUlRxPhyTraces</li>
-      <li>LteHelper removed methods EnableDlRlcTraces, EnableUlRlcTraces, EnableDlPdcpTraces, EnableUlPdcpTraces</li>
-      <li>RadioBearerStatsCalculator added methods (Set/Get)StartTime, (Set/Get)Epoch, RescheduleEndEpoch, EndEpoch</li>
-      <li>RadioBearerStatsCalculator removed methods StartEpoch, CheckEpoch</li>
-      <li>RadioBearerStatsCalculator methods UlTxPdu, DlRxPdu now require a cellId</li>
-      <li>EpcEnbApplication constructor now requires Ipv4Addresses enbS1uAddress and sgwS1uAddress as well as cellId</li>
-      <li>EpcEnbApplication added methods SetS1SapUser, GetS1SapProvider, SetS1apSapMme and GetS1apSapEnb</li>
-      <li>EpcEnbApplication removed method ErabSetupRequest</li> 
-      <li>EpcSgwPgwApplication added methods SetS11SapMme, GetS11SapSgw, AddEnb, AddUe, SetUeAddress</li>
-      <li>lte-common.h new structs PhyTransmissionStatParameters and PhyReceptionStatParameters used in TracedCallbacks</li>
-      <li>LteControlMessage new message types DL_HARQ, RACH_PREAMBLE, RAR, MIB</li>
-      <li>LteEnbCmacSapProvider new methods RemoveUe, GetRachConfig, AllocateNcRaPreamble, AllocateTemporaryCellRnti</li>
-      <li>LteEnbPhy new methods GetLteEnbCphySapProvider, SetLteEnbCphySapUser, GetDlSpectrumPhy, GetUlSpectrumPhy, CreateSrsReport</li>
-      <li>LteEnbPhy methods DoSendMacPdu, DoSetTransmissionMode, DoSetSrsConfigurationIndex, DoGetMacChTtiDelay, DoSendLteControlMessage, AddUePhy, DeleteUePhy made private</li>
-      <li>LteEnbPhySapProvider removed methods SetBandwidth, SetTransmissionMode, SetSrsConfigurationIndex, SetCellId</li>
-      <li>LteEnbPhySapUser added methods ReceiveRachPreamble, UlInfoListElementHarqFeeback, DlInfoListElementHarqFeeback</li>
-      <li>LtePdcp added methods (Set/Get)Status</li>
-      <li>LtePdcp DoTransmitRrcPdu renamed DoTransmitPdcpSdu</li>
-      <li>LteUeRrc new enum State.  New methods SetLteUeCphySapProvider, GetLteUeCphySapUser, SetLteUeRrcSapUser, GetLteUeRrcSapProvider, GetState, GetDlEarfcn, GetDlBandwidth, GetUlBandwidth, GetCellId, SetUseRlcSm .  GetRnti made const.</li> 
-      <li>LteUeRrc removed methods ReleaseRadioBearer, GetLcIdVector, SetForwardUpCallback, DoRrcConfigurationUpdateInd</li>
-      <li>LtePdcpSapProvider struct TransmitRrcPduParameters renamed TransmitPdcpSduParameters.  Method TransmitRrcPdu renamed TransmitPdcpSdu </li>
-      <li>LtePdcpSapUser struct ReceiveRrcPduParameters renamed ReceivePdcpSduParameters.  Method ReceiveRrcPdu renamed TransmitPdcpSdu</li>
-      <li>LtePdcpSpecificLtePdcpSapProvider method TransmitRrcPdu renamed TransmitPdcpSdu</li>
-      <li>LtePdcpSpecificLtePdcpSapUser method ReceiveRrcPdu  renamed ReceivePdcpSdu. Method ReceiveRrcPdu renamed ReceivePdcpSdu</li>
-      <li>LtePhy removed methods DoSetBandwidth and DoSetEarfcn</li>
-      <li>LtePhy added methods ReportInterference and ReportRsReceivedPower</li>
-      <li>LteSpectrumPhy added methods SetHarqPhyModule, Reset, SetLtePhyDlHarqFeedbackCallback, SetLtePhyUlHarqFeedbackCallback,  AddRsPowerChunkProcessor, AddInterferenceChunkProcessor</li>
-      <li>LteUeCphySapProvider removed methods ConfigureRach, StartContentionBasedRandomAccessProcedure, StartNonContentionBasedRandomAccessProcedure</li>
-      <li>LteUeMac added method AssignStreams</li>
-      <li>LteUeNetDevice methods GetMac, GetRrc, GetImsi  made const</li>
-      <li>LteUeNetDevice new method GetNas</li>
-      <li>LteUePhy new methods GetLteUeCphySapProvider, SetLteUeCphySapUser, GetDlSpectrumPhy, GetUlSpectrumPhy, ReportInterference, ReportRsReceivedPower, ReceiveLteDlHarqFeedback</li>
-      <li>LteUePhy DoSendMacPdu, DoSendLteControlMessage, DoSetTransmissionMode, DoSetSrsConfigurationIndex made private</li>
-      <li>LteUePhySapProvider removed methods SetBandwidth, SetTransmissionMode, SetSrsConfigurationIndex</li>
-      <li>LteUePhySapProvider added method SendRachPreamble</li>  
-    </ul>
-   </li>    
-  </ul>
-  <li>AnimationInterface method EnableIpv4RouteTracking returns reference to calling AnimationInterface object</li>
-  <li>To make the API more uniform across the various
-  PropagationLossModel classes, the Set/GetLambda methods of the
-  FriisPropagationLossModel and TwoRayGroundPropagationLossModel
-  classes have been changed to Set/GetFrequency, and now a Frequency
-  attribute is exported which replaces the pre-existing Lambda
-  attribute. Any previous user code setting a value for Lambda should
-  be changed to set instead a value of Frequency = C / Lambda, with C
-  = 299792458.0. </li>
-</ul>
-<h2>Changes to build system:</h2>
-<ul>
-  <li>Waf shipped with ns-3 has been upgraded to version 1.7.10 and custom
-  pkg-config generator has been replaced by Waf's builtin tool.
-  </li>
-</ul>
-
-<h2>Changed behavior:</h2>
-<ul>
-  <li>DSR link layer notification has changed.  The model originally used 
-  "TxErrHeader" in Ptr<WifiMac> to indicate the transmission
-  error of a specific packet in link layer; however, it was not working
-  correctly.  The model now uses a different path to implement
-  the link layer notification mechanism; specifically, looking into the 
-  trace file to find packet receive events.  If the model finds one 
-  receive event for the data packet, it is used as the indicator for 
-  successful data delivery.</li>
-</ul>
-
-<hr>
-<h1>Changes from ns-3.15 to ns-3.16</h1>
-
-<h2>New API:</h2>
-<ul>
-<li>In the Socket class, the following functions were added: 
- <ul>
-  <li>(Set/Get)IpTos - sets IP Type of Service field in the IP headers.</li>
-  <li>(Set/Is)IpRecvTos - tells the socket to pass information about IP ToS up the stack (by adding SocketIpTosTag to the packet).</li>
-  <li>(Set/Get)IpTtl - sets IP Time to live field in the IP headers.</li>
-  <li>(Set/Is)RecvIpTtl - tells the socket to pass information about IP TTL up the stack (by adding SocketIpTtlTag to the packet).</li>
-  <li>(Set/Is)Ipv6Tclass - sets Traffic Class field in the IPv6 headers.</li>
-  <li>(Set/Is)Ipv6RecvTclass - tells the socket to pass information about IPv6 TCLASS up the stack (by adding SocketIpv6TclassTag to the packet).</li>
-  <li>(Set/Get)Ipv6HopLimit - sets Hop Limit field in the IPv6 headers.</li>
-  <li>(Set/Is)Ipv6RecvHopLimit - tells the socket to pass information about IPv6 HOPLIMIT up the stack (by adding SocketIpv6HoplimitTag to the packet).</li>
- </ul>  
-A user can call these functions to set/get the corresponding socket option. See examples/socket/socket-options-ipv4.cc and examples/socket/socket-options-ipv6.cc for examples.
-</ul>
-
-<h2>Changes to existing API:</h2>
-<ul>
-<li>In the MobilityHelper class, the functions EnableAscii () and EnableAsciiAll () were changed to use output stream wrappers rather than standard C++ ostreams. The purpose of this change was to make them behave analogously to other helpers in ns-3 that generate ascii traces.  Now, the file stream that is open in MobilityHelper is closed nicely upon asserts and program exits.</li>
-</ul>
-
-<h2>Changes to build system:</h2>
-<ul>
-<li>It's now possible to use distcc when building ns-3. See tutorial for details.</li>
-</ul>
-
-<h2>Changed behavior:</h2>
-<ul>
-<li>Sending a packet through Ipv4RawSocket now supports checksum in the Ipv4Header. It is still not possible to manually put in arbitrary checksum as the checksum is automatically calculated at Ipv4L3Protocol. The user has to enable checksum globally for this to work. Simply calling Ipv4Header::EnableChecksum() for a single Ipv4Header will not work.</li>
-<li>Now MultiModelSpectrumChannel allows a SpectrumPhy instance to change SpectrumModel at runtime by issuing a call to MultiModelSpectrumChannel::AddRx (). Previously, MultiModelSpectrumChannel required each SpectrumPhy instance to stick with the same SpectrumModel for the whole simulation. 
-</li>
-</ul>
-
-<hr>
-<h1>Changes from ns-3.14 to ns-3.15</h1>
-
-<h2>New API:</h2>
-<ul>
-<li>A RandomVariableStreamHelper has been introduced to assist with 
-using the Config subsystem path names to assign fixed stream numbers
-to RandomVariableStream objects.</li>
-</ul>
-
-<h2>Changes to existing API:</h2>
-<ul>
-<li>Derived classes of RandomVariable (i.e. the random variable 
-implementations) have been ported to a new RandomVariableStream base class.
-<li>For a given distribution DistributionVariable (such as UniformVariable),
-the new class name is DistributionRandomVariable (such as 
-UniformRandomVariable). </li>
-<li>The new implementations are also derived from class ns3::Object and 
-are handled using the ns-3 smart pointer (Ptr) class.  </li>
-<li>The new variable classes also have a new attributed called "Stream"
-which allows them to be assigned to a fix stream index when assigned
-to the underlying pseudo-random stream of numbers.</li>
-</li>
-</ul>
-
-<h2>Changes to build system:</h2>
-<ul>
-<li></li>
-</ul>
-
-<h2>Changed behavior:</h2>
-<ul>
-<li>Programs using random variables or models that include random variables 
-may exhibit changed output for a given run number or seed, due to a possible 
-change in the order in which random variables are assigned to underlying 
-pseudo-random sequences.  Consult the manual for more information regarding 
-this.</li>
-</ul>
-
-<hr>
-<h1>Changes from ns-3.13 to ns-3.14</h1>
-
-<h2>New API:</h2>
-<ul>
-<li>The new class AntennaModel provides an API for modeling the radiation pattern of antennas.
-</li>
-<li>The new buildings module introduces an API (classes, helpers, etc)
-  to model the presence of buildings in a wireless network topology. 
-</li>
-<li>The LENA project's implementation of the LTE Mac Scheduler Interface Specification
-   standardized by the Small Cell Forum (formerly Femto Forum) is now available for
-  use with the LTE module.
-</li>
-</ul>
-
-<h2>Changes to existing API:</h2>
-<ul>
-<li> The Ipv6RawSocketImpl "IcmpFilter" attribute has been removed. Six 
-new member functions have been added to enable the same functionality.
-</li>
-<li> IPv6 support for TCP and UDP has been implemented.  Socket functions
-that take an address [e.g. Send (), Connect (), Bind ()] can accept an
-ns3::Ipv6Address or a ns3::Address in addition to taking an ns3::Ipv4Address.
-(Note that the ns3::Address must contain a ns3::Ipv6Address or a ns3::Ipv4Address,
-otherwise these functions will return an error).
-Internally, the socket now stores the remote address as a type "ns3::Address"
-instead of a type "ns3::Ipv4Address".  The IPv6 Routing Header extension is not
-currently supported in ns3 and will not be reflected in the TCP and UDP checksum
-calculations per RFC 2460.  Also note that UDP checksums for IPv6 packets are
-required per RFC, but remain optional and disabled by default in ns3 (in the
-interest of performance).
-</li>
-<li>
-When calling Bind () on a socket without an address, the behavior remains the
-same: it will bind to the IPv4 "any" address (0.0.0.0).  In order to Bind () to
-the IPv6 "any" address in a similar fashion, use "Bind6 ()".
-</li>
-<li>
-The prototype for the RxCallback function in the Ipv6EndPoint was changed.
-It now includes the destination IPv6 address of the end point which was
-needed for TCP.  This lead to a small change in the UDP and ICMPv6 L4
-protocols as well.
-</li>
-<li>
-Ipv6RoutingHelper can now print the IPv6 Routing Tables at specific 
-intervals or time. Exactly like Ipv4RoutingHelper do.
-</li>
-<li>
-New "SendIcmpv6Redirect" attribute (and getter/setter functions) to 
-Ipv6L3Protocol. The behavior is similar to Linux's conf "send_redirects", 
-i.e., enable/disable the ICMPv6 Redirect sending.
-</li>
-<li> The SpectrumPhy abstract class now has a new method
-<pre>virtual Ptr&#60;AntennaModel&#62; GetRxAntenna () = 0;</pre>
-that all derived classes need to implement in order to integrate properly with the newly added antenna model. In addition, a new member variable "Ptr&#60;AntennaModel&#62; txAntenna" has been added to SpectrumSignalParameters in order to allow derived SpectrumPhy classes to provide information about the antenna model used for the transmission of a waveform.
-</li>
-<li> The Ns2CalendarScheduler event scheduler has been removed.
-</li>
-<li>
-ErrorUnit enum has been moved into RateErrorModel class, and symbols EU_BIT, EU_BYTE and EU_PKT have been renamed to RateErrorModel::ERROR_UNIT_BIT, RateErrorModel::ERROR_UNIT_BYTE and RateErrorModel::ERROR_UNIT_PACKET. RateErrorModel class attribute "ErrorUnit" values have also been renamed for consistency, and are now "ERROR_UNIT_BIT", "ERROR_UNIT_BYTE", "ERROR_UNIT_PACKET".
-</li>
-<li>
-QueueMode enum from DropTailQueue and RedQueue classes has been unified and moved to Queueu class. Symbols DropTailQueue::PACKETS and DropTailQueue::BYTES are now named Queue::QUEUE_MODE_PACKETS and DropTailQueue::QUEUE_MODE_BYTES. In addition, DropTailQueue and RedQueue class attributes "Mode" have been renamed for consistency from "Packets" and "Bytes" to "QUEUE_MODE_PACKETS" and "QUEUE_MODE_BYTES".
-</li>
-<li>
-The API of the LTE module has undergone a significant redesign with
-the merge of the code from the LENA project. The new API is not
-backwards compatible with the previous version of the LTE module.
-</li>
-<li> The Ipv6AddressHelper API has been aligned with the Ipv4AddressHelper API. 
-The helper can be set with a call to Ipv6AddressHelper::SetBase 
-(Ipv6Address network, Ipv6Prefix prefix) instead of NewNetwork
-(Ipv6Address network, Ipv6Prefix prefix).  A new NewAddress (void) method
-has been added.  Typical usage will involve calls to SetBase (), NewNetwork (),
-and NewAddress (), as in class Ipv4AddressHelper. 
-</li>
-</ul>
-
-<h2>Changes to build system:</h2>
-<ul>
-<li> The following files are removed:
-<pre>
-  src/internet/model/ipv4-l4-protocol.cc
-  src/internet/model/ipv4-l4-protocol.h
-  src/internet/model/ipv6-l4-protocol.cc
-  src/internet/model/ipv6-l4-protocol.h
-</pre>
-and replaced with:
-<pre>
-  src/internet/model/ip-l4-protocol.cc
-  src/internet/model/ip-l4-protocol.h
-</pre>
-</li>
-</ul>
-<h2>Changed behavior:</h2>
-<ul>
-<li> Dual-stacked IPv6 sockets are implemented.  An IPv6 socket can accept
-an IPv4 connection, returning the senders address as an IPv4-mapped address
-(IPV6_V6ONLY socket option is not implemented).
-</li>
-<li>
-The following examples/application/helpers were modified to support IPv6:
-<pre>
-csma-layout/examples/csma-star [*]
-netanim/examples/star-animation [*]
-point-to-point-layout/model/point-to-point-star.cc
-point-to-point-layout/model/point-to-point-grid.cc
-point-to-point-layout/model/point-to-point-dumbbell.cc
-examples/udp/udp-echo [*]
-examples/udp-client-server/udp-client-server [*]
-examples/udp-client-server/udp-trace-client-server [*]
-applications/helper/udp-echo-helper
-applications/model/udp-client
-applications/model/udp-echo-client
-applications/model/udp-echo-server
-applications/model/udp-server
-applications/model/udp-trace-client
-
-[*]  Added '--useIpv6' flag to switch between IPv4 and IPv6
-</pre>
-</li>
-</ul>
-
-<hr>
-<h1>Changes from ns-3.12 to ns-3.13</h1>
-
-<h2>Changes to build system:</h2>
-<ul>
-<li> The underlying version of waf used by ns-3 was upgraded to 1.6.7.  
-This has a few changes for users and developers:
-<ul>
-<li> by default, "build" no longer has a subdirectory debug or optimized.  
-To get different build directories for different build types, you can use 
-the waf configure -o <argument> option, e.g.:
-<pre>
-  ./waf configure -o shared
-  ./waf configure --enable-static -o static
-</pre>
-</li>
-<li> (for developers) the ns3headers taskgen needs to be created with a 
-features parameter name:
-<pre>
-  -  headers = bld.new_task_gen('ns3header')
-  +  headers = bld.new_task_gen(features=['ns3header'])
-</pre>
-<li> no longer need to edit src/wscript to add a module, just create your 
-module directory inside src and ns-3 will pick it up
-<li> In WAF 1.6, adding -Dxxx options is done via the DEFINES env. var.
-instead of CXXDEFINES
-<li> waf env values are always lists now, e.g. env['PYTHON'] returns
-['/usr/bin/python'], so you may need to add [0] to the value in some places
-</ul> 
-</ul>
-
-<h2>New API:</h2>
-<ul>
-<li> In the mobility module, there is a new MobilityModel::GetRelativeSpeed() method returning the relative speed of two objects. </li>
-<li> A new Ipv6AddressGenerator class was added to generate sequential
-addresses from a provided base prefix and interfaceId.  It also will detect
-duplicate address assignments. </li> 
-</ul>
-
-<h2>Changes to existing API:</h2>
-<ul>
-<li> In the spectrum module, the parameters to SpectrumChannel::StartTx () and SpectrumPhy::StartRx () methods are now passed using the new struct SpectrumSignalParameters. This new struct supports inheritance, hence it allows technology-specific PHY implementations to provide technology-specific parameters in SpectrumChannel::StartTx() and SpectrumPhy::StartRx(), while at the same time keeping a set of technology-independent parameters common across all spectrum-enabled PHY implementations (i.e., the duration and the power spectral density which are needed for interference calculation). Additionally, the SpectrumType class has been removed, since now the type of a spectrum signal can be inferred by doing a dynamic cast on SpectrumSignalParameters. See the <A href="http://mailman.isi.edu/pipermail/ns-developers/2011-October/009495.html" >Spectrum API change discussion on ns-developers</A> for the motivation behind this API change.
-</li>
-
-<li> The WifiPhyStandard enumerators for specifying half- and quarter-channel 
-width standards has had a change in capitalization:
-<ul>
-<li> WIFI_PHY_STANDARD_80211_10Mhz was changed to WIFI_PHY_STANDARD_80211_10MHZ
-<li> WIFI_PHY_STANDARD_80211_5Mhz was changed to WIFI_PHY_STANDARD_80211_5MHZ
-</ul>
-<li> In the SpectrumPhy base class, the methods to get/set the
-  MobilityModel and the NetDevice were previously working with
-  opaque Ptr&#60;Object&#62;. Now all these methods have been
-  changed so that they work with Ptr&#60;NetDevice&#62;
-  and Ptr&#60;MobilityModel&#62; as appropriate. See <A href="https://www.nsnam.org/bugzilla/show_bug.cgi?id=1271">Bug 1271</A> on
-  bugzilla for the motivation.
-</li>
-</ul>
-
-<h2>Changed behavior:</h2>
-<ul>
-<li> TCP bug fixes
-<ul> 
-<li> Connection retries count is a separate variable with the retries limit, so cloned sockets can reset the count
-<li> Fix bug on RTO that may halt the data flow
-<li> Make TCP endpoints always holds the accurate address:port info
-<li> RST packet is sent on closed sockets
-<li> Fix congestion window sizing problem upon partial ACK in TcpNewReno
-<li> Acknowledgement is sent, rather than staying silent, upon arrival of unacceptable packets
-<li> Advance TcpSocketBase::m_nextTxSequence after RTO
-</ul>
-<li> TCP enhancements
-<ul>
-<li> Latest RTT value now stored in variable TcpSocketBase::m_lastRtt
-<li> The list variable TcpL4Protocol::m_sockets now always holds all the created, running TcpSocketBase objects
-<li> Maximum announced window size now an attribute, ns3::TcpSocketBase::MaxWindowSize
-<li> TcpHeader now recognizes ECE and CWR flags (c.f. RFC3168)
-<li> Added TCP option handling call in TcpSocketBase for future extension
-<li> Data out of range (i.e. outsize acceptable range of receive window) now computed on bytes, not packets
-<li> TCP moves from time-wait state to closed state after twice the time specified by attribute ns3:TcpSocketBase::MaxSegLifeTime
-<li> TcpNewReno supports limited transmit (RFC3042) if asserting boolean attribute ns3::TcpNewReno::LimitedTransmit
-<li> Nagle's algorithm supported. Default off, turn on by calling TcpSocket::SetTcpNoDelay(true)
-</ul>
-</ul>
-
-<hr>
-<h1>Changes from ns-3.11 to ns-3.12</h1>
-
-<h2>Changes to build system:</h2>
-<ul>
-</ul>
-
-<h2>New API:</h2>
-<ul>
-<li> New method, RegularWifiMac::SetPromisc (void), to set the interface
-to promiscuous mode.
-</ul>
-
-<h2>Changes to existing API:</h2>
-<ul>
-<li> The spelling of the attribute 'IntialCellVoltage' from LiIonEnergySource 
-was corrected to 'InitialCellVoltage'; this will affect existing users who 
-were using the attribute with the misspelling.
-<li> Two trace sources in class WifiPhy have had their names changed:
-<ul> 
-<li> 'PromiscSnifferRx' is now 'MonitorSnifferRx'
-<li> 'PromiscSnifferTx' is now 'MonitorSnifferTx'
-</ul>
-</ul>
-
-<h2>Changed behavior:</h2>
-<ul>
-<li> IPv4 fragmentation is now supported.
-</ul>
-
-<hr>
-<h1>Changes from ns-3.10 to ns-3.11</h1>
-
-<h2>Changes to build system:</h2>
-<ul>
-<li><b>Examples and tests are no longer built by default in ns-3</b>
-<p>
-You can now make examples and tests be built in ns-3 in two ways.
-<ol>
-<li> Using build.py when ns-3 is built for the first time:
-<pre>
-    ./build.py --enable-examples --enable-tests
-</pre>
-<li> Using waf once ns-3 has been built:
-<pre>
-    ./waf configure --enable-examples --enable-tests
-</pre>
-</ol>
-</p></li>
-<li><b> Subsets of modules can be enabled using the ns-3 configuration file</b>
-<p>A new configuration file, .ns3rc, has been added to ns-3 that
-specifies the modules that should be enabled during the ns-3 build.
-See the documentation for details.
-</p></li>
-</ul>
-
-<h2>New API:</h2>
-<ul>
-<li><b>int64x64_t</b>
-<p>The <b>int64x64_t</b> type implements all the C++ arithmetic operators to behave like one of the
-C++ native types. It is a 64.64 integer type which means that it is a 128bit integer type with
-64 bits of fractional precision. The existing <b>Time</b> type is now automatically convertible to
-<b>int64x64_t</b> to allow arbitrarily complex arithmetic operations on the content of <b>Time</b>
-objects. The implementation of <b>int64x64_t</b> is based on the previously-existing
-<b>HighPrecision</b> type and supersedes it.
-</p></li>
-</ul>
-
-<h2>Changes to existing API:</h2>
-<ul>
-<li><b>Wifi TX duration calculation moved from InterferenceHelper to WifiPhy</b>
-<p>The following static methods have been moved from the InterferenceHelper class to the WifiPhy class:
-   <pre>
-static Time CalculateTxDuration (uint32_t size, WifiMode payloadMode, enum WifiPreamble preamble);
-static WifiMode GetPlcpHeaderMode (WifiMode payloadMode, WifiPreamble preamble);
-static uint32_t GetPlcpHeaderDurationMicroSeconds (WifiMode payloadMode, WifiPreamble preamble);
-static uint32_t GetPlcpPreambleDurationMicroSeconds (WifiMode payloadMode, WifiPreamble preamble);
-static uint32_t GetPayloadDurationMicroSeconds (uint32_t size, WifiMode payloadMode);
-</pre>
-</p></li>
-<li><b>Test cases no longer return a boolean value</b>
-<p>Unit test case DoRun() functions no longer return a bool value.  Now, they don't return a value at all.  The motivation for this change was to disallow users from merely returning "true" from a test case to force an error to be recorded.  Instead, test case macros should be used.
-</p></li>
-<li><b>PhyMac renamed to GenericPhy</b>
-<p>The PhyMac interface previously defined in phy-mac.h has been
-  renamed to GenericPhy interface and moved to a new file
-  generic-phy.h. The related variables and methods have been renamed accordingly. 
-</p></li>
-<li><b>Scalar</b>
-<p>The Scalar type has been removed. Typical code such as:
-<pre>
-Time tmp = ...;
-Time result = tmp * Scalar (5);
-</pre>
-Can now be rewritten as:
-<pre>
-Time tmp = ...;
-Time result = Time (tmp * 5);
-</pre>
-</p>
-</li>
-<li><b>Multicast GetOutputTtl() commands</b>
-<p> As part of bug 1047 rework to enable multicast routes on nodes with
-more than 16 interfaces, the methods Ipv4MulticastRoute::GetOutputTtl () 
-and Ipv6MulticastRoute::GetOutputTtl () have been modified to return
-a std::map of interface IDs and TTLs for the route.
-</p>
-</li>
-</ul>
-
-<h2>Changed behavior:</h2>
-<ul>
-  <li> If the data inside the TCP buffer is less than the available window, TCP tries to ask for more data to the application, in the hope of filling the usable transmission window. In some cases, this change allows sending bigger packets than the previous versions, optimizing the transmission.</li>
-  <li> In TCP, the ACK is now processed before invoking any routine that deals with the segment sending, except in case of retransmissions.</li>
-</ul>
-
-<hr>
-<h1>Changes from ns-3.9 to ns-3.10</h1>
-
-<h2>Changes to build system:</h2>
-<ul>
-<li><b>Regression tests are no longer run using waf</b>
-<p>All regression testing is now being done in test.py.  As a result, a 
-separate reference trace repository is no longer needed to perform 
-regression tests.  Tests that require comparison against known good traces
-can still be run from test.py.  The --regression option for waf has been
-removed.  However, the "-r" option to download.py has been kept to 
-allow users to fetch older revisions of ns-3 that contain these traces.
-</p>
-<li><b>Documentation converted to Sphinx</b>
-<p> Project documentation (manual, tutorial, and testing) have been
-converted to Sphinx from the GNU Texinfo markup format.</p>
-</ul>
-
-<h2>New API:</h2>
-<ul>
-<li><b>Pyviz visualizer</b>  
-<p>A Python-based visualizer called pyviz is now integrated with ns-3.
-For Python simulations, there is an API to start the visualizer.  You
-have to import the visualizer module, and call visualizer.start()
-instead of ns3.Simulator.Run().  For C++ simulations, there is no API.
-For C++ simulations (but also works for Python ones) you need to set
-the GlobalValue SimulatorImplementationType to
-"ns3::VisualSimulatorImpl".  This can be set from the command-line,
-for example (add the
-<tt>--SimulatorImplementationType=ns3::VisualSimulatorImpl</tt>
-option), or via the waf option <tt>--visualizer</tt>, in addition to
-the usual <tt>--run</tt> option to run programs.
-</p></li>
-
-<li><b>WaypointMobility attributes</b>
-<p>Two attributes were added to WaypointMobility model:  LazyNotify and
-InitialPositionIs Waypoint.  See RELEASE_NOTES for details.  </p> </li>
-
-<li><b>802.11g rates for ERP-OFDM added</b>
-<p>New WifiModes of the form ErpOfdmRatexxMbps, where xx is the rate
-in Mbps (6, 9, 12, 18, 24, 36, 48, 54), are available for 802.11g.  
-More details are in the RELEASE_NOTES.  </p> </li>
-
-<li><b>Socket::GetSocketType ()</b>
-<p>This is analogous to getsockopt(SO_TYPE). ipv4-raw-socket, ipv6-raw-socket,
-  and packet-socket return NS3_SOCK_RAW. tcp-socket and nsc-tcp-socket return
-  NS3_SOCK_STREAM. udp-socket returns NS3_SOCK_DGRAM.</p></li>
-
-<li><b>BulkSendApplication</b>
-<p>Sends data as fast as possible up to MaxBytes or unlimited if MaxBytes is 
-zero.  Think OnOff, but without the "off" and without the variable data rate. 
-This application only works with NS3_SOCK_STREAM and NS3_SOCK_SEQPACKET sockets, 
-for example TCP sockets and not UDP sockets. A helper class exists to 
-facilitate creating BulkSendApplications. The API for the helper class 
-is similar to existing application helper classes, for example, OnOff.
-</p></li>
-
-<li><b>Rakhmatov Vrudhula non-linear battery model</b>
-<p>New class and helper for this battery model. </p></li>
-
-<li><b>Print IPv4 routing tables</b>
-<p>New class methods and helpers for printing IPv4 routing tables
-to an output stream. </p></li>
-
-<li><b>Destination-Sequenced Distance Vector (DSDV) routing protocol</b>
-<p>Derives from Ipv4RoutingProtocol and contains a DsdvHelper class. </p></li>
-
-<li><b>3GPP Long Term Evolution (LTE) models</b>
-<p>More details are in the RELEASE_NOTES. </p></li>
-
-</ul>
-
-<h2>Changes to existing API:</h2>
-<ul>
-<li><b>Consolidation of Wi-Fi MAC high functionality</b>
-<p>Wi-Fi MAC high classes have been reorganised in attempt to
-consolidate shared functionality into a single class. This new class
-is RegularWifiMac, and it derives from the abstract WifiMac, and is
-parent of AdhocWifiMac, StaWifiMac, ApWifiMac, and
-MeshWifiInterfaceMac. The QoS and non-QoS class variants are no
-longer, with a RegularWifiMac attribute "QosSupported" allowing
-selection between these two modes of operation. QosWifiMacHelper and
-NqosWifiMacHelper continue to work as previously, with a
-behind-the-scenes manipulation of the 'afore-mentioned attribute.
-</p></li>
-
-<li><b>New TCP architecture</b>
-<p>TcpSocketImpl was replaced by a new base class TcpSocketBase and
-several subclasses implementing different congestion control.  From 
-a user-level API perspective, the main change is that a new attribute
-"SocketType" is available in TcpL4Protocol, to which a TypeIdValue
-of a specific Tcp variant can be passed.  In the same class, the attribute 
-"RttEstimatorFactory" was also renamed "RttEstimatorType" since it now
-takes a TypeIdValue instead of an ObjectFactoryValue.  In most cases, 
-however, no change to existing user programs should be needed.
-</p></li>
-</ul>
-
-<h2>Changed behavior:</h2>
-<ul>
-<li><b>EmuNetDevice uses DIX instead of LLC encapsulation by default</b>
-<p>bug 984 in ns-3 tracker:  real devices don't usually understand LLC/SNAP
-so the default of DIX makes more sense.
-</p></li>
-<li><b>TCP defaults to NewReno congestion control</b>
-<p>As part of the TCP socket refactoring, a new TCP implementation provides
-slightly different behavior than the previous TcpSocketImpl that provided
-only fast retransmit.  The default behavior now is NewReno which provides
-fast retransmit and fast recovery with window inflation during recovery.
-</p></li>
-</ul>
-
-<hr>
-<h1>Changes from ns-3.8 to ns-3.9</h1>
-
-<h2>Changes to build system:</h2>
-
-<h2>New API:</h2>
-<ul>
-<li><b>Wifi set block ack threshold:</b> Two methods for setting block ack
-parameters for a specific access class: 
-<pre>
-void QosWifiMacHelper::SetBlockAckThresholdForAc (enum AccessClass accessClass, uint8_t threshold);
-void QosWifiMacHelper::SetBlockAckInactivityTimeoutForAc (enum AccessClass accessClass, uint16_t timeout);
-</pre>
-</li>
-<li><b>Receive List Error Model:</b>  Another basic error model that allows
-the user to specify a list of received packets that should be errored.  The
-list corresponds not to the packet UID but to the sequence of received
-packets as observed by the error model.   See src/common/error-model.h
-</li>
-<li><b>Respond to interface events:</b> New attribute for Ipv4GlobalRouting,
-"RespondToInterfaceEvents", which when enabled, will cause global routes
-to be recomputed upon any interface or address notification event from IPv4.
-</li>
-<li><b>Generic sequence number:</b> New generic sequence number class to 
-easily handle comparison, subtraction, etc. for sequence numbers.  
-To use it you need to supply two fundamental types as template parameters: 
-NUMERIC_TYPE and SIGNED_TYPE.  For instance, <tt>SequenceNumber&lt;uint32_t, int32_t&gt;</tt> 
-gives you a 32-bit sequence number, while <tt>SequenceNumber&lt;uint16_t, int16_t&gt;</tt> 
-is a 16-bit one.  For your convenience, these are typedef'ed as 
-<tt>SequenceNumber32</tt> and <tt>SequenceNumber16</tt>, respectively.
-</li>
-
-<li><b>Broadcast socket option:</b> New Socket
-methods <tt>SetAllowBroadcast</tt> and <tt>GetAllowBroadcast</tt> add
-to NS-3 <tt>Socket</tt>'s the equivalent to the POSIX SO_BROADCAST
-socket option (setsockopt/getsockopt).  Starting from this NS-3
-version, IPv4 sockets do not allow us to send packets to broadcast
-destinations by default; SetAllowBroadcast must be called beforehand
-if we wish to send broadcast packets.
-</li>
-
-<li><b>Deliver of packet ancillary information to sockets:</b> A method to deliver ancillary information 
-to the socket interface (fixed in bug 671):  <pre>void Socket::SetRecvPktInfo (bool flag);</pre>
-
-</ul>
-
-<h2>Changes to existing API:</h2>
-
-<ul>
-<li><b>Changes to construction and naming of Wi-Fi transmit rates:</b>
-A reorganisation of the construction of Wi-Fi transmit rates has been
-undertaken with the aim of simplifying the task of supporting further
-IEEE 802.11 PHYs. This work has been completed under the auspices of
-Bug 871.
-
-From the viewpoint of simulation scripts not part of the ns-3
-distribution, the key change is that WifiMode names of the form
-wifi<em>x</em>-<em>n</em>mbs are now invalid. Names now take the
-form <em>Cccc</em>Rate<em>n</em>Mbps[BW<em>b</em>MHz],
-where <em>n</em> is the root bitrate in megabits-per-second as before
-(with only significant figures included, and an underscore replacing
-any decimal point), and <em>Cccc</em> is a representation of the
-Modulation Class as defined in Table 9-2 of IEEE
-Std. 802.11-2007. Currently-supported options for <em>Cccc</em>
-are <em>Ofdm</em> and <em>Dsss</em>. For modulation classes where
-optional reduced-bandwidth transmission is possible, this is captured
-in the final part of the form above, with <em>b</em> specifying the
-nominal signal bandwidth in megahertz. </li>
-
-<li><b>Consolidation of classes support Wi-Fi Information Elements:</b>
-When the <em>mesh</em> module was introduced it added a class
-hierarchy for modelling of the various Information Elements that were
-required. In this release, this class hierarchy has extended by moving
-the base classes (WifiInformationElement and
-WifiInformationElementVector) into the <em>wifi</em> module. This
-change is intended to ease the addition of support for modelling of
-further Wi-Fi functionality. </li>
-
-<li><b>Changed for {Ipv4,Ipv6}PacketInfoTag delivery:</b> In order to
-deliver ancillary information to the socket interface (fixed in bug 671),
-<em>Ipv4PacketInfoTag</em> and <em>Ipv6PacketInfoTag</em> are implemented. 
-For the delivery of this information, the following changes are made into 
-existing class.
-
-In Ipv4EndPoint class,
-<pre>
--  void SetRxCallback (Callback&lt;void,Ptr&lt;Packet&gt;, Ipv4Address, Ipv4Address, uint16_t&gt; callback);
-+  void SetRxCallback (Callback&lt;void,Ptr&lt;Packet&gt;, Ipv4Header, uint16_t, Ptr&lt;Ipv4Interface&gt; &gt; callback);
-
--  void ForwardUp (Ptr&lt;Packet&gt; p, Ipv4Address saddr, Ipv4Address daddr, uint16_t sport);
-+  void ForwardUp (Ptr&lt;Packet&gt; p, const Ipv4Header& header, uint16_t sport, 
-+                  Ptr&lt;Ipv4Interface&gt; incomingInterface);
-</pre>
-In Ipv4L4Protocol class,
-<pre>
-   virtual enum RxStatus Receive(Ptr&lt;Packet&gt; p, 
--                                Ipv4Address const &source,
--                                Ipv4Address const &destination,
-+                                Ipv4Header const &header,
-                                 Ptr&lt;Ipv4Interface&gt; incomingInterface) = 0;
-</pre>
-<pre>
--Ipv4RawSocketImpl::ForwardUp (Ptr&lt;const Packet&gt; p, Ipv4Header ipHeader, Ptr&lt;NetDevice&gt; device)
-+Ipv4RawSocketImpl::ForwardUp (Ptr&lt;const Packet&gt; p, Ipv4Header ipHeader, Ptr&lt;Ipv4Interface&gt; incomingInterface)
-
--NscTcpSocketImpl::ForwardUp (Ptr&lt;Packet&gt; packet, Ipv4Address saddr, Ipv4Address daddr, uint16_t port)
-+NscTcpSocketImpl::ForwardUp (Ptr&lt;Packet&gt; packet, Ipv4Header header, uint16_t port,
-+                             Ptr&lt;Ipv4Interface&gt; incomingInterface)
-
--TcpSocketImpl::ForwardUp (Ptr&lt;Packet&gt; packet, Ipv4Address saddr, Ipv4Address daddr, uint16_t port)
-+TcpSocketImpl::ForwardUp (Ptr&lt;Packet&gt; packet, Ipv4Header header, uint16_t port,
-+                          Ptr&lt;Ipv4Interface&gt; incomingInterface)
-
--UdpSocketImpl::ForwardUp (Ptr&lt;Packet&gt; packet, Ipv4Address saddr, Ipv4Address daddr, uint16_t port)
-+UdpSocketImpl::ForwardUp (Ptr&lt;Packet&gt; packet, Ipv4Header header, uint16_t port,
-+                          Ptr&lt;Ipv4Interface&gt; incomingInterface)
-
-</pre>
-  
-</li>
-<li>The method OutputStreamWrapper::SetStream (std::ostream *ostream) was removed.</li>
-)
-</ul>
-
-<h2>Changed behavior:</h2>
-<ul>
-<li><b>Queue trace behavior during Enqueue changed:</b> The behavior of the
-Enqueue trace source has been changed to be more intuitive and to agree with
-documentation.  Enqueue and Drop events in src/node/queue.cc are now mutually
-exclusive.  In the past, the meaning of an Enqueue event was that the Queue
-Enqueue operation was being attempted; and this could be followed by a Drop
-event if the Queue was full.  The new behavior is such that a packet is either
-Enqueue'd successfully or Drop'ped.
-
-<li><b>Drop trace logged for Ipv4/6 forwarding failure:</b> Fixed bug 861; this 
-will add ascii traces (drops) in Ipv4 and Ipv6 traces for forwarding failures
-
-<li><b>Changed default WiFi error rate model for OFDM modulation types:</b> 
-Adopted more conservative ErrorRateModel for OFDM modulation types (a/g).
-This will require 4 to 5 more dB of received power to get similar results
-as before, so users may observe a reduced WiFi range when using the defaults.
-See tracker issue 944 for more details.
-</ul>
-
-<hr>
-<h1>Changes from ns-3.7 to ns-3.8</h1>
-
-<h2>Changes to build system:</h2>
-
-<h2>New API:</h2>
-
-<ul>
-<li><b>Matrix propagation loss model:</b> This radio propagation model uses a two-dimensional matrix
-of path loss indexed by source and destination nodes.
-
-<li><b>WiMAX net device</b>: The developed WiMAX model attempts to provide an accurate MAC and
-PHY level implementation of the 802.16 specification with the Point-to-Multipoint (PMP) mode and the WirelessMAN-OFDM 
-PHY layer. By adding WimaxNetDevice objects to ns-3 nodes, one can create models of
-802.16-based networks. The source code for the WiMAX models lives in the directory src/devices/wimax.
-The model is mainly composed of three layers:
-<ul>
-<li>The convergence sublayer (CS)
-<li>The MAC Common Part Sublayer (MAC-CPS)
-<li>The Physical layer
-</ul>
-The main way that users who write simulation scripts will typically
-interact with the Wimax models is through the helper API and through
-the publicly visible attributes of the model.
-The helper API is defined in src/helper/wimax-helper.{cc,h}.
-Three examples containing some code that shows how to setup a 802.16 network are located under examples/wimax/ 
-
-<li><b>MPI Interface for distributed simulation:</b> Enables access
-to necessary MPI information such as MPI rank and size.
-
-<li><b>Point-to-point remote channel:</b> Enables point-to-point 
-connection between net-devices on different simulators, for use 
-with distributed simulation.
-
-<li><b>GetSystemId in simulator:</b> For use with distributed 
-simulation, GetSystemId returns zero by non-distributed 
-simulators.  For the distributed simulator, it returns the 
-MPI rank.
-
-<li><b>Enhancements to src/core/random-variable.cc/h:</b> New Zeta random variable generator. The Zeta random 
-distribution is tightly related to the Zipf distribution (already in ns-3.7). See the documentation, 
-especially because sometimes the Zeta distribution is called Zipf and viceversa. Here we conform to the 
-Wikipedia naming convention, i.e., Zipf is bounded while Zeta isn't. 
-
-<li><b>Two-ray ground propagation loss model:</b> Calculates the crossover distance under which Friis is used. The antenna 
-height is set to the nodes z coordinate, but can be added to using the model parameter SetHeightAboveZ, which 
-will affect ALL stations
-
-<li><b>Pareto random variable</b> has two new constructors to specify scale and shape:
-<pre>
-ParetoVariable (std::pair<double, double> params);
-ParetoVariable (std::pair<double, double> params, double b);
-</pre>
-</ul>
-
-<h2>Changes to existing API:</h2>
-<ul>
-<li><b>Tracing Helpers</b>: The organization of helpers for both pcap and ascii
-tracing, in devices and protocols, has been reworked.  Instead of each device 
-and protocol helper re-implementing trace enable methods, classes have been 
-developed to implement user-level tracing in a consistent way; and device and 
-protocol helpers use those classes to provide tracing functionality.<br>
-In addition to consistent operation across all helpers, the object name service
-has been integrated into the trace file naming scheme.<br>
-The internet stack helper has been extensively massaged to make it easier to 
-manage traces originating from protocols.  It used to be the case that there 
-was essentially no opportunity to filter tracing on interfaces, and resulting
-trace file names collided with those created by devices.  File names are now
-disambiguated and one can enable traces on a protocol/interface basis analogously
-to the node/device granularity of device-based helpers.<br>
-The primary user-visible results of this change are that trace-related functions
-have been changed from static functions to method calls; and a new object has
-been developed to hold streams for ascii traces.<br>
-New functionality is present for ascii traces.  It is now possible to create
-multiple ascii trace files automatically just as was possible for pcap trace 
-files.<br>
-The implementation of the helper code has been designed also to provide 
-functionality to make it easier for sophisticated users to hook traces of 
-various kinds and write results to (file) streams.
-Before:
-<pre>
-  CsmaHelper::EnablePcapAll ();
-
-  std::ofstream ascii;
-  ascii.open ("csma-one-subnet.tr", std::ios_base::binary | std::ios_base::out);
-  CsmaHelper::EnableAsciiAll (ascii);
-
-  InternetStackHelper::EnableAsciiAll (ascii);
-</pre>
-After:
-<pre>
-  CsmaHelper csmaHelper;
-  InternetStackHelper stack;
-  csmaHelper.EnablePcapAll ();
-
-  AsciiTraceHelper ascii;
-  csma.EnableAsciiAll (ascii.CreateFileStream ("csma-one-subnet.tr"));
-
-  stack.EnableAsciiIpv4All (stream);
-</pre>
-
-
-<li><b>Serialization and Deserialization</b> in buffer, nix-vector, 
-packet-metadata, and packet has been modified to use raw character 
-buffers, rather than the Buffer class
-<pre>
-+ uint32_t Buffer::GetSerializedSize (void) const;
-+ uint32_t Buffer::Serialize (uint8_t* buffer, uint32_t maxSize) const;
-+ uint32_t Buffer::Deserialize (uint8_t* buffer, uint32_t size); 
-
-- void NixVector::Serialize (Buffer::Iterator i, uint32_t size) const;
-+ uint32_t NixVector::Serialize (uint32_t* buffer, uint32_t maxSize) const;
-- uint32_t NixVector::Deserialize (Buffer::Iterator i);
-+ uint32_t NixVector::Deserialize (uint32_t* buffer, uint32_t size);
-
-- void PacketMetadata::Serialize (Buffer::Iterator i, uint32_t size) const;
-+ uint32_t PacketMetadata::Serialize (uint8_t* buffer, uint32_t maxSize) const;
-- uint32_t PacketMetadata::Deserialize (Buffer::Iterator i);
-+ uint32_t PacketMetadata::Deserialize (uint8_t* buffer, uint32_t size);
-
-+ uint32_t Packet::GetSerializedSize (void) const;
-- Buffer Packet::Serialize (void) const;
-+ uint32_t Packet::Serialize (uint8_t* buffer, uint32_t maxSize) const;
-- void Packet::Deserialize (Buffer buffer);
-+ Packet::Packet (uint8_t const*buffer, uint32_t size, bool magic);
-</pre>
-<li><b>PacketMetadata uid</b> has been changed to a 64-bit value. The 
-lower 32 bits give the uid, while the upper 32-bits give the MPI rank 
-for distributed simulations. For non-distributed simulations, the 
-upper 32 bits are simply zero.
-<pre>
-- inline PacketMetadata (uint32_t uid, uint32_t size);
-+ inline PacketMetadata (uint64_t uid, uint32_t size);
-- uint32_t GetUid (void) const;
-+ uint64_t GetUid (void) const;
-- PacketMetadata::PacketMetadata (uint32_t uid, uint32_t size);
-+ PacketMetadata::PacketMetadata (uint64_t uid, uint32_t size); 
-
-- uint32_t Packet::GetUid (void) const;
-+ uint64_t Packet::GetUid (void) const;
-</pre>
-
-<li><b>Moved propagation models</b> from src/devices/wifi to src/common
-
-<li><b>Moved Mtu attribute from base class NetDevice</b> This attribute is
-now found in all NetDevice subclasses.  
-</ul>
-
-<h2>Changed behavior:</h2>
-<ul>
-
-</ul>
-
-<hr>
-<h1>Changes from ns-3.6 to ns-3.7</h1>
-
-
-<h2>Changes to build system:</h2>
-
-<h2>New API:</h2>
-
-<ul>
-<li><b>Equal-cost multipath for global routing:</b> Enables quagga's
-equal cost multipath for Ipv4GlobalRouting, and adds an attribute that
-can enable it with random packet distribution policy across equal cost routes.
-<li><b>Binding sockets to devices:</b> A method analogous to a SO_BINDTODEVICE
-socket option has been introduced to class Socket:  <pre>virtual void Socket::BindToNetDevice (Ptr&lt;NetDevice&gt; netdevice);</pre>
-<li><b>Simulator event contexts</b>: The Simulator API now keeps track of a per-event
-'context' (a 32bit integer which, by convention identifies a node by its id). Simulator::GetContext
-returns the context of the currently-executing event while Simulator::ScheduleWithContext creates an
-event with a context different from the execution context of the caller. This API is used
-by the ns-3 logging system to report the execution context of each log line.
-<li><b>Object::DoStart</b>: Users who need to complete their object setup at the start of a simulation
-can override this virtual method, perform their adhoc setup, and then, must chain up to their parent.
-<li><b>Ad hoc On-Demand Distance Vector (AODV)</b> routing model, 
-<a href=http://www.ietf.org/rfc/rfc3561.txt>RFC 3561</a> </li>
-<li><b>Ipv4::IsDestinationAddress (Ipv4Address address, uint32_t iif)</b> Method added to support checks of whether a destination address should be accepted 
-as one of the host's own addresses.  RFC 1122 Strong/Weak end system behavior can be changed with a new attribute (WeakEsModel) in class Ipv4.  </li>
-
-<li><b>Net-anim interface</b>: Provides an interface to net-anim, a network animator for point-to-point 
-links in ns-3.  The interface generates a custom trace file for use with the NetAnim program.</li>
-
-<li><b>Topology Helpers</b>: New topology helpers have been introduced including PointToPointStarHelper, 
-PointToPointDumbbellHelper, PointToPointGridHelper, and CsmaStarHelper.</li>
-
-<li><b>IPv6 extensions support</b>: Provides API to add IPv6 extensions and options. Two examples (fragmentation
-and loose routing) are available.</li>
-</ul>
-
-<h2>Changes to existing API:</h2>
-<ul>
-<li><b>Ipv4RoutingProtocol::RouteOutput</b> no longer takes an outgoing 
-interface index but instead takes an outgoing device pointer; this affects all
-subclasses of Ipv4RoutingProtocol.
-<pre>
--  virtual Ptr&lt;Ipv4Route&gt; RouteOutput (Ptr&lt;Packet&gt; p, const Ipv4Header &header, uint32_t oif, Socket::SocketErrno &sockerr) = 0;
-+  virtual Ptr&lt;Ipv4Route&gt; RouteOutput (Ptr&lt;Packet&gt; p, const Ipv4Header &header, Ptr&lt;NetDevice&gt; oif, Socket::SocketErrno &sockerr) = 0;
-</pre>
-<li><b>Ipv6RoutingProtocol::RouteOutput</b> no longer takes an outgoing 
-interface index but instead takes an outgoing device pointer; this affects all
-subclasses of Ipv6RoutingProtocol.
-<pre>
--  virtual Ptr&lt;Ipv6Route&gt; RouteOutput (Ptr&lt;Packet&gt; p, const Ipv6Header &header, uint32_t oif, Socket::SocketErrno &sockerr) = 0;
-+  virtual Ptr&lt;Ipv6Route&gt; RouteOutput (Ptr&lt;Packet&gt; p, const Ipv6Header &header, Ptr&lt;NetDevice&gt; oif, Socket::SocketErrno &sockerr) = 0;
-</pre>
-<li><b>Application::Start</b> and <b>Application::Stop</b> have been renamed to
-<b>Application::SetStartTime</b> and <b>Application::SetStopTime</b>.
-<li><b>Channel::Send</b>: this method does not really exist but each subclass of the Channel
-base class must implement a similar method which sends a packet from a node to another node.
-Users must now use Simulator::ScheduleWithContext instead of Simulator::Schedule to schedule
-the reception event on a remote node.<br>
-For example, before:
-<pre>
-void
-SimpleChannel::Send (Ptr&lt;Packet&gt; p, uint16_t protocol, 
-         Mac48Address to, Mac48Address from,
-         Ptr&lt;SimpleNetDevice&gt; sender)
-{
-  for (std::vector&lt;Ptr&lt;SimpleNetDevice&gt; &gt;::const_iterator i = m_devices.begin (); i != m_devices.end (); ++i)
-    {
-      Ptr&lt;SimpleNetDevice&gt; tmp = *i;
-      if (tmp == sender)
-  {
-    continue;
-  }
-      Simulator::ScheduleNow (&SimpleNetDevice::Receive, tmp, p->Copy (), protocol, to, from);
-    }
-}
-</pre>
-After:
-<pre>
-void
-SimpleChannel::Send (Ptr&lt;Packet&gt; p, uint16_t protocol, 
-         Mac48Address to, Mac48Address from,
-         Ptr&lt;SimpleNetDevice&gt; sender)
-{
-  for (std::vector&lt;Ptr&lt;SimpleNetDevice&gt; &gt;::const_iterator i = m_devices.begin (); i != m_devices.end (); ++i)
-    {
-      Ptr&lt;SimpleNetDevice&gt; tmp = *i;
-      if (tmp == sender)
-  {
-    continue;
-  }
-      Simulator::ScheduleWithContext (tmp->GetNode ()->GetId (), Seconds (0),
-                                      &SimpleNetDevice::Receive, tmp, p->Copy (), protocol, to, from);
-    }
-}
-</pre>
-
-<li><b>Simulator::SetScheduler</b>: this method now takes an ObjectFactory
-instead of an object pointer directly. Existing callers can trivially be
-updated to use this new method.<br>
-Before:
-<pre>
-Ptr&lt;Scheduler&gt; sched = CreateObject&lt;ListScheduler&gt; ();
-Simulator::SetScheduler (sched);
-</pre>
-After:
-<pre>
-ObjectFactory sched;
-sched.SetTypeId ("ns3::ListScheduler");
-Simulator::SetScheduler (sched);
-</pre>
-
-<li> Extensions to IPv4 <b>Ping</b> application: verbose output and the ability to configure different ping 
-sizes and time intervals (via new attributes)
-
-<li><b>Topology Helpers</b>: Previously, topology helpers such as a point-to-point star existed in the 
-PointToPointHelper class in the form of a method (ex: PointToPointHelper::InstallStar).  These topology 
-helpers have been pulled out of the specific helper classes and created as separate classes.  Several 
-different topology helper classes now exist including PointToPointStarHelper, PointToPointGridHelper, 
-PointToPointDumbbellHelper, and CsmaStarHelper.  For example, a user wishes to create a 
-point-to-point star network:<br>
-Before:
-<pre>
-NodeContainer hubNode;
-NodeContainer spokeNodes;
-hubNode.Create (1);
-Ptr&lt;Node&gt; hub = hubNode.Get (0);
-spokeNodes.Create (nNodes - 1);
-
-PointToPointHelper pointToPoint;
-pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
-pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));
-NetDeviceContainer hubDevices, spokeDevices;
-pointToPoint.InstallStar (hubNode.Get (0), spokeNodes, hubDevices, spokeDevices);
-</pre>
-After:
-<pre>
-PointToPointHelper pointToPoint;
-pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
-pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));
-PointToPointStarHelper star (nSpokes, pointToPoint);
-</pre>
-
-</li>
-
-</ul>
-
-<h2>Changed behavior:</h2>
-<ul>
-<li> Changed default value of YansWifiPhy::EnergyDetectionThreshold from
--140.0 dBm to -96.0 dBm.  Changed default value of 
-YansWifiPhy::CcaModelThreshold from -140.0 dBm to -99.0 dBm.  Rationale
-can be found <a href="http://www.nsnam.org/bugzilla/show_bug.cgi?id=689"> 
-here</a>.
-</li>
-<li> Default TTL of IPv4 broadcast datagrams changed from 1 to 64.</li>
-<li> Changed DcfManager::UpdateBackoff (): using flooring instead of rounding in calculation of remaining slots. <a href="http://www.nsnam.org/bugzilla/show_bug.cgi?id=695">
-  See bug 695.</a></li>
-</ul>
-
-
-<hr>
-<h1>Changes from ns-3.5 to ns-3.6</h1>
-
-<h2>Changes to build system:</h2>
-<ul>
-<li><b>A new test framework is provided with ns-3.6 that primarilay runs outside waf</b>
-<p>"./waf check" now runs the new unit tests of the core part of ns-3.6.  
-In order to run the complete test package, use "./test.py" which is 
-documented in a new manual -- find it in ./doc/testing.  "./waf check"
-no longer generates the introspected Doxygen.  Now use "./waf doxygen"
-to do this and generate the Doxygen documentation in one step.
-</p>
-</ul>
-
-<h2>New API:</h2>
-<ul>
-<li><b>Longest prefix match, support for metrics, for Ipv4StaticRouting and Ipv6StaticRouting</b>
-<p>When performing route lookup, first match for longest prefix, and then
-based on metrics (default metric = 0).  If metrics are equal, most recent
-addition is picked.  Extends API for support of metrics but preserves
-backward compatibility.  One small change is that the default route
-is no longer stored as index 0 route in the host route table so 
-GetDefaultRoute () must be used.
-</p>
-</li>
-<li><b>Route injection for global routing</b>
-<p>Add ability to inject and withdraw routes to Ipv4GlobalRouting.  This
-allows a user to insert a route and have it redistributed like an OSPF
-external LSA to the rest of the topology.
-</p>
-</li>
-
-<li><b>Athstats</b>
-<p>New classes AthstatsWifiTraceSink and AthstatsHelper.
-</p>
-</li>
-<li><b>WifiRemoteStationManager </b>
-<p>New trace sources exported by WifiRemoteStationManager: MacTxRtsFailed, MacTxDataFailed, MacTxFinalRtsFailed and MacTxFinalDataFailed.
-</p>
-</li>
-
-<li><b> IPv6 additions</b>
-<p> Add an IPv6 protocol and ICMPv6 capability.
-<ul>
-<li> new classes Ipv6, Ipv6Interface, Ipv6L3Protocol, Ipv6L4Protocol
-<li> Ipv6RawSocket (no UDP or TCP capability yet)
-<li> a set of classes to implement Icmpv6, including neighbor discovery,
-router solicitation, DAD
-<li> new applications Ping6 and Radvd
-<li> routing objects Ipv6Route and Ipv6MulticastRoute
-<li> routing protocols Ipv6ListRouting and Ipv6StaticRouting
-<li> examples: icmpv6-redirect.cc, ping6.cc, radvd.cc, radvd-two-prefix.cc, simple-routing-ping6.cc
-</ul>
-</p>
-</li> 
-
-<li><b>Wireless Mesh Networking models</b>
-<ul>
-<p>
-<li> General multi-interface mesh stack infrastructure (devices/mesh module).
-<li> IEEE 802.11s (Draft 3.0) model including Peering Management Protocol and HWMP.
-<li> Forwarding Layer for Meshing (FLAME) protocol.
-</ul>
-</p>
-</li>
-
-<li><b>802.11 enhancements</b>
-<p>
-<ul>
-<li> 10MHz and 5MHz channel width supported by 802.11a model (Ramon Bauza and Kirill Andreev).
-</ul>
-<ul>
-<li> Channel switching support. YansWifiPhy can now switch among different channels (Ramon Bauza and Pavel Boyko).
-</ul>
-</p>
-</li>
-
-<li><b> Nix-vector Routing</b>
-<p> Add nix-vector routing protocol
-<ul>
-<li> new helper class Ipv4NixVectorHelper
-</ul>
-<ul>
-<li> examples: nix-simple.cc, nms-p2p-nix.cc
-</ul> 
-</p>
-</li>
-
-<li><b>New Test Framework</b>
-<p> Add TestCase, TestSuite classes
-<ul>
-<li> examples: src/core/names-test-suite.cc, src/core/random-number-test-suite.cc, src/test/ns3tcp/ns3tcp-cwnd-test-suite.cc
-</ul> 
-</p>
-</li>
-
-</ul>
-
-<h2>Changes to existing API:</h2>
-<ul>
-<li><b>InterferenceHelper</b>
-<p>The method InterferenceHelper::CalculateTxDuration (uint32_t size, WifiMode payloadMode, WifiPreamble preamble) has been made static, so that the frame duration depends only on the characteristics of the frame (i.e., the function parameters) and not on the particular standard which is used by the receiving PHY. This makes it now possible to correctly calculate the duration of incoming frames in scenarios in which devices using different PHY configurations coexist in the same channel (e.g., a BSS using short preamble and another BSS using long preamble). </p>
-<p> The following member methods have been added to InterferenceHelper:</p>
-<pre>
-  static WifiMode GetPlcpHeaderMode (WifiMode, WifiPreamble);
-  static uint32_t GetPlcpHeaderDurationMicroSeconds (WifiMode, WifiPreamble);
-  static uint32_t GetPlcpPreambleDurationMicroSeconds (WifiMode, WifiPreamble);
-  static uint32_t GetPayloadDurationMicroSeconds (size, WifiMode); </pre>
-<p> The following member methods have been removed from InterferenceHelper:</p>
-<pre>
-  void Configure80211aParameters (void);
-  void Configure80211bParameters (void);
-  void Configure80211_10MhzParameters (void);
-  void Configure80211_5MhzParameters (void);</pre>
-</li>
-<li><b>WifiMode</b>
-<p>WifiMode now has a WifiPhyStandard attribute which identifies the standard the WifiMode belongs to. To properly set this attribute when creating a new WifiMode, it is now required to explicitly pass a WifiPhyStandard parameter to all WifiModeFactory::CreateXXXX() methods. The WifiPhyStandard value of an existing WifiMode can be retrieved using the new method WifiMode::GetStandard().</p>
-</li>
-<li><b>NetDevice</b>
-<p>In order to have multiple link change callback in NetDevice (i.e. to flush ARP and IPv6 neighbor discovery caches), the following member method has been renamed:</p>
-<pre>
-- virtual void SetLinkChangeCallback (Callback&lt;void&gt; callback);
-+ virtual void AddLinkChangeCallback (Callback&lt;void&gt; callback);</pre>
-Now each NetDevice subclasses have a TracedCallback&lt;&gt; object (list of callbacks) instead of Callback&lt;void&gt; ones.
-</li>
-</ul>
-
-<hr>
-<h1>Changes from ns-3.4 to ns-3.5</h1>
-
-<h2>Changes to build system:</h2>
-<ul>
-</ul>
-
-<h2>New API:</h2>
-
-<ul>
-<li><b>YansWifiPhyHelper supporting radiotap and prism PCAP output</b>
-<p>The newly supported pcap formats can be adopted by calling the following new method of YansWifiPhyHelper:</p>
-<pre>
- +  void SetPcapFormat (enum PcapFormat format);
-</pre>
-where format is one of PCAP_FORMAT_80211_RADIOTAP, PCAP_FORMAT_80211_PRISM or  PCAP_FORMAT_80211. By default, PCAP_FORMAT_80211 is used, so the default PCAP format is the same as before.</p>
-</li>
-
-<li> <b>attributes for class Ipv4</b>
-<p> class Ipv4 now contains attributes in ipv4.cc; the first one
-is called "IpForward" that will enable/disable Ipv4 forwarding.  
-</li>
-
-<li> <b>packet tags</b>
-<p>class Packet now contains AddPacketTag, RemovePacketTag and PeekPacketTag 
-which can be used to attach a tag to a packet, as opposed to the old 
-AddTag method which attached a tag to a set of bytes. The main 
-semantic difference is in how these tags behave in the presence of 
-fragmentation and reassembly.
-</li>
-
-</ul>
-
-<h2>Changes to existing API:</h2>
-<ul>
-
-<li><b>Ipv4Interface::GetMtu () deleted</b>
-  <p>The Ipv4Interface API is private to internet-stack module; this method
-was just a pass-through to GetDevice ()-&gt;GetMtu ().
-  </p>
-</li>
-
-<li><b>GlobalRouteManager::PopulateRoutingTables () and RecomputeRoutingTables () are deprecated </b>
-  <p>This API has been moved to the helper API and the above functions will
-be removed in ns-3.6.  The new API is:
-<pre>
-Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
-Ipv4GlobalRoutingHelper::RecomputeRoutingTables ();
-</pre>
-Additionally, these low-level functions in GlobalRouteManager are now public,
-allowing more API flexibility at the low level ns-3 API:
-<pre>
-GlobalRouteManager::DeleteGlobalRoutes ();
-GlobalRouteManager::BuildGlobalRoutingDatabase ();
-GlobalRouteManager::InitializeRoutes ();
-</pre>
-  </p>
-</li>
-
-<li><b>CalcChecksum attribute changes</b>
-  <p>Four IPv4 CalcChecksum attributes (which enable the computation of 
-checksums that are disabled by default) have been collapsed into one global 
-value in class Node.  These four calls: 
-<pre>
-Config::SetDefault ("ns3::Ipv4L3Protocol::CalcChecksum", BooleanValue (true)); 
-Config::SetDefault ("ns3::Icmpv4L4Protocol::CalcChecksum", BooleanValue (true));
-Config::SetDefault ("ns3::TcpL4Protocol::CalcChecksum", BooleanValue (true));
-Config::SetDefault ("ns3::UdpL4Protocol::CalcChecksum", BooleanValue (true));
-</pre>
-are replaced by one call to:
-<pre>
-GlobalValue::Bind ("ChecksumEnabled", BooleanValue (true));
-</pre>
-  </p>
-</li>
-
-<li><b>CreateObject changes</b>
-  <p>CreateObject is now able to construct objects with a non-default constructor.
-   If you used to pass attribute lists to CreateObject, you must now use CreateObjectWithAttributes.
-  </p>
-</li>
-
-<li> <b>packet byte tags renaming</b>
-  <ul>
-  <li>Packet::AddTag to Packet::AddByteTag</li>
-  <li>Packet::FindFirstMatchingTag to Packet::FindFirstMatchingByteTag</li>
-  <li>Packet::RemoveAllTags to Packet::RemoveAllByteTags</li>
-  <li>Packet::PrintTags to Packet::PrintByteTags</li>
-  <li>Packet::GetTagIterator to Packet::GetByteTagIterator</li>
-  </ul>
-</li>
-
-<li><b>YansWifiPhyHelper::EnablePcap* methods not static any more</b>
-<p>To accommodate the possibility of configuring the PCAP format used for wifi promiscuous mode traces, several methods of YansWifiPhyHelper had to be made non-static:
-<pre>
--  static void EnablePcap (std::string filename, uint32_t nodeid, uint32_t deviceid);
-+         void EnablePcap (std::string filename, uint32_t nodeid, uint32_t deviceid);
--  static void EnablePcap (std::string filename, Ptr&lt;NetDevice&gt; nd);
-+         void EnablePcap (std::string filename, Ptr&lt;NetDevice&gt; nd);
--  static void EnablePcap (std::string filename, std::string ndName);
-+         void EnablePcap (std::string filename, std::string ndName);
--  static void EnablePcap (std::string filename, NetDeviceContainer d);
-+         void EnablePcap (std::string filename, NetDeviceContainer d);
--  static void EnablePcap (std::string filename, NodeContainer n);
-+         void EnablePcap (std::string filename, NodeContainer n);
--  static void EnablePcapAll (std::string filename);
-+         void EnablePcapAll (std::string filename);
-</pre>
-</p>
-</li>
-
-<li><b>Wifi Promisc Sniff interface modified </b>
-<p> 
-To accommodate support for the radiotap and prism headers in PCAP traces, the interface for promiscuos mode sniff in the wifi device was changed. The new implementation was heavily inspired by the way the madwifi driver handles monitor mode. A distinction between TX and RX events is introduced, to account for the fact that different information is to be put in the radiotap/prism header (e.g., RSSI and noise make sense only for RX packets). The following are the relevant modifications to the WifiPhy class:
-<pre>
--  void NotifyPromiscSniff (Ptr&lt;const Packet&gt; packet);
-+  void NotifyPromiscSniffRx (Ptr&lt;const Packet&gt; packet, uint16_t channelFreqMhz, uint32_t rate, bool isShortPreamble, double signalDbm, double noiseDbm);
-+  void NotifyPromiscSniffTx (Ptr&lt;const Packet&gt; packet, uint16_t channelFreqMhz, uint32_t rate, bool isShortPreamble);
--  TracedCallback&lt;Ptr&lt;const Packet&gt; &gt; m_phyPromiscSnifferTrace;
-+  TracedCallback&lt;Ptr&lt;const Packet&gt;, uint16_t, uint32_t, bool, double, double&gt; m_phyPromiscSniffRxTrace;
-+  TracedCallback&lt;Ptr&lt;const Packet&gt;, uint16_t, uint32_t, bool&gt; m_phyPromiscSniffTxTrace;
-</pre>
-The above mentioned callbacks are expected to be used to call the following method to write Wifi PCAP traces in promiscuous mode:
-<pre>
-+  void WriteWifiMonitorPacket(Ptr&lt;const Packet&gt; packet, uint16_t channelFreqMhz, uint32_t rate, bool isShortPreamble, bool isTx, double signalDbm, double noiseDbm);
-</pre>
-In the above method, the isTx parameter is to be used to differentiate between TX and RX packets. For an example of how to implement these callbacks, see the implementation of PcapSniffTxEvent and PcapSniffRxEvent in src/helper/yans-wifi-helper.cc
-</p>
-</li>
-
-<li><b> Routing decoupled from class Ipv4</b>
-<p> All calls of the form "Ipv4::AddHostRouteTo ()" etc. (i.e. to 
-add static routes, both unicast and multicast) have been moved to a new 
-class Ipv4StaticRouting.  In addition, class Ipv4 now holds only
-one possible routing protocol; the previous way to add routing protocols
-(by ordered list of priority) has been moved to a new class Ipv4ListRouting.
-Class Ipv4 has a new minimal routing API (just to set and get the routing
-protocol):
-<pre>
--  virtual void AddRoutingProtocol (Ptr&lt;Ipv4RoutingProtocol&gt; routingProtocol, int16_t priority) = 0;
-+  virtual void SetRoutingProtocol (Ptr&lt;Ipv4RoutingProtocol&gt; routingProtocol) = 0;
-+  virtual Ptr&lt;Ipv4RoutingProtocol&gt; GetRoutingProtocol (void) const = 0;
-</pre>
-</li>
-
-<li><b> class Ipv4RoutingProtocol is refactored</b>
-<p> The abstract base class Ipv4RoutingProtocol has been refactored to
-align with corresponding Linux Ipv4 routing architecture, and has been
-moved from ipv4.h to a new file ipv4-routing-protocol.h.  The new
-methods (RouteOutput () and RouteInput ()) are aligned with Linux 
-ip_route_output() and ip_route_input().  However,
-the general nature of these calls (synchronous routing lookup for
-locally originated packets, and an asynchronous, callback-based lookup
-for forwarded packets) is still the same.
-<pre>
--  typedef Callback&lt;void, bool, const Ipv4Route&amp;, Ptr&lt;Packet&gt;, const Ipv4Header&amp;&gt; RouteReplyCallback;
-+  typedef Callback&lt;void, Ptr&lt;Ipv4Route&gt;, Ptr&lt;const Packet&gt;, const Ipv4Header &amp;&gt; UnicastForwardCallback;
-+  typedef Callback&lt;void, Ptr&lt;Ipv4MulticastRoute&gt;, Ptr&lt;const Packet&gt;, const Ipv4Header &amp;&gt; MulticastForwardCallback;
-+  typedef Callback&lt;void, Ptr&lt;const Packet&gt;, const Ipv4Header &amp;, uint32_t &gt; LocalDeliverCallback;
-+  typedef Callback&lt;void, Ptr&lt;const Packet&gt;, const Ipv4Header &amp;&gt; ErrorCallback;
--  virtual bool RequestInterface (Ipv4Address destination, uint32_t&amp; interface) = 0;
-+  virtual Ptr&lt;Ipv4Route&gt; RouteOutput (Ptr&lt;Packet&gt; p, const Ipv4Header &amp;header, uint32_t oif, Socket::SocketErrno &amp;errno) = 0;
--  virtual bool RequestRoute (uint32_t interface,
--                            const Ipv4Header &amp;ipHeader,
--                            Ptr&lt;Packet&gt; packet,
--                            RouteReplyCallback routeReply) = 0;
-+  virtual bool RouteInput  (Ptr&lt;const Packet&gt; p, const Ipv4Header &amp;header, Ptr&lt;const NetDevice&gt; idev,
-+                             UnicastForwardCallback ucb, MulticastForwardCallback mcb,
-+                             LocalDeliverCallback lcb, ErrorCallback ecb) = 0;
-</pre>
-
-</li>
-<li><b> previous class Ipv4Route, Ipv4MulticastRoute renamed; new classes with
-those same names added</b>
-<p> The previous class Ipv4Route and Ipv4MulticastRoute are used by 
-Ipv4StaticRouting and Ipv4GlobalRouting to record internal routing table
-entries, so they were renamed to class Ipv4RoutingTableEntry and
-Ipv4MulticastRoutingTableEntry, respectively.  In their place, new
-class Ipv4Route and class Ipv4MulticastRoute have been added.  These
-are reference-counted objects that are analogous to Linux struct
-rtable and struct mfc_cache, respectively, to achieve better compatibility
-with Linux routing architecture in the future.  
-
-<li><b> class Ipv4 address-to-interface mapping functions changed</b>
-<p>  There was some general cleanup of functions that involve mappings
-from Ipv4Address to either NetDevice or Ipv4 interface index.  
-<pre>
--  virtual uint32_t FindInterfaceForAddr (Ipv4Address addr) const = 0;
--  virtual uint32_t FindInterfaceForAddr (Ipv4Address addr, Ipv4Mask mask) const = 0;
-+  virtual int32_t GetInterfaceForAddress (Ipv4Address address) const = 0;
-+  virtual int32_t GetInterfaceForPrefix (Ipv4Address address, Ipv4Mask mask) const = 0;
--  virtual int32_t FindInterfaceForDevice(Ptr&lt;NetDevice&gt; nd) const = 0;
-+  virtual int32_t GetInterfaceForDevice (Ptr&lt;const NetDevice&gt; device) const = 0;
--  virtual Ipv4Address GetSourceAddress (Ipv4Address destination) const = 0;
--  virtual bool GetInterfaceForDestination (Ipv4Address dest,
--  virtual uint32_t GetInterfaceByAddress (Ipv4Address addr, Ipv4Mask mask = Ipv4Mask("255.255.255.255"));
-</pre>
-
-<li><b> class Ipv4 multicast join API deleted</b>
-<p> The following methods are not really used in present form since IGMP
-is not being generated, so they have been removed (planned to be replaced
-by multicast socket-based calls in the future):
-
-<pre>
-- virtual void JoinMulticastGroup (Ipv4Address origin, Ipv4Address group) = 0;
-- virtual void LeaveMulticastGroup (Ipv4Address origin, Ipv4Address group) = 0;
-</pre>
-
-
-<li><b>Deconflict NetDevice::ifIndex and Ipv4::ifIndex (bug 85).</b>
-<p>All function parameters named "ifIndex" that refer 
-to an Ipv4 interface are instead named "interface".
-<pre>
-- static const uint32_t Ipv4RoutingProtocol::IF_INDEX_ANY = 0xffffffff;
-+ static const uint32_t Ipv4RoutingProtocol::INTERFACE_ANY = 0xffffffff;
-
-- bool Ipv4RoutingProtocol::RequestIfIndex (Ipv4Address destination, uint32_t&amp; ifIndex);
-+ bool Ipv4RoutingProtocol::RequestInterface (Ipv4Address destination, uint32_t&amp; interface);
-(N.B. this particular function is planned to be renamed to RouteOutput() in the
-proposed IPv4 routing refactoring)
-
-- uint32_t Ipv4::GetIfIndexByAddress (Ipv4Address addr, Ipv4Mask mask);
-+ int_32t Ipv4::GetInterfaceForAddress (Ipv4Address address, Ipv4Mask mask) const;
-
-- bool Ipv4::GetIfIndexForDestination (Ipv4Address dest, uint32_t &amp;ifIndex) const;
-+ bool Ipv4::GetInterfaceForDestination (Ipv4Address dest, uint32_t &amp;interface) const;
-(N.B. this function is not needed in the proposed Ipv4 routing refactoring)
-</pre>
-
-
-<li><b>Allow multiple IPv4 addresses to be assigned to an interface (bug 188)</b>
-  <ul>
-  <li> Add class Ipv4InterfaceAddress:  
-  This is a new class to resemble Linux's struct in_ifaddr.  It holds IP addressing information, including mask,
-  broadcast address, scope, whether primary or secondary, etc.
-  <pre>
-+  virtual uint32_t AddAddress (uint32_t interface, Ipv4InterfaceAddress address) = 0;
-+  virtual Ipv4InterfaceAddress GetAddress (uint32_t interface, uint32_t addressIndex) const = 0;
-+  virtual uint32_t GetNAddresses (uint32_t interface) const = 0;
-  </pre>
-  <li>Regarding legacy API usage, typically where you once did the following,
-  using the public Ipv4 class interface (e.g.):
-  <pre>
-  ipv4A-&gt;SetAddress (ifIndexA, Ipv4Address ("172.16.1.1"));
-  ipv4A-&gt;SetNetworkMask (ifIndexA, Ipv4Mask ("255.255.255.255"));
-  </pre>
-  you now do:
-  <pre>
-  Ipv4InterfaceAddress ipv4IfAddrA = Ipv4InterfaceAddress (Ipv4Address ("172.16.1.1"), Ipv4Mask ("255.255.255.255"));
-  ipv4A-&gt;AddAddress (ifIndexA, ipv4IfAddrA);
-  </pre>
-  <li> At the helper API level, one often gets an address from an interface
-  container.  We preserve the legacy GetAddress (uint32_t i) but it
-  is documented that this will return only the first (address index 0)
-  address on the interface, if there are multiple such addresses. 
-  We provide also an overloaded variant for the multi-address case: 
-
-  <pre>
-Ipv4Address Ipv4InterfaceContainer::GetAddress (uint32_t i)
-+ Ipv4Address Ipv4InterfaceContainer::GetAddress (uint32_t i, uint32_t j)
-  </pre>
-
-  </ul>
-
-<li><b>New WifiMacHelper objects</b>
-<p>The type of wifi MAC is now set by two new specific helpers, NqosWifiMacHelper for non QoS MACs and QosWifiMacHelper for Qos MACs. They are passed as argument to WifiHelper::Install methods.</li>
-  <pre>
-- void WifiHelper::SetMac (std::string type, std::string n0 = "", const AttributeValue &amp;v0 = EmptyAttributeValue (),...)
-
-- NetDeviceContainer WifiHelper::Install (const WifiPhyHelper &amp;phyHelper, NodeContainer c) const
-+ NetDeviceContainer WifiHelper::Install (const WifiPhyHelper &amp;phyHelper, const WifiMacHelper &amp;macHelper, NodeContainer c) const
-
-- NetDeviceContainer WifiHelper::Install (const WifiPhyHelper &amp;phy, Ptr&lt;Node&gt; node) const
-+ NetDeviceContainer WifiHelper::Install (const WifiPhyHelper &amp;phy, const WifiMacHelper &amp;mac, Ptr&lt;Node&gt; node) const
-
-- NetDeviceContainer WifiHelper::Install (const WifiPhyHelper &amp;phy, std::string nodeName) const
-+ NetDeviceContainer WifiHelper::Install (const WifiPhyHelper &amp;phy, const WifiMacHelper &amp;mac, std::string nodeName) const
-  </pre>
-  See src/helper/nqos-wifi-mac-helper.h and src/helper/qos-wifi-mac-helper.h for more details.
-  </p>
-
-<li><b>Remove Mac48Address::IsMulticast</b>
-  <p>This method was considered buggy and unsafe to call. Its replacement is Mac48Address::IsGroup.
-  </li>
-
-</ul>
-
-<h2>Changed behavior:</h2>
-<ul>
-</ul>
-
-<hr>
-<h1>Changes from ns-3.3 to ns-3.4</h1>
-
-<h2>Changes to build system:</h2>
-<ul>
-<li>A major option regarding the downloading and building of ns-3 has been
-added for ns-3.4 -- the ns-3-allinone feature.  This allows a user to
-get the most common options for ns-3 downloaded and built with a minimum
-amount of trouble.  See the ns-3 tutorial for a detailed explanation of
-how to use this new feature.</li>
-
-<li>The build system now runs build items in parallel by default.  This includes
-the regression tests.</li>
-</ul>
-
-<h2>New API:</h2>
-<ul>
-<li>XML support has been added to the ConfigStore in src/contrib/config-store.cc</li>
-
-<li>The ns-2 calendar queue scheduler option has been ported to src/simulator</li>
-
-<li>A ThreeLogDistancePropagationLossModel has been added to src/devices/wifi</li>
-
-<li>ConstantAccelerationMobilityModel in src/mobility/constant-acceleration-mobility-model.h</li>
-
-<li>A new emulation mode is supported with the TapBridge net device (see
-src/devices/tap-bridge)</li>
-
-<li>A new facility for naming ns-3 Objects is included (see
-src/core/names.{cc,h})</li>
-
-<li>Wifi multicast support has been added in src/devices/wifi</li>
-</ul>
-
-<h2>Changes to existing API:</h2>
-
-<ul>
-<li>Some fairly significant changes have been made to the API of the
-random variable code.  Please see the ns-3 manual and src/core/random-variable.cc
-for details.</li>
-
-<li>The trace sources in the various NetDevice classes has been completely
-reworked to allow for a consistent set of trace sources across the
-devices.  The names of the trace sources have been changed to provide
-some context with respect to the level at which the trace occurred.
-A new set of trace sources has been added which emulates the behavior
-of packet sniffers.  These sources have been used to implement tcpdump-
-like functionality and are plumbed up into the helper classes.  The 
-user-visible changes are the trace source name changes and the ability
-to do promiscuous-mode pcap tracing via helpers.  For further information
-regarding these changes, please see the ns-3 manual</li>
-
-<li>StaticMobilityModel has been renamed ConstantPositionMobilityModel
-StaticSpeedMobilityModel has been renamed ConstantVelocityMobilityModel</li>
-
-<li>The Callback templates have been extended to support more parameters.
-See src/core/callback.h</li>
-
-<li>Many helper API have been changed to allow passing Object-based parameters
-as string names to ease working with the object name service.</li>
-
-<li>The Config APIs now accept path segments that are names defined by the
-object name service.</li>
-
-<li>Minor changes were made to make the system build under the Intel C++ compiler.</li>
-
-<li>Trace hooks for association and deassociation to/from an access point were
-added to src/devices/wifi/nqsta-wifi-mac.cc</li>
-</ul>
-
-<h2>Changed behavior:</h2>
-
-<ul>
-<li>The tracing system rework has introduced some significant changes in the
-behavior of some trace sources, specifically in the positioning of trace sources
-in the device code.  For example, there were cases where the packet transmit 
-trace source was hit before the packet was enqueued on the device transmit quueue.
-This now happens just before the packet is transmitted over the channel medium.
-The scope of the changes is too large to be included here.  If you have concerns
-regarding trace semantics, please consult the net device documentation for details.
-As is usual, the ultimate source for documentation is the net device source code.</li>
-</ul>
-
-<hr>
-<h1>Changes from ns-3.2 to ns-3.3</h1>
-
-<h2>New API:</h2>
-<ul>
-<li>
-ns-3 ABORT macros in src/core/abort.h
-Config::MatchContainer
-ConstCast and DynamicCast helper functions for Ptr casting
-StarTopology added to several topology helpers
-NetDevice::IsBridge () 
-</li>
-
-<li>17-11-2008; changeset 
-<a href="http://code.nsnam.org/ns-3-dev/rev/4c1c3f6bcd03">4c1c3f6bcd03</a></li>
-<ul>
-<li>
-The PppHeader previously defined in the point-to-point-net-device code has been 
-made public.
-</li>
-</ul>
-
-<li>17-11-2008; changeset 
-<a href="http://code.nsnam.org/ns-3-dev/rev/16c2970a0344">16c2970a0344</a></li>
-<ul>
-<li>
-An emulated net device has been added as enabling technology for ns-3 emulation
-scenarios.  See src/devices/emu and examples/emu-udp-echo.cc for details.
-</li>
-</ul>
-
-<li>17-11-2008; changeset 
-<a href="http://code.nsnam.org/ns-3-dev/rev/4222173d1e6d">4222173d1e6d</a></li>
-<ul>
-<li>
-Added method InternetStackHelper::EnableAsciiChange to allow allow a user to 
-hook ascii trace to the drop trace events in Ipv4L3Protocol and ArpL3Protocol.
-</li>
-</ul>
-
-</ul>
-<h2>Changes to existing API:</h2>
-<ul>
-
-<li> NetDevice::MakeMulticastAddress() was renamed to NetDevice::GetMulticast()
-and the original GetMulticast() removed </li>
-
-<li> Socket API changes:
-<ul>
-<li> return type of SetDataSentCallback () changed from bool to void </li>
-<li> Socket::Listen() no longer takes a queueLimit argument</li>
-</ul>
-
-<li> As part of the Wifi Phy rework, there have been several API changes
-at the low level and helper API level.  </li>
-<ul>
-<li>  At the helper API level, the WifiHelper was split to three classes: 
-a WifiHelper, a YansWifiChannel helper, and a YansWifiPhy helper.  Some
-functions like Ascii and Pcap tracing functions were moved from class
-WifiHelper to class YansWifiPhyHelper. 
-<li>  At the low-level API, there have been a number of changes to
-make the Phy more modular:</li>
-<ul>
-<li> composite-propagation-loss-model.h is removed</li>
-<li> DcfManager::NotifyCcaBusyStartNow() has changed name</li>
-<li> fragmentation related functions (e.g. DcaTxop::GetNFragments()) have
-changed API to account for some implementation changes</li>
-<li> Interference helper and error rate model added </li>
-<li> JakesPropagationLossModel::GetLoss() moved to PropagationLoss() class</li>
-<li> base class WifiChannel made abstract </li>
-<li> WifiNetDevice::SetChannel() removed </li>
-<li> a WifiPhyState helper class added </li>
-<li> addition of the YansWifiChannel and YansWifiPhy classes </li>
-</ul>
-</ul>
-
-<li>17-11-2008; changeset 
-<a href="http://code.nsnam.org/ns-3-dev/rev/dacfd1f07538">dacfd1f07538</a></li>
-<ul>
-<li>
-Change attribute "RxErrorModel" to "ReceiveErrorModel" in CsmaNetDevice for 
-consistency between devices.
-</li>
-</ul>
-
-</ul>
-<h2>changed behavior:</h2>
-<ul>
-
-<li>17-11-2008; changeset 
-<a href="http://code.nsnam.org/ns-3-dev/rev/ed0dfce40459">ed0dfce40459</a></li>
-<ul>
-<li>
-Relax reasonableness testing in Ipv4AddressHelper::SetBase to allow the 
-assignment of /32 addresses.
-</li>
-</ul>
-
-<li>17-11-2008; changeset 
-<a href="http://code.nsnam.org/ns-3-dev/rev/756887a9bbea">756887a9bbea</a></li>
-<ul>
-<li>
-Global routing supports bridge devices.
-</li>
-</ul>
-</ul>
-
-<hr>
-<h1>Changes from ns-3.1 to ns-3.2</h1>
-
-<h2>New API:</h2>
-<ul>
-
-<li>26-08-2008; changeset 
-<a href="http://code.nsnam.org/ns-3-dev/rev/5aa65b1ea001">5aa65b1ea001</a></li>
-<ul>
-<li>
-Add multithreaded and real-time simulator implementation.  Allows for emulated
-net devices running in threads other than the main simulation thread to schedule
-events.  Allows for pacing the simulation clock at 1x real-time.
-</li>
-</ul>
-
-
-<li>26-08-2008; changeset 
-<a href="http://code.nsnam.org/ns-3-dev/rev/c69779f5e51e">c69779f5e51e</a></li>
-<ul>
-<li>
-Add threading and synchronization primitives.  Enabling technology for 
-multithreaded simulator implementation.
-</li>
-</ul>
-
-</ul>
-<h2>New API in existing classes:</h2>
-<ul>
-
-<li>01-08-2008; changeset 
-<a href="http://code.nsnam.org/ns-3-dev/rev/a18520551cdf">a18520551cdf</a></li>
-<ul>
-<li>class ArpCache has two new attributes:  MaxRetries 
-and a Drop trace.  It also has some new public methods but these are 
-mostly for internal use.
-</ul>
-</li>
-
-</ul>
-<h2>Changes to existing API:</h2>
-<ul>
-
-<li>05-09-2008; changeset 
-<a href="http://code.nsnam.org/ns-3-dev/rev/aa1fb0f43571">aa1fb0f43571</a></li>
-<ul>
-<li>
-Change naming of MTU and packet size attributes in CSMA and Point-to-Point devices<br>
-After much discussion it was decided that the preferred way to think about 
-the different senses of transmission units and encapsulations was to call the 
-MAC MTU simply MTU and to use the overall packet size as the PHY-level attribute
-of interest.  See the Doxygen of CsmaNetDevice::SetFrameSize and 
-PointToPointNetDevice::SetFrameSize for a detailed description.
-</li>
-</ul>
-
-<li>25-08-2008; changeset 
-<a href="http://code.nsnam.org/ns-3-dev/rev/e5ab96db540e">e5ab96db540e</a></li>
-<ul>
-<li>
-bug 273: constify packet pointers.<br>
-The normal and the promiscuous receive callbacks of the NetDevice API
-have been changed from:
-<pre>
-Callback&lt;bool,Ptr&lt;NetDevice&gt;,Ptr&lt;Packet&gt;,uint16_t,const Address &amp;&gt;
-Callback&lt;bool,Ptr&lt;NetDevice&gt;, Ptr&lt;Packet&gt;, uint16_t,
-         const Address &amp;, const Address &amp;, enum PacketType &gt;
-</pre>
-to:
-<pre>
-Callback&lt;bool,Ptr&lt;NetDevice&gt;,Ptr&lt;const Packet&gt;,uint16_t,const Address &amp;&gt;
-Callback&lt;bool,Ptr&lt;NetDevice&gt;, Ptr&lt;const Packet&gt;, uint16_t,
-         const Address &amp;, const Address &amp;, enum PacketType &gt;
-</pre>
-to avoid the kind of bugs reported in 
-<a href="http://www.nsnam.org/bugzilla/show_bug.cgi?id=273">bug 273</a>.
-Users who implement a subclass of the NetDevice base class need to change the signature
-of their SetReceiveCallback and SetPromiscReceiveCallback methods.
-</li>
-</ul>
-
-
-<li>04-08-2008; changeset 
-<a href="http://code.nsnam.org/ns-3-dev/rev/cba7b2b80fe8">cba7b2b80fe8</a></li>
-<ul>
-<li>
-Cleanup of MTU confusion and initialization in CsmaNetDevice<br>
-The MTU of the CsmaNetDevice defaulted to 65535.  This did not correspond with
-the expected MTU found in Ethernet-like devices.  Also there was not clear 
-documentation regarding which MTU was being set.  There are two MTU here, one
-at the MAC level and one at the PHY level.  We split out the MTU setting to make
-this more clear and set the default PHY level MTU to 1500 to be more like
-Ethernet.  The encapsulation mode defaults to LLC/SNAP which then puts the
-MAC level MTU at 1492 by default.  We allow users to now set the encapsulation
-mode, MAC MTU and PHY MTU while keeping the three values consistent.  See the
-Doxygen of CsmaNetDevice::SetMaxPayloadLength for a detailed description of the
-issues and solution.
-</li>
-</ul>
-
-<li>21-07-2008; changeset 
-<a href="
-http://code.nsnam.org/ns-3-dev/rev/99698bc858e8">99698bc858e8</a></li>
-<ul>
-<li> class NetDevice has added a pure virtual method that
-must be implemented by all subclasses:
-<pre>
-virtual void SetPromiscReceiveCallback (PromiscReceiveCallback cb) = 0;
-</pre>
-All NetDevices must support this method, and must call this callback
-when processing packets in the receive direction (the appropriate place
-to call this is device-dependent).  An approach to stub this out
-temporarily, if you do not care about immediately enabling this
-functionality, would be to add this to your device:
-<pre>
-void
-ExampleNetDevice::SetPromiscReceiveCallback
-(NetDevice::PromiscReceiveCallback cb)
-{ 
-  NS_ASSERT_MSG (false, "No implementation yet for
-SetPromiscReceiveCallback");
-}
-</pre>
-To implement this properly, consult the CsmaNetDevice for examples of
-when the m_promiscRxCallback is called.
-</li>
-</ul>
-
-<li>03-07-2008; changeset 
-<a href="http://code.nsnam.org/ns-3-dev/rev/d5f8e5fae1c6">d5f8e5fae1c6</a></li>
-<ul>
-<li>
-Miscellaneous cleanup of Udp Helper API, to fix bug 234
-<pre>
-class UdpEchoServerHelper
-{
-public:
-- UdpEchoServerHelper ();
-- void SetPort (uint16_t port); 
-+ UdpEchoServerHelper (uint16_t port);
-+ 
-+ void SetAttribute (std::string name, const AttributeValue &amp;value);
-ApplicationContainer Install (NodeContainer c);
-
-class UdpEchoClientHelper
-{
-public:
-- UdpEchoClientHelper ();
-+ UdpEchoClientHelper (Ipv4Address ip, uint16_t port);
-- void SetRemote (Ipv4Address ip, uint16_t port);
-- void SetAppAttribute (std::string name, const AttributeValue &amp;value);
-+ void SetAttribute (std::string name, const AttributeValue &amp;value);
-ApplicationContainer Install (NodeContainer c);
-</pre>
-</li>
-</ul>
-
-<li>03-07-2008; changeset 
-<a href="
-http://code.nsnam.org/ns-3-dev/rev/3cdd9d60f7c7">3cdd9d60f7c7</a></li>
-<ul>
-<li>
-Rename all instances method names using "Set..Parameter" to "Set..Attribute"
-(bug 232)
-</li>
-<li> How to fix your code:  Any use of helper API that was using a method
-"Set...Parameter()" should be changed to read "Set...Attribute()".  e.g.
-<pre>
-- csma.SetChannelParameter ("DataRate", DataRateValue (5000000));
-- csma.SetChannelParameter ("Delay", TimeValue (MilliSeconds (2)));
-+ csma.SetChannelAttribute ("DataRate", DataRateValue (5000000));
-+ csma.SetChannelAttribute ("Delay", TimeValue (MilliSeconds (2)));
-</pre>
-</li>
-</ul>
-</li>
-
-</ul>
-<h2>Changed behavior:</h2>
-<ul>
-
-<li>07-09-2008; changeset 
-<a href="http://code.nsnam.org/ns-3-dev/rev/5d836ab1523b">5d836ab1523b</a></li>
-<ul>
-
-<li>
-Implement a finite receive buffer for TCP<br>
-The native TCP model in TcpSocketImpl did not support a finite receive buffer.
-This changeset adds the following functionality in this regard:
-<ul>
-<li>
-Being able to set the receiver buffer size through the attributes system.
-</li>
-<li>
-This receiver buffer size is now correctly exported in the TCP header as the
-advertised window.  Prior to this changeset, the TCP header advertised window
-was set to the maximum size of 2^16 bytes.
-window
-</li>
-<li>
-The aforementioned window size is correctly used for flow control, i.e. the
-sending TCP will not send more data than available space in the receiver's
-buffer.
-</li>
-<li>
-In the case of a receiver window collapse, when a advertised zero-window
-packet is received, the sender enters the persist probing state in which
-it sends probe packets with one payload byte at exponentially backed-off
-intervals up to 60s.  The receiver will continue to send advertised 
-zero-window ACKs of the old data so long as the receiver buffer remains full.
-When the receiver window clears up due to an application read, the TCP
-will finally ACK the probe byte, and update its advertised window appropriately.
-</li>
-</ul>
-See 
-<a href="http://www.nsnam.org/bugzilla/show_bug.cgi?id=239"> bug 239 </a> for
-more.
-</li>
-</ul>
-
-<li>07-09-2008; changeset 
-<a href="http://code.nsnam.org/ns-3-dev/rev/7afa66c2b291">7afa66c2b291</a></li>
-<ul>
-<li>
-Add correct FIN exchange behavior during TCP closedown<br>
-The behavior of the native TcpSocketImpl TCP model was such that the final
-FIN exchange was not correct, i.e. calling Socket::Close didn't send a FIN
-packet, and even if it had, the ACK never came back, and even if it had, the
-ACK would have incorrect sequence number.  All these various problems have been
-addressed by this changeset.  See 
-<a href="http://www.nsnam.org/bugzilla/show_bug.cgi?id=242"> bug 242 </a> for
-more.
-</li>
-</ul>
-
-<li> 28-07-2008; changeset 
-<a href="http://code.nsnam.org/ns-3-dev/rev/6f68f1044df1">6f68f1044df1</a>
-<ul>
-<li>
-OLSR: HELLO messages hold time changed to 3*hello
-interval from hello interval.  This is an important bug fix as
-hold time == refresh time was never intentional, as it leads to
-instability in neighbor detection.
-</ul>
-</li>
-
-</ul>
-
-</body>
-</html>
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/CHANGES.md ns-3.36/CHANGES.md
--- ns-3.35/CHANGES.md	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/CHANGES.md	2022-04-30 18:23:57.638732400 -0700
@@ -0,0 +1,2120 @@
+ns-3: API and model change history
+==================================
+
+ns-3 is an evolving system and there will be API or behavioral changes from time to time. Users who try to use scripts or models across versions of ns-3 may encounter problems at compile time, run time, or may see the simulation output change.
+
+We have adopted the development policy that we are going to try to ease the impact of these changes on users by documenting these changes in a single place (this file), and not by providing a temporary or permanent backward-compatibility software layer.
+
+A related file is the RELEASE\_NOTES.md file in the top level directory. This file complements RELEASE\_NOTES.md by focusing on API and behavioral changes that users upgrading from one release to the next may encounter. RELEASE\_NOTES.md attempts to comprehensively list all of the changes that were made. There is generally some overlap in the information contained in RELEASE\_NOTES.md and this file.
+
+The goal is that users who encounter a problem when trying to use older code with newer code should be able to consult this file to find guidance as to how to fix the problem. For instance, if a method name or signature has changed, it should be stated what the new replacement name is.
+
+Note that users who upgrade the simulator across versions, or who work directly out of the development tree, may find that simulation output changes even when the compilation doesn't break, such as when a simulator default value is changed. Therefore, it is good practice for \_anyone\_ using code across multiple ns-3 releases to consult this file, as well as the RELEASE\_NOTES.md, to understand what has changed over time.
+
+This file is a best-effort approach to solving this issue; we will do our best but can guarantee that there will be things that fall through the cracks, unfortunately. If you, as a user, can suggest improvements to this file based on your experience, please contribute a patch or drop us a note on ns-developers mailing list.
+
+Changes from ns-3.35 to ns-3.36
+-------------------------------
+
+### New API
+
+* The helpers of the NetDevices supporting flow control (PointToPointHelper, CsmaHelper, SimpleNetDeviceHelper, WifiHelper) now provide a **DisableFlowControl** method to disable flow control. If flow control is disabled, the Traffic Control layer forwards packets down to the NetDevice even if there is no room for them in the NetDevice queue(s)
+* Added a new trace source **TcDrop** in TrafficControlLayer for tracing packets that have been dropped because no queue disc is installed on the device, the device supports flow control and the device queue is full.
+* Added a new class **PhasedArraySpectrumPropagationLossModel**, and its **DoCalcRxPowerSpectralDensity** function has two additional parameters: TX and RX antenna arrays. Should be inherited by models that need to know antenna arrays in order to calculate RX PSD.
+* It is now possible to detach a SpectrumPhy object from a SpectrumChannel by calling SpectrumChannel::RemoveRx ().
+* **PhasedArrayModel** has a new function GetId that returns a unique ID of each PhasedArrayModel instance. 
+
+### Changes to existing API
+
+* Support for Network Simulation Cradle (NSC) TCP has been removed.
+* Support for PlanetLabFdNetDeviceHelper has been removed.
+* **ThreeGppSpectrumPropagationLossModel** now inherits **PhasedArraySpectrumPropagationLossModel**. The modules that use **ThreeGppSpectrumPropagationLossModel** should implement **SpectrumPhy::GetAntenna** that will return the instance of **PhasedArrayModel**.
+* **AddDevice** function is removed from **ThreeGppSpectrumPropagationLossModel** to support multiple arrays per device.
+* **SpectrumPhy** function **GetRxAntenna** is renamed to **GetAntenna**, and its return value is changed to *Ptr\<Object>* instead of *Ptr\<AntennaModel>* to support also **PhasedArrayModel** type of antenna.
+* **vScatt** attribute moved from ThreeGppSpectrumPropagationLossModel to ThreeGppChannelModel.
+* **ChannelCondition::IsEqual** now has LOS and O2I parameters instead of a pointer to ChannelCondition.
+* **TcpWestwood::EstimatedBW** trace source changed from **TracedValueCallback::Double** to **TracedValueCallback::DataRate**.
+* The API for making changes to channel number, band, standard, and primary channel has been changed to use a new ChannelSettings attribute.
+    
+### Changes to build system
+
+* The Waf build system has been replaced by CMake and a Python program that provides a Waf-like API.
+* g++ version 8 is now the minimum g++ compiler version supported.
+
+### Changed behavior
+
+* Wi-Fi: The default Wi-Fi standard is changed from 802.11a to 802.11ax, and the default rate control is changed from ArfWifiManager to IdealWifiManager.
+* Wi-Fi: EDCAFs (QosTxop objects) are no longer installed on non-QoS STAs and DCF (Txop object) is no longer installed on QoS STAs.
+* Wi-Fi: Management frames (Probe Request/Response, Association Request/Response) are sent by QoS STAs according to the 802.11 specs.
+* The **Frequency**, **ChannelNumber**, **ChannelWidth** and **Primary20MHzIndex** attributes of **WifiPhy** can now only be used to get the corresponding values. Channel settings can be now configured through the **ChannelSettings** attribute. See the wifi model documentation for information on how to set this new attribute.
+* UE handover now works with and without enabled CA (carrier aggregation) in inter-eNB, intra-eNB, inter-frequency and intra-frequency scenarios. Previously only inter-eNB intra-frequency handover was supported and only in non-CA scenarios.
+* NixVectorRouting: **NixVectorRouting** can now better cope with topology changes. In-flight packets are not anymore causing crashes, and the path is dynamically rebuilt by intermediate routers (this happens only to packets in-flight during the topology change).
+* Mesh (Wi-Fi) forwarding hops now have a configurable random variable-based forwarding delay model, with a default mean of 350 us.
+
+Changes from ns-3.34 to ns-3.35
+-------------------------------
+
+### New API
+
+* In class **Ipv6Header**, new functions SetSource (), SetDestination (), GetSource () and GetDestination () are added, consistent with **Ipv4Header**. The existing functions had "Address" suffix in each of the function names, and are are deprecated now.
+* In class **Ipv4InterfaceAddress**, new functions SetAddress () and GetAddress () are added, corresponding to SetLocal () and GetLocal () respectively. This is done to keep consistency with **Ipv4InterfaceAddress**.
+* With the new support for IPv6 Nix-Vector routing, we have all the new APIs corresponding to IPv4 Nix-Vector routing. Specific to the user, there is an Ipv6NixVectorHelper class which can be set in the InternetStackHelper, and works similar to Ipv4NixVectorHelper.
+* In class **Ipv4InterfaceAddress**, a new function IsInSameSubnet () is added to check if both the IPv4 addresses are in the same subnet. Also, it is consistent with **Ipv6InterfaceAddress::IsInSameSubnet ()**.
+* In class **ConfigStore**, a new Attribue **SaveDeprecated** allows to not save DEPRECATED Attributes. The default value is **false** (save DEPRECATED Attributes).
+* In class **TracedCallback**, a new function **IsEmpty** allows to know if the TracedCallback will call any callback.
+* A new specialization of std::hash for Ptr allows one to use Ptrs as keys in unordered\_map and unordered\_set containers.
+* A new **GroupMobilityHelper** mobility helper has been added to ease the configuration of group mobility (a form of hierarchical mobility in which multiple child mobility models move with reference to an underlying parent mobility model). New example programs and animation scripts are also added to both the buildings and mobility modules.
+
+### Changes to existing API
+
+* In class **Ipv6Header**, the functions SetSourceAddress (), SetDestinationAddress (), GetSourceAddress () and GetDestinationAddress () are deprecated. New corresponding functions are added by removing the "Address" suffix. This change is made for having consistency with **Ipv4Header**.
+* **ipv4-nix-vector-helper.h** and **ipv4-nix-vector-routing.h** have been deprecated in favour of **nix-vector-helper.h** and **nix-vector-routing.h** respectively.
+
+### Changes to build system
+
+* The default C++ standard is now C++17.
+* The minimum compiler versions have been raised to g++-7 and clang-10 (Linux) and Xcode 11 (macOS).
+
+### Changed behavior
+
+* Nix-Vector routing supports topologies with multiple WiFi networks using the same WiFi channel object.
+* ConfigStore no longer saves OBSOLETE attributes.
+* The **Ipv4L3Protocol** Duplicate detection now accounts for transmitted packets, so a transmitting multicast node will not forward its own packets.
+* Wi-Fi: A-MSDU aggregation now implies that constituent MSDUs are immediately dequeued from the EDCA queue and replaced by an MPDU containing the A-MSDU. Thus, aggregating N MSDUs triggers N dequeue operations and 1 enqueue operation on the EDCA queue.
+* Wi-Fi: MPDUs being passed to the PHY layer for transmission are not dequeued, but are kept in the EDCA queue until they are acknowledged or discarded. Consequently, the BlockAckManager retransmit queue has been removed.
+
+Changes from ns-3.33 to ns-3.34
+-------------------------------
+
+### New features and API
+
+* Support for Wi-Fi **802.11ax downlink and uplink OFDMA**, including multi-user OFDMA and a **round-robin multi-user scheduler**.
+* **FqCobalt** queue disc with L4S features and set associative hash.
+* **FqPIE** queue disc with L4S mode
+* **ThompsonSamplingWifiManager** Wi-Fi rate control algorithm.
+* New **PhasedArrayModel**, providing a flexible interface for modeling a number of Phase Antenna Array (PAA) models.
+* Added the ability to configure the **Wi-Fi primary 20 MHz channel** for 802.11 devices operating on channels of width greater than 20 MHz.
+* A **TCP BBRv1** congestion control model.
+* **Improved support for bit fields** in header serialization/deserialization.
+* Support for **IPv6 stateless address auto-configuration (SLAAC)**.
+
+### Changes to existing API
+
+* The **WifiAckPolicySelector** class has been replaced by the **WifiAckManager** class. Correspondingly, the ConstantWifiAckPolicySelector has been replaced by the WifiDefaultAckManager class. A new WifiProtectionManager abstract base class and WifiDefaultProtectionManager concrete class have been added to implement different protection policies.
+* The class **ThreeGppAntennaArrayModel** has been replaced by **UniformPlanarArray**, extending the PhasedArrayModel interface.
+* The **Angles struct** is now a class, with robust setters and getters (public struct variables phi and theta are now private class variables m\_azimuth and m\_inclination), overloaded operator<< and operator>> and a number of utilities.
+* **AntennaModel** child classes have been extended to produce 3D radiation patterns. Attributes such as Beamwidth have thus been separated into Vertical/HorizontalBeamwidth.
+* The attribute **UseVhtOnly** in **MinstrelHtWifiManager** has been replaced by a new attribute called **UseLatestAmendmentOnly**.
+* The wifi module has **removed HT Greenfield support, Holland (802.11a-like) PHY configuration, and Point Coordination Function (PCF)**
+* The wifi ErrorRateModel API has been extended to support **link-to-system models**.
+* **Nix-Vector routing** supports multiple interface addresses and can print out routing paths.
+* The **TxOkHeader and TxErrHeader trace sources** of RegularWifiMac have been obsoleted and replaced by trace sources that better capture the result of a transmission: AckedMpdu (fired when an MPDU is successfully acknowledged, via either a Normal Ack or a Block Ack), NAckedMpdu (fired when an MPDU is negatively acknowledged via a Block Ack), DroppedMpdu (fired when an MPDU is dropped), MpduResponseTimeout (fired when a CTS is missing after an RTS or a Normal Ack is missing after an MPDU) and PsduResponseTimeout (fired when a BlockAck is missing after an A-MPDU or a BlockAckReq).
+
+### Changes to build system
+
+* The handling of **Boost library/header dependencies** has been improved.
+
+### Changed behavior
+
+* The default **TCP congestion control** has been changed from NewReno to CUBIC.
+* The **PHY layer of the wifi module** has been refactored: the amendment-specific logic has been ported to **PhyEntity** classes and **WifiPpdu** classes.
+* The **MAC layer of the wifi module** has been refactored. The MacLow class has been replaced by a hierarchy of FrameExchangeManager classes, each adding support for the frame exchange sequences introduced by a given amendment.
+* The **wifi BCC AWGN error rate tables** have been aligned with the ones provided by MATLAB and users may note a few dB difference when using BCC at high SNR and high MCS.
+* **ThreeGppChannelModel has been fixed**: cluster and sub-cluster angles could have been generated with inclination angles outside the inclination range \[0, pi\], and have now been constrained to the correct range.
+* The **LTE RLC Acknowledged Mode (AM) transmit buffer** is now limited by default to a size of (1024 \* 10) bytes. Configuration of unlimited behavior can still be made by passing the value of zero to the new attribute **MaxTxBufferSize**.
+
+Changes from ns-3.32 to ns-3.33
+-------------------------------
+
+### New API
+
+* A model for **TCP CUBIC** (RFC 8312) has been added.
+* New **channel models based on 3GPP TR 37.885** have been added to support vehicular simulations.
+* **Time::RoundTo (unit)** allows time to be rounded to the nearest integer multiple of unit
+* **UdpClient** now can report both transmitted and received bytes.
+* A new **MPI Enable()** variant was introduced that takes a user-supplied MPI\_Communicator, allowing for partitioning of the MPI processes.
+* A **Length** class has been introduced to allow users to replace the use of raw numbers (ints, doubles) that have implicit lengths with a class that represents lengths with an explicit unit.
+* A flexible **CsvReader** class has been introduced to allow users to read in csv- or tab-delimited data.
+* The **ListPositionAllocator** can now input positions from a csv file.
+* A new trace source for DCTCP alpha value has been added to **TcpDctcp**.
+* A new **TableBasedErrorRateModel** has been added for Wi-Fi, and the default values are aligned with link-simulation results from MATLAB WLAN Toolbox and IEEE 802.11 TGn.
+* A new **LdpcSupported** attribute has been added for Wi-Fi in **HtConfiguration**, in order to select LDPC FEC encoding instead of the default BCC FEC encoding.
+
+### Changes to existing API
+
+* The signature of **WifiPhy::PsduTxBeginCallback** and **WifiPhy::PhyTxPsduBegin** have been changed to take a map of PSDUs instead of a single PSDU in order to support multi-users (MU) transmissions.
+* The wifi trace **WifiPhy::PhyRxBegin** has been extended to report the received power for every band.
+* The wifi trace **WifiPhy::PhyRxBegin** has been extended to report the received power for every band.
+* New attributes **SpectrumWifiPhy::TxMaskInnerBandMinimumRejection**, **SpectrumWifiPhy::TxMaskOuterBandMinimumRejection** and **SpectrumWifiPhy::TxMaskOuterBandMaximumRejection** have been added to configure the OFDM transmit masks.
+
+### Changes to build system
+
+* Waf has been upgraded to git development version waf-2.0.21-6-g60e3f5f4
+
+### Changed behavior
+
+* The **default Wi-Fi ErrorRateModel** for the 802.11n/ac/ax standards has been changed from the NistErrorRateModel to a new TableBasedErrorRateModel. Users may experience a shift in Wi-Fi link range due to the new default error model, as **the new model is more optimistic** (the PER for a given MCS will degrade at a lower SNR value). The Wi-Fi module documentation provides plots that compare the performance of the NIST and new table-based model.
+* The default value of the **BerThreshold** attribute in **IdealWifiManager** was changed from 1e-5 to 1e-6, so as to correct behavior with high order MCS.
+* **Time values that are created from an int64x64\_t value** are now rounded to the nearest integer multiple of the unit, rather than truncated. Issue #265 in the GitLab.com tracker describes the behavior that was fixed. Some Time values that rely on this conversion may have changed due to this fix.
+* TCP now implements the Linux-like **congestion window reduced (CWR)** state when explicit congestion notification (ECN) is enabled.
+* **TcpDctcp** now inherits from **TcpLinuxReno**, making its congestion avoidance track more closely to that of Linux.
+
+Changes from ns-3.31 to ns-3.32
+-------------------------------
+
+### New API
+
+* A new TCP congestion control, **TcpLinuxReno**, has been added.
+* Added, to **PIE queue disc**, **queue delay calculation using timestamp** feature (Linux default behavior), **cap drop adjustment** feature (Section 5.5 of RFC 8033), **ECN** (Section 5.1 of RFC 8033) and **derandomization** feature (Section 5.4 of RFC 8033).
+* Added **L4S Mode** to FqCoDel and CoDel queue discs
+* A model for **dynamic pacing** has been added to TCP.
+* Added **Active/Inactive feature** to PIE queue disc
+* Added **netmap** and **DPDK** emulation device variants
+* Added capability to configure **STL pair and containers as attributes**
+* Added **CartesianToGeographic** coordinate conversion capability
+* Added **LollipopCounter**, a sequence number counter type
+* Added **6 GHz band** support for Wi-Fi 802.11ax
+
+### Changes to existing API
+
+* The **Sifs**, **Slot** and **Pifs** attributes have been moved from **WifiMac** to **WifiPhy** to better reflect that they are PHY characteristics, to decouple the MAC configuration from the PHY configuration and to ease the support for future standards.
+* The Histogram class was moved from the flow-monitor module to the stats module to make it more easily accessed. If you previously used Histogram by by including flow-monitor.h you will need to change that to stats-module.h.
+* The **WifiHelper::SetStandard (WifiPhyStandard standard)** method no longer takes a WifiPhyStandard enum, but instead takes a similarly named WifiStandard enum. If before you specified a value such as WIFI\_PHY\_STANDARD\_xxx, now you must specify WIFI\_STANDARD\_xxx.
+* The **YansWifiPhyHelper::Default** and **SpectrumWifiPhyHelper::Default** methods have been removed; the default constructors may instead by used.
+* **PIE** queue disc now uses **Timestamp** for queue delay calculation as default instead of **Dequeue Rate Estimator**
+
+### Changes to build system
+
+* Added "--enable-asserts" and "--enable-logs" to waf configure, to selectively enable asserts and/or logs in release and optimized builds.
+* A build version reporting system has been added by extracting data from the local git repository (or a standalone file if a git repository is not present).
+* Added support for EditorConfig
+
+### Changed behavior
+
+* Support for **RIFS** has been dropped from wifi. RIFS has been obsoleted by the 802.11 standard and support for it was not implemented according to the standard.
+* The default loss recovery algorithm for TCP has been changed from Classic Recovery to Proportional Rate Reduction (PRR).
+* The behavior of **TcpPrrRecovery** algorithm was aligned to that of Linux.
+* **PIE** queue disc now uses **Timestamp** for queue delay calculation as default instead of **Dequeue Rate Estimator**
+* TCP pacing, when enabled, now adjusts the rate dynamically based on the window size, rather than just enforcing a constant rate.
+* WifiPhy forwards up MPDUs from an A-MPDU under reception as long as they arrive at the PHY, instead of forwarding up the whole A-MPDU once its reception is completed.
+* The ns-3 TCP model was changed to set the initial congestion window to 10 segments instead of 1 segment (to align with default Linux configuration).
+
+Changes from ns-3.30 to ns-3.31
+-------------------------------
+
+### New API
+
+* A **TCP DCTCP** model has been added.
+* **3GPP TR 38.901** pathloss, channel condition, antenna array, and fast fading models have been added.
+* New **...FailSafe ()** variants of the **Config** and **Config::MatchContainer** functions which set Attributes or connect TraceSources. These all return a boolean indicating if any attributes could be set (or trace sources connected). These are useful if you are not sure that the requested objects exist, for example in AnimationInterface.
+* New attributes for **Ipv4L3Protocol** have been added to enable RFC 6621-based duplicate packet detection (DPD) (**EnableDuplicatePacketDetection**) and to control the cache expiration time (**DuplicateExpire**).
+* **MakeConsistent** method of **BuildingsHelper** class is deprecated and moved to **MobilityBuildingInfo** class. **DoInitialize** method of the **MobilityBuildingInfo** class would be responsible for making the mobility model of a node consistent at the beginning of a simulation. Therefore, there is no need for an explicit call to **MakeConsistent** in a simulation script.
+* The **IsInside** method of **MobilityBuildingInfo** class is extended to make the mobility model of a moving node consistent.
+* The **IsOutside** method of **MobilityBuildingInfo** class is deprecated. The **IsInside** method should be use to check the position of a node.
+* A new abstract base class, **WifiAckPolicySelector**, is introduced to implement different techniques for selecting the acknowledgment policy for PSDUs containing QoS Data frames. Wifi, mesh and wave helpers provide a SetAckPolicySelectorForAc method to configure a specific ack policy selector for a given Access Category.
+
+* The default ack policy selector is named **ConstantWifiAckPolicySelector**, which allows to choose between Block Ack policy and Implicit Block Ack Request policy and allows to request an acknowledgment after a configurable number of MPDUs have been transmitted.
+
+* The **MaxSize** attribute is removed from the **QueueBase** base class and moved to subclasses. A new MaxSize attribute is therefore added to the DropTailQueue class, while the MaxQueueSize attribute of the WifiMacQueue class is renamed as MaxSize for API consistency.
+* Two new **Application sequence number and timestamp** variants have been added, to support packet delivery tracing.
+    * A new sequence and timestamp header variant for applications has been added. The **SeqTsEchoHeader** contains an additional timestamp field for use in echoing a timestamp back to a sender.
+    * TCP-based applications (OnOffApplication, BulkSendApplication, and PacketSink) support a new header, **SeqTsSizeHeader**, to convey sequence number, timestamp, and size data. Use is controlled by the "EnableSeqTsSizeHeader" attribute.
+* Added a new trace source **PhyRxPayloadBegin** in WifiPhy for tracing begin of PSDU reception.
+* Added the class **RandomWalk2dOutdoorMobilityModel** that models a random walk which does not enter any building.
+* Added support for the **Cake set-associative hash** in the FqCoDel queue disc
+* Added support for **ECN marking for CoDel and FqCoDel** queue discs
+
+### Changes to existing API
+
+* The API for **enabling and disabling ECN** in TCP sockets has been refactored.
+* The **LTE HARQ** related methods in LteEnbPhy and LteUePhy have been renamed, and the LteHelper updated.
+* Previously the **Config::Connect** and **Config::Set** families of functions would fail silently if the attribute or trace source didn't exist on the path given (typically due to spelling errors). Now those functions will throw a fatal error. If you need the old behavior use the new **...FailSafe ()** variants.
+* The internal TCP API for **TcpCongestionOps** has been extended to support the **CongControl** method to allow for delivery rate estimation feedback to the congestion control mechanism.
+* Functions **LteEnbPhy::ReceiveUlHarqFeedback** and **LteUePhy::ReceiveLteDlHarqFeedback** are renamed to **LteEnbPhy::ReportUlHarqFeedback** and **LteUePhy::EnqueueDlHarqFeedback**, respectively to avoid confusion about their functionality. **LteHelper** is updated accordingly.
+* Now on, instead of **uint8\_t**, **uint16\_t** would be used to store a bandwidth value in LTE.
+* The preferred way to declare instances of **CommandLine** is now through a macro: **COMMANDLINE (cmd)**. This enables us to add the **CommandLine::Usage()** message to the Doxygen for the program.
+* New **...FailSafe ()** variants of the **Config** is used to connect PDCP TraceSources of eNB and UE in **RadioBearerStatsConnector** class. It is required for the simulations using RLC SM where PDCP objects are not created for data radio bearers.
+* **T310** timer in **LteUeRrc** class is stopped if the UE receives **RRCConnectionReconfiguration** including the **mobilityControlInfo**. This change is introduced following the 3GPP standard TS36331 sec 5.3.5.4.
+* The wifi **High Latency tags** have been removed. The only rate manager (Onoe) that was making use of them has been refactored.
+* The wifi **MIMO diversity model** has been changed to better fit with MRC theory for AWGN channels when STBC is not used (since STBC is currently not supported).
+* The **BuildingsHelper::MakeMobilityModelConsistent()** method is deprecated in favor of MobilityBuildingInfo::MakeConsistent
+* The **MobilityBuildingInfo::IsOutdoor ()** method is deprecated; use the result of IsIndoor() method instead
+* IsEqual() methods of class **Ipv4Address, Ipv4Mask, Ipv6Address, and Ipv6Prefix** are deprecated.
+* The API around the **wifi Txop class** was refactored.
+
+### Changes to build system
+
+* The **\--lcov-report** option to Waf was fixed, and a new **\--lcov-zerocounters** option was added to improve support for lcov.
+* Python bindings were enabled for **netanim**.
+
+### Changed behavior
+
+* The **EmpiricalRandomVariable** no longer linearly interpolates between values by default, but instead will default to treating the CDF as a histogram and return one of the specific inputs. The previous interpolation mode can be configured by an attribute.
+* (as reported above) previously the **Config::Connect** and **Config::Set** families of functions would fail silently if the attribute or trace source didn't exist on the path given (typically due to spelling errors). Now those functions will throw a fatal error. If you need the old behavior use the new **...FailSafe ()** variants.
+* Attempting to deserialize an enum name which wasn't registered with **MakeEnumChecker** now causes a fatal error, rather failing silently. (This can be triggered by setting an enum Attribute from a StringValue.)
+* As a result of the above API changes in **MobilityBuildingInfo** and **BuildingsHelper** classes, a building aware pathloss models, e.g., **HybridBuildingsPropagationLossModel** is now able to accurately compute the pathloss for a node moving in and out of buildings in a simulation. See [issue 80](https://gitlab.com/nsnam/ns-3-dev/issues/80) for discussion.
+* The implementation of the **Wi-Fi channel access** functions has been improved to make them more conformant to the IEEE 802.11-2016 standard. Concerning the DCF, the backoff procedure is no longer invoked when a packet is queued for transmission and the medium has not been idle for a DIFS, but it is invoked if the medium is busy or does not remain idle for a DIFS after the packet has been queued. Concerning the EDCAF, tranmissions are now correctly aligned at slot boundaries.
+* Various wifi physical layer behavior around channel occupancy calculation, phy state calculation, and handling different channel widths has been updated.
+
+Changes from ns-3.29 to ns-3.30
+-------------------------------
+
+### New API
+
+* Added the attribute **Release** to the class **EpsBearer**, to select the release (e.g., release 15)
+* The attributes **RegularWifiMac::HtSupported**, **RegularWifiMac::VhtSupported**, **RegularWifiMac::HeSupported**, **RegularWifiMac::RifsSupported**, **WifiPhy::ShortGuardEnabled**, **WifiPhy::GuardInterval** and **WifiPhy::GreenfieldEnabled** have been deprecated. Instead, it is advised to use **WifiNetDevice::HtConfiguration**, **WifiNetDevice::VhtConfiguration** and **WifiNetDevice::HeConfiguration**.
+* The attributes **{Ht,Vht,He}Configuration::{Vo,Vi,Be,Bk}MaxAmsduSize** and **{Ht,Vht,He}Configuration::{Vo,Vi,Be,Bk}MaxAmpduSize** have been removed. Instead, it is necessary to use **RegularWifiMac::{VO, VI, BE, BK}\_MaxAmsduSize** and **RegularWifiMac::{VO, VI, BE, BK}\_MaxAmpduSize**.
+* A new attribute **WifiPhy::PostReceptionErrorModel** has been added to force specific packet drops.
+* A new attribute **WifiPhy::PreambleDetectionModel** has been added to decide whether PHY preambles are successfully detected.
+* New attributes **QosTxop::AddBaResponseTimeout** and **QosTxop::FailedAddBaTimeout** have been added to set the timeout to wait for an ADDBA response after the ACK to the ADDBA request is received and to set the timeout after a failed BA agreement, respectively.
+* A new attribute **QosTxop::UseExpliciteBarAfterMissedBlockAck** has been added to specify whether explicit Block Ack Request should be sent upon missed Block Ack Response.
+* Added a new trace source **EndOfHePreamble** in WifiPhy for tracing end of preamble (after training fields) for received 802.11ax packets.
+* Added a new helper method to SpectrumWifiPhyHelper and YansWifiPhyHelper to set the **frame capture model**.
+* Added a new helper method to SpectrumWifiPhyHelper and YansWifiPhyHelper to set the **preamble detection model**.
+* Added a new helper method to WifiPhyHelper to disable the preamble detection model.
+* Added a method to ObjectFactory to check whether a TypeId has been configured on the factory.
+* Added a new helper method to WifiHelper to set the **802.11ax OBSS PD spatial reuse algorithm**.
+* Added the **Cobalt queuing discipline**.
+* Added **Simulator::GetEventCount ()** to return the number of events executed.
+* Added **ShowProgress** object to display simulation progress statistics.
+* Add option to disable explicit Block Ack Request when a Block Ack Response is missed.
+* Add API to be able to tag a subset of bytes in an ns3::Packet.
+* New LTE helper API has been added to allow users to configure LTE backhaul links with any link technology, not just point-to-point links.
+
+### Changes to existing API
+
+* Added the possibility of setting the z coordinate for many position-allocation classes: **GridPositionAllocator, RandomRectanglePositionAllocator, RandomDiscPositionAllocator, UniformDiscPositionAllocator**.
+* The WifiPhy attribute **CcaMode1Threshold** has been renamed to **CcaEdThreshold**, and the WifiPhy attribute **EnergyDetectionThreshold** has been replaced by a new attribute called **RxSensitivity**.
+* It is now possible to know the size of the SpectrumValue underlying std::vector, as well as accessing read-only every element of it.
+* The **GetClosestSide** method of the Rectangle class returns the correct closest side also for positions outside the rectangle.
+* The trace sources **BackoffTrace** and **CwTrace** were moved from class QosTxop to base class Txop, allowing these values to be traced for DCF operation. In addition, the trace signature for BackoffTrace was changed from TracedValue to TracedCallback (callback taking one argument instead of two). Most users of CwTrace for QosTxop configurations will not need to change existing programs, but users of BackoffTrace will need to adjust the callback signature to match.
+* New trace sources, namely **DrbCreated, Srb1Created and DrbCreated** have beed implemented in LteEnbRrc and LteUeRrc classes repectively. These new traces are used to improve the connection of the RLC and PDCP stats in the RadioBearerStatsConnector API.
+* **TraceFadingLossModel** has been moved from lte to spectrum module.
+
+### Changes to build system
+
+* **ns-3 now only supports Python 3**. Use of Python 2 can be forced using the --with-python option provided to './waf configure', and may still work for many cases, but is no longer supported. Waf does not default to Python 3 but the ns-3 wscript will default the build to Python 3.
+* Waf upgraded from 2.0.9 to 2.0.18.
+* Options to run a program through Waf without invoking a project rebuild have been added. The command './waf --run-no-build ' parallels the behavior of './waf --run ' and, likewise, the command './waf --pyrun-no-build' parallels the behavior of './waf --pyrun '.
+
+### Changed behavior
+
+* The wifi ADDBA handshake process is now protected with the use of two timeouts who makes sure we do not end up in a blocked situation. If the handshake process is not established, packets that are in the queue are sent as normal MPDUs. Once handshake is successfully established, A-MPDUs can be transmitted.
+* In the wifi module, the default value of the **Margin** attribute in SimpleFrameCaptureModel was changed from 10 to 5 dB.
+* A **ThresholdPreambleDetectionModel** is added by default to the WifiPhy. Using default values, this model will discard frames that fall below either -82 dBm RSSI or below 4 dB SNR. Users may notice that weak wifi signals that were successfully received based on the error model alone (in previous ns-3 releases) are no longer received. Previous behavior can be obtained by lowering both threshold values or by removing the preamble detection model (via WifiPhyHelper::DisablePreambleDetectionModel()).
+* The PHY model for Wi-Fi has been extended to handle reception of L-SIG and reception of non-legacy header differently.
+* LTE/EPC model has been enhanced to allow the simulation user to test more realistic topologies related to the core network:
+
+* SGW, PGW and MME are full nodes.
+* There are P2P links between core network nodes.
+* New S5 interface between SGW and PGW nodes based on GTPv2-C protocol.
+* Allow simulations with multiple SGWs and PGWs.
+
+* LTE eNB RRC is extended to support:
+
+* S1 signalling with the core network is initiated after the RRC connection establishment procedure is finished.
+* New ATTACH\_REQUEST state to wait for finalization of the S1 signalling with the core network.
+* New InitialContextSetupRequest primitive of the S1 SAP that is received by the eNB RRC when the S1 signalling from the core network is finished.
+
+* A new buffer has been introduced in the LteEnbRrc class. This buffer will be used by a target eNB during handover to buffer the packets comming from a source eNB on X2 inteface. The target eNB will buffer this data until it receives RRC Connection Reconfiguration Complete from a UE.
+* The default qdisc installed on single-queue devices (such as PointToPoint, Csma and Simple) is now **FqCoDel** (instead of PfifoFast). On multi-queue devices (such as Wifi), the default root qdisc is now **Mq** with as many FqCoDel child qdiscs as the number of device queues. The new defaults are motivated by the willingness to align with the behavior of major Linux distributions and by the need to preserve the effectiveness of Wifi EDCA Functions in differentiating Access Categories (see issue #35).
+* LTE RLC TM mode does not report anymore the layer-to-layer delay, as it misses (by standard) an header to which attach the timestamp tag. Users can switch to the PDCP layer delay measurements, which must be the same.
+* Token Bank Fair Queue Scheduler (ns3::FdTbfqFfMacScheduler) will not anymore schedule a UE, which does not have any RBG left after removng the RBG from its allocation map if the computed TB size is greater than the "budget" computed in the scheduler.
+* LTE module now supports the **Radio Link Failure (RLF)** functionality. This implementation introduced following key behavioral changes:
+    * The UE RRC state will not remain in "CONNECTED\_NORMALLY" state if the DL control channel SINR is below a set threshold.
+    * The LTE RRC protocol APIs of UE i.e., LteUeRrcProtocolIdeal, LteUeRrcProtocolReal have been extended to send an ideal (i.e., using SAPs instead to transmitting over the air) UE context remove request to the eNB. Similarly, the eNB RRC protocol APIs, i.e, LteEnbRrcProtocolIdeal and LteEnbRrcProtocolReal have been extended to receive this ideal UE context remove request.
+    * The UE will not synchronize to a cell whose RSRP is less than -140 dBm.
+    * The non-contention based preambles during a handover are re-assigning to an UE only if it has not been assign to another UE (An UE can be using the preamble even after the expiryTime duration).
+    * The RachConfigCommon structure in LteRrcSap API has been extended to include "TxFailParam". This new field would enable an eNB to indicate how many times T300 timer can expire at the UE. Upon reaching this count, the UE aborts the connection establishment, and performs the cell selection again. See TS 36.331 5.3.3.6.
+    * The timer T300 in LteUeRrc class is now bounded by the standard min and max values defined in 3GPP TS 36.331.
+
+Changes from ns-3.28 to ns-3.29
+-------------------------------
+
+### New API
+
+* CommandLine can now handle non-option (positional) arguments.
+* Added CommandLine::Parse (const std::vector\> args)
+* NS\_LOG\_FUNCTION can now log the contents of vectors
+* A new position allocator has been added to the buildings module, allowing nodes to be placed outside of buildings defined in the scenario.
+* The Hash() method has been added to the QueueDiscItem class to compute the hash of various fields of the packet header (depending on the packet type).
+* Added a priority queue disc (PrioQueueDisc).
+* Added 3GPP HTTP model
+* Added TCP PRR as recovery algorithm
+* Added a new trace source in StaWifiMac for tracing beacon arrivals
+* Added a new helper method to ApplicationContainer to start applications with some jitter around the start time
+* (network) Add a method to check whether a node with a given ID is within a NodeContainer.
+
+### Changes to existing API
+
+* TrafficControlHelper::Install now only includes root queue discs in the returned QueueDiscContainer.
+* Recovery algorithms are now in a different class, instead of being tied to TcpSocketBase. Take a look to TcpRecoveryOps for more information.
+* The Mode, MaxPackets and MaxBytes attributes of the Queue class, that had been deprecated in favor of the MaxSize attribute in ns-3.28, have now been removed and cannot be used anymore. Likewise, the methods to get/set the old attributes have been removed as well. Commands such as:
+    
+      Config::SetDefault ("ns3::QueueBase::MaxPackets", UintegerValue (4));
+    
+    should now be written as:
+    
+      Config::SetDefault ("ns3::QueueBase::MaxSize", QueueSizeValue (QueueSize (QueueSizeUnit::PACKETS, 4)));
+    
+    or with a string value with 'b' (bytes) or 'p' (packets) suffix, such as:
+    
+      Config::SetDefault ("ns3::QueueBase::MaxSize", StringValue ("4p"));
+    
+* The Limit attribute of the PfifoFastQueueDisc class, that had been deprecated in favor of the MaxSize attribute in ns-3.28, has now been removed and cannot be used anymore. Likewise, the methods to get/set the old Limit attribute have been removed as well. The GetMaxSize/SetMaxSize methods of the base QueueDisc class must be used instead.
+* The Mode, MaxPackets and MaxBytes attributes of the CoDelQueueDisc class, that had been deprecated in favor of the MaxSize attribute in ns-3.28, have now been removed and cannot be used anymore. Likewise, the methods to get/set the old attributes have been removed as well. The GetMaxSize/SetMaxSize methods of the base QueueDisc class must be used instead.
+* The PacketLimit attribute of the FqCoDelQueueDisc class, that had been deprecated in favor of the MaxSize attribute in ns-3.28, has now been removed and cannot be used anymore. Likewise, the methods to get/set the old PacketLimit attribute have been removed as well. The GetMaxSize/SetMaxSize methods of the base QueueDisc class must be used instead.
+* The Mode and QueueLimit attributes of the PieQueueDisc class, that had been deprecated in favor of the MaxSize attribute in ns-3.28, have now been removed and cannot be used anymore. Likewise, the methods to get/set the old attributes have been removed as well. The GetMaxSize/SetMaxSize methods of the base QueueDisc class must be used instead.
+* The Mode and QueueLimit attributes of the RedQueueDisc class, that had been deprecated in favor of the MaxSize attribute in ns-3.28, have now been removed and cannot be used anymore. Likewise, the methods to get/set the old attributes have been removed as well. The GetMaxSize/SetMaxSize methods of the base QueueDisc class must be used instead.
+* Several traffic generating applications have additional trace sources that export not only the transmitted or received packet but also the source and destination addresses.
+* The returned type of **GetNDevices** methods in **Channel** and subclasses derived from it were changed from uint32\_t to std::size\_t. Likewise, the input parameter type of **GetDevice** in **Channel** and its subclasses were changed from uint32\_t to std::size\_t.
+* Wifi classes **DcfManager**, **DcaTxop** and **EdcaTxopN** were renamed to **ChannelAccessManager**, **Txop** and **QosTxop**, respectively.
+* QueueDisc::DequeuePeeked has been merged into QueueDisc::Dequeue and hence no longer exists.
+* The QueueDisc base class now provides a default implementation of the DoPeek private method based on the QueueDisc::PeekDequeue method, which is now no longer available.
+* The QueueDisc::SojournTime trace source is changed from a TracedValue to a TracedCallback; callbacks that hook this trace must provide one ns3::Time argument, not two.
+* To avoid the code duplication in SingleModelSpectrumChannel and MultiModelSpectrumChannel classes, the attributes MaxLossDb and PropagationLossModel, and the traces PathLoss and TxSigParams are moved to the base class SpectrumChannel. Similarly, the functions AddPropagationLossModel, AddSpectrumPropagationLossModel, SetPropagationDelayModel and GetSpectrumPropagationLossModel are now defined in SpectrumChannel class. Moreover, the TracedCallback signature of LossTracedCallback has been updated from :
+    
+       typedef void (\* LossTracedCallback) (Ptr<SpectrumPhy> txPhy, Ptr<SpectrumPhy> rxPhy, double lossDb);
+      
+    
+    To :
+    
+       typedef void (\* LossTracedCallback) (Ptr<const SpectrumPhy> txPhy, Ptr<const SpectrumPhy> rxPhy, double lossDb);
+      
+    
+* For the sake of LTE module API consistency the IPV6 related functions AssignUeIpv6Address and GetUeDefaultGatewayAddress6 are now declared in EpcHelper base class. Thus, these functions are now declared as virtual in the child classes, i.e., EmuEpcHelper and PointToPointEpcHelper.
+
+### Changes to build system
+
+* Waf upgraded from 1.8.19 to 2.0.9, and ns-3 build scripts aligned to the new API.
+* The '--no32bit-scan' argument is removed from Waf apiscan; generation of ILP32 bindings is now automated from the LP64 bindings.
+* When using on newer compilers, new warnings may trigger build failures. The --disable-werror flag can be passed to Waf at configuration time to turn off the Werror behavior.
+* GTK+3 libraries (including PyGObject, GooCanvas2) are needed for the Pyviz visualizer, replacing GTK+2 libraries.
+
+### Changed behavior
+
+* FqCoDelQueueDisc now computes the hash of the packet's 5-tuple to determine the flow the packet belongs to, unless a packet filter has been configured. The previous behavior is simply obtained by not configuring any packet filter. Consequently, the FqCoDelIpv{4,6}PacketFilter classes have been removed.
+* ARP packets now pass through the traffic control layer, as in Linux.
+* The maximum size UDP packet of the UdpClient application is no longer limited to 1500 bytes.
+* The default values of the **MaxSlrc** and **FragmentationThreshold** attributes in WifiRemoteStationManager were changed from 7 to 4 and from 2346 to 65535, respectively.
+
+Changes from ns-3.27 to ns-3.28
+-------------------------------
+
+### New API
+
+* When deserializing Packet contents, **Header::Deserialize (Buffer::Iterator start)** and **Trailer::Deserialize (Buffer::Iterator start)** can not successfully deserialize variable-length headers and trailers. New variants of these methods that also include an 'end' parameter are now provided.
+* Ipv\[4,6\]AddressGenerator can now check if an address is allocated (**Ipv\[4,6\]AddressGenerator::IsAddressAllocated**) or a network has some allocated address (**Ipv\[4,6\]AddressGenerator::IsNetworkAllocated**).
+* LTE UEs can now use IPv6 to send and receive traffic.
+* UAN module now supports an IP stack.
+* Class **TcpSocketBase** trace source _CongestionWindowInflated_ shows the values with the in-recovery inflation and the post-recovery deflation.
+* Added a FIFO queue disc (FifoQueueDisc) and the Token Bucket Filter (TbfQueueDisc).
+
+### Changes to existing API
+
+* Class **LrWpanMac** now supports extended addressing mode. Both **McpsDataRequest** and **PdDataIndication** methods will now use extended addressing if **McpsDataRequestParams::m\_srcAddrMode** or **McpsDataRequestParams::m\_dstAddrMode** are set to **EXT\_ADDR**.
+* Class **LteUeNetDevice** MAC address is now a 64-bit address and can be set during construction.
+* Class **TcpSocketBase** trace source _CongestionWindow_ shows the values without the in-recovery inflation and the post-recovery deflation; the old behavior has been moved to the new trace source _CongestionWindowInflated_.
+* The Mode, MaxPackets and MaxBytes attributes of the Queue class have been deprecated in favor of the MaxSize attribute. Old attributes can still be used, but using them will be no longer possible in one of the next releases. The methods to get/set the old attributes will be removed as well.
+* The attributes of the QueueDisc subclasses that separately determine the mode and the limit of the QueueDisc have been deprecated in favor of the single MaxSize attribute.
+* The GetQueueSize method of some QueueDisc subclasses (e.g., RED) has been removed and replaced by the GetCurrentSize method of the QueueDisc base class.
+
+### Changes to build system
+
+* The C++ standard used during compilation (default std=c++11) can be now be changed via the CXXFLAGS variable.
+
+### Changed behavior
+
+* All Wi-Fi management frames are now transmitted using the lowest basic rate.
+* The Wi-Fi spectrum model now takes into account adjacent channels through OFDM transmit spectrum masks.
+* The CsmaNetDevice::PhyTxBeginTrace will trace all attempts to transmit, even those that result in drops. Previously, eventual channel drops were excluded from this trace.
+* The TCP congestion window trace now does not report on window inflation during fast recovery phase because it is no longer internally maintained as an inflated value (a separate trace called CongestionWindowInflated can be used to recover the old trace behavior).
+
+Changes from ns-3.26 to ns-3.27
+-------------------------------
+
+### New API
+
+* Added `Vector{2,3}D.GetLength ()`.
+* Overloaded `operator+` and `operator-` for `Vector{2,3}D`.
+* Added iterator version of WifiHelper::Install() to install Wi-Fi devices on range of nodes.
+* Added a new attribute in TcpSocketBase to track the advertised window.
+* Included the model of **TCP Ledbat**.
+* Included the TCP SACK-based loss recovery algorithm outlined in RFC 6675.
+* Added **TCP SACK** and the **SACK emulation**. Added an Attribute to TcpSocketBase class, called "Sack", to enable or disable the SACK option usage.
+* In 'src/wifi', several changes were made to enable partial **802.11ax** High Efficiency (HE) support:
+    * A new standard value has been added that enables the new 11ax data rates.
+    * A new 11ax preamble has been added.
+    * A new attribute was added to configure the guard interval duration for High Efficiency (HE) PHY entities. This attribute can be set using the YansWifiPhyHelper.
+    * A new information element has been added: HeCapabilities. This information element is added to the MAC frame header if the node is a HE node. This HeCapabilites information element is used to advertise the HE capabilities of the node to other nodes in the network.
+* A new class were added for the RRPAA WiFi rate control mechanism.
+* Included carrier aggregation feature in LTE module
+
+* LTE model is extended to support carrier aggregation feature according to 3GPP Release 10, for up to 5 component carriers.
+* InstallSingleEnbDevice and InstalSingeUeDevice functions of LteHelper are now constructing LteEnbDevice and LteUeDevice according to CA architecture. Each device, UE and eNodeB contains an instance of component carrier manager, and may have several component carrier instances.
+* SAP interfaces are extended to include CA message exchange functionality.
+* RRC connection procedure is extended to allow RRC connection reconfiguration for the configuration of the secondary carriers.
+* RRC measurement reporting is extended to allow measurement reporting from the secondary carriers.
+* LTE traces are extended to include component carrier id.
+
+* Function **PrintRoutingTable** has been extended to add an optional Time::Units parameter to specify the time units used on the report. The new parameter is optional and if not specified defaults to the previous behavior (Time::S).
+* **TxopTrace**: new trace source exported by EdcaTxopN.
+* A **GetDscpCounts** method is added to **Ipv4FlowClassifier** and **Ipv6FlowClassifier** which returns a vector of pairs (dscp,count), each of which indicates how many packets with the associated dscp value have been classified for a given flow.
+* MqQueueDisc, a multi-queue aware queue disc modelled after the mq qdisc in Linux, has been introduced.
+* Two new methods, **QueueDisc::DropBeforeEnqueue()** and **QueueDisc::DropAfterDequeue()** have been introduced to replace **QueueDisc::Drop()**. These new methods require the caller to specify the reason why a packet was dropped. Correspondingly, two new trace sources ("DropBeforeEnqueue" and "DropAfterDequeue") have been added to the QueueDisc class, providing both the items that were dropped and the reason why they were dropped.
+* Added **QueueDisc::GetStats()** which returns detailed statistics about the operations of a queue disc. Statistics can be accessed through the member variables of the returned object and by calling the **GetNDroppedPackets()**, **GetNDroppedBytes()**, **GetNMarkedPackets()** and **GetNMarkedBytes()** methods on the returned object. Such methods return the number of packets/bytes dropped/marked for the specified reason (passed as argument). Consequently:
+    * A number of methods of the QueueDisc class have been removed: **GetTotalReceivedPackets()**, **GetTotalReceivedBytes()**, **GetTotalDroppedPackets()**, **GetTotalDroppedBytes()**, **GetTotalRequeuedPackets()**, **GetTotalRequeuedBytes()**.
+    * The **Stats** struct and the **GetStats()** method of **RedQueueDisc** and **PieQueueDisc** have been removed and replaced by those of the QueueDisc base class.
+    * The **GetDropOverLimit** and **GetDropCount** methods of **CoDelQueueDisc** have been removed. The values they returned can be obtained by calling, respectively, GetStats ().GetNDroppedPackets (CoDelQueueDisc::OVERLIMIT\_DROP) and GetStats ().GetNDroppedPackets (CoDelQueueDisc::TARGET\_EXCEEDED\_DROP). The "DropCount" trace of **CoDelQueueDisc** has been removed as well. Packets dropped because the target is exceeded can be obtained through the new "DropAfterDequeue" trace of the QueueDisc class.
+* The new **QueueDisc::Mark()** method has been introduced to allow subclasses to request to mark a packet. The caller must specify the reason why the packet must be marked. Correspondingly, a new trace source ("Mark") has been added to the QueueDisc class, providing both the items that were marked and the reason why they were marked.
+* A new trace source, **SojournTime**, is exported by the QueueDisc base class to provide the sojourn time of every packet dequeued from a queue disc. This has been made possible by adding a timestamp to QueueDiscItem objects, which can be set/get through the new **GetTimeStamp()** and **SetTimeStamp()** methods of the QueueDiscItem class. The **CoDel** queue disc now makes use of such feature of the base class, hence its Sojourn trace source and the CoDelTimestampTag class have been removed.
+
+### Changes to existing API
+
+* **ParetoRandomVariable** "Mean" attribute has been deprecated, the "Scale" Attribute have to be used instead. Changing the Mean attribute has no more an effect on the distribution. See the documentation for the relationship between Mean, Scale and Shape.
+* The default logging timestamp precision has been changed from 6 digits to 9 digits, with a fixed format to ensure that 9 digits to the right of the decimal point are always printed. Previously, default C++ iostream precision and formatting was used.
+* Abstract base class **WifiChannel** has been removed. As a result, a Channel type instead of a WifiChannel type is now exported by WifiNetDevice.
+* The **GetPacketSize** method of **QueueItem** has been renamed **GetSize**
+* The **DequeueAll** method of **Queue** has been renamed **Flush**
+* The attributes **WifiPhy::TxAntennas** and **WifiPhy::RxAntennas**, and the related accessor methods, were replaced by **WifiPhy::MaxSupportedTxSpatialStreams** and **WifiPhy::MaxSupportedRxSpatialStreams**. A new attribute **WifiPhy::Antennas** was added to allow users to define the number of physical antennas on the device.
+* Sockets do not receive anymore broadcast packets, unless they are bound to an "Any" address (0.0.0.0) or to a subnet-directed broadcast packet (e.g., x.y.z.0 for a /24 noterok). As in Linux, the following rules are now enforced:
+    
+    * A socket bound to 0.0.0.0 will receive everything.
+    * A socket bound to x.y.z.0/24 will receive subnet-directed broadcast (x.y.z.255) and unicast packets.
+    * A socket bound to x.y.z.w will only receive unicast packets.
+    
+    **Previously, a socket bound to an unicast address received also subnet-directed broadcast packets. This is not anymore possible**.
+* You can now Bind as many socket as you want to an address/port, provided that they are bound to different NetDevices. Moreover, BindToNetDevice does not anymore call Bind. In other terms, Bind and BindToNetDevice can be called in any order. However, it is suggested to use BindToNetDevice _before_ Bind in order to avoid conflicts.
+
+### Changes to build system
+
+* The API scanning process for Python bindings now relies on CastXML, and only 64-bit scans are presently supported (Linux 64-bit systems). Generation of 32-bit scans is documented in the Python chapter of the ns-3 manual.
+* Modules can now be located in the 'contrib/' directory in addition to 'src/'
+* Behavior for running Python programs was aligned with that of C++ programs; the list of modules built is no longer printed out.
+
+### Changed behavior
+
+* **MultiModelSpectrumChannel** does not call StartRx for receivers that operate on subbands orthogonal to transmitter subbands. Models that depend on receiving signals with zero power spectral density from orthogonal bands may change their behavior. See [bug 2467](https://www.nsnam.org/bugzilla/show_bug.cgi?id=2467) for discussion.
+* **Packet Tag objects** are no longer constrained to fit within 21 bytes; a maximum size is no longer enforced.
+* The default value of the **TxGain** and **RxGain** attributes in WifiPhy was changed from 1 dB to 0 dB.
+* The reported SNR by WifiPhy::MonitorSnifferRx did not include the RxNoiseFigure, but now does; see [bug 2783](https://www.nsnam.org/bugzilla/show_bug.cgi?id=2783) for discussion.
+* **Queue** has been redesigned as a template class object, where the type parameter specifies the type of items to be stored in the queue. As a consequence:
+    * Being a subclass of Queue, **DropTailQueue** is a template class as well.
+    * Network devices such as SimpleNetDevice, PointToPointNetDevice and CsmaNetDevice use a queue of type Queue<Packet> to store the packets to transmit. The SetQueue method of their helpers, however, can still be invoked as, e.g., SetQueue ("ns3::DropTailQueue") instead of, e.g., SetQueue ("ns3::DropTailQueue<Packet>").
+    * The attributes **Mode**, **MaxPackets** and **MaxBytes** are now defined by the QueueBase class (which Queue is derived from).
+* Queue discs that can operate both in packet mode and byte mode (Red, CoDel, Pie) define their own enum QueueDiscMode instead of using QueueBase::QueueMode.
+* The CoDel, PIE and RED queue discs require that the size of the internal queue is the same as the queue disc limit (previously, it was allowed to be greater than or equal).
+* The default value of the **EnableBeaconJitter** attribute in ApWifiMac was changed from false to true.
+* The NormalClose() callback of a TcpSocket object used to fire upon leaving TIME\_WAIT state (2\*MSL after FINs have been exchanged). It now fires upon entering TIME\_WAIT state. Timing of the callback for the other path to state CLOSED (through LAST\_ACK) has not been changed.
+
+Changes from ns-3.25 to ns-3.26
+-------------------------------
+
+### New API
+
+* A **SocketPriorityTag** is introduced to carry the packet priority. Such a tag is added to packets by sockets that support this mechanism (UdpSocketImpl, TcpSocketBase and PacketSocket). The base class Socket has a new SetPriority method to set the socket priority. When the IPv4 protocol is used, the priority is set based on the ToS. See the Socket options section of the Network model for more information.
+* A **WifiNetDevice::SelectQueue** method has been added to determine the user priority of an MSDU. This method is called by the traffic control layer before enqueuing a packet in the queue disc, if a queue disc is installed on the outgoing device, or passing a packet to the device, otherwise. The user priority is set to the three most significant bits of the DS field (TOS field in case of IPv4 and Traffic Class field in case of IPv6). The packet priority carried by the SocketPriorityTag is set to the user priority.
+* The **PfifoFastQueueDisc** classifies packets into bands based on their priority. See the pfifo\_fast queue disc section of the Traffic Control Layer model for more information.
+* A new class **SpectrumWifiPhy** has been introduced that makes use of the Spectrum module. Its functionality and API is currently very similar to that of the YansWifiPhy, especially because it reuses the same InterferenceHelper and ErrorModel classes (for this release). Some example programs in the 'examples/wireless/' directory, such as 'wifi-spectrum-per-example.cc', illustrate how the SpectrumWifiPhy class can be substituted for the default YansWifiPhy PHY model.
+* We have added support for generating traces for the [DES Metrics](https://wilseypa.github.io/desMetrics) project. These can be enabled by adding \--enable-des-metrics at configuration; you must also use CommandLine in your script. See the API docs for class **DesMetrics** for more details.
+* The traffic control module now includes the **FQ-CoDel** and **PIE** queue disc models, and behavior corresponding to Linux **Byte Queue Limits (BQL)**.
+* Several new TCP congestion control variants were introduced, including **TCP Vegas, Scalable, Veno, Illinois, Bic, YeAH, and H-TCP** congestion control algorithms.
+
+### Changes to existing API
+
+* **SocketAddressTag** was a long-standing approach to approximate the POSIX socket recvfrom behavior (i.e., to know the source address of a packet) without actually calling RecvFrom. Experience with this revealed that this option was difficult to use with tunnels (the new tag has to replace the old one). Moreover, there is no real need to create a new API when there is a an existing one (i.e., RecvFrom). As a consequence, SocketAddressTag has been completely removed from ns-3. Users can use RecvFrom (for UDP), GetPeerName (for TCP), or similar.
+* **InetSockAddress** can now store a ToS value, which can be set through its SetTos method. The Bind and Connect methods of UDP (UdpSocketImpl) and TCP (TcpSocketBase) sockets set the socket ToS value to the value provided through the address input parameter (of type InetSockAddress). See the Socket options section of the Network model for more information.
+* The **QosTag** is removed as it has been superseded by the SocketPriorityTag.
+* The **Ipv4L3Protocol::DefaultTos** attribute is removed.
+* The attributes **YansWifiPhy::Frequency, YansWifiPhy::ChannelNumber, and YansWifiPhy::ChannelWidth**, and the related accessor methods, were moved to base class WifiPhy. YansWifiPhy::GetChannelFrequencyMhz() was deleted. A new method WifiPhy::DefineChannelNumber () was added to allow users to define relationships between channel number, standard, frequency, and channel width.
+* The class **WifiSpectrumValueHelper** has been refactored; previously it was an abstract base class supporting the WifiSpectrumValue5MhzFactory spectrum model. It now contains various static member methods supporting the creation of power spectral densities with the granularity of a Wi-Fi OFDM subcarrier bandwidth. The class **WifiSpectrumValue5MhzFactory** and its API remain but it is not subclassed.
+* A new Wifi method **InterferenceHelper::AddForeignSignal** has been introduced to support use of the SpectrumWifiPhy (so that non-Wi-Fi signals may be handled as noise power).
+* A new Wifi attribute **Dcf::TxopLimit** has been introduced to add support for 802.11e TXOP.
+
+### Changes to build system
+
+* A new waf build option, \--check-config, was added to allow users to print the current configuration summary, as appears at the end of ./waf configure. See bug 2459 for discussion.
+* The configure summary is now sorted, to make it easier to check the status of optional features.
+
+### Changed behavior
+
+This section is for behavioral changes to the models that were not due to a bug fix.
+
+* The relationship between Wi-Fi channel number, frequency, channel width, and Wi-Fi standard has been revised (see bug 2412). Previously, ChannelNumber and Frequency were attributes of class YansWifiPhy, and the frequency was defined as the start of the band. Now, Frequency has been redefined to be the center frequency of the channel, and the underlying device relies on the pair of frequency and channel width to control behavior; the channel number and Wi-Fi standard are used as attributes to configure frequency and channel width. The wifi module documentation discusses this change and the new behavior.
+* AODV now honors the TTL in RREQ/RREP and it uses a method compliant with [RFC 3561](http://www.ietf.org/rfc/rfc3561.txt). The node search radius is increased progressively. This could increase slightly the node search time, but it also decreases the network congestion.
+
+Changes from ns-3.24 to ns-3.25
+-------------------------------
+
+### New API
+
+* In 'src/internet/test', a new environment is created to test TCP properties.
+* The 'src/traffic-control' module has been added, with new API for adding and configuring queue discs and packet filters.
+* Related to traffic control, a new interface has been added to the NetDevice to provide a queue interface to access device queue state and register callbacks used for flow control.
+* In 'src/wifi', a new rate control (MinstrelHT) has been added for 802.11n/ac modes.
+* In 'src/wifi', a new helper (WifiMacHelper) is added and is a merged helper from all previously existing MAC helpers (NqosWifiMacHelper, QosWifiMacHelper, HtWifiMacHelper and VhtWifiMacHelper).
+* It is now possible to use RIPv2 in IPv4 network simulations.
+
+### Changes to existing API
+
+* TCP-related changes:
+    * Classes TcpRfc793, TcpTahoe, and TcpReno were removed.
+    * The 'TcpNewReno' log component was effectively replaced by 'TcpCongestionOps'
+    * TCP Hybla and HighSpeed have been added.
+    * Added the concept of Congestion State Machine inside TcpSocketBase.
+    * Merged Fast Recovery and Fast Retransmit inside TcpSocketBase.
+    * Some member variables have been moved from TcpSocketBase inside TcpSocketState. Attributes are not touched.
+    * Congestion control split from TcpSocketBase as subclass of TcpCongestionOps.
+    * Added Rx and Tx callbacks on TcpSocketBase.
+    * Added BytesInFlight trace source on TcpSocketBase. The trace is updated when the implementation requests the value.
+    * Added attributes about the number of connection and data retransmission attempts.
+* ns-3 is now capable of serializing SLL (a.k.a. cooked) headers. This is used in DCE to allow the generation of pcap directly readable by wireshark.
+* In the WifiHelper class in the wifi module, Default has been declared deprecated. This is now immediately handled by the constructor of the class.
+* The API for configuring 802.11n/ac aggregation has been modified to be more user friendly. As any MAC layer attributes, aggregation parameters can now also be configured through WifiMacHelper::SetType.
+* The class Queue and subclasses derived from it have been changed in two ways:
+    * Queues no longer enqueue simple Packets but instead enqueue QueueItem objects, which include Packet but possibly other information such as headers.
+    * The attributes governing the mode of operation (packets or bytes) and the maximum size have been moved to base class Queue.
+* Users of advanced queues (RED, CoDel) who have been using them directly in the NetDevice will need to adjust to the following changes:
+    * RED and CoDel are no longer specializations of the Queue class, but are now specializations of the new QueueDisc class. This means that RED and CoDel can now be installed in the context of the new Traffic Control layer instead of as queues in (some) NetDevices. The reason for such a change is to make the ns-3 stack much more similar to that of real operating systems (Linux has been taken as a reference). Queuing disciplines such as RED and CoDel can now be tested with all the NetDevices, including WifiNetDevices.
+    * NetDevices still use queues to buffer packets. The only subclass of Queue currently available for this purpose is DropTailQueue. If one wants to approximate the old behavior, one needs to set the DropTailQueue MaxPackets attribute to very low values, e.g., 1.
+    * The Traffic Control layer features a mechanism by which packets dropped by the NetDevice are requeued in the queue disc (more precisely: if NetDevice::Send returns false, the packet is requeued), so that they are retransmitted later. This means that the MAC drop traces may include packets that have not been actually lost, because they have been dropped by the device, requeued by the traffic control layer and successfully retransmitted. To get the correct number of packets that have been actually lost, one has to subtract the number of packets requeued from the number of packets dropped as reported by the MAC drop trace.
+
+### Changes to build system
+
+* Waf was upgraded to 1.8.19
+* A new waf build option, --check-profile, was added to allow users to check the currently active build profile. It is discussed in bug 2202 in the tracker.
+
+### Changed behavior
+
+This section is for behavioral changes to the models that were not due to a bug fix.
+
+* TCP behavioral changes:
+    * TCP closes connection after a number of failed segment retries, rather than trying indefinitely. The maximum number of retries, for both SYN attempts and data attempts, is controlled by attributes.
+    * Congestion algorithms not compliant with Fast Retransmit and Fast Recovery (TCP 793, Reno, Tahoe) have been removed.
+* 802.11n/ac MPDU aggregation is now enabled by default for both AC\_BE and AC\_VI.
+* The introduction of the traffic control layer leads to some additional buffering by default in the stack; when a device queue fills up, additional packets become enqueued at the traffic control layer.
+
+Changes from ns-3.23 to ns-3.24
+-------------------------------
+
+### New API
+
+* In 'src/wifi', several changes were made to enable partial 802.11ac support:
+    * A new helper (VhtWifiMacHelper) was added to set up a Very high throughput (VHT) MAC entity.
+    * A new standard value has been added that enables the new 11ac data rates.
+    * A new 11ac preamble has been added.
+    * A new information element has been added: VhtCapabilities. This information element is added to the MAC frame header if the node is a VHT node. This VhtCapabilites information element is used to advertise the VHT capabilities of the node to other nodes in the network.
+* The ArpCache API was extended to allow the manual removal of ArpCache entries and the addition of permanent (static) entries for IPv4.
+* The SimpleChannel in the 'network' module now allows per-NetDevice blacklists, in order to do hidden terminal testcases.
+
+### Changes to existing API
+
+* The signatures on several TcpHeader methods were changed to take const arguments.
+* class TcpL4Protocol replaces Send() methods with SendPacket(), and adds new methods to AddSocket() and RemoveSocket() from a node. Also, a new PacketReceived() method was introduced to get the TCP header of an incoming packet and check its checksum.
+* The CongestionWindow and SlowStartThreshold trace sources have been moved from the TCP subclasses such as NewReno, Reno, Tahoe, and Westwood to the TcpSocketBase class.
+* The WifiMode object has been refactored:
+    * 11n data rates are now renamed according to their MCS value. E.g. OfdmRate65MbpsBW20MHz has been renamed into HtMcs7. 11ac data rates have been defined according to this new renaming.
+    * HtWifiMacHelper and VhtWifiMacHelper provide a helper to convert a MCS value into a data rate value.
+    * The channel width is no longer tied to the wifimode. It is now included in the TXVECTOR.
+    * The physical bitrate is no longer tied to the wifimode. It is computed based on the selected wifimode and on the TXVECTOR parameters (channel width, guard interval and number of spatial streams).
+
+### Changes to build system
+
+* Waf was upgraded to 1.8.12
+* Waf scripts and test.py test runner program were made compatible with Python 3
+
+### Changed behavior
+
+This section is for behavioral changes to the models that were not due to a bug fix.
+
+Changes from ns-3.22 to ns-3.23
+-------------------------------
+
+### New API
+
+* The mobility module includes a GeographicPositions class used to convert geographic to cartesian coordinates, and to generate randomly distributed geographic coordinates.
+* The spectrum module includes new TvSpectrumTransmitter classes and helpers to create television transmitter(s) that transmit PSD spectrums customized by attributes such as modulation type, power, antenna type, channel frequency, etc.
+
+### Changes to existing API
+
+* In LteSpectrumPhy, LtePhyTxEndCallback and the corresponding methods have been removed, since they were unused.
+* In the DataRate class in the network module, CalculateTxTime has been declared deprecated. CalculateBytesTxTime and CalculateBitsTxTime are to be used instead. The return value is a Time, instead of a double.
+* In the Wi-Fi InterferenceHelper, the interference event now takes the WifiTxVector as an input parameter, instead of the WifiMode. A similar change was made to the WifiPhy::RxOkCallback signature.
+
+### Changes to build system
+
+* None
+
+### Changed behavior
+
+This section is for behavioral changes to the models that were not due to a bug fix.
+
+* In Wi-Fi, HT stations (802.11n) now support two-level aggregation. The InterferenceHelper now distinguishes between the PLCP and regular payload reception, for higher fidelity modeling. ACKs are now sent using legacy rates and preambles. Access points now establish BSSBasicRateSet for control frame transmissions. PLCP header and PLCP payload reception have been decoupled to improve PHY layer modeling accuracy. RTS/CTS with A-MPDU is now fully supported.
+* The mesh module was made more compliant to the IEEE 802.11s-2012 standard and packet traces are now parseable by Wireshark.
+
+Changes from ns-3.21 to ns-3.22
+-------------------------------
+
+### New API
+
+* New classes were added for the PARF and APARF WiFi power and rate control mechanisms.
+* Support for WiFi 802.11n MPDU aggregation has been added.
+* Additional support for modeling of vehicular WiFi networks has been added, including the channel-access coordination feature of IEEE 1609.4. In addition, a Basic Safety Message (BSM) packet generator and related statistics-gathering classes have been added to the wave module.
+* A complete LTE release bearer procedure is now implemented which can be invoked by calling the new helper method LteHelper::DeActivateDedicatedEpsBearer ().
+* It is now possible to print the Neighbor Cache (ARP and NDISC) by using the RoutingProtocolHelper
+* A TimeProbe class has been added to the data collection framework in the stats module, enabling TracedValues emitting values of type ns3::Time to be handled by the framework.
+* A new attribute 'ClockGranularity' was added to the TcpSocketBase class, to control modeling of RTO calculation.
+
+### Changes to existing API
+
+* Several deprecated classes and class methods were removed, including EmuNetDevice, RandomVariable and derived classes, Packet::PeekData(), Ipv6AddressHelper::NewNetwork(Ipv6Address, Ipv6Prefix), Ipv6InterfaceContainer::SetRouter(), Ipv4Route::GetOutputTtl(), TestCase::AddTestCase(TestCase\*), and TestCase::GetErrorStatus().
+* Print methods involving routing tables and neighbor caches, in classes Ipv4RoutingHelper and Ipv6RoutingHelper, were converted to static methods.
+* PointerValue attribute types in class UanChannel (NoiseModel), UanPhyGen (PerModel and SinrModel), UanPhyDual (PerModelPhy1, PerModelPhy2, SinrModelPhy1, and SinrModelPhy2), and SimpleNetDevice (TxQueue), were changed from PointerValue type to StringValue type, making them configurable via the Config subsystem.
+* WifiPhy::CalculateTxDuration() and WifiPhy::GetPayloadDurationMicroSeconds () now take an additional frequency parameter.
+* The attribute 'Recievers' in class YansWifiPhy was misspelled, so this has been corrected to 'Receivers'.
+* We have now documented the callback function signatures for all TracedSources, using an extra (fourth) argument to TypeId::AddTraceSource to pass the fully-qualified name of the signature typedef. To ensure that future TraceSources are similarly documented, the three argument version of AddTraceSource has been deprecated.
+* The "MinRTO" attribute of the RttEstimator class was moved to the TcpSocketBase class. The "Gain" attribute of the RttMeanDeviation class was replaced by new "Alpha" and "Beta" attributes.
+* Attributes of the TcpTxBuffer and TcpRxBuffer class are now accessible through the TcpSocketBase class.
+* The LrWpanHelper class has a new constructor allowing users to configure a MultiModelSpectrumChannel as an option, and also provides Set/Get API to allow users to access the underlying channel object.
+
+### Changes to build system
+
+* waf was upgraded to version 1.7.16
+
+### Changed behavior
+
+This section is for behavioral changes to the models that were not due to a bug fix.
+
+* The default value of the \`Speed\` attribute of ConstantSpeedPropagationDelayModel was changed from 300,000,000 m/s to 299,792,458 m/s (speed of light in a vacuum), causing propagation delays using this model to vary slightly.
+* The LrWpanHelper object was previously instantiating only a LogDistancePropagationLossModel on a SingleModelSpectrumChannel, but no PropagationDelayModel. The constructor now adds by default a ConstantSpeedPropagationDelayModel.
+* The Nix-vector routing implementation now uses a lazy flush mechanism, which dramatically speeds up the creation of large topologies.
+
+Changes from ns-3.20 to ns-3.21
+-------------------------------
+
+### New API
+
+* New "const double& SpectrumValue:: operator\[\] (size\_t index) const".
+* A new TraceSource has been added to TCP sockets: SlowStartThreshold.
+* New method CommandLine::AddValue (name, attibutePath) to provide a shorthand argument "name" for the Attribute "path". This also has the effect of including the help string for the Attribute in the Usage message.
+* The GSoC 2014 project in the LTE module has brought some additional APIs:
+    * a new abstract class LteFfrAlgorithm, which every future implementation of frequency reuse algorithm should inherit from
+    * a new SAPs: one between MAC Scheduler and FrAlgorithm, one between RRC and FrAlgorithm
+    * new attribute to enable Uplink Power Control in LteUePhy
+    * new LteUePowerControl class, an implementation of Uplink Power Control, which is configurable by attributes. ReferenceSignalPower is sent by eNB in SIB2. Uplink Power Control in Closed Loop Accumulative Mode is enabled by default
+    * seven different Frequency Reuse Algorithms (each has its own attributes):
+    
+    * LteFrNoOpAlgorithm
+    * LteFrHardAlgorithm
+    * LteFrStrictAlgorithm
+    * LteFrSoftAlgorithm
+    * LteFfrSoftAlgorithm
+    * LteFfrEnhancedAlgorithm
+    * LteFfrDistributedAlgorithm
+    
+    * attribute in LteFfrAlgorithm to set FrCellTypeId which is used in automatic Frequency Reuse algorithm configuration
+    * LteHelper has been updated with new methods related to frequency reuse algorithm: SetFfrAlgorithmType and SetFfrAlgorithmAttribute
+* A new SimpleNetDeviceHelper can now be used to install SimpleNetDevices.
+* New PacketSocketServer and PacketSocketClient apps, meant to be used in tests.
+* Tcp Timestamps and Window Scale options have been added and are enabled by default (controllable by attribute).
+* A new CoDel queue model has been added to the 'internet' module.
+* New test macros NS\_TEST\_ASSERT\_MSG\_GT\_OR\_EQ() and NS\_TEST\_EXPECT\_MSG\_GT\_OR\_EQ() have been added.
+
+### Changes to existing API
+
+* "Icmpv6L4Protocol::ForgeEchoRequest" is now returning a packet with the proper IPv6 header.
+* The TCP socket Attribute "SlowStartThreshold" has been renamed "InitialSlowStartThreshold" to clarify that the effect is only on the initial value.
+* all schedulers were updated to interact with FR entity via FFR-SAP. Only PF, PSS, CQA, FD-TBFQ, TD-TBFQ schedulers supports Frequency Reuse functionality. In the beginning of scheduling process, schedulers ask FR entity for available RBGs and then ask if UE can be scheduled on RB
+* eNB RRC interacts with FFR entity via RRC-FFR SAP
+* new DL-CQI generation approach was implemented. Now DL-CQI is computed from control channel as signal and data channel (if received) as interference. New attribute in LteHelper was added to specify DL-CQI generation approach. New approach is default one in LteHelper
+* RadioEnvironmentMap can be generated for Data or Control channel and for specified RbId; Data or Control channel and RbId can be configured by new attributes in RadioEnvironmentMapHelper
+* lte-sinr-chunk-processor refactored to lte-chunk-processor. Removed all lte-xxx-chunk-processor implementations
+* BindToNetDevice affects also sockets using IPv6.
+* BindToNetDevice now calls implicitly Bind (). To bind a socket to a NetDevice and to a specific address, the correct sequence is Bind (address) - BindToNetDevice (device). The opposite will raise an error.
+
+### Changes to build system
+
+* None for this release.
+
+### Changed behavior
+
+* Behavior will be changed due to the list of bugs fixed (listed in RELEASE\_NOTES.md); users are requested to review that list as well.
+
+Changes from ns-3.19 to ns-3.20
+-------------------------------
+
+### New API
+
+* Models have been added for low-rate, wireless personal area networks (LR-WPAN) as specified by IEEE standard 802.15.4 (2006). The current emphasis is on the unslotted mode of 802.15.4 operation for use in Zigbee, and the scope is limited to enabling a single mode (CSMA/CA) with basic data transfer capabilities. Association with PAN coordinators is not yet supported, nor the use of extended addressing. Interference is modeled as AWGN but this is currently not thoroughly tested. The NetDevice Tx queue is not limited, i.e., packets are never dropped due to queue becoming full. They may be dropped due to excessive transmission retries or channel access failure.
+* A new IPv6 routing protocol has been added: RIPng. This protocol is an Interior Gateway Protocol and it is available in the Internet module.
+* A new LTE MAC downlink scheduling algorithm named Channel and QoS Aware (CQA) Scheduler is provided by the new "ns3::CqaFfMacScheduler" object.
+* Units may be attached to Time objects, to facilitate specific output formats (see Time::As())
+* FlowMonitor "SerializeToXml" functions are now directly available from the helper.
+* Access to OLSR's HNA table has been enabled
+
+### Changes to existing API
+
+* The SixLowPan model can now use uncompressed IPv6 headers. An option to define the minimum compressed packet size has been added.
+* MinDistance wsa replaced by MinLoss in FriisPropagationLossModel, to better handle conditions outside of the assumed far field region.
+* In the DSR model, the attribute DsrOptionRerrHeader::ErrorType" has been removed.
+
+### Changes to build system
+
+* Python 3.3 is now supported for Python bindings for ns-3. Python 3.3 support for API scanning is not supported. Python 3.2 is not supported.
+* Enable selection of high precision int64x64\_t implementation at configure time, for debugging purposes.
+* Optimized builds are now enabling signed overflow optimization (-fstrict-overflow) and for gcc 4.8.2 and greater, also warning for cases where an optimizization may occur due to compiler assumption that overflow will not occur.
+
+### Changed behavior
+
+* The Internet FlowMonitor can now track IPv6 packets.
+* Ipv6Extension::m\_dropTrace has been removed. Ipv6L3Protocol::m\_dropTrace is now fired when appropriate.
+* IPv4 identification field value is now dependent on the protocol field.
+* Point-to-point trace sources now contain PPP headers
+
+Changes from ns-3.18.1 to ns-3.19
+---------------------------------
+
+### New API
+
+* A new wifi extension for vehicular simulation support is available in the src/wave directory. The current code represents an interim capability to realize an IEEE 802.11p-compliant device, but without the WAVE extensions (which are planned for a later patch). The WaveNetDevice modelled herein enforces that a WAVE-compliant physical layer (at 5.9 GHz) is selected, and does not require any association between devices (similar to an adhoc WiFi MAC), but is otherwise similar (at this time) to a WifiNetDevice. WAVE capabililties of switching between control and service channels, or using multiple radios, are not yet modelled.
+* New SixLowPanNetDevice class providing a shim between IPv6 and real NetDevices. The new module implements 6LoWPAN: "Transmission of IPv6 Packets over IEEE 802.15.4 Networks" (see [RFC 4944](http://www.ietf.org/rfc/rfc4944.txt) and [RFC 6262](http://www.ietf.org/rfc/rfc6262.txt)), resulting in a heavy header compression for IPv6 packets. The module is intended to be used on 802.15.4 NetDevices, but it can be used over other NetDevices. See the manual for further discussion.
+* LteHelper has been updated with some new APIs:
+    * new overloaded Attach methods to enable UE to automatically determine the eNodeB to attach to (using initial cell selection);
+    * new methods related to handover algorithm: SetHandoverAlgorithmType and SetHandoverAlgorithmAttribute;
+    * a new attribute AnrEnabled to activate/deactivate Automatic Neighbour Relation (ANR) function; and
+    * a new method SetUeDeviceAttribute for configuring LteUeNetDevice.
+* The GSoC 2013 project in the LTE module has brought some additional APIs:
+    * a new abstract class LteHandoverAlgorithm, which every future implementation of automatic handover trigger should inherit from;
+    * new classes LteHandoverAlgorithm and LteAnr as sub-modules of LteEnbNetDevice class; both interfacing with the LteEnbRrc sub-module through Handover Management SAP and ANR SAP;
+    * new attributes in LteEnbNetDevice and LteUeNetDevice classes related to Closed Subscriber Group (CSG) functionality in initial cell selection;
+    * new attributes in LteEnbRrc for configuring UE measurements' filtering coefficient (i.e., quantity configuration);
+    * a new public method AddUeMeasReportConfig in LteEnbRrc for setting up custom UE measurements' reporting configuration; measurement reports can then be captured from the RecvMeasurementReport trace source; and
+    * new trace sources in LteUeRrc to capture more events, such as System Information messages (MIB, SIB1, SIB2), initial cell selection, random access, and handover.
+* A new parallel scheduling algorithm based on null messages, a common parallel DES scheduling algorithm, has been added. The null message scheduler has better scaling properties when running on some scenarios with large numbers of nodes since it does not require a global communication.
+
+### Changes to existing API
+
+* It is now possible to use Ipv6PacketInfoTag from UDP applications in the same way as with Ipv4PacketInfoTag. See Doxygen for current limitations in using Ipv\[4,6\]PacketInfoTag to set IP properties.
+* A change is introduced for the usage of the EpcHelper class. Previously, the EpcHelper class included both the API definition and its (only) implementation; as such, users would instantiate and use the EpcHelper class directly in their simulation programs. From now on, EpcHelper is just the base class defining the API, and the implementation has been moved to derived classes; as such, users are now expected to use one of the derived classes in their simulation program. The implementation previously provided by the EpcHelper class has been moved to the new derived class PointToPointEpcHelper.
+* The automatic handover trigger and ANR functions in LTE module have been moved from LteEnbRrc class to separate classes. As a result, the related attributes, e.g., ServingCellHandoverThreshold, NeighbourCellHandoverOffset, EventA2Threshold, and EventA4Threshold have been removed from LteEnbRrc class. The equivalent attributes are now in A2A4RsrqHandoverAlgorithm and LteAnr classes.
+* Master Information Block (MIB) and System Information Block Type 1 (SIB1) are now transmitted as LTE control messages, so they are no longer part of RRC protocol.
+* UE RRC state model in LTE module has been considerably modified and is not backward compatible with the previous state model.
+* Additional time units (Year, Day, Hour, Minute) were added to the time value class that represents simulation time; the largest unit prior to this addition was Second.
+* SimpleNetDevice and SimpleChannel are not so simple anymore. SimpleNetDevice can be now a Broadcast or PointToPoint NetDevice, it can have a limited bandwidth and it uses an output queue.
+
+### Changes to build system
+
+### Changed behavior
+
+* For the TapBridge device, in UseLocal mode there is a MAC learning function. TapBridge has been waiting for the first packet received from tap interface to set the address of the bridged device to the source address of the first packet. This has caused problems with WiFi. The new behavior is that after connection to the tap interface, ns-3 learns the MAC address of that interface with a system call and immediately sets the address of the bridged device to the learned one. See [bug 1777](https://www.nsnam.org/bugzilla/show_bug.cgi?id=1777) for more details.
+* TapBridge device now correctly implements IsLinkUp() method.
+* IPv6 addresses and routing tables are printed like in Linux "route -A inet6" command.
+* A change in Ipv\[4,6\]Interface enforces the correct behaviour of IP when a device do not support the minimum MTU requirements. This is set to 68 and 1280 octects respectively. IP simulations that may have run over devices with smaller MTUs than 68 or 1280, respectively, will no longer be able to use such devices.
+
+Changes from ns-3.18 to ns-3.18.1
+---------------------------------
+
+### New API
+
+* It is now possible to randomize the time of the first beacon from an access point. Use an attribute "EnableBeaconJitter" to enable/disable this feature.
+* A new FixedRoomPositionAllocator helper class is available; it allows one to generate a random position uniformly distributed in the volume of a chosen room inside a chosen building.
+
+### Changes to existing API
+
+* Logging wildcards: allow "\*\*\*" as synonym for "\*=\*\*" to turn on all logging.
+* The log component list ("NS\_LOG=print-list") is now printed alphabetically.
+* Some deprecated IEEE 802.11p code has been removed from the wifi module
+
+### Changes to build system
+
+* The Python API scanning system (./waf --apiscan) has been fixed (bug 1622)
+* Waf has been upgraded from 1.7.11 to 1.7.13
+
+### Changed behavior
+
+* Wifi simulations have additional jitter on AP beaconing (see above) and some bug fixes have been applied to wifi module (see RELEASE\_NOTES.md)
+
+Changes from ns-3.17 to ns-3.18
+-------------------------------
+
+### New API
+
+* New features have been added to the LTE module:
+    * PHY support for UE measurements (RSRP and RSRQ)
+    * RRC support for UE measurements (configuration, execution, reporting)
+    * Automatic Handover trigger based on RRC UE measurement reports
+* Data collection components have been added in the 'src/stats' module. Data collection includes a Probe class that attaches to ns-3 trace sources to filter their output, and two Aggregator classes for marshaling probed data into text files or gnuplot plots. The ns-3 tutorial has been extended to illustrate basic functionality.
+* In 'src/wifi', several changes were made to enable partial 802.11n support:
+    * A new helper (HtWifiMacHelper) was added to set up a High Throughput (HT) MAC entity
+    * New attributes were added to help the user setup a High Throughput (HT) PHY entity. These attributes can be set using the YansWifiPhyHelper
+    * A new standard value has been added that enables the new 11n data rates.
+    * New 11n preambles has been added (Mixed format and greenfield). To be able to change Tx duration according to the preamble used, a new class TxVector has been added to carry the transmission parameters (mode, preamble, stbc,..). Several functions have been updated to allow the passage of TxVector instead of WifiMode in MacLow, WifiRemoteStationManager, WifiPhy, YansWifiPhy,..
+    * A new information element has been added: HTCapabilities. This information element is added to the MAC frame header if the node is an HT node. This HTCapabilites information element is used to advertise the HT capabilities of the node to other nodes in the network
+* InternetStackHelper has two new functions:SetIpv4ArpJitter (bool enable) and SetIpv6NsRsJitter (bool enable) to enable/disable the random jitter on the tranmission of IPv4 ARP Request and IPv6 NS/RS.
+* Bounds on valid time inputs for time attributes can now be enabled. See attribute-test-suite.cc for an example.
+* New generic hash function interface provided in the simulation core. Two hash functions are provided: murmur3 (default), and the venerable FNV1a. See the Hash Functions section in the ns-3 manual.
+* New Mac16Address has been added. It can be used with IPv6 to make an Autoconfigured address.
+* Mac64Address support has been extended. It can now be used with IPv6 to make an Autoconfigured address.
+* IPv6 can now detect and use Path-MTU. See examples/ipv6/fragmentation-ipv6-two-MTU.cc for an example.
+* Radvd application has a new Helper. See the updated examples/ipv6/radvd.cc for an example.
+
+### Changes to existing API
+
+* The Ipv6InterfaceContainer functions to set a node in forwarding state (i.e., a router) and to install a default router in a group of nodes have been extensively changed. The old function void Ipv6InterfaceContainer::SetRouter (uint32\_t i, bool router) is now DEPRECATED.
+* The documentation's IPv6 addresses (2001:db8::/32, RFC 3849) are now dropped by routers.
+* The 'src/tools' module has been removed, and most files migrated to 'src/stats'. For users of these programs (the statistics-processing in average.h, or the gnuplot support), the main change is likely to be replacing the inclusion of "tools-module.h" with "stats-module.h". Users of the event garbage collector, previously in tools, will now include it from the core module.
+* The Ipv6 UnicastForwardCallback and MulticastForwardCallback have a new parameter, the NetDevice the packet has been received from. Existing Ipv6RoutingProtocols should update their RouteInput function accordingly, e.g., from ucb (rtentry, p, header); to ucb (idev, rtentry, p, header);
+* The previous buildings module relied on a specific MobilityModel called BuildingsMobilityModel, which supported buildings but only allowed static positions. This mobility model has been removed. Now, the Buildings module instead relies on a new class called MobilityBuildingInfo which can be aggregated to any MobilityModel. This allows having moving nodes in presence of buildings with any of the existing MobilityModels.
+* All functions in WifiRemoteStationManager named GetXxxMode have been changed to GetXxxTxVector
+
+### Changes to build system
+
+* Make references to bug id's in doxygen comments with \\bugid{num}, where num is the bug id number. This form will generate a link to the bug in the bug database.
+
+### Changed behavior
+
+* Now it is possible to request printing command line arguments to the desired output stream using PrintHelp or operator <<
+    
+      CommandLine cmd;
+      cmd.Parse (argc, argv);
+    ...
+    
+      std::cerr << cmd;
+    
+    or
+    
+      cmd.PrintHelp (std::cerr);
+    
+* Command line boolean arguments specified with no integer value (e.g. "--boolArg") will toggle the value from the default, instead of always setting the value to true.
+* IPv4's ARP Request and IPv6's NS/RS are now transmitted with a random delay. The delay is, by default, a uniform random variable in time between 0 and 10ms. This is aimed at preventing reception errors due to collisions during wifi broadcasts when the sending behavior is synchronized (e.g. due to applications starting at the same time on several different nodes). This behaviour can be modified by using ArpL3Protocol's RequestJitter and Icmpv6L4Protocol's SolicitationJitter attributes or by using the new InternetStackHelper functions.
+* AODV Hellos are disabled by default. The performance with Hellos enabled and disabled are almost identical. With Hellos enabled, AODV will suppress hellos from transmission, if any recent broadcast such as RREQ was transmitted. The attribute ns3::aodv::RoutingProtocol::EnableHello can be used to enable/disable Hellos.
+
+Changes from ns-3.16 to ns-3.17
+-------------------------------
+
+### New API
+
+* New TCP Westwood and Westwood+ models
+* New FdNetDevice class providing a special NetDevice that is able to read and write traffic from a file descriptor. Three helpers are provided to associate the file descriptor with different underlying devices:
+    * EmuFdNetDeviceHelper (to associate the |ns3| device with a physical device in the host machine). This helper is intended to eventually replace the EmuNetDevice in src/emu.
+    * TapFdNetDeviceHelper (to associate the ns-3 device with the file descriptor from a tap device in the host machine)
+    * PlanteLabFdNetDeviceHelper (to automate the creation of tap devices in PlanetLab nodes, enabling |ns3| simulations that can send and receive traffic though the Internet using PlanetLab resource.
+* In Ipv4ClickRouting, the following APIs were added:
+    * Ipv4ClickRouting::SetDefines(), accessible through ClickInternetStackHelper::SetDefines(), for the user to set Click defines from the ns-3 simulation file.
+    * SIMCLICK\_GET\_RANDOM\_INT click-to-simulator command for ns-3 to drive Click's random number generation.
+* LTE module
+    * New user-visible LTE API
+        *   Two new methods have been added to LteHelper to enable the X2-based handover functionality: AddX2Interface, which setups the X2 interface between two eNBs, and HandoverRequest, which is a convenience method that schedules an explicit handover event to be executed at a given point in the simulation.
+        *   the new LteHelper method EnablePhyTraces can now be used to enable the new PHY traces
+    * New internal LTE API
+        *   New LTE control message classes DlHarqFeedbackLteControlMessage, RachPreambleLteControlMessage, RarLteControlMessage, MibLteControlMessage
+        *   New class UeManager
+        *   New LteRadioBearerInfo subclasses LteSignalingRadioBearerInfo, LteDataRadioBearerInfo
+        *   New LteSinrChunkProcessor subclasses LteRsReceivedPowerChunkProcessor, LteInterferencePowerChunkProcessor
+* New DSR API
+    * Added PassiveBuffer class to save maintenance packet entry for passive acknowledgment option
+    * Added FindSourceEntry function in RreqTable class to keep track of route request entry received from same source node
+    * Added NotifyDataReciept function in DsrRouting class to notify the data receipt of the next hop from link layer. This is used for the link layer acknowledgment.
+* New Tag, PacketSocketTag, to carry the destination address of a packet and the packet type
+* New Tag, DeviceNameTag, to carry the ns3 device name from where a packet is coming
+* New Error Model, BurstError model, to determine which bursts of packets are errored corresponding to an underlying distribution, burst rate, and burst size
+
+### Changes to existing API
+
+* ns3::Object and subclasses DoStart has been renamed to DoInitialize
+* ns3::Object and subclasses Start has been renamed to Initialize
+* EnergySource StartDeviceModels renamed to InitializeDeviceModels
+* A typo was fixed in an LTE variable name. The variable ns3::AllocationRetentionPriority::preemprionVulnerability was changed to preemptionVulnerability.
+* Changes in TestCase API
+    * TestCase has new enumeration TestDuration containing QUICK, EXTENSIVE, TAKES\_FOREVER
+    * TestCase constructor now requires TestDuration, old constructor marked deprecated
+* Changes in LTE API
+    * User-visible LTE API
+        *   The previous LteHelper method ActivateEpsBearer has been now replaced by two alternative methods: ActivateDataRadioBearer (to be used when the EPC model is not used) and ActivateDedicatedEpsBearer (to be used when the EPC model is used). In the case where the EPC model is used, the default EPS bearer is not automatically activated without the need for a specific method to be called.
+    * Internal LTE API
+        *   EpcHelper added methods AddUe, AddX2Interface. Method AddEnb now requires a cellId. Signature of ActivateEpsBearer changed to void ActivateEpsBearer (Ptr ueLteDevice, uint64\_t imsi, Ptr tft, EpsBearer bearer)
+        *   LteHelper added methods EnableDlPhyTraces, EnableUlPhyTraces, EnableDlTxPhyTraces, EnableUlTxPhyTraces, EnableDlRxPhyTraces, EnableUlRxPhyTraces
+        *   LteHelper removed methods EnableDlRlcTraces, EnableUlRlcTraces, EnableDlPdcpTraces, EnableUlPdcpTraces
+        *   RadioBearerStatsCalculator added methods (Set/Get)StartTime, (Set/Get)Epoch, RescheduleEndEpoch, EndEpoch
+        *   RadioBearerStatsCalculator removed methods StartEpoch, CheckEpoch
+        *   RadioBearerStatsCalculator methods UlTxPdu, DlRxPdu now require a cellId
+        *   EpcEnbApplication constructor now requires Ipv4Addresses enbS1uAddress and sgwS1uAddress as well as cellId
+        *   EpcEnbApplication added methods SetS1SapUser, GetS1SapProvider, SetS1apSapMme and GetS1apSapEnb
+        *   EpcEnbApplication removed method ErabSetupRequest
+        *   EpcSgwPgwApplication added methods SetS11SapMme, GetS11SapSgw, AddEnb, AddUe, SetUeAddress
+        *   lte-common.h new structs PhyTransmissionStatParameters and PhyReceptionStatParameters used in TracedCallbacks
+        *   LteControlMessage new message types DL\_HARQ, RACH\_PREAMBLE, RAR, MIB
+        *   LteEnbCmacSapProvider new methods RemoveUe, GetRachConfig, AllocateNcRaPreamble, AllocateTemporaryCellRnti
+        *   LteEnbPhy new methods GetLteEnbCphySapProvider, SetLteEnbCphySapUser, GetDlSpectrumPhy, GetUlSpectrumPhy, CreateSrsReport
+        *   LteEnbPhy methods DoSendMacPdu, DoSetTransmissionMode, DoSetSrsConfigurationIndex, DoGetMacChTtiDelay, DoSendLteControlMessage, AddUePhy, DeleteUePhy made private
+        *   LteEnbPhySapProvider removed methods SetBandwidth, SetTransmissionMode, SetSrsConfigurationIndex, SetCellId
+        *   LteEnbPhySapUser added methods ReceiveRachPreamble, UlInfoListElementHarqFeeback, DlInfoListElementHarqFeeback
+        *   LtePdcp added methods (Set/Get)Status
+        *   LtePdcp DoTransmitRrcPdu renamed DoTransmitPdcpSdu
+        *   LteUeRrc new enum State. New methods SetLteUeCphySapProvider, GetLteUeCphySapUser, SetLteUeRrcSapUser, GetLteUeRrcSapProvider, GetState, GetDlEarfcn, GetDlBandwidth, GetUlBandwidth, GetCellId, SetUseRlcSm . GetRnti made const.
+        *   LteUeRrc removed methods ReleaseRadioBearer, GetLcIdVector, SetForwardUpCallback, DoRrcConfigurationUpdateInd
+        *   LtePdcpSapProvider struct TransmitRrcPduParameters renamed TransmitPdcpSduParameters. Method TransmitRrcPdu renamed TransmitPdcpSdu
+        *   LtePdcpSapUser struct ReceiveRrcPduParameters renamed ReceivePdcpSduParameters. Method ReceiveRrcPdu renamed TransmitPdcpSdu
+        *   LtePdcpSpecificLtePdcpSapProvider method TransmitRrcPdu renamed TransmitPdcpSdu
+        *   LtePdcpSpecificLtePdcpSapUser method ReceiveRrcPdu renamed ReceivePdcpSdu. Method ReceiveRrcPdu renamed ReceivePdcpSdu
+        *   LtePhy removed methods DoSetBandwidth and DoSetEarfcn
+        *   LtePhy added methods ReportInterference and ReportRsReceivedPower
+        *   LteSpectrumPhy added methods SetHarqPhyModule, Reset, SetLtePhyDlHarqFeedbackCallback, SetLtePhyUlHarqFeedbackCallback, AddRsPowerChunkProcessor, AddInterferenceChunkProcessor
+        *   LteUeCphySapProvider removed methods ConfigureRach, StartContentionBasedRandomAccessProcedure, StartNonContentionBasedRandomAccessProcedure
+        *   LteUeMac added method AssignStreams
+        *   LteUeNetDevice methods GetMac, GetRrc, GetImsi made const
+        *   LteUeNetDevice new method GetNas
+        *   LteUePhy new methods GetLteUeCphySapProvider, SetLteUeCphySapUser, GetDlSpectrumPhy, GetUlSpectrumPhy, ReportInterference, ReportRsReceivedPower, ReceiveLteDlHarqFeedback
+        *   LteUePhy DoSendMacPdu, DoSendLteControlMessage, DoSetTransmissionMode, DoSetSrsConfigurationIndex made private
+        *   LteUePhySapProvider removed methods SetBandwidth, SetTransmissionMode, SetSrsConfigurationIndex
+        *   LteUePhySapProvider added method SendRachPreamble
+* AnimationInterface method EnableIpv4RouteTracking returns reference to calling AnimationInterface object
+* To make the API more uniform across the various PropagationLossModel classes, the Set/GetLambda methods of the FriisPropagationLossModel and TwoRayGroundPropagationLossModel classes have been changed to Set/GetFrequency, and now a Frequency attribute is exported which replaces the pre-existing Lambda attribute. Any previous user code setting a value for Lambda should be changed to set instead a value of Frequency = C / Lambda, with C = 299792458.0.
+
+### Changes to build system
+
+* Waf shipped with ns-3 has been upgraded to version 1.7.10 and custom pkg-config generator has been replaced by Waf's builtin tool.
+
+### Changed behavior
+
+* DSR link layer notification has changed. The model originally used "TxErrHeader" in Ptr to indicate the transmission error of a specific packet in link layer; however, it was not working correctly. The model now uses a different path to implement the link layer notification mechanism; specifically, looking into the trace file to find packet receive events. If the model finds one receive event for the data packet, it is used as the indicator for successful data delivery.
+
+Changes from ns-3.15 to ns-3.16
+-------------------------------
+
+### New API
+
+* In the Socket class, the following functions were added:
+    * (Set/Get)IpTos - sets IP Type of Service field in the IP headers.
+    * (Set/Is)IpRecvTos - tells the socket to pass information about IP ToS up the stack (by adding SocketIpTosTag to the packet).
+    * (Set/Get)IpTtl - sets IP Time to live field in the IP headers.
+    * (Set/Is)RecvIpTtl - tells the socket to pass information about IP TTL up the stack (by adding SocketIpTtlTag to the packet).
+    * (Set/Is)Ipv6Tclass - sets Traffic Class field in the IPv6 headers.
+    * (Set/Is)Ipv6RecvTclass - tells the socket to pass information about IPv6 TCLASS up the stack (by adding SocketIpv6TclassTag to the packet).
+    * (Set/Get)Ipv6HopLimit - sets Hop Limit field in the IPv6 headers.
+    * (Set/Is)Ipv6RecvHopLimit - tells the socket to pass information about IPv6 HOPLIMIT up the stack (by adding SocketIpv6HoplimitTag to the packet).A user can call these functions to set/get the corresponding socket option. See examples/socket/socket-options-ipv4.cc and examples/socket/socket-options-ipv6.cc for examples.
+
+### Changes to existing API
+
+* In the MobilityHelper class, the functions EnableAscii () and EnableAsciiAll () were changed to use output stream wrappers rather than standard C++ ostreams. The purpose of this change was to make them behave analogously to other helpers in ns-3 that generate ascii traces. Now, the file stream that is open in MobilityHelper is closed nicely upon asserts and program exits.
+
+### Changes to build system
+
+* It's now possible to use distcc when building ns-3. See tutorial for details.
+
+### Changed behavior
+
+* Sending a packet through Ipv4RawSocket now supports checksum in the Ipv4Header. It is still not possible to manually put in arbitrary checksum as the checksum is automatically calculated at Ipv4L3Protocol. The user has to enable checksum globally for this to work. Simply calling Ipv4Header::EnableChecksum() for a single Ipv4Header will not work.
+* Now MultiModelSpectrumChannel allows a SpectrumPhy instance to change SpectrumModel at runtime by issuing a call to MultiModelSpectrumChannel::AddRx (). Previously, MultiModelSpectrumChannel required each SpectrumPhy instance to stick with the same SpectrumModel for the whole simulation.
+
+Changes from ns-3.14 to ns-3.15
+-------------------------------
+
+### New API
+
+* A RandomVariableStreamHelper has been introduced to assist with using the Config subsystem path names to assign fixed stream numbers to RandomVariableStream objects.
+
+### Changes to existing API
+
+* Derived classes of RandomVariable (i.e. the random variable implementations) have been ported to a new RandomVariableStream base class.
+* For a given distribution DistributionVariable (such as UniformVariable), the new class name is DistributionRandomVariable (such as UniformRandomVariable).
+* The new implementations are also derived from class ns3::Object and are handled using the ns-3 smart pointer (Ptr) class.
+* The new variable classes also have a new attributed called "Stream" which allows them to be assigned to a fix stream index when assigned to the underlying pseudo-random stream of numbers.
+
+### Changes to build system
+
+### Changed behavior
+
+* Programs using random variables or models that include random variables may exhibit changed output for a given run number or seed, due to a possible change in the order in which random variables are assigned to underlying pseudo-random sequences. Consult the manual for more information regarding this.
+
+Changes from ns-3.13 to ns-3.14
+-------------------------------
+
+### New API
+
+* The new class AntennaModel provides an API for modeling the radiation pattern of antennas.
+* The new buildings module introduces an API (classes, helpers, etc) to model the presence of buildings in a wireless network topology.
+* The LENA project's implementation of the LTE Mac Scheduler Interface Specification standardized by the Small Cell Forum (formerly Femto Forum) is now available for use with the LTE module.
+
+### Changes to existing API
+
+* The Ipv6RawSocketImpl "IcmpFilter" attribute has been removed. Six new member functions have been added to enable the same functionality.
+* IPv6 support for TCP and UDP has been implemented. Socket functions that take an address \[e.g. Send (), Connect (), Bind ()\] can accept an ns3::Ipv6Address or a ns3::Address in addition to taking an ns3::Ipv4Address. (Note that the ns3::Address must contain a ns3::Ipv6Address or a ns3::Ipv4Address, otherwise these functions will return an error). Internally, the socket now stores the remote address as a type "ns3::Address" instead of a type "ns3::Ipv4Address". The IPv6 Routing Header extension is not currently supported in ns3 and will not be reflected in the TCP and UDP checksum calculations per RFC 2460. Also note that UDP checksums for IPv6 packets are required per RFC, but remain optional and disabled by default in ns3 (in the interest of performance).
+* When calling Bind () on a socket without an address, the behavior remains the same: it will bind to the IPv4 "any" address (0.0.0.0). In order to Bind () to the IPv6 "any" address in a similar fashion, use "Bind6 ()".
+* The prototype for the RxCallback function in the Ipv6EndPoint was changed. It now includes the destination IPv6 address of the end point which was needed for TCP. This lead to a small change in the UDP and ICMPv6 L4 protocols as well.
+* Ipv6RoutingHelper can now print the IPv6 Routing Tables at specific intervals or time. Exactly like Ipv4RoutingHelper do.
+* New "SendIcmpv6Redirect" attribute (and getter/setter functions) to Ipv6L3Protocol. The behavior is similar to Linux's conf "send\_redirects", i.e., enable/disable the ICMPv6 Redirect sending.
+* The SpectrumPhy abstract class now has a new method
+    
+    virtual Ptr<AntennaModel> GetRxAntenna () = 0;
+    
+    that all derived classes need to implement in order to integrate properly with the newly added antenna model. In addition, a new member variable "Ptr<AntennaModel> txAntenna" has been added to SpectrumSignalParameters in order to allow derived SpectrumPhy classes to provide information about the antenna model used for the transmission of a waveform.
+* The Ns2CalendarScheduler event scheduler has been removed.
+* ErrorUnit enum has been moved into RateErrorModel class, and symbols EU\_BIT, EU\_BYTE and EU\_PKT have been renamed to RateErrorModel::ERROR\_UNIT\_BIT, RateErrorModel::ERROR\_UNIT\_BYTE and RateErrorModel::ERROR\_UNIT\_PACKET. RateErrorModel class attribute "ErrorUnit" values have also been renamed for consistency, and are now "ERROR\_UNIT\_BIT", "ERROR\_UNIT\_BYTE", "ERROR\_UNIT\_PACKET".
+* QueueMode enum from DropTailQueue and RedQueue classes has been unified and moved to Queueu class. Symbols DropTailQueue::PACKETS and DropTailQueue::BYTES are now named Queue::QUEUE\_MODE\_PACKETS and DropTailQueue::QUEUE\_MODE\_BYTES. In addition, DropTailQueue and RedQueue class attributes "Mode" have been renamed for consistency from "Packets" and "Bytes" to "QUEUE\_MODE\_PACKETS" and "QUEUE\_MODE\_BYTES".
+* The API of the LTE module has undergone a significant redesign with the merge of the code from the LENA project. The new API is not backwards compatible with the previous version of the LTE module.
+* The Ipv6AddressHelper API has been aligned with the Ipv4AddressHelper API. The helper can be set with a call to Ipv6AddressHelper::SetBase (Ipv6Address network, Ipv6Prefix prefix) instead of NewNetwork (Ipv6Address network, Ipv6Prefix prefix). A new NewAddress (void) method has been added. Typical usage will involve calls to SetBase (), NewNetwork (), and NewAddress (), as in class Ipv4AddressHelper.
+
+### Changes to build system
+
+* The following files are removed:
+    
+      src/internet/model/ipv4-l4-protocol.cc
+      src/internet/model/ipv4-l4-protocol.h
+      src/internet/model/ipv6-l4-protocol.cc
+      src/internet/model/ipv6-l4-protocol.h
+    
+    and replaced with:
+    
+      src/internet/model/ip-l4-protocol.cc
+      src/internet/model/ip-l4-protocol.h
+    
+
+### Changed behavior
+
+* Dual-stacked IPv6 sockets are implemented. An IPv6 socket can accept an IPv4 connection, returning the senders address as an IPv4-mapped address (IPV6\_V6ONLY socket option is not implemented).
+* The following examples/application/helpers were modified to support IPv6:
+    
+    csma-layout/examples/csma-star \[\*\]
+    netanim/examples/star-animation \[\*\]
+    point-to-point-layout/model/point-to-point-star.cc
+    point-to-point-layout/model/point-to-point-grid.cc
+    point-to-point-layout/model/point-to-point-dumbbell.cc
+    examples/udp/udp-echo \[\*\]
+    examples/udp-client-server/udp-client-server \[\*\]
+    examples/udp-client-server/udp-trace-client-server \[\*\]
+    applications/helper/udp-echo-helper
+    applications/model/udp-client
+    applications/model/udp-echo-client
+    applications/model/udp-echo-server
+    applications/model/udp-server
+    applications/model/udp-trace-client
+    
+    \[\*\]  Added '--useIpv6' flag to switch between IPv4 and IPv6
+    
+
+Changes from ns-3.12 to ns-3.13
+-------------------------------
+
+### Changes to build system
+
+* The underlying version of waf used by ns-3 was upgraded to 1.6.7. This has a few changes for users and developers:
+    * by default, "build" no longer has a subdirectory debug or optimized. To get different build directories for different build types, you can use the waf configure -o option, e.g.:
+        
+          ./waf configure -o shared
+          ./waf configure --enable-static -o static
+        
+    * (for developers) the ns3headers taskgen needs to be created with a features parameter name:
+        
+          -  headers = bld.new\_task\_gen('ns3header')
+          +  headers = bld.new\_task\_gen(features=\['ns3header'\])
+        
+    * no longer need to edit src/wscript to add a module, just create your module directory inside src and ns-3 will pick it up
+    * In WAF 1.6, adding -Dxxx options is done via the DEFINES env. var. instead of CXXDEFINES
+    * waf env values are always lists now, e.g. env\['PYTHON'\] returns \['/usr/bin/python'\], so you may need to add \[0\] to the value in some places
+
+### New API
+
+* In the mobility module, there is a new MobilityModel::GetRelativeSpeed() method returning the relative speed of two objects.
+* A new Ipv6AddressGenerator class was added to generate sequential addresses from a provided base prefix and interfaceId. It also will detect duplicate address assignments.
+
+### Changes to existing API
+
+* In the spectrum module, the parameters to SpectrumChannel::StartTx () and SpectrumPhy::StartRx () methods are now passed using the new struct SpectrumSignalParameters. This new struct supports inheritance, hence it allows technology-specific PHY implementations to provide technology-specific parameters in SpectrumChannel::StartTx() and SpectrumPhy::StartRx(), while at the same time keeping a set of technology-independent parameters common across all spectrum-enabled PHY implementations (i.e., the duration and the power spectral density which are needed for interference calculation). Additionally, the SpectrumType class has been removed, since now the type of a spectrum signal can be inferred by doing a dynamic cast on SpectrumSignalParameters. See the [Spectrum API change discussion on ns-developers](http://mailman.isi.edu/pipermail/ns-developers/2011-October/009495.html) for the motivation behind this API change.
+* The WifiPhyStandard enumerators for specifying half- and quarter-channel width standards has had a change in capitalization:
+    * WIFI\_PHY\_STANDARD\_80211\_10Mhz was changed to WIFI\_PHY\_STANDARD\_80211\_10MHZ
+    * WIFI\_PHY\_STANDARD\_80211\_5Mhz was changed to WIFI\_PHY\_STANDARD\_80211\_5MHZ
+* In the SpectrumPhy base class, the methods to get/set the MobilityModel and the NetDevice were previously working with opaque Ptr<Object>. Now all these methods have been changed so that they work with Ptr<NetDevice> and Ptr<MobilityModel> as appropriate. See [Bug 1271](https://www.nsnam.org/bugzilla/show_bug.cgi?id=1271) on bugzilla for the motivation.
+
+### Changed behavior
+
+* TCP bug fixes
+    * Connection retries count is a separate variable with the retries limit, so cloned sockets can reset the count
+    * Fix bug on RTO that may halt the data flow
+    * Make TCP endpoints always holds the accurate address:port info
+    * RST packet is sent on closed sockets
+    * Fix congestion window sizing problem upon partial ACK in TcpNewReno
+    * Acknowledgement is sent, rather than staying silent, upon arrival of unacceptable packets
+    * Advance TcpSocketBase::m\_nextTxSequence after RTO
+* TCP enhancements
+    * Latest RTT value now stored in variable TcpSocketBase::m\_lastRtt
+    * The list variable TcpL4Protocol::m\_sockets now always holds all the created, running TcpSocketBase objects
+    * Maximum announced window size now an attribute, ns3::TcpSocketBase::MaxWindowSize
+    * TcpHeader now recognizes ECE and CWR flags (c.f. RFC3168)
+    * Added TCP option handling call in TcpSocketBase for future extension
+    * Data out of range (i.e. outsize acceptable range of receive window) now computed on bytes, not packets
+    * TCP moves from time-wait state to closed state after twice the time specified by attribute ns3:TcpSocketBase::MaxSegLifeTime
+    * TcpNewReno supports limited transmit (RFC3042) if asserting boolean attribute ns3::TcpNewReno::LimitedTransmit
+    * Nagle's algorithm supported. Default off, turn on by calling TcpSocket::SetTcpNoDelay(true)
+
+Changes from ns-3.11 to ns-3.12
+-------------------------------
+
+### Changes to build system
+
+* None for this release
+
+### New API
+
+* New method, RegularWifiMac::SetPromisc (void), to set the interface to promiscuous mode.
+
+### Changes to existing API
+
+* The spelling of the attribute 'IntialCellVoltage' from LiIonEnergySource was corrected to 'InitialCellVoltage'; this will affect existing users who were using the attribute with the misspelling.
+* Two trace sources in class WifiPhy have had their names changed:
+    * 'PromiscSnifferRx' is now 'MonitorSnifferRx'
+    * 'PromiscSnifferTx' is now 'MonitorSnifferTx'
+
+### Changed behavior
+
+* IPv4 fragmentation is now supported.
+
+Changes from ns-3.10 to ns-3.11
+-------------------------------
+
+### Changes to build system
+
+* **Examples and tests are no longer built by default in ns-3**
+    
+    You can now make examples and tests be built in ns-3 in two ways.
+    
+    1.  Using build.py when ns-3 is built for the first time:
+        
+            ./build.py --enable-examples --enable-tests
+        
+    2.  Using waf once ns-3 has been built:
+        
+            ./waf configure --enable-examples --enable-tests
+        
+    
+* **Subsets of modules can be enabled using the ns-3 configuration file**
+    
+    A new configuration file, .ns3rc, has been added to ns-3 that specifies the modules that should be enabled during the ns-3 build. See the documentation for details.
+    
+### New API
+
+* **int64x64\_t**
+    
+    The **int64x64\_t** type implements all the C++ arithmetic operators to behave like one of the C++ native types. It is a 64.64 integer type which means that it is a 128bit integer type with 64 bits of fractional precision. The existing **Time** type is now automatically convertible to **int64x64\_t** to allow arbitrarily complex arithmetic operations on the content of **Time** objects. The implementation of **int64x64\_t** is based on the previously-existing **HighPrecision** type and supersedes it.
+    
+### Changes to existing API
+
+* **Wifi TX duration calculation moved from InterferenceHelper to WifiPhy**
+    
+    The following static methods have been moved from the InterferenceHelper class to the WifiPhy class:
+    
+    static Time CalculateTxDuration (uint32\_t size, WifiMode payloadMode, enum WifiPreamble preamble);
+    static WifiMode GetPlcpHeaderMode (WifiMode payloadMode, WifiPreamble preamble);
+    static uint32\_t GetPlcpHeaderDurationMicroSeconds (WifiMode payloadMode, WifiPreamble preamble);
+    static uint32\_t GetPlcpPreambleDurationMicroSeconds (WifiMode payloadMode, WifiPreamble preamble);
+    static uint32\_t GetPayloadDurationMicroSeconds (uint32\_t size, WifiMode payloadMode);
+    
+* **Test cases no longer return a boolean value**
+    
+    Unit test case DoRun() functions no longer return a bool value. Now, they don't return a value at all. The motivation for this change was to disallow users from merely returning "true" from a test case to force an error to be recorded. Instead, test case macros should be used.
+    
+* **PhyMac renamed to GenericPhy**
+    
+    The PhyMac interface previously defined in phy-mac.h has been renamed to GenericPhy interface and moved to a new file generic-phy.h. The related variables and methods have been renamed accordingly.
+    
+* **Scalar**
+    
+    The Scalar type has been removed. Typical code such as:
+    
+    Time tmp = ...;
+    Time result = tmp \* Scalar (5);
+    
+    Can now be rewritten as:
+    
+    Time tmp = ...;
+    Time result = Time (tmp \* 5);
+    
+* **Multicast GetOutputTtl() commands**
+    
+    As part of bug 1047 rework to enable multicast routes on nodes with more than 16 interfaces, the methods Ipv4MulticastRoute::GetOutputTtl () and Ipv6MulticastRoute::GetOutputTtl () have been modified to return a std::map of interface IDs and TTLs for the route.
+    
+### Changed behavior
+
+* If the data inside the TCP buffer is less than the available window, TCP tries to ask for more data to the application, in the hope of filling the usable transmission window. In some cases, this change allows sending bigger packets than the previous versions, optimizing the transmission.
+* In TCP, the ACK is now processed before invoking any routine that deals with the segment sending, except in case of retransmissions.
+
+Changes from ns-3.9 to ns-3.10
+------------------------------
+
+### Changes to build system
+
+* **Regression tests are no longer run using waf**
+    
+    All regression testing is now being done in test.py. As a result, a separate reference trace repository is no longer needed to perform regression tests. Tests that require comparison against known good traces can still be run from test.py. The --regression option for waf has been removed. However, the "-r" option to download.py has been kept to allow users to fetch older revisions of ns-3 that contain these traces.
+    
+* **Documentation converted to Sphinx**
+    
+    Project documentation (manual, tutorial, and testing) have been converted to Sphinx from the GNU Texinfo markup format.
+    
+
+### New API
+
+* **Pyviz visualizer**
+    
+    A Python-based visualizer called pyviz is now integrated with ns-3. For Python simulations, there is an API to start the visualizer. You have to import the visualizer module, and call visualizer.start() instead of ns3.Simulator.Run(). For C++ simulations, there is no API. For C++ simulations (but also works for Python ones) you need to set the GlobalValue SimulatorImplementationType to "ns3::VisualSimulatorImpl". This can be set from the command-line, for example (add the \--SimulatorImplementationType=ns3::VisualSimulatorImpl option), or via the waf option \--visualizer, in addition to the usual \--run option to run programs.
+    
+* **WaypointMobility attributes**
+    
+    Two attributes were added to WaypointMobility model: LazyNotify and InitialPositionIs Waypoint. See RELEASE\_NOTES.md for details.
+    
+* **802.11g rates for ERP-OFDM added**
+    
+    New WifiModes of the form ErpOfdmRatexxMbps, where xx is the rate in Mbps (6, 9, 12, 18, 24, 36, 48, 54), are available for 802.11g. More details are in the RELEASE\_NOTES.md.
+    
+* **Socket::GetSocketType ()**
+    
+    This is analogous to getsockopt(SO\_TYPE). ipv4-raw-socket, ipv6-raw-socket, and packet-socket return NS3\_SOCK\_RAW. tcp-socket and nsc-tcp-socket return NS3\_SOCK\_STREAM. udp-socket returns NS3\_SOCK\_DGRAM.
+    
+* **BulkSendApplication**
+    
+    Sends data as fast as possible up to MaxBytes or unlimited if MaxBytes is zero. Think OnOff, but without the "off" and without the variable data rate. This application only works with NS3\_SOCK\_STREAM and NS3\_SOCK\_SEQPACKET sockets, for example TCP sockets and not UDP sockets. A helper class exists to facilitate creating BulkSendApplications. The API for the helper class is similar to existing application helper classes, for example, OnOff.
+    
+* **Rakhmatov Vrudhula non-linear battery model**
+    
+    New class and helper for this battery model.
+    
+* **Print IPv4 routing tables**
+    
+    New class methods and helpers for printing IPv4 routing tables to an output stream.
+    
+* **Destination-Sequenced Distance Vector (DSDV) routing protocol**
+    
+    Derives from Ipv4RoutingProtocol and contains a DsdvHelper class.
+    
+* **3GPP Long Term Evolution (LTE) models**
+    
+    More details are in the RELEASE\_NOTES.md.
+    
+### Changes to existing API
+
+* **Consolidation of Wi-Fi MAC high functionality**
+    
+    Wi-Fi MAC high classes have been reorganised in attempt to consolidate shared functionality into a single class. This new class is RegularWifiMac, and it derives from the abstract WifiMac, and is parent of AdhocWifiMac, StaWifiMac, ApWifiMac, and MeshWifiInterfaceMac. The QoS and non-QoS class variants are no longer, with a RegularWifiMac attribute "QosSupported" allowing selection between these two modes of operation. QosWifiMacHelper and NqosWifiMacHelper continue to work as previously, with a behind-the-scenes manipulation of the 'afore-mentioned attribute.
+    
+* **New TCP architecture**
+    
+    TcpSocketImpl was replaced by a new base class TcpSocketBase and several subclasses implementing different congestion control. From a user-level API perspective, the main change is that a new attribute "SocketType" is available in TcpL4Protocol, to which a TypeIdValue of a specific Tcp variant can be passed. In the same class, the attribute "RttEstimatorFactory" was also renamed "RttEstimatorType" since it now takes a TypeIdValue instead of an ObjectFactoryValue. In most cases, however, no change to existing user programs should be needed.
+    
+### Changed behavior
+
+* **EmuNetDevice uses DIX instead of LLC encapsulation by default**
+    
+    bug 984 in ns-3 tracker: real devices don't usually understand LLC/SNAP so the default of DIX makes more sense.
+    
+* **TCP defaults to NewReno congestion control**
+    
+    As part of the TCP socket refactoring, a new TCP implementation provides slightly different behavior than the previous TcpSocketImpl that provided only fast retransmit. The default behavior now is NewReno which provides fast retransmit and fast recovery with window inflation during recovery.
+    
+Changes from ns-3.8 to ns-3.9
+-----------------------------
+
+### Changes to build system
+
+* None for this release.
+
+### New API
+
+* **Wifi set block ack threshold:** Two methods for setting block ack parameters for a specific access class:
+    
+    void QosWifiMacHelper::SetBlockAckThresholdForAc (enum AccessClass accessClass, uint8\_t threshold);
+    void QosWifiMacHelper::SetBlockAckInactivityTimeoutForAc (enum AccessClass accessClass, uint16\_t timeout);
+    
+* **Receive List Error Model:** Another basic error model that allows the user to specify a list of received packets that should be errored. The list corresponds not to the packet UID but to the sequence of received packets as observed by the error model. See src/common/error-model.h
+* **Respond to interface events:** New attribute for Ipv4GlobalRouting, "RespondToInterfaceEvents", which when enabled, will cause global routes to be recomputed upon any interface or address notification event from IPv4.
+* **Generic sequence number:** New generic sequence number class to easily handle comparison, subtraction, etc. for sequence numbers. To use it you need to supply two fundamental types as template parameters: NUMERIC\_TYPE and SIGNED\_TYPE. For instance, SequenceNumber<uint32\_t, int32\_t> gives you a 32-bit sequence number, while SequenceNumber<uint16\_t, int16\_t> is a 16-bit one. For your convenience, these are typedef'ed as SequenceNumber32 and SequenceNumber16, respectively.
+* **Broadcast socket option:** New Socket methods SetAllowBroadcast and GetAllowBroadcast add to NS-3 Socket's the equivalent to the POSIX SO\_BROADCAST socket option (setsockopt/getsockopt). Starting from this NS-3 version, IPv4 sockets do not allow us to send packets to broadcast destinations by default; SetAllowBroadcast must be called beforehand if we wish to send broadcast packets.
+* **Deliver of packet ancillary information to sockets:** A method to deliver ancillary information to the socket interface (fixed in bug 671):
+    
+    void Socket::SetRecvPktInfo (bool flag);
+    
+### Changes to existing API
+
+* **Changes to construction and naming of Wi-Fi transmit rates:** A reorganisation of the construction of Wi-Fi transmit rates has been undertaken with the aim of simplifying the task of supporting further IEEE 802.11 PHYs. This work has been completed under the auspices of Bug 871. From the viewpoint of simulation scripts not part of the ns-3 distribution, the key change is that WifiMode names of the form wifi_x_\-_n_mbs are now invalid. Names now take the form _Cccc_Rate_n_Mbps\[BW_b_MHz\], where _n_ is the root bitrate in megabits-per-second as before (with only significant figures included, and an underscore replacing any decimal point), and _Cccc_ is a representation of the Modulation Class as defined in Table 9-2 of IEEE Std. 802.11-2007. Currently-supported options for _Cccc_ are _Ofdm_ and _Dsss_. For modulation classes where optional reduced-bandwidth transmission is possible, this is captured in the final part of the form above, with _b_ specifying the nominal signal bandwidth in megahertz.
+* **Consolidation of classes support Wi-Fi Information Elements:** When the _mesh_ module was introduced it added a class hierarchy for modelling of the various Information Elements that were required. In this release, this class hierarchy has extended by moving the base classes (WifiInformationElement and WifiInformationElementVector) into the _wifi_ module. This change is intended to ease the addition of support for modelling of further Wi-Fi functionality.
+* **Changed for {Ipv4,Ipv6}PacketInfoTag delivery:** In order to deliver ancillary information to the socket interface (fixed in bug 671), _Ipv4PacketInfoTag_ and _Ipv6PacketInfoTag_ are implemented. For the delivery of this information, the following changes are made into existing class. In Ipv4EndPoint class,
+    
+    \-  void SetRxCallback (Callback<void,Ptr<Packet>, Ipv4Address, Ipv4Address, uint16\_t> callback);
+    +  void SetRxCallback (Callback<void,Ptr<Packet>, Ipv4Header, uint16\_t, Ptr<Ipv4Interface> > callback);
+    
+    -  void ForwardUp (Ptr<Packet> p, Ipv4Address saddr, Ipv4Address daddr, uint16\_t sport);
+    +  void ForwardUp (Ptr<Packet> p, const Ipv4Header& header, uint16\_t sport, 
+    +                  Ptr<Ipv4Interface> incomingInterface);
+    
+    In Ipv4L4Protocol class,
+    
+       virtual enum RxStatus Receive(Ptr<Packet> p, 
+    -                                Ipv4Address const &source,
+    -                                Ipv4Address const &destination,
+    +                                Ipv4Header const &header,
+                                     Ptr<Ipv4Interface> incomingInterface) = 0;
+    
+    \-Ipv4RawSocketImpl::ForwardUp (Ptr<const Packet> p, Ipv4Header ipHeader, Ptr<NetDevice> device)
+    +Ipv4RawSocketImpl::ForwardUp (Ptr<const Packet> p, Ipv4Header ipHeader, Ptr<Ipv4Interface> incomingInterface)
+    
+    -NscTcpSocketImpl::ForwardUp (Ptr<Packet> packet, Ipv4Address saddr, Ipv4Address daddr, uint16\_t port)
+    +NscTcpSocketImpl::ForwardUp (Ptr<Packet> packet, Ipv4Header header, uint16\_t port,
+    +                             Ptr<Ipv4Interface> incomingInterface)
+    
+    -TcpSocketImpl::ForwardUp (Ptr<Packet> packet, Ipv4Address saddr, Ipv4Address daddr, uint16\_t port)
+    +TcpSocketImpl::ForwardUp (Ptr<Packet> packet, Ipv4Header header, uint16\_t port,
+    +                          Ptr<Ipv4Interface> incomingInterface)
+    
+    -UdpSocketImpl::ForwardUp (Ptr<Packet> packet, Ipv4Address saddr, Ipv4Address daddr, uint16\_t port)
+    +UdpSocketImpl::ForwardUp (Ptr<Packet> packet, Ipv4Header header, uint16\_t port,
+    +                          Ptr<Ipv4Interface> incomingInterface)
+    
+* The method OutputStreamWrapper::SetStream (std::ostream \*ostream) was removed.
+)
+
+### Changed behavior
+
+* **Queue trace behavior during Enqueue changed:** The behavior of the Enqueue trace source has been changed to be more intuitive and to agree with documentation. Enqueue and Drop events in src/node/queue.cc are now mutually exclusive. In the past, the meaning of an Enqueue event was that the Queue Enqueue operation was being attempted; and this could be followed by a Drop event if the Queue was full. The new behavior is such that a packet is either Enqueue'd successfully or Drop'ped.
+* **Drop trace logged for Ipv4/6 forwarding failure:** Fixed bug 861; this will add ascii traces (drops) in Ipv4 and Ipv6 traces for forwarding failures
+* **Changed default WiFi error rate model for OFDM modulation types:** Adopted more conservative ErrorRateModel for OFDM modulation types (a/g). This will require 4 to 5 more dB of received power to get similar results as before, so users may observe a reduced WiFi range when using the defaults. See tracker issue 944 for more details.
+
+Changes from ns-3.7 to ns-3.8
+-----------------------------
+
+### Changes to build system
+
+* None for this release.
+
+### New API
+
+* **Matrix propagation loss model:** This radio propagation model uses a two-dimensional matrix of path loss indexed by source and destination nodes.
+* **WiMAX net device**: The developed WiMAX model attempts to provide an accurate MAC and PHY level implementation of the 802.16 specification with the Point-to-Multipoint (PMP) mode and the WirelessMAN-OFDM PHY layer. By adding WimaxNetDevice objects to ns-3 nodes, one can create models of 802.16-based networks. The source code for the WiMAX models lives in the directory src/devices/wimax. The model is mainly composed of three layers:
+    * The convergence sublayer (CS)
+    * The MAC Common Part Sublayer (MAC-CPS)
+    * The Physical layerThe main way that users who write simulation scripts will typically interact with the Wimax models is through the helper API and through the publicly visible attributes of the model. The helper API is defined in src/helper/wimax-helper.{cc,h}. Three examples containing some code that shows how to setup a 802.16 network are located under examples/wimax/
+* **MPI Interface for distributed simulation:** Enables access to necessary MPI information such as MPI rank and size.
+* **Point-to-point remote channel:** Enables point-to-point connection between net-devices on different simulators, for use with distributed simulation.
+* **GetSystemId in simulator:** For use with distributed simulation, GetSystemId returns zero by non-distributed simulators. For the distributed simulator, it returns the MPI rank.
+* **Enhancements to src/core/random-variable.cc/h:** New Zeta random variable generator. The Zeta random distribution is tightly related to the Zipf distribution (already in ns-3.7). See the documentation, especially because sometimes the Zeta distribution is called Zipf and viceversa. Here we conform to the Wikipedia naming convention, i.e., Zipf is bounded while Zeta isn't.
+* **Two-ray ground propagation loss model:** Calculates the crossover distance under which Friis is used. The antenna height is set to the nodes z coordinate, but can be added to using the model parameter SetHeightAboveZ, which will affect ALL stations
+* **Pareto random variable** has two new constructors to specify scale and shape:
+    
+    ParetoVariable (std::pair params);
+    ParetoVariable (std::pair params, double b);
+    
+### Changes to existing API
+
+* **Tracing Helpers**: The organization of helpers for both pcap and ascii tracing, in devices and protocols, has been reworked. Instead of each device and protocol helper re-implementing trace enable methods, classes have been developed to implement user-level tracing in a consistent way; and device and protocol helpers use those classes to provide tracing functionality.  
+    In addition to consistent operation across all helpers, the object name service has been integrated into the trace file naming scheme.  
+    The internet stack helper has been extensively massaged to make it easier to manage traces originating from protocols. It used to be the case that there was essentially no opportunity to filter tracing on interfaces, and resulting trace file names collided with those created by devices. File names are now disambiguated and one can enable traces on a protocol/interface basis analogously to the node/device granularity of device-based helpers.  
+    The primary user-visible results of this change are that trace-related functions have been changed from static functions to method calls; and a new object has been developed to hold streams for ascii traces.  
+    New functionality is present for ascii traces. It is now possible to create multiple ascii trace files automatically just as was possible for pcap trace files.  
+    The implementation of the helper code has been designed also to provide functionality to make it easier for sophisticated users to hook traces of various kinds and write results to (file) streams. Before:
+    
+      CsmaHelper::EnablePcapAll ();
+    
+      std::ofstream ascii;
+      ascii.open ("csma-one-subnet.tr", std::ios\_base::binary | std::ios\_base::out);
+      CsmaHelper::EnableAsciiAll (ascii);
+    
+      InternetStackHelper::EnableAsciiAll (ascii);
+    
+    After:
+    
+      CsmaHelper csmaHelper;
+      InternetStackHelper stack;
+      csmaHelper.EnablePcapAll ();
+    
+      AsciiTraceHelper ascii;
+      csma.EnableAsciiAll (ascii.CreateFileStream ("csma-one-subnet.tr"));
+    
+      stack.EnableAsciiIpv4All (stream);
+    
+* **Serialization and Deserialization** in buffer, nix-vector, packet-metadata, and packet has been modified to use raw character buffers, rather than the Buffer class
+    
+    \+ uint32\_t Buffer::GetSerializedSize (void) const;
+    + uint32\_t Buffer::Serialize (uint8\_t\* buffer, uint32\_t maxSize) const;
+    + uint32\_t Buffer::Deserialize (uint8\_t\* buffer, uint32\_t size); 
+    
+    - void NixVector::Serialize (Buffer::Iterator i, uint32\_t size) const;
+    + uint32\_t NixVector::Serialize (uint32\_t\* buffer, uint32\_t maxSize) const;
+    - uint32\_t NixVector::Deserialize (Buffer::Iterator i);
+    + uint32\_t NixVector::Deserialize (uint32\_t\* buffer, uint32\_t size);
+    
+    - void PacketMetadata::Serialize (Buffer::Iterator i, uint32\_t size) const;
+    + uint32\_t PacketMetadata::Serialize (uint8\_t\* buffer, uint32\_t maxSize) const;
+    - uint32\_t PacketMetadata::Deserialize (Buffer::Iterator i);
+    + uint32\_t PacketMetadata::Deserialize (uint8\_t\* buffer, uint32\_t size);
+    
+    + uint32\_t Packet::GetSerializedSize (void) const;
+    - Buffer Packet::Serialize (void) const;
+    + uint32\_t Packet::Serialize (uint8\_t\* buffer, uint32\_t maxSize) const;
+    - void Packet::Deserialize (Buffer buffer);
+    + Packet::Packet (uint8\_t const\*buffer, uint32\_t size, bool magic);
+    
+* **PacketMetadata uid** has been changed to a 64-bit value. The lower 32 bits give the uid, while the upper 32-bits give the MPI rank for distributed simulations. For non-distributed simulations, the upper 32 bits are simply zero.
+    
+    \- inline PacketMetadata (uint32\_t uid, uint32\_t size);
+    + inline PacketMetadata (uint64\_t uid, uint32\_t size);
+    - uint32\_t GetUid (void) const;
+    + uint64\_t GetUid (void) const;
+    - PacketMetadata::PacketMetadata (uint32\_t uid, uint32\_t size);
+    + PacketMetadata::PacketMetadata (uint64\_t uid, uint32\_t size); 
+    
+    - uint32\_t Packet::GetUid (void) const;
+    + uint64\_t Packet::GetUid (void) const;
+    
+* **Moved propagation models** from src/devices/wifi to src/common
+* **Moved Mtu attribute from base class NetDevice** This attribute is now found in all NetDevice subclasses.
+
+### Changed behavior
+
+* None for this release.
+
+Changes from ns-3.6 to ns-3.7
+-----------------------------
+
+### Changes to build system
+
+* None for this release.
+
+### New API
+
+* **Equal-cost multipath for global routing:** Enables quagga's equal cost multipath for Ipv4GlobalRouting, and adds an attribute that can enable it with random packet distribution policy across equal cost routes.
+* **Binding sockets to devices:** A method analogous to a SO\_BINDTODEVICE socket option has been introduced to class Socket:
+    
+    virtual void Socket::BindToNetDevice (Ptr<NetDevice> netdevice);
+    
+* **Simulator event contexts**: The Simulator API now keeps track of a per-event 'context' (a 32bit integer which, by convention identifies a node by its id). Simulator::GetContext returns the context of the currently-executing event while Simulator::ScheduleWithContext creates an event with a context different from the execution context of the caller. This API is used by the ns-3 logging system to report the execution context of each log line.
+* **Object::DoStart**: Users who need to complete their object setup at the start of a simulation can override this virtual method, perform their adhoc setup, and then, must chain up to their parent.
+* **Ad hoc On-Demand Distance Vector (AODV)** routing model, [RFC 3561](http://www.ietf.org/rfc/rfc3561.txt)
+* **Ipv4::IsDestinationAddress (Ipv4Address address, uint32\_t iif)** Method added to support checks of whether a destination address should be accepted as one of the host's own addresses. RFC 1122 Strong/Weak end system behavior can be changed with a new attribute (WeakEsModel) in class Ipv4.
+* **Net-anim interface**: Provides an interface to net-anim, a network animator for point-to-point links in ns-3. The interface generates a custom trace file for use with the NetAnim program.
+* **Topology Helpers**: New topology helpers have been introduced including PointToPointStarHelper, PointToPointDumbbellHelper, PointToPointGridHelper, and CsmaStarHelper.
+* **IPv6 extensions support**: Provides API to add IPv6 extensions and options. Two examples (fragmentation and loose routing) are available.
+
+### Changes to existing API
+
+* **Ipv4RoutingProtocol::RouteOutput** no longer takes an outgoing interface index but instead takes an outgoing device pointer; this affects all subclasses of Ipv4RoutingProtocol.
+    
+    \-  virtual Ptr<Ipv4Route> RouteOutput (Ptr<Packet> p, const Ipv4Header &header, uint32\_t oif, Socket::SocketErrno &sockerr) = 0;
+    +  virtual Ptr<Ipv4Route> RouteOutput (Ptr<Packet> p, const Ipv4Header &header, Ptr<NetDevice> oif, Socket::SocketErrno &sockerr) = 0;
+    
+* **Ipv6RoutingProtocol::RouteOutput** no longer takes an outgoing interface index but instead takes an outgoing device pointer; this affects all subclasses of Ipv6RoutingProtocol.
+    
+    \-  virtual Ptr<Ipv6Route> RouteOutput (Ptr<Packet> p, const Ipv6Header &header, uint32\_t oif, Socket::SocketErrno &sockerr) = 0;
+    +  virtual Ptr<Ipv6Route> RouteOutput (Ptr<Packet> p, const Ipv6Header &header, Ptr<NetDevice> oif, Socket::SocketErrno &sockerr) = 0;
+    
+* **Application::Start** and **Application::Stop** have been renamed to **Application::SetStartTime** and **Application::SetStopTime**.
+* **Channel::Send**: this method does not really exist but each subclass of the Channel base class must implement a similar method which sends a packet from a node to another node. Users must now use Simulator::ScheduleWithContext instead of Simulator::Schedule to schedule the reception event on a remote node.  
+    For example, before:
+    
+    void
+    SimpleChannel::Send (Ptr<Packet> p, uint16\_t protocol, 
+             Mac48Address to, Mac48Address from,
+             Ptr<SimpleNetDevice> sender)
+    {
+      for (std::vector<Ptr<SimpleNetDevice> >::const\_iterator i = m\_devices.begin (); i != m\_devices.end (); ++i)
+        {
+          Ptr<SimpleNetDevice> tmp = \*i;
+          if (tmp == sender)
+      {
+        continue;
+      }
+          Simulator::ScheduleNow (&SimpleNetDevice::Receive, tmp, p->Copy (), protocol, to, from);
+        }
+    }
+    
+    After:
+    
+    void
+    SimpleChannel::Send (Ptr<Packet> p, uint16\_t protocol, 
+             Mac48Address to, Mac48Address from,
+             Ptr<SimpleNetDevice> sender)
+    {
+      for (std::vector<Ptr<SimpleNetDevice> >::const\_iterator i = m\_devices.begin (); i != m\_devices.end (); ++i)
+        {
+          Ptr<SimpleNetDevice> tmp = \*i;
+          if (tmp == sender)
+      {
+        continue;
+      }
+          Simulator::ScheduleWithContext (tmp->GetNode ()->GetId (), Seconds (0),
+                                          &SimpleNetDevice::Receive, tmp, p->Copy (), protocol, to, from);
+        }
+    }
+    
+* **Simulator::SetScheduler**: this method now takes an ObjectFactory instead of an object pointer directly. Existing callers can trivially be updated to use this new method.  
+    Before:
+    
+    Ptr<Scheduler> sched = CreateObject<ListScheduler> ();
+    Simulator::SetScheduler (sched);
+    
+    After:
+    
+    ObjectFactory sched;
+    sched.SetTypeId ("ns3::ListScheduler");
+    Simulator::SetScheduler (sched);
+    
+* Extensions to IPv4 **Ping** application: verbose output and the ability to configure different ping sizes and time intervals (via new attributes)
+* **Topology Helpers**: Previously, topology helpers such as a point-to-point star existed in the PointToPointHelper class in the form of a method (ex: PointToPointHelper::InstallStar). These topology helpers have been pulled out of the specific helper classes and created as separate classes. Several different topology helper classes now exist including PointToPointStarHelper, PointToPointGridHelper, PointToPointDumbbellHelper, and CsmaStarHelper. For example, a user wishes to create a point-to-point star network:  
+    Before:
+    
+    NodeContainer hubNode;
+    NodeContainer spokeNodes;
+    hubNode.Create (1);
+    Ptr<Node> hub = hubNode.Get (0);
+    spokeNodes.Create (nNodes - 1);
+    
+    PointToPointHelper pointToPoint;
+    pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
+    pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));
+    NetDeviceContainer hubDevices, spokeDevices;
+    pointToPoint.InstallStar (hubNode.Get (0), spokeNodes, hubDevices, spokeDevices);
+    
+    After:
+    
+    PointToPointHelper pointToPoint;
+    pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
+    pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));
+    PointToPointStarHelper star (nSpokes, pointToPoint);
+    
+### Changed behavior
+
+* Changed default value of YansWifiPhy::EnergyDetectionThreshold from -140.0 dBm to -96.0 dBm. Changed default value of YansWifiPhy::CcaModelThreshold from -140.0 dBm to -99.0 dBm. Rationale can be found [here](http://www.nsnam.org/bugzilla/show_bug.cgi?id=689).
+* Default TTL of IPv4 broadcast datagrams changed from 1 to 64.
+* Changed DcfManager::UpdateBackoff (): using flooring instead of rounding in calculation of remaining slots. [See bug 695.](http://www.nsnam.org/bugzilla/show_bug.cgi?id=695)
+
+Changes from ns-3.5 to ns-3.6
+-----------------------------
+
+### Changes to build system
+
+* **A new test framework is provided with ns-3.6 that primarilay runs outside waf**
+    
+    "./waf check" now runs the new unit tests of the core part of ns-3.6. In order to run the complete test package, use "./test.py" which is documented in a new manual -- find it in ./doc/testing. "./waf check" no longer generates the introspected Doxygen. Now use "./waf doxygen" to do this and generate the Doxygen documentation in one step.
+    
+### New API
+
+* **Longest prefix match, support for metrics, for Ipv4StaticRouting and Ipv6StaticRouting**
+    
+    When performing route lookup, first match for longest prefix, and then based on metrics (default metric = 0). If metrics are equal, most recent addition is picked. Extends API for support of metrics but preserves backward compatibility. One small change is that the default route is no longer stored as index 0 route in the host route table so GetDefaultRoute () must be used.
+    
+* **Route injection for global routing**
+    
+    Add ability to inject and withdraw routes to Ipv4GlobalRouting. This allows a user to insert a route and have it redistributed like an OSPF external LSA to the rest of the topology.
+    
+* **Athstats**
+    
+    New classes AthstatsWifiTraceSink and AthstatsHelper.
+    
+* **WifiRemoteStationManager**
+    
+    New trace sources exported by WifiRemoteStationManager: MacTxRtsFailed, MacTxDataFailed, MacTxFinalRtsFailed and MacTxFinalDataFailed.
+    
+* **IPv6 additions**
+    
+    Add an IPv6 protocol and ICMPv6 capability.
+    
+    * new classes Ipv6, Ipv6Interface, Ipv6L3Protocol, Ipv6L4Protocol
+    * Ipv6RawSocket (no UDP or TCP capability yet)
+    * a set of classes to implement Icmpv6, including neighbor discovery, router solicitation, DAD
+    * new applications Ping6 and Radvd
+    * routing objects Ipv6Route and Ipv6MulticastRoute
+    * routing protocols Ipv6ListRouting and Ipv6StaticRouting
+    * examples: icmpv6-redirect.cc, ping6.cc, radvd.cc, radvd-two-prefix.cc, simple-routing-ping6.cc
+    
+* **Wireless Mesh Networking models**
+    
+    * General multi-interface mesh stack infrastructure (devices/mesh module).
+    * IEEE 802.11s (Draft 3.0) model including Peering Management Protocol and HWMP.
+    * Forwarding Layer for Meshing (FLAME) protocol.
+    
+* **802.11 enhancements**
+    
+    * 10MHz and 5MHz channel width supported by 802.11a model (Ramon Bauza and Kirill Andreev).
+    
+    * Channel switching support. YansWifiPhy can now switch among different channels (Ramon Bauza and Pavel Boyko).
+    
+* **Nix-vector Routing**
+    
+    Add nix-vector routing protocol
+    
+    * new helper class Ipv4NixVectorHelper
+    
+    * examples: nix-simple.cc, nms-p2p-nix.cc
+    
+* **New Test Framework**
+    
+    Add TestCase, TestSuite classes
+    
+    * examples: src/core/names-test-suite.cc, src/core/random-number-test-suite.cc, src/test/ns3tcp/ns3tcp-cwnd-test-suite.cc
+    
+### Changes to existing API
+
+* **InterferenceHelper**
+    
+    The method InterferenceHelper::CalculateTxDuration (uint32\_t size, WifiMode payloadMode, WifiPreamble preamble) has been made static, so that the frame duration depends only on the characteristics of the frame (i.e., the function parameters) and not on the particular standard which is used by the receiving PHY. This makes it now possible to correctly calculate the duration of incoming frames in scenarios in which devices using different PHY configurations coexist in the same channel (e.g., a BSS using short preamble and another BSS using long preamble).
+    
+    The following member methods have been added to InterferenceHelper:
+    
+      static WifiMode GetPlcpHeaderMode (WifiMode, WifiPreamble);
+      static uint32\_t GetPlcpHeaderDurationMicroSeconds (WifiMode, WifiPreamble);
+      static uint32\_t GetPlcpPreambleDurationMicroSeconds (WifiMode, WifiPreamble);
+      static uint32\_t GetPayloadDurationMicroSeconds (size, WifiMode); 
+    
+    The following member methods have been removed from InterferenceHelper:
+    
+      void Configure80211aParameters (void);
+      void Configure80211bParameters (void);
+      void Configure80211\_10MhzParameters (void);
+      void Configure80211\_5MhzParameters (void);
+    
+* **WifiMode**
+    
+    WifiMode now has a WifiPhyStandard attribute which identifies the standard the WifiMode belongs to. To properly set this attribute when creating a new WifiMode, it is now required to explicitly pass a WifiPhyStandard parameter to all WifiModeFactory::CreateXXXX() methods. The WifiPhyStandard value of an existing WifiMode can be retrieved using the new method WifiMode::GetStandard().
+    
+* **NetDevice**
+    
+    In order to have multiple link change callback in NetDevice (i.e. to flush ARP and IPv6 neighbor discovery caches), the following member method has been renamed:
+    
+    \- virtual void SetLinkChangeCallback (Callback<void> callback);
+    + virtual void AddLinkChangeCallback (Callback<void> callback);
+    
+    Now each NetDevice subclasses have a TracedCallback<> object (list of callbacks) instead of Callback<void> ones.
+
+Changes from ns-3.4 to ns-3.5
+-----------------------------
+
+### Changes to build system
+
+* None for this release.
+
+### New API
+
+* **YansWifiPhyHelper supporting radiotap and prism PCAP output**
+    
+    The newly supported pcap formats can be adopted by calling the following new method of YansWifiPhyHelper:
+    
+     +  void SetPcapFormat (enum PcapFormat format);
+    
+    where format is one of PCAP\_FORMAT\_80211\_RADIOTAP, PCAP\_FORMAT\_80211\_PRISM or PCAP\_FORMAT\_80211. By default, PCAP\_FORMAT\_80211 is used, so the default PCAP format is the same as before.
+    
+* **attributes for class Ipv4**
+    
+    class Ipv4 now contains attributes in ipv4.cc; the first one is called "IpForward" that will enable/disable Ipv4 forwarding.
+    
+* **packet tags**
+    
+    class Packet now contains AddPacketTag, RemovePacketTag and PeekPacketTag which can be used to attach a tag to a packet, as opposed to the old AddTag method which attached a tag to a set of bytes. The main semantic difference is in how these tags behave in the presence of fragmentation and reassembly.
+    
+### Changes to existing API
+
+* **Ipv4Interface::GetMtu () deleted**
+    
+    The Ipv4Interface API is private to internet-stack module; this method was just a pass-through to GetDevice ()->GetMtu ().
+    
+* **GlobalRouteManager::PopulateRoutingTables () and RecomputeRoutingTables () are deprecated**
+    
+    This API has been moved to the helper API and the above functions will be removed in ns-3.6. The new API is:
+    
+    Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
+    Ipv4GlobalRoutingHelper::RecomputeRoutingTables ();
+    
+    Additionally, these low-level functions in GlobalRouteManager are now public, allowing more API flexibility at the low level ns-3 API:
+    
+    GlobalRouteManager::DeleteGlobalRoutes ();
+    GlobalRouteManager::BuildGlobalRoutingDatabase ();
+    GlobalRouteManager::InitializeRoutes ();
+    
+* **CalcChecksum attribute changes**
+    
+    Four IPv4 CalcChecksum attributes (which enable the computation of checksums that are disabled by default) have been collapsed into one global value in class Node. These four calls:
+    
+    Config::SetDefault ("ns3::Ipv4L3Protocol::CalcChecksum", BooleanValue (true)); 
+    Config::SetDefault ("ns3::Icmpv4L4Protocol::CalcChecksum", BooleanValue (true));
+    Config::SetDefault ("ns3::TcpL4Protocol::CalcChecksum", BooleanValue (true));
+    Config::SetDefault ("ns3::UdpL4Protocol::CalcChecksum", BooleanValue (true));
+    
+    are replaced by one call to:
+    
+    GlobalValue::Bind ("ChecksumEnabled", BooleanValue (true));
+    
+* **CreateObject changes**
+    
+    CreateObject is now able to construct objects with a non-default constructor. If you used to pass attribute lists to CreateObject, you must now use CreateObjectWithAttributes.
+    
+* **packet byte tags renaming**
+    * Packet::AddTag to Packet::AddByteTag
+    * Packet::FindFirstMatchingTag to Packet::FindFirstMatchingByteTag
+    * Packet::RemoveAllTags to Packet::RemoveAllByteTags
+    * Packet::PrintTags to Packet::PrintByteTags
+    * Packet::GetTagIterator to Packet::GetByteTagIterator
+* **YansWifiPhyHelper::EnablePcap\* methods not static any more**
+    
+    To accommodate the possibility of configuring the PCAP format used for wifi promiscuous mode traces, several methods of YansWifiPhyHelper had to be made non-static:
+    
+    \-  static void EnablePcap (std::string filename, uint32\_t nodeid, uint32\_t deviceid);
+    +         void EnablePcap (std::string filename, uint32\_t nodeid, uint32\_t deviceid);
+    -  static void EnablePcap (std::string filename, Ptr<NetDevice> nd);
+    +         void EnablePcap (std::string filename, Ptr<NetDevice> nd);
+    -  static void EnablePcap (std::string filename, std::string ndName);
+    +         void EnablePcap (std::string filename, std::string ndName);
+    -  static void EnablePcap (std::string filename, NetDeviceContainer d);
+    +         void EnablePcap (std::string filename, NetDeviceContainer d);
+    -  static void EnablePcap (std::string filename, NodeContainer n);
+    +         void EnablePcap (std::string filename, NodeContainer n);
+    -  static void EnablePcapAll (std::string filename);
+    +         void EnablePcapAll (std::string filename);
+    
+* **Wifi Promisc Sniff interface modified**
+    
+    To accommodate support for the radiotap and prism headers in PCAP traces, the interface for promiscuos mode sniff in the wifi device was changed. The new implementation was heavily inspired by the way the madwifi driver handles monitor mode. A distinction between TX and RX events is introduced, to account for the fact that different information is to be put in the radiotap/prism header (e.g., RSSI and noise make sense only for RX packets). The following are the relevant modifications to the WifiPhy class:
+    
+    \-  void NotifyPromiscSniff (Ptr<const Packet> packet);
+    +  void NotifyPromiscSniffRx (Ptr<const Packet> packet, uint16\_t channelFreqMhz, uint32\_t rate, bool isShortPreamble, double signalDbm, double noiseDbm);
+    +  void NotifyPromiscSniffTx (Ptr<const Packet> packet, uint16\_t channelFreqMhz, uint32\_t rate, bool isShortPreamble);
+    -  TracedCallback<Ptr<const Packet> > m\_phyPromiscSnifferTrace;
+    +  TracedCallback<Ptr<const Packet>, uint16\_t, uint32\_t, bool, double, double> m\_phyPromiscSniffRxTrace;
+    +  TracedCallback<Ptr<const Packet>, uint16\_t, uint32\_t, bool> m\_phyPromiscSniffTxTrace;
+    
+    The above mentioned callbacks are expected to be used to call the following method to write Wifi PCAP traces in promiscuous mode:
+    
+    \+  void WriteWifiMonitorPacket(Ptr<const Packet> packet, uint16\_t channelFreqMhz, uint32\_t rate, bool isShortPreamble, bool isTx, double signalDbm, double noiseDbm);
+    
+    In the above method, the isTx parameter is to be used to differentiate between TX and RX packets. For an example of how to implement these callbacks, see the implementation of PcapSniffTxEvent and PcapSniffRxEvent in src/helper/yans-wifi-helper.cc
+    
+* **Routing decoupled from class Ipv4**
+    
+    All calls of the form "Ipv4::AddHostRouteTo ()" etc. (i.e. to add static routes, both unicast and multicast) have been moved to a new class Ipv4StaticRouting. In addition, class Ipv4 now holds only one possible routing protocol; the previous way to add routing protocols (by ordered list of priority) has been moved to a new class Ipv4ListRouting. Class Ipv4 has a new minimal routing API (just to set and get the routing protocol):
+    
+    \-  virtual void AddRoutingProtocol (Ptr<Ipv4RoutingProtocol> routingProtocol, int16\_t priority) = 0;
+    +  virtual void SetRoutingProtocol (Ptr<Ipv4RoutingProtocol> routingProtocol) = 0;
+    +  virtual Ptr<Ipv4RoutingProtocol> GetRoutingProtocol (void) const = 0;
+    
+* **class Ipv4RoutingProtocol is refactored**
+    
+    The abstract base class Ipv4RoutingProtocol has been refactored to align with corresponding Linux Ipv4 routing architecture, and has been moved from ipv4.h to a new file ipv4-routing-protocol.h. The new methods (RouteOutput () and RouteInput ()) are aligned with Linux ip\_route\_output() and ip\_route\_input(). However, the general nature of these calls (synchronous routing lookup for locally originated packets, and an asynchronous, callback-based lookup for forwarded packets) is still the same.
+    
+    \-  typedef Callback<void, bool, const Ipv4Route&, Ptr<Packet>, const Ipv4Header&> RouteReplyCallback;
+    +  typedef Callback<void, Ptr<Ipv4Route>, Ptr<const Packet>, const Ipv4Header &> UnicastForwardCallback;
+    +  typedef Callback<void, Ptr<Ipv4MulticastRoute>, Ptr<const Packet>, const Ipv4Header &> MulticastForwardCallback;
+    +  typedef Callback<void, Ptr<const Packet>, const Ipv4Header &, uint32\_t > LocalDeliverCallback;
+    +  typedef Callback<void, Ptr<const Packet>, const Ipv4Header &> ErrorCallback;
+    -  virtual bool RequestInterface (Ipv4Address destination, uint32\_t& interface) = 0;
+    +  virtual Ptr<Ipv4Route> RouteOutput (Ptr<Packet> p, const Ipv4Header &header, uint32\_t oif, Socket::SocketErrno &errno) = 0;
+    -  virtual bool RequestRoute (uint32\_t interface,
+    -                            const Ipv4Header &ipHeader,
+    -                            Ptr<Packet> packet,
+    -                            RouteReplyCallback routeReply) = 0;
+    +  virtual bool RouteInput  (Ptr<const Packet> p, const Ipv4Header &header, Ptr<const NetDevice> idev,
+    +                             UnicastForwardCallback ucb, MulticastForwardCallback mcb,
+    +                             LocalDeliverCallback lcb, ErrorCallback ecb) = 0;
+    
+* **previous class Ipv4Route, Ipv4MulticastRoute renamed; new classes with those same names added**
+    
+    The previous class Ipv4Route and Ipv4MulticastRoute are used by Ipv4StaticRouting and Ipv4GlobalRouting to record internal routing table entries, so they were renamed to class Ipv4RoutingTableEntry and Ipv4MulticastRoutingTableEntry, respectively. In their place, new class Ipv4Route and class Ipv4MulticastRoute have been added. These are reference-counted objects that are analogous to Linux struct rtable and struct mfc\_cache, respectively, to achieve better compatibility with Linux routing architecture in the future.
+    
+* **class Ipv4 address-to-interface mapping functions changed**
+    
+    There was some general cleanup of functions that involve mappings from Ipv4Address to either NetDevice or Ipv4 interface index.
+    
+    \-  virtual uint32\_t FindInterfaceForAddr (Ipv4Address addr) const = 0;
+    -  virtual uint32\_t FindInterfaceForAddr (Ipv4Address addr, Ipv4Mask mask) const = 0;
+    +  virtual int32\_t GetInterfaceForAddress (Ipv4Address address) const = 0;
+    +  virtual int32\_t GetInterfaceForPrefix (Ipv4Address address, Ipv4Mask mask) const = 0;
+    -  virtual int32\_t FindInterfaceForDevice(Ptr<NetDevice> nd) const = 0;
+    +  virtual int32\_t GetInterfaceForDevice (Ptr<const NetDevice> device) const = 0;
+    -  virtual Ipv4Address GetSourceAddress (Ipv4Address destination) const = 0;
+    -  virtual bool GetInterfaceForDestination (Ipv4Address dest,
+    -  virtual uint32\_t GetInterfaceByAddress (Ipv4Address addr, Ipv4Mask mask = Ipv4Mask("255.255.255.255"));
+    
+* **class Ipv4 multicast join API deleted**
+    
+    The following methods are not really used in present form since IGMP is not being generated, so they have been removed (planned to be replaced by multicast socket-based calls in the future):
+    
+    \- virtual void JoinMulticastGroup (Ipv4Address origin, Ipv4Address group) = 0;
+    - virtual void LeaveMulticastGroup (Ipv4Address origin, Ipv4Address group) = 0;
+    
+* **Deconflict NetDevice::ifIndex and Ipv4::ifIndex (bug 85).**
+    
+    All function parameters named "ifIndex" that refer to an Ipv4 interface are instead named "interface".
+    
+    \- static const uint32\_t Ipv4RoutingProtocol::IF\_INDEX\_ANY = 0xffffffff;
+    + static const uint32\_t Ipv4RoutingProtocol::INTERFACE\_ANY = 0xffffffff;
+    
+    - bool Ipv4RoutingProtocol::RequestIfIndex (Ipv4Address destination, uint32\_t& ifIndex);
+    + bool Ipv4RoutingProtocol::RequestInterface (Ipv4Address destination, uint32\_t& interface);
+    (N.B. this particular function is planned to be renamed to RouteOutput() in the
+    proposed IPv4 routing refactoring)
+    
+    - uint32\_t Ipv4::GetIfIndexByAddress (Ipv4Address addr, Ipv4Mask mask);
+    + int\_32t Ipv4::GetInterfaceForAddress (Ipv4Address address, Ipv4Mask mask) const;
+    
+    - bool Ipv4::GetIfIndexForDestination (Ipv4Address dest, uint32\_t &ifIndex) const;
+    + bool Ipv4::GetInterfaceForDestination (Ipv4Address dest, uint32\_t &interface) const;
+    (N.B. this function is not needed in the proposed Ipv4 routing refactoring)
+    
+* **Allow multiple IPv4 addresses to be assigned to an interface (bug 188)**
+    * Add class Ipv4InterfaceAddress: This is a new class to resemble Linux's struct in\_ifaddr. It holds IP addressing information, including mask, broadcast address, scope, whether primary or secondary, etc.
+        
+        \+  virtual uint32\_t AddAddress (uint32\_t interface, Ipv4InterfaceAddress address) = 0;
+        +  virtual Ipv4InterfaceAddress GetAddress (uint32\_t interface, uint32\_t addressIndex) const = 0;
+        +  virtual uint32\_t GetNAddresses (uint32\_t interface) const = 0;
+          
+        
+    * Regarding legacy API usage, typically where you once did the following, using the public Ipv4 class interface (e.g.):
+        
+          ipv4A->SetAddress (ifIndexA, Ipv4Address ("172.16.1.1"));
+          ipv4A->SetNetworkMask (ifIndexA, Ipv4Mask ("255.255.255.255"));
+          
+        
+        you now do:
+        
+          Ipv4InterfaceAddress ipv4IfAddrA = Ipv4InterfaceAddress (Ipv4Address ("172.16.1.1"), Ipv4Mask ("255.255.255.255"));
+          ipv4A->AddAddress (ifIndexA, ipv4IfAddrA);
+          
+        
+    * At the helper API level, one often gets an address from an interface container. We preserve the legacy GetAddress (uint32\_t i) but it is documented that this will return only the first (address index 0) address on the interface, if there are multiple such addresses. We provide also an overloaded variant for the multi-address case:
+        
+        Ipv4Address Ipv4InterfaceContainer::GetAddress (uint32\_t i)
+        + Ipv4Address Ipv4InterfaceContainer::GetAddress (uint32\_t i, uint32\_t j)
+          
+        
+* **New WifiMacHelper objects**
+    
+    The type of wifi MAC is now set by two new specific helpers, NqosWifiMacHelper for non QoS MACs and QosWifiMacHelper for Qos MACs. They are passed as argument to WifiHelper::Install methods.
+    
+
+\- void WifiHelper::SetMac (std::string type, std::string n0 = "", const AttributeValue &v0 = EmptyAttributeValue (),...)
+
+- NetDeviceContainer WifiHelper::Install (const WifiPhyHelper &phyHelper, NodeContainer c) const
++ NetDeviceContainer WifiHelper::Install (const WifiPhyHelper &phyHelper, const WifiMacHelper &macHelper, NodeContainer c) const
+
+- NetDeviceContainer WifiHelper::Install (const WifiPhyHelper &phy, Ptr<Node> node) const
++ NetDeviceContainer WifiHelper::Install (const WifiPhyHelper &phy, const WifiMacHelper &mac, Ptr<Node> node) const
+
+- NetDeviceContainer WifiHelper::Install (const WifiPhyHelper &phy, std::string nodeName) const
++ NetDeviceContainer WifiHelper::Install (const WifiPhyHelper &phy, const WifiMacHelper &mac, std::string nodeName) const
+  
+
+See src/helper/nqos-wifi-mac-helper.h and src/helper/qos-wifi-mac-helper.h for more details.
+
+* **Remove Mac48Address::IsMulticast**
+    
+    This method was considered buggy and unsafe to call. Its replacement is Mac48Address::IsGroup.
+    
+
+### Changed behavior
+
+* None for this release.
+
+Changes from ns-3.3 to ns-3.4
+-----------------------------
+
+### Changes to build system
+
+* A major option regarding the downloading and building of ns-3 has been added for ns-3.4 -- the ns-3-allinone feature. This allows a user to get the most common options for ns-3 downloaded and built with a minimum amount of trouble. See the ns-3 tutorial for a detailed explanation of how to use this new feature.
+* The build system now runs build items in parallel by default. This includes the regression tests.
+
+### New API
+
+* XML support has been added to the ConfigStore in src/contrib/config-store.cc
+* The ns-2 calendar queue scheduler option has been ported to src/simulator
+* A ThreeLogDistancePropagationLossModel has been added to src/devices/wifi
+* ConstantAccelerationMobilityModel in src/mobility/constant-acceleration-mobility-model.h
+* A new emulation mode is supported with the TapBridge net device (see src/devices/tap-bridge)
+* A new facility for naming ns-3 Objects is included (see src/core/names.{cc,h})
+* Wifi multicast support has been added in src/devices/wifi
+
+### Changes to existing API
+
+* Some fairly significant changes have been made to the API of the random variable code. Please see the ns-3 manual and src/core/random-variable.cc for details.
+* The trace sources in the various NetDevice classes has been completely reworked to allow for a consistent set of trace sources across the devices. The names of the trace sources have been changed to provide some context with respect to the level at which the trace occurred. A new set of trace sources has been added which emulates the behavior of packet sniffers. These sources have been used to implement tcpdump- like functionality and are plumbed up into the helper classes. The user-visible changes are the trace source name changes and the ability to do promiscuous-mode pcap tracing via helpers. For further information regarding these changes, please see the ns-3 manual
+* StaticMobilityModel has been renamed ConstantPositionMobilityModel StaticSpeedMobilityModel has been renamed ConstantVelocityMobilityModel
+* The Callback templates have been extended to support more parameters. See src/core/callback.h
+* Many helper API have been changed to allow passing Object-based parameters as string names to ease working with the object name service.
+* The Config APIs now accept path segments that are names defined by the object name service.
+* Minor changes were made to make the system build under the Intel C++ compiler.
+* Trace hooks for association and deassociation to/from an access point were added to src/devices/wifi/nqsta-wifi-mac.cc
+
+### Changed behavior
+
+* The tracing system rework has introduced some significant changes in the behavior of some trace sources, specifically in the positioning of trace sources in the device code. For example, there were cases where the packet transmit trace source was hit before the packet was enqueued on the device transmit quueue. This now happens just before the packet is transmitted over the channel medium. The scope of the changes is too large to be included here. If you have concerns regarding trace semantics, please consult the net device documentation for details. As is usual, the ultimate source for documentation is the net device source code.
+
+Changes from ns-3.2 to ns-3.3
+-----------------------------
+
+### New API
+
+* ns-3 ABORT macros in src/core/abort.h Config::MatchContainer ConstCast and DynamicCast helper functions for Ptr casting StarTopology added to several topology helpers NetDevice::IsBridge ()
+* 17-11-2008; changeset [4c1c3f6bcd03](http://code.nsnam.org/ns-3-dev/rev/4c1c3f6bcd03)
+
+* The PppHeader previously defined in the point-to-point-net-device code has been made public.
+
+* 17-11-2008; changeset [16c2970a0344](http://code.nsnam.org/ns-3-dev/rev/16c2970a0344)
+
+* An emulated net device has been added as enabling technology for ns-3 emulation scenarios. See src/devices/emu and examples/emu-udp-echo.cc for details.
+
+* 17-11-2008; changeset [4222173d1e6d](http://code.nsnam.org/ns-3-dev/rev/4222173d1e6d)
+
+* Added method InternetStackHelper::EnableAsciiChange to allow allow a user to hook ascii trace to the drop trace events in Ipv4L3Protocol and ArpL3Protocol.
+
+### Changes to existing API
+
+* NetDevice::MakeMulticastAddress() was renamed to NetDevice::GetMulticast() and the original GetMulticast() removed
+* Socket API changes:
+    * return type of SetDataSentCallback () changed from bool to void
+    * Socket::Listen() no longer takes a queueLimit argument
+* As part of the Wifi Phy rework, there have been several API changes at the low level and helper API level.
+
+* At the helper API level, the WifiHelper was split to three classes: a WifiHelper, a YansWifiChannel helper, and a YansWifiPhy helper. Some functions like Ascii and Pcap tracing functions were moved from class WifiHelper to class YansWifiPhyHelper.
+* At the low-level API, there have been a number of changes to make the Phy more modular:
+
+* composite-propagation-loss-model.h is removed
+* DcfManager::NotifyCcaBusyStartNow() has changed name
+* fragmentation related functions (e.g. DcaTxop::GetNFragments()) have changed API to account for some implementation changes
+* Interference helper and error rate model added
+* JakesPropagationLossModel::GetLoss() moved to PropagationLoss() class
+* base class WifiChannel made abstract
+* WifiNetDevice::SetChannel() removed
+* a WifiPhyState helper class added
+* addition of the YansWifiChannel and YansWifiPhy classes
+
+* 17-11-2008; changeset [dacfd1f07538](http://code.nsnam.org/ns-3-dev/rev/dacfd1f07538)
+
+* Change attribute "RxErrorModel" to "ReceiveErrorModel" in CsmaNetDevice for consistency between devices.
+
+### Changed behavior
+
+* 17-11-2008; changeset [ed0dfce40459](http://code.nsnam.org/ns-3-dev/rev/ed0dfce40459)
+
+* Relax reasonableness testing in Ipv4AddressHelper::SetBase to allow the assignment of /32 addresses.
+
+* 17-11-2008; changeset [756887a9bbea](http://code.nsnam.org/ns-3-dev/rev/756887a9bbea)
+
+* Global routing supports bridge devices.
+
+Changes from ns-3.1 to ns-3.2
+-----------------------------
+
+### New API
+
+* 26-08-2008; changeset [5aa65b1ea001](http://code.nsnam.org/ns-3-dev/rev/5aa65b1ea001)
+
+* Add multithreaded and real-time simulator implementation. Allows for emulated net devices running in threads other than the main simulation thread to schedule events. Allows for pacing the simulation clock at 1x real-time.
+
+* 26-08-2008; changeset [c69779f5e51e](http://code.nsnam.org/ns-3-dev/rev/c69779f5e51e)
+
+* Add threading and synchronization primitives. Enabling technology for multithreaded simulator implementation.
+
+### New API in existing classes
+
+* 01-08-2008; changeset [a18520551cdf](http://code.nsnam.org/ns-3-dev/rev/a18520551cdf)
+
+* class ArpCache has two new attributes: MaxRetries and a Drop trace. It also has some new public methods but these are mostly for internal use.
+
+### Changes to existing API
+
+* 05-09-2008; changeset [aa1fb0f43571](http://code.nsnam.org/ns-3-dev/rev/aa1fb0f43571)
+
+* Change naming of MTU and packet size attributes in CSMA and Point-to-Point devices  
+    After much discussion it was decided that the preferred way to think about the different senses of transmission units and encapsulations was to call the MAC MTU simply MTU and to use the overall packet size as the PHY-level attribute of interest. See the Doxygen of CsmaNetDevice::SetFrameSize and PointToPointNetDevice::SetFrameSize for a detailed description.
+
+* 25-08-2008; changeset [e5ab96db540e](http://code.nsnam.org/ns-3-dev/rev/e5ab96db540e)
+
+* bug 273: constify packet pointers.  
+    The normal and the promiscuous receive callbacks of the NetDevice API have been changed from:
+    
+    Callback<bool,Ptr<NetDevice>,Ptr<Packet>,uint16\_t,const Address &>
+    Callback<bool,Ptr<NetDevice>, Ptr<Packet>, uint16\_t,
+             const Address &, const Address &, enum PacketType >
+    
+    to:
+    
+    Callback<bool,Ptr<NetDevice>,Ptr<const Packet>,uint16\_t,const Address &>
+    Callback<bool,Ptr<NetDevice>, Ptr<const Packet>, uint16\_t,
+             const Address &, const Address &, enum PacketType >
+    
+    to avoid the kind of bugs reported in [bug 273](http://www.nsnam.org/bugzilla/show_bug.cgi?id=273). Users who implement a subclass of the NetDevice base class need to change the signature of their SetReceiveCallback and SetPromiscReceiveCallback methods.
+
+* 04-08-2008; changeset [cba7b2b80fe8](http://code.nsnam.org/ns-3-dev/rev/cba7b2b80fe8)
+
+* Cleanup of MTU confusion and initialization in CsmaNetDevice  
+    The MTU of the CsmaNetDevice defaulted to 65535. This did not correspond with the expected MTU found in Ethernet-like devices. Also there was not clear documentation regarding which MTU was being set. There are two MTU here, one at the MAC level and one at the PHY level. We split out the MTU setting to make this more clear and set the default PHY level MTU to 1500 to be more like Ethernet. The encapsulation mode defaults to LLC/SNAP which then puts the MAC level MTU at 1492 by default. We allow users to now set the encapsulation mode, MAC MTU and PHY MTU while keeping the three values consistent. See the Doxygen of CsmaNetDevice::SetMaxPayloadLength for a detailed description of the issues and solution.
+
+* 21-07-2008; changeset [99698bc858e8](
+    http://code.nsnam.org/ns-3-dev/rev/99698bc858e8)
+
+* class NetDevice has added a pure virtual method that must be implemented by all subclasses:
+    
+    virtual void SetPromiscReceiveCallback (PromiscReceiveCallback cb) = 0;
+    
+    All NetDevices must support this method, and must call this callback when processing packets in the receive direction (the appropriate place to call this is device-dependent). An approach to stub this out temporarily, if you do not care about immediately enabling this functionality, would be to add this to your device:
+    
+    void
+    ExampleNetDevice::SetPromiscReceiveCallback
+    (NetDevice::PromiscReceiveCallback cb)
+    { 
+      NS\_ASSERT\_MSG (false, "No implementation yet for
+    SetPromiscReceiveCallback");
+    }
+    
+    To implement this properly, consult the CsmaNetDevice for examples of when the m\_promiscRxCallback is called.
+
+* 03-07-2008; changeset [d5f8e5fae1c6](http://code.nsnam.org/ns-3-dev/rev/d5f8e5fae1c6)
+
+* Miscellaneous cleanup of Udp Helper API, to fix bug 234
+    
+    class UdpEchoServerHelper
+    {
+    public:
+    - UdpEchoServerHelper ();
+    - void SetPort (uint16\_t port); 
+    + UdpEchoServerHelper (uint16\_t port);
+    + 
+    + void SetAttribute (std::string name, const AttributeValue &value);
+    ApplicationContainer Install (NodeContainer c);
+    
+    class UdpEchoClientHelper
+    {
+    public:
+    - UdpEchoClientHelper ();
+    + UdpEchoClientHelper (Ipv4Address ip, uint16\_t port);
+    - void SetRemote (Ipv4Address ip, uint16\_t port);
+    - void SetAppAttribute (std::string name, const AttributeValue &value);
+    + void SetAttribute (std::string name, const AttributeValue &value);
+    ApplicationContainer Install (NodeContainer c);
+    
+
+* 03-07-2008; changeset [3cdd9d60f7c7](
+    http://code.nsnam.org/ns-3-dev/rev/3cdd9d60f7c7)
+
+* Rename all instances method names using "Set..Parameter" to "Set..Attribute" (bug 232)
+* How to fix your code: Any use of helper API that was using a method "Set...Parameter()" should be changed to read "Set...Attribute()". e.g.
+    
+    \- csma.SetChannelParameter ("DataRate", DataRateValue (5000000));
+    - csma.SetChannelParameter ("Delay", TimeValue (MilliSeconds (2)));
+    + csma.SetChannelAttribute ("DataRate", DataRateValue (5000000));
+    + csma.SetChannelAttribute ("Delay", TimeValue (MilliSeconds (2)));
+    
+### Changed behavior
+
+* 07-09-2008; changeset [5d836ab1523b](http://code.nsnam.org/ns-3-dev/rev/5d836ab1523b)
+
+* Implement a finite receive buffer for TCP  
+    The native TCP model in TcpSocketImpl did not support a finite receive buffer. This changeset adds the following functionality in this regard:
+    
+    * Being able to set the receiver buffer size through the attributes system.
+    * This receiver buffer size is now correctly exported in the TCP header as the advertised window. Prior to this changeset, the TCP header advertised window was set to the maximum size of 2^16 bytes. window
+    * The aforementioned window size is correctly used for flow control, i.e. the sending TCP will not send more data than available space in the receiver's buffer.
+    * In the case of a receiver window collapse, when a advertised zero-window packet is received, the sender enters the persist probing state in which it sends probe packets with one payload byte at exponentially backed-off intervals up to 60s. The receiver will continue to send advertised zero-window ACKs of the old data so long as the receiver buffer remains full. When the receiver window clears up due to an application read, the TCP will finally ACK the probe byte, and update its advertised window appropriately.
+    
+    See [bug 239](http://www.nsnam.org/bugzilla/show_bug.cgi?id=239) for more.
+
+* 07-09-2008; changeset [7afa66c2b291](http://code.nsnam.org/ns-3-dev/rev/7afa66c2b291)
+
+* Add correct FIN exchange behavior during TCP closedown  
+    The behavior of the native TcpSocketImpl TCP model was such that the final FIN exchange was not correct, i.e. calling Socket::Close didn't send a FIN packet, and even if it had, the ACK never came back, and even if it had, the ACK would have incorrect sequence number. All these various problems have been addressed by this changeset. See [bug 242](http://www.nsnam.org/bugzilla/show_bug.cgi?id=242) for more.
+
+* 28-07-2008; changeset [6f68f1044df1](http://code.nsnam.org/ns-3-dev/rev/6f68f1044df1)
+    * OLSR: HELLO messages hold time changed to 3\*hello interval from hello interval. This is an important bug fix as hold time == refresh time was never intentional, as it leads to instability in neighbor detection.**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/CMakeLists.txt ns-3.36/CMakeLists.txt
--- ns-3.35/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/CMakeLists.txt	2022-04-30 18:23:57.638732400 -0700
@@ -0,0 +1,147 @@
+# ##############################################################################
+# Required CMake version            #
+# ##############################################################################
+cmake_minimum_required(VERSION 3.10..3.10)
+
+# Use ccache if available
+mark_as_advanced(CCACHE_FOUND)
+find_program(CCACHE ccache)
+if(NOT ("${CCACHE}" STREQUAL "CCACHE-NOTFOUND"))
+  set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache)
+  message(
+    STATUS "CCache is enabled. Precompiled headers are disabled by default."
+  )
+  set(NS3_PRECOMPILE_HEADERS OFF
+      CACHE BOOL "Precompile module headers to speed up compilation" FORCE
+  )
+endif()
+
+# ##############################################################################
+# Project name                        #
+# ##############################################################################
+project(NS3 CXX)
+
+file(STRINGS VERSION NS3_VER)
+
+# minimum compiler versions
+set(AppleClang_MinVersion 11.0.0)
+set(Clang_MinVersion 6.0.0)
+set(GNU_MinVersion 8.0.0)
+
+# common options
+option(NS3_ASSERT "Enable assert on failure" OFF)
+option(NS3_DES_METRICS "Enable DES Metrics event collection" OFF)
+option(NS3_EXAMPLES "Enable examples to be built" OFF)
+option(NS3_LOG "Enable logging to be built" OFF)
+option(NS3_TESTS "Enable tests to be built" OFF)
+
+# fd-net-device options
+option(NS3_EMU "Build with emulation support" ON)
+option(NS3_TAP "Build with Tap support" ON)
+
+# maintenance and documentation
+option(NS3_CLANG_FORMAT "Enforce cody style with clang-format" OFF)
+option(NS3_CLANG_TIDY "Use clang-tidy static analysis" OFF)
+option(NS3_CLANG_TIMETRACE
+       "Collect compilation statistics to analyze the build process" OFF
+)
+option(NS3_COLORED_OUTPUT "Colorize CMake messages" OFF)
+option(NS3_COVERAGE "Enable code coverage measurements and report generation"
+       OFF
+)
+option(NS3_COVERAGE_ZERO_COUNTERS
+       "Zero lcov counters before running. Requires NS3_COVERAGE=ON" OFF
+)
+option(NS3_INCLUDE_WHAT_YOU_USE
+       "Use IWYU to determine unnecessary headers included" OFF
+)
+option(NS3_LINK_WHAT_YOU_USE
+       "Use LWYU to determine unnecessary linked libraries" OFF
+)
+option(NS3_SANITIZE "Build with address, leak and undefined sanitizers" OFF)
+option(NS3_SANITIZE_MEMORY "Build with memory sanitizer" OFF)
+option(NS3_SCAN_PYTHON_BINDINGS "Scan python bindings" OFF)
+
+# 3rd-party libraries/programs
+option(NS3_NETANIM "Build netanim" OFF)
+
+# other options
+option(NS3_ENABLE_BUILD_VERSION "Embed version info into libraries" OFF)
+option(NS3_GNUPLOT "Build with Gnuplot support" OFF)
+option(NS3_GSL "Build with GSL support" ON)
+option(NS3_GTK3 "Build with GTK3 support" ON)
+option(NS3_LINK_TIME_OPTIMIZATION "Build with link-time optimization" OFF)
+option(NS3_MONOLIB
+       "Build a single shared ns-3 library and link it against executables" OFF
+)
+option(NS3_MPI "Build with MPI support" OFF)
+option(NS3_NATIVE_OPTIMIZATIONS "Build with -march=native -mtune=native" OFF)
+set(NS3_OUTPUT_DIRECTORY "" CACHE STRING "Directory to store built artifacts")
+option(NS3_PRECOMPILE_HEADERS
+       "Precompile module headers to speed up compilation" ON
+)
+option(NS3_PYTHON_BINDINGS "Build ns-3 python bindings" OFF)
+option(NS3_REALTIME "Build with realtime support" ON)
+option(NS3_SQLITE "Build with SQLite support" ON)
+option(NS3_STATIC "Build a static ns-3 library and link it against executables"
+       OFF
+)
+option(NS3_VERBOSE "Print additional build system messages" OFF)
+option(NS3_VISUALIZER "Build visualizer module" ON)
+option(NS3_WARNINGS "Enable compiler warnings" ON)
+option(NS3_WARNINGS_AS_ERRORS
+       "Treat warnings as errors. Requires NS3_WARNINGS=ON" ON
+)
+
+# Options that either select which modules will get built or disable modules
+set(NS3_ENABLED_MODULES ""
+    CACHE STRING "List of modules to enable (e.g. core;network;internet)"
+)
+set(NS3_DISABLED_MODULES ""
+    CACHE STRING "List of modules to disable (e.g. lte;wimax;wave)"
+)
+
+# Include macros used below
+include(build-support/macros-and-definitions.cmake)
+
+# Scan module libraries
+subdirlist(libs_to_build ${CMAKE_SOURCE_DIR}/src)
+
+# Scan contribution libraries
+subdirlist(contrib_libs_to_build ${CMAKE_SOURCE_DIR}/contrib)
+
+# Before filtering, we need to load settings from .ns3rc
+parse_ns3rc(ns3rc_enabled_modules ns3rc_examples_enabled ns3rc_tests_enabled)
+
+# After scanning modules, we can filter enabled and disabled ones
+filter_enabled_and_disabled_modules(
+  libs_to_build contrib_libs_to_build NS3_ENABLED_MODULES NS3_DISABLED_MODULES
+  ns3rc_enabled_modules
+)
+
+# ##############################################################################
+# Process options                     #
+# ##############################################################################
+process_options()
+
+# ##############################################################################
+# Add subdirectories                  #
+# ##############################################################################
+# Build NS3 library core
+add_subdirectory(src)
+
+# Build NS library examples
+add_subdirectory(examples)
+
+# Build scratch/simulation scripts
+add_subdirectory(scratch)
+
+# Build test utils
+add_subdirectory(utils)
+
+write_lock()
+write_configtable()
+write_header_to_modules_map()
+
+# Export package targets when installing
+ns3_cmake_package()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/contrib/wscript ns-3.36/contrib/wscript
--- ns-3.35/contrib/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/contrib/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,326 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-from __future__ import print_function
-from collections import deque
-import os, os.path
-import sys
-import shutil
-import types
-import warnings
-
-from waflib import TaskGen, Task, Options, Build, Utils, Context
-from waflib.Errors import WafError
-import wutils
-
-try:
-    set
-except NameError:
-    from sets import Set as set # Python 2.3 fallback
-
-# Allow mulitple modules to live in a single directory in contrib.
-# For example, a directory structure like:
-# contrib/package/module1
-#                /module2
-# Useful for external projects that are building interdependent modules that
-# are logically packaged together.
-def find_contrib_modules(ctx, log=False):
-    modules = []
-
-    entries = deque( (ctx.path, d) for d in ctx.path.listdir() )
-    
-    while entries:
-        parent, entry = entries.popleft()
- 
-        if not entry or entry[0] == '.' or entry.endswith('CVS'):
-            continue
-
-        node = parent.find_node(entry) 
-
-        if not node:
-            continue
-
-        if node.isdir():
-            #does this directory have a wscript file?
-            wscript_node = node.find_node('wscript')
-
-            if wscript_node:
-                #found a wscript file, treat this directory as a module.
-                
-                #get the path relative to the context path 
-                module_path = node.path_from(ctx.path)
-                modules.append(module_path)
-
-                if log:
-                    ctx.msg("Found contrib module", module_path)
-            else:
-                #maybe this directory is a project, 
-                #add its children to the list of entries to process
-                entries.extend( (node, d) for d in node.listdir() )
-
-    return sorted(modules)
-
-def get_required_boost_libs(conf):
-    for module in find_contrib_modules(conf):
-        conf.recurse (module, name="required_boost_libs", mandatory=False)
-
-def options(opt):
-    for module in find_contrib_modules(opt):
-        opt.recurse(module, mandatory=False)
-
-def configure(conf):
-    all_contrib_modules = find_contrib_modules(conf, True)
-
-    # Append blddir to the module path before recursing into modules
-    # This is required for contrib modules with test suites
-    blddir = os.path.abspath(os.path.join(conf.bldnode.abspath(), conf.variant))
-    conf.env.append_value('NS3_MODULE_PATH', blddir)
-
-    # Remove duplicate path items
-    conf.env['NS3_MODULE_PATH'] = wutils.uniquify_list(conf.env['NS3_MODULE_PATH'])
-
-    for module in all_contrib_modules:
-        conf.recurse(module, mandatory=False)
-
-    ## Used to link the 'test-runner' program with all of ns-3 code
-    conf.env['NS3_CONTRIBUTED_MODULES'] = ['ns3-' + module.split('/')[-1] for module in all_contrib_modules]
-
-
-# we need the 'ns3module' waf "feature" to be created because code
-# elsewhere looks for it to find the ns3 module objects.
-
-def create_ns3_module(bld, name, dependencies=(), test=False):
-    static = bool(bld.env.ENABLE_STATIC_NS3)
-    # Create a separate library for this module.
-    if static:
-        module = bld(features='cxx cxxstlib ns3module')
-    else:
-        module = bld(features='cxx cxxshlib ns3module')
-    target = '%s/lib/ns%s-%s%s' % (bld.srcnode.path_from(module.path),
-                                          wutils.VERSION,
-                                          name, bld.env.BUILD_SUFFIX)
-    
-    module.target = target
-    linkflags = []
-    cxxflags = []
-    ccflags = []
-    if not static:
-        cxxflags = module.env['shlib_CXXFLAGS']
-        ccflags = module.env['shlib_CXXFLAGS']
-        # Turn on the link flags for shared libraries if we have the
-        # proper compiler and platform.
-        if module.env['CXX_NAME'] in ['gcc', 'icc'] and module.env['WL_SONAME_SUPPORTED']:
-            # Get the module library name without any relative paths
-            # at its beginning because all of the libraries will end
-            # up in the same directory.
-            module_library_name = module.env.cshlib_PATTERN % (os.path.basename(module.target),)
-            linkflags = '-Wl,--soname=' + module_library_name
-    cxxdefines = ["NS3_MODULE_COMPILATION"]
-    ccdefines = ["NS3_MODULE_COMPILATION"]
-
-    module.env.append_value('CXXFLAGS', cxxflags)
-    module.env.append_value('CCFLAGS', ccflags)
-    module.env.append_value('LINKFLAGS', linkflags)
-    module.env.append_value('CXXDEFINES', cxxdefines)
-    module.env.append_value('CCDEFINES', ccdefines)
-
-    module.is_static = static
-    module.vnum = wutils.VNUM
-    # Add the proper path to the module's name.
-    # Set the libraries this module depends on.  
-    module.module_deps = list(dependencies)
-
-    module.install_path = "${LIBDIR}"
-
-    module.name = "ns3-" + name
-    module.dependencies = dependencies
-    # Initially create an empty value for this because the pcfile
-    # writing task assumes every module has a uselib attribute.
-    module.uselib = ''
-    module.use = ['ns3-' + dep for dep in dependencies]
-    module.test = test
-    module.is_ns3_module = True
-    module.ns3_dir_location = bld.path.path_from(bld.srcnode)
-
-    module.env.append_value("INCLUDES", Context.out_dir)
-
-    module.pcfilegen = bld(features='ns3pcfile')
-    module.pcfilegen.module = module.name
-    
-    return module
-
-def create_ns3_module_test_library(bld, name):
-    # Create an ns3 module for the test library that depends only on
-    # the module being tested.
-    library_name = name + "-test"
-    library = bld.create_ns3_module(library_name, [name], test=True)
-    library.features += " ns3testlib"
-
-    # Modify attributes for the test library that are different from a
-    # normal module.
-    del library.is_ns3_module
-    library.is_ns3_module_test_library = True
-    library.module_name = 'ns3-' + name
-
-    # Add this module and test library to the list.
-    bld.env.append_value('NS3_MODULES_WITH_TEST_LIBRARIES', [(library.module_name, library.name)])
-
-    # Set the include path from the build directory to modules. 
-    relative_path_from_build_to_here = bld.path.path_from(bld.bldnode)
-    include_flag = '-I' + relative_path_from_build_to_here
-    library.env.append_value('CXXFLAGS', include_flag)
-    library.env.append_value('CCFLAGS',  include_flag)
-
-    return library
-
-def create_obj(bld, *args):
-    warnings.warn("(in %s) Use bld(...) call now, instead of bld.create_obj(...)" % str(bld.path),
-                  DeprecationWarning, stacklevel=2)
-    return bld(*args)
-
-
-def ns3_python_bindings(bld):
-    # this method is called from a module wscript, so remember bld.path is not bindings/python!
-    module_abs_src_path = bld.path.abspath()
-    module = os.path.basename(module_abs_src_path)
-    env = bld.env
-    env.append_value("MODULAR_BINDINGS_MODULES", "ns3-"+module)
-
-    if Options.options.apiscan:
-        return
-
-    if not env['ENABLE_PYTHON_BINDINGS']:
-        return
-
-    bindings_dir = bld.path.find_dir("bindings")
-    if bindings_dir is None or not os.path.exists(bindings_dir.abspath()):
-        warnings.warn("(in %s) Requested to build modular python bindings, but apidefs dir not found "
-                      "=> skipped the bindings." % str(bld.path),
-                      Warning, stacklevel=2)
-        return
-
-    if ("ns3-%s" % (module,)) not in env.NS3_ENABLED_CONTRIBUTED_MODULES:
-        #print "bindings for module %s which is not enabled, skip" % module)
-        return
-
-    env.append_value('PYTHON_MODULES_BUILT', module)
-    try:
-        apidefs = env['PYTHON_BINDINGS_APIDEFS'].replace("-", "_")
-    except AttributeError:
-        # we likely got an empty list for env['PYTHON_BINDINGS_APIDEFS']
-        return
-
-    #debug = ('PYBINDGEN_DEBUG' in os.environ)
-    debug = True # XXX
-    source = [bld.srcnode.find_resource('bindings/python/ns3modulegen-modular.py'),
-              bld.path.find_resource("bindings/modulegen__%s.py" % apidefs)]
-
-    modulegen_customizations = bindings_dir.find_resource("modulegen_customizations.py")
-    if modulegen_customizations is not None:
-        source.append(modulegen_customizations)
-
-    modulegen_local = bld.path.find_resource("bindings/modulegen_local.py")
-    # the local customization file may or not exist
-    if modulegen_local is not None:
-        source.append("bindings/modulegen_local.py")
-
-    module_py_name = module.replace('-', '_')
-    module_target_dir = bld.srcnode.find_dir("bindings/python/ns").path_from(bld.path)
-
-    # if bindings/<module>.py exists, it becomes the module frontend, and the C extension befomes _<module>
-    if bld.path.find_resource("bindings/%s.py" % (module_py_name,)) is not None:
-        bld(features='copy',
-            source=("bindings/%s.py" % (module_py_name,)),
-            target=('%s/%s.py' % (module_target_dir, module_py_name)))
-        extension_name = '_%s' % (module_py_name,)
-        bld.install_files('${PYTHONARCHDIR}/ns', ["bindings/%s.py" % (module_py_name,)])
-    else:
-        extension_name = module_py_name
-
-    target = ['bindings/ns3module.cc', 'bindings/ns3module.h', 'bindings/ns3modulegen.log']
-    #if not debug:
-    #    target.append('ns3modulegen.log')
-
-    argv = ['NS3_ENABLED_FEATURES=${FEATURES}',
-            'GCC_RTTI_ABI_COMPLETE=${GCC_RTTI_ABI_COMPLETE}',
-            '${PYTHON}']
-    #if debug:
-    #    argv.extend(["-m", "pdb"])
-    
-    argv.extend(['${SRC[0]}', module_abs_src_path, apidefs, extension_name, '${TGT[0]}'])
-
-    argv.extend(['2>', '${TGT[2]}']) # 2> ns3modulegen.log
-
-    features = []
-    for (name, caption, was_enabled, reason_not_enabled) in env['NS3_OPTIONAL_FEATURES']:
-        if was_enabled:
-            features.append(name)
-
-    bindgen = bld(features='command', source=source, target=target, command=argv)
-    bindgen.env['FEATURES'] = ','.join(features)
-    bindgen.dep_vars = ['FEATURES', "GCC_RTTI_ABI_COMPLETE"]
-    bindgen.before = ['cxxprogram', 'cxxshlib', 'cxxstlib']
-    bindgen.after = 'gen_ns3_module_header'
-    bindgen.name = "pybindgen(ns3 module %s)" % module
-    bindgen.module = module
-    bindgen.install_path = None
-
-    # generate the extension module
-    pymod = bld(features='cxx cxxshlib pyext')
-    pymod.source = ['bindings/ns3module.cc']
-    pymod.target = '%s/%s' % (module_target_dir, extension_name)
-    pymod.name = 'ns3module_%s' % module
-    pymod.module = module
-    pymod.use = ["%s" % mod for mod in pymod.env['NS3_ENABLED_CONTRIBUTED_MODULES']]
-    if pymod.env['ENABLE_STATIC_NS3']:
-        if sys.platform == 'darwin':
-            pymod.env.append_value('LINKFLAGS', '-Wl,-all_load')
-            for mod in pymod.usel:
-                #mod = mod.split("--lib")[0]
-                pymod.env.append_value('LINKFLAGS', '-l' + mod)
-        else:
-            pymod.env.append_value('LINKFLAGS', '-Wl,--whole-archive,-Bstatic')
-            for mod in pymod.use:
-                #mod = mod.split("--lib")[0]
-                pymod.env.append_value('LINKFLAGS', '-l' + mod)
-            pymod.env.append_value('LINKFLAGS', '-Wl,-Bdynamic,--no-whole-archive')
-    defines = list(pymod.env['DEFINES'])
-    defines.extend(['NS_DEPRECATED=', 'NS3_DEPRECATED_H'])
-    defines.extend(['NS_DEPRECATED_3_35=', 'NS3_DEPRECATED_H'])
-    defines.extend(['NS_DEPRECATED_3_34=', 'NS3_DEPRECATED_H'])
-    if Utils.unversioned_sys_platform() == 'win32':
-        try:
-            defines.remove('_DEBUG') # causes undefined symbols on win32
-        except ValueError:
-            pass
-    pymod.env['DEFINES'] = defines
-    # The following string should lead to includes of 
-    # '-I.', '-Isrc/core/bindings' when compiling module_helpers.cc
-    pymod.includes = Context.out_dir + ' ' + Context.out_dir + '/src/core/bindings'
-    pymod.install_path = '${PYTHONARCHDIR}/ns'
-
-    # Workaround to a WAF bug, remove this when ns-3 upgrades to WAF > 1.6.10
-    # https://www.nsnam.org/bugzilla/show_bug.cgi?id=1335
-    # http://code.google.com/p/waf/issues/detail?id=1098
-    if Utils.unversioned_sys_platform() == 'darwin':
-        pymod.mac_bundle = True
-
-    return pymod
-
-def build(bld):
-    bld.create_ns3_module = types.MethodType(create_ns3_module, bld)
-    bld.create_ns3_module_test_library = types.MethodType(create_ns3_module_test_library, bld)
-    bld.create_obj = types.MethodType(create_obj, bld)
-    bld.ns3_python_bindings = types.MethodType(ns3_python_bindings, bld)
-    
-    all_contrib_modules = find_contrib_modules(bld)
-
-    # Remove these modules from the list of all modules.
-    for not_built in bld.env['MODULES_NOT_BUILT']:
-
-        if not_built in all_contrib_modules:
-            all_contrib_modules.remove(not_built)
-
-    bld.recurse(list(all_contrib_modules))
-
-    for module in all_contrib_modules:
-        modheader = bld(features='ns3moduleheader')
-        modheader.module = module.split('/')[-1]
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/CONTRIBUTING.md ns-3.36/CONTRIBUTING.md
--- ns-3.35/CONTRIBUTING.md	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/CONTRIBUTING.md	2022-04-30 18:23:57.638732400 -0700
@@ -80,7 +80,7 @@
 #### Before Submitting A Bug Report (to be completed)
 
 * **Perform a [cursory search](https://gitlab.com/nsnam/ns-3-dev/issues)** to see if the problem has already been reported. If it has **and the issue is still open**, add a comment to the existing issue instead of opening a new one.
-* **Check the [release notes](RELEASE_NOTES)** for a list of known bugs.
+* **Check the [release notes](RELEASE_NOTES.md)** for a list of known bugs.
 
 #### How Do I Submit A (Good) Bug Report?
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/doc/build.txt ns-3.36/doc/build.txt
--- ns-3.35/doc/build.txt	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/doc/build.txt	2022-04-30 18:23:57.642732600 -0700
@@ -1,107 +1,116 @@
-The Waf build system is used to build ns-3.  Waf is a Python-based
-build system (http://www.freehackers.org/~tnagy/waf.html)
+The CMake build system is used to build ns-3.  CMake is a
+meta-build system (https://cmake.org/)
 
 Note:  We've added a wiki page with more complete build instructions
 than the quick ones you find below:
 http://www.nsnam.org/wiki/Installation
 
-=== Installing Waf ===
+=== Installing CMake ===
 
-The top-level ns-3 directory should contain a current waf script, so
-there is no need to have WAF installed in the system.  We are using
-some extensions to WAF, which can be found in the 'waf-tools'
-directory. The upstream location for these WAF extensions is:
+To use CMake, you need to download it and install it. This can be done
+ via package managers available for your operating system, or directly
+ from the CMake page: https://cmake.org/download/.
 
-    https://code.launchpad.net/~gjc/waf/cmd
+CMake is a meta-build system that relies on an underlying build system.
+This build system is referred to as Generators by CMake
+(https://cmake.org/cmake/help/latest/manual/cmake-generators.7.html),
+and include Makefiles, Ninja, XCode, Eclipse CDT4 and others.
 
+One of these must be installed for CMake to work.
 
-=== Building with Waf ===
 
-To build ns-3 with waf type the commands from the top-level directory:
- 1. ./waf configure [options]
- 2. ./waf
+=== Building with ns3 ===
 
-To see valid configure options, type ./waf --help.  The most important
+To build ns-3 with the ns3 CMake wrapper type the commands from the top-level directory:
+ 1. ./ns3 configure [options]
+ 2. ./ns3 build
+
+To see valid configure options, type ./ns3 --help.  The most important
 option is -d <debug level>.  Valid debug levels (which are listed in
-waf --help) are: "debug" or "optimized", with debug being default.  It is
+ns3 --help) are: "debug" or "optimized", with debug being default.  It is
 also possible to change the flags used for compilation with (e.g.):
-CXXFLAGS="-O3" ./waf configure.  By default, ns-3 is built as debug code, 
+CXXFLAGS="-O3" ./ns3 configure.  By default, ns-3 is built as debug code,
 with examples and tests disabled, and with python bindings enabled.  
 
 [ Note:  Unlike some other build tools, to change the build target,
 the option must be supplied during the configure stage rather than
-the build stage (i.e., "./waf -d optimized" will not work; instead, do
-"./waf -d optimized configure; ./waf" ]
+the build stage (i.e., "./ns3 build -d optimized" will not work; instead, do
+"./ns3 configure -d optimized; ./ns3 build" ]
 
 The resulting executables and libraries are placed in build/.
 
-Other waf usages include:
+Other ns3 usages include:
 
- 1. ./waf configure --enable-examples --enable-tests
+ 1. ./ns3 configure --enable-examples --enable-tests
     Turn on examples and tests.
 
- 2. ./waf configure --disable-python
+ 2. ./ns3 configure --disable-python
     Disable python bindings.
 
- 3. ./waf --doxygen
+ 3. ./ns3 docs doxygen
     Run doxygen to generate documentation
 
- 4. ./waf --run "program [args]"
+ 4. ./ns3 run "program [args]"
     Run a ns3 program, given its target name, with the given
     arguments.  This takes care of automatically modifying the
     path for finding the ns3 dynamic libraries in the environment
     before running the program.  Note: the "program [args]" string is
     parsed using POSIX shell rules.
 
- 4.1 ./waf --run programname --command-template "... %s ..."
+ 4.1 ./ns3 run program-name --command-template "... %s ..."
 
-    Same as --run, but uses a command template with %s replaced by the
-    actual program (whose name is given by --run).  This can be use to
+    Same as run, but uses a command template with %s replaced by the
+    actual program (whose name is given by run).  This can be use to
     run ns-3 programs with helper tools.  For example, to run unit
     tests with valgrind, use the command:
 
-         ./waf --run run-tests --command-template "valgrind %s"
+         ./ns3 run run-tests --command-template "valgrind %s"
 
- 5. ./waf --shell
+ 5. ./ns3 shell
     Starts a nested system shell with modified environment to run ns3 programs.
 
- 6. ./waf distclean
+ 6. ./ns3 clean
     Cleans out the entire build/ directory
 
- 7. ./waf dist
-    The command 'waf dist' can be used to create a distribution tarball.
-    It includes all files in the source directory, except some particular
-    extensions that are blacklisted, such as back files (ending in ~).
 
 === Extending ns-3 ===
 
 To add new modules:
   1. Create the module directory under src;
   2. Add the source files to it;
-  3. Add a 'wscript' describing it;
+  3. Add a 'CMakeLists.txt' describing it;
 
 A convenience program to auto-generate the template of a new module can
 be found in src/create-module.py.
 
-A module's wscript file is basically a regular Waf script.  A ns-3
-module is created as a cpp/shlib object, like this:
+A ns-3 module is created as a cpp/shlib object, like this:
 
-def build(bld):
-    module = bld.create_ns3_module('ns3-mymodule', ['core'])
-    module.source = [
-        'model/ns3-mymodule.cc',
-        'helper/ns3-mymodule-helper.cc',
-        ]
-
-    headers = bld.new_task_gen(features=['ns3header'])
-    headers.module = 'ns3-mymodule'
-    headers.source = [
-        'model/ns3-mymodule.h',
-        'helper/ns3-mymodule-helper.h',
-        ]
+    set(name ns3-mymodule)
 
-    if bld.env.ENABLE_EXAMPLES:
-        bld.add_subdirs('examples')
+    set(source_files
+        model/ns3-mymodule.cc
+        helper/ns3-mymodule-helper.cc
+        )
+
+    set(header_files
+        model/ns3-mymodule.h
+        helper/ns3-mymodule-helper.h
+        )
+
+    set(libraries_to_link
+        libcore # lib prefix + module name
+        )
+
+    set(test_sources
+        test/test-mymodule.cc
+        )
+
+    build_lib(
+       LIBNAME ${name}
+       SOURCE_FILES ${source_files}
+       HEADER_FILES ${header_files}
+       LIBRARIES_TO_LINK ${libraries_to_link}
+       TEST_SOURCES ${test_sources}
+       )
 
-    # bld.ns3_python_bindings()
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/doc/codingstd.txt ns-3.36/doc/codingstd.txt
--- ns-3.35/doc/codingstd.txt	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/doc/codingstd.txt	2022-04-30 18:23:57.646732600 -0700
@@ -1,2 +1,4 @@
-The project coding style document is maintained at:
-http://www.nsnam.org/developers/contributing-code/coding-style/
+The project coding style document is maintained as part of the contribution
+guide (https://www.nsnam.org/docs/contributing/html/index.html).  The raw
+source file for the coding style chapter is in a subdirectory:
+contributing/source/coding-style.rst
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/doc/contributing/figures/README ns-3.36/doc/contributing/figures/README
--- ns-3.35/doc/contributing/figures/README	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/doc/contributing/figures/README	2022-04-30 18:23:57.646732600 -0700
@@ -0,0 +1,18 @@
+Please write image files in a vector graphics format, when possible, and
+generate the .png and .pdf versions on the fly (see ../Makefile).  
+
+The currently supported tool is dia.  xfig could be added similarly
+if someone wants to add it.  The main requirement for adding another format
+is that the tool to edit it is freely available and that a cron script can 
+autogenerate the pdf and png from the figure source.  Tgif (.obj) files
+were once used but the file conversions require a valid X display to 
+be running, and are therefore to be avoided since our code server 
+does not run such a server.  Tgif pdf conversions were also cumbersome.
+
+Store the .dia versions in git, but not the .png or .pdfs.  
+If the figure is not available in a vector graphics format, store both
+a .png and a .pdf version in this directory.
+
+If you add a source (.dia) file here, remember to add it to
+the list of figure sources in the Makefile in the directory above
+
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/doc/contributing/Makefile ns-3.36/doc/contributing/Makefile
--- ns-3.35/doc/contributing/Makefile	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/doc/contributing/Makefile	2022-04-30 18:23:57.646732600 -0700
@@ -0,0 +1,165 @@
+# Makefile for Sphinx documentation
+#
+
+# You can set these variables from the command line.
+SPHINXOPTS    =
+SPHINXBUILD   = sphinx-build
+PAPER         =
+BUILDDIR      = build
+
+# Internal variables.
+PAPEROPT_a4     = -D latex_paper_size=a4
+PAPEROPT_letter = -D latex_paper_size=letter
+ALLSPHINXOPTS   = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source
+
+# Additional variables for figures, not sphinx default:
+DIA = dia
+EPSTOPDF = epstopdf
+FIGURES = source/figures
+IMAGES_EPS = \
+
+IMAGES_PNG = ${IMAGES_EPS:.eps=.png}
+IMAGES_PDF = ${IMAGES_EPS:.eps=.pdf}
+
+IMAGES = $(IMAGES_EPS) $(IMAGES_PNG) $(IMAGES_PDF)
+
+.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest
+
+.NOTPARALLEL:
+
+%.eps : %.dia
+	@echo dia $(notdir $<)
+	@$(DIA) -t eps $< -e $@ >/dev/null
+
+%.png : %.dia
+	@echo dia $(notdir $<)
+	@$(DIA) -t png $< -e $@ >/dev/null
+
+%.png : %.eps
+	@echo convert $(notdir $<)
+	@$(CONVERT) $< $@ >/dev/null
+
+%.pdf : %.eps
+	@echo epstopdf $(notdir $<)
+	@$(EPSTOPDF) $< -o=$@ >/dev/null
+	@if test x$($@_width) != x; then $(RESCALE) $($@_width) $@ ; fi
+
+help:
+	@echo "Please use \`make <target>' where <target> is one of"
+	@echo "  html       to make standalone HTML files"
+	@echo "  dirhtml    to make HTML files named index.html in directories"
+	@echo "  singlehtml to make a single large HTML file"
+	@echo "  pickle     to make pickle files"
+	@echo "  json       to make JSON files"
+	@echo "  htmlhelp   to make HTML files and a HTML help project"
+	@echo "  qthelp     to make HTML files and a qthelp project"
+	@echo "  devhelp    to make HTML files and a Devhelp project"
+	@echo "  epub       to make an epub"
+	@echo "  latex      to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
+	@echo "  latexpdf   to make LaTeX files and run them through pdflatex"
+	@echo "  text       to make text files"
+	@echo "  man        to make manual pages"
+	@echo "  changes    to make an overview of all changed/added/deprecated items"
+	@echo "  linkcheck  to check all external links for integrity"
+	@echo "  doctest    to run all doctests embedded in the documentation (if enabled)"
+
+clean:
+	-rm -rf $(BUILDDIR)
+
+frag: pickle
+	@if test ! -d $(BUILDDIR)/frag; then mkdir $(BUILDDIR)/frag; fi
+	pushd $(BUILDDIR)/frag && ../../pickle-to-xml.py ../pickle/index.fpickle  > navigation.xml && popd
+	cp -r $(BUILDDIR)/pickle/_images $(BUILDDIR)/frag
+
+html: $(IMAGES)
+	$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
+	@echo
+	@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
+
+dirhtml: $(IMAGES)
+	$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
+	@echo
+	@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
+
+singlehtml: $(IMAGES)
+	$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
+	@echo
+	@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
+
+pickle: $(IMAGES)
+	$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
+	@echo
+	@echo "Build finished; now you can process the pickle files."
+
+json: $(IMAGES)
+	$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
+	@echo
+	@echo "Build finished; now you can process the JSON files."
+
+htmlhelp: $(IMAGES)
+	$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
+	@echo
+	@echo "Build finished; now you can run HTML Help Workshop with the" \
+	      ".hhp project file in $(BUILDDIR)/htmlhelp."
+
+qthelp: $(IMAGES)
+	$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
+	@echo
+	@echo "Build finished; now you can run "qcollectiongenerator" with the" \
+	      ".qhcp project file in $(BUILDDIR)/qthelp, like this:"
+	@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/ns-3.qhcp"
+	@echo "To view the help file:"
+	@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/ns-3.qhc"
+
+devhelp: $(IMAGES)
+	$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
+	@echo
+	@echo "Build finished."
+	@echo "To view the help file:"
+	@echo "# mkdir -p $$HOME/.local/share/devhelp/ns-3"
+	@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/ns-3"
+	@echo "# devhelp"
+
+epub: $(IMAGES)
+	$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
+	@echo
+	@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
+
+latex: $(IMAGES)
+	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
+	@echo
+	@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
+	@echo "Run \`make' in that directory to run these through (pdf)latex" \
+	      "(use \`make latexpdf' here to do that automatically)."
+
+latexpdf: $(IMAGES)
+	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
+	@echo "Running LaTeX files through pdflatex..."
+	make -C $(BUILDDIR)/latex all-pdf
+	@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
+
+text: $(IMAGES)
+	$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
+	@echo
+	@echo "Build finished. The text files are in $(BUILDDIR)/text."
+
+man: $(IMAGES)
+	$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
+	@echo
+	@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
+
+changes: $(IMAGES)
+	$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
+	@echo
+	@echo "The overview file is in $(BUILDDIR)/changes."
+
+linkcheck: $(IMAGEs)
+	$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
+	@echo
+	@echo "Link check complete; look for any errors in the above output " \
+	      "or in $(BUILDDIR)/linkcheck/output.txt."
+
+doctest: $(IMAGES)
+	$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
+	@echo "Testing of doctests in the sources finished, look at the " \
+	      "results in $(BUILDDIR)/doctest/output.txt."
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/doc/contributing/pickle-to-xml.py ns-3.36/doc/contributing/pickle-to-xml.py
--- ns-3.35/doc/contributing/pickle-to-xml.py	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/doc/contributing/pickle-to-xml.py	2022-04-30 18:23:57.646732600 -0700
@@ -0,0 +1,42 @@
+#!/usr/bin/python
+
+
+# output xml format:
+# <pages>
+# <page url="xx"><prev url="yyy">zzz</prev><next url="hhh">lll</next><fragment>file.frag</fragment></page>
+# ...
+# </pages>
+
+import pickle
+import os
+import codecs
+
+def dump_pickles(out, dirname, filename, path):
+    f = open(os.path.join(dirname, filename), 'r')
+    data = pickle.load(f)
+    fragment_file = codecs.open(data['current_page_name'] + '.frag', mode='w', encoding='utf-8')
+    fragment_file.write(data['body'])
+    fragment_file.close()
+    out.write('  <page url="%s">\n' % path)
+    out.write('    <fragment>%s.frag</fragment>\n' % data['current_page_name'])
+    if data['prev'] is not None:
+        out.write('    <prev url="%s">%s</prev>\n' % 
+                  (os.path.normpath(os.path.join(path, data['prev']['link'])), 
+                   data['prev']['title']))
+    if data['next'] is not None:
+        out.write('    <next url="%s">%s</next>\n' % 
+                  (os.path.normpath(os.path.join(path, data['next']['link'])), 
+                   data['next']['title']))
+    out.write('  </page>\n')
+    f.close()
+    if data['next'] is not None:
+        next_path = os.path.normpath(os.path.join(path, data['next']['link']))
+        next_filename = os.path.basename(next_path) + '.fpickle'
+        dump_pickles(out, dirname, next_filename, next_path)
+    return
+
+import sys
+
+sys.stdout.write('<pages>\n')
+dump_pickles(sys.stdout, os.path.dirname(sys.argv[1]), os.path.basename(sys.argv[1]), '/')
+sys.stdout.write('</pages>')
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/doc/contributing/source/coding-style.rst ns-3.36/doc/contributing/source/coding-style.rst
--- ns-3.35/doc/contributing/source/coding-style.rst	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/doc/contributing/source/coding-style.rst	2022-04-30 18:23:57.646732600 -0700
@@ -0,0 +1,489 @@
+.. include:: replace.txt
+.. heading hierarchy:
+   ------------- Chapter
+   ************* Section (#.#)
+   ============= Subsection (#.#.#)
+   ############# Paragraph (no number)
+
+.. _Coding style:
+
+Coding style
+------------
+
+When writing code to be contributed to the |ns3| open source project, we
+ask that you follow the coding standards, guidelines, and recommendations
+found below.
+
+A lot of the syntactical rules described can be easily enforced with the
+help of the ``utils/check-style.py`` script which relies on a working version
+of `uncrustify <http://uncrustify.sourceforge.net/>`_.  We recommend to
+run this script over your newly introduced C++ files prior to submission
+as a Merge Request.
+However, we ask that you avoid introducing whitespace changes to any
+portions of existing files that do not pertain to your submission (even
+though such portions of existing files may not be currently compliant
+with the coding style).
+
+To run ``check-style.py`` on a new file, the following command is
+suggested:
+
+::
+
+  $ /path/to/utils/check-style.py -i -l 3 -f new-file.cc
+
+The ``-i`` flag tells check-style.py to make modifications in-place.  The
+``-l 3`` argument asks to apply the highest level of whitespace compliance
+changes to the code.
+
+Code layout
+***********
+
+The code layout follows the
+`GNU coding standard <https://www.gnu.org/prep/standards/>`_ layout for C and
+extends it to C++.  Do not use tabs for indentation.  Indentation spacing is
+2 spaces (the default emacs C++ mode) as outlined below:
+
+::
+
+   Foo (void)
+   {
+     if (test)
+       {
+         // do stuff here
+       }
+     else
+       {
+         // do other stuff here
+       }
+   
+     for (int i = 0; i < 100; i++)
+       {
+         // do loop
+       }
+   
+     while (test)
+       {
+         // do while
+       }
+   
+     do
+       {
+         // do stuff
+       } while ();
+   }
+
+Each statement should be put on a separate line to increase readability, and
+multi-statement blocks following conditional or looping statements are always
+delimited by braces (single-statement blocks may be placed on the same line
+of an ``if ()`` statement).  Each variable declaration is on a separate line.
+Variables should be declared at the point in the code where they are needed,
+and should be assigned an initial value at the time of declaration. Except
+when used in a switch statement, the open and close braces ``{`` and ``}``
+are always on a separate line. Do not use the C++ ``goto`` statement.
+
+The layout of variables declared in a class may either be aligned with
+the variable names or unaligned, as long as the file is internally consistent
+and no tab characters are included. Examples:
+
+::
+
+  int varOne;
+  double varTwo;   // OK (unaligned)
+  int      varOne;
+  double   varTwo;  // also OK (aligned)
+
+Naming
+******
+
+Name encoding
+=============
+
+Function, method, and type names should follow the
+`CamelCase <https://en.wikipedia.org/wiki/CamelCase>`_ convention: words are
+joined without spaces and are capitalized. For example, "my computer" is
+transformed into ``MyComputer``.  Do not use all capital letters such as
+``MAC`` or ``PHY``, but choose instead ``Mac`` or ``Phy``. Do not use all
+capital letters, even for acronyms such as ``EDCA``; use ``Edca`` instead.
+This applies also to two-letter acronyms, such as ``IP`` (which becomes
+``Ip``). The goal of the CamelCase convention is to ensure that the words
+which make up a name can be separated by the eye: the initial Caps
+fills that role. Use PascalCasing (CamelCase with first letter capitalized)
+for function, property, event, and class names.
+
+Variable names should follow a slight variation on the base CamelCase
+convention: camelBack. For example, the variable ``user name`` would be named
+``userName``. This variation on the basic naming pattern is used to allow a
+reader to distinguish a variable name from its type. For example,
+``UserName userName`` would be used to declare a variable named
+``userName`` of type ``UserName``.
+
+Global variables should be prefixed with a ``g_`` and member variables
+(including static member variables) should be prefixed with a ``m_``. The goal
+of that prefix is to give a reader a sense of where a variable of a given
+name is declared to allow the reader to locate the variable declaration and
+infer the variable type from that declaration. Defined types will start
+with an upper case letter, consist of upper and lower case letters, and may
+optionally end with a ``_t``. Defined constants (such as static const class
+members, or enum constants) will be all uppercase letters or numeric digits,
+with an underscore character separating words. Otherwise, the underscore
+character should not be used in a variable name. For example, you could
+declare in your class header ``my-class.h``:
+
+::
+
+  typedef int NewTypeOfInt_t;
+  const uint8_t PORT_NUMBER = 17;
+
+  class MyClass
+  {
+    void MyMethod (int aVar);
+    int m_aVar;
+    static int m_anotherVar;
+  };
+
+and implement in your class file ``my-class.cc``:
+
+::
+
+  int MyClass::m_anotherVar = 10;
+  static int g_aStaticVar = 100;
+  int g_aGlobalVar = 1000;
+  void
+  MyClass::MyMethod (int aVar)
+  {
+    m_aVar = aVar;
+  }
+
+As an exception to the above, the members of structures do not need to be
+prefixed with an ``m_``.
+
+Finally, do not use
+`Hungarian notation <https://en.wikipedia.org/wiki/Hungarian_notation>`_, and
+do not prefix enums, classes, or delegates with any letter.
+
+Choosing names
+==============
+
+Variable, function, method, and type names should be based on the English
+language, American spelling. Furthermore, always try to choose descriptive
+names for them. Types are often english names such as: Packet, Buffer, Mac,
+or Phy. Functions and methods are often named based on verbs and adjectives:
+GetX, DoDispose, ClearArray, etc.
+
+A long descriptive name which requires a lot of typing is always better than
+a short name which is hard to decipher. Do not use abbreviations in names
+unless the abbreviation is really unambiguous and obvious to everyone (e.g.,
+use "size" over "sz"). Do not use short inappropriate names such as foo,
+bar, or baz. The name of an item should always match its purpose. As such,
+names such as "tmp" to identify a temporary variable, or such as "i" to
+identify a loop index are ok.
+
+If you use predicates (that is, functions, variables or methods which return
+a single boolean value), prefix the name with "is" or "has".
+
+File layout and code organization
+*********************************
+
+A class named ``MyClass`` should be declared in a header named ``my-class.h``
+and implemented in a source file named ``my-class.cc``. The goal of this
+naming pattern is to allow a reader to quickly navigate through the |ns3|
+codebase to locate the source file relevant to a specific type.
+
+Each ``my-class.h`` header should start with the following comments: the
+first line ensures that developers who use the emacs editor will be able to
+indent your code correctly. The following lines ensure that your code
+is licensed under the GPL, that the copyright holders are properly
+identified (typically, you or your employer), and that the actual author
+of the code is identified. The latter is purely informational and we use it
+to try to track the most appropriate person to review a patch or fix a bug.
+Please do not add the "All Rights Reserved" phrase after the copyright
+statement.
+
+::
+
+  /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+  /*
+   * Copyright (c) YEAR COPYRIGHTHOLDER
+   *
+   * This program is free software; you can redistribute it and/or modify
+   * it under the terms of the GNU General Public License version 2 as
+   * published by the Free Software Foundation;
+   *
+   * This program is distributed in the hope that it will be useful,
+   * but WITHOUT ANY WARRANTY; without even the implied warranty of
+   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   * GNU General Public License for more details.
+   *
+   * You should have received a copy of the GNU General Public License
+   * along with this program; if not, write to the Free Software
+   * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+   *
+   * Author: MyName <myemail@example.com>
+   */
+
+Below these C-style comments, always include the following which defines a
+set of header guards (``MY_CLASS_H``) used to avoid multiple header includes,
+which ensures that your code is included in the |ns3| namespace and which
+provides a set of Doxygen comments for the public part of your class API.
+Detailed information on the set of tags available for doxygen documentation
+is described in the `Doxygen website <https://www.doxygen.nl/index.html>`_.
+
+::
+
+  #ifndef MY_CLASS_H
+  #define MY_CLASS_H
+
+  namespace n3 {
+
+  /**
+   * \brief short one-line description of the purpose of your class
+   *
+   * A longer description of the purpose of your class after a blank
+   * empty line.
+   */
+  class MyClass
+  {
+  public:
+    MyClass ();
+    /**
+     * \param firstParam a short description of the purpose of this parameter
+     * \returns a short description of what is returned from this function.
+     *
+     * A detailed description of the purpose of the method.
+     */
+    int DoSomething (int firstParam);
+  private:
+    /**
+     * Private method doxygen is also recommended
+     */
+    void MyPrivateMethod (void); 
+    int m_myPrivateMemberVariable; ///< Brief description of member variable
+  };
+
+  } // namespace ns3
+
+  #endif /* MY_CLASS_H */
+
+The ``my-class.cc`` file is structured similarly:
+
+::
+
+  /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+  /*
+   * Copyright (c) YEAR COPYRIGHTHOLDER
+   *
+   * 3-paragraph GPL blurb
+   *
+   * Author: MyName <myemail@foo.com>
+   */
+  #include "my-class.h"
+
+  namespace ns3 {
+
+  MyClass::MyClass ()
+  {}
+
+  ...
+
+  } // namespace ns3
+
+Language features
+*****************
+
+As of ns-3.36, |ns3| permits the use of C++-17 (or earlier) features
+in the implementation files. Because the |ns3| public APIs are scanned by a
+a `Python bindings framework <https://github.com/gjcarneiro/pybindgen>`_ that
+doesn't support even all of the C++-11 features, the |ns3| project is more
+conservative in using newer C++ standards in the APIs, and may ask
+to rework some APIs to retain compatibility with pybindgen.
+
+If a developer would like to propose to raise this bar to include more
+features than this, please email the developers list. We will move this
+language support forward as our minimally supported compiler moves forward.
+
+Comments
+********
+
+The project uses `Doxygen <https://www.doxygen.nl/index.html>`_ to document
+the interfaces, and uses comments for improving the clarity of the code
+internally. All classes, methods, and members should have Doxygen comments. Doxygen comments
+should use the C comment (also known as Javadoc) style. For comments that
+are intended to not be exposed publicly in the Doxygen output, use the
+``@internal`` and ``@endinternal`` tags.
+Please use the ``@see`` tag for cross-referencing. All
+parameters and return values should be documented.  The |ns3| codebase uses
+both the ``@`` or ``\`` characters for tag identification; please make sure
+that usage is consistent within a file.
+
+As for comments within the code, comments should be used to describe intention
+or algorithmic overview where is it not immediately obvious from reading the
+code alone. There are no minimum comment requirements and small routines
+probably need no commenting at all, but it is hoped that many larger
+routines will have commenting to aid future maintainers. Please write
+complete English sentences and capitalize the first word unless a lower-case
+identifier begins the sentence. Two spaces after each sentence helps to make
+emacs sentence commands work. Sometimes ``NS_LOG_DEBUG`` statements can
+be also used in place of comments.
+
+Short one-line comments and long comments can use the C++ comment style;
+that is, ``//``, but longer comments may use C-style comments:
+
+::
+
+  /*
+   * A longer comment,
+   * with multiple lines.
+   */
+
+Variable declaration should have a short, one or two line comment describing
+the purpose of the variable, unless it is a local variable whose use is
+obvious from the context. The short comment should be on the same line as the
+variable declaration, unless it is too long, in which case it should be on
+the preceding lines.
+
+Casts
+*****
+
+Where casts are necessary, use the Google C++ guidance:  "Use C++-style casts
+like ``static_cast<float>(double_value)``, or brace initialization for
+conversion of arithmetic types like ``int64 y = int64{1} << 42``."
+
+Try to avoid (and remove current instances of) casting of ``uint8_t``
+type to larger integers in our logging output by overriding these types
+within the logging system itself. Also, the unary ``+`` operator can be used
+to print the numeric value of any variable, such as:
+
+::
+
+  uint8_t flags = 5;
+  std::cout << "Flags numeric value: " << +flags << std::endl;
+
+Avoid unnecessary casts if minor changes to variable declarations can solve
+the issue.
+
+Miscellaneous items
+*******************
+
+- The following emacs mode line should be the first line in a file:
+  ::
+
+    /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+
+- ``NS_LOG_COMPONENT_DEFINE("log-component-name");`` statements should be
+  placed within namespace ns3 (for module code) and after the
+  ``using namespace ns3;``.  In examples. 
+  ``NS_OBJECT_ENSURE_REGISTERED()`` should also be placed within namespace ns3.
+
+- Const reference syntax:
+  ::
+
+    void MySub (const T&);    // Method 1  (prefer this syntax)
+    void MySub (T const&);    // Method 2  (avoid this syntax)
+
+- Use a space between the function name and the parentheses, e.g.:
+  ::
+
+    void MySub(const T&);     // avoid this
+    void MySub (const T&);    // use this instead
+  This spacing rule applies both to function declarations and invocations.
+
+- Do not include inline implementations in header files; put all
+  implementation in a .cc file (unless implementation in the header file
+  brings demonstrable and significant performance improvement).
+
+- Do not use ``nil`` or ``NULL`` constants; use ``0`` (improves portability)
+
+- Consider whether you want the default constructor, copy constructor, or assignment
+  operator in your class, and if not, explicitly mark them as deleted:
+  ::
+
+    public:
+      // Explain why these are not supported
+      ClassName () = delete;
+      ClassName (const ClassName&) = delete;
+      ClassName& operator= (const ClassName&) = delete;
+
+- Avoid returning a reference to an internal or local member of an object:
+  ::
+
+    a_type& foo (void);  // should be avoided, return a pointer or an object.
+    const a_type& foo (void); // same as above
+  This guidance does not apply to the use of references to implement operators.
+
+- Expose class members through access functions, rather than direct access
+  to a public object. The access functions are typically named Get" and 
+  "Set". For example, a member m_delayTime might have accessor functions
+  ``GetDelayTime ()`` and ``SetDelayTime ()``.
+
+- For standard headers, use the C++ style of inclusion, such as
+  ::
+
+    #include <cheader>
+  instead of
+  ::
+
+    #include <header.h>
+
+- Do not bring the C++ standard library namespace into |ns3| source files by
+  using the "using" directive; i.e. avoid ``using namespace std;``.
+
+- When including |ns3| headers in other |ns3| files, use `<>` when you expect
+  the header to be found in build/ (or to be installed) and use `""` when
+  you know the header is in the same directory as the implementation.
+
+  - inside .h files, always use
+    ::
+
+      #include <ns3/header.h>
+
+  - inside .cc files, use
+    ::
+
+      #include "header.h"
+    if file is in same directory, otherwise use
+    ::
+
+      #include <ns3/header.h>
+
+- Compilers will typically issue warnings on unused entities (e.g., variables,
+  function parameters).  Use the ``[[maybe_unused]]`` attribute to suppress
+  such warnings when the entity may be unused depending on how the code
+  is compiled (e.g., if the entity is only used in a logging statement or
+  an assert statement).  Example (parameter 'p' is only used for logging):
+  ::
+    void
+    TcpSocketBase::CompleteFork (Ptr<Packet> p [[maybe_unused]], const TcpHeader& h,
+                             const Address& fromAddress, const Address& toAddress)
+    {
+    NS_LOG_FUNCTION (this << p << h << fromAddress << toAddress);
+    ...
+
+  In function or method parameters, if the parameter is definitely unused,
+  it should be left unnamed.  Example (second parameter is not used):
+  ::
+    void
+    UanMacAloha::RxPacketGood (Ptr<Packet> pkt, double, UanTxMode txMode)
+    {
+      UanHeaderCommon header;
+      pkt->RemoveHeader (header);
+      ...
+
+  In this case, the parameter is also not referenced by Doxygen; e.g.:
+  ::
+    /*
+     * Receive packet from lower layer (passed to PHY as callback).
+     *
+     * \param pkt Packet being received.
+     * \param txMode Mode of received packet.
+     */
+    void RxPacketGood (Ptr<Packet> pkt, double, UanTxMode txMode);
+
+  The omission is preferred to commenting out unused parameters such as:
+  ::
+    void
+    UanMacAloha::RxPacketGood (Ptr<Packet> pkt, double /*sinr*/, UanTxMode txMode)
+    {
+      UanHeaderCommon header;
+      pkt->RemoveHeader (header);
+      ...
+
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/doc/contributing/source/conf.py ns-3.36/doc/contributing/source/conf.py
--- ns-3.35/doc/contributing/source/conf.py	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/doc/contributing/source/conf.py	2022-04-30 18:27:14.427631600 -0700
@@ -0,0 +1,216 @@
+# -*- coding: utf-8 -*-
+#
+# ns-3 documentation build configuration file, created by
+# sphinx-quickstart on Tue Dec 14 09:00:39 2010.
+#
+# This file is execfile()d with the current directory set to its containing dir.
+#
+# Note that not all possible configuration values are present in this
+# autogenerated file.
+#
+# All configuration values have a default; values that are commented out
+# serve to show the default.
+
+import sys, os
+
+# If extensions (or modules to document with autodoc) are in another directory,
+# add these directories to sys.path here. If the directory is relative to the
+# documentation root, use os.path.abspath to make it absolute, like shown here.
+#sys.path.insert(0, os.path.abspath('.'))
+
+# -- General configuration -----------------------------------------------------
+
+# If your documentation needs a minimal Sphinx version, state it here.
+#needs_sphinx = '1.0'
+
+# Add any Sphinx extension module names here, as strings. They can be extensions
+# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
+extensions = ['sphinx.ext.imgmath']
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ['_templates']
+
+# The suffix of source filenames.
+source_suffix = '.rst'
+
+# The encoding of source files.
+#source_encoding = 'utf-8-sig'
+
+# The master toctree document.
+master_doc = 'index'
+
+# General information about the project.
+project = u'ns-3'
+copyright = u'2015, ns-3 project'
+
+# The version info for the project you're documenting, acts as replacement for
+# |version| and |release|, also used in various other places throughout the
+# built documents.
+#
+# The short X.Y version.
+version = 'ns-3.36'
+# The full version, including alpha/beta/rc tags.
+release = 'ns-3.36'
+
+# The language for content autogenerated by Sphinx. Refer to documentation
+# for a list of supported languages.
+#language = None
+
+# There are two options for replacing |today|: either, you set today to some
+# non-false value, then it is used:
+#today = ''
+# Else, today_fmt is used as the format for a strftime call.
+#today_fmt = '%B %d, %Y'
+
+# List of patterns, relative to source directory, that match files and
+# directories to ignore when looking for source files.
+exclude_patterns = []
+
+# The reST default role (used for this markup: `text`) to use for all documents.
+#default_role = None
+
+# If true, '()' will be appended to :func: etc. cross-reference text.
+#add_function_parentheses = True
+
+# If true, the current module name will be prepended to all description
+# unit titles (such as .. function::).
+#add_module_names = True
+
+# If true, sectionauthor and moduleauthor directives will be shown in the
+# output. They are ignored by default.
+#show_authors = False
+
+# The name of the Pygments (syntax highlighting) style to use.
+pygments_style = 'sphinx'
+
+# A list of ignored prefixes for module index sorting.
+#modindex_common_prefix = []
+
+
+# -- Options for HTML output ---------------------------------------------------
+
+# The theme to use for HTML and HTML Help pages.  See the documentation for
+# a list of builtin themes.
+html_theme = 'ns3_html_theme'
+
+# Theme options are theme-specific and customize the look and feel of a theme
+# further.  For a list of options available for each theme, see the
+# documentation.
+#html_theme_options = {}
+
+# Add any paths that contain custom themes here, relative to this directory.
+html_theme_path = ['../..']
+
+# The name for this set of Sphinx documents.  If None, it defaults to
+# "<project> v<release> documentation".
+html_title = 'Contributing'
+
+# A shorter title for the navigation bar.  Default is the same as html_title.
+#html_short_title = None
+
+# The name of an image file (relative to this directory) to place at the top
+# of the sidebar.
+#html_logo = None
+
+# The name of an image file (within the static path) to use as favicon of the
+# docs.  This file should be a Windows icon file (.ico) being 16x16 or 32x32
+# pixels large.
+#html_favicon = None
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+html_static_path = ['_static']
+
+# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
+# using the given strftime format.
+html_last_updated_fmt = '%b %d, %Y %H:%M'
+
+# If true, SmartyPants will be used to convert quotes and dashes to
+# typographically correct entities.
+#html_use_smartypants = True
+
+# Custom sidebar templates, maps document names to template names.
+#html_sidebars = {}
+
+# Additional templates that should be rendered to pages, maps page names to
+# template names.
+#html_additional_pages = {}
+
+# If false, no module index is generated.
+#html_domain_indices = True
+
+# If false, no index is generated.
+#html_use_index = True
+
+# If true, the index is split into individual pages for each letter.
+#html_split_index = False
+
+# If true, links to the reST sources are added to the pages.
+#html_show_sourcelink = True
+
+# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
+#html_show_sphinx = True
+
+# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
+#html_show_copyright = True
+
+# If true, an OpenSearch description file will be output, and all pages will
+# contain a <link> tag referring to it.  The value of this option must be the
+# base URL from which the finished HTML is served.
+#html_use_opensearch = ''
+
+# This is the file name suffix for HTML files (e.g. ".xhtml").
+#html_file_suffix = None
+
+# Output file base name for HTML help builder.
+htmlhelp_basename = 'ns-3doc'
+
+
+# -- Options for LaTeX output --------------------------------------------------
+
+# The paper size ('letter' or 'a4').
+#latex_paper_size = 'letter'
+
+# The font size ('10pt', '11pt' or '12pt').
+#latex_font_size = '10pt'
+
+# Grouping the document tree into LaTeX files. List of tuples
+# (source start file, target name, title, author, documentclass [howto/manual]).
+latex_documents = [
+  ('index', 'ns-3-contributing.tex', u'Contributing to ns-3',
+   u'ns-3 project', 'manual'),
+]
+
+# The name of an image file (relative to this directory) to place at the top of
+# the title page.
+latex_logo = '../../ns3_html_theme/static/ns-3.png'
+
+# For "manual" documents, if this is true, then toplevel headings are parts,
+# not chapters.
+#latex_use_parts = False
+
+# If true, show page references after internal links.
+#latex_show_pagerefs = False
+
+# If true, show URL addresses after external links.
+#latex_show_urls = False
+
+# Additional stuff for the LaTeX preamble.
+latex_preamble = '\\usepackage{amssymb}'
+
+# Documents to append as an appendix to all manuals.
+#latex_appendices = []
+
+# If false, no module index is generated.
+#latex_domain_indices = True
+
+
+# -- Options for manual page output --------------------------------------------
+
+# One entry per manual page. List of tuples
+# (source start file, name, description, authors, manual section).
+man_pages = [
+    ('index', 'ns-3-contributing', u'Contributing to ns-3',
+     [u'ns-3 project'], 1)
+]
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/doc/contributing/source/enhancements.rst ns-3.36/doc/contributing/source/enhancements.rst
--- ns-3.35/doc/contributing/source/enhancements.rst	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/doc/contributing/source/enhancements.rst	2022-04-30 18:23:57.646732600 -0700
@@ -0,0 +1,302 @@
+.. include:: replace.txt
+.. heading hierarchy:
+   ------------- Chapter
+   ************* Section (#.#)
+   ============= Subsection (#.#.#)
+   ############# Paragraph (no number)
+
+.. _Enhancements:
+
+Submitting enhancements
+-----------------------
+
+This chapter covers how to submit fixes and small patches for the existing
+mainline code and its documentation.
+
+Enhancements (new models) can be proposed for the mainline, and
+maintainers will make a decision on whether to include it as mainline
+or recommend that it be supported in the ns-3 App Store.  Documentation
+on hosting code in the ns-3 App Store is provided in the next
+chapter (:ref:`External`). This chapter provides guidance on submitting
+code for inclusion in the mainline (and much of it applies also as
+best practice for app store code).
+
+GitLab.com trackers
+*******************
+
+|ns3| uses two trackers to keep track of known issues or submitted code.
+Maintainers prefer to list everything on the tracker so that issues do not
+slip through the cracks.  Users are encouraged to use these to report
+or comment on issues or merge requests; this requires users to obtain
+a GitLab.com account.
+
+If a user wants to report an issue with |ns3|, please first search
+the `issue tracker <https://gitlab.com/nsnam/ns-3-dev/-/issues>`_ for
+something that may be similar, and if nothing is found, please report
+the new issue.
+
+If a user wants to submit proposed new code for |ns3|, please 
+submit on the `merge request tracker <https://gitlab.com/nsnam/ns-3-dev/-/merge_requests>`_.
+
+More details for each are provided below.  Similarly, users who want to
+report issues on other related repositories under the `nsnam` project
+(such as the `Bake build system <https://gitlab.com/nsnam/bake>`_)
+should follow similar steps there.
+
+Reporting issues
+****************
+
+Issues can be reported against the code or the documentation, if you believe
+that something is incorrect or could be improved.  The key to reporting
+an issue with the code is to try to provide as much information as possible
+to allow a maintainer to quickly reproduce the problem.  After you've
+determined which module your bug is related to, if it is inside the
+official distribution (mainline), then create an issue, label it with the
+name of the module, and provide as much information as possible.
+
+First, perform a cursory search on the 
+`open issue list <https://gitlab.com/nsnam/ns-3-dev/-/issues>`_ to see if
+the problem has already been reported. If it has and the issue is still
+open, add a comment to the existing issue instead of opening a new one.
+
+If you are reporting an issue against an older version of |ns3|, please
+scan the most recent
+`Release Notes <https://gitlab.com/nsnam/ns-3-dev/-/blob/master/RELEASE_NOTES.md>`_ to see if it has been fixed since that release.
+
+If you then decide to list an issue, include details of your environment:
+
+1. Which version of ns-3 are you using?
+
+2. What's the name and version of the OS you're using?
+
+3. Which modules do you have installed?
+
+4. Have you modified ns-3-dev in any way?
+
+Here are some additional guidelines:
+
+1. Use a clear and descriptive title for the issue to identify the problem.
+
+2. Describe the exact steps which reproduce the problem in as many details
+   as possible. For example, start by explaining how you coded your script;
+   e.g. which functions were called in what order, or else provide an example
+   program.  If your program includes modifications to the ns-3 core or a
+   module, please list them (or even better, provide the diffs).
+
+3. Provide specific examples to demonstrate the steps. Include links to
+   files or projects, or copy/pasteable snippets, which you use in those
+   examples. If you're providing snippets in the issue, use Markdown code
+   block formatting.
+
+4. Describe the behavior you observed after following the steps and point out
+   what exactly is the problem with that behavior.  Explain which behavior you 
+   expected to see instead and why.
+
+5.  If you're reporting that ns-3 crashed, include a crash report with a
+    stack trace from the operating system. On macOS, the crash report will
+    be available in Console.app under 
+    `"Diagnostic and usage information" > "User diagnostic reports"`. Include
+    the crash report in the issue in a code block, or a file attachment.
+
+6.  If the problem is related to performance or memory, include a CPU
+    profile capture with your report.
+
+Some issues have suggested resolutions that are trivial and do not
+require submitting a merge request.  For more complicated resolutions,
+if you have a patch to propose, either attach it to the issue, or submit a
+merge request (described next).
+
+Submitting merge requests
+*************************
+
+To submit code proposed for |ns3| as one or more commits, use a merge
+request.  The following steps are recommended to smooth the process.
+
+If you are new to public Git repositories, you may want to read
+`this overview of merge requests <https://docs.gitlab.com/ee/user/project/merge_requests/getting_started.html>`_.  If you are familiar with GitHub
+pull requests, the GitLab.com merge requests are very similar.
+
+In brief, you will want to fork ns-3-dev into your own namespace (i.e.,
+fork the repository into your personal GitLab.com account, via the user 
+interface on GitLab.com), clone your fork of ns-3-dev to your local machine,
+create a new feature branch that is based on the
+current tip of ns-3-dev, push that new feature branch up to your fork,
+and then from the GitLab.com user interface, generate a Merge Request back
+to the |ns3| mainline.  You will want to monitor and respond to any
+comments from reviewers, and try to resolve threads.
+
+Remember the documentation
+==========================
+
+If you add or change API to the simulator, please include `Doxygen <https://www.doxygen.nl>`_ changes as appropriate.  Please scan the module documentation
+(written in `Restructured Text <https://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html>`_ in the `docs` directory) to check if an update is needed to align with the patch proposal. 
+
+Commit message format
+=====================
+
+Commit messages should be written as follows.  For examples, please look
+at the output of `git log` command.
+
+1.  The author string should be formatted such as "John Doe <john.doe@example.com>".  It is a good idea to run
+`git config <https://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration>`_ on your machine, or hand-edit the `.gitconfig` file in your home directory,
+to ensure that your name and email are how you want them to be displayed.
+
+.. raw:: latex
+
+    \newpage
+
+2. The first line of the commit message should be limited to 72 columns if possible.  This is not a hard requirement but a preference.  If you prefer to add
+more detail, you can add subsequent message lines below the first one, separated by a blank line.  Example:
+
+.. code-block:: text
+
+  commit e6ca9be6fb5a0592a44967f7885545dce3a6da1a
+  Author: Rediet <getachew.redieteab@orange.com>
+  Date:   Wed May 19 16:34:01 2021 +0200
+
+    lte: Assign default values
+    
+    Fixes crashing optimized/release builds with 'may be used uninitialized' error
+
+
+3. The first line of the commit message should include the relevant module name or names, separated by a colon.  Example: 
+
+.. code-block:: text
+
+  commit 15ab50c03132a5f7686045014c6bedf10ac7d421
+  Author: Stefano Avallone <stavallo@unina.it>
+  Date:   Wed Jan 27 14:58:54 2021 +0100
+
+    wifi,wave,mesh: Rescan python bindings
+
+
+4. If the commit fixes an issue in the issue tracker, list it in parentheses
+   after the colon (by saying 'fixes #NNN' where NNN is the issue number).
+   This reference alerts future readers to an issue where
+   more may be discussed about the commit.  Example:
+
+.. code-block:: text
+
+  commit 10ef08140ab2a9f2b550f24d1e881e76ea0873ff
+  Author: Tom Henderson <tomh@tomh.org>
+  Date:   Fri May 21 11:11:33 2021 -0700
+
+    network: (fixes #404) Use Queue::Dispose() for SimpleNetDevice::DoDispose()
+
+
+5. If the commit is from a merge request, that may also be added in a similar
+   way the same by saying 'merges !NNN'.  The exclamation point differentiates
+   merge requests from issues (which use the number sign '#') on GitLab.com. 
+   Example:
+
+.. code-block:: text
+
+  commit d4258b2b32d6254b878eca9200271fa3f4ee7174
+  Author: Tom Henderson <tomh@tomh.org>
+  Date:   Sat Mar 27 09:56:55 2021 -0700
+
+    build: (merges !584) Exit configuration if path whitespace detected
+
+
+Here is an example making use of both:
+
+.. code-block:: text
+
+  commit a97574779b575af70d975f9e2ca899e2405cf497
+  Author: Federico Guerra <federico@guerra-tlc.com>
+  Date:   Tue Jan 14 21:14:37 2020 +0100
+
+    uan: (fixes #129, merges !162) EndTx moved to PhyListener
+
+
+6. Use the present tense ("Add feature", not "Added feature") and the imperative mood ("Move cursor to ...", not "Moves cursor to...").
+
+No extraneous white space
+=========================
+
+Do not make whitespace changes to unrelated parts of the code (unrelated
+to your merge request).  This can often happen if the `check-style.py`
+program is used on existing files.  Use the automated style correction
+program `check-style.py` only on your *new* source code files.
+
+Squashing your history
+======================
+
+In the course of developing and responding to review comments, you may
+add more commits, so what started out as a single commit might grow into
+several.  Please consider to squash any such revisions if they do not
+need to be preserved as separate commits in the mainline Git history.
+
+If you squash commits, you must force-push your branch back to your fork.
+Do not worry about this; GitLab.com will update the Merge Request
+automatically.  This `tutorial <https://docs.gitlab.com/ee/topics/git/git_rebase.html>`_ may be helpful to learn about Git rebase, force-push, and merge
+conflicts.
+
+Note that GitLab can squash the commits while merging. However, it is often
+preferred to keep multiple commit messages, especially when the merge request
+contains multiple parts or multiple authors.
+
+It is a good practice to NOT squash commits while the merge request is being
+reviewed and updated (this helps the reviewers), and perform a selective
+squash before the merge.
+
+Rebasing on ns-3-dev
+====================
+
+It is also helpful to maintainers to keep your feature branch up to date
+so that the commits are appended to the tip of the mainline code.  This
+is not strictly required; maintainers may do such a rebase upon merging
+your finalized Merge Request.  This may help catch possible merge conflicts
+before the time to merge arrives.
+
+Note that sometimes it is not possible to rebase a merge request through
+GitLab's web interface. Hence, it is a good practice to keep your merge
+request in line with the mainline (i.e., rebase it periodically and push
+the updated branch).
+
+Resolving discussion threads
+============================
+
+Any time someone opens a new comment thread on a Merge Request, a counter
+of 'Unresolved threads' is incremented (near the top of the Merge Request).
+If you are able to successfully resolve the comment thread (either by
+changing your code, or convincing the reviewer that no change is needed),
+then please mark the thread as resolved.  Maintainers will look at the
+count of unresolved threads and make decisions based on this count as to
+whether the Merge Request is ready.  Maintainers prefer that all threads
+are resolved successfully before moving forward with a merge.
+
+Adding a label
+==============
+You can use labels to indicate whether the Merge Request is a bug, pertains
+to a specific module or modules, is documentation related, etc.  This is
+not required; if you do not add a label, a maintainer probably will.
+
+Other metadata
+==============
+
+It is not necessary to set other metadata on the Merge Request such as
+milestone, reviewers, etc.
+
+Feature requests
+****************
+
+Feature requests are tracked as `GitLab.com issues <https://gitlab.com/nsnam/ns-3-dev/-/issues>`_.  If you want to suggest an enhancement, create an issue and provide the following information:
+
+1. Use a clear and descriptive title for the issue to identify the suggestion.
+
+2. Provide a step-by-step description of the suggested enhancement in as many details as possible.
+
+3. Provide specific examples to demonstrate the steps. Include copy/pasteable snippets which you use in those examples.
+
+4. Describe the current behavior and explain which behavior you expected to see instead and why.
+
+5. Explain why this enhancement would be useful to most ns-3 users.
+
+The |ns3| project does not have professional developers available to respond
+to feature requests, so your best bet is to try to implement it yourself and
+work with maintainers to improve it, but the project does like to hear back
+from users about what would be a useful improvement, and you may find
+like-minded collaborators in the community willing to work on it with you.
+
+Use the `enhancement` Label on your feature request.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/doc/contributing/source/external.rst ns-3.36/doc/contributing/source/external.rst
--- ns-3.35/doc/contributing/source/external.rst	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/doc/contributing/source/external.rst	2022-04-30 18:23:57.646732600 -0700
@@ -0,0 +1,264 @@
+.. include:: replace.txt
+.. heading hierarchy:
+   ------------- Chapter
+   ************* Section (#.#)
+   ============= Subsection (#.#.#)
+   ############# Paragraph (no number)
+
+.. _External:
+
+Submitting externally maintained code
+-------------------------------------
+
+This chapter mainly pertains to code that will be maintained in external
+repositories (such as a personal or university research group repository,
+possibly hosted on GitHub or GitLab.com),
+but for which the contributor wishes to keep consistent and compatible 
+with the |ns3| mainline.
+
+If the contributor does not want to maintain the external code
+but wants to make the community aware that it is available with
+no ongoing support, links to the code can be posted on the |ns3|
+wiki contributed code page.  A typical example is the graduating
+student who wishes to make his or her thesis-related code available
+but who does not plan to update it further.
+See :ref:`sec-unmaintained-contributed` below.
+
+However, much of the emphasis of this chaper is on hosting |ns3| extensions
+in the |ns3| `App Store <https://apps.nsnam.org>`_.
+
+Rationale for the app store
+***************************
+
+Historically, |ns3| tried to merge all code contributions (that met the
+contribution guidelines) to the mainline.  However, this approach has
+reached its limits in terms of scalability:
+
+1. As |ns3| includes more lines of code, it takes longer to compile, while
+   users typically only need a subset of the available |ns3| model code.
+
+2. Merging to the mainline requires maintainer participation for code
+   reviews (which can be time consuming for maintainers), resulting in some
+   contributions not being merged due to lack of code reviews.
+
+The app store federates the maintenance of |ns3| modules, and puts more
+control in the hands of the contributor to maintain their code.  The idea
+is to provide a central place where users can discover |ns3| extensions
+and add them to their |ns3| installation.  One of the drawbacks of this
+approach, however, is the potential for a lot of compatibility headaches,
+such as a user trying to use two separately developed modules, but the
+modules are compatible with different |ns3| mainline versions.  Therefore,
+the app store is designed to assist in testing and clarifying which version
+of the external module is compatible with which mainline version of |ns3|.
+
+In brief, what it means for |ns3| users is the following.  There is an
+empty directory in the |ns3| source code tree called `contrib`.  This directory
+behaves the same way (with respect to the build system) as the `src`
+directory, but is the place in which externally developed models can
+be downloaded and added to |ns3|.
+
+For contributors, the app store provides a means for module developers
+to make releases on their own schedule and not be tied to the release
+schedule of the mainline, nor to be blocked by mainline code reviews
+or style requirements.  It is still possible (and recommended) to obtain
+code reviews and follow style guidelines for contributed modules, as
+described below.
+
+Example app
+===========
+
+For example, consider a user who wants to use a model of the LoRaWAN
+sensor networking protocol in |ns3|.  This model is not available in
+the mainline |ns3| releases, but the user checks in the
+`App Store <https://apps.nsnam.org>`_.  Sensor networking protocols can
+be found by browsing the category *Sensor Networks* in the left-hand
+menu, upon which the LoRaWAN module is displayed.  This module is maintained
+by an external research group.  Clicking on the app icon leads to a page
+in which more details about this module are displayed, including
+*Release History*, *Installation*, and *Maintenance*.
+
+The installation tab suggests two primary ways to add a `lorawan` module
+to an |ns3| installation:
+
+1. Download a source archive from the link provided on the app store and
+   unpack it in the `contrib/` directory.
+
+2. Perform a `git clone` operation from within the |ns3| `contrib/` directory.
+
+There is a third way in general, which is to use the Bake build system
+to add or remove modules.  Most modules have a `bakeconf.xml` file
+associated with them, which can be added to the `contrib/` folder of
+Bake.  This permits bake configuration operations such as:
+
+.. code-block:: text
+
+  $ ./bake.py configure -e ns-3.34 -e lorawan-0.3.0
+  $ ./bake.py download
+  $ ./bake.py build
+
+Users will be concerned about which version of the module applies to the
+version of |ns3|.  The *Release History* tab describes the releases and
+the minimum (and, optionally, the maximum) |ns3| version that the release
+works with.
+
+Finally, information about how the module will continue to be maintained,
+and how to submit issue reports or ask questions about it, are typically
+posted in the optional *Maintenance* or *Development* tabs.
+
+App types
+*********
+
+Two types of "apps" are hosted on the app store:  1) contributed modules,
+and 2) forks of |ns3|.  It benefits users the most when contributed code
+can be added as modules to the `contrib` directory, because this allows
+the modules to be used with different versions of the |ns3| mainline
+and to combine multiple such modules.  However, some authors have chosen
+to create a full fork of |ns3|, and to publish full |ns3| source trees.
+One reason for such forks is if the fork requires intrusive changes to
+the |ns3| mainline code, in such a manner that the patch will likely not
+be accepted in the mainline.  For an example of a full fork in the
+app store, see the `Public Safety Communications <https://apps.nsnam.org/app/publicsafetylte/>`_ app page; this is a full fork because of the intrusive
+changes to the mainline LTE module necessary to support the public
+safety extensions.
+
+Sometimes a contributed module does require a very small patch to the
+mainline despite being largely implemented in a modular way.  In this
+case, the best strategy is to try to create a minimal patch to
+upstream to the mainline, and work with maintainers to incorporate it.
+Even if this is not successful or not attempted, one can maintain
+a small patch file as part of the module, and bake build instructions
+for the module can be extended to patch the mainline code as the first
+step in the build process.  Please consult the app store maintainers
+if guidance on this approach is needed.
+
+Submitting to the app store
+***************************
+
+If you are interested in adding an app to the app store, contact
+``webmaster@nsnam.org`` or one of the app store maintainers.  Before
+getting started, browse through the existing apps so that you get
+a feel for what type of information will be required.
+
+The main requirements are:
+
+1. Define a module name that will be the name of the subdirectory in the
+   `contrib` folder.  Use |ns3| naming conventions for directory names; i.e.,
+   all lower case, with separate words separated by dashes.
+
+2. Ensure that your module can be successfully cloned into the contrib folder
+   using the proposed module name, that it builds successfully, and that
+   all examples and tests run.
+
+3. Make at least one release on your GitHub or GitLab.com, associated
+   with the latest |ns3| release if possible.  To do this, you will need
+   to decide on a numbering scheme, such as 'v1.0' or '0.1', etc.
+   Consult GitHub or GitLab.com documentation on how to make a (tagged)
+   release.
+
+4. Come up with a small thumbnail icon for your app.  A general guideline
+   is a transparent PNG, size 100x100 pixels.
+
+5. Provide names and email addresses of the person(s) who should have edit
+   privileges (accounts) on the app store.
+
+After providing this information, a skeleton page will be set up on the
+app store and will be initially invisible to users who visit the front
+page.  Contributors can then log in and work with the app store
+maintainer to finalize the page, and then make it active (visible) to
+other users when ready.
+
+Code review for apps
+********************
+
+Even though apps are not added to the |ns3| mainline, it is still possible
+to request code reviews for them (in order to improve the code).  There
+is a special repository set up for this purpose:
+`ns-3-contrib-reviews <https://gitlab.com/nsnam/ns-3-contrib-reviews>`_.  The
+purpose of this repository is to provide a fork-able repository against
+which to generate Merge Requests, but no eventual merge ever takes place.
+
+The steps to request a code review are:
+
+1. Fork `ns-3-contrib-reviews` into your own namespace
+2. Clone the fork to your local machine
+3. Create a new feature branch  on what you just checked out for your new code
+4. cd to 'contrib' and clone your extension module there
+5. remove the .git directory of that module so that git does not treat it as a submodule; e.g., if your module name is `modulename`:
+
+.. code-block:: text
+
+  $ rm -rf modulename/.git
+
+6. Force an add of the module, overcoming the .gitignore file for contrib modules
+
+.. code-block:: text
+
+  $ git add -f modulename
+
+7. Add your files:
+
+.. code-block:: text
+
+  $ git commit -m"Add modulename for review" -a
+
+8.  Push the feature branch to your remote repository
+
+.. code-block:: text
+
+  $ git push -u origin
+
+9. Navigate to your github.com page and generate a Merge Request towards
+   the upstream `ns-3-contrib-reviews`
+
+10. Announce on ns-developers mailing list that you would like a review.
+
+Maintaining app store modules
+*****************************
+
+A recent `Google Summer of Code project <https://mishal.dev/gsoc19-report>`_
+worked on allowing integration of the app store with continuous integration
+(CI) testing.  This integration is ongoing, but the eventual goal is that
+regressions that are caused by upstream changes to |ns3| will be quickly
+caught, and the app owner will be asked to fix the build of their app,
+possibly by issuing another module release as well.
+
+Links to related projects
+*************************
+Some projects choose to maintain their own version of |ns3|, or maintain models
+outside of the main tree of the code.  In this case, the way to find out
+about these is to look at the Related Projects page on the |ns3| 
+`wiki <https://www.nsnam.org/wiki/Related_Projects>`_.
+
+If you know of externally maintained code that the project does not know about,
+please email ``webmaster@nsnam.org`` to request that it be added to the
+list of external projects.
+
+Going forward, we will tend to prefer to list related projects on the
+app store so that there is a single place to discover them.
+
+.. _sec-unmaintained-contributed:
+
+Unmaintained, contributed code
+******************************
+
+Anyone who wants to provide access to code that has been developed to 
+extend |ns3| but that will not be further maintained may list its
+availability on our website. Furthermore, we can provide, in some
+circumstances, storage of a compressed archive on a web server if needed.
+This type of code contribution will 
+not be listed in the app store, although popular extensions might be
+adopted by a future contributor.
+
+We ask anyone who wishes to do this to provide at least this information 
+on our wiki:
+
+* Authors,
+* Name and description of the extension,
+* How it is distributed (as a patch or full tarball),
+* Location,
+* Status (how it is maintained)
+
+Please also make clear in your code the applicable software license.
+The contribution will be stored on our `wiki <https://www.nsnam.org/wiki/Contributed_Code>`_. If you need web server 
+space for your archive, please contact ``webmaster@nsnam.org``.
+
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/doc/contributing/source/figures/README ns-3.36/doc/contributing/source/figures/README
--- ns-3.35/doc/contributing/source/figures/README	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/doc/contributing/source/figures/README	2022-04-30 18:23:57.646732600 -0700
@@ -0,0 +1,18 @@
+Please write image files in a vector graphics format, when possible, and
+generate the .png and .pdf versions on the fly (see ../Makefile).  
+
+The currently supported tool is dia.  xfig could be added similarly
+if someone wants to add it.  The main requirement for adding another format
+is that the tool to edit it is freely available and that a cron script can 
+autogenerate the pdf and png from the figure source.  Tgif (.obj) files
+were once used but the file conversions require a valid X display to 
+be running, and are therefore to be avoided since our code server 
+does not run such a server.  Tgif pdf conversions were also cumbersome.
+
+Store the .dia versions in git, but not the .png or .pdfs.  
+If the figure is not available in a vector graphics format, store both
+a .png and a .pdf version in this directory.
+
+If you add a source (.dia) file here, remember to add it to
+the list of figure sources in the Makefile in the directory above
+
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/doc/contributing/source/general.rst ns-3.36/doc/contributing/source/general.rst
--- ns-3.35/doc/contributing/source/general.rst	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/doc/contributing/source/general.rst	2022-04-30 18:23:57.646732600 -0700
@@ -0,0 +1,273 @@
+.. include:: replace.txt
+.. heading hierarchy:
+   ------------- Chapter
+   ************* Section (#.#)
+   ============= Subsection (#.#.#)
+   ############# Paragraph (no number)
+
+.. _General:
+
+General
+-------
+
+This section pertains to general topics about licensing, coding style,
+and working with Git features, including patch submission.
+
+Licensing
+*********
+All code submitted must conform to the project licensing framework, which
+is `GNU GPLv2 <https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html>`_
+compatibility. All new source files should contain a license
+statement.  In general, we ask that new source files be provided with a
+GNU GPLv2 license, but the author may select another GNU GPLv2-compatible
+license if necessary.  GNU GPLv3 is not accepted in the |ns3| mainline.
+Note that the Free Software Foundation maintains
+`a list <https://www.gnu.org/licenses/license-list.en.html#GPLCompatibleLicenses>`_ of GPLv2-compatible licenses.
+
+If a contribution is based upon or contains copied code that itself
+uses GNU GPLv2, then the author should in most cases retain the GPLv2 and
+optionally extend the copyright and/or the author (or 'Modified by')
+statements.
+
+If a contribution is borrowed from another project under different licensing,
+the borrowed code must have a compatible license, and the license must
+be copied over as well as the code.  The author may add the GNU GPLv2 if
+desired, but in such a case, should clarify which aspects of the code
+(i.e., the modifications) are covered by the GPLv2 and not found in the
+original.  The Software Freedom Law Center has published
+`guidance <http://www.softwarefreedom.org/resources/2007/gpl-non-gpl-collaboration.html>`_ on handling this case.
+
+Note that it is incumbent upon the submitter to make sure that the
+licensing attribution is correct and that the code is suitable for |ns3| 
+inclusion. Do not include code (even snippets) from sources that have
+incompatible licenses.  Even if the code licenses are compatible, do not
+copy someone else's code without attribution.
+
+Documentation Licensing
+=======================
+
+Licensing for documentation or for material found on |ns3| websites
+is covered by the `Creative Commons CC-BY-SA 4.0 <https://creativecommons.org/licenses/by-sa/4.0/>`_ license,
+and documentation submissions should be submitted under that license.
+Please ensure that any documentation submitted does not violate the
+terms of another copyright holder, and has correct attribution.  In
+particular, copying of substantial portions of an academic journal
+paper, or copying or redrawing of figures from such a paper, likely
+requires explicit permission from the copyright holder.
+
+Copyright
+*********
+
+Copyright is a statement of ownership of code, while licensing describes
+the terms by which the owners of the code permit the reuse of the code.
+
+The |ns3| project does not maintain copyright of contributed code.
+Copyright remains with the author(s) or their employer.  Because multiple
+people or organizations work on the |ns3| code over time, one can think
+of the project and even individual files as a "mixed copyright" work.
+
+Copyright can be stated when originating files in |ns3| or when making
+"substantial" changes to such files; the definition of substantial is
+open to interpretation.  Copyright need not be claimed explicitly by adding
+a copyright statement; according to copyright laws in many countries,
+copyright rights are automatic upon publishing a work.  Copyright should
+not be explicitly listed for *all* changes to a file; for instance, patches
+to fix small things or make small adjustments or improvements are not
+considered to be subjected to copyright protection.
+
+Use of copyright statements in open source projects, as a means of
+author attribution, can be controversial, because having a long list
+of copyright statements on every file impairs readability.  Also,
+since copyright is automatic, there is little formal legal requirement
+to add a copyright statement.  The |ns3| project has decided to follow
+the guidance provided by the Software Freedom Law Center in this regard:
+https://softwarefreedom.org/resources/2012/ManagingCopyrightInformation.html
+
+Copyright on new files
+======================
+
+When originating a new file, the originating author should place his or her
+copyright statement at the top in the header, preceding the copy of the
+license.  An important exception to this is if the new file is copied from
+somewhere else and modified to make the new file; please do not delete
+the previous copyrights from the copyright file!  See below for this case.
+
+An example placement of a copyright statement can be found in the file
+``src/network/model/packet.h``::
+
+  /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+  /*
+   * Copyright (c) 2005,2006 INRIA
+   *
+   * This program is free software; you can redistribute it and/or modify
+   * it under the terms of the GNU General Public License version 2 as
+   * published by the Free Software Foundation;
+
+Copyright on existing files
+===========================
+
+When providing a substantial feature (maintainers and contributors should
+mutually agree on this point) as a patch to an existing file, the
+contributor may add a copyright statement that clarifies the new portion
+of code that is covered by the new copyright.  An example is the program
+``src/lte/model/lte-ue-phy.h``::
+
+  /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+  /*
+   * Copyright (c) 2010 TELEMATICS LAB, DEE - Politecnico di Bari
+   * Copyright (c) 2018 Fraunhofer ESK : RLF extensions
+   *
+   * This program is free software; you can redistribute it and/or modify
+   * it under the terms of the GNU General Public License version 2 as
+   * published by the Free Software Foundation;
+
+Here, Fraunhofer ESK added extensions to support radio link failure (RLF),
+and the copyright statement clarifies the extension (separated from the
+organization by a colon).
+
+Copyright on external code copied from elsewhere
+================================================
+
+If a contributor borrows code from somewhere else (such as a snippet of
+code to implement an algorithm, or whole files altogether), it is important
+to keep the original copyright (and license statement) in the new file.
+Contributors who fail to do this may be accused of plagiarism.
+
+Some existing examples of code copied from elsewhere are:
+
+* ``src/network/utils/error-model.h``
+* ``src/core/model/valgrind.h``
+* ``src/core/model/math.h``
+
+If in doubt about how to handle a specific case, ask a maintainer.
+
+Attribution
+***********
+Besides copyright, authors also often seek to list attribution, or
+even credit for funding, in the headers.  We request that contributors
+refrain from aggressively inserting statements of attribution into the
+code such as:
+
+::
+
+  // New Hello Timer implementation contributed by John Doe, 2014
+
+especially for small touches to files, because, over time, it clutters
+the code.  Git logs are used to track who contributed what over time.
+
+Likewise, if someone contributes a minor enhancement or a bug fix to
+an existing file, this is not typically justification to insert an
+``Authored by`` or ``Copyright`` statement at the top of the file.  If
+everyone who touched a file did this, we would end up with unwieldy
+lists of authors on many files.  In general, we recommend to follow
+these guidelines:
+
+* if you are authoring a new file or contributing a substantial portion
+  of code (such as 30% or more new or changed statements), you can
+  list yourself as co-author or add a new copyright to the file header
+* if you are modifying less than the above, please refrain from adding
+  copyright or author statements as part of your patch
+* do not put your name or your organization's name anywhere in the
+  main body of the code, for attribution purposes
+
+An example of a substantial modification that led to extension of
+the authors section of the header can be found in 
+``src/lte/model/lte-ue-phy.h``::
+
+   * Author: Giuseppe Piro  <g.piro@poliba.it>
+   * Author: Marco Miozzo <mmiozzo@cttc.es>
+   * Modified by:
+   *          Vignesh Babu <ns3-dev@esk.fraunhofer.de> (RLF extensions)
+   */
+
+Here, there were two original authors, and then a third added a substantial
+new feature (RLF extensions).
+
+Please work with maintainers to balance the competing concerns of
+obtaining proper attribution and avoiding long headers.
+
+Coding style
+************
+We ask that all contributors make their code conform to the 
+coding standard which is outlined in :ref:`Coding style`.
+
+The project maintains a Python program called ``check-style.py`` found in
+the ``utils/`` directory.  This is a wrapper around the ``uncrustify``
+utility with configuration set to the conventions used by |ns3|, and
+can be used to quickly format new source code files proposed for the
+mainline. 
+
+Creating a patch
+****************
+Patches are preferably submitted as a GitLab.com
+`Merge Request <https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html>`_.
+Short patches can be attached to an issue report or sent to the mailing-lists,
+but a Merge Request is the best way to submit.
+
+The UNIX diff tool is the most common way of producing a patch: a patch is 
+a text-based representation of the difference between two text files or two 
+directories with text files in them. If you have two files, 
+``original.cc``, and, ``modified.cc``, you can generate a patch with the 
+command ``diff -u original.cc modified.cc``. If you wish to produce a patch 
+between two directories, use the command ``diff -uprN original modified``.
+
+Make sure you specify to the reviewer where the original files came from 
+and make sure that the resulting patch file does not contain unexpected 
+content by performing a final inspection of the patch file yourself.
+
+Patches such as this are sufficient for simple bug fixes or very simple 
+small features.
+
+Git can be used to create a patch of what parts differ from the last 
+committed code; try::
+
+  $ git diff
+
+The output of `git diff` can be redirected into a patch file:
+
+::
+
+  $ git diff > proposal.patch
+
+Keep in mind that `git diff` could include unrelated changes made locally to
+files in the repository (a common example is `.vscode/launch.json`). In order
+to avoid cluttering, please amend your diff file using a normal text editor
+before submitting it.
+
+Likewise, if you submit a merge request using GitLab, please add only the
+changes to the relevant files to the branch you're using for the merge request.
+
+Maintainers
+***********
+Maintainers are the set of people who make decisions on code and documentation
+changes.  Maintainers are contributors who have demonstrated, over time,
+knowledge and good judgment as pertains to contributions to |ns3|, and who
+have expressed willingness to maintain some code.  |ns3| is like other 
+open source projects in terms of how people gradually become maintainers
+as their involvement with the project deepens; maintainers are not newcomers
+to the project.
+
+The list of maintainers for each module is found here:
+https://www.nsnam.org/developers/maintainers/
+
+Maintainers review code (bug fixes, new models) within scope of their 
+maintenance responsibility.  A maintainer of a module should "sign off"
+(or approve of) changes to an |ns3| module before it is committed to
+the main codebase.  Note that we typically do not formalize the signing
+off using Git's sign off feature, but instead, maintainers will indicate
+their approval of the merge request using GitLab.com.
+
+Note that some modules do not have active maintainers; these types of 
+modules typically receive less maintenance attention than those with
+active maintainers (and bugs may linger unattended).
+
+The best way to become a maintainer is to start by submitting patches
+that fix open bugs or otherwise improve some part of the simulator, and
+to join in on the technical discussions.
+People who submit quality patches will catch the attention of the maintainers
+and may be asked to become one at some future date.
+
+People who ask to upstream a new module or model so that it is part of the
+main |ns3| distribution will typically be asked to maintain it going forward
+(or to find new maintainers for it).
+
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/doc/contributing/source/index.rst ns-3.36/doc/contributing/source/index.rst
--- ns-3.35/doc/contributing/source/index.rst	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/doc/contributing/source/index.rst	2022-04-30 18:23:57.646732600 -0700
@@ -0,0 +1,25 @@
+.. only:: html or latex
+
+Contributing to ns-3
+====================
+
+This is the guide to *Contributing to ns-3*. Primary documentation for the ns-3 project is available in several forms:
+
+* `ns-3 Doxygen <http://www.nsnam.org/doxygen/index.html>`_: Documentation of the public APIs of the simulator
+* Tutorial for the `latest release <http://www.nsnam.org/documentation/latest/>`_ and `development tree <http://www.nsnam.org/ns-3-dev/documentation/>`_
+* Contributing to ns-3 (this document)
+* Manual, and Model Library for the `latest release <http://www.nsnam.org/documentation/latest/>`_ and `development tree <http://www.nsnam.org/ns-3-dev/documentation/>`_
+* `ns-3 wiki <http://www.nsnam.org/wiki/Main_Page>`_
+
+This document is written in `reStructuredText <http://docutils.sourceforge.net/rst.html>`_ for `Sphinx <http://sphinx.pocoo.org/>`_ and is maintained in the
+``doc/contributing`` directory of ns-3's source code.
+
+.. toctree::
+   :maxdepth: 2
+
+   introduction
+   general
+   enhancements
+   models
+   external
+   coding-style
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/doc/contributing/source/introduction.rst ns-3.36/doc/contributing/source/introduction.rst
--- ns-3.35/doc/contributing/source/introduction.rst	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/doc/contributing/source/introduction.rst	2022-04-30 18:23:57.646732600 -0700
@@ -0,0 +1,81 @@
+.. include:: replace.txt
+.. heading hierarchy:
+   ------------- Chapter
+   ************* Section (#.#)
+   ============= Subsection (#.#.#)
+   ############# Paragraph (no number)
+
+.. _Introduction:
+
+Introduction
+------------
+
+This document is a guide for those who wish to contribute code to |ns3|
+or its related projects in some way.
+
+Changes to |ns3| software are made by
+or reviewed by *maintainers*.  |ns3| has a small core team of maintainers,
+and also some specialized maintainers who maintain a portion of the software.
+The source code branch that is centrally maintained is sometimes
+called the *mainline*, a term used further herein.
+End users are encouraged to report issues and bugs, or to propose
+software or documentation modifications, to be reviewed by and handled by
+maintainers.  End users can also help by reviewing code
+proposals made by others.  Some end users who contribute high quality
+patches or code reviews over time may ask or be invited to become 
+a maintainer of software within their areas of expertise.  Finally, some
+end users wish to disseminate their |ns3| work to the community, through
+the addition of new features or modules to |ns3|.
+
+A question often asked by newcomers is "How can I contribute to |ns3|?" 
+or "How do I get started?".
+This document summarizes the various ways and processes used to contribute
+to |ns3|.  Contribution by users is essential for a project maintained
+largely by volunteers.  However, one of the most scarce resources on
+an open source project is the available time of maintainers, so we ask
+contributors to please become familiar with conventions and processes
+used by |ns3| so as to smooth the contribution process.
+
+The very first step is to become familiar with |ns3| by reading the tutorial,
+running some example programs, and then reading some of the code and 
+documentation to get a feel for things.  From that point, there are a 
+number of options to contribute:
+
+* Contributing a small documentation correction
+* Reporting or discussing a bug in the software
+* Fixing an already reported bug by submitting a patch
+* Reviewing code contributed by others
+* Submitting new code for inclusion in the mainline
+* Alerting users to code that is maintained or archived elsewhere
+* Submitting a module or fork for publishing in the ns-3 app store
+* Becoming a maintainer of part of the simulator
+
+|ns3| is mainly a C++ project, and this contribution guide focuses on
+how to contribute |ns3| code specifically, but the overall open source
+project maintains various related codebases written in several other
+languages, so if you are interested in contributing outside of |ns3|
+C++ code, there are several possibilities: 
+
+* |ns3| provides Python bindings to most of its API, and maintains an
+  automated API scanning process that relies on other tools.  We can use
+  maintenance help in the C++/Python bindings support.
+* Another Python project is the `bake build tool <https://gitlab.com/nsnam/bake/-/issues>`_, which has a number of open issues.
+* See also our Python-based `PyViz visualizer <https://www.nsnam.org/wiki/PyViz>`_; extensions and documentation would be welcome.
+* The `NetAnim <https://gitlab.com/nsnam/netanim>`_ animator is written in `Qt <https://www.qt.io/>`_ and has lacked a maintainer for several years.
+* If you are interested in Linux kernel hacking, or use of applications in |ns3| such as open source routing daemons, we maintain the
+  `Direct Code Execution project <https://www.nsnam.org/docs/dce/manual/html/index.html>`_.
+* If you are familiar with `Django <https://www.djangoproject.com/>`_, we have work to do on `our app store infrastructure <https://gitlab.com/nsnam/ns-3-AppStore>`_. 
+* Our `website <https://gitlab.com/nsnam/nsnam-web>`_ is written in `Jekyll <https://jekyllrb.com/>`_ and is in need of more work.
+
+The remainder of this document is organized as follows.
+
+* Chapter 2 covers general issues surrounding code and documentation
+  contributions, including license and copyright;
+* Chapter 3 describes approaches for contributing small enhancements to
+  the |ns3| mainline, such as a documentation or bug fix;
+* Chapter 4 outlines the approach for proposing new models for the mainline;
+* Chapter 5 describes how to contribute code that will be stored outside
+  of the |ns3| mainline, with emphasis on the |ns3| *AppStore*; and
+* Chapter 6 provides the coding style guidelines that are mandatory for the
+  |ns3| mainline and strongly suggested for contributed modules.
+
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/doc/contributing/source/models.rst ns-3.36/doc/contributing/source/models.rst
--- ns-3.35/doc/contributing/source/models.rst	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/doc/contributing/source/models.rst	2022-04-30 18:23:57.646732600 -0700
@@ -0,0 +1,271 @@
+.. include:: replace.txt
+.. heading hierarchy:
+   ------------- Chapter
+   ************* Section (#.#)
+   ============= Subsection (#.#.#)
+   ############# Paragraph (no number)
+
+.. _Models:
+
+Submitting new models
+---------------------
+
+We actively encourage submission of new features to |ns3|. 
+Independent submissions are essential for open source projects, and if
+accepted into the mainline, you will also be credited as an author of
+future versions of |ns3|. However, 
+please keep in mind that there is already a large burden on the |ns3|
+maintainers to manage the flow of incoming contributions and maintain new 
+and existing code. The goal of this chapter is to outline the options for
+new models in |ns3|, and how you can help to minimize the burden on maintainers
+and thus minimize the average time-to-merge of your code.
+
+Options for new models
+**********************
+
+|ns3| is organized into modules, each of which is compiled and linked into
+a separate library.  Users can selectively enable and disable the inclusion
+of modules (via the `--enable-modules` argument to ns3 configure, or via
+the selective inclusion of contributed modules).
+
+When proposing new models to |ns3|, please keep in mind that not all models
+will be accepted into the mainline.  However, we aim to provide at least
+one or more options for any code contribution.
+
+Because of the long-term maintenance burden, |ns3| is no longer accepting
+all new proposals into the mainline.  Features that are of general
+interest are more likely to be approved for the mainline, but features that
+are more specialized may be recommended for the `ns-3 App Store <https://apps.nsnam.org>`_.  Some modules that have been in the mainline for a long time, but
+fall out of use (or lose their maintainers) may also be moved out of the
+mainline into the App Store in the future.
+
+The options for publishing new models are:
+
+1. Propose a Merge Request for the |ns3| mainline and follow the guidelines below.
+
+2. Organize your code as a "contributed module" or modules and maintain them in 
+   your own public Git repository.  A page on the App Store can be made to
+   advertise this to users, and other tooling can be used to ensure that the
+   module stays compatible with the mainline.
+
+3. Organize your code as a "public fork" that evolves separately from the
+   |ns3| mainline.  This option is sometimes chosen for models that require
+   significant intrusive changes to the |ns3| mainline to support.  Some
+   recent examples include the Public Safety models and the millimeter-wave
+   extensions to |ns3|.  This has the benefit of being self-contained, but
+   the drawback of losing compatibility with the mainline over time.  A page
+   on the App Store can be made for these forks as well.  For maintenance
+   reasons and improved user experience, we prefer to upstream mainline
+   changes so that public forks can be avoided.
+
+4. Archive your code somewhere, or publish in a Git repository, and link to
+   it from the |ns3| `Contributed Code <https://www.nsnam.org/wiki/Contributed_Code>`_ 
+   wiki page.  This option requires the least amount of work from the
+   contributor, but visibility of the code to new |ns3| users will likely be
+   reduced.  To follow this route, obtain a wiki account from the webmaster,
+   and make edits as appropriate to link your code.
+
+The remainder of the chapter concerns option 1 (upstreaming to ns-3-dev); the
+other options are described in the next chapter (:ref:`External`).
+
+Upstreaming new models
+**********************
+The term "upstreaming" refers to the process whereby new code is 
+contributed back to an upstream source (the main open source project)
+whereby that project takes responsibility for further enhancement and
+maintenance.
+
+Making sure that each code submission fulfills as many items 
+as possible in the following checklist is the best way to ensure quick 
+merging of your code.
+
+In brief, we can summarize the guidelines as follows:
+
+1.  Be licensed appropriately (see :ref:`General`)
+2.  Understand how and why |ns3| conducts code reviews before merging
+3.  Follow the ns-3 coding style (:ref:`Coding style`) and software
+    engineering and consistency feedback that maintainers may provide
+4.  Write associated documentation, tests, and example programs
+
+If you do not have the time to follow through the process to include your 
+code in the main tree, please see the next chapter (:ref:`External`)
+about contributing ns-3 code that is not maintained in the main tree.
+
+The process can take a long time when submissions are large or when
+contributors skip some of these steps.  Therefore, best results are found 
+when the following guidelines are followed:
+
+* Ask for review of small chunks of code, rather than large patches.  Split
+  large submissions into several more manageable pieces.
+* Make sure that the code follows the guidelines (coding style,
+  documentation, tests, examples) or you may be asked to fix these
+  things before maintainers look at it again.
+
+Code reviews
+************
+
+Code submissions to ns-3-dev are expected to go through a review process
+where one or more maintainers comment on the code.  The basic purpose of the
+code reviews is to ensure the long-term maintenance and overall system
+integrity of ns-3.  Contributors may be asked
+to revise their code or rewrite portions during this process. New features are
+also typically only merged during the early stages of a new release cycle,
+to avoid destabilizing code before release.
+
+|ns3| code reviews are conducted using GitLab.com merge requests, possibly
+supported by discussion on the ns-developers mailing list for reviews that
+involve code that cuts across maintainer boundaries or is otherwise
+controversial.  Many examples of ongoing reviews can be browsed on
+our `GitLab.com site <https://gitlab.com/nsnam/ns-3-dev/-/merge_requests>`_.
+
+Submission structure
+********************
+
+For each code submission, include a description of what your code is doing,
+and why. Ideally, you should be able to provide a summary description in a
+short paragraph at the top of the Merge Request.  If you want to flag
+to maintainers that your submission is known to be incomplete (e.g., you
+are looking for early feedback), preface the title of the Merge Request
+with ``Draft:``.
+
+Coherent and multi-part submissions
+===================================
+
+Large code submissions should be split into smaller submissions where possible.
+The likelihood of getting maintainers to review your submission is inversely
+proportional to its size, because large code reviews require a large block
+of time for a maintainer.  For instance, if you are submitting two
+routing protocol models and each protocol model can stand on its own,
+submit two Merge Requests rather than a single one containing both models.
+
+Each submission should be a coherent whole: if you need to edit ten files to
+get a feature to work, then, the submission should contain all the changes
+for these ten files.  Of course, if you can split the feature in sub-features,
+then, you should do it to decrease the size of the submission as per the
+previous paragraph.
+
+For example, if you have made changes to optimize one module, and in the
+course of doing so, you fixed a bug in another module, make sure you separate
+these two sets of changes in two separate submissions.
+
+When splitting a large submission into seprate submissions, (ideally) these
+submissions should be prefaced (in the Merge Request description) by a
+detailed explanation of the overall plan
+such that code reviewers can review each submission separately but within a
+larger context. This kind of submission typically is split in multiple dependent
+steps where each step depends on the previous one. If this is the case,
+make it very clear in your initial explanation. If you can, minimize
+dependencies between each step such that reviewers can merge each step
+separately without having to consider the impact of merging one submission
+on other submissions.
+
+History rewriting
+=================
+
+It is good practice to rebase your feature branch onto the tip of the
+(evolving) ns-3-dev, so that the commits appear on top of a recent commit
+of ns-3-dev.  For instance, you may have started with an initial Merge
+Request, and it has been some time to gather feedback from maintainers,
+and now you want to update your Merge Request with that feedback.  A
+rebase onto the current ns-3-dev ``master`` branch is good practice
+for any Merge Request update.
+
+In addition, in the course of your development, and in responding to
+reviewer comments, the git commit log will accumulate lots of small
+commits that are not helpful to future maintainers:  they make it more painful
+to use the annotate and bisect commands.  For this reason, it is good
+practice to "squash" and "rebase" commits into coherent groups.  For example,
+assume that the commit history, after you have responded to a reviewer's
+comment, looks like this:
+
+::
+
+  commit 4938c01400fb961c37716c3f415f47ba2b04ab5f (HEAD -> master, origin/master, origin/HEAD)
+  Author: Some Contributor <some.contributor@example.com>
+  Date:   Mon Jun 15 11:19:49 2020 -0700
+
+    Fix typo in Doxygen based on code review comment
+
+  commit 915cf65cb8f464d9398ddd8bea9af167ced64663
+  Author: Some Contributor <some.contributor@example.com>
+  Date:   Thu Jun 11 16:44:46 2020 -0400
+
+    Add documentation, tests, and examples for clever protocol
+
+  commit a1d51db126fb3d1c7c76427473f02ee792fdfd53
+  Author: Some Contributor <some.contributor@example.com>
+  Date:   Thu Jun 11 16:35:48 2020 -0400
+
+    Add new models for clever protocol
+
+In the above case, it will be helpful to squash the top commit about the
+typo into the first commit where the Doxygen was first written, leaving
+you again with two commits.  `Git interactive rebase <https://git-scm.com/book/en/v2/Git-Tools-Rewriting-History>`_ is a good tool for this;
+ask a maintainer for help in doing this if you need some help to learn
+this process.
+
+Documentation, tests, and examples
+**********************************
+
+Often we have observed that contributors will provide nice new classes
+implementing a new model, but will fail to include supporting test code,
+example scripts, and documentation. Therefore, we ask people submitting the
+code (who are in the best position to do this type of work) to provide
+documentation, test code, and example scripts.
+
+Note that you may want to go through multiple phases of code reviews, and
+all of this supporting material may not be needed at the first stage (e.g.
+when you want some feedback on public API header declarations only, before 
+starting the implementation). However, when it times come to merge your code,
+you should be prepared to provide these things, as fits your contribution
+(maintainers will provide some guidance here).
+
+Including examples
+==================
+For many submissions, it will be important to include at least one example that exercises the new code, so the reviewer understands how it is intended to be used. For final submission, please consider to add as many examples as you can that will help new users of your code. The <tt>samples/</tt> and <tt>examples/</tt> directories are places for these files.
+
+Tests
+=====
+
+All new models should include automated tests.  These should, where
+appropriate, be unit tests of model correctness, validation tests of
+stochastic behavior, and overall system tests if the model's interaction with
+other components must be tested.  The test code should try to cover as much
+model code as possible, and should be checked as much as possible by
+regression tests.
+
+The ns-3 manual provides documentation and suggestions for
+`how to write tests <https://www.nsnam.org/docs//manual/html/how-to-write-tests.html>`_.
+
+Documentation
+=============
+
+If you add a new features, or make changes to existing features, you need to
+update existing or write new documentation and example code. Consider the
+following checklist:
+
+* Doxygen should be added to header files for all public classes and methods, and should be checked for Doxygen errors
+* new features should be described in the ``RELEASE_NOTES.md``
+* public API changes (if any) must be documented in ``CHANGES.html``
+* new API or changes to existing API must update the inline doxygen documentation in header files
+* consider updating or adding a new section to the manual (``doc/manual``) or
+  model library (``doc/models``) as appropriate
+* update the ``AUTHORS`` file for any new authors
+
+Module dependencies
+===================
+
+Since |ns3| is a modular system, each module has (typically) dependencies on
+other modules. These must be kept to the minimum necessary, and circular
+dependencies must be avoided (they will generate errors).
+As an example, the ``lr-wpan`` module depends on ``core``, ``network``,
+``mobility``, ``spectrum``, and ``propagation``. Tests for your new module
+must not add any other dependency (that was not needed for the model or
+helper code itself), but examples can use other modules because their module
+dependencies are handled independently. As an example, the ``lr-wpan`` examples
+also use the ``stats`` module.
+
+This rule might pose limitations to the authoring of tests. In such a case,
+ask a maintainer for suggestions, or check existing tests to find solutions.
+Sometimes tests that involve adding additional dependencies are placed into
+the ``src/test`` subdirectory.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/doc/contributing/source/replace.txt ns-3.36/doc/contributing/source/replace.txt
--- ns-3.35/doc/contributing/source/replace.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/doc/contributing/source/replace.txt	2022-04-30 18:23:57.646732600 -0700
@@ -0,0 +1,5 @@
+.. |ns3| replace:: *ns-3*
+
+.. |ns2| replace:: *ns-2*
+
+.. |check| replace:: :math:`\checkmark`
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/doc/doxygen.conf ns-3.36/doc/doxygen.conf
--- ns-3.35/doc/doxygen.conf	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/doc/doxygen.conf	2022-04-30 18:23:57.646732600 -0700
@@ -1,6 +1,6 @@
 ## -*- Mode:sh; indent-tabs-mode:nil -*-
 
-# Doxyfile 1.8.20
+# Doxyfile 1.9.3
 
 # This file describes the settings to be used by the documentation system
 # doxygen (www.doxygen.org) for a project.
@@ -34,13 +34,13 @@
 # title of most generated pages and in a few other places.
 # The default value is: My Project.
 
-PROJECT_NAME           = "ns-3"
+PROJECT_NAME           = ns-3
 
 # The PROJECT_NUMBER tag can be used to enter a project or revision number. This
 # could be handy for archiving the generated documentation or if some version
 # control system is used.
 
-PROJECT_NUMBER         = "3-dev"
+PROJECT_NUMBER         = 3-dev
 
 # Using the PROJECT_BRIEF tag one can provide an optional one line description
 # for a project that appears at the top of each page and should give viewer a
@@ -95,14 +95,6 @@
 
 OUTPUT_LANGUAGE        = English
 
-# The OUTPUT_TEXT_DIRECTION tag is used to specify the direction in which all
-# documentation generated by doxygen is written. Doxygen will use this
-# information to generate all generated output in the proper direction.
-# Possible values are: None, LTR, RTL and Context.
-# The default value is: None.
-
-OUTPUT_TEXT_DIRECTION  = None
-
 # If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member
 # descriptions after the members that are listed in the file and class
 # documentation (similar to Javadoc). Set to NO to disable this.
@@ -250,16 +242,16 @@
 # the documentation. An alias has the form:
 # name=value
 # For example adding
-# "sideeffect=@par Side Effects:\n"
+# "sideeffect=@par Side Effects:^^"
 # will allow you to put the command \sideeffect (or @sideeffect) in the
 # documentation, which will result in a user-defined paragraph with heading
-# "Side Effects:". You can put \n's in the value part of an alias to insert
-# newlines (in the resulting output). You can put ^^ in the value part of an
-# alias to insert a newline as if a physical newline was in the original file.
-# When you need a literal { or } or , in the value part of an alias you have to
-# escape them by means of a backslash (\), this can lead to conflicts with the
-# commands \{ and \} for these it is advised to use the version @{ and @} or use
-# a double escape (\\{ and \\})
+# "Side Effects:". Note that you cannot put \n's in the value part of an alias
+# to insert newlines (in the resulting output). You can put ^^ in the value part
+# of an alias to insert a newline as if a physical newline was in the original
+# file. When you need a literal { or } or , in the value part of an alias you
+# have to escape them by means of a backslash (\), this can lead to conflicts
+# with the commands \{ and \} for these it is advised to use the version @{ and
+# @} or use a double escape (\\{ and \\})
 
 ## Link to bug tracker
 ## Set off \internal docs
@@ -323,8 +315,8 @@
 # extension. Doxygen has a built-in mapping, but you can override or extend it
 # using this tag. The format is ext=language, where ext is a file extension, and
 # language is one of the parsers supported by doxygen: IDL, Java, JavaScript,
-# Csharp (C#), C, C++, D, PHP, md (Markdown), Objective-C, Python, Slice, VHDL,
-# Fortran (fixed format Fortran: FortranFixed, free formatted Fortran:
+# Csharp (C#), C, C++, Lex, D, PHP, md (Markdown), Objective-C, Python, Slice,
+# VHDL, Fortran (fixed format Fortran: FortranFixed, free formatted Fortran:
 # FortranFree, unknown formatted Fortran: Fortran. In the later case the parser
 # tries to guess whether the code is fixed or free formatted code, this is the
 # default for Fortran type files). For instance to make doxygen treat .inc files
@@ -334,7 +326,10 @@
 # Note: For files without extension you can use no_extension as a placeholder.
 #
 # Note that for custom extensions you also need to set FILE_PATTERNS otherwise
-# the files are not read by doxygen.
+# the files are not read by doxygen. When specifying no_extension you should add
+# * to the FILE_PATTERNS.
+#
+# Note see also the list of default file extension mappings.
 
 EXTENSION_MAPPING      = no_extension=C++
 
@@ -466,7 +461,7 @@
 # the optimal cache size from a speed point of view.
 # Minimum value: 0, maximum value: 9, default value: 0.
 
-LOOKUP_CACHE_SIZE      = 1
+LOOKUP_CACHE_SIZE      = 2
 
 # The NUM_PROC_THREADS specifies the number threads doxygen is allowed to use
 # during processing. When set to 0 doxygen will based this on the number of
@@ -474,7 +469,7 @@
 # than 0 to get more control over the balance between CPU load and processing
 # speed. At this moment only the input processing can be done using multiple
 # threads. Since this is still an experimental feature the default is set to 1,
-# which efficively disables parallel processing. Please report any issues you
+# which effectively disables parallel processing. Please report any issues you
 # encounter. Generating dot graphs in parallel is controlled by the
 # DOT_NUM_THREADS setting.
 # Minimum value: 0, maximum value: 32, default value: 1.
@@ -544,6 +539,13 @@
 
 EXTRACT_ANON_NSPACES   = YES
 
+# If this flag is set to YES, the name of an unnamed parameter in a declaration
+# will be determined by the corresponding definition. By default unnamed
+# parameters remain unnamed in the output.
+# The default value is: YES.
+
+RESOLVE_UNNAMED_PARAMS = YES
+
 # If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
 # undocumented members inside documented classes or files. If set to NO these
 # members will be included in the various overviews, but no documentation
@@ -581,11 +583,18 @@
 
 INTERNAL_DOCS          = YES
 
-# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file
-# names in lower-case letters. If set to YES, upper-case letters are also
-# allowed. This is useful if you have classes or files whose names only differ
-# in case and if your file system supports case sensitive file names. Windows
-# (including Cygwin) and Mac users are advised to set this option to NO.
+# With the correct setting of option CASE_SENSE_NAMES doxygen will better be
+# able to match the capabilities of the underlying filesystem. In case the
+# filesystem is case sensitive (i.e. it supports files in the same directory
+# whose names only differ in casing), the option must be set to YES to properly
+# deal with such files in case they appear in the input. For filesystems that
+# are not case sensitive the option should be be set to NO to properly deal with
+# output files written for symbols that only differ in casing, such as for two
+# classes, one named CLASS and the other named Class, and to also support
+# references to files without having to specify the exact matching casing. On
+# Windows (including Cygwin) and MacOS, users should typically set this option
+# to NO, whereas on Linux or other Unix flavors it should typically be set to
+# YES.
 # The default value is: system dependent.
 
 CASE_SENSE_NAMES       = NO
@@ -604,6 +613,12 @@
 
 HIDE_COMPOUND_REFERENCE= NO
 
+# If the SHOW_HEADERFILE tag is set to YES then the documentation for a class
+# will show which file needs to be included to use the class.
+# The default value is: YES.
+
+SHOW_HEADERFILE        = YES
+
 # If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
 # the files that are included by a file in the documentation of that file.
 # The default value is: YES.
@@ -761,7 +776,8 @@
 # output files in an output format independent way. To create the layout file
 # that represents doxygen's defaults, run doxygen with the -l option. You can
 # optionally specify a file name after the option, if omitted DoxygenLayout.xml
-# will be used as the name of the layout file.
+# will be used as the name of the layout file. See also section "Changing the
+# layout of pages" for information.
 #
 # Note that if you run doxygen from a directory containing a file called
 # DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
@@ -807,24 +823,35 @@
 WARN_IF_UNDOCUMENTED   = YES
 
 # If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
-# potential errors in the documentation, such as not documenting some parameters
-# in a documented function, or documenting parameters that don't exist or using
-# markup commands wrongly.
+# potential errors in the documentation, such as documenting some parameters in
+# a documented function twice, or documenting parameters that don't exist or
+# using markup commands wrongly.
 # The default value is: YES.
 
 WARN_IF_DOC_ERROR      = YES
 
+# If WARN_IF_INCOMPLETE_DOC is set to YES, doxygen will warn about incomplete
+# function parameter documentation. If set to NO, doxygen will accept that some
+# parameters have no documentation without warning.
+# The default value is: YES.
+
+WARN_IF_INCOMPLETE_DOC = YES
+
 # This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
 # are documented, but have no documentation for their parameters or return
-# value. If set to NO, doxygen will only warn about wrong or incomplete
-# parameter documentation, but not about the absence of documentation. If
-# EXTRACT_ALL is set to YES then this flag will automatically be disabled.
+# value. If set to NO, doxygen will only warn about wrong parameter
+# documentation, but not about the absence of documentation. If EXTRACT_ALL is
+# set to YES then this flag will automatically be disabled. See also
+# WARN_IF_INCOMPLETE_DOC
 # The default value is: NO.
 
 WARN_NO_PARAMDOC       = YES
 
 # If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when
-# a warning is encountered.
+# a warning is encountered. If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS
+# then doxygen will continue running as if WARN_AS_ERROR tag is set to NO, but
+# at the end of the doxygen process doxygen will return with a non-zero status.
+# Possible values are: NO, YES and FAIL_ON_WARNINGS.
 # The default value is: NO.
 
 WARN_AS_ERROR          = NO
@@ -841,7 +868,10 @@
 
 # The WARN_LOGFILE tag can be used to specify a file to which warning and error
 # messages should be written. If left blank the output is written to standard
-# error (stderr).
+# error (stderr). In case the file specified cannot be opened for writing the
+# warning and error messages are written to standard error. When as file - is
+# specified the warning and error messages are written to standard output
+# (stdout).
 
 WARN_LOGFILE           = doc/doxygen.log
 
@@ -867,8 +897,8 @@
 # This tag can be used to specify the character encoding of the source files
 # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
 # libiconv (or the iconv built into libc) for the transcoding. See the libiconv
-# documentation (see: https://www.gnu.org/software/libiconv/) for the list of
-# possible encodings.
+# documentation (see:
+# https://www.gnu.org/software/libiconv/) for the list of possible encodings.
 # The default value is: UTF-8.
 
 INPUT_ENCODING         = UTF-8
@@ -881,12 +911,14 @@
 # need to set EXTENSION_MAPPING for the extension otherwise the files are not
 # read by doxygen.
 #
+# Note the list of default checked file patterns might differ from the list of
+# default file extension mappings.
+#
 # If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp,
 # *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h,
-# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc,
-# *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C comment),
-# *.doc (to be provided as doxygen C comment), *.txt (to be provided as doxygen
-# C comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f18, *.f, *.for, *.vhd,
+# *.hh, *.hxx, *.hpp, *.h++, *.l, *.cs, *.d, *.php, *.php4, *.php5, *.phtml,
+# *.inc, *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C
+# comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f18, *.f, *.for, *.vhd,
 # *.vhdl, *.ucf, *.qsf and *.ice.
 
 FILE_PATTERNS          = *.c \
@@ -931,7 +963,7 @@
 # (namespaces, classes, functions, etc.) that should be excluded from the
 # output. The symbol name can be a fully qualified name, a word, or if the
 # wildcard * is used, a substring. Examples: ANamespace, AClass,
-# AClass::ANamespace, ANamespace::*Test
+# ANamespace::AClass, ANamespace::*Test
 #
 # Note that the wildcards are matched against the file with absolute path, so to
 # exclude all test directories use the pattern */test/*
@@ -1127,13 +1159,6 @@
 
 ALPHABETICAL_INDEX     = YES
 
-# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
-# which the alphabetical index list will be split.
-# Minimum value: 1, maximum value: 20, default value: 5.
-# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
-
-COLS_IN_ALPHA_INDEX    = 3
-
 # In case all classes in a project start with a common prefix, all classes will
 # be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
 # can be used to specify a prefix (or a list of prefixes) that should be ignored
@@ -1239,7 +1264,7 @@
 
 # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
 # will adjust the colors in the style sheet and background images according to
-# this color. Hue is specified as an angle on a colorwheel, see
+# this color. Hue is specified as an angle on a color-wheel, see
 # https://en.wikipedia.org/wiki/Hue for more information. For instance the value
 # 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
 # purple, and 360 is red again.
@@ -1249,7 +1274,7 @@
 HTML_COLORSTYLE_HUE    = 0
 
 # The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
-# in the HTML output. For a value of 0 the output will use grayscales only. A
+# in the HTML output. For a value of 0 the output will use gray-scales only. A
 # value of 255 will produce the most vivid colors.
 # Minimum value: 0, maximum value: 255, default value: 100.
 # This tag requires that the tag GENERATE_HTML is set to YES.
@@ -1310,10 +1335,11 @@
 
 # If the GENERATE_DOCSET tag is set to YES, additional index files will be
 # generated that can be used as input for Apple's Xcode 3 integrated development
-# environment (see: https://developer.apple.com/xcode/), introduced with OSX
-# 10.5 (Leopard). To create a documentation set, doxygen will generate a
-# Makefile in the HTML output directory. Running make will produce the docset in
-# that directory and running make install will install the docset in
+# environment (see:
+# https://developer.apple.com/xcode/), introduced with OSX 10.5 (Leopard). To
+# create a documentation set, doxygen will generate a Makefile in the HTML
+# output directory. Running make will produce the docset in that directory and
+# running make install will install the docset in
 # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
 # startup. See https://developer.apple.com/library/archive/featuredarticles/Doxy
 # genXcode/_index.html for more information.
@@ -1330,6 +1356,13 @@
 
 DOCSET_FEEDNAME        = "Doxygen generated docs"
 
+# This tag determines the URL of the docset feed. A documentation feed provides
+# an umbrella under which multiple documentation sets from a single provider
+# (such as a company or product suite) can be grouped.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_FEEDURL         =
+
 # This tag specifies a string that should uniquely identify the documentation
 # set bundle. This should be a reverse domain-name style string, e.g.
 # com.mycompany.MyDocSet. Doxygen will append .docset to the name.
@@ -1355,8 +1388,12 @@
 # If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
 # additional HTML index files: index.hhp, index.hhc, and index.hhk. The
 # index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
-# (see: https://www.microsoft.com/en-us/download/details.aspx?id=21138) on
-# Windows.
+# on Windows. In the beginning of 2021 Microsoft took the original page, with
+# a.o. the download links, offline the HTML help workshop was already many years
+# in maintenance mode). You can download the HTML help workshop from the web
+# archives at Installation executable (see:
+# http://web.archive.org/web/20160201063255/http://download.microsoft.com/downlo
+# ad/0/A/9/0A939EF6-E31C-430F-A3DF-DFAE7960D564/htmlhelp.exe).
 #
 # The HTML Help Workshop contains a compiler that can convert all HTML output
 # generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
@@ -1431,7 +1468,8 @@
 
 # The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
 # Project output. For more information please see Qt Help Project / Namespace
-# (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace).
+# (see:
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace).
 # The default value is: org.doxygen.Project.
 # This tag requires that the tag GENERATE_QHP is set to YES.
 
@@ -1439,8 +1477,8 @@
 
 # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
 # Help Project output. For more information please see Qt Help Project / Virtual
-# Folders (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual-
-# folders).
+# Folders (see:
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual-folders).
 # The default value is: doc.
 # This tag requires that the tag GENERATE_QHP is set to YES.
 
@@ -1448,16 +1486,16 @@
 
 # If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
 # filter to add. For more information please see Qt Help Project / Custom
-# Filters (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-
-# filters).
+# Filters (see:
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters).
 # This tag requires that the tag GENERATE_QHP is set to YES.
 
 QHP_CUST_FILTER_NAME   =
 
 # The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
 # custom filter to add. For more information please see Qt Help Project / Custom
-# Filters (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-
-# filters).
+# Filters (see:
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters).
 # This tag requires that the tag GENERATE_QHP is set to YES.
 
 QHP_CUST_FILTER_ATTRS  =
@@ -1469,9 +1507,9 @@
 
 QHP_SECT_FILTER_ATTRS  =
 
-# The QHG_LOCATION tag can be used to specify the location of Qt's
-# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the
-# generated .qhp file.
+# The QHG_LOCATION tag can be used to specify the location (absolute path
+# including file name) of Qt's qhelpgenerator. If non-empty doxygen will try to
+# run qhelpgenerator on the generated .qhp file.
 # This tag requires that the tag GENERATE_QHP is set to YES.
 
 QHG_LOCATION           =
@@ -1514,16 +1552,28 @@
 # to work a browser that supports JavaScript, DHTML, CSS and frames is required
 # (i.e. any modern browser). Windows users are probably better off using the
 # HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can
-# further fine-tune the look of the index. As an example, the default style
-# sheet generated by doxygen has an example that shows how to put an image at
-# the root of the tree instead of the PROJECT_NAME. Since the tree basically has
-# the same information as the tab index, you could consider setting
-# DISABLE_INDEX to YES when enabling this option.
+# further fine tune the look of the index (see "Fine-tuning the output"). As an
+# example, the default style sheet generated by doxygen has an example that
+# shows how to put an image at the root of the tree instead of the PROJECT_NAME.
+# Since the tree basically has the same information as the tab index, you could
+# consider setting DISABLE_INDEX to YES when enabling this option.
 # The default value is: NO.
 # This tag requires that the tag GENERATE_HTML is set to YES.
 
 GENERATE_TREEVIEW      = YES
 
+# When both GENERATE_TREEVIEW and DISABLE_INDEX are set to YES, then the
+# FULL_SIDEBAR option determines if the side bar is limited to only the treeview
+# area (value NO) or if it should extend to the full height of the window (value
+# YES). Setting this to YES gives a layout similar to
+# https://docs.readthedocs.io with more room for contents, but less room for the
+# project logo, title, and description. If either GENERATE_TREEVIEW or
+# DISABLE_INDEX is set to NO, this option has no effect.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FULL_SIDEBAR           = NO
+
 # The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
 # doxygen will group on one line in the generated HTML documentation.
 #
@@ -1548,6 +1598,13 @@
 
 EXT_LINKS_IN_WINDOW    = NO
 
+# If the OBFUSCATE_EMAILS tag is set to YES, doxygen will obfuscate email
+# addresses.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+OBFUSCATE_EMAILS       = YES
+
 # If the HTML_FORMULA_FORMAT option is set to svg, doxygen will use the pdf2svg
 # tool (see https://github.com/dawbarton/pdf2svg) or inkscape (see
 # https://inkscape.org) to generate formulas as SVG images instead of PNGs for
@@ -1596,11 +1653,29 @@
 
 USE_MATHJAX            = NO
 
+# With MATHJAX_VERSION it is possible to specify the MathJax version to be used.
+# Note that the different versions of MathJax have different requirements with
+# regards to the different settings, so it is possible that also other MathJax
+# settings have to be changed when switching between the different MathJax
+# versions.
+# Possible values are: MathJax_2 and MathJax_3.
+# The default value is: MathJax_2.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_VERSION        = MathJax_2
+
 # When MathJax is enabled you can set the default output format to be used for
-# the MathJax output. See the MathJax site (see:
-# http://docs.mathjax.org/en/latest/output.html) for more details.
+# the MathJax output. For more details about the output format see MathJax
+# version 2 (see:
+# http://docs.mathjax.org/en/v2.7-latest/output.html) and MathJax version 3
+# (see:
+# http://docs.mathjax.org/en/latest/web/components/output.html).
 # Possible values are: HTML-CSS (which is slower, but has the best
-# compatibility), NativeMML (i.e. MathML) and SVG.
+# compatibility. This is the name for Mathjax version 2, for MathJax version 3
+# this will be translated into chtml), NativeMML (i.e. MathML. Only supported
+# for NathJax 2. For MathJax version 3 chtml will be used instead.), chtml (This
+# is the name for Mathjax version 3, for MathJax version 2 this will be
+# translated into HTML-CSS) and SVG.
 # The default value is: HTML-CSS.
 # This tag requires that the tag USE_MATHJAX is set to YES.
 
@@ -1613,22 +1688,29 @@
 # MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
 # Content Delivery Network so you can quickly see the result without installing
 # MathJax. However, it is strongly recommended to install a local copy of
-# MathJax from https://www.mathjax.org before deployment.
-# The default value is: https://cdn.jsdelivr.net/npm/mathjax@2.
+# MathJax from https://www.mathjax.org before deployment. The default value is:
+# - in case of MathJax version 2: https://cdn.jsdelivr.net/npm/mathjax@2
+# - in case of MathJax version 3: https://cdn.jsdelivr.net/npm/mathjax@3
 # This tag requires that the tag USE_MATHJAX is set to YES.
 
 MATHJAX_RELPATH        = http://cdn.mathjax.org/mathjax/latest
 
 # The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
 # extension names that should be enabled during MathJax rendering. For example
+# for MathJax version 2 (see
+# https://docs.mathjax.org/en/v2.7-latest/tex.html#tex-and-latex-extensions):
 # MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
+# For example for MathJax version 3 (see
+# http://docs.mathjax.org/en/latest/input/tex/extensions/index.html):
+# MATHJAX_EXTENSIONS = ams
 # This tag requires that the tag USE_MATHJAX is set to YES.
 
 MATHJAX_EXTENSIONS     =
 
 # The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
 # of code that will be used on startup of the MathJax code. See the MathJax site
-# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an
+# (see:
+# http://docs.mathjax.org/en/v2.7-latest/output.html) for more details. For an
 # example see the documentation.
 # This tag requires that the tag USE_MATHJAX is set to YES.
 
@@ -1675,7 +1757,8 @@
 #
 # Doxygen ships with an example indexer (doxyindexer) and search engine
 # (doxysearch.cgi) which are based on the open source search engine library
-# Xapian (see: https://xapian.org/).
+# Xapian (see:
+# https://xapian.org/).
 #
 # See the section "External Indexing and Searching" for details.
 # The default value is: NO.
@@ -1688,8 +1771,9 @@
 #
 # Doxygen ships with an example indexer (doxyindexer) and search engine
 # (doxysearch.cgi) which are based on the open source search engine library
-# Xapian (see: https://xapian.org/). See the section "External Indexing and
-# Searching" for details.
+# Xapian (see:
+# https://xapian.org/). See the section "External Indexing and Searching" for
+# details.
 # This tag requires that the tag SEARCHENGINE is set to YES.
 
 SEARCHENGINE_URL       =
@@ -1798,29 +1882,31 @@
 
 EXTRA_PACKAGES         = amsmath
 
-# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the
-# generated LaTeX document. The header should contain everything until the first
-# chapter. If it is left blank doxygen will generate a standard header. See
-# section "Doxygen usage" for information on how to let doxygen write the
-# default header to a separate file.
-#
-# Note: Only use a user-defined header if you know what you are doing! The
-# following commands have a special meaning inside the header: $title,
-# $datetime, $date, $doxygenversion, $projectname, $projectnumber,
-# $projectbrief, $projectlogo. Doxygen will replace $title with the empty
-# string, for the replacement values of the other commands the user is referred
-# to HTML_HEADER.
+# The LATEX_HEADER tag can be used to specify a user-defined LaTeX header for
+# the generated LaTeX document. The header should contain everything until the
+# first chapter. If it is left blank doxygen will generate a standard header. It
+# is highly recommended to start with a default header using
+# doxygen -w latex new_header.tex new_footer.tex new_stylesheet.sty
+# and then modify the file new_header.tex. See also section "Doxygen usage" for
+# information on how to generate the default header that doxygen normally uses.
+#
+# Note: Only use a user-defined header if you know what you are doing!
+# Note: The header is subject to change so you typically have to regenerate the
+# default header when upgrading to a newer version of doxygen. The following
+# commands have a special meaning inside the header (and footer): For a
+# description of the possible markers and block names see the documentation.
 # This tag requires that the tag GENERATE_LATEX is set to YES.
 
 LATEX_HEADER           =
 
-# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the
-# generated LaTeX document. The footer should contain everything after the last
-# chapter. If it is left blank doxygen will generate a standard footer. See
+# The LATEX_FOOTER tag can be used to specify a user-defined LaTeX footer for
+# the generated LaTeX document. The footer should contain everything after the
+# last chapter. If it is left blank doxygen will generate a standard footer. See
 # LATEX_HEADER for more information on how to generate a default footer and what
-# special commands can be used inside the footer.
-#
-# Note: Only use a user-defined footer if you know what you are doing!
+# special commands can be used inside the footer. See also section "Doxygen
+# usage" for information on how to generate the default footer that doxygen
+# normally uses. Note: Only use a user-defined footer if you know what you are
+# doing!
 # This tag requires that the tag GENERATE_LATEX is set to YES.
 
 LATEX_FOOTER           =
@@ -1865,8 +1951,7 @@
 
 # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode
 # command to the generated LaTeX files. This will instruct LaTeX to keep running
-# if errors occur, instead of asking the user for help. This option is also used
-# when generating formulas in HTML.
+# if errors occur, instead of asking the user for help.
 # The default value is: NO.
 # This tag requires that the tag GENERATE_LATEX is set to YES.
 
@@ -1879,16 +1964,6 @@
 
 LATEX_HIDE_INDICES     = YES
 
-# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source
-# code with syntax highlighting in the LaTeX output.
-#
-# Note that which sources are shown also depends on other settings such as
-# SOURCE_BROWSER.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-LATEX_SOURCE_CODE      = NO
-
 # The LATEX_BIB_STYLE tag can be used to specify the style to use for the
 # bibliography, e.g. plainnat, or ieeetr. See
 # https://en.wikipedia.org/wiki/BibTeX and \cite for more info.
@@ -1969,16 +2044,6 @@
 
 RTF_EXTENSIONS_FILE    =
 
-# If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code
-# with syntax highlighting in the RTF output.
-#
-# Note that which sources are shown also depends on other settings such as
-# SOURCE_BROWSER.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_RTF is set to YES.
-
-RTF_SOURCE_CODE        = NO
-
 #---------------------------------------------------------------------------
 # Configuration options related to the man page output
 #---------------------------------------------------------------------------
@@ -2075,15 +2140,6 @@
 
 DOCBOOK_OUTPUT         = docbook
 
-# If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the
-# program listings (including syntax highlighting and cross-referencing
-# information) to the DOCBOOK output. Note that enabling this will significantly
-# increase the size of the DOCBOOK output.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
-
-DOCBOOK_PROGRAMLISTING = NO
-
 #---------------------------------------------------------------------------
 # Configuration options for the AutoGen Definitions output
 #---------------------------------------------------------------------------
@@ -2196,7 +2252,7 @@
 ## ns-3:
 ##
 ## We predefine NS3_ASSERT_ENABLE and NS3_LOG_ENABLE so doxygen sees
-## the working definitions.  (These are normally defined by waf
+## the working definitions.  (These are normally defined by ns3
 ## in ns3/core-config.h)
 ##
 ## Function like macros at file global scope typically need to be here,
@@ -2205,8 +2261,8 @@
 
 PREDEFINED             = NS3_ASSERT_ENABLE \
                          NS3_LOG_ENABLE \
-                         NS_ABORT_MSG_UNLESS(x,y)=1 \
-                         NS_ABORT_MSG_IF(x,y)=1 \
+                         "NS_ABORT_MSG_UNLESS(x,y)=1" \
+                         "NS_ABORT_MSG_IF(x,y)=1" \
                          NS_LOG_COMPONENT_DEFINE()=1 \
                          NS_LOG_COMPONENT_DEFINE_MASK()=1 \
                          NS_OBJECT_ENSURE_REGISTERED()=1 \
@@ -2301,15 +2357,6 @@
 # Configuration options related to the dot tool
 #---------------------------------------------------------------------------
 
-# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram
-# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to
-# NO turns the diagrams off. Note that this option also works with HAVE_DOT
-# disabled, but it is recommended to install and use dot, since it yields more
-# powerful graphs.
-# The default value is: YES.
-
-CLASS_DIAGRAMS         = YES
-
 # You can include diagrams made with dia in doxygen documentation. Doxygen will
 # then run dia to produce the diagram and insert it in the documentation. The
 # DIA_PATH tag allows you to specify the directory where the dia binary resides.
@@ -2321,7 +2368,7 @@
 # and usage relations if the target is undocumented or is not a class.
 # The default value is: YES.
 
-HIDE_UNDOC_RELATIONS   = YES
+HIDE_UNDOC_RELATIONS   = NO
 
 # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
 # available from the path. This tool is part of Graphviz (see:
@@ -2366,11 +2413,14 @@
 
 DOT_FONTPATH           =
 
-# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for
-# each documented class showing the direct and indirect inheritance relations.
-# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO.
+# If the CLASS_GRAPH tag is set to YES (or GRAPH) then doxygen will generate a
+# graph for each documented class showing the direct and indirect inheritance
+# relations. In case HAVE_DOT is set as well dot will be used to draw the graph,
+# otherwise the built-in generator will be used. If the CLASS_GRAPH tag is set
+# to TEXT the direct and indirect inheritance relations will be shown as texts /
+# links.
+# Possible values are: NO, YES, TEXT and GRAPH.
 # The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
 
 CLASS_GRAPH            = YES
 
@@ -2407,10 +2457,32 @@
 # but if the number exceeds 15, the total amount of fields shown is limited to
 # 10.
 # Minimum value: 0, maximum value: 100, default value: 10.
-# This tag requires that the tag HAVE_DOT is set to YES.
+# This tag requires that the tag UML_LOOK is set to YES.
 
 UML_LIMIT_NUM_FIELDS   = 10
 
+# If the DOT_UML_DETAILS tag is set to NO, doxygen will show attributes and
+# methods without types and arguments in the UML graphs. If the DOT_UML_DETAILS
+# tag is set to YES, doxygen will add type and arguments for attributes and
+# methods in the UML graphs. If the DOT_UML_DETAILS tag is set to NONE, doxygen
+# will not generate fields with class member information in the UML graphs. The
+# class diagrams will look similar to the default class diagrams but using UML
+# notation for the relationships.
+# Possible values are: NO, YES and NONE.
+# The default value is: NO.
+# This tag requires that the tag UML_LOOK is set to YES.
+
+DOT_UML_DETAILS        = NO
+
+# The DOT_WRAP_THRESHOLD tag can be used to set the maximum number of characters
+# to display on a single line. If the actual line length exceeds this threshold
+# significantly it will wrapped across multiple lines. Some heuristics are apply
+# to avoid ugly line breaks.
+# Minimum value: 0, maximum value: 1000, default value: 17.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_WRAP_THRESHOLD     = 17
+
 # If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
 # collaboration graphs will show the relations between templates and their
 # instances.
@@ -2477,6 +2549,13 @@
 
 DIRECTORY_GRAPH        = YES
 
+# The DIR_GRAPH_MAX_DEPTH tag can be used to limit the maximum number of levels
+# of child directories generated in directory dependency graphs by dot.
+# Minimum value: 1, maximum value: 25, default value: 1.
+# This tag requires that the tag DIRECTORY_GRAPH is set to YES.
+
+DIR_GRAPH_MAX_DEPTH    = 1
+
 # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
 # generated by dot. For an explanation of the image formats see the section
 # output formats in the documentation of the dot tool (Graphviz (see:
@@ -2530,10 +2609,10 @@
 DIAFILE_DIRS           =
 
 # When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the
-# path where java can find the plantuml.jar file. If left blank, it is assumed
-# PlantUML is not used or called during a preprocessing step. Doxygen will
-# generate a warning when it encounters a \startuml command in this case and
-# will not generate output for the diagram.
+# path where java can find the plantuml.jar file or to the filename of jar file
+# to be used. If left blank, it is assumed PlantUML is not used or called during
+# a preprocessing step. Doxygen will generate a warning when it encounters a
+# \startuml command in this case and will not generate output for the diagram.
 
 PLANTUML_JAR_PATH      =
 
@@ -2557,7 +2636,7 @@
 # Minimum value: 0, maximum value: 10000, default value: 50.
 # This tag requires that the tag HAVE_DOT is set to YES.
 
-DOT_GRAPH_MAX_NODES    = 50
+DOT_GRAPH_MAX_NODES    = 70
 
 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs
 # generated by dot. A depth value of 3 means that only nodes reachable from the
@@ -2595,14 +2674,18 @@
 # If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page
 # explaining the meaning of the various boxes and arrows in the dot generated
 # graphs.
+# Note: This tag requires that UML_LOOK isn't set, i.e. the doxygen internal
+# graphical representation for inheritance and collaboration diagrams is used.
 # The default value is: YES.
 # This tag requires that the tag HAVE_DOT is set to YES.
 
 GENERATE_LEGEND        = YES
 
-# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate dot
+# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate
 # files that are used to generate the various graphs.
+#
+# Note: This setting is not only used for dot files but also for msc temporary
+# files.
 # The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
 
 DOT_CLEANUP            = YES
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/doc/doxygen.warnings.report.sh ns-3.36/doc/doxygen.warnings.report.sh
--- ns-3.35/doc/doxygen.warnings.report.sh	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/doc/doxygen.warnings.report.sh	2022-04-30 18:23:57.646732600 -0700
@@ -15,7 +15,6 @@
 WARNINGSLOGFILE=doxygen.warnings.log
 # Default choice:  generate it
 LOG="$DIR/$WARNINGSLOGFILE"
-
 # Verbose log
 VERBLOG="$DIR/doxygen.verbose.log"
 
@@ -66,7 +65,7 @@
     report all undocumented elements, and to reduce the run time.
     The output of this special run is kept in doc/$WARNINGSLOGFILE.
     To further reduce the run time, the -i option also skips
-    print-introspected-doxygen, so waf doesn\'t have to compile
+    print-introspected-doxygen, so ns3 doesn\'t have to compile
     any modified files at all.
 
     The -f, -l, and -s options skip the doxygen run altogether.
@@ -309,7 +308,10 @@
 else
 
     # Modify doxygen.conf to generate all the warnings
-    # (We also suppress dot graphs, so shorten the run time.)
+    # We keep dot active to generate graphs in the documentaion
+    # (see for example PacketTagList) and warn about ill-formed
+    # graphs, but we disable all the doxygen-generated diagrams
+    # to shorten the run time.
 
     conf=doc/doxygen.conf
     cp $conf ${conf}.bak
@@ -317,29 +319,37 @@
 
     # doxygen.warnings.report.sh:
     EXTRACT_ALL = no
-    HAVE_DOT = no
-    CLASS_DIAGRAMS = no
     WARNINGS = no
-    SOURCE_BROWSER = no
-    HTML_OUTPUT html-warn
     WARN_LOGFILE = doc/$WARNINGSLOGFILE
+    SOURCE_BROWSER = no
+    HTML_OUTPUT = html-warn
+    CLASS_DIAGRAMS = no
+    CLASS_GRAPH = no
+    COLLABORATION_GRAPH = no
+    GROUP_GRAPHS = no
+    INCLUDE_GRAPH = no
+    INCLUDED_BY_GRAPH = no
+    CALL_GRAPH = no
+    CALLER_GRAPH = no
+    GRAPHICAL_HIERARCHY = no
+    DIRECTORY_GRAPH = no
 EOF
 
 
     intro_h="introspected-doxygen.h"
     if [ $skip_intro -eq 1 ]; then
-        verbose "" "Skipping ./waf build"
+        verbose "" "Skipping ./ns3 build"
         verbose -n "Trying print-introspected-doxygen with doxygen build"
-        (cd "$ROOT" && ./waf --run-no-build print-introspected-doxygen >doc/$intro_h 2>&6 )
-        status_report $? "./waf --run print-introspected-doxygen" noexit
+        (cd "$ROOT" && ./ns3 run print-introspected-doxygen --no-build >doc/$intro_h 2>&6 )
+        status_report $? "./ns3 run print-introspected-doxygen" noexit
     else
         # Run introspection, which may require a build
         verbose -n "Building"
-        (cd "$ROOT" && ./waf build >&6 2>&6 )
-        status_report $? "./waf build"
+        (cd "$ROOT" && ./ns3 build >&6 2>&6 )
+        status_report $? "./ns3 build"
         verbose -n "Running print-introspected-doxygen with doxygen build"
-        (cd "$ROOT" && ./waf --run-no-build print-introspected-doxygen >doc/$intro_h 2>&6 )
-        status_report $? "./waf --run print-introspected-doxygen"
+        (cd "$ROOT" && ./ns3 run print-introspected-doxygen --no-build >doc/$intro_h 2>&6 )
+        status_report $? "./ns3 run print-introspected-doxygen"
     fi
 
     # Waf insists on writing cruft to stdout
@@ -347,8 +357,8 @@
     rm doc/$intro_h.bak
 
     verbose -n "Rebuilding doxygen docs with full errors"
-    (cd "$ROOT" && ./waf --doxygen-no-build >&6 2>&6 )
-    status_report $? "./waf --doxygen-no-build"
+    (cd "$ROOT" && ./ns3 docs doxygen-no-build >&6 2>&6 )
+    status_report $? "./ns3 docs doxygen-no-build"
 
     # Swap back to original config
     rm -f $conf
@@ -383,23 +393,34 @@
 
 verbose -n "Filtering the doxygen log"
 
-# List of module directories (e.g, "src/core/model")
-undocmods=$(                \
-    filter_log            | \
-    cut -d ':' -f 1       | \
-    sed "s|$ROOT/||g"     | \
-    cut -d '/' -f 1-3     | \
-    sort                  | \
-    uniq -c               | \
-    sort -nr                \
-    )
+filter_log_results=$(filter_log)
 
-# Number of directories
-modcount=$(                         \
-    echo "$undocmods"             | \
-    wc -l                         | \
-    sed 's/^[ \t]*//;s/[ \t]*$//'   \
-    )
+# List of module directories (e.g, "src/core/model")
+if [ ! -z "$filter_log_results" ]
+then
+    undocmods=$(                \
+        filter_log            | \
+        cut -d ':' -f 1       | \
+        sed "s|$ROOT/||g"     | \
+        cut -d '/' -f 1-3     | \
+        sort                  | \
+        uniq -c               | \
+        sort -nr                \
+        )
+    modcount=$(                         \
+        echo "$undocmods"             | \
+        wc -l                         | \
+        sed 's/^[ \t]*//;s/[ \t]*$//'   \
+        )
+    modwarncount=$(                               \
+        echo "$undocmods"                       | \
+        awk '{total += $1}; END {print total}'    \
+        )
+else
+    undocmods=""
+    modcount=0
+    modwarncount=0
+fi
 
 # For a function with multiple undocumented parameters,
 # Doxygen prints the additional parameters on separate lines,
@@ -413,32 +434,38 @@
     )
 
 # Total number of warnings
-warncount=$(                                  \
-    echo "$undocmods"                       | \
-    awk '{total += $1}; END {print total}'    \
-    )
-warncount=$((warncount + addlparam))
+warncount=$((modwarncount + addlparam))
 
 # List of files appearing in the log
-undocfiles=$(               \
-    filter_log            | \
-    cut -d ':' -f 1       | \
-    sed "s|$ROOT||g"      | \
-    cut -d '/' -f 2-      | \
-    sort                  | \
-    uniq -c               | \
-    sort -k 2               \
-    )
+if [ ! -z "$filter_log_results" ]
+then
+    undocfiles=$(               \
+        filter_log            | \
+        cut -d ':' -f 1       | \
+        sed "s|$ROOT||g"      | \
+        cut -d '/' -f 2-      | \
+        sort                  | \
+        uniq -c               | \
+        sort -k 2               \
+        )
+else
+    undocfiles=""
+fi
 
 # Sorted by number, decreasing
 undocsort=$(echo "$undocfiles" | sort -k1nr,2 )
 
 # Total number of files
-filecount=$(                        \
-    echo "$undocfiles"            | \
-    wc -l                         | \
-    sed 's/^[ \t]*//;s/[ \t]*$//'   \
-    )
+if [ ! -z "$undocfiles" ]
+then
+    filecount=$(                        \
+        echo "$undocfiles"            | \
+        wc -l                         | \
+        sed 's/^[ \t]*//;s/[ \t]*$//'   \
+        )
+else
+    filecount=0
+fi
 
 # Filtered in warnings
 filterin=
@@ -519,9 +546,6 @@
     echo "Filtered Warnings"
     echo "========================================"
     echo "$filterin"
-    exit_status=1
-else
-    exit_status=0
 fi
 
 status_report 0 $me
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/doc/main.h ns-3.36/doc/main.h
--- ns-3.35/doc/main.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/doc/main.h	2022-04-30 18:23:57.646732600 -0700
@@ -17,9 +17,9 @@
  *
  * \section install-sec Building the Documentation
  * 
- * ns-3 requires Doxygen version 1.8.3.1 or greater.
+ * Building ns-3 Doxygen requires Doxygen version 1.8 at a minimum, but version 1.9 is recommended to minimize warnings.
  * 
- * Type "./waf --doxygen" or "./waf --doxygen-no-build" to build the 
+ * Type "./ns3 docs doxygen" or "./ns3 docs doxygen-no-build" to build the
  *  documentation.  The doc/ directory contains
  * configuration for Doxygen (doxygen.conf) and main.h.  The Doxygen 
  * build process puts html files into the doc/html/ directory, and latex 
@@ -91,7 +91,7 @@
  *
  * Enable asserts at compile time.
  *
- * This is normally set by `./waf configure --build-profile=debug`.
+ * This is normally set by `./ns3 configure --build-profile=debug`.
  */
 #define NS3_ASSERT_ENABLE
 
@@ -102,7 +102,7 @@
  *
  * Enable logging at compile time.
  *
- * This is normally set by `./waf configure --build-profile=debug`.
+ * This is normally set by `./ns3 configure --build-profile=debug`.
  */
 #define NS3_LOG_ENABLE
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/doc/manual/Makefile ns-3.36/doc/manual/Makefile
--- ns-3.35/doc/manual/Makefile	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/doc/manual/Makefile	2022-04-30 18:23:57.646732600 -0700
@@ -16,11 +16,12 @@
 	source/replace.txt \
 	source/attributes.rst \
 	source/callbacks.rst \
-	source/working-with-git.rst \
+	source/develop.rst \
 	source/documentation.rst \
 	source/enable-modules.rst \
 	source/enable-tests.rst \
 	source/events.rst \
+	source/features.rst \
 	source/gnuplot.rst \
 	source/hash-functions.rst \
 	source/helpers.rst \
@@ -31,9 +32,11 @@
 	source/object-model.rst \
 	source/object-names.rst \
 	source/organization.rst \
+	source/profiling.rst \
 	source/python.rst \
 	source/random-variables.rst \
 	source/realtime.rst \
+	source/simulator.rst \
 	source/support.rst \
 	source/test-background.rst \
 	source/test-framework.rst \
@@ -42,6 +45,9 @@
 	source/tracing.rst \
 	source/troubleshoot.rst \
 	source/utilities.rst \
+	source/working-with-cmake.rst \
+	source/working-with-git.rst \
+	source/working-with-gitlab-ci-local.rst \
 	${SRC}/stats/doc/data-collection.rst \
 	${SRC}/stats/doc/data-collection-overview.rst \
 	${SRC}/stats/doc/statistics.rst \
@@ -60,18 +66,35 @@
 #  3) both a .pdf and .png file
 
 SOURCEFIGS = \
-        figures/software-organization.dia \
+    figures/software-organization.dia \
 	figures/plot-2d.png \
 	figures/plot-2d-with-error-bars.png \
 	figures/plot-3d.png \
 	figures/gtk-config-lena-dual-stripe-device-view.png \
 	figures/gtk-config-lena-dual-stripe-eNB-tx-power.png \
+	figures/heaptrack.png \
+	figures/hotspot-cycles.png \
+	figures/hotspot-setup.png \
+	figures/hotspot-top-down.png \
+	figures/perfetto-trace-cmake.png \
+	figures/uprof-collect-callstack.png \
+	figures/uprof-collect-callstack.png \
+	figures/uprof-profile-application.png \
+	figures/uprof-select-events.png \
+	figures/uprof-start.png \
+	figures/uprof-stats.png \
+	figures/uprof-strace-lte.png \
+	figures/vtune-configure.png \
+	figures/vtune-landing.png \
+	figures/vtune-perf-snapshot.png \
+	figures/vtune-select-uarch-profiling.png \
+	figures/vtune-uarch-core-stats.png \
+	figures/vtune-uarch-profiling-summary.png \
+	figures/vtune-uarch-wifi-stats.png \
 	${SRC}/stats/doc/Stat-framework-arch.png \
 	${SRC}/stats/doc/Wifi-default.png \
 	${SRC}/stats/doc/dcf-overview.dia \
 	${SRC}/stats/doc/dcf-overview-with-aggregation.dia \
-	${SRC}/stats/doc/gnuplot-example.png \
-	${SRC}/stats/doc/file-example.png \
 	${SRC}/stats/doc/seventh-packet-byte-count.png \
 	${SRC}/stats/doc/gnuplot-helper-example.png \
 	${SRC}/stats/doc/gnuplot-aggregator.png \
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/doc/manual/source/attributes.rst ns-3.36/doc/manual/source/attributes.rst
--- ns-3.35/doc/manual/source/attributes.rst	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/doc/manual/source/attributes.rst	2022-04-30 18:23:57.682732800 -0700
@@ -258,6 +258,94 @@
 the node and its constituent member objects, and help text and default values
 for each parameter.
 
+Available AttributeValue Types
+++++++++++++++++++++++++++++++
+
+* AddressValue
+
+* AttributeContainerValue
+
+* BooleanValue
+
+* BoxValue
+
+* CallbackValue
+
+* DataRateValue
+
+* DoubleValue
+
+* EmptyAttributeValue
+
+* EnumValue
+
+* IntegerValue
+
+* Ipv4AddressValue
+
+* Ipv4MaskValue
+
+* Ipv6AddressValue
+
+* Ipv6PrefixValue
+
+* LengthValue
+
+* Mac16AddressValue
+
+* Mac48AddressValue
+
+* Mac64AddressValue
+
+* ObjectFactoryValue
+
+* ObjectPtrContainerValue
+
+* PairValue<A, B>
+
+* PointerValue
+
+* PriomapValue
+
+* QueueSizeValue
+
+* RectangleValue
+
+* SsidValue
+
+* TimeValue
+
+* TupleValue<Args...>
+
+  A TupleValue is capable of storing values of different types, hence it is suitable for
+  structured data. A prominent example is the ChannelSettings attribute of WifiPhy, which
+  consists of channel number, channel width, PHY band and primary 20 MHz channel index.
+  In this case the values have to be mutually consistent, which makes it difficult to set them
+  as individual Attributes. Capturing them in a TupleValue simplifies this problem, see
+  ``src/wifi/model/wifi-phy.cc``.
+
+  Values stored in a TupleValue object can be set/get through a std::tuple object or
+  can be serialized to/deserialized from a string containing a comma-separated sequence of
+  the values enclosed in a pair of curly braces (e.g., "{36, 20, BAND_5GHZ, 0}").
+
+  The usage of the TupleValue attribute is illustrated in
+  ``src/core/test/tuple-value-test-suite.cc``.
+
+* TypeIdValue
+
+* UanModesListValue
+
+* UintegerValue
+
+* Vector2DValue
+
+* Vector3DValue
+
+* WaypointValue
+
+* WifiModeValue
+
+
 Defining Attributes
 +++++++++++++++++++
 
@@ -617,7 +705,7 @@
 
 .. sourcecode:: bash
 
-    $ ./waf --run main-attribute-value
+    $ ./ns3 run main-attribute-value
     1.  dtq limit: 80p
     2.  txQueue limit: 80p
     3.  txQueue limit changed: 60p
@@ -1218,7 +1306,7 @@
 
 .. sourcecode:: bash
 
-  $ ./waf configure --enable-examples --enable-tests
+  $ ./ns3 configure --enable-examples --enable-tests
 
   ---- Summary of optional NS-3 features:
   Python Bindings               : enabled
@@ -1231,8 +1319,8 @@
 
 .. sourcecode:: bash
 
-  $ ./waf configure --enable-examples --enable-tests
-  $ ./waf
+  $ ./ns3 configure --enable-examples --enable-tests
+  $ ./ns3
 
 is rerun.
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/doc/manual/source/conf.py ns-3.36/doc/manual/source/conf.py
--- ns-3.35/doc/manual/source/conf.py	2021-10-01 13:27:51.000000000 -0700
+++ ns-3.36/doc/manual/source/conf.py	2022-04-30 18:27:14.427631600 -0700
@@ -73,9 +73,9 @@
 # built documents.
 #
 # The short X.Y version.
-version = u'ns-3.35'
+version = u'ns-3.36'
 # The full version, including alpha/beta/rc tags.
-release = u'ns-3.35'
+release = u'ns-3.36'
 
 # The language for content autogenerated by Sphinx. Refer to documentation
 # for a list of supported languages.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/doc/manual/source/develop.rst ns-3.36/doc/manual/source/develop.rst
--- ns-3.35/doc/manual/source/develop.rst	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/doc/manual/source/develop.rst	2022-04-30 18:23:57.682732800 -0700
@@ -0,0 +1,20 @@
+.. only:: html or latex
+
+Developer Tools
+===============
+
+This chapter describes the development ecosystem generally used to create new modules.
+
+.. toctree::
+   :maxdepth: 2
+
+   working-with-git
+   working-with-cmake
+   logging
+   tests
+   new-models
+   new-modules
+   documentation
+   profiling
+   working-with-gitlab-ci-local
+
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/doc/manual/source/documentation.rst ns-3.36/doc/manual/source/documentation.rst
--- ns-3.35/doc/manual/source/documentation.rst	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/doc/manual/source/documentation.rst	2022-04-30 18:23:57.682732800 -0700
@@ -23,7 +23,7 @@
 
 .. sourcecode:: bash
 
-   $ ./waf docs
+   $ ./ns3 docs
 
 For more specialized options, read on.
 
@@ -132,7 +132,7 @@
 
 .. sourcecode:: bash
 
-   $ ./waf sphinx
+   $ ./ns3 sphinx
 
 To build just the Models documentation:
 
@@ -371,7 +371,7 @@
 
 .. sourcecode:: bash
 
-   $ ./waf doxygen
+   $ ./ns3 doxygen
 
 This builds using the default configuration, which generates
 documentation sections for *all* items, even if they do not have
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/doc/manual/source/enable-modules.rst ns-3.36/doc/manual/source/enable-modules.rst
--- ns-3.35/doc/manual/source/enable-modules.rst	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/doc/manual/source/enable-modules.rst	2022-04-30 18:23:57.682732800 -0700
@@ -27,29 +27,29 @@
 
 By default, all modules are built in |ns3|.  There are two ways to enable a subset of these modules:
 
-#. Using waf's --enable-modules option
+#. Using ns3's --enable-modules option
 #. Using the |ns3| configuration file
 
-Enable modules using waf's --enable-modules option
+Enable modules using ns3's --enable-modules option
 ++++++++++++++++++++++++++++++++++++++++++++++++++
 
 To enable only the core module with example and tests, for example,
 try these commands: ::
 
-  $ ./waf clean
-  $ ./waf configure --enable-examples --enable-tests --enable-modules=core
-  $ ./waf build
-  $ cd build/debug/
+  $ ./ns3 clean
+  $ ./ns3 configure --enable-examples --enable-tests --enable-modules=core
+  $ ./ns3 build
+  $ cd build/lib
   $ ls
 
 and the following libraries should be present:
 
 .. sourcecode:: text
 
-  bindings  libns3-core.so       ns3      scratch  utils
-  examples  libns3-core-test.so  samples  src
+  libns3-core.so
+  libns3-core-test.so
 
-Note the ``./waf clean`` step is done here only to make it more obvious which module libraries were built.  You don't have to do ``./waf clean`` in order to enable subsets of modules.
+Note the ``./ns3 clean`` step is done here only to make it more obvious which module libraries were built.  You don't have to do ``./ns3 clean`` in order to enable subsets of modules.
 
 Running test.py will cause only those tests that depend on module core to be run:
  
@@ -61,8 +61,8 @@
 
 .. sourcecode:: text
 
-  bindings  libns3-core.so       libns3-network.so       ns3      scratch  utils
-  examples  libns3-core-test.so  libns3-network-test.so  samples  src
+  libns3-core.so       libns3-network.so
+  libns3-core-test.so  libns3-network-test.so
 
 Running test.py will cause those tests that depend on only the core and network modules to be run:
 
@@ -81,7 +81,7 @@
 #. the .ns3rc file in the top level |ns3| directory is next consulted, if present
 #. the system searches for ~/.ns3rc if the above two are unspecified
 
-If none of the above limits the modules to be built, all modules that waf knows about will be built.
+If none of the above limits the modules to be built, all modules that CMake knows about will be built.
 
 The maintained version of the .ns3rc file in the |ns3| source code repository resides in the ``utils`` directory.  The reason for this is if it were in the top-level directory of the repository, it would be prone to accidental checkins from maintainers that enable the modules they want to use.  Therefore, users need to manually copy the .ns3rc from the ``utils`` directory to their preferred place (top level directory or their home directory) to enable persistent modular build configuration.
 
@@ -127,20 +127,20 @@
 
 Only the core module will be enabled now if you try these commands: ::
 
-  $ ./waf clean
-  $ ./waf configure
-  $ ./waf build
-  $ cd build/debug/
+  $ ./ns3 clean
+  $ ./ns3 configure
+  $ ./ns3 build
+  $ cd build/lib/
   $ ls
 
 and the following libraries should be present:
 
 .. sourcecode:: text
 
-  bindings  libns3-core.so       ns3      scratch  utils
-  examples  libns3-core-test.so  samples  src
+  libns3-core.so
+  libns3-core-test.so
 
-Note the ``./waf clean`` step is done here only to make it more obvious which module libraries were built.  You don't have to do ``./waf clean`` in order to enable subsets of modules.
+Note the ``./ns3 clean`` step is done here only to make it more obvious which module libraries were built.  You don't have to do ``./ns3 clean`` in order to enable subsets of modules.
 
 Running test.py will cause only those tests that depend on module core to be run:
  
@@ -152,8 +152,8 @@
 
 .. sourcecode:: text
 
-  bindings  libns3-core.so       libns3-network.so       ns3      scratch  utils
-  examples  libns3-core-test.so  libns3-network-test.so  samples  src
+  libns3-core.so       libns3-network.so
+  libns3-core-test.so  libns3-network-test.so
 
 Running test.py will cause those tests that depend on only the core and network modules to be run:
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/doc/manual/source/enable-tests.rst ns-3.36/doc/manual/source/enable-tests.rst
--- ns-3.35/doc/manual/source/enable-tests.rst	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/doc/manual/source/enable-tests.rst	2022-04-30 18:23:57.682732800 -0700
@@ -15,7 +15,7 @@
 There are 3 ways to enable/disable examples and tests in |ns3|:
 
 #. Using build.py when |ns3| is built for the first time
-#. Using waf once |ns3| has been built
+#. Using ns3 once |ns3| has been built
 #. Using the |ns3| configuration file once |ns3| has been built
 
 Enable/disable examples and tests using build.py
@@ -46,18 +46,18 @@
 
   170 of 170 tests passed (170 passed, 0 skipped, 0 failed, 0 crashed, 0 valgrind errors)
 
-Enable/disable examples and tests using waf
+Enable/disable examples and tests using ns3
 +++++++++++++++++++++++++++++++++++++++++++
 
-You can use waf to enable/disable examples and tests once |ns3| has been built.
+You can use ns3 to enable/disable examples and tests once |ns3| has been built.
 
 By default, examples and tests are not built in |ns3|.  
 
 From the top level |ns3| directory, you can build |ns3| without any
 examples or tests simply by doing: ::
 
-  $ ./waf configure
-  $ ./waf build
+  $ ./ns3 configure
+  $ ./ns3 build
 
 Running test.py now will cause no examples or tests to be run:
  
@@ -67,8 +67,8 @@
 
 If you would like build |ns3| with examples and tests, then do the following from the top level |ns3| directory: ::
 
-  $ ./waf configure --enable-examples --enable-tests
-  $ ./waf build
+  $ ./ns3 configure --enable-examples --enable-tests
+  $ ./ns3 build
 
 Running test.py will cause all of the examples and tests to be run:
  
@@ -117,8 +117,8 @@
 From the top level |ns3| directory, you can build |ns3| without any
 examples or tests simply by doing: ::
 
-  $ ./waf configure
-  $ ./waf build
+  $ ./ns3 configure
+  $ ./ns3 build
 
 Running test.py now will cause no examples or tests to be run:
  
@@ -149,8 +149,8 @@
 From the top level |ns3| directory, you can build |ns3| with examples
 and tests simply by doing: ::
 
-  $ ./waf configure
-  $ ./waf build
+  $ ./ns3 configure
+  $ ./ns3 build
 
 Running test.py will cause all of the examples and tests to be run:
  
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/doc/manual/source/events.rst ns-3.36/doc/manual/source/events.rst
--- ns-3.35/doc/manual/source/events.rst	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/doc/manual/source/events.rst	2022-04-30 18:23:57.682732800 -0700
@@ -83,7 +83,7 @@
 
 Notes:
 
-* the ns-3 Schedule methods recognize automatically functions and
+* the |ns3| Schedule methods recognize automatically functions and
   methods only if they take less than 5 arguments. If you need them to
   support more arguments, please, file a bug report.
 * Readers familiar with the term 'fully-bound functors' will recognize
@@ -124,7 +124,7 @@
   Simulator::ScheduleWithContext (uint32_t context, Time const &time, MEM mem_ptr, OBJ obj);
 
 Readers who invest time and effort in developing or using a non-trivial
-simulation model will know the value of the ns-3 logging framework to
+simulation model will know the value of the |ns3| logging framework to
 debug simple and complex simulations alike. One of the important
 features that is provided by this logging framework is the automatic
 display of the network node id associated with the 'currently' running
@@ -170,7 +170,7 @@
 * Users need to be careful to propagate DoInitialize methods across objects
   by calling Initialize explicitly on their member objects
 * The context id associated with each ScheduleWithContext method has
-  other uses beyond logging: it is used by an experimental branch of ns-3
+  other uses beyond logging: it is used by an experimental branch of |ns3|
   to perform parallel simulation on multicore systems using
   multithreading.
 
@@ -180,22 +180,169 @@
 with ::GetContext.
 
 It is up to the models implemented on top of Simulator::* to interpret
-the context value. In ns-3, the network models interpret the context
+the context value. In |ns3|, the network models interpret the context
 as the node id of the node which generated an event. This is why it is
 important to call ScheduleWithContext in ns3::Channel subclasses
 because we are generating an event from node i to node j and we want
 to make sure that the event which will run on node j has the right
 context.
 
+Available Simulator Engines
+===========================
+
+|ns3| supplies two different types of basic simulator engine to manage 
+event execution.  These are derived from the abstract base class `SimulatorImpl`:
+
+*  `DefaultSimulatorImpl`  This is a classic sequential discrete event 
+   simulator engine which uses a single thread of execution.  This engine 
+   executes events as fast as possible.
+*  `DistributedSimulatorImpl` This is a classic YAWNS distributed ("parallel") 
+   simulator engine. By labeling and instantiating your model components 
+   appropriately this engine will execute the model in parallel across many
+   compute processes, yet in a time-synchronized way, as if the model had
+   executed sequentially. The two advantages are to execute models faster
+   and to execute models too large to fit in one compute node.  This engine also
+   attempts to execute as fast as possible.
+*  `NullMessageSimulatorImpl`  This implements a variant of the Chandy-
+   Misra-Bryant (CMB) null message algorithm for parallel simulation.
+   Like `DistributedSimulatorImpl` this requires appropriate labeling and
+   instantiation of model components. This engine attempts to execute
+   events as fast as possible.
+
+You can choose which simulator engine to use by setting a global variable, 
+for example::
+
+  GlobalValue::Bind ("SimulatorImplementationType",
+                     StringValue ("ns3::DistributedSimulatorImpl"));
+
+or by using a command line argument::
+
+.. sourcecode:: bash
+
+  $ ./ns3 run "...  -â€“SimulatorImplementationType=ns3::DistributedSimulatorImpl"
+
+In addition to the basic simulator engines there is a general facility used
+to build "adapters" which provide small behavior modifications to one of 
+the core `SimulatorImpl` engines.  The adapter base class is 
+`SimulatorAdapter`, itself derived from `SimulatorImpl`.  `SimluatorAdapter`
+uses the `PIMPL (pointer to implementation) <https://en.cppreference.com/w/cpp/language/pimpl>`_
+idiom to forward all calls to the configured base simulator engine.  
+This makes it easy to provide small customizations
+just by overriding the specific Simulator calls needed, and allowing 
+`SimulatorAdapter` to handle the rest.  
+
+There are few places where adapters are used currently:
+
+*  `ReadltimeSimulatorImpl`  This adapter attempts to execute in real time 
+   by pacing the wall clock evolution.  This pacing is "best effort", 
+   meaning actual event execution may not occur exactly in sync, but
+   close to it. This engine is normally only used with the 
+   `DefaultSimulatorImpl`, but it can be used to keep a distributed
+   simulation synchronized with real time.  See the :doc:`realtime` chapter.
+*  `VisualSimulatorImpl`  This adapter starts a live visualization of the 
+   running simulation, showing the network graph and each packet traversing
+   the links.
+*  `LocalTimeSimulatorImpl`  This adapter enables attaching noisy local clocks
+   to `Nodes`, then scheduling events with respect to the local noisy clock, 
+   instead of relative to the true simulator time.
+
+In addition to the PIMPL idiom of `SimulatorAdapter` there is a special
+per-event customization hook::
+
+  SimulatorImpl::PreEventHook( const EventId & id)
+
+One can use this to perform any housekeeping actions before the next event
+actually executes.
+   
+The distinction between a core engine and an adapter is the following: there 
+can only ever be one core engine running, while there can be several adapters
+chained up each providing a variation on the base engine execution.  
+For example one can use noisy local clocks with the real time adapter.
+
+A single adapter can be added on top of the `DefaultSimulatorImpl` by the same
+two methods above: binding the `"SimulatorImplementationType"` global value or
+using the command line argument.  To chain multipe adapters a different 
+approach must be used; see the `SimulatorAdapter::AddAdapter()`
+API documentation.
+
+The simulator engine type can be set once, but must be set before the
+first call to the `Simulator()` API.  In practice, since some models have
+to schedule their start up events when they are constructed, this means
+generally you should set the engine type before instantiating any other 
+model components.
+
+The engine type can be changed after `Simulator::Destroy()` but before
+any additional calls to the Simulator API, for instance when executing
+multiple runs in a single |ns3| invocation.
+
+
 Time
 ****
 
-*To be completed*
+|ns3| internally represents simulation times and durations as 
+64-bit signed integers (with the sign bit used for negative durations). 
+The time values are interpreted with respect to a "resolution" unit in the
+customary SI units: fs, ps, ns, us, ms, s, min, h, d, y.  
+The unit defines the minimum Time value. 
+It can be changed once before any calls to `Simulator::Run()`.
+It is not stored with the 64-bit time value itself.
+
+Times can be constructed from all standard numeric types 
+(using the configured default unit) 
+or with explicit units (as in `Time MicroSeconds (uint64_t value)`).
+Times can be compared, tested for sign or equality to zero, rounded to 
+a given unit, converted to standard numeric types in specific units.  
+All basic arithmetic operations are supported 
+(addition, subtraction, multiplication or division
+by a scalar (numeric value)). Times can be written to/read from IO streams. 
+In the case of writing it is easy to choose the output unit, different
+from the resolution unit.
 
 
 Scheduler
 *********
 
-*To be completed*
+The main job of the `Scheduler` classes is to maintain the priority queue of
+future events.  The scheduler can be set with a global variable,
+similar to choosing the `SimulatorImpl`::
+
+  GlobalValue::Bind ("SchedulerType", 
+                     StringValue ("ns3::DistributedSimulatorImpl"));
+
+The scheduler can be changed at any time via `Simulator::SetScheduler()`.
+The default scheduler is `MapScheduler` which uses a `std::map<>` to 
+store events in time order.
+
+Because event distributions vary by model there is no one
+best strategy for the priority queue, so |ns3| has several options with
+differing tradeoffs.  The example `utils/bench-simulator.c` can be used 
+to test the performance for a user-supplied event distribution.  
+For modest execution times (less than an hour, say) the choice of priority
+queue is usually not significant; configuring the build type to optimized
+is much more important in reducing execution times.
+
+The available scheduler types, and a summary of their time and space
+complexity on `Insert()` and `RemoveNext()`, are listed in the
+following table.  See the individual Scheduler API pages for details on the 
+complexity of the other API calls.
+
++-----------------------+-------------------------------------+-------------+--------------+----------+--------------+
+|  Scheduler Type                                             | Complexity                                           |
++-----------------------+-------------------------------------+-------------+--------------+----------+--------------+
+|                       |                                     | Time                       | Space                   |
+|  `SchedulerImpl` Type |               Method                +-------------+--------------+----------+--------------+
+|                       |                                     | Insert()    | RemoveNext() | Overhead |  Per Event   |
++=======================+=====================================+=============+==============+==========+==============+
+| CalendarScheduler     | `<std::list> []`                    | Constant    | Constant     | 24 bytes | 16 bytes     |
++-----------------------+-------------------------------------+-------------+--------------+----------+--------------+
+| HeapScheduler         | Heap on `std::vector`               | Logarithmic | Logaritmic   | 24 bytes | 0            |
++-----------------------+-------------------------------------+-------------+--------------+----------+--------------+
+| ListScheduler         | `std::list`                         | Linear      | Constant     | 24 bytes | 16 bytes     |
++-----------------------+-------------------------------------+-------------+--------------+----------+--------------+
+| MapScheduler          | `st::map`                           | Logarithmic | Constant     | 40 bytes | 32 bytes     |
++-----------------------+-------------------------------------+-------------+--------------+----------+--------------+
+| PriorityQueueSchduler | `std::priority_queue<,std::vector>` | Logarithimc | Logarithims  | 24 bytes | 0            |
++-----------------------+-------------------------------------+-------------+--------------+----------+--------------+
+
 
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/doc/manual/source/features.rst ns-3.36/doc/manual/source/features.rst
--- ns-3.35/doc/manual/source/features.rst	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/doc/manual/source/features.rst	2022-04-30 18:23:57.682732800 -0700
@@ -0,0 +1,20 @@
+.. only:: html or latex
+
+
+Additional Tools
+================
+
+This chapter covers some additional features provided by ns-3 which can be useful in writing models and scripts.
+
+.. toctree::
+   :maxdepth: 2
+
+   random-variables
+   hash-functions
+   tracing
+   data-collection
+   statistics
+   helpers
+   gnuplot
+   python
+
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/doc/manual/source/gnuplot.rst ns-3.36/doc/manual/source/gnuplot.rst
--- ns-3.35/doc/manual/source/gnuplot.rst	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/doc/manual/source/gnuplot.rst	2022-04-30 18:23:57.682732800 -0700
@@ -36,7 +36,7 @@
 
 .. sourcecode:: bash
 
-  $ ./waf --run src/stats/examples/gnuplot-example
+  $ ./ns3 run src/stats/examples/gnuplot-example
 
 This should produce the following gnuplot control files:
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/doc/manual/source/index.rst ns-3.36/doc/manual/source/index.rst
--- ns-3.35/doc/manual/source/index.rst	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/doc/manual/source/index.rst	2022-04-30 18:23:57.682732800 -0700
@@ -17,22 +17,9 @@
    :maxdepth: 2
 
    organization
-   working-with-git
-   random-variables
-   hash-functions
-   events
-   callbacks
-   object-model
-   attributes
-   object-names
-   logging
-   tracing
-   data-collection
-   statistics
-   realtime
-   helpers
+   simulator
+   features
+   develop
+
    utilities
-   gnuplot
-   python
-   tests
    support
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/doc/manual/source/logging.rst ns-3.36/doc/manual/source/logging.rst
--- ns-3.35/doc/manual/source/logging.rst	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/doc/manual/source/logging.rst	2022-04-30 18:23:57.682732800 -0700
@@ -49,7 +49,7 @@
 
 .. sourcecode:: bash
 
-   $ NS_LOG="*" ./waf --run first
+   $ NS_LOG="*" ./ns3 run first
 
 will run the ``first`` tutorial program with all logging output.  (The
 specifics of the ``NS_LOG`` format will be discussed below.)
@@ -58,7 +58,7 @@
 
 .. sourcecode:: bash
 
-   $ NS_LOG="Ipv4L3Protocol" ./waf --run first
+   $ NS_LOG="Ipv4L3Protocol" ./ns3 run first
 
 The output can be further tailored with prefix options.
   
@@ -115,7 +115,7 @@
 
 .. sourcecode:: bash
 
-   $ NS_LOG="print-list" ./waf --run ...
+   $ NS_LOG="print-list" ./ns3 run ...
 
    $ NS_LOG="foo"  # a token not matching any log-component
 
@@ -253,7 +253,7 @@
 
 .. sourcecode:: bash
 
-   $ NS_LOG="*=all|prefix_level" ./waf --run scratch-simulator
+   $ NS_LOG="*=all|prefix_level" ./ns3 run scratch-simulator
    Scratch Simulator
    [ERROR] error message
    [WARN] warn message
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/doc/manual/source/new-models.rst ns-3.36/doc/manual/source/new-models.rst
--- ns-3.35/doc/manual/source/new-models.rst	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/doc/manual/source/new-models.rst	2022-04-30 18:23:57.682732800 -0700
@@ -187,16 +187,16 @@
 makes sense to implement this in the ``src/network/`` module where |ns3|
 packets are implemented.  
 
-`waf` and `wscript`
-+++++++++++++++++++
+`cmake` and `CMakeLists.txt`
+++++++++++++++++++++++++++++
 
-|ns3| uses the `Waf <http://www.freehackers.org/~tnagy/waf.html>`_ build system.
-You will want to integrate your new |ns3| uses the Waf build system. You will
+|ns3| uses the `CMake <https://cmake.org/>`_ build system.
+You will want to integrate your new |ns3| uses the CMake build system. You will
 want to integrate your new source files into this system. This requires that you
-add your files to the ``wscript`` file found in each directory.  
+add your files to the ``CMakeLists.txt`` file found in each directory.
 
 Let's start with empty files error-model.h and error-model.cc, and add this to
-``src/network/wscript``. It is really just a matter of adding the .cc file to the
+``src/network/CMakeLists.txt``. It is really just a matter of adding the .cc file to the
 rest of the source files, and the .h file to the list of the header files. 
 
 Now, pop up to the top level directory and type "./test.py".  You
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/doc/manual/source/new-modules.rst ns-3.36/doc/manual/source/new-modules.rst
--- ns-3.35/doc/manual/source/new-modules.rst	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/doc/manual/source/new-modules.rst	2022-04-30 18:23:57.682732800 -0700
@@ -1,6 +1,9 @@
 .. include:: replace.txt
 .. highlight:: cpp
 
+
+.. _Adding a New Module to ns3:
+
 Adding a New Module to |ns3|
 ----------------------------
 
@@ -31,12 +34,12 @@
       bindings/
       doc/
       examples/
-        wscript
+        CMakeLists.txt
       helper/
       model/
       test/
         examples-to-run.py
-      wscript
+      CMakeLists.txt
 
 Not all directories will be present in each module.
 
@@ -67,10 +70,10 @@
 
   $ cd new-module
   $ ls
-  doc examples  helper  model  test  wscript
+  doc examples  helper  model  test  CMakeLists.txt
 
 In more detail, the ``create-module.py`` script will create the
-directories as well as initial skeleton ``wscript``, ``.h``, ``.cc``
+directories as well as initial skeleton ``CMakeLists.txt``, ``.h``, ``.cc``
 and ``.rst`` files.  The complete module with skeleton files looks like this:
 
 .. sourcecode:: text
@@ -81,7 +84,7 @@
 	  new-module.rst
 	examples/
 	  new-module-example.cc
-	  wscript
+	  CMakeLists.txt
 	helper/
 	  new-module-helper.cc
 	  new-module-helper.h
@@ -90,36 +93,53 @@
 	  new-module.h
 	test/
 	  new-module-test-suite.cc
-	wscript
+	CMakeLists.txt
 
 (If required the ``bindings/`` directory listed in
 :ref:`Step-0 <Step-0>` will be created automatically during
 the build.)
 
-We next walk through how to customize this module.  Informing ``waf``
+We next walk through how to customize this module.  Informing ``ns3``
 about the files which make up your module is done by editing the two
-``wscript`` files.  We will walk through the main steps in this chapter.
+``CMakeLists.txt`` files.  We will walk through the main steps in this chapter.
 
 All |ns3| modules depend on the ``core`` module and usually on
-other modules.  This dependency is specified in the ``wscript`` file
-(at the top level of the module, not the separate ``wscript`` file
-in the ``examples`` directory!).  In the skeleton ``wscript``
-the call that will declare your new module to ``waf`` will look
+other modules.  This dependency is specified in the ``CMakeLists.txt`` file
+(at the top level of the module, not the separate ``CMakeLists.txt`` file
+in the ``examples`` directory!).  In the skeleton ``CMakeLists.txt``
+the call that will declare your new module to ``ns3`` will look
 like this (before editing):
 
-.. sourcecode:: python
+.. sourcecode:: cmake
 
-  def build(bld):
-      module = bld.create_ns3_module('new-module', ['core'])
+  build_lib(
+    LIBNAME new-module 
+    SOURCE_FILES helper/new-module-helper.cc 
+                 model/new-module.cc
+    HEADER_FILES helper/new-module-helper.h 
+                 model/new-module.h
+    LIBRARIES_TO_LINK ${libcore}
+    TEST_SOURCES test/new-module-test-suite.cc
+  )
 
 Let's assume that ``new-module`` depends on the ``internet``,
-``mobility``, and ``aodv`` modules.  After editing it the ``wscript`` file
+``mobility``, and ``aodv`` modules.  After editing it the ``CMakeLists.txt`` file
 should look like:
 
-.. sourcecode:: python
+.. sourcecode:: cmake
 
-  def build(bld):
-      module = bld.create_ns3_module('new-module', ['internet', 'mobility', 'aodv'])
+    build_lib(
+      LIBNAME new-module 
+      SOURCE_FILES helper/new-module-helper.cc 
+                   model/new-module.cc
+      HEADER_FILES helper/new-module-helper.h 
+                   model/new-module.h
+      LIBRARIES_TO_LINK 
+        ${libinternet}
+        ${libmobility}
+        ${libaodv}
+      TEST_SOURCES test/new-module-test-suite.cc
+    )
 
 Note that only first level module dependencies should be listed, which
 is why we removed ``core``; the ``internet`` module in turn depends on
@@ -151,31 +171,49 @@
 *****************************
 
 The public header and source code files for your new module
-should be specified in the ``wscript`` file by modifying it with
+should be specified in the ``CMakeLists.txt`` file by modifying it with
 your text editor.
 
 As an example, after declaring the ``spectrum`` module,
-the ``src/spectrum/wscript`` specifies the source code files
-with the following list:
-
-.. sourcecode:: python
+the ``src/spectrum/CMakeLists.txt`` specifies the source code files
+with the following:
 
-   def build(bld):
+.. sourcecode:: cmake
 
-     module = bld.create_ns3_module('spectrum', ['internet', 'propagation', 'antenna', 'applications'])
-
-     module.source = [
-         'model/spectrum-model.cc',
-         'model/spectrum-value.cc',
-               .
-	       .
-	       .
-         'model/microwave-oven-spectrum-value-helper.cc',
-         'helper/spectrum-helper.cc',
-         'helper/adhoc-aloha-noack-ideal-phy-helper.cc',
-         'helper/waveform-generator-helper.cc',
-         'helper/spectrum-analyzer-helper.cc',
-         ]
+  set(source_files
+    helper/adhoc-aloha-noack-ideal-phy-helper.cc
+    helper/spectrum-analyzer-helper.cc
+    helper/spectrum-helper.cc
+    ...
+  )
+
+  set(header_files
+    helper/adhoc-aloha-noack-ideal-phy-helper.h
+    helper/spectrum-analyzer-helper.h
+    helper/spectrum-helper.h
+    ...
+  )
+
+  build_lib(
+    LIBNAME spectrum
+    SOURCE_FILES ${source_files}
+    HEADER_FILES ${header_files}
+    LIBRARIES_TO_LINK ${libpropagation}
+                      ${libantenna}
+    TEST_SOURCES
+      test/spectrum-ideal-phy-test.cc
+      test/spectrum-interference-test.cc
+      test/spectrum-value-test.cc
+      test/spectrum-waveform-generator-test.cc
+      test/three-gpp-channel-test-suite.cc
+      test/tv-helper-distribution-test.cc
+      test/tv-spectrum-transmitter-test.cc
+  )
+
+
+Note: the ``source_files`` and ``header_files`` lists are not necessary.
+They are used keep the ``build_lib`` macro readable for modules with many
+source files. 
 
 The objects resulting from compiling these sources will be assembled
 into a link library, which will be linked to any programs relying on this
@@ -187,31 +225,48 @@
 ************************************
 
 The header files defining the public API of your model and helpers
-also should be specified in the ``wscript`` file.
+also should be specified in the ``CMakeLists.txt`` file.
 
 Continuing with the ``spectrum`` model illustration,
 the public header files are specified with the following stanza.
-(Note that the argument to the ``bld`` function tells
-``waf`` to install this module's headers with the other |ns3| headers):
-
-.. sourcecode:: python
+(Note that the variable ``header_files`` tells
+``CMake`` to install this module's headers with the other |ns3| headers):
 
-    headers = bld(features='ns3header')
+.. sourcecode:: cmake
 
-    headers.module = 'spectrum'
-
-    headers.source = [
-        'model/spectrum-model.h',
-        'model/spectrum-value.h',
-               .
-	       .
-	       .
-        'model/microwave-oven-spectrum-value-helper.h',
-        'helper/spectrum-helper.h',
-        'helper/adhoc-aloha-noack-ideal-phy-helper.h',
-        'helper/waveform-generator-helper.h',
-        'helper/spectrum-analyzer-helper.h',
-        ]
+    set(header_files
+        helper/adhoc-aloha-noack-ideal-phy-helper.h
+        helper/spectrum-analyzer-helper.h
+        ...
+        model/tv-spectrum-transmitter.h
+        model/waveform-generator.h
+        model/wifi-spectrum-value-helper.h
+    )
+
+    build_lib(
+      LIBNAME spectrum
+      ...
+      HEADER_FILES ${header_files}
+      ...
+    )
+
+If the list of headers is short, use the following instead:
+
+.. sourcecode:: cmake
+
+    build_lib(
+      LIBNAME spectrum
+      ...
+      HEADER_FILES 
+        helper/adhoc-aloha-noack-ideal-phy-helper.h
+        helper/spectrum-analyzer-helper.h
+        ...
+        model/tv-spectrum-transmitter.h
+        model/waveform-generator.h
+        model/wifi-spectrum-value-helper.h
+      ...
+    )
+    
 
 Headers made public in this way will be accessible to users of your model
 with include statements like
@@ -233,18 +288,24 @@
 **********************
 
 If your new module has tests, then they must be specified in your
-``wscript`` file by modifying it with your text editor.
+``CMakeLists.txt`` file by modifying it with your text editor.
 
 The ``spectrum`` model tests are specified with the following stanza:
 
-.. sourcecode:: python
-
-    module_test = bld.create_ns3_module_test_library('spectrum')
+.. sourcecode:: cmake
 
-    module_test.source = [
-        'test/spectrum-interference-test.cc',
-        'test/spectrum-value-test.cc',
-        ]
+    build_lib(
+    LIBNAME spectrum
+    ...
+    TEST_SOURCES
+      test/spectrum-ideal-phy-test.cc
+      test/spectrum-interference-test.cc
+      test/spectrum-value-test.cc
+      test/spectrum-waveform-generator-test.cc
+      test/three-gpp-channel-test-suite.cc
+      test/tv-helper-distribution-test.cc
+      test/tv-spectrum-transmitter-test.cc
+  )
 
 See :doc:`Tests <tests>` for more information on how to write test cases.	
 
@@ -252,43 +313,46 @@
 *************************
 
 If your new module has examples, then they must be specified in your
-``examples/wscript`` file.  (The skeleton top-level ``wscript`` will
-recursively include ``examples/wscript`` only if the examples were
+``examples/CMakeLists.txt`` file.  (The skeleton top-level ``CMakeLists.txt`` will
+recursively include ``examples/CMakeLists.txt`` only if the examples were
 enabled at configure time.)
 
 The ``spectrum`` model defines it's first example in
-``src/spectrum/examples/wscript`` with
+``src/spectrum/examples/CMakeLists.txt`` with
 
-.. sourcecode:: python
+.. sourcecode:: cmake
 
-  def build(bld):
-    obj = bld.create_ns3_program('adhoc-aloha-ideal-phy',
-                                 ['spectrum', 'mobility'])
-    obj.source = 'adhoc-aloha-ideal-phy.cc'
-
-Note that the second argument to the function ``create_ns3_program()``
-is the list of modules that the program being created depends on; again,
-don't forget to include ``new-module`` in the list.  It's best practice
-to list only the direct module dependencies, and let ``waf`` deduce
-the full dependency tree.
+  build_lib_example(
+    NAME adhoc-aloha-ideal-phy
+    SOURCE_FILES adhoc-aloha-ideal-phy.cc
+    LIBRARIES_TO_LINK 
+      ${libspectrum}
+      ${libmobility}
+      ${libinternet}
+      ${libapplications}
+  )
+
+
+Note that the variable ``libraries_to_link`` is the list of modules that
+the program being created depends on; again, don't forget to include
+``new-module`` in the list.  It's best practice to list only the direct 
+module dependencies, and let ``CMake`` deduce the full dependency tree.
 
 Occasionally, for clarity, you may want to split the implementation
 for your example among several source files.  In this case, just
 include those files as additional explicit sources of the example:
 
-.. sourcecode:: python
-
-   obj = bld.create_ns3_program('new-module-example', [new-module])
-   obj.source = ['new-module-example.cc', 'new-module-example-part.cc']
-
-Python examples are specified using the following
-function call.  Note that the second argument for the function
-``register_ns3_script()`` is the list of modules that the Python example
-depends on:
-
-.. sourcecode:: python
-
-    bld.register_ns3_script('new-module-example.py', ['new-module'])
+.. sourcecode:: cmake
+ 
+  build_lib_example(
+    NAME new-module-example
+    SOURCE_FILES new-module-example.cc
+    LIBRARIES_TO_LINK 
+      ${libspectrum} 
+      ${libmobility} 
+      ${libinternet}
+      ${libapplications}
+  )
 
 Step 7 - Examples Run as Tests
 ******************************
@@ -330,14 +394,15 @@
 As indicated in the comment, each entry in the C++ list of examples to run
 contains the tuple ``(example_name, do_run, do_valgrind_run)``, where
 
-  * ``example_name`` is the executable to be run,
-  * ``do_run`` is a condition under which to run the example, and
-  * ``do_valgrind_run`` is a condition under which to run the example
-    under valgrind.  (This is needed because NSC causes illegal instruction
-    crashes with some tests when they are run under valgrind.)
+* ``example_name`` is the executable to be run,
+* ``do_run`` is a condition under which to run the example, and
+* ``do_valgrind_run`` is a condition under which to run the example
+  under valgrind.  (This is needed because NSC causes illegal instruction
+  crashes with some tests when they are run under valgrind.)
 
 Note that the two conditions are Python statements that
-can depend on ``waf`` configuration variables.  For example,
+can depend on ``ns3`` configuration variables.  For example, using the
+NSC_ENABLED variable that was defined up until ns-3.35:
 
 .. sourcecode:: python
 
@@ -346,11 +411,11 @@
 Each entry in the Python list of examples to run contains the tuple
 ``(example_name, do_run)``, where, as for the C++ examples,
 
-  * ``example_name`` is the Python script to be run, and
-  * ``do_run`` is a condition under which to run the example.
+* ``example_name`` is the Python script to be run, and
+* ``do_run`` is a condition under which to run the example.
 
 Again, the condition is a Python statement that can
-depend on ``waf`` configuration variables.  For example,
+depend on ``ns3`` configuration variables.  For example,
 
 .. sourcecode:: python
 
@@ -361,14 +426,14 @@
 ****************************
 
 You can now configure, build and test your module as normal.
-You must reconfigure the project as a first step so that ``waf``
-caches the new information in your ``wscript`` files,
+You must reconfigure the project as a first step so that ``ns3``
+caches the new information in your ``CMakeLists.txt`` files,
 or else your new module will not be included in the build.
 
 .. sourcecode:: bash
 
-  $ ./waf configure --enable-examples --enable-tests
-  $ ./waf build
+  $ ./ns3 configure --enable-examples --enable-tests
+  $ ./ns3 build
   $ ./test.py
 
 Look for your new module's test suite (and example programs,
@@ -378,15 +443,10 @@
 Step 9 - Python Bindings
 ************************
 
-Adding Python bindings to your module is optional, and the step is
-commented out by default in the ``create-module.py`` script.
-
-.. sourcecode:: python
-
-    # bld.ns3_python_bindings()
+Adding Python bindings to your module is optional.
 
 If you want to include Python bindings (needed only if you want
 to write Python ns-3 programs instead of C++ ns-3 programs), you
-should uncomment the above and install the Python API scanning
-system (covered elsewhere in this manual) and scan your module to
-generate new bindings.
+should scan your module to generate new bindings for the Python 
+API (covered elsewhere in this manual), and they will be used 
+if NS3_PYTHON_BINDINGS is set to ON.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/doc/manual/source/profiling.rst ns-3.36/doc/manual/source/profiling.rst
--- ns-3.35/doc/manual/source/profiling.rst	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/doc/manual/source/profiling.rst	2022-04-30 18:23:57.682732800 -0700
@@ -0,0 +1,1095 @@
+.. include:: replace.txt
+.. highlight:: bash
+
+Profiling
+---------
+
+Memory profiling is essential to identify issues that
+may cause memory corruption, which may lead to all sorts of 
+side-effects, such as crashing after many hours of simulation and
+producing wrong results that invalidate the entire simulation.
+
+It also can help tracking sources of excessive memory allocations, 
+the size of these allocations and memory usage during simulation. 
+These can affect simulation performance, or limit the complexity 
+and the number of concurrent simulations.
+
+Performance profiling on the other hand is essential for 
+high-performance applications, as it allows for the identification
+of bottlenecks and their mitigation.
+
+Another type of profiling is related to system calls. They
+can be used to debug issues and identify hotspots that 
+may cause performance issues in specific conditions. Excessive
+calls results in more context switches, which interrupt the 
+simulations, ultimately slowing them down. 
+
+Other than profiling the simulations, which can highlight bottlenecks
+in the simulator, we can also profile the compilation process. 
+This allows us to identify and fix bottlenecks, which speed up 
+build times.
+
+
+Memory Profilers
+****************
+
+.. _Sanitizers : https://github.com/google/sanitizers/wiki
+.. _Heaptrack : https://apps.kde.org/heaptrack/
+.. _Valgrind: https://valgrind.org/
+.. _MacOS's leaks: https://developer.apple.com/library/archive/documentation/Performance/Conceptual/ManagingMemory/Articles/FindingLeaks.html
+.. _Bytehound : https://github.com/koute/bytehound
+.. _gperftools : https://github.com/gperftools/gperftools
+
+Memory profilers are tools that help identifying memory related 
+issues.
+
+There are two well known tools for finding bugs such as uninitialized memory usage,
+out-of-bound accesses, dereferencing null pointers and other memory-related bugs:
+
+* `Valgrind`_
+  
+  * Pros: very rich tooling, no need to recompile programs to profile the program.
+  * Cons: very slow and limited to Linux and MacOS.
+* `Sanitizers`_
+  
+  * Pros: sanitizers are distributed along with compilers, such as GCC, Clang and MSVC.
+    They are widely available, cross platform and faster than Valgrind.
+  * Cons: false positives, high memory usage, memory sanitizer is incompatible 
+    with other sanitizers (e.g. address sanitizer), requiring two instrumented 
+    compilations and two test runs. The memory sanitizer requires Clang.
+
+There are also tools to count memory allocations, track memory usage and memory leaks,
+such as: `Heaptrack`_, `MacOS's leaks`_, `Bytehound`_ and `gperftools`_.
+
+An overview on how to use `Valgrind`_, `Sanitizers`_ and
+`Heaptrack`_ is provided in the following sections.
+
+Valgrind
+++++++++
+
+.. _manual : https://valgrind.org/docs/manual/mc-manual.html
+
+`Valgrind`_ is suite of profiling tools, being the main tool called Memcheck.
+To check for memory errors including leaks, one can call valgrind directly:
+
+.. sourcecode:: console
+
+    valgrind --leak-check=yes ./relative/path/to/program argument1 argument2
+
+Or can use the ``ns3`` script:
+
+.. sourcecode:: console
+
+    ./ns3 run "program argument1 argument2" --valgrind
+
+Additional Valgrind options are listed on its `manual`_.
+
+Sanitizers
+++++++++++
+
+`Sanitizers`_ are a suite of libraries made by Google and part of the LLVM project,
+used to profile programs at runtime and find issues related to undefined behavior,
+memory corruption (out-of-bound access, uninitialized memory use), leaks, race
+conditions and others.
+
+Sanitizers are shipped with most modern compilers and can be used by instructing the 
+compiler to link the required libraries and instrument the code.
+
+To build ns-3 with sanitizers, enable the ``NS3_SANITIZE`` option. This can be done
+directly via CMake: 
+
+.. sourcecode:: console
+
+    ~/ns-3-dev/cmake_cache/$ cmake -DNS3_SANITIZE=ON ..
+
+Or via the ``ns3`` wrapper:
+
+.. sourcecode:: console
+
+    ~/ns-3-dev$ ./ns3 configure --enable-sanitizers
+
+.. _issue 166 : https://gitlab.com/nsnam/ns-3-dev/-/issues/166
+.. _MR703 : https://gitlab.com/nsnam/ns-3-dev/-/merge_requests/703
+.. _MR704 : https://gitlab.com/nsnam/ns-3-dev/-/merge_requests/704
+
+The memory sanitizer can be enabled with ``NS3_SANITIZE_MEMORY``, but it is not
+compatible with ``NS3_SANITIZE`` and only works with the Clang compiler.
+
+Sanitizers were used to find issues in multiple occasions:
+
+* A global buffer overflow in the LTE module
+
+  * When the wrong index (-1) was used to access a ``int [][]`` variable, a different variable that is stored closely in memory was accessed.
+  * In the best case scenario, this results in reading an incorrect value that causes the program to fail
+  * In the worst case scenario, this value is overwritten corrupting the program memory
+  * The likely scenario: wrong value is read and the program continued running, potentially producing incorrect results
+
+  .. sourcecode:: console
+
+    ~/ns-3-dev/src/lte/model/lte-amc.cc:303:43: runtime error: index -1 out of bounds for type 'int [110][27]'
+    =================================================================
+    ==51636==ERROR: AddressSanitizer: global-buffer-overflow on address 0x7fe78cc2dbbc at pc 0x7fe78ba65e65 bp 0x7ffde70b25c0 sp 0x7ffde70b25b0
+    READ of size 4 at 0x7fe78cc2dbbc thread T0
+        #0 0x7fe78ba65e64 in ns3::LteAmc::GetDlTbSizeFromMcs(int, int) ~/ns-3-dev/src/lte/model/lte-amc.cc:303
+        #1 0x7fe78c538aba in ns3::TdTbfqFfMacScheduler::DoSchedDlTriggerReq(ns3::FfMacSchedSapProvider::SchedDlTriggerReqParameters const&) ~/ns-3-dev/src/lte/model/tdtbfq-ff-mac-scheduler.cc:1160
+        #2 0x7fe78c564736 in ns3::MemberSchedSapProvider<ns3::TdTbfqFfMacScheduler>::SchedDlTriggerReq(ns3::FfMacSchedSapProvider::SchedDlTriggerReqParameters const&) ~/ns-3-dev/build/include/ns3/ff-mac-sched-sap.h:409
+        #3 0x7fe78c215596 in ns3::LteEnbMac::DoSubframeIndication(unsigned int, unsigned int) ~/ns-3-dev/src/lte/model/lte-enb-mac.cc:588
+        #4 0x7fe78c20921d in ns3::EnbMacMemberLteEnbPhySapUser::SubframeIndication(unsigned int, unsigned int) ~/ns-3-dev/src/lte/model/lte-enb-mac.cc:297
+        #5 0x7fe78b924105 in ns3::LteEnbPhy::StartSubFrame() ~/ns-3-dev/src/lte/model/lte-enb-phy.cc:764
+        #6 0x7fe78b949d54 in ns3::MakeEvent<void (ns3::LteEnbPhy::*)(), ns3::LteEnbPhy*>(void (ns3::LteEnbPhy::*)(), ns3::LteEnbPhy*)::EventMemberImpl0::Notify() (~/ns-3-dev/build/lib/libns3-dev-lte-deb.so+0x3a9cd54)
+        #7 0x7fe795252022 in ns3::EventImpl::Invoke() ~/ns-3-dev/src/core/model/event-impl.cc:51
+        #8 0x7fe795260de2 in ns3::DefaultSimulatorImpl::ProcessOneEvent() ~/ns-3-dev/src/core/model/default-simulator-impl.cc:151
+        #9 0x7fe795262dbd in ns3::DefaultSimulatorImpl::Run() ~/ns-3-dev/src/core/model/default-simulator-impl.cc:204
+        #10 0x7fe79525436f in ns3::Simulator::Run() ~/ns-3-dev/src/core/model/simulator.cc:176
+        #11 0x7fe7b0f77ee2 in LteDistributedFfrAreaTestCase::DoRun() ~/ns-3-dev/src/lte/test/lte-test-frequency-reuse.cc:1777
+        #12 0x7fe7952d125a in ns3::TestCase::Run(ns3::TestRunnerImpl*) ~/ns-3-dev/src/core/model/test.cc:363
+        #13 0x7fe7952d0f4d in ns3::TestCase::Run(ns3::TestRunnerImpl*) ~/ns-3-dev/src/core/model/test.cc:357
+        #14 0x7fe7952e39c0 in ns3::TestRunnerImpl::Run(int, char**) ~/ns-3-dev/src/core/model/test.cc:1094
+        #15 0x7fe7952e427e in ns3::TestRunner::Run(int, char**) ~/ns-3-dev/src/core/model/test.cc:1118
+        #16 0x564a13d67c9c in main ~/ns-3-dev/utils/test-runner.cc:23
+        #17 0x7fe793cde0b2 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x270b2)
+        #18 0x564a13d67bbd in _start (~/ns-3-dev/build/utils/test-runner+0xae0bbd)
+    0x7fe78cc2dbbc is located 40 bytes to the right of global variable 'McsToItbsUl' defined in '~/ns-3-dev/src/lte/model/lte-amc.cc:105:18' (0x7fe78cc2db20) of size 116
+    0x7fe78cc2dbbc is located 4 bytes to the left of global variable 'TransportBlockSizeTable' defined in '~/ns-3-dev/src/lte/model/lte-amc.cc:118:18' (0x7fe78cc2dbc0) of size 11880
+    SUMMARY: AddressSanitizer: global-buffer-overflow ~/ns-3-dev/src/lte/model/lte-amc.cc:303 in ns3::LteAmc::GetDlTbSizeFromMcs(int, int)
+    Shadow bytes around the buggy address:
+      0x0ffd7197db50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 f9
+      0x0ffd7197db60: f9 f9 f9 f9 00 00 00 00 00 00 00 00 00 00 00 00
+    =>0x0ffd7197db70: 00 00 04 f9 f9 f9 f9[f9]00 00 00 00 00 00 00 00
+    Shadow byte legend (one shadow byte represents 8 application bytes):
+      Addressable:           00
+      Partially addressable: 01 02 03 04 05 06 07 
+      Global redzone:        f9
+    ==51636==ABORTING
+
+  * The output above shows the type of error (``global-buffer-overflow``), 
+    the stack-trace of where the bug happened (``LteAmc::GetDlTbSizeFromMcs``), 
+    affected variables (``McsToItbsUl`` and ``TransportBlockSizeTable``), 
+    and a shadow bytes map, showing the wrong access between square brackets.
+  * The the global redzone (f9) shadow bytes are empty memory allocated between global variables (00s and 04s), 
+    which are left there to be corrupted by the bugged program.
+    Any eventual corruption is then traced back to the source, without affecting the program execution.
+  * The adopted solution in merge request `MR703`_ was to fix one of the schedulers that could produce the index value of -1,
+    and updating the asserts to catch the illegal index value.
+
+* A wrong downcast in the Wimax module:
+  
+  * The pointer was casted incorrectly to U16TlvValue instead of U8TvlValue, which could have different sizes in memory
+    leading to the program reading the wrong memory address. 
+    Reading the wrong memory address can result in unexpected or invalid values being read, which could change the 
+    program flow and corrupt memory, producing wrong simulation results or crashing the program. 
+  
+  .. sourcecode:: console
+
+    ~/ns-3-dev/src/wimax/model/service-flow.cc:159:86: runtime error: downcast of address 0x6020000148b0 which does not point to an object of type 'U16TlvValue'
+    0x6020000148b0: note: object is of type 'ns3::U8TlvValue'
+    48 00 00 36  c8 09 02 62 5c 7f 00 00  00 be be be be be be be  03 00 00 00 00 00 00 04  10 00 00 00
+                  ^~~~~~~~~~~~~~~~~~~~~~~
+                  vptr for 'ns3::U8TlvValue'
+    ~/ns-3-dev/src/wimax/model/service-flow.cc:159:99: runtime error: member call on address 0x6020000148b0 which does not point to an object of type 'U16TlvValue'
+    0x6020000148b0: note: object is of type 'ns3::U8TlvValue'
+    48 00 00 36  c8 09 02 62 5c 7f 00 00  00 be be be be be be be  03 00 00 00 00 00 00 04  10 00 00 00
+                  ^~~~~~~~~~~~~~~~~~~~~~~
+                  vptr for 'ns3::U8TlvValue'
+    ~/ns-3-dev/src/wimax/model/wimax-tlv.cc:589:10: runtime error: member access within address 0x6020000148b0 which does not point to an object of type 'U16TlvValue'
+    0x6020000148b0: note: object is of type 'ns3::U8TlvValue'
+    48 00 00 36  c8 09 02 62 5c 7f 00 00  00 be be be be be be be  03 00 00 00 00 00 00 04  10 00 00 00
+                  ^~~~~~~~~~~~~~~~~~~~~~~
+                  vptr for 'ns3::U8TlvValue'
+
+  * The bug was fixed with the correct cast in merge request `MR704`_.
+
+
+Heaptrack
++++++++++
+
+.. _KDE : https://kde.org
+
+`Heaptrack`_ is an utility made by `KDE`_ to trace memory allocations
+along with stack traces, allowing developers to identify code responsible
+for possible memory leaks and unnecessary allocations.
+
+For the examples below we used the default configuration of ns-3,
+with the output going to the ``build`` directory. The actual executable 
+for the ``wifi-he-network`` example is ``./build/examples/wireless/ns3-dev-wifi-he-network``, which is what is 
+executed by ``./ns3 run wifi-he-network``.
+
+To collect information of a program (in this case the ``wifi-he-network``
+example), run:
+
+.. sourcecode:: console
+
+   ~ns-3-dev/$ heaptrack ./build/examples/wireless/ns3-dev-wifi-he-network --simulationTime=0.3 --frequency=5 --useRts=1 --minExpectedThroughput=6 --maxExpectedThroughput=745
+
+If you prefer to use the ``ns3`` wrapper, try:
+
+.. sourcecode:: console
+
+   ~ns-3-dev/$ ./ns3 run "wifi-he-network --simulationTime=0.3 --frequency=5 --useRts=1 --minExpectedThroughput=6 --maxExpectedThroughput=745" --command-template "heaptrack %s" --no-build 
+
+In both cases, heaptrack will print to the terminal the output file:
+
+.. sourcecode:: console
+
+    ~ns-3-dev/$ ./ns3 run "wifi-he-network --simulationTime=0.3 --frequency=5 --useRts=1 --minExpectedThroughput=6 --maxExpectedThroughput=745" --command-template "heaptrack %s" --no-build 
+    heaptrack output will be written to "~ns-3-dev/heaptrack.ns3-dev-wifi-he-network.210305.zst"
+    starting application, this might take some time...
+    MCS value               Channel width           GI                      Throughput
+    0                       20 MHz                  3200 ns                 5.91733 Mbit/s
+    0                       20 MHz                  1600 ns                 5.91733 Mbit/s
+    ...
+    11                      160 MHz                 1600 ns                 479.061 Mbit/s
+    11                      160 MHz                 800 ns                  524.459 Mbit/s
+    heaptrack stats:
+            allocations:            149185947
+            leaked allocations:     10467
+            temporary allocations:  21145932
+    Heaptrack finished! Now run the following to investigate the data:
+
+        heaptrack --analyze "~/ns-3-dev/heaptrack.ns3-dev-wifi-he-network.210305.zst"
+
+The output above shows a summary of the stats collected: ~149 million allocations, 
+~21 million temporary allocations and ~10 thousand possible leaked allocations.
+
+If ``heaptrack-gui`` is installed, running ``heaptrack`` will launch it. If it is not installed, 
+the command line interface will be used.
+
+.. sourcecode:: console
+
+    ~/ns-3-dev$ heaptrack --analyze "~/ns-3-dev/heaptrack.ns3-dev-wifi-he-network.210305.zst"
+    reading file "~/ns-3-dev/heaptrack.ns3-dev-wifi-he-network.210305.zst" - please wait, this might take some time...
+    Debuggee command was: ~/ns-3-dev/build/examples/wireless/ns3-dev-wifi-he-network --simulationTime=0.3 --frequency=5 --useRts=1 --minExpectedThroughput=6 --maxExpectedThroughput=745
+    finished reading file, now analyzing data:
+
+    MOST CALLS TO ALLOCATION FUNCTIONS
+    23447502 calls to allocation functions with 1.12MB peak consumption from
+    ns3::Packet::Copy() const
+    in ~/ns-3-dev/build/lib/libns3-dev-network.so
+    4320000 calls with 0B peak consumption from:
+        ns3::UdpSocketImpl::DoSendTo(ns3::Ptr<>, ns3::Ipv4Address, unsigned short, unsigned char)
+        in ~/ns-3-dev/build/lib/libns3-dev-internet.so
+        ns3::UdpSocketImpl::DoSend(ns3::Ptr<>)
+        in ~/ns-3-dev/build/lib/libns3-dev-internet.so
+        ns3::UdpSocketImpl::Send(ns3::Ptr<>, unsigned int)
+        in ~/ns-3-dev/build/lib/libns3-dev-internet.so
+        ns3::Socket::Send(ns3::Ptr<>)
+        in ~/ns-3-dev/build/lib/libns3-dev-network.so
+        ns3::UdpClient::Send()
+        in ~/ns-3-dev/build/lib/libns3-dev-applications.so
+        ns3::DefaultSimulatorImpl::ProcessOneEvent()
+        in ~/ns-3-dev/build/lib/libns3-dev-core.so
+        ns3::DefaultSimulatorImpl::Run()
+        in ~/ns-3-dev/build/lib/libns3-dev-core.so
+        main
+        in ~/ns-3-dev/build/examples/wireless/ns3-dev-wifi-he-network
+
+    ...
+
+    MOST TEMPORARY ALLOCATIONS
+    6182320 temporary allocations of 6182701 allocations in total (99.99%) from
+    ns3::QueueDisc::DropBeforeEnqueue(ns3::Ptr<>, char const*)
+    in ~/ns-3-dev/build/lib/libns3-dev-traffic-control.so
+    1545580 temporary allocations of 1545580 allocations in total (100.00%) from:
+        std::_Function_handler<>::_M_invoke(std::_Any_data const&, ns3::Ptr<>&&, char const*&&)
+        in ~/ns-3-dev/build/lib/libns3-dev-traffic-control.so
+        std::function<>::operator()(ns3::Ptr<>, char const*) const
+        in ~/ns-3-dev/build/lib/libns3-dev-traffic-control.so
+        ns3::MemPtrCallbackImpl<>::operator()(ns3::Ptr<>, char const*)
+        in ~/ns-3-dev/build/lib/libns3-dev-traffic-control.so
+        ns3::TracedCallback<>::operator()(ns3::Ptr<>, char const*) const
+        in ~/ns-3-dev/build/lib/libns3-dev-traffic-control.so
+        ns3::QueueDisc::DropBeforeEnqueue(ns3::Ptr<>, char const*)
+        in ~/ns-3-dev/build/lib/libns3-dev-traffic-control.so
+        ns3::CoDelQueueDisc::DoEnqueue(ns3::Ptr<>)
+        in ~/ns-3-dev/build/lib/libns3-dev-traffic-control.so
+        ns3::QueueDisc::Enqueue(ns3::Ptr<>)
+        in ~/ns-3-dev/build/lib/libns3-dev-traffic-control.so
+        ns3::FqCoDelQueueDisc::DoEnqueue(ns3::Ptr<>)
+        in ~/ns-3-dev/build/lib/libns3-dev-traffic-control.so
+        ns3::QueueDisc::Enqueue(ns3::Ptr<>)
+        in ~/ns-3-dev/build/lib/libns3-dev-traffic-control.so
+        ns3::TrafficControlLayer::Send(ns3::Ptr<>, ns3::Ptr<>)
+        in ~/ns-3-dev/build/lib/libns3-dev-traffic-control.so
+        ns3::Ipv4Interface::Send(ns3::Ptr<>, ns3::Ipv4Header const&, ns3::Ipv4Address)
+        in ~/ns-3-dev/build/lib/libns3-dev-internet.so
+        ns3::Ipv4L3Protocol::SendRealOut(ns3::Ptr<>, ns3::Ptr<>, ns3::Ipv4Header const&)
+        in ~/ns-3-dev/build/lib/libns3-dev-internet.so
+        ns3::Ipv4L3Protocol::Send(ns3::Ptr<>, ns3::Ipv4Address, ns3::Ipv4Address, unsigned char, ns3::Ptr<>)
+        in ~/ns-3-dev/build/lib/libns3-dev-internet.so
+        ns3::UdpL4Protocol::Send(ns3::Ptr<>, ns3::Ipv4Address, ns3::Ipv4Address, unsigned short, unsigned short, ns3::Ptr<>)
+        in ~/ns-3-dev/build/lib/libns3-dev-internet.so
+        ns3::UdpSocketImpl::DoSendTo(ns3::Ptr<>, ns3::Ipv4Address, unsigned short, unsigned char)
+        in ~/ns-3-dev/build/lib/libns3-dev-internet.so
+        ns3::UdpSocketImpl::DoSend(ns3::Ptr<>)
+        in ~/ns-3-dev/build/lib/libns3-dev-internet.so
+        ns3::UdpSocketImpl::Send(ns3::Ptr<>, unsigned int)
+        in ~/ns-3-dev/build/lib/libns3-dev-internet.so
+        ns3::Socket::Send(ns3::Ptr<>)
+        in ~/ns-3-dev/build/lib/libns3-dev-network.so
+        ns3::UdpClient::Send()
+        in ~/ns-3-dev/build/lib/libns3-dev-applications.so
+        ns3::DefaultSimulatorImpl::ProcessOneEvent()
+        in ~/ns-3-dev/build/lib/libns3-dev-core.so
+        ns3::DefaultSimulatorImpl::Run()
+        in ~/ns-3-dev/build/lib/libns3-dev-core.so
+        main
+        in ~/ns-3-dev/build/examples/wireless/ns3-dev-wifi-he-network
+
+    ...
+
+    total runtime: 156.30s.
+    calls to allocation functions: 149185947 (954466/s)
+    temporary memory allocations: 21757614 (139201/s)
+    peak heap memory consumption: 4.87MB
+    peak RSS (including heaptrack overhead): 42.02MB
+    total memory leaked: 895.45KB
+
+
+The terminal output above lists the most frequently called functions that allocated memory.
+
+Here is a short description of what each line of the last block of the output means:
+
+* Allocation functions are all functions that allocated memory, either explicitly
+  via C-style ``malloc`` and C++ ``new``, or implicitly via RAII and automatic conversions.
+
+* Temporary memory allocations are allocations that are followed by the
+  deallocation without modifying the data.
+
+* Peak heap memory is the maximum memory allocated by the program throughout its execution.
+  The memory allocator may reuse memory freed by previous destructors, ``del`` and ``free`` calls,
+  reducing the number of system calls and maximum memory allocated.
+
+* RSS is the Resident Set Size, which is the amount of physical memory occupied by the process.
+
+* Total memory leak refers to memory allocated but never freed. This includes static initialization,
+  so it is not uncommon to be different than 0KB. However this does not mean the program does not
+  have memory leaks. Other memory profilers such as Valgrind and memory sanitizers are better
+  suited to track down memory leaks. 
+
+Based on the stack trace, it is fairly easy to locate the corresponding code and act on it to
+reduce the number of allocations.
+
+.. _MR830 : https://gitlab.com/nsnam/ns-3-dev/-/merge_requests/830
+
+In the case of ``ns3::QueueDisc::DropBeforeEnqueue`` shown above, the
+allocations were caused by the transformation of C strings (``char*``) into C++ strings
+(std::string) before performing the search in ns3::QueueDisc::Stats maps.
+These unnecessary allocations were prevented by making use of the transparent
+comparator ``std::less<>``, part of merge request `MR830`_.
+
+Heaptrack also has a GUI that provides the same information printed by the command line interface,
+but in a more interactive way.
+
+.. image:: figures/heaptrack.png
+
+Heaptrack was used in merge request `MR830`_ to track and reduce the number of allocations
+in the ``wifi-he-network`` example mentioned above. About 29 million unnecessary allocations 
+were removed, which translates to a 20% reduction. This resulted in a 1.07x speedup of the
+test suite with Valgrind (``./test.py -d -g``) and 1.02x speedup without it.
+
+
+Performance Profilers
+*********************
+
+.. _Perf : https://perf.wiki.kernel.org/index.php/Tutorial
+.. _Hotspot : https://github.com/KDAB/hotspot
+.. _AMD uProf : https://developer.amd.com/amd-uprof/
+.. _Intel VTune : https://www.intel.com/content/www/us/en/develop/documentation/get-started-with-vtune/top.html
+.. _Windows Performance Toolkit : https://docs.microsoft.com/en-us/windows-hardware/test/wpt/
+.. _Sysprof : https://wiki.gnome.org/Apps/Sysprof
+.. _Oprofile : https://oprofile.sourceforge.io/faq/
+.. _Gprof : https://sourceware.org/binutils/docs/gprof/
+
+Performance profilers are programs that collect runtime information and help to
+identify performance bottlenecks. In some cases, they can point out hotspots
+and suggest solutions. 
+
+There are many tools to profile your program, including: 
+
+* profilers from CPU manufacturers, such as `AMD uProf`_ and `Intel VTune`_
+* profilers from the operating systems, such as Linux's `Perf`_ and `Windows Performance Toolkit`_
+  
+  * `Perf`_ also has a few graphical user interfaces available, being `Hotspot`_ one of them
+* instrumented compilation and auxiliary tools provided by compilers, such as `Gprof`_
+* third-party tools, such as `Sysprof`_ and `Oprofile`_ 
+
+An overview on how to use `Perf`_ with `Hotspot`_, `AMD uProf`_ and
+`Intel VTune`_ is provided in the following sections.
+
+.. _Linux Perf and Hotspot GUI :
+
+Linux Perf and Hotspot GUI
+++++++++++++++++++++++++++
+
+`Perf`_ is the kernel tool to measure performance of the Linux kernel,
+drivers and user-space applications. 
+
+Perf tracks some performance events, being some of the most important for performance:
+
+* cycles
+  
+  * Clocks (time) spent running.
+* cache-misses
+  
+  * When either data or instructions were not in the L1/L2 caches, requiring 
+    a L3 or memory access.
+* branch-misses
+  
+  * How many branch instructions were mispredicted.
+    Mispredictions causes the CPU to stall and clean the pipeline, 
+    slowing down the program.
+* stalled-cycles-frontend
+  
+  * Cycles wasted by the processor waiting for the next instruction,
+    usually due to instruction cache miss or mispredictions.
+    Starves the CPU pipeline of instructions and slows down the program.
+* stalled-cycles-backend
+  
+  * Cycles wasted waiting for pipeline resources to finish their work.
+    Usually waiting for memory read/write, or executing long-latency instructions.
+
+
+Just like with ``heaptrack``, perf can be executed using the ``ns3`` wrapper
+command template. In the following command we output perf data from ``wifi-he-network``
+to the ``perf.data`` output file.
+
+.. sourcecode:: console
+
+
+    ~/ns-3-dev$ ./ns3 run "wifi-he-network --simulationTime=0.3 --frequency=5 --useRts=1 --minExpectedThroughput=6 --maxExpectedThroughput=745" --command-template "perf record -o ./perf.data --call-graph dwarf --event cycles,cache-misses,branch-misses --sample-cpu %s" --no-build
+
+
+`Hotspot`_ is a GUI for Perf, that makes performance profiling more 
+enjoyable and productive. It can parse the ``perf.data`` and show in 
+a more friendly way.
+
+To record the same perf.data from Hotspot directly, fill the fields
+for working directory, path to the executable, arguments, perf 
+events to track and output directory for the ``perf.data``.
+Then run to start recording.
+
+.. image:: figures/hotspot-setup.png
+
+The cycles per function for this program is shown in the following
+image.
+
+.. image:: figures/hotspot-cycles.png
+
+The data is also presented in a tabular format in the bottom-up, 
+top-down and caller/callee tabs (top left of the screen).
+
+.. image:: figures/hotspot-top-down.png
+
+.. _issue 280 : https://gitlab.com/nsnam/ns-3-dev/-/issues/280
+.. _issue 426 : https://gitlab.com/nsnam/ns-3-dev/-/issues/426
+.. _MR681 : https://gitlab.com/nsnam/ns-3-dev/-/merge_requests/681
+.. _MR685 : https://gitlab.com/nsnam/ns-3-dev/-/merge_requests/685
+
+Hotspot was used to identify performance bottlenecks in multiple occasions:
+
+#.  ``wifi-primary-channels`` test suite was extremely slow due to unnecessary RF processing.
+    The adopted solution was to replace the filtering step of the entire channel to just the desired
+    sub-band, and assuming sub-bands are uniformly sized, saving multiplications in the integral
+    used to compute the power of each sub-band. This resulted in a 6x speedup with 
+    ``./ns3 run "test-runner --fullness=TAKES_FOREVER --test-name=wifi-primary-channels"``. 
+    Hotspot was used along with AMD uProf to track this and other bottlenecks in `issue 426`_.
+
+#.  ``WifiMacQueue::TtlExceeded`` dereferenced data out of cache when calling Simulator::Now().
+    The adopted solution was to move Simulator::Now() out of TtlExceeded and reuse the value
+    and inlining TtlExceeded. This resulted in a ~1.20x speedup with the test suite (``./test.py -d``).
+    Hotspot was used along with AMD uProf to track this and other bottlenecks in `issue 280`_ 
+    and merge request `MR681`_.
+
+#.  MpduAggregator and MsduAggregator required an expensive attribute lookup to get the maximum sizes
+    from the RegularWifiMac. Bypassing the attribute lookup reduced cache misses and unnecessary branches.
+    The adopted solution was to move Simulator::Now() out of TtlExceeded and reuse the value
+    and inlining TtlExceeded. This resulted in a ~1.02x speedup with the test suite (``./test.py -d``).
+    More details on: merge requests `MR681`_ and `MR685`_.
+
+
+AMD uProf
++++++++++
+
+`AMD uProf`_ works much like `Linux Perf and Hotspot GUI`_, but 
+is available in more platforms (Linux, Windows and BSD) using AMD
+processors. Differently from Perf, it provides more performance 
+trackers for finer analysis.
+
+To use it, open uProf then click to profile an application. If you
+have already profile an application, you can reuse those settings for
+another application by clicking in one of the items in the ``Recently Used
+Configurations`` section.
+
+.. image:: figures/uprof-start.png
+
+Fill the fields with the application path, the arguments and 
+the working directory. 
+
+You may need to add the LD_LIBRARY_PATH environment variable 
+(or PATH on Windows), pointing it to the library output 
+directory (e.g. ``ns-3-dev/build/lib``).
+
+Then click next:
+
+.. image:: figures/uprof-profile-application.png
+
+Now select custom events and pick the events you want.
+
+The recommended ones for performance profiling are:
+ * CYCLES_NOT_IN_HALT
+   
+   * Clocks (time) spent running.
+ * RETIRED_INST
+  
+   * How many instructions were completed.
+   * These do not count mispredictions, stalls, etc.
+   * Instructions per clock (IPC) = RETIRED_INST / CYCLES_NOT_IN_HALT
+ * RETIRED_BR_INST_MISP
+  
+   * How many branch instructions were mispredicted.
+   * Mispredictions causes the CPU to stall and clean the pipeline, 
+     slowing down the program.
+ * L2_CACHE_MISS.FROM_L1_IC_MISS 
+  
+   * L2 cache misses caused by instruction L1 cache misses. 
+   * Results in L3/memory accesses due to missing instructions in L1/L2.
+ * L2_CACHE_MISS.FROM_L1_DC_MISS 
+  
+   * L2 cache misses caused by data L1 cache misses. 
+   * Results in L3/memory accesses due to missing instructions in L1/L2
+ * MISALIGNED_LOADS
+   
+   * Loads not aligned with processor words. 
+   * Might result in additional cache and memory accesses.
+
+.. image:: figures/uprof-select-events.png
+
+Now click in advanced options to enable collection of the call stack.
+
+.. image:: figures/uprof-collect-callstack.png
+
+Then click ``Start Profile`` and wait for the program to end.
+After it finishes you will be greeted with a hotspot summary screen, 
+but the ``Analyze`` tab (top of the screen) has sub-tabs with more 
+relevant information.
+
+In the following image the metrics are shown per module, including the 
+C library (libc.so.6) which provides the ``malloc`` and ``free`` functions.
+Values can be shown in terms of samples or percentages for easier reading
+and to decide where to optimize. 
+
+.. image:: figures/uprof-stats.png
+
+
+.. _MR677 : https://gitlab.com/nsnam/ns-3-dev/-/merge_requests/677
+.. _MR680 : https://gitlab.com/nsnam/ns-3-dev/-/merge_requests/680
+.. _MR681 : https://gitlab.com/nsnam/ns-3-dev/-/merge_requests/681
+.. _MR777 : https://gitlab.com/nsnam/ns-3-dev/-/merge_requests/777
+.. _semantic interposition: https://maskray.me/blog/2021-05-09-fno-semantic-interposition
+
+Here are a few cases where AMD uProf was used to identify performance bottlenecks:
+
+#.  ``WifiMacQueue::TtlExceeded`` dereferenced data out of cache when calling Simulator::Now().
+    The adopted solution was to move Simulator::Now() out of TtlExceeded and reuse the value
+    and inlining TtlExceeded. This resulted in a ~1.20x speedup with the test suite (``./test.py -d``).
+    More details on: `issue 280`_ and merge request `MR681`_.
+
+#.  ``wifi-primary-channels`` test suite was extremely slow due to unnecessary RF processing.
+    The adopted solution was to replace the filtering step of the entire channel to just the desired
+    sub-band, and assuming sub-bands are uniformly sized, saving multiplications in the integral
+    used to compute the power of each sub-band. This resulted in a 6x speedup with 
+    ``./ns3 run "test-runner --fullness=TAKES_FOREVER --test-name=wifi-primary-channels"``. 
+    More details on: `issue 426`_ and merge request `MR677`_.
+
+#.  Continuing the work on ``wifi-primary-channels`` test suite, profiling showed an excessive
+    number of cache misses in ``InterferenceHelper::GetNextPosition``. 
+    This function searches for an iterator on a map, which is very fast
+    if the map is small and fits in the cache, which was not the case. After reviewing the code,
+    it was noticed in most cases this call was unnecessary as the iterator was already known.
+    The adopted solution was to reuse the iterator whenever possible. 
+    This resulted in a 1.78x speedup on top of the previous 6x with 
+    ``./ns3 run "test-runner --fullness=TAKES_FOREVER --test-name=wifi-primary-channels"``.
+    More details on: `issue 426`_ and merge requests `MR677`_ and `MR680`_.
+
+#.  Position-Independent Code libraries (``-fPIC``) have an additional layer of indirection that increases 
+    instruction cache misses. The adopted solution was to disable `semantic interposition`_ with flag
+    ``-fno-semantic-interposition`` on GCC. This is the default setting on Clang. This results in 
+    approximately 1.14x speedup with ``./test.py -d``. More details on: `MR777`_.
+
+Note: all speedups above were measured on the same machine. Results may differ based on clock speeds,
+cache sizes, number of cores, memory bandwidth and latency, storage throughput and latency.
+
+Intel VTune
++++++++++++
+
+`Intel VTune`_ works much like `Linux Perf and Hotspot GUI`_, but 
+is available in more platforms (Linux, Windows and Mac) using Intel
+processors. Differently from Perf, it provides more performance 
+trackers for finer analysis.
+
+When you open the program, you will be greeted by the landing page 
+shown in the following image. To start a new profiling project, click
+in the ``Configure Analysis`` button. If you already have a project, 
+right-click the entry and click to configure analysis to reuse the 
+settings.
+
+.. image:: figures/vtune-landing.png
+
+A configuration page will open, where you can fill the fields with
+the path to the program, arguments, and set working directory and 
+environment variables. 
+
+Note: in this example on Windows using MinGW,
+we need to define the ``PATH`` environment variable with the paths 
+to both ``~/ns-3-dev/build/lib`` and the MinGW binaries folder 
+(``~/msys64/mingw64/bin``), which contains essential libraries.
+On Linux-like systems you will need to define the 
+``LD_LIBRARY_PATH`` environment variable instead of ``PATH``.
+
+Clicking on the ``Performance Snapshot`` shows the different profiling
+options. 
+
+.. image:: figures/vtune-configure.png
+
+If executed as is, a quicker profiling will be executed to 
+determine what areas should be profiled with more details.
+For the specific example, it is indicated that there are 
+microarchitectural bottlenecks and low parallelism 
+(not a surprise since ns-3 is single-threaded).
+
+.. image:: figures/vtune-perf-snapshot.png
+
+If the ``microarchitecture exploration`` option is selected, cycles,
+branch mispredictions, cache misses and other metrics will be collected.
+
+.. image:: figures/vtune-select-uarch-profiling.png
+
+After executing the ``microarchitecture exploration``, a summary will
+be shown. Hovering the mouse over the red flags will explain what
+each sentence means and how it impacts performance.
+
+.. image:: figures/vtune-uarch-profiling-summary.png
+
+Clicking in the ``Bottom-up`` tab shows all the information per module.
+A plethora of stats such as CPU time, instructions retired,
+retiring percentage (how many of the dispatched instructions
+were executed until the end, usually lower than 100% because of branch
+mispredictions), bad speculation, cache misses, unused load ports,
+and more.
+
+The stats for the wifi module are shown below. The retiring
+metric indicates about 40% of dispatched instructions are 
+executed. The diagram on the right shows the bottleneck is
+in the front-end of the pipeline (red), due to high
+instruction cache misses, translation lookaside buffer (TLB)
+overhead and unknown branches (most likely callbacks).
+
+.. image:: figures/vtune-uarch-wifi-stats.png
+
+The stats for the core module are shown below. 
+More specifically for the ns3::Object::DoGetObject function.
+Metrics indicates about 63% of bad speculations.
+The diagram on the right shows that there are bottlenecks 
+both in the front-end and due to bad speculation (red).
+
+.. image:: figures/vtune-uarch-core-stats.png
+
+
+System calls profilers
+**********************
+
+.. _dtrace : https://github.com/opendtrace/documentation
+.. _strace : https://strace.io/
+.. _procmon : https://docs.microsoft.com/en-us/sysinternals/downloads/procmon
+
+System call profilers collect information on which system
+calls were made by a program, how long they took to be 
+fulfilled and how many of them resulted in errors.
+
+There are many system call profilers, including `dtrace`_, `strace`_ and `procmon`_.
+
+An overview on how to use `strace`_ is provided in the following section.
+
+Strace
+++++++
+
+
+The `strace`_ is a system calls (syscalls) profiler for Linux. It can filter 
+specific syscalls, or gather stats during the execution. 
+
+To collect statistics, use ``strace -c``:
+
+.. sourcecode:: console
+
+    ~ns-3-dev/$ ./ns3 run "wifi-he-network --simulationTime=0.3 --frequency=5 --useRts=1 --minExpectedThroughput=6 --maxExpectedThroughput=745" --command-template "strace -c %s" --no-build
+    MCS value               Channel width           GI                      Throughput
+    0                       20 MHz                  3200 ns                 5.91733 Mbit/s
+    ...
+    11                      160 MHz                 800 ns                  524.459 Mbit/s
+    % time     seconds  usecs/call     calls    errors syscall
+    ------ ----------- ----------- --------- --------- ----------------
+     37.62    0.004332          13       326       233 openat
+     35.46    0.004083           9       415           mmap
+    ...
+    ------ ----------- ----------- --------- --------- ----------------
+    100.00    0.011515           8      1378       251 total
+
+In the example above, the syscalls are listed in the right, after 
+the time spent on each syscall, number of calls and errors.
+
+The errors can be caused due to multiple reasons and may not 
+be a problem. To check if they were problems, strace can log the
+syscalls with ``strace -o calls.log``:
+
+.. sourcecode:: console
+
+    ~ns-3-dev/$ ./ns3 run "wifi-he-network --simulationTime=0.3 --frequency=5 --useRts=1 --minExpectedThroughput=6 --maxExpectedThroughput=745" --command-template "strace -o calls.log %s" --no-build
+    MCS value               Channel width           GI                      Throughput
+    0                       20 MHz                  3200 ns                 5.91733 Mbit/s
+    ...
+    11                      160 MHz                 800 ns                  524.459 Mbit/s
+
+
+Looking at the ``calls.log`` file, we can see different sections. In the 
+following section, the example is executed (``execve``), architecture is checked (``arch_prctl``),
+memory is mapped for execution (``mmap``) and LD_PRELOAD use is checked.
+
+.. sourcecode:: console
+
+    execve("~/ns-3-dev/build/examples/wireless/ns3-dev-wifi-he-network", ["~/ns-3-dev/b"..., "--simulationTime=0.3", "--frequency=5", "--useRts=1", "--minExpectedThroughput=6", "--maxExpectedThroughput=745"], 0x7fffb0f91ad8 /* 3 vars */) = 0
+    brk(NULL)                               = 0x563141b37000
+    arch_prctl(0x3001 /* ARCH_??? */, 0x7ffff8d63a50) = -1 EINVAL (Invalid argument)
+    mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f103c2e9000
+    access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
+
+Then the program searches for the wifi module library and fails multiple times (the errors seen in the table above).
+
+.. sourcecode:: console
+
+    openat(AT_FDCWD, "~/ns-3-dev/build/lib/glibc-hwcaps/x86-64-v3/libns3-dev-wifi.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
+    newfstatat(AT_FDCWD, "~/ns-3-dev/build/lib/glibc-hwcaps/x86-64-v3", 0x7ffff8d62c80, 0) = -1 ENOENT (No such file or directory)
+    ...
+    openat(AT_FDCWD, "~/ns-3-dev/build/lib/x86_64/libns3-dev-wifi.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
+    newfstatat(AT_FDCWD, "~/ns-3-dev/build/lib/x86_64", 0x7ffff8d62c80, 0) = -1 ENOENT (No such file or directory)
+
+The library is finally found and its header is read: 
+
+.. sourcecode:: console
+
+    openat(AT_FDCWD, "~/ns-3-dev/build/lib/libns3-dev-wifi.so", O_RDONLY|O_CLOEXEC) = 3
+    read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0py\30\0\0\0\0\0"..., 832) = 832
+
+Then other modules that wifi depends on are loaded, then execution of the program continues to the main 
+function of the simulation.
+
+Strace was used to track down issues found while running the ``lena-radio-link-failure`` example.
+Its ``strace -c`` table was the following:
+
+.. sourcecode:: console
+
+    % time     seconds  usecs/call     calls    errors syscall
+    ------ ----------- ----------- --------- --------- ----------------
+     31,51    0,246243           2    103480       942 openat
+     30,23    0,236284           2    102360           write
+     19,90    0,155493           1    102538           close
+     16,65    0,130132           1    102426           lseek
+      1,05    0,008186          18       437           mmap
+      0,21    0,001671          16        99           newfstatat
+      0,20    0,001595          11       134           mprotect
+      0,18    0,001391          14        98           read
+    ...
+    ------ ----------- ----------- --------- --------- ----------------
+    100,00    0,781554           1    411681       951 total
+
+Notice the number of ``openat``, ``write``, ``close`` and ``lseek`` calls
+are much more frequent than the other calls. These mean 
+``lena-radio-link-failure`` is opening, then seeking, then writing, 
+then closing at least one file handler.
+
+Using ``strace``, we can easily find the most frequently used file handlers.
+
+.. sourcecode:: console
+
+    ~ns-3-dev/$./ns3 run "lena-radio-link-failure --numberOfEnbs=2 --useIdealRrc=0 --interSiteDistance=700 --simTime=17" --command-template="strace %s"
+    ...
+    openat(AT_FDCWD, "DlTxPhyStats.txt", O_WRONLY|O_CREAT|O_APPEND, 0666) = 3
+    lseek(3, 0, SEEK_END)                   = 9252
+    write(3, "635\t1\t1\t1\t0\t20\t1191\t0\t1\t0\n", 26) = 26
+    close(3)                                = 0
+    openat(AT_FDCWD, "DlMacStats.txt", O_WRONLY|O_CREAT|O_APPEND, 0666) = 3
+    lseek(3, 0, SEEK_END)                   = 11100
+    write(3, "0.635\t1\t1\t64\t6\t1\t20\t1191\t0\t0\t0\n", 31) = 31
+    close(3)                                = 0
+    openat(AT_FDCWD, "UlMacStats.txt", O_WRONLY|O_CREAT|O_APPEND, 0666) = 3
+    lseek(3, 0, SEEK_END)                   = 8375
+    write(3, "0.635\t1\t1\t64\t6\t1\t0\t85\t0\n", 24) = 24
+    close(3)                                = 0
+    openat(AT_FDCWD, "DlRsrpSinrStats.txt", O_WRONLY|O_CREAT|O_APPEND, 0666) = 3
+    lseek(3, 0, SEEK_END)                   = 16058
+    write(3, "0.635214\t1\t1\t1\t6.88272e-15\t22.99"..., 37) = 37
+    close(3)                                = 0
+    openat(AT_FDCWD, "UlTxPhyStats.txt", O_WRONLY|O_CREAT|O_APPEND, 0666) = 3
+    ...
+
+.. _MR814: https://gitlab.com/nsnam/ns-3-dev/-/merge_requests/814
+
+With the name of the files, we can look at the code that manipulates them.
+
+The issue above was found in `MR777`_, were performance for some LTE examples 
+regressed for no apparent reason. The flame graph below, produced by `AMD uProf`_, 
+contains four large columns/"flames" in red, which 
+correspond to the ``write``, ``openat``, ``close`` and ``lseek`` syscalls.
+
+.. image:: figures/uprof-strace-lte.png
+
+Upon closer inspection, these syscalls take a long time to complete due to 
+the underlying filesystem of the machine running the example (NTFS mount
+using the ntfs-3g FUSE filesystem). In other words, the bottleneck only 
+exists when running the example in slow file systems 
+(e.g. FUSE and network file systems). 
+
+The merge request `MR814`_ addressed the issue by keeping the files open
+throughout the simulation. That alone resulted in a 1.75x speedup. 
+
+
+Compilation Profilers
+*********************
+
+Compilation profilers can help identifying which steps of the compilation
+are slowing it down. These profilers are built into the compilers themselves,
+only requiring third-party tools to consolidate the results.
+
+The GCC feature is mentioned and exemplified, but is not the recommended 
+compilation profiling method. For that, Clang is recommended.
+
+GCC
++++
+
+.. _not a priority : https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92396
+
+GCC has a special flag ``-ftime-report``, which makes it print a table
+with time spent per compilation phase for each compiled file. The printed
+output for a file is shown below. The line of ``---`` was inserted for clarity.
+
+.. sourcecode:: console
+
+  Time variable                                  usr           sys          wall               GGC
+  phase setup                        :   0.00 (  0%)   0.00 (  0%)   0.01 (  1%)    1478 kB (  2%)
+  phase parsing                      :   0.31 ( 46%)   0.17 ( 85%)   0.48 ( 55%)   55432 kB ( 71%)
+  phase lang. deferred               :   0.03 (  4%)   0.00 (  0%)   0.03 (  3%)    4287 kB (  5%)
+  phase opt and generate             :   0.32 ( 48%)   0.03 ( 15%)   0.35 ( 40%)   16635 kB ( 21%)
+  phase last asm                     :   0.01 (  1%)   0.00 (  0%)   0.01 (  1%)     769 kB (  1%)
+  ------------------------------------------------------------------------------------------------
+  |name lookup                       :   0.05 (  7%)   0.02 ( 10%)   0.04 (  5%)    2468 kB (  3%)
+  |overload resolution               :   0.05 (  7%)   0.00 (  0%)   0.05 (  6%)    4217 kB (  5%)
+  dump files                         :   0.00 (  0%)   0.00 (  0%)   0.01 (  1%)       0 kB (  0%)
+  callgraph construction             :   0.01 (  1%)   0.00 (  0%)   0.01 (  1%)    2170 kB (  3%)
+  ...
+  preprocessing                      :   0.05 (  7%)   0.06 ( 30%)   0.10 ( 11%)    1751 kB (  2%)
+  parser (global)                    :   0.06 (  9%)   0.03 ( 15%)   0.07 (  8%)   16303 kB ( 21%)
+  parser struct body                 :   0.06 (  9%)   0.04 ( 20%)   0.08 (  9%)   12525 kB ( 16%)
+  parser enumerator list             :   0.01 (  1%)   0.00 (  0%)   0.00 (  0%)     112 kB (  0%)
+  parser function body               :   0.02 (  3%)   0.02 ( 10%)   0.02 (  2%)    3039 kB (  4%)
+  parser inl. func. body             :   0.03 (  4%)   0.00 (  0%)   0.01 (  1%)    2024 kB (  3%)
+  parser inl. meth. body             :   0.02 (  3%)   0.01 (  5%)   0.06 (  7%)    5792 kB (  7%)
+  template instantiation             :   0.09 ( 13%)   0.01 (  5%)   0.13 ( 15%)   12274 kB ( 16%)
+  ...
+  symout                             :   0.01 (  1%)   0.00 (  0%)   0.02 (  2%)    8114 kB ( 10%)
+  ...
+  TOTAL                              :   0.67          0.20          0.88          78612 kB
+
+In the table above, the first few lines show the five main compilations steps: ``setup``,
+``parsing``, ``lang. deferred`` (C++ specific transformations), 
+``opt(imize) and generate (code)``, ``last asm`` (produce binary code). 
+
+The lines below the ``---`` line show sub-steps of the five main compilation steps.
+For this specific case, parsing global definitions (21%) and structures (16%), 
+``template instantiation`` (16%) and generating the code in ``symout`` (10%).
+
+Aggregating the data into a meaningful output to help focus where to improve is not that easy 
+and it is `not a priority`_ for GCC developers.
+
+It is recommended to use the Clang alternative.
+
+Clang
++++++
+
+.. _ClangBuildAnalyzer : https://github.com/aras-p/ClangBuildAnalyzer
+
+Clang can output very similar results with the ``-ftime-trace`` flag, but can also aggregate
+it in a more meaningful way. With the help of the third-party tool `ClangBuildAnalyzer`_,
+we can have really good insights on where to spend time trying to speed up the compilation.
+
+Support for building with ``-ftime-trace``, compiling `ClangBuildAnalyzer`_ and producing a 
+report for the project have been baked into the CMake project of ns-3, and can be enabled 
+with ``-DNS3_CLANG_TIMETRACE=ON``.
+
+.. sourcecode:: console
+
+  ~/ns-3-dev/cmake_cache$ cmake -DNS3_CLANG_TIMETRACE=ON ..
+
+Or via ``ns3``:
+
+.. sourcecode:: console
+
+  ~/ns-3-dev$ ./ns3 configure -- -DNS3_CLANG_TIMETRACE=ON
+
+The entire procedure looks like the following:
+
+.. sourcecode:: console
+
+  ~/ns-3-dev$ CXX="clang++" ./ns3 configure -d release --enable-examples --enable-tests -- -DNS3_CLANG_TIMETRACE=ON
+  ~/ns-3-dev$ ./ns3 build timeTraceReport
+  ~/ns-3-dev$ cat ClangBuildAnalyzerReport.txt
+  Analyzing build trace from '~/ns-3-dev/cmake_cache/clangBuildAnalyzerReport.bin'...
+  **** Time summary:
+  Compilation (2993 times):
+    Parsing (frontend):         2476.1 s
+    Codegen & opts (backend):   1882.9 s
+
+  **** Files that took longest to parse (compiler frontend):
+    8966 ms: src/test/CMakeFiles/libtest.dir/traced/traced-callback-typedef-test-suite.cc.o
+    6633 ms: src/wifi/examples/CMakeFiles/wifi-bianchi.dir/wifi-bianchi.cc.o
+  ...
+
+  **** Files that took longest to codegen (compiler backend):
+  36430 ms: src/wifi/CMakeFiles/libwifi-test.dir/test/block-ack-test-suite.cc.o
+  24941 ms: src/wifi/CMakeFiles/libwifi-test.dir/test/wifi-mac-ofdma-test.cc.o
+  ...
+
+  **** Templates that took longest to instantiate:
+  12651 ms: std::unordered_map<int, int> (615 times, avg 20 ms)
+  10950 ms: std::_Hashtable<int, std::pair<const int, int>, std::allocator<std::... (615 times, avg 17 ms)
+  10712 ms: std::__detail::__hyperg<long double> (1172 times, avg 9 ms)
+  ...
+
+  **** Template sets that took longest to instantiate:
+  111660 ms: std::list<$> (27141 times, avg 4 ms)
+   79892 ms: std::_List_base<$> (27140 times, avg 2 ms)
+   75131 ms: std::map<$> (11752 times, avg 6 ms)
+   65214 ms: std::allocator<$> (66622 times, avg 0 ms)
+  ...
+
+  **** Functions that took longest to compile:
+    7206 ms: OfdmaAckSequenceTest::CheckResults(ns3::Time, ns3::Time, unsigned ch... (~/ns-3-dev/src/wifi/test/wifi-mac-ofdma-test.cc)
+    6146 ms: PieQueueDiscTestCase::RunPieTest(ns3::QueueSizeUnit) (~/ns-3-dev/src/traffic-control/test/pie-queue-disc-test-suite.cc)
+  ...
+
+  **** Function sets that took longest to compile / optimize:
+  14801 ms: std::__cxx11::basic_string<$> ns3::CallbackImplBase::GetCppTypeid<$>() (2342 times, avg 6 ms)
+  12013 ms: ns3::CallbackImpl<$>::DoGetTypeid[abi:cxx11]() (1283 times, avg 9 ms)
+  10034 ms: ns3::Ptr<$>::~Ptr() (5975 times, avg 1 ms)
+   8932 ms: ns3::Callback<$>::DoAssign(ns3::Ptr<$>) (591 times, avg 15 ms)
+   6318 ms: ns3::CallbackImpl<$>::DoGetTypeid() (431 times, avg 14 ms)
+  ...
+
+  *** Expensive headers:
+  293609 ms: ~/ns-3-dev/build/include/ns3/log.h (included 1404 times, avg 209 ms), included via:
+    cqa-ff-mac-scheduler.cc.o  (758 ms)
+    ipv6-list-routing.cc.o  (746 ms)
+    ...
+
+  239884 ms: ~/ns-3-dev/build/include/ns3/nstime.h (included 1093 times, avg 219 ms), included via:
+    lte-enb-rrc.cc.o lte-enb-rrc.h  (891 ms)
+    wifi-acknowledgment.cc.o wifi-acknowledgment.h  (877 ms)
+    ...
+
+  216218 ms: ~/ns-3-dev/build/include/ns3/object.h (included 1205 times, avg 179 ms), included via:
+    energy-source-container.cc.o energy-source-container.h energy-source.h  (1192 ms)
+    phased-array-model.cc.o phased-array-model.h  (1135 ms)
+    ...
+
+  206801 ms: ~/ns-3-dev/build/include/ns3/core-module.h (included 195 times, avg 1060 ms), included via:
+    sample-show-progress.cc.o  (1973 ms)
+    length-example.cc.o  (1848 ms)
+    ...
+
+  193116 ms: /usr/bin/../lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/bits/basic_string.h (included 1499 times, avg 128 ms), included via:
+    model-typeid-creator.h attribute-default-iterator.h type-id.h attribute.h string  (250 ms)
+    li-ion-energy-source-helper.h energy-model-helper.h attribute.h string  (243 ms)
+    ...
+
+  185075 ms: /usr/bin/../lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/bits/ios_base.h (included 1495 times, avg 123 ms), included via:
+    iomanip  (403 ms)
+    mpi-test-fixtures.h iomanip  (364 ms)
+    ...
+
+  169464 ms: ~/ns-3-dev/build/include/ns3/ptr.h (included 1399 times, avg 121 ms), included via:
+    lte-test-rlc-um-e2e.cc.o config.h  (568 ms)
+    lte-test-rlc-um-transmitter.cc.o simulator.h event-id.h  (560 ms)
+    ...
+
+  
+    done in 2.8s.
+
+The output printed out contain a summary of time spent on parsing and on code generation, along 
+with multiple lists for different tracked categories. From the summary, it is clear that parsing times
+are very high when compared to the optimization time (``-O3``). Skipping the others categories and going straight
+to the expensive headers section, we can better understand why parsing times are so high, with some headers 
+adding as much as 5 minutes of CPU time to the parsing time.
+
+.. _drastically speed up parsing times : https://gitlab.com/nsnam/ns-3-dev/-/merge_requests/731#note_687176503
+
+Precompiled headers (``-DNS3_PRECOMPILE_HEADERS=ON``) can `drastically speed up parsing times`_,
+however, they can increase ccache misses, reducing the time of the first
+compilation at the cost of increasing recompilation times.
+
+
+CMake Profiler
+**************
+
+CMake has a built-in tracer that permits tracking hotspots in the CMake files slowing down the 
+project configuration. To use the tracer, call cmake directly from a clean CMake cache directory:
+
+.. sourcecode:: console
+
+  ~/ns-3-dev/cmake-cache$ cmake .. --profiling-format=google-trace --profiling-output=../cmake_performance_trace.log
+
+
+Or using the ns3 wrapper:
+
+.. sourcecode:: console
+
+  ~/ns-3-dev$ ./ns3 configure --trace-performance
+
+
+.. _Perfetto UI: https://ui.perfetto.dev/
+
+A ``cmake_performance_trace.log`` file will be generated in the ns-3-dev directory. 
+The tracing results can be visualized using the ``about:tracing`` panel available
+in Chromium-based browsers or a compatible trace viewer such as `Perfetto UI`_.
+
+After opening the trace file, select the traced process and click on
+any of the blocks to inspect the different stacks and find hotspots.
+An auxiliary panel containing the function/macro name, arguments 
+and location can be shown, providing enough information to trace 
+back the location of each specific call.
+
+Just like in performance profilers, visual inspection makes it easier
+to identify hotspots and focus on trying to optimize what matters most.
+
+.. _issue #588: https://gitlab.com/nsnam/ns-3-dev/-/issues/588
+
+The trace below was generated during the discussion of `issue #588`_,
+while investigating the long configuration times, especially when using HDDs.
+
+The single largest contributor was CMake's ``configure_file``, used to keeping
+up-to-date copies of headers in the output directory.
+
+.. image:: figures/perfetto-trace-cmake.png
+
+
+.. _MR911: https://gitlab.com/nsnam/ns-3-dev/-/merge_requests/911
+
+In `MR911`_, alternatives such as stub headers that include the original header
+files, keeping them in their respective modules, and symlinking headers to the
+output directory were used to reduce the configuration overhead. 
+
+Note: when testing I/O bottlenecks, you may want to drop filesystem caches,
+otherwise the cache may hide the issues. In Linux, the caches can be cleared
+using the following command:
+
+.. sourcecode:: console
+
+  ~/ns-3-dev$ sudo sysctl vm.drop_caches=3
+
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/doc/manual/source/python.rst ns-3.36/doc/manual/source/python.rst
--- ns-3.35/doc/manual/source/python.rst	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/doc/manual/source/python.rst	2022-04-30 18:23:57.682732800 -0700
@@ -25,15 +25,16 @@
 The intent is not to provide a different language choice to author new
 |ns3| models implemented in Python.
 
-Python bindings for |ns3| use a tool called PyBindGen (https://github.com/gjcarneiro/pybindgen) to create Python modules from the C++ libraries built by
-Waf.  The Python bindings that PyBindGen uses are maintained in a 
-``bindings`` directory in each module, and must be maintained to match the 
+Python bindings for |ns3| use a tool called PyBindGen (https://github.com/gjcarneiro/pybindgen)
+to create Python modules from the C++ libraries built by CMake.  The Python bindings that PyBindGen
+uses are maintained in a ``bindings`` directory in each module, and must be maintained to match the
 C++ API of that ns-3 module.  If the C++ API changes, the Python bindings file
 must either be modified by hand accordingly, or the bindings must be
 regenerated by an automated scanning process.
 
-If a user is not interested in Python, he or she may disable the use of
-Python bindings at Waf configure time.  In this case, changes to the C++
+If a user is not interested in Python, no action is needed; by default, Python
+bindings are disabled (and must be explicitly enabled at
+CMake configure time).  In this case, changes to the C++
 API of a provided module will not cause the module to fail to compile. 
 
 The process for automatically generating Python bindings relies on a toolchain
@@ -42,6 +43,18 @@
 pygccxml (https://github.com/gccxml/pygccxml).  The toolchain can be installed
 using the ns-3 ``bake`` build tool.
 
+As of ns-3.36, the Python bindings framework (including many of its
+constituent tools) has lacked active maintainers for several years, and there
+are constraints on the compatible Python version and on the C++ language
+features that may be used in the C++ header files.  The API scanning framework
+(in particular, pygccxml) requires Python 3.6 through 3.8 but is
+not compatible with Python 3.9 or 3.10.  Compiling the existing bindings
+should work through Python 3.10.  Additionally, many newer C++ language features
+beyond C++11 may not be supported by pybindgen.
+
+Python bindings may be removed from future ns-3 releases if new maintainers
+are not found.
+
 An Example Python Script that Runs |ns3|
 ****************************************
 
@@ -96,47 +109,53 @@
 Running Python Scripts
 **********************
 
-waf contains some options that automatically update the python path to find the ns3 module.  To run example programs, there are two ways to use waf to take care of this.  One is to run a waf shell; e.g.:
+First, we need to enable the build of Python bindings:
 
 .. sourcecode:: bash
 
-  $ ./waf shell
-  $ python examples/wireless/mixed-wireless.py
+  $ ./ns3 configure --enable-python-bindings
 
-and the other is to use the --pyrun option to waf:
+Other options such as ``--enable-examples`` may be passed to the above command.
+ns3 contains some options that automatically update the python path to find the ns3 module.  To run example programs, there are two ways to use ns3 to take care of this.  One is to run a ns3 shell; e.g.:
 
 .. sourcecode:: bash
 
-  $ ./waf --pyrun examples/wireless/mixed-wireless.py
+  $ ./ns3 shell
+  $ python3 examples/wireless/mixed-wireless.py
 
-As of ns-3.30, a --pyrun-no-build option was added to allow the running of
-a program without invoking a project rebuild.  This option may be useful
-to improve execution time when running the same program repeatedly but with
-different arguments, such as from scripts. It can be used in place of
---pyrun such as:
+and the other is to use the 'run' option to ns3:
 
 .. sourcecode:: bash
 
-  $ ./waf --pyrun-no-build examples/wireless/mixed-wireless.py
+  $ ./ns3 run examples/wireless/mixed-wireless.py
+
+Use the ``--no-build`` option to run the program without invoking a project rebuild.
+This option may be useful to improve execution time when running the same program
+repeatedly but with different arguments, such as from scripts.
+
+.. sourcecode:: bash
+
+  $ ./ns3 run --no-build examples/wireless/mixed-wireless.py
 
 To run a python script under the C debugger:
 
 .. sourcecode:: bash
 
-  $ ./waf shell
-  $ gdb --args python examples/wireless/mixed-wireless.py
+  $ ./ns3 shell
+  $ gdb --args python3 examples/wireless/mixed-wireless.py
 
 To run your own Python script that calls |ns3| and that has this path, ``/path/to/your/example/my-script.py``, do the following:
 
 .. sourcecode:: bash
 
-  $ ./waf shell
-  $ python /path/to/your/example/my-script.py
+  $ ./ns3 shell
+  $ python3 /path/to/your/example/my-script.py
 
 Caveats
 *******
 
-Python bindings for |ns3| are a work in progress, and some limitations are known by developers.  Some of these limitations (not all) are listed here.
+In addition to limitations in Python and C++ versions supported (as discussed
+above), some additional limitations are listed here.
 
 Incomplete Coverage
 ===================
@@ -147,7 +166,7 @@
 #. Sometimes a unusual fundamental data type or C++ construct is used which is not yet supported by PyBindGen;
 #. CastXML does not report template based classes unless they are instantiated. 
 
-Most of the missing APIs can be wrapped, given enough time, patience, and expertise, and will likely be wrapped if bug reports are submitted.  However, don't file a bug report saying "bindings are incomplete", because we do not have manpower to complete 100% of the bindings.
+Most of the missing APIs can be wrapped, given enough time, patience, and expertise, and will likely be wrapped if bug reports are submitted.  However, don't file a bug report saying "bindings are incomplete", because the project does not have maintainers to maintain every API.
 
 Conversion Constructors
 =======================
@@ -160,7 +179,7 @@
  ipAddrs.SetBase ("192.168.0.0", "255.255.255.0");
  ipAddrs.Assign (backboneDevices);
 
-In Python, for the time being you have to do:
+In Python, you have to do:
 
 ::
 
@@ -198,7 +217,7 @@
 
 Pcap file writing is supported via the normal API.
 
-ASCII tracing is supported since |ns3|.4 via the normal C++ API translated to Python.  However, ASCII tracing requires the creation of an ostream object to pass into the ASCII tracing methods.  In Python, the C++ std::ofstream has been minimally wrapped to allow this.  For example:
+ASCII tracing is supported via the normal C++ API translated to Python.  However, ASCII tracing requires the creation of an ostream object to pass into the ASCII tracing methods.  In Python, the C++ std::ofstream has been minimally wrapped to allow this.  For example:
 
 ::
 
@@ -247,20 +266,7 @@
 #. Other developers clone the repository and use the already scanned API definitions;
 #. When configuring |ns3|, pybindgen will be automatically downloaded if not already installed.  Released |ns3| tarballs will ship a copy of pybindgen.
 
-If something goes wrong with compiling Python bindings and you just want to ignore them and move on with C++, you can disable Python with:
-
-.. sourcecode:: bash
-
-  $ ./waf configure --disable-python ...
-
-To add support for modular bindings to an existing or new |ns3| module, simply add the following line to its wscript build() function:
-
-::
-
-    bld.ns3_python_bindings()
-
-One must also provide the bindings files (usually by running the scanning
-framework).
+If something goes wrong with compiling Python bindings and you just want to ignore them and move on with C++, you can disable Python by configuring |ns3| without Python bindings enabled.
 
 Regenerating the Python bindings
 ================================
@@ -276,7 +282,7 @@
 
 |ns3| has an automated process to regenerate Python bindings from the C++
 header files.  The process is only supported for Linux at the moment
-(ns-3.33) because the project has not found a contributor yet to test and
+because the project has not found a contributor yet to test and
 document the capability on macOS. In short, the process currently 
 requires the following steps on a Linux machine.
 
@@ -451,7 +457,7 @@
 At this point, it is recommended to change into the ns-3-dev directory and
 work further from there, because the API scanning dependencies have been
 built and installed successfully into the `build` directory.
-The output of './waf configure' can be inspected to see if Python API scanning
+The output of './ns3 configure' can be inspected to see if Python API scanning
 support is enabled:
 
 .. sourcecode:: text
@@ -484,24 +490,42 @@
 
 The process (only supported on Linux at present) generates the LP64
 bindings using the toolchain and then copies the LP64 bindings to the
-ILP32 bindings with some type substitutions automated by Waf scripts.
+ILP32 bindings with some type substitutions automated by CMake scripts.
   
 Rescanning a module
 ###################
 
-To re-scan a module:
+To re-scan a module, it is recommended to clean the installation, and then
+to configure with Python scanning enabled:
 
 .. sourcecode:: bash
 
     $ cd source/ns-3-dev
-    $ ./waf --apiscan=wifi
+    $ ./ns3 clean
+    $ ./ns3 configure -- -DNS3_SCAN_PYTHON_BINDINGS=ON
 
-To re-scan all modules:
+Ensure in the configure output that pygccxml and castxml were found.  To
+scan an individual module, such as wifi, append `-apiscan` to the module
+name:
+
+.. sourcecode:: bash
+
+    $ ./ns3 build wifi-apiscan
+
+To re-scan all modules (which can take some time):
 
 .. sourcecode:: bash
 
     $ cd source/ns-3-dev
-    $ ./waf --apiscan=all
+    $ ./ns3 apiscan-all
+
+Then, to check whether the rescanned bindings can be compiled, enable
+the Python bindings in the build:
+
+.. sourcecode:: bash
+
+    $ ./ns3 configure --enable-python-bindings
+    $ ./ns3 build
 
 Generating bindings on MacOS
 ############################
@@ -510,6 +534,80 @@
 However, maintainers have not been available to complete this port to date.
 We would welcome suggestions on how to enable scanning for MacOS. 
 
+Regenerating the Python bindings using gitlab-ci-local
+======================================================
+
+The |ns3| GitLab.com continuous integration (CI) system can be run on a
+local machine using
+`gitlab-ci-local < https://github.com/firecow/gitlab-ci-local>`_.
+From within the ns-3 directory:
+
+.. sourcecode:: bash
+
+    $ gitlab-ci-local --file ./utils/tests/gitlab-ci.yml pybindgen-21.04
+
+If everything works, the diff with the re-scanned bindings will be in
+``./gitlab-ci-local/artifacts/pybindgen-21.04``.
+
+Regenerating the Python bindings using Docker
+=============================================
+
+An alternative to the above Bake install or gitlab-ci-local is to use a
+Docker container.  Basically, the below steps are the low-level commands
+used by the gitlab-ci-local approach above.
+The following steps are used by the |ns3| CI system on an Ubuntu 20.04 image.
+
+As a prerequisite, install Docker using a package manager; on Ubuntu, use:
+
+.. sourcecode:: bash
+
+    $ apt install docker.io
+
+To allow an unprivileged user to use Docker, perform the following:
+
+.. sourcecode:: bash
+
+    $ sudo chmod 666 /var/run/docker.sock
+
+The following command will obtain a raw shell for an Ubuntu 20.04 image: 
+
+.. sourcecode:: bash
+    
+    $ docker run -it ubuntu:20.04
+
+However, if you prefer to work on your current directory from the container
+shell, use the ``-v`` option to request a bind mount of a host directory
+to a container directory, such as follows:
+
+.. sourcecode:: bash
+
+    $ docker run -it -v /path/to/your/current/directory:/path/to/container/mount ubuntu:20.04
+    $ cd /path/to/container/mount
+
+where ``/path/to/container/mount`` can be something like ``/ns-3-dev``.
+
+Then, from within a directory that contains ns-3, perform the following
+steps to rescan the APIs and test them:
+
+.. sourcecode:: bash
+
+    $ apt-get update
+    $ apt-get install -y g++ cmake ninja-build ccache libgsl-dev libgtk-3-dev libboost-dev wget git python3 python3-pip
+    $ pip install cxxfilt pygccxml pybindgen castxml
+    $ ./ns3 clean
+    $ ./ns3 configure -G Ninja -- -DNS3_SCAN_PYTHON_BINDINGS=ON
+    $ ./ns3 build apiscan-all
+    $ ./ns3 configure --enable-python-bindings
+    $ ./ns3 build
+    $ ./ns3 run ./utils/python-unit-tests.py
+
+If you only want to scan one module, specify ``MODULENAME-apiscan``
+(such as ``wifi-apiscan``) instead of ``apiscan-all`` in the above.
+
+If you exit the container, the package state will be lost, but from another
+terminal window, you may be able to further test and evaluate the new bindings.
+Note that the new bindings and build files will have root file ownership.
+
 Organization of the Modular Python Bindings
 ===========================================
 
@@ -520,7 +618,7 @@
 * ``modulegen__gcc_ILP32.py``: this is a scanned file, DO NOT TOUCH.  Scanned API definitions for the GCC, ILP32 architecture (32-bit)
 * ``modulegen_customizations.py``: you may optionally add this file in order to customize the pybindgen code generation
 * ``scan-header.h``: you may optionally add this file to customize what header file is scanned for the module.  Basically this file is scanned instead of ns3/<module>-module.h.  Typically, the first statement is #include "ns3/<module>-module.h", plus some other stuff to force template instantiations;
-* ``module_helpers.cc``: you may add additional files, such as this, to be linked to python extension module, but they have to be registered in the wscript. Look at src/core/wscript for an example of how to do so;
+* ``module_helpers.cc``: you may add additional files, such as this, to be linked to python extension module. They will be automatically scanned;
 * ``<module>.py``: if this file exists, it becomes the "frontend" python module for the ns3 module, and the extension module (.so file) becomes _<module>.so instead of <module>.so.  The <module>.py file has to import all symbols from the module _<module> (this is more tricky than it sounds, see src/core/bindings/core.py for an example), and then can add some additional pure-python definitions.   
 
 Historical Information
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/doc/manual/source/random-variables.rst ns-3.36/doc/manual/source/random-variables.rst
--- ns-3.35/doc/manual/source/random-variables.rst	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/doc/manual/source/random-variables.rst	2022-04-30 18:23:57.682732800 -0700
@@ -183,16 +183,16 @@
 
 .. sourcecode:: bash
 
-  $ NS_GLOBAL_VALUE="RngRun=3" ./waf --run program-name
+  $ NS_GLOBAL_VALUE="RngRun=3" ./ns3 run program-name
 
 Another way to control this is by passing a command-line argument; since this is
 an |ns3| GlobalValue instance, it is equivalently done such as follows:
 
 .. sourcecode:: bash
 
-  $ ./waf --command-template="%s --RngRun=3" --run program-name
+  $ ./ns3 run program-name --command-template="%s --RngRun=3"
 
-or, if you are running programs directly outside of waf:
+or, if you are running programs directly outside of ns3:
 
 .. sourcecode:: bash
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/doc/manual/source/realtime.rst ns-3.36/doc/manual/source/realtime.rst
--- ns-3.35/doc/manual/source/realtime.rst	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/doc/manual/source/realtime.rst	2022-04-30 18:23:57.682732800 -0700
@@ -66,7 +66,7 @@
 
 .. sourcecode:: bash
 
-    $ ./waf --run realtime-udp-echo
+    $ ./ns3 run realtime-udp-echo
 
 Whether the simulator will work in a best effort or hard limit policy fashion is
 governed by the attributes explained in the previous section.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/doc/manual/source/simulator.rst ns-3.36/doc/manual/source/simulator.rst
--- ns-3.35/doc/manual/source/simulator.rst	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/doc/manual/source/simulator.rst	2022-04-30 18:23:57.682732800 -0700
@@ -0,0 +1,18 @@
+.. only:: html or latex
+
+Simulator
+=========
+
+This chapter explains some of the core ns-3 simulator concepts.
+
+.. toctree::
+   :maxdepth: 2
+
+   events
+   callbacks
+   object-model
+   attributes
+   object-names
+   realtime
+
+
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/doc/manual/source/support.rst ns-3.36/doc/manual/source/support.rst
--- ns-3.35/doc/manual/source/support.rst	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/doc/manual/source/support.rst	2022-04-30 18:23:57.682732800 -0700
@@ -3,9 +3,6 @@
 
 .. toctree::
 
-   new-models
-   new-modules
-   documentation
    enable-modules
    enable-tests
    troubleshoot
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/doc/manual/source/test-framework.rst ns-3.36/doc/manual/source/test-framework.rst
--- ns-3.35/doc/manual/source/test-framework.rst	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/doc/manual/source/test-framework.rst	2022-04-30 18:23:57.682732800 -0700
@@ -65,8 +65,8 @@
 
 ::
 
-  $ ./waf configure --enable-examples --enable-tests
-  $ ./waf build
+  $ ./ns3 configure --enable-examples --enable-tests
+  $ ./ns3 build
 
 By default, ``test.py`` will run all available tests and report status
 back in a very concise form.  Running the command
@@ -129,7 +129,7 @@
     -l, --list            print the list of known tests
     -m, --multiple        report multiple failures from test suites and test
                           cases
-    -n, --nowaf           do not run waf before starting testing
+    -n, --nobuild           do not run ns3 before starting testing
     -p PYEXAMPLE, --pyexample=PYEXAMPLE
                           specify a single python example to run (with relative
                           path)
@@ -377,12 +377,12 @@
 report the result of the attempt.
 
 When ``test.py`` runs, by default it will first ensure that the system has
-been completely built.  This can be defeated by selecting the ``--nowaf``
+been completely built.  This can be defeated by selecting the ``--nobuild``
 option.
 
 ::
 
-  $ ./test.py --list --nowaf
+  $ ./test.py --list --nobuild
 
 will result in a list of the currently built test suites being displayed, similar to:
 
@@ -395,7 +395,7 @@
   object-name-service
   random-variable-stream-generators
 
-Note the absence of the ``Waf`` build messages.
+Note the absence of the ``ns3`` build messages.
 
 ``test.py`` also supports running the test suites and examples under valgrind.
 Valgrind is a flexible program for debugging and profiling Linux executables.  By
@@ -485,17 +485,18 @@
 ++++++++++++
 
 System tests are those that involve more than one module in the system.  We
-have lots of this kind of test running in our current regression framework,
+have some of this kind of test running in our current regression framework,
 but they are typically overloaded examples.  We provide a new place
 for this kind of test in the directory ``src/test``.  The file
-src/test/ns3tcp/ns3-interop-test-suite.cc is an example of this kind of
+``src/test/ns3tcp/ns3tcp-loss-test-suite.cc`` is an example of this kind of
 test.  It uses NSC TCP to test the |ns3| TCP implementation.  Often there
 will be test vectors required for this kind of test, and they are stored in
 the directory where the test lives.  For example,
-ns3tcp-interop-response-vectors.pcap is a file consisting of a number of TCP
-headers that are used as the expected responses of the |ns3| TCP under test
-to a stimulus generated by the NSC TCP which is used as a ''known good''
-implementation.
+``ns3tcp-loss-NewReno0-response-vectors.pcap`` is a file consisting of a number of TCP
+headers that are used as the expected responses of the |ns3| TCP under test.
+
+Note that Unit Tests are often preferrable to System Tests, as they are more
+independent from small changes in the modules that are not the goal of the test.
 
 Examples
 ++++++++
@@ -529,7 +530,7 @@
 
 ::
 
-   $ ./waf --configure --enable-examples --enable-tests
+   $ ./ns3 configure --enable-examples --enable-tests
 
 Then, build |ns3|, and after it is built, just run ``test.py``.  ``test.py -h``
 will show a number of configuration options that modify the behavior
@@ -555,9 +556,9 @@
 have to run them using the test-runner directly.
 
 In order to execute the test-runner, you run it like any other |ns3| executable
--- using ``waf``.  To get a list of available options, you can type::
+-- using ``ns3``.  To get a list of available options, you can type::
 
-  $ ./waf --run "test-runner --help"
+  $ ./ns3 run "test-runner --help"
 
 You should see something like the following
 
@@ -611,7 +612,7 @@
 
 ::
 
-  $ ./waf shell
+  $ ./ns3 shell
   $ cd build/utils
   $ gdb ns3-dev-test-runner-debug
   $ run --suite=global-value --assert-on-failure
@@ -621,14 +622,14 @@
 that detected the error.
 
 To run one of the tests directly from the test-runner
-using ``waf``, you will need to specify the test suite to run.
+using ``ns3``, you will need to specify the test suite to run.
 So you could use the shell and do::
 
-  $ ./waf --run "test-runner --suite=pcap-file"
+  $ ./ns3 run "test-runner --suite=pcap-file"
 
 |ns3| logging is available when you run it this way, such as:
 
-  $ NS_LOG="Packet" ./waf --run "test-runner --suite=pcap-file"
+  $ NS_LOG="Packet" ./ns3 run "test-runner --suite=pcap-file"
 
 Test output
 +++++++++++
@@ -676,7 +677,7 @@
 
 ::
 
-  $ ./waf --run "test-runner --suite=pcap-file --out=myfile.txt"
+  $ ./ns3 run "test-runner --suite=pcap-file --out=myfile.txt"
 
 
 Debugging test suite failures
@@ -692,7 +693,7 @@
 then pass the "--basedir=`pwd`" argument to run (you can also pass other
 arguments as needed, but basedir is the minimum needed)::
 
-  $ ./waf --command-template="gdb %s" --run "test-runner"
+  $ ./ns3 run "test-runner" --command-template="gdb %s"
   Waf: Entering directory `/home/tomh/hg/sep09/ns-3-allinone/ns-3-dev-678/build'
   Waf: Leaving directory `/home/tomh/hg/sep09/ns-3-allinone/ns-3-dev-678/build'
   'build' finished successfully (0.380s)
@@ -714,7 +715,7 @@
 
   VALGR: TestSuite devices-mesh-dot11s-regression
 
-  $ ./waf --command-template="valgrind %s --suite=devices-mesh-dot11s-regression" --run test-runner
+  $ ./ns3 run test-runner --command-template="valgrind %s --suite=devices-mesh-dot11s-regression"
 
 Class TestRunner
 ****************
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/doc/manual/source/troubleshoot.rst ns-3.36/doc/manual/source/troubleshoot.rst
--- ns-3.35/doc/manual/source/troubleshoot.rst	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/doc/manual/source/troubleshoot.rst	2022-04-30 18:23:57.682732800 -0700
@@ -23,7 +23,7 @@
 
 Here is an example of what might occur::
 
-    $ ./waf --run tcp-point-to-point
+    $ ./ns3 run tcp-point-to-point
     Entering directory '/home/tomh/ns-3-nsc/build'
     Compilation finished successfully 
     Command ['/home/tomh/ns-3-nsc/build/debug/examples/tcp-point-to-point'] exited with code -11 
@@ -35,7 +35,7 @@
 
 .. sourcecode:: bash
 
-    $ ./waf --run tcp-point-to-point --gdb
+    $ ./ns3 run tcp-point-to-point --gdb
     Entering directory '/home/tomh/ns-3-nsc/build'
     Compilation finished successfully 
     GNU gdb Red Hat Linux (6.3.0.0-1.134.fc5rh)
@@ -84,4 +84,4 @@
 <http://valgrind.org>`_ for more subtle errors. Again, you invoke the use of
 valgrind similarly::
 
-    $ ./waf --run tcp-point-to-point --valgrind
+    $ ./ns3 run tcp-point-to-point --valgrind
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/doc/manual/source/utilities.rst ns-3.36/doc/manual/source/utilities.rst
--- ns-3.35/doc/manual/source/utilities.rst	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/doc/manual/source/utilities.rst	2022-04-30 18:23:57.682732800 -0700
@@ -35,25 +35,25 @@
 
 .. sourcecode:: bash
 
-    $ ./waf --run print-introspected-doxygen
+    $ ./ns3 run print-introspected-doxygen
 
 This will give all the output, formatted for Doxygen, which can be viewed
 in a text editor.
 
 One way to use this is to capture it to a file::
 
-    $ ./waf --run print-introspected-doxygen > doc.html
+    $ ./ns3 run print-introspected-doxygen > doc.html
 
 Some users might prefer to use tools like grep
 to locate the required piece of information from the documentation
 instead of using an editor. For such uses-cases and more,
 `print-introspected-doxygen` can return plain text::
 
-    $ ./waf --run "print-introspected-doxygen --output-text"
+    $ ./ns3 run "print-introspected-doxygen --output-text"
 
 (Note the quotes around the inner command and options.)
 
-    $ ./waf --run "print-introspected-doxygen --output-text" | grep "hello" 
+    $ ./ns3 run "print-introspected-doxygen --output-text" | grep "hello"
 
 This will output the following::
 
@@ -80,7 +80,7 @@
 
 .. sourcecode:: bash
 
-    $ ./waf --run "bench-simulator --help"
+    $ ./ns3 run "bench-simulator --help"
 
     Program Options:
 	--cal:    use CalendarSheduler [false]
@@ -115,7 +115,7 @@
 
 .. sourcecode:: bash
 
-    $ ./waf --run bench-simulator
+    $ ./ns3 run bench-simulator
     
 It will show something like this depending upon the scheduler being benchmarked::
 
@@ -137,7 +137,7 @@
 
 .. sourcecode:: bash
 
-    $ ./waf --run "bench-simulator --cal"
+    $ ./ns3 run "bench-simulator --cal"
  
 And the output would look something like this::
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/doc/manual/source/working-with-cmake.rst ns-3.36/doc/manual/source/working-with-cmake.rst
--- ns-3.35/doc/manual/source/working-with-cmake.rst	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/doc/manual/source/working-with-cmake.rst	2022-04-30 18:23:57.682732800 -0700
@@ -0,0 +1,2517 @@
+.. include:: replace.txt
+.. highlight:: console
+
+.. Section Separators:
+   ----
+   ****
+   ++++
+   ====
+   ~~~~
+
+.. _Working with CMake:
+
+Working with CMake
+------------------
+
+The ns-3 project used Waf build system in the past, but it has moved to
+CMake for the ns-3.36 release.
+
+CMake is very verbose and commands can be very long for basic operations.
+
+The wrapper script ``ns3`` hides most of verbosity from CMake and provide a 
+Waf-like interface for command-line users. 
+
+.. _CLion : https://www.jetbrains.com/clion/
+.. _Visual Studio : https://visualstudio.microsoft.com/
+.. _Code : https://code.visualstudio.com/Download
+.. _Xcode : https://developer.apple.com/xcode/
+.. _CodeBlocks : https://www.codeblocks.org/
+.. _Eclipse : https://www.eclipse.org/cdt/
+.. _CMake generated : https://cmake.org/cmake/help/latest/manual/cmake-generators.7.html
+.. _generator options : https://cmake.org/cmake/help/latest/manual/cmake-generators.7.html
+
+It is the recommended way to work on ns-3, except if you are using an 
+IDE that supports projects that can be generated with CMake or CMake projects.
+
+Here is a non-exhaustive list of IDEs that can be used:
+
+* Support CMake projects:
+  
+  * JetBrains's `CLion`_
+  * Microsoft `Visual Studio`_ and Visual Studio `Code`_
+
+* Supported IDEs via `CMake generated`_ projects:
+  
+  * Apple's `XCode`_ : ``ns3 configure -G Xcode``
+  * `CodeBlocks`_ : ``ns3 configure -G "CodeBlocks - Ninja"``
+  * `Eclipse`_ CDT4 : ``ns3 configure -G "Eclipse CDT4 - Ninja"`` 
+
+Note: Ninja was used for brevity. 
+Both CodeBlocks and Eclipse have additional `generator options`_.
+
+General instructions on how to setup and use IDEs are available
+in the Tutorial and will not be detailed here.
+
+Configuring the project
+***********************
+
+After getting the code, either cloning the ns-3-dev repository or 
+downloading the release tarball, you will need to configure the 
+project to work on it.
+
+There are two ways to configure the project: the easiest way 
+is using the ``ns3`` script and the other way directly with CMake.
+
+Configuring the project with ns3
+++++++++++++++++++++++++++++++++
+
+Navigate to the ns-3-dev directory, then run ``./ns3 configure --help`` to 
+print the configuration options:
+
+.. sourcecode:: console
+
+  ~$ cd ns-3-dev
+  ~/ns-3-dev$ ./ns3 configure --help
+  usage: ns3 configure [-h] [-d {debug,release,optimized}] [-G G]
+                     [--cxx-standard CXX_STANDARD] [--enable-asserts]
+                     [--disable-asserts] [--enable-examples]
+                     [--disable-examples] [--enable-logs]
+                     [--disable-logs] [--enable-tests] 
+                     [--disable-tests] [--enable-verbose] 
+                     [--disable-verbose]
+                     ...
+
+  positional arguments:
+    configure
+
+  optional arguments:
+    -h, --help            show this help message and exit
+    -d {debug,release,optimized}, --build-profile {debug,release,optimized}
+                          Build profile
+    -G G                  CMake generator (e.g.
+                          https://cmake.org/cmake/help/latest/manual/cmake-
+                          generators.7.html)
+    ...
+
+Note: the command output was trimmed to the most used options.
+
+To configure ns-3 in release mode, while enabling examples and tests,
+run ``./ns3 configure -d release --enable-examples --enable-tests``.
+To check what underlying commands dare being executed, add the 
+``--dry-run`` option:
+
+.. sourcecode:: console
+
+  ~/ns-3-dev$ ./ns3 --dry-run configure -d release --enable-examples --enable-tests
+  The following commands would be executed:
+  mkdir cmake-cache
+  cd cmake-cache; /usr/bin/cmake -DCMAKE_BUILD_TYPE=release -DNS3_NATIVE_OPTIMIZATIONS=OFF -DNS3_EXAMPLES=ON -DNS3_TESTS=ON -G Unix Makefiles .. ; cd ..
+
+Now we run it for real:
+
+.. sourcecode:: console
+
+  ~/ns-3-dev$ ./ns3 configure -d release --enable-examples --enable-tests
+  -- CCache is enabled. Precompiled headers are disabled by default.
+  -- The CXX compiler identification is GNU 11.2.0
+  -- The C compiler identification is GNU 11.2.0
+  -- Detecting CXX compiler ABI info
+  -- Detecting CXX compiler ABI info - done
+  -- Check for working CXX compiler: /usr/bin/c++ - skipped
+  -- Detecting CXX compile features
+  -- Detecting CXX compile features - done
+  ...
+  -- Processing src/wifi
+  -- Processing src/wimax
+  -- ---- Summary of optional NS-3 features:
+  Build profile                 : release
+  Build directory               : /mnt/dev/tools/source/ns-3-dev/build
+  ...
+  Examples                      : ON
+  ...
+  Tests                         : ON
+  Threading Primitives          : ON
+
+
+  Modules configured to be built:
+  antenna                   aodv                      applications              
+  bridge                    buildings                 config-store              
+  core                      csma                      csma-layout               
+  ...
+  wifi                      wimax                     
+
+  Modules that cannot be built:
+  brite                     click                     openflow                  
+  visualizer               
+
+
+  -- Configuring done
+  -- Generating done
+  -- Build files have been written to: /mnt/dev/tools/source/ns-3-dev/cmake-cache
+  Finished executing the following commands:
+  mkdir cmake-cache
+  cd cmake-cache; /usr/bin/cmake -DCMAKE_BUILD_TYPE=release -DNS3_NATIVE_OPTIMIZATIONS=OFF -DNS3_EXAMPLES=ON -DNS3_TESTS=ON -G Unix Makefiles .. ; cd ..
+
+Notice that CCache is automatically used (if installed) for your convenience.
+
+The summary with enabled feature shows both the ``release`` build type, along with
+enabled examples and tests.
+
+Below is a list of enabled modules and modules that cannot be built.
+
+At the end, notice we print the same commands from ``--dry-run``. This is done
+to familiarize Waf users with CMake and how the options names changed.
+
+The mapping of the ns3 build profiles into the CMake build types is the following:
+
++---------------------------+------------------------------------------------------------------------------------------+
+| Equivalent build profiles                                                                                            |
++---------------------------+--------------------------------------------------------+---------------------------------+
+| ns3                       | CMake                                                  | Equivalent GCC compiler flags   |  
+|                           +------------------------+-------------------------------+---------------------------------+
+|                           | CMAKE_BUILD_TYPE       | Additional flags              |                                 |
++===========================+========================+===============================+=================================+
+| debug                     | debug                  |                               | -Og -g                          |
++---------------------------+------------------------+-------------------------------+---------------------------------+
+| default                   | default|relwithdebinfo |                               | -O2 -g                          |
++---------------------------+------------------------+-------------------------------+---------------------------------+
+| release                   | release                |                               | -O3                             |
++---------------------------+------------------------+-------------------------------+---------------------------------+
+| optimized                 | release                | -DNS3_NATIVE_OPTIMIZATIONS=ON | -O3 -march=native -mtune=native |
++---------------------------+------------------------+-------------------------------+---------------------------------+
+
+Configuring the project with CMake
+++++++++++++++++++++++++++++++++++
+
+.. _CMake: https://cmake.org/cmake/help/latest/manual/cmake.1.html
+.. _CMAKE_BUILD_TYPE: https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html
+.. _Effects (g++): https://github.com/Kitware/CMake/blob/master/Modules/Compiler/GNU.cmake
+.. _generator: https://cmake.org/cmake/help/latest/manual/cmake-generators.7.html
+
+Navigate to the ns-3-dev directory, create a CMake cache folder, 
+navigate to it and run `CMake`_ pointing to the ns-3-dev folder.
+
+.. sourcecode:: console
+
+  ~$ cd ns-3-dev
+  ~/ns-3-dev$ mkdir cmake-cache
+  ~/ns-3-dev$ cd cmake-cache
+  ~/ns-3-dev/cmake-cache$ cmake ..
+
+You can pass additional arguments to the CMake command, to configure it. To change variable values,
+you should use the -D option followed by the variable name.
+
+As an example, the build type is stored in the variable named `CMAKE_BUILD_TYPE`_. Setting it to one 
+of the CMake build types shown in the table below will change compiler settings associated with those
+build types and output executable and libraries names, which will receive a suffix.
+
++------------------+-------------------+
+| CMAKE_BUILD_TYPE | `Effects (g++)`_  |
++==================+===================+
+| DEBUG            | -g                |
++------------------+-------------------+
+| RELEASE          | -O3 -DNDEBUG      |
++------------------+-------------------+
+| RELWITHDEBINFO   | -O2 -g -DNDEBUG   |
++------------------+-------------------+
+| MINSIZEREL       | -Os -DNDEBUG      |
++------------------+-------------------+
+
+You can set the build type with the following command, which assumes your terminal is inside the cache folder
+created previously.
+
+.. sourcecode:: console
+
+  ~/ns-3-dev/cmake-cache$ cmake -DCMAKE_BUILD_TYPE=DEBUG ..
+
+Another common option to change is the `generator`_, which is the real underlying build system called by CMake.
+There are many generators supported by CMake, including the ones listed in the table below.
+
++------------------------------------------------+
+| Generators                                     |
++================================================+
+| MinGW Makefiles                                |
++------------------------------------------------+
+| Unix Makefiles                                 |
++------------------------------------------------+
+| MSYS Makefiles                                 |
++------------------------------------------------+
+| CodeBlocks - *one of the previous Makefiles*   |
++------------------------------------------------+
+| Eclipse CDT4 - *one of the previous Makefiles* |
++------------------------------------------------+
+| Ninja                                          |
++------------------------------------------------+
+| Xcode                                          |
++------------------------------------------------+
+
+To change the generator, you will need to pass one of these generators with the -G option. For example, if we 
+prefer Ninja to Makefiles, which are the default, we need to run the following command:
+
+.. sourcecode:: console
+
+  ~/ns-3-dev/cmake-cache$ cmake -G Ninja ..
+
+This command may fail if there are different generator files in the same CMake cache folder. It is recommended to clean up
+the CMake cache folder, then recreate it and reconfigure setting the generator in the first run.
+
+.. sourcecode:: console
+
+  ~/ns-3-dev/cmake-cache$ cd ..
+  ~/ns-3-dev$ rm -R cmake-cache && mkdir cmake-cache && cd cmake-cache
+  ~/ns-3-dev/cmake-cache$ cmake -DCMAKE_BUILD_TYPE=release -G Ninja ..
+
+After configuring for the first time, settings will be initialized to their
+default values, and then you can use the ``ccmake`` command to manually change them:
+
+.. sourcecode:: console
+
+  ~/ns-3-dev/cmake-cache$ ccmake .
+  CMAKE_BUILD_TYPE                 release
+  CMAKE_INSTALL_PREFIX             /usr/local
+  NS3_ASSERT                       OFF
+  ...
+  NS3_EXAMPLES                     ON
+  ...
+  NS3_LOG                          OFF
+  NS3_TESTS                        ON
+  NS3_VERBOSE                      OFF
+  ...
+
+  CMAKE_BUILD_TYPE: Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel ...                                                       
+  Keys: [enter] Edit an entry [d] Delete an entry                                                                                             CMake Version 3.22.1
+        [l] Show log output   [c] Configure
+        [h] Help              [q] Quit without generating
+        [t] Toggle advanced mode (currently off)
+
+After moving the cursor and setting the desired values, type ``c`` to configure CMake.
+
+If you prefer doing everything with a non-interactive command, look at the main ``CMakeLists.txt``
+file in the ns-3-dev directory. It contains most of the option flags and their default values.
+To enable both examples and tests, run:
+
+.. sourcecode:: console
+
+  ~/ns-3-dev/cmake-cache$ cmake -DNS3_EXAMPLES=ON -DNS3_TESTS=ON ..
+
+
+.. _Manually refresh the CMake cache:
+
+Manually refresh the CMake cache
+********************************
+
+After the project has been configured, calling ``CMake`` will 
+:ref:`refresh the CMake cache<Manually refresh the CMake cache>`. 
+The refresh is required to discover new targets: libraries, executables and/or modules
+that were created since the last run.
+
+The refresh is done by running the CMake command from the CMake cache folder. 
+
+.. sourcecode:: console
+
+  ~/ns-3-dev/cmake-cache$ cmake ..
+
+Previous settings stored in the CMakeCache.txt will be preserved, while new modules will be
+scanned and targets will be added.
+
+The cache can also be refreshed with the ns3 wrapper script:
+
+.. sourcecode:: console
+
+  ~/ns-3-dev$ ./ns3 configure
+
+
+Building the project
+********************
+
+There are three ways of building the project: 
+using the ``ns3`` script, calling ``CMake`` and 
+calling the underlying build system (e.g. Ninja) directly.
+The last way is omitted, since each underlying build system 
+has its own unique command-line syntax.
+
+Building the project with ns3
++++++++++++++++++++++++++++++
+
+The ns3 wrapper script makes life easier for command line users, accepting module names without
+the ``lib`` prefix and scratch files without the ``scratch_`` prefix. The following command can 
+be used to build the entire project:
+
+.. sourcecode:: console
+
+  ~/ns-3-dev$ ./ns3 build 
+
+
+To build specific targets, run:
+
+.. sourcecode:: console
+
+  ~/ns-3-dev$ ./ns3 build target_name
+
+
+Building the project with CMake
++++++++++++++++++++++++++++++++
+
+The build process of targets (either libraries, executables or custom tasks) can be done
+invoking CMake build. To build all the targets, run:
+
+.. sourcecode:: console
+
+  ~/ns-3-dev/cmake-cache$ cmake --build .
+
+Notice the single dot now refers to the ``cmake-cache`` directory, where the underlying
+build system files are stored (referred inside CMake as ``PROJECT_BINARY_DIR`` or 
+``CMAKE_BINARY_DIR``, which have slightly different uses if working with sub-projects).
+
+.. _PROJECT_BINARY_DIR: https://cmake.org/cmake/help/latest/variable/PROJECT_BINARY_DIR.html
+.. _CMAKE_BINARY_DIR: https://cmake.org/cmake/help/latest/variable/CMAKE_BINARY_DIR.html
+
+To build specific targets, run:
+
+.. sourcecode:: console
+
+  ~/ns-3-dev/cmake-cache$ cmake --build . --target target_name
+
+Where target_name is a valid target name. Module libraries are prefixed with ``lib`` (e.g. libcore),
+executables from the scratch folder are prefixed with ``scratch_`` (e.g. scratch_scratch-simulator).
+Executables targets have their source file name without the ".cc" prefix 
+(e.g. sample-simulator.cc => sample-simulator).
+
+
+Adding a new module
+*******************
+
+Adding a module is the only case where 
+:ref:`manually refreshing the CMake cache<Manually refresh the CMake cache>` is required. 
+
+More information on how to create a new module are provided in :ref:`Adding a New Module to ns3`.
+
+Migrating a Waf module to CMake
+*******************************
+
+If your module does not have external dependencies, porting is very easy.
+Start by copying the module Wscript, rename them to CMakeLists.txt and then open it.
+
+We are going to use the aodv module as an example:
+
+.. sourcecode:: python3
+
+  ## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
+
+  def build(bld):
+    module = bld.create_ns3_module('aodv', ['internet', 'wifi'])
+    module.includes = '.'
+    module.source = [
+        'model/aodv-id-cache.cc',
+        'model/aodv-dpd.cc',
+        'model/aodv-rtable.cc',
+        'model/aodv-rqueue.cc',
+        'model/aodv-packet.cc',
+        'model/aodv-neighbor.cc',
+        'model/aodv-routing-protocol.cc',
+        'helper/aodv-helper.cc',
+        ]
+
+    aodv_test = bld.create_ns3_module_test_library('aodv')
+    aodv_test.source = [
+        'test/aodv-id-cache-test-suite.cc',
+        'test/aodv-test-suite.cc',
+        'test/aodv-regression.cc',
+        'test/bug-772.cc',
+        'test/loopback.cc',
+        ]
+
+    # Tests encapsulating example programs should be listed here
+    if (bld.env['ENABLE_EXAMPLES']):
+        aodv_test.source.extend([
+        #   'test/aodv-examples-test-suite.cc',
+            ])
+    
+    headers = bld(features='ns3header')
+    headers.module = 'aodv'
+    headers.source = [
+        'model/aodv-id-cache.h',
+        'model/aodv-dpd.h',
+        'model/aodv-rtable.h',
+        'model/aodv-rqueue.h',
+        'model/aodv-packet.h',
+        'model/aodv-neighbor.h',
+        'model/aodv-routing-protocol.h',
+        'helper/aodv-helper.h',
+        ]
+
+    if bld.env['ENABLE_EXAMPLES']:
+        bld.recurse('examples')
+
+    bld.ns3_python_bindings()
+
+
+We can see the module name is ``aodv`` and it depends on the ``internet`` and the ``wifi`` libraries, 
+plus the lists of files (``module.source``, ``headers.source`` and ``module_test.source``).
+
+This translates to the following CMake lines:
+
+.. sourcecode:: cmake
+
+  build_lib(
+    LIBNAME aodv # aodv module, which can later be linked to examples and modules with ${libaodv}
+    SOURCE_FILES # equivalent to module.source
+      helper/aodv-helper.cc
+      model/aodv-dpd.cc
+      model/aodv-id-cache.cc
+      model/aodv-neighbor.cc
+      model/aodv-packet.cc
+      model/aodv-routing-protocol.cc
+      model/aodv-rqueue.cc
+      model/aodv-rtable.cc
+    HEADER_FILES # equivalent to headers.source
+      helper/aodv-helper.h
+      model/aodv-dpd.h
+      model/aodv-id-cache.h
+      model/aodv-neighbor.h
+      model/aodv-packet.h
+      model/aodv-routing-protocol.h
+      model/aodv-rqueue.h
+      model/aodv-rtable.h
+    LIBRARIES_TO_LINK ${libinternet} # depends on internet and wifi,
+                      ${libwifi}     # but both are prefixed with lib in CMake
+    TEST_SOURCES # equivalent to module_test.source
+      test/aodv-id-cache-test-suite.cc
+      test/aodv-regression.cc
+      test/aodv-test-suite.cc
+      test/loopback.cc
+      test/bug-772.cc
+  )
+
+If your module depends on external libraries, check the section 
+`Linking third-party libraries`_.
+
+Python bindings will be picked up if there is a subdirectory bindings 
+and NS3_PYTHON_BINDINGS is enabled.
+
+Next, we need to port the examples wscript. Repeat the copy, rename and open
+steps. We should have something like the following:
+
+.. sourcecode:: python3
+
+  ## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
+
+  def build(bld):
+      obj = bld.create_ns3_program('aodv',
+                                   ['wifi', 'internet', 'aodv', 'internet-apps'])
+      obj.source = 'aodv.cc'
+
+This means we create an example named ``aodv`` which depends on ``wifi``, ``internet``,
+``aodv`` and ``internet-apps`` module, and has a single source file ``aodv.cc``.
+This translates into the following CMake:
+
+.. sourcecode:: cmake
+
+  build_lib_example(
+    NAME aodv # example named aodv
+    SOURCE_FILES aodv.cc # single source file aodv.cc
+    LIBRARIES_TO_LINK # depends on wifi, internet, aodv and internet-apps
+      ${libwifi}
+      ${libinternet}
+      ${libaodv}
+      ${libinternet-apps}
+  )
+
+
+Running programs
+****************
+
+Running programs with the ns3 wrapper script is pretty simple. To run the 
+scratch program produced by ``scratch/scratch-simulator.cc``, you need the following:
+
+.. sourcecode:: console
+
+  ~/ns-3-dev$ ./ns3 run scratch-simulator --no-build
+
+Notice the ``--no-build`` indicates that the program should only be executed, and not built
+before execution. 
+
+To familiarize users with CMake, ns3 can also print the underlying CMake
+and command line commands used by adding the ``--dry-run`` flag. 
+Removing the ``--no-build`` flag and adding ``--dry-run`` to the same example, 
+produces the following:
+
+.. sourcecode:: console
+
+  ~/ns-3-dev$ ./ns3 --dry-run run scratch-simulator
+  The following commands would be executed:
+  cd cmake-cache; cmake --build . -j 15 --target scratch_scratch-simulator ; cd ..
+  export PATH=$PATH:~/ns-3-dev/build/lib 
+  export PYTHONPATH=~/ns-3-dev/build/bindings/python
+  export LD_LIBRARY_PATH=~/ns-3-dev/build/lib 
+  ./build/scratch/ns3-dev-scratch-simulator
+
+
+In the CMake build command line, notice the scratch-simulator has a ``scratch_`` prefix.
+That is true for all the CMake scratch targets. This is done to guarantee globally unique names.
+Similarly, library-related targets have ``lib`` as a prefix (e.g. ``libcore``, ``libnetwork``).
+
+.. _RPATH: https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_RPATH.html
+
+The next few lines exporting variables guarantee the executable can find python dependencies
+(``PYTHONPATH``) and linked libraries (``LD_LIBRARY_PATH`` and ``PATH`` on Unix-like, and 
+``PATH`` on Windows). This is not necessary in platforms that support `RPATH`_.
+
+Notice that when the scratch-simulator program is called on the last line, it has
+a ns3-version prefix and could also have a build type suffix. 
+This is valid for all libraries and executables, but ommited in ns-3 for simplicity.
+
+Debugging can be done with GDB. Again, we have the two ways to run the program.
+Using the ns-3 wrapper:
+
+.. sourcecode:: console
+
+  ~/ns-3-dev$ ./ns3 run scratch-simulator --no-build --gdb
+
+Or directly:
+
+.. sourcecode:: console
+
+  ~/ns-3-dev/cmake-cache$ export PATH=$PATH:~/ns-3-dev/build/lib
+  ~/ns-3-dev/cmake-cache$ export PYTHONPATH=~/ns-3-dev/build/bindings/python
+  ~/ns-3-dev/cmake-cache$ export LD_LIBRARY_PATH=~/ns-3-dev/build/lib
+  ~/ns-3-dev/cmake-cache$ gdb ../build/scratch/ns3-dev-scratch-simulator
+
+
+Modifying files
+***************
+
+As CMake is not a build system on itself, but a meta build system, it requires 
+frequent refreshes, also known as reconfigurations. Those refreshes are triggered
+automatically in the following cases:
+
+* Changes in linked libraries
+* Changes in the CMake code
+* Header changes
+* Header/source file name changes
+* Module name changes
+
+The following sections will detail some of these cases assuming a hypothetical module defined below.
+Notice that the build_lib is the fundamental piece of every ns-3 module, while user-settable
+options and external libraries checking are optional.
+
+.. sourcecode:: cmake
+
+    build_lib(
+      LIBNAME hypothetical
+      SOURCE_FILES  helper/hypothetical-helper.cc
+                    model/hypothetical.cc
+      HEADER_FILES 
+        helper/hypothetical-helper.h
+        model/hypothetical.h
+        model/colliding-header.h
+      LIBRARIES_TO_LINK ${libcore}
+      )
+
+
+Module name changes
++++++++++++++++++++
+
+Changing the module name requires changing the value of ``LIBNAME``.
+In the following example the name of the module seen previously is 
+changed from ``hypothetical`` to ``new-hypothetical-name``:
+
+.. sourcecode:: cmake
+
+    build_lib(
+      LIBNAME new-hypothetical-name
+      # ... 
+    )
+
+If the module was already scanned, saving the changes and trying to build will trigger the
+automatic CMake refresh. Otherwise, reconfigure the project to 
+:ref:`manually refresh it<Manually refresh the CMake cache>`.
+
+
+Header/source file name changes
++++++++++++++++++++++++++++++++
+
+Assuming the hypothetical module defined previously has a header name that collides
+with a header of a different module.
+
+The name of the ``colliding-header.h`` can be changed via the filesystem to 
+``non-colliding-header.h``, and the ``CMakeLists.txt`` path needs to be updated to match
+the new name. Some IDEs can do this automatically through refactoring tools.
+
+.. sourcecode:: cmake
+
+    build_lib(
+      LIBNAME new-hypothetical-name
+      # ... 
+      HEADER_FILES
+          helper/hypothetical-helper.h
+          model/hypothetical.h
+          model/non-colliding-header.h
+      # ... 
+    )
+
+
+Linking ns-3 modules
+++++++++++++++++++++
+
+Adding a dependency to another ns-3 module just requires adding ``${lib${modulename}}``
+to the ``LIBRARIES_TO_LINK`` list, where modulename contains the value of the ns-3 
+module which will be depended upon. 
+
+Note: All ns-3 module libraries are prefixed with ``lib``,
+as CMake requires unique global target names.
+
+.. sourcecode:: cmake
+
+    # now ${libnew-hypothetical-name} will depend on both core and internet modules
+    build_lib(
+      LIBNAME new-hypothetical-name
+      # ... 
+      LIBRARIES_TO_LINK ${libcore} 
+                        ${libinternet}
+      # ... 
+    )
+
+
+.. _Linking third-party libraries:
+
+Linking third-party libraries
++++++++++++++++++++++++++++++
+
+Depending on a third-party library is a bit more complicated as we have multiple
+ways to handle that within CMake.
+
+.. _Linking third-party libraries without CMake or PkgConfig support:
+
+Linking third-party libraries without CMake or PkgConfig support
+================================================================
+
+When the third-party library you want to use do not export CMake files to use
+``find_package`` or PkgConfig files to use ``pkg_check_modules``, we need to 
+search for the headers and libraries manually. To simplify this process,
+we include the macro ``find_external_library`` that searches for libraries and
+header include directories, exporting results similarly to ``find_package``.
+
+Here is how it works:
+
+.. sourcecode:: cmake
+
+  function(find_external_library)
+    # Parse arguments
+    set(options QUIET)
+    set(oneValueArgs DEPENDENCY_NAME HEADER_NAME LIBRARY_NAME)
+    set(multiValueArgs HEADER_NAMES LIBRARY_NAMES PATH_SUFFIXES SEARCH_PATHS)
+    cmake_parse_arguments(
+      "FIND_LIB" "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}
+    )
+
+    # Set the external package/dependency name
+    set(name ${FIND_LIB_DEPENDENCY_NAME})
+
+    # We process individual and list of headers and libraries by transforming them
+    # into lists
+    set(library_names "${FIND_LIB_LIBRARY_NAME};${FIND_LIB_LIBRARY_NAMES}")
+    set(header_names "${FIND_LIB_HEADER_NAME};${FIND_LIB_HEADER_NAMES}")
+
+    # Just changing the parsed argument name back to something shorter
+    set(search_paths ${FIND_LIB_SEARCH_PATHS})
+    set(path_suffixes "${FIND_LIB_PATH_SUFFIXES}")
+
+    set(not_found_libraries)
+    set(library_dirs)
+    set(libraries)
+    # Paths and suffixes where libraries will be searched on
+    set(library_search_paths
+            ${search_paths}
+            ${CMAKE_OUTPUT_DIRECTORY} # Search for libraries in ns-3-dev/build
+            ${CMAKE_INSTALL_PREFIX} # Search for libraries in the install directory (e.g. /usr/)
+            $ENV{LD_LIBRARY_PATH} # Search for libraries in LD_LIBRARY_PATH directories
+            $ENV{PATH} # Search for libraries in PATH directories
+            )
+    set(suffixes /build /lib /build/lib / /bin ${path_suffixes})
+
+    # For each of the library names in LIBRARY_NAMES or LIBRARY_NAME
+    foreach(library ${library_names})
+      # We mark this value is advanced not to pollute the configuration with
+      # ccmake with the cache variables used internally
+      mark_as_advanced(${name}_library_internal_${library})
+
+      # We search for the library named ${library} and store the results in
+      # ${name}_library_internal_${library}
+      find_library(
+        ${name}_library_internal_${library} ${library}
+        HINTS ${library_search_paths}
+        PATH_SUFFIXES ${suffixes}
+      )
+      # cmake-format: off
+      # Note: the PATH_SUFFIXES above apply to *ALL* PATHS and HINTS Which
+      # translates to CMake searching on standard library directories
+      # CMAKE_SYSTEM_PREFIX_PATH, user-settable CMAKE_PREFIX_PATH or
+      # CMAKE_LIBRARY_PATH and the directories listed above
+      #
+      # e.g.  from Ubuntu 22.04 CMAKE_SYSTEM_PREFIX_PATH =
+      # /usr/local;/usr;/;/usr/local;/usr/X11R6;/usr/pkg;/opt
+      #
+      # Searched directories without suffixes
+      #
+      # ${CMAKE_SYSTEM_PREFIX_PATH}[0] = /usr/local/
+      # ${CMAKE_SYSTEM_PREFIX_PATH}[1] = /usr
+      # ${CMAKE_SYSTEM_PREFIX_PATH}[2] = /
+      # ...
+      # ${CMAKE_SYSTEM_PREFIX_PATH}[6] = /opt
+      # ${LD_LIBRARY_PATH}[0]
+      # ...
+      # ${LD_LIBRARY_PATH}[m]
+      # ...
+      #
+      # Searched directories with suffixes include all of the directories above
+      # plus all suffixes
+      # PATH_SUFFIXES /build /lib /build/lib / /bin # ${path_suffixes}
+      #
+      # /usr/local/build
+      # /usr/local/lib
+      # /usr/local/build/lib
+      # /usr/local/bin
+      # ...
+      #
+      # cmake-format: on
+      # Or enable NS3_VERBOSE to print the searched paths
+
+      # Print tested paths to the searched library and if it was found
+      if(${NS3_VERBOSE})
+        log_find_searched_paths(
+                TARGET_TYPE Library
+                TARGET_NAME ${library}
+                SEARCH_RESULT ${name}_library_internal_${library}
+                SEARCH_PATHS ${library_search_paths}
+                SEARCH_SUFFIXES ${suffixes}
+        )
+      endif()
+
+      # After searching the library, the internal variable should have either the
+      # absolute path to the library or the name of the variable appended with
+      # -NOTFOUND
+      if("${${name}_library_internal_${library}}" STREQUAL
+         "${name}_library_internal_${library}-NOTFOUND"
+      )
+        # We keep track of libraries that were not found
+        list(APPEND not_found_libraries ${library})
+      else()
+        # We get the name of the parent directory of the library and append the
+        # library to a list of found libraries
+        get_filename_component(
+          ${name}_library_dir_internal ${${name}_library_internal_${library}}
+          DIRECTORY
+        ) # e.g. lib/openflow.(so|dll|dylib|a) -> lib
+        list(APPEND library_dirs ${${name}_library_dir_internal})
+        list(APPEND libraries ${${name}_library_internal_${library}})
+      endif()
+    endforeach()
+
+    # For each library that was found (e.g. /usr/lib/pthread.so), get their parent
+    # directory (/usr/lib) and its parent (/usr)
+    set(parent_dirs)
+    foreach(libdir ${library_dirs})
+      get_filename_component(parent_libdir ${libdir} DIRECTORY)
+      get_filename_component(parent_parent_libdir ${parent_libdir} DIRECTORY)
+      list(APPEND parent_dirs ${libdir} ${parent_libdir} ${parent_parent_libdir})
+    endforeach()
+
+    # If we already found a library somewhere, limit the search paths for the header
+    if(parent_dirs)
+      set(header_search_paths ${parent_dirs})
+      set(header_skip_system_prefix NO_CMAKE_SYSTEM_PATH)
+    else()
+      set(header_search_paths
+              ${search_paths}
+              ${CMAKE_OUTPUT_DIRECTORY} # Search for headers in ns-3-dev/build
+              ${CMAKE_INSTALL_PREFIX} # Search for headers in the install
+              )
+    endif()
+
+    set(not_found_headers)
+    set(include_dirs)
+    foreach(header ${header_names})
+      # The same way with libraries, we mark the internal variable as advanced not
+      # to pollute ccmake configuration with variables used internally
+      mark_as_advanced(${name}_header_internal_${header})
+      set(suffixes
+              /build
+              /include
+              /build/include
+              /build/include/${name}
+              /include/${name}
+              /${name}
+              /
+              ${path_suffixes}
+              )
+      # cmake-format: off
+      # Here we search for the header file named ${header} and store the result in
+      # ${name}_header_internal_${header}
+      #
+      # The same way we did with libraries, here we search on
+      # CMAKE_SYSTEM_PREFIX_PATH, along with user-settable ${search_paths}, the
+      # parent directories from the libraries, CMAKE_OUTPUT_DIRECTORY and
+      # CMAKE_INSTALL_PREFIX
+      #
+      # And again, for each of them, for every suffix listed /usr/local/build
+      # /usr/local/include
+      # /usr/local/build/include
+      # /usr/local/build/include/${name}
+      # /usr/local/include/${name}
+      # ...
+      #
+      # cmake-format: on
+      # Or enable NS3_VERBOSE to get the searched paths printed while configuring
+
+      find_file(
+        ${name}_header_internal_${header} ${header}
+        HINTS ${header_search_paths} # directory (e.g. /usr/)
+        ${header_skip_system_prefix}
+        PATH_SUFFIXES ${suffixes}
+      )
+
+      # Print tested paths to the searched header and if it was found
+      if(${NS3_VERBOSE})
+        log_find_searched_paths(
+                TARGET_TYPE Header
+                TARGET_NAME ${header}
+                SEARCH_RESULT ${name}_header_internal_${header}
+                SEARCH_PATHS ${header_search_paths}
+                SEARCH_SUFFIXES ${suffixes}
+                SEARCH_SYSTEM_PREFIX ${header_skip_system_prefix}
+        )
+      endif()
+
+      # If the header file was not found, append to the not-found list
+      if("${${name}_header_internal_${header}}" STREQUAL
+         "${name}_header_internal_${header}-NOTFOUND"
+      )
+        list(APPEND not_found_headers ${header})
+      else()
+        # If the header file was found, get their directories and the parent of
+        # their directories to add as include directories
+        get_filename_component(
+          header_include_dir ${${name}_header_internal_${header}} DIRECTORY
+        ) # e.g. include/click/ (simclick.h) -> #include <simclick.h> should work
+        get_filename_component(
+          header_include_dir2 ${header_include_dir} DIRECTORY
+        ) # e.g. include/(click) -> #include <click/simclick.h> should work
+        list(APPEND include_dirs ${header_include_dir} ${header_include_dir2})
+      endif()
+    endforeach()
+
+    # Remove duplicate include directories
+    if(include_dirs)
+      list(REMOVE_DUPLICATES include_dirs)
+    endif()
+
+    # If we find both library and header, we export their values
+    if((NOT not_found_libraries}) AND (NOT not_found_headers))
+      set(${name}_INCLUDE_DIRS "${include_dirs}" PARENT_SCOPE)
+      set(${name}_LIBRARIES "${libraries}" PARENT_SCOPE)
+      set(${name}_HEADER ${${name}_header_internal} PARENT_SCOPE)
+      set(${name}_FOUND TRUE PARENT_SCOPE)
+      set(status_message "find_external_library: ${name} was found.")
+    else()
+      set(${name}_INCLUDE_DIRS PARENT_SCOPE)
+      set(${name}_LIBRARIES PARENT_SCOPE)
+      set(${name}_HEADER PARENT_SCOPE)
+      set(${name}_FOUND FALSE PARENT_SCOPE)
+      set(status_message
+          "find_external_library: ${name} was not found. Missing headers: \"${not_found_headers}\" and missing libraries: \"${not_found_libraries}\"."
+      )
+    endif()
+
+    if(NOT ${FIND_LIB_QUIET})
+      message(STATUS "${status_message}")
+    endif()
+  endfunction()
+
+Debugging why a header or a library cannot be found is fairly tricky.
+For ``find_external_library`` users, enabling the ``NS3_VERBOSE`` switch
+will enable the logging of search path directories for both headers and
+libraries.
+
+.. _CMAKE_FIND_DEBUG_MODE: https://cmake.org/cmake/help/latest/variable/CMAKE_FIND_DEBUG_MODE.html
+
+Note: The logging provided by find_external_library is an alternative to
+CMake's own ``CMAKE_FIND_DEBUG_MODE=true`` introduced in CMake 3.17,
+which gets used by *ALL* ``find_file``, ``find_library``, ``find_header``,
+``find_package`` and ``find_path`` calls throughout CMake and its modules.
+If you are using a recent version of CMake, it is recommended to use
+`CMAKE_FIND_DEBUG_MODE`_ instead.
+
+A commented version of the Openflow module ``CMakeLists.txt`` has an 
+example of ``find_external_library`` usage.
+
+.. sourcecode:: cmake
+
+    # Export a user option to specify the path to a custom
+    # openflow build directory.
+    set(NS3_WITH_OPENFLOW
+        ""
+        CACHE PATH
+              "Build with Openflow support"
+    )
+    # We use this variable later in the ns-3-dev scope, but 
+    # the value would be lost if we saved it to the 
+    # parent scope ns-3-dev/src or ns-3-dev/contrib.
+    # We set it as an INTERNAL CACHE variable to make it globally available.
+    set(NS3_OPENFLOW
+        "OFF"
+        CACHE INTERNAL
+              "ON if Openflow is found"
+    )
+
+    # This is the macro that searches for headers and libraries.
+    # The DEPENDENCY_NAME is the equivalent of the find_package package name.
+    # Resulting variables will be prefixed with DEPENDENCY_NAME.
+    # - openflow_FOUND will be set to True if both headers and libraries
+    #     were found and False otherwise
+    # - openflow_LIBRARIES will contain a list of absolute paths to the 
+    #     libraries named in LIBRARY_NAME|LIBRARY_NAMES
+    # - openflow_INCLUDE_DIRS will contain a list of include directories that contain
+    #     headers named in HEADER_NAME|HEADER_NAMES and directories that contain
+    #     those directories.
+    #     e.g. searching for core-module.h will return
+    #     both ns-3-dev/build/include/ns3 and ns-3-dev/build/include,
+    #     allowing users to include both <core-module.h> and <ns3/core-module.h>
+    # If a user-settable variable was created, it can be searched too by
+    # adding it to the SEARCH_PATHS
+    find_external_library(
+      DEPENDENCY_NAME openflow
+      HEADER_NAME openflow.h
+      LIBRARY_NAME openflow
+      SEARCH_PATHS ${NS3_WITH_OPENFLOW} # user-settable search path, empty by default
+    )
+
+    # Before testing if the header and library were found ${openflow_FOUND},
+    # test if openflow_FOUND was defined
+    # If openflow_FOUND was not defined, the dependency name above doesn't match
+    # the tested values below
+    # If openflow_FOUND is set to FALSE, stop processing the module by returning
+    # to the parent directory with return()
+    if((NOT
+        openflow_FOUND)
+       AND (NOT
+            ${openflow_FOUND})
+    )
+      message(STATUS "Openflow was not found")
+      return()
+    endif()
+
+    # Check for the Boost header used by the openflow module
+    check_include_file_cxx(
+      boost/static_assert.hpp
+      BOOST_STATIC_ASSERT
+    )
+
+    # Stop processing the module if it was not found
+    if(NOT
+      BOOST_STATIC_ASSERT
+    )
+      message(STATUS "Openflow requires Boost static_assert.hpp")
+      return()
+    endif()
+
+    # Here we consume the include directories found by 
+    # find_external_library
+    #
+    # This will make the following work:
+    #  include<openflow/openflow.h>
+    #  include<openflow.h>
+    include_directories(${openflow_INCLUDE_DIRS})
+
+    # Manually set definitions
+    add_definitions(
+      -DNS3_OPENFLOW
+      -DENABLE_OPENFLOW
+    )
+
+    # Set the cache variable indicating Openflow is enabled as
+    # all dependencies were met
+    set(NS3_OPENFLOW
+        "ON"
+        CACHE INTERNAL
+              "ON if Openflow is found in NS3_WITH_OPENFLOW"
+    )
+
+    # Additional compilation flag to ignore a specific warning
+    add_compile_options(-Wno-stringop-truncation)
+
+    # Call macro to create the module target
+    build_lib(
+      LIBNAME openflow
+      SOURCE_FILES
+        helper/openflow-switch-helper.cc
+        model/openflow-interface.cc
+        model/openflow-switch-net-device.cc
+      HEADER_FILES
+        helper/openflow-switch-helper.h
+        model/openflow-interface.h
+        model/openflow-switch-net-device.h
+      LIBRARIES_TO_LINK ${libinternet}
+                        # Here we consume the list of libraries 
+                        # exported by find_external_library
+                        ${openflow_LIBRARIES} 
+      TEST_SOURCES test/openflow-switch-test-suite.cc
+    )
+
+
+Linking third-party libraries using CMake's find_package
+========================================================
+
+Assume we have a module with optional features that rely on a third-party library
+that provides a FindThirdPartyPackage.cmake. This ``Find${Package}.cmake`` file can be distributed
+by `CMake itself`_, via library/package managers (APT, Pacman, 
+`VcPkg`_), or included to the project tree in the build-support/3rd-party directory.
+
+.. _CMake itself: https://github.com/Kitware/CMake/tree/master/Modules
+.. _Vcpkg: https://github.com/Microsoft/vcpkg#using-vcpkg-with-cmake
+
+When ``find_package(${Package})`` is called, the ``Find${Package}.cmake`` file gets processed,
+and multiple variables are set. There is no hard standard in the name of those variables, nor if
+they should follow the modern CMake usage, where just linking to the library will include 
+associated header directories, forward compile flags and so on. 
+
+We assume the old CMake style is the one being used, which means we need to include the include
+directories provided by the ``Find${Package}.cmake module``, usually exported as a variable 
+``${Package}_INCLUDE_DIRS``, and get a list of libraries for that module so that they can be 
+added to the list of libraries to link of the ns-3 modules. Libraries are usually exported as
+the variable ``${Package}_LIBRARIES``.
+
+As an example for the above, we use the Boost library 
+(excerpt from ``macros-and-definitions.cmake`` and ``src/core/CMakeLists.txt``):
+
+.. sourcecode:: cmake
+
+  # https://cmake.org/cmake/help/v3.10/module/FindBoost.html?highlight=module%20find#module:FindBoost
+  find_package(Boost)
+
+  # It is recommended to create either an empty list that is conditionally filled
+  # and later included in the LIBRARIES_TO_LINK list unconditionally
+  set(boost_libraries)
+
+  # If Boost is found, Boost_FOUND will be set to true, which we can then test
+  if(${Boost_FOUND})
+    # This will export Boost include directories to ALL subdirectories
+    # of the current CMAKE_CURRENT_SOURCE_DIR
+    #
+    # If calling this from the top-level directory (ns-3-dev), it will
+    # be used by all contrib/src modules, examples, etc
+    include_directories(${Boost_INCLUDE_DIRS})
+
+    # This is a trick for Boost
+    # Sometimes you want to check if specific Boost headers are available,
+    # but they would not be found if they're not in system include directories
+    set(CMAKE_REQUIRED_INCLUDES ${Boost_INCLUDE_DIRS})
+
+    # We get the list of Boost libraries and save them in the boost_libraries list
+    set(boost_libraries ${Boost_LIBRARIES})
+  endif()
+
+  # If Boost was found earlier, we will be able to check if Boost headers are available
+  check_include_file_cxx(
+    "boost/units/quantity.hpp"
+    HAVE_BOOST_UNITS_QUANTITY
+  )
+  check_include_file_cxx(
+    "boost/units/systems/si.hpp"
+    HAVE_BOOST_UNITS_SI
+  )
+  if(${HAVE_BOOST_UNITS_QUANTITY}
+    AND ${HAVE_BOOST_UNITS_SI}
+  )
+    # Activate optional features that rely on Boost
+    add_definitions(
+      -DHAVE_BOOST
+      -DHAVE_BOOST_UNITS
+    )
+    # In this case, the Boost libraries are header-only, 
+    # but in case we needed real libraries, we could add
+    # boost_libraries to either the auxiliary libraries_to_link list
+    # or the build_lib's LIBRARIES_TO_LINK list
+    message(STATUS "Boost Units have been found.")
+  else()
+    message(
+      STATUS
+        "Boost Units are an optional feature of length.cc."
+    )
+  endif()
+
+
+If ``Find${Package}.cmake`` does not exist in your module path, CMake will warn you that is the case.
+If ``${Package_FOUND}`` is set to False, other variables such as the ones related to libraries and 
+include directories might not be set, and can result in CMake failures to configure if used.
+
+In case the ``Find${Package}.cmake`` you need is not distributed by the upstream CMake project, 
+you can create your own and add it to ``build-support/3rd-party``. This directory is included 
+to the ``CMAKE_MODULE_PATH`` variable, making it available for calls without needing to include
+the file with the absolute path to it. To add more directories to the ``CMAKE_MODULE_PATH``,
+use the following:
+
+.. sourcecode:: cmake
+
+  # Excerpt from build-support/macros-and-definitions.cmake
+
+  # Add ns-3 custom modules to the module path
+  list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/build-support/custom-modules")
+
+  # Add the 3rd-party modules to the module path
+  list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/build-support/3rd-party")
+
+  # Add your new modules directory to the module path 
+  # (${PROJECT_SOURCE_DIR} is /path/to/ns-3-dev/)
+  list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/build-support/new-modules")
+
+
+One of the custom Find files currently shipped by ns-3 is the ``FindGTK3.cmake`` file. 
+GTK3 requires Harfbuzz, which has its own ``FindHarfBuzz.cmake`` file. Both of them
+are in the ``build-support/3rd-party`` directory.
+
+.. sourcecode:: cmake
+
+  # You don't need to keep adding this, this is just a demonstration
+  list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/build-support/3rd-party")
+
+  # If the user-settable NS3_GTK3 is set, look for HarfBuzz and GTK
+  if(${NS3_GTK3})
+    # Use FindHarfBuzz.cmake to find HarfBuzz
+    find_package(HarfBuzz QUIET)
+
+    # If HarfBuzz is not found
+    if(NOT ${HarfBuzz_FOUND})
+      message(STATUS "Harfbuzz is required by GTK3 and was not found.")
+    else()
+      # FindGTK3.cmake does some weird tricks and results in warnings,
+      # that we can only suppress this way
+      set(CMAKE_SUPPRESS_DEVELOPER_WARNINGS 1 CACHE BOOL "")
+
+      # If HarfBuzz is found, search for GTK
+      find_package(GTK3 QUIET)
+
+      # Remove suppressions needed for quiet operations
+      unset(CMAKE_SUPPRESS_DEVELOPER_WARNINGS CACHE)
+
+      # If GTK3 is not found, inform the user
+      if(NOT ${GTK3_FOUND})
+        message(STATUS "GTK3 was not found. Continuing without it.")
+      else()
+        # If an incompatible version is found, set the GTK3_FOUND flag to false,
+        # to make sure it won't be used later
+        if(${GTK3_VERSION} VERSION_LESS 3.22)
+          set(GTK3_FOUND FALSE)
+          message(STATUS "GTK3 found with incompatible version ${GTK3_VERSION}")
+        else()
+          # A compatible GTK3 version was found
+          message(STATUS "GTK3 was found.")
+        endif()
+      endif()
+    endif()
+  endif()
+
+The Stats module can use the same ``find_package`` macro to search for SQLite3.
+
+Note: we currently use a custom macro to find Python3 and SQLite3 since  
+``FindPython3.cmake`` and ``FindSQLite3.cmake`` were included in CMake 3.12 and 3.14.
+More details on how to use the macro are listed in 
+`Linking third-party libraries without CMake or PkgConfig support`_.
+
+.. sourcecode:: cmake
+
+    # Set enable flag to false before checking
+    set(ENABLE_SQLITE False)
+
+    # In this case, SQLite presence is only checked if the user sets
+    # NS3_SQLITE to ON, but your case may be different
+    if(${NS3_SQLITE})
+      # FindSQLite3.cmake is used by CMake to find SQLite3
+      # QUIET flag silences most warnings from the module and let us write our own
+      find_package(SQLite3 QUIET) # FindSQLite3.cmake was included in CMake 3.14
+
+      # If SQLite3 was found, SQLite3_FOUND will be set to True, otherwise to False
+      if(${SQLite3_FOUND})
+        set(ENABLE_SQLITE True)
+      else()
+        message(STATUS "SQLite was not found")
+      endif()
+    endif()
+
+    # Here we declare empty lists, that only hold values if ENABLE_SQLITE is set to ON
+    set(sqlite_sources)
+    set(sqlite_header)
+    set(sqlite_libraries)
+    if(${ENABLE_SQLITE})
+      # If SQLite was found, add the optional source files to the lists
+      set(sqlite_sources
+          model/sqlite-data-output.cc
+      )
+      set(sqlite_headers
+          model/sqlite-data-output.h
+      )
+      # Include the include directories containing the sqlite3.h header
+      include_directories(${SQLite3_INCLUDE_DIRS})
+      # Copy the list of sqlite3 libraries 
+      set(sqlite_libraries
+          ${SQLite3_LIBRARIES}
+      )
+
+      # If the semaphore header is also found, 
+      # append additional optional source files to 
+      # the sqlite sources and headers lists
+      if(HAVE_SEMAPHORE_H)
+        list(
+          APPEND
+          sqlite_sources
+          model/sqlite-output.cc
+        )
+        list(
+          APPEND
+          sqlite_headers
+          model/sqlite-output.h
+        )
+      endif()
+    endif()
+
+    # Sources and headers file lists for stats are quite long,
+    # so we use these auxiliary lists 
+    # The optional sqlite_sources and sqlite_headers can be empty or not
+    set(source_files
+        ${sqlite_sources}
+        # ... 
+        model/uinteger-8-probe.cc
+    )
+
+    set(header_files
+        ${sqlite_headers}
+        # ... 
+        model/uinteger-8-probe.h
+    )
+
+    # Create the stats module consuming source files
+    build_lib(
+      LIBNAME stats
+      SOURCE_FILES ${source_files}
+      HEADER_FILES ${header_files}
+      LIBRARIES_TO_LINK ${libcore}
+                        # Here we either have an empty list or 
+                        # a list with the sqlite library
+                        ${sqlite_libraries} 
+      TEST_SOURCES
+        test/average-test-suite.cc
+        test/basic-data-calculators-test-suite.cc
+        test/double-probe-test-suite.cc
+        test/histogram-test-suite.cc
+    )
+
+
+
+Linking third-party libraries with PkgConfig support
+====================================================
+
+Assume we have a module with optional features that rely on a third-party library
+that uses PkgConfig. We can look for the PkgConfig module and add the optional
+source files similarly to the previous cases, as shown in the example below:
+
+.. sourcecode:: cmake
+
+    # Include CMake script to use pkg-config
+    include(FindPkgConfig)
+
+    # If pkg-config was found, search for library you want
+    if(PKG_CONFIG_FOUND)
+      pkg_check_modules(THIRD_PARTY libthird-party)
+    endif()
+
+    set(third_party_sources)
+    set(third_party_libs)
+    # Set cached variable if both pkg-config and libthird-party are found
+    if(PKG_CONFIG_FOUND AND THIRD_PARTY)
+      # Include third-party include directories for 
+      # consumption of the current module and its examples
+      include_directories(${THIRD_PARTY_INCLUDE_DIRS})
+
+      # Use exported CFLAGS required by the third-party library
+      add_compile_options(${THIRD_PARTY_CFLAGS})
+
+      # Copy the list of third-party libraries
+      set(third_party_libs ${THIRD_PARTY_LIBRARIES})
+
+      # Add optional source files that depend on the third-party library
+      set(third_party_sources model/optional-feature.cc)
+    endif()
+
+    # Create module using the optional source files and libraries
+    build_lib(
+      LIBNAME hypothetical
+      SOURCE_FILES model/hypothetical.cc 
+                   ${third_party_sources}
+      HEADER_FILES model/hypothetical.h
+      LIBRARIES_TO_LINK ${libcore}
+                        # Here we either have an empty list or 
+                        # a list with the third-party library
+                        ${third_party_libs} 
+      TEST_SOURCES
+        test/hypothetical.cc
+    )
+    
+    
+
+Inclusion of options
+++++++++++++++++++++
+
+There are two ways of managing module options: option switches or cached variables.
+Both are present in the main CMakeLists.txt in the ns-3-dev directory and the 
+build-support/macros-and-definitions.cmake file.
+
+
+.. sourcecode:: cmake
+
+    # Here are examples of ON and OFF switches
+    # option(
+    #        NS3_SWITCH # option switch prefixed with NS3\_
+    #        "followed by the description of what the option does" 
+    #        ON # and the default value for that option
+    #        )
+    option(NS3_EXAMPLES "Enable examples to be built" OFF)
+    option(NS3_TESTS "Enable tests to be built" OFF)
+
+    # Now here is how to let the user indicate a path
+    # set( # declares a value
+    #     NS3_PREFIXED_VALUE # stores the option value
+    #     "" # default value is empty in this case
+    #     CACHE # stores that NS3_PREFIXED_VALUE in the CMakeCache.txt file
+    #     STRING # type of the cached variable
+    #     "description of what this value is used for"
+    #     )
+    set(NS3_OUTPUT_DIRECTORY "" CACHE PATH "Directory to store built artifacts")
+
+    # The last case are options that can only assume predefined values
+    # First we cache the default option
+    set(NS3_INT64X64 "INT128" CACHE STRING "Int64x64 implementation")
+
+    # Then set a cache property for the variable indicating it can assume 
+    # specific values
+    set_property(CACHE NS3_INT64X64 PROPERTY STRINGS INT128 CAIRO DOUBLE)
+
+
+More details about these commands can be found in the following links:
+`option`_, `set`_, `set_property`_.
+
+.. _option: https://cmake.org/cmake/help/latest/command/option.html
+.. _set: https://cmake.org/cmake/help/latest/command/set.html
+.. _set_property: https://cmake.org/cmake/help/latest/command/set_property.html
+
+
+Changes in CMake macros and functions
++++++++++++++++++++++++++++++++++++++
+
+In order for CMake to feel more familiar to Waf users, a few macros and functions
+were created. 
+
+The most frequently used macros them can be found in 
+``build-support/macros-and-definitions.cmake``. This file includes build type checking,
+compiler family and version checking, enabling and disabling features based
+on user options, checking for dependencies of enabled features, 
+pre-compiling headers, filtering enabled/disabled modules and dependencies,
+and more.
+
+Module macros
+=============
+
+Module macros are located in ``build-support/custom-modules/ns3-module-macros.cmake``.
+This file contains macros defining a library (``build_lib``), the associated test library,
+examples (``build_lib_example``) and more. It also contains the macro that builds the 
+module header (``write_module_header``) that includes all headers from the module
+for user scripts.
+
+These macros are responsible for easing the porting of modules from Waf to CMake.
+
+Module macros: build_lib
+~~~~~~~~~~~~~~~~~~~~~~~~
+
+As ``build_lib`` is the most important of the macros, we detail what it does here,
+block by block.
+
+The first block declares the arguments received by the macro (in CMake, the
+only difference is that a function has its own scope). Notice that there are
+different types of arguments. Options that can only be set to true/false 
+(``IGNORE_PCH``). 
+
+One value arguments that receive a single value 
+(usually a string) and in this case used to receive the module name (``LIBNAME``).
+
+Multiple value arguments receive a list of values, which we use to parse lists
+of source (for the module itself and for the module tests) and 
+header files, plus libraries that should be linked and module features.
+
+The call to ``cmake_parse_arguments`` will parse ``${ARGN}`` into these values.
+The variables containing the parsing results will be prefixed with ``BLIB_`` 
+(e.g. ``LIBNAME`` -> ``BLIB_LIBNAME``).
+
+.. sourcecode:: cmake
+
+  function(build_lib)
+    # Argument parsing
+    set(options IGNORE_PCH)
+    set(oneValueArgs LIBNAME)
+    set(multiValueArgs SOURCE_FILES HEADER_FILES LIBRARIES_TO_LINK TEST_SOURCES
+                      DEPRECATED_HEADER_FILES MODULE_ENABLED_FEATURES
+    )
+    cmake_parse_arguments(
+      "BLIB" "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}
+    )
+    # ... 
+  endfunction()
+
+In the following block, we add modules in the src folder to a list
+and modules in the contrib folder to a different list.
+
+.. sourcecode:: cmake
+
+  function(build_lib)
+    # ... 
+    # Get path src/module or contrib/module
+    string(REPLACE "${PROJECT_SOURCE_DIR}/" "" FOLDER
+                  "${CMAKE_CURRENT_SOURCE_DIR}"
+    )
+
+    # Add library to a global list of libraries
+    if("${FOLDER}" MATCHES "src")
+      set(ns3-libs "${lib${BLIB_LIBNAME}};${ns3-libs}"
+          CACHE INTERNAL "list of processed upstream modules"
+      )
+    else()
+      set(ns3-contrib-libs "${lib${BLIB_LIBNAME}};${ns3-contrib-libs}"
+          CACHE INTERNAL "list of processed contrib modules"
+      )
+    endif()
+
+In the following block, we check if we are working with Xcode, which does
+not handle correctly CMake object libraries (.o files). 
+
+In other platforms,
+we build an object file ``add_library(${lib${BLIB_LIBNAME}-obj} OBJECT "${BLIB_SOURCE_FILES}...)``
+and a shared library ``add_library(${lib${BLIB_LIBNAME}} SHARED ...)``.
+
+The object library contains the actual source files (``${BLIB_SOURCE_FILES}``), 
+but is not linked, which mean we can reuse the object to build the static version of the libraries.
+Notice the shared library uses the object file as its source files 
+``$<TARGET_OBJECTS:${lib${BLIB_LIBNAME}-obj}``.
+
+Notice that we can also reuse precompiled headers created previously to speed up the 
+parsing phase of the compilation.
+
+
+.. sourcecode:: cmake
+    
+  function(build_lib)
+    # ... 
+    if(NOT ${XCODE})
+      # Create object library with sources and headers, that will be used in
+      # lib-ns3-static and the shared library
+      add_library(
+        ${lib${BLIB_LIBNAME}-obj} OBJECT "${BLIB_SOURCE_FILES}"
+                                        "${BLIB_HEADER_FILES}"
+      )
+
+      if(${PRECOMPILE_HEADERS_ENABLED} AND (NOT ${IGNORE_PCH}))
+        target_precompile_headers(${lib${BLIB_LIBNAME}-obj} REUSE_FROM stdlib_pch)
+      endif()
+
+      # Create shared library with previously created object library (saving
+      # compilation time for static libraries)
+      add_library(
+        ${lib${BLIB_LIBNAME}} SHARED $<TARGET_OBJECTS:${lib${BLIB_LIBNAME}-obj}>
+      )
+    else()
+      # Xcode and CMake don't play well when using object libraries, so we have a
+      # specific path for that
+      add_library(${lib${BLIB_LIBNAME}} SHARED "${BLIB_SOURCE_FILES}")
+
+      if(${PRECOMPILE_HEADERS_ENABLED} AND (NOT ${IGNORE_PCH}))
+        target_precompile_headers(${lib${BLIB_LIBNAME}} REUSE_FROM stdlib_pch)
+      endif()
+    endif()
+    # ... 
+  endfunction()
+
+In the next code block, we create an alias to ``libmodule``, ``ns3::libmodule``,
+which can later be used when importing ns-3 with CMake's ``find_package(ns3)``.
+
+Then, we associate configured headers (``config-store-config``, ``core-config.h`` and
+``version-defines.h``) to the core module.
+
+And finally associate all of the public headers of the module to that library, 
+to make sure CMake will be refreshed in case one of them changes.
+
+.. sourcecode:: cmake
+    
+  function(build_lib)
+    # ... 
+    add_library(ns3::${lib${BLIB_LIBNAME}} ALIAS ${lib${BLIB_LIBNAME}})
+
+    # Associate public headers with library for installation purposes
+    if("${BLIB_LIBNAME}" STREQUAL "core")
+      set(config_headers ${CMAKE_HEADER_OUTPUT_DIRECTORY}/config-store-config.h
+                        ${CMAKE_HEADER_OUTPUT_DIRECTORY}/core-config.h
+      )
+      if(${NS3_ENABLE_BUILD_VERSION})
+        list(APPEND config_headers
+            ${CMAKE_HEADER_OUTPUT_DIRECTORY}/version-defines.h
+        )
+      endif()
+    endif()
+    set_target_properties(
+      ${lib${BLIB_LIBNAME}}
+      PROPERTIES
+        PUBLIC_HEADER
+        "${BLIB_HEADER_FILES};${BLIB_DEPRECATED_HEADER_FILES};${config_headers};${CMAKE_HEADER_OUTPUT_DIRECTORY}/${BLIB_LIBNAME}-module.h"
+    )
+    # ... 
+  endfunction()
+
+In the next code block, we make the library a dependency to the ClangAnalyzer's time trace report,
+which measures which step of compilation took most time and which files were responsible for that.
+
+Then, the ns-3 libraries are separated from non-ns-3 libraries, that can be propagated or not
+for libraries/executables linked to the current ns-3 module being processed.
+
+The default is propagating these third-party libraries and their include directories, but this
+can be turned off by setting ``NS3_REEXPORT_THIRD_PARTY_LIBRARIES=OFF`` 
+
+.. sourcecode:: cmake
+    
+  function(build_lib)
+    # ... 
+    if(${NS3_CLANG_TIMETRACE})
+      add_dependencies(timeTraceReport ${lib${BLIB_LIBNAME}})
+    endif()
+
+    # Split ns and non-ns libraries to manage their propagation properly
+    set(non_ns_libraries_to_link)
+    set(ns_libraries_to_link)
+
+    foreach(library ${BLIB_LIBRARIES_TO_LINK})
+      remove_lib_prefix("${library}" module_name)
+
+      # Check if the module exists in the ns-3 modules list
+      # or if it is a 3rd-party library
+      if(${module_name} IN_LIST ns3-all-enabled-modules)
+        list(APPEND ns_libraries_to_link ${library})
+      else()
+        list(APPEND non_ns_libraries_to_link ${library})
+      endif()
+      unset(module_name)
+    endforeach()
+
+    if(NOT ${NS3_REEXPORT_THIRD_PARTY_LIBRARIES})
+      # ns-3 libraries are linked publicly, to make sure other modules can find
+      # each other without being directly linked
+      set(exported_libraries PUBLIC ${LIB_AS_NEEDED_PRE} ${ns_libraries_to_link}
+                            ${LIB_AS_NEEDED_POST}
+      )
+
+      # non-ns-3 libraries are linked privately, not propagating unnecessary
+      # libraries such as pthread, librt, etc
+      set(private_libraries PRIVATE ${LIB_AS_NEEDED_PRE}
+                            ${non_ns_libraries_to_link} ${LIB_AS_NEEDED_POST}
+      )
+
+      # we don't re-export included libraries from 3rd-party modules
+      set(exported_include_directories)
+    else()
+      # we export everything by default when NS3_REEXPORT_THIRD_PARTY_LIBRARIES=ON
+      set(exported_libraries PUBLIC ${LIB_AS_NEEDED_PRE} ${ns_libraries_to_link}
+                            ${non_ns_libraries_to_link} ${LIB_AS_NEEDED_POST}
+      )
+      set(private_libraries)
+
+      # with NS3_REEXPORT_THIRD_PARTY_LIBRARIES, we export all 3rd-party library
+      # include directories, allowing consumers of this module to include and link
+      # the 3rd-party code with no additional setup
+      get_target_includes(${lib${BLIB_LIBNAME}} exported_include_directories)
+      string(REPLACE "-I" "" exported_include_directories
+                    "${exported_include_directories}"
+      )
+      string(REPLACE "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/include" ""
+                    exported_include_directories
+                    "${exported_include_directories}"
+      )
+    endif()
+    # ... 
+  endfunction()
+
+After the lists of libraries to link that should be exported (``PUBLIC``) and 
+not exported (``PRIVATE``) are built, we can link them with ``target_link_libraries``.
+
+Next, we set the output name of the module library to n3version-modulename(optional build suffix).
+
+.. sourcecode:: cmake
+    
+  function(build_lib)
+    # ... 
+    target_link_libraries(
+      ${lib${BLIB_LIBNAME}} ${exported_libraries} ${private_libraries}
+    )
+
+    # set output name of library
+    set_target_properties(
+      ${lib${BLIB_LIBNAME}}
+      PROPERTIES OUTPUT_NAME ns${NS3_VER}-${BLIB_LIBNAME}${build_profile_suffix}
+    )
+    # ... 
+  endfunction()
+
+Next we export include directories, to let library consumers importing ns-3 via CMake
+use them just by linking to one of the ns-3 modules.
+
+.. sourcecode:: cmake
+    
+  function(build_lib)
+    # ... 
+    # export include directories used by this library so that it can be used by
+    # 3rd-party consumers of ns-3 using find_package(ns3) this will automatically
+    # add the build/include path to them, so that they can ns-3 headers with
+    # <ns3/something.h>
+    target_include_directories(
+      ${lib${BLIB_LIBNAME}}
+      PUBLIC $<BUILD_INTERFACE:${CMAKE_OUTPUT_DIRECTORY}/include>
+            $<INSTALL_INTERFACE:include>
+      INTERFACE ${exported_include_directories}
+    )
+    # ... 
+  endfunction()
+
+We append the list of third-party/external libraries for each processed module,
+and append a list of object libraries that can be later used for the static ns-3 build.
+
+.. sourcecode:: cmake
+    
+  function(build_lib)
+    # ...   
+    set(ns3-external-libs "${non_ns_libraries_to_link};${ns3-external-libs}"
+        CACHE INTERNAL
+              "list of non-ns libraries to link to NS3_STATIC and NS3_MONOLIB"
+    )
+    if(${NS3_STATIC} OR ${NS3_MONOLIB})
+      set(lib-ns3-static-objs
+          "$<TARGET_OBJECTS:${lib${BLIB_LIBNAME}-obj}>;${lib-ns3-static-objs}"
+          CACHE
+            INTERNAL
+            "list of object files from module used by NS3_STATIC and NS3_MONOLIB"
+      )
+    endif()
+    # ... 
+  endfunction()
+
+The following block creates the ``${BLIB_LIBNAME}-module.h`` header for user scripts, 
+and copies header files from src/module and contrib/module to the include/ns3 directory.
+
+.. sourcecode:: cmake
+    
+  function(build_lib)
+    # ... 
+    # Write a module header that includes all headers from that module
+    write_module_header("${BLIB_LIBNAME}" "${BLIB_HEADER_FILES}")
+
+    # Copy all header files to outputfolder/include before each build
+    copy_headers_before_building_lib(
+      ${BLIB_LIBNAME} ${CMAKE_HEADER_OUTPUT_DIRECTORY} "${BLIB_HEADER_FILES}"
+      public
+    )
+    if(BLIB_DEPRECATED_HEADER_FILES)
+      copy_headers_before_building_lib(
+        ${BLIB_LIBNAME} ${CMAKE_HEADER_OUTPUT_DIRECTORY}
+        "${BLIB_DEPRECATED_HEADER_FILES}" deprecated
+      )
+    endif()
+    # ... 
+  endfunction()
+
+The following block creates the test library for the module currently being processed.
+
+.. sourcecode:: cmake
+    
+  function(build_lib)
+    # ... 
+    # Build tests if requested
+    if(${ENABLE_TESTS})
+      list(LENGTH BLIB_TEST_SOURCES test_source_len)
+      if(${test_source_len} GREATER 0)
+        # Create BLIB_LIBNAME of output library test of module
+        set(test${BLIB_LIBNAME} lib${BLIB_LIBNAME}-test CACHE INTERNAL "")
+        set(ns3-libs-tests "${test${BLIB_LIBNAME}};${ns3-libs-tests}"
+            CACHE INTERNAL "list of test libraries"
+        )
+
+        # Create shared library containing tests of the module
+        add_library(${test${BLIB_LIBNAME}} SHARED "${BLIB_TEST_SOURCES}")
+
+        # Link test library to the module library
+        if(${NS3_MONOLIB})
+          target_link_libraries(
+            ${test${BLIB_LIBNAME}} ${LIB_AS_NEEDED_PRE} ${lib-ns3-monolib}
+            ${LIB_AS_NEEDED_POST}
+          )
+        else()
+          target_link_libraries(
+            ${test${BLIB_LIBNAME}} ${LIB_AS_NEEDED_PRE} ${lib${BLIB_LIBNAME}}
+            "${BLIB_LIBRARIES_TO_LINK}" ${LIB_AS_NEEDED_POST}
+          )
+        endif()
+        set_target_properties(
+          ${test${BLIB_LIBNAME}}
+          PROPERTIES OUTPUT_NAME
+                    ns${NS3_VER}-${BLIB_LIBNAME}-test${build_profile_suffix}
+        )
+
+        target_compile_definitions(
+          ${test${BLIB_LIBNAME}} PRIVATE NS_TEST_SOURCEDIR="${FOLDER}/test"
+        )
+        if(${PRECOMPILE_HEADERS_ENABLED} AND (NOT ${IGNORE_PCH}))
+          target_precompile_headers(${test${BLIB_LIBNAME}} REUSE_FROM stdlib_pch)
+        endif()
+      endif()
+    endif()
+    # ... 
+  endfunction()
+
+The following block checks for examples subdirectories and add them to parse their 
+CMakeLists.txt file, creating the examples. It also scans for python examples. 
+
+.. sourcecode:: cmake
+
+  function(build_lib)
+    # ... 
+    # Build lib examples if requested
+    if(${ENABLE_EXAMPLES})
+      foreach(example_folder example;examples)
+        if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${example_folder})
+          if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${example_folder}/CMakeLists.txt)
+            add_subdirectory(${example_folder})
+          endif()
+          scan_python_examples(${CMAKE_CURRENT_SOURCE_DIR}/${example_folder})
+        endif()
+      endforeach()
+    endif()
+    # ... 
+  endfunction()
+
+The following block creates the ``lib${BLIB_LIBNAME}-apiscan`` CMake target.
+When the target is built, it runs modulescan-modular to extract the python 
+bindings for the module using pybindgen. 
+
+.. sourcecode:: cmake
+    
+  function(build_lib)
+    # ... 
+    # Get architecture pair for python bindings
+    if((${CMAKE_SIZEOF_VOID_P} EQUAL 8) AND (NOT APPLE))
+      set(arch gcc_LP64)
+      set(arch_flags -m64)
+    else()
+      set(arch gcc_ILP32)
+      set(arch_flags)
+    endif()
+
+    # Add target to scan python bindings
+    if(${ENABLE_SCAN_PYTHON_BINDINGS}
+      AND EXISTS ${CMAKE_HEADER_OUTPUT_DIRECTORY}/${BLIB_LIBNAME}-module.h
+    )
+      set(bindings_output_folder ${PROJECT_SOURCE_DIR}/${FOLDER}/bindings)
+      file(MAKE_DIRECTORY ${bindings_output_folder})
+      set(module_api_ILP32 ${bindings_output_folder}/modulegen__gcc_ILP32.py)
+      set(module_api_LP64 ${bindings_output_folder}/modulegen__gcc_LP64.py)
+
+      set(modulescan_modular_command
+          ${Python_EXECUTABLE}
+          ${PROJECT_SOURCE_DIR}/bindings/python/ns3modulescan-modular.py
+      )
+
+      set(header_map "")
+      # We need a python map that takes header.h to module e.g. "ptr.h": "core"
+      foreach(header ${BLIB_HEADER_FILES})
+        # header is a relative path to the current working directory
+        get_filename_component(
+          header_name ${CMAKE_CURRENT_SOURCE_DIR}/${header} NAME
+        )
+        string(APPEND header_map "\"${header_name}\":\"${BLIB_LIBNAME}\",")
+      endforeach()
+
+      set(ns3-headers-to-module-map "${ns3-headers-to-module-map}${header_map}"
+          CACHE INTERNAL "Map connecting headers to their modules"
+      )
+
+      # API scan needs the include directories to find a few headers (e.g. mpi.h)
+      get_target_includes(${lib${BLIB_LIBNAME}} modulegen_include_dirs)
+
+      set(module_to_generate_api ${module_api_ILP32})
+      set(LP64toILP32)
+      if("${arch}" STREQUAL "gcc_LP64")
+        set(module_to_generate_api ${module_api_LP64})
+        set(LP64toILP32
+            ${Python_EXECUTABLE}
+            ${PROJECT_SOURCE_DIR}/build-support/pybindings_LP64_to_ILP32.py
+            ${module_api_LP64} ${module_api_ILP32}
+        )
+      endif()
+
+      add_custom_target(
+        ${lib${BLIB_LIBNAME}}-apiscan
+        COMMAND
+          ${modulescan_modular_command} ${CMAKE_OUTPUT_DIRECTORY} ${BLIB_LIBNAME}
+          ${PROJECT_BINARY_DIR}/header_map.json ${module_to_generate_api}
+          \"${arch_flags} ${modulegen_include_dirs}\"
+        COMMAND ${LP64toILP32}
+        WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+        DEPENDS ${lib${BLIB_LIBNAME}}
+      )
+      add_dependencies(apiscan-all ${lib${BLIB_LIBNAME}}-apiscan)
+    endif()
+    
+    # ... 
+  endfunction()
+
+The targets can be built to execute the scanning using one of the following commands:
+
+.. sourcecode:: console
+
+  ~/cmake-cache$ cmake --build . --target libcore-apiscan
+  ~/ns-3-dev/$ ./ns3 build core-apiscan
+  
+To re-scan all bindings, use ``./ns3 build apiscan-all``. 
+
+The next block runs the ``modulegen-modular`` and consumes the results of the previous step.
+However, this step runs at configuration time, while the previous runs at build time.
+This means the output directory needs to be cleared after running ``apiscan``, to regenerate 
+up-to-date bindings source files.
+
+.. sourcecode:: cmake
+    
+  function(build_lib)
+    # ... 
+    # Build pybindings if requested and if bindings subfolder exists in
+    # NS3/src/BLIB_LIBNAME
+    if(${ENABLE_PYTHON_BINDINGS} AND EXISTS
+                                    "${CMAKE_CURRENT_SOURCE_DIR}/bindings"
+    )
+      set(bindings_output_folder ${CMAKE_OUTPUT_DIRECTORY}/${FOLDER}/bindings)
+      file(MAKE_DIRECTORY ${bindings_output_folder})
+      set(module_src ${bindings_output_folder}/ns3module.cc)
+      set(module_hdr ${bindings_output_folder}/ns3module.h)
+
+      string(REPLACE "-" "_" BLIB_LIBNAME_sub ${BLIB_LIBNAME}) # '-' causes
+                                                              # problems (e.g.
+      # csma-layout), replace with '_' (e.g. csma_layout)
+
+      # Set prefix of binding to _ if a ${BLIB_LIBNAME}.py exists, and copy the
+      # ${BLIB_LIBNAME}.py to the output folder
+      set(prefix)
+      if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/bindings/${BLIB_LIBNAME}.py)
+        set(prefix _)
+        file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/bindings/${BLIB_LIBNAME}.py
+            DESTINATION ${CMAKE_OUTPUT_DIRECTORY}/bindings/python/ns
+        )
+      endif()
+
+      # Run modulegen-modular to generate the bindings sources
+      if((NOT EXISTS ${module_hdr}) OR (NOT EXISTS ${module_src})) # OR TRUE) # to
+                                                                  # force
+                                                                  # reprocessing
+        string(REPLACE ";" "," ENABLED_FEATURES
+                      "${ns3-libs};${BLIB_MODULE_ENABLED_FEATURES}"
+        )
+        set(modulegen_modular_command
+            GCC_RTTI_ABI_COMPLETE=True NS3_ENABLED_FEATURES="${ENABLED_FEATURES}"
+            ${Python_EXECUTABLE}
+            ${PROJECT_SOURCE_DIR}/bindings/python/ns3modulegen-modular.py
+        )
+        execute_process(
+          COMMAND
+            ${CMAKE_COMMAND} -E env
+            PYTHONPATH=${CMAKE_OUTPUT_DIRECTORY}:$ENV{PYTHONPATH}
+            ${modulegen_modular_command} ${CMAKE_CURRENT_SOURCE_DIR} ${arch}
+            ${prefix}${BLIB_LIBNAME_sub} ${module_src}
+          TIMEOUT 60
+          WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+          OUTPUT_FILE ${module_hdr}
+          ERROR_FILE ${bindings_output_folder}/ns3modulegen.log
+          RESULT_VARIABLE error_code
+        )
+        if(${error_code} OR NOT (EXISTS ${module_hdr}))
+          message(
+            FATAL_ERROR
+              "Something went wrong during processing of the python bindings of module ${BLIB_LIBNAME}."
+              " Make sure you have the latest version of Pybindgen."
+          )
+          if(EXISTS ${module_src})
+            file(REMOVE ${module_src})
+          endif()
+        endif()
+      endif()
+
+      # Add core module helper sources
+      set(python_module_files ${module_hdr} ${module_src})
+      if(${BLIB_LIBNAME} STREQUAL "core")
+        list(APPEND python_module_files
+            ${CMAKE_CURRENT_SOURCE_DIR}/bindings/module_helpers.cc
+            ${CMAKE_CURRENT_SOURCE_DIR}/bindings/scan-header.h
+        )
+      endif()
+      set(bindings-name lib${BLIB_LIBNAME}-bindings)
+      add_library(${bindings-name} SHARED "${python_module_files}")
+      target_include_directories(
+        ${bindings-name} PUBLIC ${Python_INCLUDE_DIRS} ${bindings_output_folder}
+      )
+      target_compile_options(${bindings-name} PRIVATE -Wno-error)
+
+      # If there is any, remove the "lib" prefix of libraries (search for
+      # "set(lib${BLIB_LIBNAME}")
+      list(LENGTH ns_libraries_to_link num_libraries)
+      if(num_libraries GREATER "0")
+        string(REPLACE ";" "-bindings;" bindings_to_link
+                      "${ns_libraries_to_link};"
+        ) # add -bindings suffix to all lib${name}
+      endif()
+      target_link_libraries(
+        ${bindings-name}
+        PUBLIC ${LIB_AS_NEEDED_PRE} ${lib${BLIB_LIBNAME}} "${bindings_to_link}"
+              "${BLIB_LIBRARIES_TO_LINK}" ${LIB_AS_NEEDED_POST}
+        PRIVATE ${Python_LIBRARIES}
+      )
+      target_include_directories(
+        ${bindings-name} PRIVATE ${PROJECT_SOURCE_DIR}/src/core/bindings
+      )
+
+      set(suffix)
+      if(APPLE)
+        # Python doesn't like Apple's .dylib and will refuse to load bindings
+        # unless its an .so
+        set(suffix SUFFIX .so)
+      endif()
+
+      # Set binding library name and output folder
+      set_target_properties(
+        ${bindings-name}
+        PROPERTIES OUTPUT_NAME ${prefix}${BLIB_LIBNAME_sub}
+                  PREFIX ""
+                  ${suffix} LIBRARY_OUTPUT_DIRECTORY
+                  ${CMAKE_OUTPUT_DIRECTORY}/bindings/python/ns
+      )
+
+      set(ns3-python-bindings-modules
+          "${bindings-name};${ns3-python-bindings-modules}"
+          CACHE INTERNAL "list of modules python bindings"
+      )
+      
+      # Make sure all bindings are built before building the visualizer module
+      # that makes use of them
+      if(${ENABLE_VISUALIZER} AND (visualizer IN_LIST libs_to_build))
+        if(NOT (${BLIB_LIBNAME} STREQUAL visualizer))
+          add_dependencies(${libvisualizer} ${bindings-name})
+        endif()
+      endif()
+    endif()
+    # ... 
+  endfunction()
+
+The recommended steps to scan the bindings and then use them is the following:
+
+.. sourcecode:: console
+
+  ~/ns-3-dev$ ./ns3 clean
+  ~/ns-3-dev$ ./ns3 configure -- -DNS3_SCAN_PYTHON_BINDINGS=ON
+  ~/ns-3-dev$ ./ns3 build apiscan-all
+  ~/ns-3-dev$ ./ns3 configure --enable-python-bindings
+  ~/ns-3-dev$ ./ns3 build
+
+
+In the next code block we add the library to the ns3ExportTargets, later used for installation.
+We also print an additional message the folder just finished being processed if NS3_VERBOSE is set to ON.
+
+.. sourcecode:: cmake
+    
+  function(build_lib)
+    # ...   
+    # Handle package export
+    install(
+      TARGETS ${lib${BLIB_LIBNAME}}
+      EXPORT ns3ExportTargets
+      ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}/
+      LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}/
+      PUBLIC_HEADER DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/ns3"
+    )
+    if(${NS3_VERBOSE})
+      message(STATUS "Processed ${FOLDER}")
+    endif()
+  endfunction()
+
+Module macros: build_lib_example
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The second most important macro from a module author perspective is the ``build_lib_example``, which
+builds the examples for their module. As with ``build_lib`` we explain what it does block-by-block.
+
+In the first block, arguments are parsed and we check wether the current module is in the contrib 
+or the src folder.
+
+.. sourcecode:: cmake
+
+  function(build_lib_example)
+    # Argument parsing
+    set(options IGNORE_PCH)
+    set(oneValueArgs NAME)
+    set(multiValueArgs SOURCE_FILES HEADER_FILES LIBRARIES_TO_LINK)
+    cmake_parse_arguments("BLIB_EXAMPLE" "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
+
+    # Get path src/module or contrib/module
+    string(REPLACE "${PROJECT_SOURCE_DIR}/" "" FOLDER "${CMAKE_CURRENT_SOURCE_DIR}")
+    get_filename_component(FOLDER ${FOLDER} DIRECTORY)
+    # ... 
+  endfunction()
+
+Then we check if the ns-3 modules required by the example are enabled to be built. 
+If the list ``missing_dependencies`` is empty, we create the example. Otherwise, we skip it.
+The example can be linked to the current module (``${lib${BLIB_EXAMPLE_LIBNAME}}``) and 
+other libraries to link (``${BLIB_EXAMPLE_LIBRARIES_TO_LINK}``) and optionally to the visualizer
+module (``${optional_visualizer_lib}``). 
+If the visualizer module is not enabled, ``optional_visualizer_lib`` is empty.
+
+The example can also be linked to a single ns-3 shared library (``lib-ns3-monolib``) or 
+a single ns-3 static library (``lib-ns3-static``), if either ``NS3_MONOLIB=ON`` or ``NS3_STATIC=ON``.
+
+.. sourcecode:: cmake
+
+  function(build_lib_example)
+    # ...
+    check_for_missing_libraries(missing_dependencies "${BLIB_EXAMPLE_LIBRARIES_TO_LINK}")
+    if(NOT missing_dependencies)
+      # Create shared library with sources and headers
+      add_executable(
+        "${BLIB_EXAMPLE_NAME}" ${BLIB_EXAMPLE_SOURCE_FILES}
+                              ${BLIB_EXAMPLE_HEADER_FILES}
+      )
+
+      if(${NS3_STATIC})
+        target_link_libraries(
+          ${BLIB_EXAMPLE_NAME} ${LIB_AS_NEEDED_PRE_STATIC} ${lib-ns3-static}
+        )
+      elseif(${NS3_MONOLIB})
+        target_link_libraries(
+          ${BLIB_EXAMPLE_NAME} ${LIB_AS_NEEDED_PRE} ${lib-ns3-monolib}
+          ${LIB_AS_NEEDED_POST}
+        )
+      else()
+        target_link_libraries(
+          ${BLIB_EXAMPLE_NAME} ${LIB_AS_NEEDED_PRE} ${lib${BLIB_EXAMPLE_LIBNAME}}
+          ${BLIB_EXAMPLE_LIBRARIES_TO_LINK} ${optional_visualizer_lib}
+          ${LIB_AS_NEEDED_POST}
+        )
+      endif()
+      # ... 
+    endif()
+  endfunction()
+
+As with the module libraries, we can also reuse precompiled headers here to speed up 
+the parsing step of compilation.
+
+Finally, we call another macro ``set_runtime_outputdirectory``, which indicates the 
+resulting folder where the example will end up after built (e.g. build/src/module/examples)
+and adds the proper ns-3 version prefix and build type suffix to the executable.
+
+.. sourcecode:: cmake
+
+  function(build_lib_example)
+    # ... 
+    if(NOT missing_dependencies)
+      # ...   
+      if(${PRECOMPILE_HEADERS_ENABLED} AND (NOT ${BLIB_EXAMPLE_IGNORE_PCH}))
+        target_precompile_headers(${BLIB_EXAMPLE_NAME} REUSE_FROM stdlib_pch_exec)
+      endif()
+
+      set_runtime_outputdirectory(
+        ${BLIB_EXAMPLE_NAME}
+        ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${FOLDER}/examples/ ""
+      )
+    endif()
+  endfunction()
+
+User options and header checking
+================================
+
+User-settable options should be prefixed with ``NS3_``, otherwise
+they will not be preserved by ``./ns3 configure --force-refresh``.
+
+After checking if the pre-requisites of the user-settable options
+are met, set the same option now prefixed with ``ENABLE_``. The
+following example demonstrates this pattern:
+
+.. sourcecode:: cmake
+
+  # Option() means the variable NS3_GSL will be set to ON/OFF
+  # The second argument is a comment explaining what this option does
+  # The last argument is the default value for the user-settable option
+  option(NS3_GSL "Enable GSL related features" OFF)
+
+  # Set the ENABLE\_ counterpart to FALSE by default
+  set(ENABLE_GSL FALSE)
+  if(${NS3_GSL})
+    # If the user enabled GSL, check if GSL is available
+    find_package(GSL)
+    if(${GSL_FOUND})
+      set(ENABLE_GSL TRUE)
+      message(STATUS "GSL was requested by the user and was found")
+    else()
+      message(STATUS "GSL was not found and GSL features will continue disabled")
+    endif()
+  else()
+    message(STATUS "GSL features were not requested by the user")
+  endif()
+
+  # Now the module can check for ENABLE_GSL before being processed 
+  if(NOT ${ENABLE_GSL})
+    return()
+  endif()
+
+  # Or to enable optional features
+  set(gsl_sources)
+  if(${ENABLE_GSL})
+    set(gsl_sources model/gsl_features.cc)
+  endif()
+
+Here are examples of how to do the options and header checking, 
+followed by a header configuration:
+
+.. sourcecode:: cmake
+
+  # We always set the ENABLE\_ counterpart of NS3\_ option to FALSE before checking
+  #
+  # If this variable is created inside your module, use
+  # set(ENABLE_MPI FALSE CACHE INTERNAL "") 
+  # instead, to make it globally available
+  set(ENABLE_MPI FALSE)
+
+  # If the user option switch is set to ON, we check
+  if(${NS3_MPI})
+    # Use find_package to look for MPI
+    find_package(MPI QUIET)
+
+    # If the package is optional, which is the case for MPI,
+    # we can proceed if it is not found
+    if(NOT ${MPI_FOUND})
+      message(STATUS "MPI was not found. Continuing without it.")
+    else()
+      # If it is false, we add necessary C++ definitions (e.g. NS3_MPI)
+      message(STATUS "MPI was found.")
+      add_definitions(-DNS3_MPI)
+
+      # Then set ENABLE_MPI to TRUE, which can be used to check 
+      # if NS3_MPI is enabled AND MPI was found
+      #
+      # If this variable is created inside your module, use
+      # set(ENABLE_MPI TRUE CACHE INTERNAL "") 
+      # instead, to make it globally available
+      set(ENABLE_MPI TRUE)
+    endif()
+  endif()
+
+  # ... 
+
+  # These two standard CMake modules allow for header and function checking
+  include(CheckIncludeFileCXX)
+  include(CheckFunctionExists)
+
+  # Check for required headers and functions, 
+  # set flags on the right argument if header in the first argument is found
+  # if they are not found, a warning is emitted
+  check_include_file_cxx("stdint.h" "HAVE_STDINT_H")
+  check_include_file_cxx("inttypes.h" "HAVE_INTTYPES_H")
+  check_include_file_cxx("sys/types.h" "HAVE_SYS_TYPES_H")
+  check_include_file_cxx("stat.h" "HAVE_SYS_STAT_H")
+  check_include_file_cxx("dirent.h" "HAVE_DIRENT_H")
+  check_include_file_cxx("stdlib.h" "HAVE_STDLIB_H")
+  check_include_file_cxx("signal.h" "HAVE_SIGNAL_H")
+  check_include_file_cxx("netpacket/packet.h" "HAVE_PACKETH")
+  check_function_exists("getenv" "HAVE_GETENV")
+
+  # This is the CMake command to open up a file template (in this case a header
+  # passed as the first argument), then fill its fields with values stored in 
+  # CMake variables and save the resulting file to the target destination 
+  # (in the second argument)
+  configure_file(
+    build-support/core-config-template.h
+    ${CMAKE_HEADER_OUTPUT_DIRECTORY}/core-config.h
+  )
+
+The configure_file command is not very clear by itself, as you do not know which
+values are being used. So we need to check the template.
+
+.. sourcecode:: cpp
+
+    #ifndef NS3_CORE_CONFIG_H
+    #define NS3_CORE_CONFIG_H
+
+    // Defined if HAVE_UINT128_T is defined in CMake
+    #cmakedefine   HAVE_UINT128_T 
+    // Set to 1 if HAVE__UINT128_T is defined in CMake, 0 otherwise
+    #cmakedefine01 HAVE___UINT128_T 
+    #cmakedefine   INT64X64_USE_128
+    #cmakedefine   INT64X64_USE_DOUBLE
+    #cmakedefine   INT64X64_USE_CAIRO
+    #cmakedefine01 HAVE_STDINT_H
+    #cmakedefine01 HAVE_INTTYPES_H
+    #cmakedefine   HAVE_SYS_INT_TYPES_H
+    #cmakedefine01 HAVE_SYS_TYPES_H
+    #cmakedefine01 HAVE_SYS_STAT_H
+    #cmakedefine01 HAVE_DIRENT_H
+    #cmakedefine01 HAVE_STDLIB_H
+    #cmakedefine01 HAVE_GETENV
+    #cmakedefine01 HAVE_SIGNAL_H
+    #cmakedefine   HAVE_PTHREAD_H
+    #cmakedefine   HAVE_RT
+
+    /*
+    * #cmakedefine turns into:
+    * //#define HAVE_FLAG // if HAVE_FLAG is not defined in CMake (e.g. unset(HAVE_FLAG))
+    * #define HAVE_FLAG // if HAVE_FLAG is defined in CMake (e.g. set(HAVE_FLAG))
+    *
+    * #cmakedefine01 turns into:
+    * #define HAVE_FLAG 0 // if HAVE_FLAG is not defined in CMake
+    * #define HAVE_FLAG 1 // if HAVE_FLAG is defined in CMake
+    */
+
+    #endif //NS3_CORE_CONFIG_H
+
+Custom targets
+==============
+
+Another common thing to do is implement custom targets that run specific commands and
+manage dependencies. Here is an example for Doxygen:
+
+.. sourcecode:: cmake
+
+  # This command hides DOXYGEN from some CMake cache interfaces
+  mark_as_advanced(DOXYGEN)
+
+  # This custom macro checks for dependencies CMake find_package and program 
+  # dependencies and return the missing dependencies in the third argument
+  check_deps("" "doxygen;dot;dia" doxygen_docs_missing_deps)
+
+  # If the variable contains missing dependencies, we stop processing doxygen targets
+  if(doxygen_docs_missing_deps)
+    message(
+      STATUS
+        "docs: doxygen documentation not enabled due to missing dependencies: ${doxygen_docs_missing_deps}"
+    )
+  else()
+    # We checked this already exists, but we need the path to the executable
+    find_package(Doxygen QUIET)
+
+    # Get introspected doxygen
+    add_custom_target(
+      run-print-introspected-doxygen
+      COMMAND
+        ${CMAKE_OUTPUT_DIRECTORY}/utils/ns${NS3_VER}-print-introspected-doxygen${build_profile_suffix}
+        > ${PROJECT_SOURCE_DIR}/doc/introspected-doxygen.h
+      COMMAND
+        ${CMAKE_OUTPUT_DIRECTORY}/utils/ns${NS3_VER}-print-introspected-doxygen${build_profile_suffix}
+        --output-text > ${PROJECT_SOURCE_DIR}/doc/ns3-object.txt
+      DEPENDS print-introspected-doxygen
+    )
+
+    # Run test.py with NS_COMMANDLINE_INTROSPECTION=.. to print examples 
+    # introspected commandline
+    add_custom_target(
+      run-introspected-command-line
+      COMMAND ${CMAKE_COMMAND} -E env NS_COMMANDLINE_INTROSPECTION=..
+              ${Python_EXECUTABLE} ./test.py --no-build --constrain=example
+      WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
+      DEPENDS all-test-targets # all-test-targets only exists if ENABLE_TESTS is
+                               # set to ON
+    )
+
+    # This file header is written during configuration
+    file(
+      WRITE ${PROJECT_SOURCE_DIR}/doc/introspected-command-line.h
+      "/* This file is automatically generated by
+  CommandLine::PrintDoxygenUsage() from the CommandLine configuration
+  in various example programs.  Do not edit this file!  Edit the
+  CommandLine configuration in those files instead.
+  */
+  \n"
+    )
+    # After running test.py for the introspected commandline above,
+    # merge outputs and concatenate to the header file created during
+    # configuration
+    add_custom_target(
+      assemble-introspected-command-line
+      # works on CMake 3.18 or newer > COMMAND ${CMAKE_COMMAND} -E cat
+      # ${PROJECT_SOURCE_DIR}/testpy-output/*.command-line >
+      # ${PROJECT_SOURCE_DIR}/doc/introspected-command-line.h
+      COMMAND ${cat_command} ${PROJECT_SOURCE_DIR}/testpy-output/*.command-line
+              > ${PROJECT_SOURCE_DIR}/doc/introspected-command-line.h 2> NULL
+      DEPENDS run-introspected-command-line
+    )
+
+    # Create a target that updates the doxygen version
+    add_custom_target(
+      update_doxygen_version
+      COMMAND ${PROJECT_SOURCE_DIR}/doc/ns3_html_theme/get_version.sh
+      WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
+    )
+
+    # Create a doxygen target that builds the documentation and only runs
+    # after the version target above was executed, the introspected doxygen 
+    # and command line were extracted
+    add_custom_target(
+      doxygen
+      COMMAND ${DOXYGEN_EXECUTABLE} ${PROJECT_SOURCE_DIR}/doc/doxygen.conf
+      WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
+      DEPENDS update_doxygen_version run-print-introspected-doxygen
+              assemble-introspected-command-line
+    )
+
+    # Create a doxygen target that only needs to run the version target
+    # which doesn't trigger compilation of examples neither the execution of test.py
+    # nor print-introspected-doxygen
+    add_custom_target(
+      doxygen-no-build
+      COMMAND ${DOXYGEN_EXECUTABLE} ${PROJECT_SOURCE_DIR}/doc/doxygen.conf
+      WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
+      DEPENDS update_doxygen_version
+    )
+  endif()
+
+
+Project-wide compiler and linker flags
+======================================
+
+Different compilers and links accept different flags, which must be 
+known during configuration time. Some of these flags are
+handled directly by CMake:
+
+.. sourcecode:: cmake
+
+  # equivalent to -fPIC for libraries and -fPIE for executables
+  set(CMAKE_POSITION_INDEPENDENT_CODE ON)
+
+  # link-time optimization flags such as -flto and -flto=thin
+  set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)
+
+  # C++ standard flag to use
+  set(CMAKE_CXX_STANDARD_MINIMUM 17)
+  set(CMAKE_CXX_STANDARD_REQUIRED ON)
+
+  add_library(static_lib STATIC) # equivalent to -static flag
+  add_library(shared_lib SHARED) # equivalent to -shared flags
+
+Other flags need to be handled manually and change based on 
+the compiler used. The most commonly used are handled in 
+``build-support/macros-and-definitions.cmake``.
+
+.. sourcecode:: cmake
+
+  set(LIB_AS_NEEDED_PRE)
+  set(LIB_AS_NEEDED_POST)
+  if(${GCC} AND NOT APPLE)
+    # using GCC
+    set(LIB_AS_NEEDED_PRE -Wl,--no-as-needed)
+    set(LIB_AS_NEEDED_POST -Wl,--as-needed)
+    set(LIB_AS_NEEDED_PRE_STATIC -Wl,--whole-archive,-Bstatic)
+    set(LIB_AS_NEEDED_POST_STATIC -Wl,--no-whole-archive)
+    set(LIB_AS_NEEDED_POST_STATIC_DYN -Wl,-Bdynamic,--no-whole-archive)
+  endif()
+
+The ``LIB_AS_NEEDED`` values are used to force linking of all symbols,
+and not only those explicitly used by the applications, which is necessary
+since simulation scripts don't directly use most of the symbols exported
+by the modules. Their use can be seen in the ``utils/CMakeLists.txt``:
+
+.. sourcecode:: cmake
+
+  target_link_libraries(
+      test-runner ${LIB_AS_NEEDED_PRE} ${ns3-libs-tests} ${LIB_AS_NEEDED_POST}
+      ${ns3-libs} ${ns3-contrib-libs}
+    )
+
+This will ensure test-runner linking to ``ns3-libs-tests`` (list containing all
+module test libraries) with all symbols, which will make it able to find and run
+all tests. The other two lists ``ns3-libs`` (src modules) and ``ns3-contrib-libs``
+(contrib modules) don't need to be completely linked since the tests libraries are
+already linked to them.
+
+Other project-wide compiler-dependent flags can be set during compiler checking.
+
+.. sourcecode:: cmake
+
+  # Check if the compiler is GCC
+  set(GCC FALSE)
+  if("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU")
+    # Check if GCC is a supported version
+    if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS ${GNU_MinVersion})
+      message(
+        FATAL_ERROR
+          "GNU ${CMAKE_CXX_COMPILER_VERSION} ${below_minimum_msg} ${GNU_MinVersion}"
+      )
+    endif()
+    # If GCC is up-to-date, set flag to true and continue
+    set(GCC TRUE)
+
+    # Disable semantic interposition
+    add_definitions(-fno-semantic-interposition)
+  endif()
+
+.. _disables semantic interposition: https://gitlab.com/nsnam/ns-3-dev/-/merge_requests/777
+
+The ``-fno-semantic-interposition`` flag `disables semantic interposition`_, which can 
+reduce overhead of function calls in shared libraries built with ``-fPIC``.
+This is the default behaviour for Clang. The inlined ns-3 calls will not be 
+correctly interposed by the ``LD_PRELOAD`` trick, which is not know to be used by ns-3 users. 
+To re-enable semantic interposition, comment out the line and reconfigure the project.
+
+Note: the most common use of the ``LD_PRELOAD`` trick is to use custom memory allocators,
+and this continues to work since the interposed symbols are from the standard libraries,
+which are compiled with semantic interposition. 
+
+Some modules may require special flags. The Openflow module for example 
+may require ``-Wno-stringop-truncation`` flag to prevent an warning that 
+is treated as error to prevent the compilation from proceeding. The flag
+can be passed to the entire module with the following:
+
+.. sourcecode:: cmake
+
+  add_compile_options(-Wno-stringop-truncation)
+
+  build_lib(
+    LIBNAME openflow
+    SOURCE_FILES
+      helper/openflow-switch-helper.cc
+      model/openflow-interface.cc
+      model/openflow-switch-net-device.cc
+    HEADER_FILES
+      helper/openflow-switch-helper.h
+      model/openflow-interface.h
+      model/openflow-switch-net-device.h
+    LIBRARIES_TO_LINK ${libinternet}
+                      ${openflow_LIBRARIES}
+    TEST_SOURCES test/openflow-switch-test-suite.cc
+  )
+
+If a flag prevents your compiler from compiling, wrap the flag inside a
+compiler check. The currently checked compilers are ``GCC`` and ``CLANG`` 
+(includes both upstream LLVM Clang and Apple Clang).
+
+.. sourcecode:: cmake
+
+  if(NOT ${FAILING_COMPILER})
+    add_compile_options(-Wno-stringop-truncation)
+  endif()
+
+  # or 
+
+  if(${ONLY_COMPILER_THAT_SUPPORTS_UNIQUE_FLAG})
+    add_compile_options(-unique_flag)
+  endif()
+
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/doc/manual/source/working-with-gitlab-ci-local.rst ns-3.36/doc/manual/source/working-with-gitlab-ci-local.rst
--- ns-3.35/doc/manual/source/working-with-gitlab-ci-local.rst	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/doc/manual/source/working-with-gitlab-ci-local.rst	2022-04-30 18:23:57.682732800 -0700
@@ -0,0 +1,166 @@
+.. include:: replace.txt
+.. highlight:: bash
+
+
+Working with gitlab-ci-local
+----------------------------
+
+.. _continuos integration (CI) : https://docs.gitlab.com/ee/ci/
+.. _pipelines : https://docs.gitlab.com/ee/ci/introduction/index.html#continuous-integration
+.. _daily and weekly pipelines : https://gitlab.com/nsnam/ns-3-dev/-/pipeline_schedules
+.. _crypto miners abuse : https://about.gitlab.com/blog/2021/05/17/prevent-crypto-mining-abuse/
+.. _GitLab-CI-local : https://github.com/firecow/gitlab-ci-local
+.. _GitLab CI : https://docs.gitlab.com/ee/ci/
+.. _Docker : https://docs.docker.com/desktop/
+.. _rootless mode : https://docs.docker.com/engine/security/rootless/
+
+The ns-3 project repository is currently hosted in GitLab, which includes
+`continuos integration (CI)`_ tools to automate build, tests, packaging and 
+distribution of software. The CI works based on jobs, that are defined 
+on YAML files. 
+
+The ns-3 GitLab CI files are located in ``ns-3-dev/utils/tests/``. 
+The main GitLab CI file is ``gitlab-ci.yml``. The different jobs
+are used to check if a multitude of compilers and package versions
+are compatible with the current ns-3 build, which is why a build is 
+usually followed by a test run. Other CI jobs build and warn about 
+missing the documentation. 
+
+The GitLab CI jobs are executed based on `pipelines`_ containing a 
+sequence of job batches. Jobs within a batch can be executed in parallel.
+These `pipelines`_ can be triggered manually, or scheduled to run automatically 
+per commit and/or based on a time period 
+(ns-3 has `daily and weekly pipelines`_ scheduled). 
+
+The GitLab CI free tier is very slow, taking a lot of time to identify
+issues during active merge request development. 
+
+Note: the free tier
+now requires a credit card due to `crypto miners abuse`_.
+
+`GitLab-CI-local`_ is a tool that allows an user to use the `GitLab CI`_
+configuration files locally, allowing for the debugging of CI settings
+and pipelines without requiring pushes to test repositories or main
+repositories that fill up the CI job queues with failed jobs due to
+script errors. 
+
+GitLab-CI-local relies on `Docker`_ to setup the environment to execute
+the jobs. 
+
+Note: Docker is usually setup in root mode, requiring 
+frequent use of administrative permissions/sudo. However,
+this is highly discouraged. You can configure Docker to run 
+in `rootless mode`_. From this point onwards, we assume Docker is configured 
+in `rootless mode`_.
+
+After installing both `Docker`_ in `rootless mode`_ and `GitLab-CI-local`_, 
+the ns-3 jobs can be listed using the following command:
+
+.. sourcecode:: bash
+
+    ~/ns-3-dev$ gitlab-ci-local --file ./utils/tests/gitlab-ci.yml --list
+    parsing and downloads finished in 226 ms
+    name                                   description  stage          when        allow_failure  needs
+    weekly-build-ubuntu-18.04-debug                     build          on_success  false      
+    
+    ...  
+
+    weekly-build-clang-11-optimized                     build          on_success  false      
+    pybindgen                                           build          on_success  false      
+    per-commit-compile-debug                            build          on_success  false      
+    per-commit-compile-release                          build          on_success  false      
+    per-commit-compile-optimized                        build          on_success  false      
+    daily-test-debug                                    test           on_success  false      
+    daily-test-release                                  test           on_success  false      
+    daily-test-optimized                                test           on_success  false      
+    daily-test-optimized-valgrind                       test           on_success  false      
+    weekly-test-debug-valgrind                          test           on_success  false      
+    weekly-test-release-valgrind                        test           on_success  false      
+    weekly-test-optimized-valgrind                      test           on_success  false      
+    weekly-test-takes-forever-optimized                 test           on_success  false      
+    doxygen                                             documentation  on_success  false      
+    manual                                              documentation  on_success  false      
+    tutorial                                            documentation  on_success  false      
+    models                                              documentation  on_success  false   
+
+To execute the ``per-commit-compile-release`` job, or any of the others listed above, use 
+the following command. 
+
+.. sourcecode:: console
+
+    ~/ns-3-dev$ gitlab-ci-local --file ./utils/tests/gitlab-ci.yml per-commit-compile-release
+
+WARNING: if you do not specify the job name, all jobs that can be executed in parallel will be
+executed at the same time. You may run out of disk, memory or both.
+
+Some jobs might require a previous job to complete successfully before getting started.
+The doxygen job is one of these.
+
+.. sourcecode:: console
+
+    ~/ns-3-dev$ gitlab-ci-local --file ./utils/tests/gitlab-ci.yml doxygen
+    Using fallback git user.name
+    Using fallback git user.email
+    parsing and downloads finished in 202 ms
+    doxygen                               starting archlinux:latest (documentation)
+    doxygen                               pulled archlinux:latest in 64 ms
+    doxygen                               > still running...
+    doxygen                               > still running...
+    doxygen                               copied to container in 20 s
+    doxygen                               imported cache 'ccache-' in 3.67 s
+    ~/ns-3-dev/.gitlab-ci-local/artifacts/pybindgen doesn't exist, did you forget --needs
+
+As instructed by the previous command output, you can add the ``--needs`` to build required
+jobs before proceeding. However, doing so will run all jobs as the ``doxygen`` is only supposed
+to run after weekly jobs are successfully executed.
+
+Another option is to run the specific job that produces the required artifact. In this case
+the ``pybindgen`` job.
+
+.. sourcecode:: console
+
+    ~/ns-3-dev$ gitlab-ci-local --file ./utils/tests/gitlab-ci.yml pybindgen
+    Using fallback git user.name
+    Using fallback git user.email
+    parsing and downloads finished in 202 ms
+    pybindgen                               starting archlinux:latest (build)
+
+    ...
+
+    pybindgen                             $ git diff src > pybindgen_new.patch
+    pybindgen                             exported artifacts in 911 ms
+    pybindgen                             copied artifacts to cwd in 56 ms
+    pybindgen                             finished in 5.77 min
+
+     PASS  pybindgen
+
+Then run the doxygen job again:
+
+.. sourcecode:: bash
+
+    ~/ns-3-dev$ gitlab-ci-local --file ./utils/tests/gitlab-ci.yml doxygen
+    Using fallback git user.name
+    Using fallback git user.email
+    parsing and downloads finished in 170 ms
+    doxygen                               starting archlinux:latest (documentation)
+
+    ...
+
+    doxygen                               >      1 files with warnings
+    doxygen                               > Doxygen Warnings Summary
+    doxygen                               > ----------------------------------------
+    doxygen                               >      1 directories
+    doxygen                               >      1 files
+    doxygen                               >     23 warnings
+    doxygen                               > done.
+    doxygen                               exported cache ns-3-ccache-storage/ 'ccache-' in 6.86 s
+    doxygen                               exported artifacts in 954 ms
+    doxygen                               copied artifacts to cwd in 59 ms
+    doxygen                               finished in 15 min
+
+     PASS  doxygen
+
+Artifacts built by the CI jobs will be stored in separate subfolders
+based on the job name. 
+
+``~/ns-3-dev/.gitlab-ci-local/artifacts/jobname``
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/doc/manual/source/working-with-git.rst ns-3.36/doc/manual/source/working-with-git.rst
--- ns-3.35/doc/manual/source/working-with-git.rst	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/doc/manual/source/working-with-git.rst	2022-04-30 18:23:57.682732800 -0700
@@ -42,6 +42,8 @@
 
 We will provide two ways, one anonymous (but will impede the creation of merge requests) and the other, preferred, that include forking the repository through the GitLab.com web interface.
 
+.. _Directly cloning ns-3-dev:
+
 Directly cloning ns-3-dev
 +++++++++++++++++++++++++
 
@@ -92,7 +94,7 @@
 
    $ git remote show
 
-To see to what ``origin`` is linking to::
+To see what ``origin`` is linking to::
 
    $ git remote show origin
 
@@ -247,7 +249,27 @@
 Submit work for review
 **********************
 
-After you push your branch to origin, you can follow the instructions here https://docs.gitlab.com/ee/gitlab-basics/add-merge-request.html to create a merge request. Please remember to add, as reviewer, at least one maintainer. To get the information on who is maintaining what, please refer to the `nsnam website <https://www.nsnam.org/develop/maintainers/>`_.
+After you push your branch to origin, you can follow the instructions here https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html
+to create a merge request. 
+
+GitLab CI (Continous Integration)
++++++++++++++++++++++++++++++++++
+
+GitLab provides a CI (Continous Integration) feature. Shortly put, after every push the code is built and tests are run in one of the GitLab servers.
+
+Merge requests are expected to pass the CI, as is to not generate errors or warings during compilation, to have all the tests pasing, and to not generate warnings on the documentation.
+Hence, the CI is very important for the workflow. However, sometimes running the Ci is superfluous, for example:
+
+- You are in the middle of some work (and perhaps you know that there are errors),
+- Your changes are not tested by the CI (e.g., changes to the AUTHORS),
+- Etc.
+
+In these cases it is useful to skip the CI to save time, CI runners quota, and energy. This is possible by using the ``-o ci.skip`` option:
+
+::
+
+    $ git push -o ci.skip
+
 
 Porting patches from mercurial repositories to git
 **************************************************
@@ -274,7 +296,7 @@
 Review and merge someone else's work
 ************************************
 
-Gitlab.com has a plenty of documentation on how to handle merge requests. Please take a look here: https://docs.gitlab.com/ee/user/project/merge_requests/index.html.
+Gitlab.com has a plenty of documentation on how to handle merge requests. Please take a look here: https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html.
 
 If you are committing a patch from someone else, and it is not coming through a Merge Request process, you can use the --author='' argument to 'git commit' to assign authorship to another email address (such as we have done in the past with the Mercurial -u option).
 
@@ -351,11 +373,14 @@
 
 Make a commit of these files:
 
+::
+
   $ git commit -a -m"Update VERSION and documentation tags for ns-3.34 release"
 
 Next, make the following change to RELEASE_NOTES and commit it:
 
 ::
+  
    Availability
    ------------
   -This release is not yet available.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/doc/models/Makefile ns-3.36/doc/models/Makefile
--- ns-3.35/doc/models/Makefile	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/doc/models/Makefile	2022-04-30 18:23:57.682732800 -0700
@@ -76,6 +76,7 @@
 	$(SRC)/wifi/doc/source/wifi-design.rst \
 	$(SRC)/wifi/doc/source/wifi-user.rst \
 	$(SRC)/wifi/doc/source/wifi-testing.rst \
+	$(SRC)/wifi/doc/source/wifi-changelog.rst \
 	$(SRC)/wifi/doc/source/wifi-references.rst \
 	$(SRC)/wimax/doc/wimax.rst \
 	$(SRC)/uan/doc/uan.rst \
@@ -334,6 +335,7 @@
 	$(SRC)/netanim/doc/figures/RoutingTables.pdf \
 	$(SRC)/netanim/doc/figures/PacketTimeline.png \
 	$(SRC)/netanim/doc/figures/PacketTimeline.pdf \
+	$(SRC)/nix-vector-routing/doc/figures/nms.png \
 	$(SRC)/spectrum/doc/spectrum-channel-phy-interface.png \
 	$(SRC)/spectrum/doc/spectrum-channel-phy-interface.pdf \
 	$(SRC)/spectrum/doc/spectrum-analyzer-example.eps \
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/doc/models/source/conf.py ns-3.36/doc/models/source/conf.py
--- ns-3.35/doc/models/source/conf.py	2021-10-01 13:27:51.000000000 -0700
+++ ns-3.36/doc/models/source/conf.py	2022-04-30 18:27:14.427631600 -0700
@@ -73,9 +73,9 @@
 # built documents.
 #
 # The short X.Y version.
-version = u'ns-3.35'
+version = u'ns-3.36'
 # The full version, including alpha/beta/rc tags.
-release = u'ns-3.35'
+release = u'ns-3.36'
 
 # The language for content autogenerated by Sphinx. Refer to documentation
 # for a list of supported languages.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/doc/ns3_html_theme/get_version.sh ns-3.36/doc/ns3_html_theme/get_version.sh
--- ns-3.35/doc/ns3_html_theme/get_version.sh	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/doc/ns3_html_theme/get_version.sh	2022-04-30 18:23:57.686732800 -0700
@@ -27,7 +27,7 @@
 #     run by cron jobs.)
 #
 # If both a and b are true, we're building for public urls.
-# (The newer update-docs script (through waf) sets
+# (The newer update-docs script (through ns3) sets
 # NS3_WWW_URLS=public explicitly.)
 # 
 # The repo version is either a tag name or a commit (short) id.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/doc/ns3_html_theme/layout.html ns-3.36/doc/ns3_html_theme/layout.html
--- ns-3.35/doc/ns3_html_theme/layout.html	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/doc/ns3_html_theme/layout.html	2022-04-30 18:23:57.686732800 -0700
@@ -31,81 +31,93 @@
 {% endblock %}
       
 {% block header %}
-  <div id="titlearea">
-    <table cellspacing="0" cellpadding="0" width="100%">
-      <tbody>
-	<tr style="height: 56px;">
-	  <td id="projectlogo">
-	    <a id="ns3_home1"
-	       href="http://www.nsnam.org/">
-	       <img alt="ns-3 Logo"
-		    src="{{ pathto('_static/' + theme_logo, 1)}}"/>
-	    </a>
-	  </td>
-	  <td id="projecttext">
-	    <div id="projectbrief">A Discrete-Event Network Simulator</div>
-	      <span id="projectnumber"><script type="text/javascript">document.write(ns3_version)</script></span>
-	  </td>
-	      
-	  <td id="ns3-menu">
-	    <div class="menu">
-	      <ul >
-	        <li><a id="ns3_home2"
-		       href="http://www.nsnam.org/"
-		       >&nbsp;&nbsp;Home</a>
-	        </li>
-	        <li><span
-		      onmouseover="mopen('mTuts')" 
-		      onmouseout="mclosetime()"
-			>Tutorials &nbsp;&#x25BC;</span>
-		    <div id="mTuts" 
-		        onmouseover="mcancelclosetime()" 
-		        onmouseout="mclosetime()">
-		      <a id="ns3_tut"
-			 href="/docs/tutorial/html/index.html"
-			  >English</a><br/>
-	        </li>
-	        <li><span
-		      onmouseover="mopen('mDocs')" 
-		      onmouseout="mclosetime()"
-			>Docs &nbsp;&nbsp;&nbsp;&#x25BC;</span>
-		    <div id="mDocs"
-		        onmouseover="mcancelclosetime()" 
-		        onmouseout="mclosetime()">
-		      <a id="ns3_wiki"
-			 href="http://www.nsnam.org/wiki"
-			 >Wiki</a><br/>
-		      <a id="ns3_man"
-			 href="/docs/manual/html/index.html"
-			 >Manual</a><br/>
-		      <a id="ns3_mod"
-			 href="/docs/models/html/index.html"
-			 >Models</a><br/>
-	        </li>
-	        <li><span
-		      onmouseover="mopen('mDev')" 
-		      onmouseout="mclosetime()"
-			>Develop &#x25BC;</span>
-		    <div id="mDev"
-		        onmouseover="mcancelclosetime()" 
-		        onmouseout="mclosetime()">
-		      <a id="ns3_api"
-			 href="/docs/doxygen/html/index.html"
-			 >API</a><br/>
-		      <a id="ns3_bugs"
-		       href="http://www.nsnam.org/bugzilla/">Bugs</a>
-	        </li>
-	      </ul>
-	    </div>
-	  </td>
-	  <td id="projectsection">
-	    <span style="margin-right:10px">{{ shorttitle }}</span>
-	  </td>
-	</tr>
-      </tbody>
-    </table>
-    <script  type="text/javascript">ns3_write_links()</script>
-  </div>
+    <div id="titlearea">
+      <table cellspacing="0" cellpadding="0" width="100%">
+        <tbody>
+          <tr style="height: 56px;">
+            <td id="projectlogo">
+              <a id="ns3_home1"
+                 href="http://www.nsnam.org/">
+                 <img alt="ns-3 Logo"
+                      src="{{ pathto('_static/' + theme_logo, 1)}}"/>
+              </a>
+            </td>
+            <td id="projecttext">
+              <div id="projectbrief">A Discrete-Event Network Simulator</div>
+              <span id="projectnumber"><script type="text/javascript">document.write(ns3_version)</script></span>
+            </td>
+
+            <td id="ns3-menu">
+              <div class="menu">
+                <ul >
+                  <li style="background-image:none">
+                    <a id="ns3_home2"
+                         href="http://www.nsnam.org/"
+                         >&nbsp;&nbsp;Home</a>
+                  </li>
+                  <li><span
+                        onmouseover="mopen('mTuts')" 
+                        onmouseout="mclosetime()"
+                          >Tutorials &nbsp;&#x25BC;</span>
+                      <div id="mTuts" 
+                          onmouseover="mcancelclosetime()" 
+                          onmouseout="mclosetime()">
+                        <a id="ns3_tut"
+                           href="/docs/tutorial/html/index.html"
+                            >English</a><br/>
+                      </div>
+                  </li>
+                  <li><span
+                        onmouseover="mopen('mDocs')" 
+                        onmouseout="mclosetime()"
+                          >Documentation &nbsp;&#x25BC;</span>
+                      <div id="mDocs"
+                          onmouseover="mcancelclosetime()" 
+                          onmouseout="mclosetime()">
+                        <a id="ns3_man"
+                           href="/docs/manual/html/index.html"
+                           >Manual</a><br/>
+                        <a id="ns3_mod"
+                           href="/docs/models/html/index.html"
+                           >Models</a><br/>
+                        <a id="ns3_con"
+                           href="/docs/contributing/html/index.html"
+                           >Contributing</a><br/>
+                        <a id="ns3_wiki"
+                           href="http://www.nsnam.org/wiki"
+                           >Wiki</a><br/>
+                      </div>
+                  </li>
+                  <li><span
+                        onmouseover="mopen('mDev')" 
+                        onmouseout="mclosetime()"
+                          >Development &nbsp;&#x25BC;</span>
+                      <div id="mDev"
+                          onmouseover="mcancelclosetime()" 
+                          onmouseout="mclosetime()">
+                        <a id="ns3_api"
+                           href="/docs/doxygen/html/index.html"
+                           >API Docs</a><br/>
+                        <a id="ns3_bugs"
+                         href="https://gitlab.com/nsnam/ns-3-dev/-/issues"
+                           >Issue Tracker</a><br/>
+                        <a id="ns3_merge"
+                         href="https://gitlab.com/nsnam/ns-3-dev/-/merge_requests"
+                           >Merge Requests</a><br/>
+                      </div>
+                  </li>
+                </ul>
+              </div>
+            </td>
+
+            <td id="projectsection">
+              <span style="margin-right:10px">{{ shorttitle }}</span>
+            </td>
+          </tr>
+        </tbody>
+      </table>
+      <script  type="text/javascript">ns3_write_links()</script>
+    </div>
 {% endblock %}
       
 {% block rootrellink %}
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/doc/ns3_html_theme/ns3_doxy_header.html ns-3.36/doc/ns3_html_theme/ns3_doxy_header.html
--- ns-3.35/doc/ns3_html_theme/ns3_doxy_header.html	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/doc/ns3_html_theme/ns3_doxy_header.html	2022-04-30 18:23:57.686732800 -0700
@@ -26,82 +26,93 @@
 <body>
     <div id="top"><!-- do not remove this div, it is closed by doxygen! -->
 
-      <!--BEGIN TITLEAREA-->
-      <div id="titlearea">
-	<table cellspacing="0" cellpadding="0" width="100%">
-	  <tbody>
-	    <tr style="height: 56px;">
-	      <td id="projectlogo">
-		<a id="ns3_home1"
-		  href="http://www.nsnam.org/">
-		  <img alt="ns-3 Logo"
-		    src="$relpath$$projectlogo"/>
-		</a>
-	      </td>
-	      <td id="projecttext">
-		<div id="projectbrief">A Discrete-Event Network Simulator</div>
-		<span id="projectnumber"><script type="text/javascript">document.write(ns3_version)</script></span>
-		
-	      </td>
-	      <td id="ns3-menu">
-		<div class="menu">
-		  <ul >
-		    <li><a id="ns3_home2"
-			href="http://www.nsnam.org/"
-			>&nbsp;&nbsp;Home</a>
-		    </li>
-		    <li><span
-			onmouseover="mopen('mTuts')" 
-			onmouseout="mclosetime()"
-			>Tutorials &nbsp;&#x25BC;</span>
-		      <div id="mTuts" 
-		        onmouseover="mcancelclosetime()" 
-		        onmouseout="mclosetime()">
-			<a id="ns3_tut"
-			  href="/docs/tutorial/html/index.html"
-			  >English</a><br/>
-		    </li>
-		    <li><span
-			onmouseover="mopen('mDocs')" 
-			onmouseout="mclosetime()"
-			>Docs &nbsp;&nbsp;&nbsp;&#x25BC;</span>
-		      <div id="mDocs"
-		        onmouseover="mcancelclosetime()" 
-		        onmouseout="mclosetime()">
-			<a id="ns3_wiki"
-			  href="http://www.nsnam.org/wiki"
-			  >Wiki</a><br/>
-			<a id="ns3_man"
-			    href="/docs/manual/html/index.html"
-			    >Manual</a><br/>
-			<a id="ns3_mod"
-			   href="/docs/models/html/index.html"
-			   >Models</a><br/>
-		    </li>
-		    <li><span
-			onmouseover="mopen('mDev')" 
-			onmouseout="mclosetime()"
-			>Develop &#x25BC;</span>
-		      <div id="mDev"
-		        onmouseover="mcancelclosetime()" 
-		        onmouseout="mclosetime()">
-			<a id="ns3_api"
-			   href="/docs/doxygen/index.html"
-			   >API</a><br/>
-			<a id="ns3_bugs"
-			   href="http://www.nsnam.org/bugzilla/">Bugs</a>
-		    </li>
-		  </ul>
-		</div>
-	      </td>
+    <!--BEGIN TITLEAREA-->
+    <div id="titlearea">
+      <table cellspacing="0" cellpadding="0" width="100%">
+        <tbody>
+          <tr style="height: 56px;">
+            <td id="projectlogo">
+              <a id="ns3_home1"
+		 href="http://www.nsnam.org/">
+		<img alt="ns-3 Logo"
+                     src="$relpath$$projectlogo"/>
+              </a>
+            </td>
+            <td id="projecttext">
+              <div id="projectbrief">A Discrete-Event Network Simulator</div>
+              <span id="projectnumber"><script type="text/javascript">document.write(ns3_version)</script></span>
+            </td>
 
-	      <td id="projectsection">
-		<span style="margin-right:10px">API</span>
-	      </td>
-	    </tr>
-	  </tbody>
-	</table>
-	<script  type="text/javascript">ns3_write_links();</script>
-      </div>
+            <td id="ns3-menu">
+              <div class="menu">
+                <ul >
+                  <li style="background-image:none">
+                    <a id="ns3_home2"
+                         href="http://www.nsnam.org/"
+                         >&nbsp;&nbsp;Home</a>
+                  </li>
+                  <li><span
+                        onmouseover="mopen('mTuts')" 
+                        onmouseout="mclosetime()"
+                          >Tutorials &nbsp;&#x25BC;</span>
+                      <div id="mTuts" 
+                          onmouseover="mcancelclosetime()" 
+                          onmouseout="mclosetime()">
+                        <a id="ns3_tut"
+                           href="/docs/tutorial/html/index.html"
+                            >English</a><br/>
+                      </div>
+                  </li>
+                  <li><span
+                        onmouseover="mopen('mDocs')" 
+                        onmouseout="mclosetime()"
+                          >Documentation &nbsp;&#x25BC;</span>
+                      <div id="mDocs"
+                          onmouseover="mcancelclosetime()" 
+                          onmouseout="mclosetime()">
+                        <a id="ns3_man"
+                           href="/docs/manual/html/index.html"
+                           >Manual</a><br/>
+                        <a id="ns3_mod"
+                           href="/docs/models/html/index.html"
+                           >Models</a><br/>
+                        <a id="ns3_con"
+                           href="/docs/contributing/html/index.html"
+                           >Contributing</a><br/>
+                        <a id="ns3_wiki"
+                           href="http://www.nsnam.org/wiki"
+                           >Wiki</a><br/>
+                      </div>
+                  </li>
+                  <li><span
+                        onmouseover="mopen('mDev')" 
+                        onmouseout="mclosetime()"
+                          >Development &nbsp;&#x25BC;</span>
+                      <div id="mDev"
+                          onmouseover="mcancelclosetime()" 
+                          onmouseout="mclosetime()">
+                        <a id="ns3_api"
+                           href="/docs/doxygen/html/index.html"
+                           >API Docs</a><br/>
+                        <a id="ns3_bugs"
+                         href="https://gitlab.com/nsnam/ns-3-dev/-/issues"
+                           >Issue Tracker</a><br/>
+                        <a id="ns3_merge"
+                         href="https://gitlab.com/nsnam/ns-3-dev/-/merge_requests"
+                           >Merge Requests</a><br/>
+                      </div>
+                  </li>
+                </ul>
+              </div>
+            </td>
+
+            <td id="projectsection">
+              <span style="margin-right:10px">API</span>
+            </td>
+          </tr>
+        </tbody>
+      </table>
+      <script  type="text/javascript">ns3_write_links()</script>
+    </div>
 <!--END TITLEAREA-->
 <!-- end header part -->
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/doc/ns3_html_theme/static/drop-down-menu.js ns-3.36/doc/ns3_html_theme/static/drop-down-menu.js
--- ns-3.35/doc/ns3_html_theme/static/drop-down-menu.js	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/doc/ns3_html_theme/static/drop-down-menu.js	2022-04-30 18:23:57.686732800 -0700
@@ -1,5 +1,34 @@
 // Copyright 2006-2007 javascript-array.com
 // http://javascript-array.com/scripts/simple_drop_down_menu/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+// 
+//     (1) Redistributions of source code must retain the above copyright
+//     notice, this list of conditions and the following disclaimer. 
+// 
+//     (2) Redistributions in binary form must reproduce the above copyright
+//     notice, this list of conditions and the following disclaimer in
+//     the documentation and/or other materials provided with the
+//     distribution.  
+//     
+//     (3) The name of the author may not be used to
+//     endorse or promote products derived from this software without
+//     specific prior written permission.
+// 
+// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
+// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+// IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+// POSSIBILITY OF SUCH DAMAGE. 
+// 
 
 var timeout	= 250;
 var closetimer	= 0;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/doc/ns3_html_theme/static/ns3_links.js ns-3.36/doc/ns3_html_theme/static/ns3_links.js
--- ns-3.35/doc/ns3_html_theme/static/ns3_links.js	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/doc/ns3_html_theme/static/ns3_links.js	2022-04-30 18:23:57.686732800 -0700
@@ -3,6 +3,7 @@
 var ns3_home = ns3_site + "";
 var ns3_wiki = ns3_site + "wiki";
 var ns3_bugs = "https://gitlab.com/nsnam/ns-3-dev/-/issues";
+var ns3_merge = "https://gitlab.com/nsnam/ns-3-dev/-/merge_requests";
 
 // Links that depend on version:
 // Defined in ns3_version.js:
@@ -42,15 +43,17 @@
 var ns3_man  = ns3_rel  + "manual/"         + ns3_index;
 var ns3_mod  = ns3_rel  + "models/"         + ns3_index;
 var ns3_tut  = ns3_rel  + "tutorial/"       + ns3_index;
+var ns3_con  = ns3_rel  + "contributing/"   + ns3_index;
 
 function ns3_write_links() {
   document.getElementById("ns3_home1").href = ns3_home;
   document.getElementById("ns3_home2").href = ns3_home;
-  document.getElementById("ns3_wiki" ).href = ns3_wiki;
-  document.getElementById("ns3_bugs" ).href = ns3_bugs;
-  
-  document.getElementById("ns3_api"  ).href = ns3_api;
+  document.getElementById("ns3_tut"  ).href = ns3_tut;
   document.getElementById("ns3_man"  ).href = ns3_man;
   document.getElementById("ns3_mod"  ).href = ns3_mod;
-  document.getElementById("ns3_tut"  ).href = ns3_tut;
+  document.getElementById("ns3_con"  ).href = ns3_con;
+  document.getElementById("ns3_wiki" ).href = ns3_wiki;
+  document.getElementById("ns3_api"  ).href = ns3_dox;
+  document.getElementById("ns3_bugs" ).href = ns3_bugs;
+  document.getElementById("ns3_merge").href = ns3_merge;
 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/doc/ns3_html_theme/static/ns3_stylesheet.css ns-3.36/doc/ns3_html_theme/static/ns3_stylesheet.css
--- ns-3.35/doc/ns3_html_theme/static/ns3_stylesheet.css	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/doc/ns3_html_theme/static/ns3_stylesheet.css	2022-04-30 18:23:57.686732800 -0700
@@ -85,6 +85,9 @@
   background-repeat:repeat;
   border-bottom: 1px solid #5B5B5B;
   color: white;
+  position: relative;
+  /* Doxygen tab bar ("Main Page", "Related Pages"..) is at z: 9999 */
+  z-index:10000;
 }
 
 #projectlogo {
@@ -137,14 +140,13 @@
 /*   background-origin: padding-box; */
 /*   background-position: -10px 0; */
   background-repeat: no-repeat;
+  background-size: 100% 39px;
   display: table-cell;
   float:left;
   height: 40px;
   margin: 0px 0px 0px 0px;
-  overflow: hidden;
   padding:0px 0px 0px 0px;
   vertical-align: middle;
-  width: 450px;
 }
 
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/doc/release_steps.txt ns-3.36/doc/release_steps.txt
--- ns-3.35/doc/release_steps.txt	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/doc/release_steps.txt	2022-04-30 18:23:57.686732800 -0700
@@ -15,7 +15,7 @@
 During the software development phase, it is important for the release
 manager to try to maintain the following files with updated information:
 - AUTHORS
-- RELEASE_NOTES
+- RELEASE_NOTES.md
 - CHANGES.html
 
 otherwise, this becomes painful to edit (and things are forgotten)
@@ -29,15 +29,15 @@
 and/or the buildbots have been testing
    - building static, optimized, and debug versions
    - try Python visualizer (not tested by buildbots)
-      -- ./waf --pyrun src/flow-monitor/examples/wifi-olsr-flowmon.py --vis
+      -- ./ns3 run src/flow-monitor/examples/wifi-olsr-flowmon.py --vis
    - ensure that tests pass (./test.py -g) and make sure that the buildbots
      are reporting 'pass' state, based on the tip of the repository
-   - revise and check in AUTHORS, RELEASE_NOTES, and CHANGES.html
+   - revise and check in AUTHORS, RELEASE_NOTES.md, and CHANGES.html
    - required versions for related libraries (netanim, pybindgen)
      are correct
-   - confirm that Doxygen builds cleanly (./waf doxygen), 
+   - confirm that Doxygen builds cleanly (./ns3 doxygen),
    - confirm that the new bake configurations for the release work correctly
-   - confirm all documents build:  './waf docs' and check outputs
+   - confirm all documents build:  './ns3 docs' and check outputs
 
 2.1)  Update the tutorial "Getting Started" and "Quick Start" pages to use the new release number.
 
@@ -193,7 +193,7 @@
 4) maintaining the release
 --------------------------
 
-First, create skeletal sections in CHANGES.html and RELEASE_NOTES to
+First, create skeletal sections in CHANGES.html and RELEASE_NOTES.md to
 start collecting inputs for the ns-3.(x+1) release.
 
 The project may decide to make incremental, bug-fix releases from
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/doc/tutorial/source/building-topologies.rst ns-3.36/doc/tutorial/source/building-topologies.rst
--- ns-3.35/doc/tutorial/source/building-topologies.rst	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/doc/tutorial/source/building-topologies.rst	2022-04-30 18:23:57.718732800 -0700
@@ -335,14 +335,14 @@
   }
 
 In order to run this example, copy the ``second.cc`` example script into 
-the scratch directory and use waf to build just as you did with
+the scratch directory and use ns3 to build just as you did with
 the ``first.cc`` example.  If you are in the top-level directory of the
 repository you just type,
 
 .. sourcecode:: bash
 
   $ cp examples/tutorial/second.cc scratch/mysecond.cc
-  $ ./waf
+  $ ./ns3
 
 Warning:  We use the file ``second.cc`` as one of our regression tests to
 verify that it works exactly as we think it should in order to make your
@@ -358,7 +358,7 @@
 .. sourcecode:: bash
 
   $ export NS_LOG=
-  $ ./waf --run scratch/mysecond
+  $ ./ns3 run scratch/mysecond
 
 Since we have set up the UDP echo applications to log just as we did in 
 ``first.cc``, you will see similar output when you run the script.
@@ -540,7 +540,7 @@
 
 .. sourcecode:: bash
 
-  $ ./waf --run "scratch/mysecond --nCsma=4"
+  $ ./ns3 run "scratch/mysecond --nCsma=4"
 
 You should now see,
 
@@ -615,7 +615,7 @@
 
 .. sourcecode:: bash
 
-  $ ./waf --run "scratch/mysecond --nCsma=100"
+  $ ./ns3 run "scratch/mysecond --nCsma=100"
 
 you will see the following output:
 
@@ -958,41 +958,51 @@
 
   phy.SetChannel (channel.Create ());
 
-Once the PHY helper is configured, we can focus on the MAC layer. Here we choose to
-work with non-Qos MACs. WifiMacHelper object is used to set MAC parameters. 
+Once the PHY helper is configured, we can focus on the MAC layer. The
+WifiMacHelper object is used to set MAC parameters.
+The second statement below creates an 802.11 service set identifier (SSID)
+object that will be used to set the value of the "Ssid" ``Attribute`` of
+the MAC layer implementation.  
 
-::
 
-  WifiHelper wifi;
-  wifi.SetRemoteStationManager ("ns3::AarfWifiManager");
+::
 
   WifiMacHelper mac;
+  Ssid ssid = Ssid ("ns-3-ssid");
 
-The ``SetRemoteStationManager`` method tells the helper the type of 
-rate control algorithm to use.  Here, it is asking the helper to use the AARF
-algorithm --- details are, of course, available in Doxygen.
+WifiHelper will, by default, configure
+the standard in use to be 802.11ax (known commercially as Wi-Fi 6) and configure
+a compatible rate control algorithm (IdealWifiManager).
 
-Next, we configure the type of MAC, the SSID of the infrastructure network we
-want to setup and make sure that our stations don't perform active probing:
+::
+
+  WifiHelper wifi;
+
+We are now ready to install Wi-Fi models on the nodes, using these four 
+helper objects (YansWifiChannelHelper, YansWifiPhyHelper, WifiMacHelper,
+WifiHelper) and the Ssid object created above.  These helpers have
+encapsulated a lot of default configuration,
+and can be further tailored using additional attribute configuration if
+desired.  We also will create NetDevice containers to store pointers to
+the WifiNetDevice objects that the helper create.
 
 ::
 
-  Ssid ssid = Ssid ("ns-3-ssid");
+  NetDeviceContainer staDevices
   mac.SetType ("ns3::StaWifiMac",
     "Ssid", SsidValue (ssid),
     "ActiveProbing", BooleanValue (false));
 
-This code first creates an 802.11 service set identifier (SSID) object
-that will be used to set the value of the "Ssid" ``Attribute`` of
-the MAC layer implementation.  The particular kind of MAC layer that
-will be created by the helper is specified by ``Attribute`` as
-being of the "ns3::StaWifiMac" type.  "QosSupported" ``Attribute`` is
-set to false by default for ``WifiMacHelper`` objects. The combination
+In the above code, the specific kind of MAC layer that
+will be created by the helper is specified by the TypeId value
+of `ns3::StaWifiMac` type.  The "QosSupported" attribute is
+set to true by default for ``WifiMacHelper`` objects when the standard
+is at least 802.11n or newer. The combination
 of these two configurations means that the MAC instance next created
-will be a non-QoS non-AP station (STA) in an infrastructure BSS (i.e.,
+will be a QoS-aware, non-AP station (STA) in an infrastructure BSS (i.e.,
 a BSS with an AP).  Finally, the "ActiveProbing" ``Attribute`` is
 set to false.  This means that probe requests will not be sent by MACs
-created by this helper.
+created by this helper, and stations will listen for AP beacons.
 
 Once all the station-specific parameters are fully configured, both at the
 MAC and PHY layers, we can invoke our now-familiar ``Install`` method to 
@@ -1015,9 +1025,7 @@
 
 In this case, the ``WifiMacHelper`` is going to create MAC
 layers of the "ns3::ApWifiMac", the latter specifying that a MAC
-instance configured as an AP should be created. We do not change
-the default setting of "QosSupported" ``Attribute``, so it remains
-false - disabling 802.11e/WMM-style QoS support at created APs.  
+instance configured as an AP should be created.
 
 The next lines create the single AP which shares the same set of PHY-level
 ``Attributes`` (and channel) as the stations:
@@ -1180,15 +1188,14 @@
   }
 
 In order to run this example, you have to copy the ``third.cc`` example
-script into the scratch directory and use Waf to build just as you did with
+script into the scratch directory and use CMake to build just as you did with
 the ``second.cc`` example.  If you are in the top-level directory of the
 repository you would type,
 
 .. sourcecode:: bash
 
   $ cp examples/tutorial/third.cc scratch/mythird.cc
-  $ ./waf
-  $ ./waf --run scratch/mythird
+  $ ./ns3 run scratch/mythird
 
 Again, since we have set up the UDP echo applications just as we did in the 
 ``second.cc`` script, you will see similar output.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/doc/tutorial/source/conceptual-overview.rst ns-3.36/doc/tutorial/source/conceptual-overview.rst
--- ns-3.35/doc/tutorial/source/conceptual-overview.rst	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/doc/tutorial/source/conceptual-overview.rst	2022-04-30 18:23:57.718732800 -0700
@@ -157,12 +157,11 @@
 
 .. sourcecode:: bash
 
-  AUTHORS       examples       scratch        utils      waf.bat*
-  bindings      LICENSE        src            utils.py   waf-tools
-  build         ns3            test.py*       utils.pyc  wscript
-  CHANGES.html  README         testpy-output  VERSION    wutils.py
-  doc           RELEASE_NOTES  testpy.supp    waf*       wutils.pyc
-
+  AUTHORS          doc        RELEASE_NOTES.md  utils
+  bindings         examples   scratch           utils.py
+  CHANGES.html     LICENSE    src               VERSION
+  contrib          Makefile   test.py           
+  CONTRIBUTING.md  README.md  testpy.supp
 
 Change into the ``examples/tutorial`` directory.  You should see a file named 
 ``first.cc`` located there.  This is a script that will create a simple
@@ -243,10 +242,10 @@
 include file name collisions.  The ``ns3/core-module.h`` file corresponds 
 to the ns-3 module you will find in the directory ``src/core`` in your 
 downloaded release distribution.  If you list this directory you will find a
-large number of header files.  When you do a build, Waf will place public 
+large number of header files.  When you do a build, ns3 will place public
 header files in an ``ns3`` directory under the appropriate 
 ``build/debug`` or ``build/optimized`` directory depending on your 
-configuration.  Waf will also automatically generate a module include file to
+configuration.  CMake will also automatically generate a module include file to
 load all of the public header files.
 
 Since you are, of course, following this tutorial religiously, you will 
@@ -254,17 +253,17 @@
 
 .. sourcecode:: bash
 
-  $ ./waf -d debug --enable-examples --enable-tests configure
+  $ ./ns3 configure -d debug --enable-examples --enable-tests
 
 in order to configure the project to perform debug builds that include 
 examples and tests.  You will also have done a
 
 .. sourcecode:: bash
 
-  $ ./waf
+  $ ./ns3 build
 
 to build the project.  So now if you look in the directory 
-``../../build/debug/ns3`` you will find the four module include files shown 
+``../../build/include/ns3`` you will find the four module include files shown
 above.  You can take a look at the contents of these files and find that they
 do include all of the public include files in their respective modules.
 
@@ -814,7 +813,7 @@
 ++++++++++++++++++++
 We have made it trivial to build your simple scripts.  All you have to do is 
 to drop your script into the scratch directory and it will automatically be 
-built if you run Waf.  Let's try it.  Copy ``examples/tutorial/first.cc`` into 
+built if you run ns3.  Let's try it.  Copy ``examples/tutorial/first.cc`` into
 the ``scratch`` directory after changing back into the top level directory.
 
 .. sourcecode:: bash
@@ -822,11 +821,11 @@
   $ cd ../..
   $ cp examples/tutorial/first.cc scratch/myfirst.cc
 
-Now build your first example script using waf:
+Now build your first example script using ns3:
 
 .. sourcecode:: bash
 
-  $ ./waf
+  $ ./ns3
 
 You should see messages reporting that your ``myfirst`` example was built
 successfully.
@@ -844,7 +843,7 @@
 
 .. sourcecode:: bash
 
-  $ ./waf --run scratch/myfirst
+  $ ./ns3 run scratch/myfirst
 
 You should see some output:
 
@@ -885,27 +884,37 @@
 
 .. sourcecode:: text
 
-  drwxr-xr-x                               [up]     
-  drwxr-xr-x                               bindings python  files
-  drwxr-xr-x                               doc              files
-  drwxr-xr-x                               examples         files
-  drwxr-xr-x                               ns3              files
-  drwxr-xr-x                               scratch          files
-  drwxr-xr-x                               src              files
-  drwxr-xr-x                               utils            files
-  -rw-r--r-- 2009-07-01 12:47 +0200 560    .hgignore        file | revisions | annotate
-  -rw-r--r-- 2009-07-01 12:47 +0200 1886   .hgtags          file | revisions | annotate
-  -rw-r--r-- 2009-07-01 12:47 +0200 1276   AUTHORS          file | revisions | annotate
-  -rw-r--r-- 2009-07-01 12:47 +0200 30961  CHANGES.html     file | revisions | annotate
-  -rw-r--r-- 2009-07-01 12:47 +0200 17987  LICENSE          file | revisions | annotate
-  -rw-r--r-- 2009-07-01 12:47 +0200 3742   README           file | revisions | annotate
-  -rw-r--r-- 2009-07-01 12:47 +0200 16171  RELEASE_NOTES    file | revisions | annotate
-  -rw-r--r-- 2009-07-01 12:47 +0200 6      VERSION          file | revisions | annotate
-  -rwxr-xr-x 2009-07-01 12:47 +0200 88110  waf              file | revisions | annotate
-  -rwxr-xr-x 2009-07-01 12:47 +0200 28     waf.bat          file | revisions | annotate
-  -rw-r--r-- 2009-07-01 12:47 +0200 35395  wscript          file | revisions | annotate
-  -rw-r--r-- 2009-07-01 12:47 +0200 7673   wutils.py        file | revisions | annotate
-  
+  drwxr-xr-x                               [up]
+  -rwxrwxrwx  12507 nov 23 23:12 AUTHORS
+  drwxrwxrwx      0 dez 30  2020 bindings
+  drwxrwxrwx   4096 nov 28 11:25 build-support
+  -rwxrwxrwx 189870 nov 28 10:13 CHANGES.html
+  -rwxrwxrwx   1490 nov 22 10:56 .clang-format
+  -rwxrwxrwx   5079 nov 28 10:50 CMakeLists.txt
+  drwxrwxrwx      0 nov 28 00:56 contrib
+  -rwxrwxrwx  18336 nov 23 23:12 CONTRIBUTING.md
+  drwxrwxrwx   4096 nov 28 11:30 doc
+  -rwxrwxrwx    564 nov 22 10:56 .editorconfig
+  drwxrwxrwx   4096 nov 28 00:28 examples
+  drwxrwxrwx   4096 nov 28 11:15 .git
+  -rwxrwxrwx     42 nov 22 10:56 .gitattributes
+  -rwxrwxrwx    395 nov 28 11:25 .gitignore
+  drwxrwxrwx   4096 nov 28 11:37 .idea
+  -rwxrwxrwx  17987 nov 22 10:56 LICENSE
+  -rwxrwxrwx   6841 nov 22 10:56 .mailmap
+  drwxrwxrwx      0 jul 13 20:15 .nompi
+  -rwxrwxrwx  31942 nov 28 11:16 ns3
+  -rwxrwxrwx   4210 nov 28 11:25 README.md
+  -rwxrwxrwx 185874 nov 28 10:13 RELEASE_NOTES.md
+  drwxrwxrwx   4096 nov 28 00:28 scratch
+  drwxrwxrwx      0 out 21 11:42 .settings
+  drwxrwxrwx   8192 nov 28 00:56 src
+  -rwxrwxrwx  83149 nov 28 11:28 test.py
+  -rwxrwxrwx    131 nov 22 10:56 testpy.supp
+  drwxrwxrwx   4096 nov 28 11:25 utils
+  -rwxrwxrwx   4227 nov 28 11:25 utils.py
+  -rwxrwxrwx      6 nov 22 10:56 VERSION
+
 Our example scripts are in the ``examples`` directory.  If you click on ``examples``
 you will see a list of subdirectories.  One of the files in ``tutorial`` subdirectory is ``first.cc``.  If
 you click on ``first.cc`` you will find the code you just walked through.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/doc/tutorial/source/conf.py ns-3.36/doc/tutorial/source/conf.py
--- ns-3.35/doc/tutorial/source/conf.py	2021-10-01 13:27:51.000000000 -0700
+++ ns-3.36/doc/tutorial/source/conf.py	2022-04-30 18:27:14.427631600 -0700
@@ -71,9 +71,9 @@
 # built documents.
 #
 # The short X.Y version.
-version = u'ns-3.35'
+version = u'ns-3.36'
 # The full version, including alpha/beta/rc tags.
-release = u'ns-3.35'
+release = u'ns-3.36'
 
 # The language for content autogenerated by Sphinx. Refer to documentation
 # for a list of supported languages.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/doc/tutorial/source/data-collection.rst ns-3.36/doc/tutorial/source/data-collection.rst
--- ns-3.35/doc/tutorial/source/data-collection.rst	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/doc/tutorial/source/data-collection.rst	2022-04-30 18:23:57.718732800 -0700
@@ -60,7 +60,7 @@
 
 ::
 
-  ./waf --run "seventh --help"
+  ./ns3 run "seventh --help"
 
 which produces:
 
@@ -84,7 +84,7 @@
 
 ::
 
-  ./waf --run "seventh --useIpv6=1"
+  ./ns3 run "seventh --useIpv6=1"
 
 and have a look at the pcap generated, such as with ``tcpdump``:
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/doc/tutorial/source/getting-started.rst ns-3.36/doc/tutorial/source/getting-started.rst
--- ns-3.35/doc/tutorial/source/getting-started.rst	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/doc/tutorial/source/getting-started.rst	2022-04-30 18:23:57.718732800 -0700
@@ -1,5 +1,5 @@
 .. include:: replace.txt
-.. highlight:: bash
+.. highlight:: console
 
 .. _Getting Started:
 
@@ -70,14 +70,16 @@
 a bit, or the main web site at https://www.nsnam.org, since there is a 
 wealth of information there. 
 
-As of the most recent |ns3| release (ns-3.35), the following tools
+As of the most recent |ns3| release (ns-3.36), the following tools
 are needed to get started with |ns3|:
 
 ============  ===========================================================
 Prerequisite  Package/version
 ============  ===========================================================
-C++ compiler  ``clang++`` or ``g++`` (g++ version 7 or greater)
+C++ compiler  ``clang++`` or ``g++`` (g++ version 8 or greater)
 Python        ``python3`` version >=3.6
+CMake         ``cmake`` version >=3.10
+Build system  ``make``, ``ninja``, ``xcodebuild`` (XCode)
 Git           any recent version (to access |ns3| from `GitLab.com <https://gitlab.com/nsnam/ns-3-dev/>`_)
 tar           any recent version (to unpack an `ns-3 release <https://www.nsnam.org/releases/>`_)
 bunzip2       any recent version (to uncompress an |ns3| release)
@@ -91,14 +93,10 @@
 Linux, macOS, or a Linux emulation environment, and has at least the above
 prerequisites.
 
-**Note:** The |ns3| build system (`Waf`, introduced below) does not
-tolerate spaces in the installation path.  Make sure that you are downloading
-into a directory that does not contain spaces in the full path name.
-
 For example, do not use a directory path such as the below, because one
 of the parent directories contains a space in the directory name:
 
-.. sourcecode:: bash
+.. sourcecode:: console
 
   $ pwd
   /home/user/5G simulations/ns-3-allinone/ns-3-dev
@@ -121,27 +119,27 @@
 get a copy of a release by typing the following into your Linux shell 
 (substitute the appropriate version numbers, of course)
 
-.. sourcecode:: bash
+.. sourcecode:: console
 
   $ cd
   $ mkdir workspace
   $ cd workspace
-  $ wget https://www.nsnam.org/release/ns-allinone-3.35.tar.bz2
-  $ tar xjf ns-allinone-3.35.tar.bz2
+  $ wget https://www.nsnam.org/release/ns-allinone-3.36.tar.bz2
+  $ tar xjf ns-allinone-3.36.tar.bz2
 
 Notice the use above of the ``wget`` utility, which is a command-line
 tool to fetch objects from the web; if you do not have this installed,
 you can use a browser for this step.
  
 Following these steps, if you change into the directory 
-``ns-allinone-3.35``, you should see a number of files and directories
+``ns-allinone-3.36``, you should see a number of files and directories
 
 .. sourcecode:: text
 
-  $ cd ns-allinone-3.35
+  $ cd ns-allinone-3.36
   $ ls
-  bake      constants.py   ns-3.35                            README
-  build.py  netanim-3.108  pybindgen-0.22.0                   util.py
+  bake      constants.py   ns-3.36                            README
+  build.py  netanim-3.108  pybindgen-0.22.1                   util.py
 
 You are now ready to build the base |ns3| distribution and may skip ahead
 to the section on building |ns3|.
@@ -161,7 +159,7 @@
 (create your own replica) of the repository found on GitLab.com, as
 follows:
 
-.. sourcecode:: bash
+.. sourcecode:: console
 
   $ cd
   $ mkdir workspace
@@ -173,7 +171,7 @@
 different than described above with a release archive; it should look
 something like this:
 
-.. sourcecode:: bash
+.. sourcecode:: console
 
   $ ls
   build.py  constants.py   download.py  README  util.py
@@ -182,16 +180,16 @@
 the |ns3| and related sourcecode.  At this point, you have a choice, to
 either download the most recent development snapshot of |ns3|:
 
-.. sourcecode:: bash
+.. sourcecode:: console
 
   $ python3 download.py
 
 or to specify a release of |ns3|, using the ``-n`` flag to specify a
 release number:
 
-.. sourcecode:: bash
+.. sourcecode:: console
 
-  $ python3 download.py -n ns-3.35
+  $ python3 download.py -n ns-3.36
 
 After this step, the additional repositories of |ns3|, bake, pybindgen,
 and netanim will be downloaded to the ``ns-3-allinone`` directory.
@@ -206,7 +204,7 @@
 ns-3-allinone is called ``bake``.
 
 Bake is a tool for coordinated software building from multiple repositories,
-developed for the |ns3| project. Â Bake can be used to fetch development
+developed for the |ns3| project. Bake can be used to fetch development
 versions of the |ns3| software, and to download and build extensions to the 
 base |ns3| distribution, such as the Direct Code Execution environment,
 Network Simulation Cradle, ability to create new Python bindings, and
@@ -234,7 +232,7 @@
 As the git command executes, you should see something like the 
 following displayed:
 
-.. sourcecode:: bash
+.. sourcecode:: console
 
   Cloning into 'bake'...
   remote: Enumerating objects: 2086, done.
@@ -247,7 +245,7 @@
 After the clone command completes, you should have a directory called 
 ``bake``, the contents of which should look something like the following:
 
-.. sourcecode:: bash
+.. sourcecode:: console
 
   $ cd bake
   $ ls
@@ -260,10 +258,10 @@
 
 There are a few configuration targets available:
 
-1.  ``ns-3.35``:  the module corresponding to the release; it will download
+1.  ``ns-3.36``:  the module corresponding to the release; it will download
     components similar to the release tarball.
 2.  ``ns-3-dev``:  a similar module but using the development code tree
-3.  ``ns-allinone-3.35``:  the module that includes other optional features
+3.  ``ns-allinone-3.36``:  the module that includes other optional features
     such as bake build system, netanim animator, and pybindgen
 4.  ``ns-3-allinone``:  similar to the released version of the allinone
     module, but for development code.
@@ -280,7 +278,7 @@
 `"ns-3 Releases"
 <https://www.nsnam.org/releases>`_
 web page and clicking on the latest release link.  We'll proceed in
-this tutorial example with ``ns-3.35``.
+this tutorial example with ``ns-3.36``.
 
 We are now going to use the bake tool to pull down the various pieces of 
 |ns3| you will be using.  First, we'll say a word about running bake.
@@ -293,7 +291,7 @@
 First, change into the 'bake' directory, and then set the following
 environment variables:
  
-.. sourcecode:: bash
+.. sourcecode:: console
  
   $ export BAKE_HOME=`pwd`
   $ export PATH=$PATH:$BAKE_HOME:$BAKE_HOME/build/bin
@@ -306,14 +304,14 @@
 
 Step into the workspace directory and type the following into your shell:
 
-.. sourcecode:: bash
+.. sourcecode:: console
 
-  $ ./bake.py configure -e ns-3.35
+  $ ./bake.py configure -e ns-3.36
 
 Next, we'll ask bake to check whether we have enough tools to download
 various components.  Type:
 
-.. sourcecode:: bash
+.. sourcecode:: console
 
   $ ./bake.py check
 
@@ -340,7 +338,7 @@
 
 Next, try to download the software:
 
-.. sourcecode:: bash
+.. sourcecode:: console
 
   $ ./bake.py download
 
@@ -363,17 +361,17 @@
   >> Searching for system dependency pygobject - OK
   >> Searching for system dependency cmake - OK
   >> Downloading netanim-3.108 - OK
-  >> Downloading pybindgen-0.22.0 (target directory:pybindgen) - OK
-  >> Downloading ns-3.35 (target directory:ns-3.35) - OK
+  >> Downloading pybindgen-0.22.1 (target directory:pybindgen) - OK
+  >> Downloading ns-3.36 (target directory:ns-3.36) - OK
 
 The above suggests that three sources have been downloaded.  Check the
 ``source`` directory now and type ``ls``; one should see:
 
-.. sourcecode:: bash
+.. sourcecode:: console
 
   $ cd source
   $ ls
-  netanim-3.108  ns-3.35 pybindgen
+  netanim-3.108  ns-3.36 pybindgen
 
 You are now ready to build the |ns3| distribution.
 
@@ -382,11 +380,10 @@
 
 As with downloading |ns3|, there are a few ways to build |ns3|.  The main
 thing that we wish to emphasize is the following.  |ns3| is built with
-a build tool called ``Waf``, described below.  Most users will end up
-working most directly with Waf, but there are some convenience scripts
-to get you started or to orchestrate more complicated builds.  Therefore,
-please have a look at ``build.py`` and building with ``bake``, before
-reading about Waf below.
+a build tool called ``CMake``, described below.  Most users will end up
+working most directly with the ns3 command-line wrapper for CMake, for the sake
+of convenience.  Therefore, please have a look at ``build.py`` and building
+with ``bake``, before reading about CMake and the ns3 wrapper below.
 
 Building with ``build.py``
 ++++++++++++++++++++++++++
@@ -400,14 +397,14 @@
 program will get the project configured for you
 in the most commonly useful way.  However, please note that more advanced
 configuration and work with |ns3| will typically involve using the
-native |ns3| build system, Waf, to be introduced later in this tutorial.  
+native |ns3| build system, CMake, to be introduced later in this tutorial.
 
 If you downloaded
 using a tarball you should have a directory called something like 
-``ns-allinone-3.35`` under your ``~/workspace`` directory.  
+``ns-allinone-3.36`` under your ``~/workspace`` directory.  
 Type the following:
 
-.. sourcecode:: bash
+.. sourcecode:: console
 
   $ ./build.py --enable-examples --enable-tests
 
@@ -421,42 +418,7 @@
 You will see lots of compiler output messages displayed as the build
 script builds the various pieces you downloaded.  First, the script will
 attempt to build the netanim animator, then the pybindgen bindings generator,
-and finally |ns3|.  Eventually you should see the following::
-
-   Waf: Leaving directory '/path/to/workspace/ns-allinone-3.35/ns-3.35/build'
-   'build' finished successfully (6m25.032s)
-  
-   Modules built:
-   antenna                aodv                      applications              
-   bridge                 buildings                 config-store              
-   core                   csma                      csma-layout               
-   dsdv                   dsr                       energy                    
-   fd-net-device          flow-monitor              internet                  
-   internet-apps          lr-wpan                   lte                       
-   mesh                   mobility                  mpi                       
-   netanim (no Python)    network                   nix-vector-routing        
-   olsr                   point-to-point            point-to-point-layout     
-   propagation            sixlowpan                 spectrum                  
-   stats                  tap-bridge                test (no Python)          
-   topology-read          traffic-control           uan                       
-   virtual-net-device     visualizer                wave                      
-   wifi                   wimax                     
-
-   Modules not built (see ns-3 tutorial for explanation):
-   brite                  click                     openflow                  
-
-   Leaving directory ./ns-3.35
-
-Regarding the portion about modules not built::
-
-  Modules not built (see ns-3 tutorial for explanation):
-  brite                     click                     
-
-This just means that some |ns3| modules that have dependencies on
-outside libraries may not have been built, or that the configuration
-specifically asked not to build them.  It does not mean that the 
-simulator did not build successfully or that it will provide wrong 
-results for the modules listed as being built.
+and finally |ns3|.
 
 Building with bake
 ++++++++++++++++++
@@ -464,7 +426,7 @@
 If you used bake above to fetch source code from project repositories, you
 may continue to use it to build |ns3|.  Type: 
 
-.. sourcecode:: bash
+.. sourcecode:: console
 
   $ ./bake.py build
 
@@ -472,9 +434,9 @@
 
 .. sourcecode:: text
 
-  >> Building pybindgen-0.22.0 - OK
+  >> Building pybindgen-0.22.1 - OK
   >> Building netanim-3.108 - OK
-  >> Building ns-3.35 - OK
+  >> Building ns-3.36 - OK
 
 There may be failures to build all components, but the build will proceed
 anyway if the component is optional.  For example, a recent portability issue
@@ -495,175 +457,258 @@
 If there happens to be a failure, please have a look at what the following
 command tells you; it may give a hint as to a missing dependency:
 
-.. sourcecode:: bash
+.. sourcecode:: console
 
   $ ./bake.py show
 
 This will list out the various dependencies of the packages you are
 trying to build.
 
-Building with Waf
-+++++++++++++++++
+Building with the ns3 CMake wrapper
++++++++++++++++++++++++++++++++++++
 
 Up to this point, we have used either the `build.py` script, or the
 `bake` tool, to get started with building |ns3|.  These tools are useful
 for building |ns3| and supporting libraries, and they call into
-the |ns3| directory to call the Waf build tool to do the actual building.  
-An installation of Waf is bundled with the |ns3| source code.
-Most users quickly transition to using Waf directly to configure and 
-build |ns3|.  So, to proceed, please change your working directory to 
+the |ns3| directory to call the CMake build tool to do the actual building.
+CMake needs to be installed before building |ns3|.
+So, to proceed, please change your working directory to
 the |ns3| directory that you have initially built.
 
 It's not 
 strictly required at this point, but it will be valuable to take a slight
 detour and look at how to make changes to the configuration of the project.
 Probably the most useful configuration change you can make will be to 
-build the optimized version of the code.  By default you have configured
-your project to build the debug version.  Let's tell the project to 
-make an optimized build.  To explain to Waf that it should do optimized
+build the optimized version of the code. The project will be configured
+by default using the ``default`` build profile, which is an optimized
+build with debug information (CMAKE_BUILD_TYPE=relwithdebinfo) version. 
+Let's tell the project to make an optimized build.
+
+To maintain a similar interface for command-line users, we include a
+wrapper script for CMake, |ns3|. To tell |ns3| that it should do optimized
 builds that include the examples and tests, you will need to execute the 
 following commands:
 
-.. sourcecode:: bash
+.. sourcecode:: console
 
-  $ ./waf clean
-  $ ./waf configure --build-profile=optimized --enable-examples --enable-tests
+  $ ./ns3 clean
+  $ ./ns3 configure --build-profile=optimized --enable-examples --enable-tests
 
-This runs Waf out of the local directory (which is provided as a convenience
+This runs CMake out of the local directory (which is provided as a convenience
 for you).  The first command to clean out the previous build is not 
 typically strictly necessary but is good practice (but see `Build Profiles`_,
 below); it will remove the
 previously built libraries and object files found in directory ``build/``. 
 When the project is reconfigured and the build system checks for various 
 dependencies, you should see
-output that looks similar to the following::
+output that looks similar to the following:
+
+.. sourcecode:: console
+
+  $ ./ns3 configure --build-profile=optimized --enable-examples --enable-tests
+  -- CCache is enabled. Precompiled headers are disabled by default.
+  -- The CXX compiler identification is GNU 11.2.0
+  -- The C compiler identification is GNU 11.2.0
+  -- Detecting CXX compiler ABI info
+  -- Detecting CXX compiler ABI info - done
+  -- Check for working CXX compiler: /usr/bin/c++ - skipped
+  -- Detecting CXX compile features
+  -- Detecting CXX compile features - done
+  -- Detecting C compiler ABI info
+  -- Detecting C compiler ABI info - done
+  -- Check for working C compiler: /usr/bin/cc - skipped
+  -- Detecting C compile features
+  -- Detecting C compile features - done
+  -- Using default output directory /mnt/dev/tools/source/ns-3-dev/build
+  -- Found GTK3_GTK: /usr/lib/x86_64-linux-gnu/libgtk-3.so
+  -- GTK3 was found.
+  -- LibXML2 was found.
+  -- LibRT was found.
+  -- Visualizer requires Python bindings
+  -- Found Boost: /usr/lib/x86_64-linux-gnu/cmake/Boost-1.74.0/BoostConfig.cmake (found version "1.74.0")
+  -- Found PkgConfig: /usr/bin/pkg-config (found version "0.29.2")
+  -- GSL was found.
+  -- Found Sphinx: /usr/bin/sphinx-build
+  -- Looking for sys/types.h
+  -- Looking for sys/types.h - found
+  -- Looking for stdint.h
+  -- Looking for stdint.h - found
+  -- Looking for stddef.h
+  -- Looking for stddef.h - found
+  -- Check size of long long
+  -- Check size of long long - done
+  -- Check size of int128_t
+  -- Check size of int128_t - failed
+  -- Check size of __int128_t
+  -- Check size of __int128_t - done
+  -- Performing Test has_hash___int128_t
+  -- Performing Test has_hash___int128_t - Success
+  -- Check size of unsigned long long
+  -- Check size of unsigned long long - done
+  -- Check size of uint128_t
+  -- Check size of uint128_t - failed
+  -- Check size of __uint128_t
+  -- Check size of __uint128_t - done
+  -- Performing Test has_hash___uint128_t
+  -- Performing Test has_hash___uint128_t - Success
+  -- Looking for C++ include inttypes.h
+  -- Looking for C++ include inttypes.h - found
+  -- Looking for C++ include stat.h
+  -- Looking for C++ include stat.h - not found
+  -- Looking for C++ include dirent.h
+  -- Looking for C++ include dirent.h - found
+  -- Looking for C++ include stdlib.h
+  -- Looking for C++ include stdlib.h - found
+  -- Looking for C++ include signal.h
+  -- Looking for C++ include signal.h - found
+  -- Looking for C++ include netpacket/packet.h
+  -- Looking for C++ include netpacket/packet.h - found
+  -- Looking for C++ include semaphore.h
+  -- Looking for C++ include semaphore.h - found
+  -- Looking for getenv
+  -- Looking for getenv - found
+  -- Processing src/antenna
+  -- Processing src/aodv
+  -- Processing src/applications
+  -- Processing src/bridge
+  -- Processing src/brite
+  -- Brite was not found
+  -- Processing src/buildings
+  -- Processing src/click
+  -- Click was not found
+  -- Processing src/config-store
+  -- Processing src/core
+  -- Looking for C++ include boost/units/quantity.hpp
+  -- Looking for C++ include boost/units/quantity.hpp - found
+  -- Looking for C++ include boost/units/systems/si.hpp
+  -- Looking for C++ include boost/units/systems/si.hpp - found
+  -- Boost Units have been found.
+  -- Processing src/csma
+  -- Processing src/csma-layout
+  -- Processing src/dsdv
+  -- Processing src/dsr
+  -- Processing src/energy
+  -- Processing src/fd-net-device
+  -- Looking for C++ include net/ethernet.h
+  -- Looking for C++ include net/ethernet.h - found
+  -- Looking for C++ include netpacket/packet.h
+  -- Looking for C++ include netpacket/packet.h - found
+  -- Looking for C++ include net/if.h
+  -- Looking for C++ include net/if.h - found
+  -- Looking for C++ include linux/if_tun.h
+  -- Looking for C++ include linux/if_tun.h - found
+  -- Looking for C++ include net/netmap_user.h
+  -- Looking for C++ include net/netmap_user.h - not found
+  -- Looking for C++ include sys/ioctl.h
+  -- Looking for C++ include sys/ioctl.h - found
+  -- Checking for module 'libdpdk'
+  --   No package 'libdpdk' found
+  -- Processing src/flow-monitor
+  -- Processing src/internet
+  -- Processing src/internet-apps
+  -- Processing src/lr-wpan
+  -- Processing src/lte
+  -- Processing src/mesh
+  -- Processing src/mobility
+  -- Processing src/netanim
+  -- Processing src/network
+  -- Processing src/nix-vector-routing
+  -- Processing src/olsr
+  -- Processing src/openflow
+  -- Openflow was not found
+  -- Processing src/point-to-point
+  -- Processing src/point-to-point-layout
+  -- Processing src/propagation
+  -- Processing src/sixlowpan
+  -- Processing src/spectrum
+  -- Processing src/stats
+  -- Processing src/tap-bridge
+  -- Processing src/test
+  -- Processing src/topology-read
+  -- Processing src/traffic-control
+  -- Processing src/uan
+  -- Processing src/virtual-net-device
+  -- Processing src/wave
+  -- Processing src/wifi
+  -- Processing src/wimax
+  -- ---- Summary of optional NS-3 features:
+  Build profile                 : optimized
+  Build directory               : /mnt/dev/tools/source/ns-3-dev/build
+  BRITE Integration             : OFF (missing dependency)
+  DES Metrics event collection  : OFF (not requested)
+  DPDK NetDevice                : OFF (missing dependency)
+  Emulation FdNetDevice         : ON
+  Examples                      : ON
+  File descriptor NetDevice     : ON
+  GNU Scientific Library (GSL)  : ON
+  GtkConfigStore                : ON
+  MPI Support                   : OFF (not requested)
+  NS-3 Click Integration        : OFF (missing dependency)
+  NS-3 OpenFlow Integration     : OFF (missing dependency)
+  Netmap emulation FdNetDevice  : OFF (missing dependency)
+  PyViz visualizer              : OFF (missing dependency)
+  Python Bindings               : OFF (not requested)
+  Real Time Simulator           : ON
+  SQLite stats support          : ON
+  Tap Bridge                    : ON
+  Tap FdNetDevice               : ON
+  Tests                         : ON
+  Threading Primitives          : ON
+  
+  
+  Modules configured to be built:
+  antenna                   aodv                      applications
+  bridge                    buildings                 config-store
+  core                      csma                      csma-layout
+  dsdv                      dsr                       energy
+  fd-net-device             flow-monitor              internet
+  internet-apps             lr-wpan                   lte
+  mesh                      mobility                  netanim
+  network                   nix-vector-routing        olsr
+  point-to-point            point-to-point-layout     propagation
+  sixlowpan                 spectrum                  stats
+  tap-bridge                test                      topology-read
+  traffic-control           uan                       virtual-net-device
+  wave                      wifi                      wimax
+  
+  
+  Modules that cannot be built:
+  brite                     click                     mpi
+  openflow                  visualizer
+  
+  
+  -- Configuring done
+  -- Generating done
+  -- Build files have been written to: /mnt/dev/tools/source/ns-3-dev/cmake-cache
+  Finished executing the following commands:
+  mkdir cmake-cache
+  cd cmake-cache; /usr/bin/cmake -DCMAKE_BUILD_TYPE=release -DNS3_NATIVE_OPTIMIZATIONS=ON -DNS3_EXAMPLES=ON -DNS3_TESTS=ON -G Unix Makefiles .. ; cd ..
 
-   Setting top to                           : /home/ns3user/workspace/bake/source/ns-3-dev 
-   Setting out to                           : /home/ns3user/workspace/bake/source/ns-3-dev/build 
-   Checking for 'gcc' (C compiler)          : /usr/bin/gcc 
-   Checking for cc version                  : 7.3.0 
-   Checking for 'g++' (C++ compiler)        : /usr/bin/g++ 
-   Checking for compilation flag -march=native support : ok 
-   Checking for compilation flag -Wl,--soname=foo support : ok 
-   Checking for compilation flag -std=c++11 support       : ok 
-   Checking boost includes                                : headers not found, please provide a --boost-includes argument (see help) 
-   Checking boost includes                                : headers not found, please provide a --boost-includes argument (see help) 
-   Checking for program 'python'                          : /usr/bin/python 
-   Checking for python version >= 2.3                     : 2.7.15 
-   python-config                                          : /usr/bin/python-config 
-   Asking python-config for pyembed '--cflags --libs --ldflags' flags : yes 
-   Testing pyembed configuration                                      : yes 
-   Asking python-config for pyext '--cflags --libs --ldflags' flags   : yes 
-   Testing pyext configuration                                        : yes 
-   Checking for compilation flag -fvisibility=hidden support          : ok 
-   Checking for compilation flag -Wno-array-bounds support            : ok 
-   Checking for pybindgen location                                    : ../pybindgen (guessed) 
-   Checking for python module 'pybindgen'                             : 0.21.0 
-   Checking for pybindgen version                                     : 0.21.0 
-   Checking for code snippet                                          : yes 
-   Checking for types uint64_t and unsigned long equivalence          : no 
-   Checking for code snippet                                          : no 
-   Checking for types uint64_t and unsigned long long equivalence     : yes 
-   Checking for the apidefs that can be used for Python bindings      : gcc-LP64 
-   Checking for internal GCC cxxabi                                   : complete 
-   Checking for python module 'pygccxml'                              : not found 
-   Checking for click location                                        : not found 
-   Checking for program 'pkg-config'                                  : /usr/bin/pkg-config 
-   Checking for 'gtk+-3.0'                                            : not found 
-   Checking for 'libxml-2.0'                                          : yes 
-   checking for uint128_t                                             : not found 
-   checking for __uint128_t                                           : yes 
-   Checking high precision implementation                             : 128-bit integer (default) 
-   Checking for header stdint.h                                       : yes 
-   Checking for header inttypes.h                                     : yes 
-   Checking for header sys/inttypes.h                                 : not found 
-   Checking for header sys/types.h                                    : yes 
-   Checking for header sys/stat.h                                     : yes 
-   Checking for header dirent.h                                       : yes 
-   Checking for header stdlib.h                                       : yes 
-   Checking for header signal.h                                       : yes 
-   Checking for header pthread.h                                      : yes 
-   Checking for header stdint.h                                       : yes 
-   Checking for header inttypes.h                                     : yes 
-   Checking for header sys/inttypes.h                                 : not found 
-   Checking for library rt                                            : yes 
-   Checking for header sys/ioctl.h                                    : yes 
-   Checking for header net/if.h                                       : yes 
-   Checking for header net/ethernet.h                                 : yes 
-   Checking for header linux/if_tun.h                                 : yes 
-   Checking for header netpacket/packet.h                             : yes 
-   Checking for NSC location                                          : not found 
-   Checking for 'sqlite3'                                             : not found 
-   Checking for header linux/if_tun.h                                 : yes 
-   Checking for python module 'gi'                                    : 3.26.1 
-   Checking for python module 'gi.repository.GObject'                 : ok 
-   Checking for python module 'cairo'                                 : ok 
-   Checking for python module 'pygraphviz'                            : 1.4rc1 
-   Checking for python module 'gi.repository.Gtk'                     : ok 
-   Checking for python module 'gi.repository.Gdk'                     : ok 
-   Checking for python module 'gi.repository.Pango'                   : ok 
-   Checking for python module 'gi.repository.GooCanvas'               : ok 
-   Checking for program 'sudo'                                        : /usr/bin/sudo 
-   Checking for program 'valgrind'                                    : not found 
-   Checking for 'gsl'                                                 : not found 
-   python-config                                                      : not found 
-   Checking for compilation flag -fstrict-aliasing support            : ok 
-   Checking for compilation flag -fstrict-aliasing support            : ok 
-   Checking for compilation flag -Wstrict-aliasing support            : ok 
-   Checking for compilation flag -Wstrict-aliasing support            : ok 
-   Checking for program 'doxygen'                                     : /usr/bin/doxygen 
-   ---- Summary of optional NS-3 features:
-   Build profile                 : optimized
-   Build directory               : 
-   BRITE Integration             : not enabled (BRITE not enabled (see option --with-brite))
-   DES Metrics event collection  : not enabled (defaults to disabled)
-   Emulation FdNetDevice         : enabled
-   Examples                      : enabled
-   File descriptor NetDevice     : enabled
-   GNU Scientific Library (GSL)  : not enabled (GSL not found)
-   Gcrypt library                : not enabled (libgcrypt not found: you can use libgcrypt-config to find its location.)
-   GtkConfigStore                : not enabled (library 'gtk+-3.0 >= 3.0' not found)
-   MPI Support                   : not enabled (option --enable-mpi not selected)
-   NS-3 Click Integration        : not enabled (nsclick not enabled (see option --with-nsclick))
-   NS-3 OpenFlow Integration     : not enabled (Required boost libraries not found)
-   Network Simulation Cradle     : not enabled (NSC not found (see option --with-nsc))
-   PlanetLab FdNetDevice         : not enabled (PlanetLab operating system not detected (see option --force-planetlab))
-   PyViz visualizer              : enabled
-   Python API Scanning Support   : not enabled (Missing 'pygccxml' Python module)
-   Python Bindings               : enabled
-   Real Time Simulator           : enabled
-   SQlite stats data output      : not enabled (library 'sqlite3' not found)
-   Tap Bridge                    : enabled
-   Tap FdNetDevice               : enabled
-   Tests                         : enabled
-   Threading Primitives          : enabled
-   Use sudo to set suid bit      : not enabled (option --enable-sudo not selected)
-   XmlIo                         : enabled
-   'configure' finished successfully (6.387s)
 
 Note the last part of the above output.  Some |ns3| options are not enabled by
-default or require support from the underlying system to work properly.
-For instance, to enable XmlTo, the library libxml-2.0 must be found on the
-system.  If this library were not found, the corresponding |ns3| feature 
+default or require support from the underlying system to work properly (``OFF (not requested)``).
+Other options might depend on third-party libraries, which if not found will be disabled
+(``OFF(missing dependency)``).
+If this library were not found, the corresponding |ns3| feature 
 would not be enabled and a message would be displayed.  Note further that there is 
 a feature to use the program ``sudo`` to set the suid bit of certain programs.
 This is not enabled by default and so this feature is reported as "not enabled."
 Finally, to reprint this summary of which optional features are enabled, use
-the ``--check-config`` option to waf.
+the ``--check-config`` option to ns3.
 
 Now go ahead and switch back to the debug build that includes the examples and tests.
 
-.. sourcecode:: bash
+.. sourcecode:: console
 
-  $ ./waf clean
-  $ ./waf configure --build-profile=debug --enable-examples --enable-tests
+  $ ./ns3 clean
+  $ ./ns3 configure --build-profile=debug --enable-examples --enable-tests
 
 The build system is now configured and you can build the debug versions of 
 the |ns3| programs by simply typing:
 
-.. sourcecode:: bash
+.. sourcecode:: console
 
-  $ ./waf
+  $ ./ns3 build
 
 Although the above steps made you build the |ns3| part of the system twice,
 now you know how to change the configuration and build optimized code.
@@ -671,36 +716,35 @@
 A command exists for checking which profile is currently active
 for an already configured project:
 
-.. sourcecode:: bash
+.. sourcecode:: console
 
-  $ ./waf --check-profile
-  Waf: Entering directory \`/path/to/ns-allinone-3.35/ns-3.35/build\'
+  $ ./ns3 --check-profile
   Build profile: debug
 
 The build.py script discussed above supports also the ``--enable-examples``
 and ``enable-tests`` arguments, but in general, does not directly support
-other waf options; for example, this will not work:
+other ns3 options; for example, this will not work:
 
-.. sourcecode:: bash
+.. sourcecode:: console
 
   $ ./build.py --disable-python
 
 will result in:
 
-.. sourcecode:: bash
+.. sourcecode:: console
 
   build.py: error: no such option: --disable-python
 
 However, the special operator ``--`` can be used to pass additional
-options through to waf, so instead of the above, the following will work:
+options through to ns3, so instead of the above, the following will work:
 
-.. sourcecode:: bash
+.. sourcecode:: console
 
   $ ./build.py -- --disable-python   
 
-as it generates the underlying command ``./waf configure --disable-python``.
+as it generates the underlying command ``./ns3 configure --disable-python``.
 
-Here are a few more introductory tips about Waf.
+Here are a few more introductory tips about CMake.
 
 Handling build errors
 =====================
@@ -720,48 +764,48 @@
   /usr/include/gtk-2.0/gtk/gtkfilechooserbutton.h:59:8: error: unnecessary parentheses in declaration of â€˜__gtk_reserved1â€™ [-Werror=parentheses]
    void (*__gtk_reserved1);
 
-In releases starting with ns-3.28.1, an option is available in Waf to work
+In releases starting with ns-3.28.1, an option is available in CMake to work
 around these issues.  The option disables the inclusion of the '-Werror' 
 flag to g++ and clang++.  The option is '--disable-werror' and must be
 used at configure time; e.g.:
 
-.. sourcecode:: bash
+.. sourcecode:: console
 
-  ./waf configure --disable-werror --enable-examples --enable-tests
+  ./ns3 configure --disable-werror --enable-examples --enable-tests
 
 Configure vs. Build
 ===================
 
-Some Waf commands are only meaningful during the configure phase and some commands are valid
+Some CMake commands are only meaningful during the configure phase and some commands are valid
 in the build phase.  For example, if you wanted to use the emulation 
 features of |ns3|, you might want to enable setting the suid bit using
 sudo as described above.  This turns out to be a configuration-time command, and so 
 you could reconfigure using the following command that also includes the examples and tests.
 
-.. sourcecode:: bash
+.. sourcecode:: console
 
-  $ ./waf configure --enable-sudo --enable-examples --enable-tests
+  $ ./ns3 configure --enable-sudo --enable-examples --enable-tests
 
-If you do this, Waf will have run sudo to change the socket creator programs of the
+If you do this, ns3 will have run sudo to change the socket creator programs of the
 emulation code to run as root.
 
 There are many other configure- and build-time options
-available in Waf.  To explore these options, type:
+available in ns3.  To explore these options, type:
 
-.. sourcecode:: bash
+.. sourcecode:: console
 
-  $ ./waf --help
+  $ ./ns3 --help
 
 We'll use some of the testing-related commands in the next section.
 
 Build Profiles
 ==============
 
-We already saw how you can configure Waf for ``debug`` or ``optimized`` builds:
+We already saw how you can configure CMake for ``debug`` or ``optimized`` builds:
 
-.. sourcecode:: bash
+.. sourcecode:: console
 
-  $ ./waf --build-profile=debug
+  $ ./ns3 configure --build-profile=debug
 
 There is also an intermediate build profile, ``release``.  ``-d`` is a
 synonym for ``--build-profile``.
@@ -769,30 +813,30 @@
 The build profile controls the use of logging, assertions, and compiler optimization:
 
 .. table:: Build profiles
-    :widths: 10 28 30 32
+    :widths: 10 28 30 30 32
 
-    +----------+---------------------------------+-----------------------------------------------------------------+
-    | Feature  | Build Profile                                                                                     |
-    +          +---------------------------------+-------------------------------+---------------------------------+
-    |          | ``debug``                       | ``release``                   | ``optimized``                   |
-    +==========+=================================+===============================+=================================+
-    | Enabled  | |  ``NS3_BUILD_PROFILE_DEBUG``  | ``NS3_BUILD_PROFILE_RELEASE`` | ``NS3_BUILD_PROFILE_OPTIMIZED`` |
-    | Features | |  ``NS_LOG...``                |                               |                                 |
-    |          | |  ``NS_ASSERT...``             |                               |                                 |
-    +----------+---------------------------------+-------------------------------+---------------------------------+
-    | Code     | ``NS_BUILD_DEBUG(code)``        |  ``NS_BUILD_RELEASE(code)``   | ``NS_BUILD_OPTIMIZED(code)``    |
-    | Wrapper  |                                 |                               |                                 |
-    | Macro    |                                 |                               |                                 |
-    +----------+---------------------------------+-------------------------------+---------------------------------+
-    | Compiler | ``-O0 -ggdb -g3``               | ``-O3 -g0``                   | ``-O3 -g``                      |
-    | Flags    |                                 | ``-fomit-frame-pointer``      | ``-fstrict-overflow``           |
-    |          |                                 |                               | ``-march=native``               |
-    +----------+---------------------------------+-------------------------------+---------------------------------+
+    +----------+---------------------------------------------------------------------------------------------------------------------------------+
+    | Feature  | Build Profile                                                                                                                   |
+    +          +---------------------------------+-----------------------------+-------------------------------+---------------------------------+
+    |          | ``debug``                       | ``default``                 | ``release``                   | ``optimized``                   |
+    +==========+=================================+=============================+===============================+=================================+
+    | Enabled  | ``NS3_BUILD_PROFILE_DEBUG``     | ``NS3_BUILD_PROFILE_DEBUG`` | ``NS3_BUILD_PROFILE_RELEASE`` | ``NS3_BUILD_PROFILE_OPTIMIZED`` |
+    | Features | ``NS_LOG...``                   | ``NS_LOG...``               |                               |                                 |
+    |          | ``NS_ASSERT...``                | ``NS_ASSERT...``            |                               |                                 |
+    +----------+---------------------------------+-----------------------------+-------------------------------+---------------------------------+
+    | Code     | ``NS_BUILD_DEBUG(code)``        | ``NS_BUILD_DEBUG(code)``    | ``NS_BUILD_RELEASE(code)``    | ``NS_BUILD_OPTIMIZED(code)``    |
+    | Wrapper  |                                 |                             |                               |                                 |
+    | Macro    |                                 |                             |                               |                                 |
+    +----------+---------------------------------+-----------------------------+-------------------------------+---------------------------------+
+    | Compiler | ``-Og -g``                      | ``-O2 -g``                  | ``-O3``                       | ``-O3``                         |
+    | Flags    |                                 |                             |                               | ``-march=native``               |
+    |          |                                 |                             |                               | ``-mtune=native``               |
+    +----------+---------------------------------+-----------------------------+-------------------------------+---------------------------------+
     
 As you can see, logging and assertions are only configured
 by default in debug builds, although they can be selectively enabled
 in other build profiles by using the ``--enable-logs`` and 
-``--enable-asserts`` flags during Waf configuration time.
+``--enable-asserts`` flags during CMake configuration time.
 Recommended practice is to develop your scenario in debug mode, then
 conduct repetitive runs (for statistics or changing parameters) in
 optimized build profile.
@@ -806,66 +850,66 @@
   DoLongInvolvedComputation ();
   NS_BUILD_DEBUG (timer.Stop (); std::cout << "Done: " << timer << std::endl;)
 
-By default Waf puts the build artifacts in the ``build`` directory.  
+By default ns3 puts the build artifacts in the ``build`` directory.
 You can specify a different output directory with the ``--out``
 option, e.g.
 
-.. sourcecode:: bash
+.. sourcecode:: console
 
-  $ ./waf configure --out=my-build-dir
+  $ ./ns3 configure --out=my-build-dir
 
 Combining this with build profiles lets you switch between the different
 compile options in a clean way:
 
-.. sourcecode:: bash
+.. sourcecode:: console
 
-  $ ./waf configure --build-profile=debug --out=build/debug
-  $ ./waf build
+  $ ./ns3 configure --build-profile=debug --out=build/debug
+  $ ./ns3 build
   ...
-  $ ./waf configure --build-profile=optimized --out=build/optimized
-  $ ./waf build
+  $ ./ns3 configure --build-profile=optimized --out=build/optimized
+  $ ./ns3 build
   ...
 
 This allows you to work with multiple builds rather than always
-overwriting the last build.  When you switch, Waf will only compile
+overwriting the last build.  When you switch, ns3 will only compile
 what it has to, instead of recompiling everything.
 
 When you do switch build profiles like this, you have to be careful
 to give the same configuration parameters each time.  It may be convenient
 to define some environment variables to help you avoid mistakes:
 
-.. sourcecode:: bash
+.. sourcecode:: console
 
   $ export NS3CONFIG="--enable-examples --enable-tests"
   $ export NS3DEBUG="--build-profile=debug --out=build/debug"
   $ export NS3OPT=="--build-profile=optimized --out=build/optimized"
 
-  $ ./waf configure $NS3CONFIG $NS3DEBUG
-  $ ./waf build
+  $ ./ns3 configure $NS3CONFIG $NS3DEBUG
+  $ ./ns3 build
   ...
-  $ ./waf configure $NS3CONFIG $NS3OPT
-  $ ./waf build
+  $ ./ns3 configure $NS3CONFIG $NS3OPT
+  $ ./ns3 build
 
 Compilers and Flags
 ===================
 
-In the examples above, Waf uses the GCC C++ compiler, ``g++``, for
-building |ns3|. However, it's possible to change the C++ compiler used by Waf
+In the examples above, CMake uses the GCC C++ compiler, ``g++``, for
+building |ns3|. However, it's possible to change the C++ compiler used by CMake
 by defining the ``CXX`` environment variable.
 For example, to use the Clang C++ compiler, ``clang++``,
 
-.. sourcecode:: bash
+.. sourcecode:: console
 
-  $ CXX="clang++" ./waf configure
-  $ ./waf build
+  $ CXX="clang++" ./ns3 configure
+  $ ./ns3 build
 
-One can also set up Waf to do distributed compilation with ``distcc`` in
+One can also set up ns3 to do distributed compilation with ``distcc`` in
 a similar way:
 
-.. sourcecode:: bash
+.. sourcecode:: console
 
-  $ CXX="distcc g++" ./waf configure
-  $ ./waf build
+  $ CXX="distcc g++" ./ns3 configure
+  $ ./ns3 build
 
 More info on ``distcc`` and distributed compilation can be found on it's
 `project page
@@ -878,19 +922,19 @@
 Install
 =======
 
-Waf may be used to install libraries in various places on the system.
+ns3 may be used to install libraries in various places on the system.
 The default location where libraries and executables are built is
-in the ``build`` directory, and because Waf knows the location of these
+in the ``build`` directory, and because ns3 knows the location of these
 libraries and executables, it is not necessary to install the libraries
 elsewhere.
 
 If users choose to install things outside of the build directory, users
-may issue the ``./waf install`` command.  By default, the prefix for
-installation is ``/usr/local``, so ``./waf install`` will install programs
+may issue the ``./ns3 install`` command.  By default, the prefix for
+installation is ``/usr/local``, so ``./ns3 install`` will install programs
 into ``/usr/local/bin``, libraries into ``/usr/local/lib``, and headers
 into ``/usr/local/include``.  Superuser privileges are typically needed
 to install to the default prefix, so the typical command would be
-``sudo ./waf install``.  When running programs with Waf, Waf will
+``sudo ./ns3 install``.  When running programs with ns3, ns3 will
 first prefer to use shared libraries in the build directory, then 
 will look for libraries in the library path configured in the local
 environment.  So when installing libraries to the system, it is good
@@ -899,31 +943,31 @@
 Users may choose to install to a different prefix by passing the ``--prefix``
 option at configure time, such as::
 
-  ./waf configure --prefix=/opt/local
+  ./ns3 configure --prefix=/opt/local
 
-If later after the build the user issues the ``./waf install`` command, the 
+If later after the build the user issues the ``./ns3 install`` command, the
 prefix ``/opt/local`` will be used.
 
-The ``./waf clean`` command should be used prior to reconfiguring 
-the project if Waf will be used to install things at a different prefix.
+The ``./ns3 clean`` command should be used prior to reconfiguring
+the project if ns3 will be used to install things at a different prefix.
 
-In summary, it is not necessary to call ``./waf install`` to use |ns3|.
-Most users will not need this command since Waf will pick up the
+In summary, it is not necessary to call ``./ns3 install`` to use |ns3|.
+Most users will not need this command since ns3 will pick up the
 current libraries from the ``build`` directory, but some users may find 
 it useful if their use case involves working with programs outside
 of the |ns3| directory.
 
-One Waf
+One ns3
 =======
 
-There is only one Waf script, at the top level of the |ns3| source tree.
+There is only one ns3 script, at the top level of the |ns3| source tree.
 As you work, you may find yourself spending a lot of time in ``scratch/``,
-or deep in ``src/...``, and needing to invoke Waf.  You could just
-remember where you are, and invoke Waf like this:
+or deep in ``src/...``, and needing to invoke ns3.  You could just
+remember where you are, and invoke ns3 like this:
 
-.. sourcecode:: bash
+.. sourcecode:: console
 
-  $ ../../../waf ...
+  $ ../../../ns3 ...
 
 but that gets tedious, and error prone, and there are better solutions.
 
@@ -933,19 +977,283 @@
 
 If you only have the tarball, an environment variable can help:
 
-.. sourcecode:: bash
+.. sourcecode:: console
 
   $ export NS3DIR="$PWD"
-  $ function waff { cd $NS3DIR && ./waf $* ; }
+  $ function ns3f { cd $NS3DIR && ./ns3 $* ; }
 
   $ cd scratch
-  $ waff build
+  $ ns3f build
 
-It might be tempting in a module directory to add a trivial ``waf``
-script along the lines of ``exec ../../waf``.  Please don't.  It's
+It might be tempting in a module directory to add a trivial ``ns3``
+script along the lines of ``exec ../../ns3``.  Please don't.  It's
 confusing to newcomers, and when done poorly it leads to subtle build
 errors.  The solutions above are the way to go.
 
+Building with CMake
++++++++++++++++++++++++
+
+The ns3 wrapper script calls CMake directly, mapping Waf-like options
+to the verbose settings used by CMake. Calling ``./ns3`` will execute
+a series of commands, that will be shown at the end of their execution.
+The execution of those underlying commands can be skipped to just
+print them using ``./ns3 --dry-run``.
+
+Here is are a few examples showing why we suggest the use of the ns3 wrapper script.
+
+Configuration command
+=====================
+
+.. sourcecode:: console
+
+  $ ./ns3 configure --enable-tests --enable-examples -d optimized
+
+Corresponds to
+
+.. sourcecode:: console
+
+  $ cd /ns-3-dev/cmake-cache/
+  $ cmake -DCMAKE_BUILD_TYPE=release -DNS3_NATIVE_OPTIMIZATIONS=ON -DNS3_ASSERT=OFF -DNS3_LOG=OFF -DNS3_TESTS=ON -DNS3_EXAMPLES=ON ..
+
+Build command
+=============
+
+To build a specific target such as ``test-runner`` we use the following ns3 command:
+
+.. sourcecode:: console
+
+  $ ./ns3 build test-runner
+
+Which corresponds to the following commands:
+
+.. sourcecode:: console
+
+  $ cd /ns-3-dev/cmake-cache/
+  $ cmake --build . -j 16 --target test-runner # This command builds the test-runner target with the underlying build system
+
+
+To build all targets such as modules, examples and tests, we use the following ns3 command:
+
+.. sourcecode:: console
+
+  $ ./ns3 build
+
+Which corresponds to:
+
+.. sourcecode:: console
+
+  $ cd /ns-3-dev/cmake-cache/
+  $ cmake --build . -j 16  # This command builds all the targets with the underlying build system
+
+Run command
+===========
+
+.. sourcecode:: console
+
+  $ ./ns3 run test-runner
+
+Corresponds to:
+
+.. sourcecode:: console
+
+  $ cd /ns-3-dev/cmake-cache/
+  $ cmake --build . -j 16 --target test-runner # This command builds the test-runner target calling the underlying build system
+  $ export PATH=$PATH:/ns-3-dev/build/:/ns-3-dev/build/lib:/ns-3-dev/build/bindings/python # export library paths
+  $ export LD_LIBRARY_PATH=/ns-3-dev/build/:/ns-3-dev/build/lib:/ns-3-dev/build/bindings/python
+  $ export PYTHON_PATH=/ns-3-dev/build/:/ns-3-dev/build/lib:/ns-3-dev/build/bindings/python
+  $ /ns-3-dev/build/utils/ns3-dev-test-runner-optimized # call the executable with the real path
+
+Note: the command above would fail if ``./ns3 build`` was not executed first,
+since the examples won't be built by the test-runner target.
+
+Building with IDEs
+++++++++++++++++++
+
+With CMake, IDE integration is much easier. We list the steps on how to use ns-3 with a few IDEs.
+
+Microsoft Visual Code
+=====================
+
+Start by downloading `VS Code <https://code.visualstudio.com/>`_.
+
+Then install it and then install the CMake and C++ plugins.
+
+This can be done accessing the extensions' menu button on the left.
+
+.. figure:: figures/vscode/install_cmake_tools.png
+
+.. figure:: figures/vscode/install_cpp_tools.png
+
+It will take a while, but it will locate the available toolchains for you to use.
+
+After that, open the ns-3-dev folder. It should run CMake automatically and preconfigure it.
+
+.. figure:: figures/vscode/open_project.png
+
+After this happens, you can choose ns-3 features by opening the CMake cache and toggling them on or off.
+
+.. figure:: figures/vscode/open_cmake_cache.png
+
+.. figure:: figures/vscode/configure_ns3.png
+
+Just as an example, here is how to enable examples
+
+.. figure:: figures/vscode/enable_examples_and_save_to_reload_cache.png
+
+After saving the cache, CMake will run, refreshing the cache. Then VsCode will update its
+list of targets on the left side of the screen in the CMake menu.
+
+After selecting a target on the left side menu, there are options to build, run or debug it.
+
+.. figure:: figures/vscode/select_target_build_and_debug.png
+
+Any of them will automatically build the selected target.
+If you choose run or debug, the executable targets will be executed.
+You can open the source files you want, put some breakpoints and then click debug to visually debug programs.
+
+.. figure:: figures/vscode/debugging.png
+
+JetBrains CLion
+===============
+
+Start by downloading `CLion <https://www.jetbrains.com/clion/>`_.
+
+
+The following image contains the toolchain configuration window for
+CLion running on Windows (only WSLv2 is currently supported).
+
+.. figure:: figures/clion/toolchains.png
+
+CLion uses Makefiles for your platform as the default generator.
+Here you can choose a better generator like `ninja` by setting the cmake options flag to `-G Ninja`.
+You can also set options to enable examples (`-DNS3_EXAMPLES=ON`) and tests (`-DNS3_TESTS=ON`).
+
+.. figure:: figures/clion/cmake_configuration.png
+
+To refresh the CMake cache, triggering the discovery of new targets (libraries, executables and/or modules),
+you can either configure to re-run CMake automatically after editing CMake files (pretty slow and easily
+triggered) or reload it manually. The following image shows how to trigger the CMake cache refresh.
+
+.. figure:: figures/clion/reload_cache.png
+
+After configuring the project, the available targets are listed in a drop-down list on the top right corner.
+Select the target you want and then click the hammer symbol to build, as shown in the image below.
+
+.. figure:: figures/clion/build_targets.png
+
+If you have selected and executable target, you can click either the play button to execute the program;
+the bug to debug the program; the play button with a chip, to run Valgrind and analyze memory usage,
+leaks and so on.
+
+.. figure:: figures/clion/run_target.png
+
+Code::Blocks
+============
+
+Start by installing `Code::Blocks <https://www.codeblocks.org/>`_.
+
+Code::Blocks does not support CMake project natively, but we can use the corresponding CMake
+generator to generate a project in order to use it. The generator name depends on the operating
+system and underlying build system. https://cmake.org/cmake/help/latest/generator/CodeBlocks.html
+
+.. sourcecode:: console
+
+  $ ./ns3 configure -G"CodeBlocks - Ninja" --enable-examples
+
+  ...
+
+  $ -- Build files have been written to: /ns-3-dev/cmake-cache
+
+
+There will be a NS3.cbp file inside the cache folder used during configuration (in this case cmake-cache).
+This is a Code::Blocks project file that can be opened by the IDE.
+
+When you first open the IDE, you will be greeted by a window asking you to select the compiler you want.
+
+.. figure:: figures/codeblocks/compiler_detection.png
+
+After that you will get into the landing page where you can open the project.
+
+.. figure:: figures/codeblocks/landing.png
+
+Loading it will take a while.
+
+.. figure:: figures/codeblocks/open_project.png
+
+After that we can select a target in the top menu (where it says "all") and click to build, run or debug.
+We can also set breakpoints on the source code.
+
+.. figure:: figures/codeblocks/breakpoint_and_debug.png
+
+After clicking to build, the build commands of the underlying build system will be printed in the tab at the bottom.
+If you clicked to debug, the program will start automatically and stop at the first breakpoint.
+
+.. figure:: figures/codeblocks/build_finished_breakpoint_waiting.png
+
+You can inspect memory and the current stack enabling those views in Debug->Debugging Windows->Watches and Call Stack.
+Using the debugging buttons, you can advance line by line, continue until the next breakpoint.
+
+.. figure:: figures/codeblocks/debug_watches.png
+
+Note: as Code::Blocks doesn't natively support CMake projects, it doesn't refresh the CMake cache, which means you
+will need to close the project, run the ``./ns3`` command to refresh the CMake caches after adding/removing
+source files to/from the CMakeLists.txt files, adding a new module or dependencies between modules.
+
+Apple XCode
+============
+
+Start by installing `XCode <https://developer.apple.com/xcode/>`_.
+Then open it for the first time and accept the license.
+Then open Xcode->Preferences->Locations and select the command-line tools location.
+
+.. figure:: figures/xcode/select_command_line.png
+
+XCode does not support CMake project natively, but we can use the corresponding CMake
+generator to generate a project in order to use it. The generator name depends on the operating
+system and underlying build system. https://cmake.org/cmake/help/latest/generator/Xcode.html
+
+.. sourcecode:: console
+
+  $ ./ns3 configure -GXcode --enable-examples
+
+  ...
+
+  $ -- Build files have been written to: /ns-3-dev/cmake-cache
+
+
+There will be a NS3.xcodeproj file inside the cache folder used during configuration
+(in this case cmake-cache). This is a XCode project file that can be opened by the IDE.
+
+Loading the project will take a while, and you will be greeted with the following prompt.
+Select to automatically create the schemes.
+
+.. figure:: figures/xcode/create_schemes.png
+
+After that we can select a target in the top menu and click to run, which will build and run
+(if executable, or debug if build with debugging symbols).
+
+.. figure:: figures/xcode/target_dropdown.png
+
+After clicking to build, the build will start and progress is shown in the top bar.
+
+.. figure:: figures/xcode/select_target_and_build.png
+
+Before debugging starts, Xcode will request for permissions to attach to the process
+(as an attacker could pretend to be a debugging tool and steal data from other processes).
+
+.. figure:: figures/xcode/debug_permission_to_attach.png
+
+After attaching, we are greeted with profiling information and call stack on the left panel,
+source code, breakpoint and warnings on the central panel. At the bottom there are the memory
+watches panel in the left and the output panel on the right, which is also used to read the command line.
+
+.. figure:: figures/xcode/profiling_stack_watches_output.png
+
+
+Note: as XCode doesn't natively support CMake projects, it doesn't refresh the CMake cache, which means you
+will need to close the project, run the ``./ns3`` command to refresh the CMake caches after adding/removing
+source files to/from the CMakeLists.txt files, adding a new module or dependencies between modules.
+
 
 Testing ns-3
 ************
@@ -953,11 +1261,11 @@
 You can run the unit tests of the |ns3| distribution by running the 
 ``./test.py`` script:
 
-.. sourcecode:: bash
+.. sourcecode:: console
 
-  $ ./test.py
+  $ ./test.py --no-build
 
-These tests are run in parallel by Waf. You should eventually
+These tests are run in parallel by ns3. You should eventually
 see a report saying that
 
 .. sourcecode:: text
@@ -968,60 +1276,70 @@
 errors indicate problems with the code or incompatibilities between the
 tools and the code.
 
-You will also see the summary output from Waf and the test runner
-executing each test, which will actually look something like::
+You will also see the summary output from ns3 and the test runner
+executing each test, which will actually look something like:
 
-  Waf: Entering directory `/path/to/workspace/ns-3-allinone/ns-3-dev/build'
-  Waf: Leaving directory `/path/to/workspace/ns-3-allinone/ns-3-dev/build'
-  'build' finished successfully (1.799s)
-  
-  Modules built: 
-  aodv                      applications              bridge
-  click                     config-store              core
-  csma                      csma-layout               dsdv
-  emu                       energy                    flow-monitor
-  internet                  lte                       mesh
-  mobility                  mpi                       netanim
-  network                   nix-vector-routing        ns3tcp
-  ns3wifi                   olsr                      openflow
-  point-to-point            point-to-point-layout     propagation
-  spectrum                  stats                     tap-bridge
-  template                  test                      tools
-  topology-read             uan                       virtual-net-device
-  visualizer                wifi                      wimax
+.. sourcecode:: console
 
-  PASS: TestSuite wifi-interference
-  PASS: TestSuite histogram
+  -- CCache is enabled
+  -- The CXX compiler identification is GNU 11.2.0
+  -- The C compiler identification is GNU 11.2.0
 
   ...
 
-  PASS: TestSuite object
-  PASS: TestSuite random-number-generators
-  92 of 92 tests passed (92 passed, 0 failed, 0 crashed, 0 valgrind errors)
+  -- Configuring done
+  -- Generating done
+  -- Build files have been written to: /ns-3-dev/cmake-cache
+
+  ...
+  Scanning dependencies of target tap-creator
+  [  1%] Building CXX object src/fd-net-device/CMakeFiles/tap-device-creator.dir/helper/tap-device-creator.cc.o
+  [  1%] Building CXX object src/tap-bridge/CMakeFiles/tap-creator.dir/model/tap-creator.cc.o
+  [  1%] Building CXX object src/fd-net-device/CMakeFiles/raw-sock-creator.dir/helper/creator-utils.cc.o
+  [  1%] Building CXX object src/tap-bridge/CMakeFiles/tap-creator.dir/model/tap-encode-decode.cc.o
+  [  1%] Linking CXX executable ../../../build/src/fd-net-device/ns3-dev-tap-device-creator
+
+   ...
+
+  [100%] Linking CXX executable ../../../build/examples/matrix-topology/ns3-dev-matrix-topology
+  [100%] Built target manet-routing-compare
+  [100%] Built target matrix-topology
+  [1/742] PASS: TestSuite aodv-routing-id-cache
+  [2/742] PASS: TestSuite routing-aodv
+  [3/742] PASS: TestSuite uniform-planar-array-test
+  [4/742] PASS: TestSuite angles
+
+  ...
+
+  [740/742] PASS: Example src/wifi/examples/wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-6GHz --serverChannelWidth=160 --clientChannelWidth=160 --serverShortGuardInterval=3200 --clientShortGuardInterval=3200 --serverNss=4 --clientNss=4 --stepTime=0.1
+  [741/742] PASS: Example src/lte/examples/lena-radio-link-failure --numberOfEnbs=2 --useIdealRrc=0 --interSiteDistance=700 --simTime=17
+  [742/742] PASS: Example src/lte/examples/lena-radio-link-failure --numberOfEnbs=2 --interSiteDistance=700 --simTime=17
+  739 of 742 tests passed (739 passed, 3 skipped, 0 failed, 0 crashed, 0 valgrind errors)
+
 
 This command is typically run by users to quickly verify that an 
 |ns3| distribution has built correctly.  (Note the order of the ``PASS: ...``
 lines can vary, which is okay.  What's important is that the summary line at
 the end report that all tests passed; none failed or crashed.)
 
-Both Waf and ``test.py`` will split up the job on the available CPU cores
+Both ns3 and ``test.py`` will split up the job on the available CPU cores
 of the machine, in parallel.
 
 Running a Script
 ****************
 
-We typically run scripts under the control of Waf.  This allows the build 
+We typically run scripts under the control of ns3.  This allows the build
 system to ensure that the shared library paths are set correctly and that
 the libraries are available at run time.  To run a program, simply use the
-``--run`` option in Waf.  Let's run the |ns3| equivalent of the
+``--run`` option in ns3.  Let's run the |ns3| equivalent of the
 ubiquitous hello world program by typing the following:
 
-.. sourcecode:: bash
+.. sourcecode:: console
 
-  $ ./waf --run hello-simulator
+  $ ./ns3 run hello-simulator
 
-Waf first checks to make sure that the program is built correctly and 
-executes a build if required.  Waf then executes the program, which 
+ns3 first checks to make sure that the program is built correctly and
+executes a build if required.  ns3 then executes the program, which
 produces the following output.
 
 .. sourcecode:: text
@@ -1032,10 +1350,10 @@
 
 **What do I do if I don't see the output?**
 
-If you see Waf messages indicating that the build was 
+If you see ns3 messages indicating that the build was
 completed successfully, but do not see the "Hello Simulator" output, 
 chances are that you have switched your build mode to ``optimized`` in 
-the `Building with Waf`_ section, but have missed the change back to 
+the `Building with the ns3 CMake wrapper`_ section, but have missed the change back to
 ``debug`` mode.  All of the console output used in this tutorial uses a 
 special |ns3| logging component that is useful for printing 
 user messages to the console.  Output from this component is 
@@ -1043,17 +1361,17 @@
 "optimized out."  If you don't see the "Hello Simulator" output,
 type the following:
 
-.. sourcecode:: bash
+.. sourcecode:: console
 
-  $ ./waf configure --build-profile=debug --enable-examples --enable-tests
+  $ ./ns3 configure --build-profile=debug --enable-examples --enable-tests
 
-to tell Waf to build the debug versions of the |ns3| 
+to tell ns3 to build the debug versions of the |ns3|
 programs that includes the examples and tests.  You must still build 
 the actual debug version of the code by typing
 
-.. sourcecode:: bash
+.. sourcecode:: console
 
-  $ ./waf
+  $ ./ns3
 
 Now, if you run the ``hello-simulator`` program, you should see the 
 expected output.
@@ -1063,14 +1381,14 @@
 
 To feed command line arguments to an |ns3| program use this pattern:
 
-.. sourcecode:: bash
+.. sourcecode:: console
 
-  $ ./waf --run <ns3-program> --command-template="%s <args>"
+  $ ./ns3 run <ns3-program> --command-template="%s <args>"
 
 Substitute your program name for ``<ns3-program>``, and the arguments
-for ``<args>``.  The ``--command-template`` argument to Waf is
-basically a recipe for constructing the actual command line Waf should use
-to execute the program.  Waf checks that the build is complete,
+for ``<args>``.  The ``--command-template`` argument to ns3 is
+basically a recipe for constructing the actual command line ns3 should use
+to execute the program.  ns3 checks that the build is complete,
 sets the shared library paths, then invokes the executable
 using the provided command line template, 
 inserting the program name for the ``%s`` placeholder.
@@ -1079,9 +1397,9 @@
 exists, which is to include the |ns3| program and its arguments enclosed
 by single quotes, such as:
 
-.. sourcecode:: bash
+.. sourcecode:: console
 
-  $ ./waf --run '<ns3-program> --arg1=value1 --arg2=value2 ...'
+  $ ./ns3 run '<ns3-program> --arg1=value1 --arg2=value2 ...'
 
 Another particularly useful example is to run a test suite by itself.
 Let's assume that a ``mytest`` test suite exists (it doesn't).
@@ -1089,17 +1407,17 @@
 tests in parallel, by repeatedly invoking the real testing program,
 ``test-runner``.  To invoke ``test-runner`` directly for a single test:
 
-.. sourcecode:: bash
+.. sourcecode:: console
 
-  $ ./waf --run test-runner --command-template="%s --suite=mytest --verbose"
+  $ ./ns3 run test-runner --command-template="%s --suite=mytest --verbose"
 
 This passes the arguments to the ``test-runner`` program.
 Since ``mytest`` does not exist, an error message will be generated.
 To print the available ``test-runner`` options:
 
-.. sourcecode:: bash
+.. sourcecode:: console
 
-  $ ./waf --run test-runner --command-template="%s --help"
+  $ ./ns3 run test-runner --command-template="%s --help"
 
 Debugging
 +++++++++
@@ -1111,9 +1429,9 @@
 For example, to run your |ns3| program ``hello-simulator`` with the arguments
 ``<args>`` under the ``gdb`` debugger:
 
-.. sourcecode:: bash
+.. sourcecode:: console
 
-  $ ./waf --run=hello-simulator --command-template="gdb %s --args <args>"
+  $ ./ns3 run=hello-simulator --command-template="gdb %s --args <args>"
 
 Notice that the |ns3| program name goes with the ``--run`` argument,
 and the control utility (here ``gdb``) is the first token
@@ -1126,60 +1444,43 @@
 We can combine this recipe and the previous one to run a test under the
 debugger:
 
-.. sourcecode:: bash
+.. sourcecode:: console
 
-  $ ./waf --run test-runner --command-template="gdb %s --args --suite=mytest --verbose"
+  $ ./ns3 run test-runner --command-template="gdb %s --args --suite=mytest --verbose"
 
 Working Directory
 +++++++++++++++++
 
-Waf needs to run from its location at the top of the |ns3| tree.
+ns3 needs to run from its location at the top of the |ns3| tree.
 This becomes the working directory where output files will be written.
 But what if you want to keep those files out of the |ns3| source tree?  Use
 the ``--cwd`` argument:
 
-.. sourcecode:: bash
-
-  $ ./waf --cwd=...
-
-It may be more convenient to start with your working directory where
-you want the output files, in which case a little indirection can help:
-
-.. sourcecode:: bash
+.. sourcecode:: console
 
-  $ function waff {
-      CWD="$PWD"
-      cd $NS3DIR >/dev/null
-      ./waf --cwd="$CWD" $*
-      cd - >/dev/null
-    }
-
-This embellishment of the previous version saves the current working directory,
-``cd``'s to the Waf directory, then instructs Waf to change the working
-directory *back* to the saved current working directory before running the
-program.
+  $ ./ns3 run program-name --cwd=...
 
 We mention this ``--cwd`` command for completeness; most users will simply
-run Waf from the top-level directory and generate the output data files there.
+run ns3 from the top-level directory and generate the output data files there.
 
 Running without Building
 ++++++++++++++++++++++++
 
-As of the ns-3.30 release, a new Waf option was introduced to allow the
+As of the ns-3.30 release, a new ns3 option was introduced to allow the
 running of programs while skipping the build step.  This can reduce the time
 to run programs when, for example, running the same program repeatedly
 through a shell script, or when demonstrating program execution. 
-This option, ``--run-no-build``, behaves the same as the ``-run`` option, 
-except that the program and ns-3 libraries will not be rebuilt.
+The option ``--no-build`` modifies the ``run`` option,
+skipping the build steps of the program and required ns-3 libraries.
 
-.. sourcecode:: bash
+.. sourcecode:: console
 
-  $ ./waf --run-no-build '<ns3-program> --arg1=value1 --arg2=value2 ...'
+  $ ./ns3 run '<ns3-program> --arg1=value1 --arg2=value2 ...' --no-build
 
 Build version
 +++++++++++++
 
-As of the ns-3.32 release, a new Waf configure option ``--enable-build-version`` 
+As of the ns-3.32 release, a new ns3 configure option ``--enable-build-version``
 was introduced which inspects the local ns3 git repository during builds and adds 
 version metadata to the core module. 
 
@@ -1196,14 +1497,14 @@
 If these prerequisites are not met, the configuration will fail.
 
 When these prerequisites are met and ns-3 is configured with the 
-``--enable-build-version`` option, the waf command ``--check-version`` can be 
+``--enable-build-version`` option, the ns3 command ``--check-version`` can be
 used to query the local git repository and display the current version metadata. 
 
-.. sourcecode:: bash
+.. sourcecode:: console
 
-  $ ./waf --check-version
+  $ ./ns3 --check-version
 
-Waf will collect information about the build and print out something similar
+ns3 will collect information about the build and print out something similar
 to the output below.
 
 .. sourcecode:: text
@@ -1256,7 +1557,7 @@
 
 profile
   The build profile specified in the ``--build-profile`` option passed to 
-  ``waf configure``
+  ``ns3 configure``
 
 A new class, named Version, has been added to the core module.  The Version class 
 contains functions to retrieve individual fields of the build version as well 
@@ -1295,8 +1596,7 @@
 
 .. sourcecode:: text
 
-  ./waf --run-no-build "command-line-example --version"
-  Waf: Entering directory `/g/g14/mdb/gitlab/mdb/ns-3-dev/build/debug'
+  ./ns3 run "command-line-example --version" --no-build
   ns-3.33+249@g80e0dd0-dirty-debug
 
 If the ``--enable-build-version`` option was not configured, ``--version``
@@ -1314,7 +1614,7 @@
 The resulting text file can then be saved with any corresponding
 |ns3| simulation results.
 
-.. sourcecode:: bash
+.. sourcecode:: console
 
   echo `git describe` > version.txt
   gitDiff=`git diff`
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/doc/tutorial/source/introduction.rst ns-3.36/doc/tutorial/source/introduction.rst
--- ns-3.35/doc/tutorial/source/introduction.rst	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/doc/tutorial/source/introduction.rst	2022-04-30 18:23:57.718732800 -0700
@@ -112,16 +112,6 @@
   Some limitations found in |ns2| (such as supporting multiple types of
   interfaces on nodes correctly) have been remedied in |ns3|.
 
-|ns2| has a more diverse set of contributed modules than does |ns3|, owing to
-its long history.  However, |ns3| has more detailed models in several
-popular areas of research (including sophisticated LTE and WiFi models),
-and its support of implementation code admits a very wide spectrum
-of high-fidelity models.  Users may be surprised to learn that the
-whole Linux networking stack can be encapsulated in an |ns3| node,
-using the Direct Code Execution (DCE) framework.  |ns2|
-models can sometimes be ported to |ns3|, particularly if they have been
-implemented in C++.  
-
 If in doubt, a good guideline would be to look at both simulators (as
 well as other simulators), and in particular the models available
 for your research, but keep in mind that your experience may be better
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/doc/tutorial/source/quick-start.rst ns-3.36/doc/tutorial/source/quick-start.rst
--- ns-3.35/doc/tutorial/source/quick-start.rst	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/doc/tutorial/source/quick-start.rst	2022-04-30 18:23:57.718732800 -0700
@@ -33,10 +33,10 @@
 Prerequisites
 *************
 |ns3| has various optional extensions, but the main features just require
-a C++ compiler (g++ or clang++) and Python (version 3.6 or above); the
-Python is needed for the build system.  We focus in this chapter only on
-getting |ns3| up and running on a system supported by a recent C++ compiler
-and Python runtime support.
+a C++ compiler (g++ or clang++), Python (version 3.6 or above), CMake and
+a build-system (e.g. make, ninja, Xcode).
+We focus in this chapter only on getting |ns3| up and running on a system
+supported by a recent C++ compiler and Python runtime support.
 
 For Linux, use either g++ or clang++ compilers.  For macOS, use clang++ 
 (available in Xcode or Xcode Command Line Tools).  For Windows, we recommend
@@ -61,16 +61,17 @@
 
    ::
 
-    $ tar xjf ns-allinone-3.35.tar.bz2
+    $ tar xjf ns-allinone-3.36.tar.bz2
 
 3) Change into the |ns3| directory directly; e.g.
 
    ::
 
-    $ cd ns-allinone-3.35/ns-3.35
+    $ cd ns-allinone-3.36/ns-3.36
 
 The ns-allinone directory has some additional components but we are skipping
 over them here; one can work directly from the |ns3| source code directory.
+The rest of the tutorial describes the additional components.
 
 Cloning ns-3 from GitLab.com
 ++++++++++++++++++++++++++++
@@ -88,32 +89,34 @@
 
   $ cd ns-3-dev
 
-If instead you want to try the most recent release (version 3.35 as of this
+If instead you want to try the most recent release (version 3.36 as of this
 writing), you can checkout a branch corresponding to that git tag:
 
 ::
 
-  $ git checkout -b ns-3.35-branch ns-3.35
+  $ git checkout -b ns-3.36-branch ns-3.36
 
 Building and testing ns-3
 *************************
 
 Once you have obtained the source either by downloading a release or by
 cloning a Git repository, the next step is to
-configure the build using the *Waf* build system that comes with |ns3|.  There
+configure the build using the *CMake* build system.  The below
+commands make use of a Python wrapper around CMake, called ``ns3``, that
+simplifies the command-line syntax, resembling *Waf* syntax.  There
 are several options to control the build, but enabling the example programs
-and the tests, for a default debug build profile (with debugging symbols
+and the tests, for a default build profile (with asserts enabled and
 and support for |ns3| logging) is what is usually done at first:
 
 ::
 
-  $ ./waf configure --enable-examples --enable-tests
+  $ ./ns3 configure --enable-examples --enable-tests
 
-Then, use Waf to build |ns3|:
+Then, use ``ns3`` to build |ns3|:
 
 ::
 
-  $ ./waf build
+  $ ./ns3 build
 
 Once complete, you can run the unit tests to check your build:
 
@@ -125,18 +128,18 @@
 working |ns3| simulator.  From here, you can start to
 run programs (look in the examples directory).  To run the first tutorial
 program, whose source code is located at `examples/tutorial/first.cc`, 
-use Waf to run it (by doing so, the |ns3| shared libraries are found
+use ns3 to run it (by doing so, the |ns3| shared libraries are found
 automatically):
 
 ::
 
-  $ ./waf --run first
+  $ ./ns3 run first
 
 To view possible command-line options, specify the `--PrintHelp` argument:
 
 ::
 
-  $ ./waf --run 'first --PrintHelp'
+  $ ./ns3 run 'first --PrintHelp'
 
 To continue reading about the conceptual model and architecture of |ns3|,
 the tutorial chapter :ref:`Conceptual Overview` would be the next natural place
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/doc/tutorial/source/resources.rst ns-3.36/doc/tutorial/source/resources.rst
--- ns-3.35/doc/tutorial/source/resources.rst	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/doc/tutorial/source/resources.rst	2022-04-30 18:23:57.718732800 -0700
@@ -38,8 +38,8 @@
 to access the source code.  GitLab.com provides resources to get started
 at: https://docs.gitlab.com/ee/gitlab-basics/.
 
-Waf
-***
+CMake
+*****
 
 Once you have source code downloaded to your local system, you will need 
 to compile that source to produce usable programs.  Just as in the case of
@@ -47,15 +47,13 @@
 function.  Probably the most well known of these tools is ``make``.  Along
 with being the most well known, ``make`` is probably the most difficult to
 use in a very large and highly configurable system.  Because of this, many
-alternatives have been developed.  Recently these systems have been developed
-using the Python language.
+alternatives have been developed.
 
-The build system Waf is used on the |ns3| project.  It is one 
-of the new generation of Python-based build systems.  You will not need to 
-understand any Python to build the existing |ns3| system.
+The build system CMake is used on the |ns3| project.
 
-For those interested in the gory details of Waf, the Waf book is available
-at https://waf.io/book/ and the current code at https://gitlab.com/ita1024/waf/.
+For those interested in the details of CMake, the CMake documents are available
+at https://cmake.org/cmake/help/latest/index.html and the current code
+at https://gitlab.kitware.com/cmake/cmake.
 
 Development Environment
 ***********************
@@ -82,7 +80,7 @@
 environment. For a quick review of what is included in the GNU toolchain see,
 http://en.wikipedia.org/wiki/GNU_toolchain.  |ns3| uses gcc, 
 GNU binutils, and gdb.  However, we do not use the GNU build system tools, 
-neither make nor autotools.  We use Waf for these functions.
+neither make directly.  We use CMake for these functions.
 
 On macOS, the toolchain used is Xcode.  |ns3| users on a Mac are strongly
 encouraged to install Xcode and the command-line tools packages from the
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/doc/tutorial/source/tracing.rst ns-3.36/doc/tutorial/source/tracing.rst
--- ns-3.35/doc/tutorial/source/tracing.rst	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/doc/tutorial/source/tracing.rst	2022-04-30 18:23:57.718732800 -0700
@@ -488,7 +488,7 @@
 
 .. sourcecode:: bash
 
-  $ ./waf --run fourth
+  $ ./ns3 run fourth
 
 you will see the output from the ``IntTrace`` function execute as soon
 as the trace source is hit:
@@ -2035,7 +2035,7 @@
 
 .. sourcecode:: bash
 
-  $ ./waf --run fifth
+  $ ./ns3 run fifth
   Waf: Entering directory `/home/craigdo/repos/ns-3-allinone-dev/ns-3-dev/build'
   Waf: Leaving directory `/home/craigdo/repos/ns-3-allinone-dev/ns-3-dev/build'
   'build' finished successfully (0.684s)
@@ -2051,7 +2051,7 @@
   ...
 
 You can probably see immediately a downside of using prints of any
-kind in your traces.  We get those extraneous waf messages printed all
+kind in your traces.  We get those extraneous ns3 messages printed all
 over our interesting information along with those RxDrop messages.  We
 will remedy that soon, but I'm sure you can't wait to see the results
 of all of this work.  Let's redirect that output to a file called
@@ -2059,9 +2059,9 @@
 
 .. sourcecode:: bash
 
-  $ ./waf --run fifth > cwnd.dat 2>&1
+  $ ./ns3 run fifth > cwnd.dat 2>&1
 
-Now edit up "cwnd.dat" in your favorite editor and remove the waf
+Now edit up "cwnd.dat" in your favorite editor and remove the ns3
 build status and drop lines, leaving only the traced data (you could
 also comment out the ``TraceConnectWithoutContext("PhyRxDrop",
 MakeCallback (&RxDrop));`` in the script to get rid of the drop prints
@@ -2277,7 +2277,7 @@
 
 .. sourcecode:: bash
 
-  $ ./waf --run sixth
+  $ ./ns3 run sixth
 
 you will see the same messages appear as when you ran "fifth", but two
 new files will appear in the top-level directory of your |ns3|
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/doc/tutorial/source/tweaking.rst ns-3.36/doc/tutorial/source/tweaking.rst
--- ns-3.35/doc/tutorial/source/tweaking.rst	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/doc/tutorial/source/tweaking.rst	2022-04-30 18:23:57.718732800 -0700
@@ -85,7 +85,7 @@
 
 .. sourcecode:: bash
 
-  $ ./waf --run scratch/myfirst
+  $ ./ns3 run scratch/myfirst
 
 You should see the now familiar output of the first |ns3| example
 program
@@ -329,7 +329,7 @@
 
 .. sourcecode:: bash
 
-  $ ./waf --run scratch/myfirst > log.out 2>&1
+  $ ./ns3 run scratch/myfirst > log.out 2>&1
 
 I personally use this extremely verbose version of logging when I am presented 
 with a problem and I have no idea where things are going wrong.  I can follow the 
@@ -374,19 +374,19 @@
   NodeContainer nodes;
   nodes.Create (2);
 
-Now build the script using waf and clear the ``NS_LOG`` variable to turn 
+Now build the script using ns3 and clear the ``NS_LOG`` variable to turn
 off the torrent of logging we previously enabled:
 
 .. sourcecode:: bash
 
-  $ ./waf
+  $ ./ns3
   $ export NS_LOG=
 
 Now, if you run the script, 
 
 .. sourcecode:: bash
 
-  $ ./waf --run scratch/myfirst
+  $ ./ns3 run scratch/myfirst
 
 you will ``not`` see your new message since its associated logging 
 component (``FirstScriptExample``) has not been enabled.  In order to see your
@@ -448,9 +448,9 @@
 
 .. sourcecode:: bash
 
-  $ ./waf --run "scratch/myfirst --PrintHelp"
+  $ ./ns3 run "scratch/myfirst --PrintHelp"
 
-This will ask Waf to run the ``scratch/myfirst`` script and pass the command
+This will ask ns3 to run the ``scratch/myfirst`` script and pass the command
 line argument ``--PrintHelp`` to the script.  The quotes are required to 
 sort out which program gets which argument.  The command line parser will
 now see the ``--PrintHelp`` argument and respond with,
@@ -488,7 +488,7 @@
 
 .. sourcecode:: bash
 
-  $ ./waf --run "scratch/myfirst --PrintAttributes=ns3::PointToPointNetDevice"
+  $ ./ns3 run "scratch/myfirst --PrintAttributes=ns3::PointToPointNetDevice"
 
 The system will print out all of the ``Attributes`` of this kind of net device.
 Among the ``Attributes`` you will see listed is,
@@ -522,7 +522,7 @@
 
   ...
 
-Go ahead and build the new script with Waf (``./waf``) and let's go back 
+Go ahead and build the new script with ns3 (``./ns3``) and let's go back
 and enable some logging from the UDP echo server application and turn on the 
 time prefix.
 
@@ -564,7 +564,7 @@
 
 .. sourcecode:: bash
 
-  $ ./waf --run "scratch/myfirst --ns3::PointToPointNetDevice::DataRate=5Mbps"
+  $ ./ns3 run "scratch/myfirst --ns3::PointToPointNetDevice::DataRate=5Mbps"
 
 This will set the default value of the ``DataRate`` ``Attribute`` back to 
 five megabits per second.  Are you surprised by the result?  It turns out that
@@ -575,7 +575,7 @@
 
 .. sourcecode:: bash
 
-  $ ./waf --run "scratch/myfirst --PrintAttributes=ns3::PointToPointChannel"
+  $ ./ns3 run "scratch/myfirst --PrintAttributes=ns3::PointToPointChannel"
 
 We discover the ``Delay`` ``Attribute`` of the channel is set in the following
 way:
@@ -589,7 +589,7 @@
 
 .. sourcecode:: bash
 
-  $ ./waf --run "scratch/myfirst
+  $ ./ns3 run "scratch/myfirst
     --ns3::PointToPointNetDevice::DataRate=5Mbps
     --ns3::PointToPointChannel::Delay=2ms"
 
@@ -627,7 +627,7 @@
 
 .. sourcecode:: bash
 
-  $ ./waf --run "scratch/myfirst 
+  $ ./ns3 run "scratch/myfirst
     --ns3::PointToPointNetDevice::DataRate=5Mbps 
     --ns3::PointToPointChannel::Delay=2ms 
     --ns3::UdpEchoClient::MaxPackets=2"
@@ -638,7 +638,7 @@
 
 .. sourcecode:: bash
 
-  $ ./waf --run "scratch/myfirst --PrintHelp"
+  $ ./ns3 run "scratch/myfirst --PrintHelp"
   myfirst [Program Arguments] [General Arguments]
 
   General Arguments:
@@ -658,7 +658,7 @@
 
 .. sourcecode:: bash
 
-  ./waf --run "scratch/myfirst --PrintGroup=PointToPoint"
+  ./ns3 run "scratch/myfirst --PrintGroup=PointToPoint"
   TypeIds in group PointToPoint:
     ns3::PointToPointChannel
     ns3::PointToPointNetDevice
@@ -713,7 +713,7 @@
 
 .. sourcecode:: bash
 
-  $ ./waf --run "scratch/myfirst --PrintHelp"
+  $ ./ns3 run "scratch/myfirst --PrintHelp"
 
 .. sourcecode:: bash
 
@@ -734,7 +734,7 @@
 
 .. sourcecode:: bash
 
-  $ ./waf --run "scratch/myfirst --nPackets=2"
+  $ ./ns3 run "scratch/myfirst --nPackets=2"
 
 You should now see
 
@@ -870,17 +870,17 @@
 
 .. sourcecode:: bash
 
-  $ ./waf --run scratch/myfirst
+  $ ./ns3 run scratch/myfirst
 
-Just as you have seen many times before, you will see some messages from Waf and then
+Just as you have seen many times before, you will see some messages from ns3 and then
 "'build' finished successfully" with some number of messages from 
 the running program.  
 
 When it ran, the program will have created a file named ``myfirst.tr``.  
-Because of the way that Waf works, the file is not created in the local 
+Because of the way that ns3 works, the file is not created in the local
 directory, it is created at the top-level directory of the repository by 
 default.  If you want to control where the traces are saved you can use the 
-``--cwd`` option of Waf to specify this.  We have not done so, thus we 
+``--cwd`` option of ns3 to specify this.  We have not done so, thus we
 need to change into the top level directory of our repo and take a look at 
 the ASCII trace file ``myfirst.tr`` in your favorite editor.
 
@@ -1019,7 +1019,7 @@
 
 .. sourcecode:: bash
 
-  $ ./waf --run scratch/myfirst
+  $ ./ns3 run scratch/myfirst
 
 If you look at the top level directory of your distribution, you should now
 see three log files:  ``myfirst.tr`` is the ASCII trace file we have 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/channel-models/CMakeLists.txt ns-3.36/examples/channel-models/CMakeLists.txt
--- ns-3.35/examples/channel-models/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/examples/channel-models/CMakeLists.txt	2022-04-30 18:23:57.718732800 -0700
@@ -0,0 +1,11 @@
+build_example(
+  NAME three-gpp-v2v-channel-example
+  SOURCE_FILES three-gpp-v2v-channel-example.cc
+  LIBRARIES_TO_LINK
+    ${libcore}
+    ${libmobility}
+    ${libpropagation}
+    ${libspectrum}
+    ${libantenna}
+    ${libbuildings}
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/channel-models/three-gpp-v2v-channel-example.cc ns-3.36/examples/channel-models/three-gpp-v2v-channel-example.cc
--- ns-3.35/examples/channel-models/three-gpp-v2v-channel-example.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/channel-models/three-gpp-v2v-channel-example.cc	2022-04-30 18:23:57.718732800 -0700
@@ -54,6 +54,42 @@
 static Ptr<ThreeGppSpectrumPropagationLossModel> m_spectrumLossModel; //!< the SpectrumPropagationLossModel object
 static Ptr<ChannelConditionModel> m_condModel; //!< the ChannelConditionModel object
 
+/*
+ * \brief A structure that holds the parameters for the ComputeSnr
+ * function. In this way the problem with the limited
+ * number of parameters of method Schedule is avoided.
+ */
+struct ComputeSnrParams
+{
+  Ptr<MobilityModel> txMob; //!< the tx mobility model
+  Ptr<MobilityModel> rxMob; //!< the rx mobility model
+  Ptr<SpectrumValue> txPsd; //!< the PSD of the tx signal
+  double noiseFigure; //!< the noise figure in dB
+  Ptr<PhasedArrayModel> txAntenna; //!< the tx antenna array
+  Ptr<PhasedArrayModel> rxAntenna; //!< the rx antenna array
+
+  /**
+   * \brief Constructor
+   * \param pTxMob the tx mobility model
+   * \param pRxMob the rx mobility model
+   * \param pTxPsd the PSD of the tx signal
+   * \param pNoiseFigure the noise figure in dB
+   * \param pTxAntenna the tx antenna array
+   * \param pRxAntenna the rx antenna array
+   */
+  ComputeSnrParams (Ptr<MobilityModel> pTxMob, Ptr<MobilityModel> pRxMob,
+                    Ptr<SpectrumValue> pTxPsd, double pNoiseFigure,
+                    Ptr<PhasedArrayModel> pTxAntenna, Ptr<PhasedArrayModel> pRxAntenna)
+  {
+    txMob = pTxMob;
+    rxMob = pRxMob;
+    txPsd = pTxPsd;
+    noiseFigure = pNoiseFigure;
+    txAntenna = pTxAntenna;
+    rxAntenna = pRxAntenna;
+  }
+};
+
 /**
  * Perform the beamforming using the DFT beamforming method
  * \param thisDevice the device performing the beamforming
@@ -78,36 +114,33 @@
 
 /**
  * Compute the average SNR
- * \param txMob the tx mobility model
- * \param rxMob the rx mobility model
- * \param txPsd the PSD of the transmitting signal
- * \param noiseFigure the noise figure in dB
+ * \param params A structure that holds a bunch of parameters needed by ComputSnr function to calculate the average SNR
  */
 static void
-ComputeSnr (Ptr<MobilityModel> txMob, Ptr<MobilityModel> rxMob, Ptr<const SpectrumValue> txPsd, double noiseFigure)
+ComputeSnr (ComputeSnrParams& params)
 {
-  Ptr<SpectrumValue> rxPsd = txPsd->Copy ();
+  Ptr<SpectrumValue> rxPsd = params.txPsd->Copy ();
 
   // check the channel condition
-  Ptr<ChannelCondition> cond = m_condModel->GetChannelCondition (txMob, rxMob);
+  Ptr<ChannelCondition> cond = m_condModel->GetChannelCondition (params.txMob, params.rxMob);
 
   // apply the pathloss
-  double propagationGainDb = m_propagationLossModel->CalcRxPower (0, txMob, rxMob);
+  double propagationGainDb = m_propagationLossModel->CalcRxPower (0, params.txMob, params.rxMob);
   NS_LOG_DEBUG ("Pathloss " << -propagationGainDb << " dB");
   double propagationGainLinear = std::pow (10.0, (propagationGainDb) / 10.0);
   *(rxPsd) *= propagationGainLinear;
 
   // apply the fast fading and the beamforming gain
-  rxPsd = m_spectrumLossModel->CalcRxPowerSpectralDensity (rxPsd, txMob, rxMob);
+  rxPsd = m_spectrumLossModel->CalcRxPowerSpectralDensity (rxPsd, params.txMob, params.rxMob, params.txAntenna, params.rxAntenna);
   NS_LOG_DEBUG ("Average rx power " << 10 * log10 (Sum (*rxPsd) * 180e3) << " dB");
 
   // create the noise psd
   // taken from lte-spectrum-value-helper
   const double kT_dBm_Hz = -174.0; // dBm/Hz
   double kT_W_Hz = std::pow (10.0, (kT_dBm_Hz - 30) / 10.0);
-  double noiseFigureLinear = std::pow (10.0, noiseFigure / 10.0);
+  double noiseFigureLinear = std::pow (10.0, params.noiseFigure / 10.0);
   double noisePowerSpectralDensity =  kT_W_Hz * noiseFigureLinear;
-  Ptr<SpectrumValue> noisePsd = Create <SpectrumValue> (txPsd->GetSpectrumModel ());
+  Ptr<SpectrumValue> noisePsd = Create <SpectrumValue> (params.txPsd->GetSpectrumModel ());
   (*noisePsd) = noisePowerSpectralDensity;
 
   // compute the SNR
@@ -117,10 +150,10 @@
   std::ofstream f;
   f.open ("example-output.txt", std::ios::out | std::ios::app);
   f << Simulator::Now ().GetSeconds () << " " // time [s]
-    << txMob->GetPosition ().x << " "
-    << txMob->GetPosition ().y << " "
-    << rxMob->GetPosition ().x << " "
-    << rxMob->GetPosition ().y << " "
+    << params.txMob->GetPosition ().x << " "
+    << params.txMob->GetPosition ().y << " "
+    << params.rxMob->GetPosition ().x << " "
+    << params.rxMob->GetPosition ().y << " "
     << cond->GetLosCondition () << " " // channel state
     << 10 * log10 (Sum (*rxPsd) / Sum (*noisePsd)) << " " // SNR [dB]
     << -propagationGainDb << std::endl; // pathloss [dB]
@@ -296,14 +329,10 @@
   channelModel->SetAttribute ("Scenario", StringValue (scenario));
   channelModel->SetAttribute ("Frequency", DoubleValue (frequency));
   channelModel->SetAttribute ("ChannelConditionModel", PointerValue (m_condModel));
+  channelModel->SetAttribute ("vScatt", DoubleValue (vScatt));
 
   // create the spectrum propagation loss model
   m_spectrumLossModel = CreateObjectWithAttributes<ThreeGppSpectrumPropagationLossModel> ("ChannelModel", PointerValue (channelModel));
-  m_spectrumLossModel->SetAttribute ("vScatt", DoubleValue (vScatt));
-
-  // initialize the devices in the ThreeGppSpectrumPropagationLossModel
-  m_spectrumLossModel->AddDevice (txDev, txAntenna);
-  m_spectrumLossModel->AddDevice (rxDev, rxAntenna);
 
   BuildingsHelper::Install (nodes);
 
@@ -332,7 +361,7 @@
 
   for (int i = 0; i < simTime / timeRes; i++)
     {
-      Simulator::Schedule (timeRes * i, &ComputeSnr, txMob, rxMob, txPsd, noiseFigure);
+      Simulator::Schedule (timeRes * i, &ComputeSnr, ComputeSnrParams (txMob, rxMob, txPsd, noiseFigure, txAntenna, rxAntenna));
     }
 
   // initialize the output file
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/channel-models/wscript ns-3.36/examples/channel-models/wscript
--- ns-3.35/examples/channel-models/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/channel-models/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,5 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    obj = bld.create_ns3_program('three-gpp-v2v-channel-example', ['core', 'mobility', 'propagation', 'spectrum', 'antenna', 'buildings'])
-    obj.source = 'three-gpp-v2v-channel-example.cc'
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/CMakeLists.txt ns-3.36/examples/CMakeLists.txt
--- ns-3.35/examples/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/examples/CMakeLists.txt	2022-04-30 18:23:57.718732800 -0700
@@ -0,0 +1,18 @@
+if(${ENABLE_EXAMPLES})
+  subdirlist(examples_to_build ${CMAKE_CURRENT_SOURCE_DIR})
+
+  # Process subdirectories
+  foreach(examplefolder ${examples_to_build})
+    if(NOT (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${examplefolder}/CMakeLists.txt))
+      continue()
+    endif()
+    add_subdirectory(${examplefolder})
+
+    set(ns3-example-folders
+        "${examplefolder};${ns3-example-folders}"
+        CACHE INTERNAL "list of example folders"
+    )
+  endforeach()
+endif()
+
+scan_python_examples(${CMAKE_CURRENT_SOURCE_DIR})
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/energy/CMakeLists.txt ns-3.36/examples/energy/CMakeLists.txt
--- ns-3.35/examples/energy/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/examples/energy/CMakeLists.txt	2022-04-30 18:23:57.718732800 -0700
@@ -0,0 +1,23 @@
+build_example(
+  NAME energy-model-example
+  SOURCE_FILES energy-model-example.cc
+  LIBRARIES_TO_LINK
+    ${libcore}
+    ${libmobility}
+    ${libwifi}
+    ${libenergy}
+    ${libinternet}
+    ${libconfig-store}
+)
+
+build_example(
+  NAME energy-model-with-harvesting-example
+  SOURCE_FILES energy-model-with-harvesting-example.cc
+  LIBRARIES_TO_LINK
+    ${libcore}
+    ${libmobility}
+    ${libwifi}
+    ${libenergy}
+    ${libinternet}
+    ${libconfig-store}
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/energy/wscript ns-3.36/examples/energy/wscript
--- ns-3.35/examples/energy/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/energy/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,7 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    obj = bld.create_ns3_program('energy-model-example', ['core', 'mobility', 'wifi', 'energy', 'internet', 'config-store'])
-    obj.source = 'energy-model-example.cc'
-    obj = bld.create_ns3_program('energy-model-with-harvesting-example', ['core', 'mobility', 'wifi', 'energy', 'internet', 'config-store'])
-    obj.source = 'energy-model-with-harvesting-example.cc'
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/error-model/CMakeLists.txt ns-3.36/examples/error-model/CMakeLists.txt
--- ns-3.35/examples/error-model/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/examples/error-model/CMakeLists.txt	2022-04-30 18:23:57.718732800 -0700
@@ -0,0 +1,8 @@
+build_example(
+  NAME simple-error-model
+  SOURCE_FILES simple-error-model.cc
+  LIBRARIES_TO_LINK
+    ${libpoint-to-point}
+    ${libinternet}
+    ${libapplications}
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/error-model/wscript ns-3.36/examples/error-model/wscript
--- ns-3.35/examples/error-model/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/error-model/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,5 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    obj = bld.create_ns3_program('simple-error-model', ['point-to-point', 'internet', 'applications'])
-    obj.source = 'simple-error-model.cc'
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/ipv6/CMakeLists.txt ns-3.36/examples/ipv6/CMakeLists.txt
--- ns-3.35/examples/ipv6/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/examples/ipv6/CMakeLists.txt	2022-04-30 18:23:57.722732800 -0700
@@ -0,0 +1,90 @@
+build_example(
+  NAME fragmentation-ipv6
+  SOURCE_FILES fragmentation-ipv6.cc
+  LIBRARIES_TO_LINK
+    ${libcsma}
+    ${libinternet}
+    ${libinternet-apps}
+)
+
+build_example(
+  NAME fragmentation-ipv6-two-MTU
+  SOURCE_FILES fragmentation-ipv6-two-MTU.cc
+  LIBRARIES_TO_LINK
+    ${libcsma}
+    ${libinternet}
+    ${libinternet-apps}
+)
+
+build_example(
+  NAME icmpv6-redirect
+  SOURCE_FILES icmpv6-redirect.cc
+  LIBRARIES_TO_LINK
+    ${libcsma}
+    ${libinternet}
+    ${libinternet-apps}
+)
+
+build_example(
+  NAME loose-routing-ipv6
+  SOURCE_FILES loose-routing-ipv6.cc
+  LIBRARIES_TO_LINK
+    ${libcsma}
+    ${libinternet}
+    ${libinternet-apps}
+)
+
+build_example(
+  NAME ping6
+  SOURCE_FILES ping6.cc
+  LIBRARIES_TO_LINK
+    ${libcsma}
+    ${libinternet}
+    ${libinternet-apps}
+)
+
+build_example(
+  NAME radvd
+  SOURCE_FILES radvd.cc
+  LIBRARIES_TO_LINK
+    ${libcsma}
+    ${libinternet}
+    ${libinternet-apps}
+)
+
+build_example(
+  NAME radvd-two-prefix
+  SOURCE_FILES radvd-two-prefix.cc
+  LIBRARIES_TO_LINK
+    ${libcsma}
+    ${libinternet}
+    ${libinternet-apps}
+)
+
+build_example(
+  NAME test-ipv6
+  SOURCE_FILES test-ipv6.cc
+  LIBRARIES_TO_LINK ${libpoint-to-point}
+                    ${libinternet}
+)
+
+build_example(
+  NAME wsn-ping6
+  SOURCE_FILES wsn-ping6.cc
+  LIBRARIES_TO_LINK
+    ${liblr-wpan}
+    ${libinternet}
+    ${libsixlowpan}
+    ${libmobility}
+    ${libinternet-apps}
+)
+
+build_example(
+  NAME fragmentation-ipv6-PMTU
+  SOURCE_FILES fragmentation-ipv6-PMTU.cc
+  LIBRARIES_TO_LINK
+    ${libcsma}
+    ${libinternet}
+    ${libinternet-apps}
+    ${libpoint-to-point}
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/ipv6/fragmentation-ipv6-PMTU.cc ns-3.36/examples/ipv6/fragmentation-ipv6-PMTU.cc
--- ns-3.35/examples/ipv6/fragmentation-ipv6-PMTU.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/examples/ipv6/fragmentation-ipv6-PMTU.cc	2022-04-30 18:23:57.722732800 -0700
@@ -0,0 +1,160 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2008-2009 Strasbourg University
+ * Copyright (c) 2013 Universita' di Firenze
+ * Copyright (c) 2022 Jadavpur University
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: David Gross <gdavid.devel@gmail.com>
+ *         Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
+ * Modified by Akash Mondal <a98mondal@gmail.com>
+ */
+
+// Network topology
+// //
+// //      Src  n0        r1     n1      r2        n2
+// //           |         _      |       _         |
+// //           =========|_|============|_|=========
+// //      MTU   5000           2000          1500
+// //
+// // - Tracing of queues and packet receptions to file "fragmentation-ipv6-PMTU.tr"
+
+#include <fstream>
+#include "ns3/core-module.h"
+#include "ns3/network-module.h"
+#include "ns3/internet-module.h"
+#include "ns3/csma-module.h"
+#include "ns3/point-to-point-module.h"
+#include "ns3/internet-apps-module.h"
+#include "ns3/ipv6-static-routing-helper.h"
+
+#include "ns3/ipv6-routing-table-entry.h"
+
+using namespace ns3;
+
+NS_LOG_COMPONENT_DEFINE ("FragmentationIpv6PmtuExample");
+
+int
+main (int argc, char **argv)
+{
+  bool verbose = false;
+
+  CommandLine cmd (__FILE__);
+  cmd.AddValue ("verbose", "turn on log components", verbose);
+  cmd.Parse (argc, argv);
+
+  if (verbose)
+    {
+      LogComponentEnable ("Ipv6L3Protocol", LOG_LEVEL_ALL);
+      LogComponentEnable ("Icmpv6L4Protocol", LOG_LEVEL_ALL);
+      LogComponentEnable ("Ipv6StaticRouting", LOG_LEVEL_ALL);
+      LogComponentEnable ("Ipv6Interface", LOG_LEVEL_ALL);
+      LogComponentEnable ("Ping6Application", LOG_LEVEL_ALL);
+    }
+
+  NS_LOG_INFO ("Create nodes.");
+  Ptr<Node> n0 = CreateObject<Node> ();
+  Ptr<Node> r1 = CreateObject<Node> ();
+  Ptr<Node> n1 = CreateObject<Node> ();
+  Ptr<Node> r2 = CreateObject<Node> ();
+  Ptr<Node> n2 = CreateObject<Node> ();
+
+  NodeContainer net1 (n0, r1);
+  NodeContainer net2 (r1, n1, r2);
+  NodeContainer net3 (r2, n2);
+  NodeContainer all (n0, r1, n1, r2, n2);
+
+  NS_LOG_INFO ("Create IPv6 Internet Stack");
+  InternetStackHelper internetv6;
+  internetv6.Install (all);
+
+  NS_LOG_INFO ("Create channels.");
+  CsmaHelper csma;
+  csma.SetChannelAttribute ("DataRate", DataRateValue (5000000));
+  csma.SetChannelAttribute ("Delay", TimeValue (MilliSeconds (2)));
+  csma.SetDeviceAttribute ("Mtu", UintegerValue (2000));
+  NetDeviceContainer d2 = csma.Install (net2);  // CSMA Network with MTU 2000
+
+  csma.SetDeviceAttribute ("Mtu", UintegerValue (5000));
+  NetDeviceContainer d1 = csma.Install (net1);  // CSMA Network with MTU 5000
+
+  PointToPointHelper pointToPoint;
+  pointToPoint.SetDeviceAttribute ("DataRate", DataRateValue (5000000));
+  pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));
+  pointToPoint.SetDeviceAttribute ("Mtu", UintegerValue (1500));
+  NetDeviceContainer d3 = pointToPoint.Install (net3);  // P2P Network with MTU 1500
+
+  NS_LOG_INFO ("Create networks and assign IPv6 Addresses.");
+  Ipv6AddressHelper ipv6;
+
+  ipv6.SetBase (Ipv6Address ("2001:1::"), Ipv6Prefix (64));
+  Ipv6InterfaceContainer i1 = ipv6.Assign (d1);
+  i1.SetForwarding (1, true);
+  i1.SetDefaultRouteInAllNodes (1);
+
+  ipv6.SetBase (Ipv6Address ("2001:2::"), Ipv6Prefix (64));
+  Ipv6InterfaceContainer i2 = ipv6.Assign (d2);
+  i2.SetForwarding (0, true);
+  i2.SetDefaultRouteInAllNodes (0);
+  i2.SetForwarding (1, true);
+  i2.SetDefaultRouteInAllNodes (0);
+  i2.SetForwarding (2, true);
+  i2.SetDefaultRouteInAllNodes (2);
+
+  ipv6.SetBase (Ipv6Address ("2001:3::"), Ipv6Prefix (64));
+  Ipv6InterfaceContainer i3 = ipv6.Assign (d3);
+  i3.SetForwarding (0, true);
+  i3.SetDefaultRouteInAllNodes (0);
+
+  Ipv6StaticRoutingHelper routingHelper;
+  Ptr<OutputStreamWrapper> routingStream = Create<OutputStreamWrapper> (&std::cout);
+  routingHelper.PrintRoutingTableAt (Seconds (0), r1, routingStream);
+
+  /* Create a Ping6 application to send ICMPv6 echo request from r to n2 */
+  uint32_t packetSize = 1600; // Packet should fragment as intermediate link MTU is 1500
+  uint32_t maxPacketCount = 5;
+  Time interPacketInterval = Seconds (1.0);
+  Ping6Helper ping6;
+
+  ping6.SetLocal (i2.GetAddress (1, 1));
+  ping6.SetRemote (i3.GetAddress (1, 1));
+
+  ping6.SetAttribute ("MaxPackets", UintegerValue (maxPacketCount));
+  ping6.SetAttribute ("Interval", TimeValue (interPacketInterval));
+  ping6.SetAttribute ("PacketSize", UintegerValue (packetSize));
+  ApplicationContainer apps = ping6.Install (n1);
+  apps.Start (Seconds (2.0));
+  apps.Stop (Seconds (10.0));
+
+  /* Create a Ping6 application to send ICMPv6 echo request from n0 to n2 */
+  packetSize = 4000;
+  ping6.SetAttribute ("PacketSize", UintegerValue (packetSize));
+
+  ping6.SetLocal (i1.GetAddress (0, 1));
+  ping6.SetRemote (i3.GetAddress (1, 1));
+  apps = ping6.Install (n0);
+  apps.Start (Seconds (11.0));
+  apps.Stop (Seconds (20.0));
+
+  AsciiTraceHelper ascii;
+  csma.EnableAsciiAll (ascii.CreateFileStream ("fragmentation-ipv6-PMTU.tr"));
+  csma.EnablePcapAll (std::string ("fragmentation-ipv6-PMTU"), true);
+  pointToPoint.EnablePcapAll (std::string ("fragmentation-ipv6-PMTU"), true);
+
+  NS_LOG_INFO ("Run Simulation.");
+  Simulator::Run ();
+  Simulator::Destroy ();
+  NS_LOG_INFO ("Done.");
+}
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/ipv6/test-ipv6.cc ns-3.36/examples/ipv6/test-ipv6.cc
--- ns-3.35/examples/ipv6/test-ipv6.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/ipv6/test-ipv6.cc	2022-04-30 18:23:57.722732800 -0700
@@ -23,6 +23,7 @@
 #include "ns3/ipv6-address.h"
 #include "ns3/node.h"
 #include "ns3/mac48-address.h"
+#include "ns3/simulator.h"
 
 using namespace ns3;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/ipv6/wscript ns-3.36/examples/ipv6/wscript
--- ns-3.35/examples/ipv6/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/ipv6/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,30 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    obj = bld.create_ns3_program('icmpv6-redirect', ['csma', 'internet', 'internet-apps'])
-    obj.source = 'icmpv6-redirect.cc'
-
-    obj = bld.create_ns3_program('ping6', ['csma', 'internet', 'internet-apps'])
-    obj.source = 'ping6.cc'
-    
-    obj = bld.create_ns3_program('radvd', ['csma', 'internet', 'internet-apps'])
-    obj.source = 'radvd.cc'
-
-    obj = bld.create_ns3_program('radvd-two-prefix', ['csma', 'internet', 'internet-apps'])
-    obj.source = 'radvd-two-prefix.cc'
-
-    obj = bld.create_ns3_program('test-ipv6', ['point-to-point', 'internet'])
-    obj.source = 'test-ipv6.cc'
-    
-    obj = bld.create_ns3_program('fragmentation-ipv6', ['csma', 'internet', 'internet-apps'])
-    obj.source = 'fragmentation-ipv6.cc'
-    
-    obj = bld.create_ns3_program('fragmentation-ipv6-two-MTU', ['csma', 'internet', 'internet-apps'])
-    obj.source = 'fragmentation-ipv6-two-MTU.cc'
-
-    obj = bld.create_ns3_program('loose-routing-ipv6', ['csma', 'internet', 'internet-apps'])
-    obj.source = 'loose-routing-ipv6.cc'
-
-    obj = bld.create_ns3_program('wsn-ping6', ['lr-wpan', 'internet', 'sixlowpan', 'mobility', 'internet-apps'])
-    obj.source = 'wsn-ping6.cc'
-
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/matrix-topology/CMakeLists.txt ns-3.36/examples/matrix-topology/CMakeLists.txt
--- ns-3.35/examples/matrix-topology/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/examples/matrix-topology/CMakeLists.txt	2022-04-30 18:23:57.722732800 -0700
@@ -0,0 +1,11 @@
+build_example(
+  NAME matrix-topology
+  SOURCE_FILES matrix-topology.cc
+  LIBRARIES_TO_LINK
+    ${libnetwork}
+    ${libnetanim}
+    ${libmobility}
+    ${libpoint-to-point}
+    ${libinternet}
+    ${libapplications}
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/matrix-topology/wscript ns-3.36/examples/matrix-topology/wscript
--- ns-3.35/examples/matrix-topology/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/matrix-topology/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,6 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    obj = bld.create_ns3_program('matrix-topology',
-                                 ['network', 'internet', 'netanim', 'point-to-point', 'mobility', 'applications'])
-    obj.source = 'matrix-topology.cc'
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/naming/CMakeLists.txt ns-3.36/examples/naming/CMakeLists.txt
--- ns-3.35/examples/naming/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/examples/naming/CMakeLists.txt	2022-04-30 18:23:57.722732800 -0700
@@ -0,0 +1,9 @@
+build_example(
+  NAME object-names
+  SOURCE_FILES object-names.cc
+  LIBRARIES_TO_LINK
+    ${libcore}
+    ${libcsma}
+    ${libinternet}
+    ${libapplications}
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/naming/wscript ns-3.36/examples/naming/wscript
--- ns-3.35/examples/naming/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/naming/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,5 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    obj = bld.create_ns3_program('object-names', ['core', 'csma', 'internet', 'applications'])
-    obj.source = 'object-names.cc'
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/realtime/CMakeLists.txt ns-3.36/examples/realtime/CMakeLists.txt
--- ns-3.35/examples/realtime/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/examples/realtime/CMakeLists.txt	2022-04-30 18:23:57.722732800 -0700
@@ -0,0 +1,10 @@
+if(${ENABLE_REALTIME})
+  build_example(
+    NAME realtime-udp-echo
+    SOURCE_FILES realtime-udp-echo.cc
+    LIBRARIES_TO_LINK
+      ${libcsma}
+      ${libinternet}
+      ${libapplications}
+  )
+endif()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/realtime/wscript ns-3.36/examples/realtime/wscript
--- ns-3.35/examples/realtime/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/realtime/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,8 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    if bld.env["ENABLE_REAL_TIME"]:
-        obj = bld.create_ns3_program('realtime-udp-echo', ['csma', 'internet', 'applications'])
-        obj.source = 'realtime-udp-echo.cc'
-
-        bld.register_ns3_script('realtime-udp-echo.py', ['csma', 'internet', 'applications'])
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/routing/CMakeLists.txt ns-3.36/examples/routing/CMakeLists.txt
--- ns-3.35/examples/routing/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/examples/routing/CMakeLists.txt	2022-04-30 18:23:57.722732800 -0700
@@ -0,0 +1,133 @@
+build_example(
+  NAME dynamic-global-routing
+  SOURCE_FILES dynamic-global-routing.cc
+  LIBRARIES_TO_LINK
+    ${libpoint-to-point}
+    ${libcsma}
+    ${libinternet}
+    ${libapplications}
+)
+
+build_example(
+  NAME static-routing-slash32
+  SOURCE_FILES static-routing-slash32.cc
+  LIBRARIES_TO_LINK
+    ${libpoint-to-point}
+    ${libcsma}
+    ${libinternet}
+    ${libapplications}
+)
+
+build_example(
+  NAME global-routing-slash32
+  SOURCE_FILES global-routing-slash32.cc
+  LIBRARIES_TO_LINK
+    ${libpoint-to-point}
+    ${libcsma}
+    ${libinternet}
+    ${libapplications}
+)
+
+build_example(
+  NAME global-injection-slash32
+  SOURCE_FILES global-injection-slash32.cc
+  LIBRARIES_TO_LINK
+    ${libpoint-to-point}
+    ${libcsma}
+    ${libinternet}
+    ${libapplications}
+)
+
+build_example(
+  NAME simple-global-routing
+  SOURCE_FILES simple-global-routing.cc
+  LIBRARIES_TO_LINK
+    ${libpoint-to-point}
+    ${libinternet}
+    ${libapplications}
+    ${libflow-monitor}
+)
+
+build_example(
+  NAME simple-alternate-routing
+  SOURCE_FILES simple-alternate-routing.cc
+  LIBRARIES_TO_LINK
+    ${libpoint-to-point}
+    ${libinternet}
+    ${libapplications}
+)
+
+build_example(
+  NAME mixed-global-routing
+  SOURCE_FILES mixed-global-routing.cc
+  LIBRARIES_TO_LINK
+    ${libpoint-to-point}
+    ${libinternet}
+    ${libcsma}
+    ${libapplications}
+)
+
+build_example(
+  NAME simple-routing-ping6
+  SOURCE_FILES simple-routing-ping6.cc
+  LIBRARIES_TO_LINK
+    ${libcsma}
+    ${libinternet}
+    ${libinternet-apps}
+)
+
+build_example(
+  NAME manet-routing-compare
+  SOURCE_FILES manet-routing-compare.cc
+  LIBRARIES_TO_LINK
+    ${libwifi}
+    ${libdsr}
+    ${libdsdv}
+    ${libaodv}
+    ${libolsr}
+    ${libinternet}
+    ${libapplications}
+)
+
+build_example(
+  NAME ripng-simple-network
+  SOURCE_FILES ripng-simple-network.cc
+  LIBRARIES_TO_LINK
+    ${libcsma}
+    ${libinternet}
+    ${libinternet-apps}
+)
+
+build_example(
+  NAME rip-simple-network
+  SOURCE_FILES rip-simple-network.cc
+  LIBRARIES_TO_LINK
+    ${libcsma}
+    ${libinternet}
+    ${libinternet-apps}
+)
+
+build_example(
+  NAME global-routing-multi-switch-plus-router
+  SOURCE_FILES global-routing-multi-switch-plus-router.cc
+  LIBRARIES_TO_LINK
+    ${libcore}
+    ${libnetwork}
+    ${libapplications}
+    ${libinternet}
+    ${libbridge}
+    ${libcsma}
+    ${libpoint-to-point}
+    ${libcsma}
+    ${libinternet}
+)
+
+build_example(
+  NAME simple-multicast-flooding
+  SOURCE_FILES simple-multicast-flooding.cc
+  LIBRARIES_TO_LINK
+    ${libcore}
+    ${libnetwork}
+    ${libapplications}
+    ${libinternet}
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/routing/manet-routing-compare.cc ns-3.36/examples/routing/manet-routing-compare.cc
--- ns-3.35/examples/routing/manet-routing-compare.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/routing/manet-routing-compare.cc	2022-04-30 18:23:57.722732800 -0700
@@ -83,30 +83,60 @@
 
 NS_LOG_COMPONENT_DEFINE ("manet-routing-compare");
 
+/**
+ * Routing experiment class.
+ * 
+ * It handles the creation and run of an experiment.
+ */
 class RoutingExperiment
 {
 public:
   RoutingExperiment ();
+  /**
+   * Run the experiment.
+   * \param nSinks The number of Sink Nodes.
+   * \param txp The Tx power.
+   * \param CSVfileName The output CSV filename.
+   */
   void Run (int nSinks, double txp, std::string CSVfileName);
   //static void SetMACParam (ns3::NetDeviceContainer & devices,
   //                                 int slotDistance);
+  /**
+   * Handles the command-line parmeters.
+   * \param argc The argument count.
+   * \param argv The argument vector.
+   * \return the CSV filename.
+   */
   std::string CommandSetup (int argc, char **argv);
 
 private:
+  /**
+   * Setup the receiving socket in a Sink Node.
+   * \param addr The address of the node.
+   * \param node The node pointer.
+   * \return the socket.
+   */
   Ptr<Socket> SetupPacketReceive (Ipv4Address addr, Ptr<Node> node);
+  /**
+   * Receive a packet.
+   * \param socket The receiving socket.
+   */
   void ReceivePacket (Ptr<Socket> socket);
+  /**
+   * Compute the throughput.
+   */
   void CheckThroughput ();
 
-  uint32_t port;
-  uint32_t bytesTotal;
-  uint32_t packetsReceived;
-
-  std::string m_CSVfileName;
-  int m_nSinks;
-  std::string m_protocolName;
-  double m_txp;
-  bool m_traceMobility;
-  uint32_t m_protocol;
+  uint32_t port;            //!< Receiving port number.
+  uint32_t bytesTotal;      //!< Total received bytes.
+  uint32_t packetsReceived; //!< Total received packets.
+
+  std::string m_CSVfileName;  //!< CSV filename.
+  int m_nSinks;               //!< Number of sink nodes.
+  std::string m_protocolName; //!< Protocol name.
+  double m_txp;               //!< Tx power.
+  bool m_traceMobility;       //!< Enavle mobility tracing.
+  uint32_t m_protocol;        //!< Protocol type.
 };
 
 RoutingExperiment::RoutingExperiment ()
@@ -268,7 +298,7 @@
   NetDeviceContainer adhocDevices = wifi.Install (wifiPhy, wifiMac, adhocNodes);
 
   MobilityHelper mobilityAdhoc;
-  int64_t streamIndex = 0; // used to get consistent mobility across scenarios
+  [[maybe_unused]] int64_t streamIndex = 0; // used to get consistent mobility across scenarios
 
   ObjectFactory pos;
   pos.SetTypeId ("ns3::RandomRectanglePositionAllocator");
@@ -289,7 +319,6 @@
   mobilityAdhoc.SetPositionAllocator (taPositionAlloc);
   mobilityAdhoc.Install (adhocNodes);
   streamIndex += mobilityAdhoc.AssignStreams (adhocNodes, streamIndex);
-  NS_UNUSED (streamIndex); // From this point, streamIndex is unused
 
   AodvHelper aodv;
   OlsrHelper olsr;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/routing/simple-alternate-routing.cc ns-3.36/examples/routing/simple-alternate-routing.cc
--- ns-3.35/examples/routing/simple-alternate-routing.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/routing/simple-alternate-routing.cc	2022-04-30 18:23:57.722732800 -0700
@@ -71,7 +71,7 @@
   // line argument system as well, for exemplary purposes.  This means 
   // that it can be resettable at the command-line to the program, 
   // rather than recompiling
-  // e.g. waf --run "simple-alternate-routing --AlternateCost=5"
+  // e.g. ns3 --run "simple-alternate-routing --AlternateCost=5"
   uint16_t sampleMetric = 1;
   cmd.AddValue ("AlternateCost",
                 "This metric is used in the example script between n3 and n1 ", 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/routing/wscript ns-3.36/examples/routing/wscript
--- ns-3.35/examples/routing/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/routing/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,56 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    obj = bld.create_ns3_program('dynamic-global-routing',
-                                 ['point-to-point', 'csma', 'internet', 'applications'])
-    obj.source = 'dynamic-global-routing.cc'
-
-    obj = bld.create_ns3_program('static-routing-slash32',
-                                 ['point-to-point', 'csma', 'internet', 'applications'])
-    obj.source = 'static-routing-slash32.cc'
-
-    obj = bld.create_ns3_program('global-routing-slash32',
-                                 ['point-to-point', 'csma', 'internet', 'applications'])
-    obj.source = 'global-routing-slash32.cc'
-
-    obj = bld.create_ns3_program('global-injection-slash32',
-                                 ['point-to-point', 'csma', 'internet', 'applications'])
-    obj.source = 'global-injection-slash32.cc'
-
-    obj = bld.create_ns3_program('simple-global-routing',
-                                 ['point-to-point', 'internet', 'applications', 'flow-monitor'])
-    obj.source = 'simple-global-routing.cc'
-
-    obj = bld.create_ns3_program('simple-alternate-routing',
-                                 ['point-to-point', 'internet', 'applications'])
-    obj.source = 'simple-alternate-routing.cc'
-
-    obj = bld.create_ns3_program('mixed-global-routing',
-                                 ['point-to-point', 'internet', 'csma', 'applications'])
-    obj.source = 'mixed-global-routing.cc'
-
-    obj = bld.create_ns3_program('simple-routing-ping6',
-                                 ['csma', 'internet', 'internet-apps'])
-    obj.source = 'simple-routing-ping6.cc'
-
-    obj = bld.create_ns3_program('manet-routing-compare',
-                                 ['wifi', 'dsr', 'dsdv', 'aodv', 'olsr', 'internet', 'applications'])
-    obj.source = 'manet-routing-compare.cc'
-
-    obj = bld.create_ns3_program('ripng-simple-network',
-                                 ['csma', 'internet', 'internet-apps'])
-    obj.source = 'ripng-simple-network.cc'
-
-    bld.register_ns3_script('simple-routing-ping6.py', ['csma', 'internet', 'internet-apps'])
-
-    obj = bld.create_ns3_program('rip-simple-network',
-                                 ['csma', 'internet', 'internet-apps'])
-    obj.source = 'rip-simple-network.cc'
-
-    obj = bld.create_ns3_program('global-routing-multi-switch-plus-router',
-                                 ['core', 'network', 'applications', 'internet', 'bridge', 'csma', 'point-to-point', 'csma', 'internet'])
-    obj.source = 'global-routing-multi-switch-plus-router.cc'
-
-    obj = bld.create_ns3_program('simple-multicast-flooding',
-                                 ['core', 'network', 'applications', 'internet'])
-    obj.source = 'simple-multicast-flooding.cc'
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/socket/CMakeLists.txt ns-3.36/examples/socket/CMakeLists.txt
--- ns-3.35/examples/socket/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/examples/socket/CMakeLists.txt	2022-04-30 18:23:57.722732800 -0700
@@ -0,0 +1,40 @@
+build_example(
+  NAME socket-bound-static-routing
+  SOURCE_FILES socket-bound-static-routing.cc
+  LIBRARIES_TO_LINK
+    ${libnetwork}
+    ${libcsma}
+    ${libpoint-to-point}
+    ${libinternet}
+)
+
+build_example(
+  NAME socket-bound-tcp-static-routing
+  SOURCE_FILES socket-bound-tcp-static-routing.cc
+  LIBRARIES_TO_LINK
+    ${libnetwork}
+    ${libcsma}
+    ${libpoint-to-point}
+    ${libinternet}
+    ${libapplications}
+)
+
+build_example(
+  NAME socket-options-ipv4
+  SOURCE_FILES socket-options-ipv4.cc
+  LIBRARIES_TO_LINK
+    ${libnetwork}
+    ${libcsma}
+    ${libpoint-to-point}
+    ${libinternet}
+)
+
+build_example(
+  NAME socket-options-ipv6
+  SOURCE_FILES socket-options-ipv6.cc
+  LIBRARIES_TO_LINK
+    ${libnetwork}
+    ${libcsma}
+    ${libpoint-to-point}
+    ${libinternet}
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/socket/wscript ns-3.36/examples/socket/wscript
--- ns-3.35/examples/socket/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/socket/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,14 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    obj = bld.create_ns3_program('socket-bound-static-routing', ['network', 'csma', 'point-to-point', 'internet'])
-    obj.source = 'socket-bound-static-routing.cc'
-
-    obj = bld.create_ns3_program('socket-bound-tcp-static-routing', ['network', 'csma', 'point-to-point', 'internet', 'applications'])
-    obj.source = 'socket-bound-tcp-static-routing.cc'
-
-    obj = bld.create_ns3_program('socket-options-ipv4', ['network', 'csma', 'point-to-point', 'internet'])
-    obj.source = 'socket-options-ipv4.cc'
-
-    obj = bld.create_ns3_program('socket-options-ipv6', ['network', 'csma', 'point-to-point', 'internet'])
-    obj.source = 'socket-options-ipv6.cc'
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/stats/CMakeLists.txt ns-3.36/examples/stats/CMakeLists.txt
--- ns-3.35/examples/stats/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/examples/stats/CMakeLists.txt	2022-04-30 18:23:57.722732800 -0700
@@ -0,0 +1,11 @@
+build_example(
+  NAME wifi-example-sim
+  SOURCE_FILES wifi-example-sim.cc
+               wifi-example-apps.cc
+  HEADER_FILES wifi-example-apps.h
+  LIBRARIES_TO_LINK
+    ${libstats}
+    ${libinternet}
+    ${libmobility}
+    ${libwifi}
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/stats/wifi-example-apps.h ns-3.36/examples/stats/wifi-example-apps.h
--- ns-3.35/examples/stats/wifi-example-apps.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/stats/wifi-example-apps.h	2022-04-30 18:23:57.722732800 -0700
@@ -33,10 +33,15 @@
 
 using namespace ns3;
 
-//----------------------------------------------------------------------
-//------------------------------------------------------
+/**
+ * Sender application.
+ */
 class Sender : public Application {
 public:
+  /**
+   * \brief Get the type ID.
+   * \return The object TypeId.
+   */
   static TypeId GetTypeId (void);
   Sender();
   virtual ~Sender();
@@ -48,35 +53,52 @@
   virtual void StartApplication (void);
   virtual void StopApplication (void);
 
+  /**
+   * Send a packet.
+   */
   void SendPacket ();
 
-  uint32_t        m_pktSize;
-  Ipv4Address     m_destAddr;
-  uint32_t        m_destPort;
-  Ptr<ConstantRandomVariable> m_interval;
-  uint32_t        m_numPkts;
+  uint32_t        m_pktSize;    //!< The packet size.
+  Ipv4Address     m_destAddr;   //!< Destination address.
+  uint32_t        m_destPort;   //!< Destination port.
+  Ptr<ConstantRandomVariable> m_interval; //!< Rng for sending packets.
+  uint32_t        m_numPkts;    //!< Number of packets to send.
 
-  Ptr<Socket>     m_socket;
-  EventId         m_sendEvent;
+  Ptr<Socket>     m_socket;     //!< Sending socket.
+  EventId         m_sendEvent;  //!< Send packet event.
 
+  /// Tx TracedCallback.
   TracedCallback<Ptr<const Packet> > m_txTrace;
 
-  uint32_t        m_count;
+  uint32_t        m_count;      //!< Number of packets sent.
 
   // end class Sender
 };
 
 
-
-
-//------------------------------------------------------
+/**
+ * Receiver application.
+ */
 class Receiver : public Application {
 public:
+  /**
+   * \brief Get the type ID.
+   * \return The object TypeId.
+   */
   static TypeId GetTypeId (void);
   Receiver();
   virtual ~Receiver();
 
+  /**
+   * Set the counter calculator for received packets.
+   * \param calc The CounterCalculator.
+   */
   void SetCounter (Ptr<CounterCalculator<> > calc);
+
+  /**
+   * Set the delay tracker for received packets.
+   * \param delay The Delay calculator.
+   */
   void SetDelayTracker (Ptr<TimeMinMaxAvgTotalCalculator> delay);
 
 protected:
@@ -86,24 +108,35 @@
   virtual void StartApplication (void);
   virtual void StopApplication (void);
 
+  /**
+   * Receive a packet.
+   * \param socket The receiving socket.
+   */
   void Receive (Ptr<Socket> socket);
 
-  Ptr<Socket>     m_socket;
+  Ptr<Socket>     m_socket; //!< Receiving socket.
+  uint32_t        m_port;   //!< Listening port.
 
-  uint32_t        m_port;
-
-  Ptr<CounterCalculator<> > m_calc;
-  Ptr<TimeMinMaxAvgTotalCalculator> m_delay;
+  Ptr<CounterCalculator<> > m_calc; //!< Counter of the number of received packets.
+  Ptr<TimeMinMaxAvgTotalCalculator> m_delay;  //!< Delay calculator.
 
   // end class Receiver
 };
 
 
-
-
-//------------------------------------------------------
+/**
+ * Timestamp tag - it carries when the packet has been sent.
+ * 
+ * It would have been more realistic to include this info in 
+ * a header. Here we show how to avoid the extra overhead in
+ * a simulation.
+ */
 class TimestampTag : public Tag {
 public:
+  /**
+   * \brief Get the type ID.
+   * \return The object TypeId.
+   */
   static TypeId GetTypeId (void);
   virtual TypeId GetInstanceTypeId (void) const;
 
@@ -111,14 +144,21 @@
   virtual void Serialize (TagBuffer i) const;
   virtual void Deserialize (TagBuffer i);
 
-  // these are our accessors to our tag structure
+  /**
+   * Set the timestamp.
+   * \param time The timestamp.
+   */
   void SetTimestamp (Time time);
+  /**
+   * Get the timestamp.
+   * \return the timestamp.
+   */
   Time GetTimestamp (void) const;
 
   void Print (std::ostream &os) const;
 
 private:
-  Time m_timestamp;
+  Time m_timestamp; //!< Timestamp.
 
   // end class TimestampTag
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/stats/wifi-example-db.sh ns-3.36/examples/stats/wifi-example-db.sh
--- ns-3.35/examples/stats/wifi-example-db.sh	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/stats/wifi-example-db.sh	2022-04-30 18:23:57.722732800 -0700
@@ -44,7 +44,7 @@
   for distance in $DISTANCES
   do
     echo Trial $trial, distance $distance
-    ../../waf --run "wifi-example-sim --format=db --distance=$distance --run=run-$distance-$trial"
+    ../../ns3 run "wifi-example-sim --format=db --distance=$distance --run=run-$distance-$trial"
   done
 done
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/stats/wscript ns-3.36/examples/stats/wscript
--- ns-3.35/examples/stats/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/stats/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,6 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    obj = bld.create_ns3_program('wifi-example-sim', ['stats', 'internet', 'mobility', 'wifi'])
-    obj.source = ['wifi-example-sim.cc',
-                  'wifi-example-apps.cc']
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/tcp/CMakeLists.txt ns-3.36/examples/tcp/CMakeLists.txt
--- ns-3.35/examples/tcp/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/examples/tcp/CMakeLists.txt	2022-04-30 18:23:57.722732800 -0700
@@ -0,0 +1,114 @@
+build_example(
+  NAME tcp-large-transfer
+  SOURCE_FILES tcp-large-transfer.cc
+  LIBRARIES_TO_LINK
+    ${libpoint-to-point}
+    ${libapplications}
+    ${libinternet}
+)
+
+build_example(
+  NAME tcp-star-server
+  SOURCE_FILES tcp-star-server.cc
+  LIBRARIES_TO_LINK
+    ${libpoint-to-point}
+    ${libapplications}
+    ${libinternet}
+)
+
+build_example(
+  NAME star
+  SOURCE_FILES star.cc
+  LIBRARIES_TO_LINK
+    ${libnetanim}
+    ${libpoint-to-point}
+    ${libpoint-to-point-layout}
+    ${libapplications}
+    ${libinternet}
+)
+
+build_example(
+  NAME tcp-bbr-example
+  SOURCE_FILES tcp-bbr-example.cc
+  LIBRARIES_TO_LINK
+    ${libpoint-to-point}
+    ${libinternet}
+    ${libapplications}
+    ${libtraffic-control}
+    ${libnetwork}
+    ${libinternet-apps}
+    ${libflow-monitor}
+)
+
+build_example(
+  NAME tcp-bulk-send
+  SOURCE_FILES tcp-bulk-send.cc
+  LIBRARIES_TO_LINK
+    ${libpoint-to-point}
+    ${libapplications}
+    ${libinternet}
+)
+
+build_example(
+  NAME tcp-pcap-nanosec-example
+  SOURCE_FILES tcp-pcap-nanosec-example.cc
+  LIBRARIES_TO_LINK
+    ${libpoint-to-point}
+    ${libapplications}
+    ${libinternet}
+)
+
+build_example(
+  NAME tcp-variants-comparison
+  SOURCE_FILES tcp-variants-comparison.cc
+  LIBRARIES_TO_LINK
+    ${libpoint-to-point}
+    ${libinternet}
+    ${libapplications}
+    ${libflow-monitor}
+)
+
+build_example(
+  NAME tcp-pacing
+  SOURCE_FILES tcp-pacing.cc
+  LIBRARIES_TO_LINK
+    ${libpoint-to-point}
+    ${libinternet}
+    ${libapplications}
+    ${libflow-monitor}
+)
+
+build_example(
+  NAME tcp-linux-reno
+  SOURCE_FILES tcp-linux-reno.cc
+  LIBRARIES_TO_LINK
+    ${libpoint-to-point}
+    ${libinternet}
+    ${libapplications}
+    ${libtraffic-control}
+    ${libnetwork}
+)
+
+build_example(
+  NAME tcp-validation
+  SOURCE_FILES tcp-validation.cc
+  LIBRARIES_TO_LINK
+    ${libpoint-to-point}
+    ${libinternet}
+    ${libapplications}
+    ${libtraffic-control}
+    ${libnetwork}
+    ${libinternet-apps}
+)
+
+build_example(
+  NAME dctcp-example
+  SOURCE_FILES dctcp-example.cc
+  LIBRARIES_TO_LINK
+    ${libcore}
+    ${libnetwork}
+    ${libinternet}
+    ${libpoint-to-point}
+    ${libapplications}
+    ${libtraffic-control}
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/tcp/examples-to-run.py ns-3.36/examples/tcp/examples-to-run.py
--- ns-3.35/examples/tcp/examples-to-run.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/tcp/examples-to-run.py	2022-04-30 18:23:57.722732800 -0700
@@ -10,8 +10,6 @@
 cpp_examples = [
     ("star", "True", "True"),
     ("tcp-large-transfer", "True", "True"),
-    ("tcp-nsc-lfn", "NSC_ENABLED == True", "False"),
-    ("tcp-nsc-zoo", "NSC_ENABLED == True", "False"),
     ("tcp-star-server", "True", "True"),
     ("tcp-variants-comparison", "True", "True"),
     ("tcp-validation --firstTcpType=dctcp --linkRate=50Mbps --baseRtt=10ms --queueUseEcn=1 --stopTime=15s --validate=dctcp-10ms", "True", "True"),
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/tcp/tcp-bbr-example.cc ns-3.36/examples/tcp/tcp-bbr-example.cc
--- ns-3.35/examples/tcp/tcp-bbr-example.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/tcp/tcp-bbr-example.cc	2022-04-30 18:23:57.722732800 -0700
@@ -200,8 +200,9 @@
   BulkSendHelper source ("ns3::TcpSocketFactory", InetSocketAddress (ir1.GetAddress (1), port));
   source.SetAttribute ("MaxBytes", UintegerValue (0));
   ApplicationContainer sourceApps = source.Install (sender.Get (0));
-  sourceApps.Start (Seconds (0.0));
-  Simulator::Schedule (Seconds (0.2), &TraceCwnd, 0, 0);
+  sourceApps.Start (Seconds (0.1));
+  // Hook trace source after application starts
+  Simulator::Schedule (Seconds (0.1) + MilliSeconds (1), &TraceCwnd, 0, 0);
   sourceApps.Stop (stopTime);
 
   // Install application on the receiver
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/tcp/tcp-large-transfer.cc ns-3.36/examples/tcp/tcp-large-transfer.cc
--- ns-3.35/examples/tcp/tcp-large-transfer.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/tcp/tcp-large-transfer.cc	2022-04-30 18:23:57.722732800 -0700
@@ -27,7 +27,7 @@
 // - pcap traces also generated in the following files
 //   "tcp-large-transfer-$n-$i.pcap" where n and i represent node and interface
 // numbers respectively
-//  Usage (e.g.): ./waf --run tcp-large-transfer
+//  Usage (e.g.): ./ns3 run tcp-large-transfer
 
 #include <iostream>
 #include <fstream>
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/tcp/tcp-linux-reno.cc ns-3.36/examples/tcp/tcp-linux-reno.cc
--- ns-3.35/examples/tcp/tcp-linux-reno.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/tcp/tcp-linux-reno.cc	2022-04-30 18:23:57.722732800 -0700
@@ -211,7 +211,7 @@
 
   // Create directories to store dat files
   struct stat buffer;
-  int retVal;
+  [[maybe_unused]] int retVal;
   if ((stat (dir.c_str (), &buffer)) == 0)
     {
       std::string dirToRemove = "rm -rf " + dir;
@@ -227,7 +227,6 @@
   NS_ASSERT_MSG (retVal == 0, "Error in return value");
   retVal = system ((dirToSave + "/cwndTraces/").c_str ());
   NS_ASSERT_MSG (retVal == 0, "Error in return value");
-  NS_UNUSED (retVal);
 
   // Set default parameters for queue discipline
   Config::SetDefault (qdiscTypeId + "::MaxSize", QueueSizeValue (QueueSize ("100p")));
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/tcp/tcp-nsc-comparison.cc ns-3.36/examples/tcp/tcp-nsc-comparison.cc
--- ns-3.35/examples/tcp/tcp-nsc-comparison.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/tcp/tcp-nsc-comparison.cc	1969-12-31 16:00:00.000000000 -0800
@@ -1,211 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2012 NICT
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Hajime Tazaki <tazaki@nict.go.jp>
- *
- * This code is a modified version of the code used for the the experiments in the paper
- * "DCE Cradle: Simulate Network Protocols with Real Stacks for Better Realism"
- * by Hajime Tazaki, Frederic Urbani and Thierry Turlett presented at WNS3 2013
- *
- * By default, TCP timestamps, window scale, and SACK are disabled because
- * they were not supported in ns-3 at the time of this paper.  TCP timestamp
- * and window scale can be enabled by command line arguments.  
- *
- */
-
-#include "ns3/log.h"
-#include "ns3/core-module.h"
-#include "ns3/network-module.h"
-#include "ns3/internet-module.h"
-#include "ns3/point-to-point-module.h"
-#include "ns3/applications-module.h"
-#include "ns3/flow-monitor-module.h"
-
-using namespace ns3;
-
-NS_LOG_COMPONENT_DEFINE ("TcpNscComparison");
-
-std::string m_stack = "nsc-linux";
-std::string sock_factory;
-uint32_t m_seed = 1;
-double startTime = 4.0;
-double stopTime = 20.0;
-uint32_t m_nNodes = 2;
-bool enablePcap = false;
-bool enableTimestamps = false;
-bool enableWindowScale = false;
-
-int
-main (int argc, char *argv[])
-{
-
-  //ensure the ns3 TCP default values match what nsc is using
-  Config::SetDefault ("ns3::TcpSocket::SegmentSize", UintegerValue (1448));
-  Config::SetDefault ("ns3::TcpSocket::DelAckCount", UintegerValue (1));
-
-  CommandLine cmd (__FILE__);
-  cmd.AddValue ("stack", "choose network stack", m_stack);
-  cmd.AddValue ("seed", "randomize seed", m_seed);
-  cmd.AddValue ("nNodes", "the number of source and sink nodes", m_nNodes);
-  cmd.AddValue ("stopTime", "duration", stopTime);
-  cmd.AddValue ("enablePcap", "pcap", enablePcap);
-  cmd.AddValue ("enableTimestamps", "use TCP Timestamps option", enableTimestamps);
-  cmd.AddValue ("enableWindowScale", "use TCP Window Scale option", enableWindowScale);
-  cmd.Parse (argc, argv);
-
-  SeedManager::SetSeed (m_seed);
-
-  if (m_stack != "nsc-linux" && m_stack != "ns3")
-    {
-      NS_FATAL_ERROR ("Error, stack named " << m_stack << " is not supported");
-    }
-
-  NodeContainer lefts, routers, rights, nodes;
-  lefts.Create (m_nNodes);
-  routers.Create (2);
-  rights.Create (m_nNodes);
-  nodes = NodeContainer (lefts, routers, rights);
-
-  InternetStackHelper internetStack;
-
-  GlobalValue::Bind ("ChecksumEnabled", BooleanValue (true));
-  if (m_stack == "ns3")
-    {
-      sock_factory = "ns3::TcpSocketFactory";
-      if (enableTimestamps == false)
-        {
-          Config::SetDefault ("ns3::TcpSocketBase::WindowScaling", BooleanValue (false));
-        }
-      if (enableWindowScale == false)
-        {
-          Config::SetDefault ("ns3::TcpSocketBase::Timestamp", BooleanValue (false));
-        }
-      internetStack.Install (nodes);
-    }
-  else if (m_stack == "nsc-linux")
-    {
-      internetStack.Install (routers);
-      sock_factory = "ns3::TcpSocketFactory";
-      internetStack.SetTcp ("ns3::NscTcpL4Protocol",
-                            "Library", StringValue ("liblinux2.6.26.so"));
-      internetStack.Install (lefts);
-      internetStack.Install (rights);
-
-      // at the time this program was written, these were not implemented 
-      // in ns3 tcp, so disable for comparison
-      Config::Set ("/NodeList/*/$ns3::Ns3NscStack<linux2.6.26>/net.ipv4.tcp_sack", StringValue ("0"));
-      if (enableTimestamps == false)
-        {
-          Config::Set ("/NodeList/*/$ns3::Ns3NscStack<linux2.6.26>/net.ipv4.tcp_timestamps", StringValue ("0"));
-        }
-      if (enableWindowScale == false)
-        {
-          Config::Set ("/NodeList/*/$ns3::Ns3NscStack<linux2.6.26>/net.ipv4.tcp_window_scaling", StringValue ("0"));
-        }
-    }
-
-  PointToPointHelper pointToPoint;
-  pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
-  pointToPoint.SetChannelAttribute ("Delay", StringValue ("1ns"));
-
-  Ipv4AddressHelper address;
-  Ipv4InterfaceContainer interfaces;
-
-  NetDeviceContainer dev0, dev1, dev2;
-  for (uint32_t i = 0; i < m_nNodes; i++)
-    {
-      std::ostringstream oss;
-      oss << "10.0." << i << ".0";
-      address.SetBase (oss.str ().c_str (), "255.255.255.0");
-      dev0 = pointToPoint.Install (NodeContainer (lefts.Get (i), routers.Get (0)));
-      address.Assign (dev0);
-    }
-
-  // bottle neck link
-  pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("2Mbps"));
-  pointToPoint.SetChannelAttribute ("Delay", StringValue ("100ms"));
-  dev1 = pointToPoint.Install (NodeContainer (routers.Get (0), routers.Get (1)));
-
-  pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
-  pointToPoint.SetChannelAttribute ("Delay", StringValue ("1ns"));
-  // for right links
-  for (uint32_t i = 0; i < m_nNodes; i++)
-    {
-      std::ostringstream oss;
-      oss << "10.2." << i << ".0";
-      address.SetBase (oss.str ().c_str (), "255.255.255.0");
-      dev2 = pointToPoint.Install (NodeContainer (routers.Get (1), rights.Get (i)));
-      address.Assign (dev2);
-    }
-
-  // bottle neck link
-  Ptr<RateErrorModel> em1 =
-    CreateObjectWithAttributes<RateErrorModel> (
-      "ErrorRate", DoubleValue (0.05),
-      "ErrorUnit", EnumValue (RateErrorModel::ERROR_UNIT_PACKET)
-      );
-  dev1.Get (1)->SetAttribute ("ReceiveErrorModel", PointerValue (em1));
-
-  address.SetBase ("10.1.0.0", "255.255.255.0");
-  address.Assign (dev1);
-  Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
-
-  ApplicationContainer apps;
-
-  OnOffHelper onoff = OnOffHelper (sock_factory,
-                                   InetSocketAddress (Ipv4Address ("10.2.0.2"), 2000));
-  onoff.SetAttribute ("OnTime", StringValue ("ns3::ConstantRandomVariable[Constant=1]"));
-  onoff.SetAttribute ("OffTime", StringValue ("ns3::ConstantRandomVariable[Constant=0]"));
-
-  // Flow 1 - n
-  for (uint32_t i = 0; i < m_nNodes; i++)
-    {
-      std::ostringstream oss;
-      oss << "10.2." << i << ".2";
-      onoff.SetAttribute ("Remote", AddressValue (InetSocketAddress (Ipv4Address (oss.str ().c_str ()), 2000)));
-      onoff.SetAttribute ("PacketSize", StringValue ("1024"));
-      onoff.SetAttribute ("DataRate", StringValue ("1Mbps"));
-      onoff.SetAttribute ("StartTime", TimeValue (Seconds (startTime)));
-      apps = onoff.Install (lefts.Get (i));
-    }
-
-  PacketSinkHelper sink = PacketSinkHelper (sock_factory,
-                                            InetSocketAddress (Ipv4Address::GetAny (), 2000));
-  apps = sink.Install (rights);
-  apps.Start (Seconds (3.9999));
-
-  if (enablePcap)
-    {
-      pointToPoint.EnablePcapAll ("nsc.pcap");
-    }
-
-  Simulator::Stop (Seconds (stopTime));
-  Simulator::Run ();
-
-  Ptr<PacketSink> pktsink;
-  std::cout << "Total ";
-  for (uint32_t i = 0; i < m_nNodes; i++)
-    {
-      pktsink = apps.Get (i)->GetObject<PacketSink> ();
-      std::cout << "Rx(" << i << ") = " << pktsink->GetTotalRx () <<
-      " bytes (" << pktsink->GetTotalRx () * 8 / (stopTime - startTime) << " bps), ";
-    }
-  std::cout << std::endl;
-
-  Simulator::Destroy ();
-  return 0;
-}
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/tcp/tcp-nsc-lfn.cc ns-3.36/examples/tcp/tcp-nsc-lfn.cc
--- ns-3.35/examples/tcp/tcp-nsc-lfn.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/tcp/tcp-nsc-lfn.cc	1969-12-31 16:00:00.000000000 -0800
@@ -1,140 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- */
-
-//
-// Network topology
-//
-//           6Mb/s, 500ms
-//       n0-----------------n1
-//
-// - a 'lossy' network with long delay
-// - TCP flow from n0 to n1 and from n1 to n0
-// - pcap traces generated as tcp-nsc-lfn-0-0.pcap and tcp-nsc-lfn-1-0.pcap
-//  Usage (e.g.): ./waf --run 'tcp-nsc-lfn --TCP_CONGESTION=hybla --runtime=30'
-
-#include <iostream>
-#include <fstream>
-#include <string>
-
-#include "ns3/core-module.h"
-#include "ns3/network-module.h"
-#include "ns3/internet-module.h"
-#include "ns3/point-to-point-module.h"
-#include "ns3/applications-module.h"
-#include "ns3/ipv4-global-routing-helper.h"
-
-using namespace ns3;
-
-NS_LOG_COMPONENT_DEFINE ("TcpNscLfn");
-
-int main (int argc, char *argv[])
-{
-
-  Config::SetDefault ("ns3::OnOffApplication::PacketSize", UintegerValue (4096));
-  Config::SetDefault ("ns3::OnOffApplication::DataRate", StringValue ("6Mbps"));
-
-  // cubic is the default congestion algorithm in Linux 2.6.26
-  std::string tcpCong = "cubic";
-  // this is the default error rate of our link, that is, the the probability of a single
-  // byte being 'corrupted' during transfer.
-  double errRate = 0.000001;
-  // how long the sender should be running, in seconds.
-  unsigned int runtime = 120;
-  // the name of the NSC stack library that should be used
-  std::string nscStack = "liblinux2.6.26.so";
-
-  CommandLine cmd (__FILE__);
-  // Here, we define additional command line options.
-  // This allows a user to override the defaults set above from the command line.
-  cmd.AddValue ("TCP_CONGESTION", "Linux 2.6.26 Tcp Congestion control algorithm to use", tcpCong);
-  cmd.AddValue ("error-rate", "Error rate to apply to link", errRate);
-  cmd.AddValue ("runtime", "How long the applications should send data (default 120 seconds)", runtime);
-  cmd.AddValue ("nscstack", "Set name of NSC stack (shared library) to use (default liblinux2.6.26.so)", nscStack);
-  cmd.Parse (argc, argv);
-
-  NodeContainer n;
-  n.Create (2);
-
-  PointToPointHelper p2p;
-  // create point-to-point link with a bandwidth of 6MBit/s and a large delay (0.5 seconds)
-  p2p.SetDeviceAttribute ("DataRate", DataRateValue (DataRate (6 * 1000 * 1000)));
-  p2p.SetChannelAttribute ("Delay", TimeValue (MilliSeconds (500)));
-
-  NetDeviceContainer p2pInterfaces = p2p.Install (n);
-  // The default MTU of the p2p link would be 65535, which doesn't work
-  // well with our default errRate (most packets would arrive corrupted).
-  p2pInterfaces.Get (0)->SetMtu (1500);
-  p2pInterfaces.Get (1)->SetMtu (1500);
-
-  InternetStackHelper internet;
-  // The next statement switches the nodes to 'NSC'-Mode.
-  // It disables the native ns-3 TCP model and loads the NSC library.
-  internet.SetTcp ("ns3::NscTcpL4Protocol","Library",StringValue (nscStack));
-  internet.Install (n);
-
-  if (tcpCong != "cubic") // make sure we only fail if both --nscstack and --TCP_CONGESTION are used
-    {
-      // This uses ns-3s attribute system to set the 'net.ipv4.tcp_congestion_control' sysctl of the
-      // stack.
-      // The same mechanism could be used to e.g. disable TCP timestamps:
-      // Config::Set ("/NodeList/*/$ns3::Ns3NscStack<linux2.6.26>/net.ipv4.tcp_timestamps", StringValue ("0"));
-      Config::Set ("/NodeList/*/$ns3::Ns3NscStack<linux2.6.26>/net.ipv4.tcp_congestion_control", StringValue (tcpCong));
-    }
-  Ipv4AddressHelper ipv4;
-  ipv4.SetBase ("10.0.0.0", "255.255.255.0");
-  Ipv4InterfaceContainer ipv4Interfaces = ipv4.Assign (p2pInterfaces);
-
-  DoubleValue rate (errRate);
-  Ptr<RateErrorModel> em1 = 
-    CreateObjectWithAttributes<RateErrorModel> ("RanVar", StringValue ("ns3::UniformRandomVariable[Min=0.0|Max=1.0]"), "ErrorRate", rate);
-  Ptr<RateErrorModel> em2 = 
-    CreateObjectWithAttributes<RateErrorModel> ("RanVar", StringValue ("ns3::UniformRandomVariable[Min=0.0|Max=1.0]"), "ErrorRate", rate);
-
-  // This enables the specified errRate on both link endpoints.
-  p2pInterfaces.Get (0)->SetAttribute ("ReceiveErrorModel", PointerValue (em1));
-  p2pInterfaces.Get (1)->SetAttribute ("ReceiveErrorModel", PointerValue (em2));
-
-  Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
-
-  uint16_t servPort = 8080;
-  PacketSinkHelper sinkHelper ("ns3::TcpSocketFactory", InetSocketAddress (Ipv4Address::GetAny (), servPort));
-  ApplicationContainer sinkApp = sinkHelper.Install (n);
-  sinkApp.Start (Seconds (0.0));
-  // this makes sure that the receiver will run one minute longer than the sender applicaton.
-  sinkApp.Stop (Seconds (runtime + 60.0));
-
-  // This sets up two TCP flows, one from A -> B, one from B -> A.
-  for (int i = 0, j = 1; i < 2; j--, i++)
-    {
-      Address remoteAddress (InetSocketAddress (ipv4Interfaces.GetAddress (i), servPort));
-      OnOffHelper clientHelper ("ns3::TcpSocketFactory", remoteAddress);
-      clientHelper.SetAttribute ("OnTime", StringValue ("ns3::ConstantRandomVariable[Constant=1]"));
-      clientHelper.SetAttribute ("OffTime", StringValue ("ns3::ConstantRandomVariable[Constant=0]"));
-      ApplicationContainer clientApp = clientHelper.Install (n.Get (j));
-      clientApp.Start (Seconds (1.0 + i));
-      clientApp.Stop (Seconds (runtime + 1.0 + i));
-    }
-
-  // This tells ns-3 to generate pcap traces.
-  p2p.EnablePcapAll ("tcp-nsc-lfn");
-
-  Simulator::Stop (Seconds (900));
-  Simulator::Run ();
-  Simulator::Destroy ();
-
-  return 0;
-}
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/tcp/tcp-nsc-zoo.cc ns-3.36/examples/tcp/tcp-nsc-zoo.cc
--- ns-3.35/examples/tcp/tcp-nsc-zoo.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/tcp/tcp-nsc-zoo.cc	1969-12-31 16:00:00.000000000 -0800
@@ -1,145 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- */
-
-
-// Network topology
-//
-//       n0    n1   n2   n3
-//       |     |    |    |
-//       =================
-//              LAN
-//
-// - Pcap traces are saved as tcp-nsc-zoo-$n-0.pcap, where $n represents the node number
-// - TCP flows from n0 to n1, n2, n3, from n1 to n0, n2, n3, etc.
-//  Usage (e.g.): ./waf --run 'tcp-nsc-zoo --nodes=5'
-
-#include <iostream>
-#include <string>
-
-#include "ns3/core-module.h"
-#include "ns3/applications-module.h"
-#include "ns3/network-module.h"
-#include "ns3/csma-module.h"
-#include "ns3/internet-module.h"
-
-using namespace ns3;
-
-NS_LOG_COMPONENT_DEFINE ("TcpNscZoo");
-
-// Simulates a diverse network with various stacks supported by NSC.
-int main (int argc, char *argv[])
-{
-  CsmaHelper csma;
-  unsigned int MaxNodes = 4;
-  unsigned int runtime = 3;
-
-  Config::SetDefault ("ns3::OnOffApplication::PacketSize", UintegerValue (2048));
-  Config::SetDefault ("ns3::OnOffApplication::DataRate", StringValue ("8kbps"));
-  CommandLine cmd (__FILE__);
-  // this allows the user to raise the number of nodes using --nodes=X command-line argument.
-  cmd.AddValue ("nodes", "Number of nodes in the network (must be > 1)", MaxNodes);
-  cmd.AddValue ("runtime", "How long the applications should send data (default 3 seconds)", runtime);
-  cmd.Parse (argc, argv);
-
-  if (MaxNodes < 2)
-    {
-      std::cerr << "--nodes: must be >= 2" << std::endl;
-      return 1;
-    }
-  csma.SetChannelAttribute ("DataRate", DataRateValue (DataRate (100 * 1000 * 1000)));
-  csma.SetChannelAttribute ("Delay", TimeValue (MicroSeconds (200)));
-
-  NodeContainer n;
-  n.Create (MaxNodes);
-  NetDeviceContainer ethInterfaces = csma.Install (n);
-
-  InternetStackHelper internetStack;
-  internetStack.SetTcp ("ns3::NscTcpL4Protocol","Library",StringValue ("liblinux2.6.26.so"));
-  // this switches nodes 0 and 1 to NSCs Linux 2.6.26 stack.
-  internetStack.Install (n.Get (0));
-  internetStack.Install (n.Get (1));
-  // this disables TCP SACK, wscale and timestamps on node 1 (the attributes represent sysctl-values).
-  Config::Set ("/NodeList/1/$ns3::Ns3NscStack<linux2.6.26>/net.ipv4.tcp_sack", StringValue ("0"));
-  Config::Set ("/NodeList/1/$ns3::Ns3NscStack<linux2.6.26>/net.ipv4.tcp_timestamps", StringValue ("0"));
-  Config::Set ("/NodeList/1/$ns3::Ns3NscStack<linux2.6.26>/net.ipv4.tcp_window_scaling", StringValue ("0"));
-
-  if (MaxNodes > 2)
-    {
-      internetStack.Install (n.Get (2));
-    }
-
-  if (MaxNodes > 3)
-    {
-      // the next statement doesn't change anything for the nodes 0, 1, and 2; since they
-      // already have a stack assigned.
-      internetStack.SetTcp ("ns3::NscTcpL4Protocol","Library",StringValue ("liblinux2.6.26.so"));
-      // this switches node 3 to NSCs Linux 2.6.26 stack.
-      internetStack.Install (n.Get (3));
-      // and then again disables sack/timestamps/wscale on node 3.
-      Config::Set ("/NodeList/3/$ns3::Ns3NscStack<linux2.6.26>/net.ipv4.tcp_sack", StringValue ("0"));
-      Config::Set ("/NodeList/3/$ns3::Ns3NscStack<linux2.6.26>/net.ipv4.tcp_timestamps", StringValue ("0"));
-      Config::Set ("/NodeList/3/$ns3::Ns3NscStack<linux2.6.26>/net.ipv4.tcp_window_scaling", StringValue ("0"));
-    }
-  // the freebsd stack is not yet built by default, so its commented out for now.
-  // internetStack.SetNscStack ("libfreebsd5.so");
-  for (unsigned int i =4; i < MaxNodes; i++)
-    {
-      internetStack.Install (n.Get (i));
-    }
-  Ipv4AddressHelper ipv4;
-
-  ipv4.SetBase ("10.0.0.0", "255.255.255.0");
-  Ipv4InterfaceContainer ipv4Interfaces = ipv4.Assign (ethInterfaces);
-
-  Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
-
-  uint16_t servPort = 8080;
-  PacketSinkHelper sinkHelper ("ns3::TcpSocketFactory", InetSocketAddress (Ipv4Address::GetAny (), servPort));
-  // start a sink client on all nodes
-  ApplicationContainer sinkApp = sinkHelper.Install (n);
-  sinkApp.Start (Seconds (0));
-  sinkApp.Stop (Seconds (30.0));
-
-  // This tells every node on the network to start a flow to all other nodes on the network ...
-  for (unsigned int i = 0; i < MaxNodes; i++)
-    {
-      for (unsigned int j = 0; j < MaxNodes; j++)
-        {
-          if (i == j)
-            {  // ...but we don't want a node to talk to itself.
-              continue;
-            }
-          Address remoteAddress (InetSocketAddress (ipv4Interfaces.GetAddress (j), servPort));
-          OnOffHelper clientHelper ("ns3::TcpSocketFactory", remoteAddress);
-          clientHelper.SetAttribute 
-            ("OnTime", StringValue ("ns3::ConstantRandomVariable[Constant=1]"));
-          clientHelper.SetAttribute 
-            ("OffTime", StringValue ("ns3::ConstantRandomVariable[Constant=0]"));
-          ApplicationContainer clientApp = clientHelper.Install (n.Get (i));
-          clientApp.Start (Seconds (j)); /* delay startup depending on node number */
-          clientApp.Stop (Seconds (j + runtime));
-        }
-    }
-
-  csma.EnablePcapAll ("tcp-nsc-zoo", false);
-
-  Simulator::Stop (Seconds (100));
-  Simulator::Run ();
-  Simulator::Destroy ();
-
-  return 0;
-}
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/tcp/tcp-pacing.cc ns-3.36/examples/tcp/tcp-pacing.cc
--- ns-3.35/examples/tcp/tcp-pacing.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/tcp/tcp-pacing.cc	2022-04-30 18:23:57.722732800 -0700
@@ -62,7 +62,7 @@
 // an RTT. The size of initial congestion window is set to 10, and pacing
 // of the initial window is enabled. The available command-line options and
 // their default values can be observed in the usual way by running the
-// program to print the help info; i.e.: ./waf --run 'tcp-pacing --PrintHelp'
+// program to print the help info; i.e.: ./ns3 run 'tcp-pacing --PrintHelp'
 //
 // When pacing is disabled, TCP sends eligible packets back-to-back. The
 // differences in behaviour when pacing is disabled can be observed from the
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/tcp/tcp-star-server.cc ns-3.36/examples/tcp/tcp-star-server.cc
--- ns-3.35/examples/tcp/tcp-star-server.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/tcp/tcp-star-server.cc	2022-04-30 18:23:57.722732800 -0700
@@ -33,10 +33,10 @@
 //   "tcp-star-server-$n-$i.pcap" where n and i represent node and interface
 //   numbers respectively
 // Usage examples for things you might want to tweak:
-//       ./waf --run="tcp-star-server"
-//       ./waf --run="tcp-star-server --nNodes=25"
-//       ./waf --run="tcp-star-server --ns3::OnOffApplication::DataRate=10000"
-//       ./waf --run="tcp-star-server --ns3::OnOffApplication::PacketSize=500"
+//       ./ns3 run="tcp-star-server"
+//       ./ns3 run="tcp-star-server --nNodes=25"
+//       ./ns3 run="tcp-star-server --ns3::OnOffApplication::DataRate=10000"
+//       ./ns3 run="tcp-star-server --ns3::OnOffApplication::PacketSize=500"
 // See the ns-3 tutorial for more info on the command line: 
 // http://www.nsnam.org/tutorials.html
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/tcp/tcp-validation.cc ns-3.36/examples/tcp/tcp-validation.cc
--- ns-3.35/examples/tcp/tcp-validation.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/tcp/tcp-validation.cc	2022-04-30 18:23:57.722732800 -0700
@@ -113,13 +113,13 @@
 // validation cases (and syntax of how to run):
 // ------------
 // Case 'dctcp-10ms':  DCTCP single flow, 10ms base RTT, 50 Mbps link, ECN enabled, CoDel:
-//     ./waf --run 'tcp-validation --firstTcpType=dctcp --linkRate=50Mbps --baseRtt=10ms --queueUseEcn=1 --stopTime=15s --validate=1 --validation=dctcp-10ms'
+//     ./ns3 run 'tcp-validation --firstTcpType=dctcp --linkRate=50Mbps --baseRtt=10ms --queueUseEcn=1 --stopTime=15s --validate=1 --validation=dctcp-10ms'
 //    - Throughput between 48 Mbps and 49 Mbps for time greater than 5.6s
 //    - DCTCP alpha below 0.1 for time greater than 5.4s
 //    - DCTCP alpha between 0.06 and 0.085 for time greater than 7s
 //
 // Case 'dctcp-80ms': DCTCP single flow, 80ms base RTT, 50 Mbps link, ECN enabled, CoDel:
-//     ./waf --run 'tcp-validation --firstTcpType=dctcp --linkRate=50Mbps --baseRtt=80ms --queueUseEcn=1 --stopTime=40s --validate=1 --validation=dctcp-80ms'
+//     ./ns3 run 'tcp-validation --firstTcpType=dctcp --linkRate=50Mbps --baseRtt=80ms --queueUseEcn=1 --stopTime=40s --validate=1 --validation=dctcp-80ms'
 //    - Throughput less than 20 Mbps for time less than 14s
 //    - Throughput less than 48 Mbps for time less than 30s
 //    - Throughput between 47.5 Mbps and 48.5 for time greater than 32s
@@ -128,14 +128,14 @@
 //    - DCTCP alpha between 0.015 and 0.025 for time greater than 34
 //
 // Case 'cubic-50ms-no-ecn': CUBIC single flow, 50ms base RTT, 50 Mbps link, ECN disabled, CoDel:
-//     ./waf --run 'tcp-validation --firstTcpType=cubic --linkRate=50Mbps --baseRtt=50ms --queueUseEcn=0 --stopTime=20s --validate=1 --validation=cubic-50ms-no-ecn'
+//     ./ns3 run 'tcp-validation --firstTcpType=cubic --linkRate=50Mbps --baseRtt=50ms --queueUseEcn=0 --stopTime=20s --validate=1 --validation=cubic-50ms-no-ecn'
 //    - Maximum value of cwnd is 511 segments at 5.4593 seconds
 //    - cwnd decreases to 173 segments at 5.80304 seconds
 //    - cwnd reaches another local maxima around 14.2815 seconds of 236 segments
 //    - cwnd reaches a second maximum around 18.048 seconds of 234 segments
 //
 // Case 'cubic-50ms-ecn': CUBIC single flow, 50ms base RTT, 50 Mbps link, ECN enabled, CoDel:
-//     ./waf --run 'tcp-validation --firstTcpType=cubic --linkRate=50Mbps --baseRtt=50ms --queueUseEcn=0 --stopTime=20s --validate=1 --validation=cubic-50ms-no-ecn'
+//     ./ns3 run 'tcp-validation --firstTcpType=cubic --linkRate=50Mbps --baseRtt=50ms --queueUseEcn=0 --stopTime=20s --validate=1 --validation=cubic-50ms-no-ecn'
 //    - Maximum value of cwnd is 511 segments at 5.4593 seconds
 //    - cwnd decreases to 173 segments at 5.7939 seconds
 //    - cwnd reaches another local maxima around 14.3477 seconds of 236 segments
@@ -498,7 +498,7 @@
   ////////////////////////////////////////////////////////////
   // command-line argument parsing                          //
   ////////////////////////////////////////////////////////////
-  CommandLine cmd;
+  CommandLine cmd (__FILE__);
   cmd.AddValue ("firstTcpType", "first TCP type (cubic, dctcp, or reno)", firstTcpType);
   cmd.AddValue ("secondTcpType", "second TCP type (cubic, dctcp, or reno)", secondTcpType);
   cmd.AddValue ("queueType", "bottleneck queue type (fq, codel, pie, or red)", queueType);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/tcp/tcp-variants-comparison.cc ns-3.36/examples/tcp/tcp-variants-comparison.cc
--- ns-3.35/examples/tcp/tcp-variants-comparison.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/tcp/tcp-variants-comparison.cc	2022-04-30 18:23:57.722732800 -0700
@@ -55,153 +55,179 @@
 
 NS_LOG_COMPONENT_DEFINE ("TcpVariantsComparison");
 
-static bool firstCwnd = true;
-static bool firstSshThr = true;
-static bool firstRtt = true;
-static bool firstRto = true;
-static Ptr<OutputStreamWrapper> cWndStream;
-static Ptr<OutputStreamWrapper> ssThreshStream;
-static Ptr<OutputStreamWrapper> rttStream;
-static Ptr<OutputStreamWrapper> rtoStream;
-static Ptr<OutputStreamWrapper> nextTxStream;
-static Ptr<OutputStreamWrapper> nextRxStream;
-static Ptr<OutputStreamWrapper> inFlightStream;
-static uint32_t cWndValue;
-static uint32_t ssThreshValue;
-
+static std::map<uint32_t, bool> firstCwnd;
+static std::map<uint32_t, bool> firstSshThr;
+static std::map<uint32_t, bool> firstRtt;
+static std::map<uint32_t, bool> firstRto;
+static std::map<uint32_t, Ptr<OutputStreamWrapper>> cWndStream;
+static std::map<uint32_t, Ptr<OutputStreamWrapper>> ssThreshStream;
+static std::map<uint32_t, Ptr<OutputStreamWrapper>> rttStream;
+static std::map<uint32_t, Ptr<OutputStreamWrapper>> rtoStream;
+static std::map<uint32_t, Ptr<OutputStreamWrapper>> nextTxStream;
+static std::map<uint32_t, Ptr<OutputStreamWrapper>> nextRxStream;
+static std::map<uint32_t, Ptr<OutputStreamWrapper>> inFlightStream;
+static std::map<uint32_t, uint32_t> cWndValue;
+static std::map<uint32_t, uint32_t> ssThreshValue;
+
+static uint32_t
+GetNodeIdFromContext (std::string context)
+{
+  std::size_t const n1 = context.find_first_of ("/", 1);
+  std::size_t const n2 = context.find_first_of ("/", n1 + 1);
+  return std::stoul (context.substr (n1 + 1, n2 - n1 - 1));
+}
 
 static void
-CwndTracer (uint32_t oldval, uint32_t newval)
+CwndTracer (std::string context,  uint32_t oldval, uint32_t newval)
 {
-  if (firstCwnd)
+  uint32_t nodeId = GetNodeIdFromContext (context);
+
+  if (firstCwnd[nodeId])
     {
-      *cWndStream->GetStream () << "0.0 " << oldval << std::endl;
-      firstCwnd = false;
+      *cWndStream[nodeId]->GetStream () << "0.0 " << oldval << std::endl;
+      firstCwnd[nodeId] = false;
     }
-  *cWndStream->GetStream () << Simulator::Now ().GetSeconds () << " " << newval << std::endl;
-  cWndValue = newval;
+  *cWndStream[nodeId]->GetStream () << Simulator::Now ().GetSeconds () << " " << newval << std::endl;
+  cWndValue[nodeId] = newval;
 
-  if (!firstSshThr)
+  if (!firstSshThr[nodeId])
     {
-      *ssThreshStream->GetStream () << Simulator::Now ().GetSeconds () << " " << ssThreshValue << std::endl;
+      *ssThreshStream[nodeId]->GetStream ()
+          << Simulator::Now ().GetSeconds () << " " << ssThreshValue[nodeId] << std::endl;
     }
 }
 
 static void
-SsThreshTracer (uint32_t oldval, uint32_t newval)
+SsThreshTracer (std::string context, uint32_t oldval, uint32_t newval)
 {
-  if (firstSshThr)
+  uint32_t nodeId = GetNodeIdFromContext (context);
+
+  if (firstSshThr[nodeId])
     {
-      *ssThreshStream->GetStream () << "0.0 " << oldval << std::endl;
-      firstSshThr = false;
+      *ssThreshStream[nodeId]->GetStream () << "0.0 " << oldval << std::endl;
+      firstSshThr[nodeId] = false;
     }
-  *ssThreshStream->GetStream () << Simulator::Now ().GetSeconds () << " " << newval << std::endl;
-  ssThreshValue = newval;
+  *ssThreshStream[nodeId]->GetStream () << Simulator::Now ().GetSeconds () << " " << newval << std::endl;
+  ssThreshValue[nodeId] = newval;
 
-  if (!firstCwnd)
+  if (!firstCwnd[nodeId])
     {
-      *cWndStream->GetStream () << Simulator::Now ().GetSeconds () << " " << cWndValue << std::endl;
+      *cWndStream[nodeId]->GetStream () << Simulator::Now ().GetSeconds () << " " << cWndValue[nodeId] << std::endl;
     }
 }
 
 static void
-RttTracer (Time oldval, Time newval)
+RttTracer (std::string context, Time oldval, Time newval)
 {
-  if (firstRtt)
+  uint32_t nodeId = GetNodeIdFromContext (context);
+
+  if (firstRtt[nodeId])
     {
-      *rttStream->GetStream () << "0.0 " << oldval.GetSeconds () << std::endl;
-      firstRtt = false;
+      *rttStream[nodeId]->GetStream () << "0.0 " << oldval.GetSeconds () << std::endl;
+      firstRtt[nodeId] = false;
     }
-  *rttStream->GetStream () << Simulator::Now ().GetSeconds () << " " << newval.GetSeconds () << std::endl;
+  *rttStream[nodeId]->GetStream () << Simulator::Now ().GetSeconds () << " " << newval.GetSeconds () << std::endl;
 }
 
 static void
-RtoTracer (Time oldval, Time newval)
+RtoTracer (std::string context, Time oldval, Time newval)
 {
-  if (firstRto)
+  uint32_t nodeId = GetNodeIdFromContext (context);
+
+  if (firstRto[nodeId])
     {
-      *rtoStream->GetStream () << "0.0 " << oldval.GetSeconds () << std::endl;
-      firstRto = false;
+      *rtoStream[nodeId]->GetStream () << "0.0 " << oldval.GetSeconds () << std::endl;
+      firstRto[nodeId] = false;
     }
-  *rtoStream->GetStream () << Simulator::Now ().GetSeconds () << " " << newval.GetSeconds () << std::endl;
+  *rtoStream[nodeId]->GetStream () << Simulator::Now ().GetSeconds () << " " << newval.GetSeconds () << std::endl;
 }
 
 static void
-NextTxTracer (SequenceNumber32 old, SequenceNumber32 nextTx)
+NextTxTracer (std::string context, [[maybe_unused]] SequenceNumber32 old, SequenceNumber32 nextTx)
 {
-  NS_UNUSED (old);
-  *nextTxStream->GetStream () << Simulator::Now ().GetSeconds () << " " << nextTx << std::endl;
+  uint32_t nodeId = GetNodeIdFromContext (context);
+
+  *nextTxStream[nodeId]->GetStream () << Simulator::Now ().GetSeconds () << " " << nextTx << std::endl;
 }
 
 static void
-InFlightTracer (uint32_t old, uint32_t inFlight)
+InFlightTracer (std::string context, [[maybe_unused]] uint32_t old, uint32_t inFlight)
 {
-  NS_UNUSED (old);
-  *inFlightStream->GetStream () << Simulator::Now ().GetSeconds () << " " << inFlight << std::endl;
+  uint32_t nodeId = GetNodeIdFromContext (context);
+
+  *inFlightStream[nodeId]->GetStream () << Simulator::Now ().GetSeconds () << " " << inFlight << std::endl;
 }
 
 static void
-NextRxTracer (SequenceNumber32 old, SequenceNumber32 nextRx)
+NextRxTracer (std::string context, [[maybe_unused]] SequenceNumber32 old, SequenceNumber32 nextRx)
 {
-  NS_UNUSED (old);
-  *nextRxStream->GetStream () << Simulator::Now ().GetSeconds () << " " << nextRx << std::endl;
+  uint32_t nodeId = GetNodeIdFromContext (context);
+
+  *nextRxStream[nodeId]->GetStream () << Simulator::Now ().GetSeconds () << " " << nextRx << std::endl;
 }
 
 static void
-TraceCwnd (std::string cwnd_tr_file_name)
+TraceCwnd (std::string cwnd_tr_file_name, uint32_t nodeId)
 {
   AsciiTraceHelper ascii;
-  cWndStream = ascii.CreateFileStream (cwnd_tr_file_name.c_str ());
-  Config::ConnectWithoutContext ("/NodeList/1/$ns3::TcpL4Protocol/SocketList/0/CongestionWindow", MakeCallback (&CwndTracer));
+  cWndStream[nodeId] = ascii.CreateFileStream (cwnd_tr_file_name.c_str ());
+  Config::Connect ("/NodeList/" + std::to_string (nodeId) + "/$ns3::TcpL4Protocol/SocketList/0/CongestionWindow",
+                   MakeCallback (&CwndTracer));
 }
 
 static void
-TraceSsThresh (std::string ssthresh_tr_file_name)
+TraceSsThresh (std::string ssthresh_tr_file_name, uint32_t nodeId)
 {
   AsciiTraceHelper ascii;
-  ssThreshStream = ascii.CreateFileStream (ssthresh_tr_file_name.c_str ());
-  Config::ConnectWithoutContext ("/NodeList/1/$ns3::TcpL4Protocol/SocketList/0/SlowStartThreshold", MakeCallback (&SsThreshTracer));
+  ssThreshStream[nodeId] = ascii.CreateFileStream (ssthresh_tr_file_name.c_str ());
+  Config::Connect ("/NodeList/" + std::to_string (nodeId) + "/$ns3::TcpL4Protocol/SocketList/0/SlowStartThreshold",
+                   MakeCallback (&SsThreshTracer));
 }
 
 static void
-TraceRtt (std::string rtt_tr_file_name)
+TraceRtt (std::string rtt_tr_file_name, uint32_t nodeId)
 {
   AsciiTraceHelper ascii;
-  rttStream = ascii.CreateFileStream (rtt_tr_file_name.c_str ());
-  Config::ConnectWithoutContext ("/NodeList/1/$ns3::TcpL4Protocol/SocketList/0/RTT", MakeCallback (&RttTracer));
+  rttStream[nodeId] = ascii.CreateFileStream (rtt_tr_file_name.c_str ());
+  Config::Connect ("/NodeList/" + std::to_string (nodeId) + "/$ns3::TcpL4Protocol/SocketList/0/RTT",
+                   MakeCallback (&RttTracer));
 }
 
 static void
-TraceRto (std::string rto_tr_file_name)
+TraceRto (std::string rto_tr_file_name, uint32_t nodeId)
 {
   AsciiTraceHelper ascii;
-  rtoStream = ascii.CreateFileStream (rto_tr_file_name.c_str ());
-  Config::ConnectWithoutContext ("/NodeList/1/$ns3::TcpL4Protocol/SocketList/0/RTO", MakeCallback (&RtoTracer));
+  rtoStream[nodeId] = ascii.CreateFileStream (rto_tr_file_name.c_str ());
+  Config::Connect ("/NodeList/" + std::to_string (nodeId) + "/$ns3::TcpL4Protocol/SocketList/0/RTO",
+                   MakeCallback (&RtoTracer));
 }
 
 static void
-TraceNextTx (std::string &next_tx_seq_file_name)
+TraceNextTx (std::string &next_tx_seq_file_name, uint32_t nodeId)
 {
   AsciiTraceHelper ascii;
-  nextTxStream = ascii.CreateFileStream (next_tx_seq_file_name.c_str ());
-  Config::ConnectWithoutContext ("/NodeList/1/$ns3::TcpL4Protocol/SocketList/0/NextTxSequence", MakeCallback (&NextTxTracer));
+  nextTxStream[nodeId] = ascii.CreateFileStream (next_tx_seq_file_name.c_str ());
+  Config::Connect ("/NodeList/" + std::to_string (nodeId) + "/$ns3::TcpL4Protocol/SocketList/0/NextTxSequence",
+                   MakeCallback (&NextTxTracer));
 }
 
 static void
-TraceInFlight (std::string &in_flight_file_name)
+TraceInFlight (std::string &in_flight_file_name, uint32_t nodeId)
 {
   AsciiTraceHelper ascii;
-  inFlightStream = ascii.CreateFileStream (in_flight_file_name.c_str ());
-  Config::ConnectWithoutContext ("/NodeList/1/$ns3::TcpL4Protocol/SocketList/0/BytesInFlight", MakeCallback (&InFlightTracer));
+  inFlightStream[nodeId] = ascii.CreateFileStream (in_flight_file_name.c_str ());
+  Config::Connect ("/NodeList/" + std::to_string (nodeId) + "/$ns3::TcpL4Protocol/SocketList/0/BytesInFlight",
+                   MakeCallback (&InFlightTracer));
 }
 
-
 static void
-TraceNextRx (std::string &next_rx_seq_file_name)
+TraceNextRx (std::string &next_rx_seq_file_name, uint32_t nodeId)
 {
   AsciiTraceHelper ascii;
-  nextRxStream = ascii.CreateFileStream (next_rx_seq_file_name.c_str ());
-  Config::ConnectWithoutContext ("/NodeList/2/$ns3::TcpL4Protocol/SocketList/1/RxBuffer/NextRxSequence", MakeCallback (&NextRxTracer));
+  nextRxStream[nodeId] = ascii.CreateFileStream (next_rx_seq_file_name.c_str ());
+  Config::Connect ("/NodeList/" + std::to_string (nodeId) +
+                       "/$ns3::TcpL4Protocol/SocketList/1/RxBuffer/NextRxSequence",
+                   MakeCallback (&NextRxTracer));
 }
 
 int main (int argc, char *argv[])
@@ -416,13 +442,34 @@
                                             std::ios::out);
       stack.EnableAsciiIpv4All (ascii_wrap);
 
-      Simulator::Schedule (Seconds (0.00001), &TraceCwnd, prefix_file_name + "-cwnd.data");
-      Simulator::Schedule (Seconds (0.00001), &TraceSsThresh, prefix_file_name + "-ssth.data");
-      Simulator::Schedule (Seconds (0.00001), &TraceRtt, prefix_file_name + "-rtt.data");
-      Simulator::Schedule (Seconds (0.00001), &TraceRto, prefix_file_name + "-rto.data");
-      Simulator::Schedule (Seconds (0.00001), &TraceNextTx, prefix_file_name + "-next-tx.data");
-      Simulator::Schedule (Seconds (0.00001), &TraceInFlight, prefix_file_name + "-inflight.data");
-      Simulator::Schedule (Seconds (0.1), &TraceNextRx, prefix_file_name + "-next-rx.data");
+      for (uint16_t index = 0; index < num_flows; index++)
+        {
+          std::string flowString ("");
+          if (num_flows>1)
+            {
+              flowString = "-flow" + std::to_string (index);
+            }
+
+          firstCwnd[index+1] = true;
+          firstSshThr[index+1] = true;
+          firstRtt[index+1] = true;
+          firstRto[index+1] = true;
+
+          Simulator::Schedule (Seconds (start_time * index + 0.00001), &TraceCwnd,
+                               prefix_file_name + flowString + "-cwnd.data", index+1);
+          Simulator::Schedule (Seconds (start_time * index + 0.00001), &TraceSsThresh,
+                               prefix_file_name + flowString + "-ssth.data", index+1);
+          Simulator::Schedule (Seconds (start_time * index + 0.00001), &TraceRtt,
+                               prefix_file_name + flowString + "-rtt.data", index+1);
+          Simulator::Schedule (Seconds (start_time * index + 0.00001), &TraceRto,
+                               prefix_file_name + flowString + "-rto.data", index+1);
+          Simulator::Schedule (Seconds (start_time * index + 0.00001), &TraceNextTx,
+                               prefix_file_name + flowString + "-next-tx.data", index+1);
+          Simulator::Schedule (Seconds (start_time * index + 0.00001), &TraceInFlight,
+                               prefix_file_name + flowString + "-inflight.data", index+1);
+          Simulator::Schedule (Seconds (start_time * index + 0.1), &TraceNextRx,
+                               prefix_file_name + flowString + "-next-rx.data", num_flows+index+1);
+        }
     }
 
   if (pcap)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/tcp/wscript ns-3.36/examples/tcp/wscript
--- ns-3.35/examples/tcp/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/tcp/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,64 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    obj = bld.create_ns3_program('tcp-large-transfer',
-                                 ['point-to-point', 'applications', 'internet'])
-    obj.source = 'tcp-large-transfer.cc'
-
-    obj = bld.create_ns3_program('tcp-nsc-lfn',
-                                 ['point-to-point', 'applications', 'internet'])
-    obj.source = 'tcp-nsc-lfn.cc'
-
-    obj = bld.create_ns3_program('tcp-nsc-zoo',
-                                 ['csma', 'internet', 'applications'])
-    obj.source = 'tcp-nsc-zoo.cc'
-
-    obj = bld.create_ns3_program('tcp-star-server',
-                                 ['point-to-point', 'applications', 'internet'])
-    obj.source = 'tcp-star-server.cc'
-
-    obj = bld.create_ns3_program('star',
-                                 ['netanim', 'point-to-point', 'point-to-point-layout', 'applications', 'internet'])
-    obj.source = 'star.cc'
-
-    obj = bld.create_ns3_program('tcp-bulk-send',
-                                 ['point-to-point', 'applications', 'internet'])
-    obj.source = 'tcp-bulk-send.cc'
-
-    obj = bld.create_ns3_program('tcp-pcap-nanosec-example',
-                                 ['point-to-point', 'applications', 'internet'])
-    obj.source = 'tcp-pcap-nanosec-example.cc'
-
-    obj = bld.create_ns3_program('tcp-nsc-comparison',
-                                 ['point-to-point', 'internet', 'applications', 'flow-monitor'])
-
-    obj.source = 'tcp-nsc-comparison.cc'
-
-    obj = bld.create_ns3_program('tcp-variants-comparison',
-                                 ['point-to-point', 'internet', 'applications', 'flow-monitor'])
-
-    obj.source = 'tcp-variants-comparison.cc'
-
-    obj = bld.create_ns3_program('tcp-pacing',
-                                 ['point-to-point', 'internet', 'applications', 'flow-monitor'])
-
-    obj.source = 'tcp-pacing.cc'
-
-    obj = bld.create_ns3_program('dctcp-example',
-                                 ['core', 'network', 'internet', 'point-to-point', 'applications', 'traffic-control'])
-    obj.source = 'dctcp-example.cc'
-
-    obj = bld.create_ns3_program('tcp-linux-reno',
-                                 ['point-to-point', 'internet', 'applications', 'traffic-control', 'network'])
-
-    obj.source = 'tcp-linux-reno.cc'
-
-    obj = bld.create_ns3_program('tcp-validation',
-                                 ['point-to-point', 'internet', 'applications', 'traffic-control', 'network', 'internet-apps'])
-
-    obj.source = 'tcp-validation.cc'
-
-    obj = bld.create_ns3_program('tcp-bbr-example',
-                                 ['point-to-point', 'internet', 'applications', 'traffic-control', 'network', 'internet-apps', 'flow-monitor'])
-
-    obj.source = 'tcp-bbr-example.cc'
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/traffic-control/CMakeLists.txt ns-3.36/examples/traffic-control/CMakeLists.txt
--- ns-3.35/examples/traffic-control/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/examples/traffic-control/CMakeLists.txt	2022-04-30 18:23:57.722732800 -0700
@@ -0,0 +1,64 @@
+build_example(
+  NAME traffic-control
+  SOURCE_FILES traffic-control.cc
+  LIBRARIES_TO_LINK
+    ${libinternet}
+    ${libpoint-to-point}
+    ${libapplications}
+    ${libtraffic-control}
+    ${libflow-monitor}
+)
+
+build_example(
+  NAME queue-discs-benchmark
+  SOURCE_FILES queue-discs-benchmark.cc
+  LIBRARIES_TO_LINK
+    ${libinternet}
+    ${libpoint-to-point}
+    ${libapplications}
+    ${libinternet-apps}
+    ${libtraffic-control}
+    ${libflow-monitor}
+)
+
+build_example(
+  NAME red-vs-fengadaptive
+  SOURCE_FILES red-vs-fengadaptive.cc
+  LIBRARIES_TO_LINK
+    ${libinternet}
+    ${libpoint-to-point}
+    ${libpoint-to-point-layout}
+    ${libapplications}
+    ${libtraffic-control}
+)
+
+build_example(
+  NAME red-vs-nlred
+  SOURCE_FILES red-vs-nlred.cc
+  LIBRARIES_TO_LINK
+    ${libinternet}
+    ${libpoint-to-point}
+    ${libpoint-to-point-layout}
+    ${libapplications}
+    ${libtraffic-control}
+)
+
+build_example(
+  NAME tbf-example
+  SOURCE_FILES tbf-example.cc
+  LIBRARIES_TO_LINK
+    ${libinternet}
+    ${libpoint-to-point}
+    ${libapplications}
+    ${libtraffic-control}
+)
+
+build_example(
+  NAME cobalt-vs-codel
+  SOURCE_FILES cobalt-vs-codel.cc
+  LIBRARIES_TO_LINK
+    ${libinternet}
+    ${libpoint-to-point}
+    ${libapplications}
+    ${libtraffic-control}
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/traffic-control/wscript ns-3.36/examples/traffic-control/wscript
--- ns-3.35/examples/traffic-control/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/traffic-control/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,25 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    obj = bld.create_ns3_program('traffic-control',
-                                 ['internet', 'point-to-point', 'applications', 'traffic-control', 'flow-monitor'])
-    obj.source = 'traffic-control.cc'
-
-    obj = bld.create_ns3_program('queue-discs-benchmark',
-                                 ['internet', 'point-to-point', 'applications', 'internet-apps', 'traffic-control', 'flow-monitor'])
-    obj.source = 'queue-discs-benchmark.cc'
-
-    obj = bld.create_ns3_program('red-vs-fengadaptive', ['point-to-point', 'point-to-point-layout', 'internet', 'applications', 'traffic-control'])
-    obj.source = 'red-vs-fengadaptive.cc'
-
-    obj = bld.create_ns3_program('red-vs-nlred', ['point-to-point', 'point-to-point-layout', 'internet', 'applications', 'traffic-control'])
-    obj.source = 'red-vs-nlred.cc'
-
-    obj = bld.create_ns3_program('tbf-example',
-                                 ['internet', 'point-to-point', 'applications', 'traffic-control'])
-    obj.source = 'tbf-example.cc'
-
-    obj = bld.create_ns3_program('cobalt-vs-codel',
-                                 ['internet', 'point-to-point', 'applications', 'traffic-control'])
-    obj.source = 'cobalt-vs-codel.cc'
-
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/tutorial/CMakeLists.txt ns-3.36/examples/tutorial/CMakeLists.txt
--- ns-3.35/examples/tutorial/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/examples/tutorial/CMakeLists.txt	2022-04-30 18:23:57.722732800 -0700
@@ -0,0 +1,78 @@
+build_example(
+  NAME hello-simulator
+  SOURCE_FILES hello-simulator.cc
+  LIBRARIES_TO_LINK ${libcore}
+)
+
+build_example(
+  NAME first
+  SOURCE_FILES first.cc
+  LIBRARIES_TO_LINK
+    ${libcore}
+    ${libpoint-to-point}
+    ${libinternet}
+    ${libapplications}
+)
+
+build_example(
+  NAME second
+  SOURCE_FILES second.cc
+  LIBRARIES_TO_LINK
+    ${libcore}
+    ${libpoint-to-point}
+    ${libcsma}
+    ${libinternet}
+    ${libapplications}
+)
+
+build_example(
+  NAME third
+  SOURCE_FILES third.cc
+  LIBRARIES_TO_LINK
+    ${libcore}
+    ${libpoint-to-point}
+    ${libcsma}
+    ${libwifi}
+    ${libinternet}
+    ${libapplications}
+)
+
+build_example(
+  NAME fourth
+  SOURCE_FILES fourth.cc
+  LIBRARIES_TO_LINK ${libcore}
+)
+
+build_example(
+  NAME fifth
+  SOURCE_FILES fifth.cc
+               tutorial-app.cc
+  LIBRARIES_TO_LINK
+    ${libcore}
+    ${libpoint-to-point}
+    ${libinternet}
+    ${libapplications}
+)
+
+build_example(
+  NAME sixth
+  SOURCE_FILES sixth.cc
+               tutorial-app.cc
+  LIBRARIES_TO_LINK
+    ${libcore}
+    ${libpoint-to-point}
+    ${libinternet}
+    ${libapplications}
+)
+
+build_example(
+  NAME seventh
+  SOURCE_FILES seventh.cc
+               tutorial-app.cc
+  LIBRARIES_TO_LINK
+    ${libcore}
+    ${libstats}
+    ${libpoint-to-point}
+    ${libinternet}
+    ${libapplications}
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/tutorial/fifth.cc ns-3.36/examples/tutorial/fifth.cc
--- ns-3.35/examples/tutorial/fifth.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/tutorial/fifth.cc	2022-04-30 18:23:57.722732800 -0700
@@ -18,8 +18,9 @@
 #include "ns3/core-module.h"
 #include "ns3/network-module.h"
 #include "ns3/internet-module.h"
-#include "ns3/point-to-point-module.h"
 #include "ns3/applications-module.h"
+#include "ns3/point-to-point-module.h"
+#include "tutorial-app.h"
 
 using namespace ns3;
 
@@ -59,106 +60,7 @@
 // install in the source node.
 // ===========================================================================
 //
-class MyApp : public Application 
-{
-public:
-
-  MyApp ();
-  virtual ~MyApp();
-
-  void Setup (Ptr<Socket> socket, Address address, uint32_t packetSize, uint32_t nPackets, DataRate dataRate);
-
-private:
-  virtual void StartApplication (void);
-  virtual void StopApplication (void);
-
-  void ScheduleTx (void);
-  void SendPacket (void);
-
-  Ptr<Socket>     m_socket;
-  Address         m_peer;
-  uint32_t        m_packetSize;
-  uint32_t        m_nPackets;
-  DataRate        m_dataRate;
-  EventId         m_sendEvent;
-  bool            m_running;
-  uint32_t        m_packetsSent;
-};
-
-MyApp::MyApp ()
-  : m_socket (0), 
-    m_peer (), 
-    m_packetSize (0), 
-    m_nPackets (0), 
-    m_dataRate (0), 
-    m_sendEvent (), 
-    m_running (false), 
-    m_packetsSent (0)
-{
-}
-
-MyApp::~MyApp()
-{
-  m_socket = 0;
-}
-
-void
-MyApp::Setup (Ptr<Socket> socket, Address address, uint32_t packetSize, uint32_t nPackets, DataRate dataRate)
-{
-  m_socket = socket;
-  m_peer = address;
-  m_packetSize = packetSize;
-  m_nPackets = nPackets;
-  m_dataRate = dataRate;
-}
 
-void
-MyApp::StartApplication (void)
-{
-  m_running = true;
-  m_packetsSent = 0;
-  m_socket->Bind ();
-  m_socket->Connect (m_peer);
-  SendPacket ();
-}
-
-void 
-MyApp::StopApplication (void)
-{
-  m_running = false;
-
-  if (m_sendEvent.IsRunning ())
-    {
-      Simulator::Cancel (m_sendEvent);
-    }
-
-  if (m_socket)
-    {
-      m_socket->Close ();
-    }
-}
-
-void 
-MyApp::SendPacket (void)
-{
-  Ptr<Packet> packet = Create<Packet> (m_packetSize);
-  m_socket->Send (packet);
-
-  if (++m_packetsSent < m_nPackets)
-    {
-      ScheduleTx ();
-    }
-}
-
-void 
-MyApp::ScheduleTx (void)
-{
-  if (m_running)
-    {
-      Time tNext (Seconds (m_packetSize * 8 / static_cast<double> (m_dataRate.GetBitRate ())));
-      m_sendEvent = Simulator::Schedule (tNext, &MyApp::SendPacket, this);
-    }
-}
 
 static void
 CwndChange (uint32_t oldCwnd, uint32_t newCwnd)
@@ -177,6 +79,16 @@
 {
   CommandLine cmd (__FILE__);
   cmd.Parse (argc, argv);
+
+  // In the following three lines, TCP NewReno is used as the congestion
+  // control algorithm, the initial congestion window of a TCP connection is
+  // set to 1 packet, and the classic fast recovery algorithm is used. Note
+  // that this configuration is used only to demonstrate how TCP parameters
+  // can be configured in ns-3. Otherwise, it is recommended to use the default
+  // settings of TCP in ns-3.
+  Config::SetDefault ("ns3::TcpL4Protocol::SocketType", StringValue ("ns3::TcpNewReno"));
+  Config::SetDefault ("ns3::TcpSocket::InitialCwnd", UintegerValue (1));
+  Config::SetDefault ("ns3::TcpL4Protocol::RecoveryType", TypeIdValue (TypeId::LookupByName ("ns3::TcpClassicRecovery")));
   
   NodeContainer nodes;
   nodes.Create (2);
@@ -209,7 +121,7 @@
   Ptr<Socket> ns3TcpSocket = Socket::CreateSocket (nodes.Get (0), TcpSocketFactory::GetTypeId ());
   ns3TcpSocket->TraceConnectWithoutContext ("CongestionWindow", MakeCallback (&CwndChange));
 
-  Ptr<MyApp> app = CreateObject<MyApp> ();
+  Ptr<TutorialApp> app = CreateObject<TutorialApp> ();
   app->Setup (ns3TcpSocket, sinkAddress, 1040, 1000, DataRate ("1Mbps"));
   nodes.Get (0)->AddApplication (app);
   app->SetStartTime (Seconds (1.));
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/tutorial/fourth.cc ns-3.36/examples/tutorial/fourth.cc
--- ns-3.35/examples/tutorial/fourth.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/tutorial/fourth.cc	2022-04-30 18:23:57.726733000 -0700
@@ -18,11 +18,15 @@
 #include "ns3/uinteger.h"
 #include "ns3/traced-value.h"
 #include "ns3/trace-source-accessor.h"
+#include "ns3/simulator.h"
 
 #include <iostream>
 
 using namespace ns3;
 
+/**
+ * Tutorial 4 - a simple Object to show how to hook a trace.
+ */
 class MyObject : public Object
 {
 public:
@@ -45,7 +49,7 @@
   }
 
   MyObject () {}
-  TracedValue<int32_t> m_myInt;
+  TracedValue<int32_t> m_myInt; //!< The traced value.
 };
 
 void
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/tutorial/seventh.cc ns-3.36/examples/tutorial/seventh.cc
--- ns-3.35/examples/tutorial/seventh.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/tutorial/seventh.cc	2022-04-30 18:23:57.726733000 -0700
@@ -18,9 +18,10 @@
 #include "ns3/core-module.h"
 #include "ns3/network-module.h"
 #include "ns3/internet-module.h"
-#include "ns3/point-to-point-module.h"
 #include "ns3/applications-module.h"
+#include "ns3/point-to-point-module.h"
 #include "ns3/stats-module.h"
+#include "tutorial-app.h"
 
 using namespace ns3;
 
@@ -63,128 +64,7 @@
 // in src/stats/docs/seventh-packet-byte-count.png
 // ===========================================================================
 //
-class MyApp : public Application
-{
-public:
-  MyApp ();
-  virtual ~MyApp ();
-
-  /**
-   * Register this type.
-   * \return The TypeId.
-   */
-  static TypeId GetTypeId (void);
-  void Setup (Ptr<Socket> socket, Address address, uint32_t packetSize, uint32_t nPackets, DataRate dataRate);
-
-private:
-  virtual void StartApplication (void);
-  virtual void StopApplication (void);
-
-  void ScheduleTx (void);
-  void SendPacket (void);
-
-  Ptr<Socket>     m_socket;
-  Address         m_peer;
-  uint32_t        m_packetSize;
-  uint32_t        m_nPackets;
-  DataRate        m_dataRate;
-  EventId         m_sendEvent;
-  bool            m_running;
-  uint32_t        m_packetsSent;
-};
-
-MyApp::MyApp ()
-  : m_socket (0),
-    m_peer (),
-    m_packetSize (0),
-    m_nPackets (0),
-    m_dataRate (0),
-    m_sendEvent (),
-    m_running (false),
-    m_packetsSent (0)
-{
-}
-
-MyApp::~MyApp ()
-{
-  m_socket = 0;
-}
-
-/* static */
-TypeId MyApp::GetTypeId (void)
-{
-  static TypeId tid = TypeId ("MyApp")
-    .SetParent<Application> ()
-    .SetGroupName ("Tutorial")
-    .AddConstructor<MyApp> ()
-    ;
-  return tid;
-}
 
-void
-MyApp::Setup (Ptr<Socket> socket, Address address, uint32_t packetSize, uint32_t nPackets, DataRate dataRate)
-{
-  m_socket = socket;
-  m_peer = address;
-  m_packetSize = packetSize;
-  m_nPackets = nPackets;
-  m_dataRate = dataRate;
-}
-
-void
-MyApp::StartApplication (void)
-{
-  m_running = true;
-  m_packetsSent = 0;
-  if (InetSocketAddress::IsMatchingType (m_peer))
-    {
-      m_socket->Bind ();
-    }
-  else
-    {
-      m_socket->Bind6 ();
-    }
-  m_socket->Connect (m_peer);
-  SendPacket ();
-}
-
-void
-MyApp::StopApplication (void)
-{
-  m_running = false;
-
-  if (m_sendEvent.IsRunning ())
-    {
-      Simulator::Cancel (m_sendEvent);
-    }
-
-  if (m_socket)
-    {
-      m_socket->Close ();
-    }
-}
-
-void
-MyApp::SendPacket (void)
-{
-  Ptr<Packet> packet = Create<Packet> (m_packetSize);
-  m_socket->Send (packet);
-
-  if (++m_packetsSent < m_nPackets)
-    {
-      ScheduleTx ();
-    }
-}
-
-void
-MyApp::ScheduleTx (void)
-{
-  if (m_running)
-    {
-      Time tNext (Seconds (m_packetSize * 8 / static_cast<double> (m_dataRate.GetBitRate ())));
-      m_sendEvent = Simulator::Schedule (tNext, &MyApp::SendPacket, this);
-    }
-}
 
 static void
 CwndChange (Ptr<OutputStreamWrapper> stream, uint32_t oldCwnd, uint32_t newCwnd)
@@ -259,7 +139,7 @@
 
   Ptr<Socket> ns3TcpSocket = Socket::CreateSocket (nodes.Get (0), TcpSocketFactory::GetTypeId ());
 
-  Ptr<MyApp> app = CreateObject<MyApp> ();
+  Ptr<TutorialApp> app = CreateObject<TutorialApp> ();
   app->Setup (ns3TcpSocket, sinkAddress, 1040, 1000, DataRate ("1Mbps"));
   nodes.Get (0)->AddApplication (app);
   app->SetStartTime (Seconds (1.));
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/tutorial/sixth.cc ns-3.36/examples/tutorial/sixth.cc
--- ns-3.35/examples/tutorial/sixth.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/tutorial/sixth.cc	2022-04-30 18:23:57.726733000 -0700
@@ -18,8 +18,9 @@
 #include "ns3/core-module.h"
 #include "ns3/network-module.h"
 #include "ns3/internet-module.h"
-#include "ns3/point-to-point-module.h"
 #include "ns3/applications-module.h"
+#include "ns3/point-to-point-module.h"
+#include "tutorial-app.h"
 
 using namespace ns3;
 
@@ -59,121 +60,7 @@
 // install in the source node.
 // ===========================================================================
 //
-class MyApp : public Application
-{
-public:
-  MyApp ();
-  virtual ~MyApp ();
-
-  /**
-   * Register this type.
-   * \return The TypeId.
-   */
-  static TypeId GetTypeId (void);
-  void Setup (Ptr<Socket> socket, Address address, uint32_t packetSize, uint32_t nPackets, DataRate dataRate);
-
-private:
-  virtual void StartApplication (void);
-  virtual void StopApplication (void);
-
-  void ScheduleTx (void);
-  void SendPacket (void);
-
-  Ptr<Socket>     m_socket;
-  Address         m_peer;
-  uint32_t        m_packetSize;
-  uint32_t        m_nPackets;
-  DataRate        m_dataRate;
-  EventId         m_sendEvent;
-  bool            m_running;
-  uint32_t        m_packetsSent;
-};
-
-MyApp::MyApp ()
-  : m_socket (0),
-    m_peer (),
-    m_packetSize (0),
-    m_nPackets (0),
-    m_dataRate (0),
-    m_sendEvent (),
-    m_running (false),
-    m_packetsSent (0)
-{
-}
-
-MyApp::~MyApp ()
-{
-  m_socket = 0;
-}
-
-/* static */
-TypeId MyApp::GetTypeId (void)
-{
-  static TypeId tid = TypeId ("MyApp")
-    .SetParent<Application> ()
-    .SetGroupName ("Tutorial")
-    .AddConstructor<MyApp> ()
-    ;
-  return tid;
-}
-
-void
-MyApp::Setup (Ptr<Socket> socket, Address address, uint32_t packetSize, uint32_t nPackets, DataRate dataRate)
-{
-  m_socket = socket;
-  m_peer = address;
-  m_packetSize = packetSize;
-  m_nPackets = nPackets;
-  m_dataRate = dataRate;
-}
 
-void
-MyApp::StartApplication (void)
-{
-  m_running = true;
-  m_packetsSent = 0;
-  m_socket->Bind ();
-  m_socket->Connect (m_peer);
-  SendPacket ();
-}
-
-void
-MyApp::StopApplication (void)
-{
-  m_running = false;
-
-  if (m_sendEvent.IsRunning ())
-    {
-      Simulator::Cancel (m_sendEvent);
-    }
-
-  if (m_socket)
-    {
-      m_socket->Close ();
-    }
-}
-
-void
-MyApp::SendPacket (void)
-{
-  Ptr<Packet> packet = Create<Packet> (m_packetSize);
-  m_socket->Send (packet);
-
-  if (++m_packetsSent < m_nPackets)
-    {
-      ScheduleTx ();
-    }
-}
-
-void
-MyApp::ScheduleTx (void)
-{
-  if (m_running)
-    {
-      Time tNext (Seconds (m_packetSize * 8 / static_cast<double> (m_dataRate.GetBitRate ())));
-      m_sendEvent = Simulator::Schedule (tNext, &MyApp::SendPacket, this);
-    }
-}
 
 static void
 CwndChange (Ptr<OutputStreamWrapper> stream, uint32_t oldCwnd, uint32_t newCwnd)
@@ -225,7 +112,7 @@
 
   Ptr<Socket> ns3TcpSocket = Socket::CreateSocket (nodes.Get (0), TcpSocketFactory::GetTypeId ());
 
-  Ptr<MyApp> app = CreateObject<MyApp> ();
+  Ptr<TutorialApp> app = CreateObject<TutorialApp> ();
   app->Setup (ns3TcpSocket, sinkAddress, 1040, 1000, DataRate ("1Mbps"));
   nodes.Get (0)->AddApplication (app);
   app->SetStartTime (Seconds (1.));
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/tutorial/third.cc ns-3.36/examples/tutorial/third.cc
--- ns-3.35/examples/tutorial/third.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/tutorial/third.cc	2022-04-30 18:23:57.726733000 -0700
@@ -99,22 +99,20 @@
   YansWifiPhyHelper phy;
   phy.SetChannel (channel.Create ());
 
-  WifiHelper wifi;
-  wifi.SetRemoteStationManager ("ns3::AarfWifiManager");
-
   WifiMacHelper mac;
   Ssid ssid = Ssid ("ns-3-ssid");
+
+  WifiHelper wifi;
+
+  NetDeviceContainer staDevices;
   mac.SetType ("ns3::StaWifiMac",
                "Ssid", SsidValue (ssid),
                "ActiveProbing", BooleanValue (false));
-
-  NetDeviceContainer staDevices;
   staDevices = wifi.Install (phy, mac, wifiStaNodes);
 
+  NetDeviceContainer apDevices;
   mac.SetType ("ns3::ApWifiMac",
                "Ssid", SsidValue (ssid));
-
-  NetDeviceContainer apDevices;
   apDevices = wifi.Install (phy, mac, wifiApNode);
 
   MobilityHelper mobility;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/tutorial/third.py ns-3.36/examples/tutorial/third.py
--- ns-3.35/examples/tutorial/third.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/tutorial/third.py	2022-04-30 18:23:57.726733000 -0700
@@ -93,12 +93,11 @@
 phy = ns.wifi.YansWifiPhyHelper()
 phy.SetChannel(channel.Create())
 
-wifi = ns.wifi.WifiHelper()
-wifi.SetRemoteStationManager("ns3::AarfWifiManager")
-
 mac = ns.wifi.WifiMacHelper()
 ssid = ns.wifi.Ssid ("ns-3-ssid")
 
+wifi = ns.wifi.WifiHelper()
+
 mac.SetType ("ns3::StaWifiMac", "Ssid", ns.wifi.SsidValue(ssid), "ActiveProbing", ns.core.BooleanValue(False))
 staDevices = wifi.Install(phy, mac, wifiStaNodes)
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/tutorial/tutorial-app.cc ns-3.36/examples/tutorial/tutorial-app.cc
--- ns-3.35/examples/tutorial/tutorial-app.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/examples/tutorial/tutorial-app.cc	2022-04-30 18:23:57.726733000 -0700
@@ -0,0 +1,106 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#include "tutorial-app.h"
+#include "ns3/applications-module.h"
+
+using namespace ns3;
+
+TutorialApp::TutorialApp ()
+  : m_socket (0),
+    m_peer (),
+    m_packetSize (0),
+    m_nPackets (0),
+    m_dataRate (0),
+    m_sendEvent (),
+    m_running (false),
+    m_packetsSent (0)
+{
+}
+
+TutorialApp::~TutorialApp ()
+{
+  m_socket = 0;
+}
+
+/* static */
+TypeId TutorialApp::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("TutorialApp")
+    .SetParent<Application> ()
+    .SetGroupName ("Tutorial")
+    .AddConstructor<TutorialApp> ()
+    ;
+  return tid;
+}
+
+void
+TutorialApp::Setup (Ptr<Socket> socket, Address address, uint32_t packetSize, uint32_t nPackets, DataRate dataRate)
+{
+  m_socket = socket;
+  m_peer = address;
+  m_packetSize = packetSize;
+  m_nPackets = nPackets;
+  m_dataRate = dataRate;
+}
+
+void
+TutorialApp::StartApplication (void)
+{
+  m_running = true;
+  m_packetsSent = 0;
+  m_socket->Bind ();
+  m_socket->Connect (m_peer);
+  SendPacket ();
+}
+
+void
+TutorialApp::StopApplication (void)
+{
+  m_running = false;
+
+  if (m_sendEvent.IsRunning ())
+    {
+      Simulator::Cancel (m_sendEvent);
+    }
+
+  if (m_socket)
+    {
+      m_socket->Close ();
+    }
+}
+
+void
+TutorialApp::SendPacket (void)
+{
+  Ptr<Packet> packet = Create<Packet> (m_packetSize);
+  m_socket->Send (packet);
+
+  if (++m_packetsSent < m_nPackets)
+    {
+      ScheduleTx ();
+    }
+}
+
+void
+TutorialApp::ScheduleTx (void)
+{
+  if (m_running)
+    {
+      Time tNext (Seconds (m_packetSize * 8 / static_cast<double> (m_dataRate.GetBitRate ())));
+      m_sendEvent = Simulator::Schedule (tNext, &TutorialApp::SendPacket, this);
+    }
+}
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/tutorial/tutorial-app.h ns-3.36/examples/tutorial/tutorial-app.h
--- ns-3.35/examples/tutorial/tutorial-app.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/examples/tutorial/tutorial-app.h	2022-04-30 18:23:57.726733000 -0700
@@ -0,0 +1,74 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#ifndef TUTORIAL_APP_H
+#define TUTORIAL_APP_H
+
+#include "ns3/core-module.h"
+#include "ns3/network-module.h"
+#include "ns3/internet-module.h"
+
+namespace ns3 {
+
+class Application;
+
+/**
+ * Tutorial - a simple Application sending packets.
+ */
+class TutorialApp : public Application
+{
+public:
+  TutorialApp ();
+  virtual ~TutorialApp ();
+
+  /**
+   * Register this type.
+   * \return The TypeId.
+   */
+  static TypeId GetTypeId (void);
+
+  /**
+   * Setup the socket.
+   * \param socket The socket.
+   * \param address The destination address.
+   * \param packetSize The packet size to transmit.
+   * \param nPackets The number of packets to transmit.
+   * \param dataRate the datarate to use.
+   */
+  void Setup (Ptr<Socket> socket, Address address, uint32_t packetSize, uint32_t nPackets, DataRate dataRate);
+
+private:
+  virtual void StartApplication (void);
+  virtual void StopApplication (void);
+
+  /// Schedule a new transmission.
+  void ScheduleTx (void);
+  /// Send a packet.
+  void SendPacket (void);
+
+  Ptr<Socket>     m_socket;       //!< The tranmission socket.
+  Address         m_peer;         //!< The destination address.
+  uint32_t        m_packetSize;   //!< The packet size.
+  uint32_t        m_nPackets;     //!< The number of pacts to send.
+  DataRate        m_dataRate;     //!< The datarate to use.
+  EventId         m_sendEvent;    //!< Send event.
+  bool            m_running;      //!< True if the application is running.
+  uint32_t        m_packetsSent;  //!< The number of pacts sent.
+};
+
+} // namespace ns3
+
+#endif /* TUTORIAL_APP_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/tutorial/wscript ns-3.36/examples/tutorial/wscript
--- ns-3.35/examples/tutorial/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/tutorial/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,32 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    obj = bld.create_ns3_program('hello-simulator', ['core'])
-    obj.source = 'hello-simulator.cc'
-        
-    obj = bld.create_ns3_program('first', ['core', 'point-to-point', 'internet', 'applications'])
-    obj.source = 'first.cc'
-
-    bld.register_ns3_script('first.py', ['internet', 'point-to-point', 'applications'])
-        
-    obj = bld.create_ns3_program('second', ['core', 'point-to-point', 'csma', 'internet', 'applications'])
-    obj.source = 'second.cc'
-        
-    bld.register_ns3_script('second.py', ['core', 'point-to-point', 'csma', 'internet', 'applications'])
-
-    obj = bld.create_ns3_program('third', ['core', 'point-to-point', 'csma', 'wifi', 'internet', 'applications'])
-    obj.source = 'third.cc'
-
-    bld.register_ns3_script('third.py', ['core', 'point-to-point', 'csma', 'wifi', 'internet', 'applications'])
-
-    obj = bld.create_ns3_program('fourth', ['core'])
-    obj.source = 'fourth.cc'
-
-    obj = bld.create_ns3_program('fifth', ['core', 'point-to-point', 'internet', 'applications'])
-    obj.source = 'fifth.cc'
-
-    obj = bld.create_ns3_program('sixth', ['core', 'point-to-point', 'internet', 'applications'])
-    obj.source = 'sixth.cc'
-
-    obj = bld.create_ns3_program('seventh', ['core', 'stats', 'point-to-point', 'internet', 'applications'])
-    obj.source = 'seventh.cc'
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/udp/CMakeLists.txt ns-3.36/examples/udp/CMakeLists.txt
--- ns-3.35/examples/udp/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/examples/udp/CMakeLists.txt	2022-04-30 18:23:57.726733000 -0700
@@ -0,0 +1,8 @@
+build_example(
+  NAME udp-echo
+  SOURCE_FILES udp-echo.cc
+  LIBRARIES_TO_LINK
+    ${libcsma}
+    ${libinternet}
+    ${libapplications}
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/udp/wscript ns-3.36/examples/udp/wscript
--- ns-3.35/examples/udp/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/udp/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,5 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    obj = bld.create_ns3_program('udp-echo', ['csma', 'internet', 'applications'])
-    obj.source = 'udp-echo.cc'
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/udp-client-server/CMakeLists.txt ns-3.36/examples/udp-client-server/CMakeLists.txt
--- ns-3.35/examples/udp-client-server/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/examples/udp-client-server/CMakeLists.txt	2022-04-30 18:23:57.726733000 -0700
@@ -0,0 +1,17 @@
+build_example(
+  NAME udp-client-server
+  SOURCE_FILES udp-client-server.cc
+  LIBRARIES_TO_LINK
+    ${libcsma}
+    ${libinternet}
+    ${libapplications}
+)
+
+build_example(
+  NAME udp-trace-client-server
+  SOURCE_FILES udp-trace-client-server.cc
+  LIBRARIES_TO_LINK
+    ${libcsma}
+    ${libinternet}
+    ${libapplications}
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/udp-client-server/wscript ns-3.36/examples/udp-client-server/wscript
--- ns-3.35/examples/udp-client-server/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/udp-client-server/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,8 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    obj = bld.create_ns3_program('udp-client-server', ['csma', 'internet', 'applications'])
-    obj.source = 'udp-client-server.cc'
-    
-    obj = bld.create_ns3_program('udp-trace-client-server', ['csma', 'internet', 'applications'])
-    obj.source = 'udp-trace-client-server.cc'
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/wireless/CMakeLists.txt ns-3.36/examples/wireless/CMakeLists.txt
--- ns-3.35/examples/wireless/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/examples/wireless/CMakeLists.txt	2022-04-30 18:23:57.726733000 -0700
@@ -0,0 +1,287 @@
+build_example(
+  NAME mixed-wired-wireless
+  SOURCE_FILES mixed-wired-wireless.cc
+  LIBRARIES_TO_LINK
+    ${libwifi}
+    ${libapplications}
+    ${libolsr}
+    ${libnetanim}
+)
+
+build_example(
+  NAME wifi-80211e-txop
+  SOURCE_FILES wifi-80211e-txop.cc
+  LIBRARIES_TO_LINK ${libwifi}
+                    ${libapplications}
+)
+
+build_example(
+  NAME wifi-80211n-mimo
+  SOURCE_FILES wifi-80211n-mimo.cc
+  LIBRARIES_TO_LINK ${libwifi}
+                    ${libapplications}
+)
+
+build_example(
+  NAME wifi-adhoc
+  SOURCE_FILES wifi-adhoc.cc
+  LIBRARIES_TO_LINK ${libwifi}
+                    ${libapplications}
+)
+
+build_example(
+  NAME wifi-aggregation
+  SOURCE_FILES wifi-aggregation.cc
+  LIBRARIES_TO_LINK ${libwifi}
+                    ${libapplications}
+)
+
+build_example(
+  NAME wifi-ap
+  SOURCE_FILES wifi-ap.cc
+  LIBRARIES_TO_LINK ${libwifi}
+                    ${libapplications}
+)
+
+build_example(
+  NAME wifi-backward-compatibility
+  SOURCE_FILES wifi-backward-compatibility.cc
+  LIBRARIES_TO_LINK ${libwifi}
+                    ${libapplications}
+)
+
+build_example(
+  NAME wifi-blockack
+  SOURCE_FILES wifi-blockack.cc
+  LIBRARIES_TO_LINK ${libwifi}
+                    ${libapplications}
+)
+
+build_example(
+  NAME wifi-clear-channel-cmu
+  SOURCE_FILES wifi-clear-channel-cmu.cc
+  LIBRARIES_TO_LINK ${libinternet}
+                    ${libwifi}
+)
+
+build_example(
+  NAME wifi-dsss-validation
+  SOURCE_FILES wifi-dsss-validation.cc
+  LIBRARIES_TO_LINK ${libwifi}
+)
+
+build_example(
+  NAME wifi-he-network
+  SOURCE_FILES wifi-he-network.cc
+  LIBRARIES_TO_LINK ${libwifi}
+                    ${libapplications}
+)
+
+build_example(
+  NAME wifi-hidden-terminal
+  SOURCE_FILES wifi-hidden-terminal.cc
+  LIBRARIES_TO_LINK
+    ${libwifi}
+    ${libapplications}
+    ${libflow-monitor}
+)
+
+build_example(
+  NAME wifi-ht-network
+  SOURCE_FILES wifi-ht-network.cc
+  LIBRARIES_TO_LINK ${libwifi}
+                    ${libapplications}
+)
+
+build_example(
+  NAME wifi-mixed-network
+  SOURCE_FILES wifi-mixed-network.cc
+  LIBRARIES_TO_LINK ${libwifi}
+                    ${libapplications}
+)
+
+build_example(
+  NAME wifi-multi-tos
+  SOURCE_FILES wifi-multi-tos.cc
+  LIBRARIES_TO_LINK ${libwifi}
+                    ${libapplications}
+)
+
+build_example(
+  NAME wifi-multirate
+  SOURCE_FILES wifi-multirate.cc
+  LIBRARIES_TO_LINK
+    ${libinternet}
+    ${libwifi}
+    ${libolsr}
+    ${libapplications}
+    ${libflow-monitor}
+)
+
+build_example(
+  NAME wifi-ofdm-he-validation
+  SOURCE_FILES wifi-ofdm-he-validation.cc
+  LIBRARIES_TO_LINK ${libwifi}
+)
+
+build_example(
+  NAME wifi-ofdm-ht-validation
+  SOURCE_FILES wifi-ofdm-ht-validation.cc
+  LIBRARIES_TO_LINK ${libwifi}
+)
+
+build_example(
+  NAME wifi-ofdm-validation
+  SOURCE_FILES wifi-ofdm-validation.cc
+  LIBRARIES_TO_LINK ${libwifi}
+)
+
+build_example(
+  NAME wifi-ofdm-vht-validation
+  SOURCE_FILES wifi-ofdm-vht-validation.cc
+  LIBRARIES_TO_LINK
+    ${libcore}
+    ${libmobility}
+    ${libwifi}
+    ${libconfig-store}
+    ${libstats}
+)
+
+build_example(
+  NAME wifi-error-models-comparison
+  SOURCE_FILES wifi-error-models-comparison.cc
+  LIBRARIES_TO_LINK ${libwifi}
+)
+
+build_example(
+  NAME wifi-power-adaptation-distance
+  SOURCE_FILES wifi-power-adaptation-distance.cc
+  LIBRARIES_TO_LINK ${libwifi}
+                    ${libapplications}
+)
+
+build_example(
+  NAME wifi-power-adaptation-interference
+  SOURCE_FILES wifi-power-adaptation-interference.cc
+  LIBRARIES_TO_LINK
+    ${libwifi}
+    ${libapplications}
+    ${libflow-monitor}
+)
+
+build_example(
+  NAME wifi-rate-adaptation-distance
+  SOURCE_FILES wifi-rate-adaptation-distance.cc
+  LIBRARIES_TO_LINK ${libwifi}
+                    ${libapplications}
+)
+
+build_example(
+  NAME wifi-simple-adhoc
+  SOURCE_FILES wifi-simple-adhoc.cc
+  LIBRARIES_TO_LINK ${libinternet}
+                    ${libwifi}
+)
+
+build_example(
+  NAME wifi-simple-adhoc-grid
+  SOURCE_FILES wifi-simple-adhoc-grid.cc
+  LIBRARIES_TO_LINK
+    ${libinternet}
+    ${libwifi}
+    ${libolsr}
+)
+
+build_example(
+  NAME wifi-simple-ht-hidden-stations
+  SOURCE_FILES wifi-simple-ht-hidden-stations.cc
+  LIBRARIES_TO_LINK ${libwifi}
+                    ${libapplications}
+)
+
+build_example(
+  NAME wifi-simple-infra
+  SOURCE_FILES wifi-simple-infra.cc
+  LIBRARIES_TO_LINK ${libinternet}
+                    ${libwifi}
+)
+
+build_example(
+  NAME wifi-simple-interference
+  SOURCE_FILES wifi-simple-interference.cc
+  LIBRARIES_TO_LINK ${libinternet}
+                    ${libwifi}
+)
+
+build_example(
+  NAME wifi-sleep
+  SOURCE_FILES wifi-sleep.cc
+  LIBRARIES_TO_LINK ${libwifi}
+                    ${libapplications}
+)
+
+build_example(
+  NAME wifi-spatial-reuse
+  SOURCE_FILES wifi-spatial-reuse.cc
+  LIBRARIES_TO_LINK ${libwifi}
+                    ${libapplications}
+)
+
+build_example(
+  NAME wifi-spectrum-per-example
+  SOURCE_FILES wifi-spectrum-per-example.cc
+  LIBRARIES_TO_LINK ${libwifi}
+                    ${libapplications}
+)
+
+build_example(
+  NAME wifi-spectrum-per-interference
+  SOURCE_FILES wifi-spectrum-per-interference.cc
+  LIBRARIES_TO_LINK ${libwifi}
+                    ${libapplications}
+)
+
+build_example(
+  NAME wifi-spectrum-saturation-example
+  SOURCE_FILES wifi-spectrum-saturation-example.cc
+  LIBRARIES_TO_LINK ${libwifi}
+                    ${libapplications}
+)
+
+build_example(
+  NAME wifi-tcp
+  SOURCE_FILES wifi-tcp.cc
+  LIBRARIES_TO_LINK ${libwifi}
+                    ${libapplications}
+)
+
+build_example(
+  NAME wifi-timing-attributes
+  SOURCE_FILES wifi-timing-attributes.cc
+  LIBRARIES_TO_LINK ${libwifi}
+                    ${libapplications}
+)
+
+build_example(
+  NAME wifi-txop-aggregation
+  SOURCE_FILES wifi-txop-aggregation.cc
+  LIBRARIES_TO_LINK ${libwifi}
+                    ${libapplications}
+)
+
+build_example(
+  NAME wifi-vht-network
+  SOURCE_FILES wifi-vht-network.cc
+  LIBRARIES_TO_LINK ${libwifi}
+                    ${libapplications}
+)
+
+build_example(
+  NAME wifi-wired-bridging
+  SOURCE_FILES wifi-wired-bridging.cc
+  LIBRARIES_TO_LINK
+    ${libwifi}
+    ${libcsma}
+    ${libbridge}
+    ${libapplications}
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/wireless/examples-to-run.py ns-3.36/examples/wireless/examples-to-run.py
--- ns-3.35/examples/wireless/examples-to-run.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/wireless/examples-to-run.py	2022-04-30 18:23:57.726733000 -0700
@@ -42,8 +42,8 @@
     ("wifi-ht-network --simulationTime=0.2 --frequency=5 --useRts=1 --minExpectedThroughput=5 --maxExpectedThroughput=131", "True", "True"),
     ("wifi-ht-network --simulationTime=0.2 --frequency=2.4 --useRts=0 --minExpectedThroughput=5 --maxExpectedThroughput=132", "True", "True"),
     ("wifi-ht-network --simulationTime=0.2 --frequency=2.4 --useRts=1 --minExpectedThroughput=5 --maxExpectedThroughput=128", "True", "True"),
-    ("wifi-vht-network --simulationTime=0.2 --useRts=0  --minExpectedThroughput=5 --maxExpectedThroughput=562", "True", "True"),
-    ("wifi-vht-network --simulationTime=0.2 --useRts=1  --minExpectedThroughput=5 --maxExpectedThroughput=525", "True", "True"),
+    ("wifi-vht-network --simulationTime=0.2 --useRts=0  --minExpectedThroughput=5 --maxExpectedThroughput=583", "True", "True"),
+    ("wifi-vht-network --simulationTime=0.2 --useRts=1  --minExpectedThroughput=5 --maxExpectedThroughput=543", "True", "True"),
     ("wifi-he-network --simulationTime=0.25 --frequency=5 --useRts=0 --minExpectedThroughput=6 --maxExpectedThroughput=844", "True", "True"),
     ("wifi-he-network --simulationTime=0.3 --frequency=5 --useRts=0 --useExtendedBlockAck=1 --minExpectedThroughput=6 --maxExpectedThroughput=1033", "True", "True"),
     ("wifi-he-network --simulationTime=0.3 --frequency=5 --useRts=1 --minExpectedThroughput=6 --maxExpectedThroughput=745", "True", "True"),
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/wireless/mixed-wired-wireless.cc ns-3.36/examples/wireless/mixed-wired-wireless.cc
--- ns-3.35/examples/wireless/mixed-wired-wireless.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/wireless/mixed-wired-wireless.cc	2022-04-30 18:23:57.726733000 -0700
@@ -295,7 +295,6 @@
       ss << i;
       ssidString += ss.str ();
       Ssid ssid = Ssid (ssidString);
-      wifiInfra.SetRemoteStationManager ("ns3::ArfWifiManager");
       // setup stas
       macInfra.SetType ("ns3::StaWifiMac",
                         "Ssid", SsidValue (ssid));
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/wireless/mixed-wired-wireless.py ns-3.36/examples/wireless/mixed-wired-wireless.py
--- ns-3.35/examples/wireless/mixed-wired-wireless.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/wireless/mixed-wired-wireless.py	2022-04-30 18:23:57.726733000 -0700
@@ -260,7 +260,6 @@
         ssid = ns.wifi.Ssid('wifi-infra' + str(i))
         wifiInfra = ns.wifi.WifiHelper()
         wifiPhy.SetChannel(wifiChannel.Create())
-        wifiInfra.SetRemoteStationManager('ns3::ArfWifiManager')
         macInfra = ns.wifi.WifiMacHelper();
         macInfra.SetType("ns3::StaWifiMac",
                          "Ssid", ns.wifi.SsidValue(ssid))
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/wireless/wifi-80211e-txop.cc ns-3.36/examples/wireless/wifi-80211e-txop.cc
--- ns-3.35/examples/wireless/wifi-80211e-txop.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/wireless/wifi-80211e-txop.cc	2022-04-30 18:23:57.726733000 -0700
@@ -55,7 +55,7 @@
 //
 // The user can select the distance between the stations and the APs, can enable/disable the RTS/CTS mechanism
 // and can choose the payload size and the simulation duration.
-// Example: ./waf --run "wifi-80211e-txop --distance=10 --simulationTime=20 --payloadSize=1000"
+// Example: ./ns3 run "wifi-80211e-txop --distance=10 --simulationTime=20 --payloadSize=1000"
 //
 // The output prints the throughput measured for the 4 cases/networks described above. When TXOP is enabled, results show
 // increased throughput since the channel is granted for a longer duration. TXOP is enabled by default for AC_VI and AC_VO,
@@ -70,8 +70,14 @@
  */
 struct TxopDurationTracer
 {
+  /**
+   * Callback connected to TXOP duration trace source.
+   *
+   * \param startTime TXOP start time
+   * \param duration TXOP duration
+   */
   void Trace (Time startTime, Time duration);
-  Time m_max {Seconds (0)};
+  Time m_max {Seconds (0)};     //!< maximum TXOP duration
 };
 
 void
@@ -109,7 +115,8 @@
   phy.SetPcapDataLinkType (WifiPhyHelper::DLT_IEEE802_11_RADIO);
   phy.SetChannel (channel.Create ());
 
-  WifiHelper wifi; //the default standard of 802.11a will be selected by this helper since the program doesn't specify another one
+  WifiHelper wifi;
+  wifi.SetStandard (WIFI_STANDARD_80211a);
   wifi.SetRemoteStationManager ("ns3::IdealWifiManager");
   WifiMacHelper mac;
 
@@ -118,7 +125,7 @@
 
   //Network A
   ssid = Ssid ("network-A");
-  phy.Set ("ChannelNumber", UintegerValue (36));
+  phy.Set ("ChannelSettings", StringValue ("{36, 20, BAND_5GHZ, 0}"));
   mac.SetType ("ns3::StaWifiMac",
                "QosSupported", BooleanValue (true),
                "Ssid", SsidValue (ssid));
@@ -132,7 +139,7 @@
 
   //Network B
   ssid = Ssid ("network-B");
-  phy.Set ("ChannelNumber", UintegerValue (40));
+  phy.Set ("ChannelSettings", StringValue ("{40, 20, BAND_5GHZ, 0}"));
   mac.SetType ("ns3::StaWifiMac",
                "QosSupported", BooleanValue (true),
                "Ssid", SsidValue (ssid));
@@ -166,7 +173,7 @@
 
   //Network C
   ssid = Ssid ("network-C");
-  phy.Set ("ChannelNumber", UintegerValue (44));
+  phy.Set ("ChannelSettings", StringValue ("{44, 20, BAND_5GHZ, 0}"));
   mac.SetType ("ns3::StaWifiMac",
                "QosSupported", BooleanValue (true),
                "Ssid", SsidValue (ssid));
@@ -190,7 +197,7 @@
 
   //Network D
   ssid = Ssid ("network-D");
-  phy.Set ("ChannelNumber", UintegerValue (48));
+  phy.Set ("ChannelSettings", StringValue ("{48, 20, BAND_5GHZ, 0}"));
   mac.SetType ("ns3::StaWifiMac",
                "QosSupported", BooleanValue (true),
                "Ssid", SsidValue (ssid));
@@ -387,7 +394,7 @@
   throughput = totalPacketsThroughC * payloadSize * 8 / (simulationTime * 1000000.0);
   std::cout << "AC_VI with default TXOP limit (3.008ms): " << '\n'
             << "  Throughput = " << throughput << " Mbit/s" << '\n';
-  if (verifyResults && (throughput < 35 || throughput > 36))
+  if (verifyResults && (throughput < 35.5 || throughput > 36.5))
     {
       NS_LOG_ERROR ("Obtained throughput " << throughput << " is not in the expected boundaries!");
       exit (1);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/wireless/wifi-80211n-mimo.cc ns-3.36/examples/wireless/wifi-80211n-mimo.cc
--- ns-3.35/examples/wireless/wifi-80211n-mimo.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/wireless/wifi-80211n-mimo.cc	2022-04-30 18:23:57.726733000 -0700
@@ -30,6 +30,12 @@
 //
 // The user can choose whether UDP or TCP should be used and can configure
 // some 802.11n parameters (frequency, channel width and guard interval).
+//
+// An important configuration parameter is preamble detection.  It is enabled
+// by default (to match the default ns-3 configuration) but will dominate
+// performance at low SNRs, causing the different MCS to appear to have
+// the same range (because regardless of the MCS, the preamble detection
+// thresholds do not change).
 
 #include "ns3/gnuplot.h"
 #include "ns3/command-line.h"
@@ -96,11 +102,13 @@
   double step = 5; //meters
   bool shortGuardInterval = false;
   bool channelBonding = false;
+  bool preambleDetection = true;
 
   CommandLine cmd (__FILE__);
   cmd.AddValue ("step", "Granularity of the results to be plotted in meters", step);
   cmd.AddValue ("simulationTime", "Simulation time per step (in seconds)", simulationTime);
   cmd.AddValue ("channelBonding", "Enable/disable channel bonding (channel width = 20 MHz if false, channel width = 40 MHz if true)", channelBonding);
+  cmd.AddValue ("preambleDetection", "Enable/disable preamble detection model", preambleDetection);
   cmd.AddValue ("shortGuardInterval", "Enable/disable short guard interval", shortGuardInterval);
   cmd.AddValue ("frequency", "Whether working in the 2.4 or 5.0 GHz band (other values gets rejected)", frequency);
   cmd.AddValue ("udp", "UDP if set to 1, TCP otherwise", udp);
@@ -136,21 +144,29 @@
           YansWifiChannelHelper channel = YansWifiChannelHelper::Default ();
           YansWifiPhyHelper phy;
           phy.SetChannel (channel.Create ());
+          if (!preambleDetection)
+            {
+              phy.DisablePreambleDetectionModel ();
+            }
 
           // Set MIMO capabilities
           phy.Set ("Antennas", UintegerValue (nStreams));
           phy.Set ("MaxSupportedTxSpatialStreams", UintegerValue (nStreams));
           phy.Set ("MaxSupportedRxSpatialStreams", UintegerValue (nStreams));
+          phy.Set ("ChannelSettings", StringValue (std::string ("{0, ")
+                                                   + (channelBonding ? "40, " : "20, ")
+                                                   + (frequency == 2.4 ? "BAND_2_4GHZ" : "BAND_5GHZ")
+                                                   + ", 0}"));
 
           WifiMacHelper mac;
           WifiHelper wifi;
           if (frequency == 5.0)
             {
-              wifi.SetStandard (WIFI_STANDARD_80211n_5GHZ);
+              wifi.SetStandard (WIFI_STANDARD_80211n);
             }
           else if (frequency == 2.4)
             {
-              wifi.SetStandard (WIFI_STANDARD_80211n_2_4GHZ);
+              wifi.SetStandard (WIFI_STANDARD_80211n);
               Config::SetDefault ("ns3::LogDistancePropagationLossModel::ReferenceLoss", DoubleValue (40.046));
             }
           else
@@ -186,12 +202,6 @@
           NetDeviceContainer apDevice;
           apDevice = wifi.Install (phy, mac, wifiApNode);
 
-          // Set channel width
-          if (channelBonding)
-            {
-              Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/ChannelWidth", UintegerValue (40));
-            }
-
           // Set guard interval
           Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/HtConfiguration/ShortGuardIntervalSupported", BooleanValue (shortGuardInterval));
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/wireless/wifi-adhoc.cc ns-3.36/examples/wireless/wifi-adhoc.cc
--- ns-3.35/examples/wireless/wifi-adhoc.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/wireless/wifi-adhoc.cc	2022-04-30 18:23:57.726733000 -0700
@@ -37,22 +37,63 @@
 
 NS_LOG_COMPONENT_DEFINE ("Wifi-Adhoc");
 
+/**
+ * WiFi adhoc experiment class.
+ * 
+ * It handles the creation and run of an experiment.
+ */
 class Experiment
 {
 public:
   Experiment ();
+  /**
+   * Constructor.
+   * \param name The name of the experiment.
+   */
   Experiment (std::string name);
+
+  /**
+   * Run an experiment.
+   * \param wifi      //!< The WifiHelper class.
+   * \param wifiPhy   //!< The YansWifiPhyHelper class.
+   * \param wifiMac   //!< The WifiMacHelper class.
+   * \param wifiChannel //!< The YansWifiChannelHelper class.
+   * \return a 2D dataset of the experiment data. 
+   */
   Gnuplot2dDataset Run (const WifiHelper &wifi, const YansWifiPhyHelper &wifiPhy,
                         const WifiMacHelper &wifiMac, const YansWifiChannelHelper &wifiChannel);
 private:
+  /**
+   * Receive a packet.
+   * \param socket The recieving socket.
+   */
   void ReceivePacket (Ptr<Socket> socket);
+  /**
+   * Set the position of a node.
+   * \param node The node.
+   * \param position The position of the node.
+   */
   void SetPosition (Ptr<Node> node, Vector position);
+  /**
+   * Get the position of a node.
+   * \param node The node.
+   * \return the position of the node.
+   */
   Vector GetPosition (Ptr<Node> node);
+  /**
+   * Move a node by 1m on the x axis, stops at 210m.
+   * \param node The node.
+   */
   void AdvancePosition (Ptr<Node> node);
+  /**
+   * Setup the receiving socket.
+   * \param node The receiving node.
+   * \return the socket.
+   */
   Ptr<Socket> SetupPacketReceive (Ptr<Node> node);
 
-  uint32_t m_bytesTotal;
-  Gnuplot2dDataset m_output;
+  uint32_t m_bytesTotal;      //!< The number of received bytes.
+  Gnuplot2dDataset m_output;  //!< The output dataset.
 };
 
 Experiment::Experiment ()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/wireless/wifi-aggregation.cc ns-3.36/examples/wireless/wifi-aggregation.cc
--- ns-3.35/examples/wireless/wifi-aggregation.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/wireless/wifi-aggregation.cc	2022-04-30 18:23:57.726733000 -0700
@@ -56,7 +56,7 @@
 //Packets in this simulation belong to BestEffort Access Class (AC_BE).
 //
 // The user can select the distance between the stations and the APs and can enable/disable the RTS/CTS mechanism.
-// Example: ./waf --run "wifi-aggregation --distance=10 --enableRts=0 --simulationTime=20"
+// Example: ./ns3 run "wifi-aggregation --distance=10 --enableRts=0 --simulationTime=20"
 //
 // The output prints the throughput measured for the 4 cases/networks described above. When default aggregation parameters are enabled, the
 // maximum A-MPDU size is 65 kB and the throughput is maximal. When aggregation is disabled, the throughput is about the half of the physical
@@ -103,7 +103,7 @@
   phy.SetChannel (channel.Create ());
 
   WifiHelper wifi;
-  wifi.SetStandard (WIFI_STANDARD_80211n_5GHZ);
+  wifi.SetStandard (WIFI_STANDARD_80211n);
   wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager", "DataMode", StringValue ("HtMcs7"), "ControlMode", StringValue ("HtMcs0"));
   WifiMacHelper mac;
 
@@ -112,7 +112,7 @@
 
   // Network A
   ssid = Ssid ("network-A");
-  phy.Set ("ChannelNumber", UintegerValue (36));
+  phy.Set ("ChannelSettings", StringValue ("{36, 0, BAND_5GHZ, 0}"));
   mac.SetType ("ns3::StaWifiMac",
                "Ssid", SsidValue (ssid));
   staDeviceA = wifi.Install (phy, mac, wifiStaNodes.Get (0));
@@ -124,7 +124,7 @@
 
   // Network B
   ssid = Ssid ("network-B");
-  phy.Set ("ChannelNumber", UintegerValue (40));
+  phy.Set ("ChannelSettings", StringValue ("{40, 0, BAND_5GHZ, 0}"));
   mac.SetType ("ns3::StaWifiMac",
                "Ssid", SsidValue (ssid));
 
@@ -147,7 +147,7 @@
 
   // Network C
   ssid = Ssid ("network-C");
-  phy.Set ("ChannelNumber", UintegerValue (44));
+  phy.Set ("ChannelSettings", StringValue ("{44, 0, BAND_5GHZ, 0}"));
   mac.SetType ("ns3::StaWifiMac",
                "Ssid", SsidValue (ssid));
 
@@ -172,7 +172,7 @@
 
   // Network D
   ssid = Ssid ("network-D");
-  phy.Set ("ChannelNumber", UintegerValue (48));
+  phy.Set ("ChannelSettings", StringValue ("{48, 0, BAND_5GHZ, 0}"));
   mac.SetType ("ns3::StaWifiMac",
                "Ssid", SsidValue (ssid));
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/wireless/wifi-ap.cc ns-3.36/examples/wireless/wifi-ap.cc
--- ns-3.35/examples/wireless/wifi-ap.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/wireless/wifi-ap.cc	2022-04-30 18:23:57.726733000 -0700
@@ -140,7 +140,6 @@
   YansWifiChannelHelper wifiChannel = YansWifiChannelHelper::Default ();
   wifiPhy.SetChannel (wifiChannel.Create ());
   Ssid ssid = Ssid ("wifi-default");
-  wifi.SetRemoteStationManager ("ns3::ArfWifiManager");
   // setup stas.
   wifiMac.SetType ("ns3::StaWifiMac",
                    "ActiveProbing", BooleanValue (true),
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/wireless/wifi-ap.py ns-3.36/examples/wireless/wifi-ap.py
--- ns-3.35/examples/wireless/wifi-ap.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/wireless/wifi-ap.py	2022-04-30 18:23:57.726733000 -0700
@@ -118,7 +118,6 @@
     wifiPhy.SetChannel(wifiChannel.Create())
 
     ssid = ns.wifi.Ssid("wifi-default")
-    wifi.SetRemoteStationManager("ns3::ArfWifiManager")
     wifiMac = ns.wifi.WifiMacHelper()
 
     # setup stas.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/wireless/wifi-backward-compatibility.cc ns-3.36/examples/wireless/wifi-backward-compatibility.cc
--- ns-3.35/examples/wireless/wifi-backward-compatibility.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/wireless/wifi-backward-compatibility.cc	2022-04-30 18:23:57.726733000 -0700
@@ -22,6 +22,8 @@
 #include "ns3/config.h"
 #include "ns3/uinteger.h"
 #include "ns3/boolean.h"
+#include "ns3/enum.h"
+#include "ns3/tuple.h"
 #include "ns3/log.h"
 #include "ns3/yans-wifi-helper.h"
 #include "ns3/ssid.h"
@@ -37,57 +39,67 @@
 // network where the AP and the station use different 802.11 standards.
 //
 // It outputs the throughput for a given configuration: user can specify
-// the 802.11 versions for the AT and the station as well as their rate
+// the 802.11 versions for the AP and the station as well as their rate
 // adaptation algorithms. It also allows to decide whether the station,
 // the AP or both has/have traffic to send.
 //
 // Example for an IEEE 802.11ac station sending traffic to an 802.11a AP using Ideal rate adaptation algorithm:
-// ./waf --run "wifi-backward-compatibility --apVersion=80211a --staVersion=80211ac --staRaa=Ideal"
+// ./ns3 run "wifi-backward-compatibility --apVersion=80211a --staVersion=80211ac --staRaa=Ideal"
 
 using namespace ns3;
 
 NS_LOG_COMPONENT_DEFINE ("wifi-backward-compatibility");
 
-WifiStandard ConvertStringToStandard (std::string version)
+std::pair<WifiStandard, WifiPhyBand> ConvertStringToStandardAndBand (std::string version)
 {
   WifiStandard standard = WIFI_STANDARD_80211a;
+  WifiPhyBand band = WIFI_PHY_BAND_5GHZ;
   if (version == "80211a")
     {
       standard = WIFI_STANDARD_80211a;
+      band = WIFI_PHY_BAND_5GHZ;
     }
   else if (version == "80211b")
     {
       standard = WIFI_STANDARD_80211b;
+      band = WIFI_PHY_BAND_2_4GHZ;
     }
   else if (version == "80211g")
     {
       standard = WIFI_STANDARD_80211g;
+      band = WIFI_PHY_BAND_2_4GHZ;
     }
   else if (version == "80211p")
     {
       standard = WIFI_STANDARD_80211p;
+      band = WIFI_PHY_BAND_5GHZ;
     }
   else if (version == "80211n_2_4GHZ")
     {
-      standard = WIFI_STANDARD_80211n_2_4GHZ;
+      standard = WIFI_STANDARD_80211n;
+      band = WIFI_PHY_BAND_2_4GHZ;
     }
   else if (version == "80211n_5GHZ")
     {
-      standard = WIFI_STANDARD_80211n_5GHZ;
+      standard = WIFI_STANDARD_80211n;
+      band = WIFI_PHY_BAND_5GHZ;
     }
   else if (version == "80211ac")
     {
       standard = WIFI_STANDARD_80211ac;
+      band = WIFI_PHY_BAND_5GHZ;
     }
   else if (version == "80211ax_2_4GHZ")
     {
-      standard = WIFI_STANDARD_80211ax_2_4GHZ;
+      standard = WIFI_STANDARD_80211ax;
+      band = WIFI_PHY_BAND_2_4GHZ;
     }
   else if (version == "80211ax_5GHZ")
     {
-      standard = WIFI_STANDARD_80211ax_5GHZ;
+      standard = WIFI_STANDARD_80211ax;
+      band = WIFI_PHY_BAND_5GHZ;
     }
-  return standard;
+  return {standard, band};
 }
 
 int main (int argc, char *argv[])
@@ -123,8 +135,10 @@
   WifiMacHelper mac;
   WifiHelper wifi;
   Ssid ssid = Ssid ("ns3");
+  TupleValue<UintegerValue, UintegerValue, EnumValue, UintegerValue> channelValue;
 
-  wifi.SetStandard (ConvertStringToStandard (staVersion));
+  const auto& [staStandard, staBand] = ConvertStringToStandardAndBand (staVersion);
+  wifi.SetStandard (staStandard);
   wifi.SetRemoteStationManager ("ns3::" + staRaa + "WifiManager");
 
   mac.SetType ("ns3::StaWifiMac",
@@ -132,16 +146,15 @@
                "Ssid", SsidValue (ssid));
 
   //Workaround needed as long as we do not fully support channel bonding
-  if (staVersion == "80211ac")
-    {
-      phy.Set ("ChannelWidth", UintegerValue (20));
-      phy.Set ("Frequency", UintegerValue (5180));
-    }
+  uint16_t width = (staVersion == "80211ac" ? 20 : 0);
+  channelValue.Set (WifiPhy::ChannelTuple {0, width, staBand, 0});
+  phy.Set ("ChannelSettings", channelValue);
 
   NetDeviceContainer staDevice;
   staDevice = wifi.Install (phy, mac, wifiStaNode);
 
-  wifi.SetStandard (ConvertStringToStandard (apVersion));
+  const auto& [apStandard, apBand] = ConvertStringToStandardAndBand (apVersion);
+  wifi.SetStandard (apStandard);
   wifi.SetRemoteStationManager ("ns3::" + apRaa + "WifiManager");
 
   mac.SetType ("ns3::ApWifiMac",
@@ -149,11 +162,9 @@
                "Ssid", SsidValue (ssid));
 
   //Workaround needed as long as we do not fully support channel bonding
-  if (apVersion == "80211ac")
-    {
-      phy.Set ("ChannelWidth", UintegerValue (20));
-      phy.Set ("Frequency", UintegerValue (5180));
-    }
+  width = (apVersion == "80211ac" ? 20 : 0);
+  channelValue.Set (WifiPhy::ChannelTuple {0, width, apBand, 0});
+  phy.Set ("ChannelSettings", channelValue);
 
   NetDeviceContainer apDevice;
   apDevice = wifi.Install (phy, mac, wifiApNode);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/wireless/wifi-blockack.cc ns-3.36/examples/wireless/wifi-blockack.cc
--- ns-3.35/examples/wireless/wifi-blockack.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/wireless/wifi-blockack.cc	2022-04-30 18:23:57.726733000 -0700
@@ -19,7 +19,7 @@
  */
 
 /**
- * This is a simple example in order to show how 802.11e compressed block ack mechanism could be used.
+ * This is a simple example in order to show how 802.11n compressed block ack mechanism could be used.
  *
  * Network topology:
  *
@@ -78,9 +78,10 @@
   phy.SetChannel (channel.Create ());
 
   WifiHelper wifi;
+  wifi.SetStandard (WIFI_STANDARD_80211n);
   WifiMacHelper mac;
   /* disable fragmentation */
-  wifi.SetRemoteStationManager ("ns3::AarfWifiManager", "FragmentationThreshold", UintegerValue (2500));
+  wifi.SetRemoteStationManager ("ns3::IdealWifiManager", "FragmentationThreshold", UintegerValue (2500));
 
   Ssid ssid ("My-network");
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/wireless/wifi-clear-channel-cmu.cc ns-3.36/examples/wireless/wifi-clear-channel-cmu.cc
--- ns-3.35/examples/wireless/wifi-clear-channel-cmu.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/wireless/wifi-clear-channel-cmu.cc	2022-04-30 18:23:57.726733000 -0700
@@ -35,23 +35,66 @@
 
 NS_LOG_COMPONENT_DEFINE ("ClearChannelCmu");
 
+/**
+ * WiFi clear channel cmu experiment class.
+ * 
+ * It handles the creation and run of an experiment.
+ */
 class Experiment
 {
 public:
   Experiment ();
+  /**
+   * Constructor.
+   * \param name The name of the experiment.
+   */
   Experiment (std::string name);
+  /**
+   * Run an experiment.
+   * \param wifi      //!< The WifiHelper class.
+   * \param wifiPhy   //!< The YansWifiPhyHelper class.
+   * \param wifiMac   //!< The WifiMacHelper class.
+   * \param wifiChannel //!< The YansWifiChannelHelper class.
+   * \return the number of received packets. 
+   */
   uint32_t Run (const WifiHelper &wifi, const YansWifiPhyHelper &wifiPhy,
                 const WifiMacHelper &wifiMac, const YansWifiChannelHelper &wifiChannel);
 private:
+  /**
+   * Receive a packet.
+   * \param socket The recieving socket.
+   */
   void ReceivePacket (Ptr<Socket> socket);
+  /**
+   * Set the position of a node.
+   * \param node The node.
+   * \param position The position of the node.
+   */
   void SetPosition (Ptr<Node> node, Vector position);
+  /**
+   * Get the position of a node.
+   * \param node The node.
+   * \return the position of the node.
+   */
   Vector GetPosition (Ptr<Node> node);
+  /**
+   * Setup the receiving socket.
+   * \param node The receiving node.
+   * \return the socket.
+   */
   Ptr<Socket> SetupPacketReceive (Ptr<Node> node);
+  /**
+   * Generate the traffic.
+   * \param socket The sending socket.
+   * \param pktSize The packet size.
+   * \param pktCount The number of packets to send.
+   * \param pktInterval The time between packets.
+   */
   void GenerateTraffic (Ptr<Socket> socket, uint32_t pktSize,
                         uint32_t pktCount, Time pktInterval );
 
-  uint32_t m_pktsTotal;
-  Gnuplot2dDataset m_output;
+  uint32_t m_pktsTotal;       //!< Total number of received packets
+  Gnuplot2dDataset m_output;  //!< Output dataset.
 };
 
 Experiment::Experiment ()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/wireless/wifi-he-network.cc ns-3.36/examples/wireless/wifi-he-network.cc
--- ns-3.35/examples/wireless/wifi-he-network.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/wireless/wifi-he-network.cc	2022-04-30 18:23:57.726733000 -0700
@@ -74,6 +74,8 @@
   double frequency {5}; //whether 2.4, 5 or 6 GHz
   std::size_t nStations {1};
   std::string dlAckSeqType {"NO-OFDMA"};
+  bool enableUlOfdma {false};
+  bool enableBsrp {false};
   int mcs {-1}; // -1 indicates an unset value
   uint32_t payloadSize = 700; // must fit in the max TX duration when transmitting at MCS 0 over an RU of 26 tones
   std::string phyModel {"Yans"};
@@ -90,6 +92,8 @@
   cmd.AddValue ("nStations", "Number of non-AP HE stations", nStations);
   cmd.AddValue ("dlAckType", "Ack sequence type for DL OFDMA (NO-OFDMA, ACK-SU-FORMAT, MU-BAR, AGGR-MU-BAR)",
                 dlAckSeqType);
+  cmd.AddValue ("enableUlOfdma", "Enable UL OFDMA (useful if DL OFDMA is enabled and TCP is used)", enableUlOfdma);
+  cmd.AddValue ("enableBsrp", "Enable BSRP (useful if DL and UL OFDMA are enabled and TCP is used)", enableBsrp);
   cmd.AddValue ("mcs", "if set, limit testing to a specific MCS (0-11)", mcs);
   cmd.AddValue ("payloadSize", "The application payload size in bytes", payloadSize);
   cmd.AddValue ("phyModel", "PHY model to use when OFDMA is disabled (Yans or Spectrum). If OFDMA is enabled then Spectrum is automatically selected", phyModel);
@@ -167,19 +171,23 @@
               NetDeviceContainer apDevice, staDevices;
               WifiMacHelper mac;
               WifiHelper wifi;
+              std::string channelStr ("{0, " + std::to_string (channelWidth) + ", ");
 
               if (frequency == 6)
                 {
-                  wifi.SetStandard (WIFI_STANDARD_80211ax_6GHZ);
+                  wifi.SetStandard (WIFI_STANDARD_80211ax);
+                  channelStr += "BAND_6GHZ, 0}";
                   Config::SetDefault ("ns3::LogDistancePropagationLossModel::ReferenceLoss", DoubleValue (48));
                 }
               else if (frequency == 5)
                 {
-                  wifi.SetStandard (WIFI_STANDARD_80211ax_5GHZ);
+                  wifi.SetStandard (WIFI_STANDARD_80211ax);
+                  channelStr += "BAND_5GHZ, 0}";
                 }
               else if (frequency == 2.4)
                 {
-                  wifi.SetStandard (WIFI_STANDARD_80211ax_2_4GHZ);
+                  wifi.SetStandard (WIFI_STANDARD_80211ax);
+                  channelStr += "BAND_2_4GHZ, 0}";
                   Config::SetDefault ("ns3::LogDistancePropagationLossModel::ReferenceLoss", DoubleValue (40));
                 }
               else
@@ -210,19 +218,18 @@
 
                   mac.SetType ("ns3::StaWifiMac",
                               "Ssid", SsidValue (ssid));
-                  phy.Set ("ChannelWidth", UintegerValue (channelWidth));
+                  phy.Set ("ChannelSettings", StringValue (channelStr));
                   staDevices = wifi.Install (phy, mac, wifiStaNodes);
 
                   if (dlAckSeqType != "NO-OFDMA")
                     {
                       mac.SetMultiUserScheduler ("ns3::RrMultiUserScheduler",
-                                                "EnableUlOfdma", BooleanValue (false),
-                                                "EnableBsrp", BooleanValue (false));
+                                                "EnableUlOfdma", BooleanValue (enableUlOfdma),
+                                                "EnableBsrp", BooleanValue (enableBsrp));
                     }
                   mac.SetType ("ns3::ApWifiMac",
                               "EnableBeaconJitter", BooleanValue (false),
                               "Ssid", SsidValue (ssid));
-                  phy.Set ("ChannelWidth", UintegerValue (channelWidth));
                   apDevice = wifi.Install (phy, mac, wifiApNode);
                 }
               else
@@ -234,13 +241,12 @@
 
                   mac.SetType ("ns3::StaWifiMac",
                               "Ssid", SsidValue (ssid));
-                  phy.Set ("ChannelWidth", UintegerValue (channelWidth));
+                  phy.Set ("ChannelSettings", StringValue (channelStr));
                   staDevices = wifi.Install (phy, mac, wifiStaNodes);
 
                   mac.SetType ("ns3::ApWifiMac",
                               "EnableBeaconJitter", BooleanValue (false),
                               "Ssid", SsidValue (ssid));
-                  phy.Set ("ChannelWidth", UintegerValue (channelWidth));
                   apDevice = wifi.Install (phy, mac, wifiApNode);
                 }
 
@@ -380,7 +386,7 @@
                 {
                   previous = throughput;
                 }
-              else
+              else if (throughput > 0)
                 {
                   NS_LOG_ERROR ("Obtained throughput " << throughput << " is not expected!");
                   exit (1);
@@ -390,7 +396,7 @@
                 {
                   prevThroughput [index] = throughput;
                 }
-              else
+              else if (throughput > 0)
                 {
                   NS_LOG_ERROR ("Obtained throughput " << throughput << " is not expected!");
                   exit (1);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/wireless/wifi-ht-network.cc ns-3.36/examples/wireless/wifi-ht-network.cc
--- ns-3.35/examples/wireless/wifi-ht-network.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/wireless/wifi-ht-network.cc	2022-04-30 18:23:57.726733000 -0700
@@ -25,6 +25,8 @@
 #include "ns3/boolean.h"
 #include "ns3/double.h"
 #include "ns3/string.h"
+#include "ns3/enum.h"
+#include "ns3/tuple.h"
 #include "ns3/log.h"
 #include "ns3/yans-wifi-helper.h"
 #include "ns3/ssid.h"
@@ -128,13 +130,14 @@
 
               WifiMacHelper mac;
               WifiHelper wifi;
+
               if (frequency == 5.0)
                 {
-                  wifi.SetStandard (WIFI_STANDARD_80211n_5GHZ);
+                  wifi.SetStandard (WIFI_STANDARD_80211n);
                 }
               else if (frequency == 2.4)
                 {
-                  wifi.SetStandard (WIFI_STANDARD_80211n_2_4GHZ);
+                  wifi.SetStandard (WIFI_STANDARD_80211n);
                   Config::SetDefault ("ns3::LogDistancePropagationLossModel::ReferenceLoss", DoubleValue (40.046));
                 }
               else
@@ -149,10 +152,13 @@
                                             "ControlMode", StringValue (oss.str ()));
 
               Ssid ssid = Ssid ("ns3-80211n");
+              TupleValue<UintegerValue, UintegerValue, EnumValue, UintegerValue> channelValue;
+              WifiPhyBand band = (frequency == 5.0 ? WIFI_PHY_BAND_5GHZ : WIFI_PHY_BAND_2_4GHZ);
+              channelValue.Set (WifiPhy::ChannelTuple {0, channelWidth, band, 0});
 
               mac.SetType ("ns3::StaWifiMac",
                            "Ssid", SsidValue (ssid));
-              phy.Set ("ChannelWidth", UintegerValue (channelWidth));
+              phy.Set ("ChannelSettings", channelValue);
 
               NetDeviceContainer staDevice;
               staDevice = wifi.Install (phy, mac, wifiStaNode);
@@ -160,7 +166,6 @@
               mac.SetType ("ns3::ApWifiMac",
                            "EnableBeaconJitter", BooleanValue (false),
                            "Ssid", SsidValue (ssid));
-              phy.Set ("ChannelWidth", UintegerValue (channelWidth));
 
               NetDeviceContainer apDevice;
               apDevice = wifi.Install (phy, mac, wifiApNode);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/wireless/wifi-mixed-network.cc ns-3.36/examples/wireless/wifi-mixed-network.cc
--- ns-3.35/examples/wireless/wifi-mixed-network.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/wireless/wifi-mixed-network.cc	2022-04-30 18:23:57.726733000 -0700
@@ -55,35 +55,41 @@
 // short slot time are only observed in a g only configuration.
 //
 // The user can also select the payload size and can choose either an UDP or a TCP connection.
-// Example: ./waf --run "wifi-mixed-network --isUdp=1"
+// Example: ./ns3 run "wifi-mixed-network --isUdp=1"
 
 using namespace ns3;
 
 NS_LOG_COMPONENT_DEFINE ("MixedNetwork");
 
+/** Parameters */
 struct Parameters
 {
-  std::string testName;
-  bool enableErpProtection;
-  std::string erpProtectionMode;
-  bool enableShortSlotTime;
-  bool enableShortPhyPreamble;
-  WifiStandard apType;
-  uint32_t nWifiB;
-  bool bHasTraffic;
-  uint32_t nWifiG;
-  bool gHasTraffic;
-  uint32_t nWifiN;
-  bool nHasTraffic;
-  bool isUdp;
-  uint32_t payloadSize;
-  double simulationTime;
+  std::string testName;             //!< Test name
+  bool enableErpProtection;         //!< True to enable ERP protection
+  std::string erpProtectionMode;    //!< ERP protection mode
+  bool enableShortSlotTime;         //!< True to enable short slot time
+  bool enableShortPhyPreamble;      //!< True to enable short PHY preamble
+  WifiStandard apType;              //!< Wifi standard for AP
+  uint32_t nWifiB;                  //!< Number of 802.11b stations
+  bool bHasTraffic;                 //!< True if 802.11b stations generate traffic
+  uint32_t nWifiG;                  //!< Number of 802.11g stations
+  bool gHasTraffic;                 //!< True if 802.11g stations generate traffic
+  uint32_t nWifiN;                  //!< Number of 802.11n stations
+  bool nHasTraffic;                 //!< True if 802.11n stations generate traffic
+  bool isUdp;                       //!< True to generate UDP traffic
+  uint32_t payloadSize;             //!< Payload size in bytes
+  double simulationTime;            //!< Simulation time in seconds
 };
 
 class Experiment
 {
 public:
   Experiment ();
+  /**
+   * Run an experiment with the given parameters
+   * \param params the given parameters
+   * \return the throughput
+   */
   double Run (Parameters params);
 };
 
@@ -99,7 +105,7 @@
     {
       apTypeString = "WIFI_STANDARD_80211g";
     }
-  else if (params.apType == WIFI_STANDARD_80211n_2_4GHZ)
+  else if (params.apType == WIFI_STANDARD_80211n)
     {
       apTypeString = "WIFI_STANDARD_80211n_2_4GHZ";
     }
@@ -167,7 +173,7 @@
   gStaDevice = wifi.Install (phy, mac, wifiGStaNodes);
 
   // 802.11b/g/n STA
-  wifi.SetStandard (WIFI_STANDARD_80211n_2_4GHZ);
+  wifi.SetStandard (WIFI_STANDARD_80211n);
   NetDeviceContainer nStaDevice;
   mac.SetType ("ns3::StaWifiMac",
                "Ssid", SsidValue (ssid),
@@ -187,7 +193,7 @@
   apDevice = wifi.Install (phy, mac, wifiApNode);
 
   // Set TXOP limit
-  if (params.apType == WIFI_STANDARD_80211n_2_4GHZ)
+  if (params.apType == WIFI_STANDARD_80211n)
     {
       Ptr<NetDevice> dev = wifiApNode.Get (0)->GetDevice (0);
       Ptr<WifiNetDevice> wifi_dev = DynamicCast<WifiNetDevice> (dev);
@@ -471,7 +477,7 @@
   params.enableErpProtection = false;
   params.enableShortSlotTime = false;
   params.enableShortPhyPreamble = false;
-  params.apType = WIFI_STANDARD_80211n_2_4GHZ;
+  params.apType = WIFI_STANDARD_80211n;
   params.nWifiB = 0;
   params.bHasTraffic = false;
   params.nWifiG = 0;
@@ -490,7 +496,7 @@
   params.enableErpProtection = false;
   params.enableShortSlotTime = false;
   params.enableShortPhyPreamble = false;
-  params.apType = WIFI_STANDARD_80211n_2_4GHZ;
+  params.apType = WIFI_STANDARD_80211n;
   params.nWifiB = 0;
   params.bHasTraffic = false;
   params.nWifiG = 1;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/wireless/wifi-multirate.cc ns-3.36/examples/wireless/wifi-multirate.cc
--- ns-3.35/examples/wireless/wifi-multirate.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/wireless/wifi-multirate.cc	2022-04-30 18:23:57.726733000 -0700
@@ -16,38 +16,6 @@
  * Author: Duy Nguyen <duy@soe.ucsc.edu>
  */
 
-/**
- * Scenarios: 100 nodes, multiple simultaneous flows, multi-hop ad hoc, routing,
- * and mobility
- *
- * QUICK INSTRUCTIONS:
- *
- * To optimize build:
- * ./waf -d optimized configure
- * ./waf
- *
- * To compile:
- * ./waf --run wifi-multirate
- *
- * To compile with command line(useful for varying parameters):
- * ./waf --run "wifi-multirate --totalTime=0.3s --rateManager=ns3::MinstrelWifiManager"
- *
- * To turn on NS_LOG:
- * export NS_LOG=multirate=level_all
- * (can only view log if built with ./waf -d debug configure)
- *
- * To debug:
- * ./waf --shell
- * gdb ./build/debug/examples/wireless/wifi-multirate
- *
- * To view pcap files:
- * tcpdump -nn -tt -r filename.pcap
- *
- * To monitor the files:
- * tail -f filename.pcap
- *
- */
-
 #include "ns3/gnuplot.h"
 #include "ns3/command-line.h"
 #include "ns3/config.h"
@@ -73,74 +41,218 @@
 
 NS_LOG_COMPONENT_DEFINE ("multirate");
 
+/**
+ * WiFi multirate experiment class.
+ * 
+ * It handles the creation and run of an experiment.
+ *
+ * Scenarios: 100 nodes, multiple simultaneous flows, multi-hop ad hoc, routing,
+ * and mobility
+ *
+ * QUICK INSTRUCTIONS:
+ *
+ * To optimize build:
+ * ./ns3 configure -d optimized
+ * ./ns3
+ *
+ * To compile:
+ * ./ns3 run wifi-multirate
+ *
+ * To compile with command line(useful for varying parameters):
+ * ./ns3 run "wifi-multirate --totalTime=0.3s --rateManager=ns3::MinstrelWifiManager"
+ *
+ * To turn on NS_LOG:
+ * export NS_LOG=multirate=level_all
+ * (can only view log if built with ./ns3 configure -d debug)
+ *
+ * To debug:
+ * ./ns3 shell
+ * gdb ./build/debug/examples/wireless/wifi-multirate
+ *
+ * To view pcap files:
+ * tcpdump -nn -tt -r filename.pcap
+ *
+ * To monitor the files:
+ * tail -f filename.pcap
+ *
+ */
 class Experiment
 {
 public:
   Experiment ();
+  /**
+   * \brief Construct a new Experiment object
+   * 
+   * \param name The name of the experiment.
+   */
   Experiment (std::string name);
+  /**
+   * Run an experiment.
+   * \param wifi The WifiHelper class.
+   * \param wifiPhy The YansWifiPhyHelper class.
+   * \param wifiMac The WifiMacHelper class.
+   * \param wifiChannel The YansWifiChannelHelper class.
+   * \param mobility The MobilityHelper class.
+   * \return a 2D dataset of the experiment data. 
+   */
   Gnuplot2dDataset Run (const WifiHelper &wifi, const YansWifiPhyHelper &wifiPhy,
                         const WifiMacHelper &wifiMac, const YansWifiChannelHelper &wifiChannel, const MobilityHelper &mobility);
 
+  /**
+   * \brief Setup the experiment from the command line arguments.
+   * 
+   * \param argc The argument count.
+   * \param argv The argument vector.
+   * \return true 
+   */
   bool CommandSetup (int argc, char **argv);
+
+  /**
+   * \brief Check if routing is enabled.
+   * 
+   * \return true if routing is enabled.
+   */
   bool IsRouting ()
   {
-    return (enableRouting == 1) ? 1 : 0;
+    return (m_enableRouting == 1) ? 1 : 0;
   }
+  /**
+   * \brief Check if mobility is enabled.
+   * 
+   * \return true if mobility is enabled.
+   */
   bool IsMobility ()
   {
-    return (enableMobility == 1) ? 1 : 0;
+    return (m_enableMobility == 1) ? 1 : 0;
   }
 
+  /**
+   * \brief Get the Scenario number.
+   * 
+   * \return the scenario number. 
+   */
   uint32_t GetScenario ()
   {
-    return scenario;
+    return m_scenario;
   }
-
+  /**
+   * \brief Get the RTS Threshold.
+   * 
+   * \return the RTS Threshold.
+   */
   std::string GetRtsThreshold ()
   {
-    return rtsThreshold;
+    return m_rtsThreshold;
   }
+  /**
+   * \brief Get the Output File Name.
+   * 
+   * \return the Output File Name. 
+   */
   std::string GetOutputFileName ()
   {
-    return outputFileName;
+    return m_outputFileName;
   }
+  /**
+   * \brief Get the Rate Manager.
+   * 
+   * \return the Rate Manager.
+   */
   std::string GetRateManager ()
   {
-    return rateManager;
+    return m_rateManager;
   }
 
 private:
+  /**
+   * \brief Setup the receiving socket.
+   * 
+   * \param node The receiving node.
+   * \return the Rx socket.
+   */
   Ptr<Socket> SetupPacketReceive (Ptr<Node> node);
+  /**
+   * Generate 1-hop and 2-hop neighbors of a node in grid topology
+   * \param c The node container.
+   * \param senderId The sender ID.
+   * \return the neighbor nodes.
+   */
   NodeContainer GenerateNeighbors (NodeContainer c, uint32_t senderId);
 
+  /**
+   * \brief Setup the application in the nodes.
+   * 
+   * \param client Client node.
+   * \param server Server node.
+   * \param start Start time.
+   * \param stop Stop time.
+   */
   void ApplicationSetup (Ptr<Node> client, Ptr<Node> server, double start, double stop);
+  /**
+   * Take the grid map, divide it into 4 quadrants
+   * Assign all nodes from each quadrant to a specific container
+   *
+   * \param c The node container.
+   */
   void AssignNeighbors (NodeContainer c);
+  /**
+   * Sources and destinations are randomly selected such that a node
+   * may be the source for multiple destinations and a node maybe a destination
+   * for multiple sources.
+   * 
+   * \param c The node container.
+   */
   void SelectSrcDest (NodeContainer c);
+  /**
+   * \brief Receive a packet.
+   * 
+   * \param socket The receiving socket.
+   */
   void ReceivePacket (Ptr<Socket> socket);
+  /**
+   * \brief Calculate the throughput.
+   */
   void CheckThroughput ();
+  /**
+   * A sender node will  set up a flow to each of the its neighbors
+   * in its quadrant randomly.  All the flows are exponentially distributed.
+   * 
+   * \param sender The sender node.
+   * \param c The node neighbors.
+   */
   void SendMultiDestinations (Ptr<Node> sender, NodeContainer c);
 
-  Gnuplot2dDataset m_output;
+  Gnuplot2dDataset m_output;  //!< Output dataset.
 
-  double totalTime;
-  double expMean;
-  double samplingPeriod;
-
-  uint32_t bytesTotal;
-  uint32_t packetSize;
-  uint32_t gridSize;
-  uint32_t nodeDistance;
-  uint32_t port;
-  uint32_t scenario;
-
-  bool enablePcap;
-  bool enableTracing;
-  bool enableFlowMon;
-  bool enableRouting;
-  bool enableMobility;
-
-  NodeContainer containerA, containerB, containerC, containerD;
-  std::string rtsThreshold, rateManager, outputFileName;
+  double m_totalTime;       //!< Total experiment time.
+  double m_expMean;         //!< Exponential parameter for sending packets.
+  double m_samplingPeriod;  //!< Sampling period.
+
+  uint32_t m_bytesTotal;    //!< Total number of received bytes.
+  uint32_t m_packetSize;    //!< Packet size.
+  uint32_t m_gridSize;      //!< Grid size.
+  uint32_t m_nodeDistance;  //!< Node distance.
+  uint32_t m_port;          //!< Listening port.
+  uint32_t m_scenario;      //!< Scnario number.
+
+  bool m_enablePcap;        //!< True if PCAP output is enabled.
+  bool m_enableTracing;     //!< True if tracing output is enabled.
+  bool m_enableFlowMon;     //!< True if FlowMon is enabled.
+  bool m_enableRouting;     //!< True if routing is enabled.
+  bool m_enableMobility;    //!< True if mobility is enabled.
+
+  /**
+   * Node containers for each quadrant.
+   * @{
+   */
+  NodeContainer m_containerA;
+  NodeContainer m_containerB;
+  NodeContainer m_containerC;
+  NodeContainer m_containerD;
+  /** @} */
+  std::string m_rtsThreshold; //!< Rts threshold.
+  std::string m_rateManager;  //!< Rate manager.
+  std::string m_outputFileName; //!< Output file name.
 };
 
 Experiment::Experiment ()
@@ -149,26 +261,26 @@
 
 Experiment::Experiment (std::string name)
   : m_output (name),
-    totalTime (0.3),
-    expMean (0.1),
+    m_totalTime (0.3),
+    m_expMean (0.1),
     //flows being exponentially distributed
-    samplingPeriod (0.1),
-    bytesTotal (0),
-    packetSize (2000),
-    gridSize (10),
+    m_samplingPeriod (0.1),
+    m_bytesTotal (0),
+    m_packetSize (2000),
+    m_gridSize (10),
     //10x10 grid  for a total of 100 nodes
-    nodeDistance (30),
-    port (5000),
-    scenario (4),
-    enablePcap (false),
-    enableTracing (true),
-    enableFlowMon (false),
-    enableRouting (false),
-    enableMobility (false),
-    rtsThreshold ("2200"),
+    m_nodeDistance (30),
+    m_port (5000),
+    m_scenario (4),
+    m_enablePcap (false),
+    m_enableTracing (true),
+    m_enableFlowMon (false),
+    m_enableRouting (false),
+    m_enableMobility (false),
+    m_rtsThreshold ("2200"),
     //0 for enabling rts/cts
-    rateManager ("ns3::MinstrelWifiManager"),
-    outputFileName ("minstrel")
+    m_rateManager ("ns3::MinstrelWifiManager"),
+    m_outputFileName ("minstrel")
 {
   m_output.SetStyle (Gnuplot2dDataset::LINES);
 }
@@ -178,7 +290,7 @@
 {
   TypeId tid = TypeId::LookupByName ("ns3::UdpSocketFactory");
   Ptr<Socket> sink = Socket::CreateSocket (node, tid);
-  InetSocketAddress local = InetSocketAddress (Ipv4Address::GetAny (), port);
+  InetSocketAddress local = InetSocketAddress (Ipv4Address::GetAny (), m_port);
   sink->Bind (local);
   sink->SetRecvCallback (MakeCallback (&Experiment::ReceivePacket, this));
 
@@ -191,68 +303,58 @@
   Ptr<Packet> packet;
   while ((packet = socket->Recv ()))
     {
-      bytesTotal += packet->GetSize ();
+      m_bytesTotal += packet->GetSize ();
     }
 }
 
 void
 Experiment::CheckThroughput ()
 {
-  double mbs = ((bytesTotal * 8.0) / 1000000 / samplingPeriod);
-  bytesTotal = 0;
+  double mbs = ((m_bytesTotal * 8.0) / 1000000 / m_samplingPeriod);
+  m_bytesTotal = 0;
   m_output.Add ((Simulator::Now ()).GetSeconds (), mbs);
 
   //check throughput every samplingPeriod second
-  Simulator::Schedule (Seconds (samplingPeriod), &Experiment::CheckThroughput, this);
+  Simulator::Schedule (Seconds (m_samplingPeriod), &Experiment::CheckThroughput, this);
 }
 
-/**
- *
- * Take the grid map, divide it into 4 quadrants
- * Assign all nodes from each quadrant to a specific container
- *
- */
 void
 Experiment::AssignNeighbors (NodeContainer c)
 {
   uint32_t totalNodes = c.GetN ();
   for (uint32_t i = 0; i < totalNodes; i++)
     {
-      if ( (i % gridSize) <= (gridSize / 2 - 1))
+      if ( (i % m_gridSize) <= (m_gridSize / 2 - 1))
         {
           //lower left quadrant
           if ( i < totalNodes / 2 )
             {
-              containerA.Add (c.Get (i));
+              m_containerA.Add (c.Get (i));
             }
 
           //upper left quadrant
           if ( i >= (uint32_t)(4 * totalNodes) / 10 )
             {
-              containerC.Add (c.Get (i));
+              m_containerC.Add (c.Get (i));
             }
         }
-      if ( (i % gridSize) >= (gridSize / 2 - 1))
+      if ( (i % m_gridSize) >= (m_gridSize / 2 - 1))
         {
           //lower right quadrant
           if ( i < totalNodes / 2 )
             {
-              containerB.Add (c.Get (i));
+              m_containerB.Add (c.Get (i));
             }
 
           //upper right quadrant
           if ( i >= (uint32_t)(4 * totalNodes) / 10  )
             {
-              containerD.Add (c.Get (i));
+              m_containerD.Add (c.Get (i));
             }
         }
     }
 }
 
-/**
- * Generate 1-hop and 2-hop neighbors of a node in grid topology
- *
- */
 NodeContainer
 Experiment::GenerateNeighbors (NodeContainer c, uint32_t senderId)
 {
@@ -270,11 +372,6 @@
   return nc;
 }
 
-/**
- * Sources and destinations are randomly selected such that a node
- * may be the source for multiple destinations and a node maybe a destination
- * for multiple sources.
- */
 void
 Experiment::SelectSrcDest (NodeContainer c)
 {
@@ -288,16 +385,10 @@
 
   for (uint32_t i = 0; i < totalNodes / 3; i++)
     {
-      ApplicationSetup (c.Get (uvSrc->GetInteger ()), c.Get (uvDest->GetInteger ()),  0, totalTime);
+      ApplicationSetup (c.Get (uvSrc->GetInteger ()), c.Get (uvDest->GetInteger ()),  0, m_totalTime);
     }
 }
 
-/**
- *
- * A sender node will  set up a flow to each of the its neighbors
- * in its quadrant randomly.  All the flows are exponentially distributed
- *
- */
 void
 Experiment::SendMultiDestinations (Ptr<Node> sender, NodeContainer c)
 {
@@ -309,8 +400,8 @@
 
   // ExponentialRandomVariable params: (mean, upperbound)
   Ptr<ExponentialRandomVariable> ev = CreateObject<ExponentialRandomVariable> ();
-  ev->SetAttribute ("Mean", DoubleValue (expMean));
-  ev->SetAttribute ("Bound", DoubleValue (totalTime));
+  ev->SetAttribute ("Mean", DoubleValue (m_expMean));
+  ev->SetAttribute ("Bound", DoubleValue (m_totalTime));
 
   double start = 0.0, stop;
   uint32_t destIndex;
@@ -330,7 +421,7 @@
 
       start = stop;
 
-      if (start > totalTime)
+      if (start > m_totalTime)
         {
           break;
         }
@@ -382,10 +473,10 @@
   NS_LOG_DEBUG (PrintPosition (client, server));
 
   // Equipping the source  node with OnOff Application used for sending
-  OnOffHelper onoff ("ns3::UdpSocketFactory", Address (InetSocketAddress (Ipv4Address ("10.0.0.1"), port)));
+  OnOffHelper onoff ("ns3::UdpSocketFactory", Address (InetSocketAddress (Ipv4Address ("10.0.0.1"), m_port)));
   onoff.SetConstantRate (DataRate (60000000));
-  onoff.SetAttribute ("PacketSize", UintegerValue (packetSize));
-  onoff.SetAttribute ("Remote", AddressValue (InetSocketAddress (ipv4AddrServer, port)));
+  onoff.SetAttribute ("PacketSize", UintegerValue (m_packetSize));
+  onoff.SetAttribute ("Remote", AddressValue (InetSocketAddress (ipv4AddrServer, m_port)));
 
   ApplicationContainer apps = onoff.Install (client);
   apps.Start (Seconds (start));
@@ -401,7 +492,7 @@
 {
 
 
-  uint32_t nodeSize = gridSize * gridSize;
+  uint32_t nodeSize = m_gridSize * m_gridSize;
   NodeContainer c;
   c.Create (nodeSize);
 
@@ -417,7 +508,7 @@
 
   Ipv4ListRoutingHelper list;
 
-  if (enableRouting)
+  if (m_enableRouting)
     {
       list.Add (staticRouting, 0);
       list.Add (olsr, 10);
@@ -425,7 +516,7 @@
 
   InternetStackHelper internet;
 
-  if (enableRouting)
+  if (m_enableRouting)
     {
       internet.SetRoutingHelper (list);  // has effect on the next Install ()
     }
@@ -442,14 +533,14 @@
   mobil.SetPositionAllocator ("ns3::GridPositionAllocator",
                               "MinX", DoubleValue (0.0),
                               "MinY", DoubleValue (0.0),
-                              "DeltaX", DoubleValue (nodeDistance),
-                              "DeltaY", DoubleValue (nodeDistance),
-                              "GridWidth", UintegerValue (gridSize),
+                              "DeltaX", DoubleValue (m_nodeDistance),
+                              "DeltaY", DoubleValue (m_nodeDistance),
+                              "GridWidth", UintegerValue (m_gridSize),
                               "LayoutType", StringValue ("RowFirst"));
 
   mobil.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
 
-  if (enableMobility && enableRouting)
+  if (m_enableMobility && m_enableRouting)
     {
       //Rectangle (xMin, xMax, yMin, yMax)
       mobil.SetMobilityModel ("ns3::RandomDirection2dMobilityModel",
@@ -459,37 +550,37 @@
     }
   mobil.Install (c);
 
-  if ( scenario == 1 && enableRouting)
+  if ( m_scenario == 1 && m_enableRouting)
     {
       SelectSrcDest (c);
     }
-  else if ( scenario == 2)
+  else if ( m_scenario == 2)
     {
       //All flows begin at the same time
       for (uint32_t i = 0; i < nodeSize - 1; i = i + 2)
         {
-          ApplicationSetup (c.Get (i), c.Get (i + 1),  0, totalTime);
+          ApplicationSetup (c.Get (i), c.Get (i + 1),  0, m_totalTime);
         }
     }
-  else if ( scenario == 3)
+  else if ( m_scenario == 3)
     {
       AssignNeighbors (c);
       //Note: these senders are hand-picked in order to ensure good coverage
       //for 10x10 grid, basically one sender for each quadrant
       //you might have to change these values for other grids
       NS_LOG_DEBUG (">>>>>>>>>region A<<<<<<<<<");
-      SendMultiDestinations (c.Get (22), containerA);
+      SendMultiDestinations (c.Get (22), m_containerA);
 
       NS_LOG_DEBUG (">>>>>>>>>region B<<<<<<<<<");
-      SendMultiDestinations (c.Get (26), containerB);
+      SendMultiDestinations (c.Get (26), m_containerB);
 
       NS_LOG_DEBUG (">>>>>>>>>region C<<<<<<<<<");
-      SendMultiDestinations (c.Get (72), containerC);
+      SendMultiDestinations (c.Get (72), m_containerC);
 
       NS_LOG_DEBUG (">>>>>>>>>region D<<<<<<<<<");
-      SendMultiDestinations (c.Get (76), containerD);
+      SendMultiDestinations (c.Get (76), m_containerD);
     }
-  else if ( scenario == 4)
+  else if ( m_scenario == 4)
     {
       //GenerateNeighbors(NodeContainer, uint32_t sender)
       //Note: these senders are hand-picked in order to ensure good coverage
@@ -519,13 +610,13 @@
 
   CheckThroughput ();
 
-  if (enablePcap)
+  if (m_enablePcap)
     {
       phy.SetPcapDataLinkType (WifiPhyHelper::DLT_IEEE802_11_RADIO);
       phy.EnablePcapAll (GetOutputFileName ());
     }
 
-  if (enableTracing)
+  if (m_enableTracing)
     {
       AsciiTraceHelper ascii;
       phy.EnableAsciiAll (ascii.CreateFileStream (GetOutputFileName () + ".tr"));
@@ -533,15 +624,15 @@
 
   FlowMonitorHelper flowmonHelper;
 
-  if (enableFlowMon)
+  if (m_enableFlowMon)
     {
       flowmonHelper.InstallAll ();
     }
 
-  Simulator::Stop (Seconds (totalTime));
+  Simulator::Stop (Seconds (m_totalTime));
   Simulator::Run ();
 
-  if (enableFlowMon)
+  if (m_enableFlowMon)
     {
       flowmonHelper.SerializeToXmlFile ((GetOutputFileName () + ".flomon"), false, false);
     }
@@ -556,25 +647,25 @@
 {
   // for commandline input
   CommandLine cmd (__FILE__);
-  cmd.AddValue ("packetSize", "packet size", packetSize);
-  cmd.AddValue ("totalTime", "simulation time", totalTime);
+  cmd.AddValue ("packetSize", "packet size", m_packetSize);
+  cmd.AddValue ("totalTime", "simulation time", m_totalTime);
   // according to totalTime, select an appropriate samplingPeriod automatically.
-  if (totalTime < 1.0)
+  if (m_totalTime < 1.0)
     {
-      samplingPeriod = 0.1;
+      m_samplingPeriod = 0.1;
     }
   else
     {
-      samplingPeriod = 1.0;
+      m_samplingPeriod = 1.0;
     }
   // or user selects a samplingPeriod.
-  cmd.AddValue ("samplingPeriod", "sampling period", samplingPeriod);
-  cmd.AddValue ("rtsThreshold", "rts threshold", rtsThreshold);
-  cmd.AddValue ("rateManager", "type of rate", rateManager);
-  cmd.AddValue ("outputFileName", "output filename", outputFileName);
-  cmd.AddValue ("enableRouting", "enable Routing", enableRouting);
-  cmd.AddValue ("enableMobility", "enable Mobility", enableMobility);
-  cmd.AddValue ("scenario", "scenario ", scenario);
+  cmd.AddValue ("samplingPeriod", "sampling period", m_samplingPeriod);
+  cmd.AddValue ("rtsThreshold", "rts threshold", m_rtsThreshold);
+  cmd.AddValue ("rateManager", "type of rate", m_rateManager);
+  cmd.AddValue ("outputFileName", "output filename", m_outputFileName);
+  cmd.AddValue ("enableRouting", "enable Routing", m_enableRouting);
+  cmd.AddValue ("enableMobility", "enable Mobility", m_enableMobility);
+  cmd.AddValue ("scenario", "scenario ", m_scenario);
 
   cmd.Parse (argc, argv);
   return true;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/wireless/wifi-multi-tos.cc ns-3.36/examples/wireless/wifi-multi-tos.cc
--- ns-3.35/examples/wireless/wifi-multi-tos.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/wireless/wifi-multi-tos.cc	2022-04-30 18:23:57.726733000 -0700
@@ -76,7 +76,7 @@
 
   WifiMacHelper mac;
   WifiHelper wifi;
-  wifi.SetStandard (WIFI_STANDARD_80211n_5GHZ);
+  wifi.SetStandard (WIFI_STANDARD_80211n);
 
   std::ostringstream oss;
   oss << "HtMcs" << mcs;
@@ -100,7 +100,8 @@
   apDevice = wifi.Install (phy, mac, wifiApNode);
 
   // Set channel width
-  Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/ChannelWidth", UintegerValue (channelWidth));
+  Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/ChannelSettings",
+               StringValue ("{0, " + std::to_string (channelWidth) + ", BAND_2_4GHZ, 0}"));
 
   // Set guard interval
   Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/HtConfiguration/ShortGuardIntervalSupported", BooleanValue (useShortGuardInterval));
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/wireless/wifi-power-adaptation-distance.cc ns-3.36/examples/wireless/wifi-power-adaptation-distance.cc
--- ns-3.35/examples/wireless/wifi-power-adaptation-distance.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/wireless/wifi-power-adaptation-distance.cc	2022-04-30 18:23:57.726733000 -0700
@@ -66,17 +66,17 @@
  *
  * To display all the possible arguments and their defaults:
  * \code{.sh}
- *   ./waf --run "wifi-power-adaptation-distance --help"
+ *   ./ns3 run "wifi-power-adaptation-distance --help"
  * \endcode
  *
  * Example usage (selecting Aparf rather than Parf):
  * \code{.sh}
- *   ./waf --run "wifi-power-adaptation-distance --manager=ns3::AparfWifiManager --outputFileName=aparf"
+ *   ./ns3 run "wifi-power-adaptation-distance --manager=ns3::AparfWifiManager --outputFileName=aparf"
  * \endcode
  *
  * Another example (moving towards the AP):
  * \code{.sh}
- *   ./waf --run "wifi-power-adaptation-distance --manager=ns3::AparfWifiManager --outputFileName=aparf --stepsSize=-1 --STA1_x=200"
+ *   ./ns3 run "wifi-power-adaptation-distance --manager=ns3::AparfWifiManager --outputFileName=aparf --stepsSize=-1 --STA1_x=200"
  * \endcode
  *
  * To enable the log of rate and power changes:
@@ -109,40 +109,118 @@
 
 NS_LOG_COMPONENT_DEFINE ("PowerAdaptationDistance");
 
-//packet size generated at the AP
+/// Pcket size generated at the AP
 static const uint32_t packetSize = 1420;
 
+/**
+ * \brief Class to collect node statistics.
+ */
 class NodeStatistics
 {
 public:
+  /**
+   * \brief Constructor.
+   * 
+   * \param aps Access points
+   * \param stas WiFi Stations.
+   */
   NodeStatistics (NetDeviceContainer aps, NetDeviceContainer stas);
 
+  /**
+   * \brief Callback called by WifiNetDevice/Phy/PhyTxBegin. 
+   * 
+   * \param path The trace path.
+   * \param packet The sent packet.
+   * \param powerW The Tx power.
+   */
   void PhyCallback (std::string path, Ptr<const Packet> packet, double powerW);
+  /**
+   * \brief Callback called by PacketSink/Rx.
+   * 
+   * \param path The trace path.
+   * \param packet The received packet.
+   * \param from The sender address.
+   */
   void RxCallback (std::string path, Ptr<const Packet> packet, const Address &from);
+  /**
+   * \brief Callback called by WifiNetDevice/RemoteStationManager/x/PowerChange.
+   * 
+   * \param path The trace path.
+   * \param oldPower Old Tx power.
+   * \param newPower Actual Tx power.
+   * \param dest Destination of the transmission.
+   */
   void PowerCallback (std::string path, double oldPower, double newPower, Mac48Address dest);
+  /**
+   * \brief Callback called by WifiNetDevice/RemoteStationManager/x/RateChange.
+   * 
+   * \param path The trace path.
+   * \param oldRate Old rate.
+   * \param newRate Actual rate.
+   * \param dest Destination of the transmission.
+   */
   void RateCallback (std::string path, DataRate oldRate, DataRate newRate, Mac48Address dest);
+  /**
+   * \brief Set the Position of a node.
+   * 
+   * \param node The node.
+   * \param position The position.
+   */
   void SetPosition (Ptr<Node> node, Vector position);
+  /**
+   * Move a node.
+   * \param node The node.
+   * \param stepsSize The step size.
+   * \param stepsTime Time on each step.
+   */
   void AdvancePosition (Ptr<Node> node, int stepsSize, int stepsTime);
+  /**
+   * \brief Get the Position of a node.
+   * 
+   * \param node The node.
+   * \return the position of the node.
+   */
   Vector GetPosition (Ptr<Node> node);
 
+  /**
+   * \brief Get the Throughput output data
+   * 
+   * \return the Throughput output data.
+   */
   Gnuplot2dDataset GetDatafile ();
+  /**
+   * \brief Get the Power output data.
+   * 
+   * \return the Power output data.
+   */
   Gnuplot2dDataset GetPowerDatafile ();
 
 
 private:
+  /// Time, DataRate pair vector.
   typedef std::vector<std::pair<Time, DataRate> > TxTime;
+  /**
+   * \brief Setup the WifiPhy object.
+   * 
+   * \param phy The WifiPhy to setup.
+   */
   void SetupPhy (Ptr<WifiPhy> phy);
+  /**
+   * \brief Get the time at which a given datarate has been recorded.
+   * 
+   * \param rate The datarate to search.
+   * \return the time.
+   */
   Time GetCalcTxTime (DataRate rate);
 
-  std::map<Mac48Address, double> currentPower;
-  std::map<Mac48Address, DataRate> currentRate;
-  uint32_t m_bytesTotal;
-  double totalEnergy;
-  double totalTime;
-  Ptr<WifiPhy> myPhy;
-  TxTime timeTable;
-  Gnuplot2dDataset m_output;
-  Gnuplot2dDataset m_output_power;
+  std::map<Mac48Address, double> m_currentPower;  //!< Current Tx power for each sender.
+  std::map<Mac48Address, DataRate> m_currentRate; //!< Current Tx rate for each sender.
+  uint32_t m_bytesTotal;  //!< Number of received bytes on a given state.
+  double m_totalEnergy;   //!< Energy used on a given state.
+  double m_totalTime;     //!< Time spent on a given state.
+  TxTime m_timeTable;     //!< Time, DataRate table.
+  Gnuplot2dDataset m_output;  //!< Throughput output data.
+  Gnuplot2dDataset m_output_power;  //!< Power output data.
 };
 
 NodeStatistics::NodeStatistics (NetDeviceContainer aps, NetDeviceContainer stas)
@@ -150,7 +228,6 @@
   Ptr<NetDevice> device = aps.Get (0);
   Ptr<WifiNetDevice> wifiDevice = DynamicCast<WifiNetDevice> (device);
   Ptr<WifiPhy> phy = wifiDevice->GetPhy ();
-  myPhy = phy;
   SetupPhy (phy);
   DataRate dataRate = DataRate (phy->GetDefaultMode ().GetDataRate (phy->GetChannelWidth ()));
   double power = phy->GetTxPowerEnd ();
@@ -159,12 +236,12 @@
       Ptr<NetDevice> staDevice = stas.Get (j);
       Ptr<WifiNetDevice> wifiStaDevice = DynamicCast<WifiNetDevice> (staDevice);
       Mac48Address addr = wifiStaDevice->GetMac ()->GetAddress ();
-      currentPower[addr] = power;
-      currentRate[addr] = dataRate;
+      m_currentPower[addr] = power;
+      m_currentRate[addr] = dataRate;
     }
-  currentRate[Mac48Address ("ff:ff:ff:ff:ff:ff")] = dataRate;
-  totalEnergy = 0;
-  totalTime = 0;
+  m_currentRate[Mac48Address ("ff:ff:ff:ff:ff:ff")] = dataRate;
+  m_totalEnergy = 0;
+  m_totalTime = 0;
   m_bytesTotal = 0;
   m_output.SetTitle ("Throughput Mbits/s");
   m_output_power.SetTitle ("Average Transmit Power");
@@ -182,14 +259,14 @@
       DataRate dataRate = DataRate (mode.GetDataRate (phy->GetChannelWidth ()));
       Time time = phy->CalculateTxDuration (packetSize, txVector, phy->GetPhyBand ());
       NS_LOG_DEBUG (mode.GetUniqueName () << " " << time.GetSeconds () << " " << dataRate);
-      timeTable.push_back (std::make_pair (time, dataRate));
+      m_timeTable.push_back (std::make_pair (time, dataRate));
     }
 }
 
 Time
 NodeStatistics::GetCalcTxTime (DataRate rate)
 {
-  for (TxTime::const_iterator i = timeTable.begin (); i != timeTable.end (); i++)
+  for (TxTime::const_iterator i = m_timeTable.begin (); i != m_timeTable.end (); i++)
     {
       if (rate == i->second)
         {
@@ -209,21 +286,21 @@
 
   if (head.GetType () == WIFI_MAC_DATA)
     {
-      totalEnergy += pow (10.0, currentPower[dest] / 10.0) * GetCalcTxTime (currentRate[dest]).GetSeconds ();
-      totalTime += GetCalcTxTime (currentRate[dest]).GetSeconds ();
+      m_totalEnergy += pow (10.0, m_currentPower[dest] / 10.0) * GetCalcTxTime (m_currentRate[dest]).GetSeconds ();
+      m_totalTime += GetCalcTxTime (m_currentRate[dest]).GetSeconds ();
     }
 }
 
 void
 NodeStatistics::PowerCallback (std::string path, double oldPower, double newPower, Mac48Address dest)
 {
-  currentPower[dest] = newPower;
+  m_currentPower[dest] = newPower;
 }
 
 void
 NodeStatistics::RateCallback (std::string path, DataRate oldRate, DataRate newRate, Mac48Address dest)
 {
-  currentRate[dest] = newRate;
+  m_currentRate[dest] = newRate;
 }
 
 void
@@ -252,9 +329,9 @@
   Vector pos = GetPosition (node);
   double mbs = ((m_bytesTotal * 8.0) / (1000000 * stepsTime));
   m_bytesTotal = 0;
-  double atp = totalEnergy / stepsTime;
-  totalEnergy = 0;
-  totalTime = 0;
+  double atp = m_totalEnergy / stepsTime;
+  m_totalEnergy = 0;
+  m_totalTime = 0;
   m_output_power.Add (pos.x, atp);
   m_output.Add (pos.x, mbs);
   pos.x += stepsSize;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/wireless/wifi-power-adaptation-interference.cc ns-3.36/examples/wireless/wifi-power-adaptation-interference.cc
--- ns-3.35/examples/wireless/wifi-power-adaptation-interference.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/wireless/wifi-power-adaptation-interference.cc	2022-04-30 18:23:57.726733000 -0700
@@ -41,12 +41,12 @@
  *
  * Example usage:
  * \code{.sh}
- *   ./waf --run "wifi-power-adaptation-interference --manager=ns3::AparfWifiManager --outputFileName=aparf"
+ *   ./ns3 run "wifi-power-adaptation-interference --manager=ns3::AparfWifiManager --outputFileName=aparf"
  * \endcode
  *
  * Another example (changing STAs position):
  * \code{.sh}
- *   ./waf --run "wifi-power-adaptation-interference --manager=ns3::AparfWifiManager --outputFileName=aparf --STA1_x=5 --STA2_x=205"
+ *   ./ns3 run "wifi-power-adaptation-interference --manager=ns3::AparfWifiManager --outputFileName=aparf --STA1_x=5 --STA2_x=205"
  * \endcode
  *
  * To enable the log of rate and power changes:
@@ -80,57 +80,155 @@
 
 NS_LOG_COMPONENT_DEFINE ("PowerAdaptationInterference");
 
-//Packet size generated at the AP.
+/// Packet size generated at the AP.
 static const uint32_t packetSize = 1420;
 
+/**
+ * \brief Class to collect node statistics.
+ */
 class NodeStatistics
 {
 public:
+  /**
+   * \brief Constructor.
+   * 
+   * \param aps Access points
+   * \param stas WiFi Stations.
+   */
   NodeStatistics (NetDeviceContainer aps, NetDeviceContainer stas);
 
+  /**
+   * \brief Collects the statistics at a given time.
+   * 
+   * \param time Time at which the statistics are collected.
+   */
   void CheckStatistics (double time);
 
+  /**
+   * \brief Callback called by WifiNetDevice/Phy/PhyTxBegin. 
+   * 
+   * \param path The trace path.
+   * \param packet The sent packet.
+   * \param powerW The Tx power.
+   */
   void PhyCallback (std::string path, Ptr<const Packet> packet, double powerW);
+  /**
+   * \brief Callback called by PacketSink/Rx.
+   * 
+   * \param path The trace path.
+   * \param packet The received packet.
+   * \param from The sender address.
+   */
   void RxCallback (std::string path, Ptr<const Packet> packet, const Address &from);
+  /**
+   * \brief Callback called by WifiNetDevice/RemoteStationManager/x/PowerChange.
+   * 
+   * \param path The trace path.
+   * \param oldPower Old Tx power.
+   * \param newPower Actual Tx power.
+   * \param dest Destination of the transmission.
+   */
   void PowerCallback (std::string path, double oldPower, double newPower, Mac48Address dest);
+  /**
+   * \brief Callback called by WifiNetDevice/RemoteStationManager/x/RateChange.
+   * 
+   * \param path The trace path.
+   * \param oldRate Old rate.
+   * \param newRate Actual rate.
+   * \param dest Destination of the transmission.
+   */
   void RateCallback (std::string path, DataRate oldRate, DataRate newRate, Mac48Address dest);
+  /**
+   * \brief Callback called by YansWifiPhy/State/State.
+   * 
+   * \param path The trace path.
+   * \param init Time when the state started.
+   * \param duration Amount of time we've been in (or will be in) the state.
+   * \param state The state.
+   */
   void StateCallback (std::string path, Time init, Time duration, WifiPhyState state);
 
+  /**
+   * \brief Get the Throughput output data
+   * 
+   * \return the Throughput output data.
+   */
   Gnuplot2dDataset GetDatafile ();
+  /**
+   * \brief Get the Power output data.
+   * 
+   * \return the Power output data.
+   */
   Gnuplot2dDataset GetPowerDatafile ();
+  /**
+   * \brief Get the IDLE state output data.
+   * 
+   * \return the IDLE state output data.
+   */
   Gnuplot2dDataset GetIdleDatafile ();
+  /**
+   * \brief Get the BUSY state output data.
+   * 
+   * \return the BUSY state output data.
+   */
   Gnuplot2dDataset GetBusyDatafile ();
+  /**
+   * \brief Get the TX state output data.
+   * 
+   * \return the TX state output data.
+   */
   Gnuplot2dDataset GetTxDatafile ();
+  /**
+   * \brief Get the RX state output data.
+   * 
+   * \return the RX state output data.
+   */
   Gnuplot2dDataset GetRxDatafile ();
 
+  /**
+   * \brief Get the Busy time.
+   * 
+   * \return the busy time. 
+   */
   double GetBusyTime ();
 
 private:
+  /// Time, DataRate pair vector.
   typedef std::vector<std::pair<Time, DataRate> > TxTime;
+  /**
+   * \brief Setup the WifiPhy object.
+   * 
+   * \param phy The WifiPhy to setup.
+   */
   void SetupPhy (Ptr<WifiPhy> phy);
+  /**
+   * \brief Get the time at which a given datarate has been recorded.
+   * 
+   * \param rate The datarate to search.
+   * \return the time.
+   */
   Time GetCalcTxTime (DataRate rate);
 
-  std::map<Mac48Address, double> currentPower;
-  std::map<Mac48Address, DataRate> currentRate;
-  uint32_t m_bytesTotal;
-  double totalEnergy;
-  double totalTime;
-  double busyTime;
-  double idleTime;
-  double txTime;
-  double rxTime;
-  double totalBusyTime;
-  double totalIdleTime;
-  double totalTxTime;
-  double totalRxTime;
-  Ptr<WifiPhy> myPhy;
-  TxTime timeTable;
-  Gnuplot2dDataset m_output;
-  Gnuplot2dDataset m_output_power;
-  Gnuplot2dDataset m_output_idle;
-  Gnuplot2dDataset m_output_busy;
-  Gnuplot2dDataset m_output_rx;
-  Gnuplot2dDataset m_output_tx;
+  std::map<Mac48Address, double> m_currentPower;  //!< Current Tx power for each sender.
+  std::map<Mac48Address, DataRate> m_currentRate; //!< Current Tx rate for each sender.
+  uint32_t m_bytesTotal;  //!< Number of received bytes.
+  double m_totalEnergy;   //!< Energy used.
+  double m_totalTime;     //!< Time spent.
+  double busyTime;        //!< BUSY time.
+  double idleTime;        //!< IDLE time.
+  double txTime;          //!< TX time.
+  double rxTime;          //!< RX time.
+  double m_totalBusyTime; //!< Total time in BUSY state.
+  double m_totalIdleTime; //!< Total time in IDLE state.
+  double m_totalTxTime;   //!< Total time in TX state.
+  double m_totalRxTime;   //!< Total time in RX state.
+  TxTime m_timeTable;     //!< Time, DataRate table.
+  Gnuplot2dDataset m_output;        //!< Throughput output data.
+  Gnuplot2dDataset m_output_power;  //!< Power output data.
+  Gnuplot2dDataset m_output_idle;   //!< IDLE output data.
+  Gnuplot2dDataset m_output_busy;   //!< BUSY output data.
+  Gnuplot2dDataset m_output_rx;     //!< RX output data.
+  Gnuplot2dDataset m_output_tx;     //!< TX output data.
 };
 
 NodeStatistics::NodeStatistics (NetDeviceContainer aps, NetDeviceContainer stas)
@@ -138,7 +236,6 @@
   Ptr<NetDevice> device = aps.Get (0);
   Ptr<WifiNetDevice> wifiDevice = DynamicCast<WifiNetDevice> (device);
   Ptr<WifiPhy> phy = wifiDevice->GetPhy ();
-  myPhy = phy;
   SetupPhy (phy);
   DataRate dataRate = DataRate (phy->GetDefaultMode ().GetDataRate (phy->GetChannelWidth ()));
   double power = phy->GetTxPowerEnd ();
@@ -147,20 +244,20 @@
       Ptr<NetDevice> staDevice = stas.Get (j);
       Ptr<WifiNetDevice> wifiStaDevice = DynamicCast<WifiNetDevice> (staDevice);
       Mac48Address addr = wifiStaDevice->GetMac ()->GetAddress ();
-      currentPower[addr] = power;
-      currentRate[addr] = dataRate;
+      m_currentPower[addr] = power;
+      m_currentRate[addr] = dataRate;
     }
-  currentRate[Mac48Address ("ff:ff:ff:ff:ff:ff")] = dataRate;
-  totalEnergy = 0;
-  totalTime = 0;
+  m_currentRate[Mac48Address ("ff:ff:ff:ff:ff:ff")] = dataRate;
+  m_totalEnergy = 0;
+  m_totalTime = 0;
   busyTime = 0;
   idleTime = 0;
   txTime = 0;
   rxTime = 0;
-  totalBusyTime = 0;
-  totalIdleTime = 0;
-  totalTxTime = 0;
-  totalRxTime = 0;
+  m_totalBusyTime = 0;
+  m_totalIdleTime = 0;
+  m_totalTxTime = 0;
+  m_totalRxTime = 0;
   m_bytesTotal = 0;
   m_output.SetTitle ("Throughput Mbits/s");
   m_output_idle.SetTitle ("Idle Time");
@@ -181,14 +278,14 @@
       DataRate dataRate = DataRate (mode.GetDataRate (phy->GetChannelWidth ()));
       Time time = phy->CalculateTxDuration (packetSize, txVector, phy->GetPhyBand ());
       NS_LOG_DEBUG (mode.GetUniqueName () << " " << time.GetSeconds () << " " << dataRate);
-      timeTable.push_back (std::make_pair (time, dataRate));
+      m_timeTable.push_back (std::make_pair (time, dataRate));
     }
 }
 
 Time
 NodeStatistics::GetCalcTxTime (DataRate rate)
 {
-  for (TxTime::const_iterator i = timeTable.begin (); i != timeTable.end (); i++)
+  for (TxTime::const_iterator i = m_timeTable.begin (); i != m_timeTable.end (); i++)
     {
       if (rate == i->second)
         {
@@ -208,21 +305,21 @@
 
   if (head.GetType () == WIFI_MAC_DATA)
     {
-      totalEnergy += pow (10.0, currentPower[dest] / 10.0) * GetCalcTxTime (currentRate[dest]).GetSeconds ();
-      totalTime += GetCalcTxTime (currentRate[dest]).GetSeconds ();
+      m_totalEnergy += pow (10.0, m_currentPower[dest] / 10.0) * GetCalcTxTime (m_currentRate[dest]).GetSeconds ();
+      m_totalTime += GetCalcTxTime (m_currentRate[dest]).GetSeconds ();
     }
 }
 
 void
 NodeStatistics::PowerCallback (std::string path, double oldPower, double newPower, Mac48Address dest)
 {
-  currentPower[dest] = newPower;
+  m_currentPower[dest] = newPower;
 }
 
 void
 NodeStatistics::RateCallback (std::string path, DataRate oldRate, DataRate newRate, Mac48Address dest)
 {
-  currentRate[dest] = newRate;
+  m_currentRate[dest] = newRate;
 }
 
 void
@@ -231,22 +328,22 @@
   if (state == WifiPhyState::CCA_BUSY)
     {
       busyTime += duration.GetSeconds ();
-      totalBusyTime += duration.GetSeconds ();
+      m_totalBusyTime += duration.GetSeconds ();
     }
   else if (state == WifiPhyState::IDLE)
     {
       idleTime += duration.GetSeconds ();
-      totalIdleTime += duration.GetSeconds ();
+      m_totalIdleTime += duration.GetSeconds ();
     }
   else if (state == WifiPhyState::TX)
     {
       txTime += duration.GetSeconds ();
-      totalTxTime += duration.GetSeconds ();
+      m_totalTxTime += duration.GetSeconds ();
     }
   else if (state == WifiPhyState::RX)
     {
       rxTime += duration.GetSeconds ();
-      totalRxTime += duration.GetSeconds ();
+      m_totalRxTime += duration.GetSeconds ();
     }
 }
 
@@ -261,9 +358,9 @@
 {
   double mbs = ((m_bytesTotal * 8.0) / (1000000 * time));
   m_bytesTotal = 0;
-  double atp = totalEnergy / time;
-  totalEnergy = 0;
-  totalTime = 0;
+  double atp = m_totalEnergy / time;
+  m_totalEnergy = 0;
+  m_totalTime = 0;
   m_output_power.Add ((Simulator::Now ()).GetSeconds (), atp);
   m_output.Add ((Simulator::Now ()).GetSeconds (), mbs);
 
@@ -318,7 +415,7 @@
 double
 NodeStatistics::GetBusyTime ()
 {
-  return totalBusyTime + totalRxTime;
+  return m_totalBusyTime + m_totalRxTime;
 }
 
 void PowerCallback (std::string path, double oldPower, double newPower, Mac48Address dest)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/wireless/wifi-rate-adaptation-distance.cc ns-3.36/examples/wireless/wifi-rate-adaptation-distance.cc
--- ns-3.35/examples/wireless/wifi-rate-adaptation-distance.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/wireless/wifi-rate-adaptation-distance.cc	2022-04-30 18:23:57.726733000 -0700
@@ -38,13 +38,13 @@
  * - (if logging is enabled) the changes of rate to standard output.
  *
  * Example usage:
- * ./waf --run "wifi-rate-adaptation-distance --standard=802.11a --staManager=ns3::MinstrelWifiManager --apManager=ns3::MinstrelWifiManager --outputFileName=minstrel"
+ * ./ns3 run "wifi-rate-adaptation-distance --standard=802.11a --staManager=ns3::MinstrelWifiManager --apManager=ns3::MinstrelWifiManager --outputFileName=minstrel"
  *
  * Another example (moving towards the AP):
- * ./waf --run "wifi-rate-adaptation-distance --standard=802.11a --staManager=ns3::MinstrelWifiManager --apManager=ns3::MinstrelWifiManager --outputFileName=minstrel --stepsSize=1 --STA1_x=-200"
+ * ./ns3 run "wifi-rate-adaptation-distance --standard=802.11a --staManager=ns3::MinstrelWifiManager --apManager=ns3::MinstrelWifiManager --outputFileName=minstrel --stepsSize=1 --STA1_x=-200"
  *
  * Example for HT rates with SGI and channel width of 40MHz:
- * ./waf --run "wifi-rate-adaptation-distance --staManager=ns3::MinstrelHtWifiManager --apManager=ns3::MinstrelHtWifiManager --outputFileName=minstrelHt --shortGuardInterval=true --channelWidth=40"
+ * ./ns3 run "wifi-rate-adaptation-distance --staManager=ns3::MinstrelHtWifiManager --apManager=ns3::MinstrelHtWifiManager --outputFileName=minstrelHt --shortGuardInterval=true --channelWidth=40"
  *
  * To enable the log of rate changes:
  * export NS_LOG=RateAdaptationDistance=level_info
@@ -71,23 +71,51 @@
 
 NS_LOG_COMPONENT_DEFINE ("RateAdaptationDistance");
 
+/** Node statistics */
 class NodeStatistics
 {
 public:
+  /**
+   * Constructor
+   * \param aps AP devices
+   * \param stas STA devices
+   */
   NodeStatistics (NetDeviceContainer aps, NetDeviceContainer stas);
 
-  void CheckStatistics (double time);
-
+  /**
+   * RX callback
+   * \param path path
+   * \param packet received packet
+   * \param from sender
+   */
   void RxCallback (std::string path, Ptr<const Packet> packet, const Address &from);
+  /**
+   * Set node position
+   * \param node the node
+   * \param position the position
+   */
   void SetPosition (Ptr<Node> node, Vector position);
+  /**
+   * Advance node position
+   * \param node the node
+   * \param stepsSize the size of a step
+   * \param stepsTime the time interval between steps
+   */
   void AdvancePosition (Ptr<Node> node, int stepsSize, int stepsTime);
+  /**
+   * Get node position
+   * \param node the node
+   * \return the position
+   */
   Vector GetPosition (Ptr<Node> node);
-
+  /**
+   * \return the gnuplot 2d dataset
+   */
   Gnuplot2dDataset GetDatafile ();
 
 private:
-  uint32_t m_bytesTotal;
-  Gnuplot2dDataset m_output;
+  uint32_t m_bytesTotal;     //!< total bytes
+  Gnuplot2dDataset m_output; //!< gnuplot 2d dataset
 };
 
 NodeStatistics::NodeStatistics (NetDeviceContainer aps, NetDeviceContainer stas)
@@ -102,12 +130,6 @@
 }
 
 void
-NodeStatistics::CheckStatistics (double time)
-{
-
-}
-
-void
 NodeStatistics::SetPosition (Ptr<Node> node, Vector position)
 {
   Ptr<MobilityModel> mobility = node->GetObject<MobilityModel> ();
@@ -236,11 +258,11 @@
     {
       if (standard == "802.11n-2.4GHz")
         {
-          wifi.SetStandard (WIFI_STANDARD_80211n_2_4GHZ);
+          wifi.SetStandard (WIFI_STANDARD_80211n);
         }
       else if (standard == "802.11n-5GHz")
         {
-          wifi.SetStandard (WIFI_STANDARD_80211n_5GHZ);
+          wifi.SetStandard (WIFI_STANDARD_80211n);
         }
 
       WifiMacHelper wifiMac;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/wireless/wifi-simple-adhoc.cc ns-3.36/examples/wireless/wifi-simple-adhoc.cc
--- ns-3.35/examples/wireless/wifi-simple-adhoc.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/wireless/wifi-simple-adhoc.cc	2022-04-30 18:23:57.726733000 -0700
@@ -26,15 +26,15 @@
 // There are a number of command-line options available to control
 // the default behavior.  The list of available command-line options
 // can be listed with the following command:
-// ./waf --run "wifi-simple-adhoc --help"
+// ./ns3 run "wifi-simple-adhoc --help"
 //
 // For instance, for this configuration, the physical layer will
 // stop successfully receiving packets when rss drops below -97 dBm.
 // To see this effect, try running:
 //
-// ./waf --run "wifi-simple-adhoc --rss=-97 --numPackets=20"
-// ./waf --run "wifi-simple-adhoc --rss=-98 --numPackets=20"
-// ./waf --run "wifi-simple-adhoc --rss=-99 --numPackets=20"
+// ./ns3 run "wifi-simple-adhoc --rss=-97 --numPackets=20"
+// ./ns3 run "wifi-simple-adhoc --rss=-98 --numPackets=20"
+// ./ns3 run "wifi-simple-adhoc --rss=-99 --numPackets=20"
 //
 // Note that all ns-3 attributes (not just the ones exposed in the below
 // script) can be changed at command line; see the documentation.
@@ -42,7 +42,7 @@
 // This script can also be helpful to put the Wifi layer into verbose
 // logging mode; this command will turn on all wifi logging:
 //
-// ./waf --run "wifi-simple-adhoc --verbose=1"
+// ./ns3 run "wifi-simple-adhoc --verbose=1"
 //
 // When you are done, you will notice two pcap trace files in your directory.
 // If you have tcpdump installed, you can try this:
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/wireless/wifi-simple-adhoc-grid.cc ns-3.36/examples/wireless/wifi-simple-adhoc-grid.cc
--- ns-3.35/examples/wireless/wifi-simple-adhoc-grid.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/wireless/wifi-simple-adhoc-grid.cc	2022-04-30 18:23:57.726733000 -0700
@@ -37,7 +37,7 @@
 // There are a number of command-line options available to control
 // the default behavior.  The list of available command-line options
 // can be listed with the following command:
-// ./waf --run "wifi-simple-adhoc-grid --help"
+// ./ns3 run "wifi-simple-adhoc-grid --help"
 //
 // Note that all ns-3 attributes (not just the ones exposed in the below
 // script) can be changed at command line; see the ns-3 documentation.
@@ -47,21 +47,21 @@
 // the default of 500m.
 // To see this effect, try running:
 //
-// ./waf --run "wifi-simple-adhoc-grid --distance=500"
-// ./waf --run "wifi-simple-adhoc-grid --distance=1000"
-// ./waf --run "wifi-simple-adhoc-grid --distance=1500"
+// ./ns3 run "wifi-simple-adhoc-grid --distance=500"
+// ./ns3 run "wifi-simple-adhoc-grid --distance=1000"
+// ./ns3 run "wifi-simple-adhoc-grid --distance=1500"
 //
 // The source node and sink node can be changed like this:
 //
-// ./waf --run "wifi-simple-adhoc-grid --sourceNode=20 --sinkNode=10"
+// ./ns3 run "wifi-simple-adhoc-grid --sourceNode=20 --sinkNode=10"
 //
 // This script can also be helpful to put the Wifi layer into verbose
 // logging mode; this command will turn on all wifi logging:
 //
-// ./waf --run "wifi-simple-adhoc-grid --verbose=1"
+// ./ns3 run "wifi-simple-adhoc-grid --verbose=1"
 //
 // By default, trace file writing is off-- to enable it, try:
-// ./waf --run "wifi-simple-adhoc-grid --tracing=1"
+// ./ns3 run "wifi-simple-adhoc-grid --tracing=1"
 //
 // When you are done tracing, you will notice many pcap trace files
 // in your directory.  If you have tcpdump installed, you can try this:
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/wireless/wifi-simple-ht-hidden-stations.cc ns-3.36/examples/wireless/wifi-simple-ht-hidden-stations.cc
--- ns-3.35/examples/wireless/wifi-simple-ht-hidden-stations.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/wireless/wifi-simple-ht-hidden-stations.cc	2022-04-30 18:23:57.726733000 -0700
@@ -36,7 +36,7 @@
 // This example considers two hidden stations in an 802.11n network which supports MPDU aggregation.
 // The user can specify whether RTS/CTS is used and can set the number of aggregated MPDUs.
 //
-// Example: ./waf --run "wifi-simple-ht-hidden-stations --enableRts=1 --nMpdus=8"
+// Example: ./ns3 run "wifi-simple-ht-hidden-stations --enableRts=1 --nMpdus=8"
 //
 // Network topology:
 //
@@ -98,9 +98,10 @@
   YansWifiPhyHelper phy;
   phy.SetPcapDataLinkType (WifiPhyHelper::DLT_IEEE802_11_RADIO);
   phy.SetChannel (channel.Create ());
+  phy.Set ("ChannelSettings", StringValue ("{36, 0, BAND_5GHZ, 0}"));
 
   WifiHelper wifi;
-  wifi.SetStandard (WIFI_STANDARD_80211n_5GHZ);
+  wifi.SetStandard (WIFI_STANDARD_80211n);
   wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager", "DataMode", StringValue ("HtMcs7"), "ControlMode", StringValue ("HtMcs0"));
   WifiMacHelper mac;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/wireless/wifi-simple-infra.cc ns-3.36/examples/wireless/wifi-simple-infra.cc
--- ns-3.35/examples/wireless/wifi-simple-infra.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/wireless/wifi-simple-infra.cc	2022-04-30 18:23:57.726733000 -0700
@@ -19,23 +19,47 @@
 
 // This script configures two nodes on an 802.11b physical layer, with
 // 802.11b NICs in infrastructure mode, and by default, the station sends
-// one packet of 1000 (application) bytes to the access point.  The
-// physical layer is configured
-// to receive at a fixed RSS (regardless of the distance and transmit
-// power); therefore, changing position of the nodes has no effect.
+// one packet of 1000 (application) bytes to the access point.  Unlike
+// the default physical layer configuration in which the path loss increases
+// (and the received signal strength decreases) as the distance between the
+// nodes increases, this example uses an artificial path loss model that
+// allows the configuration of the received signal strength (RSS) regardless
+// of other transmitter parameters (such as transmit power) or distance.
+// Therefore, changing position of the nodes has no effect.
 //
 // There are a number of command-line options available to control
 // the default behavior.  The list of available command-line options
 // can be listed with the following command:
-// ./waf --run "wifi-simple-infra --help"
+// ./ns3 run "wifi-simple-infra --help"
+// Additional command-line options are available via the generic attribute
+// configuration system.
 //
-// For instance, for this configuration, the physical layer will
-// stop successfully receiving packets when rss drops below -97 dBm.
+// For instance, for the default configuration, the physical layer will
+// stop successfully receiving packets when rss drops to -82 dBm or below.
 // To see this effect, try running:
 //
-// ./waf --run "wifi-simple-infra --rss=-97 --numPackets=20"
-// ./waf --run "wifi-simple-infra --rss=-98 --numPackets=20"
-// ./waf --run "wifi-simple-infra --rss=-99 --numPackets=20"
+// ./ns3 run "wifi-simple-infra --rss=-80 --numPackets=20"
+// ./ns3 run "wifi-simple-infra --rss=-81 --numPackets=20"
+// ./ns3 run "wifi-simple-infra --rss=-82 --numPackets=20"
+//
+// The last command (and any RSS value lower than this) results in no
+// packets received.  This is due to the preamble detection model that
+// dominates the reception performance.  By default, the
+// ThresholdPreambleDetectionModel is added to all WifiPhy objects, and this
+// model prevents reception unless the incoming signal has a RSS above its
+// 'MinimumRssi' value (default of -82 dBm) and has a SNR above the 
+// 'Threshold' value (default of 4).
+//
+// If we relax these values, we can instead observe that signal reception
+// due to the 802.11b error model alone is much lower.  For instance,
+// setting the MinimumRssi to -101 (around the thermal noise floor).
+// and the SNR Threshold to -10 dB, shows that the DsssErrorRateModel can
+// successfully decode at RSS values of -97 or -98 dBm.
+//
+// ./ns3 run "wifi-simple-infra --rss=-97 --numPackets=20 --ns3::ThresholdPreambleDetectionModel::Threshold=-10 --ns3::ThresholdPreambleDetectionModel::MinimumRssi=-101"
+// ./ns3 run "wifi-simple-infra --rss=-98 --numPackets=20 --ns3::ThresholdPreambleDetectionModel::Threshold=-10 --ns3::ThresholdPreambleDetectionModel::MinimumRssi=-101"
+// ./ns3 run "wifi-simple-infra --rss=-99 --numPackets=20 --ns3::ThresholdPreambleDetectionModel::Threshold=-10 --ns3::ThresholdPreambleDetectionModel::MinimumRssi=-101"
+
 //
 // Note that all ns-3 attributes (not just the ones exposed in the below
 // script) can be changed at command line; see the documentation.
@@ -43,7 +67,7 @@
 // This script can also be helpful to put the Wifi layer into verbose
 // logging mode; this command will turn on all wifi logging:
 //
-// ./waf --run "wifi-simple-infra --verbose=1"
+// ./ns3 run "wifi-simple-infra --verbose=1"
 //
 // When you are done, you will notice two pcap trace files in your directory.
 // If you have tcpdump installed, you can try this:
@@ -72,7 +96,7 @@
 {
   while (socket->Recv ())
     {
-      NS_LOG_UNCOND ("Received one packet!");
+      std::cout << "Received one packet!" << std::endl;
     }
 }
 
@@ -81,9 +105,10 @@
 {
   if (pktCount > 0)
     {
+      NS_LOG_INFO ("Generating one packet of size " << pktSize);
       socket->Send (Create<Packet> (pktSize));
       Simulator::Schedule (pktInterval, &GenerateTraffic,
-                           socket, pktSize,pktCount - 1, pktInterval);
+                           socket, pktSize, pktCount - 1, pktInterval);
     }
   else
     {
@@ -97,7 +122,7 @@
   double rss = -80;  // -dBm
   uint32_t packetSize = 1000; // bytes
   uint32_t numPackets = 1;
-  double interval = 1.0; // seconds
+  Time interval = Seconds (1.0);
   bool verbose = false;
 
   CommandLine cmd (__FILE__);
@@ -105,11 +130,9 @@
   cmd.AddValue ("rss", "received signal strength", rss);
   cmd.AddValue ("packetSize", "size of application packet sent", packetSize);
   cmd.AddValue ("numPackets", "number of packets generated", numPackets);
-  cmd.AddValue ("interval", "interval (seconds) between packets", interval);
+  cmd.AddValue ("interval", "interval between packets", interval);
   cmd.AddValue ("verbose", "turn on all WifiNetDevice log components", verbose);
   cmd.Parse (argc, argv);
-  // Convert to time object
-  Time interPacketInterval = Seconds (interval);
 
   // Fix non-unicast data rate to be the same as that of unicast
   Config::SetDefault ("ns3::WifiRemoteStationManager::NonUnicastMode",
@@ -143,17 +166,17 @@
   // Add a mac and disable rate control
   WifiMacHelper wifiMac;
   wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager",
-                                "DataMode",StringValue (phyMode),
-                                "ControlMode",StringValue (phyMode));
+                                "DataMode", StringValue (phyMode),
+                                "ControlMode", StringValue (phyMode));
 
-  // Setup the rest of the mac
+  // Setup the rest of the MAC
   Ssid ssid = Ssid ("wifi-default");
-  // setup sta.
+  // setup STA 
   wifiMac.SetType ("ns3::StaWifiMac",
                    "Ssid", SsidValue (ssid));
   NetDeviceContainer staDevice = wifi.Install (wifiPhy, wifiMac, c.Get (0));
   NetDeviceContainer devices = staDevice;
-  // setup ap.
+  // setup AP
   wifiMac.SetType ("ns3::ApWifiMac",
                    "Ssid", SsidValue (ssid));
   NetDeviceContainer apDevice = wifi.Install (wifiPhy, wifiMac, c.Get (1));
@@ -173,7 +196,6 @@
   internet.Install (c);
 
   Ipv4AddressHelper ipv4;
-  NS_LOG_INFO ("Assign IP Addresses.");
   ipv4.SetBase ("10.1.1.0", "255.255.255.0");
   Ipv4InterfaceContainer i = ipv4.Assign (devices);
 
@@ -192,11 +214,11 @@
   wifiPhy.EnablePcap ("wifi-simple-infra", devices);
 
   // Output what we are doing
-  NS_LOG_UNCOND ("Testing " << numPackets  << " packets sent with receiver rss " << rss );
+  std::cout << "Testing " << numPackets  << " packets sent with receiver rss " << rss << std::endl;
 
   Simulator::ScheduleWithContext (source->GetNode ()->GetId (),
                                   Seconds (1.0), &GenerateTraffic,
-                                  source, packetSize, numPackets, interPacketInterval);
+                                  source, packetSize, numPackets, interval);
 
   Simulator::Stop (Seconds (30.0));
   Simulator::Run ();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/wireless/wifi-simple-interference.cc ns-3.36/examples/wireless/wifi-simple-interference.cc
--- ns-3.35/examples/wireless/wifi-simple-interference.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/wireless/wifi-simple-interference.cc	2022-04-30 18:23:57.726733000 -0700
@@ -58,7 +58,7 @@
 // For instance, for this configuration, the interfering frame arrives
 // at -90 dBm with a time offset of 3.2 microseconds:
 //
-// ./waf --run "wifi-simple-interference --Irss=-90 --delta=3.2"
+// ./ns3 run "wifi-simple-interference --Irss=-90 --delta=3.2"
 //
 // Note that all ns-3 attributes (not just the ones exposed in the below
 // script) can be changed at command line; see the documentation.
@@ -66,7 +66,7 @@
 // This script can also be helpful to put the Wifi layer into verbose
 // logging mode; this command will turn on all wifi logging:
 //
-// ./waf --run "wifi-simple-interference --verbose=1"
+// ./ns3 run "wifi-simple-interference --verbose=1"
 //
 // When you are done, you will notice a pcap trace file in your directory.
 // If you have tcpdump installed, you can try this:
@@ -77,7 +77,7 @@
 //
 // Next, try this command and look at the tcpdump-- you should see two packets
 // that are no longer interfering:
-// ./waf --run "wifi-simple-interference --delta=30000"
+// ./ns3 run "wifi-simple-interference --delta=30000"
 
 #include "ns3/command-line.h"
 #include "ns3/config.h"
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/wireless/wifi-sleep.cc ns-3.36/examples/wireless/wifi-sleep.cc
--- ns-3.35/examples/wireless/wifi-sleep.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/wireless/wifi-sleep.cc	2022-04-30 18:23:57.726733000 -0700
@@ -31,7 +31,7 @@
 // There are a number of command-line options available to control
 // the default behavior.  The list of available command-line options
 // can be listed with the following command:
-// ./waf --run "wifi-sleep --help"
+// ./ns3 run "wifi-sleep --help"
 //
 // Note that all ns-3 attributes (not just the ones exposed in the below
 // script) can be changed at command line; see the documentation.
@@ -39,7 +39,7 @@
 // This script can also be helpful to put the Wifi layer into verbose
 // logging mode; this command will turn on all wifi logging:
 //
-// ./waf --run "wifi-sleep --verbose=1"
+// ./ns3 run "wifi-sleep --verbose=1"
 //
 // When you are done, you will notice four trace files in your directory:
 // two for the remaining energy on each node and two for the state transitions
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/wireless/wifi-spatial-reuse.cc ns-3.36/examples/wireless/wifi-spatial-reuse.cc
--- ns-3.35/examples/wireless/wifi-spatial-reuse.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/wireless/wifi-spatial-reuse.cc	2022-04-30 18:23:57.726733000 -0700
@@ -42,27 +42,52 @@
 //
 //  In general, the program can be configured at run-time by passing command-line arguments.
 //  The following command will display all of the available run-time help options:
-//    ./waf --run "wifi-spatial-reuse --help"
+//    ./ns3 run "wifi-spatial-reuse --help"
 //
-//  By default, the script shows the benefit of the OBSS_PD spatial reuse script:
-//    ./waf --run wifi-spatial-reuse
-//    Throughput for BSS 1: 6.6468 Mbit/s
-//    Throughput for BSS 2: 6.6672 Mbit/s
-//
-// If one disables the OBSS_PD feature, a lower throughput is obtained per BSS:
-//    ./waf --run "wifi-spatial-reuse --enableObssPd=0"
-//    Throughput for BSS 1: 5.8692 Mbit/s
-//    Throughput for BSS 2: 5.9364 Mbit/
-//
-// This difference between those results is because OBSS_PD spatial
-// enables to ignore transmissions from another BSS when the received power
-// is below the configured threshold, and therefore either defer during ongoing
-// transmission or transmit at the same time.
+//  According to the Wi-Fi models of ns-3.36 release, throughput with
+//  OBSS PD enabled (--enableObssPd=True) was roughly 6.5 Mbps, and with
+//  it disabled (--enableObssPd=False) was roughly 3.5 Mbps.
+//
+//  This difference between those results is because OBSS_PD spatial
+//  reuse enables to ignore transmissions from another BSS when the
+//  received power is below the configured threshold, and therefore
+//  either defer during ongoing transmission or transmit at the same
+//  time.
+//
+//  Note that, by default, this script configures a network using a
+//  channel bandwidth of 20 MHz. Changing this value alone (through
+//  the --channelWidth argument) without properly adjusting other
+//  parameters will void the effect of spatial reuse: since energy is
+//  measured over the 20 MHz primary channel regardless of the channel
+//  width, doubling the transmission bandwidth creates a 3 dB drop in
+//  the measured energy level (i.e., a halving of the measured
+//  energy). Because of this, when using the channelWidth argument
+//  users should also adjust the CCA-ED Thresholds (via --ccaEdTrSta1,
+//  --ccaEdTrSta2, --ccaEdTrAp1, and --ccaEdTrAp2), the Minimum RSSI
+//  for preamble detection (via --minimumRssi), and the OBSS PD
+//  Threshold (via --obssPdThreshold) appropriately. For instance,
+//  this can be accomplished for a channel width of 40 MHz by lowering
+//  all these values by 3 dB compared to their defaults.
+//
+//  In addition, consider that adapting the adjustments shown above
+//  for an 80 MHz bandwidth (using a 6 dB threshold adjustment instead
+//  of 3 dB) will not produce any changes when enableObssPd is enabled
+//  or disabled. The cause for this is the insufficient amount of
+//  traffic that is generated by default in the example: increasing
+//  the bandwidth shortens the frame durations, and lowers the
+//  collision probability. Collisions between BSSs are a necessary
+//  condition to see the improvements brought by spatial reuse, and
+//  thus increasing the amount of generated traffic by setting the
+//  interval argument to a lower value is necessary to see the
+//  benefits of spatial reuse in this scenario. This can, for
+//  instance, be accomplished by setting --interval=0.0001.
 //
 
+#include "ns3/abort.h"
 #include "ns3/command-line.h"
 #include "ns3/config.h"
 #include "ns3/string.h"
+#include "ns3/double.h"
 #include "ns3/spectrum-wifi-helper.h"
 #include "ns3/ssid.h"
 #include "ns3/mobility-helper.h"
@@ -109,6 +134,8 @@
   double ccaEdTrSta2 = -62; // dBm
   double ccaEdTrAp1 = -62; // dBm
   double ccaEdTrAp2 = -62; // dBm
+  double minimumRssi = -82; // dBm
+  int channelBandwidth = 20; // MHz
   uint32_t payloadSize = 1500; // bytes
   uint32_t mcs = 0; // MCS value
   double interval = 0.001; // seconds
@@ -130,6 +157,9 @@
   cmd.AddValue ("ccaEdTrSta2", "CCA-ED Threshold of STA2 (dBm)", ccaEdTrSta2);
   cmd.AddValue ("ccaEdTrAp1", "CCA-ED Threshold of AP1 (dBm)", ccaEdTrAp1);
   cmd.AddValue ("ccaEdTrAp2", "CCA-ED Threshold of AP2 (dBm)", ccaEdTrAp2);
+  cmd.AddValue ("minimumRssi", "Minimum RSSI for the ThresholdPreambleDetectionModel", minimumRssi);
+  cmd.AddValue ("channelBandwidth", "Bandwidth of the channel in MHz [20, 40, or 80]", channelBandwidth);
+  cmd.AddValue ("obssPdThreshold", "Threshold for the OBSS PD Algorithm", obssPdThreshold);
   cmd.AddValue ("mcs", "The constant MCS value to transmit HE PPDUs", mcs);
   cmd.Parse (argc, argv);
 
@@ -148,12 +178,26 @@
 
   spectrumPhy.SetChannel (spectrumChannel);
   spectrumPhy.SetErrorRateModel ("ns3::YansErrorRateModel");
-  spectrumPhy.Set ("Frequency", UintegerValue (5180)); // channel 36 at 20 MHz
-  spectrumPhy.SetPreambleDetectionModel ("ns3::ThresholdPreambleDetectionModel");
-  //TODO: add parameter to configure CCA-PD
+  switch (channelBandwidth)
+    {
+    case 20:
+      spectrumPhy.Set ("ChannelSettings", StringValue ("{36, 20, BAND_5GHZ, 0}"));
+      break;
+    case 40:
+      spectrumPhy.Set ("ChannelSettings", StringValue ("{62, 40, BAND_5GHZ, 0}"));
+      break;
+    case 80:
+      spectrumPhy.Set ("ChannelSettings", StringValue ("{171, 80, BAND_5GHZ, 0}"));
+      break;
+    default:
+      NS_ABORT_MSG ("Unrecognized channel bandwidth: " << channelBandwidth);
+      break;
+    }
+  spectrumPhy.SetPreambleDetectionModel ("ns3::ThresholdPreambleDetectionModel",
+                                         "MinimumRssi", DoubleValue (minimumRssi));
 
   WifiHelper wifi;
-  wifi.SetStandard (WIFI_STANDARD_80211ax_5GHZ);
+  wifi.SetStandard (WIFI_STANDARD_80211ax);
   if (enableObssPd)
     {
       wifi.SetObssPdAlgorithm ("ns3::ConstantObssPdAlgorithm",
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/wireless/wifi-spectrum-per-example.cc ns-3.36/examples/wireless/wifi-spectrum-per-example.cc
--- ns-3.35/examples/wireless/wifi-spectrum-per-example.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/wireless/wifi-spectrum-per-example.cc	2022-04-30 18:23:57.726733000 -0700
@@ -206,7 +206,7 @@
 
 
       WifiHelper wifi;
-      wifi.SetStandard (WIFI_STANDARD_80211n_5GHZ);
+      wifi.SetStandard (WIFI_STANDARD_80211n);
       WifiMacHelper mac;
 
       Ssid ssid = Ssid ("ns380211n");
@@ -384,11 +384,11 @@
         {
           mac.SetType ("ns3::StaWifiMac",
                        "Ssid", SsidValue (ssid));
-          phy.Set ("ChannelWidth", UintegerValue (i <= 15 ? 20 : 40));
+          phy.Set ("ChannelSettings", StringValue (std::string ("{0, ") + (i <= 15 ? "20" : "40")
+                                                   + ", BAND_5GHZ, 0}"));
           staDevice = wifi.Install (phy, mac, wifiStaNode);
           mac.SetType ("ns3::ApWifiMac",
                        "Ssid", SsidValue (ssid));
-          phy.Set ("ChannelWidth", UintegerValue (i <= 15 ? 20 : 40));
           apDevice = wifi.Install (phy, mac, wifiApNode);
 
         }
@@ -396,11 +396,11 @@
         {
           mac.SetType ("ns3::StaWifiMac",
                        "Ssid", SsidValue (ssid));
-          phy.Set ("ChannelWidth", UintegerValue (i <= 15 ? 20 : 40));
+          phy.Set ("ChannelSettings", StringValue (std::string ("{0, ") + (i <= 15 ? "20" : "40")
+                                                   + ", BAND_5GHZ, 0}"));
           staDevice = wifi.Install (spectrumPhy, mac, wifiStaNode);
           mac.SetType ("ns3::ApWifiMac",
                        "Ssid", SsidValue (ssid));
-          phy.Set ("ChannelWidth", UintegerValue (i <= 15 ? 20 : 40));
           apDevice = wifi.Install (spectrumPhy, mac, wifiApNode);
         }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/wireless/wifi-spectrum-per-interference.cc ns-3.36/examples/wireless/wifi-spectrum-per-interference.cc
--- ns-3.35/examples/wireless/wifi-spectrum-per-interference.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/wireless/wifi-spectrum-per-interference.cc	2022-04-30 18:23:57.726733000 -0700
@@ -120,6 +120,7 @@
 
 Ptr<SpectrumModel> SpectrumModelWifi5180MHz, SpectrumModelWifi5190MHz;
 
+/** Initializer for a static spectrum model centered around 5180 MHz */
 class static_SpectrumModelWifi5180MHz_initializer
 {
 public:
@@ -138,6 +139,7 @@
 
 } static_SpectrumModelWifi5180MHz_initializer_instance;
 
+/** Initializer for a static spectrum model centered around 5190 MHz */
 class static_SpectrumModelWifi5190MHz_initializer
 {
 public:
@@ -228,7 +230,8 @@
                                       "Frequency", DoubleValue (frequency * 1e6));
           channel.SetPropagationDelay ("ns3::ConstantSpeedPropagationDelayModel");
           phy.SetChannel (channel.Create ());
-          phy.Set ("Frequency", UintegerValue (frequency));
+          phy.Set ("ChannelSettings", StringValue (std::string ("{") + (frequency == 5180 ? "36" : "38")
+                                                   + ", 0, BAND_5GHZ, 0}"));
         }
       else if (wifiType == "ns3::SpectrumWifiPhy")
         {
@@ -245,7 +248,10 @@
 
           spectrumPhy.SetChannel (spectrumChannel);
           spectrumPhy.SetErrorRateModel (errorModelType);
-          spectrumPhy.Set ("Frequency", UintegerValue (frequency)); // channel 36 at 20 MHz, 38 at 40 MHz
+          // channel 36 at 20 MHz, 38 at 40 MHz
+          spectrumPhy.Set ("ChannelSettings", StringValue (std::string ("{")
+                                                           + (frequency == 5180 ? "36" : "38")
+                                                           + ", 0, BAND_5GHZ, 0}"));
         }
       else
         {
@@ -253,7 +259,7 @@
         }
 
       WifiHelper wifi;
-      wifi.SetStandard (WIFI_STANDARD_80211n_5GHZ);
+      wifi.SetStandard (WIFI_STANDARD_80211n);
       WifiMacHelper mac;
 
       Ssid ssid = Ssid ("ns380211n");
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/wireless/wifi-spectrum-saturation-example.cc ns-3.36/examples/wireless/wifi-spectrum-saturation-example.cc
--- ns-3.35/examples/wireless/wifi-spectrum-saturation-example.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/wireless/wifi-spectrum-saturation-example.cc	2022-04-30 18:23:57.726733000 -0700
@@ -224,7 +224,7 @@
         }
 
       WifiHelper wifi;
-      wifi.SetStandard (WIFI_STANDARD_80211n_5GHZ);
+      wifi.SetStandard (WIFI_STANDARD_80211n);
       WifiMacHelper mac;
 
       Ssid ssid = Ssid ("ns380211n");
@@ -563,16 +563,18 @@
       NetDeviceContainer apDevice;
 
       channelWidth = (i <= 15 || (i > 31 && i <= 47) ? 20 : 40);
+      std::string channelStr = "{0, " + std::to_string (channelWidth) + ", BAND_5GHZ, 0}";
 
       if (wifiType == "ns3::YansWifiPhy")
         {
           mac.SetType ("ns3::StaWifiMac",
                        "Ssid", SsidValue (ssid));
-          phy.Set ("ChannelWidth", UintegerValue (channelWidth));
+          phy.Set ("ChannelSettings", StringValue (channelStr));
+
           staDevice = wifi.Install (phy, mac, wifiStaNode);
           mac.SetType ("ns3::ApWifiMac",
                        "Ssid", SsidValue (ssid));
-          phy.Set ("ChannelWidth", UintegerValue (channelWidth));
+          phy.Set ("ChannelSettings", StringValue (channelStr));
           apDevice = wifi.Install (phy, mac, wifiApNode);
 
         }
@@ -580,11 +582,11 @@
         {
           mac.SetType ("ns3::StaWifiMac",
                        "Ssid", SsidValue (ssid));
-          phy.Set ("ChannelWidth", UintegerValue (channelWidth));
+          phy.Set ("ChannelSettings", StringValue (channelStr));
           staDevice = wifi.Install (spectrumPhy, mac, wifiStaNode);
           mac.SetType ("ns3::ApWifiMac",
                        "Ssid", SsidValue (ssid));
-          phy.Set ("ChannelWidth", UintegerValue (channelWidth));
+          phy.Set ("ChannelSettings", StringValue (channelStr));
           apDevice = wifi.Install (spectrumPhy, mac, wifiApNode);
         }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/wireless/wifi-tcp.cc ns-3.36/examples/wireless/wifi-tcp.cc
--- ns-3.35/examples/wireless/wifi-tcp.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/wireless/wifi-tcp.cc	2022-04-30 18:23:57.726733000 -0700
@@ -109,7 +109,7 @@
 
   WifiMacHelper wifiMac;
   WifiHelper wifiHelper;
-  wifiHelper.SetStandard (WIFI_STANDARD_80211n_5GHZ);
+  wifiHelper.SetStandard (WIFI_STANDARD_80211n);
 
   /* Set up Legacy Channel */
   YansWifiChannelHelper wifiChannel;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/wireless/wifi-timing-attributes.cc ns-3.36/examples/wireless/wifi-timing-attributes.cc
--- ns-3.35/examples/wireless/wifi-timing-attributes.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/wireless/wifi-timing-attributes.cc	2022-04-30 18:23:57.726733000 -0700
@@ -38,7 +38,7 @@
 //
 // Example: set slot time to 20 microseconds, while keeping other values as defined in the simulation script:
 //
-//          ./waf --run "wifi-timing-attributes --slot=20"
+//          ./ns3 run "wifi-timing-attributes --slot=20"
 //
 // Network topology:
 //
@@ -83,7 +83,7 @@
 
   //Default IEEE 802.11n (2.4 GHz)
   WifiHelper wifi;
-  wifi.SetStandard (WIFI_STANDARD_80211n_2_4GHZ);
+  wifi.SetStandard (WIFI_STANDARD_80211n);
   wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager",
                                 "DataMode", StringValue ("HtMcs7"),
                                 "ControlMode", StringValue ("HtMcs0"));
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/wireless/wifi-txop-aggregation.cc ns-3.36/examples/wireless/wifi-txop-aggregation.cc
--- ns-3.35/examples/wireless/wifi-txop-aggregation.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/wireless/wifi-txop-aggregation.cc	2022-04-30 18:23:57.726733000 -0700
@@ -57,7 +57,7 @@
 //
 // The user can select the distance between the stations and the APs, can enable/disable the RTS/CTS mechanism
 // and can modify the duration of a TXOP.
-// Example: ./waf --run "wifi-txop-aggregation --distance=10 --enableRts=0 --simulationTime=20"
+// Example: ./ns3 run "wifi-txop-aggregation --distance=10 --enableRts=0 --simulationTime=20"
 //
 // The output prints the throughput and the maximum TXOP duration measured for the 4 cases/networks
 // described above. When default aggregation parameters are enabled, the
@@ -79,8 +79,14 @@
  */
 struct TxopDurationTracer
 {
+  /**
+   * Callback connected to TXOP duration trace source.
+   *
+   * \param startTime TXOP start time
+   * \param duration TXOP duration
+   */
   void Trace (Time startTime, Time duration);
-  Time m_max {Seconds (0)};
+  Time m_max {Seconds (0)};     //!< maximum TXOP duration
 };
 
 void
@@ -125,7 +131,7 @@
   phy.SetChannel (channel.Create ());
 
   WifiHelper wifi;
-  wifi.SetStandard (WIFI_STANDARD_80211n_5GHZ);
+  wifi.SetStandard (WIFI_STANDARD_80211n);
   wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager", "DataMode", StringValue ("HtMcs7"), "ControlMode", StringValue ("HtMcs0"));
   WifiMacHelper mac;
 
@@ -134,7 +140,7 @@
 
   // Network A
   ssid = Ssid ("network-A");
-  phy.Set ("ChannelNumber", UintegerValue (36));
+  phy.Set ("ChannelSettings", StringValue ("{36, 0, BAND_5GHZ, 0}"));
   mac.SetType ("ns3::StaWifiMac",
                "Ssid", SsidValue (ssid));
   staDeviceA = wifi.Install (phy, mac, wifiStaNodes.Get (0));
@@ -159,7 +165,7 @@
 
   // Network B
   ssid = Ssid ("network-B");
-  phy.Set ("ChannelNumber", UintegerValue (40));
+  phy.Set ("ChannelSettings", StringValue ("{40, 0, BAND_5GHZ, 0}"));
   mac.SetType ("ns3::StaWifiMac",
                "Ssid", SsidValue (ssid));
 
@@ -191,7 +197,7 @@
 
   // Network C
   ssid = Ssid ("network-C");
-  phy.Set ("ChannelNumber", UintegerValue (44));
+  phy.Set ("ChannelSettings", StringValue ("{44, 0, BAND_5GHZ, 0}"));
   mac.SetType ("ns3::StaWifiMac",
                "Ssid", SsidValue (ssid));
 
@@ -225,7 +231,7 @@
 
   // Network D
   ssid = Ssid ("network-D");
-  phy.Set ("ChannelNumber", UintegerValue (48));
+  phy.Set ("ChannelSettings", StringValue ("{48, 0, BAND_5GHZ, 0}"));
   mac.SetType ("ns3::StaWifiMac",
                "Ssid", SsidValue (ssid));
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/wireless/wifi-vht-network.cc ns-3.36/examples/wireless/wifi-vht-network.cc
--- ns-3.35/examples/wireless/wifi-vht-network.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/wireless/wifi-vht-network.cc	2022-04-30 18:23:57.726733000 -0700
@@ -128,6 +128,9 @@
               YansWifiPhyHelper phy;
               phy.SetChannel (channel.Create ());
 
+              phy.Set ("ChannelSettings", StringValue ("{0, " + std::to_string (channelWidth)
+                                                       + ", BAND_5GHZ, 0}"));
+
               WifiHelper wifi;
               wifi.SetStandard (WIFI_STANDARD_80211ac);
               WifiMacHelper mac;
@@ -141,7 +144,6 @@
 
               mac.SetType ("ns3::StaWifiMac",
                            "Ssid", SsidValue (ssid));
-              phy.Set ("ChannelWidth", UintegerValue (channelWidth));
 
               NetDeviceContainer staDevice;
               staDevice = wifi.Install (phy, mac, wifiStaNode);
@@ -149,7 +151,6 @@
               mac.SetType ("ns3::ApWifiMac",
                            "EnableBeaconJitter", BooleanValue (false),
                            "Ssid", SsidValue (ssid));
-              phy.Set ("ChannelWidth", UintegerValue (channelWidth));
 
               NetDeviceContainer apDevice;
               apDevice = wifi.Install (phy, mac, wifiApNode);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/examples/wireless/wscript ns-3.36/examples/wireless/wscript
--- ns-3.35/examples/wireless/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/examples/wireless/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,123 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    obj = bld.create_ns3_program('mixed-wired-wireless', ['wifi', 'applications', 'olsr', 'netanim'])
-    obj.source = 'mixed-wired-wireless.cc'
-
-    bld.register_ns3_script('mixed-wired-wireless.py', ['wifi', 'applications', 'olsr'])
-
-    obj = bld.create_ns3_program('wifi-adhoc', ['wifi', 'applications'])
-    obj.source = 'wifi-adhoc.cc'
-
-    obj = bld.create_ns3_program('wifi-clear-channel-cmu', ['internet', 'wifi'])
-    obj.source = 'wifi-clear-channel-cmu.cc'
-
-    obj = bld.create_ns3_program('wifi-ap', ['wifi', 'applications'])
-    obj.source = 'wifi-ap.cc'
-
-    bld.register_ns3_script('wifi-ap.py', ['wifi', 'applications'])
-
-    obj = bld.create_ns3_program('wifi-wired-bridging', ['wifi', 'csma', 'bridge', 'applications'])
-    obj.source = 'wifi-wired-bridging.cc'
-
-    obj = bld.create_ns3_program('wifi-multirate', ['wifi', 'flow-monitor', 'olsr', 'applications'])
-    obj.source = 'wifi-multirate.cc'
-
-    obj = bld.create_ns3_program('wifi-simple-adhoc', ['internet', 'wifi'])
-    obj.source = 'wifi-simple-adhoc.cc'
-
-    obj = bld.create_ns3_program('wifi-simple-adhoc-grid', ['internet', 'wifi', 'olsr'])
-    obj.source = 'wifi-simple-adhoc-grid.cc'
-
-    obj = bld.create_ns3_program('wifi-simple-infra', ['internet', 'wifi'])
-    obj.source = 'wifi-simple-infra.cc'
-
-    obj = bld.create_ns3_program('wifi-simple-interference', ['internet', 'wifi'])
-    obj.source = 'wifi-simple-interference.cc'
-
-    obj = bld.create_ns3_program('wifi-blockack', ['wifi', 'applications'])
-    obj.source = 'wifi-blockack.cc'
-
-    obj = bld.create_ns3_program('wifi-dsss-validation', ['wifi'])
-    obj.source = 'wifi-dsss-validation.cc'
-
-    obj = bld.create_ns3_program('wifi-ofdm-validation', ['wifi'])
-    obj.source = 'wifi-ofdm-validation.cc'
-
-    obj = bld.create_ns3_program('wifi-ofdm-ht-validation', ['wifi'])
-    obj.source = 'wifi-ofdm-ht-validation.cc'
-
-    obj = bld.create_ns3_program('wifi-ofdm-vht-validation', ['wifi'])
-    obj.source = 'wifi-ofdm-vht-validation.cc'
-
-    obj = bld.create_ns3_program('wifi-hidden-terminal', ['wifi', 'applications', 'flow-monitor'])
-    obj.source = 'wifi-hidden-terminal.cc'
-
-    obj = bld.create_ns3_program('wifi-ht-network', ['wifi', 'applications'])
-    obj.source = 'wifi-ht-network.cc'
-
-    obj = bld.create_ns3_program('wifi-vht-network', ['wifi', 'applications'])
-    obj.source = 'wifi-vht-network.cc'
-
-    obj = bld.create_ns3_program('wifi-timing-attributes', ['wifi', 'applications'])
-    obj.source = 'wifi-timing-attributes.cc'
-
-    obj = bld.create_ns3_program('wifi-sleep', ['wifi', 'applications'])
-    obj.source = 'wifi-sleep.cc'
-    
-    obj = bld.create_ns3_program('wifi-power-adaptation-distance', ['wifi', 'applications'])
-    obj.source = 'wifi-power-adaptation-distance.cc'
-    
-    obj = bld.create_ns3_program('wifi-power-adaptation-interference', ['wifi', 'applications', 'flow-monitor'])
-    obj.source = 'wifi-power-adaptation-interference.cc'
-
-    obj = bld.create_ns3_program('wifi-rate-adaptation-distance', ['wifi', 'applications'])
-    obj.source = 'wifi-rate-adaptation-distance.cc'
-
-    obj = bld.create_ns3_program('wifi-aggregation', ['wifi', 'applications'])
-    obj.source = 'wifi-aggregation.cc'
-
-    obj = bld.create_ns3_program('wifi-txop-aggregation', ['wifi', 'applications'])
-    obj.source = 'wifi-txop-aggregation.cc'
-
-    obj = bld.create_ns3_program('wifi-simple-ht-hidden-stations', ['wifi', 'applications'])
-    obj.source = 'wifi-simple-ht-hidden-stations.cc'
-
-    obj = bld.create_ns3_program('wifi-80211n-mimo', ['wifi', 'applications'])
-    obj.source = 'wifi-80211n-mimo.cc'
-
-    obj = bld.create_ns3_program('wifi-mixed-network', ['wifi', 'applications'])
-    obj.source = 'wifi-mixed-network.cc'
-
-    obj = bld.create_ns3_program('wifi-tcp', ['wifi', 'applications'])    
-    obj.source = 'wifi-tcp.cc'
-
-    obj = bld.create_ns3_program('wifi-80211e-txop', ['wifi', 'applications'])
-    obj.source = 'wifi-80211e-txop.cc'
-
-    obj = bld.create_ns3_program('wifi-spectrum-per-example', ['wifi', 'applications'])
-    obj.source = 'wifi-spectrum-per-example.cc'
-
-    obj = bld.create_ns3_program('wifi-spectrum-per-interference', ['wifi', 'applications'])
-    obj.source = 'wifi-spectrum-per-interference.cc'
-
-    obj = bld.create_ns3_program('wifi-spectrum-saturation-example', ['wifi', 'applications'])
-    obj.source = 'wifi-spectrum-saturation-example.cc'
-
-    obj = bld.create_ns3_program('wifi-ofdm-he-validation', ['wifi'])
-    obj.source = 'wifi-ofdm-he-validation.cc'
-
-    obj = bld.create_ns3_program('wifi-he-network', ['wifi', 'applications'])
-    obj.source = 'wifi-he-network.cc'
-
-    obj = bld.create_ns3_program('wifi-multi-tos', ['wifi', 'applications'])
-    obj.source = 'wifi-multi-tos.cc'
-
-    obj = bld.create_ns3_program('wifi-backward-compatibility', ['wifi', 'applications'])
-    obj.source = 'wifi-backward-compatibility.cc'
-
-    obj = bld.create_ns3_program('wifi-spatial-reuse', ['wifi', 'applications'])
-    obj.source = 'wifi-spatial-reuse.cc'
-
-    obj = bld.create_ns3_program('wifi-error-models-comparison', ['wifi'])
-    obj.source = 'wifi-error-models-comparison.cc'
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/Makefile ns-3.36/Makefile
--- ns-3.35/Makefile	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/Makefile	1969-12-31 16:00:00.000000000 -0800
@@ -1,20 +0,0 @@
-# Makefile wrapper for waf
-
-all:
-	./waf
-
-# free free to change this part to suit your requirements
-configure:
-	./waf configure --enable-examples --enable-tests
-
-build:
-	./waf build
-
-install:
-	./waf install
-
-clean:
-	./waf clean
-
-distclean:
-	./waf distclean
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/ns3 ns-3.36/ns3
--- ns-3.35/ns3	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/ns3	2022-04-30 18:23:57.726733000 -0700
@@ -0,0 +1,1336 @@
+#! /usr/bin/env python3
+
+import argparse
+import atexit
+import glob
+import os
+import re
+import shutil
+import subprocess
+import sys
+
+ns3_path = os.path.dirname(os.path.abspath(__file__))
+out_dir = os.sep.join([ns3_path, "build"])
+lock_file = os.sep.join([ns3_path, ".lock-ns3_%s_build" % sys.platform])
+
+max_cpu_threads = max(1, os.cpu_count() - 1)
+print_buffer = ""
+run_verbose = True
+path_sep = ";" if sys.platform == "win32" else ":"
+
+# Prints everything in the print_buffer on exit
+def exit_handler(dry_run):
+    global print_buffer, run_verbose
+    # We should not print anything in run except if dry_run or run_verbose
+    if not dry_run and not run_verbose:
+        return
+    if print_buffer == "":
+        return
+    if dry_run:
+        print("The following commands would be executed:")
+    elif run_verbose:
+        print("Finished executing the following commands:")
+    print(print_buffer[1:])
+
+
+def on_off_argument(parser, option_name, help_on, help_off=None):
+    parser.add_argument('--enable-%s' % option_name,
+                        help=('Enable %s' % help_on) if help_off is None else help_on,
+                        action="store_true", default=None)
+    parser.add_argument('--disable-%s' % option_name,
+                        help=('Disable %s' % help_on) if help_off is None else help_off,
+                        action="store_true", default=None)
+    return parser
+
+
+def on_off(condition):
+    return "ON" if condition else "OFF"
+
+
+def on_off_condition(args, cmake_flag, option_name):
+    enable_option = args.__getattribute__("enable_" + option_name)
+    disable_option = args.__getattribute__("disable_" + option_name)
+    cmake_arg = None
+    if enable_option is not None or disable_option is not None:
+        cmake_arg = "-DNS3_%s=%s" % (cmake_flag, on_off(enable_option and not disable_option))
+    return cmake_arg
+
+
+def add_argument_to_subparsers(parsers: list,
+                               arguments: list,
+                               help_msg: str,
+                               dest: str,
+                               action="store_true",
+                               default_value=None):
+    # Instead of copying and pasting repeated arguments for each parser, we add them here
+    for subparser in parsers:
+        subparser_name = subparser.prog.replace("ns3", "").strip()
+        destination = ("%s_%s" % (subparser_name, dest)) if subparser_name else dest
+        subparser.add_argument(*arguments,
+                               help=help_msg,
+                               action=action,
+                               default=default_value,
+                               dest=destination)
+
+
+def parse_args(argv):
+    parser = argparse.ArgumentParser(description="ns-3 wrapper for the CMake build system", add_help=False)
+
+    parser.add_argument('--help',
+                        help="Print a summary of available commands",
+                        action="store_true", default=None, dest="help")
+    # parser.add_argument('--docset',
+    #               help=(
+    #                   'Create Docset, without building. This requires the docsetutil tool from Xcode 9.2 or earlier.'
+    #                   'See Bugzilla 2196 for more details.'),
+    #               action="store_true", default=None,
+    #               dest="docset_build")
+
+    sub_parser = parser.add_subparsers()
+
+    parser_build = sub_parser.add_parser('build',
+                                         help=('Accepts a list of targets to build,'
+                                               ' or builds the entire project if no target is given'))
+    parser_build.add_argument('build',
+                              help='Build the entire project or the specified target and dependencies',
+                              action="store", nargs='*', default=None)
+
+    parser_configure = sub_parser.add_parser('configure',
+                                             help='Try "./ns3 configure --help" for more configuration options')
+    parser_configure.add_argument('configure',
+                                  action='store_true', default=False)
+    parser_configure.add_argument('-d', '--build-profile',
+                                  help='Build profile',
+                                  dest='build_profile',
+                                  choices=["debug", "default", "release", "optimized"],
+                                  action="store", type=str, default=None)
+
+    parser_configure.add_argument('-G',
+                                  help=('CMake generator '
+                                        '(e.g. https://cmake.org/cmake/help/latest/manual/cmake-generators.7.html)'),
+                                  action="store", type=str, default=None)
+
+    parser_configure.add_argument('--cxx-standard',
+                                  help='Compile NS-3 with the given C++ standard',
+                                  type=str, default=None)
+
+    # On-Off options
+    # First positional is transformed into --enable-option --disable-option
+    # Second positional is used for description "Enable %s" % second positional/"Disable %s" % second positional
+    # When an optional third positional is given, the second is used as is as the 'enable' description
+    # and the third is used as is as the 'disable' description
+    on_off_options = [
+        ("asserts", "the asserts regardless of the compile mode"),
+        ("des-metrics", "Logging all events in a json file with the name of the executable "
+                        "(which must call CommandLine::Parse(argc, argv)"
+         ),
+        ("build-version", "embedding git changes as a build version during build"),
+        ("dpdk", "the fd-net-device DPDK features"),
+        ("examples", "the ns-3 examples"),
+        ("gcov", "code coverage analysis"),
+        ("gsl", "GNU Scientific Library (GSL) features"),
+        ("gtk", "GTK support in ConfigStore"),
+        ("logs", "the logs regardless of the compile mode"),
+        ("monolib", "a single shared library with all ns-3 modules"),
+        ("mpi", "the MPI support for distributed simulation"),
+        ("python-bindings", "python bindings"),
+        ("tests", "the ns-3 tests"),
+        ("sanitizers", "address, memory leaks and undefined behavior sanitizers"),
+        ("static", "Build a single static library with all ns-3",
+         "Restore the shared libraries"
+         ),
+        ("sudo", "use of sudo to setup suid bits on ns3 executables."),
+        ("verbose", "printing of additional build system messages"),
+        ("warnings", "compiler warnings"),
+        ("werror", "Treat compiler warnings as errors",
+         "Treat compiler warnings as warnings"
+         ),
+    ]
+    for on_off_option in on_off_options:
+        parser_configure = on_off_argument(parser_configure, *on_off_option)
+
+    parser_configure.add_argument('--enable-modules',
+                                  help='List of modules to build (e.g. core;network;internet)',
+                                  action="store", type=str, default=None)
+    parser_configure.add_argument('--disable-modules',
+                                  help='List of modules not to build (e.g. lte;wimax)',
+                                  action="store", type=str, default=None)
+    parser_configure.add_argument('--lcov-report',
+                                  help=('Generate a code coverage report '
+                                        '(use this option after configuring with --enable-gcov and running a program)'),
+                                  action="store_true", default=None)
+    parser_configure.add_argument('--lcov-zerocounters',
+                                  help=('Zero the lcov counters'
+                                        '(use this option before rerunning a program'
+                                        'when generating repeated lcov reports)'),
+                                  action="store_true", default=None)
+
+    parser_configure.add_argument('--out', '--output-directory',
+                                  help=('Use BRITE integration support, given by the indicated path,'
+                                        ' to allow the use of the BRITE topology generator'),
+                                  type=str, default=None, dest="output_directory")
+    parser_configure.add_argument('--with-brite',
+                                  help=('Use BRITE integration support, given by the indicated path,'
+                                        ' to allow the use of the BRITE topology generator'),
+                                  type=str, default=None)
+    parser_configure.add_argument('--with-click',
+                                  help='Path to Click source or installation prefix for NS-3 Click Integration support',
+                                  type=str, default=None)
+    parser_configure.add_argument('--with-openflow',
+                                  help='Path to OFSID source for NS-3 OpenFlow Integration support',
+                                  type=str, default=None)
+    parser_configure.add_argument('--force-refresh',
+                                  help='Force refresh the CMake cache by deleting'
+                                       'the cache and reconfiguring the project',
+                                  action="store_true", default=None)
+    parser_configure.add_argument('--prefix',
+                                  help='Target output directory to install',
+                                  action="store", default=None)
+    parser_configure.add_argument('--trace-performance',
+                                  help="Generate a performance trace log for the CMake configuration",
+                                  action="store_true", default=None, dest="trace_cmake_perf")
+
+    parser_clean = sub_parser.add_parser('clean', help='Removes files created by ns3')
+    parser_clean.add_argument('clean', action="store_true", default=False)
+
+    parser_install = sub_parser.add_parser('install', help='Install ns-3')
+    parser_install.add_argument('install', action="store_true", default=False)
+
+    parser_uninstall = sub_parser.add_parser('uninstall', help='Uninstall ns-3')
+    parser_uninstall.add_argument('uninstall', action="store_true", default=False)
+
+    parser_run = sub_parser.add_parser('run',
+                                       help='Try "./ns3 run --help" for more runtime options')
+    parser_run.add_argument('run',
+                            help='Build and run executable. If --no-build is present, build step is skipped.',
+                            type=str, default='')
+    parser_run.add_argument('--no-build',
+                            help='Skip build step.',
+                            action="store_true", default=False)
+    parser_run.add_argument('--command-template',
+                            help=('Template of the command used to run the program given by run;'
+                                  ' It should be a shell command string containing %%s inside,'
+                                  ' which will be replaced by the actual program.'),
+                            type=str, default=None)
+    parser_run.add_argument('--cwd',
+                            help='Set the working directory for a program.',
+                            action="store", type=str, default=None)
+    parser_run.add_argument('--gdb',
+                            help='Change the default command template to run programs with gdb',
+                            action="store_true", default=None)
+    parser_run.add_argument('--lldb',
+                            help='Change the default command template to run programs with lldb',
+                            action="store_true", default=None)
+    parser_run.add_argument('--valgrind',
+                            help='Change the default command template to run programs with valgrind',
+                            action="store_true", default=None)
+    parser_run.add_argument('--vis', '--visualize',
+                            help='Modify --run arguments to enable the visualizer',
+                            action="store_true", dest="visualize", default=None)
+    parser_run.add_argument('--enable-sudo',
+                            help='Use sudo to setup suid bits on ns3 executables.',
+                            dest='enable_sudo', action='store_true',
+                            default=False)
+
+    parser_shell = sub_parser.add_parser('shell',
+                                         help='Try "./ns3 shell --help" for more runtime options')
+    parser_shell.add_argument('shell',
+                              help='Export necessary environment variables and open a shell',
+                              action="store_true", default=False)
+
+    parser_docs = sub_parser.add_parser('docs',
+                                        help='Try "./ns3 docs --help" for more documentation options')
+    parser_docs.add_argument('docs',
+                             help='Build project documentation',
+                             choices=["manual", "models", "tutorial", "contributing",
+                                      "sphinx", "doxygen-no-build", "doxygen", "all"],
+                             action="store", type=str, default=None)
+
+    parser_show = sub_parser.add_parser('show',
+                                        help='Try "./ns3 show --help" for more runtime options')
+    parser_show.add_argument('show',
+                             help='Print build profile type, ns-3 version or current configuration',
+                             choices=["profile", "version", "config"],
+                             action="store", type=str, default=None)
+
+    add_argument_to_subparsers(
+        [parser, parser_build, parser_configure, parser_clean, parser_docs, parser_run, parser_show],
+        ["--dry-run"],
+        help_msg="Do not execute the commands.",
+        dest="dry_run")
+
+    add_argument_to_subparsers([parser, parser_build, parser_run],
+                               ['-j', '--jobs'],
+                               help_msg="Set number of parallel jobs.",
+                               dest="jobs",
+                               action="store",
+                               default_value=max_cpu_threads)
+
+    add_argument_to_subparsers([parser, parser_build, parser_configure, parser_run, parser_show],
+                               ["--quiet"],
+                               help_msg="Don't print task lines, i.e. messages saying which tasks are being executed.",
+                               dest="quiet")
+
+    add_argument_to_subparsers([parser, parser_build, parser_configure, parser_docs, parser_run],
+                               ['-v', '--verbose'],
+                               help_msg='Print which commands were executed',
+                               dest='verbose',
+                               default_value=False)
+
+    # Parse known arguments and separate from unknown arguments
+    args, unknown_args = parser.parse_known_args(argv)
+
+    if args.help:
+        print(parser.description)
+        print("")
+        print(parser.format_usage())
+
+        # retrieve subparsers from parser
+        subparsers_actions = [
+            action for action in parser._actions
+            if isinstance(action, argparse._SubParsersAction)]
+        # there will probably only be one subparser_action,
+        # but better safe than sorry
+        for subparsers_action in subparsers_actions:
+            # get all subparsers and print help
+            for choice, subparser in subparsers_action.choices.items():
+                subcommand = subparser.format_usage()[:-1].replace("usage: ", "   or: ")
+                if len(subcommand) > 1:
+                    print(subcommand)
+
+        print(parser.format_help().replace(parser.description, "").replace(parser.format_usage(), ""))
+        exit(0)
+
+    # Merge attributes
+    attributes_to_merge = ["dry_run", "verbose", "quiet"]
+    filtered_attributes = list(
+        filter(lambda x: x if ("disable" not in x and "enable" not in x) else None, args.__dir__()))
+    for attribute in attributes_to_merge:
+        merging_attributes = list(
+            map(lambda x: args.__getattribute__(x) if attribute in x else None, filtered_attributes))
+        setattr(args, attribute, merging_attributes.count(True) > 0)
+
+    attributes_to_merge = ["jobs"]
+    filtered_attributes = list(filter(lambda x: x if ("disable" not in x and "enable" not in x) else 0, args.__dir__()))
+    for attribute in attributes_to_merge:
+        merging_attributes = list(
+            map(lambda x: int(args.__getattribute__(x)) if attribute in x else max_cpu_threads, filtered_attributes))
+        setattr(args, attribute, min(merging_attributes))
+
+    # If some positional options are not in args, set them to false.
+    for option in ["clean", "configure", "docs", "install", "run", "shell", "uninstall", "show"]:
+        if option not in args:
+            setattr(args, option, False)
+
+    if args.run and args.enable_sudo is None:
+        args.enable_sudo = True
+
+    # Filter arguments before --
+    setattr(args, "program_args", [])
+    if unknown_args:
+        try:
+            args_separator_index = argv.index('--')
+            args.program_args = argv[args_separator_index + 1:]
+        except ValueError:
+            msg = "Unknown options were given: {options}.\n" \
+                  "To see the allowed options add the `--help` option.\n" \
+                  "To forward configuration or runtime options, put them after '--'.\n"
+            if args.run:
+                msg += "Try: ./ns3 run {target} -- {options}\n"
+            if args.configure:
+                msg += "Try: ./ns3 configure -- {options}\n"
+            msg = msg.format(options=", ".join(unknown_args), target=args.run)
+            raise Exception(msg)
+    return args
+
+
+def check_lock_data(output_directory):
+    # Check the .lock-ns3 for the build type (in case there are multiple cmake cache folders
+    ns3_modules_tests = []
+    ns3_modules_apiscan = []
+    ns3_modules_bindings = []
+    ns3_modules = None
+
+    build_info = {"NS3_ENABLED_MODULES": [],
+                  "BUILD_PROFILE": None,
+                  "VERSION": None,
+                  "ENABLE_EXAMPLES": False,
+                  "ENABLE_SUDO": False,
+                  "ENABLE_TESTS": False,
+                  }
+    if output_directory and os.path.exists(lock_file):
+        exec(open(lock_file).read(), globals(), build_info)
+        ns3_modules = build_info["NS3_ENABLED_MODULES"]
+        if ns3_modules:
+            ns3_modules.extend(build_info["NS3_ENABLED_CONTRIBUTED_MODULES"])
+            if build_info["ENABLE_TESTS"]:
+                ns3_modules_tests = [x + "-test" for x in ns3_modules]
+            if build_info["ENABLE_PYTHON_BINDINGS"]:
+                ns3_modules_bindings = [x + "-bindings" for x in ns3_modules]
+            if "ENABLE_SCAN_PYTHON_BINDINGS" in build_info and build_info["ENABLE_SCAN_PYTHON_BINDINGS"]:
+                ns3_modules_apiscan = [x + "-apiscan" for x in ns3_modules]
+            ns3_modules = ns3_modules + ns3_modules_tests + ns3_modules_apiscan + ns3_modules_bindings
+    return build_info, ns3_modules
+
+
+def print_and_buffer(message):
+    global print_buffer
+    # print(message)
+    print_buffer += "\n" + message
+
+
+def clean_cmake_artifacts(dry_run=False):
+    print_and_buffer("rm -R %s" % os.path.relpath(out_dir, ns3_path))
+
+    if not dry_run:
+        shutil.rmtree(out_dir, ignore_errors=True)
+
+    cmake_cache_files = glob.glob("%s/**/CMakeCache.txt" % ns3_path, recursive=True)
+    for cmake_cache_file in cmake_cache_files:
+        dirname = os.path.dirname(cmake_cache_file)
+        print_and_buffer("rm -R %s" % os.path.relpath(dirname, ns3_path))
+        if not dry_run:
+            shutil.rmtree(dirname, ignore_errors=True)
+
+    if os.path.exists(lock_file):
+        print_and_buffer("rm %s" % os.path.relpath(lock_file, ns3_path))
+        if not dry_run:
+            os.remove(lock_file)
+
+
+def search_cmake_cache(build_profile):
+    # Search for the CMake cache
+    cmake_cache_files = glob.glob("%s/**/CMakeCache.txt" % ns3_path, recursive=True)
+    current_cmake_cache_folder = None
+    current_cmake_generator = None
+
+    if cmake_cache_files:
+        # In case there are multiple cache files, get the correct one
+        for cmake_cache_file in cmake_cache_files:
+            # We found the right cache folder
+            if current_cmake_cache_folder and current_cmake_generator:
+                break
+
+            # Still looking for it
+            current_cmake_cache_folder = None
+            current_cmake_generator = None
+            with open(cmake_cache_file, "r") as f:
+                lines = f.read().split("\n")
+
+            while len(lines):
+                line = lines[0]
+                lines.pop(0)
+
+                # Check for EOF
+                if current_cmake_cache_folder and current_cmake_generator:
+                    break
+
+                # Check the build profile
+                if "build_profile:INTERNAL" in line:
+                    if build_profile:
+                        if build_profile == line.split("=")[-1]:
+                            current_cmake_cache_folder = os.path.dirname(cmake_cache_file)
+                    else:
+                        current_cmake_cache_folder = os.path.dirname(cmake_cache_file)
+
+                # Check the generator
+                if "CMAKE_GENERATOR:" in line:
+                    current_cmake_generator = line.split("=")[-1]
+
+    if not current_cmake_generator:
+        # Search for available generators
+        cmake_generator_map = {"ninja": "Ninja",
+                               "make": "Unix Makefiles",
+                               "xcodebuild": "Xcode"
+                               }
+        available_generators = []
+        for generator in cmake_generator_map.keys():
+            if shutil.which(generator):
+                available_generators.append(generator)
+
+        # Select the first one
+        if len(available_generators) == 0:
+            raise Exception("No generator available.")
+
+        current_cmake_generator = cmake_generator_map[available_generators[0]]
+
+    return current_cmake_cache_folder, current_cmake_generator
+
+
+def project_not_configured(config_msg=""):
+    print("You need to configure ns-3 first: try ./ns3 configure%s" % config_msg)
+    exit(1)
+
+
+def check_config(current_cmake_cache_folder):
+    if current_cmake_cache_folder is None:
+        project_not_configured()
+    config_table = current_cmake_cache_folder + os.sep + "ns3config.txt"
+    if not os.path.exists(config_table):
+        project_not_configured()
+    with open(config_table, "r") as f:
+        print(f.read())
+
+
+def project_configured(current_cmake_cache_folder):
+    if not current_cmake_cache_folder:
+        return False
+    if not os.path.exists(current_cmake_cache_folder):
+        return False
+    if not os.path.exists(os.sep.join([current_cmake_cache_folder, "CMakeCache.txt"])):
+        return False
+    return True
+
+
+def configure_cmake(cmake, args, current_cmake_cache_folder, current_cmake_generator, output, dry_run=False):
+    # Aggregate all flags to configure CMake
+    cmake_args = [cmake]
+
+    if not project_configured(current_cmake_cache_folder):
+        # Create a new cmake_cache folder if one does not exist
+        current_cmake_cache_folder = os.sep.join([ns3_path, "cmake-cache"])
+        if not os.path.exists(current_cmake_cache_folder):
+            print_and_buffer("mkdir %s" % os.path.relpath(current_cmake_cache_folder, ns3_path))
+            if not dry_run:
+                os.makedirs(current_cmake_cache_folder, exist_ok=True)
+
+        # Set default build type to default if a previous cache doesn't exist
+        if args.build_profile is None:
+            args.build_profile = "default"
+
+        # Set generator if a previous cache doesn't exist
+        if args.G is None:
+            args.G = current_cmake_generator
+
+        # C++ standard
+        if args.cxx_standard is not None:
+            cmake_args.append("-DCMAKE_CXX_STANDARD=%s" % args.cxx_standard)
+
+        # Build type
+        if args.build_profile is not None:
+            args.build_profile = args.build_profile.lower()
+            if args.build_profile not in ["debug", "default", "release", "optimized"]:
+                raise Exception("Unknown build type")
+            else:
+                if args.build_profile == "debug":
+                    cmake_args.extend(
+                        "-DCMAKE_BUILD_TYPE=debug -DNS3_ASSERT=ON -DNS3_LOG=ON -DNS3_WARNINGS_AS_ERRORS=ON".split())
+                elif args.build_profile == "default":
+                    cmake_args.extend(
+                        "-DCMAKE_BUILD_TYPE=default -DNS3_ASSERT=ON -DNS3_LOG=ON -DNS3_WARNINGS_AS_ERRORS=OFF".split())
+                else:
+                    cmake_args.extend(
+                        "-DCMAKE_BUILD_TYPE=release -DNS3_ASSERT=OFF -DNS3_LOG=OFF -DNS3_WARNINGS_AS_ERRORS=OFF".split()
+                    )
+                cmake_args.append("-DNS3_NATIVE_OPTIMIZATIONS=%s" % on_off((args.build_profile == "optimized")))
+
+    options = (("ASSERT", "asserts"),
+               ("COVERAGE", "gcov"),
+               ("DES_METRICS", "des_metrics"),
+               ("DPDK", "dpdk"),
+               ("ENABLE_BUILD_VERSION", "build_version"),
+               ("ENABLE_SUDO", "sudo"),
+               ("EXAMPLES", "examples"),
+               ("GSL", "gsl"),
+               ("GTK3", "gtk"),
+               ("LOG", "logs"),
+               ("MONOLIB", "monolib"),
+               ("MPI", "mpi"),
+               ("PYTHON_BINDINGS", "python_bindings"),
+               ("SANITIZE", "sanitizers"),
+               ("STATIC", "static"),
+               ("TESTS", "tests"),
+               ("VERBOSE", "verbose"),
+               ("WARNINGS", "warnings"),
+               ("WARNINGS_AS_ERRORS", "werror"),
+               )
+    for (cmake_flag, option_name) in options:
+        arg = on_off_condition(args, cmake_flag, option_name)
+        if arg:
+            cmake_args.append(arg)
+
+    if args.lcov_zerocounters is not None:
+        cmake_args.append("-DNS3_COVERAGE_ZERO_COUNTERS=%s" % on_off(args.lcov_zerocounters))
+
+    # Output, Brite, Click and Openflow directories
+    if args.output_directory is not None:
+        cmake_args.append("-DNS3_OUTPUT_DIRECTORY=%s" % args.output_directory)
+
+    if args.with_brite is not None:
+        cmake_args.append("-DNS3_WITH_BRITE=%s" % args.with_brite)
+
+    if args.with_click is not None:
+        cmake_args.append("-DNS3_WITH_CLICK=%s" % args.with_click)
+
+    if args.with_openflow is not None:
+        cmake_args.append("-DNS3_WITH_OPENFLOW=%s" % args.with_openflow)
+
+    if args.prefix is not None:
+        cmake_args.append("-DCMAKE_INSTALL_PREFIX=%s" % args.prefix)
+
+    # Process enabled/disabled modules
+    if args.enable_modules:
+        cmake_args.append("-DNS3_ENABLED_MODULES=%s" % args.enable_modules)
+
+    if args.disable_modules:
+        cmake_args.append("-DNS3_DISABLED_MODULES=%s" % args.disable_modules)
+
+    # Try to set specified generator (will probably fail if there is an old cache)
+    if args.G:
+        cmake_args.extend(["-G", args.G])
+
+    if args.trace_cmake_perf:
+        cmake_performance_trace = os.path.join(os.path.relpath(ns3_path, current_cmake_cache_folder),
+                                               "cmake_performance_trace.log")
+        cmake_args.extend(["--profiling-format=google-trace",
+                           "--profiling-output="+cmake_performance_trace])
+
+    # Append CMake flags passed using the -- separator
+    cmake_args.extend(args.program_args)
+
+    # Configure cmake
+    cmake_args.append("..")  # for now, assuming the cmake_cache directory is inside the ns-3-dev folder
+
+    # Echo out the configure command
+    print_and_buffer("cd %s; %s ; cd %s" % (os.path.relpath(current_cmake_cache_folder, ns3_path),
+                                            " ".join(cmake_args),
+                                            os.path.relpath(ns3_path, current_cmake_cache_folder)
+                                            )
+                     )
+
+    # Run cmake
+    if not dry_run:
+        proc_env = os.environ.copy()
+        ret = subprocess.run(cmake_args, cwd=current_cmake_cache_folder, stdout=output, env=proc_env)
+        if ret.returncode != 0:
+            exit(ret.returncode)
+
+        update_scratches_list(current_cmake_cache_folder)
+
+
+def update_scratches_list(current_cmake_cache_folder):
+    # Store list of scratches to trigger a reconfiguration step if needed
+    current_scratch_sources = glob.glob(os.path.join(ns3_path, "scratch", "**", "*.cc"), recursive=True)
+    with open(os.path.join(current_cmake_cache_folder, "ns3scratches"), "w") as f:
+        f.write("\n".join(current_scratch_sources))
+
+
+def refresh_cmake(current_cmake_cache_folder, output):
+    ret = subprocess.run([shutil.which("cmake"), ".."], cwd=current_cmake_cache_folder, stdout=output)
+    if ret.returncode != 0:
+        exit(ret.returncode)
+    update_scratches_list(current_cmake_cache_folder)
+
+
+def get_program_shortcuts(build_profile, ns3_version):
+    # Import programs from .lock-ns3
+    programs_dict = {}
+    exec(open(lock_file).read(), globals(), programs_dict)
+
+    # We can now build a map to simplify things for users (at this point we could remove versioning prefix/suffix)
+    ns3_program_map = {}
+    longest_shortcut_map = {}
+
+    for program in programs_dict["ns3_runnable_programs"]:
+        if "pch_exec" in program:
+            continue
+        temp_path = program.replace(out_dir, "").split(os.sep)
+        temp_path.pop(0)  # remove first path separator
+
+        # Remove version prefix and build type suffix from shortcuts (or keep them too?)
+        temp_path[-1] = temp_path[-1].replace("-" + build_profile, "").replace("ns" + ns3_version + "-", "")
+
+        # Deal with scratch subdirs
+        if "scratch" in temp_path and len(temp_path) > 3:
+            subdir = "_".join([*temp_path[2:-1], ""])
+            temp_path[-1] = temp_path[-1].replace(subdir, "")
+
+        # Check if there is a .cc file for that specific program
+        source_file_path = os.sep.join(temp_path) + ".cc"
+        source_shortcut = False
+        if os.path.exists(os.path.join(ns3_path, source_file_path)):
+            source_shortcut = True
+
+        program = program.strip()
+        longest_shortcut = None
+        while len(temp_path):
+            # Shortcuts: /src/aodv/examples/aodv can be accessed with aodv/examples/aodv, examples/aodv, aodv
+            shortcut_path = os.sep.join(temp_path)
+            if not longest_shortcut:
+                longest_shortcut = shortcut_path
+
+            # Store longest shortcut path for collisions
+            if shortcut_path not in longest_shortcut_map:
+                longest_shortcut_map[shortcut_path] = [longest_shortcut]
+            else:
+                longest_shortcut_map[shortcut_path].append(longest_shortcut)
+
+            ns3_program_map[shortcut_path] = [program]
+            if source_shortcut:
+                cc_shortcut_path = shortcut_path + ".cc"
+                ns3_program_map[cc_shortcut_path] = [program]
+
+                # Store longest shortcut path for collisions
+                if cc_shortcut_path not in longest_shortcut_map:
+                    longest_shortcut_map[cc_shortcut_path] = [longest_shortcut]
+                else:
+                    longest_shortcut_map[cc_shortcut_path].append(longest_shortcut)
+            temp_path.pop(0)
+
+    # Filter collisions
+    collisions = list(filter(lambda x: x if len(x[1]) > 1 else None, longest_shortcut_map.items()))
+    for (colliding_shortcut, longest_shortcuts) in collisions:
+        ns3_program_map[colliding_shortcut] = longest_shortcuts
+
+    if programs_dict["ns3_runnable_scripts"]:
+        scratch_scripts = glob.glob(os.path.join(ns3_path, "scratch", "*.py"), recursive=True)
+        programs_dict["ns3_runnable_scripts"].extend(scratch_scripts)
+
+    for program in programs_dict["ns3_runnable_scripts"]:
+        temp_path = program.replace(ns3_path, "").split(os.sep)
+        program = program.strip()
+        while len(temp_path):
+            shortcut_path = os.sep.join(temp_path)
+            ns3_program_map[shortcut_path] = [program]
+            temp_path.pop(0)
+    return ns3_program_map
+
+
+def parse_version(version_str):
+    version = version_str.split(".")
+    version = tuple(map(int, version))
+    return version
+
+
+def cmake_check_version():
+    # Check CMake version
+    cmake = shutil.which("cmake")
+    if not cmake:
+        print("Error:  CMake not found; please install version 3.10 or greater, or modify $PATH")
+        exit(1)
+    cmake_output = subprocess.check_output([cmake, "--version"]).decode("utf-8")
+    version = re.findall("version (.*)", cmake_output)[0]
+    if parse_version(version) < parse_version("3.10.0"):
+        print("Error:  CMake found at %s but version %s is older than 3.10" % (cmake, version))
+        exit(1)
+    return cmake, version
+
+
+def cmake_build(current_cmake_cache_folder, output, jobs, target=None, dry_run=False, build_verbose=False):
+    _, version = cmake_check_version()
+
+    # Older CMake versions don't accept the number of jobs directly
+    jobs_part = ("-j %d" % jobs) if parse_version(version) >= parse_version("3.12.0") else ""
+    target_part = (" --target %s" % target) if target else ""
+    cmake_build_command = "cmake --build . %s%s" % (jobs_part, target_part)
+
+    print_and_buffer("cd %s; %s ; cd %s" % (os.path.relpath(current_cmake_cache_folder, ns3_path),
+                                            cmake_build_command,
+                                            os.path.relpath(ns3_path, current_cmake_cache_folder)
+                                            )
+                     )
+    if not dry_run:
+        # Assume quiet is not enabled, and print things normally
+        kwargs = {"stdout": None,
+                  "stderr": None}
+
+        proc_env = os.environ.copy()
+        if build_verbose:
+            # If verbose is enabled, we print everything to the terminal
+            # and set the environment variable
+            proc_env.update({"VERBOSE": "1"})
+
+        if output is not None:
+            # If quiet is enabled, we pipe the output of the
+            # build and only print in case of failure
+            kwargs["stdout"] = subprocess.PIPE
+            kwargs["stderr"] = subprocess.PIPE
+
+        ret = subprocess.run(cmake_build_command.split(),
+                             cwd=current_cmake_cache_folder,
+                             env=proc_env,
+                             **kwargs,
+                             )
+
+        # Print errors in case compilation fails and output != None (quiet)
+        if ret.returncode != 0 and output is not None:
+            print(ret.stdout.decode())
+            print(ret.stderr.decode())
+
+        # In case of failure, exit prematurely with the return code from the build
+        if ret.returncode != 0:
+            exit(ret.returncode)
+
+
+def extract_cmakecache_settings(current_cmake_cache_folder):
+    try:
+        with open(current_cmake_cache_folder + os.sep + "CMakeCache.txt", "r", encoding="utf-8") as f:
+            contents = f.read()
+    except FileNotFoundError as e:
+        raise e
+    current_settings = re.findall("(NS3_.*):.*=(.*)", contents)  # extract NS3 specific settings
+    current_settings.extend(re.findall("(CMAKE_BUILD_TYPE):.*=(.*)", contents))  # extract build type
+    current_settings.extend(re.findall("(CMAKE_GENERATOR):.*=(.*)", contents))  # extract generator
+    current_settings.extend(re.findall("(CMAKE_CXX_COMPILER):.*=(.*)", contents))  # C++ compiler
+    current_settings.extend(re.findall("(CMAKE_CXX_FLAGS):.*=(.*)", contents))  # C++ flags
+    current_settings.extend(re.findall("(CMAKE_C_COMPILER):.*=(.*)", contents))  # C compiler
+    current_settings.extend(re.findall("(CMAKE_C_FLAGS):.*=(.*)", contents))  # C flags
+    current_settings.extend(re.findall("(CMAKE_INSTALL_PREFIX):.*=(.*)", contents))  # installation directory
+
+    # Transform list into dictionary
+    settings_dictionary = dict(current_settings)
+    del settings_dictionary["NS3_INT64X64-STRINGS"]  # remove cached options or CMake will warn you
+
+    # Return dictionary with NS3-related CMake settings
+    return settings_dictionary
+
+
+def reconfigure_cmake_to_force_refresh(cmake, current_cmake_cache_folder, output, dry_run=False):
+    import json
+    settings_bak_file = "settings.json"
+
+    # Extract settings or recover from the backup
+    if not os.path.exists(settings_bak_file):
+        settings = extract_cmakecache_settings(current_cmake_cache_folder)
+    else:
+        with open(settings_bak_file, "r", encoding="utf-8") as f:
+            settings = json.load(f)
+
+    # Delete cache folder and then recreate it
+    cache_path = os.path.relpath(current_cmake_cache_folder, ns3_path)
+    print_and_buffer("rm -R %s; mkdir %s" % (cache_path, cache_path))
+    if not dry_run:
+        shutil.rmtree(current_cmake_cache_folder)
+        os.mkdir(current_cmake_cache_folder)
+
+    # Save settings backup to prevent loss
+    with open(settings_bak_file, "w", encoding="utf-8") as f:
+        json.dump(settings, f, indent=2)
+
+    # Reconfigure CMake preserving previous NS3 settings
+    cmake_args = [cmake]
+    for setting in settings.items():
+        if setting[1]:
+            cmake_args.append("-D%s=%s" % setting)
+    cmake_args.append("..")
+
+    # Echo out the configure command
+    print_and_buffer("cd %s; %s ; cd %s" % (os.path.relpath(ns3_path, current_cmake_cache_folder),
+                                            " ".join(cmake_args),
+                                            os.path.relpath(current_cmake_cache_folder, ns3_path)
+                                            )
+                     )
+
+    # Call cmake
+    if not dry_run:
+        ret = subprocess.run(cmake_args, cwd=current_cmake_cache_folder, stdout=output)
+
+        # If it succeeds, delete backup, otherwise raise exception
+        if ret.returncode == 0:
+            os.remove(settings_bak_file)
+        else:
+            raise Exception("Reconfiguring CMake to force refresh failed. "
+                            "A backup of the settings was saved in %s" % settings_bak_file)
+
+        update_scratches_list(current_cmake_cache_folder)
+
+
+def get_target_to_build(program_path, ns3_version, build_profile):
+    if ".py" in program_path:
+        return None
+
+    build_profile_suffix = "" if build_profile in ["release"] else "-" + build_profile
+    program_name = ""
+
+    try:
+        program_name = "".join(*re.findall("(.*)ns%s-(.*)%s" % (ns3_version, build_profile_suffix), program_path))
+    except TypeError:
+        print("Target to build does not exist: %s" % program_path)
+        exit(1)
+
+    if "scratch" in program_path:
+        # Get the path to the program and replace slashes with underlines
+        # to get unique targets for CMake, preventing collisions with modules examples
+        return program_name.replace(out_dir, "").replace("/", "_")[1:]
+    else:
+        # Other programs just use their normal names (without version prefix and build_profile suffix) as targets
+        return program_name.split("/")[-1]
+
+
+def configuration_step(current_cmake_cache_folder, current_cmake_generator, args,
+                       output, dry_run=False):
+    # Search for the CMake binary
+    cmake, _ = cmake_check_version()
+
+    # If --force-refresh, we load settings from the CMakeCache, delete it, then reconfigure CMake to
+    #   force refresh cached packages/libraries that were installed/removed, without losing the current settings
+    if args.force_refresh:
+        reconfigure_cmake_to_force_refresh(cmake, current_cmake_cache_folder, output, dry_run)
+        exit(0)
+
+    # Call cmake to configure/reconfigure/refresh the project
+    configure_cmake(cmake,
+                    args,
+                    current_cmake_cache_folder,
+                    current_cmake_generator,
+                    output,
+                    dry_run
+                    )
+
+    # If manually configuring, we end the script earlier
+    exit(0)
+
+
+def build_step(args,
+               build_and_run,
+               target_to_run,
+               current_cmake_cache_folder,
+               ns3_modules,
+               ns3_version,
+               build_profile,
+               output):
+    # There is one scenario where we build everything: ./ns3 build
+    if "build" in args and len(args.build) == 0:
+        cmake_build(current_cmake_cache_folder,
+                    jobs=args.jobs,
+                    output=output,
+                    dry_run=args.dry_run,
+                    build_verbose=args.verbose
+                    )
+
+    # If we are building specific targets, we build them one by one
+    if "build" in args:
+        non_executable_targets = ["apiscan-all",
+                                  "check-version",
+                                  "cmake-format",
+                                  "docs",
+                                  "doxygen",
+                                  "doxygen-no-build",
+                                  "sphinx",
+                                  "manual",
+                                  "models",
+                                  "timeTraceReport",
+                                  "tutorial",
+                                  "contributing",
+                                  "install",
+                                  "uninstall",
+                                  ]
+        # Build targets in the list
+        for target in args.build:
+            if target in ns3_modules:
+                target = "lib" + target
+            elif target not in non_executable_targets:
+                target = get_target_to_build(target, ns3_version, build_profile)
+            else:
+                # Sphinx target should have the sphinx prefix
+                if target in ["contributing", "manual", "models", "tutorial"]:
+                    target = "sphinx_%s" % target
+
+                # Docs should build both doxygen and sphinx based docs
+                if target == "docs":
+                    target = "sphinx"
+                    args.build.append("doxygen")
+
+                if target == "check-version":
+                    global run_verbose
+                    run_verbose = False  # Do not print the equivalent cmake command
+
+            cmake_build(current_cmake_cache_folder,
+                        jobs=args.jobs,
+                        target=target,
+                        output=output,
+                        dry_run=args.dry_run,
+                        build_verbose=args.verbose)
+
+    # The remaining case is when we want to build something to run
+    if build_and_run:
+        cmake_build(current_cmake_cache_folder,
+                    jobs=args.jobs,
+                    target=get_target_to_build(target_to_run, ns3_version, build_profile),
+                    output=output,
+                    dry_run=args.dry_run,
+                    build_verbose=args.verbose
+                    )
+
+
+def run_step(args, target_to_run, target_args):
+    libdir = "%s/lib" % out_dir
+
+    custom_env = {"PATH": libdir,
+                  "PYTHONPATH": "%s/bindings/python" % out_dir,
+                  }
+    if sys.platform != "win32":
+        custom_env["LD_LIBRARY_PATH"] = libdir
+
+    proc_env = os.environ.copy()
+    for (key, value) in custom_env.items():
+        if key in proc_env:
+            proc_env[key] += path_sep + value
+        else:
+            proc_env[key] = value
+
+    debugging_software = []
+    working_dir = ns3_path
+    use_shell = False
+    target_args += args.program_args
+
+    if args.shell:
+        target_to_run = "bash"
+        use_shell = True
+    else:
+        # running a python script?
+        if ".py" in target_to_run:
+            target_args = [target_to_run] + target_args
+            target_to_run = "python3"
+
+        # running from ns-3-dev (ns3_path) or cwd
+        if args.cwd:
+            working_dir = args.cwd
+
+        # running valgrind?
+        if args.valgrind:
+            debugging_software.extend([shutil.which("valgrind"), "--leak-check=full"])
+
+        # running gdb?
+        if args.gdb:
+            debugging_software.extend([shutil.which("gdb"), "--args"])
+
+        # running lldb?
+        if args.lldb:
+            debugging_software.extend([shutil.which("lldb"), "--"])
+
+        # running with the visualizer?
+        if args.visualize:
+            target_args.append("--SimulatorImplementationType=ns3::VisualSimulatorImpl")
+
+        # running with command template?
+        if args.command_template:
+            commands = (args.command_template % target_to_run).split()
+            target_to_run = commands[0]
+            target_args = commands[1:] + target_args
+
+            # running mpi on the CI?
+            if target_to_run in ["mpiexec", "mpirun"] and os.getenv("MPI_CI"):
+                if shutil.which("ompi_info"):
+                    target_args = ["--oversubscribe"] + target_args
+                target_args = ["--allow-run-as-root"] + target_args
+
+    program_arguments = [*debugging_software, target_to_run, *target_args]
+
+    if run_verbose or args.dry_run:
+        exported_variables = "export "
+        for (variable, value) in custom_env.items():
+            if variable == "PATH":
+                value = "$PATH" + path_sep + libdir
+            exported_variables += "%s=%s " % (variable, value)
+        print_and_buffer("cd %s; %s; %s" % (os.path.relpath(ns3_path, working_dir),
+                                            exported_variables,
+                                            " ".join(program_arguments)
+                                            )
+                         )
+
+    if not args.dry_run:
+        try:
+            subprocess.run(program_arguments, env=proc_env, cwd=working_dir, shell=use_shell, check=True)
+        except subprocess.CalledProcessError as e:
+            # Replace full path to binary to relative path
+            e.cmd[0] = os.path.relpath(target_to_run, ns3_path)
+            # Replace list of arguments with a single string
+            e.cmd = " ".join(e.cmd)
+            # Print error message and forward the return code
+            print(e)
+            exit(e.returncode)
+        except KeyboardInterrupt:
+            print("Process was interrupted by the user")
+
+        # Exit normally
+        exit(0)
+
+
+# Debugging this with PyCharm is a no no. It refuses to work hanging indefinitely
+def sudo_command(command: list, password: str):
+    # Run command and feed the sudo password
+    proc = subprocess.Popen(['sudo', '-S', *command],
+                            stdin=subprocess.PIPE,
+                            stdout=subprocess.PIPE,
+                            stderr=subprocess.PIPE
+                            ).communicate(input=password.encode() + b'\n')
+    stdout, stderr = proc[0].decode(), proc[1].decode()
+
+    # Clean sudo password after each command
+    subprocess.Popen(["sudo", "-k"],
+                     stdin=subprocess.PIPE,
+                     stdout=subprocess.PIPE,
+                     stderr=subprocess.PIPE).communicate()
+
+    # Check if the password is wrong
+    if "try again" in stderr:
+        raise Exception("Incorrect sudo password")
+
+    return stdout, stderr
+
+
+def sudo_step(args, target_to_run, configure_post_build: set):
+    # Check if sudo exists
+    sudo = shutil.which("sudo")
+    if not sudo:
+        raise Exception("Sudo is required by --enable-sudo, but it was not found")
+
+    # We do this for specified targets if --enable-sudo was set in the run sub-parser
+    # And to all executables if set in the 'configure' sub-parser
+    targets_to_sudo = configure_post_build
+    if target_to_run:
+        targets_to_sudo.add(target_to_run)
+
+    password = os.getenv("SUDO_PASSWORD", None)
+    if not args.dry_run:
+        if password is None:
+            from getpass import getpass
+            password = getpass(prompt="Sudo password:")
+
+    import stat
+    for target in targets_to_sudo:
+        # Check if the file was already built
+        if not os.path.exists(target):
+            continue
+
+        # Check if we need to set anything
+        fstat = os.stat(target)
+        if (fstat.st_mode & stat.S_ISUID) == stat.S_ISUID:
+            continue
+
+        # Log commands
+        relative_path_to_target = os.path.relpath(target, ns3_path)
+        chown_command = "chown root {}".format(relative_path_to_target)
+        chmod_command = "chmod u+s {}".format(relative_path_to_target)
+        print_and_buffer("; ".join([chown_command, chmod_command]))
+
+        # Change permissions
+        if not args.dry_run:
+            out, err = sudo_command(chown_command.split(), password)
+            if len(out) > 0:
+                raise Exception("Failed to chown: ", relative_path_to_target)
+
+            out, err = sudo_command(chmod_command.split(), password)
+            if len(out) > 0:
+                raise Exception("Failed to chmod: ", relative_path_to_target)
+    return
+
+
+def refuse_run_as_root():
+    # Check if the user is root and refuse to run
+    username = os.getenv("USER", "")
+    if username == "root":
+        raise Exception("Refusing to run as root. --enable-sudo will request your password when needed")
+
+
+def main():
+    global out_dir, run_verbose
+
+    # Refuse to run with sudo
+    refuse_run_as_root()
+
+    # Enable colorized output for CMake and GCC/Clang
+    os.environ["CLICOLOR"] = "1"
+
+    # If pybindgen exists in the parent directory
+    # (e.g. ns3-all-in-one), add it to the PYTHONPATH
+    pybindgen_dir = glob.glob(os.path.abspath(os.path.join(ns3_path, "..", "pybindgen*")))
+    if pybindgen_dir:
+        if "PYTHONPATH" not in os.environ:
+            os.environ["PYTHONPATH"] = ""
+        os.environ["PYTHONPATH"] += path_sep + pybindgen_dir[0]
+
+    # Parse arguments
+    args = parse_args(sys.argv[1:])
+    atexit.register(exit_handler, dry_run=args.dry_run)
+    output = subprocess.DEVNULL if args.quiet else None
+
+    # no arguments were passed, so can't possibly be reconfiguring anything, then we refresh and rebuild
+    if len(sys.argv) == 1:
+        args.build = []
+
+    # Read contents from lock (output directory is important)
+    if os.path.exists(lock_file):
+        exec(open(lock_file).read(), globals())
+
+    # Clean project if needed
+    if args.clean:
+        clean_cmake_artifacts(dry_run=args.dry_run)
+        # We end things earlier when cleaning
+        return
+
+    # Installation and uninstallation options become cmake targets
+    if args.install:
+        args.build = ['install']
+    if args.uninstall:
+        args.build = ['uninstall']
+
+    # Get build profile and other settings
+    build_info, ns3_modules = check_lock_data(out_dir)
+    build_profile = build_info["BUILD_PROFILE"]
+    enable_sudo = build_info["ENABLE_SUDO"]
+    ns3_version = build_info["VERSION"]
+
+    # Docs subparser options become cmake targets
+    if args.docs:
+        args.build = [args.docs] if args.docs != "all" else ["sphinx", "doxygen"]
+        if "doxygen" in args.build and (not build_info["ENABLE_EXAMPLES"] or not build_info["ENABLE_TESTS"]):
+            print('The "./ns3 docs doxygen" and "./ns3 docs all" commands,\n'
+                  'require examples and tests to generate introspected documentation.\n'
+                  'Try "./ns3 docs doxygen-no-build" or enable examples and tests.')
+            exit(1)
+
+    if args.show == "profile":
+        if build_profile:
+            print("Build profile: %s" % build_profile)
+        else:
+            project_not_configured()
+
+    if args.show == "version":
+        args.build = ["check-version"]
+
+    # Check if running something or reconfiguring ns-3
+    run_only = False
+    build_and_run = False
+    if args.run:
+        # Only print "Finished running..." if verbose is set
+        run_verbose = not (args.run_verbose is not True)
+
+        # Check whether we are only running or we need to build first
+        if args.no_build:
+            run_only = True
+        else:
+            build_and_run = True
+    target_to_run = None
+    target_args = []
+    current_cmake_cache_folder = None
+    if run_only or build_and_run:
+        target_to_run = args.run
+        if len(target_to_run) > 0:
+            # While testing a weird case appeared where the target to run is between quotes,
+            # so we remove in case they exist
+            if target_to_run[0] in ["\"", "'"] and target_to_run[-1] in ["\"", "'"]:
+                target_to_run = target_to_run[1:-1]
+            target_to_run = target_to_run.split()
+            target_to_run, target_args = target_to_run[0], target_to_run[1:]
+        else:
+            raise Exception("You need to specify a program to run")
+
+    if not run_only:
+        # Get current CMake cache folder and CMake generator (used when reconfiguring)
+        current_cmake_cache_folder, current_cmake_generator = search_cmake_cache(build_profile)
+
+        if args.show == "config":
+            check_config(current_cmake_cache_folder)
+            # We end things earlier if only checking the current project configuration
+            return
+
+        # Check for changes in scratch sources and trigger a reconfiguration if sources changed
+        if current_cmake_cache_folder:
+            current_scratch_sources = glob.glob(os.path.join(ns3_path, "scratch", "**", "*.cc"),
+                                                recursive=True)
+            scratches_file = os.path.join(current_cmake_cache_folder, "ns3scratches")
+            if os.path.exists(scratches_file):
+                with open(scratches_file, "r") as f:
+                    previous_scratches_sources = f.read().split('\n')
+                    if previous_scratches_sources != current_scratch_sources:
+                        refresh_cmake(current_cmake_cache_folder, output)
+
+        if args.configure:
+            configuration_step(current_cmake_cache_folder,
+                               current_cmake_generator,
+                               args,
+                               output,
+                               args.dry_run,
+                               )
+
+        if not project_configured(current_cmake_cache_folder):
+            project_not_configured()
+
+    if ns3_modules is None:
+        project_not_configured()
+
+    # We could also replace the "ns3-" prefix used in .lock-ns3 with the "lib" prefix currently used in cmake
+    ns3_modules = [module.replace("ns3-", "") for module in ns3_modules]
+
+    # Now that CMake is configured, we can look for c++ targets in .lock-ns3
+    ns3_programs = get_program_shortcuts(build_profile, ns3_version)
+
+    def check_ambiguous_target(target_type, target_to_check, programs):
+        if len(programs[target_to_check]) > 1:
+            print('%s target "%s" is ambiguous. Try one of these: "%s"'
+                  % (target_type, target_to_check, '", "'.join(programs[target_to_check])))
+            exit(1)
+        return programs[target_to_check][0]
+
+    # If we have a target to run, replace shortcut with full path or raise exception
+    if run_only or build_and_run:
+        if target_to_run in ns3_programs:
+            target_to_run = check_ambiguous_target("Run", target_to_run, ns3_programs)
+        elif ".py" in target_to_run and os.path.exists(target_to_run):
+            # We let python scripts pass to be able to run ./utils/python-unit-tests.py
+            pass
+        else:
+            raise Exception("Couldn't find the specified program: %s" % target_to_run)
+
+    if "build" in args:
+        complete_targets = []
+        for target in args.build:
+            build_target = check_ambiguous_target("Build", target, ns3_programs) if target in ns3_programs else target
+            complete_targets.append(build_target)
+        args.build = complete_targets
+        del complete_targets
+
+    if not run_only:
+        build_step(args,
+                   build_and_run,
+                   target_to_run,
+                   current_cmake_cache_folder,
+                   ns3_modules,
+                   ns3_version,
+                   build_profile,
+                   output
+                   )
+
+    def remove_overlapping_path(base_path, target_path):
+        """
+        Remove overlapping paths from output directory and target_to_run
+        :param base_path: output path of the ns-3 build
+        :param target_path: path to the executable to run
+        :return: target_path without the overlapping parts
+        """
+        target_path = target_path.split(os.sep)
+        base_path = base_path.split(os.sep)
+        while target_path[0] in base_path:
+            target_path = target_path[1:]
+        target_path = os.sep.join(target_path)
+        return target_path
+
+    if not args.shell and target_to_run and ".py" not in target_to_run:
+        target_to_run = remove_overlapping_path(out_dir, target_to_run)
+
+        # Waf doesn't add version prefix and build type suffix to the scratches, so we remove them
+        if current_cmake_cache_folder is None:
+            if "scratch" in target_to_run and run_only:
+                waf_target_to_run = target_to_run.replace(os.path.basename(target_to_run), args.run)
+                if os.path.exists(os.sep.join([out_dir, waf_target_to_run])):
+                    target_to_run = waf_target_to_run
+        target_to_run = os.sep.join([out_dir, target_to_run])
+
+        # If we're only trying to run the target, we need to check if it actually exists first
+        if (run_only or build_and_run) and ".py" not in target_to_run and not os.path.exists(target_to_run):
+            raise Exception("Executable has not been built yet")
+
+    # Setup program as sudo
+    if enable_sudo or (args.run and args.enable_sudo):
+        sudo_step(args, target_to_run, set(map(lambda x: x[0], ns3_programs.values())) if enable_sudo else set())
+
+    # Finally, we try to run it
+    if args.shell or run_only or build_and_run:
+        run_step(args, target_to_run, target_args)
+
+    return
+
+
+main()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/README.md ns-3.36/README.md
--- ns-3.35/README.md	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/README.md	2022-04-30 18:23:57.638732400 -0700
@@ -41,26 +41,26 @@
 
 To build the set of default libraries and the example
 programs included in this package, you need to use the
-tool 'waf'. Detailed information on how to use waf is
+tool 'ns3'. Detailed information on how to use ns3 is
 included in the file doc/build.txt
 
 However, the real quick and dirty way to get started is to
 type the command
 ```shell
-./waf configure --enable-examples
+./ns3 configure --enable-examples
 ```
 
 followed by
 
 ```shell
-./waf
+./ns3
 ```
 
 in the directory which contains this README file. The files
 built will be copied in the build/ directory.
 
 The current codebase is expected to build and run on the
-set of platforms listed in the [release notes](RELEASE_NOTES)
+set of platforms listed in the [release notes](RELEASE_NOTES.md)
 file.
 
 Other platforms may or may not work: we welcome patches to
@@ -73,7 +73,7 @@
 following command, such as:
 
 ```shell
-./waf --run simple-global-routing
+./ns3 run simple-global-routing
 ```
 
 That program should generate a `simple-global-routing.tr` text
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/RELEASE_NOTES ns-3.36/RELEASE_NOTES
--- ns-3.35/RELEASE_NOTES	2021-10-01 13:27:51.000000000 -0700
+++ ns-3.36/RELEASE_NOTES	1969-12-31 16:00:00.000000000 -0800
@@ -1,3782 +0,0 @@
-
-		ns-3 RELEASE NOTES
-
-This file contains ns-3 release notes (most recent releases first).
-
-All of the ns-3 documentation is accessible from the ns-3 website:
-http://www.nsnam.org including tutorials: http://www.nsnam.org/tutorials.html
-
-Consult the file CHANGES.html for more detailed information about changed
-API and behavior across ns-3 releases.
-
-Release 3.35
-============
-
-Availability
-------------
-This release is available from:
-https://www.nsnam.org/release/ns-allinone-3.35.tar.bz2
-
-Supported platforms
--------------------
-This release is intended to work on systems with the following minimal
-requirements (Note: not all ns-3 features are available on all systems):
-- g++-7 or later, or LLVM/clang++-8 or later
-- Python 3.6 or later
-- (macOS only) Xcode 11 or later
-
-Python API scanning only works for Python versions 3.6 through 3.8, due to
-an upstream toolchain limitation.
-
-This release has been tested on the following systems:
-- Fedora 34 with g++-11.2.1 and clang++-12.0.1; Python 3.9.7
-- Fedora 33 with g++-10.3.1 and clang++-11.0.0; Python 3.9.6
-- Ubuntu 21.04 with g++-11.1.and clang++-12.0.0; Python 3.9.5
-- Ubuntu 20.04 with g++-9.3.0 and clang++-10.0.0; Python 3.8.10
-- Ubuntu 18.04 with g++-7.5.0 and clang++-6.0.0; Python 3.6.9
-- macOS 10.15.7 (Catalina) with Xcode 12.4 (Apple clang-1200.0.32.29, Python 3.9.1)
-
-This release has discontinued support for g++-5 and g++-6 compilers, and
-for macOS Xcode 10.
-
-New user-visible features
--------------------------
-ns-3 has switched to the C++17 standard by default, although the more
-advanced constructs (beyond C++11) are generally avoided in the header files,
-to stay compatible with the Python API scanning framework.
-
-- (antenna) Extend UniformPlanarArray to have a configurable polarization slant angle
-- (buildings) Add example program demonstrating group mobility with the buildings-aware random walk mobility model, and a script to animate the group motion.
-- (config-store) OBSOLETE Attributes are not anymore saved.
-- (config-store) New ConfigStore::SaveDeprecated Attribute (default false) to avoid to save DEPRECATED attributes.
-- (core) Add TracedCallback::IsEmpty to know if a TracedCallback has any callback associated.
-- (core) Add std::hash<ns3::Ptr<T>> to allow seamless use of Ptr as key in unordered_maps.
-- (core) Print available values on EnumChecker::GetValue () error
-- (internet) Added getters and setters for source and destination in Ipv6Header consistent with Ipv4Header naming.
-- (internet) New functions SetAddress () and GetAddress () are added, corresponding to SetLocal () and GetLocal () respectively in Ipv4InterfaceAddress to keep consistency with Ipv6InterfaceAddress.
-- (nix-vector-routing) Support for IPv6 Nix-Vector routing. Existing nix-simple and nms-p2p-nix examples are available in IPv6 as well.
-- (nix-vector-routing) ipv4-nix-vector-helper.h has been deprecated in favour of nix-vector-helper.h.
-- (nix-vector-routing) ipv4-nix-vector-routing.h has been deprecated in favour of nix-vector-routing.h.
-- (internet) Added new function IsInSameSubnet () in Ipv4InterfaceAddress similar to Ipv6InterfaceAddress::IsInSameSubnet (). It checks if the two Ipv4Address are in the same subnet.
-- (nix-vector-routing) Nix-Vector routing supports topologies with multiple WiFi networks using the same WiFi channel object.
-- (mobility) Add GroupMobilityHelper and demonstrate its use with a new program that configures the Reference Point Group Mobility model for a number of nodes.
-- (wifi) Add support for 11ax MU EDCA Parameter Set.
-- (wifi) MPDUs discarded because they became "old" (from the Block Ack agreement point of view) are now traced using the DroppedMpdu trace source of RegularWifiMac and with the WIFI_MAC_DROP_QOS_OLD_PACKET reason.
-
-Bugs fixed
-----------
-- (applications) #449, #453 - add correct receiving address to PacketSink traces for UDP.
-- (config-store) #443 - do not save obsolete attributes
-- (energy) #423 - SimpleDeviceEnergyModel calculation of consumed energy
-- (fd-net-device) #441 - Fix double dequeue on device stop
-- (internet) - Ipv4L3Protocol duplicate detection now accounts for sent packets, not just forwards.
-- (lte) !703 - Fix global-buffer-overflow when nprb is equal to zero
-- (mobility) - Initialize HierarchicalMobilityModel and avoid course change stream corruption
-- (nix-vector-routing) #450 - Avoid recalculation if path doesn't exist
-- (tcp) #407 - Align TcpCubic::GetSsThresh() with Linux
-- (tcp) #410 - Fix TcpWestwood bandwidth estimation bug
-- (traffic-control) #258 - Avoid overflow, divide-by-zero in TbfQueueDisc
-- (traffic-control) !706 - Fix FqPIE qdisc not using attributes
-- (wifi) - Always track interference when not locking on PPDU
-
-Release 3.34
-=============
-
-Availability
-------------
-This release is available from:
-https://www.nsnam.org/release/ns-allinone-3.34.tar.bz2
-
-Supported platforms
--------------------
-This release is intended to work on systems with the following minimal
-requirements (Note: not all ns-3 features are available on all systems):
-- g++-7 or later, or LLVM/clang++-8 or later
-- Python 3.6 or later
-- (macOS only) Xcode 10.1 or later
-
-This release has been tested on the following systems:
-- Fedora 33 with g++-10.2.1 and clang++-11.0.0; Python 3.9.2
-- Ubuntu 21.04 with g++-11.1.0 and clang++-12.0.0; Python 3.9.5
-- Ubuntu 20.04 with g++-9.3.0 and Python 3.8.5
-- Ubuntu 18.04 with g++-7.5.0 and Python 3.6.9
-- macOS 10.15.7 (Catalina) with Xcode 12.4 (Apple clang-1200.0.32.29, Python 3.9.1)
-- macOS 10.13.6 (High Sierra) with Xcode 10.1 (Apple clang-1000.11.45.5, Python 3.7.1)
-
-New user-visible features
--------------------------
-- (antenna) Added PhasedArrayModel, providing a flexible interface for modeling a number of Phase Antenna Array (PAA) models
-- (antenna) Replaced the ThreeGppAntennaArrayModel with a UniformPlanarArray model, extending the new PhaseAdrrayModel
-- (antenna) Improved the Angles class to be more robust and user-friendly.
-- (antenna) AntennaModel child classes have been extended to produce 3D radiation patterns
-- (internet) Support for IPv6 stateless address auto-configuration (SLAAC).
-- (network) Improved support for bit fields in header serialization/deserialization.
-- (network) Added support for DLT_LORATAP DataLinkType to PCAP files
-- (network) More arithmetic operators are provided for DataRate objects
-- (nix-vector) Nix-Vector routing supports multiple interface addresse and can print out routing paths.
-- (olsr) Add support for printing OLSR headers
-- (sixlowpan) Added support for stateful (i.e., context-based) RFC6282 compression.
-- (tcp) TCP CUBIC is now the default TCP congestion control, replacing NewReno.
-- (tcp) A BBRv1 congestion control model has been added.
-- (traffic-control) Added FqCobalt queue disc with L4S features and set associative hash.
-- (traffic-control) Added FqPIE queue disc with L4S mode.
-- (wifi) Add support for 802.11ax DL and UL OFDMA, and a round-robin multi-user scheduler
-- (wifi) Added 802.11ax support to MinstrelHt rate control algorithm.
-- (wifi) The PHY layer has been refactored: the amendment-specific logic has been ported to PhyEntity classes and WifiPpdu classes
-- (wifi) The MAC layer has been refactored. The MacLow class has been replaced by a hierarchy of FrameExchangeManager classes, each adding support for the frame exchange sequences introduced by a given amendment.
-- (wifi) Add ThompsonSamplingWifiManager rate control algorithm.
-- (wifi) Holland PHY configuration has been removed from the model
-- (wifi) HT Greenfield (HT_GF) preamble support has been removed from the model
-- (wifi) Added the ability to configure the primary 20 MHz channel for 802.11 devices operating on channels of width greater than 20 MHz
-- (wifi) Some wifi/src/model files were moved to the relevant subfolders (non-ht, ht, vht, he, and rate-control)
-- (wifi) Stations perform TXOP recovery if the transmission of a non-initial MPDU in a TXOP fails
-- (wifi) Stations keep track of the TXOP holder and ignore the NAV when they receive an RTS frame from the TXOP holder
-- (wifi) The TxOkHeader and TxErrHeader trace sources of RegularWifiMac have been obsoleted and replaced by trace sources that better capture the result of a transmission (AckedMpdu, NAckedMpdu, DroppedMpdu, MpduResponseTimeout and PsduResponseTimeout)
-- (wifi) Bianchi example program extended to support 802.11n/ac/ax rates
-- (wifi) ErrorRateModel API extended to support link-to-system models
-
-Bugs fixed
-----------
-- (antenna) Fix random angle generation for the 3gpp channel model.
-- (build) #52 - Fix and standardize Boost detection
-- (build) #352 - Handle multiple attempts to configure C++ standard
-- (core) #349 - Warn about Config::SetDefault() of deprecated attribute
-- (internet) #385 - IPv6 NA are now sent directly by the NetDevice
-- (lr-wpan) #382 - Fix Tx power calculation from PIB attribute
-- (lte) #285 - Check the RandomAccess status of an RNTI to whom the preamble was assigned
-- (lte) #322 - Add Channel pointer value type attribute to REM helper
-- (lte) #354 - Use uint16_t for srsIndex instead of uint8_t
-- (lte) #395 - Add transmission buffer size for RLC Acknowledged Mode
-- (lte) !555 - Remove assert upon RAR timeout in RLF example and..
-- (lte) !605 - Make sure RNTI exists before removing UE context
-- (lte) - Set UeRrcSapProvider only if RNTI exists at the eNB
-- (nix-vector) #393 - Avoid changing routing-dependent members
-- (sixlowpan) #358 - Use correct fragment size when using mesh routing.
-- (tcp) #374 - Assume TCP RTT is one microseconds if it measures as zero
-- (uan) #129 - EndTx moved to PhyListener
-- (uan) #293 - Fixed integer truncation in window computation
-- (wave) Fix compilation and runtime issues with vanet-routing-compare.cc
-- (wifi) #418 - Fix HE A-MPDU Max Size Upper Bound
-- (wifi) - Compare received power per MHz to normalized RX sensitivity
-
-Release 3.33
-============
-
-Availability
-------------
-This release is available from:
-https://www.nsnam.org/release/ns-allinone-3.33.tar.bz2
-
-Supported platforms
--------------------
-This release is intended to work on systems with the following minimal
-requirements (Note: not all ns-3 features are available on all systems):
-- g++-5.4 or later, or clang++-8 or later
-- Python 3.5 or later
-- (macOS only) Xcode 10.1 or later
-
-This release has been tested on the following systems:
-- Arch Linux with g++-10.2.0 and clang++ versions 8-11, Python 3.9.1
-- Fedora 33 with g++-10.2.1 and clang++-11.0.0; Python 3.9.1
-- Ubuntu 20.04 with g++-9.3.0 and Python 3.8.5
-- Ubuntu 18.04 with g++-7.5.0 and Python 3.6.9
-- Ubuntu 16.04.6 with g++-5.4.0 and Python 3.5.2
-- Linux Mint 20 Ulyana with g++-9.3.0 and Python 3.8.5
-- macOS 11.1 (Big Sur) with Xcode 12.3 (Apple clang-1200.0.32.28), Python 3.8.2 (system) and Python 3.9.1 (Homebrew)
-- macOS 10.15.7 (Catalina) with Xcode 12 (Apple clang-1200.0.31.1, Python 3.9.1)
-- macOS 10.13.6 (High Sierra) with Xcode 10.1 (Apple clang-1000.11.45.5, Python 3.7.1)
-
-New user-visible features
--------------------------
-- (core) A new Length class has been added to represent lengths with an explicit unit, rather than the use of raw numbers (ints, doubles) with implicit length.
-- (core) A flexible CsvReader class has been introduced to allow users to read in csv- or tab-delimited data.
-- (lr-wpan) Added support for handling differences between RFC4944- and RFC6282-style IPv6 address expansion
-- (mobility) The ListPositionAllocator can now input positions from a csv file.
-- (mpi) A new Enable call was added that takes a user supplied MPI_Communicator, which enables (optional) partitioning of the MPI processes.  See !389.
-- (propagation) A channel condition model for vehicular scenarios was added.  See !435
-- (tcp) A model for TCP CUBIC congestion control has been added.
-- (tcp) TCP handling of ECN has been improved with the addition of a Congestion Window Reduced state
-- (tcp) TCP DCTCP includes a trace source for tracing the alpha value
-- (wifi) A new table-based error model based on link simulations has been
-  added (TableBasedErrorRateModel) and made the default for 802.11n/ac/ax simulations.
-- (wifi) Add error table support for LDPC FEC encoding (BCC or LDPC may now be selected)
-- (wifi) Add PHY layer support for High Efficiency Multi Users [HE-MU] access, including High Efficiency Resource Units (HE RU) and PCAP support
-- (wifi) Add option to configure the OFDM transmit spectrum mask
-
-Bugs fixed
-----------
-- (applications) #444 - Report Tx bytes from UdpClient
-- (core) #265 - Time is not rounded when created from an int64x64_t
-- (core) #277 - Make Time::As() print with autoscaled unit
-- (core) #302 - Time is not rounded when created from an int64x64_t
-- (internet) #272 - Add missing data to Ipv[4,6]PacketInfoTag
-- (internet) !440 - Loopback IPv4 address should have HOST scope
-- (lte) #273 - When removing LC, remove also its BSR
-- (lr-wpan) #314 - Multicast/broadcast must not generate ACKs
-- (mobility) #276 - Make EnableAsciiAll connect in a failsafe way
-- (tcp) TcpCongestionOps objects can now be accessed by config paths
-- (tcp) #783 - Update previousLost and priorInFlight on reception of ACK
-- (wifi) #284 - Fix memory consumption issue for saturated devices
-- (wifi) Fix Minstrel HT statistics update window duration
-- (wifi) Fix incorrect calculations for 1024-QAM when using NistErrorRateModel
-- (wifi) Fix maximum channel number that can be selected for the PHY
-- (wifi) Set BER threshold for Ideal rate manager to 1e-6 to avoid high PER for high MCS values
-- (wifi) Reduce precision to fix infinite loop when Ideal rate manager as used with Yans error rate model
-- (wifi) Report reception of BAR to WifiRemoteStationManager
-- (wifi) TXOP durations were not always being traced
-
-Release 3.32
-============
-
-Availability
-------------
-This release is available from:
-https://www.nsnam.org/release/ns-allinone-3.32.tar.bz2
-
-Supported platforms
--------------------
-This release is intended to work on systems with the following minimal
-requirements (Note:  not all ns-3 features available on all systems):
-- g++-4.9 or later
-- Xcode 10.1 or later
-- Python 3.5 or later
-
-Starting with ns-3.30, Python 3 has been the only supported Python version,
-and scripts default to Python 3 usage.
-
-This release has been tested on the following systems:
-- Fedora 32 with g++-10.2.1 and Python 3.8.5
-- Fedora 32 with clang-10.0.0 and Python 3.8.5
-- Ubuntu 20.04 with g++-9.3.0 and Python 3.8.2
-- Ubuntu 18.04 with g++-7.5.0 and Python 3.6.9
-- Ubuntu 16.04.6 with g++-5.4.0 and Python 3.5.2
-- macOS 10.15.7 (Catalina) with Xcode 12
-- macOS 10.13.6 (High Sierra) with Xcode 10.1
-
-New user-visible features
--------------------------
-- (build system) Added "--enable-asserts" and "--enable-logs" to waf configure,
-   to selectively enable asserts and/or logs in release and optimized builds.
-- (build system) The "--enable-build-version" option has been added to waf
-   configure, allowing users to embed version information in the libraries
-- (build system) Added support for EditorConfig
-- (config-store) Improved the RawTextConfig output (see !93)
-- (core) Added capability to configure STL pair and containers as attributes
-- (core) The default timestamp print format for logging statements has been 
-  changed to use the As() method that prepends +/- and appends the time unit
-- (fd-net-device) Added two enhanced emulation devices based on netmap and DPDK
-- (mobility) Add CartesianToGeographic coordinate conversion capability
-- (network) Packet tags are now serialized and deserialized for distributed 
-  simulations
-- (network) Added LollipopCounter, a sequence number counter type 
-- (olsr) Some internal OLSR API has been opened up to enable cross-layer access
-- (tcp) Support for dynamic pacing in TCP.
-- (tcp) Added TcpLinuxReno congestion control (aligns with Linux 'reno' 
-- (tests) test.py text output now distinguishes between TestSuites and TestCases
-  congestion control).
-- (traffic-control) Added, to PIE queue disc, queue delay calculation using
-  timestamp feature (Linux default behavior), cap drop adjustment feature
-  (Section 5.5 of RFC 8033), ECN (Section 5.1 of RFC 8033) and derandomization
-  feature (Section 5.4 of RFC 8033).
-- (traffic-control) Add support for L4S mode to CoDel and FqCoDel queue discs
-- (traffic-control) Add Active/Inactive feature to PIE queue disc.
-- (traffic-control) Add ECN and L4S support for CoDel, FqCoDel, Cobalt queues
-- (wifi) Add 6 GHz band support for 802.11ax
-- (wifi) RIFS support has been removed from the model
-
-Bugs fixed
-----------
-- (applications) Handle possible partial socket sends (during emulation)
-- (applications) Remove stray exit call from OnOffApplication
-- (internet-apps) Fixes DHCP behaviour when interface goes down and back up
-- (lte) #224 - The scheduled SendMeasurementReport() event doesn't cancel after link failure detection
-- (mesh) - Enable possible use with SpectrumWifiPhy
-- (network) #264 - Rounding is more accurate for DataRate transmission times 
-- (network) !424 - Fixed instantaneous send behavior in SimpleNetDevice when queue is empty
-- (tcp) !368 - Fix assert in tx-buffer when loss rate high and w/o SACK
-- (tcp) !367 - Stop to merge items whose m_lost values are different
-- (tcp) - Fix TcpRateOps to update m_ackElapsed like Linux
-- (traffic-control) #225 - Do not ECN mark packet twice within a CoDel queue
-- (wifi) - Fix radiotap header for received 802.11ax PPDUs
-- (wifi) - Do not send VHT capabilities when operating in 2.4 GHz band 
-- (wifi) #252 - Correctly handle multicast frames
-
-Release 3.31
-============
-
-Availability
-------------
-This release is available from:
-https://www.nsnam.org/release/ns-allinone-3.31.tar.bz2
-
-Supported platforms
--------------------
-This release is intended to work on systems with the following minimal
-requirements (Note:  not all ns-3 features available on all systems):
-- g++-4.9 or later
-- Xcode 10.1 or later
-- Python 3.5 or later
-
-Starting with ns-3.30, Python 3 has been the only supported Python version,
-and scripts default to Python 3 usage.
-
-This release has been tested on the following systems:
-- Fedora 32 with g++-10.1.1 and Python 3.8.3
-- Fedora 32 with clang-10.0.0 and Python 3.8.3
-- Fedora 29 with g++-8.3.1 and Python 3.7.5
-- Ubuntu 20.04 with g++-9.3.0 and Python 3.8.2
-- Ubuntu 18.04 with g++-7.5.0 and Python 3.6.9
-- Ubuntu 16.04.6 with g++-5.4.0 and Python 3.5.2
-- macOS 10.15.3 (Catalina) with Xcode 11.3
-- macOS 10.13.6 (High Sierra) with Xcode 10.1
-
-New user-visible features
--------------------------
-- (antenna) Model for antenna arrays based on 3GPP model (part of Integration of the 3GPP TR 38.901 fast fading model)
-- (buildings) Random walk mobility model that does not allow nodes to enter buildings
-- (core) The CommandLine facility can now add the Usage message to the Doxygen for the program
-- (internet) TCP DCTCP model
-- (internet) An option to enable IPv4 hash-based multicast duplicate packet
-  detection (DPD) based on RFC 6621
-- (lte) Trace sources for uplink PSD and RBs
-- (propagation) 3GPP TR 38.901 pathloss and channel condition models
-- (spectrum) Matrix-based channel model base class to support antenna arrays
-- (spectrum) 3GPP pathloss, channel and fast fading models
-- (stats) A new interface to SQLite
-- (tests) Capability to run an example program as a regression test
-- (traffic-control) Support for the Cake set-associative hash to the FqCoDel queue disc
-- (traffic-control) Support for ECN marking to CoDel and FqCoDel queue discs
-- (wifi) A Bianchi (saturation) example with a comparable MATLAB model
-- (wifi) The idealized wifi rate control includes better support for different MIMO modes and channel widths
-
-Bugs fixed
-----------
-If available, the numbers below make reference to a Bugzilla bug number, GitLab 
-issue number (prefixed by '#'), or GitLab merge request number (prefixed by '!')
-- (build system) #119 - Waf --lcov-report option was broken
-- (buildings) #80 - Update indoor/outdoor status of a moving node
-- (core) Bug 2725 - EmpiricalRandomVariable should not interpolate
-- (documentation) Bug 2636 - Add to doxygen a list of all registered TypeIds
-- (internet) - Fix Ipv6Prefix length calc and add explicit prefix length constructors
-- (internet) - IPv6 Duplicate Address Detection (DAD) must use Solicited-Node multicast address
-- (internet) #111 - Rip and RipNg don't receive unicast packets
-- (internet:tcp) - call NotifyConnectionFailed on SYN timeout
-- (internet:tcp) #179 - Avoid incorrect exit of LAST-ACK state
-- (internet:tcp) #182 - Fix SACK list cleaning in TcpOptionSack::Deserialize()
-- (internet:tcp) !156 - Enable entering CA_RECOVERY despite large sequence number increase
-- (internet:tcp) !157 - Prevent sending outside receiver window
-- (lr-wpan) #212 - Rx callback must have both source mac and pan id
-- (lr-wpan) !283 - Beacon collisions and timings
-- (lr-wpan) !326 - Inactive Periods Queue fix
-- (lte) #106 - Inconsistent imsi representation in LTE module
-- (lte) #196 - Remove LteSecondaryCellSelectionTestSuite from LTE module
-- (lte) #221 - Stop T310 upon receving handover command
-- (network) #216 - Correct the return value for PacketSocket::SendTo()
-- (network) !239 - Refactor DelayJitterEstimation to more closely follow RFC 1889 and RFC 3550
-- (propagation) !269 - Fix Okumura-Hata propagation loss model for frequency > 1.5 Ghz and medium or small city
-- (wifi) - Keep the medium busy if reception is aborted ahead of scheduled time
-- (wifi) - Fix frame capture when signals arrive at the exact same time and add additional tests to verify these cases
-- (wifi) - Fix MCS selection in ideal rate manager for cases with unbalanced MIMO settings and/or RX diversity
-- (wifi) - Fix SNR computations for MIMO
-- (wifi) - Fix ReportAmpduTxStatus called two times when BAR is explicitely sent upon missed BACK
-- (wifi)  A zero value for the backoff timer might be discarded and a new value
-  might be generated by an erroneous call to NotifyCollision().
-- (wifi) Bug 1909, Issue #41 - Implementation of ACK timeout
-- (wifi) Bug 2385, Issue #178 - IdealWifiManager can pick invalid WifiTxVector under certain MIMO conditions
-- (wifi) Bug 2928 - BlockAckManager::NeedBarRetransmission returns "true" infinitely
-- (wifi) Bug 2985 - PhyTxEnd tracecallback not implemented
-- (wifi) Bug 3011, Issue #172 - MIMO error rate model is incorrect
-- (wifi) #22 - Station long retry counter is incremented twice if BlockAck was not received
-- (wifi) #40 - IdealWifiManager not working if stations are moving
-- (wifi) #84 - Wi-Fi removing wrong header due to copy-paste error
-- (wifi) #94 - Retransmitted frames not marked as retransmits
-- (wifi) #107 - Frame capture model works incorrectly if two signals arrive at the same time
-- (wifi) #110 - PCAP trace file gives unexpected results
-- (wifi) #116 - Incorrect state when receiving A-MPDU in WifiPhy
-- (wifi) #165 - Notify station manager when a BlockAck has not been received after the transmission of an A-MPDU
-- (wifi) #169 - Ideal rate manager does not work when non best-effort traffic is used
-- (wifi) #211 - Remove MSDUs with expired lifetime when (re)starting channel access
-
-Known issues
-------------
-In general, known issues are tracked on the project tracker available
-at https://gitlab.com/nsnam/ns-3-dev/issues
-
-Release 3.30.1
-==============
-Release 3.30.1 is a maintenance release that fixes the following issues from
-the ns-3.30 release:
-
-- fix issue with Block Ack transmit window leading to low throughput or
-  connection dropping
-- fix invalid restriction on Wi-Fi VHT Capabilities MaxMpduLength field
-- support for Apple clang version 11.0.0 (macOS Catalina preview release)
-- fix the handling of ICMP time exceeded responses
-- fix syntax error in Wi-Fi-based Tap Bridge Python example
-
-Availability
-------------
-This release is available from:
-https://www.nsnam.org/release/ns-allinone-3.30.1.tar.bz2
-
-Supported platforms
--------------------
-The list of supported platforms includes those listed for ns-3.30 plus
-- macOS 10.15 preview (Catalina) with Apple clang version 11.0.0
-
-New user-visible features
--------------------------
-Features are identical to release 3.30.
-
-Bugs fixed
-----------
-- Issue #62 - ICMP does not handle ICMPv4 TIME_EXCEEDED responses
-- Issue #77 - Wi-Fi VHT capabilities MaxMpduLength had invalid restriction
-- Issue #79 - Wi-Fi connection drop or low throughput due to Block Ack transmit window
-- Example program tap-wifi-virtual-machine.py had a syntax error
-- Issue #80 - Indoor/outdoor status is not updated when the node moves
-
-Release 3.30
-============
-
-Availability
-------------
-This release is available from:
-https://www.nsnam.org/release/ns-allinone-3.30.tar.bz2
-
-Supported platforms
--------------------
-This release is intended to work on systems with the following minimal
-requirements (Note:  not all features available on all platforms):
-- g++-4.9 or later
-- Xcode 10.1 or later
-- Python 3.5 or later
-
-Starting with ns-3.30, Python 3 will be the only supported Python version,
-and scripts will default to Python 3 usage.  Python 2.7 may continue to work
-in the near term.
-
-This release has been tested on the following systems:
-- Fedora 30 with g++-9.1.1
-- Ubuntu 19.04 with g++-8.3.0
-- Ubuntu 18.04 with g++-7.4.0
-- Ubuntu 16.04.6 with g++-5.4.0
-- Linux Mint 19 Tara with g++-7.3.0
-- macOS 10.14.6 (Mojave) with Xcode 10.3
-- macOS 10.13.6 (High Sierra) with Xcode 10.1
-
-New user-visible features
--------------------------
-- (core) ShowProgress object can be used to report on simulation execution
-- (wifi) Preamble detection can now be modelled and is enabled by default.
-- (wifi) 802.11ax spatial reuse is now supported.
-- (lte) Radio Link Failure (RLF) functionality is now supported.
-- (lte) LTE/EPC model enhanced with new features: SGW, PGW, MME are full nodes; new S5 interface between SGW and PGW, allows simulations with multiple SGW/PGW
-- (lte) LTE eNB RRC extended to support improved S1 signalling model
-- (lte) Backhaul links can now use any link technology, not just point-to-point
-- (traffic-control) Cobalt queue disc model has been added.
-
-Bugs fixed
-----------
-During this release cycle, the project transitioned from a Bugzilla issue
-tracker to a GitLab.com issue tracker.  Bugs fixed from the Bugzilla tracker
-include:
-
-- Bug 2339 - lte: Use only the active RBs for uplink PSD computation
-- Bug 2460 - wifi: Refactor detection thresholds in WifiPhy and add a new sensitivity threshold to throw away weak signals
-- Bug 2470 - wifi: Handshake to setup the Block Ack Agreement is not protected
-- Bug 2637 - build: macOS SDK headers in non-standard place
-- Bug 2860 - mobility: Set Z coordinate for position-allocation classes
-- Bug 2861 - lte: Forward TXOPs to the RLCs of SCCs
-- Bug 2893 - lte: GetPgw in helper should be const
-- Bug 2979 - lte: Remove unused code from UE RRC and UE CCM
-- Bug 2980 - lte: Reset MAC and PHY of secondary carriers upon handover
-- Bug 2982 - lte: Configure UE MAC SAP LteMacSapUser properly
-- Bug 2988 - lte:  Correction in L3 filtering formula used for UL power control
-- Bug 2990 - internet: IPv6 packet shouldn't be marked with SocketIpTtlTag
-- Bug 2992 - lte: Send method of the LteUeNetDevice doesn't use protocolNumber parameter
-- Bug 2993 - build: Waf --enable-sudo option broken
-- Bug 2997 - lte: EpcTft::PacketFilter::Matches does not use ipv6 address to match an IP packet
-- Bug 3007 - build: Boost library configuration in contrib
-- Bug 3027 - lte: S1 signalling is done before RRC connection establishment is finished
-
-Bugs fixed from the GitLab.com issue tracker include:
-
-- Issue #11 - mobility: Rectangle::GetClosestSide returns the correct side also for positions outside the rectangle
-- Issue #14 - build: Check file timestamps instead of hashes for changes
-- Issue #15 - build: Fix build erroneous order constraint warnings
-- Issue #27 - wifi: Re-compute the A-MPDU after an RTS/CTS exchange fails
-- Issue #28 - wifi: wifi error model: coded bits vs. data bits
-- Issue #30 - wifi: Sequence number wrap around in MacLow::ReceiveMpdu
-- Issue #32 - wifi: Example "rate-adaptation-distance.cc" fails.
-- Issue #33 - wifi: Issues with QosTxop::StartNextPacket
-- Issue #35 - wifi: Unexpected EDCA performance under virtual collisions for 802.11n
-- Issue #42 - wifi: Check configured capture window for capture
-- Issue #43 - core: Check if ObjectFactory has been configured
-- Issue #45 - wifi: Wi-Fi transmits frames outside BlockAck window
-- Issue #46 - internet: Export headers for transport protocol modularity
-- Issue #47 - core: Return non-const reference when a const Ptr is dereferenced
-- Issue #48 - wifi: Incorrect sequence comparison in BlockAckManager::NeedBarRetransmission
-- Issue #53 - lte: Token Bank Fair Queue Scheduler is creating a transmit opportunity of 0 bytes
-- Issue #54 - lte: RadioBearerStats are not correctly connected
-- Issue #70 - visualizer: Update configuration of GooCanvas.CanvasEllipse
-- Merge request !19 - wifi: Rework MSDU and MPDU aggregation code
-- Merge request !22 - spectrum: Fix order of PHYs stored in MultiModelSpectrumChannel
-- Merge request !30 - lte: Fix PDU delivering at the edge of reordering window
-- Merge request !43 - traffic-control: Install FqCoDelQueueDisc by default
-- Merge request !55 - lte: Reset preamble transmission count before starting NC based RACH
-- Merge request !65 - tcp: Call BytesInFlight method before processing ack
-- Merge request !67 - wifi: Pass number of data bits instead of coded bits to error models
-- Merge request !85 - uan: Fix MAC address variable shadowing in subclasses
-
-Other issues fixed:
-- core: Replace int64_t operator/(Time,Time) with exact int64x64_t version, add int64x64_t scaling.
-- core: Refactor LogTimePrinter, LogNodePrinter
-- energy: Update remaining energy even if simulation has finished
-- flow-monitor:  Fix FlowMonitor::Stop () method
-- mobility: Allow AssignStreams after construction for SteadyStateRandomWaypointMobilityModel
-- lte: Add attribute to configure the periodicity of DL CQI reports
-- lte: Fix type of them_rapIdRntiMap key
-- lte: Various updates of the ComponentCarrier subclasses to accommodate NR
-- lte: Fix issue with use of packet tag in LTE PDCP and RLC by using byte tag
-- visualizer:  Fix various issues with Python 3 and X server compatibility
-- wifi: Fix A-MPDU reception logic
-- wifi: Fix noise interference calculation
-- wifi: Do not allow S-MPDU transmission as long as ADDBA handshake not established
-- wifi: Fix frequencies for channels 54 and 126
-- wifi: Fix rate used to send Block Ack Request frames
-- wifi: Check that SSID in probe requests is either broadcast or corresponds to AP SSID
-- wifi: Do not call ReportDataFailed if retransmission not needed
-- wifi: Fix duplicate MPDUs sent in an A-MPDU when explicit BARs are disabled
-- wifi: Fix issues when MSDU lifetime is expired
-- wifi: Enforce capture window duration in frame capture model, and fix capture model for A-MPDU
-- wifi: Correct handling of timeout situations during block ack agreement setup
-- wifi: Return correct serialized size for AmpduTag
-- wifi: Fix incorrect channel width when HT, VHT, or HE STA received legacy PPDU
-
-Known issues
-------------
-In general, known issues are tracked on the project tracker available
-at https://gitlab.com/nsnam/ns-3-dev/issues
-
-Release 3.29
-============
-
-This release is dedicated to the memory of project co-founder George Riley.
-
-Availability
-------------
-This release is available from:
-https://www.nsnam.org/release/ns-allinone-3.29.tar.bz2
-
-Supported platforms
--------------------
-This release is intended to work on systems with the following minimal
-requirements (Note:  not all features available on all platforms):
-- g++-4.9 or later
-- Apple LLVM version 7.0.2 or later
-- clang-3.3 or later
-
-In addition, Python 2.7 (Python 2 series) or Python 3.4-3.7 (Python 3 series)
-
-This release has been tested on the following platforms:
-- Ubuntu 18.04 (64 bit) with g++-7.3.0 and Python 2.7.15
-- Ubuntu 16.04 (64 bit) with g++-5.4.0 and Python 2.7.12/3.5.2
-- Fedora Core 28 (64 bit) with g++-8.1.1 and Python 2.7.15/3.7.0
-- Fedora Core 26 (64 bit) with g++-7.3.1 and Python 2.7.14/3.6.5
-- macOS High Sierra 10.13.5 with Xcode 9.4.1, Apple LLVM version 9.1.0, Python 2.7.10
-
-New user-visible features
--------------------------
-- (buildings) A new position allocator has been added to the buildings module.
-  The allocator places nodes randomly but in a manner that rejects positions
-  that are located within buildings defined in the scenario.
-- (applications) Add 3GPP HTTP model
-- (traffic-control) Add priority queue disc (PrioQueueDisc)
-- (tcp) Added PRR as recovery algorithm
-- (wifi) Add a new trace source to StaWifiMac to trace beacon arrivals
-- (network) Add a method to allow random variable-based jitter to be added
-  to the start times of applications in a container.
-- (network) Add a method to check whether a node with a given ID is within
-  a NodeContainer.
-- (spectrum) A new trace source named "Gain" is added to the SpectrumChannel class.
-  This trace is fired whenever a new path loss value is calculated. It exports pointers
-  to the mobility model of the transmitter and the receiver, Tx antenna gain, Rx antenna gain,
-  propagation gain and the pathloss value.
-- (wifi) It is now possible to transmit A-MPDUs containing up to 256 MPDUs (802.11ax only)
-
-Bugs fixed
-----------
-- Bug 2299 - uan: WOSS integration missing patch
-- Bug 2399 - wifi: Improve scanning procedure of StaWifiMac
-- Bug 2451 - bindings: (partial fix) generating ILP32 bindings from LP64
-- Bug 2461 - core: CommandLine should handle non-option arguments
-- Bug 2772 - bridge:  Bridge doesn't learn from packets sent to it
-- Bug 2801 - fd-net-device: FdNetDevice device MTU is not set correctly
-- Bug 2819 - traffic-control: FqCoDel handling of non-IP packets
-- Bug 2891 - netanim:  dumbbell-animation breaks when RightCount > LeftCount
-- Bug 2901 - core: Add CommandLine::Parse (const std::vector<std::string>> args)
-- Bug 2902 - build: missing modules cause Waf to run indefinitely
-- Bug 2908 - build:  Check if pybindgen version exists before use
-- Bug 2911 - aodv:  Binary exponential backoff can become unlimited
-- Bug 2914 - tcp: Adv Win resilience to SequenceNumber wrap-around
-- Bug 2915 - build: Enforce gcc minimum version
-- Bug 2920 - wifi: Default MaxSlrc and fragmentation threshold values differ from standard
-- Bug 2921 - tcp: Add min_cwnd variable to LEDBAT
-- Bug 2923 - tap-bridge: UseLocal mode uses wrong MAC address
-- Bug 2924 - traffic-control:documentation about Peek/Dequeue usage
-- Bug 2925 - wifi: MinstrelHt provides strange results at low SNR with A-MPDU enabled
-- Bug 2926 - wifi: SSRC and SLRC mechanism not fully aligned to the standard
-- Bug 2927 - lte:  Valgrind error in lena-x2-handover example
-- Bug 2931 - traffic-control: QueueDisc drops the CE marked packets
-- Bug 2936 - Disable -Wparentheses with GTK+ and gcc-8
-- Bug 2938 - build: add --disable-werror flag to Waf
-- Bug 2940 - traffic-control: QueueDisc SojournTime should be TracedCallback
-- Bug 2941 - wifi: Order bit of Frame control field of WifiMacHeader not correctly set for some frames
-- Bug 2948 - network: SetPriority does not support value 7
-- Bug 2949 - test: Exit test.py if incorrect fullness option used
-- Bug 2964 - wifi: IdealWifiManager keeps using the same MCS when all transmissions fail
-- Bug 2974 - lte: Inconsistent declaration of IPV6 methods
-
-Known issues
-------------
-In general, known issues are tracked on the project tracker available
-at http://www.nsnam.org/bugzilla/
-
-Release 3.28
-============
-
-Availability
-------------
-This release is available from:
-https://www.nsnam.org/release/ns-allinone-3.28.tar.bz2
-
-Supported platforms
--------------------
-This release is intended to work on systems with the following minimal
-compiler requirements (other compilers supporting C++11 may also work):
-- g++-4.9 or later
-- Apple LLVM version 7.0.2 or later
-- clang-3.3 or later
-In addition, a Python 2.7 (Python 2 series) or Python 3.4 (Python 3 series)
-or later is required.
-
-This release has been tested on the following platforms:
-- Ubuntu 17.10 (64 bit) with g++-7.2.0 and Python 2.7.14
-- Ubuntu 16.04 (64 bit) with g++-5.4.0 and Python 2.7.12
-- Fedora Core 27 (64 bit) with g++-7.3.1 and Python 2.7.14
-- Fedora Core 26 (64 bit) with g++-7.3.1 and g++-7.1.1, and Python 2.7.14
-- CentOS/RHEL 7.4 (64-bit) with g++-6.3.1 and Python 3.5.1
-  - Note: the default g++ version (4.8) must be upgraded
-- CentOS/RHEL 6.8 (64-bit) with g++-4.9.2 and Python 2.7.13
-  - Note: the default g++ version (4.4) must be upgraded
-  - Note: the default Python version (2.6) must be upgraded
-- OS X Sierra 10.12.6 with Xcode 9.2, Apple LLVM version 9.0.0, Python 2.7.13
-- OS X Yosemite 10.10.5 with Xcode 7.2.1, Apple LLVM vers. 7.0.2, Python 2.7.10
-
-New user-visible features
--------------------------
-- (tcp) Added TCP-LP as a congestion control module
-- (tcp) When TCP SACK is enabled, the third rule defined in RFC 6675 regarding the next segment to transmit is followed
-- (tcp) Separated the CongestionWindow trace into a CongestionWindow trace and a CongestionWindowInflated trace, where the latter tracks window inflation during loss recovery as defined by the Reno algorithm
-- (tcp) Implemented the core functionality of TCP Pacing.
-- (lr-wpan) Extended addressing mode is now supported.
-- (internet) Ipv[4,6]AddressGenerator can now check if an address or a network is already allocated.
-- (internet) Ipv6AddressHelper has more pedantic checks, but more than one such helper can now be used in a program.
-- (lte) UEs can now use IPv6 to send and receive traffic.
-- (uan) The UAN module now supports an IP stack
-- (uan) Added some examples for running raw, IPv4, IPv6, and 6LoWPAN over UAN
-- (traffic-control) Added a FIFO queue disc (FifoQueueDisc) and the Token Bucket Filter (TbfQueueDisc).
-
-Bugs fixed
-----------
-- Bug 1745 - There can be only one Ipv6AddressHelper in a script
-- Bug 1783 - tcp: Experiencing drops during fast recovery causes TCP's congestion window to blow up. Not anymore.
-- Bug 2107 - lte: Enable PCAP for S1 and X2 point-to-point links
-- Bug 2152 - lte: Fix uplink HARQ retx. out of synch at the MAC layer
-- Bug 2151 - lte: Generate correct redundancy version in uplink HARQ
-- Bug 2277 - lte: EpcTftClassifier::Classify blindly assumes that a packet has a L4 header
-- Bug 2505 - network:  Avoid asserts in Header/Trailer deserialization
-- Bug 2653 - tcp: Avoid saving smaller TS in case of packet reordering
-- Bug 2656 - wifi: Minstrel and MinstrelHt provide different results for 802.11a/b/g
-- Bug 2754 - lte: Incorrect arguments passed to Asn1Header::SerializeInteger
-- Bug 2764 - wifi: WifiSpectrumModelId doesn't distinguish 11ax from legacy
-- Bug 2766 - core: Modify logging for int64x64 to avoid stack overflow
-- Bug 2768 - lte: LteUeNetDevice has a null MAC address
-- Bug 2774 - wifi: Wifi Transmitter Sends ADDBA Request Continuously Even After Transmitting Delba Frame
-- Bug 2791 - wifi: Interference Helper gives negative trace value for Interference Power
-- Bug 2807 - energy: GetTotalEnergyConsumption is not updated correctly
-- Bug 2809 - wifi: Wifi doesn't fully stop when energy is depleted
-- Bug 2813 - wifi: OFDM 10 MHz and 5 MHz PHYs do not have correct subcarrier frequency spacings
-- Bug 2820 - wifi: segmentation fault when Rrpaa wifi manager is used
-- Bug 2821 - lte: Set correct limit for UL retx. in Round Robin scheduler
-- Bug 2824 - ICMP opcode fr fragment timeout drop is wrong
-- Bug 2826 - wifi: Management frames should be sent using the lowest basic rate
-- Bug 2827 - wifi: Active scanning not working with 802.11n/ac/ax
-- Bug 2828 - OLSR simple P2P example produces wrong results
-- Bug 2831 - wifi: runtime channel width switch has no effect
-- Bug 2832 - tcp: Partial ACK triggering repeated retransmission
-- Bug 2836 - wifi: Missing VHT information in radiotap header when A-MPDU is used
-- Bug 2838 - wifi: ht-wifi-network crashes with RTS/CTS enabled and frequency set to 2.4GHz
-- Bug 2840 - lte: Wrong configuration of eNBs and UEs
-- Bug 2843 - spectrum, wifi: Incorrect channel width and center frequency provided for non-HT PPDUs when building SpectralDensity
-- Bug 2848 - wifi: Association ID not correctly set upon association
-- Bug 2849 - lte: Received RLC and PDCP PDUs are missing in the stats files
-- Bug 2854 - wifi: Fix 802.11ax channel width capabilities
-- Bug 2856 - wifi: Correct bugs and improve logging in MinstrelHt
-- Bug 2859 - tcp: calculation of BytesInFlight during partial recovery is fixed
-- Bug 2866 - tcp: Removed VS warnings on TcpSocketBase
-- Bug 2872 - csma: Packet copy in CsmaChannel breaks netanim tracing
-- Bug 2873 - tcp: Potential SIGFPE in TcpYeah
-- Bug 2874 - tcp: Corrected interpretation of RFC 6675 for IsLost check
-- Bug 2875 - tcp: Use Rule3 of RFC6675 only with SACK enabled
-- Bug 2876 - tcp: Do not shrink adv window after we send the FIN
-- Bug 2877 - wifi: Wrong data types for CWmin and CWmax
-- Bug 2885 - lte: Tests fail for CQA and PSS testsuites
-- Bug 2890 - internet: Icmpv4 "ECHO" is defined in system-wide headers
-- Bug 2898 - lte: Coding issue in function RrcAsn1Header::DeserializeRachConfigCommon
-- Bug 2899 - lte: Inconsistent type for variable cellForWhichToReportCGI
-- wifi:  Fix wrong guard band for SpectrumWifiPhy DSSS/HR-DSSS
-
-Known issues
-------------
-In general, known issues are tracked on the project tracker available
-at http://www.nsnam.org/bugzilla/
-
-Release 3.27
-============
-
-Availability
-------------
-This release is available from:
-https://www.nsnam.org/release/ns-allinone-3.27.tar.bz2
-
-Supported platforms
--------------------
-This release is intended to work on systems with the following minimal
-requirements (Note:  not all features available on all platforms):
-- g++-4.9 or later (Note:  this is an upgraded requirement from ns-3.26)
-- Apple LLVM version 7.0.2 or later
-- clang-3.3 or later
-- Python 2.7 (Python 2 series) or Python 3.4 (Python 3 series) or later
-
-This release has been tested on the following platforms:
-- Ubuntu 17.04 (64 bit) with g++-6.3.0
-- Ubuntu 16.04 (64 bit) with g++-5.4.0
-- Ubuntu 14.04.5 (64 bit) with g++-4.9.4
-  - Note: the default g++ version (4.8) must be upgraded
-- Fedora Core 26 (64 bit) with g++-7.1.1
-- Fedora Core 22 (64 bit) with g++-5.3.1
-- CentOS/RHEL 7.4 (64-bit) with g++-6.3.1
-  - Note: the default g++ version (4.8) must be upgraded
-- CentOS/RHEL 6.8 (64-bit) with g++-4.9.2
-  - Note: the default g++ version (4.4) must be upgraded
-  - Note: the default Python version (2.6) must be upgraded
-- OS X Sierra 10.12.6 with Xcode 9.0 and Apple LLVM version 9.0.0
-- OS X El Capitan 10.11.6 with Xcode 8.2.1 and Apple LLVM version 8.0.0
-- OS X Yosemite 10.10.5 with Xcode 7.2.1 and Apple LLVM version 7.0.2
-- Windows 10 Linux Subsystem with g++-5.4.0
-
-New user-visible features
--------------------------
-- (build) Modules can also be located in contrib/ directory (as well as src/)
-- (core) Logging timestamp precision has been improved
-- (lte) LTE carrier aggregation feature according to 3GPP Release 10 is now supported.
-- (traffic-control) CsmaNetDevice, SimpleNetDevice and WifiNetDevice support flow control.
-- (traffic-control) Added support for queue discs to mark packets, and ECN support has been added to RED
-- (traffic-control) A multi-queue aware queue disc modelled after Linux mq
-- (traffic-control) Added support for detailed statistics output of queue discs
-- (traffic-control) Added support for tracing queue sojourn times
-- (tcp) The SACK option and the RFC 6675 loss recovery algorithm are now supported.
-- (tcp) A LEDBAT model has been added.
-- (wifi) 802.11ax High Efficiency (HE) physical layer modes are now supported.
-- (wifi) A new RRPAA rate control mechanism has been added.
-- (wifi) A new trace source for TXOP duration is now supported
-- (wifi) Frame capture effect can now be modelled
-- (uan) World Ocean System Simulation (WOSS) integration, and new PER models
-
-Bugs fixed
-----------
-- Bug 1034 - wifi: No trace source for packet dropping from WifiMacQueue
-- Bug 2007 - uan: Remove deprecation on SetRxThresholdDb
-- Bug 2048 - lte: Fix scheduler resource allocation when CQI==0 (out of rante)
-- Bug 2133 - tcp: Avoid assert when receiving data in FIN_WAIT_1 or _2 states
-- Bug 2214 - tcp: Use of ScheduleNow only in selected part of the code
-- Bug 2221 - network: Remove constraint on size of ns3::Packet Tag objects
-- Bug 2256 - tcp: bytes in flight now updated in TcpTxBuffer
-- Bug 2263 - tcp: Support processing of multiple TCP options
-- Bug 2285 - tcp: Loss of ack of SYN can cause improper connection setup
-- Bug 2367 - wifi: BlockAckManager does not remove iterators to freed items
-- Bug 2450 - propagation: LogDistancePropagationLossModel is not continuous
-- Bug 2456 - lte: MemberCschedSapProvider and Member CschedSapProvider templates
-- Bug 2464 - spectrum: Store spectrum conversion matrix in CSR format
-- Bug 2467 - spectrum: Do not schedule StartRx for receivers on other models
-- Bug 2471 - wifi: unable to disable Block Ack agreement for 802.11n
-- Bug 2477 - wifi: DCF manager assert
-- Bug 2485 - traffic-control: Check queue full before checking RED thresholds
-- Bug 2491 - wifi: replace DcfManager::MY_DEBUG
-- Bug 2492 - uan: Make use of RxGain attribute in UanPhyGen class
-- Bug 2511 - wifi: HT Greenfield is not working
-- Bug 2512 - traffic-control: Byte mode not configured correctly for RED test
-- Bug 2513 - core: ParetoRandomVariable needs a "scale", not a "mean" attribute
-- Bug 2518 - build: Suppress printing of list of modules for Python programs
-- Bug 2519 - lte: m_windowOffsetsMap.end () dereference
-- Bug 2520 - examples: TCP variant not configured in wifi-tcp.cc
-- Bug 2521 - internet: Include ipv6-option.h in wscript
-- Bug 2523 - lte: Generate the RLC PDU properly
-- Bug 2527 - internet: PrintRoutingTable adds an optional Time::Units parameter
-- Bug 2528 - wifi: 802.11n RIFS cannot be enabled
-- Bug 2529 - wifi: Missing trace for Block ACK timeout or missing MPDUs
-- Bug 2530 - aodv: Rename aodv::SetBalckListTimeout to aodv::SetBlackListTimeout
-- Bug 2531 - lte: Set HARQ feedback default value to avoid false retrasmissions
-- Bug 2532 - wifi: Inconsistencies between 802.11n MCS and NSS value in TXVECTOR
-- Bug 2533 - wifi: Provide better 802.11n/ac PHY abstraction for SIMO/MISO/MIMO
-- Bug 2534 - traffic-control: ARED and PIE examples should return 1 upon exit
-- Bug 2535 - utils: memory leak in bench-simulator.cc
-- Bug 2536 - wimax: fixed dead assignment and potential memory leak in wimax
-- Bug 2537 - traffic-control: Fix dead assignment on CoDel::DoDequeue
-- Bug 2538 - tap-bridge: fixed dead assignment on tap-bridge
-- Bug 2540 - mesh: fixed dead assignment on mesh/ie-dot11s-perr
-- Bug 2541 - wifi: preamble not assigned correctly
-- Bug 2542 - wifi: dead assignment on wifi mac-low
-- Bug 2543 - lte: Fix when EstimateUlSinr returns NO_SINR
-- Bug 2545 - flow-monitor: Optimized build fails for flow-monitor
-- Bug 2547 - tcp: dead assignments on various tcp congestion controls
-- Bug 2551 - wifi: wifi preamble should be part of TXVECTOR
-- Bug 2552 - wifi: Remove code duplication between Yans and Spectrum
-- Bug 2554 - wave: Fix static analysis warning
-- Bug 2556 - csma, point-to-point: Avoid modification of transmitted packets
-- Bug 2557 - point-to-point:  Fix dead assignments in queue-discs-benchmark
-- Bug 2559 - tcp: TCP advertised window still incorrect
-- Bug 2561 - tcp: TCP can not use Connect after a BindToNetDevice
-- Bug 2563 - bindings: pybindgen version check to >= minimum version required
-- Bug 2564 - wifi: Simulation crashes when CtsTimeout triggered for A-MPDU
-- Bug 2565 - tcp: Do not wait for 2*MSL to notify socket close
-- Bug 2566 - wifi: BlockAckManager::GetNRetryNeededPackets missing some packets
-- Bug 2568 - examples: Avoid enumerating TCP variants
-- Bug 2577 - wifi: crashes when A-MPDU and multiple TOS used, upon CTS timeout
-- Bug 2578 - wifi: Unexpected assert "Internal collision but no packet in queue"
-- Bug 2584 - wifi: MacLow triggers StartNext even if there is no TXOP
-- Bug 2587 - tcp: Avoid overflow in htcp.cc
-- Bug 2590 - traffic-control: Minor enhancements in red-queue-disc{.h, .cc}
-- Bug 2591 - wifi: 802.11e Block Ack cannot be enabled on HT/VHT stations
-- Bug 2594 - wifi: vht-wifi-network very low throughtput at MCS 6, 160 MHz, SGI
-- Bug 2596 - network: EthernetTrailer::GetFcs() should be const
-- Bug 2601 - wifi: HT stations should use 40 MHz width if configured  80 or 160z
-- Bug 2604 - wifi: QosData frames separation with Block Ack enabled
-- Bug 2605 - wifi: HT/VHT station sending to legacy results in null throughput
-- Bug 2606 - wifi: Ideal rate manager for HT/VHT station to a legacy AP
-- Bug 2607 - wifi: Correct overflow in channel width loop in Minstrel HT
-- Bug 2613 - tcp: MaxRxSequence () is sometimes too large
-- Bug 2614 - internet: RIP header version should be set to 2
-- Bug 2615 - wifi: When the TXOP limit is nonzero, fragment in some cases
-- Bug 2617 - traffic-control: PfifoFastQueueDisc::Peek all bands
-- Bug 2621 - wifi:  Fix mismatch between log message and action
-- Bug 2624 - lte: Inconsistent coding of type and naming
-- Bug 2627 - internet: Ipv6RawSocket does not honor the bound interface
-- Bug 2628 - wifi: Simulation crashes because of an out of range TID
-- Bug 2629 - wifi: Assert failure in MinstrelHtWifiManager::GetLowestIndex
-- Bug 2632 - lte: Build error due to uninitialized variable in rem helper
-- Bug 2646 - lte: lena-simple-eps-emu example will never work
-- Bug 2647 - wifi: ideal-wifi-manager-example crashes when NSS > 1
-- Bug 2649 - tcp: Disabling TCP SACK doesn't fall back to NewReno
-- Bug 2654 - wifi: Rraa wifi manager cannot be used with 802.11b
-- Bug 2655 - wifi: A-MPDU simulation using TCP sometimes fails
-- Bug 2658 - core: Avoid unexpected TracedValue type conversions
-- Bug 2660 - traffic-control: TrafficControlHelper::Default configuration
-- Bug 2661 - wave: Fix outdated class references in documentation
-- Bug 2665 - internet: Ipv4RawSocket can not send to broadcast or multicast
-- Bug 2666 - lte: Remove deprecated variables/config paths
-- Bug 2668 - various: Make template classes use NS_LOG_* macros
-- Bug 2671 - internet: ArpCache::Entry::SetMacAddress is misspelled
-- Bug 2673 - wifi: run-time channel switch does not update WiFi spectrum model
-- Bug 2675 - traffic-control: Use correct string value in PIE example
-- Bug 2716 - tcp: TCP socket ignoring FIN flag when in FIN_WAIT state
-- Bug 2717 - internet: Fix mask for Ipv4RoutingTableEntry::CreateDefaultRoute
-- Bug 2722 - wifi: 802.11g sends DSSS spectrum signals inappropriately
-- Bug 2731 - lte: Allow retranmission in RLC AM when PR expires, vtS overflows
-- Bug 2732 - applications: BulkSend Tx trace is fired too much
-- Bug 2733 - wifi: Ideal wifi manager cannot handle NSS higher than 1
-- Bug 2741 - internet: IPv4 fragmentation fails on last fragment fragmentation
-- Bug 2744 - wifi: 802.11n/ac with RTS/CTS crashes for a large number of nodes
-- Bug 2751 - traffic-control: QueueDisc::Enqueue() order of operations
-- Bug 2756 - internet: Ipv4AddressGenerator underestimates available addresses
-- Bug 2757 - wifi: 802.11n/ac/ax maximum TXOP is not properly enforced
-- Bug 2758 - internet: IPv4 sockets bound to unicast receiving subnet broadcast
-- Bug 2759 - internet: Packet conversion from broadcast to subnet-directed
-- Bug 2760 - internet: OLSR uses unicast-bound sockets to receive broadcasts
-- Bug 2761 - wifi: Packet has no Traffic ID for CTS frames when A-MPDU is used
-- Bug 2762 - internet: BindToNetDevice behaviour is not coherent with Linux
-- Bug 2763 - wifi: management packets in PCAPs are marked as wrong by Wireshark
-- Bug 2769 - tcp: Set ssthresh correctly upon RTO
-- Bug 2771 - wifi: IdealWifiManager problems under different number of antennas
-- Bug 2776 - wifi: Fix segmentation fault in MacLow
-- Bug 2777 - lte: Save bearer info in m_drbMap, needed for handover request
-- Bug 2781 - tcp: Do not go beyond limit in TcpTxBuffer
-- Bug 2783 - wifi: MonitorSnifferRx SNR is invariant to RxNoiseFigure
-- Bug 2786 - lte:  Remove unimplemented declaration
-- Bug 2796 - tcp: NSC TCP transmission flow control not working
-
-Known issues
-------------
-In general, known issues are tracked on the project tracker available
-at http://www.nsnam.org/bugzilla/
-
-Release 3.26
-============
-
-Availability
-------------
-This release is available from:
-https://www.nsnam.org/release/ns-allinone-3.26.tar.bz2
-
-Supported platforms
--------------------
-This release is intended to work on systems with the following minimal
-requirements:
-- g++-4.8 or later
-- clang-3.3 or later
-- Python 2.7 (Python 2 series)
-- Python 3.4 or later (Python 3 series)
-
-This release has been tested on the following platforms:
-- Ubuntu 16.04 (64 bit) with g++-5.4.0
-- Ubuntu 14.04 (64 bit) with g++-4.8.2
-- Fedora Core 24 (64 bit) with g++-6.1.1
-- Fedora Core 22 (32 bit) with g++-5.3.1
-- Fedora Core 21 (64 bit) with g++-4.9.2
-- CentOS/RHEL 6.7 (64-bit) with g++-4.9.2
-- OS X El Capitan 10.11.4 with Xcode 7.3.1 and Apple LLVM version 7.3.0
-- OS X El Capitan 10.11.3 with Xcode 7.2.1 and Apple LLVM version 7.0.2
-
-New user-visible features
--------------------------
-- (aodv) The node search radius is increased progressively (as per standard).
-- (build system) New --check-config option to waf to reprint the summary
-  of optional features which are configured.
-- (build system) C++11 features are now supported in the codebase
-- (core) DES Metrics support; see the API docs for class DesMetrics.
-- (internet) Added TCP Vegas, Scalable, Veno, Illinois, Bic, YeAH, and
-  H-TCP congestion control algorithms
-- (internet) Add a TOS field to the InetSocketAddress class
-- (network) SocketAddressTag has been removed from the codebase.
-  Users can use RecvFrom (for UDP) or GetPeerName (for TCP) instead.
-- (traffic control) Added the FQ-CoDel and PIE queue disc models
-- (traffic control) Introduce Byte Queue Limits (BQL)
-- (wifi) A new SpectrumWifiPhy physical layer model, making use of the
-  ns-3 spectrum framework, has been introduced.  The current version of
-  this model matches the API and behavior of YansWifiPhy closely, but
-  over time is expected to support a different PHY abstraction and error
-  models.
-- (wifi) IEEE 802.11e TXOP limits are now enforced for different access
-  categories when a QoS MAC is configured.
-
-Bugs fixed
-----------
-- Bug 231 - Avoid adding SocketAddressTag (at all)
-- Bug 1579 - Final fix for segfault caused by EDCA fragmentation
-- Bug 1797 - Rate adaptation algorithms don't work with new 802.11n/ac standards
-- Bug 1911 - AODV doesn't work with more than one NetDevice
-- Bug 1939 - Aggregating the same object to two nodes produce unexpected results
-- Bug 1977 - v4Ping verbose output when not explicitly stopped
-- Bug 2057 - ARP and Ndisc caches should be updated by receiving valid L3 packets
-- Bug 2069 - Avoid integer overflow in ByteTagList
-- Bug 2102 - Ipv4GlobalRouting confused by bridged interfaces
-- Bug 2123 - AODV doesn't use / honor IP TTL in the RREQ / RREP
-- Bug 2149 - support deprecating attributes and trace sources
-- Bug 2222 - incorrect EDCA behavior in case of internal collision
-- Bug 2270 - Support -std=c++11 by default
-- Bug 2306 - Raise DCF IsBusy() condition for CCA busy
-- Bug 2307 - Get rid of m_receivedAtLeastOneMpdu flag
-- Bug 2308 - PacketTag instead of ByteTag in LTE PDCP/RLC
-- Bug 2344 - Attribute names can't have spaces
-- Bug 2346 - sixlowpan CompressionThreshold limit can be violated
-- Bug 2347 - LrWpan Ascii traces are hooked to the wrong traces.
-- Bug 2351 - Fix symbol rate calculation for channels with 10 and 5 MHz width
-- Bug 2352 - Add 'drop oldest' drop policy to WifiMacQueue
-- Bug 2369 - Generate backoff if DCF requests access during AIFS
-- Bug 2375 - Flowmonitor parse crashes when no pkt is received
-- Bug 2376 - New A-MPDU might not be received if MPDUs of a previous A-MPDU are lost
-- Bug 2377 - SocketIpTosTag and SocketIpv6TclassTag may be added twice in UDP
-- Bug 2378 - A-MPDU variables are not correctly reset in YansWifiPhy when a PLCP preamble/header failed
-- Bug 2379 - BlockAckRequest should not be part of single-TID A-MPDUs
-- Bug 2380 - EdcaTxopN fails to retrieve TID for ADDBA requests, ADDBA responses and DELBA frames
-- Bug 2383 - IPv4 header for reassembled packets reports a wrong payload size
-- Bug 2386 - Move UanPhyGen out of Tx mode when energy depleted
-- Bug 2387 - Fix waf --check-profile command
-- Bug 2390 - WaypointMobilityModel::AddWaypoint lazy notify schedules an event using absolute time (should be relative time)
-- Bug 2392 - SYN segment advertised window should not be scaled
-- Bug 2395 - Upgrade pybindgen for Python >= 3.5
-- Bug 2396 - move utility functions to WifiPhy
-- Bug 2397 - add backoff and cw tracing to EDCA
-- Bug 2398 - add SNR tag to beacons and probe responses
-- Bug 2401 - Deserialize correctly the len of options in TcpHeader
-- Bug 2402 - IPv4 Interface forwarding state is not honored
-- Bug 2406 - Poor 802.11g performance in ad-hoc mode
-- Bug 2408 - Simulation fails when 802.11n/ac is running with HT Minstrel and pcap enabled
-- Bug 2412 - align WifiPhy frequency and channel number
-- Bug 2414 - UdpSocket doesn't call NotifyConnectionFailed
-- Bug 2419 - BsmApplication should use RecvFrom and not SocketAddressTag
-- Bug 2420 - Remove code duplication between Wifi and Wave modules
-- Bug 2421 - Forbid negative RemainingAmpduDuration for the last A-MPDU
-- Bug 2425 - UdpSocketImpl simplification
-- Bug 2427 - 802.11ac selects wrong slot duration
-- Bug 2433 - Bic does not copy private parameters
-- Bug 2436 - Do not send block ack if received A-MPDU not addressed to station
-- Bug 2438 - Routing protocols should stop processing packets coming from a non-forwarding interface
-- Bug 2439 - SixLowPan Compression kind need to be casted to int in the Print function
-- Bug 2440 - SocketIpTosTag might be added twice if a packet is sent multiple times
-- Bug 2442 - ConfigStore crash if object container has null item
-- Bug 2443 - Increase application counters to accommodate Gbps transfer rates
-- Bug 2444 - PcapHelper DataLinkType enum should have a name
-- Bug 2445 - Out of bounds array access in Minstrel HT rate control
-- Bug 2446 - Fix comma delimiter instead of pipe delimiter in Attributes
-- Bug 2448 - Run examples in traffic control test suite
-- Bug 2452 - Add Object::IsInitialized method
-- Bug 2454 - DsrRouting::NotifyDataReceipt is also triggered for wifi management packets
-- Bug 2461 - TCP BIC should copy private members
-- Bug 2468 - Simulation with A-MPDU enabled hangs when fragmentation threshold is smaller than MSDU size
-- Bug 2469 - send Block Ack Request upon short/long retry failures
-- Bug 2474 - UdpEchoClient does not call Connect with addresses of type Inet[6]SocketAddress
-- Bug 2477 - Partial fix for wifi asserts when transmit cancels a reception
-- Bug 2479 - Flow monitor does not a have a "DROP_QUEUE_DISC" drop reason
-- Bug 2480 - Use SQLite prepared statements
-- Bug 2481 - Missing or incorrect group names
-- Bug 2484 - Corrected the exit from CA_LOSS state in TCP
-- Bug 2486 - NextTxSequence was not traced back from TCB
-- Bug 2488 - Error in UanPdp::SumTapsFromMaxNc
-- Bug 2496 - BSS membership selector in SupportedRates
-- Bug 2500 - Ipv[4,6]RawSocket ignores IpTtl tag
-- Bug 2507 - ConfigStore RawTextConfigLoad doesn't reset stream error state
-- Bug 2508 - Duplicate of bug 2507
-- Bug 2514 - The maximum transmission time for VHT A-MPDUs is not correct
-- No BugId - Arp logging: label with request or reply properly
-
-Known issues
-------------
-In general, known issues are tracked on the project tracker available
-at http://www.nsnam.org/bugzilla/
-
-Release 3.25
-============
-
-Availability
-------------
-This release is available from:
-https://www.nsnam.org/release/ns-allinone-3.25.tar.bz2
-
-Supported platforms
--------------------
-This release has been tested on the following platforms:
-- Ubuntu 15.10 (64 bit) with g++-5.2.1
-- Ubuntu 14.04 (64 bit) with g++-4.8.2
-- Fedora Core 23 (64 bit) with g++-5.3.1
-- Fedora Core 22 (32 bit) with g++-5.1.1
-- Fedora Core 21 (64 bit) with g++-4.9.2
-- Arch Linux (64 bit) with g++-5.3.0 and clang++-3.7.1
-- CentOS/RHEL 6.7 (64-bit) with g++-4.4.7
-- OS X El Capitan 10.11.4 with Xcode 7.3 and Apple LLVM version 7.3.0
-- OS X El Capitan 10.11.3 with Xcode 7.2.1 and Apple LLVM version 7.0.2
-- OS X Yosemite 10.10.5 with Xcode 7.2.1 and Apple LLVM version 7.0.2
-- FreeBSD 10.2-RELEASE (64 bit) with clang-3.4.1
-
-New user-visible features
--------------------------
-- (internet) The native TCP implementation has been refactored, for the
-  following improvements:
-    1) congestion control has been aligned with the Linux architecture,
-       to facilitate easier coding of new congestion control algorithms
-        or porting implementations from the Linux kernel,
-    2) Fast Retransmit and Fast Recovery algorithms, compliant to RFCs, are
-       shared by all TCP variants, unlike previous releases.
-    3) TCP Hybla and TCP HighSpeed variants have been added.
-
-- (routing) The PrintRoutingTable* functions now print the following information
-  each time they are called:
-    1) the node ID,
-    2) the global time,
-    3) the local time (allowing for future introduction of per-node clocks),
-    4) the routing protocol type
-
-- (traffic control) A traffic control sublayer has been added with the aim of
-  introducing an equivalent of the Linux Traffic +Control infrastructure into
-  ns-3. This layer sits in between the NetDevices (L2) and the network
-  protocol (e.g. IP). It is in charge of processing packets and performing
-  actions on them: scheduling, dropping, marking, policing, etc.  Initial
-  support for flow control has been added to the PointToPointNetDevice;
-  backward-compatible support for other device types is provided.
-
-- (traffic control) A three band priority queue modelled after Linux
-  pfifo_fast queueing discipline has been added.
-
-- (traffic control) Adaptive RED extensions have been added to the RED model
-
-- (wifi) A number of changes related to improving support for 802.11n/ac
-  models have been introduced.
-  1) Two rate controls compatible with High Throughput (HT) Wi-Fi modes
-     (e.g. 802.11n/ac), Ideal and MinstrelHT, have been added
-  2) Support for multiple spatial streams (MIMO) using existing SISO
-     error models
-  3) The WiFi helper API for the WifiMac sublayer, and the configuration
-     of HT modes and parameters, has been simplified
-  4) Better support for backward compatibility with legacy modes
-
-- (wifi) 802.11g was made backward compatible with 802.11b networks
-
-- (internet) L4 protocols (e.g., TCP, UDP, ICMP, etc.) can be demultiplexed
-  by IP according to the incoming interface. In other words, it is now
-  possible to use specialized L4 protocols according to the interface.
-
-- (internet) Ipv6Address::IsAllHostsMulticast() is now deprecated.
-  FF02::3 is not in the official reserved IPv6 multicast address list.
-
-- (internet) Ipv6Address::IsAll[Nodes,Routers]Multicast() now checks the
-  address scope beyond the simple link-local. Nodes are checked for
-  Interface-Local, Link-Local and Realm-Local, Routers for the above plus
-  Site-Local.
-
-- (internet) Ipv6 routing protocols must now *not* forward packets to upper
-  layers unless for extremey specific cases. The Ipv6L3protocol handles
-  almost all the packets directed to the host.
-
-- (internet) Ipv6 can now reject packets directed to an address not configured
-  on the interface they are received from (Strong End System Model, RFC 1222).
-
-- (internet) UDP and Ipv6 RAW sockets can now join Ipv6 multicast groups.
-  Incoming packets will be filtered according to if there's a socket listening
-  to that group. Source filtering is left to the application.
-
-- (network) ns-3 is now capable of serializing cooked (SLL) headers. This is
-  used in DCE to allow the generation of pcap directly readable by wireshark.
-
-- (internet) It is now possible to set custom values for RipNg Link Down
-  (standard is 16).
-
-- (internet) permanent (static) NDISC entries can be created for IPv6
-
-- (internet) IPv4 RIPv2 protocol model is now available.
-
-Bugs fixed
-----------
-- Bug 1132 - useless for loops in block-ack-test-suite.cc
-- Bug 1205 - EDCA is incorrectly modelled as DCF
-- Bug 1571 - TCP zero-window and flow control window updates by the receiver
-- Bug 1631 - Acoustic modem Energy consumption calc is wrong
-- Bug 1761 - Rounding with olsr::EmfToSeconds
-- Bug 1783 - BytesInFlight value fixed
-- Bug 1954 - Serialized size of wifi-net-device differ for TX and RX trace
-- Bug 1999 - PointToPointRemoteChannel invokes PointToPointChannel constructor
-- Bug 2003 - Missing DSSS short PLCP preamble
-- Bug 2041 - TCP RTO needs unit tests
-- Bug 2068 - Timestamp option conforms to RFC 7323
-- Bug 2102 - Make global routing robust to bridged links
-- Bug 2116 - refactoring aggregation API
-- Bug 2120 - 802.11g networks are not compatible with 802.11b clients
-- Bug 2141 - TCP DataSent callback now correctly notifies sent data, without missing bytes in particular conditions
-- Bug 2150 - The TCP sender keeps retransmitting and does not terminate the connection after some retries.
-- Bug 2159 - TCP advertises wrong receive window
-- Bug 2176 - Building IPv4 address from char* doesn't look reliable
-- Bug 2183 - LiIonEnergySourceHelper is not in the energy wscript
-- Bug 2184 - Integer overflow in Wi-Fi MacLow; remove dependency between tx and rx reference number field in MPDU status
-- Bug 2185 - WiFi MacLow may respond to errored frames that it should ignore
-- Bug 2193 - Simulation fails when transmitting very small MPDU subframes
-- Bug 2195 - Udp[*]Client can't send packets to broadcast address
-- Bug 2201 - Simulation fails when active probing is used in 802.11n/ac with channel bonding enabled
-- Bug 2206 - Split internet-apps from applications
-- Bug 2207 - Print node ID and time when printing routing tables
-- Bug 2208 - Interface index based L4 protocols
-- Bug 2210 - set Order field to 0 for HT/VHT
-- Bug 2211 - Ipv{4,6}EndPoint can cause memory corruption
-- Bug 2213 - Inconsistencies may exist between the selected WifiMacHelper and the chosen 802.11 version
-- Bug 2219 - SixLowPanNetDevice hangs trying to decode a IPv6 Fragment extension header
-- Bug 2224 - scope of GetAmpduExist() in EdcaTxopN
-- Bug 2233 - Implement RFC 1222 - Strong End System Model
-- Bug 2234 - Ipv6L3Protocol should trash multicast packets not interesting for the node
-- Bug 2238 - Ipv6 routing reorganization
-- Bug 2242 - Mobility of both sender PHY and receiver PHY set to sender mobility in lr-wpan-phy-test.cc example.
-- Bug 2243 - TCP Socket Fork() fails to copy some parameters, causing connections to close prematurely on retransmit
-- Bug 2246 - Some DSR LogComponents and classes are not defined in a unique way.
-- Bug 2247 - Disabled Fast retransmit after an RTO
-- Bug 2249 - LTE perl speed tests possibly broken
-- Bug 2252 - Nix needs StaticRouting to work
-- Bug 2254 - Ipv[4,6]RawSocket can return the wrong number of bytes sent.
-- Bug 2255 - Ipv6RawSocket does not call data sent callbacks.
-- Bug 2257 - Ipv[4,6]InterfaceContainer::Add are not consistent
-- Bug 2258 - TcpSocketBase updated options and RTT for out of range segments.
-- Bug 2259 - GSL not successfully enabled for Wi-Fi DSSS error rate model
-- Bug 2262 - Corrected initial slow start threshold value
-- Bug 2266 - NixRouting info are not copied during a packet fragmentation.
-- Bug 2267 - Wrong channel bandwidth value in pcap files
-- Bug 2271 - Decision to enable RTS/CTS handshake for A-MPDUs should be based on the comparison between RtsCtsThreshold and the total A-MPDU size
-- Bug 2272 - SixLowPan NetDevice can not send uncompressed packets larger than 802.15.4 MTU
-- Bug 2273 - WeakEs model should be enforced in Static and Global routing
-- Bug 2275 - AdhocWifiMac not compatible with 802.11n/ac
-- Bug 2279 - Ipv[4,6]L3Protocol::GetInterfaceForDevice speedup.
-- Bug 2283 - Add capability to use pcap trace files with nanosecond precision timestamps
-- Bug 2286 - Support for SLL header (de)serialization.
-- Bug 2287 - FlowMonitor is confused by IP over IP.
-- Bug 2288 - Ipv4 broadcast and multicast packets are replicated on all the interfaces.
-- Bug 2289 - RIP v2 implementation
-- Bug 2290 - Cannot run click examples from test.py
-- Bug 2292 - Uninitialized variables since commit 7c60a9f8f271
-- Bug 2293 - Red Queue Estimator spins when trying to compute queue average size under long idle times.
-- Bug 2297 - 802.11n/ac networks are not compatible with legacy clients
-- Bug 2302 - Fixing RTT calculation inside TCP Socket
-- Bug 2303 - WifiMacQueue::GetSize should cleanup queue beforehand
-- Bug 2304 - DSCP Set/Get are using 8 bit values instead of 6
-- Bug 2307 - m_receivedAtLeastOneMpdu is not always reset
-- Bug 2311 - save Ht/Vht capabilities info on a per-station basis
-- Bug 2313 - Assert failed when using aggregation and RTS/CTS
-- Bug 2315 - Problem when BACK Request is part of an A-MPDU
-- Bug 2316 - MacLow shall use a single TXVECTOR for all MPDUs belonging to a same A-MPDU
-- Bug 2317 - Get the non-HT reference rate of a HT MCS
-- Bug 2318 - MPDU Aggregation fails with TCP
-- Bug 2319 - BlockAckTimeout value is too low for 802.11n operating at 2.4 GHz
-- Bug 2320 - Add method to check whether a WifiTxVector contains a valid combination of WifiMode, number of spatial streams and channel width
-- Bug 2321 - Wifi rate managers should not be triggered for each MPDU when A-MPDU is used
-- Bug 2327 - CWmin value selection for 802.11g is not compliant with the standard rules
-- Bug 2328 - changes to antenna configuration should update HT MCS set
-- Bug 2331 - Wrong mobility model in vanet-routing-compare example
-- Bug 2332 - Assert failed when using aggregation and two pairs of AP-STA
-- Bug 2337 - WifiPhy uses channel width in Hz iso MHz
-- Bug 2338 - WifiMode selected for control frames may sometimes be invalid
-
-Known issues
-------------
-In general, known issues are tracked on the project tracker available
-at http://www.nsnam.org/bugzilla/
-
-Release 3.24.1
-==============
-
-Release 3.24.1 is a maintenance release that fixes three issues:
-- support for Xcode 7 clang compiler version
-- detection of Python bindings location
-- compilation problem on 32-bit gcc-4.4 machine
-
-The issues prevented selected systems from being able to successfully
-build ns-3, and prevented the released version from being able to
-detect the presence of pybindgen used for Python bindings.
-
-Availability
-------------
-This release is available from:
-https://www.nsnam.org/release/ns-allinone-3.24.1.tar.bz2
-
-Supported platforms
--------------------
-This release has been tested on the following platforms:
-- Ubuntu 15.04 (64 bit) with g++-4.9.2
-- Fedora Core 22 (32 bit) with g++-5.1.1
-- Fedora Core 21 (64 bit) with g++-4.9.2
-- Ubuntu 14.04 (64 bit) with g++-4.8.2
-- Ubuntu 12.04.4 (64 bit) with g++-4.6.3
-- CentOS/RHEL 6.7 (64-bit) with g++-4.4.7
-- OS X Yosemite 10.10.5 with Xcode 7 and Apple LLVM version 7.0.0
-- OS X Yosemite 10.10.5 with Xcode 6.4 and Apple LLVM version 6.1.0
-- FreeBSD 10.2-RELEASE (64 bit) with clang-3.4.1
-
-New user-visible features
--------------------------
-Features are identical to release 3.24.
-
-Bugs fixed
-----------
-- Bug 2181 - Xcode 7.0 compiler warnings trigger build failure
-- Bug 2182 - pybindgen required version is now a string literal
-- Bug 2184 - integer overflow in MacLow
-
-Release 3.24
-============
-
-Availability
-------------
-This release is available from:
-https://www.nsnam.org/release/ns-allinone-3.24.tar.bz2
-
-Supported platforms
--------------------
-This release has been tested on the following platforms:
-- Ubuntu 15.04 (64 bit) with g++-4.9.2
-- Fedora Core 22 (32 bit) with g++-5.1.1
-- Fedora Core 21 (64 bit) with g++-4.9.2
-- Ubuntu 14.04 (64 bit) with g++-4.8.2
-- Ubuntu 12.04.4 (32/64 bit) with g++-4.6.3
-- CentOS/RHEL 6.7 (64-bit) with g++-4.4.7
-- OS X Yosemite 10.10.4 with Xcode 6.4 and Apple LLVM version 6.1.0
-- FreeBSD 10.1-RELEASE (64 bit) with clang-3.4.1
-
-New user-visible features
--------------------------
-- (build system) Python 3 is now supported by waf and test runner programs
-- (wifi) 802.11ac Very High Throughput (VHT) physical layer modes are now
-  supported.
-- (internet) permanent (static) ARP entries can be created for IPv4
-- (network) SimpleChannel allows per-NetDevice blacklists, in order to do hidden terminal testcases.
-- (documentation) TracedCallback function signatures now documented in Doxygen
-
-Bugs fixed
-----------
-- Bug 730 - Enabling fragmentation at run-time breaks simulation
-- Bug 1249 - doxygen comments on device-level SetMobility ()
-- Bug 1482 - mesh module was producing fatal error with ASCII and netanim traces
-- Bug 1557 - errors in function OpenFlowSwitchNetDevice::BufferFromPacket()
-- Bug 1681 - m_lastNavStart is assigned twice continuously
-- Bug 1736 - default dot11EDCATableMSDULifetime
-- Bug 1901 - mesh module producing malformed pcaps
-- Bug 1929 - TcpL4Protocol::Send must indicate the source address to routing (if known)
-- Bug 1982 - AODV and mesh modules use random variables before seeds can be set
-- Bug 2058 - TCP window update can shrink left edge of window
-- Bug 2063 - FdNetDevice::SendFrom assert does not account for headers correctly
-- Bug 2082 - Empirical RV fails if value provided in CDF function is negative
-- Bug 2093 - MultiModelSpectrumChannel::GetDevice only works for 0-th index
-- Bug 2096 - Wrong pcap information when MPDU aggregation is used
-- Bug 2104 - Sequence Number passed to QosUtilsMapSeqControlToUniqueInteger instead of Sequence Control
-- Bug 2108 - Erroneous implementation in InterferenceHelper
-- Bug 2119 - Fix memory leaks in FdNetDevice test due to non-executed events
-- Bug 2124 - UdpSocketImpl::ShutdownRecv doesn't stop the Ipv[4,6]EndPointDemux
-- Bug 2125 - subclasses must chain up to base class NotifyNewAggregate
-- Bug 2126 - LrWpanNetDevice silently accepts no mobility on the node
-- Bug 2127 - Scheduler benchmark utility works in first run only
-- Bug 2130 - Allow SimpleChannel to simulate hidden terminals
-- Bug 2132 - TcpL4Protocol sends a bad-formatted RST packet
-- Bug 2135 - TCP doesn't honor the socket's output interface
-- Bug 2136 - The usage of tid in wifi and wave module shall be "if (tid > 7)" rather than "if (tid >= 7)"
-- Bug 2138 - SimpleNetDevice could send overlapped packets
-- Bug 2143 - maybe-uninitialized warning
-- Bug 2146 - bug in WAVE channel coordination
-- Bug 2148 - Ipv6Interface::SetUp doesn't re-create the Link-Local addresses
-- Bug 2153 - Incorrect power limits in wifi power control algorithms
-- Bug 2154 - Incorrect power calculation in wifi power adaptation examples
-- Bug 2156 - Duplicate packets when using two level aggregation
-- Bug 2157 - OpenFlowSwitchNetDevice::BufferFromPacket setting eth_type incorrectly
-- Bug 2158 - OpenflowSwitchNetDevice flooding bug
-- Bug 2165 - server replies to SYN (with option TS) with a SYNACK (with option TS) also if the attribute Timestamp is false
-- Bug 2166 - SteadyStateRandomWaypointMobilityModel directs the node to the ground
-- Bug 2170 - AnimationInterface outputs improperly formed XML
-- Bug 2171 - power-adaptation-distance.cc:202:22: error: call to 'pow' is ambiguous
-- Bug 2173 - WifiInformationElement::DeserializeIfPresent attempts to read beyond the end of buffer
-- Bug 2174 - m_rWnd not updated when segments without ACK are received
-- Bug 2177 - Ipv6ExtensionFragmentHeader length is initialized to a wrong value.
-
-Known issues
-------------
-In general, known issues are tracked on the project tracker available
-at http://www.nsnam.org/bugzilla/
-
-Release 3.23
-============
-
-Availability
-------------
-This release is available from:
-http://www.nsnam.org/release/ns-allinone-3.23.tar.bz2
-
-Supported platforms
--------------------
-This release has been tested on the following platforms:
-- Ubuntu 15.04 (64 bit) with g++-4.9.2
-- Fedora Core 21 (64 bit) with g++-4.9.2
-- Ubuntu 14.04 (64 bit) with g++-4.8.2
-- Ubuntu 12.04.4 (32/64 bit) with g++-4.6.3
-- CentOS/RHEL 6.6 (64-bit) with g++-4.4.7
-- OS X Yosemite 10.10.3 with Xcode 6.3.1 and Apple LLVM version 6.1.0
-- FreeBSD 10.1-RELEASE (64 bit) with clang-3.4.1
-
-New user-visible features
--------------------------
-- (network) CalculateTxTime has been declared obsolete.
-  CalculateBytesTxTime and CalculateBitsTxTime are to be used instead.
-  The return value is a Time, instead of a double.
-- (mobility) Classes added for converting geographic to cartesian coordinates.
-- (spectrum) TvSpectrumTransmitter models added to create television
-  transmitter(s) that transmit PSD spectrums customized by attributes such
-  as modulation type, power, antenna type, channel frequency, etc.
-- (wifi) Several model improvements have been made.  Access points now
-  establish BSSBasicRateSet for control frame transmissions.  PLCP header
-  and payload reception have been decoupled for improved PHY modeling
-  accuracy.  RTS/CTS with A-MPDU is now fully supported, and 802.11n
-  stations now support two-level aggregation.
-
-Bugs fixed
-----------
-- Bug 1757 - RLC AM not using NACK_SN
-- Bug 1974 - CalculateTxTime should return a Time, not a double
-- Bug 1982 - AODV and mesh use random variables before seed can be set
-- Bug 2004 - Wrong timeout calculation for 802.11n in WifiMac
-- Bug 2008 - (lr-wpan) Crash if ending rx while status change is in progress
-- Bug 2025 - (lr-wpan) Changing the channel doesn't affect the Tx params
-- Bug 2034 - (lr-wpan) CSMA-CA BackoffPeriod is too short
-- Bug 2054 - TCP window update can shrink the Left Edge of the window
-- Bug 2066 - A-MPDU reception should check for successful preamble
-- Bug 2067 - TCP performance when advertised window exceeds sender buffer size
-- Bug 2070 - Wrong report of Packets and Bytes stored in CoDeL
-- Bug 2073 - NDisc cache entries update timer might be stuck in a loop
-- Bug 2075 - A-MPDU using RTS/CTS behaves wrongly when MaxSsrc is reached
-- Bug 2076 - TCP MinRTO Attribute is not actually used
-- Bug 2077 - Icmpv6L4Protocol::HandleDestinationUnreachable must check the packet size, not its serialized size
-- Bug 2079 - mcs variable in ht-wifi-network example is confusing
-- Bug 2082 - Empirical RV fails if the value provided in the CDF member function is negative
-- Bug 2083 - BridgeNetDevice may send corrupted packets
-- Bug 2087 - Waf fails to build ns-3 if the path contains accented characters
-- Bug 2090 - (rip-ng) Routes may be added twice on interface activation
-- Bug 2093 - MultiModelSpectrumChannel::GetDevice only works for 0-th index
-- Bug 2095 - (wimax) Wrong values in default-traces.h for 16 QAM 3/4
-- Bug 2097 - ACKs should be sent using legacy rates and preambles in 802.11n
-- Bug 2103 - Ipv[4,6]RoutingHelper::PrintRoutingTableAll[At,Every] hangs if a node doesn't have IP
-
-Known issues
-------------
-In general, known issues are tracked on the project tracker available
-at http://www.nsnam.org/bugzilla/
-
-Release 3.22
-============
-
-Availability
-------------
-This release is available from:
-http://www.nsnam.org/release/ns-allinone-3.22.tar.bz2
-
-Supported platforms
--------------------
-This release has been tested on the following platforms:
-- Fedora Core 21 (64 bit) with g++-4.9.2
-- Ubuntu 14.10 (32 bit) with g++-4.9.1
-- Ubuntu 14.04 (64 bit) with g++-4.8.2
-- Ubuntu 12.04.4 (32/64 bit) with g++-4.6.3
-- CentOS/RHEL 6.6 (64-bit) with g++-4.4.7
-- OS X Yosemite 10.10 with Xcode 6.1.1 and clang-600.0.56
-- FreeBSD 10.1-RELEASE (64 bit) with clang-3.4.1
-
-New user-visible features
--------------------------
-- (wifi) Support for MPDU aggregation has been added to the wifi model,
-  as well as a number of related example programs.
-- (wifi) Added two combined power and rate control mechanisms to the
-  wifi module.  The new mechanisms, PARF and APARF, are the first in the
-  wifi module to jointly control transmission power and data rate.  Two use
-  case examples (PowerAdaptationDistance and PowerAdaptationInterference)
-  and a test case have also been added.
-- (lte) In previous releases of the LTE module, the bearer release
-  functionality was only partially supported. As an enhancement, a
-  complete release bearer procedure is now implemented, which can be
-  invoked by calling the new helper method
-  LteHelper::DeActivateDedicatedEpsBearer(). The related output can be
-  seen through the stats collected at different layers like PDCP, RLC,
-  MAC, PHY. To support this implementation, an example and test suite is
-  added within the LTE module examples and tests folder.
-- (wave) Additional support has been added for WiFi-based vehicular networks,
-  including the channel-access coordination features of IEEE 1609.4 and a
-  comprehensive VANET routing example that includes a Basic Safety
-  Message (BSM) packet generator application and associated statistics
-  counters.  Together, these allow users to evaluate the performance effects
-  in a VANET of varying transmission and channel properties (e.g., packet
-  rate, message size, transmit power, propagation loss model, impact of
-  routing protocol traffic, etc.).
-- (internet) It is now possible to print the Neighbor Cache (ARP and NDISC)
-  by using the RoutingProtocolHelper
-- (stats) A new TimeProbe class has been added to hook the data collection
-  framework to traced values emitting Time objects
-- (documentation) the callback function signatures for all TraceSources
-  is documented in Doxygen
-- (utils) print-introspected-doxygen.cc has had several enhancements;
-  use -h to read the usage message for details.
-- (core) TracedValue and TracedCallback function signatures are now documented,
-  which required changing the TypeId::AddTraceSource API.
-
-Bugs fixed
-----------
-- Bug 1405 - RttEstimator improvements
-- Bug 1551 - NS_LOG_COMPONENT_DEFINE inside or outside of ns3 namespace?
-- Bug 1726 - WiFi Minstrel rate control algorithm doesn't save state
-- Bug 1734 - TcpSocketBase produces spurious delayed ACKs
-- Bug 1758 - Yans and Nist error rate models for 5/6 code rate 802.11n HT
-- Bug 1770 - mesh test and example crash for 32-bit optimized builds
-- Bug 1774 - compute signal power around channel, not across whole band, and fix LrWpanHelper to add a default PropagationDelayModel
-- Bug 1791 - TCP Endpoint never deallocates when closing
-- Bug 1801 - Setting Wi-Fi timing parameters through WifiMac attributes (documentation fix)
-- Bug 1906 - 802.11n PHY configuration for 2.4GHz and 5GHz devices
-- Bug 1957 - UdpSocketImpl is stuck after a Close()
-- Bug 1968 - Missing supported 802.11n HT rates in the WifiPhy constructor
-- Bug 1969 - Support short guard interval durations in 802.11n
-- Bug 1970 - Missing NotifyAckTimeoutStartNow in MacLow::StartDataTxTimers
-- Bug 1971 - 802.11n at 2.4 GHz should include a signal extension duration
-- Bug 1972 - CommandLine duplicate argument handling: documentation updated.
-- Bug 1983 - FlowMonitor returns containers copies instead of references.
-- Bug 1986 - test result divergence for lte-frequency-reuse test
-- Bug 1991 - PcapFileWrapper::CaptureSize attribute (snaplen) has no effect.
-- Bug 1995 - avoid multiple definitions of PI
-- Bug 1996 - RSRQ calculation: misleading variable names
-- Bug 1997 - Fix PlotProbe() documentation and usage for GnuplotHelper and FileHelper
-- Bug 2002 - Hardcoded include paths cause breakage
-- Bug 2011 - Default Speed attribute in ConstantSpeedPropagationDelayModel
-- Bug 2016 - Radvd do not consider the SendAdvert option and don't reply to RS
-- Bug 2020 - Erroneous MCS field in 802.11n PCAP files
-- Bug 2021 - Missing const qualifier in TopologyReader::Link::Attributes{Begin,End}()
-- Bug 2026 - 802.11n Ness parameter badly set for data frames
-- Bug 2027 - Calculation of HT training symbol duration does not accurately follow 802.11n standard
-- Bug 2028 - remove unnecessary Time to double conversions in Wifi models
-- Bug 2029 - new CQI generation approach fix
-- Bug 2030 - provide default values for WifiTxVector
-- Bug 2037 - HT capabilities may print bogus chars
-- Bug 2038 - Stop method does not stop next wave in WaveformGenerator
-- Bug 2042 - LTE a3-rsrp-handover-algorithm.cc:  error: overflow in implicit constant conversion
-- Bug 2043 - print-introspected-doxygen crashes when some modules are disabled
-- Bug 2044 - Buffer::Iterator::ReadNtohU16() and ReadNtohU32() not implemented correctly
-- Bug 2045 - Missing NS_OBJECT_ENSURE_REGISTERED in TcpTxBuffer and TcpRxBuffer
-- Bug 2046 - set Block Ack timeout when SetStandard is called
-- Bug 2047 - Ipv6EndPointDemux::Lookup may crash
-- Bug 2049 - CQI feedback should always use the same calculation method
-- Bug 2053 - In tcp-socket-base.cc, NotifyDataSent incorrectly called with retransmits
-- Bug 2055 - TCP TxBuffer and RxBuffer traces don't work
-- Nix-vector routing implementation now uses a lazy flush mechanism,
-  which dramatically speeds up the creation of large topologies.
-
-Known issues
-------------
-In general, known issues are tracked on the project tracker available
-at http://www.nsnam.org/bugzilla/
-
-Release 3.21
-============
-
-Availability
-------------
-This release is available from:
-http://www.nsnam.org/release/ns-allinone-3.21.tar.bz2
-
-Supported platforms
--------------------
-- Fedora Core 20 (32/64 bit) with g++-4.8.2
-- Ubuntu 14.04 (32/64 bit) with g++-4.8.2
-- Ubuntu 12.04.4 (64 bit) with g++-4.6.3
-- Ubuntu 10.04.4 LTS (64 bit) with g++-4.4.3
-- CentOS/RHEL 6.5 (64-bit) with g++-4.4.7
-- OS X Mavericks 10.9 with Xcode 5.1.1 and clang-503.0.40
-- FreeBSD 9.2-RELEASE (64 bit) with clang-3.3
-
-New user-visible features
--------------------------
-
-- The LTE module now supports the transport of the S1-U, X2-U and X2-C
-  interfaces over emulated links via the new helper class EmuEpcHelper.
-- CommandLine can now provide a shorthand argument name for any
-  Attribute.
-- Implemented support for Frequency Reuse algorithms in LTE module, as the
-  outcome of GSoC 2014 project.
-  The project also includes several sub-features, such as:
-   - implementation of Downlink Power Control
-   - implementation of Uplink Power Control
-   - new DL-CQI generation approach, which increases throughput if FR algorithms
-     are used
-   - seven options of Frequency Reuse algorithms: LteFrNoOpAlgorithm,
-     LteFrHardAlgorithm, LteFrStrictAlgorithm, LteFrSoftAlgorithm,
-     LteFfrSoftAlgorithm, LteFfrEnhancedAlgorithm, LteFfrDistributedAlgorithm
-   - updated RadioEnvironmentMapHelper. Now RadioEnvironmentMap can be generated
-     for Data or Control channel and for specified RbId, what is helpful when
-     using FR algorithms
-- Added a CoDel queue model.  CoDel queues measure and control the queue
-  traversal delay.  The ns-3 implementation is a port of the Linux
-  implementation.
-- Added support for TCP timestamp and window scale options, and added
-  ability to trace the TCP slow start threshold value.
-- SimpleNetDevice and SimpleChannel (used for adding basic link effects
-  for testing of higher-layer protocols) have been extended to support
-  the option of broadcast or PointToPoint link semantics.  The bandwidth
-  and link delay can be constrained, and it uses an output queue.
-- SimpleNetDevice and SimpleChannel can be installed in a node through
-  a new helper: SimpleNetDeviceHelper.
-- Implemented new PacketSocketServer and PacketSocketClient applications.
-  The primary use is in tests, to avoid using the ones from the
-  application module that also bring in a dependency on the internet module.
-
-Bugs fixed
-----------
-
-- Bug 1673 - Config::Set/Connect does not search for attributes in parent class
-- Bug 1762 - UE stuck in IDLE_CONNECTING because RRC CONN REQ is not transmitted
-- Bug 1811 - basic traffic generator for network module
-- Bug 1824 - L4 protocol sockets should support BindToNetDevice over IPv6
-- Bug 1831 - TcpSocket SlowStartThreshold is not a TraceSource
-- Bug 1851 - WifiRadioEnergyModel energy consumption values are taken from a 802.15.4 chip
-- Bug 1854 - std::out_of_range Problem
-- Bug 1858 - wireless examples not correctly recording packet reception
-- Bug 1860 - TCP needs the Window Scale option
-- Bug 1893 - issue in DoSchedUlTriggerReq with harq
-- Bug 1911 - AODV cannot work on nodes with more than one netdevice
-- Bug 1921 - Icmpv6L4Protocol::ForgeEchoRequest returns a malformed packet
-- Bug 1930 - Use of invalid reference in OLSR RemoveLinkTuple
-- Bug 1932 - NdiscCache entry is not failsafe on double neighbor probing.
-- Bug 1937 - FlowMonitor fails to track multiplexed packets
-- Bug 1942 - refactoring of lte-sinr-chunk-processor -> lte-chunk-processor
-- Bug 1943 - Waveform generator signal duration calc error
-- Bug 1951 - AODV does not update nexthop for 1-hop nodes
-- Bug 1955 - The IPv4 identification field should be unique per (source, destination, protocol) tuple
-- Bug 1960 - Wrong information on index range, about Node::GetDevice
-- Bug 1961 - planetlab-tap-creator "variable set but not used"
-- Bug 1963 - AODV can tag the same packet twice (and raise an assert)
-- Bug 1964 - Integer overflow on UniformRandomVariable::GetInteger()
-- Bug 1967 - LL Multicast is not compressed in the right way in IPHC
-- Bug 1981 - PyViz shell not compatible with ipython >= 0.11
-
-Known issues
-------------
-- Bug 1770 - The mesh module will crash if used for g++ version >= 4.8.1
-in optimized mode, on a 32-bit Linux machine.  Lowering the optimization
-level to -O1 in this case can be used as a workaround.
-
-Release 3.20
-=============
-
-Availability
-------------
-This release is available from:
-http://www.nsnam.org/release/ns-allinone-3.20.tar.bz2
-
-Supported platforms
--------------------
-- Fedora Core 20 (32/64 bit) with g++-4.8.2
-- Ubuntu 14.04 (32/64 bit) with g++-4.8.2
-- Ubuntu 12.04.4 (64 bit) with g++-4.6.3
-- Ubuntu 10.04.4 LTS (64 bit) with g++-4.4.3
-- CentOS/RHEL 6.5 (64-bit) with g++-4.4.7
-- OS X Mavericks 10.9 with Xcode 5.1.1 and clang-503.0.40
-- FreeBSD 9.2-RELEASE (64 bit) with clang-3.3
-
-New user-visible features
--------------------------
-
-- A new LrWpan model, providing initial support for IEEE 802.15.4 networks
-- A new IPv6 routing protocol has been added: RIPng. This protocol is
-  an Interior Gateway Protocol and it is available in the Internet module.
-- A new LTE MAC downlink scheduling algorithm named Channel and QoS Aware (CQA)
-  Scheduler is provided by the new ``ns3::CqaFfMacScheduler`` object.
-- The Internet FlowMonitor can now track IPv6 packets.
-- FlowMonitor no longer tracks multicast/broadcast packets, reflecting
-  its original design.
-- FlowMonitor "SerializeToXml" functions are now directly available
-  from the helper.
-- The SixLowPan model can now use uncompressed IPv6 headers. An option to
-  define the minimum compressed packet size has been added.
-- Simplify output of Times in a specific unit; see Time::As ()
-- Ipv6Extension::m_dropTrace has been removed. Ipv6L3Protocol::m_dropTrace
-  is now fired when appropriate.
-- IPv4 identification field value is now dependent on the protocol field.
-- Fixes to support Python >= 3.3 in ns3 Python bindings
-- Enable selection of high precision int64x64_t implementation
-  at configure time, for debugging purposes.
-
-Bugs fixed
-----------
-- Bug 1276 - optimize NistErrorRateModel
-- Bug 1294 - New PeekU8 () and Read (Buffer::Iterator start, uint32_t size) methods in Buffer::Iterator
-- Bug 1443 - MinDistance replaced by MinLoss in FriisPropagationLossModel, to
-  better handle conditions outside of the assumed far field region.
-- Bug 1653 - Extension of CommandLine interface: restored operator << (CommandLine)
-- Bug 1717 - Detect unsettable attributes
-- Bug 1730 - no model library documentation for spectrum module
-- Bug 1739 - The endpoint is not deallocated for UDP sockets
-- Bug 1786 - os << int64x64_t prints un-normalized fractional values
-- Bug 1787 - Runtime error when using AnimationInterface::EnablePacketMetadata() to fetch metadata of CSMA packet
-- Bug 1792 - Parameter logger constructor
-- Bug 1808 - FlowMon relies on IPv4's Identification field to trace packets
-- Bug 1817 - IPv4 Identification field should consider protocol as well.
-- Bug 1818 - FlowMonitor needs IPv6 support
-- Bug 1820 - models library doc: make should not rm -rf figures
-- Bug 1821 - Setting an interface to Down state will cause various asserts in IPv6
-- Bug 1829 - Multiple TCP socket entries
-- Bug 1837 - AODV crashes when using multiple interfaces
-- Bug 1838 - FlowMonitorHelper must not be copied.
-- Bug 1841 - FlowMonitor fails to install if IPv4 is not installed in the node
-- Bug 1842 - FlowMonitor SerializeToXml<Something> should be called by the helper
-- Bug 1843 - IPv6 extensions dropped packets do not fire L3 drop trace
-- Bug 1845 - FlowMonitor should discard any broadcast/multicast packet
-- Bug 1846 - IPv6 should send Destination Unreachable if no route is available
-- Bug 1850 - TCP NewReno loss behavior
-- Bug 1852 - cairo-wideint-private.h error cannot find definitions for fixed-width integral types
-- Bug 1853 - NS_LOG_FUNCTION broken on OSX 10.9
-- Bug 1855 - SixLowPanNetDevice is not correctly indexed
-- Bug 1857 - Detect location of installed boost libraries
-- Bug 1862 - NS_LOG="Time=*|prefix_time" causes stack overflow
-- Bug 1868 - Optimized builds are sensitive to -fstrict-overflow
-- Bug 1870 - Remove unnecessary AsInt functions
-- Bug 1872 - Inside RREQ processing, in case of IP duplication, packet dropped instead of being forwarded
-- Bug 1873 - Energy source checked to be aggregated to the node
-- Bug 1874 - Ipv4L3Protocol::ProcessFragment: addressCombination and idProto identifiers not properly computed
-- Bug 1876 - enable OLSR HNA table access
-- Bug 1877 - constructors missing for PropagationLossModels
-- Bug 1882 - int64x64 tests trigger valgrind bug
-- Bug 1883 - IPv6 don't consider the prefix and network when choosing output address
-- Bug 1885 - WifiSpectrumValue5MhzFactory::CreateRfFilter does not align with the used 5Mhz SpectrumModel
-- Bug 1887 - Point-to-point traces should contain PPP headers
-- Bug 1888 - COST231 propagation loss model: corrections
-- Bug 1889 - PointToPointNetDevice: In some cases MacTxDrop trace is not called
-- Bug 1890 - UdpClientTrace: MPEG frame size is squeezed into (insufficient) 16 bit integer
-- Bug 1891 - UdpSocketImpl::GetSockName doesn't return the IPv6 address
-- Bug 1894 - CqaFfMacScheduler needs an update
-- Bug 1895 - IP header Source Address changed while forwarding RREQ
-- Bug 1900 - Avoid floating point differences across platforms in test outputs
-- Bug 1903 - Namespace usage in olsr-state.cc/h
-- Bug 1907 - Add IsSupportedMcs method in YansWifiPhy
-- Bug 1912 - Avoid multiple Wifi MacTxMiddle instances
-- Bug 1913 - Avoid crash in Wifi BlockAckManager::GetNextPacket()
-- Bug 1915 - BRITE channel delay is rounded to an integer
-- Bug 1916 - RandomWalk2dMobilityMode default "Bounds" attribute is not a rectangle
-- Bug 1919 - Strip trailing semi-colons from mobility trace files
-- Bug 1920 - Remove DSR attributes so file can be re-loaded by config-store
-- Bug 1922 - WAVE GetSsid should not be fatal
-- Bug 1923 - Setting Active Probing to false in Wifi Sta has no effect
-- Bug 1924 - sensing radius and CCA
-
-Known issues
-------------
-- Bug 1770 - The mesh module will crash if used for g++ version >= 4.8.1
-in optimized mode, on a 32-bit Linux machine.  Lowering the optimization
-level to -O1 in this case can be used as a workaround.
-
-Release 3.19
-=============
-
-Availability
-------------
-This release is available from:
-http://www.nsnam.org/release/ns-allinone-3.19.tar.bz2
-
-Supported platforms
--------------------
-These platforms have been tested; others may work also:
-- Fedora Core 20 (32 bit) with g++-4.8.2
-- Fedora Core 19 (32/64 bit) with g++-4.8.1
-- Ubuntu 13.10 (64 bit) with g++-4.8.1
-- Ubuntu 12.04.3 (32/64 bit) with g++-4.6.3
-- Ubuntu 10.04.4 LTS (64 bit) with g++-4.4.3
-- OS X Mavericks 10.9 with Xcode 5.0.1 and clang-500.2.79
-- OS X Mountain Lion 10.8.5 with Xcode 5 and g++-4.2.1
-- FreeBSD 9.2-RELEASE (64 bit) with clang-3.3
-
-New user-visible features
--------------------------
-- Extension to UE measurements and improved handover algorithm models in LTE
-  module, as the outcome of GSoC 2013 project. The project also includes several
-  sub-features, such as:
-   - implementation of System Information Block Type 1 (SIB1);
-   - a new option for automatic UE attachment using Idle mode cell selection
-     procedure;
-   - improved configurability of UE measurements; and
-   - two options of handover algorithms for enabling automatic handover trigger
-     in LTE simulation: A2-A4-RSRQ and strongest cell (A3-RSRP).
-
-- A new FixedRoomPositionAllocator has been added to the buildings
-  module. It allows one to generate a random position uniformly
-  distributed in the volume of a chosen room inside a chosen building.
-
-- A new attribute ns3::LteRlcAm::TxOpportunityForRetxAlwaysBigEnough
-  allows to overcome the lack for re-segmentation in the RLC AM
-  implementation by assuming that the size of a TxOpportunity is
-  always big enough for the RLC AM PDU to be retransmitted.
-
-- After some profiling, the code of LteMiErrorModel has been optimized
-  for speed, resulting in a significantly lower execution time of the
-  LTE model when used with the error model enabled.
-
-- A new WiFi extension for vehicular simulation support is available in
-  the src/wave directory.  The current code represents an interim capability
-  to realize an IEEE 802.11p-compliant device, but without the WAVE
-  extensions (which are planned for a later patch).  The WaveNetDevice
-  modelled herein enforces that a WAVE-compliant physical layer (at 5.9 GHz)
-  is selected, and does not require any association between devices (similar
-  to an adhoc WiFi MAC), but is otherwise similar (at this time) to a
-  WifiNetDevice.  WAVE capabililties of switching between control and
-  service channels, or using multiple radios, are not yet modelled.
-
-- A new IPv6 over Low power Wireless Personal Area Networks (6LoWPAN) model
-  is available.  Using ns-3's naming convention, the acronym is expanded
-  to SixLowPanNetDevice.   The SixLowPanNetDevice is able to act as a
-  shim between IPv6 and a NetDevice, compressing IPv6 headers according
-  to RFCs 4944 and 6262.  The SixLowPanNetDevice is meant to be used over
-  IEEE 802.15.4 NetDevices, but it can be used on other NetDevices as
-  well (see the manual for full details).  This model precedes the
-  general availability of an 802.15.4 model, so must be run in conjunction
-  with a wired NetDevice model for now, or with experimental versions of
-  802.15.4 models.
-
-- It is now possible to use Ipv6PacketInfoTag from UDP applications in the
-  same way as with Ipv4PacketInfoTag. See Doxygen for current limitations in
-  using Ipv[4,6]PacketInfoTag to set IP properties.
-
-- Ipv[4,6]Interfaces not respecting the minimum MTU requirements (68 octects
-  for IPv4 and 1280 octects for IPv6) will be automatically set as Down.
-
-- IPv6 addresses and routing tables are printed in a more conventional way,
-  closely matching the Linux "route -A inet6" command.
-
-- Additional time units (Year, Day, Hour, Minute) were added to the time
-  value class that represents simulation time; the largest unit prior to
-  this addition was Second.
-
-- A new parallel scheduling algorithm based on null messages, a common
-  parallel DES scheduling algorithm, has been added.  The null message
-  scheduler has better scaling properties when running on some scenarios
-  with large numbers of nodes since it does not require a global
-  communication.
-
-Bugs fixed
-----------
-- Bug 1496 - Option to print log level in NS_LOG messages, and documentation.
-- Bug 1592 - Parsing bug in FlowMonitor example script
-- Bug 1756 - RLC AM Mode State Variable Bug
-- Bug 1763 - Message 3 should be sent using the UL GRANT in the RAR
-- Bug 1778 - Implement TapBridge::IsLinkUp() function
-- Bug 1777 - Implement the more direct way of "using" configuration of existing tap interface
-- Bug 1776 - Improve CRC performance for CsmaNetDevice in emulation modes
-- Bug 1788 - unused private field warning
-- Bug 1789 - missing test condition for sigma in buildings-shadowing-test
-- Bug 1796 - Ipv6PacketInfoTag is not filled by UdpSocketImpl::ForwardUp6
-- Bug 1798 - Changing the rate of onOffApplication might stop transmission
-- Bug 1802 - FlowMon header deserialization problem with IPv4 fragments
-- Bug 1803 - Lookup /NodeList/4/DeviceList/0/LteEnbRrc/UeMap/0 got no matches
-- Bug 1807 - Multiple bugs in Ipv4L3Protocol::LocalDeliver
-- Bug 1810 - IP packets can be sent on NetDevices not respecting the minimum MTU requirements
-- Bug 1814 - IPv6 Packet with length not multiple of 8 bytes are fragmented incorrectly.
-- Bug 1815 - Python bindings compilation with clang compiler toolchain
-- Bug 1816 - IPv4 fragmentation loses Packet tags
-- Bug 1877 - constructor missing for <something>PropagationLossModels
-
-Release 3.18.2
-==============
-
-ns-allinone-3.18.2 was released to include a bake configuration file update
-for Direct Code Execution.  The ns-3 code in this release was unchanged
-from that of ns-3.18.1.
-
-Release 3.18.1
-==============
-
-This release is mainly to provide updated compiler support (clang/LLVM)
-and fix the Python API scanning facility.  A few additional bug fixes
-and new features are described below.
-
-Availability
-------------
-This release is available from:
-http://www.nsnam.org/release/ns-allinone-3.18.1.tar.bz2
-
-Supported platforms
--------------------
-These platforms have been tested; others may work also:
-- Fedora Core 19 (32/64 bit) with g++-4.8.1
-- Ubuntu 13.10 (64 bit) with g++-4.8.1
-- Ubuntu 12.04.3 (32/64 bit) with g++-4.6.3
-- Ubuntu 10.04.4 LTS (64 bit) with g++-4.4.3
-- OS X Mavericks 10.9 with Xcode 5.0.1 and clang-500.2.79
-- OS X Mountain Lion 10.8.5 with Xcode 5 and g++-4.2.1
-- FreeBSD 9.2-RELEASE (64 bit) with clang-3.3
-
-New user-visible features
--------------------------
-- It is now possible to randomize the time of the first beacon from an
-  access point.  Use an attribute "EnableBeaconJitter" to enable/disable
-  this feature.
-- A new FixedRoomPositionAllocator helper class is available; it
-  allows one to generate a random position uniformly distributed in the
-  volume of a chosen room inside a chosen building.
-- Logging wildcards:  allow "***" as synonym for "*=**" to turn on all logging.
-- The log component list ("NS_LOG=print-list") is now printed alphabetically.
-
-Bugs fixed
-----------
-- Bug 1779 - NS_UNUSED_GLOBAL not working in attribute test class declaration
-- Bug 1766 - Fixes to wifi-hidden-terminal.cc example
-- Bug 1722 - Avoid transmitting beacons concurrently
-- Bug 1691 - RTS/CTS NAV reset prematurely
-- Bug 1622 - Avoid waf hanging during apiscan
-- Bug 1616 - WifiPhyStateHelper reports false CCA_BUSY times at State trace source
-- Bug 1552 - Storing log name inside LogComponent class (NS_LOG) as std::string
-- Bug 1011 - assert failed. file=../src/devices/wifi/dcf-manager.cc
-- bug 945 - remove deprecated IEEE 802.11p code from wifi module
-- Fix aliasing bug in optimized static builds
-- Fix memory leak due to circular reference in MPI module
-- Make wifi tests more robust to random variable perturbations
-- Fix Time class doxygen
-- Fix compilation with Clang 3.2 and newer versions, including Apple Xcode 5
-- Miscellaneous NetAnim fixes
-
-Release 3.18
-=============
-
-Availability
-------------
-This release is available from:
-http://www.nsnam.org/release/ns-allinone-3.18.tar.bz2
-
-Supported platforms
--------------------
-These platforms have been tested; others may work also:
-- Fedora Core 18 (32/64 bit) with g++-4.7.2
-- Fedora Core 17 (32/64 bit) with g++-4.7.0
-- Ubuntu 13.04 (32/64 bit) with g++-4.7.3
-- Ubuntu 12.04 (32/64 bit) with g++-4.6.3
-- Ubuntu 10.04.4 LTS (64 bit) with g++-4.4.3
-- OS X Mountain Lion 10.8.3 with g++-4.2.1
-- FreeBSD 9.1-RELEASE (64 bit) with g++-4.2.1
-
-New user-visible features
--------------------------
-- Time attributes can now be bounded.  See attribute-test-suite.cc for an
-  example.
-- Data collection components have been added to the stats module.  These
-  components can be used to generate time series data in files and plots.
-- IPv6 address class 2001:db8::/32 is now dropped by routers (RFC 3849).
-- New generic hash function interface.  Two hash functions are provided:
-  murmur3 (default), and the venerable FNV1a.  See the Hash Functions
-  section in the Manual.
-- New Mac16Address has been added, Mac64Address is now in-line with
-  Mac48Address and all the three can be used in IPv6 autoconfigure.
-- Previously, the use of Building models was limited to the use of the
-  companion BuildingsMobilityModel. Now, any MobilityModel can be
-  used with Building models.
-- The latest LTE module code by the LENA project has been merged,
-  including the following new features:
-   - PHY support for UE measurements (RSRP and RSRQ)
-   - RRC support for UE measurements (configuration, execution, reporting)
-   - Automatic Handover trigger based on RRC UE measurement reports
-- IPv6 can now detect and use Path-MTU. See
-  examples/ipv6/fragmentation-ipv6-two-MTU.cc for an example.
-- Radvd application have a new Helper. See the updated
-  examples/ipv6/radvd.cc for an example.
-- 11n- It is now possible to create a high throughput (HT) node that used the new 11n data rates and preambles.
-- It is now possible to request printing command line arguments to the
-  desired output stream using PrintHelp or operator <<
-
-Bugs fixed
-----------
-- Bug  760 - IP address removal can be painful
-- Bug 1190 - Suppress hello if bcast was sent within the last hello interval
-- Bug 1296 - Enhancement in Ipv[4,6]RoutingHelper
-- Bug 1390 - ICMPv6 Redirect are handled correctly only for /64 networks
-- Bug 1522 - Hidden node scenario leads to ARP failure
-- Bug 1584 - Old Association Request Timeouts are not canceled
-- Bug 1629 - Make AODV Default to Disable Hello
-- Bug 1643 - NdiscCache creation and existence checks
-- Bug 1646 - ICMPv6 Redirect are sent from global address instead of link-local
-- Bug 1662 - m_type not set for Ipv6OptionRouterAlertHeader
-- Bug 1678 - C++11 compliance problem with std::pair"
-- Bug 1682 - ./waf crashes on FC10
-- Bug 1683 - IPv6 autoconfigured don't use *infinite* lifetimes
-- Bug 1669 - ns-3 should support binding two and three (possibly more) arguments
-- Bug 1675 - Throughput computation error in Wireless examples
-- Bug 1687 - wscript features report doesn't respect NOCOLOR
-- Bug 1688 - Routers should advertise themselves from the link-local address
-- Bug 1689 - IPv6 shouldn't add a default gateway without checking the Router lifetime
-- Bug 1690 - missing header files from wifi wscript
-- Bug 1697 - ICMPv6 Redirect trigger contains multiple bugs
-- Bug 1698 - mobility.SetPositionAllocator misses prefix "ns3::"
-- Bug 1700 - Ipv6RawSocket does not honor the bound address when sending packets
-- Bug 1701 - Ipv6StaticRouting: the source address should match the destination scope
-- Bug 1702 - Ipv6InterfaceContainer::SetRouter should not always add the router as the default router.
-- Bug 1703 - Nodes don't react to a DAD
-- Bug 1712 - The IP (v4 and v6) forwarding needs a test
-- Bug 1718 - Ipv4StaticRouting log component is misspelled
-- Bug 1720 - IPv6 Fragmentation cause crashes
-- Bug 1721 - Path MTU isn't handled properly
-- Bug 1723 - name clash in ipv4-header.h with <termios.h>
-- Bug 1727 - Ping6 should use a proper source address
-- Bug 1728 - Radvd application is missing an Helper
-- Bug 1731 - lte-phy-error-model passes unexpectedly
-- Bug 1738 - strict aliasing compiler bug
-- Bug 1742 - IPv6 HbH and Dst Extension Header size is not correctly calculated
-- Bug 1752 - RadvdInterface m_defaultLifeTime is set to milliseconds instead of seconds
-- Bug 1753 - Halting Issue with DistributedSimulatorImpl
-- Bug 1754 - Missing GIL lock in generated callback destructor
-
-Known issues
-------------
-In general, known issues are tracked on the project tracker available
-at http://www.nsnam.org/bugzilla/
-
-Release 3.17
-============
-
-Availability
-------------
-This release is available from:
-http://www.nsnam.org/release/ns-allinone-3.17.tar.bz2
-
-Supported platforms
--------------------
-These platforms have been tested; others may work also:
-- Fedora Core 18 (32/64 bit) with g++-4.7.2
-- Fedora Core 17 (32/64 bit) with g++-4.7.0
-- Ubuntu 13.04 (32/64 bit) with g++-4.7.3
-- Ubuntu 12.10 (32/64 bit) with g++-4.6.3
-- Ubuntu 12.04 (32/64 bit) with g++-4.6.3
-- Ubuntu 10.04.4 LTS (64 bit) with g++-4.4.3
-- OS X Mountain Lion 10.8.3 with g++-4.2.1
-- FreeBSD 9.1-RELEASE (64 bit) with g++-4.2.1
-
-New user-visible features
--------------------------
-- new TCP Westwood and Westwood+ models
-- new FdNetDevice model and associated helpers.  The FdNetDevice is able
-  to read and write from a file descriptor.  Various helpers are provided
-  to associate this descriptor with underlying devices or sockets on the
-  host operating system, including a packet socket for emulation, and
-  tap devices including a version specialized for use on PlanetLab.
-- ns-3-click: it's now possible to (i) have Click pull random numbers from
-  ns-3 and (ii) have ns-3 set "defines" in Click via the simulation file
-  (see src/click/examples/nsclick-defines.cc).
-- Waf shipped with ns-3 has been upgraded to version 1.7.10 and custom
-  pkg-config generator has been replaced by Waf's builtin tool.
-- create-module.py script has been updated to work with waf 1.7 and support
-  for creating modules with names containing dashes has been added.
-- the M5 release of the LTE module by the LENA project has been
-  merged; please see src/lte/RELEASE_NOTES for more detailed info
-
-Bugs fixed
-----------
-- bug 1256 - Unnecessary SND.NXT advance, missing ACK for Out of Order segments
-- bug 1318 - Ipv6L3Protocol::LocalDeliver can get stuck in an infinite loop
-- bug 1409 - Add an attribute "SystemId" to configure the ID for MPI
-- bug 1421 - Frequency dependent propagation loss models need uniform Frequency / Lambda attribute
-- bug 1434 - DSR throughput not comparable to other protocols for manet example
-- bug 1502 - Shutdown on tcp socket seems to misbehave
-- bug 1503 - BlockAckManager infine loop
-- bug 1517 - Waf clean/distclean doesn't remove the doc/html directory
-- bug 1540 - Waf not finding click libraries
-- bug 1549 - Test for NS_LOG
-- bug 1556 - Uses of htonl making OpenFlow's match field error
-- bug 1563 - Reduce valgrind test scope
-- bug 1564 - Packet meta data isn't shown in dumbbell-animation.xml
-- bug 1566 - WiFi SNR tag improvements
-- bug 1568 - Deserialized addresses are implicitly marked as Mac48Address
-- bug 1569 - droptail_vs_red example doesn't run
-- bug 1570 - Valgrind errors in new test examples
-- bug 1574 - Node color overwritten, by mobility updates in netanim
-- bug 1575 - Invert the y-axis in netanim
-- bug 1576 - Frequency units HERTZ and MEGAHERTZ mix up
-- bug 1577 - Typo in ascii picture in example aodv script
-- bug 1579 - edca-txop-n fragmentation causes segfault
-- bug 1582 - IPv6 raw socket return value is not like Linux socket
-- bug 1585 - Length field of A-MSDU subframe header endianness
-- bug 1586 - Building documentation fails if make runs in parallel
-- bug 1588 - UdpEchoServer::HandleRead logs fail when using Ipv6
-- bug 1589 - Bake - support pre-2.7 version of python
-- bug 1590 - Bake - more autotools version support
-- bug 1595 - Function declarations without implementations cause problems with dsr module's python bindings
-- bug 1596 - Inet TopologyReader is skipping one link and duplicating another one
-- bug 1600 - Icmpv6OptionLinkLayerAddress can only carry 48 bit addresses correctly
-- bug 1601 - RttEstimator doesn't set the m_currentEstimatedRtt to m_initialEstimatedRtt on creation
-- bug 1602 - waf build can break due to file collisions in higher-level directory
-- bug 1603 - random-variable-stream-helper - this unavalable for static member functions
-- bug 1607 - OnOffApplication over TCP with IPv6 support
-- bug 1608 - DSR Network ACK is not handled correctly
-- bug 1609 - Route Request table is needed
-- bug 1612 - pyviz (visualizer) will not be installed
-- bug 1613 - Can't build ns-3-dev with g++ 4.7.2
-- bug 1615 - Adjusting OLSR HelloInterval Attribute results in no links
-- bug 1618 - bake.py not detecting install of libxml2-dev on ubuntu
-- bug 1623 - pybindgen rev809 is not able to build after Ubuntu 1210
-- bug 1625 - ns-3-dev fails to build on Debian wheezy amd64
-- bug 1626 - ipv6-only network can't use UDP or TCP
-- bug 1632 - Prepend bake build directory to the guessed locations
-             that waf will look to find libraries
-- bug 1633 - Bake - should not report that it is downloading qt4 when it is already installed
-- bug 1635 - Small bug without Simulator::Destroy()
-- bug 1636 - Compilation error flagged as unmet dependency
-- bug 1637 - Bake calling apt-get for unpriviledged user
-- bug 1639 - bake.py support for linux mint
-- bug 1640 - bake needs to test for g++
-- bug 1641 - bake reports autotools dependency, but needs automake
-- bug 1661 - Variable ub1 defined but not used in ipv6-address.cc
-
-Known issues
-------------
-In general, known issues are tracked on the project tracker available
-at http://www.nsnam.org/bugzilla/
-
-Release 3.16
-============
-
-Availability
-------------
-This release is available from:
-http://www.nsnam.org/release/ns-allinone-3.16.tar.bz2
-
-Supported platforms
--------------------
-- Fedora Core 17 (32/64 bit) with g++-4.7.0
-- Fedora Core 15 (64 bit) with g++-4.6.3
-- Ubuntu 12.10 (32/64 bit) with g++-4.6.3
-- Ubuntu 12.04 (32/64 bit) with g++-4.6.3
-- Ubuntu 10.04.4 LTS (64 bit) with g++-4.4.3
-- OS X Mountain Lion 10.8.3 with g++-4.2.1
-- FreeBSD 8.2 (32 bit) with g++-4.2.1
-- Cygwin 1.7.9-1 with g++-4.5.3
-
-New user-visible features
--------------------------
-- Support several new LTE MAC schedulers developed in GSoC 2012 project.
-  Those schedulers include FD-MT, TD-MT, TTA, FD-BET, TD-BET, FD-TBFQ,
-  TD-TBFQ, PSS. Here, FD and TD mean frequency domain and time domain
-  respectively.
-- It's now possible to use distcc when building ns-3 by using
-  $ CXX='distcc g++' ./waf configure
-  $ ./waf build
-- Support topology generation with the (external) BRITE topology generation
-  tool
-
-Bugs fixed
-----------
-- bug  555 - DCF immediate access
-- bug  976 - wifi-wired-bridging regression test fails because of
-             rounding errors in mobility model
-- bug 1055:  Wrong UAN's Thorp absorption loss model formula
-- bug 1284 - ./test.py performance tests do not exist
-- bug 1324 - ns3tcp-cwnd-test-suite.cc test failing
-- bug 1340 - ns3tcp-loss-suite.cc tests failing
-- bug 1342 - ns3tcp-cwnd-test-suite.cc tests failing
-- bug 1345 - ns-3 builds with clang compiler >= 3.0
-- bug 1359 - TCP cannot receive ICMP
-- bug 1361 - Set TOS from Application level (sockets)
-- bug 1463 - ./test.py --example should automatically detect the path
-- bug 1479 - When the Ipv4RawSocket "IpHeaderInclude" Attribute set true,
-             Ip Checksum error
-- bug 1485 - Setting global properties in config file (raw text) does
-             not have any effect
-- bug 1493 - test.py --list should show the test type default tip
-- bug 1493 - test.py --list should show the test type
-- bug 1494 - test.py --constrain doesn't work
-- bug 1495 - test.py claims test passed when no test was run
-- bug 1506:  TCP data segment piggybacking acknowledgment
-- bug 1509 - RttEstimator returns invalid value in presence of errors
-- bug 1516 - GtkConfigStore does not show read-only attributes
-- bug 1520 - Config paths not fully documented (partial fix)
-- bug 1524 - Fragmentation Threshold equals to Packet Size at MAC Layer
-             (Data + IP + UDP) crash the reception
-- bug 1525 - Linker error with mpi on Mac 10.8
-- bug 1526:  Wrong calculation of pathloss within
-             UanPropModelThorp::GetPathLossDb
-- bug 1527 - Ipv4RawSocket's BindToNetDevice not working
-- bug 1528 - BindToNetDevice not working for IPv6 sockets
-- bug 1531 - Crash when using NS_LOG in destructors of static objects
-- bug 1532 - unimplemented LTE Scheduler methods
-
-Known issues
-------------
-In general, known issues are tracked on the project tracker available
-at http://www.nsnam.org/bugzilla/
-
-Release 3.15
-============
-
-Availability
-------------
-This release is available from:
-http://www.nsnam.org/release/ns-allinone-3.15.tar.bz2
-
-Supported platforms
--------------------
-- Fedora Core 17 (32/64 bit) with g++-4.7.0
-- Fedora Core 15 (64 bit) with g++-4.6.3
-- Ubuntu 12.04 (32/64 bit) with g++-4.6.3
-- Ubuntu 10.04.4 LTS (64 bit) with g++-4.4.3
-- OS X Mountain Lion 10.7.4 with g++-4.2.1
-- OS X Snow Leopard 10.6.8 with g++-4.2.1
-- FreeBSD 8.2 (32 bit) with g++-4.2.1
-- Cygwin 1.7.9-1 with g++-4.5.3
-
-New user-visible features
--------------------------
-- A new random variable base class called 'RandomVariableStream', has been
-  introduced.  This base class derives from ns3::Object, unlike the current
-  'RandomVariable' class which is a special type of object in the ns-3
-  system to date.  By making this class derive from ns3::Object, it can be
-  handled with the Ptr class, can carry attributes, and can have its parameters
-  and initial state saved in the config-store subsystem.  A new attribute
-  called "Stream" has been introduced for this class, to allow users to
-  better control the assignment of underlying pseudo-random sequences to
-  the RandomVariableStream objects (bug 101).
-
-Bugs fixed
-----------
- - bug 101 - random variable initialization
- - bug 1256 - Unnecessary SND.NXT advance, missing ACK for Out of Order segments
- - bug 1308 - Nix-vector; do not process packets to self
- - bug 1386 - assert if PositionAllocator not provided to
-              RandomWaypointMobilityModel
- - bug 1399 - TCP not backing off retransmissions properly
- - bug 1441 - IPv4 header length handling
- - bug 1464 - ConfigStore Save + Load => Could not set default value
-                  for ns3::UdpSocketImpl::IcmpCallback
- - bug 1470 - define default parameter for constructor in .h file
- - bug 1473 - GetQueue/SetQueue missing from Csma python bindings
- - bug 1475 - "test.py --list" should sort the output
- - bug 1476 - TestCase::GetName () should not be private
- - bug 1477 - Click doesn't work with raw sockets
- - bug 1481 - Openflow example doesn't run
- - bug 1486 - Segfaults in nix-vector-routing with bridges
- - bug 1489 - Jakes Log component is missing
- - fixed bug with multiple LCs in UL BSR
- - fixed bug with lena-dual-stripe crashes with --homeUesHomeEnbRatio=2
-
-Known issues
-------------
-In general, known issues are tracked on the project tracker available
-at http://www.nsnam.org/bugzilla/
-
-Release 3.14.1
-==============
-
-Availability
-------------
-This release is available from:
-http://www.nsnam.org/release/ns-allinone-3.14.1.tar.bz2
-
-Bugs fixed
-----------
-This hotfix release contains a fix for the PyViz visualizer and makes it
-easier to add PyViz support to examples; otherwise it is the same as the
-ns-3.14 release.
-
-Release 3.14
-============
-
-Availability
-------------
-This release is available from:
-http://www.nsnam.org/release/ns-allinone-3.14.tar.bz2
-
-Supported platforms
--------------------
-ns-3.14 has been tested on the following platforms.  Not all features are
-available on all platforms; check the Installation page on the project wiki.
-
-- Fedora Core 17 (32/64 bit) with g++-4.7.0
-- Fedora Core 16 (32/64 bit) with g++-4.6.3
-- Fedora Core 15 (64 bit) with g++-4.6.3
-- Ubuntu 12.04 (32/64 bit) with g++-4.6.3
-- Ubuntu 11.10 (32 bit) with g++-4.6.1
-- Ubuntu 10.04.4 LTS (64 bit) with g++-4.4.3
-- OS X Lion 10.7.4 with g++-4.2.1
-- OS X Snow Leopard 10.6.8 with g++-4.2.1
-- FreeBSD 8.2 (32 bit) with g++-4.2.1
-- Cygwin 1.7.9-1 with g++-4.5.3
-
-New user-visible features
--------------------------
-- Transport protocol implementations (TCP, UDP) have been refactored to
-  support also IPv6 connections. Dual-stacked IPv6 sockets are implemented.
-  An IPv6 socket can accept an IPv4 connection, returning the sender's
-  address as an IPv4-mapped address (IPV6_V6ONLY socket option is not
-  implemented).
-- The LTE code from the LENA project has been merged, bringing in a
-  significant redesign of the LTE module as well as many new features.
-- An antenna module is now included, which includes different
-  radiation pattern models. See the corresponding new section of the
-  ns-3 models library documentation for details.
-- A new buildings module is introduced which allows to model the
-  presence of buildings in a wireless network topology.
-- New propagation models (OkumuraHata, ITU-R P.1411, ITU-R P.1238)
-  have been added
-- The Dynamic Source Routing (DSR) MANET routing protocol for IPv4 was added.
-- A Random Early Detection (RED) queue model has been added.
-- Ipv6RoutingHelper is now in-line with Ipv4RoutingHelper concerning the RT
-  print functions. Various minor changes were made in Ipv6RoutingProtocol and
-  derived classes to make this possible.
-- New "SendIcmpv6Redirect" attribute (and getter/setter functions) to
-  Ipv6L3Protocol. The behavior is similar to Linux's conf "send_redirects",
-  i.e., enable/disable the ICMPv6 Redirect sending.
-- Longer and more descriptive names are used for error units in RateErrorModel
-  class and queue mode in Queue class. Attributes in those classes are also
-  changed for consistency. See API documentation for details.
-- The netanim animator is now bundled with the release.
-
-Bugs fixed
-----------
- - bug 603 - Simulator::Next is useless
- - bug 631 - RealtimeSimulatorImpl does not handle Ctrl-C with python bindings
- - bug 962 - list of paths to reach objects contains bogus entries
- - bug 1000 - Make RealtimeSimulatorImpl last until stop
- - bug 1053 - Need better error diagnostics in ns2-mobility-trace example
- - bug 1109 - Point out the effects of ArpCache::PendingQueueSize
- - bug 1179 - Add LTE trace hooks for supporting visualizer
- - bug 1180 - LTE: Add TX/RX trace support
- - bug 1273 - Better error message on missing Python development files
- - bug 1282 - Sleep state and CCA
- - bug 1283 - PacketSocket::SendTo should return number of bytes
- - bug 1302 - Flow monitor bug
- - bug 1304 - Tag information changed after transmission
- - bug 1313 - Stddev (average.h) returning NaN
- - bug 1318 - Asserts for IPv6 malformed packets
- - bug 1319 - Fix Ipv6RawSocketImpl Icmpv6 filter
- - bug 1325 - Python examples get valgrind errors when build subdirectories
-              are specified in waf
- - bug 1339 - test.py uses the old name for the test runner
- - bug 1348 - python bindings: deprecated conversion from string constant
-              to â€˜char*â€™
- - bug 1349 - TypeId.LookupAttributeByName Python bindings missing
- - bug 1350 - Simulator.ScheduleWithContext Python binding missing
- - bug 1351 and 1333 - TCP not able to take RTT samples on long delay network
- - bug 1352 - Fixed MapAttributes, previously was mapped to a vector in
-              ObjectPtrContainer and (and key information was dropped).
-              Now the container is a map.
- - bug 1354 - Building scratch subdir programs is broken
- - bug 1355 - Visualizer dependencies not detected at buildtime
- - bug 1357 - IPv6 fragmentation fails due to checks about malformed extensions
- - bug 1362 - ICMPv6 does not forward ICMPs to upper layers (and minor
-              fixes to ICMPv6)
- - bug 1376 - wrong wind variable's name
- - bug 1378 - UdpEchoClient::SetFill () does not set packet size correctly
- - bug 1379 - lte-multiple-flows example crashes
- - bug 1380 - lte-phy-uplink example crashes
- - bug 1391 - .ns3rc does not allow comments as expected
- - bug 1392 - Modules built report does not clarify C++ or Python
- - bug 1393 - IPv6 Routing Helper RT Print functions
- - bug 1395 - AODV DeferredRouteOutputTag missing constructor
- - bug 1396 - ARP with hardware addresses longer than 6 bytes
- - bug 1399 - TCP not backing off retransmissions properly
- - bug 1404 - Bound user input in tutorial third.cc program
- - bug 1406 - waf exits with maximum recursion depth exceeded
- - bug 1415 - examples-to-run.py doesn't work with command line arguments
- - bug 1420 - no python bindings for csma-layout
- - bug 1441 - IPv4 header length handling
-
-Known issues
-------------
-In general, known issues are tracked on the project tracker available
-at http://www.nsnam.org/bugzilla/
-
-Release 3.13
-==============
-
-Availability
-------------
-This release is available from:
-http://www.nsnam.org/release/ns-allinone-3.13.tar.bz2
-
-Supported platforms
--------------------
-ns-3.13 has been tested on the following platforms.  Not all features are
-available on all platforms; check the Installation page on the project wiki.
-
-- Ubuntu 11.10 (32 bit) with g++-4.5.2
-- Ubuntu 11.04 (32/64 bit) with g++-4.5.2
-- Ubuntu 10.04.3 LTS (64 bit) with g++-4.4.3, g++-3.4.6
-- OS X Lion with g++-4.2.1
-- OS X Snow Leopard with g++-4.2.1
-- Fedora Core 16 (32/64 bit) with g++-4.6.2
-  --  however, g++-3.4.6 fails on Fedora 16 i686
-- Fedora Core 14 (64 bit) with g++-4.5.1
-- FreeBSD 9.0-RC1 (AMD64) with g++-4.2.1
-
-New user-visible features
--------------------------
-- IPv6 address generator with support for duplicate address detection
-
-Bugs fixed
-----------
- - bug 962 - list of paths to reach objects contains bogus entries
- - bug 1001 - Buffer::CopyData() doesn't return the number of bytes copied
- - bug 1010 - Uan model sleep patch
- - bug 1020 - Wrong usage of the originator sequence number in HWMP PREP
- - bug 1021 - Beacon collision avoidance in Mesh module works incorrectly
- - bug 1039 - Nagle's algorithm in TCP
- - bug 1055 - Wrong UAN's Thorp absorption loss model formula
- - bug 1059 - Unable to load trace files created from SUMO and TraNS Lite
- - bug 1112 - Advance m_nextTxSequence upon retransmit after RTO
- - bug 1137 - mpi module is hard-coded for openmpi
- - bug 1166 - IPV4 TCP failed to send a RST when connect arrives before listen
- - bug 1186 - Ipv4Header lacks DSCP and ECN
- - bug 1204 - Can't Parse Time +100000000.0ns
- - bug 1219 - Coding style of ns2-mobility-helper-test-suite.cc is fixed
- - bug 1257 - waf install __init__ Python files even with --disable-python
- - bug 1263 - waf configure fails on FreeBSD 9.0-BETA2 amd64
- - bug 1266 - gdb cannot be loaded
- - bug 1227 - Spurious RTO due to low min RTO
- - bug 1229 - Multiplication overflow in WaypointMobilityModel::EndMobility
- - bug 1242 - m_lastRtt in tcp-socket-base.cc not implemented
- - bug 1256 - TCP unnecessary snd.nxt advance
- - bug 1265 - Make ns-3 directory "movable"
- - bug 1269 - sqlite3 not found on FreeBSD
- - bug 1270 - "Checking boost includes" weirdness
- - bug 1278 - Ipv4ClickRouting::HandleScheduleFromClick bug
- - bug 1281 - Checksum not calculated when doing IP fragmentation
- - bug 1285 - IPv6 Localhost is marked as GLOBAL instead of HOST
- - bug 1290 - buffer-test.cc gets a valgrind error
- - bug 1295 - Missing const qualifiers in TopologyRead
- - bug 1299 - EnableAsciiIpv4All tracing doesn't show transmitted/recvd packets
- - bug 1300 - HalfDuplexIdealPhy notify SpectrumInterference of AbortRx
- - bug 1301 - Ns2MobilityHelper causes Node GetPosition() to return NaN
- - bug 1305 - do not list modules built upon exiting waf shell
- - bug 1312: TopologyRead Assert condition fix
- - IPv4 packets double fragmentation was broken
- - Fix wifi-clear-channel-cmu.cc example
- - NetAnim: fix for bcast packet reuse
- - Missing PropagationLossModel.CalcRxPower in Python bindings
- - Corrected compilation behavior in Ubuntu 11.10 due to ldd behavior change
- - Added required PTHREAD dependency to RT library check.
-
-Known issues
-------------
-In general, known issues are tracked on the project tracker available
-at http://www.nsnam.org/bugzilla/
-
-Release 3.12.1
-==============
-
-Availability
-------------
-This release is available from:
-http://www.nsnam.org/release/ns-allinone-3.12.1.tar.bz2
-
-Bugs fixed
-----------
-This release fixes PyViz visualizer's python bindings; otherwise, it
-is the same as the ns-3.12 release.
-
-Release 3.12
-===========
-
-Availability
-------------
-This release is available from:
-http://www.nsnam.org/release/ns-allinone-3.12.tar.bz2
-
-Supported platforms
--------------------
-ns-3.12 has been tested on the following platforms.  Not all features are
-available on all platforms; check the Installation page on the project wiki.
-
-- Fedora Core 15 (32/64 bit) with g++-4.6.0
-- Ubuntu 11.04 (32/64 bit) with g++-4.5.2
-- OS X Lion with g++-4.2.1
-- Fedora Core 14 (64 bit) with g++-4.3.4, g++-4.5.3, g++-4.4.6
-- Fedora Core 12 (64 bit) with g++-4.4.4
-- OS X Snow Leopard with g++-4.2.1
-- Ubuntu 10.04.3 LTS (64 bit) with g++-4.4.3, g++-3.4.6
-
-New user-visible features
--------------------------
-
-- SpectrumChannel models now support the usage of single-frequency
-  propagation loss models based on the PropagationLossModel
-  class. These model can be used in conjunction with
-  the frequency-dependent propagation loss model based on the
-  SpectrumPropagationLossModel class already supported by
-  SpectrumChannel.
-
-- Extend the attribute system extend the attribute system to store map
-  container objects in addition to vector containers.  The ObjectMap
-  and related classes are patterned after ObjectVector.
-
-- Support for IPv4 fragmentation has been added.
-
-- Significant performance improvement for AODV in dense mobile scenarios
-  due to a fixed bug in RERR processing.
-
-- WiFi traces that were named promiscuous are now renamed monitor, and
-  a separate flag for setting the interface to promiscuous mode has been
-  introduced.  This disambiguates monitor mode from promiscuous mode.
-
-- Monolithic Python bindings have been removed
-
-Bugs fixed
-----------
- - bug 845  - fix ConfigStore output for changing default values
- - bug 1010 - Uan model Sleep patch
- - bug 1033 - Mesh airtime-metric fixed
- - bug 1043 - lte-spectrum-value-helper.cc file swapped uplink/downlink freq.
- - bug 1050 - ISO C++ forbids variable length array; remove all instances
- - bug 1057 - LTE bearers differentiation issue
- - bug 1082 - Check that log component names are correct when taken from NS_LOG
- - bug 1100 - IPv6 fragmentation enhancements
- - bug 1102 - IPv4 header fragment offset field not set correctly
- - bug 1123 - class MinMaxAvgTotalCalculator does not implement all methods
- - bug 1134 - Fix LiIonEnergySource attribute spelling for InitialCellVoltage
- - bug 1139 - Broadcast packets issue in uan cw mac
- - bug 1141 - MeshWifiInterfaceMac adds supported modes to wrong remote station
- - bug 1163 - Ipv4EndPointDemux::AllocateEphemeralPort forget to increment port
- - bug 1164 - IPV4 TCP Bind already used port failed, but without setting errno
- - bug 1168 - BridgeNetDevice: default expiration time not realistic
- - bug 1174 - Ns-3 does not generate static libraries
- - bug 1175 - shared libraries are not versioned
- - bug 1193 - AODV Hello timers scheduling skewed when RREP, RREQ are processed
- - bug 1194 - AODV Incorrect RERR processing
- - bug 1201 - UDP sockets need to set connected state before notifying the ConnectionSucceeded callback
- - bug 1208 - Spectrum module example causing valgrind errors
- - bug 1209 - ns-3-click fails to build on Fedora 15 when tests are enabled
- - bug 1220 - FdReader always stops with NS_FATAL_ERROR
- - bug 1222 - Incomplete PointToPointNetDevice Python bindings
- - bug 1224 - ns-3-allinone fails to compile on OS X Lion
- - bug 1226 - Incomplete YansWifiChannel Python bindings
- - bug 1234 - GetAttributeChecker is not defined anymore but still used
- - bug 1239 - Add assertion that reference count never overflows
- - bug 1244 - Seg Faults in optimized builds due to missing Logging components
- - Fix ARP issue in nsclick-ip-router.click and static route in nsclick-routing-node2.click
-
-Known issues
-------------
-In general, known issues are tracked on the project tracker available
-at http://www.nsnam.org/bugzilla/
-
-Release 3.11
-===========
-
-Availability
-------------
-This release is available from:
-http://www.nsnam.org/release/ns-allinone-3.11.tar.bz2
-
-Supported platforms
--------------------
-ns-3.11 has been tested on the following platforms.  Not all features are
-available on all platforms; check the Installation page on the project wiki.
-
-- Linux x86_64 Ubuntu 11.04
-  - g++-4.5.2
-- Linux i686 Ubuntu 11.04
-  - g++-4.5.2, g++-4.4.5
-- Linux x86_64 Fedora Core 15
-  - g++-4.6.0
-- Linux x86_64 Fedora Core 14
-  - g++-4.5.3, g++-4.4.6, g++-4.3.4
-- Linux x86_64 Fedora Core 10
-  - g++-3.4.6, 4.0.4, 4.1.2, 4.2.4, 4.3.2, 4.4.0
-- OS X Snow Leopard
-  - g++-4.2.1
-
-New user-visible features
--------------------------
-
-  - The build system has been modularized, and the source code reorganized,
-    to allow for modular libraries instead of a single monolithic ns-3
-    library.   User programs now link a number of smaller, per-module
-    libraries depending on the dependencies expressed to the build system.
-    Source code is now being maintained in individual modules with
-    consistent directory structures.
-
-  - Python bindings have also been modularized, and the bindings are now
-    generated into a 'ns' namespace instead of 'ns3' for the old
-    (monolithic) bindings.  By default the bindings are now modular, with
-    a backward compatibility layer for older programs.
-
-  - By default, example and test programs are disabled from the build.
-    Users can enable them via the use of a waf command at configure time,
-    or automatically through the use of a new .ns3rc file.
-
-  - int64x64_t is a new type which allows portable and easy to write arithmetic
-    calculations that require a high degree of fractional precision.
-
-  - An interface to the Click Modular Router and an Ipv4ClickRouting
-    class has been added, to allow a node to use Click for external routing.
-
-  - An interface to an OpenFlow software implementation distribution has
-    been added to allow the simulation of OpenFlow switches in ns-3.
-
-  - ns-3 coding style requirements have been applied to the entire coding
-    base, resulting in a large number of whitespace changes.  The coding
-    style has been automatically enforced by running a style checking
-    program (utils/check-style.py) that uses the uncrustify (v. 0.58)
-    program to apply changes.
-
-  - Some documentation reorganization to split documentation between
-    the ns-3 manual (primarily focusing on the ns-3 core) and a new
-    "model library" document has been started.
-
-Bugs fixed
-----------
-The following lists many of the bugs fixed or small feature additions
-since ns-3.10, in many cases referencing the Bugzilla bug number.
-
-   - bugfix: CsmaNetDevice ErrorModel not discarding packet
-   - bugfix: do not call RouteOutput() twice
-   - Workaround gccxml bug scanning Seconds(0) as default value
-   - Copy a bug fix from ns3modulescan.py into ns3modulescan-modular.py
-   - Modular Python bindings work (many bug fixes, more modules tested)
-   - Modular bindings: bug fixes, more verbose scanning
-   - ./waf --apiscan: fix bug in detection of whether the per-module
-   - Remove the 'Modules to build' debug print
-   - CsmaNetDevice ReceiveErrorModel was not dropping the packet
-   - Several "set but not used" bugs for newer compilers quick-fixed
-
-   - bug 445 - Is the class name Scalar in nstime.h appropriate?
-   - bug 699 - TestCase::DoRun probably should not return a bool
-   - bug 823 - Need finer-grained control over what goes into libns3
-   - bug 957 - Issue with test.py
-   - bug 1017 - node --> internet-stack --> node
-   - bug 1018 - mobility --> helper --> mobility circular dependency
-   - bug 1019 - common --> node --> common circular dependency
-   - bug 1038 - Time::Get*Seconds () return signed integer while actually returning unsigned.
-   - bug 1040 - Olsr and multiple interfaces
-   - bug 1042 - AODV RERR implosion (missing RERR_RATELIMIT)
-   - bug 1044 - Seconds (1e-9) creates Time that is not IsPositive ()
-   - bug 1047 - Multicast routes on nodes with >16 interfaces
-   - bug 1048 - suggested MatrixPropagationLossModel::SetLoss() API change
-   - bug 1049 - Issues with OLSR HNA messages sent by multiple gateways
-   - bug 1052 - olsr::RoutingProtocol::LinkTupleUpdated incorrect detection of asymmetric link with multiple interface nodes
-   - bug 1054 - ipv6 InternetStackHelper EnablePcapIpv6All() broken
-   - bug 1056 - CSMA: padding not handled correctly for LLC encapsulation
-   - bug 1058 - InternetStackHelper pitfall: calling Install before adding routing protocols
-   - bug 1060 - Setting NqStaWifiMac Active Probing true, crashes simulation
-   - bug 1061 - Title level inconsistent in click.rst
-   - bug 1062 - rescale-pdf not working
-   - bug 1064 - Correct Friis propagation loss equation in spectrum module
-   - bug 1066 - Set Radiotap modulation type flags correctly
-   - bug 1069 - ApWifiMac unduly calls RegularWifiMac::Receive and crashes
-   - bug 1070 - csma/ipv6 examples duplicate NS_LOG_COMPONENT_DEFINE
-   - bug 1072 - crash upon call to Packet::AddAtEnd of fragmented packets
-   - bug 1075 - Python examples fail when static built is enabled
-   - bug 1076 - Waf gives an error if you enable only a single module
-   - bug 1078 - PacketTagList::Add performs NS_ASSERT counting one byte too few
-   - bug 1079 - MPI code doesn't compile
-   - bug 1081 - wutils.py refers to the old directory for visualizer module
-   - bug 1083 - scratch doesn't work when only some modules are enabled
-   - bug 1085 - Build failed: list index out of range
-   - bug 1086 - sanity check for not calling Object::Dispose () twice
-   - bug 1087 - Call MPI_Finalize to exit MPI environment
-   - bug 1088 - Code in scratch directory assumes all modules are enabled
-   - bug 1089 - lwip build issue
-   - bug 1090 - WifiMacQueue is not accessible through the attribute path
-   - bug 1092 - Problem building FreeBSD stack with g++ 4.5.2 (Ubuntu)
-   - bug 1094 - Object::GetObject upon dlopen
-   - bug 1097 - AODV routing entry set to be VALID mistakenly.
-   - bug 1098 - when to show users which modules are enabled?
-   - bug 1101 - Sqlite stats disappeared from configuration file src/wscript
-   - bug 1103 - Useless assignment in omnet-data-output.cc
-   - bug 1105 - Move topology helpers into separate per-device modules
-   - bug 1106 - Remove "CanvasLocation" dependencies in p2p helpers
-   - bug 1108 - test.py -e option needs repair
-   - bug 1110 - Sort alphabetically and display "Modules built" in columns
-   - bug 1117 - bindings failures on selected platforms
-   - bug 1122 - spectrum-value test should check tolerance on a per-value basis
-   - bug 1125 - ./waf --enable-modules fails
-   - bug 1131 - Bug in Ipv4L3Protocol::RemoveAddress()
-   - bug 1133 - DSDV: Possible bug in settling time calc
-   - bug 1142 - Wrong 802.11p Slot time
-   - bug 1146 - help string for test.py with disabled tests
-
-Known issues
-------------
-In general, known issues are tracked on the project tracker available
-at http://www.nsnam.org/bugzilla/
-
-Release 3.10
-===========
-
-Availability
-------------
-This release is available from:
-http://www.nsnam.org/release/ns-allinone-3.10.tar.bz2
-
-Supported platforms
--------------------
-ns-3.10 has been tested on the following platforms.  Not all features are
-available on all platforms; check the Installation page on the project wiki.
-
-- Linux i686 Ubuntu 10.10
-  - g++-4.4.5
-- Linux x86_64 Ubuntu 8.04.4
-  - g++-3.4.6, g++-4.2.4
-- Linux x86_64 Fedora Core 12
-  - g++-4.4.4
-- Linux x86_64 Fedora Core 10
-  - g++-3.4.6, 4.0.4, 4.1.2, 4.2.4, 4.3.4, 4.4.0
-- OS X Snow Leopard
-  - g++-4.2.1
-- OS X powerpc Leopard
-  - g++-4.0, g++-4.2
-
-New user-visible features
--------------------------
-
-   - NS-3 PyViz, a live simulation visualizer, has been added.  The
-     visualizer interacts with a running simulation, such that it uses no
-     trace files. It can be most useful for debugging purposes, i.e. to
-     figure out if mobility models are what you expect, where packets are
-     being dropped, etc. There is also a builtin interactive python console
-     that can be used to debug the state of the running objects. Although
-     it is mostly written in Python, it works both with Python and pure C++
-     simulations.
-
-   - Wi-Fi MAC high classes have been reorganised in attempt to
-     consolidate shared functionality into a single class. This new
-     class is RegularWifiMac, and it derives from the abstract
-     WifiMac, and is parent of AdhocWifiMac, StaWifiMac, ApWifiMac,
-     and MeshWifiInterfaceMac. The QoS and non-QoS class variants are
-     no longer, with a RegularWifiMac attribute "QosSupported"
-     allowing selection between these two modes of
-     operation.
-
-   - Support for IEEE 802.11g (specifically, rates with Modulation
-     Class ERP-OFDM) has been added to the wifi module. The new
-     WifiModes have names of the form ErpOfdmRatexxMbps, where xx is
-     the rate in Mbps (one of 6, 9, 12, 18, 24, 36, 48, 54), and a
-     WifiPhyStandard enumeration WIFI_PHY_STANDARD_80211g has been
-     added to allow configuration of a Wi-Fi STA supporting ERP-OFDM,
-     HR/DSSS, and DSSS rates (which some call an "802.11b/g" station).
-
-   - Two attributes were added to WaypointMobilityModel.  The first
-     "LazyNotify" (default false), if enabled to true, will suppress
-     course change notifications if there are no position updates.
-     The second, "InitialPositionIsWaypoint" (default false), if enabled,
-     will allow an initial call to SetPosition () (before any waypoints
-     have been added) to be treated as the first waypoint.
-
-   - Regression testing is now completely performed within test.py
-     rather than a separate "./waf --regression" that consults
-     reference traces in the ns-3.x-ref-traces directory.  In most
-     cases, the example programs whose traces were included in
-     ns-3.x-ref-traces have a corresponding test called from the
-     test.py program.  It is still possible to write trace-based
-     regression tests but they are now called from the test.py
-     program.
-
-   - New BulkSendApplication sends data as fast as possible up to
-     MaxBytes or unlimited if MaxBytes is zero.  Think OnOff, but
-     without the "off" and without the variable data rate. This
-     application only works with SOCK_STREAM and SOCK_SEQPACKET
-     sockets, for example TCP sockets and not UDP sockets.
-
-   - Extensions to the energy models:  1) a new Rakhmatov Vrudhula
-     non-linear battery model, 2) additional support for modeling
-     energy consumption in WiFi devices, 3) an example for how to add
-     energy models to a WiFi-based simulation (in examples/energy/
-     directory).
-
-   - New methods to print IPv4 routing tables to an output stream.
-
-   - A replacement implementation for TCP for IPv4.  TcpSocketBase
-     now replaces TcpSocketImpl.  There are subclasses defined for
-     TCP Tahoe, Reno, NewReno, and the original RFC793 without
-     congestion control.
-
-   - Energy support for UAN module and Li-Ion energy model.
-     Now each network node can have an associated energy source
-     from which it consumes energy. The user can specify a custom
-     energy model for the underwater transducer, with default values
-     set for WHOI acoustic transducer. Li-Ion battery model added
-     into energy models folder.
-
-   - Destination-Sequenced Distance Vector (DSDV) routing protocol
-     is a proactive, table-driven routing protocol for MANETs
-     developed by Charles E. Perkins and Pravin Bhagwat in 1994.
-     This implementation is for IPv4 routing and was contributed
-     by ResilNets Research Group.
-
-   - A novel model to simulate LTE networks has been added.  It focuses
-     mainly on modeling the E-UTRA part of the system, with a particular
-     attention on the aspects related to the channel, PHY and MAC layers.
-     The most important features available at this moment are (i) a basic
-     implementation of both the UE and the eNB devices, (ii) RRC and
-     entities for both the UE and the eNB, (iii) an Adaptive Modulation
-     and Coding (AMC) scheme for the downlink, (iv) the management of the
-     data radio bearers (with their QoS parameters), the MAC queues and
-     the RLC instances, (v) Channel Quality Indicator (CQI) management,
-     (vi) support for both uplink and downlik packet scheduling,
-     (vii) a PHY layer model with Resource Block level granularity, and
-     (viii) a channel model with the outdoor E-UTRAN propagation loss
-     model.
-
-   - Project documentation has been converted from GNU Texinfo to Sphinx.
-
-Bugs fixed
-----------
-The following lists many of the bugs fixed or small feature additions
-since ns-3.9, in many cases referencing the Bugzilla bug number
-
-   - bug 824 - TCP should implement FastRecovery by default
-   - bug 852 - Add support for 802.11g devices
-   - bug 892 - WaypointMobilityModel incompatible with MobilityHelper::Install
-   - bug 893 - Lazy CourseChange notification for WaypointMobilityModel
-   - bug 903 - TapBridge does not shut down properly
-   - bug 953 - WiMAX channel scanning overflow
-   - bug 967 - Need to decouple Ipv4L4Protocols from Ipv4L3Protocol
-   - bug 978 - Consolidate Wi-Fi MAC high functionality
-   - bug 979 - Multi-octet fields in Wi-Fi headers have wrong endianness
-   - bug 981 - use a cache to keep track of received MPDUs under block ack
-   - bug 983 - handle correctly ADDBA response action frames in QadhocWifiMac
-   - bug 984 - EmuNetDevice should use DIX encapsulation by default
-   - bug 985 - WiMAX Invalid management message type on wimax-simple
-   - bug 988 - MacRxMiddle::SequenceControlSmaller method
-   - bug 990 - Error with an NS_ASSERT at uan-phy-gen.cc
-   - bug 991 - InterferenceHelper assertion failure
-   - bug 992 - Unusual (possibly incorrect assertion) in Packet::Deserialize
-   - bug 993 - MinstrelWifiManager::UpdateStats useless if clause
-   - bug 994 - PointToPointGridHelper useless if clauses
-   - bug 995 - Useless (possibly incorrect) comparison of unsigned int
-   - bug 1004 - module header not rebuilt
-   - bug 1005 - GetSocket() methods for OnOffApplication and PacketSink
-   - bug 1009 - decouple m_finSequence (TcpSocketImpl) from tx sequence numbers
-   - bug 1012 - UAN Throp propagation model bug
-   - bug 1015 - GetChannelFrequencyMhz() does not match with standard
-   - bug 1022 - inappropriate ASSERT in tcp-socket-impl.cc
-   - bug 1025 - wimax-ipv4 script exists with signal SIGSEGV when nbSS>20
-   - bug 1027 - RocketfuelTopologyReader is not working at all
-   - bug 1029 - v4Ping application endian issues
-   - bug 1030 - routing/aodv example fixed
-   - bug 1031 - Wifi hidden terminal example does not work
-   - bug 1032 - Unable to specify multiple Compiler/Linker flags
-
-Known issues
-------------
-In general, known issues are tracked on the project tracker available
-at http://www.nsnam.org/bugzilla/
-
-Windows XP 32 bit Cygwin 1.7.7 does not seem to work because of a
-problem (reported elsewhere) in linking large libraries.
-
-Release 3.9
-===========
-
-Availability
-------------
-This release is immediately available from:
-http://www.nsnam.org/release/ns-allinone-3.9.tar.bz2
-
-Supported platforms
--------------------
-ns-3.9 has been tested on the following platforms:
-- Ubuntu 10.04 LTS 32/64-bit gcc-4.4.3
-- Fedora Core 12 64-bit gcc-4.4.3
-- Ubuntu 9.10 32-bit gcc-4.4.1
-- Ubuntu 8.04 LTS 64-bit gcc-4.2.4
-- Fedora Core 5 32-bit gcc-4.1.1
-- Mac OS X Leopard powerpc gcc-4.0.1
-- Windows Cygwin 1.7.5
-
-Not all ns-3 options are available on all platforms; consult the
-wiki for more information:
-http://www.nsnam.org/wiki/Installation
-
-New user-visible features
--------------------------
-
-   - A reorganisation of the construction of Wi-Fi transmit rates has
-     been undertaken with the aim of simplifying the task of
-     supporting further IEEE 802.11 PHYs. This work has been completed
-     under the auspices of Bug 871. A consequence of this work is that
-     WifiModes have a new (hopefully future-proof) naming, and
-     simulations which specify rates by name will need updating. The
-     list of new rate names is given in the error message produced
-     when an attempt is made to use any invalid rate name (including
-     those that were previously valid).
-
-   - A new OFDM error rate model for WiFi (NistErrorRateModel); this model
-     has been validated in clear-channel testbed tests.  For 802.11b, it
-     uses the same underlying model as the YansErrorRateModel, but it differs
-     from YansErrorRateModel for OFDM modes (802.11a/g).  The default
-     YansWifiPhyHelper has been changed to use this model.
-
-   - A new NS-2 mobility trace reader supports BonnMotion, SUMO, TraNS,
-     etc. traces.
-
-   - An energy model for nodes and devices, including an energy source
-     model and device energy models allowing energy-aware devices
-     to notify the energy source about energy consumption.
-
-   - Rocketfuel topology dataset support for existing topology reader
-     Rocketfuel project:
-     http://www.cs.washington.edu/research/networking/rocketfuel/
-
-   - Underwater Acoustic Network (UAN) model, split in to three parts, the
-     channel, PHY, and MAC models to enable researchers to model a variety
-     of underwater network scenarios.
-
-   - the Spectrum framework, which provides support for spectrum-aware
-     Channel and PHY layer modeling. It features a set of classes that
-     allows the mathematical representation of frequency dependent
-     phenomena. Some example channel, propagation and device
-     implementations that make use of this framework are also
-     included.
-
-Bugs fixed
-----------
-The following lists many of the bugs fixed or small feature additions
-since ns-3.8, in many cases referencing the Bugzilla bug number
-
-   - IPv4 global routing code; stub networks were assumed to be /24
-     and added as /24 networks even if the mask is actually different
-   - OLSR was generating messages on non-OLSR interfaces
-   - ICMPv4 objects not properly registered; affected serialization code
-   - bug 231 - SocketAddressTag needs to be removed from a packet before
-               forwarding the packet to the user
-   - bug 385 - Add a generic "sequence number" class
-   - bug 473 - [PATCH] Alternative ns-2 trace reader
-   - bug 665 - Need Tutorial Sectino on Config Path and Tracing Use
-   - bug 671 - add packet-info-tag.cc for IP_PKTINFO/IPV6_PKTINFO
-   - bug 702 - Global routing doesn't respond to interface events
-   - bug 799 - Interference helper is too slow
-   - bug 800 - Erroneous packet sender while using aloha or cw mac in uan module
-   - bug 802 - Minstrel algorithm causes segmentation fault
-   - bug 826 - Using uint64_t instead of Time in DcfManager
-   - bug 828 - PacketSocket::Close does not unregister protocol handler
-   - bug 842 - ns-3-dev crashes using block acks
-   - bug 843 - Most wifi examples change BeaconInterval to unrealistic values
-   - bug 844 - YansWifiPhy::GetPowerDbm off-by-one problem when calculating Tx
-               power
-   - bug 846 - packet.cc triggers deprecated warning
-   - bug 853 - Rates for Wi-Fi control responses are incorrectly selected
-   - bug 854 - Support DROP_QUEUE reason-code in Ipv4FlowProbe
-   - bug 858 - support MSG_PEEK in IPv4/IPv6 raw socket
-   - bug 861 - Forwarding drops (due to no route found) were not being logged
-               in IPv4 or IPv6 ascii traces
-   - bug 869 - suggested test framework enhancements
-   - bug 871 - naming for WifiPhyStandard
-   - bug 873 - Queue occupancy counter not decremented in WifiMacQueue::Remove()
-   - bug 874 - wrong modulation type is selected in the forwardBurst method
-   - bug 875 - "frame includes FCS" flag should be set in Radiotap frame header
-   - bug 879 - source address selection for AODV using DeferredRouteRequest
-   - bug 881 - Reorganise to allow wider use of WifiInformationElement
-   - bug 890 - several rate adaptation algorithms not tested by test.py
-   - bug 900:  RawTextConfigLoad::Default does not load configurations
-   - bug 901 - Optimize Mac48Address < != and ==
-   - bug 902 - TCP: handle out-of-order packets during connection shutdown
-   - bug 905 - WimaxNetDevice loses packet uid, tags, and memory optimization
-   - bug 906 - NSC TCP socket fork did not copy txbuffersize over
-   - bug 908 - test.py should exit if waf dies
-   - bug 910 - Change Wi-Fi "AccessClass" to something closer to the standard
-   - bug 911 - IPv4/v6 multicast forwarding not going to all output interfaces
-   - bug 913 - Queue Enqueue/Drop trace sources behavior unintuitive
-   - bug 916 - EnableAsciiAll ("prefix") does not work for YansWifiPhyHelper
-   - bug 918 - samples/main-packet-header.cc is broken
-   - bug 919 - minstrel does not pass valgrind tests
-   - bug 921 - Inconsistent declaration of class/struct Object in object.h
-   - bug 922 - Inconsistent declaration of class/struct in
-               wifi-remote-station-manager.h
-   - bug 923 - Inconsistent declaration of class/struct in mac-low.h
-   - bug 924 - Inconsistent declaration of class/struct in <xxx>-wifi-managers
-   - bug 925 - Various IPv6 cc files trigger deprecated warning
-   - bug 926 - olsr handling of multicast packets
-   - bug 927 - SimpleOfdmWimaxChannel RxPower computation
-   - bug 930 - examples/topology-read/topology-example-sim.cc uses variable
-               length array
-   - bug 931 - Abnormal exit reports SIGSEGV on failure
-   - bug 932 - Support IP_HDRINCL option for Ipv4RawSocket
-   - bug 933 - Flushing ostream and files on abnormal program exit
-               (ASSERT, ABORT and FATAL_ERROR)
-   - bug 936 - Waf build error for python bindings on "AccessClass"
-   - bug 937 - bugs in ns-3 wimax
-   - bug 939 - EmuNetDevice uses too much memory when reading packet bursts
-   - bug 940 - AODV fails to set up a correct path
-   - bug 941 - Wifi Dcf attributes not reachable through configuration namespace
-   - bug 943 - Add a SO_BROADCAST socket option
-   - bug 944 - change default ErrorRateModel from YansErrorRateModel to
-               NistErrorRateModel
-   - bug 946 - Rocketfuel topology dataset support for topology reader
-   - bug 949 - Node::NonPromiscReceiveFromDevice reports a meaningless
-               destination address to user callbacks
-   - bug 950 - PointToPointNetDevice says promisc support is not implemented
-               but it is
-   - bug 955 - Install NSC for NS3 in a Itanium Architecture (ia64) with Linux 2.6.16.6
-   - bug 956 - Bindings failure in core (traced-value) with older gcc
-   - bug 958 - WiFi uses wrong default values for MTU, FragmentationThreshold
-               and RtsCtsThreshold
-   - bug 959 - Simulation never finishes when using RealtimeSimulatorImpl
-   - bug 960 - V4Ping does not generate checksum
-   - bug 961 - Problem with MPI activation
-   - bug 964 - AODV does not work with host addressed interfaces
-   - bug 965 - Problem building /src/core/callback.cc
-   - bug 966 - AODV originates new RREQ on each packet, when doesn't have
-               valid route
-   - bug 969 - No SocketList is present in UdpL4Protocol class
-   - bug 971 - fix AODV header Print functions
-   - bug 972 - [flow monitor] assertion fails in pv4-flow-probe.cc
-
-Known issues
-------------
-
-Release 3.8
-===========
-
-Availability
-------------
-This release is immediately available from:
-http://www.nsnam.org/release/ns-allinone-3.8.tar.bz2
-
-Supported platforms
--------------------
-ns-3.8 has been tested on the following platforms:
-  - linux x86 gcc 4.4.0, 4.3.2, 4.2, 4.1.1, 4.1 and 3.4.6 (debug and optimized)
-  - linux x86_64 gcc 4.4.0, 4.3.2, 4.2.4, 4.2.3, 4.2.1, 4.1.3, 3.4.6 (debug and optimized)
-  - MacOS X ppc gcc 4.0.x and 4.2.x (debug and optimized)
-  - cygwin gcc 4.3.4 (debug and optimized)
-
-Not all ns-3 options are available on all platforms; consult the
-wiki for more information:
-http://www.nsnam.org/wiki/Installation
-
-New user-visible features
--------------------------
-  a) WiMAX net device: Allow to simulated IEEE 802.16 point to multi-point based networks
-
-  b) Distributed simulation for point-to-point networks using the Message
-     Passing Interface (MPI) standard.
-
-  c) Matrix propagation loss model uses a two-dimensional matrix of path loss indexed
-     by source and destination nodes.
-
-  d) Topology read system: Allows quick and easy creation of large topologies by reading
-     Inet or Orbis files
-
-  e) Gauss-Markov mobility model: Adds 3-d adaptation of Gauss-Markov mobility model which
-     has both memory and variability
-
-  f) Steady-state random waypoint mobility model: Based on random waypoint mobility (RWM) model for case when
-     speed, pause and position are uniformly distributed random variables. However, initial values of these
-     parameters are not from uniform distribution but from stationary distribution of RWM model.
-
-  g) Two-ray ground propagation loss model: Calculates the crossover distance under which Friis is used.
-     The antenna height is set to the nodes z coordinate, but can be added to using the model parameter
-     SetHeightAboveZ, which will affect ALL stations
-
-
-API changes from ns-3.7
------------------------
-API changes for this release are documented in the file CHANGES.html.
-
-Bugs fixed
-----------
-The following lists many of the bugs that were fixed since ns-3.7, in
-many cases referencing the Bugzilla bug number
-   - bug 155 - std::ostream & os" parameters not Python friendly
-   - bug 184 - GtkConfigStore do not support ConfigureDefault
-   - bug 407 - OLSR is missing HNA support
-   - bug 414 - No ReceiveErrorModel in SimpleNetDevice
-   - bug 602 - WifiRemoteStation lacks information about the access class of outgoing packets
-   - bug 622 - [PATCH] Friendly names for pcap traces
-   - bug 683 - Helper methods for pcap tracing with explicit filenames
-   - bug 706 - Backoff counting when starting NS.
-   - bug 720 - TapBridge creation fails from a script outside the ns3 tree
-   - bug 731 - Send function in point-to-point-net-device fails to check the return value of the Dequeue function
-   - bug 747 - Listening TCP socket closes on RST
-   - bug 748 - Cloned TCP socket uses wrong source address
-   - bug 772 - AODV is unable to correctly buffer packets waiting for route reply
-   - bug 777 - AODV ignores specified outgoing interface in RouteOutput()
-   - bug 778 - OLSR ignores specified outgoing interface in RouteOutput()
-   - bug 787 - Addition of Two Ray Ground model to propagation loss model and tests
-   - bug 788 - OLSR_NEIGH_HOLD_TIME should be 3 times OLSR_REFRESH_INTERVAL
-   - bug 789 - [PATCH] Globalrouting externalroutes to use the new GetRootExitDirections()
-   - bug 794 - Ipv4Mask constructor for "/yy"-notation is wrong
-   - bug 796 - TCP bug in ns-3-dev branch : Crash detected during retesting of Chord on ns-3-dev branch
-   - bug 797 - Enhancements to src/core/random-variable.cc/h
-   - bug 801 - ns-3.7 and SVN not coexisting nicely
-   - bug 802 - Minstrel algorithm causes segmentation fault
-   - bug 804 - null-pointer references in 3.7 internet stack
-   - bug 806 - TCP doesn't work over a CSMA link
-   - bug 807 - ns2-mobility-helper.cc: node id parsed wrong
-   - bug 809 - Missing Python binding for Ipv4GlobalRouting::GetRoute
-   - bug 810 - In TCP, Socket::GetSockName() does not return the local socket address
-   - bug 812 - Assert when getting socket in RecvReply for AODV
-   - bug 813 - Nqos AP sends packet to non associated STA
-   - bug 814 - Function logging causing assert in wireless examples
-   - bug 815 - waf shell file descriptor leak
-   - bug 816 - tap-creator deadlock when python bindings enabled
-   - bug 817 - Pareto rng constructors using scale and shape instead of mean and shape
-   - bug 818 - TCP Socket implementation does not set ACK flag on retransmits
-   - bug 819 - Build break when gtk not installed
-   - bug 820 - Bad things happen in test.py when logging is enabled
-   - bug 821 - AODV asserts with function logging enabled
-   - bug 822 - Move Mtu attribute from NetDevice base class to subclasses
-   - bug 825 - UDP-Client-server's packet loss counter not properly reset
-   - bug 828 - PacketSocket::Close does not unregister protocol handler
-   - bug 829 - TCP unbound memory problem (pending data)
-   - bug 833 - OnOffApplication with PacketSocket: sniffs all traffic
-   - bug 834 - Incorrect signature of Ipv4FlowProbe::DropLogger
-   - bug 835 - Unlimited receive queues in sockets == evil
-   - bug 836 - Delay is incremented over time with BsUplinkSchedulerSimple and BsUplinkSchedulerRtps
-   - bug 838 - ns-3 can't compile on MacOS with 32bit processor
-   - bug 839 - TestSuite wimax-ss-mac-layer crashes on Darwin 9.8.0 Power Macintosh
-   - bug 840 - BS scheduler does not support fragmentation for UGS flows
-   - bug 841 - Multicast transmission breaks with QoS Wifi
-   - bug 844 - YansWifiPhy::GetPowerDbm off-by-one problem when calculating Tx power
-   - bug 847 - Segfaults on BaseStationNetDevice with OnOffApplication and rtPS sched
-   - bug 849 - stray patch files in lwip directory
-   - bug 850 - Ipv4GlobalRouting::LookupGlobal bug
-   - bug 855 - waf dies badly when switching from debug to optimized build or vice versa
-   - bug 856 - initialize vbl
-   - bug 857 - Link-Local Multicast handle in Ipv4 Output processing
-   - bug 859 - Output interface estimation for the source address bound socket in IPv4 Raw socket
-   - bug 860 - waf sometimes dies while executing ns3header or gen_ns3_module_header tasks in case of
-               parallel jobs
-   - bug 862 - NotifyInterfaceUp() Adds network route even when netmask is /32
-   - bug 863 - Wrong Scalar arithmetic
-   - bug 864 - Invalid return value in UdpSocketImpl::Send and Ipv4RawSocketImpl::Send
-   - bug 865 - Ipv4RawSocketImpl::RecvFrom does not return from address all the time.
-   - bug 866 - WiMAX mobility models not aggregated to Node
-   - bug 867 - Minor bug in Ipv4L3Protocol::Send()
-   - bug 868 - invalid packet size after Ipv4L3Protocol::Send
-   - bug 872 - ns3::PcapFileWrapper::Write explodes stack
-   - bug 873 - Queue occupancy counter not decremented in WifiMacQueue::Remove()
-   - bug 876 - Tcp socket does not handle ShutdownRecv correctly
-   - bug 877 - python bindings broken with multiple inheritance ?
-   - bug 880 - Node sending a packet to itself via 127.0.0.1 aborts
-   - bug 885 - Error in Ascii tracing in Python examples
-   - bug 888 - Writing ascii trace to additional tests fails
-   - bug 891 - WiMAX device helper does not include propagation loss model by default
-   - bug 894 - ./waf --run error message upon segfault
-   - bug 895 - SimpleOfdmWimaxPhy SNR computation
-   - bug 899 - EmuNetDevice::SetPromiscReceiveCallback not implemented
-
-Known issues
-------------
-ns-3 builds have been known to fail on the following platforms:
-  - gcc 3.3 and earlier
-  - optimized builds on gcc 3.4.4 and 3.4.5
-  - optimized builds on linux x86 gcc 4.0.x
-
-
-Release 3.7
-===========
-
-Availability
-------------
-This release is immediately available from:
-http://www.nsnam.org/release/ns-allinone-3.7.tar.bz2
-
-Supported platforms
--------------------
-ns-3.7 has been tested on the following platforms:
-  - linux x86 gcc 4.4.0, 4.3.2, 4.2, 4.1.1, 4.1 and 3.4.6 (debug and optimized)
-  - linux x86_64 gcc 4.4.0, 4.3.2, 4.2.4, 4.2.3, 4.2.1, 4.1.3, 3.4.6 (debug and optimized)
-  - MacOS X ppc gcc 4.0.x and 4.2.x (debug and optimized)
-  - cygwin gcc 3.4.4 (debug only), gcc 4.3.2 (debug and optimized)
-
-Unofficially supported platform
--------------------
-- mingw gcc 3.4.5 (debug only)
-
-Not all ns-3 options are available on all platforms; consult the
-wiki for more information:
-http://www.nsnam.org/wiki/Installation
-
-New user-visible features
--------------------------
-
-  a) Ad hoc On-Demand Distance Vector (AODV) routing model (RFC 3561)
-
-  b) IPv6 extensions support to add IPv6 extensions and options.  Two
-     examples (fragmentation and loose routing) are available.
-
-  c) NetAnim interface: Provides an interface to the Qt-based NetAnim
-     animator, which supports static, point-to-point topology-based
-     packet animations.
-
-  d) New topology helpers have been introduced
-     - PointToPointDumbbellHelper
-     - PointToPointGridHelper
-     - PointToPointStarHelper
-     - CsmaStarHelper
-
-  e) Equal-cost multipath for global routing: Enables quagga's equal
-     cost multipath for Ipv4GlobalRouting, and adds an attribute that
-     can enable it with random packet distribution policy across
-     equal cost routes.
-
-  f) Binding sockets to devices:  A method analogous to a SO_BINDTODEVICE
-     socket option has been introduced to class Socket
-
-  g) Object::DoStart: Users who need to complete their object setup at
-     the start of a simulation can override this virtual method, perform their
-     adhoc setup, and then, must chain up to their parent.
-
-  h) Ipv4::IsDestinationAddress method added to support checks of whether a
-     destination address should be accepted as one of the host's own
-     addresses.
-
-  i) UniformDiscPositionAllocator added; distributes uniformly the nodes
-     within a disc of given radius.
-
-  j) ChannelNumber attribute added to YansWifiPhy. Now it is possible to
-     setup wifi channel using WifiPhyHelper::Set() method.
-
-  k) WaypointMobilityModel provides a method to add mobility as a set of
-     (time, position) pairs
-
-  l) 802.11p WiFi standards
-
-  m) UDP Client/Server application
-
-  n) Support transactions in the SQLite output interface, making it usable for larger amounts of data
-
-API changes from ns-3.6
------------------------
-API changes for this release are documented in the file CHANGES.html.
-
-Bugs fixed
-----------
-The following lists many of the bugs that were fixed since ns-3.6, in
-many cases referencing the Bugzilla bug number
-   - bug 752: Object::DoStart is not executed for objects created at t > 0
-   - bug 767:  Incorrect modulation for 802.11a modes
-   - bug 725: wifi fragmentation and RTS cannot be used at the same time
-   - bug 782: CreateTap () requires IP address in modes other than
-     CONFIGURE_LOCAL.
-   - bug 769: Queue::GetTotalReceived{Bytes,Packets}() broken
-   - bug 738 ReceiveErrorModel called too late
-   - Fix NSC improper response to FIN
-   - Fixed bug in serialization of PbbAddressBlock.
-   - Fix bug 780 (problem in RoutingTableComputation with asymmetric links),
-     while adding debugging methods to OLSR.
-   - bug 759: Ipv6 uses wrong outgoing interface.
-   - bug 770: IPv6 size calculation for unknown options is wrong.
-   - bug 771: Radvd does not set ttl value.
-   - Fix bug 606:  Arp depends on IP routing system
-   - pad out CSMA payloads to 46 bytes if needed
-   - Drop CSMA packets with CRC errors, rescan, dox tweaks
-   - Add FCS capability to CSMA
-   - Mesh:Dot11s: fixed airtime metric
-   - Get emu working again:  Add Dix/Llc option, add and use contextual
-     realtime schedule ops, don't refcount realtime simulator impl
-   - bug 695 - DcfManager::UpdateBackoff () uses slow HighPrecision::Div()
-   - bug 674 - EIFS is not handled correctly in DcfManager::GetAccessGrantStart
-   - bug 739 -  OLSR: Strange HTime value in HELLO messages
-   - bug 746 -  UDP source address is not set to bound address
-   - bug 735 Update Olsr for local delivery
-   - bug 740 OLSR MprCompute () works wrong: fixed
-   - bug 729 Enable IPv6 over PPP.
-   - bug 645: fixes for opening stats file with OMNeT++
-   - bug 689: default energy detection and CCA thresholds are changed to be
-     more realistic.
-   - bug 733: OLSR MPR Computation give incorrect result
-   - Mesh: HWMP: fixed proactive routes
-   - Mesh: fixed FLAME PATH_UPDATE procedure, fixed mesh.cc
-
-Known issues
-------------
-ns-3 builds have been known to fail on the following platforms:
-  - gcc 3.3 and earlier
-  - optimized builds on gcc 3.4.4 and 3.4.5
-  - optimized builds on linux x86 gcc 4.0.x
-
-
-Release 3.6
-===========
-
-Availability
-------------
-This release is immediately available from:
-http://www.nsnam.org/release/ns-allinone-3.6.tar.bz2
-
-Supported platforms
--------------------
-ns-3.6 has been tested on the following platforms:
-  - linux x86 gcc 4.4.1, 4.2, 4.1, and, 3.4.6.
-  - linux x86_64 gcc 4.4.0, 4.3.2, 4.2.3, 4.2.1, 4.1.3, 3.4.6
-  - MacOS X ppc and x86 (gcc 4.0.x and 4.2.x)
-  - cygwin gcc 3.4.4 (debug only), gcc 4.3.2 (debug and optimized)
-
-Not all ns-3 options are available on all platforms; consult the
-wiki for more information:
-http://www.nsnam.org/wiki/Installation
-
-New user-visible features
--------------------------
-
-  a) 802.11 models:
-     - Add an implementation of the minstrel rate control algorithm
-       (Duy Nguyen for gsoc)
-     - AthstatsHelper: enables the wifi device to produce periodic
-       reports similar to the ones generated by madwifi's
-       athstats tool (Nicola Baldo)
-     - 10MHz and 5MHz channel width supported by 802.11a model
-       (Ramon Bauza and Kirill Andreev)
-     - Channel switching support. YansWifiPhy can now switch among
-       different channels (Ramon Bauza and Pavel Boyko)
-
-  b) IPv6 models:
-    - IPv6 interface;
-    - IPv6 layer;
-    - IPv6 raw socket;
-    - Static IPv6 routing;
-    - ICMPv6 layer;
-    - Some ICMPv6 error messages (destination unreachable, ...);
-    - Neighbor Discovery Protocol (NS/NA, RS/RA, redirection);
-    - Ping6 application (send Echo request);
-    - Radvd application (send RA);
-    - Examples (ping6, simple-routing-ping6, radvd, radvd-two-prefix,
-      icmpv6-redirect).
-
-  c) Wireless Mesh Networking models:
-    - General multi-interface mesh stack infrastructure (devices/mesh module).
-    - IEEE 802.11s (Draft 3.0) model including Peering Management Protocol and HWMP.
-    - Forwarding Layer for Meshing (FLAME) protocol.
-
-  d) Nix-vector routing:
-    - Ipv4NixVectorHelper
-    - Examples (nix-simple, nms-p2p-nix)
-
-  e) New Test Framework
-    - Use test.py instead of ./waf check or ./waf --regression
-    - Previous unit tests have been ported to new framework.
-    - Examples are tested for run-ability.
-
-  f) A new Flow Monitor module
-   - To very easily measure flow metrics in a simulation
-   - No need to use trace callbacks or parsing trace files
-
-API changes from ns-3.5
------------------------
-API changes for this release are documented in the file CHANGES.html.
-
-Known issues
-------------
-ns-3.6 build is known to fail on the following platforms:
-  - gcc 3.3 and earlier
-  - optimized builds on gcc 3.4.4 and 3.4.5
-  - optimized builds on linux x86 gcc 4.0.x
-
-Release 3.5
-===========
-
-Availability
-------------
-This release is immediately available from:
-http://www.nsnam.org/release/ns-allinone-3.5.tar.bz2
-
-Supported platforms
--------------------
-ns-3.5 has been tested on the following platforms:
-  - linux x86 gcc 4.2, 4.1, and, 3.4.6.
-  - linux x86_64 gcc 4.4.0, 4.3.2, 4.2.3, 4.2.1, 4.1.3, 3.4.6
-  - MacOS X ppc and x86 (gcc 4.0.x and 4.2.x)
-  - cygwin gcc 3.4.4 (debug only), gcc 4.3.2 (debug and optimized)
-  - mingw gcc 3.4.5 (debug only)
-
-Not all ns-3 options are available on all platforms; consult the
-wiki for more information:
-http://www.nsnam.org/wiki/Installation
-
-New user-visible features
--------------------------
-
-  a) 802.11 MAC:
-     - EDCA multi-qos-class support (Mirko Banchi)
-     - 802.11n initial support for A-MSDU frame aggregation (Mirko Banchi)
-     - aarf-cd and cara rate control algorithms (Federico Maguolo)
-  b) 802.11 PHY:
-     - 802.11b PHY support (Gary Pei)
-     - Nakagami propagation loss model (Timo Bingmann)
-     - radiotap and prism headers for PCAP output (Nicola Baldo)
-  c) RandomVariable:
-     - GammaVariable and ErlangVariable (Timo Bingmann)
-     - ZipfVariable (Francesco Malandrino)
-  d) UdpEcho: allows setting the payload of echo packets
-  e) Ipv4/Ipv4RoutingProtocol: allow fine-grained control over
-     routing policy and arbitrary composition of routing protocols
-
-API changes from ns-3.4
------------------------
-API changes for this release are documented in the file CHANGES.html.  The
-internal API and composition of the IPv4 stack underwent significant
-refactoring in this release cycle.
-
-Known issues
-------------
-ns-3 build is known to fail on the following platforms:
-  - gcc 3.3 and earlier
-  - optimized builds on gcc 3.4.4 and 3.4.5
-  - optimized builds on linux x86 gcc 4.0.x
-
-Future releases
----------------
-Our next release, which is expected to happen in 2 to 4 months from now, will
-feature the merging of some of our projects currently in development including
-fuller IPv6 support, some smaller features such as a new Global ARP
-package, and possibly a new Testing and Validation suite.
-
-Release 3.4
-===========
-
-Availability
-------------
-This release is immediately available from:
-http://www.nsnam.org/release/ns-allinone-3.4.tar.bz2
-
-Supported platforms
--------------------
-ns-3.4 has been tested on the following platforms:
-  - linux x86 gcc 4.2, 4.1, and, 3.4.6.
-  - linux x86_64 gcc 4.3.2, 4.2.3, 4.2.1, 4.1.3, 3.4.6
-  - MacOS X ppc and x86
-  - cygwin gcc 3.4.4 (debug only)
-
-Not all ns-3 options are available on all platforms; consult the
-wiki for more information:
-http://www.nsnam.org/wiki/Installation
-
-New user-visible features
--------------------------
-  a) Wifi models: Timo Bingman contributed a ThreeLogDistance and a Nakagami
-     propagation loss model based on the ns-2 models. Fabian Mauchle contributed
-     multicast support.
-
-  b) Object Name Service:  A facility allowing ns-3 Objects to be assigned
-     names has been added.
-
-  c) Tap Bridge:  A second option for integrating ns-3 with real-world hosts
-     has been added.  This allows for real hosts to talk over ns-3 net devices
-     and simulated networks.
-
-  d) A new build option (ns-3-allinone) has been provided to make it easier for
-     users to download and build commonly used ns-3 configurations.
-
-  e) The ns-3 calendar queue scheduler has been ported to ns-3.
-
-  f) XML support has been added to the ConfigStore.
-
-API changes from ns-3.3
------------------------
-API changes for this release are documented in the file CHANGES.html
-
-Known issues
-------------
-ns-3 build is known to fail on the following platforms:
-  - gcc 3.3 and earlier
-  - optimized builds on gcc 3.4.4 and 3.4.5
-  - optimized builds on linux x86 gcc 4.0.x
-  - optimized builds on Ubuntu 8.10 alpha 5 x86 gcc4.3.2
-  - MinGW
-
-The IPv4 API defined in src/node/ipv4.h is expected to undergo major changes
-in preparation of the merge of the IPv6 API and implementation.
-
-Future releases
----------------
-Our next release, which is expected to happen in 2 to 4 months from now, will
-feature the merging of some of our projects currently in development including
-fuller IPv6 support, and IPv4 and routing protocol refactoring, and some smaller
-features such as a new Global ARP package and possibly a new Testing and Validation
-suite,
-
-Release 3.3
-===========
-
-Availability
-------------
-This release is immediately available from:
-http://www.nsnam.org/release/ns-3.3.tar.bz2
-
-Supported platforms
--------------------
-ns-3.3 has been tested on the following platforms:
-  - linux x86 gcc 4.2, 4.1, and, 3.4.6.
-  - linux x86_64 gcc 4.3.2, 4.2.3, 4.2.1, 4.1.3, 3.4.6
-  - MacOS X ppc and x86
-  - cygwin gcc 3.4.4 (debug only)
-
-Not all ns-3 options are available on all platforms; consult the
-wiki for more information:
-http://www.nsnam.org/wiki/Installation
-
-New user-visible features
--------------------------
-  a) Emulated Net Device
-     A new net device has been added as enabling technology for ns-3 emulation
-     scenarios.  See src/devices/emu and examples/emu-udp-echo.cc for details.
-
-  b) ICMP Support
-     Support for several ICMP messages has been added to ns-3.  See
-     src/internet-stack/icmpv4.h for details.
-
-  c) IPv6 Address Support
-     New clases to support IPv6 addresses has been added to the system.  This
-     is enabling technology for fuller IPv6 support scheduled for ns-3.4.
-
-  d) A flow-id tag has been added to the contributed code section
-
-  e) Star topologies can be created from the topology helper functions
-
-  f) The global routing code has been made dynamic (not just limited to
-     (pre-simulation computation) and supports stub network interfaces and
-     bridge net devices
-
-  g) A MatchContainer has been added to the configuration subsystem
-
-API changes from ns-3.2
------------------------
-API changes for this release are documented in the file CHANGES.html
-
-Known issues
-------------
-ns-3 build is known to fail on the following platforms:
-  - gcc 3.3 and earlier
-  - optimized builds on gcc 3.4.4 and 3.4.5
-  - optimized builds on linux x86 gcc 4.0.x
-  - optimized builds on Ubuntu 8.10 alpha 5 x86 gcc4.3.2
-  - MinGW
-
-The IPv4 API defined in src/node/ipv4.h is expected to undergo major changes
-in preparation of the merge of the IPv6 API and implementation.
-
-Future releases
----------------
-Our next release, which is expected to happen in 2 to 4 months from now, will
-feature the merging of some of our projects currently in development including
-fuller IPv6 support, and IPv4 and routing protocol refactoring, and some smaller
-features such as an object naming facility and a new Global ARP package.
-
-Release 3.2
-===========
-
-Availability
-------------
-This release is immediately available from:
-http://www.nsnam.org/release/ns-3.2.tar.bz2
-
-Supported platforms
--------------------
-ns-3.2 has been tested on the following platforms:
-  - linux x86 gcc 4.2, 4.1, and, 3.4.6.
-  - linux x86_64 gcc 4.3.2, 4.2.3, 4.2.1, 4.1.3, 3.4.6
-  - MacOS X ppc and x86
-  - cygwin gcc 3.4.4 (debug only)
-
-Not all ns-3 options are available on all platforms; consult the
-wiki for more information:
-http://www.nsnam.org/wiki/Installation
-
-New user-visible features
--------------------------
-  a) Learning bridge (IEEE 802.1D)
-    It is now possible to bridge together multiple layer 2 devices to
-    create larger layer 2 networks. The Wifi and Csma models support
-    this new mode of operation. (contributed by Gustavo Carneiro)
-
-  b) Python bindings
-    It is now possible to write simulation scripts in python using our
-    python bindings (contributed by Gustavo Carneiro).
-
-  c) Real-time simulator
-    It is now possible to run simulations synchronized on the real-world
-    wall-clock time (contributed by Craig Dowell).
-
-  d) Network Simulation Cradle
-    It is now possible to use the Network Simulation Cradle
-    (http://www.wand.net.nz/~stj2/nsc/) in ns-3 and run simulations
-    using various versions of kernel TCP network stacks. (contributed
-    by Florian Westphal as part of his Google Summer of Code work)
-
-  e) A statistics framework
-    Joseph Kopena contributed a statistics framework which can be used
-    keep track of simulation data in persistent storage across multiple
-    runs (database and ascii file backends are available).
-    More information on the wiki:
-    http://www.nsnam.org/wiki/Statistical_Framework_for_Network_Simulation
-
-API changes from ns-3.1
------------------------
-API changes for this release are documented in the file CHANGES.html
-
-Known issues
-------------
-ns-3 build is known to fail on the following platforms:
-  - gcc 3.3 and earlier
-  - optimized builds on gcc 3.4.4 and 3.4.5
-  - optimized builds on linux x86 gcc 4.0.x
-  - optimized builds on Ubuntu 8.10 alpha 5 x86 gcc4.3.2
-  - MinGW
-
-The IPv4 API defined in src/node/ipv4.h is expected to undergo major changes
-in preparation of the merge of the IPv6 API and implementation.
-
-Future releases
----------------
-Our next release, which is expected to happen in 2 to 4 months from now, will
-feature the merging of some of our projects currently in development: IPv6,
-emulation, and synchronous posix sockets.
-
-Release 3.1 (2008/06/30)
-========================
-
-The first ns-3 stable release
------------------------------
-
-This release is immediately available from:
-http://www.nsnam.org/release/ns-3.1.tar.bz2
-
-We dedicate this initial ns-3 release to our late contributor and friend,
-Federico Maguolo.
-
-What is ns-3 ?
---------------
-
-ns-3 is a new discrete-event network simulator designed for supporting network
-research and education. ns-3 features a solid, well documented C++ core and
-models for TCP/IP (IPv4), several link types including WiFi, and mobility
-models.
-
-ns-3 is an open source project released under the GNU GPLv2 license which
-allows anyone to use ns-3 without having to pay any license fee or royalties.
-ns-3 is actively seeking new contributors to extend the range of supported
-models and/or to maintain existing models.
-
-Where to get more information about ns-3
-----------------------------------------
-
-All the ns-3 documentation, is accessible from the ns-3 website:
-http://www.nsnam.org
-
-Including, tutorials:
-http://www.nsnam.org/tutorials.html
-
-Supported platforms
--------------------
-
-ns-3 is regularly tested on the following platforms:
-  - linux x86 gcc 4.2, 4.1, and, 3.4.6.
-  - linux x86_64 gcc 4.1.3, 4.2.1, 3.4.6
-  - MacOS X ppc and x86
-  - cygwin gcc 3.4.4 (debug only)
-
-Known issues
-------------
-
-ns-3 is known to fail on the following platforms:
-  - gcc 3.3 and earlier
-  - optimized builds on gcc 3.4.4 and 3.4.5
-  - optimized builds on linux x86 gcc 4.0.x
-
-The IPv4 API defined in src/node/ipv4.h is expected to undergo major changes
-in preparation of the merge of the IPv6 API and implementation.
-
-Future releases
----------------
-
-Our next release, which is expected to happen in 2 to 4 months from now, will
-feature the merging of some of our projects currently in development: python
-scripting, IPv6, emulation, a statistics framework and synchronous posix
-sockets.
-
-Release 3.0.13 (2008/06/02)
-===========================
-- point to point links generate ppp pcap traces
-- point to point links support asymmetrical data rates.
-- generate doxygen documentation for all attributes and trace sources
-- add ConfigStore and GtkConfigStore to contrib module
-- socket API now support tx and rx buffers: implemented for UDP and TCP
-- ARP cache now supports per-entry pending queues
-- lots of bugfixes and implementation and API cleanups
-
-Warning: among API changes in this release, Application::Start and
-Application::Stop now interprets the time argument as a relative
-instead of absolute simulation time, to align with how Simulator::Schedule
-behaves.  Any code that calls these APIs in the middle of the simulation
-will need to be adapted.
-
-The API of Simulator::StopAt (time) has also changed.  Now it is
-called Simulator::Stop (time), and takes a relative time, instead of
-absolute.
-
-Release 3.0.12 (2008/04/07)
-===========================
-    - Add Attribute support to the TypeId metadata system and add
-attribute support to all in-tree models
-    - Add a mid-level helper API to build simulation topologies
-and perform simple ascii and pcap link-level tracing.
-    - Large amount of structural changes to accommodate the needs
-of the upcoming python bindings
-    - new rate control algorithm (RRAA) and a jakes propagation model
-in the 802.11 model (Federico Maguolo).
-    - regression test framework added
-    - TCP delayed acknowledgements and multitasking server
-
-Release 3.0.11 (2008/02/15)
-===========================
-    - Initial port of GTNetS TCP implementation (initial version
-that does not support multitasking or delayed acknowledgments yet,
-but supports a reliable stream service)
-    - Changes to the ns-3 object model to create a TypeId-based
-metadata system
-    - lots of bug fixes throughout the system
-    - tutorial updates
-
-Release 3.0.10 (2008/01/15)
-===========================
-   - Add tutorial document content;
-   - Valgrind option for "waf" tool;
-   - Doxygen organization changes.
-
-Release 3.0.9 (2007/12/15)
-==========================
-   - A 802.11 model ported from Yans. This model supports:
-       * a rather extensive PHY model
-       * log-distance and friis propagation model
-       * a simple set of rate control algorithms (ARF, Ideal,
-         AARF, constant-rate)
-       * adhoc and infrastructure mode (beacon+assoc)
-   - Use smart pointer for Packet in the APIs
-   - A new contrib directory with helper classes:
-     EventGarbageCollector, Gnuplot
-   - Tracing support for Applications
-   - many bugs fixed
-
-Release 3.0.8 (2007/11/15)
-==========================
-   - A simple error model
-   - Source files for ns-3 tutorial
-
-Release 3.0.7 (2007/10/15)
-==========================
-  - OLSR routing protocol
-  - A timer class
-  - Additional mobility models (random waypoint, random 2D walk)
-  - A mobility visualization tool
-
-Release 3.0.6 (2007/09/15)
-==========================
-  - Static multicast IPv4 routing
-  - Logging overhaul (NS_LOG macros)
-  - Refactoring of tracing subsystem
-  - Tutorial document started
-
-Release 3.0.5 (2007/08/15)
-==========================
-
-  - Refactoring to support win32-based unix environments (Cygwin, mingw)
-  - "Packet socket" for allowing applications to access NetDevices directly
-  - Generalized, polymorphic Address class
-  - Add CSMA NetDevice model (from Emmanuelle Laprise)
-  - Modularize IPv4 routing support (from Gustavo Carneiro)
-  - Add mobility framework and basic mobility models
-  - Global unicast centralized routing
-
-Release 3.0.4 (2007/07/15)
-==========================
-
-  - Enable waf as the default build system.
-  - Per-packet metadata:  a system to track which headers and trailers
-    are added to a packet
-  - Simplifications to point-to-point devices and channel
-
-Release 3.0.3 (2007/06/15)
-==========================
-
-  - Enable Waf for release tarballs: users can now build ns-3
-    with the "waf" tool. See doc/build-waf.txt.
-  - Add support for variable time precision: it is now possible
-    to run a simulation with an accuracy which is higher or lower
-    than a nanosecond: seconds, milliseconds, microseconds,
-    femtoseconds and picoseconds are supported.
-  - Optimize and rework the COM framework, solidify the component
-    manager
-  - Many small API cleanups
-
-Release 3.0.2 (2007/05/18)
-==========================
-
-  - Implement a new memory management infrastructure based
-    on reference counting and smart pointers (the latter being
-    optional)
-
-  - Implement a COM-like framework with support for QueryInterface
-    to provide object extensibility
-
-  - Add support for a BSD-style socket API for user applications
-
-Release 3.0.1 (2007/03/31)
-==========================
-
-  - First public release; not yet pre-alpha.
-
-  - Simple UDP-based simulation script (examples/simple-p2p.cc)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/RELEASE_NOTES.md ns-3.36/RELEASE_NOTES.md
--- ns-3.35/RELEASE_NOTES.md	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/RELEASE_NOTES.md	2022-04-30 18:23:57.642732600 -0700
@@ -0,0 +1,3837 @@
+ns-3 RELEASE NOTES
+===================
+
+This file contains ns-3 release notes (most recent releases first).
+
+All of the ns-3 documentation is accessible from the ns-3 website:
+http://www.nsnam.org including tutorials: http://www.nsnam.org/tutorials.html
+
+Consult the file CHANGES.html for more detailed information about changed
+API and behavior across ns-3 releases.
+
+Release 3.36
+------------
+
+### Availability
+
+This release is available from:
+https://www.nsnam.org/release/ns-allinone-3.36.tar.bz2
+
+### Supported platforms
+
+This release is intended to work on systems with the following minimal
+requirements (Note: not all ns-3 features are available on all systems):
+- g++-8 or later, or LLVM/clang++-6 or later
+- Python 3.6 or later
+- (macOS only) Xcode 11 or later
+
+Python API scanning only works for Python versions 3.6 through 3.8, due to
+an upstream toolchain limitation.
+
+This release has discontinued support for g++-7 compilers.
+
+### New user-visible features
+
+- (build system) The ns-3 build system has been changed to CMake from Waf.
+- (core) An attribute value type for a std::tuple has been added
+- (core) Simulation events can be created from lambda expressions
+- (core) TypeId constructors now accept std::string
+- (fd-net-device) Support for PlanetLab helper was removed.
+- (lte) Handover now works with carrier aggregation configurations.
+- (mesh) The mesh model now includes a randomized per-hop forwarding delay.
+- (spectrum) ThreeGppSpectrumPropagationLossModel and ThreeGppChannelModel now support multiple PhasedArrayModel instances per device. This feature can be used to implement MIMO.
+- (spectrum) A new phased array spectrum propagation loss model, called PhasedArraySpectrumPropagationLossModel, has been added to better support different 4G/5G MIMO models that can exploit the multiple subarray concept.
+- (spectrum) ThreeGppSpectrumPropagationLossModel and ThreeGppChannelModel now support multiple PhasedArrayModel instances per device.
+- (spectrum) SpectrumPhy now also supports the new antenna arrays in addition to the previous antenna types.
+- (tcp) Support for Network Simulation Cradle was removed.
+- (traffic-control) Flow control features can be disabled from device helpers.
+- (wifi) The default Wi-Fi standard has been upgraded from 802.11a to 802.11ax.
+- (wifi) The default Wi-Fi rate control has been changed from ArfWifiManager to IdealWifiManager.
+- (wifi) The framework for consistently configuring operating channel, standard, band, channel width, and primary channel was changed.
+
+### Bugs fixed
+
+- (build): #461 - Avoid period character in executable names
+- (core) #141 - Print parent attributes from CommandLine --PrintAttributes
+- (core) #487 - Refactor double to int64x64 conversion test for platforms with less than 64 bit mantissa
+- (internet) #431 - ICMPv6 error messages carry packet metadata
+- (internet) - Fix RIPng address selection for intermediate nodes
+- (internet) - Fix source address selection for localhost
+- (internet) - Read correct bits when deserializing IPv6 flow label
+- (internet) -  Fix errors in IPv6 Path MTU discovery.
+- (internet-apps) #576 - Fix V4TraceRoute crash at application stop
+- (lte) #592 - Update lte-rrc-protocol-ideal.cc to solve SIB2 repeatedly reception issue
+- (mesh) #472 - mesh.cc example distance too large for preamble detect
+- (mesh) #478 - Persistent collisions of forwarded broadcast frames
+- (mpi) #607 - Call CommandLine correctly to generate docs
+- (nix-vector) - Remove unused BuildNixVectorLocal () function.
+- (nix-vector) #466 - Handle loopback IPv4/IPv6 addresses
+- (nix-vector) #567 - Rebuild NixVector if topology changes
+- (spectrum) Fix condition for channel matrix update in ThreeGppChannelModel (left and right operand were pointing to the same object)
+- (spectrum) Assign stream to random variable for Doppler term in ThreeGppChannelModel (moved from ThreeGppSpectrumPropagationLossModel)
+- (tcp) #531 - TcpWestwood divide-by-zero and floating point issues
+- (traffic-control) !844 - Fix value of MaxBurstAllowance in PIE
+- (wifi) - Mark MPDU as acknowledged before removing from the in-flight queue
+- (wifi) - Fix issue with setting of QosSupported attributes
+- (wifi) - Fix issue with installing QosTxop objects
+- (wifi) - Initialize WifiUlMuMultiStaBa as MULTI_STA
+- (wifi) - Fix misinterpretation of 802.11ax specs
+- (wifi) - Restore configuration of CWmin and CWmax for 802.11b
+- (wifi) - Set wifi-spatial-reuse.cc example to use 20 MHz BW
+- (wifi) - Fix assert condition in HeFEM::ReceiveMpdu()
+- (wifi) - Workaround to avoid a crash when expecting a TB PPDU and receiving a pre-11ax PPDU
+- (wifi) - Fix Duration/ID setting when TXOP Limit is exceeded
+- (wifi) - Enable protection for DL MU PPDUs including one PSDU, but disable for more than one PSDU until MU-RTS is implemented
+- (wifi) - Fix L-SIG length computation for HE TB PPDUs
+- (wifi) - Clear PSDU map of HE FEM when needed
+- (wifi) #459 - Fix HeCapabilities IEEE 802.11ax-compliance
+- (wifi) #467 - Fix recording of failed association process
+- (wifi) #468 - Fix wrong txDuration for trigger frame
+- (wifi) #473 - Discard preamble state for truncated TX or device in OFF
+- (wifi) #475 - Assert when sending OFDMA DL to STAs with different TIDs
+- (wifi) #480 - 2.4GHz remote station manager internal collision issue
+- (wifi) #483 - Cancel EndOfMpdu events when cancelling all events
+- (wifi) #500 - Clear PHY RX event if switching channel in IDLE and CCA_BUSY state
+- (wifi) #507 - Set CS Required field according to 802.11ax specs
+- (wifi) #600 - Fix HT Operation Primary Channel setting
+- (wifi) #609 - STA checks that a Multi-STA BA is sent by the AP it is associated with
+
+Release 3.35
+------------
+
+### Availability
+
+This release is available from:
+https://www.nsnam.org/release/ns-allinone-3.35.tar.bz2
+
+### Supported platforms
+
+This release is intended to work on systems with the following minimal
+requirements (Note: not all ns-3 features are available on all systems):
+- g++-7 or later, or LLVM/clang++-8 or later
+- Python 3.6 or later
+- (macOS only) Xcode 11 or later
+
+Python API scanning only works for Python versions 3.6 through 3.8, due to
+an upstream toolchain limitation.
+
+This release has been tested on the following systems:
+- Fedora 34 with g++-11.2.1 and clang++-12.0.1; Python 3.9.7
+- Fedora 33 with g++-10.3.1 and clang++-11.0.0; Python 3.9.6
+- Ubuntu 21.04 with g++-11.1.and clang++-12.0.0; Python 3.9.5
+- Ubuntu 20.04 with g++-9.3.0 and clang++-10.0.0; Python 3.8.10
+- Ubuntu 18.04 with g++-7.5.0 and clang++-6.0.0; Python 3.6.9
+- macOS 10.15.7 (Catalina) with Xcode 12.4 (Apple clang-1200.0.32.29, Python 3.9.1)
+
+This release has discontinued support for g++-5 and g++-6 compilers, and
+for macOS Xcode 10.
+
+### New user-visible features
+
+ns-3 has switched to the C++17 standard by default, although the more
+advanced constructs (beyond C++11) are generally avoided in the header files,
+to stay compatible with the Python API scanning framework.
+
+- (antenna) Extend UniformPlanarArray to have a configurable polarization slant angle
+- (buildings) Add example program demonstrating group mobility with the buildings-aware random walk mobility model, and a script to animate the group motion.
+- (config-store) OBSOLETE Attributes are not anymore saved.
+- (config-store) New ConfigStore::SaveDeprecated Attribute (default false) to avoid to save DEPRECATED attributes.
+- (core) Add TracedCallback::IsEmpty to know if a TracedCallback has any callback associated.
+- (core) Add std::hash<ns3::Ptr<T>> to allow seamless use of Ptr as key in unordered_maps.
+- (core) Print available values on EnumChecker::GetValue () error
+- (internet) Added getters and setters for source and destination in Ipv6Header consistent with Ipv4Header naming.
+- (internet) New functions SetAddress () and GetAddress () are added, corresponding to SetLocal () and GetLocal () respectively in Ipv4InterfaceAddress to keep consistency with Ipv6InterfaceAddress.
+- (nix-vector-routing) Support for IPv6 Nix-Vector routing. Existing nix-simple and nms-p2p-nix examples are available in IPv6 as well.
+- (nix-vector-routing) ipv4-nix-vector-helper.h has been deprecated in favour of nix-vector-helper.h.
+- (nix-vector-routing) ipv4-nix-vector-routing.h has been deprecated in favour of nix-vector-routing.h.
+- (internet) Added new function IsInSameSubnet () in Ipv4InterfaceAddress similar to Ipv6InterfaceAddress::IsInSameSubnet (). It checks if the two Ipv4Address are in the same subnet.
+- (nix-vector-routing) Nix-Vector routing supports topologies with multiple WiFi networks using the same WiFi channel object.
+- (mobility) Add GroupMobilityHelper and demonstrate its use with a new program that configures the Reference Point Group Mobility model for a number of nodes.
+- (wifi) Add support for 11ax MU EDCA Parameter Set.
+- (wifi) MPDUs discarded because they became "old" (from the Block Ack agreement point of view) are now traced using the DroppedMpdu trace source of RegularWifiMac and with the WIFI_MAC_DROP_QOS_OLD_PACKET reason.
+
+### Bugs fixed
+
+- (applications) #449, #453 - add correct receiving address to PacketSink traces for UDP.
+- (config-store) #443 - do not save obsolete attributes
+- (energy) #423 - SimpleDeviceEnergyModel calculation of consumed energy
+- (fd-net-device) #441 - Fix double dequeue on device stop
+- (internet) - Ipv4L3Protocol duplicate detection now accounts for sent packets, not just forwards.
+- (lte) !703 - Fix global-buffer-overflow when nprb is equal to zero
+- (mobility) - Initialize HierarchicalMobilityModel and avoid course change stream corruption
+- (nix-vector-routing) #450 - Avoid recalculation if path doesn't exist
+- (tcp) #407 - Align TcpCubic::GetSsThresh() with Linux
+- (tcp) #410 - Fix TcpWestwood bandwidth estimation bug
+- (traffic-control) #258 - Avoid overflow, divide-by-zero in TbfQueueDisc
+- (traffic-control) !706 - Fix FqPIE qdisc not using attributes
+- (wifi) - Always track interference when not locking on PPDU
+
+Release 3.34
+-------------
+
+### Availability
+
+This release is available from:
+https://www.nsnam.org/release/ns-allinone-3.34.tar.bz2
+
+### Supported platforms
+
+This release is intended to work on systems with the following minimal
+requirements (Note: not all ns-3 features are available on all systems):
+- g++-7 or later, or LLVM/clang++-8 or later
+- Python 3.6 or later
+- (macOS only) Xcode 10.1 or later
+
+This release has been tested on the following systems:
+- Fedora 33 with g++-10.2.1 and clang++-11.0.0; Python 3.9.2
+- Ubuntu 21.04 with g++-11.1.0 and clang++-12.0.0; Python 3.9.5
+- Ubuntu 20.04 with g++-9.3.0 and Python 3.8.5
+- Ubuntu 18.04 with g++-7.5.0 and Python 3.6.9
+- macOS 10.15.7 (Catalina) with Xcode 12.4 (Apple clang-1200.0.32.29, Python 3.9.1)
+- macOS 10.13.6 (High Sierra) with Xcode 10.1 (Apple clang-1000.11.45.5, Python 3.7.1)
+
+### New user-visible features
+
+- (antenna) Added PhasedArrayModel, providing a flexible interface for modeling a number of Phase Antenna Array (PAA) models
+- (antenna) Replaced the ThreeGppAntennaArrayModel with a UniformPlanarArray model, extending the new PhaseAdrrayModel
+- (antenna) Improved the Angles class to be more robust and user-friendly.
+- (antenna) AntennaModel child classes have been extended to produce 3D radiation patterns
+- (internet) Support for IPv6 stateless address auto-configuration (SLAAC).
+- (network) Improved support for bit fields in header serialization/deserialization.
+- (network) Added support for DLT_LORATAP DataLinkType to PCAP files
+- (network) More arithmetic operators are provided for DataRate objects
+- (nix-vector) Nix-Vector routing supports multiple interface addresse and can print out routing paths.
+- (olsr) Add support for printing OLSR headers
+- (sixlowpan) Added support for stateful (i.e., context-based) RFC6282 compression.
+- (tcp) TCP CUBIC is now the default TCP congestion control, replacing NewReno.
+- (tcp) A BBRv1 congestion control model has been added.
+- (traffic-control) Added FqCobalt queue disc with L4S features and set associative hash.
+- (traffic-control) Added FqPIE queue disc with L4S mode.
+- (wifi) Add support for 802.11ax DL and UL OFDMA, and a round-robin multi-user scheduler
+- (wifi) Added 802.11ax support to MinstrelHt rate control algorithm.
+- (wifi) The PHY layer has been refactored: the amendment-specific logic has been ported to PhyEntity classes and WifiPpdu classes
+- (wifi) The MAC layer has been refactored. The MacLow class has been replaced by a hierarchy of FrameExchangeManager classes, each adding support for the frame exchange sequences introduced by a given amendment.
+- (wifi) Add ThompsonSamplingWifiManager rate control algorithm.
+- (wifi) Holland PHY configuration has been removed from the model
+- (wifi) HT Greenfield (HT_GF) preamble support has been removed from the model
+- (wifi) Added the ability to configure the primary 20 MHz channel for 802.11 devices operating on channels of width greater than 20 MHz
+- (wifi) Some wifi/src/model files were moved to the relevant subfolders (non-ht, ht, vht, he, and rate-control)
+- (wifi) Stations perform TXOP recovery if the transmission of a non-initial MPDU in a TXOP fails
+- (wifi) Stations keep track of the TXOP holder and ignore the NAV when they receive an RTS frame from the TXOP holder
+- (wifi) The TxOkHeader and TxErrHeader trace sources of RegularWifiMac have been obsoleted and replaced by trace sources that better capture the result of a transmission (AckedMpdu, NAckedMpdu, DroppedMpdu, MpduResponseTimeout and PsduResponseTimeout)
+- (wifi) Bianchi example program extended to support 802.11n/ac/ax rates
+- (wifi) ErrorRateModel API extended to support link-to-system models
+
+### Bugs fixed
+
+- (antenna) Fix random angle generation for the 3gpp channel model.
+- (build) #52 - Fix and standardize Boost detection
+- (build) #352 - Handle multiple attempts to configure C++ standard
+- (core) #349 - Warn about Config::SetDefault() of deprecated attribute
+- (internet) #385 - IPv6 NA are now sent directly by the NetDevice
+- (lr-wpan) #382 - Fix Tx power calculation from PIB attribute
+- (lte) #285 - Check the RandomAccess status of an RNTI to whom the preamble was assigned
+- (lte) #322 - Add Channel pointer value type attribute to REM helper
+- (lte) #354 - Use uint16_t for srsIndex instead of uint8_t
+- (lte) #395 - Add transmission buffer size for RLC Acknowledged Mode
+- (lte) !555 - Remove assert upon RAR timeout in RLF example and..
+- (lte) !605 - Make sure RNTI exists before removing UE context
+- (lte) - Set UeRrcSapProvider only if RNTI exists at the eNB
+- (nix-vector) #393 - Avoid changing routing-dependent members
+- (sixlowpan) #358 - Use correct fragment size when using mesh routing.
+- (tcp) #374 - Assume TCP RTT is one microseconds if it measures as zero
+- (uan) #129 - EndTx moved to PhyListener
+- (uan) #293 - Fixed integer truncation in window computation
+- (wave) Fix compilation and runtime issues with vanet-routing-compare.cc
+- (wifi) #418 - Fix HE A-MPDU Max Size Upper Bound
+- (wifi) - Compare received power per MHz to normalized RX sensitivity
+
+Release 3.33
+------------
+
+### Availability
+
+This release is available from:
+https://www.nsnam.org/release/ns-allinone-3.33.tar.bz2
+
+### Supported platforms
+
+This release is intended to work on systems with the following minimal
+requirements (Note: not all ns-3 features are available on all systems):
+- g++-5.4 or later, or clang++-8 or later
+- Python 3.5 or later
+- (macOS only) Xcode 10.1 or later
+
+This release has been tested on the following systems:
+- Arch Linux with g++-10.2.0 and clang++ versions 8-11, Python 3.9.1
+- Fedora 33 with g++-10.2.1 and clang++-11.0.0; Python 3.9.1
+- Ubuntu 20.04 with g++-9.3.0 and Python 3.8.5
+- Ubuntu 18.04 with g++-7.5.0 and Python 3.6.9
+- Ubuntu 16.04.6 with g++-5.4.0 and Python 3.5.2
+- Linux Mint 20 Ulyana with g++-9.3.0 and Python 3.8.5
+- macOS 11.1 (Big Sur) with Xcode 12.3 (Apple clang-1200.0.32.28), Python 3.8.2 (system) and Python 3.9.1 (Homebrew)
+- macOS 10.15.7 (Catalina) with Xcode 12 (Apple clang-1200.0.31.1, Python 3.9.1)
+- macOS 10.13.6 (High Sierra) with Xcode 10.1 (Apple clang-1000.11.45.5, Python 3.7.1)
+
+### New user-visible features
+
+- (core) A new Length class has been added to represent lengths with an explicit unit, rather than the use of raw numbers (ints, doubles) with implicit length.
+- (core) A flexible CsvReader class has been introduced to allow users to read in csv- or tab-delimited data.
+- (lr-wpan) Added support for handling differences between RFC4944- and RFC6282-style IPv6 address expansion
+- (mobility) The ListPositionAllocator can now input positions from a csv file.
+- (mpi) A new Enable call was added that takes a user supplied MPI_Communicator, which enables (optional) partitioning of the MPI processes.  See !389.
+- (propagation) A channel condition model for vehicular scenarios was added.  See !435
+- (tcp) A model for TCP CUBIC congestion control has been added.
+- (tcp) TCP handling of ECN has been improved with the addition of a Congestion Window Reduced state
+- (tcp) TCP DCTCP includes a trace source for tracing the alpha value
+- (wifi) A new table-based error model based on link simulations has been
+  added (TableBasedErrorRateModel) and made the default for 802.11n/ac/ax simulations.
+- (wifi) Add error table support for LDPC FEC encoding (BCC or LDPC may now be selected)
+- (wifi) Add PHY layer support for High Efficiency Multi Users [HE-MU] access, including High Efficiency Resource Units (HE RU) and PCAP support
+- (wifi) Add option to configure the OFDM transmit spectrum mask
+
+### Bugs fixed
+
+- (applications) #444 - Report Tx bytes from UdpClient
+- (core) #265 - Time is not rounded when created from an int64x64_t
+- (core) #277 - Make Time::As() print with autoscaled unit
+- (core) #302 - Time is not rounded when created from an int64x64_t
+- (internet) #272 - Add missing data to Ipv[4,6]PacketInfoTag
+- (internet) !440 - Loopback IPv4 address should have HOST scope
+- (lte) #273 - When removing LC, remove also its BSR
+- (lr-wpan) #314 - Multicast/broadcast must not generate ACKs
+- (mobility) #276 - Make EnableAsciiAll connect in a failsafe way
+- (tcp) TcpCongestionOps objects can now be accessed by config paths
+- (tcp) #783 - Update previousLost and priorInFlight on reception of ACK
+- (wifi) #284 - Fix memory consumption issue for saturated devices
+- (wifi) Fix Minstrel HT statistics update window duration
+- (wifi) Fix incorrect calculations for 1024-QAM when using NistErrorRateModel
+- (wifi) Fix maximum channel number that can be selected for the PHY
+- (wifi) Set BER threshold for Ideal rate manager to 1e-6 to avoid high PER for high MCS values
+- (wifi) Reduce precision to fix infinite loop when Ideal rate manager as used with Yans error rate model
+- (wifi) Report reception of BAR to WifiRemoteStationManager
+- (wifi) TXOP durations were not always being traced
+
+Release 3.32
+------------
+
+### Availability
+
+This release is available from:
+https://www.nsnam.org/release/ns-allinone-3.32.tar.bz2
+
+### Supported platforms
+
+This release is intended to work on systems with the following minimal
+requirements (Note:  not all ns-3 features available on all systems):
+- g++-4.9 or later
+- Xcode 10.1 or later
+- Python 3.5 or later
+
+Starting with ns-3.30, Python 3 has been the only supported Python version,
+and scripts default to Python 3 usage.
+
+This release has been tested on the following systems:
+- Fedora 32 with g++-10.2.1 and Python 3.8.5
+- Fedora 32 with clang-10.0.0 and Python 3.8.5
+- Ubuntu 20.04 with g++-9.3.0 and Python 3.8.2
+- Ubuntu 18.04 with g++-7.5.0 and Python 3.6.9
+- Ubuntu 16.04.6 with g++-5.4.0 and Python 3.5.2
+- macOS 10.15.7 (Catalina) with Xcode 12
+- macOS 10.13.6 (High Sierra) with Xcode 10.1
+
+### New user-visible features
+
+- (build system) Added "--enable-asserts" and "--enable-logs" to waf configure,
+  to selectively enable asserts and/or logs in release and optimized builds.
+- (build system) The "--enable-build-version" option has been added to waf
+  configure, allowing users to embed version information in the libraries
+- (build system) Added support for EditorConfig
+- (config-store) Improved the RawTextConfig output (see !93)
+- (core) Added capability to configure STL pair and containers as attributes
+- (core) The default timestamp print format for logging statements has been
+  changed to use the As() method that prepends +/- and appends the time unit
+- (fd-net-device) Added two enhanced emulation devices based on netmap and DPDK
+- (mobility) Add CartesianToGeographic coordinate conversion capability
+- (network) Packet tags are now serialized and deserialized for distributed
+  simulations
+- (network) Added LollipopCounter, a sequence number counter type
+- (olsr) Some internal OLSR API has been opened up to enable cross-layer access
+- (tcp) Support for dynamic pacing in TCP.
+- (tcp) Added TcpLinuxReno congestion control (aligns with Linux 'reno'
+- (tests) test.py text output now distinguishes between TestSuites and TestCases
+  congestion control).
+- (traffic-control) Added, to PIE queue disc, queue delay calculation using
+  timestamp feature (Linux default behavior), cap drop adjustment feature
+  (Section 5.5 of RFC 8033), ECN (Section 5.1 of RFC 8033) and derandomization
+  feature (Section 5.4 of RFC 8033).
+- (traffic-control) Add support for L4S mode to CoDel and FqCoDel queue discs
+- (traffic-control) Add Active/Inactive feature to PIE queue disc.
+- (traffic-control) Add ECN and L4S support for CoDel, FqCoDel, Cobalt queues
+- (wifi) Add 6 GHz band support for 802.11ax
+- (wifi) RIFS support has been removed from the model
+
+### Bugs fixed
+
+- (applications) Handle possible partial socket sends (during emulation)
+- (applications) Remove stray exit call from OnOffApplication
+- (internet-apps) Fixes DHCP behaviour when interface goes down and back up
+- (lte) #224 - The scheduled SendMeasurementReport() event doesn't cancel after link failure detection
+- (mesh) - Enable possible use with SpectrumWifiPhy
+- (network) #264 - Rounding is more accurate for DataRate transmission times
+- (network) !424 - Fixed instantaneous send behavior in SimpleNetDevice when queue is empty
+- (tcp) !368 - Fix assert in tx-buffer when loss rate high and w/o SACK
+- (tcp) !367 - Stop to merge items whose m_lost values are different
+- (tcp) - Fix TcpRateOps to update m_ackElapsed like Linux
+- (traffic-control) #225 - Do not ECN mark packet twice within a CoDel queue
+- (wifi) - Fix radiotap header for received 802.11ax PPDUs
+- (wifi) - Do not send VHT capabilities when operating in 2.4 GHz band
+- (wifi) #252 - Correctly handle multicast frames
+
+Release 3.31
+------------
+
+### Availability
+
+This release is available from:
+https://www.nsnam.org/release/ns-allinone-3.31.tar.bz2
+
+### Supported platforms
+
+This release is intended to work on systems with the following minimal
+requirements (Note:  not all ns-3 features available on all systems):
+- g++-4.9 or later
+- Xcode 10.1 or later
+- Python 3.5 or later
+
+Starting with ns-3.30, Python 3 has been the only supported Python version,
+and scripts default to Python 3 usage.
+
+This release has been tested on the following systems:
+- Fedora 32 with g++-10.1.1 and Python 3.8.3
+- Fedora 32 with clang-10.0.0 and Python 3.8.3
+- Fedora 29 with g++-8.3.1 and Python 3.7.5
+- Ubuntu 20.04 with g++-9.3.0 and Python 3.8.2
+- Ubuntu 18.04 with g++-7.5.0 and Python 3.6.9
+- Ubuntu 16.04.6 with g++-5.4.0 and Python 3.5.2
+- macOS 10.15.3 (Catalina) with Xcode 11.3
+- macOS 10.13.6 (High Sierra) with Xcode 10.1
+
+### New user-visible features
+
+- (antenna) Model for antenna arrays based on 3GPP model (part of Integration of the 3GPP TR 38.901 fast fading model)
+- (buildings) Random walk mobility model that does not allow nodes to enter buildings
+- (core) The CommandLine facility can now add the Usage message to the Doxygen for the program
+- (internet) TCP DCTCP model
+- (internet) An option to enable IPv4 hash-based multicast duplicate packet
+  detection (DPD) based on RFC 6621
+- (lte) Trace sources for uplink PSD and RBs
+- (propagation) 3GPP TR 38.901 pathloss and channel condition models
+- (spectrum) Matrix-based channel model base class to support antenna arrays
+- (spectrum) 3GPP pathloss, channel and fast fading models
+- (stats) A new interface to SQLite
+- (tests) Capability to run an example program as a regression test
+- (traffic-control) Support for the Cake set-associative hash to the FqCoDel queue disc
+- (traffic-control) Support for ECN marking to CoDel and FqCoDel queue discs
+- (wifi) A Bianchi (saturation) example with a comparable MATLAB model
+- (wifi) The idealized wifi rate control includes better support for different MIMO modes and channel widths
+
+### Bugs fixed
+
+If available, the numbers below make reference to a Bugzilla bug number, GitLab
+issue number (prefixed by '#'), or GitLab merge request number (prefixed by '!')
+- (build system) #119 - Waf --lcov-report option was broken
+- (buildings) #80 - Update indoor/outdoor status of a moving node
+- (core) Bug 2725 - EmpiricalRandomVariable should not interpolate
+- (documentation) Bug 2636 - Add to doxygen a list of all registered TypeIds
+- (internet) - Fix Ipv6Prefix length calc and add explicit prefix length constructors
+- (internet) - IPv6 Duplicate Address Detection (DAD) must use Solicited-Node multicast address
+- (internet) #111 - Rip and RipNg don't receive unicast packets
+- (internet:tcp) - call NotifyConnectionFailed on SYN timeout
+- (internet:tcp) #179 - Avoid incorrect exit of LAST-ACK state
+- (internet:tcp) #182 - Fix SACK list cleaning in TcpOptionSack::Deserialize()
+- (internet:tcp) !156 - Enable entering CA_RECOVERY despite large sequence number increase
+- (internet:tcp) !157 - Prevent sending outside receiver window
+- (lr-wpan) #212 - Rx callback must have both source mac and pan id
+- (lr-wpan) !283 - Beacon collisions and timings
+- (lr-wpan) !326 - Inactive Periods Queue fix
+- (lte) #106 - Inconsistent imsi representation in LTE module
+- (lte) #196 - Remove LteSecondaryCellSelectionTestSuite from LTE module
+- (lte) #221 - Stop T310 upon receving handover command
+- (network) #216 - Correct the return value for PacketSocket::SendTo()
+- (network) !239 - Refactor DelayJitterEstimation to more closely follow RFC 1889 and RFC 3550
+- (propagation) !269 - Fix Okumura-Hata propagation loss model for frequency > 1.5 Ghz and medium or small city
+- (wifi) - Keep the medium busy if reception is aborted ahead of scheduled time
+- (wifi) - Fix frame capture when signals arrive at the exact same time and add additional tests to verify these cases
+- (wifi) - Fix MCS selection in ideal rate manager for cases with unbalanced MIMO settings and/or RX diversity
+- (wifi) - Fix SNR computations for MIMO
+- (wifi) - Fix ReportAmpduTxStatus called two times when BAR is explicitely sent upon missed BACK
+- (wifi)  A zero value for the backoff timer might be discarded and a new value
+  might be generated by an erroneous call to NotifyCollision().
+- (wifi) Bug 1909, Issue #41 - Implementation of ACK timeout
+- (wifi) Bug 2385, Issue #178 - IdealWifiManager can pick invalid WifiTxVector under certain MIMO conditions
+- (wifi) Bug 2928 - BlockAckManager::NeedBarRetransmission returns "true" infinitely
+- (wifi) Bug 2985 - PhyTxEnd tracecallback not implemented
+- (wifi) Bug 3011, Issue #172 - MIMO error rate model is incorrect
+- (wifi) #22 - Station long retry counter is incremented twice if BlockAck was not received
+- (wifi) #40 - IdealWifiManager not working if stations are moving
+- (wifi) #84 - Wi-Fi removing wrong header due to copy-paste error
+- (wifi) #94 - Retransmitted frames not marked as retransmits
+- (wifi) #107 - Frame capture model works incorrectly if two signals arrive at the same time
+- (wifi) #110 - PCAP trace file gives unexpected results
+- (wifi) #116 - Incorrect state when receiving A-MPDU in WifiPhy
+- (wifi) #165 - Notify station manager when a BlockAck has not been received after the transmission of an A-MPDU
+- (wifi) #169 - Ideal rate manager does not work when non best-effort traffic is used
+- (wifi) #211 - Remove MSDUs with expired lifetime when (re)starting channel access
+
+### Known issues
+
+In general, known issues are tracked on the project tracker available
+at https://gitlab.com/nsnam/ns-3-dev/issues
+
+Release 3.30.1
+--------------
+
+Release 3.30.1 is a maintenance release that fixes the following issues from
+the ns-3.30 release:
+
+- fix issue with Block Ack transmit window leading to low throughput or
+  connection dropping
+- fix invalid restriction on Wi-Fi VHT Capabilities MaxMpduLength field
+- support for Apple clang version 11.0.0 (macOS Catalina preview release)
+- fix the handling of ICMP time exceeded responses
+- fix syntax error in Wi-Fi-based Tap Bridge Python example
+
+### Availability
+
+This release is available from:
+https://www.nsnam.org/release/ns-allinone-3.30.1.tar.bz2
+
+### Supported platforms
+
+The list of supported platforms includes those listed for ns-3.30 plus
+- macOS 10.15 preview (Catalina) with Apple clang version 11.0.0
+
+### New user-visible features
+
+Features are identical to release 3.30.
+
+### Bugs fixed
+
+- Issue #62 - ICMP does not handle ICMPv4 TIME_EXCEEDED responses
+- Issue #77 - Wi-Fi VHT capabilities MaxMpduLength had invalid restriction
+- Issue #79 - Wi-Fi connection drop or low throughput due to Block Ack transmit window
+- Example program tap-wifi-virtual-machine.py had a syntax error
+- Issue #80 - Indoor/outdoor status is not updated when the node moves
+
+Release 3.30
+------------
+
+### Availability
+
+This release is available from:
+https://www.nsnam.org/release/ns-allinone-3.30.tar.bz2
+
+### Supported platforms
+
+This release is intended to work on systems with the following minimal
+requirements (Note:  not all features available on all platforms):
+- g++-4.9 or later
+- Xcode 10.1 or later
+- Python 3.5 or later
+
+Starting with ns-3.30, Python 3 will be the only supported Python version,
+and scripts will default to Python 3 usage.  Python 2.7 may continue to work
+in the near term.
+
+This release has been tested on the following systems:
+- Fedora 30 with g++-9.1.1
+- Ubuntu 19.04 with g++-8.3.0
+- Ubuntu 18.04 with g++-7.4.0
+- Ubuntu 16.04.6 with g++-5.4.0
+- Linux Mint 19 Tara with g++-7.3.0
+- macOS 10.14.6 (Mojave) with Xcode 10.3
+- macOS 10.13.6 (High Sierra) with Xcode 10.1
+
+### New user-visible features
+
+- (core) ShowProgress object can be used to report on simulation execution
+- (wifi) Preamble detection can now be modelled and is enabled by default.
+- (wifi) 802.11ax spatial reuse is now supported.
+- (lte) Radio Link Failure (RLF) functionality is now supported.
+- (lte) LTE/EPC model enhanced with new features: SGW, PGW, MME are full nodes; new S5 interface between SGW and PGW, allows simulations with multiple SGW/PGW
+- (lte) LTE eNB RRC extended to support improved S1 signalling model
+- (lte) Backhaul links can now use any link technology, not just point-to-point
+- (traffic-control) Cobalt queue disc model has been added.
+
+### Bugs fixed
+
+During this release cycle, the project transitioned from a Bugzilla issue
+tracker to a GitLab.com issue tracker.  Bugs fixed from the Bugzilla tracker
+include:
+
+- Bug 2339 - lte: Use only the active RBs for uplink PSD computation
+- Bug 2460 - wifi: Refactor detection thresholds in WifiPhy and add a new sensitivity threshold to throw away weak signals
+- Bug 2470 - wifi: Handshake to setup the Block Ack Agreement is not protected
+- Bug 2637 - build: macOS SDK headers in non-standard place
+- Bug 2860 - mobility: Set Z coordinate for position-allocation classes
+- Bug 2861 - lte: Forward TXOPs to the RLCs of SCCs
+- Bug 2893 - lte: GetPgw in helper should be const
+- Bug 2979 - lte: Remove unused code from UE RRC and UE CCM
+- Bug 2980 - lte: Reset MAC and PHY of secondary carriers upon handover
+- Bug 2982 - lte: Configure UE MAC SAP LteMacSapUser properly
+- Bug 2988 - lte:  Correction in L3 filtering formula used for UL power control
+- Bug 2990 - internet: IPv6 packet shouldn't be marked with SocketIpTtlTag
+- Bug 2992 - lte: Send method of the LteUeNetDevice doesn't use protocolNumber parameter
+- Bug 2993 - build: Waf --enable-sudo option broken
+- Bug 2997 - lte: EpcTft::PacketFilter::Matches does not use ipv6 address to match an IP packet
+- Bug 3007 - build: Boost library configuration in contrib
+- Bug 3027 - lte: S1 signalling is done before RRC connection establishment is finished
+
+Bugs fixed from the GitLab.com issue tracker include:
+
+- Issue #11 - mobility: Rectangle::GetClosestSide returns the correct side also for positions outside the rectangle
+- Issue #14 - build: Check file timestamps instead of hashes for changes
+- Issue #15 - build: Fix build erroneous order constraint warnings
+- Issue #27 - wifi: Re-compute the A-MPDU after an RTS/CTS exchange fails
+- Issue #28 - wifi: wifi error model: coded bits vs. data bits
+- Issue #30 - wifi: Sequence number wrap around in MacLow::ReceiveMpdu
+- Issue #32 - wifi: Example "rate-adaptation-distance.cc" fails.
+- Issue #33 - wifi: Issues with QosTxop::StartNextPacket
+- Issue #35 - wifi: Unexpected EDCA performance under virtual collisions for 802.11n
+- Issue #42 - wifi: Check configured capture window for capture
+- Issue #43 - core: Check if ObjectFactory has been configured
+- Issue #45 - wifi: Wi-Fi transmits frames outside BlockAck window
+- Issue #46 - internet: Export headers for transport protocol modularity
+- Issue #47 - core: Return non-const reference when a const Ptr is dereferenced
+- Issue #48 - wifi: Incorrect sequence comparison in BlockAckManager::NeedBarRetransmission
+- Issue #53 - lte: Token Bank Fair Queue Scheduler is creating a transmit opportunity of 0 bytes
+- Issue #54 - lte: RadioBearerStats are not correctly connected
+- Issue #70 - visualizer: Update configuration of GooCanvas.CanvasEllipse
+- Merge request !19 - wifi: Rework MSDU and MPDU aggregation code
+- Merge request !22 - spectrum: Fix order of PHYs stored in MultiModelSpectrumChannel
+- Merge request !30 - lte: Fix PDU delivering at the edge of reordering window
+- Merge request !43 - traffic-control: Install FqCoDelQueueDisc by default
+- Merge request !55 - lte: Reset preamble transmission count before starting NC based RACH
+- Merge request !65 - tcp: Call BytesInFlight method before processing ack
+- Merge request !67 - wifi: Pass number of data bits instead of coded bits to error models
+- Merge request !85 - uan: Fix MAC address variable shadowing in subclasses
+
+Other issues fixed:
+
+- core: Replace int64_t operator/(Time,Time) with exact int64x64_t version, add int64x64_t scaling.
+- core: Refactor LogTimePrinter, LogNodePrinter
+- energy: Update remaining energy even if simulation has finished
+- flow-monitor:  Fix FlowMonitor::Stop () method
+- mobility: Allow AssignStreams after construction for SteadyStateRandomWaypointMobilityModel
+- lte: Add attribute to configure the periodicity of DL CQI reports
+- lte: Fix type of them_rapIdRntiMap key
+- lte: Various updates of the ComponentCarrier subclasses to accommodate NR
+- lte: Fix issue with use of packet tag in LTE PDCP and RLC by using byte tag
+- visualizer:  Fix various issues with Python 3 and X server compatibility
+- wifi: Fix A-MPDU reception logic
+- wifi: Fix noise interference calculation
+- wifi: Do not allow S-MPDU transmission as long as ADDBA handshake not established
+- wifi: Fix frequencies for channels 54 and 126
+- wifi: Fix rate used to send Block Ack Request frames
+- wifi: Check that SSID in probe requests is either broadcast or corresponds to AP SSID
+- wifi: Do not call ReportDataFailed if retransmission not needed
+- wifi: Fix duplicate MPDUs sent in an A-MPDU when explicit BARs are disabled
+- wifi: Fix issues when MSDU lifetime is expired
+- wifi: Enforce capture window duration in frame capture model, and fix capture model for A-MPDU
+- wifi: Correct handling of timeout situations during block ack agreement setup
+- wifi: Return correct serialized size for AmpduTag
+- wifi: Fix incorrect channel width when HT, VHT, or HE STA received legacy PPDU
+
+### Known issues
+
+In general, known issues are tracked on the project tracker available
+at https://gitlab.com/nsnam/ns-3-dev/issues
+
+Release 3.29
+------------
+
+This release is dedicated to the memory of project co-founder George Riley.
+
+### Availability
+
+This release is available from:
+https://www.nsnam.org/release/ns-allinone-3.29.tar.bz2
+
+### Supported platforms
+
+This release is intended to work on systems with the following minimal
+requirements (Note:  not all features available on all platforms):
+- g++-4.9 or later
+- Apple LLVM version 7.0.2 or later
+- clang-3.3 or later
+
+In addition, Python 2.7 (Python 2 series) or Python 3.4-3.7 (Python 3 series)
+
+This release has been tested on the following platforms:
+- Ubuntu 18.04 (64 bit) with g++-7.3.0 and Python 2.7.15
+- Ubuntu 16.04 (64 bit) with g++-5.4.0 and Python 2.7.12/3.5.2
+- Fedora Core 28 (64 bit) with g++-8.1.1 and Python 2.7.15/3.7.0
+- Fedora Core 26 (64 bit) with g++-7.3.1 and Python 2.7.14/3.6.5
+- macOS High Sierra 10.13.5 with Xcode 9.4.1, Apple LLVM version 9.1.0, Python 2.7.10
+
+### New user-visible features
+
+- (buildings) A new position allocator has been added to the buildings module.
+  The allocator places nodes randomly but in a manner that rejects positions
+  that are located within buildings defined in the scenario.
+- (applications) Add 3GPP HTTP model
+- (traffic-control) Add priority queue disc (PrioQueueDisc)
+- (tcp) Added PRR as recovery algorithm
+- (wifi) Add a new trace source to StaWifiMac to trace beacon arrivals
+- (network) Add a method to allow random variable-based jitter to be added
+  to the start times of applications in a container.
+- (network) Add a method to check whether a node with a given ID is within
+  a NodeContainer.
+- (spectrum) A new trace source named "Gain" is added to the SpectrumChannel class.
+  This trace is fired whenever a new path loss value is calculated. It exports pointers
+  to the mobility model of the transmitter and the receiver, Tx antenna gain, Rx antenna gain,
+  propagation gain and the pathloss value.
+- (wifi) It is now possible to transmit A-MPDUs containing up to 256 MPDUs (802.11ax only)
+
+### Bugs fixed
+
+- Bug 2299 - uan: WOSS integration missing patch
+- Bug 2399 - wifi: Improve scanning procedure of StaWifiMac
+- Bug 2451 - bindings: (partial fix) generating ILP32 bindings from LP64
+- Bug 2461 - core: CommandLine should handle non-option arguments
+- Bug 2772 - bridge:  Bridge doesn't learn from packets sent to it
+- Bug 2801 - fd-net-device: FdNetDevice device MTU is not set correctly
+- Bug 2819 - traffic-control: FqCoDel handling of non-IP packets
+- Bug 2891 - netanim:  dumbbell-animation breaks when RightCount > LeftCount
+- Bug 2901 - core: Add CommandLine::Parse (const std::vector<std::string>> args)
+- Bug 2902 - build: missing modules cause Waf to run indefinitely
+- Bug 2908 - build:  Check if pybindgen version exists before use
+- Bug 2911 - aodv:  Binary exponential backoff can become unlimited
+- Bug 2914 - tcp: Adv Win resilience to SequenceNumber wrap-around
+- Bug 2915 - build: Enforce gcc minimum version
+- Bug 2920 - wifi: Default MaxSlrc and fragmentation threshold values differ from standard
+- Bug 2921 - tcp: Add min_cwnd variable to LEDBAT
+- Bug 2923 - tap-bridge: UseLocal mode uses wrong MAC address
+- Bug 2924 - traffic-control:documentation about Peek/Dequeue usage
+- Bug 2925 - wifi: MinstrelHt provides strange results at low SNR with A-MPDU enabled
+- Bug 2926 - wifi: SSRC and SLRC mechanism not fully aligned to the standard
+- Bug 2927 - lte:  Valgrind error in lena-x2-handover example
+- Bug 2931 - traffic-control: QueueDisc drops the CE marked packets
+- Bug 2936 - Disable -Wparentheses with GTK+ and gcc-8
+- Bug 2938 - build: add --disable-werror flag to Waf
+- Bug 2940 - traffic-control: QueueDisc SojournTime should be TracedCallback
+- Bug 2941 - wifi: Order bit of Frame control field of WifiMacHeader not correctly set for some frames
+- Bug 2948 - network: SetPriority does not support value 7
+- Bug 2949 - test: Exit test.py if incorrect fullness option used
+- Bug 2964 - wifi: IdealWifiManager keeps using the same MCS when all transmissions fail
+- Bug 2974 - lte: Inconsistent declaration of IPV6 methods
+
+### Known issues
+
+In general, known issues are tracked on the project tracker available
+at http://www.nsnam.org/bugzilla/
+
+Release 3.28
+------------
+
+### Availability
+
+This release is available from:
+https://www.nsnam.org/release/ns-allinone-3.28.tar.bz2
+
+### Supported platforms
+
+This release is intended to work on systems with the following minimal
+compiler requirements (other compilers supporting C++11 may also work):
+- g++-4.9 or later
+- Apple LLVM version 7.0.2 or later
+- clang-3.3 or later
+In addition, a Python 2.7 (Python 2 series) or Python 3.4 (Python 3 series)
+or later is required.
+
+This release has been tested on the following platforms:
+- Ubuntu 17.10 (64 bit) with g++-7.2.0 and Python 2.7.14
+- Ubuntu 16.04 (64 bit) with g++-5.4.0 and Python 2.7.12
+- Fedora Core 27 (64 bit) with g++-7.3.1 and Python 2.7.14
+- Fedora Core 26 (64 bit) with g++-7.3.1 and g++-7.1.1, and Python 2.7.14
+- CentOS/RHEL 7.4 (64-bit) with g++-6.3.1 and Python 3.5.1
+  - Note: the default g++ version (4.8) must be upgraded
+- CentOS/RHEL 6.8 (64-bit) with g++-4.9.2 and Python 2.7.13
+  - Note: the default g++ version (4.4) must be upgraded
+  - Note: the default Python version (2.6) must be upgraded
+- OS X Sierra 10.12.6 with Xcode 9.2, Apple LLVM version 9.0.0, Python 2.7.13
+- OS X Yosemite 10.10.5 with Xcode 7.2.1, Apple LLVM vers. 7.0.2, Python 2.7.10
+
+### New user-visible features
+
+- (tcp) Added TCP-LP as a congestion control module
+- (tcp) When TCP SACK is enabled, the third rule defined in RFC 6675 regarding the next segment to transmit is followed
+- (tcp) Separated the CongestionWindow trace into a CongestionWindow trace and a CongestionWindowInflated trace, where the latter tracks window inflation during loss recovery as defined by the Reno algorithm
+- (tcp) Implemented the core functionality of TCP Pacing.
+- (lr-wpan) Extended addressing mode is now supported.
+- (internet) Ipv[4,6]AddressGenerator can now check if an address or a network is already allocated.
+- (internet) Ipv6AddressHelper has more pedantic checks, but more than one such helper can now be used in a program.
+- (lte) UEs can now use IPv6 to send and receive traffic.
+- (uan) The UAN module now supports an IP stack
+- (uan) Added some examples for running raw, IPv4, IPv6, and 6LoWPAN over UAN
+- (traffic-control) Added a FIFO queue disc (FifoQueueDisc) and the Token Bucket Filter (TbfQueueDisc).
+
+### Bugs fixed
+
+- Bug 1745 - There can be only one Ipv6AddressHelper in a script
+- Bug 1783 - tcp: Experiencing drops during fast recovery causes TCP's congestion window to blow up. Not anymore.
+- Bug 2107 - lte: Enable PCAP for S1 and X2 point-to-point links
+- Bug 2152 - lte: Fix uplink HARQ retx. out of synch at the MAC layer
+- Bug 2151 - lte: Generate correct redundancy version in uplink HARQ
+- Bug 2277 - lte: EpcTftClassifier::Classify blindly assumes that a packet has a L4 header
+- Bug 2505 - network:  Avoid asserts in Header/Trailer deserialization
+- Bug 2653 - tcp: Avoid saving smaller TS in case of packet reordering
+- Bug 2656 - wifi: Minstrel and MinstrelHt provide different results for 802.11a/b/g
+- Bug 2754 - lte: Incorrect arguments passed to Asn1Header::SerializeInteger
+- Bug 2764 - wifi: WifiSpectrumModelId doesn't distinguish 11ax from legacy
+- Bug 2766 - core: Modify logging for int64x64 to avoid stack overflow
+- Bug 2768 - lte: LteUeNetDevice has a null MAC address
+- Bug 2774 - wifi: Wifi Transmitter Sends ADDBA Request Continuously Even After Transmitting Delba Frame
+- Bug 2791 - wifi: Interference Helper gives negative trace value for Interference Power
+- Bug 2807 - energy: GetTotalEnergyConsumption is not updated correctly
+- Bug 2809 - wifi: Wifi doesn't fully stop when energy is depleted
+- Bug 2813 - wifi: OFDM 10 MHz and 5 MHz PHYs do not have correct subcarrier frequency spacings
+- Bug 2820 - wifi: segmentation fault when Rrpaa wifi manager is used
+- Bug 2821 - lte: Set correct limit for UL retx. in Round Robin scheduler
+- Bug 2824 - ICMP opcode fr fragment timeout drop is wrong
+- Bug 2826 - wifi: Management frames should be sent using the lowest basic rate
+- Bug 2827 - wifi: Active scanning not working with 802.11n/ac/ax
+- Bug 2828 - OLSR simple P2P example produces wrong results
+- Bug 2831 - wifi: runtime channel width switch has no effect
+- Bug 2832 - tcp: Partial ACK triggering repeated retransmission
+- Bug 2836 - wifi: Missing VHT information in radiotap header when A-MPDU is used
+- Bug 2838 - wifi: ht-wifi-network crashes with RTS/CTS enabled and frequency set to 2.4GHz
+- Bug 2840 - lte: Wrong configuration of eNBs and UEs
+- Bug 2843 - spectrum, wifi: Incorrect channel width and center frequency provided for non-HT PPDUs when building SpectralDensity
+- Bug 2848 - wifi: Association ID not correctly set upon association
+- Bug 2849 - lte: Received RLC and PDCP PDUs are missing in the stats files
+- Bug 2854 - wifi: Fix 802.11ax channel width capabilities
+- Bug 2856 - wifi: Correct bugs and improve logging in MinstrelHt
+- Bug 2859 - tcp: calculation of BytesInFlight during partial recovery is fixed
+- Bug 2866 - tcp: Removed VS warnings on TcpSocketBase
+- Bug 2872 - csma: Packet copy in CsmaChannel breaks netanim tracing
+- Bug 2873 - tcp: Potential SIGFPE in TcpYeah
+- Bug 2874 - tcp: Corrected interpretation of RFC 6675 for IsLost check
+- Bug 2875 - tcp: Use Rule3 of RFC6675 only with SACK enabled
+- Bug 2876 - tcp: Do not shrink adv window after we send the FIN
+- Bug 2877 - wifi: Wrong data types for CWmin and CWmax
+- Bug 2885 - lte: Tests fail for CQA and PSS testsuites
+- Bug 2890 - internet: Icmpv4 "ECHO" is defined in system-wide headers
+- Bug 2898 - lte: Coding issue in function RrcAsn1Header::DeserializeRachConfigCommon
+- Bug 2899 - lte: Inconsistent type for variable cellForWhichToReportCGI
+- wifi:  Fix wrong guard band for SpectrumWifiPhy DSSS/HR-DSSS
+
+### Known issues
+
+In general, known issues are tracked on the project tracker available
+at http://www.nsnam.org/bugzilla/
+
+Release 3.27
+------------
+
+### Availability
+
+This release is available from:
+https://www.nsnam.org/release/ns-allinone-3.27.tar.bz2
+
+### Supported platforms
+
+This release is intended to work on systems with the following minimal
+requirements (Note:  not all features available on all platforms):
+- g++-4.9 or later (Note:  this is an upgraded requirement from ns-3.26)
+- Apple LLVM version 7.0.2 or later
+- clang-3.3 or later
+- Python 2.7 (Python 2 series) or Python 3.4 (Python 3 series) or later
+
+This release has been tested on the following platforms:
+- Ubuntu 17.04 (64 bit) with g++-6.3.0
+- Ubuntu 16.04 (64 bit) with g++-5.4.0
+- Ubuntu 14.04.5 (64 bit) with g++-4.9.4
+  - Note: the default g++ version (4.8) must be upgraded
+- Fedora Core 26 (64 bit) with g++-7.1.1
+- Fedora Core 22 (64 bit) with g++-5.3.1
+- CentOS/RHEL 7.4 (64-bit) with g++-6.3.1
+  - Note: the default g++ version (4.8) must be upgraded
+- CentOS/RHEL 6.8 (64-bit) with g++-4.9.2
+  - Note: the default g++ version (4.4) must be upgraded
+  - Note: the default Python version (2.6) must be upgraded
+- OS X Sierra 10.12.6 with Xcode 9.0 and Apple LLVM version 9.0.0
+- OS X El Capitan 10.11.6 with Xcode 8.2.1 and Apple LLVM version 8.0.0
+- OS X Yosemite 10.10.5 with Xcode 7.2.1 and Apple LLVM version 7.0.2
+- Windows 10 Linux Subsystem with g++-5.4.0
+
+### New user-visible features
+
+- (build) Modules can also be located in contrib/ directory (as well as src/)
+- (core) Logging timestamp precision has been improved
+- (lte) LTE carrier aggregation feature according to 3GPP Release 10 is now supported.
+- (traffic-control) CsmaNetDevice, SimpleNetDevice and WifiNetDevice support flow control.
+- (traffic-control) Added support for queue discs to mark packets, and ECN support has been added to RED
+- (traffic-control) A multi-queue aware queue disc modelled after Linux mq
+- (traffic-control) Added support for detailed statistics output of queue discs
+- (traffic-control) Added support for tracing queue sojourn times
+- (tcp) The SACK option and the RFC 6675 loss recovery algorithm are now supported.
+- (tcp) A LEDBAT model has been added.
+- (wifi) 802.11ax High Efficiency (HE) physical layer modes are now supported.
+- (wifi) A new RRPAA rate control mechanism has been added.
+- (wifi) A new trace source for TXOP duration is now supported
+- (wifi) Frame capture effect can now be modelled
+- (uan) World Ocean System Simulation (WOSS) integration, and new PER models
+
+### Bugs fixed
+
+- Bug 1034 - wifi: No trace source for packet dropping from WifiMacQueue
+- Bug 2007 - uan: Remove deprecation on SetRxThresholdDb
+- Bug 2048 - lte: Fix scheduler resource allocation when CQI==0 (out of rante)
+- Bug 2133 - tcp: Avoid assert when receiving data in FIN_WAIT_1 or _2 states
+- Bug 2214 - tcp: Use of ScheduleNow only in selected part of the code
+- Bug 2221 - network: Remove constraint on size of ns3::Packet Tag objects
+- Bug 2256 - tcp: bytes in flight now updated in TcpTxBuffer
+- Bug 2263 - tcp: Support processing of multiple TCP options
+- Bug 2285 - tcp: Loss of ack of SYN can cause improper connection setup
+- Bug 2367 - wifi: BlockAckManager does not remove iterators to freed items
+- Bug 2450 - propagation: LogDistancePropagationLossModel is not continuous
+- Bug 2456 - lte: MemberCschedSapProvider and Member CschedSapProvider templates
+- Bug 2464 - spectrum: Store spectrum conversion matrix in CSR format
+- Bug 2467 - spectrum: Do not schedule StartRx for receivers on other models
+- Bug 2471 - wifi: unable to disable Block Ack agreement for 802.11n
+- Bug 2477 - wifi: DCF manager assert
+- Bug 2485 - traffic-control: Check queue full before checking RED thresholds
+- Bug 2491 - wifi: replace DcfManager::MY_DEBUG
+- Bug 2492 - uan: Make use of RxGain attribute in UanPhyGen class
+- Bug 2511 - wifi: HT Greenfield is not working
+- Bug 2512 - traffic-control: Byte mode not configured correctly for RED test
+- Bug 2513 - core: ParetoRandomVariable needs a "scale", not a "mean" attribute
+- Bug 2518 - build: Suppress printing of list of modules for Python programs
+- Bug 2519 - lte: m_windowOffsetsMap.end () dereference
+- Bug 2520 - examples: TCP variant not configured in wifi-tcp.cc
+- Bug 2521 - internet: Include ipv6-option.h in wscript
+- Bug 2523 - lte: Generate the RLC PDU properly
+- Bug 2527 - internet: PrintRoutingTable adds an optional Time::Units parameter
+- Bug 2528 - wifi: 802.11n RIFS cannot be enabled
+- Bug 2529 - wifi: Missing trace for Block ACK timeout or missing MPDUs
+- Bug 2530 - aodv: Rename aodv::SetBalckListTimeout to aodv::SetBlackListTimeout
+- Bug 2531 - lte: Set HARQ feedback default value to avoid false retrasmissions
+- Bug 2532 - wifi: Inconsistencies between 802.11n MCS and NSS value in TXVECTOR
+- Bug 2533 - wifi: Provide better 802.11n/ac PHY abstraction for SIMO/MISO/MIMO
+- Bug 2534 - traffic-control: ARED and PIE examples should return 1 upon exit
+- Bug 2535 - utils: memory leak in bench-simulator.cc
+- Bug 2536 - wimax: fixed dead assignment and potential memory leak in wimax
+- Bug 2537 - traffic-control: Fix dead assignment on CoDel::DoDequeue
+- Bug 2538 - tap-bridge: fixed dead assignment on tap-bridge
+- Bug 2540 - mesh: fixed dead assignment on mesh/ie-dot11s-perr
+- Bug 2541 - wifi: preamble not assigned correctly
+- Bug 2542 - wifi: dead assignment on wifi mac-low
+- Bug 2543 - lte: Fix when EstimateUlSinr returns NO_SINR
+- Bug 2545 - flow-monitor: Optimized build fails for flow-monitor
+- Bug 2547 - tcp: dead assignments on various tcp congestion controls
+- Bug 2551 - wifi: wifi preamble should be part of TXVECTOR
+- Bug 2552 - wifi: Remove code duplication between Yans and Spectrum
+- Bug 2554 - wave: Fix static analysis warning
+- Bug 2556 - csma, point-to-point: Avoid modification of transmitted packets
+- Bug 2557 - point-to-point:  Fix dead assignments in queue-discs-benchmark
+- Bug 2559 - tcp: TCP advertised window still incorrect
+- Bug 2561 - tcp: TCP can not use Connect after a BindToNetDevice
+- Bug 2563 - bindings: pybindgen version check to >= minimum version required
+- Bug 2564 - wifi: Simulation crashes when CtsTimeout triggered for A-MPDU
+- Bug 2565 - tcp: Do not wait for 2*MSL to notify socket close
+- Bug 2566 - wifi: BlockAckManager::GetNRetryNeededPackets missing some packets
+- Bug 2568 - examples: Avoid enumerating TCP variants
+- Bug 2577 - wifi: crashes when A-MPDU and multiple TOS used, upon CTS timeout
+- Bug 2578 - wifi: Unexpected assert "Internal collision but no packet in queue"
+- Bug 2584 - wifi: MacLow triggers StartNext even if there is no TXOP
+- Bug 2587 - tcp: Avoid overflow in htcp.cc
+- Bug 2590 - traffic-control: Minor enhancements in red-queue-disc{.h, .cc}
+- Bug 2591 - wifi: 802.11e Block Ack cannot be enabled on HT/VHT stations
+- Bug 2594 - wifi: vht-wifi-network very low throughtput at MCS 6, 160 MHz, SGI
+- Bug 2596 - network: EthernetTrailer::GetFcs() should be const
+- Bug 2601 - wifi: HT stations should use 40 MHz width if configured  80 or 160z
+- Bug 2604 - wifi: QosData frames separation with Block Ack enabled
+- Bug 2605 - wifi: HT/VHT station sending to legacy results in null throughput
+- Bug 2606 - wifi: Ideal rate manager for HT/VHT station to a legacy AP
+- Bug 2607 - wifi: Correct overflow in channel width loop in Minstrel HT
+- Bug 2613 - tcp: MaxRxSequence () is sometimes too large
+- Bug 2614 - internet: RIP header version should be set to 2
+- Bug 2615 - wifi: When the TXOP limit is nonzero, fragment in some cases
+- Bug 2617 - traffic-control: PfifoFastQueueDisc::Peek all bands
+- Bug 2621 - wifi:  Fix mismatch between log message and action
+- Bug 2624 - lte: Inconsistent coding of type and naming
+- Bug 2627 - internet: Ipv6RawSocket does not honor the bound interface
+- Bug 2628 - wifi: Simulation crashes because of an out of range TID
+- Bug 2629 - wifi: Assert failure in MinstrelHtWifiManager::GetLowestIndex
+- Bug 2632 - lte: Build error due to uninitialized variable in rem helper
+- Bug 2646 - lte: lena-simple-eps-emu example will never work
+- Bug 2647 - wifi: ideal-wifi-manager-example crashes when NSS > 1
+- Bug 2649 - tcp: Disabling TCP SACK doesn't fall back to NewReno
+- Bug 2654 - wifi: Rraa wifi manager cannot be used with 802.11b
+- Bug 2655 - wifi: A-MPDU simulation using TCP sometimes fails
+- Bug 2658 - core: Avoid unexpected TracedValue type conversions
+- Bug 2660 - traffic-control: TrafficControlHelper::Default configuration
+- Bug 2661 - wave: Fix outdated class references in documentation
+- Bug 2665 - internet: Ipv4RawSocket can not send to broadcast or multicast
+- Bug 2666 - lte: Remove deprecated variables/config paths
+- Bug 2668 - various: Make template classes use NS_LOG_* macros
+- Bug 2671 - internet: ArpCache::Entry::SetMacAddress is misspelled
+- Bug 2673 - wifi: run-time channel switch does not update WiFi spectrum model
+- Bug 2675 - traffic-control: Use correct string value in PIE example
+- Bug 2716 - tcp: TCP socket ignoring FIN flag when in FIN_WAIT state
+- Bug 2717 - internet: Fix mask for Ipv4RoutingTableEntry::CreateDefaultRoute
+- Bug 2722 - wifi: 802.11g sends DSSS spectrum signals inappropriately
+- Bug 2731 - lte: Allow retranmission in RLC AM when PR expires, vtS overflows
+- Bug 2732 - applications: BulkSend Tx trace is fired too much
+- Bug 2733 - wifi: Ideal wifi manager cannot handle NSS higher than 1
+- Bug 2741 - internet: IPv4 fragmentation fails on last fragment fragmentation
+- Bug 2744 - wifi: 802.11n/ac with RTS/CTS crashes for a large number of nodes
+- Bug 2751 - traffic-control: QueueDisc::Enqueue() order of operations
+- Bug 2756 - internet: Ipv4AddressGenerator underestimates available addresses
+- Bug 2757 - wifi: 802.11n/ac/ax maximum TXOP is not properly enforced
+- Bug 2758 - internet: IPv4 sockets bound to unicast receiving subnet broadcast
+- Bug 2759 - internet: Packet conversion from broadcast to subnet-directed
+- Bug 2760 - internet: OLSR uses unicast-bound sockets to receive broadcasts
+- Bug 2761 - wifi: Packet has no Traffic ID for CTS frames when A-MPDU is used
+- Bug 2762 - internet: BindToNetDevice behaviour is not coherent with Linux
+- Bug 2763 - wifi: management packets in PCAPs are marked as wrong by Wireshark
+- Bug 2769 - tcp: Set ssthresh correctly upon RTO
+- Bug 2771 - wifi: IdealWifiManager problems under different number of antennas
+- Bug 2776 - wifi: Fix segmentation fault in MacLow
+- Bug 2777 - lte: Save bearer info in m_drbMap, needed for handover request
+- Bug 2781 - tcp: Do not go beyond limit in TcpTxBuffer
+- Bug 2783 - wifi: MonitorSnifferRx SNR is invariant to RxNoiseFigure
+- Bug 2786 - lte:  Remove unimplemented declaration
+- Bug 2796 - tcp: NSC TCP transmission flow control not working
+
+### Known issues
+
+In general, known issues are tracked on the project tracker available
+at http://www.nsnam.org/bugzilla/
+
+Release 3.26
+------------
+
+### Availability
+
+This release is available from:
+https://www.nsnam.org/release/ns-allinone-3.26.tar.bz2
+
+### Supported platforms
+
+This release is intended to work on systems with the following minimal
+requirements:
+- g++-4.8 or later
+- clang-3.3 or later
+- Python 2.7 (Python 2 series)
+- Python 3.4 or later (Python 3 series)
+
+This release has been tested on the following platforms:
+- Ubuntu 16.04 (64 bit) with g++-5.4.0
+- Ubuntu 14.04 (64 bit) with g++-4.8.2
+- Fedora Core 24 (64 bit) with g++-6.1.1
+- Fedora Core 22 (32 bit) with g++-5.3.1
+- Fedora Core 21 (64 bit) with g++-4.9.2
+- CentOS/RHEL 6.7 (64-bit) with g++-4.9.2
+- OS X El Capitan 10.11.4 with Xcode 7.3.1 and Apple LLVM version 7.3.0
+- OS X El Capitan 10.11.3 with Xcode 7.2.1 and Apple LLVM version 7.0.2
+
+### New user-visible features
+
+- (aodv) The node search radius is increased progressively (as per standard).
+- (build system) New --check-config option to waf to reprint the summary
+  of optional features which are configured.
+- (build system) C++11 features are now supported in the codebase
+- (core) DES Metrics support; see the API docs for class DesMetrics.
+- (internet) Added TCP Vegas, Scalable, Veno, Illinois, Bic, YeAH, and
+  H-TCP congestion control algorithms
+- (internet) Add a TOS field to the InetSocketAddress class
+- (network) SocketAddressTag has been removed from the codebase.
+  Users can use RecvFrom (for UDP) or GetPeerName (for TCP) instead.
+- (traffic control) Added the FQ-CoDel and PIE queue disc models
+- (traffic control) Introduce Byte Queue Limits (BQL)
+- (wifi) A new SpectrumWifiPhy physical layer model, making use of the
+  ns-3 spectrum framework, has been introduced.  The current version of
+  this model matches the API and behavior of YansWifiPhy closely, but
+  over time is expected to support a different PHY abstraction and error
+  models.
+- (wifi) IEEE 802.11e TXOP limits are now enforced for different access
+  categories when a QoS MAC is configured.
+
+### Bugs fixed
+
+- Bug 231 - Avoid adding SocketAddressTag (at all)
+- Bug 1579 - Final fix for segfault caused by EDCA fragmentation
+- Bug 1797 - Rate adaptation algorithms don't work with new 802.11n/ac standards
+- Bug 1911 - AODV doesn't work with more than one NetDevice
+- Bug 1939 - Aggregating the same object to two nodes produce unexpected results
+- Bug 1977 - v4Ping verbose output when not explicitly stopped
+- Bug 2057 - ARP and Ndisc caches should be updated by receiving valid L3 packets
+- Bug 2069 - Avoid integer overflow in ByteTagList
+- Bug 2102 - Ipv4GlobalRouting confused by bridged interfaces
+- Bug 2123 - AODV doesn't use / honor IP TTL in the RREQ / RREP
+- Bug 2149 - support deprecating attributes and trace sources
+- Bug 2222 - incorrect EDCA behavior in case of internal collision
+- Bug 2270 - Support -std=c++11 by default
+- Bug 2306 - Raise DCF IsBusy() condition for CCA busy
+- Bug 2307 - Get rid of m_receivedAtLeastOneMpdu flag
+- Bug 2308 - PacketTag instead of ByteTag in LTE PDCP/RLC
+- Bug 2344 - Attribute names can't have spaces
+- Bug 2346 - sixlowpan CompressionThreshold limit can be violated
+- Bug 2347 - LrWpan Ascii traces are hooked to the wrong traces.
+- Bug 2351 - Fix symbol rate calculation for channels with 10 and 5 MHz width
+- Bug 2352 - Add 'drop oldest' drop policy to WifiMacQueue
+- Bug 2369 - Generate backoff if DCF requests access during AIFS
+- Bug 2375 - Flowmonitor parse crashes when no pkt is received
+- Bug 2376 - New A-MPDU might not be received if MPDUs of a previous A-MPDU are lost
+- Bug 2377 - SocketIpTosTag and SocketIpv6TclassTag may be added twice in UDP
+- Bug 2378 - A-MPDU variables are not correctly reset in YansWifiPhy when a PLCP preamble/header failed
+- Bug 2379 - BlockAckRequest should not be part of single-TID A-MPDUs
+- Bug 2380 - EdcaTxopN fails to retrieve TID for ADDBA requests, ADDBA responses and DELBA frames
+- Bug 2383 - IPv4 header for reassembled packets reports a wrong payload size
+- Bug 2386 - Move UanPhyGen out of Tx mode when energy depleted
+- Bug 2387 - Fix waf --check-profile command
+- Bug 2390 - WaypointMobilityModel::AddWaypoint lazy notify schedules an event using absolute time (should be relative time)
+- Bug 2392 - SYN segment advertised window should not be scaled
+- Bug 2395 - Upgrade pybindgen for Python >= 3.5
+- Bug 2396 - move utility functions to WifiPhy
+- Bug 2397 - add backoff and cw tracing to EDCA
+- Bug 2398 - add SNR tag to beacons and probe responses
+- Bug 2401 - Deserialize correctly the len of options in TcpHeader
+- Bug 2402 - IPv4 Interface forwarding state is not honored
+- Bug 2406 - Poor 802.11g performance in ad-hoc mode
+- Bug 2408 - Simulation fails when 802.11n/ac is running with HT Minstrel and pcap enabled
+- Bug 2412 - align WifiPhy frequency and channel number
+- Bug 2414 - UdpSocket doesn't call NotifyConnectionFailed
+- Bug 2419 - BsmApplication should use RecvFrom and not SocketAddressTag
+- Bug 2420 - Remove code duplication between Wifi and Wave modules
+- Bug 2421 - Forbid negative RemainingAmpduDuration for the last A-MPDU
+- Bug 2425 - UdpSocketImpl simplification
+- Bug 2427 - 802.11ac selects wrong slot duration
+- Bug 2433 - Bic does not copy private parameters
+- Bug 2436 - Do not send block ack if received A-MPDU not addressed to station
+- Bug 2438 - Routing protocols should stop processing packets coming from a non-forwarding interface
+- Bug 2439 - SixLowPan Compression kind need to be casted to int in the Print function
+- Bug 2440 - SocketIpTosTag might be added twice if a packet is sent multiple times
+- Bug 2442 - ConfigStore crash if object container has null item
+- Bug 2443 - Increase application counters to accommodate Gbps transfer rates
+- Bug 2444 - PcapHelper DataLinkType enum should have a name
+- Bug 2445 - Out of bounds array access in Minstrel HT rate control
+- Bug 2446 - Fix comma delimiter instead of pipe delimiter in Attributes
+- Bug 2448 - Run examples in traffic control test suite
+- Bug 2452 - Add Object::IsInitialized method
+- Bug 2454 - DsrRouting::NotifyDataReceipt is also triggered for wifi management packets
+- Bug 2461 - TCP BIC should copy private members
+- Bug 2468 - Simulation with A-MPDU enabled hangs when fragmentation threshold is smaller than MSDU size
+- Bug 2469 - send Block Ack Request upon short/long retry failures
+- Bug 2474 - UdpEchoClient does not call Connect with addresses of type Inet[6]SocketAddress
+- Bug 2477 - Partial fix for wifi asserts when transmit cancels a reception
+- Bug 2479 - Flow monitor does not a have a "DROP_QUEUE_DISC" drop reason
+- Bug 2480 - Use SQLite prepared statements
+- Bug 2481 - Missing or incorrect group names
+- Bug 2484 - Corrected the exit from CA_LOSS state in TCP
+- Bug 2486 - NextTxSequence was not traced back from TCB
+- Bug 2488 - Error in UanPdp::SumTapsFromMaxNc
+- Bug 2496 - BSS membership selector in SupportedRates
+- Bug 2500 - Ipv[4,6]RawSocket ignores IpTtl tag
+- Bug 2507 - ConfigStore RawTextConfigLoad doesn't reset stream error state
+- Bug 2508 - Duplicate of bug 2507
+- Bug 2514 - The maximum transmission time for VHT A-MPDUs is not correct
+- No BugId - Arp logging: label with request or reply properly
+
+### Known issues
+
+In general, known issues are tracked on the project tracker available
+at http://www.nsnam.org/bugzilla/
+
+Release 3.25
+------------
+
+### Availability
+
+This release is available from:
+https://www.nsnam.org/release/ns-allinone-3.25.tar.bz2
+
+### Supported platforms
+
+This release has been tested on the following platforms:
+- Ubuntu 15.10 (64 bit) with g++-5.2.1
+- Ubuntu 14.04 (64 bit) with g++-4.8.2
+- Fedora Core 23 (64 bit) with g++-5.3.1
+- Fedora Core 22 (32 bit) with g++-5.1.1
+- Fedora Core 21 (64 bit) with g++-4.9.2
+- Arch Linux (64 bit) with g++-5.3.0 and clang++-3.7.1
+- CentOS/RHEL 6.7 (64-bit) with g++-4.4.7
+- OS X El Capitan 10.11.4 with Xcode 7.3 and Apple LLVM version 7.3.0
+- OS X El Capitan 10.11.3 with Xcode 7.2.1 and Apple LLVM version 7.0.2
+- OS X Yosemite 10.10.5 with Xcode 7.2.1 and Apple LLVM version 7.0.2
+- FreeBSD 10.2-RELEASE (64 bit) with clang-3.4.1
+
+### New user-visible features
+
+- (internet) The native TCP implementation has been refactored, for the
+  following improvements:
+  - congestion control has been aligned with the Linux architecture,
+    to facilitate easier coding of new congestion control algorithms
+    or porting implementations from the Linux kernel,
+  - Fast Retransmit and Fast Recovery algorithms, compliant to RFCs, are
+    shared by all TCP variants, unlike previous releases.
+  - TCP Hybla and TCP HighSpeed variants have been added.
+
+- (routing) The PrintRoutingTable* functions now print the following information
+  each time they are called:
+  - the node ID,
+  - the global time,
+  - the local time (allowing for future introduction of per-node clocks),
+  - the routing protocol type
+
+- (traffic control) A traffic control sublayer has been added with the aim of
+  introducing an equivalent of the Linux Traffic +Control infrastructure into
+  ns-3. This layer sits in between the NetDevices (L2) and the network
+  protocol (e.g. IP). It is in charge of processing packets and performing
+  actions on them: scheduling, dropping, marking, policing, etc.  Initial
+  support for flow control has been added to the PointToPointNetDevice;
+  backward-compatible support for other device types is provided.
+
+- (traffic control) A three band priority queue modelled after Linux
+  pfifo_fast queueing discipline has been added.
+
+- (traffic control) Adaptive RED extensions have been added to the RED model
+
+- (wifi) A number of changes related to improving support for 802.11n/ac
+  models have been introduced.
+  - Two rate controls compatible with High Throughput (HT) Wi-Fi modes
+    (e.g. 802.11n/ac), Ideal and MinstrelHT, have been added
+  - Support for multiple spatial streams (MIMO) using existing SISO
+    error models
+  - The WiFi helper API for the WifiMac sublayer, and the configuration
+    of HT modes and parameters, has been simplified
+  - Better support for backward compatibility with legacy modes
+
+- (wifi) 802.11g was made backward compatible with 802.11b networks
+
+- (internet) L4 protocols (e.g., TCP, UDP, ICMP, etc.) can be demultiplexed
+  by IP according to the incoming interface. In other words, it is now
+  possible to use specialized L4 protocols according to the interface.
+
+- (internet) Ipv6Address::IsAllHostsMulticast() is now deprecated.
+  FF02::3 is not in the official reserved IPv6 multicast address list.
+
+- (internet) Ipv6Address::IsAll[Nodes,Routers]Multicast() now checks the
+  address scope beyond the simple link-local. Nodes are checked for
+  Interface-Local, Link-Local and Realm-Local, Routers for the above plus
+  Site-Local.
+
+- (internet) Ipv6 routing protocols must now *not* forward packets to upper
+  layers unless for extremey specific cases. The Ipv6L3protocol handles
+  almost all the packets directed to the host.
+
+- (internet) Ipv6 can now reject packets directed to an address not configured
+  on the interface they are received from (Strong End System Model, RFC 1222).
+
+- (internet) UDP and Ipv6 RAW sockets can now join Ipv6 multicast groups.
+  Incoming packets will be filtered according to if there's a socket listening
+  to that group. Source filtering is left to the application.
+
+- (network) ns-3 is now capable of serializing cooked (SLL) headers. This is
+  used in DCE to allow the generation of pcap directly readable by wireshark.
+
+- (internet) It is now possible to set custom values for RipNg Link Down
+  (standard is 16).
+
+- (internet) permanent (static) NDISC entries can be created for IPv6
+
+- (internet) IPv4 RIPv2 protocol model is now available.
+
+### Bugs fixed
+
+- Bug 1132 - useless for loops in block-ack-test-suite.cc
+- Bug 1205 - EDCA is incorrectly modelled as DCF
+- Bug 1571 - TCP zero-window and flow control window updates by the receiver
+- Bug 1631 - Acoustic modem Energy consumption calc is wrong
+- Bug 1761 - Rounding with olsr::EmfToSeconds
+- Bug 1783 - BytesInFlight value fixed
+- Bug 1954 - Serialized size of wifi-net-device differ for TX and RX trace
+- Bug 1999 - PointToPointRemoteChannel invokes PointToPointChannel constructor
+- Bug 2003 - Missing DSSS short PLCP preamble
+- Bug 2041 - TCP RTO needs unit tests
+- Bug 2068 - Timestamp option conforms to RFC 7323
+- Bug 2102 - Make global routing robust to bridged links
+- Bug 2116 - refactoring aggregation API
+- Bug 2120 - 802.11g networks are not compatible with 802.11b clients
+- Bug 2141 - TCP DataSent callback now correctly notifies sent data, without missing bytes in particular conditions
+- Bug 2150 - The TCP sender keeps retransmitting and does not terminate the connection after some retries.
+- Bug 2159 - TCP advertises wrong receive window
+- Bug 2176 - Building IPv4 address from char* doesn't look reliable
+- Bug 2183 - LiIonEnergySourceHelper is not in the energy wscript
+- Bug 2184 - Integer overflow in Wi-Fi MacLow; remove dependency between tx and rx reference number field in MPDU status
+- Bug 2185 - WiFi MacLow may respond to errored frames that it should ignore
+- Bug 2193 - Simulation fails when transmitting very small MPDU subframes
+- Bug 2195 - Udp[*]Client can't send packets to broadcast address
+- Bug 2201 - Simulation fails when active probing is used in 802.11n/ac with channel bonding enabled
+- Bug 2206 - Split internet-apps from applications
+- Bug 2207 - Print node ID and time when printing routing tables
+- Bug 2208 - Interface index based L4 protocols
+- Bug 2210 - set Order field to 0 for HT/VHT
+- Bug 2211 - Ipv{4,6}EndPoint can cause memory corruption
+- Bug 2213 - Inconsistencies may exist between the selected WifiMacHelper and the chosen 802.11 version
+- Bug 2219 - SixLowPanNetDevice hangs trying to decode a IPv6 Fragment extension header
+- Bug 2224 - scope of GetAmpduExist() in EdcaTxopN
+- Bug 2233 - Implement RFC 1222 - Strong End System Model
+- Bug 2234 - Ipv6L3Protocol should trash multicast packets not interesting for the node
+- Bug 2238 - Ipv6 routing reorganization
+- Bug 2242 - Mobility of both sender PHY and receiver PHY set to sender mobility in lr-wpan-phy-test.cc example.
+- Bug 2243 - TCP Socket Fork() fails to copy some parameters, causing connections to close prematurely on retransmit
+- Bug 2246 - Some DSR LogComponents and classes are not defined in a unique way.
+- Bug 2247 - Disabled Fast retransmit after an RTO
+- Bug 2249 - LTE perl speed tests possibly broken
+- Bug 2252 - Nix needs StaticRouting to work
+- Bug 2254 - Ipv[4,6]RawSocket can return the wrong number of bytes sent.
+- Bug 2255 - Ipv6RawSocket does not call data sent callbacks.
+- Bug 2257 - Ipv[4,6]InterfaceContainer::Add are not consistent
+- Bug 2258 - TcpSocketBase updated options and RTT for out of range segments.
+- Bug 2259 - GSL not successfully enabled for Wi-Fi DSSS error rate model
+- Bug 2262 - Corrected initial slow start threshold value
+- Bug 2266 - NixRouting info are not copied during a packet fragmentation.
+- Bug 2267 - Wrong channel bandwidth value in pcap files
+- Bug 2271 - Decision to enable RTS/CTS handshake for A-MPDUs should be based on the comparison between RtsCtsThreshold and the total A-MPDU size
+- Bug 2272 - SixLowPan NetDevice can not send uncompressed packets larger than 802.15.4 MTU
+- Bug 2273 - WeakEs model should be enforced in Static and Global routing
+- Bug 2275 - AdhocWifiMac not compatible with 802.11n/ac
+- Bug 2279 - Ipv[4,6]L3Protocol::GetInterfaceForDevice speedup.
+- Bug 2283 - Add capability to use pcap trace files with nanosecond precision timestamps
+- Bug 2286 - Support for SLL header (de)serialization.
+- Bug 2287 - FlowMonitor is confused by IP over IP.
+- Bug 2288 - Ipv4 broadcast and multicast packets are replicated on all the interfaces.
+- Bug 2289 - RIP v2 implementation
+- Bug 2290 - Cannot run click examples from test.py
+- Bug 2292 - Uninitialized variables since commit 7c60a9f8f271
+- Bug 2293 - Red Queue Estimator spins when trying to compute queue average size under long idle times.
+- Bug 2297 - 802.11n/ac networks are not compatible with legacy clients
+- Bug 2302 - Fixing RTT calculation inside TCP Socket
+- Bug 2303 - WifiMacQueue::GetSize should cleanup queue beforehand
+- Bug 2304 - DSCP Set/Get are using 8 bit values instead of 6
+- Bug 2307 - m_receivedAtLeastOneMpdu is not always reset
+- Bug 2311 - save Ht/Vht capabilities info on a per-station basis
+- Bug 2313 - Assert failed when using aggregation and RTS/CTS
+- Bug 2315 - Problem when BACK Request is part of an A-MPDU
+- Bug 2316 - MacLow shall use a single TXVECTOR for all MPDUs belonging to a same A-MPDU
+- Bug 2317 - Get the non-HT reference rate of a HT MCS
+- Bug 2318 - MPDU Aggregation fails with TCP
+- Bug 2319 - BlockAckTimeout value is too low for 802.11n operating at 2.4 GHz
+- Bug 2320 - Add method to check whether a WifiTxVector contains a valid combination of WifiMode, number of spatial streams and channel width
+- Bug 2321 - Wifi rate managers should not be triggered for each MPDU when A-MPDU is used
+- Bug 2327 - CWmin value selection for 802.11g is not compliant with the standard rules
+- Bug 2328 - changes to antenna configuration should update HT MCS set
+- Bug 2331 - Wrong mobility model in vanet-routing-compare example
+- Bug 2332 - Assert failed when using aggregation and two pairs of AP-STA
+- Bug 2337 - WifiPhy uses channel width in Hz iso MHz
+- Bug 2338 - WifiMode selected for control frames may sometimes be invalid
+
+### Known issues
+
+In general, known issues are tracked on the project tracker available
+at http://www.nsnam.org/bugzilla/
+
+Release 3.24.1
+--------------
+
+Release 3.24.1 is a maintenance release that fixes three issues:
+- support for Xcode 7 clang compiler version
+- detection of Python bindings location
+- compilation problem on 32-bit gcc-4.4 machine
+
+The issues prevented selected systems from being able to successfully
+build ns-3, and prevented the released version from being able to
+detect the presence of pybindgen used for Python bindings.
+
+### Availability
+
+This release is available from:
+https://www.nsnam.org/release/ns-allinone-3.24.1.tar.bz2
+
+### Supported platforms
+
+This release has been tested on the following platforms:
+- Ubuntu 15.04 (64 bit) with g++-4.9.2
+- Fedora Core 22 (32 bit) with g++-5.1.1
+- Fedora Core 21 (64 bit) with g++-4.9.2
+- Ubuntu 14.04 (64 bit) with g++-4.8.2
+- Ubuntu 12.04.4 (64 bit) with g++-4.6.3
+- CentOS/RHEL 6.7 (64-bit) with g++-4.4.7
+- OS X Yosemite 10.10.5 with Xcode 7 and Apple LLVM version 7.0.0
+- OS X Yosemite 10.10.5 with Xcode 6.4 and Apple LLVM version 6.1.0
+- FreeBSD 10.2-RELEASE (64 bit) with clang-3.4.1
+
+### New user-visible features
+
+Features are identical to release 3.24.
+
+### Bugs fixed
+
+- Bug 2181 - Xcode 7.0 compiler warnings trigger build failure
+- Bug 2182 - pybindgen required version is now a string literal
+- Bug 2184 - integer overflow in MacLow
+
+Release 3.24
+------------
+
+### Availability
+
+This release is available from:
+https://www.nsnam.org/release/ns-allinone-3.24.tar.bz2
+
+### Supported platforms
+
+This release has been tested on the following platforms:
+- Ubuntu 15.04 (64 bit) with g++-4.9.2
+- Fedora Core 22 (32 bit) with g++-5.1.1
+- Fedora Core 21 (64 bit) with g++-4.9.2
+- Ubuntu 14.04 (64 bit) with g++-4.8.2
+- Ubuntu 12.04.4 (32/64 bit) with g++-4.6.3
+- CentOS/RHEL 6.7 (64-bit) with g++-4.4.7
+- OS X Yosemite 10.10.4 with Xcode 6.4 and Apple LLVM version 6.1.0
+- FreeBSD 10.1-RELEASE (64 bit) with clang-3.4.1
+
+### New user-visible features
+
+- (build system) Python 3 is now supported by waf and test runner programs
+- (wifi) 802.11ac Very High Throughput (VHT) physical layer modes are now
+  supported.
+- (internet) permanent (static) ARP entries can be created for IPv4
+- (network) SimpleChannel allows per-NetDevice blacklists, in order to do hidden terminal testcases.
+- (documentation) TracedCallback function signatures now documented in Doxygen
+
+### Bugs fixed
+
+- Bug 730 - Enabling fragmentation at run-time breaks simulation
+- Bug 1249 - doxygen comments on device-level SetMobility ()
+- Bug 1482 - mesh module was producing fatal error with ASCII and netanim traces
+- Bug 1557 - errors in function OpenFlowSwitchNetDevice::BufferFromPacket()
+- Bug 1681 - m_lastNavStart is assigned twice continuously
+- Bug 1736 - default dot11EDCATableMSDULifetime
+- Bug 1901 - mesh module producing malformed pcaps
+- Bug 1929 - TcpL4Protocol::Send must indicate the source address to routing (if known)
+- Bug 1982 - AODV and mesh modules use random variables before seeds can be set
+- Bug 2058 - TCP window update can shrink left edge of window
+- Bug 2063 - FdNetDevice::SendFrom assert does not account for headers correctly
+- Bug 2082 - Empirical RV fails if value provided in CDF function is negative
+- Bug 2093 - MultiModelSpectrumChannel::GetDevice only works for 0-th index
+- Bug 2096 - Wrong pcap information when MPDU aggregation is used
+- Bug 2104 - Sequence Number passed to QosUtilsMapSeqControlToUniqueInteger instead of Sequence Control
+- Bug 2108 - Erroneous implementation in InterferenceHelper
+- Bug 2119 - Fix memory leaks in FdNetDevice test due to non-executed events
+- Bug 2124 - UdpSocketImpl::ShutdownRecv doesn't stop the Ipv[4,6]EndPointDemux
+- Bug 2125 - subclasses must chain up to base class NotifyNewAggregate
+- Bug 2126 - LrWpanNetDevice silently accepts no mobility on the node
+- Bug 2127 - Scheduler benchmark utility works in first run only
+- Bug 2130 - Allow SimpleChannel to simulate hidden terminals
+- Bug 2132 - TcpL4Protocol sends a bad-formatted RST packet
+- Bug 2135 - TCP doesn't honor the socket's output interface
+- Bug 2136 - The usage of tid in wifi and wave module shall be "if (tid > 7)" rather than "if (tid >= 7)"
+- Bug 2138 - SimpleNetDevice could send overlapped packets
+- Bug 2143 - maybe-uninitialized warning
+- Bug 2146 - bug in WAVE channel coordination
+- Bug 2148 - Ipv6Interface::SetUp doesn't re-create the Link-Local addresses
+- Bug 2153 - Incorrect power limits in wifi power control algorithms
+- Bug 2154 - Incorrect power calculation in wifi power adaptation examples
+- Bug 2156 - Duplicate packets when using two level aggregation
+- Bug 2157 - OpenFlowSwitchNetDevice::BufferFromPacket setting eth_type incorrectly
+- Bug 2158 - OpenflowSwitchNetDevice flooding bug
+- Bug 2165 - server replies to SYN (with option TS) with a SYNACK (with option TS) also if the attribute Timestamp is false
+- Bug 2166 - SteadyStateRandomWaypointMobilityModel directs the node to the ground
+- Bug 2170 - AnimationInterface outputs improperly formed XML
+- Bug 2171 - power-adaptation-distance.cc:202:22: error: call to 'pow' is ambiguous
+- Bug 2173 - WifiInformationElement::DeserializeIfPresent attempts to read beyond the end of buffer
+- Bug 2174 - m_rWnd not updated when segments without ACK are received
+- Bug 2177 - Ipv6ExtensionFragmentHeader length is initialized to a wrong value.
+
+### Known issues
+
+In general, known issues are tracked on the project tracker available
+at http://www.nsnam.org/bugzilla/
+
+Release 3.23
+------------
+
+### Availability
+
+This release is available from:
+http://www.nsnam.org/release/ns-allinone-3.23.tar.bz2
+
+### Supported platforms
+
+This release has been tested on the following platforms:
+- Ubuntu 15.04 (64 bit) with g++-4.9.2
+- Fedora Core 21 (64 bit) with g++-4.9.2
+- Ubuntu 14.04 (64 bit) with g++-4.8.2
+- Ubuntu 12.04.4 (32/64 bit) with g++-4.6.3
+- CentOS/RHEL 6.6 (64-bit) with g++-4.4.7
+- OS X Yosemite 10.10.3 with Xcode 6.3.1 and Apple LLVM version 6.1.0
+- FreeBSD 10.1-RELEASE (64 bit) with clang-3.4.1
+
+### New user-visible features
+
+- (network) CalculateTxTime has been declared obsolete.
+  CalculateBytesTxTime and CalculateBitsTxTime are to be used instead.
+  The return value is a Time, instead of a double.
+- (mobility) Classes added for converting geographic to cartesian coordinates.
+- (spectrum) TvSpectrumTransmitter models added to create television
+  transmitter(s) that transmit PSD spectrums customized by attributes such
+  as modulation type, power, antenna type, channel frequency, etc.
+- (wifi) Several model improvements have been made.  Access points now
+  establish BSSBasicRateSet for control frame transmissions.  PLCP header
+  and payload reception have been decoupled for improved PHY modeling
+  accuracy.  RTS/CTS with A-MPDU is now fully supported, and 802.11n
+  stations now support two-level aggregation.
+
+### Bugs fixed
+
+- Bug 1757 - RLC AM not using NACK_SN
+- Bug 1974 - CalculateTxTime should return a Time, not a double
+- Bug 1982 - AODV and mesh use random variables before seed can be set
+- Bug 2004 - Wrong timeout calculation for 802.11n in WifiMac
+- Bug 2008 - (lr-wpan) Crash if ending rx while status change is in progress
+- Bug 2025 - (lr-wpan) Changing the channel doesn't affect the Tx params
+- Bug 2034 - (lr-wpan) CSMA-CA BackoffPeriod is too short
+- Bug 2054 - TCP window update can shrink the Left Edge of the window
+- Bug 2066 - A-MPDU reception should check for successful preamble
+- Bug 2067 - TCP performance when advertised window exceeds sender buffer size
+- Bug 2070 - Wrong report of Packets and Bytes stored in CoDeL
+- Bug 2073 - NDisc cache entries update timer might be stuck in a loop
+- Bug 2075 - A-MPDU using RTS/CTS behaves wrongly when MaxSsrc is reached
+- Bug 2076 - TCP MinRTO Attribute is not actually used
+- Bug 2077 - Icmpv6L4Protocol::HandleDestinationUnreachable must check the packet size, not its serialized size
+- Bug 2079 - mcs variable in ht-wifi-network example is confusing
+- Bug 2082 - Empirical RV fails if the value provided in the CDF member function is negative
+- Bug 2083 - BridgeNetDevice may send corrupted packets
+- Bug 2087 - Waf fails to build ns-3 if the path contains accented characters
+- Bug 2090 - (rip-ng) Routes may be added twice on interface activation
+- Bug 2093 - MultiModelSpectrumChannel::GetDevice only works for 0-th index
+- Bug 2095 - (wimax) Wrong values in default-traces.h for 16 QAM 3/4
+- Bug 2097 - ACKs should be sent using legacy rates and preambles in 802.11n
+- Bug 2103 - Ipv[4,6]RoutingHelper::PrintRoutingTableAll[At,Every] hangs if a node doesn't have IP
+
+### Known issues
+
+In general, known issues are tracked on the project tracker available
+at http://www.nsnam.org/bugzilla/
+
+Release 3.22
+------------
+
+### Availability
+
+This release is available from:
+http://www.nsnam.org/release/ns-allinone-3.22.tar.bz2
+
+### Supported platforms
+
+This release has been tested on the following platforms:
+- Fedora Core 21 (64 bit) with g++-4.9.2
+- Ubuntu 14.10 (32 bit) with g++-4.9.1
+- Ubuntu 14.04 (64 bit) with g++-4.8.2
+- Ubuntu 12.04.4 (32/64 bit) with g++-4.6.3
+- CentOS/RHEL 6.6 (64-bit) with g++-4.4.7
+- OS X Yosemite 10.10 with Xcode 6.1.1 and clang-600.0.56
+- FreeBSD 10.1-RELEASE (64 bit) with clang-3.4.1
+
+### New user-visible features
+
+- (wifi) Support for MPDU aggregation has been added to the wifi model,
+  as well as a number of related example programs.
+- (wifi) Added two combined power and rate control mechanisms to the
+  wifi module.  The new mechanisms, PARF and APARF, are the first in the
+  wifi module to jointly control transmission power and data rate.  Two use
+  case examples (PowerAdaptationDistance and PowerAdaptationInterference)
+  and a test case have also been added.
+- (lte) In previous releases of the LTE module, the bearer release
+  functionality was only partially supported. As an enhancement, a
+  complete release bearer procedure is now implemented, which can be
+  invoked by calling the new helper method
+  LteHelper::DeActivateDedicatedEpsBearer(). The related output can be
+  seen through the stats collected at different layers like PDCP, RLC,
+  MAC, PHY. To support this implementation, an example and test suite is
+  added within the LTE module examples and tests folder.
+- (wave) Additional support has been added for WiFi-based vehicular networks,
+  including the channel-access coordination features of IEEE 1609.4 and a
+  comprehensive VANET routing example that includes a Basic Safety
+  Message (BSM) packet generator application and associated statistics
+  counters.  Together, these allow users to evaluate the performance effects
+  in a VANET of varying transmission and channel properties (e.g., packet
+  rate, message size, transmit power, propagation loss model, impact of
+  routing protocol traffic, etc.).
+- (internet) It is now possible to print the Neighbor Cache (ARP and NDISC)
+  by using the RoutingProtocolHelper
+- (stats) A new TimeProbe class has been added to hook the data collection
+  framework to traced values emitting Time objects
+- (documentation) the callback function signatures for all TraceSources
+  is documented in Doxygen
+- (utils) print-introspected-doxygen.cc has had several enhancements;
+  use -h to read the usage message for details.
+- (core) TracedValue and TracedCallback function signatures are now documented,
+  which required changing the TypeId::AddTraceSource API.
+
+### Bugs fixed
+
+- Bug 1405 - RttEstimator improvements
+- Bug 1551 - NS_LOG_COMPONENT_DEFINE inside or outside of ns3 namespace?
+- Bug 1726 - WiFi Minstrel rate control algorithm doesn't save state
+- Bug 1734 - TcpSocketBase produces spurious delayed ACKs
+- Bug 1758 - Yans and Nist error rate models for 5/6 code rate 802.11n HT
+- Bug 1770 - mesh test and example crash for 32-bit optimized builds
+- Bug 1774 - compute signal power around channel, not across whole band, and fix LrWpanHelper to add a default PropagationDelayModel
+- Bug 1791 - TCP Endpoint never deallocates when closing
+- Bug 1801 - Setting Wi-Fi timing parameters through WifiMac attributes (documentation fix)
+- Bug 1906 - 802.11n PHY configuration for 2.4GHz and 5GHz devices
+- Bug 1957 - UdpSocketImpl is stuck after a Close()
+- Bug 1968 - Missing supported 802.11n HT rates in the WifiPhy constructor
+- Bug 1969 - Support short guard interval durations in 802.11n
+- Bug 1970 - Missing NotifyAckTimeoutStartNow in MacLow::StartDataTxTimers
+- Bug 1971 - 802.11n at 2.4 GHz should include a signal extension duration
+- Bug 1972 - CommandLine duplicate argument handling: documentation updated.
+- Bug 1983 - FlowMonitor returns containers copies instead of references.
+- Bug 1986 - test result divergence for lte-frequency-reuse test
+- Bug 1991 - PcapFileWrapper::CaptureSize attribute (snaplen) has no effect.
+- Bug 1995 - avoid multiple definitions of PI
+- Bug 1996 - RSRQ calculation: misleading variable names
+- Bug 1997 - Fix PlotProbe() documentation and usage for GnuplotHelper and FileHelper
+- Bug 2002 - Hardcoded include paths cause breakage
+- Bug 2011 - Default Speed attribute in ConstantSpeedPropagationDelayModel
+- Bug 2016 - Radvd do not consider the SendAdvert option and don't reply to RS
+- Bug 2020 - Erroneous MCS field in 802.11n PCAP files
+- Bug 2021 - Missing const qualifier in TopologyReader::Link::Attributes{Begin,End}()
+- Bug 2026 - 802.11n Ness parameter badly set for data frames
+- Bug 2027 - Calculation of HT training symbol duration does not accurately follow 802.11n standard
+- Bug 2028 - remove unnecessary Time to double conversions in Wifi models
+- Bug 2029 - new CQI generation approach fix
+- Bug 2030 - provide default values for WifiTxVector
+- Bug 2037 - HT capabilities may print bogus chars
+- Bug 2038 - Stop method does not stop next wave in WaveformGenerator
+- Bug 2042 - LTE a3-rsrp-handover-algorithm.cc:  error: overflow in implicit constant conversion
+- Bug 2043 - print-introspected-doxygen crashes when some modules are disabled
+- Bug 2044 - Buffer::Iterator::ReadNtohU16() and ReadNtohU32() not implemented correctly
+- Bug 2045 - Missing NS_OBJECT_ENSURE_REGISTERED in TcpTxBuffer and TcpRxBuffer
+- Bug 2046 - set Block Ack timeout when SetStandard is called
+- Bug 2047 - Ipv6EndPointDemux::Lookup may crash
+- Bug 2049 - CQI feedback should always use the same calculation method
+- Bug 2053 - In tcp-socket-base.cc, NotifyDataSent incorrectly called with retransmits
+- Bug 2055 - TCP TxBuffer and RxBuffer traces don't work
+- Nix-vector routing implementation now uses a lazy flush mechanism,
+  which dramatically speeds up the creation of large topologies.
+
+### Known issues
+
+In general, known issues are tracked on the project tracker available
+at http://www.nsnam.org/bugzilla/
+
+Release 3.21
+------------
+
+### Availability
+
+This release is available from:
+http://www.nsnam.org/release/ns-allinone-3.21.tar.bz2
+
+### Supported platforms
+
+- Fedora Core 20 (32/64 bit) with g++-4.8.2
+- Ubuntu 14.04 (32/64 bit) with g++-4.8.2
+- Ubuntu 12.04.4 (64 bit) with g++-4.6.3
+- Ubuntu 10.04.4 LTS (64 bit) with g++-4.4.3
+- CentOS/RHEL 6.5 (64-bit) with g++-4.4.7
+- OS X Mavericks 10.9 with Xcode 5.1.1 and clang-503.0.40
+- FreeBSD 9.2-RELEASE (64 bit) with clang-3.3
+
+### New user-visible features
+
+- The LTE module now supports the transport of the S1-U, X2-U and X2-C
+  interfaces over emulated links via the new helper class EmuEpcHelper.
+- CommandLine can now provide a shorthand argument name for any
+  Attribute.
+- Implemented support for Frequency Reuse algorithms in LTE module, as the
+  outcome of GSoC 2014 project.
+  The project also includes several sub-features, such as:
+  - implementation of Downlink Power Control
+  - implementation of Uplink Power Control
+  - new DL-CQI generation approach, which increases throughput if FR algorithms
+    are used
+  - seven options of Frequency Reuse algorithms: LteFrNoOpAlgorithm,
+    LteFrHardAlgorithm, LteFrStrictAlgorithm, LteFrSoftAlgorithm,
+    LteFfrSoftAlgorithm, LteFfrEnhancedAlgorithm, LteFfrDistributedAlgorithm
+  - updated RadioEnvironmentMapHelper. Now RadioEnvironmentMap can be generated
+    for Data or Control channel and for specified RbId, what is helpful when
+    using FR algorithms
+- Added a CoDel queue model.  CoDel queues measure and control the queue
+  traversal delay.  The ns-3 implementation is a port of the Linux
+  implementation.
+- Added support for TCP timestamp and window scale options, and added
+  ability to trace the TCP slow start threshold value.
+- SimpleNetDevice and SimpleChannel (used for adding basic link effects
+  for testing of higher-layer protocols) have been extended to support
+  the option of broadcast or PointToPoint link semantics.  The bandwidth
+  and link delay can be constrained, and it uses an output queue.
+- SimpleNetDevice and SimpleChannel can be installed in a node through
+  a new helper: SimpleNetDeviceHelper.
+- Implemented new PacketSocketServer and PacketSocketClient applications.
+  The primary use is in tests, to avoid using the ones from the
+  application module that also bring in a dependency on the internet module.
+
+### Bugs fixed
+
+- Bug 1673 - Config::Set/Connect does not search for attributes in parent class
+- Bug 1762 - UE stuck in IDLE_CONNECTING because RRC CONN REQ is not transmitted
+- Bug 1811 - basic traffic generator for network module
+- Bug 1824 - L4 protocol sockets should support BindToNetDevice over IPv6
+- Bug 1831 - TcpSocket SlowStartThreshold is not a TraceSource
+- Bug 1851 - WifiRadioEnergyModel energy consumption values are taken from a 802.15.4 chip
+- Bug 1854 - std::out_of_range Problem
+- Bug 1858 - wireless examples not correctly recording packet reception
+- Bug 1860 - TCP needs the Window Scale option
+- Bug 1893 - issue in DoSchedUlTriggerReq with harq
+- Bug 1911 - AODV cannot work on nodes with more than one netdevice
+- Bug 1921 - Icmpv6L4Protocol::ForgeEchoRequest returns a malformed packet
+- Bug 1930 - Use of invalid reference in OLSR RemoveLinkTuple
+- Bug 1932 - NdiscCache entry is not failsafe on double neighbor probing.
+- Bug 1937 - FlowMonitor fails to track multiplexed packets
+- Bug 1942 - refactoring of lte-sinr-chunk-processor -> lte-chunk-processor
+- Bug 1943 - Waveform generator signal duration calc error
+- Bug 1951 - AODV does not update nexthop for 1-hop nodes
+- Bug 1955 - The IPv4 identification field should be unique per (source, destination, protocol) tuple
+- Bug 1960 - Wrong information on index range, about Node::GetDevice
+- Bug 1961 - planetlab-tap-creator "variable set but not used"
+- Bug 1963 - AODV can tag the same packet twice (and raise an assert)
+- Bug 1964 - Integer overflow on UniformRandomVariable::GetInteger()
+- Bug 1967 - LL Multicast is not compressed in the right way in IPHC
+- Bug 1981 - PyViz shell not compatible with ipython >= 0.11
+
+### Known issues
+
+- Bug 1770 - The mesh module will crash if used for g++ version >= 4.8.1
+in optimized mode, on a 32-bit Linux machine.  Lowering the optimization
+level to -O1 in this case can be used as a workaround.
+
+Release 3.20
+------------
+
+### Availability
+
+This release is available from:
+http://www.nsnam.org/release/ns-allinone-3.20.tar.bz2
+
+### Supported platforms
+
+- Fedora Core 20 (32/64 bit) with g++-4.8.2
+- Ubuntu 14.04 (32/64 bit) with g++-4.8.2
+- Ubuntu 12.04.4 (64 bit) with g++-4.6.3
+- Ubuntu 10.04.4 LTS (64 bit) with g++-4.4.3
+- CentOS/RHEL 6.5 (64-bit) with g++-4.4.7
+- OS X Mavericks 10.9 with Xcode 5.1.1 and clang-503.0.40
+- FreeBSD 9.2-RELEASE (64 bit) with clang-3.3
+
+### New user-visible features
+
+- A new LrWpan model, providing initial support for IEEE 802.15.4 networks
+- A new IPv6 routing protocol has been added: RIPng. This protocol is
+  an Interior Gateway Protocol and it is available in the Internet module.
+- A new LTE MAC downlink scheduling algorithm named Channel and QoS Aware (CQA)
+  Scheduler is provided by the new ``ns3::CqaFfMacScheduler`` object.
+- The Internet FlowMonitor can now track IPv6 packets.
+- FlowMonitor no longer tracks multicast/broadcast packets, reflecting
+  its original design.
+- FlowMonitor "SerializeToXml" functions are now directly available
+  from the helper.
+- The SixLowPan model can now use uncompressed IPv6 headers. An option to
+  define the minimum compressed packet size has been added.
+- Simplify output of Times in a specific unit; see Time::As ()
+- Ipv6Extension::m_dropTrace has been removed. Ipv6L3Protocol::m_dropTrace
+  is now fired when appropriate.
+- IPv4 identification field value is now dependent on the protocol field.
+- Fixes to support Python >= 3.3 in ns3 Python bindings
+- Enable selection of high precision int64x64_t implementation
+  at configure time, for debugging purposes.
+
+### Bugs fixed
+
+- Bug 1276 - optimize NistErrorRateModel
+- Bug 1294 - New PeekU8 () and Read (Buffer::Iterator start, uint32_t size) methods in Buffer::Iterator
+- Bug 1443 - MinDistance replaced by MinLoss in FriisPropagationLossModel, to
+  better handle conditions outside of the assumed far field region.
+- Bug 1653 - Extension of CommandLine interface: restored operator << (CommandLine)
+- Bug 1717 - Detect unsettable attributes
+- Bug 1730 - no model library documentation for spectrum module
+- Bug 1739 - The endpoint is not deallocated for UDP sockets
+- Bug 1786 - os << int64x64_t prints un-normalized fractional values
+- Bug 1787 - Runtime error when using AnimationInterface::EnablePacketMetadata() to fetch metadata of CSMA packet
+- Bug 1792 - Parameter logger constructor
+- Bug 1808 - FlowMon relies on IPv4's Identification field to trace packets
+- Bug 1817 - IPv4 Identification field should consider protocol as well.
+- Bug 1818 - FlowMonitor needs IPv6 support
+- Bug 1820 - models library doc: make should not rm -rf figures
+- Bug 1821 - Setting an interface to Down state will cause various asserts in IPv6
+- Bug 1829 - Multiple TCP socket entries
+- Bug 1837 - AODV crashes when using multiple interfaces
+- Bug 1838 - FlowMonitorHelper must not be copied.
+- Bug 1841 - FlowMonitor fails to install if IPv4 is not installed in the node
+- Bug 1842 - FlowMonitor SerializeToXml<Something> should be called by the helper
+- Bug 1843 - IPv6 extensions dropped packets do not fire L3 drop trace
+- Bug 1845 - FlowMonitor should discard any broadcast/multicast packet
+- Bug 1846 - IPv6 should send Destination Unreachable if no route is available
+- Bug 1850 - TCP NewReno loss behavior
+- Bug 1852 - cairo-wideint-private.h error cannot find definitions for fixed-width integral types
+- Bug 1853 - NS_LOG_FUNCTION broken on OSX 10.9
+- Bug 1855 - SixLowPanNetDevice is not correctly indexed
+- Bug 1857 - Detect location of installed boost libraries
+- Bug 1862 - NS_LOG="Time=*|prefix_time" causes stack overflow
+- Bug 1868 - Optimized builds are sensitive to -fstrict-overflow
+- Bug 1870 - Remove unnecessary AsInt functions
+- Bug 1872 - Inside RREQ processing, in case of IP duplication, packet dropped instead of being forwarded
+- Bug 1873 - Energy source checked to be aggregated to the node
+- Bug 1874 - Ipv4L3Protocol::ProcessFragment: addressCombination and idProto identifiers not properly computed
+- Bug 1876 - enable OLSR HNA table access
+- Bug 1877 - constructors missing for PropagationLossModels
+- Bug 1882 - int64x64 tests trigger valgrind bug
+- Bug 1883 - IPv6 don't consider the prefix and network when choosing output address
+- Bug 1885 - WifiSpectrumValue5MhzFactory::CreateRfFilter does not align with the used 5Mhz SpectrumModel
+- Bug 1887 - Point-to-point traces should contain PPP headers
+- Bug 1888 - COST231 propagation loss model: corrections
+- Bug 1889 - PointToPointNetDevice: In some cases MacTxDrop trace is not called
+- Bug 1890 - UdpClientTrace: MPEG frame size is squeezed into (insufficient) 16 bit integer
+- Bug 1891 - UdpSocketImpl::GetSockName doesn't return the IPv6 address
+- Bug 1894 - CqaFfMacScheduler needs an update
+- Bug 1895 - IP header Source Address changed while forwarding RREQ
+- Bug 1900 - Avoid floating point differences across platforms in test outputs
+- Bug 1903 - Namespace usage in olsr-state.cc/h
+- Bug 1907 - Add IsSupportedMcs method in YansWifiPhy
+- Bug 1912 - Avoid multiple Wifi MacTxMiddle instances
+- Bug 1913 - Avoid crash in Wifi BlockAckManager::GetNextPacket()
+- Bug 1915 - BRITE channel delay is rounded to an integer
+- Bug 1916 - RandomWalk2dMobilityMode default "Bounds" attribute is not a rectangle
+- Bug 1919 - Strip trailing semi-colons from mobility trace files
+- Bug 1920 - Remove DSR attributes so file can be re-loaded by config-store
+- Bug 1922 - WAVE GetSsid should not be fatal
+- Bug 1923 - Setting Active Probing to false in Wifi Sta has no effect
+- Bug 1924 - sensing radius and CCA
+
+### Known issues
+
+- Bug 1770 - The mesh module will crash if used for g++ version >= 4.8.1
+in optimized mode, on a 32-bit Linux machine.  Lowering the optimization
+level to -O1 in this case can be used as a workaround.
+
+Release 3.19
+------------
+
+### Availability
+
+This release is available from:
+http://www.nsnam.org/release/ns-allinone-3.19.tar.bz2
+
+### Supported platforms
+
+These platforms have been tested; others may work also:
+- Fedora Core 20 (32 bit) with g++-4.8.2
+- Fedora Core 19 (32/64 bit) with g++-4.8.1
+- Ubuntu 13.10 (64 bit) with g++-4.8.1
+- Ubuntu 12.04.3 (32/64 bit) with g++-4.6.3
+- Ubuntu 10.04.4 LTS (64 bit) with g++-4.4.3
+- OS X Mavericks 10.9 with Xcode 5.0.1 and clang-500.2.79
+- OS X Mountain Lion 10.8.5 with Xcode 5 and g++-4.2.1
+- FreeBSD 9.2-RELEASE (64 bit) with clang-3.3
+
+### New user-visible features
+
+- Extension to UE measurements and improved handover algorithm models in LTE
+  module, as the outcome of GSoC 2013 project. The project also includes several
+  sub-features, such as:
+  - implementation of System Information Block Type 1 (SIB1);
+  - a new option for automatic UE attachment using Idle mode cell selection
+    procedure;
+  - improved configurability of UE measurements; and
+  - two options of handover algorithms for enabling automatic handover trigger
+    in LTE simulation: A2-A4-RSRQ and strongest cell (A3-RSRP).
+
+- A new FixedRoomPositionAllocator has been added to the buildings
+  module. It allows one to generate a random position uniformly
+  distributed in the volume of a chosen room inside a chosen building.
+
+- A new attribute ns3::LteRlcAm::TxOpportunityForRetxAlwaysBigEnough
+  allows to overcome the lack for re-segmentation in the RLC AM
+  implementation by assuming that the size of a TxOpportunity is
+  always big enough for the RLC AM PDU to be retransmitted.
+
+- After some profiling, the code of LteMiErrorModel has been optimized
+  for speed, resulting in a significantly lower execution time of the
+  LTE model when used with the error model enabled.
+
+- A new WiFi extension for vehicular simulation support is available in
+  the src/wave directory.  The current code represents an interim capability
+  to realize an IEEE 802.11p-compliant device, but without the WAVE
+  extensions (which are planned for a later patch).  The WaveNetDevice
+  modelled herein enforces that a WAVE-compliant physical layer (at 5.9 GHz)
+  is selected, and does not require any association between devices (similar
+  to an adhoc WiFi MAC), but is otherwise similar (at this time) to a
+  WifiNetDevice.  WAVE capabililties of switching between control and
+  service channels, or using multiple radios, are not yet modelled.
+
+- A new IPv6 over Low power Wireless Personal Area Networks (6LoWPAN) model
+  is available.  Using ns-3's naming convention, the acronym is expanded
+  to SixLowPanNetDevice.   The SixLowPanNetDevice is able to act as a
+  shim between IPv6 and a NetDevice, compressing IPv6 headers according
+  to RFCs 4944 and 6262.  The SixLowPanNetDevice is meant to be used over
+  IEEE 802.15.4 NetDevices, but it can be used on other NetDevices as
+  well (see the manual for full details).  This model precedes the
+  general availability of an 802.15.4 model, so must be run in conjunction
+  with a wired NetDevice model for now, or with experimental versions of
+  802.15.4 models.
+
+- It is now possible to use Ipv6PacketInfoTag from UDP applications in the
+  same way as with Ipv4PacketInfoTag. See Doxygen for current limitations in
+  using Ipv[4,6]PacketInfoTag to set IP properties.
+
+- Ipv[4,6]Interfaces not respecting the minimum MTU requirements (68 octects
+  for IPv4 and 1280 octects for IPv6) will be automatically set as Down.
+
+- IPv6 addresses and routing tables are printed in a more conventional way,
+  closely matching the Linux "route -A inet6" command.
+
+- Additional time units (Year, Day, Hour, Minute) were added to the time
+  value class that represents simulation time; the largest unit prior to
+  this addition was Second.
+
+- A new parallel scheduling algorithm based on null messages, a common
+  parallel DES scheduling algorithm, has been added.  The null message
+  scheduler has better scaling properties when running on some scenarios
+  with large numbers of nodes since it does not require a global
+  communication.
+
+### Bugs fixed
+
+- Bug 1496 - Option to print log level in NS_LOG messages, and documentation.
+- Bug 1592 - Parsing bug in FlowMonitor example script
+- Bug 1756 - RLC AM Mode State Variable Bug
+- Bug 1763 - Message 3 should be sent using the UL GRANT in the RAR
+- Bug 1778 - Implement TapBridge::IsLinkUp() function
+- Bug 1777 - Implement the more direct way of "using" configuration of existing tap interface
+- Bug 1776 - Improve CRC performance for CsmaNetDevice in emulation modes
+- Bug 1788 - unused private field warning
+- Bug 1789 - missing test condition for sigma in buildings-shadowing-test
+- Bug 1796 - Ipv6PacketInfoTag is not filled by UdpSocketImpl::ForwardUp6
+- Bug 1798 - Changing the rate of onOffApplication might stop transmission
+- Bug 1802 - FlowMon header deserialization problem with IPv4 fragments
+- Bug 1803 - Lookup /NodeList/4/DeviceList/0/LteEnbRrc/UeMap/0 got no matches
+- Bug 1807 - Multiple bugs in Ipv4L3Protocol::LocalDeliver
+- Bug 1810 - IP packets can be sent on NetDevices not respecting the minimum MTU requirements
+- Bug 1814 - IPv6 Packet with length not multiple of 8 bytes are fragmented incorrectly.
+- Bug 1815 - Python bindings compilation with clang compiler toolchain
+- Bug 1816 - IPv4 fragmentation loses Packet tags
+- Bug 1877 - constructor missing for <something>PropagationLossModels
+
+Release 3.18.2
+--------------
+
+ns-allinone-3.18.2 was released to include a bake configuration file update
+for Direct Code Execution.  The ns-3 code in this release was unchanged
+from that of ns-3.18.1.
+
+Release 3.18.1
+--------------
+
+This release is mainly to provide updated compiler support (clang/LLVM)
+and fix the Python API scanning facility.  A few additional bug fixes
+and new features are described below.
+
+### Availability
+
+This release is available from:
+http://www.nsnam.org/release/ns-allinone-3.18.1.tar.bz2
+
+### Supported platforms
+
+These platforms have been tested; others may work also:
+- Fedora Core 19 (32/64 bit) with g++-4.8.1
+- Ubuntu 13.10 (64 bit) with g++-4.8.1
+- Ubuntu 12.04.3 (32/64 bit) with g++-4.6.3
+- Ubuntu 10.04.4 LTS (64 bit) with g++-4.4.3
+- OS X Mavericks 10.9 with Xcode 5.0.1 and clang-500.2.79
+- OS X Mountain Lion 10.8.5 with Xcode 5 and g++-4.2.1
+- FreeBSD 9.2-RELEASE (64 bit) with clang-3.3
+
+### New user-visible features
+
+- It is now possible to randomize the time of the first beacon from an
+  access point.  Use an attribute "EnableBeaconJitter" to enable/disable
+  this feature.
+- A new FixedRoomPositionAllocator helper class is available; it
+  allows one to generate a random position uniformly distributed in the
+  volume of a chosen room inside a chosen building.
+- Logging wildcards:  allow "***" as synonym for "*=**" to turn on all logging.
+- The log component list ("NS_LOG=print-list") is now printed alphabetically.
+
+### Bugs fixed
+
+- Bug 1779 - NS_UNUSED_GLOBAL not working in attribute test class declaration
+- Bug 1766 - Fixes to wifi-hidden-terminal.cc example
+- Bug 1722 - Avoid transmitting beacons concurrently
+- Bug 1691 - RTS/CTS NAV reset prematurely
+- Bug 1622 - Avoid waf hanging during apiscan
+- Bug 1616 - WifiPhyStateHelper reports false CCA_BUSY times at State trace source
+- Bug 1552 - Storing log name inside LogComponent class (NS_LOG) as std::string
+- Bug 1011 - assert failed. file=../src/devices/wifi/dcf-manager.cc
+- bug 945 - remove deprecated IEEE 802.11p code from wifi module
+- Fix aliasing bug in optimized static builds
+- Fix memory leak due to circular reference in MPI module
+- Make wifi tests more robust to random variable perturbations
+- Fix Time class doxygen
+- Fix compilation with Clang 3.2 and newer versions, including Apple Xcode 5
+- Miscellaneous NetAnim fixes
+
+Release 3.18
+------------
+
+### Availability
+
+This release is available from:
+http://www.nsnam.org/release/ns-allinone-3.18.tar.bz2
+
+### Supported platforms
+
+These platforms have been tested; others may work also:
+- Fedora Core 18 (32/64 bit) with g++-4.7.2
+- Fedora Core 17 (32/64 bit) with g++-4.7.0
+- Ubuntu 13.04 (32/64 bit) with g++-4.7.3
+- Ubuntu 12.04 (32/64 bit) with g++-4.6.3
+- Ubuntu 10.04.4 LTS (64 bit) with g++-4.4.3
+- OS X Mountain Lion 10.8.3 with g++-4.2.1
+- FreeBSD 9.1-RELEASE (64 bit) with g++-4.2.1
+
+### New user-visible features
+
+- Time attributes can now be bounded.  See attribute-test-suite.cc for an
+  example.
+- Data collection components have been added to the stats module.  These
+  components can be used to generate time series data in files and plots.
+- IPv6 address class 2001:db8::/32 is now dropped by routers (RFC 3849).
+- New generic hash function interface.  Two hash functions are provided:
+  murmur3 (default), and the venerable FNV1a.  See the Hash Functions
+  section in the Manual.
+- New Mac16Address has been added, Mac64Address is now in-line with
+  Mac48Address and all the three can be used in IPv6 autoconfigure.
+- Previously, the use of Building models was limited to the use of the
+  companion BuildingsMobilityModel. Now, any MobilityModel can be
+  used with Building models.
+- The latest LTE module code by the LENA project has been merged,
+  including the following new features:
+  - PHY support for UE measurements (RSRP and RSRQ)
+  - RRC support for UE measurements (configuration, execution, reporting)
+  - Automatic Handover trigger based on RRC UE measurement reports
+- IPv6 can now detect and use Path-MTU. See
+  examples/ipv6/fragmentation-ipv6-two-MTU.cc for an example.
+- Radvd application have a new Helper. See the updated
+  examples/ipv6/radvd.cc for an example.
+- 11n- It is now possible to create a high throughput (HT) node that used the new 11n data rates and preambles.
+- It is now possible to request printing command line arguments to the
+  desired output stream using PrintHelp or operator <<
+
+### Bugs fixed
+
+- Bug  760 - IP address removal can be painful
+- Bug 1190 - Suppress hello if bcast was sent within the last hello interval
+- Bug 1296 - Enhancement in Ipv[4,6]RoutingHelper
+- Bug 1390 - ICMPv6 Redirect are handled correctly only for /64 networks
+- Bug 1522 - Hidden node scenario leads to ARP failure
+- Bug 1584 - Old Association Request Timeouts are not canceled
+- Bug 1629 - Make AODV Default to Disable Hello
+- Bug 1643 - NdiscCache creation and existence checks
+- Bug 1646 - ICMPv6 Redirect are sent from global address instead of link-local
+- Bug 1662 - m_type not set for Ipv6OptionRouterAlertHeader
+- Bug 1678 - C++11 compliance problem with std::pair"
+- Bug 1682 - ./waf crashes on FC10
+- Bug 1683 - IPv6 autoconfigured don't use *infinite* lifetimes
+- Bug 1669 - ns-3 should support binding two and three (possibly more) arguments
+- Bug 1675 - Throughput computation error in Wireless examples
+- Bug 1687 - wscript features report doesn't respect NOCOLOR
+- Bug 1688 - Routers should advertise themselves from the link-local address
+- Bug 1689 - IPv6 shouldn't add a default gateway without checking the Router lifetime
+- Bug 1690 - missing header files from wifi wscript
+- Bug 1697 - ICMPv6 Redirect trigger contains multiple bugs
+- Bug 1698 - mobility.SetPositionAllocator misses prefix "ns3::"
+- Bug 1700 - Ipv6RawSocket does not honor the bound address when sending packets
+- Bug 1701 - Ipv6StaticRouting: the source address should match the destination scope
+- Bug 1702 - Ipv6InterfaceContainer::SetRouter should not always add the router as the default router.
+- Bug 1703 - Nodes don't react to a DAD
+- Bug 1712 - The IP (v4 and v6) forwarding needs a test
+- Bug 1718 - Ipv4StaticRouting log component is misspelled
+- Bug 1720 - IPv6 Fragmentation cause crashes
+- Bug 1721 - Path MTU isn't handled properly
+- Bug 1723 - name clash in ipv4-header.h with <termios.h>
+- Bug 1727 - Ping6 should use a proper source address
+- Bug 1728 - Radvd application is missing an Helper
+- Bug 1731 - lte-phy-error-model passes unexpectedly
+- Bug 1738 - strict aliasing compiler bug
+- Bug 1742 - IPv6 HbH and Dst Extension Header size is not correctly calculated
+- Bug 1752 - RadvdInterface m_defaultLifeTime is set to milliseconds instead of seconds
+- Bug 1753 - Halting Issue with DistributedSimulatorImpl
+- Bug 1754 - Missing GIL lock in generated callback destructor
+
+### Known issues
+
+In general, known issues are tracked on the project tracker available
+at http://www.nsnam.org/bugzilla/
+
+Release 3.17
+------------
+
+### Availability
+
+This release is available from:
+http://www.nsnam.org/release/ns-allinone-3.17.tar.bz2
+
+### Supported platforms
+
+These platforms have been tested; others may work also:
+- Fedora Core 18 (32/64 bit) with g++-4.7.2
+- Fedora Core 17 (32/64 bit) with g++-4.7.0
+- Ubuntu 13.04 (32/64 bit) with g++-4.7.3
+- Ubuntu 12.10 (32/64 bit) with g++-4.6.3
+- Ubuntu 12.04 (32/64 bit) with g++-4.6.3
+- Ubuntu 10.04.4 LTS (64 bit) with g++-4.4.3
+- OS X Mountain Lion 10.8.3 with g++-4.2.1
+- FreeBSD 9.1-RELEASE (64 bit) with g++-4.2.1
+
+### New user-visible features
+
+- new TCP Westwood and Westwood+ models
+- new FdNetDevice model and associated helpers.  The FdNetDevice is able
+  to read and write from a file descriptor.  Various helpers are provided
+  to associate this descriptor with underlying devices or sockets on the
+  host operating system, including a packet socket for emulation, and
+  tap devices including a version specialized for use on PlanetLab.
+- ns-3-click: it's now possible to (i) have Click pull random numbers from
+  ns-3 and (ii) have ns-3 set "defines" in Click via the simulation file
+  (see src/click/examples/nsclick-defines.cc).
+- Waf shipped with ns-3 has been upgraded to version 1.7.10 and custom
+  pkg-config generator has been replaced by Waf's builtin tool.
+- create-module.py script has been updated to work with waf 1.7 and support
+  for creating modules with names containing dashes has been added.
+- the M5 release of the LTE module by the LENA project has been
+  merged; please see src/lte/RELEASE_NOTES for more detailed info
+
+### Bugs fixed
+
+- bug 1256 - Unnecessary SND.NXT advance, missing ACK for Out of Order segments
+- bug 1318 - Ipv6L3Protocol::LocalDeliver can get stuck in an infinite loop
+- bug 1409 - Add an attribute "SystemId" to configure the ID for MPI
+- bug 1421 - Frequency dependent propagation loss models need uniform Frequency / Lambda attribute
+- bug 1434 - DSR throughput not comparable to other protocols for manet example
+- bug 1502 - Shutdown on tcp socket seems to misbehave
+- bug 1503 - BlockAckManager infine loop
+- bug 1517 - Waf clean/distclean doesn't remove the doc/html directory
+- bug 1540 - Waf not finding click libraries
+- bug 1549 - Test for NS_LOG
+- bug 1556 - Uses of htonl making OpenFlow's match field error
+- bug 1563 - Reduce valgrind test scope
+- bug 1564 - Packet meta data isn't shown in dumbbell-animation.xml
+- bug 1566 - WiFi SNR tag improvements
+- bug 1568 - Deserialized addresses are implicitly marked as Mac48Address
+- bug 1569 - droptail_vs_red example doesn't run
+- bug 1570 - Valgrind errors in new test examples
+- bug 1574 - Node color overwritten, by mobility updates in netanim
+- bug 1575 - Invert the y-axis in netanim
+- bug 1576 - Frequency units HERTZ and MEGAHERTZ mix up
+- bug 1577 - Typo in ascii picture in example aodv script
+- bug 1579 - edca-txop-n fragmentation causes segfault
+- bug 1582 - IPv6 raw socket return value is not like Linux socket
+- bug 1585 - Length field of A-MSDU subframe header endianness
+- bug 1586 - Building documentation fails if make runs in parallel
+- bug 1588 - UdpEchoServer::HandleRead logs fail when using Ipv6
+- bug 1589 - Bake - support pre-2.7 version of python
+- bug 1590 - Bake - more autotools version support
+- bug 1595 - Function declarations without implementations cause problems with dsr module's python bindings
+- bug 1596 - Inet TopologyReader is skipping one link and duplicating another one
+- bug 1600 - Icmpv6OptionLinkLayerAddress can only carry 48 bit addresses correctly
+- bug 1601 - RttEstimator doesn't set the m_currentEstimatedRtt to m_initialEstimatedRtt on creation
+- bug 1602 - waf build can break due to file collisions in higher-level directory
+- bug 1603 - random-variable-stream-helper - this unavalable for static member functions
+- bug 1607 - OnOffApplication over TCP with IPv6 support
+- bug 1608 - DSR Network ACK is not handled correctly
+- bug 1609 - Route Request table is needed
+- bug 1612 - pyviz (visualizer) will not be installed
+- bug 1613 - Can't build ns-3-dev with g++ 4.7.2
+- bug 1615 - Adjusting OLSR HelloInterval Attribute results in no links
+- bug 1618 - bake.py not detecting install of libxml2-dev on ubuntu
+- bug 1623 - pybindgen rev809 is not able to build after Ubuntu 1210
+- bug 1625 - ns-3-dev fails to build on Debian wheezy amd64
+- bug 1626 - ipv6-only network can't use UDP or TCP
+- bug 1632 - Prepend bake build directory to the guessed locations
+             that waf will look to find libraries
+- bug 1633 - Bake - should not report that it is downloading qt4 when it is already installed
+- bug 1635 - Small bug without Simulator::Destroy()
+- bug 1636 - Compilation error flagged as unmet dependency
+- bug 1637 - Bake calling apt-get for unpriviledged user
+- bug 1639 - bake.py support for linux mint
+- bug 1640 - bake needs to test for g++
+- bug 1641 - bake reports autotools dependency, but needs automake
+- bug 1661 - Variable ub1 defined but not used in ipv6-address.cc
+
+### Known issues
+
+In general, known issues are tracked on the project tracker available
+at http://www.nsnam.org/bugzilla/
+
+Release 3.16
+------------
+
+### Availability
+
+This release is available from:
+http://www.nsnam.org/release/ns-allinone-3.16.tar.bz2
+
+### Supported platforms
+
+- Fedora Core 17 (32/64 bit) with g++-4.7.0
+- Fedora Core 15 (64 bit) with g++-4.6.3
+- Ubuntu 12.10 (32/64 bit) with g++-4.6.3
+- Ubuntu 12.04 (32/64 bit) with g++-4.6.3
+- Ubuntu 10.04.4 LTS (64 bit) with g++-4.4.3
+- OS X Mountain Lion 10.8.3 with g++-4.2.1
+- FreeBSD 8.2 (32 bit) with g++-4.2.1
+- Cygwin 1.7.9-1 with g++-4.5.3
+
+### New user-visible features
+
+- Support several new LTE MAC schedulers developed in GSoC 2012 project.
+  Those schedulers include FD-MT, TD-MT, TTA, FD-BET, TD-BET, FD-TBFQ,
+  TD-TBFQ, PSS. Here, FD and TD mean frequency domain and time domain
+  respectively.
+- It's now possible to use distcc when building ns-3 by using
+  $ CXX='distcc g++' ./waf configure
+  $ ./waf build
+- Support topology generation with the (external) BRITE topology generation
+  tool
+
+### Bugs fixed
+
+- bug  555 - DCF immediate access
+- bug  976 - wifi-wired-bridging regression test fails because of
+             rounding errors in mobility model
+- bug 1055:  Wrong UAN's Thorp absorption loss model formula
+- bug 1284 - ./test.py performance tests do not exist
+- bug 1324 - ns3tcp-cwnd-test-suite.cc test failing
+- bug 1340 - ns3tcp-loss-suite.cc tests failing
+- bug 1342 - ns3tcp-cwnd-test-suite.cc tests failing
+- bug 1345 - ns-3 builds with clang compiler >= 3.0
+- bug 1359 - TCP cannot receive ICMP
+- bug 1361 - Set TOS from Application level (sockets)
+- bug 1463 - ./test.py --example should automatically detect the path
+- bug 1479 - When the Ipv4RawSocket "IpHeaderInclude" Attribute set true,
+             Ip Checksum error
+- bug 1485 - Setting global properties in config file (raw text) does
+             not have any effect
+- bug 1493 - test.py --list should show the test type default tip
+- bug 1493 - test.py --list should show the test type
+- bug 1494 - test.py --constrain doesn't work
+- bug 1495 - test.py claims test passed when no test was run
+- bug 1506:  TCP data segment piggybacking acknowledgment
+- bug 1509 - RttEstimator returns invalid value in presence of errors
+- bug 1516 - GtkConfigStore does not show read-only attributes
+- bug 1520 - Config paths not fully documented (partial fix)
+- bug 1524 - Fragmentation Threshold equals to Packet Size at MAC Layer
+             (Data + IP + UDP) crash the reception
+- bug 1525 - Linker error with mpi on Mac 10.8
+- bug 1526:  Wrong calculation of pathloss within
+             UanPropModelThorp::GetPathLossDb
+- bug 1527 - Ipv4RawSocket's BindToNetDevice not working
+- bug 1528 - BindToNetDevice not working for IPv6 sockets
+- bug 1531 - Crash when using NS_LOG in destructors of static objects
+- bug 1532 - unimplemented LTE Scheduler methods
+
+### Known issues
+
+In general, known issues are tracked on the project tracker available
+at http://www.nsnam.org/bugzilla/
+
+Release 3.15
+------------
+
+### Availability
+
+This release is available from:
+http://www.nsnam.org/release/ns-allinone-3.15.tar.bz2
+
+### Supported platforms
+
+- Fedora Core 17 (32/64 bit) with g++-4.7.0
+- Fedora Core 15 (64 bit) with g++-4.6.3
+- Ubuntu 12.04 (32/64 bit) with g++-4.6.3
+- Ubuntu 10.04.4 LTS (64 bit) with g++-4.4.3
+- OS X Mountain Lion 10.7.4 with g++-4.2.1
+- OS X Snow Leopard 10.6.8 with g++-4.2.1
+- FreeBSD 8.2 (32 bit) with g++-4.2.1
+- Cygwin 1.7.9-1 with g++-4.5.3
+
+### New user-visible features
+
+- A new random variable base class called 'RandomVariableStream', has been
+  introduced.  This base class derives from ns3::Object, unlike the current
+  'RandomVariable' class which is a special type of object in the ns-3
+  system to date.  By making this class derive from ns3::Object, it can be
+  handled with the Ptr class, can carry attributes, and can have its parameters
+  and initial state saved in the config-store subsystem.  A new attribute
+  called "Stream" has been introduced for this class, to allow users to
+  better control the assignment of underlying pseudo-random sequences to
+  the RandomVariableStream objects (bug 101).
+
+### Bugs fixed
+
+ - bug 101 - random variable initialization
+ - bug 1256 - Unnecessary SND.NXT advance, missing ACK for Out of Order segments
+ - bug 1308 - Nix-vector; do not process packets to self
+ - bug 1386 - assert if PositionAllocator not provided to
+              RandomWaypointMobilityModel
+ - bug 1399 - TCP not backing off retransmissions properly
+ - bug 1441 - IPv4 header length handling
+ - bug 1464 - ConfigStore Save + Load => Could not set default value
+                  for ns3::UdpSocketImpl::IcmpCallback
+ - bug 1470 - define default parameter for constructor in .h file
+ - bug 1473 - GetQueue/SetQueue missing from Csma python bindings
+ - bug 1475 - "test.py --list" should sort the output
+ - bug 1476 - TestCase::GetName () should not be private
+ - bug 1477 - Click doesn't work with raw sockets
+ - bug 1481 - Openflow example doesn't run
+ - bug 1486 - Segfaults in nix-vector-routing with bridges
+ - bug 1489 - Jakes Log component is missing
+ - fixed bug with multiple LCs in UL BSR
+ - fixed bug with lena-dual-stripe crashes with --homeUesHomeEnbRatio=2
+
+### Known issues
+
+In general, known issues are tracked on the project tracker available
+at http://www.nsnam.org/bugzilla/
+
+Release 3.14.1
+------------
+
+### Availability
+
+This release is available from:
+http://www.nsnam.org/release/ns-allinone-3.14.1.tar.bz2
+
+### Bugs fixed
+
+This hotfix release contains a fix for the PyViz visualizer and makes it
+easier to add PyViz support to examples; otherwise it is the same as the
+ns-3.14 release.
+
+Release 3.14
+------------
+
+### Availability
+
+This release is available from:
+http://www.nsnam.org/release/ns-allinone-3.14.tar.bz2
+
+### Supported platforms
+
+ns-3.14 has been tested on the following platforms.  Not all features are
+available on all platforms; check the Installation page on the project wiki.
+
+- Fedora Core 17 (32/64 bit) with g++-4.7.0
+- Fedora Core 16 (32/64 bit) with g++-4.6.3
+- Fedora Core 15 (64 bit) with g++-4.6.3
+- Ubuntu 12.04 (32/64 bit) with g++-4.6.3
+- Ubuntu 11.10 (32 bit) with g++-4.6.1
+- Ubuntu 10.04.4 LTS (64 bit) with g++-4.4.3
+- OS X Lion 10.7.4 with g++-4.2.1
+- OS X Snow Leopard 10.6.8 with g++-4.2.1
+- FreeBSD 8.2 (32 bit) with g++-4.2.1
+- Cygwin 1.7.9-1 with g++-4.5.3
+
+### New user-visible features
+
+- Transport protocol implementations (TCP, UDP) have been refactored to
+  support also IPv6 connections. Dual-stacked IPv6 sockets are implemented.
+  An IPv6 socket can accept an IPv4 connection, returning the sender's
+  address as an IPv4-mapped address (IPV6_V6ONLY socket option is not
+  implemented).
+- The LTE code from the LENA project has been merged, bringing in a
+  significant redesign of the LTE module as well as many new features.
+- An antenna module is now included, which includes different
+  radiation pattern models. See the corresponding new section of the
+  ns-3 models library documentation for details.
+- A new buildings module is introduced which allows to model the
+  presence of buildings in a wireless network topology.
+- New propagation models (OkumuraHata, ITU-R P.1411, ITU-R P.1238)
+  have been added
+- The Dynamic Source Routing (DSR) MANET routing protocol for IPv4 was added.
+- A Random Early Detection (RED) queue model has been added.
+- Ipv6RoutingHelper is now in-line with Ipv4RoutingHelper concerning the RT
+  print functions. Various minor changes were made in Ipv6RoutingProtocol and
+  derived classes to make this possible.
+- New "SendIcmpv6Redirect" attribute (and getter/setter functions) to
+  Ipv6L3Protocol. The behavior is similar to Linux's conf "send_redirects",
+  i.e., enable/disable the ICMPv6 Redirect sending.
+- Longer and more descriptive names are used for error units in RateErrorModel
+  class and queue mode in Queue class. Attributes in those classes are also
+  changed for consistency. See API documentation for details.
+- The netanim animator is now bundled with the release.
+
+### Bugs fixed
+
+ - bug 603 - Simulator::Next is useless
+ - bug 631 - RealtimeSimulatorImpl does not handle Ctrl-C with python bindings
+ - bug 962 - list of paths to reach objects contains bogus entries
+ - bug 1000 - Make RealtimeSimulatorImpl last until stop
+ - bug 1053 - Need better error diagnostics in ns2-mobility-trace example
+ - bug 1109 - Point out the effects of ArpCache::PendingQueueSize
+ - bug 1179 - Add LTE trace hooks for supporting visualizer
+ - bug 1180 - LTE: Add TX/RX trace support
+ - bug 1273 - Better error message on missing Python development files
+ - bug 1282 - Sleep state and CCA
+ - bug 1283 - PacketSocket::SendTo should return number of bytes
+ - bug 1302 - Flow monitor bug
+ - bug 1304 - Tag information changed after transmission
+ - bug 1313 - Stddev (average.h) returning NaN
+ - bug 1318 - Asserts for IPv6 malformed packets
+ - bug 1319 - Fix Ipv6RawSocketImpl Icmpv6 filter
+ - bug 1325 - Python examples get valgrind errors when build subdirectories
+              are specified in waf
+ - bug 1339 - test.py uses the old name for the test runner
+ - bug 1348 - python bindings: deprecated conversion from string constant
+              to â€˜char*â€™
+ - bug 1349 - TypeId.LookupAttributeByName Python bindings missing
+ - bug 1350 - Simulator.ScheduleWithContext Python binding missing
+ - bug 1351 and 1333 - TCP not able to take RTT samples on long delay network
+ - bug 1352 - Fixed MapAttributes, previously was mapped to a vector in
+              ObjectPtrContainer and (and key information was dropped).
+              Now the container is a map.
+ - bug 1354 - Building scratch subdir programs is broken
+ - bug 1355 - Visualizer dependencies not detected at buildtime
+ - bug 1357 - IPv6 fragmentation fails due to checks about malformed extensions
+ - bug 1362 - ICMPv6 does not forward ICMPs to upper layers (and minor
+              fixes to ICMPv6)
+ - bug 1376 - wrong wind variable's name
+ - bug 1378 - UdpEchoClient::SetFill () does not set packet size correctly
+ - bug 1379 - lte-multiple-flows example crashes
+ - bug 1380 - lte-phy-uplink example crashes
+ - bug 1391 - .ns3rc does not allow comments as expected
+ - bug 1392 - Modules built report does not clarify C++ or Python
+ - bug 1393 - IPv6 Routing Helper RT Print functions
+ - bug 1395 - AODV DeferredRouteOutputTag missing constructor
+ - bug 1396 - ARP with hardware addresses longer than 6 bytes
+ - bug 1399 - TCP not backing off retransmissions properly
+ - bug 1404 - Bound user input in tutorial third.cc program
+ - bug 1406 - waf exits with maximum recursion depth exceeded
+ - bug 1415 - examples-to-run.py doesn't work with command line arguments
+ - bug 1420 - no python bindings for csma-layout
+ - bug 1441 - IPv4 header length handling
+
+### Known issues
+
+In general, known issues are tracked on the project tracker available
+at http://www.nsnam.org/bugzilla/
+
+Release 3.13
+------------
+
+### Availability
+
+This release is available from:
+http://www.nsnam.org/release/ns-allinone-3.13.tar.bz2
+
+### Supported platforms
+
+ns-3.13 has been tested on the following platforms.  Not all features are
+available on all platforms; check the Installation page on the project wiki.
+
+- Ubuntu 11.10 (32 bit) with g++-4.5.2
+- Ubuntu 11.04 (32/64 bit) with g++-4.5.2
+- Ubuntu 10.04.3 LTS (64 bit) with g++-4.4.3, g++-3.4.6
+- OS X Lion with g++-4.2.1
+- OS X Snow Leopard with g++-4.2.1
+- Fedora Core 16 (32/64 bit) with g++-4.6.2
+  - however, g++-3.4.6 fails on Fedora 16 i686
+- Fedora Core 14 (64 bit) with g++-4.5.1
+- FreeBSD 9.0-RC1 (AMD64) with g++-4.2.1
+
+### New user-visible features
+
+- IPv6 address generator with support for duplicate address detection
+
+### Bugs fixed
+
+- bug 962 - list of paths to reach objects contains bogus entries
+- bug 1001 - Buffer::CopyData() doesn't return the number of bytes copied
+- bug 1010 - Uan model sleep patch
+- bug 1020 - Wrong usage of the originator sequence number in HWMP PREP
+- bug 1021 - Beacon collision avoidance in Mesh module works incorrectly
+- bug 1039 - Nagle's algorithm in TCP
+- bug 1055 - Wrong UAN's Thorp absorption loss model formula
+- bug 1059 - Unable to load trace files created from SUMO and TraNS Lite
+- bug 1112 - Advance m_nextTxSequence upon retransmit after RTO
+- bug 1137 - mpi module is hard-coded for openmpi
+- bug 1166 - IPV4 TCP failed to send a RST when connect arrives before listen
+- bug 1186 - Ipv4Header lacks DSCP and ECN
+- bug 1204 - Can't Parse Time +100000000.0ns
+- bug 1219 - Coding style of ns2-mobility-helper-test-suite.cc is fixed
+- bug 1257 - waf install __init__ Python files even with --disable-python
+- bug 1263 - waf configure fails on FreeBSD 9.0-BETA2 amd64
+- bug 1266 - gdb cannot be loaded
+- bug 1227 - Spurious RTO due to low min RTO
+- bug 1229 - Multiplication overflow in WaypointMobilityModel::EndMobility
+- bug 1242 - m_lastRtt in tcp-socket-base.cc not implemented
+- bug 1256 - TCP unnecessary snd.nxt advance
+- bug 1265 - Make ns-3 directory "movable"
+- bug 1269 - sqlite3 not found on FreeBSD
+- bug 1270 - "Checking boost includes" weirdness
+- bug 1278 - Ipv4ClickRouting::HandleScheduleFromClick bug
+- bug 1281 - Checksum not calculated when doing IP fragmentation
+- bug 1285 - IPv6 Localhost is marked as GLOBAL instead of HOST
+- bug 1290 - buffer-test.cc gets a valgrind error
+- bug 1295 - Missing const qualifiers in TopologyRead
+- bug 1299 - EnableAsciiIpv4All tracing doesn't show transmitted/recvd packets
+- bug 1300 - HalfDuplexIdealPhy notify SpectrumInterference of AbortRx
+- bug 1301 - Ns2MobilityHelper causes Node GetPosition() to return NaN
+- bug 1305 - do not list modules built upon exiting waf shell
+- bug 1312: TopologyRead Assert condition fix
+- IPv4 packets double fragmentation was broken
+- Fix wifi-clear-channel-cmu.cc example
+- NetAnim: fix for bcast packet reuse
+- Missing PropagationLossModel.CalcRxPower in Python bindings
+- Corrected compilation behavior in Ubuntu 11.10 due to ldd behavior change
+- Added required PTHREAD dependency to RT library check.
+
+### Known issues
+
+In general, known issues are tracked on the project tracker available
+at http://www.nsnam.org/bugzilla/
+
+Release 3.12.1
+--------------
+
+### Availability
+
+This release is available from:
+http://www.nsnam.org/release/ns-allinone-3.12.1.tar.bz2
+
+### Bugs fixed
+
+This release fixes PyViz visualizer's python bindings; otherwise, it
+is the same as the ns-3.12 release.
+
+Release 3.12
+------------
+
+### Availability
+
+This release is available from:
+http://www.nsnam.org/release/ns-allinone-3.12.tar.bz2
+
+### Supported platforms
+
+ns-3.12 has been tested on the following platforms.  Not all features are
+available on all platforms; check the Installation page on the project wiki.
+
+- Fedora Core 15 (32/64 bit) with g++-4.6.0
+- Ubuntu 11.04 (32/64 bit) with g++-4.5.2
+- OS X Lion with g++-4.2.1
+- Fedora Core 14 (64 bit) with g++-4.3.4, g++-4.5.3, g++-4.4.6
+- Fedora Core 12 (64 bit) with g++-4.4.4
+- OS X Snow Leopard with g++-4.2.1
+- Ubuntu 10.04.3 LTS (64 bit) with g++-4.4.3, g++-3.4.6
+
+### New user-visible features
+
+- SpectrumChannel models now support the usage of single-frequency
+  propagation loss models based on the PropagationLossModel
+  class. These model can be used in conjunction with
+  the frequency-dependent propagation loss model based on the
+  SpectrumPropagationLossModel class already supported by
+  SpectrumChannel.
+
+- Extend the attribute system extend the attribute system to store map
+  container objects in addition to vector containers.  The ObjectMap
+  and related classes are patterned after ObjectVector.
+
+- Support for IPv4 fragmentation has been added.
+
+- Significant performance improvement for AODV in dense mobile scenarios
+  due to a fixed bug in RERR processing.
+
+- WiFi traces that were named promiscuous are now renamed monitor, and
+  a separate flag for setting the interface to promiscuous mode has been
+  introduced.  This disambiguates monitor mode from promiscuous mode.
+
+- Monolithic Python bindings have been removed
+
+### Bugs fixed
+
+- bug 845  - fix ConfigStore output for changing default values
+- bug 1010 - Uan model Sleep patch
+- bug 1033 - Mesh airtime-metric fixed
+- bug 1043 - lte-spectrum-value-helper.cc file swapped uplink/downlink freq.
+- bug 1050 - ISO C++ forbids variable length array; remove all instances
+- bug 1057 - LTE bearers differentiation issue
+- bug 1082 - Check that log component names are correct when taken from NS_LOG
+- bug 1100 - IPv6 fragmentation enhancements
+- bug 1102 - IPv4 header fragment offset field not set correctly
+- bug 1123 - class MinMaxAvgTotalCalculator does not implement all methods
+- bug 1134 - Fix LiIonEnergySource attribute spelling for InitialCellVoltage
+- bug 1139 - Broadcast packets issue in uan cw mac
+- bug 1141 - MeshWifiInterfaceMac adds supported modes to wrong remote station
+- bug 1163 - Ipv4EndPointDemux::AllocateEphemeralPort forget to increment port
+- bug 1164 - IPV4 TCP Bind already used port failed, but without setting errno
+- bug 1168 - BridgeNetDevice: default expiration time not realistic
+- bug 1174 - Ns-3 does not generate static libraries
+- bug 1175 - shared libraries are not versioned
+- bug 1193 - AODV Hello timers scheduling skewed when RREP, RREQ are processed
+- bug 1194 - AODV Incorrect RERR processing
+- bug 1201 - UDP sockets need to set connected state before notifying the ConnectionSucceeded callback
+- bug 1208 - Spectrum module example causing valgrind errors
+- bug 1209 - ns-3-click fails to build on Fedora 15 when tests are enabled
+- bug 1220 - FdReader always stops with NS_FATAL_ERROR
+- bug 1222 - Incomplete PointToPointNetDevice Python bindings
+- bug 1224 - ns-3-allinone fails to compile on OS X Lion
+- bug 1226 - Incomplete YansWifiChannel Python bindings
+- bug 1234 - GetAttributeChecker is not defined anymore but still used
+- bug 1239 - Add assertion that reference count never overflows
+- bug 1244 - Seg Faults in optimized builds due to missing Logging components
+- Fix ARP issue in nsclick-ip-router.click and static route in nsclick-routing-node2.click
+
+### Known issues
+
+In general, known issues are tracked on the project tracker available
+at http://www.nsnam.org/bugzilla/
+
+Release 3.11
+------------
+
+### Availability
+
+This release is available from:
+http://www.nsnam.org/release/ns-allinone-3.11.tar.bz2
+
+### Supported platforms
+
+ns-3.11 has been tested on the following platforms.  Not all features are
+available on all platforms; check the Installation page on the project wiki.
+
+- Linux x86_64 Ubuntu 11.04
+  - g++-4.5.2
+- Linux i686 Ubuntu 11.04
+  - g++-4.5.2, g++-4.4.5
+- Linux x86_64 Fedora Core 15
+  - g++-4.6.0
+- Linux x86_64 Fedora Core 14
+  - g++-4.5.3, g++-4.4.6, g++-4.3.4
+- Linux x86_64 Fedora Core 10
+  - g++-3.4.6, 4.0.4, 4.1.2, 4.2.4, 4.3.2, 4.4.0
+- OS X Snow Leopard
+  - g++-4.2.1
+
+### New user-visible features
+
+- The build system has been modularized, and the source code reorganized,
+  to allow for modular libraries instead of a single monolithic ns-3
+  library.   User programs now link a number of smaller, per-module
+  libraries depending on the dependencies expressed to the build system.
+  Source code is now being maintained in individual modules with
+  consistent directory structures.
+
+- Python bindings have also been modularized, and the bindings are now
+  generated into a 'ns' namespace instead of 'ns3' for the old
+  (monolithic) bindings.  By default the bindings are now modular, with
+  a backward compatibility layer for older programs.
+
+- By default, example and test programs are disabled from the build.
+  Users can enable them via the use of a waf command at configure time,
+  or automatically through the use of a new .ns3rc file.
+
+- int64x64_t is a new type which allows portable and easy to write arithmetic
+  calculations that require a high degree of fractional precision.
+
+- An interface to the Click Modular Router and an Ipv4ClickRouting
+  class has been added, to allow a node to use Click for external routing.
+
+- An interface to an OpenFlow software implementation distribution has
+  been added to allow the simulation of OpenFlow switches in ns-3.
+
+- ns-3 coding style requirements have been applied to the entire coding
+  base, resulting in a large number of whitespace changes.  The coding
+  style has been automatically enforced by running a style checking
+  program (utils/check-style.py) that uses the uncrustify (v. 0.58)
+  program to apply changes.
+
+- Some documentation reorganization to split documentation between
+  the ns-3 manual (primarily focusing on the ns-3 core) and a new
+  "model library" document has been started.
+
+### Bugs fixed
+
+The following lists many of the bugs fixed or small feature additions
+since ns-3.10, in many cases referencing the Bugzilla bug number.
+
+- bugfix: CsmaNetDevice ErrorModel not discarding packet
+- bugfix: do not call RouteOutput() twice
+- Workaround gccxml bug scanning Seconds(0) as default value
+- Copy a bug fix from ns3modulescan.py into ns3modulescan-modular.py
+- Modular Python bindings work (many bug fixes, more modules tested)
+- Modular bindings: bug fixes, more verbose scanning
+- ./waf --apiscan: fix bug in detection of whether the per-module
+- Remove the 'Modules to build' debug print
+- CsmaNetDevice ReceiveErrorModel was not dropping the packet
+- Several "set but not used" bugs for newer compilers quick-fixed
+
+- bug 445 - Is the class name Scalar in nstime.h appropriate?
+- bug 699 - TestCase::DoRun probably should not return a bool
+- bug 823 - Need finer-grained control over what goes into libns3
+- bug 957 - Issue with test.py
+- bug 1017 - node --> internet-stack --> node
+- bug 1018 - mobility --> helper --> mobility circular dependency
+- bug 1019 - common --> node --> common circular dependency
+- bug 1038 - Time::Get*Seconds () return signed integer while actually returning unsigned.
+- bug 1040 - Olsr and multiple interfaces
+- bug 1042 - AODV RERR implosion (missing RERR_RATELIMIT)
+- bug 1044 - Seconds (1e-9) creates Time that is not IsPositive ()
+- bug 1047 - Multicast routes on nodes with >16 interfaces
+- bug 1048 - suggested MatrixPropagationLossModel::SetLoss() API change
+- bug 1049 - Issues with OLSR HNA messages sent by multiple gateways
+- bug 1052 - olsr::RoutingProtocol::LinkTupleUpdated incorrect detection of asymmetric link with multiple interface nodes
+- bug 1054 - ipv6 InternetStackHelper EnablePcapIpv6All() broken
+- bug 1056 - CSMA: padding not handled correctly for LLC encapsulation
+- bug 1058 - InternetStackHelper pitfall: calling Install before adding routing protocols
+- bug 1060 - Setting NqStaWifiMac Active Probing true, crashes simulation
+- bug 1061 - Title level inconsistent in click.rst
+- bug 1062 - rescale-pdf not working
+- bug 1064 - Correct Friis propagation loss equation in spectrum module
+- bug 1066 - Set Radiotap modulation type flags correctly
+- bug 1069 - ApWifiMac unduly calls RegularWifiMac::Receive and crashes
+- bug 1070 - csma/ipv6 examples duplicate NS_LOG_COMPONENT_DEFINE
+- bug 1072 - crash upon call to Packet::AddAtEnd of fragmented packets
+- bug 1075 - Python examples fail when static built is enabled
+- bug 1076 - Waf gives an error if you enable only a single module
+- bug 1078 - PacketTagList::Add performs NS_ASSERT counting one byte too few
+- bug 1079 - MPI code doesn't compile
+- bug 1081 - wutils.py refers to the old directory for visualizer module
+- bug 1083 - scratch doesn't work when only some modules are enabled
+- bug 1085 - Build failed: list index out of range
+- bug 1086 - sanity check for not calling Object::Dispose () twice
+- bug 1087 - Call MPI_Finalize to exit MPI environment
+- bug 1088 - Code in scratch directory assumes all modules are enabled
+- bug 1089 - lwip build issue
+- bug 1090 - WifiMacQueue is not accessible through the attribute path
+- bug 1092 - Problem building FreeBSD stack with g++ 4.5.2 (Ubuntu)
+- bug 1094 - Object::GetObject upon dlopen
+- bug 1097 - AODV routing entry set to be VALID mistakenly.
+- bug 1098 - when to show users which modules are enabled?
+- bug 1101 - Sqlite stats disappeared from configuration file src/wscript
+- bug 1103 - Useless assignment in omnet-data-output.cc
+- bug 1105 - Move topology helpers into separate per-device modules
+- bug 1106 - Remove "CanvasLocation" dependencies in p2p helpers
+- bug 1108 - test.py -e option needs repair
+- bug 1110 - Sort alphabetically and display "Modules built" in columns
+- bug 1117 - bindings failures on selected platforms
+- bug 1122 - spectrum-value test should check tolerance on a per-value basis
+- bug 1125 - ./waf --enable-modules fails
+- bug 1131 - Bug in Ipv4L3Protocol::RemoveAddress()
+- bug 1133 - DSDV: Possible bug in settling time calc
+- bug 1142 - Wrong 802.11p Slot time
+- bug 1146 - help string for test.py with disabled tests
+
+### Known issues
+
+In general, known issues are tracked on the project tracker available
+at http://www.nsnam.org/bugzilla/
+
+Release 3.10
+------------
+
+### Availability
+
+This release is available from:
+http://www.nsnam.org/release/ns-allinone-3.10.tar.bz2
+
+### Supported platforms
+
+ns-3.10 has been tested on the following platforms.  Not all features are
+available on all platforms; check the Installation page on the project wiki.
+
+- Linux i686 Ubuntu 10.10
+  - g++-4.4.5
+- Linux x86_64 Ubuntu 8.04.4
+  - g++-3.4.6, g++-4.2.4
+- Linux x86_64 Fedora Core 12
+  - g++-4.4.4
+- Linux x86_64 Fedora Core 10
+  - g++-3.4.6, 4.0.4, 4.1.2, 4.2.4, 4.3.4, 4.4.0
+- OS X Snow Leopard
+  - g++-4.2.1
+- OS X powerpc Leopard
+  - g++-4.0, g++-4.2
+
+### New user-visible features
+
+- NS-3 PyViz, a live simulation visualizer, has been added.  The
+  visualizer interacts with a running simulation, such that it uses no
+  trace files. It can be most useful for debugging purposes, i.e. to
+  figure out if mobility models are what you expect, where packets are
+  being dropped, etc. There is also a builtin interactive python console
+  that can be used to debug the state of the running objects. Although
+  it is mostly written in Python, it works both with Python and pure C++
+  simulations.
+
+- Wi-Fi MAC high classes have been reorganised in attempt to
+  consolidate shared functionality into a single class. This new
+  class is RegularWifiMac, and it derives from the abstract
+  WifiMac, and is parent of AdhocWifiMac, StaWifiMac, ApWifiMac,
+  and MeshWifiInterfaceMac. The QoS and non-QoS class variants are
+  no longer, with a RegularWifiMac attribute "QosSupported"
+  allowing selection between these two modes of
+  operation.
+
+- Support for IEEE 802.11g (specifically, rates with Modulation
+  Class ERP-OFDM) has been added to the wifi module. The new
+  WifiModes have names of the form ErpOfdmRatexxMbps, where xx is
+  the rate in Mbps (one of 6, 9, 12, 18, 24, 36, 48, 54), and a
+  WifiPhyStandard enumeration WIFI_PHY_STANDARD_80211g has been
+  added to allow configuration of a Wi-Fi STA supporting ERP-OFDM,
+  HR/DSSS, and DSSS rates (which some call an "802.11b/g" station).
+
+- Two attributes were added to WaypointMobilityModel.  The first
+  "LazyNotify" (default false), if enabled to true, will suppress
+  course change notifications if there are no position updates.
+  The second, "InitialPositionIsWaypoint" (default false), if enabled,
+  will allow an initial call to SetPosition () (before any waypoints
+  have been added) to be treated as the first waypoint.
+
+- Regression testing is now completely performed within test.py
+  rather than a separate "./waf --regression" that consults
+  reference traces in the ns-3.x-ref-traces directory.  In most
+  cases, the example programs whose traces were included in
+  ns-3.x-ref-traces have a corresponding test called from the
+  test.py program.  It is still possible to write trace-based
+  regression tests but they are now called from the test.py
+  program.
+
+- New BulkSendApplication sends data as fast as possible up to
+  MaxBytes or unlimited if MaxBytes is zero.  Think OnOff, but
+  without the "off" and without the variable data rate. This
+  application only works with SOCK_STREAM and SOCK_SEQPACKET
+  sockets, for example TCP sockets and not UDP sockets.
+
+- Extensions to the energy models:  1) a new Rakhmatov Vrudhula
+  non-linear battery model, 2) additional support for modeling
+  energy consumption in WiFi devices, 3) an example for how to add
+  energy models to a WiFi-based simulation (in examples/energy/
+  directory).
+
+- New methods to print IPv4 routing tables to an output stream.
+
+- A replacement implementation for TCP for IPv4.  TcpSocketBase
+  now replaces TcpSocketImpl.  There are subclasses defined for
+  TCP Tahoe, Reno, NewReno, and the original RFC793 without
+  congestion control.
+
+- Energy support for UAN module and Li-Ion energy model.
+  Now each network node can have an associated energy source
+  from which it consumes energy. The user can specify a custom
+  energy model for the underwater transducer, with default values
+  set for WHOI acoustic transducer. Li-Ion battery model added
+  into energy models folder.
+
+- Destination-Sequenced Distance Vector (DSDV) routing protocol
+  is a proactive, table-driven routing protocol for MANETs
+  developed by Charles E. Perkins and Pravin Bhagwat in 1994.
+  This implementation is for IPv4 routing and was contributed
+  by ResilNets Research Group.
+
+- A novel model to simulate LTE networks has been added.  It focuses
+  mainly on modeling the E-UTRA part of the system, with a particular
+  attention on the aspects related to the channel, PHY and MAC layers.
+  The most important features available at this moment are (i) a basic
+  implementation of both the UE and the eNB devices, (ii) RRC and
+  entities for both the UE and the eNB, (iii) an Adaptive Modulation
+  and Coding (AMC) scheme for the downlink, (iv) the management of the
+  data radio bearers (with their QoS parameters), the MAC queues and
+  the RLC instances, (v) Channel Quality Indicator (CQI) management,
+  (vi) support for both uplink and downlik packet scheduling,
+  (vii) a PHY layer model with Resource Block level granularity, and
+  (viii) a channel model with the outdoor E-UTRAN propagation loss
+  model.
+
+- Project documentation has been converted from GNU Texinfo to Sphinx.
+
+### Bugs fixed
+
+The following lists many of the bugs fixed or small feature additions
+since ns-3.9, in many cases referencing the Bugzilla bug number
+
+- bug 824 - TCP should implement FastRecovery by default
+- bug 852 - Add support for 802.11g devices
+- bug 892 - WaypointMobilityModel incompatible with MobilityHelper::Install
+- bug 893 - Lazy CourseChange notification for WaypointMobilityModel
+- bug 903 - TapBridge does not shut down properly
+- bug 953 - WiMAX channel scanning overflow
+- bug 967 - Need to decouple Ipv4L4Protocols from Ipv4L3Protocol
+- bug 978 - Consolidate Wi-Fi MAC high functionality
+- bug 979 - Multi-octet fields in Wi-Fi headers have wrong endianness
+- bug 981 - use a cache to keep track of received MPDUs under block ack
+- bug 983 - handle correctly ADDBA response action frames in QadhocWifiMac
+- bug 984 - EmuNetDevice should use DIX encapsulation by default
+- bug 985 - WiMAX Invalid management message type on wimax-simple
+- bug 988 - MacRxMiddle::SequenceControlSmaller method
+- bug 990 - Error with an NS_ASSERT at uan-phy-gen.cc
+- bug 991 - InterferenceHelper assertion failure
+- bug 992 - Unusual (possibly incorrect assertion) in Packet::Deserialize
+- bug 993 - MinstrelWifiManager::UpdateStats useless if clause
+- bug 994 - PointToPointGridHelper useless if clauses
+- bug 995 - Useless (possibly incorrect) comparison of unsigned int
+- bug 1004 - module header not rebuilt
+- bug 1005 - GetSocket() methods for OnOffApplication and PacketSink
+- bug 1009 - decouple m_finSequence (TcpSocketImpl) from tx sequence numbers
+- bug 1012 - UAN Throp propagation model bug
+- bug 1015 - GetChannelFrequencyMhz() does not match with standard
+- bug 1022 - inappropriate ASSERT in tcp-socket-impl.cc
+- bug 1025 - wimax-ipv4 script exists with signal SIGSEGV when nbSS>20
+- bug 1027 - RocketfuelTopologyReader is not working at all
+- bug 1029 - v4Ping application endian issues
+- bug 1030 - routing/aodv example fixed
+- bug 1031 - Wifi hidden terminal example does not work
+- bug 1032 - Unable to specify multiple Compiler/Linker flags
+
+### Known issues
+
+In general, known issues are tracked on the project tracker available
+at http://www.nsnam.org/bugzilla/
+
+Windows XP 32 bit Cygwin 1.7.7 does not seem to work because of a
+problem (reported elsewhere) in linking large libraries.
+
+Release 3.9
+-----------
+
+### Availability
+
+This release is immediately available from:
+http://www.nsnam.org/release/ns-allinone-3.9.tar.bz2
+
+### Supported platforms
+
+ns-3.9 has been tested on the following platforms:
+- Ubuntu 10.04 LTS 32/64-bit gcc-4.4.3
+- Fedora Core 12 64-bit gcc-4.4.3
+- Ubuntu 9.10 32-bit gcc-4.4.1
+- Ubuntu 8.04 LTS 64-bit gcc-4.2.4
+- Fedora Core 5 32-bit gcc-4.1.1
+- Mac OS X Leopard powerpc gcc-4.0.1
+- Windows Cygwin 1.7.5
+
+Not all ns-3 options are available on all platforms; consult the
+wiki for more information:
+http://www.nsnam.org/wiki/Installation
+
+### New user-visible features
+
+- A reorganisation of the construction of Wi-Fi transmit rates has
+  been undertaken with the aim of simplifying the task of
+  supporting further IEEE 802.11 PHYs. This work has been completed
+  under the auspices of Bug 871. A consequence of this work is that
+  WifiModes have a new (hopefully future-proof) naming, and
+  simulations which specify rates by name will need updating. The
+  list of new rate names is given in the error message produced
+  when an attempt is made to use any invalid rate name (including
+  those that were previously valid).
+
+- A new OFDM error rate model for WiFi (NistErrorRateModel); this model
+  has been validated in clear-channel testbed tests.  For 802.11b, it
+  uses the same underlying model as the YansErrorRateModel, but it differs
+  from YansErrorRateModel for OFDM modes (802.11a/g).  The default
+  YansWifiPhyHelper has been changed to use this model.
+
+- A new NS-2 mobility trace reader supports BonnMotion, SUMO, TraNS,
+  etc. traces.
+
+- An energy model for nodes and devices, including an energy source
+  model and device energy models allowing energy-aware devices
+  to notify the energy source about energy consumption.
+
+- Rocketfuel topology dataset support for existing topology reader
+  Rocketfuel project:
+  http://www.cs.washington.edu/research/networking/rocketfuel/
+
+- Underwater Acoustic Network (UAN) model, split in to three parts, the
+  channel, PHY, and MAC models to enable researchers to model a variety
+  of underwater network scenarios.
+
+- the Spectrum framework, which provides support for spectrum-aware
+  Channel and PHY layer modeling. It features a set of classes that
+  allows the mathematical representation of frequency dependent
+  phenomena. Some example channel, propagation and device
+  implementations that make use of this framework are also
+  included.
+
+### Bugs fixed
+
+The following lists many of the bugs fixed or small feature additions
+since ns-3.8, in many cases referencing the Bugzilla bug number
+
+- IPv4 global routing code; stub networks were assumed to be /24
+  and added as /24 networks even if the mask is actually different
+- OLSR was generating messages on non-OLSR interfaces
+- ICMPv4 objects not properly registered; affected serialization code
+- bug 231 - SocketAddressTag needs to be removed from a packet before
+            forwarding the packet to the user
+- bug 385 - Add a generic "sequence number" class
+- bug 473 - [PATCH] Alternative ns-2 trace reader
+- bug 665 - Need Tutorial Sectino on Config Path and Tracing Use
+- bug 671 - add packet-info-tag.cc for IP_PKTINFO/IPV6_PKTINFO
+- bug 702 - Global routing doesn't respond to interface events
+- bug 799 - Interference helper is too slow
+- bug 800 - Erroneous packet sender while using aloha or cw mac in uan module
+- bug 802 - Minstrel algorithm causes segmentation fault
+- bug 826 - Using uint64_t instead of Time in DcfManager
+- bug 828 - PacketSocket::Close does not unregister protocol handler
+- bug 842 - ns-3-dev crashes using block acks
+- bug 843 - Most wifi examples change BeaconInterval to unrealistic values
+- bug 844 - YansWifiPhy::GetPowerDbm off-by-one problem when calculating Tx
+            power
+- bug 846 - packet.cc triggers deprecated warning
+- bug 853 - Rates for Wi-Fi control responses are incorrectly selected
+- bug 854 - Support DROP_QUEUE reason-code in Ipv4FlowProbe
+- bug 858 - support MSG_PEEK in IPv4/IPv6 raw socket
+- bug 861 - Forwarding drops (due to no route found) were not being logged
+            in IPv4 or IPv6 ascii traces
+- bug 869 - suggested test framework enhancements
+- bug 871 - naming for WifiPhyStandard
+- bug 873 - Queue occupancy counter not decremented in WifiMacQueue::Remove()
+- bug 874 - wrong modulation type is selected in the forwardBurst method
+- bug 875 - "frame includes FCS" flag should be set in Radiotap frame header
+- bug 879 - source address selection for AODV using DeferredRouteRequest
+- bug 881 - Reorganise to allow wider use of WifiInformationElement
+- bug 890 - several rate adaptation algorithms not tested by test.py
+- bug 900:  RawTextConfigLoad::Default does not load configurations
+- bug 901 - Optimize Mac48Address < != and ==
+- bug 902 - TCP: handle out-of-order packets during connection shutdown
+- bug 905 - WimaxNetDevice loses packet uid, tags, and memory optimization
+- bug 906 - NSC TCP socket fork did not copy txbuffersize over
+- bug 908 - test.py should exit if waf dies
+- bug 910 - Change Wi-Fi "AccessClass" to something closer to the standard
+- bug 911 - IPv4/v6 multicast forwarding not going to all output interfaces
+- bug 913 - Queue Enqueue/Drop trace sources behavior unintuitive
+- bug 916 - EnableAsciiAll ("prefix") does not work for YansWifiPhyHelper
+- bug 918 - samples/main-packet-header.cc is broken
+- bug 919 - minstrel does not pass valgrind tests
+- bug 921 - Inconsistent declaration of class/struct Object in object.h
+- bug 922 - Inconsistent declaration of class/struct in
+            wifi-remote-station-manager.h
+- bug 923 - Inconsistent declaration of class/struct in mac-low.h
+- bug 924 - Inconsistent declaration of class/struct in <xxx>-wifi-managers
+- bug 925 - Various IPv6 cc files trigger deprecated warning
+- bug 926 - olsr handling of multicast packets
+- bug 927 - SimpleOfdmWimaxChannel RxPower computation
+- bug 930 - examples/topology-read/topology-example-sim.cc uses variable
+            length array
+- bug 931 - Abnormal exit reports SIGSEGV on failure
+- bug 932 - Support IP_HDRINCL option for Ipv4RawSocket
+- bug 933 - Flushing ostream and files on abnormal program exit
+            (ASSERT, ABORT and FATAL_ERROR)
+- bug 936 - Waf build error for python bindings on "AccessClass"
+- bug 937 - bugs in ns-3 wimax
+- bug 939 - EmuNetDevice uses too much memory when reading packet bursts
+- bug 940 - AODV fails to set up a correct path
+- bug 941 - Wifi Dcf attributes not reachable through configuration namespace
+- bug 943 - Add a SO_BROADCAST socket option
+- bug 944 - change default ErrorRateModel from YansErrorRateModel to
+            NistErrorRateModel
+- bug 946 - Rocketfuel topology dataset support for topology reader
+- bug 949 - Node::NonPromiscReceiveFromDevice reports a meaningless
+            destination address to user callbacks
+- bug 950 - PointToPointNetDevice says promisc support is not implemented
+            but it is
+- bug 955 - Install NSC for NS3 in a Itanium Architecture (ia64) with Linux 2.6.16.6
+- bug 956 - Bindings failure in core (traced-value) with older gcc
+- bug 958 - WiFi uses wrong default values for MTU, FragmentationThreshold
+            and RtsCtsThreshold
+- bug 959 - Simulation never finishes when using RealtimeSimulatorImpl
+- bug 960 - V4Ping does not generate checksum
+- bug 961 - Problem with MPI activation
+- bug 964 - AODV does not work with host addressed interfaces
+- bug 965 - Problem building /src/core/callback.cc
+- bug 966 - AODV originates new RREQ on each packet, when doesn't have
+            valid route
+- bug 969 - No SocketList is present in UdpL4Protocol class
+- bug 971 - fix AODV header Print functions
+- bug 972 - [flow monitor] assertion fails in pv4-flow-probe.cc
+
+### Known issues
+
+
+Release 3.8
+-----------
+
+### Availability
+
+This release is immediately available from:
+http://www.nsnam.org/release/ns-allinone-3.8.tar.bz2
+
+### Supported platforms
+
+ns-3.8 has been tested on the following platforms:
+  - linux x86 gcc 4.4.0, 4.3.2, 4.2, 4.1.1, 4.1 and 3.4.6 (debug and optimized)
+  - linux x86_64 gcc 4.4.0, 4.3.2, 4.2.4, 4.2.3, 4.2.1, 4.1.3, 3.4.6 (debug and optimized)
+  - MacOS X ppc gcc 4.0.x and 4.2.x (debug and optimized)
+  - cygwin gcc 4.3.4 (debug and optimized)
+
+Not all ns-3 options are available on all platforms; consult the
+wiki for more information:
+http://www.nsnam.org/wiki/Installation
+
+### New user-visible features
+
+- WiMAX net device: Allow to simulated IEEE 802.16 point to multi-point based networks
+
+- Distributed simulation for point-to-point networks using the Message
+  Passing Interface (MPI) standard.
+
+- Matrix propagation loss model uses a two-dimensional matrix of path loss indexed
+  by source and destination nodes.
+
+- Topology read system: Allows quick and easy creation of large topologies by reading
+  Inet or Orbis files
+
+- Gauss-Markov mobility model: Adds 3-d adaptation of Gauss-Markov mobility model which
+  has both memory and variability
+
+- Steady-state random waypoint mobility model: Based on random waypoint mobility (RWM) model for case when
+  speed, pause and position are uniformly distributed random variables. However, initial values of these
+  parameters are not from uniform distribution but from stationary distribution of RWM model.
+
+- Two-ray ground propagation loss model: Calculates the crossover distance under which Friis is used.
+  The antenna height is set to the nodes z coordinate, but can be added to using the model parameter
+  SetHeightAboveZ, which will affect ALL stations
+
+
+### API changes from ns-3.7
+
+API changes for this release are documented in the file CHANGES.html.
+
+### Bugs fixed
+
+The following lists many of the bugs that were fixed since ns-3.7, in
+many cases referencing the Bugzilla bug number
+- bug 155 - std::ostream & os" parameters not Python friendly
+- bug 184 - GtkConfigStore do not support ConfigureDefault
+- bug 407 - OLSR is missing HNA support
+- bug 414 - No ReceiveErrorModel in SimpleNetDevice
+- bug 602 - WifiRemoteStation lacks information about the access class of outgoing packets
+- bug 622 - [PATCH] Friendly names for pcap traces
+- bug 683 - Helper methods for pcap tracing with explicit filenames
+- bug 706 - Backoff counting when starting NS.
+- bug 720 - TapBridge creation fails from a script outside the ns3 tree
+- bug 731 - Send function in point-to-point-net-device fails to check the return value of the Dequeue function
+- bug 747 - Listening TCP socket closes on RST
+- bug 748 - Cloned TCP socket uses wrong source address
+- bug 772 - AODV is unable to correctly buffer packets waiting for route reply
+- bug 777 - AODV ignores specified outgoing interface in RouteOutput()
+- bug 778 - OLSR ignores specified outgoing interface in RouteOutput()
+- bug 787 - Addition of Two Ray Ground model to propagation loss model and tests
+- bug 788 - OLSR_NEIGH_HOLD_TIME should be 3 times OLSR_REFRESH_INTERVAL
+- bug 789 - [PATCH] Globalrouting externalroutes to use the new GetRootExitDirections()
+- bug 794 - Ipv4Mask constructor for "/yy"-notation is wrong
+- bug 796 - TCP bug in ns-3-dev branch : Crash detected during retesting of Chord on ns-3-dev branch
+- bug 797 - Enhancements to src/core/random-variable.cc/h
+- bug 801 - ns-3.7 and SVN not coexisting nicely
+- bug 802 - Minstrel algorithm causes segmentation fault
+- bug 804 - null-pointer references in 3.7 internet stack
+- bug 806 - TCP doesn't work over a CSMA link
+- bug 807 - ns2-mobility-helper.cc: node id parsed wrong
+- bug 809 - Missing Python binding for Ipv4GlobalRouting::GetRoute
+- bug 810 - In TCP, Socket::GetSockName() does not return the local socket address
+- bug 812 - Assert when getting socket in RecvReply for AODV
+- bug 813 - Nqos AP sends packet to non associated STA
+- bug 814 - Function logging causing assert in wireless examples
+- bug 815 - waf shell file descriptor leak
+- bug 816 - tap-creator deadlock when python bindings enabled
+- bug 817 - Pareto rng constructors using scale and shape instead of mean and shape
+- bug 818 - TCP Socket implementation does not set ACK flag on retransmits
+- bug 819 - Build break when gtk not installed
+- bug 820 - Bad things happen in test.py when logging is enabled
+- bug 821 - AODV asserts with function logging enabled
+- bug 822 - Move Mtu attribute from NetDevice base class to subclasses
+- bug 825 - UDP-Client-server's packet loss counter not properly reset
+- bug 828 - PacketSocket::Close does not unregister protocol handler
+- bug 829 - TCP unbound memory problem (pending data)
+- bug 833 - OnOffApplication with PacketSocket: sniffs all traffic
+- bug 834 - Incorrect signature of Ipv4FlowProbe::DropLogger
+- bug 835 - Unlimited receive queues in sockets == evil
+- bug 836 - Delay is incremented over time with BsUplinkSchedulerSimple and BsUplinkSchedulerRtps
+- bug 838 - ns-3 can't compile on MacOS with 32bit processor
+- bug 839 - TestSuite wimax-ss-mac-layer crashes on Darwin 9.8.0 Power Macintosh
+- bug 840 - BS scheduler does not support fragmentation for UGS flows
+- bug 841 - Multicast transmission breaks with QoS Wifi
+- bug 844 - YansWifiPhy::GetPowerDbm off-by-one problem when calculating Tx power
+- bug 847 - Segfaults on BaseStationNetDevice with OnOffApplication and rtPS sched
+- bug 849 - stray patch files in lwip directory
+- bug 850 - Ipv4GlobalRouting::LookupGlobal bug
+- bug 855 - waf dies badly when switching from debug to optimized build or vice versa
+- bug 856 - initialize vbl
+- bug 857 - Link-Local Multicast handle in Ipv4 Output processing
+- bug 859 - Output interface estimation for the source address bound socket in IPv4 Raw socket
+- bug 860 - waf sometimes dies while executing ns3header or gen_ns3_module_header tasks in case of
+            parallel jobs
+- bug 862 - NotifyInterfaceUp() Adds network route even when netmask is /32
+- bug 863 - Wrong Scalar arithmetic
+- bug 864 - Invalid return value in UdpSocketImpl::Send and Ipv4RawSocketImpl::Send
+- bug 865 - Ipv4RawSocketImpl::RecvFrom does not return from address all the time.
+- bug 866 - WiMAX mobility models not aggregated to Node
+- bug 867 - Minor bug in Ipv4L3Protocol::Send()
+- bug 868 - invalid packet size after Ipv4L3Protocol::Send
+- bug 872 - ns3::PcapFileWrapper::Write explodes stack
+- bug 873 - Queue occupancy counter not decremented in WifiMacQueue::Remove()
+- bug 876 - Tcp socket does not handle ShutdownRecv correctly
+- bug 877 - python bindings broken with multiple inheritance ?
+- bug 880 - Node sending a packet to itself via 127.0.0.1 aborts
+- bug 885 - Error in Ascii tracing in Python examples
+- bug 888 - Writing ascii trace to additional tests fails
+- bug 891 - WiMAX device helper does not include propagation loss model by default
+- bug 894 - ./waf --run error message upon segfault
+- bug 895 - SimpleOfdmWimaxPhy SNR computation
+- bug 899 - EmuNetDevice::SetPromiscReceiveCallback not implemented
+
+### Known issues
+
+ns-3 builds have been known to fail on the following platforms:
+- gcc 3.3 and earlier
+- optimized builds on gcc 3.4.4 and 3.4.5
+- optimized builds on linux x86 gcc 4.0.x
+
+
+Release 3.7
+-----------
+
+### Availability
+
+This release is immediately available from:
+http://www.nsnam.org/release/ns-allinone-3.7.tar.bz2
+
+### Supported platforms
+
+ns-3.7 has been tested on the following platforms:
+- linux x86 gcc 4.4.0, 4.3.2, 4.2, 4.1.1, 4.1 and 3.4.6 (debug and optimized)
+- linux x86_64 gcc 4.4.0, 4.3.2, 4.2.4, 4.2.3, 4.2.1, 4.1.3, 3.4.6 (debug and optimized)
+- MacOS X ppc gcc 4.0.x and 4.2.x (debug and optimized)
+- cygwin gcc 3.4.4 (debug only), gcc 4.3.2 (debug and optimized)
+
+### Unofficially supported platform
+
+- mingw gcc 3.4.5 (debug only)
+
+Not all ns-3 options are available on all platforms; consult the
+wiki for more information:
+http://www.nsnam.org/wiki/Installation
+
+### New user-visible features
+
+- Ad hoc On-Demand Distance Vector (AODV) routing model (RFC 3561)
+- IPv6 extensions support to add IPv6 extensions and options.  Two
+  examples (fragmentation and loose routing) are available.
+- NetAnim interface: Provides an interface to the Qt-based NetAnim
+  animator, which supports static, point-to-point topology-based
+  packet animations.
+- New topology helpers have been introduced
+  - PointToPointDumbbellHelper
+  - PointToPointGridHelper
+  - PointToPointStarHelper
+  - CsmaStarHelper
+- Equal-cost multipath for global routing: Enables quagga's equal
+  cost multipath for Ipv4GlobalRouting, and adds an attribute that
+  can enable it with random packet distribution policy across
+  equal cost routes.
+- Binding sockets to devices:  A method analogous to a SO_BINDTODEVICE
+  socket option has been introduced to class Socket
+- Object::DoStart: Users who need to complete their object setup at
+  the start of a simulation can override this virtual method, perform their
+  adhoc setup, and then, must chain up to their parent.
+- Ipv4::IsDestinationAddress method added to support checks of whether a
+  destination address should be accepted as one of the host's own
+  addresses.
+- UniformDiscPositionAllocator added; distributes uniformly the nodes
+  within a disc of given radius.
+- ChannelNumber attribute added to YansWifiPhy. Now it is possible to
+  setup wifi channel using WifiPhyHelper::Set() method.
+- WaypointMobilityModel provides a method to add mobility as a set of
+  (time, position) pairs
+- 802.11p WiFi standards
+- UDP Client/Server application
+- Support transactions in the SQLite output interface, making it usable for larger amounts of data
+
+### API changes from ns-3.6
+
+API changes for this release are documented in the file CHANGES.html.
+
+### Bugs fixed
+
+The following lists many of the bugs that were fixed since ns-3.6, in
+many cases referencing the Bugzilla bug number
+
+- bug 752: Object::DoStart is not executed for objects created at t > 0
+- bug 767: Incorrect modulation for 802.11a modes
+- bug 725: wifi fragmentation and RTS cannot be used at the same time
+- bug 782: CreateTap () requires IP address in modes other than
+  CONFIGURE_LOCAL.
+- bug 769: Queue::GetTotalReceived{Bytes,Packets}() broken
+- bug 738 ReceiveErrorModel called too late
+- Fix NSC improper response to FIN
+- Fixed bug in serialization of PbbAddressBlock.
+- Fix bug 780 (problem in RoutingTableComputation with asymmetric links),
+  while adding debugging methods to OLSR.
+- bug 759: Ipv6 uses wrong outgoing interface.
+- bug 770: IPv6 size calculation for unknown options is wrong.
+- bug 771: Radvd does not set ttl value.
+- Fix bug 606:  Arp depends on IP routing system
+- pad out CSMA payloads to 46 bytes if needed
+- Drop CSMA packets with CRC errors, rescan, dox tweaks
+- Add FCS capability to CSMA
+- Mesh:Dot11s: fixed airtime metric
+- Get emu working again:  Add Dix/Llc option, add and use contextual
+  realtime schedule ops, don't refcount realtime simulator impl
+- bug 695 - DcfManager::UpdateBackoff () uses slow HighPrecision::Div()
+- bug 674 - EIFS is not handled correctly in DcfManager::GetAccessGrantStart
+- bug 739 -  OLSR: Strange HTime value in HELLO messages
+- bug 746 -  UDP source address is not set to bound address
+- bug 735 Update Olsr for local delivery
+- bug 740 OLSR MprCompute () works wrong: fixed
+- bug 729 Enable IPv6 over PPP.
+- bug 645: fixes for opening stats file with OMNeT++
+- bug 689: default energy detection and CCA thresholds are changed to be
+  more realistic.
+- bug 733: OLSR MPR Computation give incorrect result
+- Mesh: HWMP: fixed proactive routes
+- Mesh: fixed FLAME PATH_UPDATE procedure, fixed mesh.cc
+
+### Known issues
+
+ns-3 builds have been known to fail on the following platforms:
+- gcc 3.3 and earlier
+- optimized builds on gcc 3.4.4 and 3.4.5
+- optimized builds on linux x86 gcc 4.0.x
+
+
+Release 3.6
+-----------
+
+### Availability
+
+This release is immediately available from:
+http://www.nsnam.org/release/ns-allinone-3.6.tar.bz2
+
+### Supported platforms
+
+ns-3.6 has been tested on the following platforms:
+- linux x86 gcc 4.4.1, 4.2, 4.1, and, 3.4.6.
+- linux x86_64 gcc 4.4.0, 4.3.2, 4.2.3, 4.2.1, 4.1.3, 3.4.6
+- MacOS X ppc and x86 (gcc 4.0.x and 4.2.x)
+- cygwin gcc 3.4.4 (debug only), gcc 4.3.2 (debug and optimized)
+
+Not all ns-3 options are available on all platforms; consult the
+wiki for more information:
+http://www.nsnam.org/wiki/Installation
+
+### New user-visible features
+
+- 802.11 models:
+  - Add an implementation of the minstrel rate control algorithm
+    (Duy Nguyen for gsoc)
+  - AthstatsHelper: enables the wifi device to produce periodic
+    reports similar to the ones generated by madwifi's
+    athstats tool (Nicola Baldo)
+  - 10MHz and 5MHz channel width supported by 802.11a model
+    (Ramon Bauza and Kirill Andreev)
+  - Channel switching support. YansWifiPhy can now switch among
+    different channels (Ramon Bauza and Pavel Boyko)
+
+- IPv6 models:
+  - IPv6 interface;
+  - IPv6 layer;
+  - IPv6 raw socket;
+  - Static IPv6 routing;
+  - ICMPv6 layer;
+  - Some ICMPv6 error messages (destination unreachable, ...);
+  - Neighbor Discovery Protocol (NS/NA, RS/RA, redirection);
+  - Ping6 application (send Echo request);
+  - Radvd application (send RA);
+  - Examples (ping6, simple-routing-ping6, radvd, radvd-two-prefix,
+    icmpv6-redirect).
+
+- Wireless Mesh Networking models:
+  - General multi-interface mesh stack infrastructure (devices/mesh module).
+  - IEEE 802.11s (Draft 3.0) model including Peering Management Protocol and HWMP.
+  - Forwarding Layer for Meshing (FLAME) protocol.
+
+- Nix-vector routing:
+  - Ipv4NixVectorHelper
+  - Examples (nix-simple, nms-p2p-nix)
+
+- New Test Framework
+  - Use test.py instead of ./waf check or ./waf --regression
+  - Previous unit tests have been ported to new framework.
+  - Examples are tested for run-ability.
+
+- A new Flow Monitor module
+  - To very easily measure flow metrics in a simulation
+  - No need to use trace callbacks or parsing trace files
+
+### API changes from ns-3.5
+
+API changes for this release are documented in the file CHANGES.html.
+
+### Known issues
+
+ns-3.6 build is known to fail on the following platforms:
+- gcc 3.3 and earlier
+- optimized builds on gcc 3.4.4 and 3.4.5
+- optimized builds on linux x86 gcc 4.0.x
+
+Release 3.5
+-----------
+
+### Availability
+
+This release is immediately available from:
+http://www.nsnam.org/release/ns-allinone-3.5.tar.bz2
+
+### Supported platforms
+
+ns-3.5 has been tested on the following platforms:
+- linux x86 gcc 4.2, 4.1, and, 3.4.6.
+- linux x86_64 gcc 4.4.0, 4.3.2, 4.2.3, 4.2.1, 4.1.3, 3.4.6
+- MacOS X ppc and x86 (gcc 4.0.x and 4.2.x)
+- cygwin gcc 3.4.4 (debug only), gcc 4.3.2 (debug and optimized)
+- mingw gcc 3.4.5 (debug only)
+
+Not all ns-3 options are available on all platforms; consult the
+wiki for more information:
+http://www.nsnam.org/wiki/Installation
+
+### New user-visible features
+
+- 802.11 MAC:
+  - EDCA multi-qos-class support (Mirko Banchi)
+  - 802.11n initial support for A-MSDU frame aggregation (Mirko Banchi)
+  - aarf-cd and cara rate control algorithms (Federico Maguolo)
+- 802.11 PHY:
+  - 802.11b PHY support (Gary Pei)
+  - Nakagami propagation loss model (Timo Bingmann)
+  - radiotap and prism headers for PCAP output (Nicola Baldo)
+- RandomVariable:
+  - GammaVariable and ErlangVariable (Timo Bingmann)
+  - ZipfVariable (Francesco Malandrino)
+- UdpEcho: allows setting the payload of echo packets
+- Ipv4/Ipv4RoutingProtocol: allow fine-grained control over
+  routing policy and arbitrary composition of routing protocols
+
+### API changes from ns-3.4
+
+API changes for this release are documented in the file CHANGES.html.  The
+internal API and composition of the IPv4 stack underwent significant
+refactoring in this release cycle.
+
+### Known issues
+
+ns-3 build is known to fail on the following platforms:
+- gcc 3.3 and earlier
+- optimized builds on gcc 3.4.4 and 3.4.5
+- optimized builds on linux x86 gcc 4.0.x
+
+### Future releases
+
+Our next release, which is expected to happen in 2 to 4 months from now, will
+feature the merging of some of our projects currently in development including
+fuller IPv6 support, some smaller features such as a new Global ARP
+package, and possibly a new Testing and Validation suite.
+
+Release 3.4
+-----------
+
+### Availability
+
+This release is immediately available from:
+http://www.nsnam.org/release/ns-allinone-3.4.tar.bz2
+
+### Supported platforms
+
+ns-3.4 has been tested on the following platforms:
+- linux x86 gcc 4.2, 4.1, and, 3.4.6.
+- linux x86_64 gcc 4.3.2, 4.2.3, 4.2.1, 4.1.3, 3.4.6
+- MacOS X ppc and x86
+- cygwin gcc 3.4.4 (debug only)
+
+Not all ns-3 options are available on all platforms; consult the
+wiki for more information:
+http://www.nsnam.org/wiki/Installation
+
+### New user-visible features
+
+- Wifi models: Timo Bingman contributed a ThreeLogDistance and a Nakagami
+  propagation loss model based on the ns-2 models. Fabian Mauchle contributed
+  multicast support.
+- Object Name Service:  A facility allowing ns-3 Objects to be assigned
+  names has been added.
+- Tap Bridge:  A second option for integrating ns-3 with real-world hosts
+  has been added.  This allows for real hosts to talk over ns-3 net devices
+  and simulated networks.
+- A new build option (ns-3-allinone) has been provided to make it easier for
+  users to download and build commonly used ns-3 configurations.
+- The ns-3 calendar queue scheduler has been ported to ns-3.
+- XML support has been added to the ConfigStore.
+
+### API changes from ns-3.3
+
+API changes for this release are documented in the file CHANGES.html
+
+### Known issues
+
+ns-3 build is known to fail on the following platforms:
+- gcc 3.3 and earlier
+- optimized builds on gcc 3.4.4 and 3.4.5
+- optimized builds on linux x86 gcc 4.0.x
+- optimized builds on Ubuntu 8.10 alpha 5 x86 gcc4.3.2
+- MinGW
+
+The IPv4 API defined in src/node/ipv4.h is expected to undergo major changes
+in preparation of the merge of the IPv6 API and implementation.
+
+### Future releases
+
+Our next release, which is expected to happen in 2 to 4 months from now, will
+feature the merging of some of our projects currently in development including
+fuller IPv6 support, and IPv4 and routing protocol refactoring, and some smaller
+features such as a new Global ARP package and possibly a new Testing and Validation
+suite,
+
+Release 3.3
+-----------
+
+### Availability
+
+This release is immediately available from:
+http://www.nsnam.org/release/ns-3.3.tar.bz2
+
+### Supported platforms
+
+ns-3.3 has been tested on the following platforms:
+- linux x86 gcc 4.2, 4.1, and, 3.4.6.
+- linux x86_64 gcc 4.3.2, 4.2.3, 4.2.1, 4.1.3, 3.4.6
+- MacOS X ppc and x86
+- cygwin gcc 3.4.4 (debug only)
+
+Not all ns-3 options are available on all platforms; consult the
+wiki for more information:
+http://www.nsnam.org/wiki/Installation
+
+### New user-visible features
+
+- Emulated Net Device
+  A new net device has been added as enabling technology for ns-3 emulation
+  scenarios.  See src/devices/emu and examples/emu-udp-echo.cc for details.
+- ICMP Support
+  Support for several ICMP messages has been added to ns-3.  See
+  src/internet-stack/icmpv4.h for details.
+- IPv6 Address Support
+  New clases to support IPv6 addresses has been added to the system.  This
+  is enabling technology for fuller IPv6 support scheduled for ns-3.4.
+- A flow-id tag has been added to the contributed code section
+- Star topologies can be created from the topology helper functions
+- The global routing code has been made dynamic (not just limited to
+  (pre-simulation computation) and supports stub network interfaces and
+  bridge net devices
+- A MatchContainer has been added to the configuration subsystem
+
+### API changes from ns-3.2
+
+API changes for this release are documented in the file CHANGES.html
+
+### Known issues
+
+ns-3 build is known to fail on the following platforms:
+- gcc 3.3 and earlier
+- optimized builds on gcc 3.4.4 and 3.4.5
+- optimized builds on linux x86 gcc 4.0.x
+- optimized builds on Ubuntu 8.10 alpha 5 x86 gcc4.3.2
+- MinGW
+
+The IPv4 API defined in src/node/ipv4.h is expected to undergo major changes
+in preparation of the merge of the IPv6 API and implementation.
+
+### Future releases
+
+Our next release, which is expected to happen in 2 to 4 months from now, will
+feature the merging of some of our projects currently in development including
+fuller IPv6 support, and IPv4 and routing protocol refactoring, and some smaller
+features such as an object naming facility and a new Global ARP package.
+
+Release 3.2
+-----------
+
+### Availability
+
+This release is immediately available from:
+http://www.nsnam.org/release/ns-3.2.tar.bz2
+
+### Supported platforms
+
+ns-3.2 has been tested on the following platforms:
+- linux x86 gcc 4.2, 4.1, and, 3.4.6.
+- linux x86_64 gcc 4.3.2, 4.2.3, 4.2.1, 4.1.3, 3.4.6
+- MacOS X ppc and x86
+- cygwin gcc 3.4.4 (debug only)
+
+Not all ns-3 options are available on all platforms; consult the
+wiki for more information:
+http://www.nsnam.org/wiki/Installation
+
+### New user-visible features
+
+- Learning bridge (IEEE 802.1D)
+  It is now possible to bridge together multiple layer 2 devices to
+  create larger layer 2 networks. The Wifi and Csma models support
+  this new mode of operation. (contributed by Gustavo Carneiro)
+
+- Python bindings
+  It is now possible to write simulation scripts in python using our
+  python bindings (contributed by Gustavo Carneiro).
+
+- Real-time simulator
+  It is now possible to run simulations synchronized on the real-world
+  wall-clock time (contributed by Craig Dowell).
+
+- Network Simulation Cradle
+  It is now possible to use the Network Simulation Cradle
+  (http://www.wand.net.nz/~stj2/nsc/) in ns-3 and run simulations
+  using various versions of kernel TCP network stacks. (contributed
+  by Florian Westphal as part of his Google Summer of Code work)
+
+- A statistics framework
+  Joseph Kopena contributed a statistics framework which can be used
+  keep track of simulation data in persistent storage across multiple
+  runs (database and ascii file backends are available).
+  More information on the wiki:
+  http://www.nsnam.org/wiki/Statistical_Framework_for_Network_Simulation
+
+### API changes from ns-3.1
+
+API changes for this release are documented in the file CHANGES.html
+
+### Known issues
+
+ns-3 build is known to fail on the following platforms:
+- gcc 3.3 and earlier
+- optimized builds on gcc 3.4.4 and 3.4.5
+- optimized builds on linux x86 gcc 4.0.x
+- optimized builds on Ubuntu 8.10 alpha 5 x86 gcc4.3.2
+- MinGW
+
+The IPv4 API defined in src/node/ipv4.h is expected to undergo major changes
+in preparation of the merge of the IPv6 API and implementation.
+
+### Future releases
+
+Our next release, which is expected to happen in 2 to 4 months from now, will
+feature the merging of some of our projects currently in development: IPv6,
+emulation, and synchronous posix sockets.
+
+Release 3.1 (2008/06/30)
+------------------------
+
+### The first ns-3 stable release
+
+This release is immediately available from:
+http://www.nsnam.org/release/ns-3.1.tar.bz2
+
+We dedicate this initial ns-3 release to our late contributor and friend,
+Federico Maguolo.
+
+### What is ns-3 ?
+
+ns-3 is a new discrete-event network simulator designed for supporting network
+research and education. ns-3 features a solid, well documented C++ core and
+models for TCP/IP (IPv4), several link types including WiFi, and mobility
+models.
+
+ns-3 is an open source project released under the GNU GPLv2 license which
+allows anyone to use ns-3 without having to pay any license fee or royalties.
+ns-3 is actively seeking new contributors to extend the range of supported
+models and/or to maintain existing models.
+
+### Where to get more information about ns-3
+
+All the ns-3 documentation, is accessible from the ns-3 website:
+http://www.nsnam.org
+
+Including, tutorials:
+http://www.nsnam.org/tutorials.html
+
+### Supported platforms
+
+ns-3 is regularly tested on the following platforms:
+- linux x86 gcc 4.2, 4.1, and, 3.4.6.
+- linux x86_64 gcc 4.1.3, 4.2.1, 3.4.6
+- MacOS X ppc and x86
+- cygwin gcc 3.4.4 (debug only)
+
+### Known issues
+
+ns-3 is known to fail on the following platforms:
+- gcc 3.3 and earlier
+- optimized builds on gcc 3.4.4 and 3.4.5
+- optimized builds on linux x86 gcc 4.0.x
+
+The IPv4 API defined in src/node/ipv4.h is expected to undergo major changes
+in preparation of the merge of the IPv6 API and implementation.
+
+### Future releases
+
+Our next release, which is expected to happen in 2 to 4 months from now, will
+feature the merging of some of our projects currently in development: python
+scripting, IPv6, emulation, a statistics framework and synchronous posix
+sockets.
+
+Release 3.0.13 (2008/06/02)
+---------------------------
+
+- point to point links generate ppp pcap traces
+- point to point links support asymmetrical data rates.
+- generate doxygen documentation for all attributes and trace sources
+- add ConfigStore and GtkConfigStore to contrib module
+- socket API now support tx and rx buffers: implemented for UDP and TCP
+- ARP cache now supports per-entry pending queues
+- lots of bugfixes and implementation and API cleanups
+
+Warning: among API changes in this release, Application::Start and
+Application::Stop now interprets the time argument as a relative
+instead of absolute simulation time, to align with how Simulator::Schedule
+behaves.  Any code that calls these APIs in the middle of the simulation
+will need to be adapted.
+
+The API of Simulator::StopAt (time) has also changed.  Now it is
+called Simulator::Stop (time), and takes a relative time, instead of
+absolute.
+
+Release 3.0.12 (2008/04/07)
+---------------------------
+
+- Add Attribute support to the TypeId metadata system and add
+  attribute support to all in-tree models
+- Add a mid-level helper API to build simulation topologies
+  and perform simple ascii and pcap link-level tracing.
+- Large amount of structural changes to accommodate the needs
+  of the upcoming python bindings
+- new rate control algorithm (RRAA) and a jakes propagation model
+  in the 802.11 model (Federico Maguolo).
+- regression test framework added
+- TCP delayed acknowledgements and multitasking server
+
+Release 3.0.11 (2008/02/15)
+---------------------------
+
+- Initial port of GTNetS TCP implementation (initial version
+  that does not support multitasking or delayed acknowledgments yet,
+  but supports a reliable stream service)
+- Changes to the ns-3 object model to create a TypeId-based
+  metadata system
+- lots of bug fixes throughout the system
+- tutorial updates
+
+Release 3.0.10 (2008/01/15)
+---------------------------
+
+- Add tutorial document content;
+- Valgrind option for "waf" tool;
+- Doxygen organization changes.
+
+Release 3.0.9 (2007/12/15)
+--------------------------
+
+- A 802.11 model ported from Yans. This model supports:
+  - a rather extensive PHY model
+  - log-distance and friis propagation model
+  - a simple set of rate control algorithm
+    (ARF, Ideal, AARF, constant-rate)
+  - adhoc and infrastructure mode (beacon+assoc)
+- Use smart pointer for Packet in the APIs
+- A new contrib directory with helper classes:
+  EventGarbageCollector, Gnuplot
+- Tracing support for Applications
+- many bugs fixed
+
+Release 3.0.8 (2007/11/15)
+--------------------------
+
+- A simple error model
+- Source files for ns-3 tutorial
+
+Release 3.0.7 (2007/10/15)
+--------------------------
+
+- OLSR routing protocol
+- A timer class
+- Additional mobility models (random waypoint, random 2D walk)
+- A mobility visualization tool
+
+Release 3.0.6 (2007/09/15)
+--------------------------
+
+- Static multicast IPv4 routing
+- Logging overhaul (NS_LOG macros)
+- Refactoring of tracing subsystem
+- Tutorial document started
+
+Release 3.0.5 (2007/08/15)
+--------------------------
+
+- Refactoring to support win32-based unix environments (Cygwin, mingw)
+- "Packet socket" for allowing applications to access NetDevices directly
+- Generalized, polymorphic Address class
+- Add CSMA NetDevice model (from Emmanuelle Laprise)
+- Modularize IPv4 routing support (from Gustavo Carneiro)
+- Add mobility framework and basic mobility models
+- Global unicast centralized routing
+
+Release 3.0.4 (2007/07/15)
+--------------------------
+
+- Enable waf as the default build system.
+- Per-packet metadata:  a system to track which headers and trailers
+  are added to a packet
+- Simplifications to point-to-point devices and channel
+
+Release 3.0.3 (2007/06/15)
+--------------------------
+
+- Enable Waf for release tarballs: users can now build ns-3
+  with the "waf" tool. See doc/build-waf.txt.
+- Add support for variable time precision: it is now possible
+  to run a simulation with an accuracy which is higher or lower
+  than a nanosecond: seconds, milliseconds, microseconds,
+  femtoseconds and picoseconds are supported.
+- Optimize and rework the COM framework, solidify the component
+  manager
+- Many small API cleanups
+
+Release 3.0.2 (2007/05/18)
+--------------------------
+
+- Implement a new memory management infrastructure based
+  on reference counting and smart pointers (the latter being
+  optional)
+- Implement a COM-like framework with support for QueryInterface
+  to provide object extensibility
+- Add support for a BSD-style socket API for user applications
+
+Release 3.0.1 (2007/03/31)
+--------------------------
+
+- First public release; not yet pre-alpha.
+- Simple UDP-based simulation script (examples/simple-p2p.cc)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/scratch/CMakeLists.txt ns-3.36/scratch/CMakeLists.txt
--- ns-3.35/scratch/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/scratch/CMakeLists.txt	2022-04-30 18:23:57.726733000 -0700
@@ -0,0 +1,99 @@
+set(target_prefix scratch_)
+
+function(create_scratch source_files)
+  # Return early if no sources in the subdirectory
+  list(LENGTH source_files number_sources)
+  if(number_sources EQUAL 0)
+    return()
+  endif()
+
+  # If the scratch has more than a source file, we need to find the source with
+  # the main function
+  set(scratch_src)
+  foreach(source_file ${source_files})
+    file(READ ${source_file} source_file_contents)
+    string(REGEX MATCHALL "main[(| (]" main_position "${source_file_contents}")
+    if(CMAKE_MATCH_0)
+      set(scratch_src ${source_file})
+    endif()
+  endforeach()
+
+  if(NOT scratch_src)
+    return()
+  endif()
+
+  # Get parent directory name
+  get_filename_component(scratch_dirname ${scratch_src} DIRECTORY)
+  string(REPLACE "${CMAKE_CURRENT_SOURCE_DIR}" "" scratch_dirname
+                 "${scratch_dirname}"
+  )
+  string(REPLACE "/" "_" scratch_dirname "${scratch_dirname}")
+
+  # Get source name
+  get_filename_component(scratch_name ${scratch_src} NAME_WE)
+
+  set(target_prefix scratch_)
+  if(scratch_dirname)
+    # Join the names together if dirname is not the scratch folder
+    set(target_prefix scratch${scratch_dirname}_)
+  endif()
+
+  # Get source absolute path and transform into relative path
+  get_filename_component(scratch_src ${scratch_src} ABSOLUTE)
+  get_filename_component(scratch_absolute_directory ${scratch_src} DIRECTORY)
+  string(REPLACE "${PROJECT_SOURCE_DIR}" "${CMAKE_OUTPUT_DIRECTORY}"
+                 scratch_directory ${scratch_absolute_directory}
+  )
+  add_executable(${target_prefix}${scratch_name} "${source_files}")
+  if(${NS3_STATIC})
+    target_link_libraries(
+      ${target_prefix}${scratch_name} ${LIB_AS_NEEDED_PRE_STATIC}
+      ${lib-ns3-static}
+    )
+  else()
+    target_link_libraries(
+      ${target_prefix}${scratch_name} "${ns3-libs}" "${ns3-contrib-libs}"
+      "${ns3-external-libs}"
+    )
+  endif()
+  set_runtime_outputdirectory(
+    ${scratch_name} ${scratch_directory}/ ${target_prefix}
+  )
+endfunction()
+
+# Scan *.cc files in ns-3-dev/scratch and build a target for each
+file(GLOB single_source_file_scratches CONFIGURE_DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/*.cc)
+foreach(scratch_src ${single_source_file_scratches})
+  create_scratch(${scratch_src})
+endforeach()
+
+# Scan *.cc files in ns-3-dev/scratch subdirectories and build a target for each
+# subdirectory
+file(
+  GLOB_RECURSE scratch_subdirectories
+  CONFIGURE_DEPENDS
+  LIST_DIRECTORIES true
+  ${CMAKE_CURRENT_SOURCE_DIR}/**
+)
+# Filter out files
+foreach(entry ${scratch_subdirectories})
+  if(NOT (IS_DIRECTORY ${entry}))
+    list(REMOVE_ITEM scratch_subdirectories ${entry})
+  endif()
+endforeach()
+
+foreach(subdir ${scratch_subdirectories})
+  if(EXISTS ${subdir}/CMakeLists.txt)
+    # If the subdirectory contains a CMakeLists.txt file
+    # we let the CMake file manage the source files
+    #
+    # Use this if you want to link to external libraries
+    # without creating a module
+    add_subdirectory(${subdir})
+  else()
+    # Otherwise we pick all the files in the subdirectory
+    # and create a scratch for them automatically
+    file(GLOB scratch_sources CONFIGURE_DEPENDS ${subdir}/*.cc)
+    create_scratch("${scratch_sources}")
+  endif()
+endforeach()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/antenna/bindings/modulegen__gcc_ILP32.py ns-3.36/src/antenna/bindings/modulegen__gcc_ILP32.py
--- ns-3.35/src/antenna/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/antenna/bindings/modulegen__gcc_ILP32.py	2022-04-30 18:23:57.738733000 -0700
@@ -88,17 +88,17 @@
     typehandlers.add_type_alias('std::vector< std::complex< double > >', 'ns3::PhasedArrayModel::ComplexVector')
     typehandlers.add_type_alias('std::vector< std::complex< double > >*', 'ns3::PhasedArrayModel::ComplexVector*')
     typehandlers.add_type_alias('std::vector< std::complex< double > >&', 'ns3::PhasedArrayModel::ComplexVector&')
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
     module.add_class('TraceSourceAccessor', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >'])
@@ -147,7 +147,7 @@
     ## callback.h (module 'core'): ns3::CallbackImpl<ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['ns3::ObjectBase *', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     module.add_container('std::vector< double >', 'double', container_type='vector')
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     module.add_container('std::vector< std::complex< double > >', 'std::complex< double >', container_type='vector')
     module.add_container('ns3::PhasedArrayModel::ComplexVector', 'std::complex< double >', container_type='vector')
     typehandlers.add_type_alias('ns3::Vector3D', 'ns3::Vector')
@@ -605,8 +605,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -996,6 +996,11 @@
                    'ns3::Vector', 
                    [param('uint64_t', 'index')], 
                    is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## phased-array-model.h (module 'antenna'): uint32_t ns3::PhasedArrayModel::GetId() const [member function]
+    cls.add_method('GetId', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
     ## phased-array-model.h (module 'antenna'): uint64_t ns3::PhasedArrayModel::GetNumberOfElements() const [member function]
     cls.add_method('GetNumberOfElements', 
                    'uint64_t', 
@@ -1027,44 +1032,44 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
@@ -1753,7 +1758,7 @@
 
 def register_functions(root_module):
     module = root_module
-    ## angles.h (module 'antenna'): std::vector<double, std::allocator<double> > ns3::DegreesToRadians(std::vector<double, std::allocator<double> > const & degrees) [free function]
+    ## angles.h (module 'antenna'): std::vector<double, std::allocator<double>> ns3::DegreesToRadians(std::vector<double, std::allocator<double>> const & degrees) [free function]
     module.add_function('DegreesToRadians', 
                         'std::vector< double >', 
                         [param('std::vector< double > const &', 'degrees')])
@@ -1761,7 +1766,7 @@
     module.add_function('DegreesToRadians', 
                         'double', 
                         [param('double', 'degrees')])
-    ## angles.h (module 'antenna'): std::vector<double, std::allocator<double> > ns3::RadiansToDegrees(std::vector<double, std::allocator<double> > const & radians) [free function]
+    ## angles.h (module 'antenna'): std::vector<double, std::allocator<double>> ns3::RadiansToDegrees(std::vector<double, std::allocator<double>> const & radians) [free function]
     module.add_function('RadiansToDegrees', 
                         'std::vector< double >', 
                         [param('std::vector< double > const &', 'radians')])
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/antenna/bindings/modulegen__gcc_LP64.py ns-3.36/src/antenna/bindings/modulegen__gcc_LP64.py
--- ns-3.35/src/antenna/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/antenna/bindings/modulegen__gcc_LP64.py	2022-04-30 18:23:57.738733000 -0700
@@ -88,17 +88,17 @@
     typehandlers.add_type_alias('std::vector< std::complex< double > >', 'ns3::PhasedArrayModel::ComplexVector')
     typehandlers.add_type_alias('std::vector< std::complex< double > >*', 'ns3::PhasedArrayModel::ComplexVector*')
     typehandlers.add_type_alias('std::vector< std::complex< double > >&', 'ns3::PhasedArrayModel::ComplexVector&')
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
     module.add_class('TraceSourceAccessor', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >'])
@@ -147,7 +147,7 @@
     ## callback.h (module 'core'): ns3::CallbackImpl<ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['ns3::ObjectBase *', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     module.add_container('std::vector< double >', 'double', container_type='vector')
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     module.add_container('std::vector< std::complex< double > >', 'std::complex< double >', container_type='vector')
     module.add_container('ns3::PhasedArrayModel::ComplexVector', 'std::complex< double >', container_type='vector')
     typehandlers.add_type_alias('ns3::Vector3D', 'ns3::Vector')
@@ -605,8 +605,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -996,6 +996,11 @@
                    'ns3::Vector', 
                    [param('uint64_t', 'index')], 
                    is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## phased-array-model.h (module 'antenna'): uint32_t ns3::PhasedArrayModel::GetId() const [member function]
+    cls.add_method('GetId', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
     ## phased-array-model.h (module 'antenna'): uint64_t ns3::PhasedArrayModel::GetNumberOfElements() const [member function]
     cls.add_method('GetNumberOfElements', 
                    'uint64_t', 
@@ -1027,44 +1032,44 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
@@ -1753,7 +1758,7 @@
 
 def register_functions(root_module):
     module = root_module
-    ## angles.h (module 'antenna'): std::vector<double, std::allocator<double> > ns3::DegreesToRadians(std::vector<double, std::allocator<double> > const & degrees) [free function]
+    ## angles.h (module 'antenna'): std::vector<double, std::allocator<double>> ns3::DegreesToRadians(std::vector<double, std::allocator<double>> const & degrees) [free function]
     module.add_function('DegreesToRadians', 
                         'std::vector< double >', 
                         [param('std::vector< double > const &', 'degrees')])
@@ -1761,7 +1766,7 @@
     module.add_function('DegreesToRadians', 
                         'double', 
                         [param('double', 'degrees')])
-    ## angles.h (module 'antenna'): std::vector<double, std::allocator<double> > ns3::RadiansToDegrees(std::vector<double, std::allocator<double> > const & radians) [free function]
+    ## angles.h (module 'antenna'): std::vector<double, std::allocator<double>> ns3::RadiansToDegrees(std::vector<double, std::allocator<double>> const & radians) [free function]
     module.add_function('RadiansToDegrees', 
                         'std::vector< double >', 
                         [param('std::vector< double > const &', 'radians')])
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/antenna/CMakeLists.txt ns-3.36/src/antenna/CMakeLists.txt
--- ns-3.35/src/antenna/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/antenna/CMakeLists.txt	2022-04-30 18:23:57.726733000 -0700
@@ -0,0 +1,29 @@
+build_lib(
+  LIBNAME antenna
+  SOURCE_FILES
+    model/angles.cc
+    model/antenna-model.cc
+    model/cosine-antenna-model.cc
+    model/isotropic-antenna-model.cc
+    model/parabolic-antenna-model.cc
+    model/phased-array-model.cc
+    model/three-gpp-antenna-model.cc
+    model/uniform-planar-array.cc
+  HEADER_FILES
+    model/angles.h
+    model/antenna-model.h
+    model/cosine-antenna-model.h
+    model/isotropic-antenna-model.h
+    model/parabolic-antenna-model.h
+    model/phased-array-model.h
+    model/three-gpp-antenna-model.h
+    model/uniform-planar-array.h
+  LIBRARIES_TO_LINK ${libcore}
+  TEST_SOURCES
+    test/test-angles.cc
+    test/test-degrees-radians.cc
+    test/test-isotropic-antenna.cc
+    test/test-cosine-antenna.cc
+    test/test-parabolic-antenna.cc
+    test/test-uniform-planar-array.cc
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/antenna/doc/source/conf.py ns-3.36/src/antenna/doc/source/conf.py
--- ns-3.35/src/antenna/doc/source/conf.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/antenna/doc/source/conf.py	2022-04-30 18:23:57.738733000 -0700
@@ -25,7 +25,7 @@
 
 # Add any Sphinx extension module names here, as strings. They can be extensions
 # coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
-extensions = ['sphinx.ext.pngmath']
+extensions = ['sphinx.ext.imgmath']
 
 # Add any paths that contain templates here, relative to this directory.
 templates_path = ['_templates']
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/antenna/model/angles.cc ns-3.36/src/antenna/model/angles.cc
--- ns-3.35/src/antenna/model/angles.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/antenna/model/angles.cc	2022-04-30 18:23:57.738733000 -0700
@@ -30,7 +30,9 @@
 
 bool Angles::m_printDeg = false;
 
+/// Degrees to Radians conversion constant
 const double DEG_TO_RAD = M_PI / 180.0;
+/// Radians to Degrees conversion constant
 const double RAD_TO_DEG = 180.0 / M_PI;
 
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/antenna/model/angles.h ns-3.36/src/antenna/model/angles.h
--- ns-3.35/src/antenna/model/angles.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/antenna/model/angles.h	2022-04-30 18:23:57.738733000 -0700
@@ -178,7 +178,21 @@
   double GetInclination (void) const;
 
   // friend methods
+  /**
+   * \brief Stream insertion operator.
+   *
+   * \param [in] os The reference to the output stream.
+   * \param [in] a The angle.
+   * \returns The reference to the output stream.
+   */
   friend std::ostream& operator<< (std::ostream& os, const Angles& a);
+  /**
+   * \brief Stream extraction operator.
+   *
+   * \param [in] is The reference to the input stream.
+   * \param [out] a The angle.
+   * \returns The reference to the input stream.
+   */
   friend std::istream& operator>> (std::istream& is, Angles& a);
 
   static bool m_printDeg; //!< flag for printing in radians or degrees units
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/antenna/model/antenna-model.h ns-3.36/src/antenna/model/antenna-model.h
--- ns-3.35/src/antenna/model/antenna-model.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/antenna/model/antenna-model.h	2022-04-30 18:23:57.738733000 -0700
@@ -27,6 +27,19 @@
 
 namespace ns3 {
 
+
+/**
+ * \defgroup antenna Antenna module
+ * \brief This module contains several antenna
+ * radiation pattern models.
+ */
+
+/**
+ * \ingroup antenna
+ * \ingroup tests
+ * \defgroup antenna-tests Antenna module tests
+ */
+
 /** 
  * \ingroup antenna
  * 
@@ -38,8 +51,6 @@
  * angles. This choice is the one proposed "Antenna Theory - Analysis
  * and Design", C.A. Balanis, Wiley, 2nd Ed., see in particular
  * section 2.2 "Radiation pattern".
- * 
- *
  */
 class AntennaModel : public Object
 {
@@ -49,7 +60,10 @@
   AntennaModel ();
   virtual ~AntennaModel ();
 
-  // inherited from Object
+  /**
+   * \brief Get the type ID.
+   * \return The object TypeId.
+   */
   static TypeId GetTypeId ();
 
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/antenna/model/cosine-antenna-model.h ns-3.36/src/antenna/model/cosine-antenna-model.h
--- ns-3.35/src/antenna/model/cosine-antenna-model.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/antenna/model/cosine-antenna-model.h	2022-04-30 18:23:57.742733000 -0700
@@ -28,6 +28,7 @@
 namespace ns3 {
 
 /**
+ * \ingroup antenna
  *
  * \brief Cosine Antenna Model
  *
@@ -49,7 +50,10 @@
 class CosineAntennaModel : public AntennaModel
 {
 public:
-  // inherited from Object
+  /**
+   * \brief Get the type ID.
+   * \return The object TypeId.
+   */
   static TypeId GetTypeId ();
 
   // inherited from AntennaModel
@@ -95,7 +99,7 @@
 
   /**
    * Compute the exponent of the cosine antenna model from the beamwidth
-   * \param beamwidthRadians the beamwidth in degrees
+   * \param beamwidthDegrees the beamwidth in degrees
    * \return the exponent
    */
   static double GetExponentFromBeamwidth (double beamwidthDegrees);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/antenna/model/isotropic-antenna-model.h ns-3.36/src/antenna/model/isotropic-antenna-model.h
--- ns-3.35/src/antenna/model/isotropic-antenna-model.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/antenna/model/isotropic-antenna-model.h	2022-04-30 18:23:57.742733000 -0700
@@ -28,6 +28,8 @@
 namespace ns3 {
 
 /**
+ * \ingroup antenna
+ * 
  * \brief Isotropic antenna model
  * 
  * This is the simplest antenna model. The gain of this antenna is the same in all directions.
@@ -37,7 +39,11 @@
 public:
 
   IsotropicAntennaModel ();
-  // inherited from Object
+  
+  /**
+   * \brief Get the type ID.
+   * \return The object TypeId.
+   */
   static TypeId GetTypeId ();
 
   // inherited from AntennaModel
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/antenna/model/parabolic-antenna-model.h ns-3.36/src/antenna/model/parabolic-antenna-model.h
--- ns-3.35/src/antenna/model/parabolic-antenna-model.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/antenna/model/parabolic-antenna-model.h	2022-04-30 18:23:57.742733000 -0700
@@ -28,12 +28,13 @@
 namespace ns3 {
 
 /**
+ * \ingroup antenna
  * 
  * \brief  Antenna model based on a parabolic approximation of the main lobe radiation pattern.
  *
  * This class implements the parabolic model as described in some 3GPP document, e.g., R4-092042
  *
- * A similar model appears in 
+ * A similar model appears in:
  *
  * George Calcev and Matt Dillon, "Antenna Tilt Control in CDMA Networks"
  * in Proc. of the 2nd Annual International Wireless Internet Conference (WICON), 2006
@@ -46,7 +47,10 @@
 {
 public:
 
-  // inherited from Object
+  /**
+   * \brief Get the type ID.
+   * \return The object TypeId.
+   */
   static TypeId GetTypeId ();
 
   // inherited from AntennaModel
@@ -54,18 +58,32 @@
 
 
   // attribute getters/setters
+  /**
+   * Set the Beam width
+   * \param beamwidthDegrees Beam width in degrees
+   */
   void SetBeamwidth (double beamwidthDegrees);
+  /**
+   * Get the Beam width
+   * \return beam width in degrees
+   */
   double GetBeamwidth () const;
+  /**
+   * Set the antenna orientation
+   * \param orientationDegrees antenna orientation in degrees
+   */
   void SetOrientation (double orientationDegrees);
+  /**
+   * Get the antenna orientation
+   * \return antenna orientation in degrees
+   */
   double GetOrientation () const;
 
 private:
 
-  double m_beamwidthRadians;
-
-  double m_orientationRadians;
-
-  double m_maxAttenuation;
+  double m_beamwidthRadians; //!< Beam width in radians
+  double m_orientationRadians; //!< Antenna orientation in radians
+  double m_maxAttenuation; //!< Max attenuation
 };
 
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/antenna/model/phased-array-model.cc ns-3.36/src/antenna/model/phased-array-model.cc
--- ns-3.35/src/antenna/model/phased-array-model.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/antenna/model/phased-array-model.cc	2022-04-30 18:23:57.742733000 -0700
@@ -26,6 +26,8 @@
 
 namespace ns3 {
 
+uint32_t PhasedArrayModel::m_idCounter = 0 ;
+
 NS_LOG_COMPONENT_DEFINE ("PhasedArrayModel");
 
 NS_OBJECT_ENSURE_REGISTERED (PhasedArrayModel);
@@ -54,7 +56,9 @@
 
 PhasedArrayModel::PhasedArrayModel ()
   : m_isBfVectorValid {false}
-{}
+{
+  m_id = m_idCounter++;
+}
 
 
 PhasedArrayModel::~PhasedArrayModel ()
@@ -164,6 +168,11 @@
   return m_antennaElement;
 }
 
+uint32_t
+PhasedArrayModel::GetId () const
+{
+  return m_id;
+}
 
 } /* namespace ns3 */
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/antenna/model/phased-array-model.h ns-3.36/src/antenna/model/phased-array-model.h
--- ns-3.35/src/antenna/model/phased-array-model.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/antenna/model/phased-array-model.h	2022-04-30 18:23:57.742733000 -0700
@@ -47,7 +47,10 @@
   virtual ~PhasedArrayModel (void);
 
 
-  // inherited from Object
+  /**
+   * \brief Get the type ID.
+   * \return The object TypeId.
+   */
   static TypeId GetTypeId (void);
 
 
@@ -67,7 +70,7 @@
   /**
    * Returns the location of the antenna element with the specified
    * index, normalized with respect to the wavelength.
-   * \param idx index of the antenna element
+   * \param index the index of the antenna element
    * \return the 3D vector that represents the position of the element
    */
   virtual Vector GetElementLocation (uint64_t index) const = 0;
@@ -123,6 +126,12 @@
    */
   Ptr<const AntennaModel> GetAntennaElement (void) const;
 
+  /**
+   * Returns the ID of this antenna array instance
+   * \return the ID value
+   */
+  uint32_t GetId () const;
+
 protected:
   /**
    * Utility method to compute the euclidean norm of a ComplexVector
@@ -134,10 +143,17 @@
   ComplexVector m_beamformingVector; //!< the beamforming vector in use
   Ptr<AntennaModel> m_antennaElement; //!< the model of the antenna element in use
   bool m_isBfVectorValid; //!< ensures the validity of the beamforming vector
-
+  static uint32_t m_idCounter; //!< the ID counter that is used to determine the unique antenna array ID
+  uint32_t m_id {0}; //!< the ID of this antenna array instance
 };
 
-
+/**
+ * \brief Stream insertion operator.
+ *
+ * \param [in] os The reference to the output stream.
+ * \param [in] cv A vector of complex values.
+ * \returns The reference to the output stream.
+ */
 std::ostream& operator<< (std::ostream& os, const PhasedArrayModel::ComplexVector& cv);
 
 } /* namespace ns3 */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/antenna/model/three-gpp-antenna-model.h ns-3.36/src/antenna/model/three-gpp-antenna-model.h
--- ns-3.35/src/antenna/model/three-gpp-antenna-model.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/antenna/model/three-gpp-antenna-model.h	2022-04-30 18:23:57.742733000 -0700
@@ -38,7 +38,10 @@
   ThreeGppAntennaModel (void);
   virtual ~ThreeGppAntennaModel (void) override;
 
-  // inherited from Object
+  /**
+   * \brief Get the type ID.
+   * \return The object TypeId.
+   */
   static TypeId GetTypeId ();
 
   // inherited from AntennaModel
@@ -75,8 +78,8 @@
   double GetAntennaElementGain () const;
 
 private:
-  double m_verticalBeamwidthDegrees;    //!< beamwidth in the vertical direction (\theta_{3dB}) [deg]
-  double m_horizontalBeamwidthDegrees;  //!< beamwidth in the horizontal direction (\phi_{3dB}) [deg]
+  double m_verticalBeamwidthDegrees;    //!< beamwidth in the vertical direction \f$(\theta_{3dB})\f$ [deg]
+  double m_horizontalBeamwidthDegrees;  //!< beamwidth in the horizontal direction \f$(\phi_{3dB})\f$ [deg]
   double m_aMax;                        //!< maximum attenuation (A_{max}) [dB]
   double m_slaV;                        //!< side-lobe attenuation in the vertical direction (SLA_V) [dB]
   double m_geMax;                       //!< maximum directional gain of the antenna element (G_{E,max}) [dBi]
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/antenna/test/test-angles.cc ns-3.36/src/antenna/test/test-angles.cc
--- ns-3.35/src/antenna/test/test-angles.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/antenna/test/test-angles.cc	2022-04-30 18:23:57.742733000 -0700
@@ -28,17 +28,32 @@
 
 using namespace ns3;
 
+/**
+ * \ingroup tests
+ *
+ * \brief Angles Test using one vector for initialization
+ */
 class OneVectorConstructorTestCase : public TestCase
 {
 public:
+  /**
+   * Build the test name
+   * \param v test parameter
+   * \return the test name
+   */
   static std::string BuildNameString (Vector v);
+  /**
+   * Constructor
+   * \param v vector
+   * \param a expected angle
+   */
   OneVectorConstructorTestCase (Vector v, Angles a);
 
 private:
   virtual void DoRun (void);
 
-  Vector m_v;
-  Angles m_a;
+  Vector m_v; //!< vector
+  Angles m_a; //!< expected angle
 };
 
 std::string OneVectorConstructorTestCase::BuildNameString (Vector v)
@@ -65,20 +80,35 @@
 
 
 
-
-
+/**
+ * \ingroup tests
+ *
+ * \brief Angles Test using two vectors for initialization
+ */
 class TwoVectorsConstructorTestCase : public TestCase
 {
 public:
+  /**
+   * Build the test name
+   * \param v test parameter
+   * \param o test parameter
+   * \return the test name
+   */
   static std::string BuildNameString (Vector v, Vector o);
+  /**
+   * Constructor
+   * \param v point
+   * \param o origin
+   * \param a expected angle
+   */
   TwoVectorsConstructorTestCase (Vector v, Vector o, Angles a);
 
 private:
   virtual void DoRun (void);
 
-  Vector m_v;
-  Vector m_o;
-  Angles m_a;
+  Vector m_v; //!< point
+  Vector m_o; //!< origin
+  Angles m_a; //!< expected angle
 };
 
 std::string TwoVectorsConstructorTestCase::BuildNameString (Vector v, Vector o)
@@ -106,9 +136,11 @@
 
 
 
-
-
-
+/**
+ * \ingroup tests
+ *
+ * \brief Angles TestSuite
+ */
 class AnglesTestSuite : public TestSuite
 {
 public:
@@ -206,4 +238,5 @@
 
 }
 
-static AnglesTestSuite staticAnglesTestSuiteInstance;
+/// Static variable for test initialization
+static AnglesTestSuite g_staticAnglesTestSuiteInstance;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/antenna/test/test-cosine-antenna.cc ns-3.36/src/antenna/test/test-cosine-antenna.cc
--- ns-3.35/src/antenna/test/test-cosine-antenna.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/antenna/test/test-cosine-antenna.cc	2022-04-30 18:23:57.742733000 -0700
@@ -33,27 +33,53 @@
 
 NS_LOG_COMPONENT_DEFINE ("TestCosineAntennaModel");
 
+/**
+ * \ingroup antenna-tests
+ *
+ * \brief Test condition (equal to or less than)
+ */
 enum CosineAntennaModelGainTestCondition  {
   EQUAL = 0,
   LESSTHAN = 1
 };
 
+/**
+ * \ingroup antenna-tests
+ *
+ * \brief CosineAntennaModel Test
+ */
 class CosineAntennaModelTestCase : public TestCase
 {
 public:
+  /**
+   * Build the test name
+   * \param a Antenna angle
+   * \param b Horizontal and Vertical Beamwidth
+   * \param o Orientation
+   * \param g MaxGain
+   * \return the test name
+   */
   static std::string BuildNameString (Angles a, double b, double o, double g);
+  /**
+   * Constructor
+   * \param a Antenna angle
+   * \param b Horizontal and Vertical Beamwidth
+   * \param o Orientation
+   * \param g MaxGain
+   * \param expectedGainDb Expeted antenna gain
+   * \param cond Test condition
+   */
   CosineAntennaModelTestCase (Angles a, double b, double o, double g, double expectedGainDb, CosineAntennaModelGainTestCondition cond);
 
 
 private:
   virtual void DoRun (void);
-
-  Angles m_a;
-  double m_b;
-  double m_o;
-  double m_g;
-  double m_expectedGain;
-  CosineAntennaModelGainTestCondition m_cond;
+  Angles m_a; //!< Antenna angle
+  double m_b; //!< Horizontal and Vertical Beamwidth
+  double m_o; //!< Orientation
+  double m_g; //!< MaxGain
+  double m_expectedGain;  //!< Expected gain
+  CosineAntennaModelGainTestCondition m_cond; //!< Test condition
 };
 
 std::string CosineAntennaModelTestCase::BuildNameString (Angles a, double b, double o, double g)
@@ -105,6 +131,11 @@
 
 
 
+/**
+ * \ingroup antenna-tests
+ *
+ * \brief CosineAntennaModel TestSuite
+ */
 class CosineAntennaModelTestSuite : public TestSuite
 {
 public:
@@ -211,4 +242,5 @@
 
 };
 
-static CosineAntennaModelTestSuite staticCosineAntennaModelTestSuiteInstance;
+/// Static variable for test initialization
+static CosineAntennaModelTestSuite g_staticCosineAntennaModelTestSuiteInstance;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/antenna/test/test-degrees-radians.cc ns-3.36/src/antenna/test/test-degrees-radians.cc
--- ns-3.35/src/antenna/test/test-degrees-radians.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/antenna/test/test-degrees-radians.cc	2022-04-30 18:23:57.742733000 -0700
@@ -28,18 +28,33 @@
 
 using namespace ns3;
 
+/**
+ * \ingroup tests
+ *
+ * \brief Test degree to radians conversion
+ */
 class DegreesToRadiansTestCase : public TestCase
 {
 public:
+  /**
+   * Build the test name
+   * \param a test param
+   * \return the test name
+   */
   static std::string BuildNameString (double a);
+  /**
+   * Constructor
+   * \param a angle in degrees
+   * \param b expected angle in radians
+   */
   DegreesToRadiansTestCase (double a, double b);
 
 
 private:
   virtual void DoRun (void);
 
-  double m_a;
-  double m_b;
+  double m_a; //!< angle in degrees
+  double m_b; //!< expected angle in radians
 };
 
 std::string DegreesToRadiansTestCase::BuildNameString (double a)
@@ -66,18 +81,33 @@
 
 
 
+/**
+ * \ingroup tests
+ *
+ * \brief Test radians to degree conversion
+ */
 class RadiansToDegreesTestCase : public TestCase
 {
 public:
+  /**
+   * Build the test name
+   * \param a test param
+   * \return the test name
+   */
   static std::string BuildNameString (double a);
+  /**
+   * Constructor
+   * \param a angle in radians
+   * \param b expected angle in degrees
+   */
   RadiansToDegreesTestCase (double a, double b);
 
 
 private:
   virtual void DoRun (void);
 
-  double m_a;
-  double m_b;
+  double m_a; //!< angle in radians
+  double m_b; //!< expected angle in degrees
 };
 
 std::string RadiansToDegreesTestCase::BuildNameString (double a)
@@ -104,6 +134,11 @@
 
 
 
+/**
+ * \ingroup tests
+ *
+ * \brief TestSuite: degree to radians (and viceversa) conversions 
+ */
 class DegreesRadiansTestSuite : public TestSuite
 {
 public:
@@ -131,4 +166,5 @@
 
 };
 
-static DegreesRadiansTestSuite staticDegreesRadiansTestSuiteInstance;
+/// Static variable for test initialization
+static DegreesRadiansTestSuite g_staticDegreesRadiansTestSuiteInstance;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/antenna/test/test-isotropic-antenna.cc ns-3.36/src/antenna/test/test-isotropic-antenna.cc
--- ns-3.35/src/antenna/test/test-isotropic-antenna.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/antenna/test/test-isotropic-antenna.cc	2022-04-30 18:23:57.742733000 -0700
@@ -28,18 +28,33 @@
 
 using namespace ns3;
 
+/**
+ * \ingroup antenna-tests
+ *
+ * \brief IsotropicAntennaModel Test
+ */
 class IsotropicAntennaModelTestCase : public TestCase
 {
 public:
+  /**
+   * Build the test name
+   * \param a Antenna angle
+   * \return the test name
+   */
   static std::string BuildNameString (Angles a);
+  /**
+   * Constructor
+   * \param a Antenna angle
+   * \param expectedGainDb Expeted antenna gain
+   */
   IsotropicAntennaModelTestCase (Angles a, double expectedGainDb);
 
 
 private:
   virtual void DoRun (void);
 
-  Angles m_a;
-  double m_expectedGain;
+  Angles m_a; //!< Antenna angle
+  double m_expectedGain;  //!< Expected gain
 };
 
 std::string IsotropicAntennaModelTestCase::BuildNameString (Angles a)
@@ -68,6 +83,11 @@
 
 
 
+/**
+ * \ingroup antenna-tests
+ *
+ * \brief IsotropicAntennaModel TestSuite
+ */
 class IsotropicAntennaModelTestSuite : public TestSuite
 {
 public:
@@ -89,4 +109,5 @@
 
 };
 
-static IsotropicAntennaModelTestSuite staticIsotropicAntennaModelTestSuiteInstance;
+/// Static variable for test initialization
+static IsotropicAntennaModelTestSuite g_staticIsotropicAntennaModelTestSuiteInstance;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/antenna/test/test-parabolic-antenna.cc ns-3.36/src/antenna/test/test-parabolic-antenna.cc
--- ns-3.35/src/antenna/test/test-parabolic-antenna.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/antenna/test/test-parabolic-antenna.cc	2022-04-30 18:23:57.742733000 -0700
@@ -33,27 +33,54 @@
 
 NS_LOG_COMPONENT_DEFINE ("TestParabolicAntennaModel");
 
+/**
+ * \ingroup antenna-tests
+ *
+ * \brief Test condition (equal to or less than)
+ */
 enum ParabolicAntennaModelGainTestCondition  {
   EQUAL = 0,
   LESSTHAN = 1
 };
 
+/**
+ * \ingroup antenna-tests
+ *
+ * \brief ParabolicAntennaModel Test
+ */
 class ParabolicAntennaModelTestCase : public TestCase
 {
 public:
+  /**
+   * Build the test name
+   * \param a Antenna angle
+   * \param b Beamwidth
+   * \param o Orientation
+   * \param g MaxGain
+   * \return the test name
+   */
   static std::string BuildNameString (Angles a, double b, double o, double g);
+  /**
+   * Constructor
+   * \param a Antenna angle
+   * \param b Beamwidth
+   * \param o Orientation
+   * \param g MaxGain
+   * \param expectedGainDb Expeted antenna gain
+   * \param cond Test condition
+   */
   ParabolicAntennaModelTestCase (Angles a, double b, double o, double g, double expectedGainDb, ParabolicAntennaModelGainTestCondition cond);
 
 
 private:
   virtual void DoRun (void);
 
-  Angles m_a;
-  double m_b;
-  double m_o;
-  double m_g;
-  double m_expectedGain;
-  ParabolicAntennaModelGainTestCondition m_cond;
+  Angles m_a; //!< Antenna angle
+  double m_b; //!< Beamwidth
+  double m_o; //!< Orientation
+  double m_g; //!< MaxGain
+  double m_expectedGain;  //!< Expected gain
+  ParabolicAntennaModelGainTestCondition m_cond; //!< Test condition
 };
 
 std::string ParabolicAntennaModelTestCase::BuildNameString (Angles a, double b, double o, double g)
@@ -102,8 +129,11 @@
 }
 
 
-
-
+/**
+ * \ingroup antenna-tests
+ *
+ * \brief ParabolicAntennaModel TestSuite
+ */
 class ParabolicAntennaModelTestSuite : public TestSuite
 {
 public:
@@ -182,4 +212,5 @@
 
 };
 
-static ParabolicAntennaModelTestSuite staticParabolicAntennaModelTestSuiteInstance;
+/// Static variable for test initialization
+static ParabolicAntennaModelTestSuite g_staticParabolicAntennaModelTestSuiteInstance;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/antenna/test/test-uniform-planar-array.cc ns-3.36/src/antenna/test/test-uniform-planar-array.cc
--- ns-3.35/src/antenna/test/test-uniform-planar-array.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/antenna/test/test-uniform-planar-array.cc	2022-04-30 18:23:57.742733000 -0700
@@ -36,7 +36,7 @@
 NS_LOG_COMPONENT_DEFINE ("TestUniformPlanarArray");
 
 /**
- * \ingroup tests
+ * \ingroup antenna-tests
  *
  * \brief UniformPlanarArray Test Case
  */
@@ -173,7 +173,7 @@
 
 
 /**
- * \ingroup tests
+ * \ingroup antenna-tests
  *
  * \brief UniformPlanarArray Test Suite
  */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/antenna/wscript ns-3.36/src/antenna/wscript
--- ns-3.35/src/antenna/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/antenna/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,47 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-
-    module = bld.create_ns3_module('antenna', ['core'])
-
-    module.source = [
-        'model/angles.cc',
-        'model/antenna-model.cc',
-        'model/isotropic-antenna-model.cc',
-        'model/cosine-antenna-model.cc',
-        'model/parabolic-antenna-model.cc',
-        'model/three-gpp-antenna-model.cc',
-        'model/phased-array-model.cc',
-        'model/uniform-planar-array.cc',
-        ]
-
-    module_test = bld.create_ns3_module_test_library('antenna')
-    module_test.source = [
-        'test/test-angles.cc',
-        'test/test-degrees-radians.cc',
-        'test/test-isotropic-antenna.cc',
-        'test/test-cosine-antenna.cc',
-        'test/test-parabolic-antenna.cc',
-        'test/test-uniform-planar-array.cc',
-        ]
-
-    # Tests encapsulating example programs should be listed here
-    if (bld.env['ENABLE_EXAMPLES']):
-        module_test.source.extend([
-        #   'test/antenna-examples-test-suite.cc',
-            ])
-    
-    headers = bld(features='ns3header')
-    headers.module = 'antenna'
-    headers.source = [
-        'model/angles.h',
-        'model/antenna-model.h',
-        'model/isotropic-antenna-model.h',
-        'model/cosine-antenna-model.h',
-        'model/parabolic-antenna-model.h',
-        'model/three-gpp-antenna-model.h',
-        'model/phased-array-model.h',
-        'model/uniform-planar-array.h',
-        ]
-
-    bld.ns3_python_bindings()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/aodv/bindings/modulegen__gcc_ILP32.py ns-3.36/src/aodv/bindings/modulegen__gcc_ILP32.py
--- ns-3.35/src/aodv/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/aodv/bindings/modulegen__gcc_ILP32.py	2022-04-30 18:23:57.762733000 -0700
@@ -73,6 +73,8 @@
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::TraceSourceAccessor'])
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'], import_from_module='ns.core')
     ## hash.h (module 'core'): ns3::Hasher [class]
     module.add_class('Hasher', import_from_module='ns.core')
     ## inet6-socket-address.h (module 'network'): ns3::Inet6SocketAddress [class]
@@ -244,29 +246,29 @@
     module.add_class('RandomVariableStream', import_from_module='ns.core', parent=root_module['ns3::Object'])
     ## random-variable-stream.h (module 'core'): ns3::SequentialRandomVariable [class]
     module.add_class('SequentialRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv4MulticastRoute', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv4Route', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv4Route>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::OutputStreamWrapper', 'ns3::empty', 'ns3::DefaultDeleter<ns3::OutputStreamWrapper>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
     ## socket.h (module 'network'): ns3::Socket [class]
     module.add_class('Socket', import_from_module='ns.network', parent=root_module['ns3::Object'])
@@ -499,7 +501,7 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::Socket>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## ipv4-list-routing.h (module 'internet'): ns3::Ipv4ListRouting [class]
     module.add_class('Ipv4ListRouting', import_from_module='ns.internet', parent=root_module['ns3::Ipv4RoutingProtocol'])
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     module.add_container('std::vector< ns3::Ipv6Address >', 'ns3::Ipv6Address', container_type='vector')
     module.add_container('std::list< std::pair< ns3::Ptr< ns3::Packet >, ns3::Ipv4Header > >', 'std::pair< ns3::Ptr< ns3::Packet >, ns3::Ipv4Header >', container_type='list')
     module.add_container('std::list< ns3::ArpCache::Entry * >', 'ns3::ArpCache::Entry *', container_type='list')
@@ -3323,8 +3325,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -3547,14 +3549,14 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('>=')
     cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_unary_numeric_operator('-')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
     cls.add_constructor([])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(double const value) [constructor]
@@ -3573,6 +3575,8 @@
     cls.add_constructor([param('long unsigned int const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int const v) [constructor]
     cls.add_constructor([param('long long unsigned int const', 'v')])
+    ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int128_t const v) [constructor]
+    cls.add_constructor([param('int128_t const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t const hi, uint64_t const lo) [constructor]
     cls.add_constructor([param('int64_t const', 'hi'), param('uint64_t const', 'lo')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [constructor]
@@ -4037,86 +4041,86 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Ipv4MulticastRoute_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv4MulticastRoute__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter< ns3::Ipv4MulticastRoute > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Ipv4Route_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv4Route__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter< ns3::Ipv4Route > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3OutputStreamWrapper_Ns3Empty_Ns3DefaultDeleter__lt__ns3OutputStreamWrapper__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter< ns3::OutputStreamWrapper > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
@@ -4239,7 +4243,7 @@
                    'uint8_t', 
                    [param('uint8_t', 'ipTos')], 
                    is_static=True)
-    ## socket.h (module 'network'): void ns3::Socket::Ipv6JoinGroup(ns3::Ipv6Address address, ns3::Socket::Ipv6MulticastFilterMode filterMode, std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address> > sourceAddresses) [member function]
+    ## socket.h (module 'network'): void ns3::Socket::Ipv6JoinGroup(ns3::Ipv6Address address, ns3::Socket::Ipv6MulticastFilterMode filterMode, std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address>> sourceAddresses) [member function]
     cls.add_method('Ipv6JoinGroup', 
                    'void', 
                    [param('ns3::Ipv6Address', 'address'), param('ns3::Socket::Ipv6MulticastFilterMode', 'filterMode'), param('std::vector< ns3::Ipv6Address >', 'sourceAddresses')], 
@@ -5065,7 +5069,7 @@
     cls.add_method('Lookup', 
                    'ns3::ArpCache::Entry *', 
                    [param('ns3::Ipv4Address', 'destination')])
-    ## arp-cache.h (module 'internet'): std::list<ns3::ArpCache::Entry *, std::allocator<ns3::ArpCache::Entry *> > ns3::ArpCache::LookupInverse(ns3::Address destination) [member function]
+    ## arp-cache.h (module 'internet'): std::list<ns3::ArpCache::Entry *, std::allocator<ns3::ArpCache::Entry *>> ns3::ArpCache::LookupInverse(ns3::Address destination) [member function]
     cls.add_method('LookupInverse', 
                    'std::list< ns3::ArpCache::Entry * >', 
                    [param('ns3::Address', 'destination')])
@@ -6465,7 +6469,7 @@
                    'ns3::Ipv4Address', 
                    [], 
                    is_const=True)
-    ## ipv4-route.h (module 'internet'): std::map<unsigned int, unsigned int, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, unsigned int> > > ns3::Ipv4MulticastRoute::GetOutputTtlMap() const [member function]
+    ## ipv4-route.h (module 'internet'): std::map<unsigned int, unsigned int, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, unsigned int>>> ns3::Ipv4MulticastRoute::GetOutputTtlMap() const [member function]
     cls.add_method('GetOutputTtlMap', 
                    'std::map< unsigned int, unsigned int >', 
                    [], 
@@ -6911,10 +6915,16 @@
     cls.add_method('ExtractNeighborIndex', 
                    'uint32_t', 
                    [param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetEpoch() const [member function]
+    cls.add_method('GetEpoch', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() const [member function]
     cls.add_method('GetRemainingBits', 
                    'uint32_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -6925,6 +6935,10 @@
                    'uint32_t', 
                    [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
+    ## nix-vector.h (module 'network'): void ns3::NixVector::SetEpoch(uint32_t epoch) [member function]
+    cls.add_method('SetEpoch', 
+                   'void', 
+                   [param('uint32_t', 'epoch')])
     return
 
 def register_Ns3Node_methods(root_module, cls):
@@ -7301,10 +7315,11 @@
                    'uint32_t', 
                    [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) const [member function]
     cls.add_method('SetNixVector', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')], 
+                   is_const=True)
     ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
     cls.add_method('ToString', 
                    'std::string', 
@@ -8407,11 +8422,11 @@
                    'ns3::Time', 
                    [], 
                    is_const=True)
-    ## aodv-rtable.h (module 'aodv'): void ns3::aodv::RoutingTable::GetListOfDestinationWithNextHop(ns3::Ipv4Address nextHop, std::map<ns3::Ipv4Address, unsigned int, std::less<ns3::Ipv4Address>, std::allocator<std::pair<const ns3::Ipv4Address, unsigned int> > > & unreachable) [member function]
+    ## aodv-rtable.h (module 'aodv'): void ns3::aodv::RoutingTable::GetListOfDestinationWithNextHop(ns3::Ipv4Address nextHop, std::map<ns3::Ipv4Address, unsigned int, std::less<ns3::Ipv4Address>, std::allocator<std::pair<const ns3::Ipv4Address, unsigned int>>> & unreachable) [member function]
     cls.add_method('GetListOfDestinationWithNextHop', 
                    'void', 
                    [param('ns3::Ipv4Address', 'nextHop'), param('std::map< ns3::Ipv4Address, unsigned int > &', 'unreachable')])
-    ## aodv-rtable.h (module 'aodv'): void ns3::aodv::RoutingTable::InvalidateRoutesWithDst(std::map<ns3::Ipv4Address, unsigned int, std::less<ns3::Ipv4Address>, std::allocator<std::pair<const ns3::Ipv4Address, unsigned int> > > const & unreachable) [member function]
+    ## aodv-rtable.h (module 'aodv'): void ns3::aodv::RoutingTable::InvalidateRoutesWithDst(std::map<ns3::Ipv4Address, unsigned int, std::less<ns3::Ipv4Address>, std::allocator<std::pair<const ns3::Ipv4Address, unsigned int>>> const & unreachable) [member function]
     cls.add_method('InvalidateRoutesWithDst', 
                    'void', 
                    [param('std::map< ns3::Ipv4Address, unsigned int > const &', 'unreachable')])
@@ -8503,7 +8518,7 @@
                    'ns3::Ptr< ns3::NetDevice >', 
                    [], 
                    is_const=True)
-    ## aodv-rtable.h (module 'aodv'): void ns3::aodv::RoutingTableEntry::GetPrecursors(std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address> > & prec) const [member function]
+    ## aodv-rtable.h (module 'aodv'): void ns3::aodv::RoutingTableEntry::GetPrecursors(std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address>> & prec) const [member function]
     cls.add_method('GetPrecursors', 
                    'void', 
                    [param('std::vector< ns3::Ipv4Address > &', 'prec')], 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/aodv/bindings/modulegen__gcc_LP64.py ns-3.36/src/aodv/bindings/modulegen__gcc_LP64.py
--- ns-3.35/src/aodv/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/aodv/bindings/modulegen__gcc_LP64.py	2022-04-30 18:23:57.762733000 -0700
@@ -73,6 +73,8 @@
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::TraceSourceAccessor'])
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'], import_from_module='ns.core')
     ## hash.h (module 'core'): ns3::Hasher [class]
     module.add_class('Hasher', import_from_module='ns.core')
     ## inet6-socket-address.h (module 'network'): ns3::Inet6SocketAddress [class]
@@ -244,29 +246,29 @@
     module.add_class('RandomVariableStream', import_from_module='ns.core', parent=root_module['ns3::Object'])
     ## random-variable-stream.h (module 'core'): ns3::SequentialRandomVariable [class]
     module.add_class('SequentialRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv4MulticastRoute', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv4Route', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv4Route>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::OutputStreamWrapper', 'ns3::empty', 'ns3::DefaultDeleter<ns3::OutputStreamWrapper>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
     ## socket.h (module 'network'): ns3::Socket [class]
     module.add_class('Socket', import_from_module='ns.network', parent=root_module['ns3::Object'])
@@ -499,7 +501,7 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::Socket>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## ipv4-list-routing.h (module 'internet'): ns3::Ipv4ListRouting [class]
     module.add_class('Ipv4ListRouting', import_from_module='ns.internet', parent=root_module['ns3::Ipv4RoutingProtocol'])
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     module.add_container('std::vector< ns3::Ipv6Address >', 'ns3::Ipv6Address', container_type='vector')
     module.add_container('std::list< std::pair< ns3::Ptr< ns3::Packet >, ns3::Ipv4Header > >', 'std::pair< ns3::Ptr< ns3::Packet >, ns3::Ipv4Header >', container_type='list')
     module.add_container('std::list< ns3::ArpCache::Entry * >', 'ns3::ArpCache::Entry *', container_type='list')
@@ -3323,8 +3325,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -3547,14 +3549,14 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('>=')
     cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_unary_numeric_operator('-')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
     cls.add_constructor([])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(double const value) [constructor]
@@ -3573,6 +3575,8 @@
     cls.add_constructor([param('long unsigned int const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int const v) [constructor]
     cls.add_constructor([param('long long unsigned int const', 'v')])
+    ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int128_t const v) [constructor]
+    cls.add_constructor([param('int128_t const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t const hi, uint64_t const lo) [constructor]
     cls.add_constructor([param('int64_t const', 'hi'), param('uint64_t const', 'lo')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [constructor]
@@ -4037,86 +4041,86 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Ipv4MulticastRoute_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv4MulticastRoute__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter< ns3::Ipv4MulticastRoute > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Ipv4Route_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv4Route__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter< ns3::Ipv4Route > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3OutputStreamWrapper_Ns3Empty_Ns3DefaultDeleter__lt__ns3OutputStreamWrapper__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter< ns3::OutputStreamWrapper > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
@@ -4239,7 +4243,7 @@
                    'uint8_t', 
                    [param('uint8_t', 'ipTos')], 
                    is_static=True)
-    ## socket.h (module 'network'): void ns3::Socket::Ipv6JoinGroup(ns3::Ipv6Address address, ns3::Socket::Ipv6MulticastFilterMode filterMode, std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address> > sourceAddresses) [member function]
+    ## socket.h (module 'network'): void ns3::Socket::Ipv6JoinGroup(ns3::Ipv6Address address, ns3::Socket::Ipv6MulticastFilterMode filterMode, std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address>> sourceAddresses) [member function]
     cls.add_method('Ipv6JoinGroup', 
                    'void', 
                    [param('ns3::Ipv6Address', 'address'), param('ns3::Socket::Ipv6MulticastFilterMode', 'filterMode'), param('std::vector< ns3::Ipv6Address >', 'sourceAddresses')], 
@@ -5065,7 +5069,7 @@
     cls.add_method('Lookup', 
                    'ns3::ArpCache::Entry *', 
                    [param('ns3::Ipv4Address', 'destination')])
-    ## arp-cache.h (module 'internet'): std::list<ns3::ArpCache::Entry *, std::allocator<ns3::ArpCache::Entry *> > ns3::ArpCache::LookupInverse(ns3::Address destination) [member function]
+    ## arp-cache.h (module 'internet'): std::list<ns3::ArpCache::Entry *, std::allocator<ns3::ArpCache::Entry *>> ns3::ArpCache::LookupInverse(ns3::Address destination) [member function]
     cls.add_method('LookupInverse', 
                    'std::list< ns3::ArpCache::Entry * >', 
                    [param('ns3::Address', 'destination')])
@@ -6465,7 +6469,7 @@
                    'ns3::Ipv4Address', 
                    [], 
                    is_const=True)
-    ## ipv4-route.h (module 'internet'): std::map<unsigned int, unsigned int, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, unsigned int> > > ns3::Ipv4MulticastRoute::GetOutputTtlMap() const [member function]
+    ## ipv4-route.h (module 'internet'): std::map<unsigned int, unsigned int, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, unsigned int>>> ns3::Ipv4MulticastRoute::GetOutputTtlMap() const [member function]
     cls.add_method('GetOutputTtlMap', 
                    'std::map< unsigned int, unsigned int >', 
                    [], 
@@ -6911,10 +6915,16 @@
     cls.add_method('ExtractNeighborIndex', 
                    'uint32_t', 
                    [param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetEpoch() const [member function]
+    cls.add_method('GetEpoch', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() const [member function]
     cls.add_method('GetRemainingBits', 
                    'uint32_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -6925,6 +6935,10 @@
                    'uint32_t', 
                    [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
+    ## nix-vector.h (module 'network'): void ns3::NixVector::SetEpoch(uint32_t epoch) [member function]
+    cls.add_method('SetEpoch', 
+                   'void', 
+                   [param('uint32_t', 'epoch')])
     return
 
 def register_Ns3Node_methods(root_module, cls):
@@ -7301,10 +7315,11 @@
                    'uint32_t', 
                    [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) const [member function]
     cls.add_method('SetNixVector', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')], 
+                   is_const=True)
     ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
     cls.add_method('ToString', 
                    'std::string', 
@@ -8407,11 +8422,11 @@
                    'ns3::Time', 
                    [], 
                    is_const=True)
-    ## aodv-rtable.h (module 'aodv'): void ns3::aodv::RoutingTable::GetListOfDestinationWithNextHop(ns3::Ipv4Address nextHop, std::map<ns3::Ipv4Address, unsigned int, std::less<ns3::Ipv4Address>, std::allocator<std::pair<const ns3::Ipv4Address, unsigned int> > > & unreachable) [member function]
+    ## aodv-rtable.h (module 'aodv'): void ns3::aodv::RoutingTable::GetListOfDestinationWithNextHop(ns3::Ipv4Address nextHop, std::map<ns3::Ipv4Address, unsigned int, std::less<ns3::Ipv4Address>, std::allocator<std::pair<const ns3::Ipv4Address, unsigned int>>> & unreachable) [member function]
     cls.add_method('GetListOfDestinationWithNextHop', 
                    'void', 
                    [param('ns3::Ipv4Address', 'nextHop'), param('std::map< ns3::Ipv4Address, unsigned int > &', 'unreachable')])
-    ## aodv-rtable.h (module 'aodv'): void ns3::aodv::RoutingTable::InvalidateRoutesWithDst(std::map<ns3::Ipv4Address, unsigned int, std::less<ns3::Ipv4Address>, std::allocator<std::pair<const ns3::Ipv4Address, unsigned int> > > const & unreachable) [member function]
+    ## aodv-rtable.h (module 'aodv'): void ns3::aodv::RoutingTable::InvalidateRoutesWithDst(std::map<ns3::Ipv4Address, unsigned int, std::less<ns3::Ipv4Address>, std::allocator<std::pair<const ns3::Ipv4Address, unsigned int>>> const & unreachable) [member function]
     cls.add_method('InvalidateRoutesWithDst', 
                    'void', 
                    [param('std::map< ns3::Ipv4Address, unsigned int > const &', 'unreachable')])
@@ -8503,7 +8518,7 @@
                    'ns3::Ptr< ns3::NetDevice >', 
                    [], 
                    is_const=True)
-    ## aodv-rtable.h (module 'aodv'): void ns3::aodv::RoutingTableEntry::GetPrecursors(std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address> > & prec) const [member function]
+    ## aodv-rtable.h (module 'aodv'): void ns3::aodv::RoutingTableEntry::GetPrecursors(std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address>> & prec) const [member function]
     cls.add_method('GetPrecursors', 
                    'void', 
                    [param('std::vector< ns3::Ipv4Address > &', 'prec')], 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/aodv/CMakeLists.txt ns-3.36/src/aodv/CMakeLists.txt
--- ns-3.35/src/aodv/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/aodv/CMakeLists.txt	2022-04-30 18:23:57.742733000 -0700
@@ -0,0 +1,29 @@
+build_lib(
+  LIBNAME aodv
+  SOURCE_FILES
+    helper/aodv-helper.cc
+    model/aodv-dpd.cc
+    model/aodv-id-cache.cc
+    model/aodv-neighbor.cc
+    model/aodv-packet.cc
+    model/aodv-routing-protocol.cc
+    model/aodv-rqueue.cc
+    model/aodv-rtable.cc
+  HEADER_FILES
+    helper/aodv-helper.h
+    model/aodv-dpd.h
+    model/aodv-id-cache.h
+    model/aodv-neighbor.h
+    model/aodv-packet.h
+    model/aodv-routing-protocol.h
+    model/aodv-rqueue.h
+    model/aodv-rtable.h
+  LIBRARIES_TO_LINK ${libinternet}
+                    ${libwifi}
+  TEST_SOURCES
+    test/aodv-id-cache-test-suite.cc
+    test/aodv-regression.cc
+    test/aodv-test-suite.cc
+    test/loopback.cc
+    test/bug-772.cc
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/aodv/examples/CMakeLists.txt ns-3.36/src/aodv/examples/CMakeLists.txt
--- ns-3.35/src/aodv/examples/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/aodv/examples/CMakeLists.txt	2022-04-30 18:23:57.762733000 -0700
@@ -0,0 +1,9 @@
+build_lib_example(
+  NAME aodv
+  SOURCE_FILES aodv.cc
+  LIBRARIES_TO_LINK
+    ${libwifi}
+    ${libinternet}
+    ${libaodv}
+    ${libinternet-apps}
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/aodv/examples/wscript ns-3.36/src/aodv/examples/wscript
--- ns-3.35/src/aodv/examples/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/aodv/examples/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,6 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    obj = bld.create_ns3_program('aodv',
-                                 ['wifi', 'internet', 'aodv', 'internet-apps'])
-    obj.source = 'aodv.cc'
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/aodv/test/aodv-regression.cc ns-3.36/src/aodv/test/aodv-regression.cc
--- ns-3.35/src/aodv/test/aodv-regression.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/aodv/test/aodv-regression.cc	2022-04-30 18:23:57.770733000 -0700
@@ -173,16 +173,17 @@
   // This test suite output was originally based on YansErrorRateModel
   wifiPhy.SetErrorRateModel ("ns3::YansErrorRateModel");
   WifiHelper wifi;
+  wifi.SetStandard (WIFI_STANDARD_80211a);
   wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager", "DataMode", StringValue ("OfdmRate6Mbps"), "RtsCtsThreshold", StringValue ("2200"));
   NetDeviceContainer devices = wifi.Install (wifiPhy, wifiMac, *m_nodes);
 
   // Assign fixed stream numbers to wifi and channel random variables
   streamsUsed += wifi.AssignStreams (devices, streamsUsed);
   // Assign 6 streams per device
-  NS_TEST_ASSERT_MSG_EQ (streamsUsed, (devices.GetN () * 6), "Stream assignment mismatch");
+  NS_TEST_ASSERT_MSG_EQ (streamsUsed, (devices.GetN () * 2), "Stream assignment mismatch");
   streamsUsed += wifiChannel.AssignStreams (chan, streamsUsed);
   // Assign 0 streams per channel for this configuration
-  NS_TEST_ASSERT_MSG_EQ (streamsUsed, (devices.GetN () * 6), "Stream assignment mismatch");
+  NS_TEST_ASSERT_MSG_EQ (streamsUsed, (devices.GetN () * 2), "Stream assignment mismatch");
 
   // 2. Setup TCP/IP & AODV
   AodvHelper aodv; // Use default parameters here
@@ -191,10 +192,10 @@
   internetStack.Install (*m_nodes);
   streamsUsed += internetStack.AssignStreams (*m_nodes, streamsUsed);
   // InternetStack uses m_size more streams
-  NS_TEST_ASSERT_MSG_EQ (streamsUsed, (devices.GetN () * 8) + m_size, "Stream assignment mismatch");
+  NS_TEST_ASSERT_MSG_EQ (streamsUsed, (devices.GetN () * 4) + m_size, "Stream assignment mismatch");
   streamsUsed += aodv.AssignStreams (*m_nodes, streamsUsed);
   // AODV uses m_size more streams
-  NS_TEST_ASSERT_MSG_EQ (streamsUsed, ((devices.GetN () * 8) + (2 * m_size)), "Stream assignment mismatch");
+  NS_TEST_ASSERT_MSG_EQ (streamsUsed, ((devices.GetN () * 4) + (2 * m_size)), "Stream assignment mismatch");
 
   Ipv4AddressHelper address;
   address.SetBase ("10.1.1.0", "255.255.255.0");
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/aodv/test/bug-772.cc ns-3.36/src/aodv/test/bug-772.cc
--- ns-3.35/src/aodv/test/bug-772.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/aodv/test/bug-772.cc	2022-04-30 18:23:57.770733000 -0700
@@ -84,8 +84,8 @@
 void
 Bug772ChainTest::DoRun ()
 {
-  RngSeedManager::SetSeed (12345);
-  RngSeedManager::SetRun (7);
+  RngSeedManager::SetSeed (1);
+  RngSeedManager::SetRun (2);
 
   // Default of 3 will cause packet loss
   Config::SetDefault ("ns3::ArpCache::PendingQueueSize", UintegerValue (10));
@@ -136,16 +136,17 @@
   wifiPhy.Set ("TxGain", DoubleValue (1.0)); //this configuration should go away in future revision to the test
   wifiPhy.Set ("RxGain", DoubleValue (1.0)); //this configuration should go away in future revision to the test
   WifiHelper wifi;
+  wifi.SetStandard (WIFI_STANDARD_80211a);
   wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager", "DataMode", StringValue ("OfdmRate6Mbps"), "RtsCtsThreshold", StringValue ("2200"), "MaxSlrc", UintegerValue (7));
   NetDeviceContainer devices = wifi.Install (wifiPhy, wifiMac, *m_nodes);
 
   // Assign fixed stream numbers to wifi and channel random variables
   streamsUsed += wifi.AssignStreams (devices, streamsUsed);
   // Assign 6 streams per device
-  NS_TEST_ASSERT_MSG_EQ (streamsUsed, (devices.GetN () * 6), "Stream assignment mismatch");
+  NS_TEST_ASSERT_MSG_EQ (streamsUsed, (devices.GetN () * 2), "Stream assignment mismatch");
   streamsUsed += wifiChannel.AssignStreams (chan, streamsUsed);
   // Assign 0 streams per channel for this configuration
-  NS_TEST_ASSERT_MSG_EQ (streamsUsed, (devices.GetN () * 6), "Stream assignment mismatch");
+  NS_TEST_ASSERT_MSG_EQ (streamsUsed, (devices.GetN () * 2), "Stream assignment mismatch");
 
   // 2. Setup TCP/IP & AODV
   AodvHelper aodv; // Use default parameters here
@@ -154,10 +155,10 @@
   internetStack.Install (*m_nodes);
   streamsUsed += internetStack.AssignStreams (*m_nodes, streamsUsed);
   // Expect to use (3*m_size) more streams for internet stack random variables
-  NS_TEST_ASSERT_MSG_EQ (streamsUsed, ((devices.GetN () * 6) + (3 * m_size)), "Stream assignment mismatch");
+  NS_TEST_ASSERT_MSG_EQ (streamsUsed, ((devices.GetN () * 2) + (3 * m_size)), "Stream assignment mismatch");
   streamsUsed += aodv.AssignStreams (*m_nodes, streamsUsed);
   // Expect to use m_size more streams for AODV
-  NS_TEST_ASSERT_MSG_EQ (streamsUsed, ((devices.GetN () * 6) + (3 * m_size) + m_size), "Stream assignment mismatch");
+  NS_TEST_ASSERT_MSG_EQ (streamsUsed, ((devices.GetN () * 2) + (3 * m_size) + m_size), "Stream assignment mismatch");
   Ipv4AddressHelper address;
   address.SetBase ("10.1.1.0", "255.255.255.0");
   Ipv4InterfaceContainer interfaces = address.Assign (devices);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/aodv/test/loopback.cc ns-3.36/src/aodv/test/loopback.cc
--- ns-3.35/src/aodv/test/loopback.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/aodv/test/loopback.cc	2022-04-30 18:23:57.770733000 -0700
@@ -134,6 +134,7 @@
   YansWifiChannelHelper wifiChannel = YansWifiChannelHelper::Default ();
   wifiPhy.SetChannel (wifiChannel.Create ());
   WifiHelper wifi;
+  wifi.SetStandard (WIFI_STANDARD_80211a);
   wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager", "DataMode", StringValue ("OfdmRate6Mbps"), "RtsCtsThreshold", StringValue ("2200"));
   NetDeviceContainer devices = wifi.Install (wifiPhy, wifiMac, nodes);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/aodv/wscript ns-3.36/src/aodv/wscript
--- ns-3.35/src/aodv/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/aodv/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,48 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    module = bld.create_ns3_module('aodv', ['internet', 'wifi'])
-    module.includes = '.'
-    module.source = [
-        'model/aodv-id-cache.cc',
-        'model/aodv-dpd.cc',
-        'model/aodv-rtable.cc',
-        'model/aodv-rqueue.cc',
-        'model/aodv-packet.cc',
-        'model/aodv-neighbor.cc',
-        'model/aodv-routing-protocol.cc',
-        'helper/aodv-helper.cc',
-        ]
-
-    aodv_test = bld.create_ns3_module_test_library('aodv')
-    aodv_test.source = [
-        'test/aodv-id-cache-test-suite.cc',
-        'test/aodv-test-suite.cc',
-        'test/aodv-regression.cc',
-        'test/bug-772.cc',
-        'test/loopback.cc',
-        ]
-
-    # Tests encapsulating example programs should be listed here
-    if (bld.env['ENABLE_EXAMPLES']):
-        aodv_test.source.extend([
-        #   'test/aodv-examples-test-suite.cc',
-            ])
-    
-    headers = bld(features='ns3header')
-    headers.module = 'aodv'
-    headers.source = [
-        'model/aodv-id-cache.h',
-        'model/aodv-dpd.h',
-        'model/aodv-rtable.h',
-        'model/aodv-rqueue.h',
-        'model/aodv-packet.h',
-        'model/aodv-neighbor.h',
-        'model/aodv-routing-protocol.h',
-        'helper/aodv-helper.h',
-        ]
-
-    if bld.env['ENABLE_EXAMPLES']:
-        bld.recurse('examples')
-
-    bld.ns3_python_bindings()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/applications/bindings/callbacks_list.py ns-3.36/src/applications/bindings/callbacks_list.py
--- ns-3.35/src/applications/bindings/callbacks_list.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/applications/bindings/callbacks_list.py	2022-04-30 18:23:57.770733000 -0700
@@ -5,18 +5,18 @@
     ['bool', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'const ns3::Address &', 'const ns3::Address &', 'ns3::NetDevice::PacketType', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'const ns3::Address &', 'const ns3::Address &', 'ns3::NetDevice::PacketType', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'unsigned int', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Ptr<const ns3::QueueDiscItem>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Ptr<const ns3::Packet>', 'const ns3::Address &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'std::basic_string<char>', 'ns3::Ptr<const ns3::Packet>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<ns3::Socket>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['bool', 'ns3::Ptr<ns3::Socket>', 'const ns3::Address &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<ns3::Socket>', 'const ns3::Address &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<ns3::Socket>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'std::basic_string<char>', 'ns3::Ptr<const ns3::Packet>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Ptr<const ns3::Packet>', 'const ns3::Address &', 'const ns3::Address &', 'const ns3::SeqTsSizeHeader &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'unsigned int', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Ptr<const ns3::QueueDiscItem>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Ptr<const ns3::Packet>', 'const ns3::Address &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::Packet>', 'const ns3::Address &', 'const ns3::Address &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Ptr<const ns3::Packet>', 'const ns3::Address &', 'const ns3::Address &', 'const ns3::SeqTsSizeHeader &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::ThreeGppHttpClient>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::ThreeGppHttpClient>', 'ns3::Ptr<const ns3::Packet>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'const ns3::Time &', 'const ns3::Address &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/applications/bindings/modulegen__gcc_ILP32.py ns-3.36/src/applications/bindings/modulegen__gcc_ILP32.py
--- ns-3.35/src/applications/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/applications/bindings/modulegen__gcc_ILP32.py	2022-04-30 18:23:57.770733000 -0700
@@ -113,6 +113,8 @@
     module.add_class('DelayJitterEstimation', import_from_module='ns.network')
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'], import_from_module='ns.core')
     ## hash.h (module 'core'): ns3::Hasher [class]
     module.add_class('Hasher', import_from_module='ns.core')
     ## inet6-socket-address.h (module 'network'): ns3::Inet6SocketAddress [class]
@@ -178,8 +180,6 @@
     typehandlers.add_type_alias('std::vector< ns3::Ptr< ns3::Node > > const_iterator', 'ns3::NodeList::Iterator')
     typehandlers.add_type_alias('std::vector< ns3::Ptr< ns3::Node > > const_iterator*', 'ns3::NodeList::Iterator*')
     typehandlers.add_type_alias('std::vector< ns3::Ptr< ns3::Node > > const_iterator&', 'ns3::NodeList::Iterator&')
-    ## non-copyable.h (module 'core'): ns3::NonCopyable [class]
-    module.add_class('NonCopyable', destructor_visibility='protected', import_from_module='ns.core')
     ## object-base.h (module 'core'): ns3::ObjectBase [class]
     module.add_class('ObjectBase', allow_subclassing=True, import_from_module='ns.core')
     ## object.h (module 'core'): ns3::ObjectDeleter [struct]
@@ -367,37 +367,37 @@
     module.add_class('SeqTsSizeHeader', parent=root_module['ns3::SeqTsHeader'])
     ## random-variable-stream.h (module 'core'): ns3::SequentialRandomVariable [class]
     module.add_class('SequentialRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::OutputStreamWrapper', 'ns3::empty', 'ns3::DefaultDeleter<ns3::OutputStreamWrapper>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbAddressBlock, ns3::empty, ns3::DefaultDeleter<ns3::PbbAddressBlock> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbAddressBlock, ns3::empty, ns3::DefaultDeleter<ns3::PbbAddressBlock>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::PbbAddressBlock', 'ns3::empty', 'ns3::DefaultDeleter<ns3::PbbAddressBlock>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbMessage, ns3::empty, ns3::DefaultDeleter<ns3::PbbMessage> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbMessage, ns3::empty, ns3::DefaultDeleter<ns3::PbbMessage>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::PbbMessage', 'ns3::empty', 'ns3::DefaultDeleter<ns3::PbbMessage>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbPacket, ns3::Header, ns3::DefaultDeleter<ns3::PbbPacket> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbPacket, ns3::Header, ns3::DefaultDeleter<ns3::PbbPacket>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::Header'], template_parameters=['ns3::PbbPacket', 'ns3::Header', 'ns3::DefaultDeleter<ns3::PbbPacket>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbTlv, ns3::empty, ns3::DefaultDeleter<ns3::PbbTlv> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbTlv, ns3::empty, ns3::DefaultDeleter<ns3::PbbTlv>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::PbbTlv', 'ns3::empty', 'ns3::DefaultDeleter<ns3::PbbTlv>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::QueueItem', 'ns3::empty', 'ns3::DefaultDeleter<ns3::QueueItem>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ThreeGppHttpServerTxBuffer, ns3::empty, ns3::DefaultDeleter<ns3::ThreeGppHttpServerTxBuffer> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ThreeGppHttpServerTxBuffer, ns3::empty, ns3::DefaultDeleter<ns3::ThreeGppHttpServerTxBuffer>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::ThreeGppHttpServerTxBuffer', 'ns3::empty', 'ns3::DefaultDeleter<ns3::ThreeGppHttpServerTxBuffer>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
     ## sll-header.h (module 'network'): ns3::SllHeader [class]
     module.add_class('SllHeader', import_from_module='ns.network', parent=root_module['ns3::Header'])
@@ -835,7 +835,7 @@
     ## queue-item.h (module 'network'): ns3::QueueDiscItem [class]
     module.add_class('QueueDiscItem', import_from_module='ns.network', parent=root_module['ns3::QueueItem'])
     module.add_container('std::vector< unsigned char >', 'unsigned char', container_type='vector')
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     module.add_container('std::list< ns3::Ptr< ns3::Packet > >', 'ns3::Ptr< ns3::Packet >', container_type='list')
     module.add_container('std::vector< ns3::Ipv6Address >', 'ns3::Ipv6Address', container_type='vector')
     module.add_container('std::list< unsigned int >', 'unsigned int', container_type='list')
@@ -1060,7 +1060,6 @@
     register_Ns3NetDeviceContainer_methods(root_module, root_module['ns3::NetDeviceContainer'])
     register_Ns3NodeContainer_methods(root_module, root_module['ns3::NodeContainer'])
     register_Ns3NodeList_methods(root_module, root_module['ns3::NodeList'])
-    register_Ns3NonCopyable_methods(root_module, root_module['ns3::NonCopyable'])
     register_Ns3ObjectBase_methods(root_module, root_module['ns3::ObjectBase'])
     register_Ns3ObjectDeleter_methods(root_module, root_module['ns3::ObjectDeleter'])
     register_Ns3ObjectFactory_methods(root_module, root_module['ns3::ObjectFactory'])
@@ -1594,7 +1593,7 @@
     cls.add_method('PushByte', 
                    'void', 
                    [param('uint8_t', 'byte')])
-    ## bit-deserializer.h (module 'network'): void ns3::BitDeserializer::PushBytes(std::vector<unsigned char, std::allocator<unsigned char> > bytes) [member function]
+    ## bit-deserializer.h (module 'network'): void ns3::BitDeserializer::PushBytes(std::vector<unsigned char, std::allocator<unsigned char>> bytes) [member function]
     cls.add_method('PushBytes', 
                    'void', 
                    [param('std::vector< unsigned char >', 'bytes')])
@@ -1609,7 +1608,7 @@
     cls.add_constructor([param('ns3::BitSerializer const &', 'arg0')])
     ## bit-serializer.h (module 'network'): ns3::BitSerializer::BitSerializer() [constructor]
     cls.add_constructor([])
-    ## bit-serializer.h (module 'network'): std::vector<unsigned char, std::allocator<unsigned char> > ns3::BitSerializer::GetBytes() [member function]
+    ## bit-serializer.h (module 'network'): std::vector<unsigned char, std::allocator<unsigned char>> ns3::BitSerializer::GetBytes() [member function]
     cls.add_method('GetBytes', 
                    'std::vector< unsigned char >', 
                    [])
@@ -3424,12 +3423,6 @@
                    is_static=True)
     return
 
-def register_Ns3NonCopyable_methods(root_module, cls):
-    ## non-copyable.h (module 'core'): ns3::NonCopyable::NonCopyable() [constructor]
-    cls.add_constructor([], 
-                        visibility='protected')
-    return
-
 def register_Ns3ObjectBase_methods(root_module, cls):
     ## object-base.h (module 'core'): ns3::ObjectBase::ObjectBase() [constructor]
     cls.add_constructor([])
@@ -3509,6 +3502,8 @@
     cls.add_constructor([param('ns3::ObjectFactory const &', 'arg0')])
     ## object-factory.h (module 'core'): ns3::ObjectFactory::ObjectFactory() [constructor]
     cls.add_constructor([])
+    ## object-factory.h (module 'core'): ns3::ObjectFactory::ObjectFactory(std::string const & typeId) [constructor]
+    cls.add_constructor([param('std::string const &', 'typeId')])
     ## object-factory.h (module 'core'): ns3::Ptr<ns3::Object> ns3::ObjectFactory::Create() const [member function]
     cls.add_method('Create', 
                    'ns3::Ptr< ns3::Object >', 
@@ -4304,6 +4299,10 @@
     cls.add_constructor([param('ns3::SimpleNetDeviceHelper const &', 'arg0')])
     ## simple-net-device-helper.h (module 'network'): ns3::SimpleNetDeviceHelper::SimpleNetDeviceHelper() [constructor]
     cls.add_constructor([])
+    ## simple-net-device-helper.h (module 'network'): void ns3::SimpleNetDeviceHelper::DisableFlowControl() [member function]
+    cls.add_method('DisableFlowControl', 
+                   'void', 
+                   [])
     ## simple-net-device-helper.h (module 'network'): ns3::NetDeviceContainer ns3::SimpleNetDeviceHelper::Install(ns3::Ptr<ns3::Node> node) const [member function]
     cls.add_method('Install', 
                    'ns3::NetDeviceContainer', 
@@ -4917,8 +4916,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -5276,14 +5275,14 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('>=')
     cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_unary_numeric_operator('-')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
     cls.add_constructor([])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(double const value) [constructor]
@@ -5302,6 +5301,8 @@
     cls.add_constructor([param('long unsigned int const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int const v) [constructor]
     cls.add_constructor([param('long long unsigned int const', 'v')])
+    ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int128_t const v) [constructor]
+    cls.add_constructor([param('int128_t const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t const hi, uint64_t const lo) [constructor]
     cls.add_constructor([param('int64_t const', 'hi'), param('uint64_t const', 'lo')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [constructor]
@@ -5638,7 +5639,7 @@
     cls.add_method('AddPacket', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet >', 'packet')])
-    ## packet-burst.h (module 'network'): std::list<ns3::Ptr<ns3::Packet>, std::allocator<ns3::Ptr<ns3::Packet> > >::const_iterator ns3::PacketBurst::Begin() const [member function]
+    ## packet-burst.h (module 'network'): std::list<ns3::Ptr<ns3::Packet>, std::allocator<ns3::Ptr<ns3::Packet>>>::const_iterator ns3::PacketBurst::Begin() const [member function]
     cls.add_method('Begin', 
                    'std::list< ns3::Ptr< ns3::Packet > > const_iterator', 
                    [], 
@@ -5648,7 +5649,7 @@
                    'ns3::Ptr< ns3::PacketBurst >', 
                    [], 
                    is_const=True)
-    ## packet-burst.h (module 'network'): std::list<ns3::Ptr<ns3::Packet>, std::allocator<ns3::Ptr<ns3::Packet> > >::const_iterator ns3::PacketBurst::End() const [member function]
+    ## packet-burst.h (module 'network'): std::list<ns3::Ptr<ns3::Packet>, std::allocator<ns3::Ptr<ns3::Packet>>>::const_iterator ns3::PacketBurst::End() const [member function]
     cls.add_method('End', 
                    'std::list< ns3::Ptr< ns3::Packet > > const_iterator', 
                    [], 
@@ -5658,7 +5659,7 @@
                    'uint32_t', 
                    [], 
                    is_const=True)
-    ## packet-burst.h (module 'network'): std::list<ns3::Ptr<ns3::Packet>, std::allocator<ns3::Ptr<ns3::Packet> > > ns3::PacketBurst::GetPackets() const [member function]
+    ## packet-burst.h (module 'network'): std::list<ns3::Ptr<ns3::Packet>, std::allocator<ns3::Ptr<ns3::Packet>>> ns3::PacketBurst::GetPackets() const [member function]
     cls.add_method('GetPackets', 
                    'std::list< ns3::Ptr< ns3::Packet > >', 
                    [], 
@@ -5903,6 +5904,11 @@
     cls.add_method('SetMaxSize', 
                    'void', 
                    [param('ns3::QueueSize', 'size')])
+    ## queue.h (module 'network'): bool ns3::QueueBase::WouldOverflow(uint32_t nPackets, uint32_t nBytes) const [member function]
+    cls.add_method('WouldOverflow', 
+                   'bool', 
+                   [param('uint32_t', 'nPackets'), param('uint32_t', 'nBytes')], 
+                   is_const=True)
     return
 
 def register_Ns3QueueLimits_methods(root_module, cls):
@@ -6267,114 +6273,114 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3OutputStreamWrapper_Ns3Empty_Ns3DefaultDeleter__lt__ns3OutputStreamWrapper__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter< ns3::OutputStreamWrapper > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3PbbAddressBlock_Ns3Empty_Ns3DefaultDeleter__lt__ns3PbbAddressBlock__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbAddressBlock, ns3::empty, ns3::DefaultDeleter<ns3::PbbAddressBlock> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbAddressBlock, ns3::empty, ns3::DefaultDeleter<ns3::PbbAddressBlock>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbAddressBlock, ns3::empty, ns3::DefaultDeleter<ns3::PbbAddressBlock> >::SimpleRefCount(ns3::SimpleRefCount<ns3::PbbAddressBlock, ns3::empty, ns3::DefaultDeleter<ns3::PbbAddressBlock> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbAddressBlock, ns3::empty, ns3::DefaultDeleter<ns3::PbbAddressBlock>>::SimpleRefCount(ns3::SimpleRefCount<ns3::PbbAddressBlock, ns3::empty, ns3::DefaultDeleter<ns3::PbbAddressBlock>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::PbbAddressBlock, ns3::empty, ns3::DefaultDeleter< ns3::PbbAddressBlock > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3PbbMessage_Ns3Empty_Ns3DefaultDeleter__lt__ns3PbbMessage__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbMessage, ns3::empty, ns3::DefaultDeleter<ns3::PbbMessage> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbMessage, ns3::empty, ns3::DefaultDeleter<ns3::PbbMessage>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbMessage, ns3::empty, ns3::DefaultDeleter<ns3::PbbMessage> >::SimpleRefCount(ns3::SimpleRefCount<ns3::PbbMessage, ns3::empty, ns3::DefaultDeleter<ns3::PbbMessage> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbMessage, ns3::empty, ns3::DefaultDeleter<ns3::PbbMessage>>::SimpleRefCount(ns3::SimpleRefCount<ns3::PbbMessage, ns3::empty, ns3::DefaultDeleter<ns3::PbbMessage>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::PbbMessage, ns3::empty, ns3::DefaultDeleter< ns3::PbbMessage > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3PbbPacket_Ns3Header_Ns3DefaultDeleter__lt__ns3PbbPacket__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbPacket, ns3::Header, ns3::DefaultDeleter<ns3::PbbPacket> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbPacket, ns3::Header, ns3::DefaultDeleter<ns3::PbbPacket>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbPacket, ns3::Header, ns3::DefaultDeleter<ns3::PbbPacket> >::SimpleRefCount(ns3::SimpleRefCount<ns3::PbbPacket, ns3::Header, ns3::DefaultDeleter<ns3::PbbPacket> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbPacket, ns3::Header, ns3::DefaultDeleter<ns3::PbbPacket>>::SimpleRefCount(ns3::SimpleRefCount<ns3::PbbPacket, ns3::Header, ns3::DefaultDeleter<ns3::PbbPacket>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::PbbPacket, ns3::Header, ns3::DefaultDeleter< ns3::PbbPacket > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3PbbTlv_Ns3Empty_Ns3DefaultDeleter__lt__ns3PbbTlv__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbTlv, ns3::empty, ns3::DefaultDeleter<ns3::PbbTlv> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbTlv, ns3::empty, ns3::DefaultDeleter<ns3::PbbTlv>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbTlv, ns3::empty, ns3::DefaultDeleter<ns3::PbbTlv> >::SimpleRefCount(ns3::SimpleRefCount<ns3::PbbTlv, ns3::empty, ns3::DefaultDeleter<ns3::PbbTlv> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbTlv, ns3::empty, ns3::DefaultDeleter<ns3::PbbTlv>>::SimpleRefCount(ns3::SimpleRefCount<ns3::PbbTlv, ns3::empty, ns3::DefaultDeleter<ns3::PbbTlv>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::PbbTlv, ns3::empty, ns3::DefaultDeleter< ns3::PbbTlv > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3QueueItem_Ns3Empty_Ns3DefaultDeleter__lt__ns3QueueItem__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> >::SimpleRefCount(ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>>::SimpleRefCount(ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::QueueItem, ns3::empty, ns3::DefaultDeleter< ns3::QueueItem > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3ThreeGppHttpServerTxBuffer_Ns3Empty_Ns3DefaultDeleter__lt__ns3ThreeGppHttpServerTxBuffer__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ThreeGppHttpServerTxBuffer, ns3::empty, ns3::DefaultDeleter<ns3::ThreeGppHttpServerTxBuffer> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ThreeGppHttpServerTxBuffer, ns3::empty, ns3::DefaultDeleter<ns3::ThreeGppHttpServerTxBuffer>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ThreeGppHttpServerTxBuffer, ns3::empty, ns3::DefaultDeleter<ns3::ThreeGppHttpServerTxBuffer> >::SimpleRefCount(ns3::SimpleRefCount<ns3::ThreeGppHttpServerTxBuffer, ns3::empty, ns3::DefaultDeleter<ns3::ThreeGppHttpServerTxBuffer> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ThreeGppHttpServerTxBuffer, ns3::empty, ns3::DefaultDeleter<ns3::ThreeGppHttpServerTxBuffer>>::SimpleRefCount(ns3::SimpleRefCount<ns3::ThreeGppHttpServerTxBuffer, ns3::empty, ns3::DefaultDeleter<ns3::ThreeGppHttpServerTxBuffer>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::ThreeGppHttpServerTxBuffer, ns3::empty, ns3::DefaultDeleter< ns3::ThreeGppHttpServerTxBuffer > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
@@ -6552,7 +6558,7 @@
                    'uint8_t', 
                    [param('uint8_t', 'ipTos')], 
                    is_static=True)
-    ## socket.h (module 'network'): void ns3::Socket::Ipv6JoinGroup(ns3::Ipv6Address address, ns3::Socket::Ipv6MulticastFilterMode filterMode, std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address> > sourceAddresses) [member function]
+    ## socket.h (module 'network'): void ns3::Socket::Ipv6JoinGroup(ns3::Ipv6Address address, ns3::Socket::Ipv6MulticastFilterMode filterMode, std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address>> sourceAddresses) [member function]
     cls.add_method('Ipv6JoinGroup', 
                    'void', 
                    [param('ns3::Ipv6Address', 'address'), param('ns3::Socket::Ipv6MulticastFilterMode', 'filterMode'), param('std::vector< ns3::Ipv6Address >', 'sourceAddresses')], 
@@ -7890,17 +7896,17 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::QueueDiscItem const> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::Socket> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::Socket> '], visibility='protected')
+                   is_static=True, template_parameters=['bool'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['bool'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::QueueDiscItem const> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
@@ -9008,7 +9014,7 @@
     cls.add_constructor([param('ns3::ListErrorModel const &', 'arg0')])
     ## error-model.h (module 'network'): ns3::ListErrorModel::ListErrorModel() [constructor]
     cls.add_constructor([])
-    ## error-model.h (module 'network'): std::list<unsigned int, std::allocator<unsigned int> > ns3::ListErrorModel::GetList() const [member function]
+    ## error-model.h (module 'network'): std::list<unsigned int, std::allocator<unsigned int>> ns3::ListErrorModel::GetList() const [member function]
     cls.add_method('GetList', 
                    'std::list< unsigned int >', 
                    [], 
@@ -9018,7 +9024,7 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## error-model.h (module 'network'): void ns3::ListErrorModel::SetList(std::list<unsigned int, std::allocator<unsigned int> > const & packetlist) [member function]
+    ## error-model.h (module 'network'): void ns3::ListErrorModel::SetList(std::list<unsigned int, std::allocator<unsigned int>> const & packetlist) [member function]
     cls.add_method('SetList', 
                    'void', 
                    [param('std::list< unsigned int > const &', 'packetlist')])
@@ -9534,10 +9540,16 @@
     cls.add_method('ExtractNeighborIndex', 
                    'uint32_t', 
                    [param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetEpoch() const [member function]
+    cls.add_method('GetEpoch', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() const [member function]
     cls.add_method('GetRemainingBits', 
                    'uint32_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -9548,6 +9560,10 @@
                    'uint32_t', 
                    [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
+    ## nix-vector.h (module 'network'): void ns3::NixVector::SetEpoch(uint32_t epoch) [member function]
+    cls.add_method('SetEpoch', 
+                   'void', 
+                   [param('uint32_t', 'epoch')])
     return
 
 def register_Ns3Node_methods(root_module, cls):
@@ -9964,10 +9980,11 @@
                    'uint32_t', 
                    [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) const [member function]
     cls.add_method('SetNixVector', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')], 
+                   is_const=True)
     ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
     cls.add_method('ToString', 
                    'std::string', 
@@ -9980,7 +9997,7 @@
     cls.add_constructor([param('ns3::PacketSink const &', 'arg0')])
     ## packet-sink.h (module 'applications'): ns3::PacketSink::PacketSink() [constructor]
     cls.add_constructor([])
-    ## packet-sink.h (module 'applications'): std::list<ns3::Ptr<ns3::Socket>, std::allocator<ns3::Ptr<ns3::Socket> > > ns3::PacketSink::GetAcceptedSockets() const [member function]
+    ## packet-sink.h (module 'applications'): std::list<ns3::Ptr<ns3::Socket>, std::allocator<ns3::Ptr<ns3::Socket>>> ns3::PacketSink::GetAcceptedSockets() const [member function]
     cls.add_method('GetAcceptedSockets', 
                    'std::list< ns3::Ptr< ns3::Socket > >', 
                    [], 
@@ -11633,7 +11650,7 @@
     cls.add_constructor([param('ns3::ReceiveListErrorModel const &', 'arg0')])
     ## error-model.h (module 'network'): ns3::ReceiveListErrorModel::ReceiveListErrorModel() [constructor]
     cls.add_constructor([])
-    ## error-model.h (module 'network'): std::list<unsigned int, std::allocator<unsigned int> > ns3::ReceiveListErrorModel::GetList() const [member function]
+    ## error-model.h (module 'network'): std::list<unsigned int, std::allocator<unsigned int>> ns3::ReceiveListErrorModel::GetList() const [member function]
     cls.add_method('GetList', 
                    'std::list< unsigned int >', 
                    [], 
@@ -11643,7 +11660,7 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## error-model.h (module 'network'): void ns3::ReceiveListErrorModel::SetList(std::list<unsigned int, std::allocator<unsigned int> > const & packetlist) [member function]
+    ## error-model.h (module 'network'): void ns3::ReceiveListErrorModel::SetList(std::list<unsigned int, std::allocator<unsigned int>> const & packetlist) [member function]
     cls.add_method('SetList', 
                    'void', 
                    [param('std::list< unsigned int > const &', 'packetlist')])
@@ -11751,7 +11768,7 @@
                    'ns3::Ptr< ns3::Node >', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## simple-net-device.h (module 'network'): ns3::Ptr<ns3::Queue<ns3::Packet> > ns3::SimpleNetDevice::GetQueue() const [member function]
+    ## simple-net-device.h (module 'network'): ns3::Ptr<ns3::Queue<ns3::Packet>> ns3::SimpleNetDevice::GetQueue() const [member function]
     cls.add_method('GetQueue', 
                    'ns3::Ptr< ns3::Queue< ns3::Packet > >', 
                    [], 
@@ -11834,7 +11851,7 @@
                    'void', 
                    [param('ns3::Callback< bool, ns3::Ptr< ns3::NetDevice >, ns3::Ptr< ns3::Packet const >, unsigned short, ns3::Address const &, ns3::Address const &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty >', 'cb')], 
                    is_virtual=True)
-    ## simple-net-device.h (module 'network'): void ns3::SimpleNetDevice::SetQueue(ns3::Ptr<ns3::Queue<ns3::Packet> > queue) [member function]
+    ## simple-net-device.h (module 'network'): void ns3::SimpleNetDevice::SetQueue(ns3::Ptr<ns3::Queue<ns3::Packet>> queue) [member function]
     cls.add_method('SetQueue', 
                    'void', 
                    [param('ns3::Ptr< ns3::Queue< ns3::Packet > >', 'queue')])
@@ -12546,10 +12563,10 @@
                    'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, const std::basic_string<char> &, const std::basic_string<char> &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const & arg0, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const & arg1) [member operator]
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, const std::basic_string<char> &, const std::basic_string<char> &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(std::basic_string<char, std::char_traits<char>, std::allocator<char>> const & arg0, std::basic_string<char, std::char_traits<char>, std::allocator<char>> const & arg1) [member operator]
     cls.add_method('operator()', 
                    'void', 
-                   [param('std::string const &', 'arg0'), param('std::string const &', 'arg1')], 
+                   [param('std::basic_string< char, std::char_traits< char >, std::allocator< char > > const &', 'arg0'), param('std::basic_string< char, std::char_traits< char >, std::allocator< char > > const &', 'arg1')], 
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     cls.add_copy_constructor()
     return
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/applications/bindings/modulegen__gcc_LP64.py ns-3.36/src/applications/bindings/modulegen__gcc_LP64.py
--- ns-3.35/src/applications/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/applications/bindings/modulegen__gcc_LP64.py	2022-04-30 18:23:57.774733000 -0700
@@ -113,6 +113,8 @@
     module.add_class('DelayJitterEstimation', import_from_module='ns.network')
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'], import_from_module='ns.core')
     ## hash.h (module 'core'): ns3::Hasher [class]
     module.add_class('Hasher', import_from_module='ns.core')
     ## inet6-socket-address.h (module 'network'): ns3::Inet6SocketAddress [class]
@@ -178,8 +180,6 @@
     typehandlers.add_type_alias('std::vector< ns3::Ptr< ns3::Node > > const_iterator', 'ns3::NodeList::Iterator')
     typehandlers.add_type_alias('std::vector< ns3::Ptr< ns3::Node > > const_iterator*', 'ns3::NodeList::Iterator*')
     typehandlers.add_type_alias('std::vector< ns3::Ptr< ns3::Node > > const_iterator&', 'ns3::NodeList::Iterator&')
-    ## non-copyable.h (module 'core'): ns3::NonCopyable [class]
-    module.add_class('NonCopyable', destructor_visibility='protected', import_from_module='ns.core')
     ## object-base.h (module 'core'): ns3::ObjectBase [class]
     module.add_class('ObjectBase', allow_subclassing=True, import_from_module='ns.core')
     ## object.h (module 'core'): ns3::ObjectDeleter [struct]
@@ -367,37 +367,37 @@
     module.add_class('SeqTsSizeHeader', parent=root_module['ns3::SeqTsHeader'])
     ## random-variable-stream.h (module 'core'): ns3::SequentialRandomVariable [class]
     module.add_class('SequentialRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::OutputStreamWrapper', 'ns3::empty', 'ns3::DefaultDeleter<ns3::OutputStreamWrapper>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbAddressBlock, ns3::empty, ns3::DefaultDeleter<ns3::PbbAddressBlock> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbAddressBlock, ns3::empty, ns3::DefaultDeleter<ns3::PbbAddressBlock>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::PbbAddressBlock', 'ns3::empty', 'ns3::DefaultDeleter<ns3::PbbAddressBlock>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbMessage, ns3::empty, ns3::DefaultDeleter<ns3::PbbMessage> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbMessage, ns3::empty, ns3::DefaultDeleter<ns3::PbbMessage>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::PbbMessage', 'ns3::empty', 'ns3::DefaultDeleter<ns3::PbbMessage>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbPacket, ns3::Header, ns3::DefaultDeleter<ns3::PbbPacket> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbPacket, ns3::Header, ns3::DefaultDeleter<ns3::PbbPacket>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::Header'], template_parameters=['ns3::PbbPacket', 'ns3::Header', 'ns3::DefaultDeleter<ns3::PbbPacket>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbTlv, ns3::empty, ns3::DefaultDeleter<ns3::PbbTlv> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbTlv, ns3::empty, ns3::DefaultDeleter<ns3::PbbTlv>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::PbbTlv', 'ns3::empty', 'ns3::DefaultDeleter<ns3::PbbTlv>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::QueueItem', 'ns3::empty', 'ns3::DefaultDeleter<ns3::QueueItem>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ThreeGppHttpServerTxBuffer, ns3::empty, ns3::DefaultDeleter<ns3::ThreeGppHttpServerTxBuffer> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ThreeGppHttpServerTxBuffer, ns3::empty, ns3::DefaultDeleter<ns3::ThreeGppHttpServerTxBuffer>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::ThreeGppHttpServerTxBuffer', 'ns3::empty', 'ns3::DefaultDeleter<ns3::ThreeGppHttpServerTxBuffer>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
     ## sll-header.h (module 'network'): ns3::SllHeader [class]
     module.add_class('SllHeader', import_from_module='ns.network', parent=root_module['ns3::Header'])
@@ -835,7 +835,7 @@
     ## queue-item.h (module 'network'): ns3::QueueDiscItem [class]
     module.add_class('QueueDiscItem', import_from_module='ns.network', parent=root_module['ns3::QueueItem'])
     module.add_container('std::vector< unsigned char >', 'unsigned char', container_type='vector')
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     module.add_container('std::list< ns3::Ptr< ns3::Packet > >', 'ns3::Ptr< ns3::Packet >', container_type='list')
     module.add_container('std::vector< ns3::Ipv6Address >', 'ns3::Ipv6Address', container_type='vector')
     module.add_container('std::list< unsigned int >', 'unsigned int', container_type='list')
@@ -1060,7 +1060,6 @@
     register_Ns3NetDeviceContainer_methods(root_module, root_module['ns3::NetDeviceContainer'])
     register_Ns3NodeContainer_methods(root_module, root_module['ns3::NodeContainer'])
     register_Ns3NodeList_methods(root_module, root_module['ns3::NodeList'])
-    register_Ns3NonCopyable_methods(root_module, root_module['ns3::NonCopyable'])
     register_Ns3ObjectBase_methods(root_module, root_module['ns3::ObjectBase'])
     register_Ns3ObjectDeleter_methods(root_module, root_module['ns3::ObjectDeleter'])
     register_Ns3ObjectFactory_methods(root_module, root_module['ns3::ObjectFactory'])
@@ -1594,7 +1593,7 @@
     cls.add_method('PushByte', 
                    'void', 
                    [param('uint8_t', 'byte')])
-    ## bit-deserializer.h (module 'network'): void ns3::BitDeserializer::PushBytes(std::vector<unsigned char, std::allocator<unsigned char> > bytes) [member function]
+    ## bit-deserializer.h (module 'network'): void ns3::BitDeserializer::PushBytes(std::vector<unsigned char, std::allocator<unsigned char>> bytes) [member function]
     cls.add_method('PushBytes', 
                    'void', 
                    [param('std::vector< unsigned char >', 'bytes')])
@@ -1609,7 +1608,7 @@
     cls.add_constructor([param('ns3::BitSerializer const &', 'arg0')])
     ## bit-serializer.h (module 'network'): ns3::BitSerializer::BitSerializer() [constructor]
     cls.add_constructor([])
-    ## bit-serializer.h (module 'network'): std::vector<unsigned char, std::allocator<unsigned char> > ns3::BitSerializer::GetBytes() [member function]
+    ## bit-serializer.h (module 'network'): std::vector<unsigned char, std::allocator<unsigned char>> ns3::BitSerializer::GetBytes() [member function]
     cls.add_method('GetBytes', 
                    'std::vector< unsigned char >', 
                    [])
@@ -3424,12 +3423,6 @@
                    is_static=True)
     return
 
-def register_Ns3NonCopyable_methods(root_module, cls):
-    ## non-copyable.h (module 'core'): ns3::NonCopyable::NonCopyable() [constructor]
-    cls.add_constructor([], 
-                        visibility='protected')
-    return
-
 def register_Ns3ObjectBase_methods(root_module, cls):
     ## object-base.h (module 'core'): ns3::ObjectBase::ObjectBase() [constructor]
     cls.add_constructor([])
@@ -3509,6 +3502,8 @@
     cls.add_constructor([param('ns3::ObjectFactory const &', 'arg0')])
     ## object-factory.h (module 'core'): ns3::ObjectFactory::ObjectFactory() [constructor]
     cls.add_constructor([])
+    ## object-factory.h (module 'core'): ns3::ObjectFactory::ObjectFactory(std::string const & typeId) [constructor]
+    cls.add_constructor([param('std::string const &', 'typeId')])
     ## object-factory.h (module 'core'): ns3::Ptr<ns3::Object> ns3::ObjectFactory::Create() const [member function]
     cls.add_method('Create', 
                    'ns3::Ptr< ns3::Object >', 
@@ -4304,6 +4299,10 @@
     cls.add_constructor([param('ns3::SimpleNetDeviceHelper const &', 'arg0')])
     ## simple-net-device-helper.h (module 'network'): ns3::SimpleNetDeviceHelper::SimpleNetDeviceHelper() [constructor]
     cls.add_constructor([])
+    ## simple-net-device-helper.h (module 'network'): void ns3::SimpleNetDeviceHelper::DisableFlowControl() [member function]
+    cls.add_method('DisableFlowControl', 
+                   'void', 
+                   [])
     ## simple-net-device-helper.h (module 'network'): ns3::NetDeviceContainer ns3::SimpleNetDeviceHelper::Install(ns3::Ptr<ns3::Node> node) const [member function]
     cls.add_method('Install', 
                    'ns3::NetDeviceContainer', 
@@ -4917,8 +4916,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -5276,14 +5275,14 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('>=')
     cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_unary_numeric_operator('-')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
     cls.add_constructor([])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(double const value) [constructor]
@@ -5302,6 +5301,8 @@
     cls.add_constructor([param('long unsigned int const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int const v) [constructor]
     cls.add_constructor([param('long long unsigned int const', 'v')])
+    ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int128_t const v) [constructor]
+    cls.add_constructor([param('int128_t const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t const hi, uint64_t const lo) [constructor]
     cls.add_constructor([param('int64_t const', 'hi'), param('uint64_t const', 'lo')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [constructor]
@@ -5638,7 +5639,7 @@
     cls.add_method('AddPacket', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet >', 'packet')])
-    ## packet-burst.h (module 'network'): std::list<ns3::Ptr<ns3::Packet>, std::allocator<ns3::Ptr<ns3::Packet> > >::const_iterator ns3::PacketBurst::Begin() const [member function]
+    ## packet-burst.h (module 'network'): std::list<ns3::Ptr<ns3::Packet>, std::allocator<ns3::Ptr<ns3::Packet>>>::const_iterator ns3::PacketBurst::Begin() const [member function]
     cls.add_method('Begin', 
                    'std::list< ns3::Ptr< ns3::Packet > > const_iterator', 
                    [], 
@@ -5648,7 +5649,7 @@
                    'ns3::Ptr< ns3::PacketBurst >', 
                    [], 
                    is_const=True)
-    ## packet-burst.h (module 'network'): std::list<ns3::Ptr<ns3::Packet>, std::allocator<ns3::Ptr<ns3::Packet> > >::const_iterator ns3::PacketBurst::End() const [member function]
+    ## packet-burst.h (module 'network'): std::list<ns3::Ptr<ns3::Packet>, std::allocator<ns3::Ptr<ns3::Packet>>>::const_iterator ns3::PacketBurst::End() const [member function]
     cls.add_method('End', 
                    'std::list< ns3::Ptr< ns3::Packet > > const_iterator', 
                    [], 
@@ -5658,7 +5659,7 @@
                    'uint32_t', 
                    [], 
                    is_const=True)
-    ## packet-burst.h (module 'network'): std::list<ns3::Ptr<ns3::Packet>, std::allocator<ns3::Ptr<ns3::Packet> > > ns3::PacketBurst::GetPackets() const [member function]
+    ## packet-burst.h (module 'network'): std::list<ns3::Ptr<ns3::Packet>, std::allocator<ns3::Ptr<ns3::Packet>>> ns3::PacketBurst::GetPackets() const [member function]
     cls.add_method('GetPackets', 
                    'std::list< ns3::Ptr< ns3::Packet > >', 
                    [], 
@@ -5903,6 +5904,11 @@
     cls.add_method('SetMaxSize', 
                    'void', 
                    [param('ns3::QueueSize', 'size')])
+    ## queue.h (module 'network'): bool ns3::QueueBase::WouldOverflow(uint32_t nPackets, uint32_t nBytes) const [member function]
+    cls.add_method('WouldOverflow', 
+                   'bool', 
+                   [param('uint32_t', 'nPackets'), param('uint32_t', 'nBytes')], 
+                   is_const=True)
     return
 
 def register_Ns3QueueLimits_methods(root_module, cls):
@@ -6267,114 +6273,114 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3OutputStreamWrapper_Ns3Empty_Ns3DefaultDeleter__lt__ns3OutputStreamWrapper__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter< ns3::OutputStreamWrapper > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3PbbAddressBlock_Ns3Empty_Ns3DefaultDeleter__lt__ns3PbbAddressBlock__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbAddressBlock, ns3::empty, ns3::DefaultDeleter<ns3::PbbAddressBlock> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbAddressBlock, ns3::empty, ns3::DefaultDeleter<ns3::PbbAddressBlock>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbAddressBlock, ns3::empty, ns3::DefaultDeleter<ns3::PbbAddressBlock> >::SimpleRefCount(ns3::SimpleRefCount<ns3::PbbAddressBlock, ns3::empty, ns3::DefaultDeleter<ns3::PbbAddressBlock> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbAddressBlock, ns3::empty, ns3::DefaultDeleter<ns3::PbbAddressBlock>>::SimpleRefCount(ns3::SimpleRefCount<ns3::PbbAddressBlock, ns3::empty, ns3::DefaultDeleter<ns3::PbbAddressBlock>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::PbbAddressBlock, ns3::empty, ns3::DefaultDeleter< ns3::PbbAddressBlock > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3PbbMessage_Ns3Empty_Ns3DefaultDeleter__lt__ns3PbbMessage__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbMessage, ns3::empty, ns3::DefaultDeleter<ns3::PbbMessage> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbMessage, ns3::empty, ns3::DefaultDeleter<ns3::PbbMessage>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbMessage, ns3::empty, ns3::DefaultDeleter<ns3::PbbMessage> >::SimpleRefCount(ns3::SimpleRefCount<ns3::PbbMessage, ns3::empty, ns3::DefaultDeleter<ns3::PbbMessage> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbMessage, ns3::empty, ns3::DefaultDeleter<ns3::PbbMessage>>::SimpleRefCount(ns3::SimpleRefCount<ns3::PbbMessage, ns3::empty, ns3::DefaultDeleter<ns3::PbbMessage>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::PbbMessage, ns3::empty, ns3::DefaultDeleter< ns3::PbbMessage > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3PbbPacket_Ns3Header_Ns3DefaultDeleter__lt__ns3PbbPacket__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbPacket, ns3::Header, ns3::DefaultDeleter<ns3::PbbPacket> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbPacket, ns3::Header, ns3::DefaultDeleter<ns3::PbbPacket>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbPacket, ns3::Header, ns3::DefaultDeleter<ns3::PbbPacket> >::SimpleRefCount(ns3::SimpleRefCount<ns3::PbbPacket, ns3::Header, ns3::DefaultDeleter<ns3::PbbPacket> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbPacket, ns3::Header, ns3::DefaultDeleter<ns3::PbbPacket>>::SimpleRefCount(ns3::SimpleRefCount<ns3::PbbPacket, ns3::Header, ns3::DefaultDeleter<ns3::PbbPacket>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::PbbPacket, ns3::Header, ns3::DefaultDeleter< ns3::PbbPacket > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3PbbTlv_Ns3Empty_Ns3DefaultDeleter__lt__ns3PbbTlv__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbTlv, ns3::empty, ns3::DefaultDeleter<ns3::PbbTlv> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbTlv, ns3::empty, ns3::DefaultDeleter<ns3::PbbTlv>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbTlv, ns3::empty, ns3::DefaultDeleter<ns3::PbbTlv> >::SimpleRefCount(ns3::SimpleRefCount<ns3::PbbTlv, ns3::empty, ns3::DefaultDeleter<ns3::PbbTlv> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbTlv, ns3::empty, ns3::DefaultDeleter<ns3::PbbTlv>>::SimpleRefCount(ns3::SimpleRefCount<ns3::PbbTlv, ns3::empty, ns3::DefaultDeleter<ns3::PbbTlv>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::PbbTlv, ns3::empty, ns3::DefaultDeleter< ns3::PbbTlv > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3QueueItem_Ns3Empty_Ns3DefaultDeleter__lt__ns3QueueItem__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> >::SimpleRefCount(ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>>::SimpleRefCount(ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::QueueItem, ns3::empty, ns3::DefaultDeleter< ns3::QueueItem > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3ThreeGppHttpServerTxBuffer_Ns3Empty_Ns3DefaultDeleter__lt__ns3ThreeGppHttpServerTxBuffer__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ThreeGppHttpServerTxBuffer, ns3::empty, ns3::DefaultDeleter<ns3::ThreeGppHttpServerTxBuffer> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ThreeGppHttpServerTxBuffer, ns3::empty, ns3::DefaultDeleter<ns3::ThreeGppHttpServerTxBuffer>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ThreeGppHttpServerTxBuffer, ns3::empty, ns3::DefaultDeleter<ns3::ThreeGppHttpServerTxBuffer> >::SimpleRefCount(ns3::SimpleRefCount<ns3::ThreeGppHttpServerTxBuffer, ns3::empty, ns3::DefaultDeleter<ns3::ThreeGppHttpServerTxBuffer> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ThreeGppHttpServerTxBuffer, ns3::empty, ns3::DefaultDeleter<ns3::ThreeGppHttpServerTxBuffer>>::SimpleRefCount(ns3::SimpleRefCount<ns3::ThreeGppHttpServerTxBuffer, ns3::empty, ns3::DefaultDeleter<ns3::ThreeGppHttpServerTxBuffer>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::ThreeGppHttpServerTxBuffer, ns3::empty, ns3::DefaultDeleter< ns3::ThreeGppHttpServerTxBuffer > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
@@ -6552,7 +6558,7 @@
                    'uint8_t', 
                    [param('uint8_t', 'ipTos')], 
                    is_static=True)
-    ## socket.h (module 'network'): void ns3::Socket::Ipv6JoinGroup(ns3::Ipv6Address address, ns3::Socket::Ipv6MulticastFilterMode filterMode, std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address> > sourceAddresses) [member function]
+    ## socket.h (module 'network'): void ns3::Socket::Ipv6JoinGroup(ns3::Ipv6Address address, ns3::Socket::Ipv6MulticastFilterMode filterMode, std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address>> sourceAddresses) [member function]
     cls.add_method('Ipv6JoinGroup', 
                    'void', 
                    [param('ns3::Ipv6Address', 'address'), param('ns3::Socket::Ipv6MulticastFilterMode', 'filterMode'), param('std::vector< ns3::Ipv6Address >', 'sourceAddresses')], 
@@ -7890,17 +7896,17 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::QueueDiscItem const> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::Socket> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::Socket> '], visibility='protected')
+                   is_static=True, template_parameters=['bool'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['bool'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::QueueDiscItem const> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
@@ -9008,7 +9014,7 @@
     cls.add_constructor([param('ns3::ListErrorModel const &', 'arg0')])
     ## error-model.h (module 'network'): ns3::ListErrorModel::ListErrorModel() [constructor]
     cls.add_constructor([])
-    ## error-model.h (module 'network'): std::list<unsigned int, std::allocator<unsigned int> > ns3::ListErrorModel::GetList() const [member function]
+    ## error-model.h (module 'network'): std::list<unsigned int, std::allocator<unsigned int>> ns3::ListErrorModel::GetList() const [member function]
     cls.add_method('GetList', 
                    'std::list< unsigned int >', 
                    [], 
@@ -9018,7 +9024,7 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## error-model.h (module 'network'): void ns3::ListErrorModel::SetList(std::list<unsigned int, std::allocator<unsigned int> > const & packetlist) [member function]
+    ## error-model.h (module 'network'): void ns3::ListErrorModel::SetList(std::list<unsigned int, std::allocator<unsigned int>> const & packetlist) [member function]
     cls.add_method('SetList', 
                    'void', 
                    [param('std::list< unsigned int > const &', 'packetlist')])
@@ -9534,10 +9540,16 @@
     cls.add_method('ExtractNeighborIndex', 
                    'uint32_t', 
                    [param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetEpoch() const [member function]
+    cls.add_method('GetEpoch', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() const [member function]
     cls.add_method('GetRemainingBits', 
                    'uint32_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -9548,6 +9560,10 @@
                    'uint32_t', 
                    [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
+    ## nix-vector.h (module 'network'): void ns3::NixVector::SetEpoch(uint32_t epoch) [member function]
+    cls.add_method('SetEpoch', 
+                   'void', 
+                   [param('uint32_t', 'epoch')])
     return
 
 def register_Ns3Node_methods(root_module, cls):
@@ -9964,10 +9980,11 @@
                    'uint32_t', 
                    [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) const [member function]
     cls.add_method('SetNixVector', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')], 
+                   is_const=True)
     ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
     cls.add_method('ToString', 
                    'std::string', 
@@ -9980,7 +9997,7 @@
     cls.add_constructor([param('ns3::PacketSink const &', 'arg0')])
     ## packet-sink.h (module 'applications'): ns3::PacketSink::PacketSink() [constructor]
     cls.add_constructor([])
-    ## packet-sink.h (module 'applications'): std::list<ns3::Ptr<ns3::Socket>, std::allocator<ns3::Ptr<ns3::Socket> > > ns3::PacketSink::GetAcceptedSockets() const [member function]
+    ## packet-sink.h (module 'applications'): std::list<ns3::Ptr<ns3::Socket>, std::allocator<ns3::Ptr<ns3::Socket>>> ns3::PacketSink::GetAcceptedSockets() const [member function]
     cls.add_method('GetAcceptedSockets', 
                    'std::list< ns3::Ptr< ns3::Socket > >', 
                    [], 
@@ -11633,7 +11650,7 @@
     cls.add_constructor([param('ns3::ReceiveListErrorModel const &', 'arg0')])
     ## error-model.h (module 'network'): ns3::ReceiveListErrorModel::ReceiveListErrorModel() [constructor]
     cls.add_constructor([])
-    ## error-model.h (module 'network'): std::list<unsigned int, std::allocator<unsigned int> > ns3::ReceiveListErrorModel::GetList() const [member function]
+    ## error-model.h (module 'network'): std::list<unsigned int, std::allocator<unsigned int>> ns3::ReceiveListErrorModel::GetList() const [member function]
     cls.add_method('GetList', 
                    'std::list< unsigned int >', 
                    [], 
@@ -11643,7 +11660,7 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## error-model.h (module 'network'): void ns3::ReceiveListErrorModel::SetList(std::list<unsigned int, std::allocator<unsigned int> > const & packetlist) [member function]
+    ## error-model.h (module 'network'): void ns3::ReceiveListErrorModel::SetList(std::list<unsigned int, std::allocator<unsigned int>> const & packetlist) [member function]
     cls.add_method('SetList', 
                    'void', 
                    [param('std::list< unsigned int > const &', 'packetlist')])
@@ -11751,7 +11768,7 @@
                    'ns3::Ptr< ns3::Node >', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## simple-net-device.h (module 'network'): ns3::Ptr<ns3::Queue<ns3::Packet> > ns3::SimpleNetDevice::GetQueue() const [member function]
+    ## simple-net-device.h (module 'network'): ns3::Ptr<ns3::Queue<ns3::Packet>> ns3::SimpleNetDevice::GetQueue() const [member function]
     cls.add_method('GetQueue', 
                    'ns3::Ptr< ns3::Queue< ns3::Packet > >', 
                    [], 
@@ -11834,7 +11851,7 @@
                    'void', 
                    [param('ns3::Callback< bool, ns3::Ptr< ns3::NetDevice >, ns3::Ptr< ns3::Packet const >, unsigned short, ns3::Address const &, ns3::Address const &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty >', 'cb')], 
                    is_virtual=True)
-    ## simple-net-device.h (module 'network'): void ns3::SimpleNetDevice::SetQueue(ns3::Ptr<ns3::Queue<ns3::Packet> > queue) [member function]
+    ## simple-net-device.h (module 'network'): void ns3::SimpleNetDevice::SetQueue(ns3::Ptr<ns3::Queue<ns3::Packet>> queue) [member function]
     cls.add_method('SetQueue', 
                    'void', 
                    [param('ns3::Ptr< ns3::Queue< ns3::Packet > >', 'queue')])
@@ -12546,10 +12563,10 @@
                    'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, const std::basic_string<char> &, const std::basic_string<char> &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const & arg0, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const & arg1) [member operator]
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, const std::basic_string<char> &, const std::basic_string<char> &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(std::basic_string<char, std::char_traits<char>, std::allocator<char>> const & arg0, std::basic_string<char, std::char_traits<char>, std::allocator<char>> const & arg1) [member operator]
     cls.add_method('operator()', 
                    'void', 
-                   [param('std::string const &', 'arg0'), param('std::string const &', 'arg1')], 
+                   [param('std::basic_string< char, std::char_traits< char >, std::allocator< char > > const &', 'arg0'), param('std::basic_string< char, std::char_traits< char >, std::allocator< char > > const &', 'arg1')], 
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     cls.add_copy_constructor()
     return
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/applications/CMakeLists.txt ns-3.36/src/applications/CMakeLists.txt
--- ns-3.35/src/applications/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/applications/CMakeLists.txt	2022-04-30 18:23:57.770733000 -0700
@@ -0,0 +1,57 @@
+build_lib(
+  LIBNAME applications
+  SOURCE_FILES
+    helper/bulk-send-helper.cc
+    helper/on-off-helper.cc
+    helper/packet-sink-helper.cc
+    helper/three-gpp-http-helper.cc
+    helper/udp-client-server-helper.cc
+    helper/udp-echo-helper.cc
+    model/application-packet-probe.cc
+    model/bulk-send-application.cc
+    model/onoff-application.cc
+    model/packet-loss-counter.cc
+    model/packet-sink.cc
+    model/seq-ts-echo-header.cc
+    model/seq-ts-header.cc
+    model/seq-ts-size-header.cc
+    model/three-gpp-http-client.cc
+    model/three-gpp-http-header.cc
+    model/three-gpp-http-server.cc
+    model/three-gpp-http-variables.cc
+    model/udp-client.cc
+    model/udp-echo-client.cc
+    model/udp-echo-server.cc
+    model/udp-server.cc
+    model/udp-trace-client.cc
+  HEADER_FILES
+    helper/bulk-send-helper.h
+    helper/on-off-helper.h
+    helper/packet-sink-helper.h
+    helper/three-gpp-http-helper.h
+    helper/udp-client-server-helper.h
+    helper/udp-echo-helper.h
+    model/application-packet-probe.h
+    model/bulk-send-application.h
+    model/onoff-application.h
+    model/packet-loss-counter.h
+    model/packet-sink.h
+    model/seq-ts-echo-header.h
+    model/seq-ts-header.h
+    model/seq-ts-size-header.h
+    model/three-gpp-http-client.h
+    model/three-gpp-http-header.h
+    model/three-gpp-http-server.h
+    model/three-gpp-http-variables.h
+    model/udp-client.h
+    model/udp-echo-client.h
+    model/udp-echo-server.h
+    model/udp-server.h
+    model/udp-trace-client.h
+  LIBRARIES_TO_LINK ${libinternet}
+                    ${libstats}
+  TEST_SOURCES
+    test/three-gpp-http-client-server-test.cc
+    test/bulk-send-application-test-suite.cc
+    test/udp-client-server-test.cc
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/applications/doc/applications.rst ns-3.36/src/applications/doc/applications.rst
--- ns-3.35/src/applications/doc/applications.rst	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/applications/doc/applications.rst	2022-04-30 18:23:57.774733000 -0700
@@ -211,7 +211,7 @@
 For an example demonstrating HTTP applications
 run::
 
-  $ ./waf --run 'three-gpp-http-example'
+  $ ./ns3 run 'three-gpp-http-example'
 
 By default, the example will print out the web page requests of the client and responses of the 
 server and client receiving content packets by using LOG_INFO of ``ThreeGppHttpServer`` and ``ThreeGppHttpClient``. 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/applications/examples/CMakeLists.txt ns-3.36/src/applications/examples/CMakeLists.txt
--- ns-3.35/src/applications/examples/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/applications/examples/CMakeLists.txt	2022-04-30 18:23:57.774733000 -0700
@@ -0,0 +1,9 @@
+build_lib_example(
+  NAME three-gpp-http-example
+  SOURCE_FILES three-gpp-http-example.cc
+  LIBRARIES_TO_LINK
+    ${libapplications}
+    ${libpoint-to-point}
+    ${libinternet}
+    ${libnetwork}
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/applications/examples/wscript ns-3.36/src/applications/examples/wscript
--- ns-3.35/src/applications/examples/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/applications/examples/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,8 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    if not bld.env['ENABLE_EXAMPLES']:
-        return;
-
-    obj = bld.create_ns3_program('three-gpp-http-example', ['applications','point-to-point','internet','network'])
-    obj.source = 'three-gpp-http-example.cc'
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/applications/model/three-gpp-http-client.cc ns-3.36/src/applications/model/three-gpp-http-client.cc
--- ns-3.35/src/applications/model/three-gpp-http-client.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/applications/model/three-gpp-http-client.cc	2022-04-30 18:23:57.778733300 -0700
@@ -33,7 +33,6 @@
 #include <ns3/tcp-socket-factory.h>
 #include <ns3/inet-socket-address.h>
 #include <ns3/inet6-socket-address.h>
-#include <ns3/unused.h>
 
 
 NS_LOG_COMPONENT_DEFINE ("ThreeGppHttpClient");
@@ -380,7 +379,7 @@
       m_socket = Socket::CreateSocket (GetNode (),
                                        TcpSocketFactory::GetTypeId ());
 
-      int ret;
+      [[maybe_unused]] int ret;
 
       if (Ipv4Address::IsMatchingType (m_remoteServerAddress))
         {
@@ -415,7 +414,6 @@
                              << " GetErrNo= " << m_socket->GetErrno () << ".");
         }
 
-      NS_UNUSED (ret); // Mute compiler warning.
       NS_ASSERT_MSG (m_socket != 0, "Failed creating socket.");
 
       SwitchToState (CONNECTING);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/applications/model/three-gpp-http-server.cc ns-3.36/src/applications/model/three-gpp-http-server.cc
--- ns-3.35/src/applications/model/three-gpp-http-server.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/applications/model/three-gpp-http-server.cc	2022-04-30 18:23:57.778733300 -0700
@@ -34,7 +34,6 @@
 #include <ns3/tcp-socket-factory.h>
 #include <ns3/inet-socket-address.h>
 #include <ns3/inet6-socket-address.h>
-#include <ns3/unused.h>
 
 
 NS_LOG_COMPONENT_DEFINE ("ThreeGppHttpServer");
@@ -223,7 +222,7 @@
                                                   TcpSocketFactory::GetTypeId ());
           m_initialSocket->SetAttribute ("SegmentSize", UintegerValue (m_mtuSize));
 
-          int ret;
+          [[maybe_unused]] int ret;
 
           if (Ipv4Address::IsMatchingType (m_localAddress))
             {
@@ -257,7 +256,6 @@
                              << " GetErrNo= " << m_initialSocket->GetErrno ()
                              << ".");
 
-          NS_UNUSED (ret);
 
         } // end of `if (m_initialSocket == 0)`
 
@@ -491,8 +489,8 @@
 
   if (!m_txBuffer->IsBufferEmpty (socket))
     {
-      const uint32_t txBufferSize = m_txBuffer->GetBufferSize (socket);
-      const uint32_t actualSent = ServeFromTxBuffer (socket);
+      [[maybe_unused]] const uint32_t txBufferSize = m_txBuffer->GetBufferSize (socket);
+      [[maybe_unused]] const uint32_t actualSent = ServeFromTxBuffer (socket);
 
 #ifdef NS3_LOG_ENABLE
       // Some log messages.
@@ -530,10 +528,6 @@
         }
 #endif /* NS3_LOG_ENABLE */
 
-      // Mute compiler warnings.
-      NS_UNUSED (txBufferSize);
-      NS_UNUSED (actualSent);
-
     } // end of `if (m_txBuffer->IsBufferEmpty (socket))`
 
 } // end of `void SendCallback (Ptr<Socket> socket, uint32_t availableBufferSize)`
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/applications/wscript ns-3.36/src/applications/wscript
--- ns-3.35/src/applications/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/applications/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,75 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    module = bld.create_ns3_module('applications', ['internet', 'stats'])
-    module.source = [
-        'model/bulk-send-application.cc',
-        'model/onoff-application.cc',
-        'model/packet-sink.cc',
-        'model/udp-client.cc',
-        'model/udp-server.cc',
-        'model/seq-ts-header.cc',
-        'model/seq-ts-size-header.cc',
-        'model/seq-ts-echo-header.cc',
-        'model/udp-trace-client.cc',
-        'model/packet-loss-counter.cc',
-        'model/udp-echo-client.cc',
-        'model/udp-echo-server.cc',
-        'model/application-packet-probe.cc',
-        'model/three-gpp-http-client.cc',
-        'model/three-gpp-http-server.cc',
-        'model/three-gpp-http-header.cc',
-        'model/three-gpp-http-variables.cc', 
-        'helper/bulk-send-helper.cc',
-        'helper/on-off-helper.cc',
-        'helper/packet-sink-helper.cc',
-        'helper/udp-client-server-helper.cc',
-        'helper/udp-echo-helper.cc',
-        'helper/three-gpp-http-helper.cc',
-        ]
-
-    applications_test = bld.create_ns3_module_test_library('applications')
-    applications_test.source = [
-        'test/three-gpp-http-client-server-test.cc', 
-        'test/bulk-send-application-test-suite.cc',
-        'test/udp-client-server-test.cc'
-        ]
-
-    # Tests encapsulating example programs should be listed here
-    if (bld.env['ENABLE_EXAMPLES']):
-        applications_test.source.extend([
-        #   'test/applications-examples-test-suite.cc',
-            ])
-    
-    headers = bld(features='ns3header')
-    headers.module = 'applications'
-    headers.source = [
-        'model/bulk-send-application.h',
-        'model/onoff-application.h',
-        'model/packet-sink.h',
-        'model/udp-client.h',
-        'model/udp-server.h',
-        'model/seq-ts-header.h',
-        'model/seq-ts-size-header.h',
-        'model/seq-ts-echo-header.h',
-        'model/udp-trace-client.h',
-        'model/packet-loss-counter.h',
-        'model/udp-echo-client.h',
-        'model/udp-echo-server.h',
-        'model/application-packet-probe.h',
-        'model/three-gpp-http-client.h',
-        'model/three-gpp-http-server.h',
-        'model/three-gpp-http-header.h',
-        'model/three-gpp-http-variables.h',
-        'helper/bulk-send-helper.h',
-        'helper/on-off-helper.h',
-        'helper/packet-sink-helper.h',
-        'helper/udp-client-server-helper.h',
-        'helper/udp-echo-helper.h',
-        'helper/three-gpp-http-helper.h'
-        ]
-    
-    if (bld.env['ENABLE_EXAMPLES']):
-        bld.recurse('examples')
-
-    bld.ns3_python_bindings()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/bridge/bindings/modulegen__gcc_ILP32.py ns-3.36/src/bridge/bindings/modulegen__gcc_ILP32.py
--- ns-3.35/src/bridge/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/bridge/bindings/modulegen__gcc_ILP32.py	2022-04-30 18:23:57.778733300 -0700
@@ -69,6 +69,8 @@
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::TraceSourceAccessor'])
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'], import_from_module='ns.core')
     ## hash.h (module 'core'): ns3::Hasher [class]
     module.add_class('Hasher', import_from_module='ns.core')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
@@ -174,23 +176,23 @@
     module.add_class('Object', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter >'])
     ## object.h (module 'core'): ns3::Object::AggregateIterator [class]
     module.add_class('AggregateIterator', import_from_module='ns.core', outer_class=root_module['ns3::Object'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
     module.add_class('TraceSourceAccessor', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >'])
@@ -293,7 +295,7 @@
     module.add_class('BridgeNetDevice', parent=root_module['ns3::NetDevice'])
     ## callback.h (module 'core'): ns3::CallbackImpl<ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['ns3::ObjectBase *', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )', 'ns3::TimePrinter')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )*', 'ns3::TimePrinter*')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )&', 'ns3::TimePrinter&')
@@ -2504,8 +2506,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -2728,14 +2730,14 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('>=')
     cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_unary_numeric_operator('-')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
     cls.add_constructor([])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(double const value) [constructor]
@@ -2754,6 +2756,8 @@
     cls.add_constructor([param('long unsigned int const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int const v) [constructor]
     cls.add_constructor([param('long long unsigned int const', 'v')])
+    ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int128_t const v) [constructor]
+    cls.add_constructor([param('int128_t const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t const hi, uint64_t const lo) [constructor]
     cls.add_constructor([param('int64_t const', 'hi'), param('uint64_t const', 'lo')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [constructor]
@@ -2938,65 +2942,65 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
@@ -3715,10 +3719,16 @@
     cls.add_method('ExtractNeighborIndex', 
                    'uint32_t', 
                    [param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetEpoch() const [member function]
+    cls.add_method('GetEpoch', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() const [member function]
     cls.add_method('GetRemainingBits', 
                    'uint32_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -3729,6 +3739,10 @@
                    'uint32_t', 
                    [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
+    ## nix-vector.h (module 'network'): void ns3::NixVector::SetEpoch(uint32_t epoch) [member function]
+    cls.add_method('SetEpoch', 
+                   'void', 
+                   [param('uint32_t', 'epoch')])
     return
 
 def register_Ns3ObjectFactoryChecker_methods(root_module, cls):
@@ -3959,10 +3973,11 @@
                    'uint32_t', 
                    [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) const [member function]
     cls.add_method('SetNixVector', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')], 
+                   is_const=True)
     ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
     cls.add_method('ToString', 
                    'std::string', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/bridge/bindings/modulegen__gcc_LP64.py ns-3.36/src/bridge/bindings/modulegen__gcc_LP64.py
--- ns-3.35/src/bridge/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/bridge/bindings/modulegen__gcc_LP64.py	2022-04-30 18:23:57.778733300 -0700
@@ -69,6 +69,8 @@
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::TraceSourceAccessor'])
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'], import_from_module='ns.core')
     ## hash.h (module 'core'): ns3::Hasher [class]
     module.add_class('Hasher', import_from_module='ns.core')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
@@ -174,23 +176,23 @@
     module.add_class('Object', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter >'])
     ## object.h (module 'core'): ns3::Object::AggregateIterator [class]
     module.add_class('AggregateIterator', import_from_module='ns.core', outer_class=root_module['ns3::Object'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
     module.add_class('TraceSourceAccessor', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >'])
@@ -293,7 +295,7 @@
     module.add_class('BridgeNetDevice', parent=root_module['ns3::NetDevice'])
     ## callback.h (module 'core'): ns3::CallbackImpl<ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['ns3::ObjectBase *', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )', 'ns3::TimePrinter')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )*', 'ns3::TimePrinter*')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )&', 'ns3::TimePrinter&')
@@ -2504,8 +2506,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -2728,14 +2730,14 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('>=')
     cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_unary_numeric_operator('-')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
     cls.add_constructor([])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(double const value) [constructor]
@@ -2754,6 +2756,8 @@
     cls.add_constructor([param('long unsigned int const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int const v) [constructor]
     cls.add_constructor([param('long long unsigned int const', 'v')])
+    ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int128_t const v) [constructor]
+    cls.add_constructor([param('int128_t const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t const hi, uint64_t const lo) [constructor]
     cls.add_constructor([param('int64_t const', 'hi'), param('uint64_t const', 'lo')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [constructor]
@@ -2938,65 +2942,65 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
@@ -3715,10 +3719,16 @@
     cls.add_method('ExtractNeighborIndex', 
                    'uint32_t', 
                    [param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetEpoch() const [member function]
+    cls.add_method('GetEpoch', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() const [member function]
     cls.add_method('GetRemainingBits', 
                    'uint32_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -3729,6 +3739,10 @@
                    'uint32_t', 
                    [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
+    ## nix-vector.h (module 'network'): void ns3::NixVector::SetEpoch(uint32_t epoch) [member function]
+    cls.add_method('SetEpoch', 
+                   'void', 
+                   [param('uint32_t', 'epoch')])
     return
 
 def register_Ns3ObjectFactoryChecker_methods(root_module, cls):
@@ -3959,10 +3973,11 @@
                    'uint32_t', 
                    [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) const [member function]
     cls.add_method('SetNixVector', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')], 
+                   is_const=True)
     ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
     cls.add_method('ToString', 
                    'std::string', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/bridge/CMakeLists.txt ns-3.36/src/bridge/CMakeLists.txt
--- ns-3.35/src/bridge/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/bridge/CMakeLists.txt	2022-04-30 18:23:57.778733300 -0700
@@ -0,0 +1,13 @@
+build_lib(
+  LIBNAME bridge
+  SOURCE_FILES
+    helper/bridge-helper.cc
+    model/bridge-channel.cc
+    model/bridge-net-device.cc
+  HEADER_FILES
+    helper/bridge-helper.h
+    model/bridge-channel.h
+    model/bridge-net-device.h
+  LIBRARIES_TO_LINK ${libnetwork}
+  TEST_SOURCES ${test_sources}
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/bridge/examples/CMakeLists.txt ns-3.36/src/bridge/examples/CMakeLists.txt
--- ns-3.35/src/bridge/examples/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/bridge/examples/CMakeLists.txt	2022-04-30 18:23:57.778733300 -0700
@@ -0,0 +1,19 @@
+build_lib_example(
+  NAME csma-bridge
+  SOURCE_FILES csma-bridge.cc
+  LIBRARIES_TO_LINK
+    ${libbridge}
+    ${libcsma}
+    ${libinternet}
+    ${libapplications}
+)
+
+build_lib_example(
+  NAME csma-bridge-one-hop
+  SOURCE_FILES csma-bridge-one-hop.cc
+  LIBRARIES_TO_LINK
+    ${libbridge}
+    ${libcsma}
+    ${libinternet}
+    ${libapplications}
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/bridge/examples/wscript ns-3.36/src/bridge/examples/wscript
--- ns-3.35/src/bridge/examples/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/bridge/examples/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,12 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-
-    obj = bld.create_ns3_program('csma-bridge', ['bridge', 'csma', 'internet', 'applications'])
-    obj.source = 'csma-bridge.cc'
-
-    bld.register_ns3_script('csma-bridge.py', ['bridge', 'csma', 'internet', 'applications'])
-
-    obj = bld.create_ns3_program('csma-bridge-one-hop', ['bridge', 'csma', 'internet', 'applications'])
-    obj.source = 'csma-bridge-one-hop.cc'
-
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/bridge/model/bridge-channel.h ns-3.36/src/bridge/model/bridge-channel.h
--- ns-3.35/src/bridge/model/bridge-channel.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/bridge/model/bridge-channel.h	2022-04-30 18:23:57.778733300 -0700
@@ -50,6 +50,10 @@
   BridgeChannel ();
   virtual ~BridgeChannel ();
 
+  // Delete copy constructor and assignment operator to avoid misuse
+  BridgeChannel (const BridgeChannel &) = delete;
+  BridgeChannel & operator = (const BridgeChannel &) = delete;
+
   /**
    * Adds a channel to the bridged pool
    * \param bridgedChannel  the channel to add to the pool
@@ -61,24 +65,7 @@
   virtual Ptr<NetDevice> GetDevice (std::size_t i) const;
 
 private:
-
-  /**
-   * \brief Copy constructor
-   *
-   * Defined and unimplemented to avoid misuse
-   */
-  BridgeChannel (const BridgeChannel &);
-
-  /**
-   * \brief Copy constructor
-   *
-   * Defined and unimplemented to avoid misuse
-   * \returns
-   */
-  BridgeChannel &operator = (const BridgeChannel &);
-
   std::vector< Ptr<Channel> > m_bridgedChannels; //!< pool of bridged channels
-
 };
 
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/bridge/model/bridge-net-device.h ns-3.36/src/bridge/model/bridge-net-device.h
--- ns-3.35/src/bridge/model/bridge-net-device.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/bridge/model/bridge-net-device.h	2022-04-30 18:23:57.782733200 -0700
@@ -79,6 +79,10 @@
   BridgeNetDevice ();
   virtual ~BridgeNetDevice ();
 
+  // Delete copy constructor and assignment operator to avoid misuse
+  BridgeNetDevice (const BridgeNetDevice &) = delete;
+  BridgeNetDevice & operator = (const BridgeNetDevice &) = delete;
+
   /** 
    * \brief Add a 'port' to a bridge device
    * \param bridgePort the NetDevice to add
@@ -87,7 +91,6 @@
    * the new bridge port NetDevice becomes part of the bridge and L2
    * frames start being forwarded to/from this NetDevice.
    *
-   * \param bridgePort NetDevice
    * \attention The netdevice that is being added as bridge port must
    * _not_ have an IP address.  In order to add IP connectivity to a
    * bridging node you must enable IP on the BridgeNetDevice itself,
@@ -187,21 +190,6 @@
   Ptr<NetDevice> GetLearnedState (Mac48Address source);
 
 private:
-  /**
-   * \brief Copy constructor
-   *
-   * Defined and unimplemented to avoid misuse
-   */
-  BridgeNetDevice (const BridgeNetDevice &);
-
-  /**
-   * \brief Copy constructor
-   *
-   * Defined and unimplemented to avoid misuse
-   * \returns
-   */
-  BridgeNetDevice &operator = (const BridgeNetDevice &);
-
   NetDevice::ReceiveCallback m_rxCallback; //!< receive callback
   NetDevice::PromiscReceiveCallback m_promiscRxCallback; //!< promiscuous receive callback
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/bridge/wscript ns-3.36/src/bridge/wscript
--- ns-3.35/src/bridge/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/bridge/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,21 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    obj = bld.create_ns3_module('bridge', ['network'])
-    obj.source = [
-        'model/bridge-net-device.cc',
-        'model/bridge-channel.cc',
-        'helper/bridge-helper.cc',
-        ]
-    headers = bld(features='ns3header')
-    headers.module = 'bridge'
-    headers.source = [
-        'model/bridge-net-device.h',
-        'model/bridge-channel.h',
-        'helper/bridge-helper.h',
-        ]
-
-    if bld.env['ENABLE_EXAMPLES']:
-        bld.recurse('examples')
-
-    bld.ns3_python_bindings()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/brite/CMakeLists.txt ns-3.36/src/brite/CMakeLists.txt
--- ns-3.35/src/brite/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/brite/CMakeLists.txt	2022-04-30 18:23:57.782733200 -0700
@@ -0,0 +1,50 @@
+set(NS3_WITH_BRITE
+    ""
+    CACHE PATH
+          "Build with brite support"
+)
+set(NS3_BRITE
+    "OFF"
+    CACHE INTERNAL
+          "ON if Brite is found in NS3_WITH_BRITE"
+)
+
+find_external_library(
+  DEPENDENCY_NAME brite
+  HEADER_NAME Brite.h
+  LIBRARY_NAME brite
+  SEARCH_PATHS ${NS3_WITH_BRITE}
+)
+
+if((NOT
+    brite_FOUND)
+   OR (NOT
+       ${brite_FOUND})
+)
+  message(
+    ${HIGHLIGHTED_STATUS}
+    "Skipping src/brite"
+  )
+  return()
+endif()
+
+# Only process module if include folder and library have been found
+include_directories(${brite_INCLUDE_DIRS})
+set(NS3_BRITE
+    "ON"
+    CACHE INTERNAL
+          "ON if Brite is found in NS3_WITH_BRITE"
+)
+
+build_lib(
+  LIBNAME brite
+  SOURCE_FILES helper/brite-topology-helper.cc
+  HEADER_FILES helper/brite-topology-helper.h
+  LIBRARIES_TO_LINK
+    ${libnetwork}
+    ${libcore}
+    ${libinternet}
+    ${libpoint-to-point}
+    ${brite_LIBRARIES}
+  TEST_SOURCES test/brite-test-topology.cc
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/brite/doc/brite.rst ns-3.36/src/brite/doc/brite.rst
--- ns-3.35/src/brite/doc/brite.rst	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/brite/doc/brite.rst	2022-04-30 18:23:57.782733200 -0700
@@ -97,7 +97,7 @@
 Once BRITE has been built successfully, we proceed to configure ns-3 with 
 BRITE support. Change to your ns-3 directory::
 
-  $ ./waf configure --with-brite=/your/path/to/brite/source --enable-examples
+  $ ./ns3 configure --with-brite=/your/path/to/brite/source --enable-examples
 
 Make sure it says 'enabled' beside 'BRITE Integration'. If it does not, then 
 something has gone wrong. Either you have forgotten to build BRITE first 
@@ -105,14 +105,14 @@
 
 Next, build ns-3::
 
-  $ ./waf
+  $ ./ns3
 
 Examples
 ========
 For an example demonstrating BRITE integration
 run::
 
-  $ ./waf --run 'brite-generic-example'
+  $ ./ns3 run 'brite-generic-example'
 
 By enabling the verbose parameter, the example will print out the node and 
 edge information in a similar format to standard BRITE output. There are 
@@ -133,13 +133,13 @@
 The generic BRITE example also support visualization using pyviz, assuming
 python bindings in ns-3 are enabled::
 
-  $ ./waf --run brite-generic-example --vis
+  $ ./ns3 run brite-generic-example --vis
   
 Simulations involving BRITE can also be used with MPI.  The total number of MPI instances is 
 passed to the BRITE topology helper where a modulo divide is used to assign the nodes for each 
 AS to a MPI instance.  An example can be found in src/brite/examples::
 
-  $ mpirun -np 2 ./waf --run brite-MPI-example
+  $ mpirun -np 2 ./ns3 run brite-MPI-example
 	
 Please see the ns-3 MPI documentation for information on setting up MPI with ns-3.
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/brite/examples/CMakeLists.txt ns-3.36/src/brite/examples/CMakeLists.txt
--- ns-3.35/src/brite/examples/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/brite/examples/CMakeLists.txt	2022-04-30 18:23:57.782733200 -0700
@@ -0,0 +1,29 @@
+build_lib_example(
+  NAME brite-generic-example
+  SOURCE_FILES brite-generic-example.cc
+  LIBRARIES_TO_LINK
+    ${libbrite}
+    ${libinternet}
+    ${libpoint-to-point}
+    ${libnix-vector-routing}
+    ${libapplications}
+)
+
+if(${ENABLE_MPI})
+  build_lib_example(
+    NAME brite-MPI-example
+    SOURCE_FILES brite-MPI-example.cc
+    LIBRARIES_TO_LINK
+      ${libbrite}
+      ${libinternet}
+      ${libpoint-to-point}
+      ${libnix-vector-routing}
+      ${libapplications}
+      ${libmpi}
+      ${MPI_CXX_LIBRARIES}
+  )
+  target_include_directories(
+    brite-MPI-example
+    PUBLIC ${MPI_CXX_INCLUDE_DIRS}
+  )
+endif()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/brite/examples/wscript ns-3.36/src/brite/examples/wscript
--- ns-3.35/src/brite/examples/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/brite/examples/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,7 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-   obj = bld.create_ns3_program('brite-generic-example', ['brite', 'internet', 'point-to-point', 'nix-vector-routing', 'applications'])
-   obj.source = 'brite-generic-example.cc'
-   obj = bld.create_ns3_program('brite-MPI-example', ['brite', 'internet', 'point-to-point', 'nix-vector-routing', 'applications', 'mpi'])
-   obj.source = 'brite-MPI-example.cc'   
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/brite/helper/brite-topology-helper.h ns-3.36/src/brite/helper/brite-topology-helper.h
--- ns-3.35/src/brite/helper/brite-topology-helper.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/brite/helper/brite-topology-helper.h	2022-04-30 18:23:57.782733200 -0700
@@ -44,6 +44,12 @@
 
 /**
  * \ingroup brite
+ * \ingroup tests
+ * \defgroup brite-tests BRITE module tests
+ */
+
+/**
+ * \ingroup brite
  * \brief Interface with BRITE, the Boston university Representative Internet
  *        Topology gEnerator
  *
@@ -73,7 +79,7 @@
   /**
    * Construct a BriteTopologyHelper using NS3 to generate seed values
    * need by BRITE
-   *
+   * \param confFile a BRITE configuration file
    */
   BriteTopologyHelper (std::string confFile);
 
@@ -134,60 +140,63 @@
    * Returns a given router node for a given AS
    *
    * \param asNum the AS number
+   * \param nodeNum the Node number
    * \return the specified node
    *
    */
   Ptr<Node> GetNodeForAs (uint32_t asNum, uint32_t nodeNum);
 
   /**
-    * Returns the number of AS created in the topology
-    *
-    * \returns the number of AS created in the topology
-    */
+   * Returns the number of AS created in the topology
+   *
+   * \returns the number of AS created in the topology
+   */
   uint32_t GetNAs (void) const;
 
   /**
-    * Returns the system number for the MPI instance that this AS is assigned to.  Will always return 0 if MPI not used
-    *
-    * \returns The system number that the specified AS number belongs to
-    *
-    * param asNum The AS Number
-    */
+   * Returns the system number for the MPI instance that this AS is assigned to.  Will always return 0 if MPI not used
+   *
+   * \returns The system number that the specified AS number belongs to
+   *
+   * \param asNum The AS Number
+   */
   uint32_t GetSystemNumberForAs (uint32_t asNum) const;
 
   /**
-    * \param address an Ipv4AddressHelper which is used to install
-    *                Ipv4 addresses on all the node interfaces in
-    *                the topology
-    */
+   * \param address an Ipv4AddressHelper which is used to install
+   *                IPv4 addresses on all the node interfaces in
+   *                the topology
+   */
   void AssignIpv4Addresses (Ipv4AddressHelper& address);
 
   /**
-    * \param network an IPv6 address representing the network portion
-    *                of the IPv6 Address
-    * \param prefix the prefix length
-    */
+   * \param address an Ipv6AddressHelper which is used to install
+   *                IPv6 addresses on all the node interfaces in
+   *                the topology
+   */
   void AssignIpv6Addresses (Ipv6AddressHelper& address);
 
   /**
-    * Returns the number of nodes created within
-    * the topology
-    *
-    * \returns the total number of nodes within the brite topology
-    */
+   * Returns the number of nodes created within
+   * the topology
+   *
+   * \returns the total number of nodes within the brite topology
+   */
   uint32_t GetNNodesTopology () const;
 
   /**
-    * Returns the number of edges created within
-    * the topology
-    *
-    * \returns the total number of edges within the brite topology
-    */
+   * Returns the number of edges created within
+   * the topology
+   *
+   * \returns the total number of edges within the brite topology
+   */
   uint32_t GetNEdgesTopology () const;
 
 private:
-  //brite values are unitless however all examples provided use mbps to specify rate
-  //this constant value is used to convert the mbps provided by brite to bps.
+  /**
+   * brite values are unitless however all examples provided use mbps to specify rate
+   * this constant value is used to convert the mbps provided by brite to bps.
+   */
   static const int mbpsToBps = 1000000;
 
   /**
@@ -199,13 +208,13 @@
    */
   struct BriteNodeInfo
   {
-    int nodeId;
-    double xCoordinate;
-    double yCoordinate;
-    int inDegree;
-    int outDegree;
-    int asId;
-    std::string type;
+    int nodeId;           //!< Node ID
+    double xCoordinate;   //!< X coordinate
+    double yCoordinate;   //!< Y coordinate
+    int inDegree;         //!< Ingress (IN) degree
+    int outDegree;        //!< Egress (OUT) degree
+    int asId;             //!< AS ID
+    std::string type;     //!< Node type
   };
 
   /**
@@ -217,23 +226,27 @@
    */
   struct BriteEdgeInfo
   {
-    int edgeId;
-    int srcId;
-    int destId;
-    double length;
-    double delay;
-    double bandwidth;
-    int asFrom;
-    int asTo;
-    std::string type;
+    int edgeId;         //!< Edge ID
+    int srcId;          //!< Src node ID
+    int destId;         //!< Dst node ID
+    double length;      //!< Length
+    double delay;       //!< Delay
+    double bandwidth;   //!< Bandwidth
+    int asFrom;         //!< Originating AS
+    int asTo;           //!< Destination AS
+    std::string type;   //!< Edge type
   };
 
-  //stores all of the nodes used in the BRITE generated topology
+  /// stores all of the nodes used in the BRITE generated topology
   NodeContainer m_nodes;
 
+  /// Build the Node Info list
   void BuildBriteNodeInfoList (void);
+  /// Build the Edge Info list
   void BuildBriteEdgeInfoList (void);
+  /// Construct the topology.
   void ConstructTopology (void);
+  /// Generate the BRITE topology.
   void GenerateBriteTopology (void);
 
   /// brite configuration file to use
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/brite/test/brite-test-topology.cc ns-3.36/src/brite/test/brite-test-topology.cc
--- ns-3.35/src/brite/test/brite-test-topology.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/brite/test/brite-test-topology.cc	2022-04-30 18:23:57.782733200 -0700
@@ -31,6 +31,14 @@
 
 using namespace ns3;
 
+/**
+ * \ingroup brite-tests
+ *
+ * \brief BRITE topology structure Test
+ * 
+ * Test that two brite topologies created with same seed value 
+ * produce same graph (not an exact test)
+ */
 class BriteTopologyStructureTestCase : public TestCase
 {
 public:
@@ -86,6 +94,13 @@
     }
 }
 
+/**
+ * \ingroup brite-tests
+ *
+ * \brief BRITE topology function Test
+ * 
+ * Test that packets can be send across a BRITE topology using UDP
+ */
 class BriteTopologyFunctionTestCase : public TestCase
 {
 public:
@@ -187,6 +202,11 @@
 
 }
 
+/**
+ * \ingroup brite-tests
+ *
+ * \brief BRITE TestSuite
+ */
 class BriteTestSuite : public TestSuite
 {
 public:
@@ -195,4 +215,7 @@
     AddTestCase (new BriteTopologyStructureTestCase, TestCase::QUICK);
     AddTestCase (new BriteTopologyFunctionTestCase, TestCase::QUICK);
   }
-} g_briteTestSuite;
+};
+
+ /// Static variable for test initialization
+static BriteTestSuite g_briteTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/brite/wscript ns-3.36/src/brite/wscript
--- ns-3.35/src/brite/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/brite/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,116 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-import os
-
-from waflib import Options
-
-
-def options(opt):
-    opt.add_option('--with-brite',
-                   help=('Use BRITE integration support, given by the indicated path,'
-                         ' to allow the use of the BRITE topology generator'),
-                   default=False, dest='with_brite')
-
-def configure(conf):
-    conf.env['ENABLE_BRITE'] = False
-
-    lib_to_check = 'libbrite.so'
-    if Options.options.with_brite:
-        conf.msg("Checking BRITE location", ("%s (given)" % Options.options.with_brite))
-        brite_dir = Options.options.with_brite
-        if os.path.exists(os.path.join(brite_dir, lib_to_check)):
-            conf.env['WITH_BRITE'] = os.path.abspath(Options.options.with_brite)
-            conf.env['ENABLE_BRITE'] = True
-        else:
-            conf.report_optional_feature("brite", "BRITE Integration", False,
-                                 "BRITE not found at requested location")
-            # Add this module to the list of modules that won't be built
-            # if they are enabled.
-            conf.env['MODULES_NOT_BUILT'].append('brite')
-            return
-    else:
-        # No user specified '--with-brite' option, try to guess
-        # bake.py uses ../../build, while ns-3-dev uses ../BRITE
-        brite_dir = os.path.join('..','BRITE')
-        brite_bake_build_dir = os.path.join('..', '..', 'build') 
-        brite_bake_lib_dir = os.path.join(brite_bake_build_dir, 'lib')
-        if os.path.exists(os.path.join(brite_dir, lib_to_check)):
-            conf.msg("Checking for BRITE location", ("%s (guessed)" % brite_dir))
-            conf.env['WITH_BRITE'] = os.path.abspath(brite_dir)
-            conf.env['ENABLE_BRITE'] = True
-# Below is not yet ready (bake does not install BRITE yet, just builds it)
-#        elif os.path.exists(os.path.join(brite_bake_lib_dir, lib_to_check)):
-#            conf.msg("Checking for BRITE location", ("%s (guessed)" % brite_bake_lib_dir))
-#            conf.env['WITH_BRITE'] = os.path.abspath(brite_bake_lib_dir)
-        else:
-            conf.report_optional_feature("brite", "BRITE Integration", False, 'BRITE not enabled (see option --with-brite)')
-
-            # Add this module to the list of modules that won't be built
-            # if they are enabled.
-            conf.env['MODULES_NOT_BUILT'].append('brite')
-            return
-
-    test_code = '''
-#include "Brite.h"
-
-int main()
-{
-  return 0;
-}
-'''
-
-    conf.env['HAVE_DL'] = conf.check(mandatory=True, lib='dl', define_name='HAVE_DL', uselib_store='DL')
-
-    conf.env['LIBPATH_BRITE'] = [os.path.abspath(os.path.join(conf.env['WITH_BRITE'], '.'))]
-
-    conf.env['INCLUDES_BRITE'] = [
-            os.path.abspath(os.path.join(conf.env['WITH_BRITE'],'.')),
-            os.path.abspath(os.path.join(conf.env['WITH_BRITE'],'Models'))
-            ]
-
-    conf.env['DEFINES_BRITE'] = ['NS3_BRITE']
-
-    conf.env['BRITE'] = conf.check(fragment=test_code, lib='brite', libpath=conf.env['LIBPATH_BRITE'], uselib='BRITE')
-
-    # This statement will get LD_LIBRARY_PATH set correctly when waf needs
-    # to load the brite shared library.
-    conf.env.append_value('NS3_MODULE_PATH',os.path.abspath(os.path.join(conf.env['WITH_BRITE'], '.')))
-
-    conf.report_optional_feature("brite", "BRITE Integration",
-                                          conf.env['BRITE'], "BRITE library not found")
-
-def build(bld):
-    # Don't do anything for this module if brite's not enabled.
-    if 'brite' in bld.env['MODULES_NOT_BUILT']:
-        return
-
-    module = bld.create_ns3_module('brite', ['network', 'core', 'internet', 'point-to-point'])
-    module.source = [
-        ]
-
-    module_test = bld.create_ns3_module_test_library('brite')
-    module_test.source = [
-        ]
-
-    # Tests encapsulating example programs should be listed here
-    if (bld.env['ENABLE_EXAMPLES']):
-        module_test.source.extend([
-        #   'test/brite-examples-test-suite.cc',
-            ])
-    
-    if bld.env['BRITE'] and bld.env['HAVE_DL']:
-        module.use.extend(['BRITE', 'DL'])
-        module_test.use.extend(['BRITE', 'DL'])
-
-    headers = bld(features='ns3header')
-    headers.module = 'brite'
-    headers.source = [
-        ]
-
-    if bld.env['ENABLE_BRITE']:
-        module.source.append ('helper/brite-topology-helper.cc')
-        headers.source.append ('helper/brite-topology-helper.h')
-        module_test.source.append('test/brite-test-topology.cc')
-
-    if bld.env['ENABLE_EXAMPLES'] and bld.env['ENABLE_BRITE']:
-        bld.recurse('examples')
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/buildings/bindings/modulegen__gcc_ILP32.py ns-3.36/src/buildings/bindings/modulegen__gcc_ILP32.py
--- ns-3.35/src/buildings/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/buildings/bindings/modulegen__gcc_ILP32.py	2022-04-30 18:23:57.782733200 -0700
@@ -91,6 +91,8 @@
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::TraceSourceAccessor'])
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'], import_from_module='ns.core')
     ## hash.h (module 'core'): ns3::Hasher [class]
     module.add_class('Hasher', import_from_module='ns.core')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
@@ -228,23 +230,23 @@
     module.add_class('SameRoomPositionAllocator', parent=root_module['ns3::PositionAllocator'])
     ## random-variable-stream.h (module 'core'): ns3::SequentialRandomVariable [class]
     module.add_class('SequentialRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
     ## propagation-loss-model.h (module 'propagation'): ns3::ThreeLogDistancePropagationLossModel [class]
     module.add_class('ThreeLogDistancePropagationLossModel', import_from_module='ns.propagation', parent=root_module['ns3::PropagationLossModel'])
@@ -484,7 +486,7 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'const ns3::Address &', 'const ns3::Address &', 'ns3::NetDevice::PacketType', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     typehandlers.add_type_alias('ns3::Vector3D', 'ns3::Vector')
     typehandlers.add_type_alias('ns3::Vector3D*', 'ns3::Vector*')
     typehandlers.add_type_alias('ns3::Vector3D&', 'ns3::Vector&')
@@ -3034,8 +3036,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -3324,14 +3326,14 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('>=')
     cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_unary_numeric_operator('-')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
     cls.add_constructor([])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(double const value) [constructor]
@@ -3350,6 +3352,8 @@
     cls.add_constructor([param('long unsigned int const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int const v) [constructor]
     cls.add_constructor([param('long long unsigned int const', 'v')])
+    ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int128_t const v) [constructor]
+    cls.add_constructor([param('int128_t const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t const hi, uint64_t const lo) [constructor]
     cls.add_constructor([param('int64_t const', 'hi'), param('uint64_t const', 'lo')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [constructor]
@@ -3580,16 +3584,16 @@
     cls.add_method('AssignStreams', 
                    'int64_t', 
                    [param('int64_t', 'stream')])
+    ## propagation-loss-model.h (module 'propagation'): int64_t ns3::PropagationLossModel::DoAssignStreams(int64_t stream) [member function]
+    cls.add_method('DoAssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')], 
+                   is_pure_virtual=True, is_virtual=True, visibility='protected')
     ## propagation-loss-model.h (module 'propagation'): double ns3::PropagationLossModel::DoCalcRxPower(double txPowerDbm, ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
     cls.add_method('DoCalcRxPower', 
                    'double', 
                    [param('double', 'txPowerDbm'), param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
                    is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
-    ## propagation-loss-model.h (module 'propagation'): int64_t ns3::PropagationLossModel::DoAssignStreams(int64_t stream) [member function]
-    cls.add_method('DoAssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'stream')], 
-                   is_pure_virtual=True, is_virtual=True, visibility='private')
     return
 
 def register_Ns3RandomBoxPositionAllocator_methods(root_module, cls):
@@ -3894,65 +3898,65 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
@@ -4728,10 +4732,10 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## channel-condition-model.h (module 'propagation'): bool ns3::ChannelCondition::IsEqual(ns3::Ptr<const ns3::ChannelCondition> otherCondition) const [member function]
+    ## channel-condition-model.h (module 'propagation'): bool ns3::ChannelCondition::IsEqual(ns3::ChannelCondition::LosConditionValue losCondition, ns3::ChannelCondition::O2iConditionValue o2iCondition) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
-                   [param('ns3::Ptr< ns3::ChannelCondition const >', 'otherCondition')], 
+                   [param('ns3::ChannelCondition::LosConditionValue', 'losCondition'), param('ns3::ChannelCondition::O2iConditionValue', 'o2iCondition')], 
                    is_const=True)
     ## channel-condition-model.h (module 'propagation'): bool ns3::ChannelCondition::IsI2i() const [member function]
     cls.add_method('IsI2i', 
@@ -6041,10 +6045,16 @@
     cls.add_method('ExtractNeighborIndex', 
                    'uint32_t', 
                    [param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetEpoch() const [member function]
+    cls.add_method('GetEpoch', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() const [member function]
     cls.add_method('GetRemainingBits', 
                    'uint32_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -6055,6 +6065,10 @@
                    'uint32_t', 
                    [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
+    ## nix-vector.h (module 'network'): void ns3::NixVector::SetEpoch(uint32_t epoch) [member function]
+    cls.add_method('SetEpoch', 
+                   'void', 
+                   [param('uint32_t', 'epoch')])
     return
 
 def register_Ns3Node_methods(root_module, cls):
@@ -6467,10 +6481,11 @@
                    'uint32_t', 
                    [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) const [member function]
     cls.add_method('SetNixVector', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')], 
+                   is_const=True)
     ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
     cls.add_method('ToString', 
                    'std::string', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/buildings/bindings/modulegen__gcc_LP64.py ns-3.36/src/buildings/bindings/modulegen__gcc_LP64.py
--- ns-3.35/src/buildings/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/buildings/bindings/modulegen__gcc_LP64.py	2022-04-30 18:23:57.782733200 -0700
@@ -91,6 +91,8 @@
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::TraceSourceAccessor'])
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'], import_from_module='ns.core')
     ## hash.h (module 'core'): ns3::Hasher [class]
     module.add_class('Hasher', import_from_module='ns.core')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
@@ -228,23 +230,23 @@
     module.add_class('SameRoomPositionAllocator', parent=root_module['ns3::PositionAllocator'])
     ## random-variable-stream.h (module 'core'): ns3::SequentialRandomVariable [class]
     module.add_class('SequentialRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
     ## propagation-loss-model.h (module 'propagation'): ns3::ThreeLogDistancePropagationLossModel [class]
     module.add_class('ThreeLogDistancePropagationLossModel', import_from_module='ns.propagation', parent=root_module['ns3::PropagationLossModel'])
@@ -484,7 +486,7 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'const ns3::Address &', 'const ns3::Address &', 'ns3::NetDevice::PacketType', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     typehandlers.add_type_alias('ns3::Vector3D', 'ns3::Vector')
     typehandlers.add_type_alias('ns3::Vector3D*', 'ns3::Vector*')
     typehandlers.add_type_alias('ns3::Vector3D&', 'ns3::Vector&')
@@ -3034,8 +3036,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -3324,14 +3326,14 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('>=')
     cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_unary_numeric_operator('-')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
     cls.add_constructor([])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(double const value) [constructor]
@@ -3350,6 +3352,8 @@
     cls.add_constructor([param('long unsigned int const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int const v) [constructor]
     cls.add_constructor([param('long long unsigned int const', 'v')])
+    ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int128_t const v) [constructor]
+    cls.add_constructor([param('int128_t const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t const hi, uint64_t const lo) [constructor]
     cls.add_constructor([param('int64_t const', 'hi'), param('uint64_t const', 'lo')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [constructor]
@@ -3580,16 +3584,16 @@
     cls.add_method('AssignStreams', 
                    'int64_t', 
                    [param('int64_t', 'stream')])
+    ## propagation-loss-model.h (module 'propagation'): int64_t ns3::PropagationLossModel::DoAssignStreams(int64_t stream) [member function]
+    cls.add_method('DoAssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')], 
+                   is_pure_virtual=True, is_virtual=True, visibility='protected')
     ## propagation-loss-model.h (module 'propagation'): double ns3::PropagationLossModel::DoCalcRxPower(double txPowerDbm, ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
     cls.add_method('DoCalcRxPower', 
                    'double', 
                    [param('double', 'txPowerDbm'), param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
                    is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
-    ## propagation-loss-model.h (module 'propagation'): int64_t ns3::PropagationLossModel::DoAssignStreams(int64_t stream) [member function]
-    cls.add_method('DoAssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'stream')], 
-                   is_pure_virtual=True, is_virtual=True, visibility='private')
     return
 
 def register_Ns3RandomBoxPositionAllocator_methods(root_module, cls):
@@ -3894,65 +3898,65 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
@@ -4728,10 +4732,10 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## channel-condition-model.h (module 'propagation'): bool ns3::ChannelCondition::IsEqual(ns3::Ptr<const ns3::ChannelCondition> otherCondition) const [member function]
+    ## channel-condition-model.h (module 'propagation'): bool ns3::ChannelCondition::IsEqual(ns3::ChannelCondition::LosConditionValue losCondition, ns3::ChannelCondition::O2iConditionValue o2iCondition) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
-                   [param('ns3::Ptr< ns3::ChannelCondition const >', 'otherCondition')], 
+                   [param('ns3::ChannelCondition::LosConditionValue', 'losCondition'), param('ns3::ChannelCondition::O2iConditionValue', 'o2iCondition')], 
                    is_const=True)
     ## channel-condition-model.h (module 'propagation'): bool ns3::ChannelCondition::IsI2i() const [member function]
     cls.add_method('IsI2i', 
@@ -6041,10 +6045,16 @@
     cls.add_method('ExtractNeighborIndex', 
                    'uint32_t', 
                    [param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetEpoch() const [member function]
+    cls.add_method('GetEpoch', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() const [member function]
     cls.add_method('GetRemainingBits', 
                    'uint32_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -6055,6 +6065,10 @@
                    'uint32_t', 
                    [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
+    ## nix-vector.h (module 'network'): void ns3::NixVector::SetEpoch(uint32_t epoch) [member function]
+    cls.add_method('SetEpoch', 
+                   'void', 
+                   [param('uint32_t', 'epoch')])
     return
 
 def register_Ns3Node_methods(root_module, cls):
@@ -6467,10 +6481,11 @@
                    'uint32_t', 
                    [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) const [member function]
     cls.add_method('SetNixVector', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')], 
+                   is_const=True)
     ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
     cls.add_method('ToString', 
                    'std::string', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/buildings/CMakeLists.txt ns-3.36/src/buildings/CMakeLists.txt
--- ns-3.35/src/buildings/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/buildings/CMakeLists.txt	2022-04-30 18:23:57.782733200 -0700
@@ -0,0 +1,45 @@
+build_lib(
+  LIBNAME buildings
+  SOURCE_FILES
+    helper/building-allocator.cc
+    helper/building-container.cc
+    helper/building-position-allocator.cc
+    helper/buildings-helper.cc
+    model/building-list.cc
+    model/building.cc
+    model/buildings-channel-condition-model.cc
+    model/buildings-propagation-loss-model.cc
+    model/hybrid-buildings-propagation-loss-model.cc
+    model/itu-r-1238-propagation-loss-model.cc
+    model/mobility-building-info.cc
+    model/oh-buildings-propagation-loss-model.cc
+    model/random-walk-2d-outdoor-mobility-model.cc
+    model/three-gpp-v2v-channel-condition-model.cc
+  HEADER_FILES
+    helper/building-allocator.h
+    helper/building-container.h
+    helper/building-position-allocator.h
+    helper/buildings-helper.h
+    model/building-list.h
+    model/building.h
+    model/buildings-channel-condition-model.h
+    model/buildings-propagation-loss-model.h
+    model/hybrid-buildings-propagation-loss-model.h
+    model/itu-r-1238-propagation-loss-model.h
+    model/mobility-building-info.h
+    model/oh-buildings-propagation-loss-model.h
+    model/random-walk-2d-outdoor-mobility-model.h
+    model/three-gpp-v2v-channel-condition-model.h
+  LIBRARIES_TO_LINK
+    ${libmobility}
+    ${libpropagation}
+    ${libconfig-store}
+  TEST_SOURCES
+    test/building-position-allocator-test.cc
+    test/buildings-helper-test.cc
+    test/buildings-pathloss-test.cc
+    test/buildings-shadowing-test.cc
+    test/buildings-channel-condition-model-test.cc
+    test/outdoor-random-walk-test.cc
+    test/three-gpp-v2v-channel-condition-model-test.cc
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/buildings/doc/source/buildings-testing.rst ns-3.36/src/buildings/doc/source/buildings-testing.rst
--- ns-3.35/src/buildings/doc/source/buildings-testing.rst	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/buildings/doc/source/buildings-testing.rst	2022-04-30 18:23:57.782733200 -0700
@@ -10,7 +10,7 @@
 
 To test and validate the ns-3 Building Pathloss module, some test suites is provided which are integrated with the ns-3 test framework. To run them, you need to have configured the build of the simulator in this way::
 
-    $ ./waf configure --enable-tests --enable-modules=buildings
+    $ ./ns3 configure --enable-tests --enable-modules=buildings
     $ ./test.py
 
 The above will run not only the test suites belonging to the buildings module, but also those belonging to all the other ns-3 modules on which the buildings module depends. See the ns-3 manual for generic information on the testing framework.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/buildings/doc/source/conf.py ns-3.36/src/buildings/doc/source/conf.py
--- ns-3.35/src/buildings/doc/source/conf.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/buildings/doc/source/conf.py	2022-04-30 18:23:57.782733200 -0700
@@ -25,7 +25,7 @@
 
 # Add any Sphinx extension module names here, as strings. They can be extensions
 # coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
-extensions = ['sphinx.ext.pngmath', 
+extensions = ['sphinx.ext.imgmath', 
               'sphinxcontrib.seqdiag']
 
 # Add any paths that contain templates here, relative to this directory.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/buildings/examples/CMakeLists.txt ns-3.36/src/buildings/examples/CMakeLists.txt
--- ns-3.35/src/buildings/examples/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/buildings/examples/CMakeLists.txt	2022-04-30 18:23:57.782733200 -0700
@@ -0,0 +1,21 @@
+build_lib_example(
+  NAME buildings-pathloss-profiler
+  SOURCE_FILES buildings-pathloss-profiler.cc
+  LIBRARIES_TO_LINK
+    ${libcore}
+    ${libconfig-store}
+    ${libmobility}
+    ${libbuildings}
+)
+
+build_lib_example(
+  NAME outdoor-group-mobility-example
+  SOURCE_FILES outdoor-group-mobility-example.cc
+  LIBRARIES_TO_LINK ${libbuildings}
+)
+
+build_lib_example(
+  NAME outdoor-random-walk-example
+  SOURCE_FILES outdoor-random-walk-example.cc
+  LIBRARIES_TO_LINK ${libbuildings}
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/buildings/examples/wscript ns-3.36/src/buildings/examples/wscript
--- ns-3.35/src/buildings/examples/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/buildings/examples/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,12 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    obj = bld.create_ns3_program('buildings-pathloss-profiler',
-                                 ['buildings'])
-    obj.source = 'buildings-pathloss-profiler.cc'
-    obj = bld.create_ns3_program('outdoor-random-walk-example',
-                                 ['buildings'])
-    obj.source = 'outdoor-random-walk-example.cc'
-    obj = bld.create_ns3_program('outdoor-group-mobility-example',
-                                 ['mobility', 'network', 'buildings'])
-    obj.source = 'outdoor-group-mobility-example.cc'
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/buildings/helper/building-allocator.cc ns-3.36/src/buildings/helper/building-allocator.cc
--- ns-3.35/src/buildings/helper/building-allocator.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/buildings/helper/building-allocator.cc	2022-04-30 18:23:57.782733200 -0700
@@ -64,11 +64,11 @@
                    DoubleValue (0.0),
                    MakeDoubleAccessor (&GridBuildingAllocator::m_yMin),
                    MakeDoubleChecker<double> ())
-    .AddAttribute ("LengthX", " the length of the wall of each building along the X axis.",
+    .AddAttribute ("LengthX", "The length of the wall of each building along the X axis.",
                    DoubleValue (1.0),
                    MakeDoubleAccessor (&GridBuildingAllocator::m_lengthX),
                    MakeDoubleChecker<double> ())
-    .AddAttribute ("LengthY", " the length of the wall of each building along the X axis.",
+    .AddAttribute ("LengthY", "The length of the wall of each building along the X axis.",
                    DoubleValue (1.0),
                    MakeDoubleAccessor (&GridBuildingAllocator::m_lengthY),
                    MakeDoubleChecker<double> ())
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/buildings/helper/building-allocator.h ns-3.36/src/buildings/helper/building-allocator.h
--- ns-3.35/src/buildings/helper/building-allocator.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/buildings/helper/building-allocator.h	2022-04-30 18:23:57.782733200 -0700
@@ -47,7 +47,10 @@
   GridBuildingAllocator ();
   virtual ~GridBuildingAllocator ();
 
-  // inherited from Object
+  /**
+   * \brief Get the type ID.
+   * \return The object TypeId.
+   */
   static TypeId GetTypeId (void);
 
   /** 
@@ -68,22 +71,25 @@
   BuildingContainer Create (uint32_t n) const;
 
 private:
-
+  /**
+   * Pushes the attributes into the relevant position allocators
+   */
   void PushAttributes () const;
-  mutable uint32_t m_current;
-  enum GridPositionAllocator::LayoutType m_layoutType;
-  double m_xMin;
-  double m_yMin;
-  uint32_t m_n;
-  double m_lengthX;
-  double m_lengthY;
-  double m_deltaX;
-  double m_deltaY;
-  double m_height;
-
-  mutable ObjectFactory m_buildingFactory;
-  Ptr<GridPositionAllocator> m_lowerLeftPositionAllocator;
-  Ptr<GridPositionAllocator> m_upperRightPositionAllocator;
+
+  mutable uint32_t m_current; //!< current building number
+  enum GridPositionAllocator::LayoutType m_layoutType; //!< Layout type
+  double m_xMin;    //!< The x coordinate where the grid starts
+  double m_yMin;    //!< The y coordinate where the grid starts
+  uint32_t m_n;     //!< The number of objects laid out on a line
+  double m_lengthX; //!< The length of the wall of each building along the X axis.
+  double m_lengthY; //!< The length of the wall of each building along the Y axis.
+  double m_deltaX;  //!< The x space between buildings
+  double m_deltaY;  //!< The y space between buildings
+  double m_height;  //!< The height of the building (roof level)
+
+  mutable ObjectFactory m_buildingFactory; //!< The building factory
+  Ptr<GridPositionAllocator> m_lowerLeftPositionAllocator;  //!< The upper left position allocator
+  Ptr<GridPositionAllocator> m_upperRightPositionAllocator; //!< The upper right position allocator
   
 };
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/buildings/helper/building-container.h ns-3.36/src/buildings/helper/building-container.h
--- ns-3.35/src/buildings/helper/building-container.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/buildings/helper/building-container.h	2022-04-30 18:23:57.782733200 -0700
@@ -40,6 +40,7 @@
 class BuildingContainer
 {
 public:
+  /// Const iterator
   typedef std::vector<Ptr<Building> >::const_iterator Iterator;
 
   /**
@@ -200,7 +201,7 @@
   static BuildingContainer GetGlobal (void);
 
 private:
-  std::vector<Ptr<Building> > m_buildings;
+  std::vector<Ptr<Building> > m_buildings; //!< Building container
 };
 
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/buildings/helper/building-position-allocator.h ns-3.36/src/buildings/helper/building-position-allocator.h
--- ns-3.35/src/buildings/helper/building-position-allocator.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/buildings/helper/building-position-allocator.h	2022-04-30 18:23:57.782733200 -0700
@@ -35,14 +35,16 @@
 /**
  * Allocate each position by randomly choosing a building from the list
  * of all buildings, and then randomly choosing a position inside the building.
- * 
  */
 class RandomBuildingPositionAllocator : public PositionAllocator
 {
 public:
   RandomBuildingPositionAllocator ();
 
-  // inherited from Object
+  /**
+   * \brief Get the type ID.
+   * \return The object TypeId.
+   */
   static TypeId GetTypeId (void);
 
   // inherited from PositionAllocator
@@ -60,8 +62,8 @@
 
 private:
 
-  bool m_withReplacement;
-  mutable std::vector< Ptr<Building> > m_buildingListWithoutReplacement;
+  bool m_withReplacement; //!< If true, the building will be randomly selected with replacement
+  mutable std::vector< Ptr<Building> > m_buildingListWithoutReplacement; //!< List of building without replacement
 
   /// Provides uniform random variables.
   Ptr<UniformRandomVariable> m_rand;
@@ -86,7 +88,10 @@
 public:
   OutdoorPositionAllocator ();
 
-  // inherited from Object
+  /**
+   * \brief Get the type ID.
+   * \return The object TypeId.
+   */
   static TypeId GetTypeId (void);
 
   // inherited from PositionAllocator
@@ -137,7 +142,10 @@
 public:
   RandomRoomPositionAllocator ();
 
-  // inherited from Object
+  /**
+   * \brief Get the type ID.
+   * \return The object TypeId.
+   */
   static TypeId GetTypeId (void);
 
   // inherited from PositionAllocator
@@ -155,14 +163,17 @@
 
 private:
 
+  /**
+   * Room informations
+   */
   struct RoomInfo 
   {
-    Ptr<Building> b;
-    uint32_t roomx;
-    uint32_t roomy;
-    uint32_t floor;
+    Ptr<Building> b; //!< Building
+    uint32_t roomx;  //!< Room (x coord)
+    uint32_t roomy;  //!< Room (y coord)
+    uint32_t floor;  //!< Room (floor number)
   };
-  mutable std::vector<RoomInfo> m_roomListWithoutReplacement;
+  mutable std::vector<RoomInfo> m_roomListWithoutReplacement; //!< Container of rooms
 
   /// Provides uniform random variables.
   Ptr<UniformRandomVariable> m_rand;
@@ -179,9 +190,17 @@
 {
 public:
   SameRoomPositionAllocator ();
+
+  /**
+   * Constructor
+   * \param c Node container
+   */
   SameRoomPositionAllocator (NodeContainer c);
 
-  // inherited from Object
+  /**
+   * \brief Get the type ID.
+   * \return The object TypeId.
+   */
   static TypeId GetTypeId (void);
 
   // inherited from PositionAllocator
@@ -199,8 +218,8 @@
 
 private:
 
-  NodeContainer m_nodes;
-  mutable NodeContainer::Iterator m_nodeIt;
+  NodeContainer m_nodes; //!< Nodes container
+  mutable NodeContainer::Iterator m_nodeIt; //!< Nodes iterator
 
   /// Provides uniform random variables.
   Ptr<UniformRandomVariable> m_rand;
@@ -227,7 +246,10 @@
                               uint32_t y,
                               uint32_t z,
                               Ptr<Building> b);
-  // inherited from Object
+  /**
+   * \brief Get the type ID.
+   * \return The object TypeId.
+   */
   static TypeId GetTypeId (void);
   // inherited from PositionAllocator
   virtual Vector GetNext (void) const;
@@ -244,11 +266,11 @@
 
 private:
 
-  uint32_t roomx;
-  uint32_t roomy;
-  uint32_t floor;
+  uint32_t roomx; //!< Index of the room on the x-axis 
+  uint32_t roomy; //!< Index of the room on the y-axis 
+  uint32_t floor; //!< Index of the room on the z-axis (i.e., floor number)
 
-  Ptr<Building> bptr;
+  Ptr<Building> bptr; //!< Pointer to the chosen building
 
   /// Provides uniform random variables.
   Ptr<UniformRandomVariable> m_rand;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/buildings/helper/buildings-helper.cc ns-3.36/src/buildings/helper/buildings-helper.cc
--- ns-3.35/src/buildings/helper/buildings-helper.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/buildings/helper/buildings-helper.cc	2022-04-30 18:23:57.782733200 -0700
@@ -48,11 +48,8 @@
 {
   Ptr<Object> object = node;
   Ptr<MobilityModel> model = object->GetObject<MobilityModel> ();
-  if (model == 0)
-    {
-      NS_ABORT_MSG_UNLESS (0 != model, "node " << node->GetId () << " does not have a MobilityModel");
 
-    }
+  NS_ABORT_MSG_UNLESS (0 != model, "node " << node->GetId () << " does not have a MobilityModel");
 
   Ptr<MobilityBuildingInfo> buildingInfo = CreateObject<MobilityBuildingInfo> ();
   model->AggregateObject (buildingInfo);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/buildings/helper/buildings-helper.h ns-3.36/src/buildings/helper/buildings-helper.h
--- ns-3.35/src/buildings/helper/buildings-helper.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/buildings/helper/buildings-helper.h	2022-04-30 18:23:57.782733200 -0700
@@ -33,6 +33,9 @@
 class MobilityModel;
 class Building;
 
+/**
+ * Helper used to install a MobilityBuildingInfo into a set of nodes.
+ */
 class BuildingsHelper
 {
 public:
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/buildings/model/building.h ns-3.36/src/buildings/model/building.h
--- ns-3.35/src/buildings/model/building.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/buildings/model/building.h	2022-04-30 18:23:57.782733200 -0700
@@ -38,15 +38,23 @@
 {
 public:
 
-  // inherited from Object
+  /**
+   * \brief Get the type ID.
+   * \return The object TypeId.
+   */
   static TypeId GetTypeId (void);
   virtual void DoDispose ();
 
-
+  /**
+   * Building type enum
+   */
   enum BuildingType_t
     {
       Residential, Office, Commercial
     };
+  /**
+   * External building wall type enum
+   */
   enum ExtWallsType_t
     {
       Wood, ConcreteWithWindows, ConcreteWithoutWindows, StoneBlocks
@@ -215,19 +223,19 @@
 
 private:
 
-  Box m_buildingBounds;
+  Box m_buildingBounds; //!< Building boundaries
 
   /**
    * number of floors, must be greater than 0, and 1 means only one floor
    * (i.e., groundfloor)
    */
   uint16_t m_floors;
-  uint16_t m_roomsX;
-  uint16_t m_roomsY;
+  uint16_t m_roomsX; //!< X Room coordinate
+  uint16_t m_roomsY; //!< Y Room coordinate
 
-  uint32_t m_buildingId;
-  BuildingType_t m_buildingType;
-  ExtWallsType_t m_externalWalls;
+  uint32_t m_buildingId; //!< Building ID number
+  BuildingType_t m_buildingType;   //!< Building type
+  ExtWallsType_t m_externalWalls;  //!< External building wall type
 
 };
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/buildings/model/building-list.cc ns-3.36/src/buildings/model/building-list.cc
--- ns-3.35/src/buildings/model/building-list.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/buildings/model/building-list.cc	2022-04-30 18:23:57.782733200 -0700
@@ -38,23 +38,66 @@
 class BuildingListPriv : public Object
 {
 public:
+  /**
+   * \brief Get the type ID.
+   * \return The object TypeId.
+   */
   static TypeId GetTypeId (void);
   BuildingListPriv ();
   ~BuildingListPriv ();
-
+  
+  /**
+   * Add a Building to the list.
+   * 
+   * \param building building to add
+   * \returns index of building in list.
+   */
   uint32_t Add (Ptr<Building> building);
+  /**
+   * Returns an interator to the start of the list.
+   * 
+   * \returns iterator to the begin of the container.
+   */
   BuildingList::Iterator Begin (void) const;
+  /**
+   * Returns an interator to the end of the list.
+   * 
+   * \returns iterator to the end of the container.
+   */
   BuildingList::Iterator End (void) const;
+  /**
+   * Gets the n-th Building in the container
+   * \param n Building position
+   * \returns a pointer to the Building
+   */
   Ptr<Building> GetBuilding (uint32_t n);
+  /**
+   * Gets the number of Building in the container
+   * \returns the container size
+   */
   uint32_t GetNBuildings (void);
 
+  /**
+   * Get the Singleton instance of BuildingListPriv (or create one)
+   * \return the BuildingListPriv instance
+   */
   static Ptr<BuildingListPriv> Get (void);
 
 private:
   virtual void DoDispose (void);
+  /**
+   * Get the Singleton instance of BuildingListPriv (or create one)
+   * \return the BuildingListPriv instance
+   */
   static Ptr<BuildingListPriv> *DoGet (void);
+  /**
+   * Dispose the Singleton instance of BuildingListPriv.
+   * 
+   * \note: this function is automatically called at the simulation end.
+   * 
+   */
   static void Delete (void);
-  std::vector<Ptr<Building> > m_buildings;
+  std::vector<Ptr<Building> > m_buildings; //!< Container of Building
 };
 
 NS_OBJECT_ENSURE_REGISTERED (BuildingListPriv);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/buildings/model/building-list.h ns-3.36/src/buildings/model/building-list.h
--- ns-3.35/src/buildings/model/building-list.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/buildings/model/building-list.h	2022-04-30 18:23:57.782733200 -0700
@@ -30,9 +30,13 @@
 
 class Building;
 
+/**
+ * Container for Building class
+ */
 class BuildingList
 {
 public:
+  /// Const Iterator
   typedef std::vector< Ptr<Building> >::const_iterator Iterator;
 
   /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/buildings/model/buildings-channel-condition-model.cc ns-3.36/src/buildings/model/buildings-channel-condition-model.cc
--- ns-3.35/src/buildings/model/buildings-channel-condition-model.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/buildings/model/buildings-channel-condition-model.cc	2022-04-30 18:23:57.782733200 -0700
@@ -133,9 +133,8 @@
 }
 
 int64_t
-BuildingsChannelConditionModel::AssignStreams (int64_t stream)
+BuildingsChannelConditionModel::AssignStreams ([[maybe_unused]] int64_t stream)
 {
-  NS_UNUSED (stream);
   return 0;
 }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/buildings/model/buildings-propagation-loss-model.h ns-3.36/src/buildings/model/buildings-propagation-loss-model.h
--- ns-3.35/src/buildings/model/buildings-propagation-loss-model.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/buildings/model/buildings-propagation-loss-model.h	2022-04-30 18:23:57.782733200 -0700
@@ -58,6 +58,10 @@
 {
 
 public:
+  /**
+   * \brief Get the type ID.
+   * \return The object TypeId.
+   */
   static TypeId GetTypeId (void);
 
   BuildingsPropagationLossModel ();
@@ -72,35 +76,81 @@
   virtual double DoCalcRxPower (double txPowerDbm, Ptr<MobilityModel> a, Ptr<MobilityModel> b) const;
 
 protected:
+  /**
+   * Calculate the external wall loss
+   * \param a Building data
+   * \returns the propagation loss (in dBm)
+   */
   double ExternalWallLoss (Ptr<MobilityBuildingInfo> a) const;
+  /**
+   * Calculate the height loss
+   * \param n Building data
+   * \returns the propagation loss (in dBm)
+   */
   double HeightLoss (Ptr<MobilityBuildingInfo> n) const;
+  /**
+   * Calculate the internal wall loss
+   * \param a Room A data
+   * \param b Room B data
+   * \returns the propagation loss (in dBm)
+   */
   double InternalWallsLoss (Ptr<MobilityBuildingInfo> a, Ptr<MobilityBuildingInfo> b) const;
   
+  /**
+   * Calculate the shadowing loss
+   * \param a Room A data
+   * \param b Room B data
+   * \returns the propagation loss (in dBm)
+   */
   double GetShadowing (Ptr<MobilityModel> a, Ptr<MobilityModel> b) const;
 
-  double m_lossInternalWall; // in meters
+  double m_lossInternalWall; //!< loss from internal walls (in dBm)
 
-  
+  /**
+   * \ingroup propagation
+   * 
+   * This model allows the computation of shadowing loss
+   */
   class ShadowingLoss
   {
   public:
     ShadowingLoss ();
+    /**
+     * Constructor
+     * \param shadowingValue Value for shadowing
+     * \param receiver Receiver position
+     */
     ShadowingLoss (double shadowingValue, Ptr<MobilityModel> receiver);
+    /**
+     * \returns the loss (in dBm)
+     */
     double GetLoss () const;
+    /**
+     * \returns the receiver mobility model
+     */
     Ptr<MobilityModel> GetReceiver (void) const;
   protected:
-    double m_shadowingValue;
-    Ptr<MobilityModel> m_receiver;
+    double m_shadowingValue; //!< Shadowing value
+    Ptr<MobilityModel> m_receiver; //!< The receiver mobility model
   };
 
+  /// Map of the shadowng loss
   mutable std::map<Ptr<MobilityModel>,  std::map<Ptr<MobilityModel>, ShadowingLoss> > m_shadowingLossMap;
+  /**
+   * Calculate the Standard deviation of the normal distribution used to calculate the shadowing
+   * \param a Room A data
+   * \param b Room B data
+   * \return the Standard deviation of the normal distribution
+   */
   double EvaluateSigma (Ptr<MobilityBuildingInfo> a, Ptr<MobilityBuildingInfo> b) const;
 
-
+  /// Standard deviation of the normal distribution used to calculate the shadowing due to ext walls
   double m_shadowingSigmaExtWalls;
+  /// Standard deviation of the normal distribution used to calculate the shadowing for outdoor nodes
   double m_shadowingSigmaOutdoor;
+  /// Standard deviation of the normal distribution used to calculate the shadowing for indoor nodes
   double m_shadowingSigmaIndoor;
-  Ptr<NormalRandomVariable> m_randVariable;
+  Ptr<NormalRandomVariable> m_randVariable; //!< Random variable
 
   virtual int64_t DoAssignStreams (int64_t stream);
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/buildings/model/hybrid-buildings-propagation-loss-model.h ns-3.36/src/buildings/model/hybrid-buildings-propagation-loss-model.h
--- ns-3.35/src/buildings/model/hybrid-buildings-propagation-loss-model.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/buildings/model/hybrid-buildings-propagation-loss-model.h	2022-04-30 18:23:57.782733200 -0700
@@ -57,6 +57,10 @@
 {
 
 public:
+  /**
+   * \brief Get the type ID.
+   * \return The object TypeId.
+   */
   static TypeId GetTypeId (void);
   HybridBuildingsPropagationLossModel ();
   ~HybridBuildingsPropagationLossModel ();
@@ -91,6 +95,9 @@
   void SetRooftopHeight (double rooftopHeight);
 
   /**
+   * \brief Compute the path loss according to the nodes position
+   * using the appropriate model.
+   * 
    * \param a the mobility model of the source
    * \param b the mobility model of the destination
    * \returns the propagation loss (in dBm)
@@ -99,20 +106,47 @@
 
   
 private:
-
+  /**
+   * Compute the path loss using either OkumuraHataPropagationLossModel
+   * or Kun2600MhzPropagationLossModel.
+   * 
+   * \param a The mobility model of the source.
+   * \param b The mobility model of the destination.
+   * \returns the propagation loss (in dBm).
+   */
   double OkumuraHata (Ptr<MobilityModel> a, Ptr<MobilityModel> b) const;
+  /**
+   * Compute the path loss using either ItuR1411LosPropagationLossModel or
+   * ItuR1411NlosOverRooftopPropagationLossModel.
+   * 
+   * \param a The mobility model of the source.
+   * \param b The mobility model of the destination.
+   * \returns the propagation loss (in dBm).
+   */
   double ItuR1411 (Ptr<MobilityModel> a, Ptr<MobilityModel> b) const;
+  /**
+   * Compute the path loss using ItuR1238PropagationLossModel.
+   * 
+   * \param a The mobility model of the source.
+   * \param b The mobility model of the destination.
+   * \returns the propagation loss (in dBm).
+   */
   double ItuR1238 (Ptr<MobilityModel> a, Ptr<MobilityModel> b) const;
 
+  /// OkumuraHataPropagationLossModel
   Ptr<OkumuraHataPropagationLossModel> m_okumuraHata;
+  /// ItuR1411LosPropagationLossModel
   Ptr<ItuR1411LosPropagationLossModel> m_ituR1411Los;
+  /// ItuR1411NlosOverRooftopPropagationLossModel
   Ptr<ItuR1411NlosOverRooftopPropagationLossModel> m_ituR1411NlosOverRooftop;
+  /// ItuR1238PropagationLossModel
   Ptr<ItuR1238PropagationLossModel> m_ituR1238;
+  /// Kun2600MhzPropagationLossModel
   Ptr<Kun2600MhzPropagationLossModel> m_kun2600Mhz;
 
   double m_itu1411NlosThreshold; ///< in meters (switch Los -> NLoS)
-  double m_rooftopHeight;
-  double m_frequency;
+  double m_rooftopHeight;        ///< Roof Height (in meters)
+  double m_frequency;            ///< Operation frequency
 
 };
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/buildings/model/itu-r-1238-propagation-loss-model.h ns-3.36/src/buildings/model/itu-r-1238-propagation-loss-model.h
--- ns-3.35/src/buildings/model/itu-r-1238-propagation-loss-model.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/buildings/model/itu-r-1238-propagation-loss-model.h	2022-04-30 18:23:57.782733200 -0700
@@ -37,7 +37,10 @@
 
 public:
 
-  // inherited from Object
+  /**
+   * \brief Get the type ID.
+   * \return The object TypeId.
+   */
   static TypeId GetTypeId (void);
 
   /** 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/buildings/model/oh-buildings-propagation-loss-model.h ns-3.36/src/buildings/model/oh-buildings-propagation-loss-model.h
--- ns-3.35/src/buildings/model/oh-buildings-propagation-loss-model.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/buildings/model/oh-buildings-propagation-loss-model.h	2022-04-30 18:23:57.782733200 -0700
@@ -40,6 +40,10 @@
 {
 
 public:
+  /**
+   * \brief Get the type ID.
+   * \return The object TypeId.
+   */
   static TypeId GetTypeId (void);
   OhBuildingsPropagationLossModel ();
   ~OhBuildingsPropagationLossModel ();
@@ -53,7 +57,7 @@
   
 private:
 
-  Ptr<OkumuraHataPropagationLossModel> m_okumuraHata;
+  Ptr<OkumuraHataPropagationLossModel> m_okumuraHata; //!< OkumuraHata Propagation Loss Model
 
 };
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/buildings/model/random-walk-2d-outdoor-mobility-model.h ns-3.36/src/buildings/model/random-walk-2d-outdoor-mobility-model.h
--- ns-3.35/src/buildings/model/random-walk-2d-outdoor-mobility-model.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/buildings/model/random-walk-2d-outdoor-mobility-model.h	2022-04-30 18:23:57.782733200 -0700
@@ -77,15 +77,16 @@
   void Rebound (Time timeLeft);
   /**
    * \brief Avoid a building
-   * \param timeLeft The remaining time of the walk
+   * \param delayLeft The remaining time of the walk
    * \param intersectPosition The position at which the building is intersected
    */
   void AvoidBuilding (Time delayLeft, Vector intersectPosition);
   /**
    * Walk according to position and velocity, until distance is reached,
    * time is reached, or intersection with the bounding box, or building
+   * \param delayLeft The remaining time of the walk
    */
-  void DoWalk (Time timeLeft);
+  void DoWalk (Time delayLeft);
   /**
    * Perform initialization of the object before MobilityModel::DoInitialize ()
    */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/buildings/model/three-gpp-v2v-channel-condition-model.h ns-3.36/src/buildings/model/three-gpp-v2v-channel-condition-model.h
--- ns-3.35/src/buildings/model/three-gpp-v2v-channel-condition-model.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/buildings/model/three-gpp-v2v-channel-condition-model.h	2022-04-30 18:23:57.782733200 -0700
@@ -159,7 +159,7 @@
    * \link BuildingsChannelConditionModel \endlink, which requires
    * \link MobilityBuildingInfo \endlink aggregated to the nodes to compute
    * LOS and NLOS. Otherwise, the callback is hooked to a local method
-   * \link GetChaCondWithNoBuildings \endlink
+   * \link GetChCondWithNoBuildings \endlink
    * , which construct the ChannelCondtion object and set the condition to
    * outdoor to outdoor with LOS.
    */
@@ -167,8 +167,8 @@
 
   /**
    * \brief Get the channel condition and redirect the callback
-   * \link ComputeChCond \endlink to \link GetChaCondWithBuildings \endlink
-   * or to \link GetChaCondWithNoBuildings \endlink depending on if there are
+   * \link ComputeChCond \endlink to \link GetChCondWithBuildings \endlink
+   * or to \link GetChCondWithNoBuildings \endlink depending on if there are
    * buildings in the scenario or not.
    *
    * \param a tx mobility model
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/buildings/test/building-position-allocator-test.cc ns-3.36/src/buildings/test/building-position-allocator-test.cc
--- ns-3.35/src/buildings/test/building-position-allocator-test.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/buildings/test/building-position-allocator-test.cc	2022-04-30 18:23:57.782733200 -0700
@@ -36,12 +36,29 @@
 
 NS_LOG_COMPONENT_DEFINE ("BuildingPositionAllocatorTest");
 
+/**
+ * \ingroup propagation
+ * \defgroup building-test Buildings module tests
+ */
+
+/**
+ * \ingroup building-test
+ * \ingroup tests
+ * 
+ * Room coordinates
+ */
 struct Room
 {
+  /**
+   * Constructor
+   * \param xx X coord
+   * \param yy Y coord
+   * \param zz Z coord
+   */
   Room (uint32_t xx, uint32_t yy, uint32_t zz);
-  uint32_t x;
-  uint32_t y;
-  uint32_t z;
+  uint32_t x; //!< X coord
+  uint32_t y; //!< Y coord
+  uint32_t z; //!< Z coord (floor)
 };
 
 Room::Room (uint32_t xx, uint32_t yy, uint32_t zz)
@@ -60,7 +77,12 @@
 }
 
 
-
+/**
+ * \ingroup building-test
+ * \ingroup tests
+ * 
+ * RandomRoomPositionAllocator test
+ */
 class RandomRoomPositionAllocatorTestCase : public TestCase
 {
 public:
@@ -139,8 +161,12 @@
 
 
 
-
-
+/**
+ * \ingroup building-test
+ * \ingroup tests
+ * 
+ * SameRoomPositionAllocator test
+ */
 class SameRoomPositionAllocatorTestCase : public TestCase
 {
 public:
@@ -214,17 +240,18 @@
 }
 
 
-
-
-
-
+/**
+ * \ingroup building-test
+ * \ingroup tests
+ * 
+ * \brief RandomRoomPositionAllocator TestSuite
+ */
 class BuildingPositionAllocatorTestSuite : public TestSuite
 {
 public:
   BuildingPositionAllocatorTestSuite ();
 };
 
-
 BuildingPositionAllocatorTestSuite::BuildingPositionAllocatorTestSuite ()
   : TestSuite ("building-position-allocator", UNIT)
 {
@@ -235,4 +262,5 @@
 
 }
 
-static BuildingPositionAllocatorTestSuite buildingsPositionAllocatorTestSuiteInstance;
+/// Static variable for test initialization
+static BuildingPositionAllocatorTestSuite buildingsPositionAllocatorTestSuiteInstance; 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/buildings/test/buildings-channel-condition-model-test.cc ns-3.36/src/buildings/test/buildings-channel-condition-model-test.cc
--- ns-3.35/src/buildings/test/buildings-channel-condition-model-test.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/buildings/test/buildings-channel-condition-model-test.cc	2022-04-30 18:23:57.782733200 -0700
@@ -31,6 +31,9 @@
 NS_LOG_COMPONENT_DEFINE ("BuildingsChannelConditionModelsTest");
 
 /**
+ * \ingroup building-test
+ * \ingroup tests
+ * 
  * Test case for the class BuildingsChannelConditionModel. It checks if the
  * channel condition is correctly determined when a building is deployed in the
  * scenario
@@ -140,6 +143,8 @@
 }
 
 /**
+ * \ingroup building-test
+ * \ingroup tests
  * Test suite for the buildings channel condition model
  */
 class BuildingsChannelConditionModelsTestSuite : public TestSuite
@@ -154,4 +159,5 @@
   AddTestCase (new BuildingsChannelConditionModelTestCase, TestCase::QUICK);
 }
 
+/// Static variable for test initialization
 static BuildingsChannelConditionModelsTestSuite BuildingsChannelConditionModelsTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/buildings/test/buildings-helper-test.cc ns-3.36/src/buildings/test/buildings-helper-test.cc
--- ns-3.35/src/buildings/test/buildings-helper-test.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/buildings/test/buildings-helper-test.cc	2022-04-30 18:23:57.782733200 -0700
@@ -33,15 +33,21 @@
 
 NS_LOG_COMPONENT_DEFINE ("BuildingsHelperTest");
 
+/**
+ * \ingroup building-test
+ * \ingroup tests
+ * 
+ * \brief Struct representing a position in a building
+ */
 struct PositionInBuilding
 {
   PositionInBuilding ();
-  Vector   pos;   // coordinates of the mobility model instance
-  bool     indoor; // true if indoor, false otherwise
-  uint32_t bid;   // building id
-  uint16_t rx;    // room x
-  uint16_t ry;    // room y
-  uint16_t fn;    // floor number
+  Vector   pos;   //!< coordinates of the mobility model instance
+  bool     indoor; //!< true if indoor, false otherwise
+  uint32_t bid;   //!< building id
+  uint16_t rx;    //!< room x
+  uint16_t ry;    //!< room y
+  uint16_t fn;    //!< floor number
 };
 
 PositionInBuilding::PositionInBuilding ()
@@ -55,7 +61,10 @@
 }
 
 /**
- * data to construct a Building object. We don't want to pass Building
+ * \ingroup building-test
+ * \ingroup tests
+
+ * Data to construct a Building object. We don't want to pass Building
  * objects to the TestCase constructor because otherwise BuildingList
  * would contain all of them (even if only one is meant to be in the
  * test case).
@@ -64,15 +73,15 @@
 struct BuildingData
 {
   BuildingData ();
-  double xmin;
-  double xmax;
-  double ymin;
-  double ymax;
-  double zmin;
-  double zmax;
-  uint16_t nrx;
-  uint16_t nry;
-  uint16_t nf;
+  double xmin;   //!< X min coordinate
+  double xmax;   //!< X max coordinate
+  double ymin;   //!< Y min coordinate
+  double ymax;   //!< Y max coordinate
+  double zmin;   //!< Z min coordinate
+  double zmax;   //!< Z max coordinate
+  uint16_t nrx;  //!< Number of rooms (X coord)
+  uint16_t nry;  //!< Number of rooms (Y coord)
+  uint16_t nf;   //!< Number of floors
 };
 
 BuildingData::BuildingData ()
@@ -88,17 +97,35 @@
 {
 }
 
+/**
+ * \ingroup building-test
+ * \ingroup tests
+ * 
+ * \brief BuildingsHelper test 
+ */
 class BuildingsHelperOneTestCase : public TestCase
 {
 public:
+  /**
+   * Build the testcase name
+   * \param pib Position in building
+   * \param bd Building data
+   * \return the TestCase name
+   */
   static std::string BuildNameString (PositionInBuilding pib, BuildingData bd);
+
+  /**
+   * Constructor
+   * \param pib Position in building
+   * \param bd Building data
+   */
   BuildingsHelperOneTestCase (PositionInBuilding pib, BuildingData bd);
 
 private:
   virtual void DoRun (void);
 
-  PositionInBuilding m_pib;
-  BuildingData m_bd;
+  PositionInBuilding m_pib; //!< Position in the building
+  BuildingData m_bd; //!< Building data
   
 };
 
@@ -167,11 +194,12 @@
 }
 
 
-
-
-
-
-
+/**
+ * \ingroup building-test
+ * \ingroup tests
+ * 
+ * \brief BuildingsHelper TestSuite
+ */
 class BuildingsHelperTestSuite : public TestSuite
 {
 public:
@@ -322,4 +350,5 @@
   AddTestCase (new BuildingsHelperOneTestCase (q7, b2), TestCase::QUICK);     
 }
 
+/// Static variable for test initialization
 static BuildingsHelperTestSuite buildingsHelperAntennaTestSuiteInstance;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/buildings/test/buildings-pathloss-test.cc ns-3.36/src/buildings/test/buildings-pathloss-test.cc
--- ns-3.35/src/buildings/test/buildings-pathloss-test.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/buildings/test/buildings-pathloss-test.cc	2022-04-30 18:23:57.782733200 -0700
@@ -38,16 +38,12 @@
 
 NS_LOG_COMPONENT_DEFINE ("BuildingsPathlossTest");
 
-/**
+/*
  * Test 1.1 BuildingsPathlossModel Pathloss compound test
- */
-
-/**
+ *
  * This TestSuite tests the BuildingPathlossModel by reproducing
  * several communication scenarios 
  */
-
-
 BuildingsPathlossTestSuite::BuildingsPathlossTestSuite ()
   : TestSuite ("buildings-pathloss-test", SYSTEM)
 {
@@ -127,11 +123,11 @@
 }
 
 
-
+/// Static variable for test initialization
 static BuildingsPathlossTestSuite buildingsPathlossTestSuite;
 
 
-/**
+/*
  * TestCase
  */
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/buildings/test/buildings-pathloss-test.h ns-3.36/src/buildings/test/buildings-pathloss-test.h
--- ns-3.35/src/buildings/test/buildings-pathloss-test.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/buildings/test/buildings-pathloss-test.h	2022-04-30 18:23:57.782733200 -0700
@@ -28,8 +28,14 @@
 using namespace ns3;
 
 /**
-* Test 1.1 pathloss calculation
-*/
+ * \ingroup building-test
+ * \ingroup tests
+ *
+ * Test 1.1 BuildingsPathlossModel Pathloss compound test
+ *
+ * This TestSuite tests the BuildingPathlossModel by reproducing
+ * several communication scenarios 
+ */
 class BuildingsPathlossTestSuite : public TestSuite
 {
 public:
@@ -37,22 +43,44 @@
 };
 
 
+/**
+ * \ingroup building-test
+ * \ingroup tests
+ *
+ * Test 1.1 BuildingsPathlossModel Pathloss test
+ *
+ */
 class BuildingsPathlossTestCase : public TestCase
 {
 public:
+  /**
+   * Constructor
+   * \param freq Communication frequency
+   * \param m1 First MobilityModel Index
+   * \param m2 Second MobilityModel Index
+   * \param env Enviroment type
+   * \param city City size
+   * \param refValue Theoretical loss
+   * \param name Test name
+   */
   BuildingsPathlossTestCase (double freq, uint16_t m1, uint16_t m2, EnvironmentType env, CitySize city, double refValue, std::string name);
   virtual ~BuildingsPathlossTestCase ();
 
 private:
   virtual void DoRun (void);
+  /**
+   * Create a mobility model based on its index
+   * \param index MobilityModel index
+   * \return The MobilityModel
+   */
   Ptr<MobilityModel> CreateMobilityModel (uint16_t index);
 
-  double m_freq;
-  uint16_t m_mobilityModelIndex1;
-  uint16_t m_mobilityModelIndex2;
-  EnvironmentType m_env;
-  CitySize m_city;
-  double m_lossRef;
+  double m_freq; //!< Communication frequency
+  uint16_t m_mobilityModelIndex1; //!< First MobilityModel Index
+  uint16_t m_mobilityModelIndex2; //!< Second MobilityModel Index
+  EnvironmentType m_env; //!< Enviroment type
+  CitySize m_city; //!< City size
+  double m_lossRef; //!< Theoretical loss
 
 };
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/buildings/test/buildings-shadowing-test.cc ns-3.36/src/buildings/test/buildings-shadowing-test.cc
--- ns-3.35/src/buildings/test/buildings-shadowing-test.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/buildings/test/buildings-shadowing-test.cc	2022-04-30 18:23:57.782733200 -0700
@@ -38,11 +38,9 @@
 NS_LOG_COMPONENT_DEFINE ("BuildingsShadowingTest");
 
 
-/**
+/*
 * Test 1.1 Shadowing compound test
-*/
-
-/**
+*
 * This TestSuite tests the shadowing model of BuildingPathlossModel 
 * by reproducing several communication scenarios 
 */
@@ -65,10 +63,11 @@
 
 }
 
+/// Static variable for test initialization
 static BuildingsShadowingTestSuite buildingsShadowingTestSuite;
 
 
-/**
+/*
 * TestCase
 */
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/buildings/test/buildings-shadowing-test.h ns-3.36/src/buildings/test/buildings-shadowing-test.h
--- ns-3.35/src/buildings/test/buildings-shadowing-test.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/buildings/test/buildings-shadowing-test.h	2022-04-30 18:23:57.782733200 -0700
@@ -28,7 +28,13 @@
 using namespace ns3;
 
 /**
- * Test shadowing calculation
+ * \ingroup building-test
+ * \ingroup tests
+ * 
+ * Shadowing compound test
+ *
+ * This TestSuite tests the shadowing model of BuildingPathlossModel 
+ * by reproducing several communication scenarios 
  */
 class BuildingsShadowingTestSuite : public TestSuite
 {
@@ -37,20 +43,39 @@
 };
 
 
+/**
+ * \ingroup building-test
+ * \ingroup tests
+ * 
+ * Shadowing test
+ */
 class BuildingsShadowingTestCase : public TestCase
 {
 public:
+  /**
+   * Constructor
+   * \param m1 First MobilityModel Index
+   * \param m2 Second MobilityModel Index
+   * \param refValue Theoretical loss
+   * \param sigmaRef Theoretical loss standard deviation
+   * \param name Test name
+   */
   BuildingsShadowingTestCase (uint16_t m1, uint16_t m2, double refValue, double sigmaRef, std::string name);
   virtual ~BuildingsShadowingTestCase ();
 
 private:
   virtual void DoRun (void);
+  /**
+   * Create a mobility model based on its index
+   * \param index MobilityModel index
+   * \return The MobilityModel
+   */
   Ptr<MobilityModel> CreateMobilityModel (uint16_t index);
 
-  uint16_t m_mobilityModelIndex1;
-  uint16_t m_mobilityModelIndex2;
-  double m_lossRef;     // pathloss value (without shadowing)
-  double m_sigmaRef;
+  uint16_t m_mobilityModelIndex1;  //!< First MobilityModel Index
+  uint16_t m_mobilityModelIndex2;  //!< Second MobilityModel Index
+  double m_lossRef;     //!< pathloss value (without shadowing)
+  double m_sigmaRef;    //!< pathloss standard deviation value reference value
 
 };
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/buildings/test/outdoor-random-walk-test.cc ns-3.36/src/buildings/test/outdoor-random-walk-test.cc
--- ns-3.35/src/buildings/test/outdoor-random-walk-test.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/buildings/test/outdoor-random-walk-test.cc	2022-04-30 18:23:57.782733200 -0700
@@ -34,31 +34,28 @@
 NS_LOG_COMPONENT_DEFINE ("OutdoorRandomWalkTest");
 
 /**
+ * \ingroup building-test
+ * \ingroup tests
+ * 
  * Test case for the class OutdoorRandomWalkTestCase. It checks if the
  * positions visited by the user are outside buildings
  */
 class OutdoorRandomWalkTestCase : public TestCase
 {
 public:
-  /**
-   * Constructor
-   */
   OutdoorRandomWalkTestCase ();
-
-  /**
-   * Destructor
-   */
   virtual ~OutdoorRandomWalkTestCase ();
 
 private:
-  /**
-   * Builds the simulation scenario and perform the tests
-   */
   virtual void DoRun (void);
 
+  /**
+   * Check that the position is the expected one
+   * \param model Mobility model
+   */
   void CheckPositionOutdoor (Ptr<RandomWalk2dOutdoorMobilityModel> model);
 
-  std::vector<Ptr<Building> > m_buildings;
+  std::vector<Ptr<Building> > m_buildings; //!< Buildings
 };
 
 OutdoorRandomWalkTestCase::OutdoorRandomWalkTestCase ()
@@ -150,6 +147,9 @@
 }
 
 /**
+ * \ingroup building-test
+ * \ingroup tests
+ * 
  * Test suite for the buildings channel condition model
  */
 class OutdoorRandomWalkTestSuite : public TestSuite
@@ -164,4 +164,5 @@
   AddTestCase (new OutdoorRandomWalkTestCase, TestCase::QUICK);
 }
 
+/// Static variable for test initialization
 static OutdoorRandomWalkTestSuite OutdoorRandomWalkTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/buildings/test/three-gpp-v2v-channel-condition-model-test.cc ns-3.36/src/buildings/test/three-gpp-v2v-channel-condition-model-test.cc
--- ns-3.35/src/buildings/test/three-gpp-v2v-channel-condition-model-test.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/buildings/test/three-gpp-v2v-channel-condition-model-test.cc	2022-04-30 18:23:57.782733200 -0700
@@ -38,6 +38,9 @@
 NS_LOG_COMPONENT_DEFINE ("ThreeGppV2vChannelConditionModelsTest");
 
 /**
+ * \ingroup building-test
+ * \ingroup tests
+ * 
  * Test case for the classes ThreeGppV2vUrbanChannelConditionModel,
  * and ThreeGppV2vHighwayChannelConditionModel to test their code to
  * deterministically determine NLOS state. The test checks if the
@@ -473,6 +476,9 @@
 
 
 /**
+ * \ingroup building-test
+ * \ingroup tests
+ * 
  * Test suite for the 3GPP V2V channel condition model
  *
  * Note that, in 3GPP V2V scenarios, the channel condition model is
@@ -483,8 +489,8 @@
  *
  * The test ThreeGppV2vBuildingsChCondModelTestCase checks the
  * 1st step of the procedure, the deterministic one, using buildings for
- * both \link ThreeGppV2vUrbanChannelConditionModel \endlink and
- * \link ThreeGppV2vHighwayChannelConditionModel \endlink .
+ * both \link ns3::ThreeGppV2vUrbanChannelConditionModel \endlink and
+ * \link ns3::ThreeGppV2vHighwayChannelConditionModel \endlink .
  *
  * The tests ThreeGppV2vUrbanLosNlosvChCondModelTestCase and
  * ThreeGppV2vHighwayLosNlosvChCondModelTestCase check the
@@ -506,4 +512,5 @@
   AddTestCase (new ThreeGppV2vHighwayLosNlosvChCondModelTestCase, TestCase::QUICK); // test for the probabilistic procedure (LOS vs NLOSv), in V2V highway scenario
 }
 
+/// Static variable for test initialization
 static ThreeGppV2vChCondModelsTestSuite ThreeGppV2vChCondModelsTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/buildings/wscript ns-3.36/src/buildings/wscript
--- ns-3.35/src/buildings/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/buildings/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,63 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-
-    module = bld.create_ns3_module('buildings', ['mobility', 'propagation', 'config-store'])
-    module.source = [
-        'model/building.cc',
-        'model/building-list.cc',
-        'model/mobility-building-info.cc',
-        'model/itu-r-1238-propagation-loss-model.cc',
-        'model/buildings-propagation-loss-model.cc',
-        'model/hybrid-buildings-propagation-loss-model.cc',
-        'model/oh-buildings-propagation-loss-model.cc',
-        'model/buildings-channel-condition-model.cc',
-        'model/three-gpp-v2v-channel-condition-model.cc',
-        'helper/building-container.cc',
-        'helper/building-position-allocator.cc',
-        'helper/building-allocator.cc',
-        'helper/buildings-helper.cc',
-        'model/random-walk-2d-outdoor-mobility-model.cc',
-        ]
-
-    module_test = bld.create_ns3_module_test_library('buildings')
-    module_test.source = [
-        'test/buildings-helper-test.cc',
-        'test/building-position-allocator-test.cc',
-        'test/buildings-pathloss-test.cc',
-        'test/buildings-shadowing-test.cc',
-        'test/buildings-channel-condition-model-test.cc',
-        'test/outdoor-random-walk-test.cc',
-        'test/three-gpp-v2v-channel-condition-model-test.cc',
-        ]
-
-    # Tests encapsulating example programs should be listed here
-    if (bld.env['ENABLE_EXAMPLES']):
-        module_test.source.extend([
-        #   'test/buildings-examples-test-suite.cc',
-            ])
-    
-    headers = bld(features='ns3header')
-    headers.module = 'buildings'
-    headers.source = [
-        'model/building.h',
-        'model/building-list.h',
-        'model/mobility-building-info.h',
-        'model/itu-r-1238-propagation-loss-model.h',
-        'model/buildings-propagation-loss-model.h',
-        'model/hybrid-buildings-propagation-loss-model.h',
-        'model/oh-buildings-propagation-loss-model.h',
-        'model/buildings-channel-condition-model.h',
-        'model/three-gpp-v2v-channel-condition-model.h',
-        'helper/building-container.h',
-        'helper/building-allocator.h',
-        'helper/building-position-allocator.h',
-        'helper/buildings-helper.h',
-        'model/random-walk-2d-outdoor-mobility-model.h',
-        ]
-
-    if (bld.env['ENABLE_EXAMPLES']):
-        bld.recurse('examples')
-
-
-    bld.ns3_python_bindings()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/click/bindings/modulegen__gcc_ILP32.py ns-3.36/src/click/bindings/modulegen__gcc_ILP32.py
--- ns-3.35/src/click/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/click/bindings/modulegen__gcc_ILP32.py	2022-04-30 18:23:57.786733200 -0700
@@ -67,6 +67,8 @@
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::TraceSourceAccessor'])
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'], import_from_module='ns.core')
     ## hash.h (module 'core'): ns3::Hasher [class]
     module.add_class('Hasher', import_from_module='ns.core')
     ## inet6-socket-address.h (module 'network'): ns3::Inet6SocketAddress [class]
@@ -113,8 +115,6 @@
     module.add_class('Mac8Address', import_from_module='ns.network')
     ## mac8-address.h (module 'network'): ns3::Mac8Address [class]
     root_module['ns3::Mac8Address'].implicitly_converts_to(root_module['ns3::Address'])
-    ## non-copyable.h (module 'core'): ns3::NonCopyable [class]
-    module.add_class('NonCopyable', destructor_visibility='protected', import_from_module='ns.core')
     ## object-base.h (module 'core'): ns3::ObjectBase [class]
     module.add_class('ObjectBase', allow_subclassing=True, import_from_module='ns.core')
     ## object.h (module 'core'): ns3::ObjectDeleter [struct]
@@ -473,7 +473,6 @@
     register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
     register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
     register_Ns3Mac8Address_methods(root_module, root_module['ns3::Mac8Address'])
-    register_Ns3NonCopyable_methods(root_module, root_module['ns3::NonCopyable'])
     register_Ns3ObjectBase_methods(root_module, root_module['ns3::ObjectBase'])
     register_Ns3ObjectDeleter_methods(root_module, root_module['ns3::ObjectDeleter'])
     register_Ns3PacketMetadata_methods(root_module, root_module['ns3::PacketMetadata'])
@@ -2062,12 +2061,6 @@
                    is_static=True)
     return
 
-def register_Ns3NonCopyable_methods(root_module, cls):
-    ## non-copyable.h (module 'core'): ns3::NonCopyable::NonCopyable() [constructor]
-    cls.add_constructor([], 
-                        visibility='protected')
-    return
-
 def register_Ns3ObjectBase_methods(root_module, cls):
     ## object-base.h (module 'core'): ns3::ObjectBase::ObjectBase() [constructor]
     cls.add_constructor([])
@@ -2930,14 +2923,14 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('>=')
     cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_unary_numeric_operator('-')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
     cls.add_constructor([])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(double const value) [constructor]
@@ -2956,6 +2949,8 @@
     cls.add_constructor([param('long unsigned int const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int const v) [constructor]
     cls.add_constructor([param('long long unsigned int const', 'v')])
+    ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int128_t const v) [constructor]
+    cls.add_constructor([param('int128_t const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t const hi, uint64_t const lo) [constructor]
     cls.add_constructor([param('int64_t const', 'hi'), param('uint64_t const', 'lo')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [constructor]
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/click/bindings/modulegen__gcc_LP64.py ns-3.36/src/click/bindings/modulegen__gcc_LP64.py
--- ns-3.35/src/click/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/click/bindings/modulegen__gcc_LP64.py	2022-04-30 18:23:57.786733200 -0700
@@ -67,6 +67,8 @@
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::TraceSourceAccessor'])
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'], import_from_module='ns.core')
     ## hash.h (module 'core'): ns3::Hasher [class]
     module.add_class('Hasher', import_from_module='ns.core')
     ## inet6-socket-address.h (module 'network'): ns3::Inet6SocketAddress [class]
@@ -113,8 +115,6 @@
     module.add_class('Mac8Address', import_from_module='ns.network')
     ## mac8-address.h (module 'network'): ns3::Mac8Address [class]
     root_module['ns3::Mac8Address'].implicitly_converts_to(root_module['ns3::Address'])
-    ## non-copyable.h (module 'core'): ns3::NonCopyable [class]
-    module.add_class('NonCopyable', destructor_visibility='protected', import_from_module='ns.core')
     ## object-base.h (module 'core'): ns3::ObjectBase [class]
     module.add_class('ObjectBase', allow_subclassing=True, import_from_module='ns.core')
     ## object.h (module 'core'): ns3::ObjectDeleter [struct]
@@ -473,7 +473,6 @@
     register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
     register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
     register_Ns3Mac8Address_methods(root_module, root_module['ns3::Mac8Address'])
-    register_Ns3NonCopyable_methods(root_module, root_module['ns3::NonCopyable'])
     register_Ns3ObjectBase_methods(root_module, root_module['ns3::ObjectBase'])
     register_Ns3ObjectDeleter_methods(root_module, root_module['ns3::ObjectDeleter'])
     register_Ns3PacketMetadata_methods(root_module, root_module['ns3::PacketMetadata'])
@@ -2062,12 +2061,6 @@
                    is_static=True)
     return
 
-def register_Ns3NonCopyable_methods(root_module, cls):
-    ## non-copyable.h (module 'core'): ns3::NonCopyable::NonCopyable() [constructor]
-    cls.add_constructor([], 
-                        visibility='protected')
-    return
-
 def register_Ns3ObjectBase_methods(root_module, cls):
     ## object-base.h (module 'core'): ns3::ObjectBase::ObjectBase() [constructor]
     cls.add_constructor([])
@@ -2930,14 +2923,14 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('>=')
     cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_unary_numeric_operator('-')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
     cls.add_constructor([])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(double const value) [constructor]
@@ -2956,6 +2949,8 @@
     cls.add_constructor([param('long unsigned int const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int const v) [constructor]
     cls.add_constructor([param('long long unsigned int const', 'v')])
+    ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int128_t const v) [constructor]
+    cls.add_constructor([param('int128_t const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t const hi, uint64_t const lo) [constructor]
     cls.add_constructor([param('int64_t const', 'hi'), param('uint64_t const', 'lo')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [constructor]
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/click/CMakeLists.txt ns-3.36/src/click/CMakeLists.txt
--- ns-3.35/src/click/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/click/CMakeLists.txt	2022-04-30 18:23:57.782733200 -0700
@@ -0,0 +1,56 @@
+set(NS3_WITH_CLICK
+    ""
+    CACHE PATH
+          "Build with click support"
+)
+set(NS3_CLICK
+    "OFF"
+    CACHE INTERNAL
+          "ON if Click is found in NS3_WITH_CLICK"
+)
+
+find_external_library(
+  DEPENDENCY_NAME click
+  HEADER_NAME simclick.h
+  LIBRARY_NAMES nsclick
+                click
+  SEARCH_PATHS ${NS3_WITH_CLICK}
+)
+
+if((NOT
+    click_FOUND)
+   AND (NOT
+        ${click_FOUND})
+)
+  message(
+    ${HIGHLIGHTED_STATUS}
+    "Skipping src/click"
+  )
+  return()
+endif()
+
+include_directories(${click_INCLUDE_DIRS})
+set(NS3_CLICK
+    "ON"
+    CACHE INTERNAL
+          "ON if Click is found in NS3_WITH_CLICK"
+)
+add_definitions(-DNS3_CLICK)
+
+build_lib(
+  LIBNAME click
+  SOURCE_FILES
+    helper/click-internet-stack-helper.cc
+    model/ipv4-click-routing.cc
+    model/ipv4-l3-click-protocol.cc
+  HEADER_FILES
+    helper/click-internet-stack-helper.h
+    model/ipv4-click-routing.h
+    model/ipv4-l3-click-protocol.h
+  LIBRARIES_TO_LINK
+    ${libcore}
+    ${libnetwork}
+    ${libinternet}
+    ${click_LIBRARIES}
+  TEST_SOURCES test/ipv4-click-routing-test.cc
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/click/doc/click.rst ns-3.36/src/click/doc/click.rst
--- ns-3.35/src/click/doc/click.rst	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/click/doc/click.rst	2022-04-30 18:23:57.786733200 -0700
@@ -91,7 +91,7 @@
 Once Click has been built successfully, change into the ns-3 directory and 
 configure ns-3 with Click Integration support::
 
-  $ ./waf configure --enable-examples --enable-tests --with-nsclick=/path/to/click/source
+  $ ./ns3 configure --enable-examples --enable-tests --with-nsclick=/path/to/click/source
 
 Hint:  If you have click installed one directory above ns-3 (such as in the
 ns-3-allinone directory), and the name of the directory is 'click' (or
@@ -103,7 +103,7 @@
 
 Next, try running one of the examples::
 
-  $ ./waf --run nsclick-simple-lan
+  $ ./ns3 run nsclick-simple-lan
 
 You may then view the resulting .pcap traces, which are named nsclick-simple-lan-0-0.pcap and nsclick-simple-lan-0-1.pcap.
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/click/examples/CMakeLists.txt ns-3.36/src/click/examples/CMakeLists.txt
--- ns-3.35/src/click/examples/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/click/examples/CMakeLists.txt	2022-04-30 18:23:57.786733200 -0700
@@ -0,0 +1,55 @@
+build_lib_example(
+  NAME nsclick-simple-lan
+  SOURCE_FILES nsclick-simple-lan.cc
+  LIBRARIES_TO_LINK
+    ${libclick}
+    ${libcsma}
+    ${libinternet}
+    ${libapplications}
+)
+
+build_lib_example(
+  NAME nsclick-raw-wlan
+  SOURCE_FILES nsclick-raw-wlan.cc
+  LIBRARIES_TO_LINK
+    ${libclick}
+    ${libwifi}
+    ${libinternet}
+    ${libapplications}
+)
+
+build_lib_example(
+  NAME nsclick-udp-client-server-csma
+  SOURCE_FILES nsclick-udp-client-server-csma.cc
+  LIBRARIES_TO_LINK
+    ${libclick}
+    ${libcsma}
+    ${libinternet}
+    ${libapplications}
+)
+
+build_lib_example(
+  NAME nsclick-udp-client-server-wifi
+  SOURCE_FILES nsclick-udp-client-server-wifi.cc
+  LIBRARIES_TO_LINK
+    ${libclick}
+    ${libwifi}
+    ${libinternet}
+    ${libapplications}
+)
+
+build_lib_example(
+  NAME nsclick-routing
+  SOURCE_FILES nsclick-routing.cc
+  LIBRARIES_TO_LINK
+    ${libclick}
+    ${libcsma}
+    ${libinternet}
+    ${libapplications}
+)
+
+build_lib_example(
+  NAME nsclick-defines
+  SOURCE_FILES nsclick-defines.cc
+  LIBRARIES_TO_LINK ${libclick}
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/click/examples/wscript ns-3.36/src/click/examples/wscript
--- ns-3.35/src/click/examples/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/click/examples/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,26 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-   obj = bld.create_ns3_program('nsclick-simple-lan',
-                                ['click', 'csma', 'internet', 'applications'])
-   obj.source = 'nsclick-simple-lan.cc'
-
-   obj = bld.create_ns3_program('nsclick-raw-wlan',
-                                ['click', 'wifi', 'internet', 'applications'])
-   obj.source = 'nsclick-raw-wlan.cc'
-
-   obj = bld.create_ns3_program('nsclick-udp-client-server-csma',
-                                ['click', 'csma', 'internet', 'applications'])
-   obj.source = 'nsclick-udp-client-server-csma.cc'
-
-   obj = bld.create_ns3_program('nsclick-udp-client-server-wifi',
-                                ['click', 'wifi', 'internet', 'applications'])
-   obj.source = 'nsclick-udp-client-server-wifi.cc'
-
-   obj = bld.create_ns3_program('nsclick-routing',
-                                ['click', 'csma', 'internet', 'applications'])
-   obj.source = 'nsclick-routing.cc'
-
-   obj = bld.create_ns3_program('nsclick-defines',
-                                ['click'])
-   obj.source = 'nsclick-defines.cc'
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/click/wscript ns-3.36/src/click/wscript
--- ns-3.35/src/click/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/click/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,137 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-import os
-
-from waflib import Options
-
-
-def options(opt):
-    opt.add_option('--with-nsclick',
-                   help=('Path to Click source or installation prefix for NS-3 Click Integration support'),
-                   dest='with_nsclick', default=None)
-    opt.add_option('--disable-nsclick',
-                   help=('Disable NS-3 Click Integration support'),
-                   dest='disable_nsclick', default=False, action="store_true")
-
-def configure(conf):
-    if Options.options.disable_nsclick:
-        conf.report_optional_feature("nsclick", "NS-3 Click Integration", False,
-                                     "disabled by user request")
-        return
-        
-    if Options.options.with_nsclick:
-        if os.path.isdir(Options.options.with_nsclick):
-            conf.msg("Checking for libnsclick.so location", ("%s (given)" % Options.options.with_nsclick))
-            conf.env['WITH_NSCLICK'] = os.path.abspath(Options.options.with_nsclick)
-    else:
-        # bake.py uses ../../build, while ns-3-dev uses ../click.
-        lib_to_check = 'libnsclick.so'
-        nsclick_bake_build_dir = os.path.join('..', '..', 'build')
-        nsclick_bake_lib_dir = os.path.join(nsclick_bake_build_dir, 'lib')
-        nsclick_dir = os.path.join('..','click')
-        if os.path.exists(os.path.join(nsclick_bake_lib_dir, lib_to_check)):
-            conf.msg("Checking for click location",("%s (guessed)" % nsclick_bake_build_dir))
-            conf.env['WITH_NSCLICK'] = os.path.abspath(nsclick_bake_build_dir)
-        elif os.path.isdir(nsclick_dir):
-            conf.msg("Checking for click location", ("%s (guessed)" % nsclick_dir))
-            conf.env['WITH_NSCLICK'] = os.path.abspath(nsclick_dir)
-        del nsclick_bake_build_dir
-        del nsclick_bake_lib_dir
-        del nsclick_dir
-    if not conf.env['WITH_NSCLICK']:
-        conf.msg("Checking for click location", False)
-        conf.report_optional_feature("nsclick", "NS-3 Click Integration", False,
-                                     "nsclick not enabled (see option --with-nsclick)")
-
-        # Add this module to the list of modules that won't be built
-        # if they are enabled.
-        conf.env['MODULES_NOT_BUILT'].append('click')
-
-        return
-
-    test_code = '''
-#include<sys/types.h>
-#include<sys/time.h>
-#include<click/simclick.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-int simclick_sim_send(simclick_node_t *sim,int ifid,int type, const unsigned char* data,int len,simclick_simpacketinfo *pinfo)
-{
-  return 0;
-}
-
-int simclick_sim_command(simclick_node_t *sim, int cmd, ...)
-{
-  return 0;
-}
-#ifdef __cplusplus
-}
-#endif
-
-int main()
-{
-  return 0;
-}
-'''
-    conf.env['HAVE_DL'] = conf.check(mandatory=True, lib='dl', define_name='HAVE_DL', uselib_store='DL')
-
-    for tmp in ['lib', 'ns']:
-        libdir = os.path.abspath(os.path.join(conf.env['WITH_NSCLICK'],tmp))
-        if os.path.isdir(libdir):
-            conf.env.append_value('NS3_MODULE_PATH',libdir)
-            conf.env['LIBPATH_NSCLICK'] = [libdir]
-
-    conf.env['INCLUDES_NSCLICK'] = [os.path.abspath(os.path.join(conf.env['WITH_NSCLICK'],'include'))]
-    conf.env['LIB_NSCLICK'] = ['nsclick']
-    conf.env['DEFINES_NSCLICK'] = ['NS3_CLICK']
-    conf.env['NSCLICK'] = conf.check_nonfatal(fragment=test_code, use='DL NSCLICK',
-                                              msg="Checking for library nsclick")
-    conf.report_optional_feature("nsclick", "NS-3 Click Integration",
-                                  conf.env['NSCLICK'], "nsclick library not found")
-    if not conf.env['NSCLICK']:
-        # Add this module to the list of modules that won't be built
-        # if they are enabled.
-        conf.env['MODULES_NOT_BUILT'].append('click')
-
-def build(bld):
-    # Don't do anything for this module if click should not be built.
-    if 'click' in bld.env['MODULES_NOT_BUILT']:
-        return
-
-    module = bld.create_ns3_module('click', ['core', 'network', 'internet'])
-    module.source = [
-        'model/ipv4-click-routing.cc',
-        'model/ipv4-l3-click-protocol.cc',
-        'helper/click-internet-stack-helper.cc',
-        ]
-
-    module_test = bld.create_ns3_module_test_library('click')
-    module_test.source = [
-        'test/ipv4-click-routing-test.cc',
-        ]
-
-    # Tests encapsulating example programs should be listed here
-    if (bld.env['ENABLE_EXAMPLES']):
-        module_test.source.extend([
-        #   'test/click-examples-test-suite.cc',
-            ])
-    
-    if bld.env['NSCLICK'] and bld.env['HAVE_DL']:
-        module.use.extend(['NSCLICK', 'DL'])
-        module_test.use.extend(['NSCLICK', 'DL'])
-
-    headers = bld(features='ns3header')
-    headers.module = 'click'
-    headers.source = [
-        'model/ipv4-click-routing.h',
-        'model/ipv4-l3-click-protocol.h',
-        'helper/click-internet-stack-helper.h',
-        ]
-
-    if bld.env['ENABLE_EXAMPLES']:
-        bld.recurse('examples')
-
-    bld.ns3_python_bindings()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/CMakeLists.txt ns-3.36/src/CMakeLists.txt
--- ns-3.35/src/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/CMakeLists.txt	2022-04-30 18:23:57.726733000 -0700
@@ -0,0 +1,82 @@
+set(libs "${libs_to_build}")
+
+# Process the visualizer module first if enabled
+if(visualizer IN_LIST libs)
+  if(${ENABLE_VISUALIZER})
+    message(STATUS "Processing src/visualizer")
+    add_subdirectory(visualizer)
+  endif()
+  list(REMOVE_ITEM libs visualizer)
+endif()
+
+# Process subdirectories
+foreach(libname ${libs})
+  if(EXISTS ${PROJECT_SOURCE_DIR}/src/${libname}/CMakeLists.txt)
+    message(STATUS "Processing src/${libname}")
+    add_subdirectory(${libname})
+  else()
+    message(
+      ${HIGHLIGHTED_STATUS}
+      "Skipping src/${libname} : it does not contain a CMakeLists.txt file"
+    )
+  endif()
+endforeach()
+
+# Build the lib-ns3-static (ns3.x-static-buildtype.a/.lib) with all sublibraries
+if(${NS3_STATIC})
+  add_library(
+    ${lib-ns3-static} STATIC ${PROJECT_SOURCE_DIR}/build-support/empty.cc
+                             "${lib-ns3-static-objs}"
+  )
+
+  # Replace shared library suffix and check if static version exists before
+  # linking
+  set(ns3-external-static-libs)
+  foreach(sharedlib ${ns3-external-libs})
+    if(NOT (${sharedlib} MATCHES ".so"))
+      list(APPEND ns3-external-static-libs ${sharedlib})
+      continue()
+    endif()
+
+    string(REPLACE ".so" ".a" output ${sharedlib})
+    if(EXISTS ${output})
+      list(APPEND ns3-external-static-libs ${output})
+    else()
+      message(
+        FATAL_ERROR "Static library version of ${sharedlib} was not found"
+      )
+    endif()
+  endforeach()
+
+  target_link_libraries(
+    ${lib-ns3-static}
+    -static
+    -static-libstdc++
+    -static-libgcc
+    ${LIB_AS_NEEDED_PRE_STATIC}
+    ${ns3-external-static-libs}
+    ${LIB_AS_NEEDED_POST_STATIC}
+  )
+  if(${NS3_CLANG_TIMETRACE})
+    add_dependencies(timeTraceReport ${lib-ns3-static})
+  endif()
+endif()
+
+# Build the lib-ns3-static (ns3.x-monolib-buildtype.dll/.dylib/.so) with all
+# sublibraries
+if(${NS3_MONOLIB})
+  add_library(
+    ${lib-ns3-monolib} SHARED ${PROJECT_SOURCE_DIR}/build-support/empty.cc
+                              "${lib-ns3-static-objs}"
+  )
+  set_target_properties(
+    ${lib-ns3-monolib} PROPERTIES INTERPROCEDURAL_OPTIMIZATION TRUE
+  )
+  target_link_libraries(
+    ${lib-ns3-monolib} ${LIB_AS_NEEDED_PRE} ${ns3-external-libs}
+    ${LIB_AS_NEEDED_POST}
+  )
+  if(${NS3_CLANG_TIMETRACE})
+    add_dependencies(timeTraceReport ${lib-ns3-monolib})
+  endif()
+endif()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/config-store/bindings/modulegen__gcc_ILP32.py ns-3.36/src/config-store/bindings/modulegen__gcc_ILP32.py
--- ns-3.35/src/config-store/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/config-store/bindings/modulegen__gcc_ILP32.py	2022-04-30 18:23:57.786733200 -0700
@@ -38,6 +38,8 @@
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::TraceSourceAccessor'])
     ## file-config.h (module 'config-store'): ns3::FileConfig [class]
     module.add_class('FileConfig', allow_subclassing=True)
+    ## gtk-config-store.h (module 'config-store'): ns3::GtkConfigStore [class]
+    module.add_class('GtkConfigStore')
     ## hash.h (module 'core'): ns3::Hasher [class]
     module.add_class('Hasher', import_from_module='ns.core')
     ## log.h (module 'core'): ns3::LogComponent [class]
@@ -72,17 +74,17 @@
     module.add_enum('Mode', ['LOAD', 'SAVE', 'NONE'], outer_class=root_module['ns3::ConfigStore'])
     ## config-store.h (module 'config-store'): ns3::ConfigStore::FileFormat [enumeration]
     module.add_enum('FileFormat', ['XML', 'RAW_TEXT'], outer_class=root_module['ns3::ConfigStore'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
     module.add_class('TraceSourceAccessor', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >'])
@@ -110,7 +112,7 @@
     module.add_class('TypeIdValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
     ## callback.h (module 'core'): ns3::CallbackImpl<ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['ns3::ObjectBase *', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )', 'ns3::TimePrinter')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )*', 'ns3::TimePrinter*')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )&', 'ns3::TimePrinter&')
@@ -173,6 +175,7 @@
     register_Ns3DefaultDeleter__Ns3HashImplementation_methods(root_module, root_module['ns3::DefaultDeleter< ns3::Hash::Implementation >'])
     register_Ns3DefaultDeleter__Ns3TraceSourceAccessor_methods(root_module, root_module['ns3::DefaultDeleter< ns3::TraceSourceAccessor >'])
     register_Ns3FileConfig_methods(root_module, root_module['ns3::FileConfig'])
+    register_Ns3GtkConfigStore_methods(root_module, root_module['ns3::GtkConfigStore'])
     register_Ns3Hasher_methods(root_module, root_module['ns3::Hasher'])
     register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
     register_Ns3NoneFileConfig_methods(root_module, root_module['ns3::NoneFileConfig'])
@@ -327,6 +330,21 @@
                    [param('bool', 'saveDeprecated')])
     return
 
+def register_Ns3GtkConfigStore_methods(root_module, cls):
+    ## gtk-config-store.h (module 'config-store'): ns3::GtkConfigStore::GtkConfigStore(ns3::GtkConfigStore const & arg0) [constructor]
+    cls.add_constructor([param('ns3::GtkConfigStore const &', 'arg0')])
+    ## gtk-config-store.h (module 'config-store'): ns3::GtkConfigStore::GtkConfigStore() [constructor]
+    cls.add_constructor([])
+    ## gtk-config-store.h (module 'config-store'): void ns3::GtkConfigStore::ConfigureAttributes() [member function]
+    cls.add_method('ConfigureAttributes', 
+                   'void', 
+                   [])
+    ## gtk-config-store.h (module 'config-store'): void ns3::GtkConfigStore::ConfigureDefaults() [member function]
+    cls.add_method('ConfigureDefaults', 
+                   'void', 
+                   [])
+    return
+
 def register_Ns3Hasher_methods(root_module, cls):
     ## hash.h (module 'core'): ns3::Hasher::Hasher(ns3::Hasher const & arg0) [constructor]
     cls.add_constructor([param('ns3::Hasher const &', 'arg0')])
@@ -505,8 +523,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -761,44 +779,44 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/config-store/bindings/modulegen__gcc_LP64.py ns-3.36/src/config-store/bindings/modulegen__gcc_LP64.py
--- ns-3.35/src/config-store/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/config-store/bindings/modulegen__gcc_LP64.py	2022-04-30 18:23:57.786733200 -0700
@@ -38,6 +38,8 @@
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::TraceSourceAccessor'])
     ## file-config.h (module 'config-store'): ns3::FileConfig [class]
     module.add_class('FileConfig', allow_subclassing=True)
+    ## gtk-config-store.h (module 'config-store'): ns3::GtkConfigStore [class]
+    module.add_class('GtkConfigStore')
     ## hash.h (module 'core'): ns3::Hasher [class]
     module.add_class('Hasher', import_from_module='ns.core')
     ## log.h (module 'core'): ns3::LogComponent [class]
@@ -72,17 +74,17 @@
     module.add_enum('Mode', ['LOAD', 'SAVE', 'NONE'], outer_class=root_module['ns3::ConfigStore'])
     ## config-store.h (module 'config-store'): ns3::ConfigStore::FileFormat [enumeration]
     module.add_enum('FileFormat', ['XML', 'RAW_TEXT'], outer_class=root_module['ns3::ConfigStore'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
     module.add_class('TraceSourceAccessor', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >'])
@@ -110,7 +112,7 @@
     module.add_class('TypeIdValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
     ## callback.h (module 'core'): ns3::CallbackImpl<ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['ns3::ObjectBase *', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )', 'ns3::TimePrinter')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )*', 'ns3::TimePrinter*')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )&', 'ns3::TimePrinter&')
@@ -173,6 +175,7 @@
     register_Ns3DefaultDeleter__Ns3HashImplementation_methods(root_module, root_module['ns3::DefaultDeleter< ns3::Hash::Implementation >'])
     register_Ns3DefaultDeleter__Ns3TraceSourceAccessor_methods(root_module, root_module['ns3::DefaultDeleter< ns3::TraceSourceAccessor >'])
     register_Ns3FileConfig_methods(root_module, root_module['ns3::FileConfig'])
+    register_Ns3GtkConfigStore_methods(root_module, root_module['ns3::GtkConfigStore'])
     register_Ns3Hasher_methods(root_module, root_module['ns3::Hasher'])
     register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
     register_Ns3NoneFileConfig_methods(root_module, root_module['ns3::NoneFileConfig'])
@@ -327,6 +330,21 @@
                    [param('bool', 'saveDeprecated')])
     return
 
+def register_Ns3GtkConfigStore_methods(root_module, cls):
+    ## gtk-config-store.h (module 'config-store'): ns3::GtkConfigStore::GtkConfigStore(ns3::GtkConfigStore const & arg0) [constructor]
+    cls.add_constructor([param('ns3::GtkConfigStore const &', 'arg0')])
+    ## gtk-config-store.h (module 'config-store'): ns3::GtkConfigStore::GtkConfigStore() [constructor]
+    cls.add_constructor([])
+    ## gtk-config-store.h (module 'config-store'): void ns3::GtkConfigStore::ConfigureAttributes() [member function]
+    cls.add_method('ConfigureAttributes', 
+                   'void', 
+                   [])
+    ## gtk-config-store.h (module 'config-store'): void ns3::GtkConfigStore::ConfigureDefaults() [member function]
+    cls.add_method('ConfigureDefaults', 
+                   'void', 
+                   [])
+    return
+
 def register_Ns3Hasher_methods(root_module, cls):
     ## hash.h (module 'core'): ns3::Hasher::Hasher(ns3::Hasher const & arg0) [constructor]
     cls.add_constructor([param('ns3::Hasher const &', 'arg0')])
@@ -505,8 +523,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -761,44 +779,44 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/config-store/CMakeLists.txt ns-3.36/src/config-store/CMakeLists.txt
--- ns-3.35/src/config-store/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/config-store/CMakeLists.txt	2022-04-30 18:23:57.786733200 -0700
@@ -0,0 +1,53 @@
+if(${GTK3_FOUND})
+  set(gtk3_sources
+      model/display-functions.cc
+      model/gtk-config-store.cc
+      model/model-node-creator.cc
+      model/model-typeid-creator.cc
+  )
+
+  set(gtk3_headers
+      model/gtk-config-store.h
+  )
+  include_directories(
+    ${GTK3_INCLUDE_DIRS}
+    ${HarfBuzz_INCLUDE_DIRS}
+  )
+  set(gtk_libraries
+      ${GTK3_LIBRARIES}
+  )
+  if(${GCC})
+    add_definitions(-Wno-parentheses)
+  endif()
+endif()
+
+if(${LIBXML2_FOUND})
+  set(xml2_sources
+      model/xml-config.cc
+  )
+  set(xml2_libraries
+      ${LIBXML2_LIBRARIES}
+  )
+  include_directories(${LIBXML2_INCLUDE_DIR})
+endif()
+
+build_lib(
+  LIBNAME config-store
+  SOURCE_FILES
+    ${gtk3_sources}
+    ${xml2_sources}
+    model/attribute-default-iterator.cc
+    model/attribute-iterator.cc
+    model/config-store.cc
+    model/file-config.cc
+    model/raw-text-config.cc
+  HEADER_FILES
+    ${gtk3_headers}
+    model/file-config.h
+    model/config-store.h
+  LIBRARIES_TO_LINK
+    ${libcore}
+    ${libnetwork}
+    ${xml2_libraries}
+    ${gtk_libraries}
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/config-store/examples/CMakeLists.txt ns-3.36/src/config-store/examples/CMakeLists.txt
--- ns-3.35/src/config-store/examples/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/config-store/examples/CMakeLists.txt	2022-04-30 18:23:57.786733200 -0700
@@ -0,0 +1,6 @@
+build_lib_example(
+  NAME config-store-save
+  SOURCE_FILES config-store-save.cc
+  LIBRARIES_TO_LINK ${libcore}
+                    ${libconfig-store}
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/config-store/examples/wscript ns-3.36/src/config-store/examples/wscript
--- ns-3.35/src/config-store/examples/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/config-store/examples/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,6 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-
-    obj = bld.create_ns3_program('config-store-save', ['core', 'config-store'])
-    obj.source = 'config-store-save.cc'
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/config-store/wscript ns-3.36/src/config-store/wscript
--- ns-3.35/src/config-store/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/config-store/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,96 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-import wutils
-import sys
-import subprocess
-from waflib import Options
-
-# Bug 2936 gcc version issue for GTK+ and -Wparentheses
-gcc_version_gtkplus_warning_issue = (8, 0, 0)
-
-def options(opt):
-    opt.add_option('--disable-gtk',
-                   help=('Disable GTK+ support'),
-                   dest='disable_gtk', default=False, action="store_true")
-
-
-def configure(conf):
-    if Options.options.disable_gtk:
-        conf.env['ENABLE_GTK'] = False
-        conf.report_optional_feature("GtkConfigStore", "GtkConfigStore",
-                                     conf.env['ENABLE_GTK'],
-                                     "--disable-gtk option given")
-    else:
-        have_gtk = conf.check_cfg(package='gtk+-3.0 >= 3.22',
-                                  args=['--cflags', '--libs'], uselib_store='GTK',
-                                  mandatory=False)
-
-        conf.env['ENABLE_GTK'] = have_gtk
-        conf.report_optional_feature("GtkConfigStore", "GtkConfigStore",
-                                     conf.env['ENABLE_GTK'],
-                                     "library 'gtk+-3 >= 3.22' not found")
-
-        # Bug 2936 and #340 -Wparentheses issue for gcc >= 8
-        # This have to be kept until we can bump the minimum GTK version to 3.24
-        if conf.env['ENABLE_GTK']:
-            if conf.env['CXX_NAME'] in ['gcc']:
-                if tuple(map(int, conf.env['CC_VERSION'])) >= gcc_version_gtkplus_warning_issue:
-                    conf.env.append_value('CXXFLAGS', '-Wno-parentheses')
-
-    have_libxml2 = conf.check_cfg(package='libxml-2.0 >= 2.7',
-                                  args=['--cflags', '--libs'], uselib_store='LIBXML2',
-                                  mandatory=False)
-
-    conf.env['ENABLE_LIBXML2'] = have_libxml2
-    conf.report_optional_feature("XmlIo", "XmlIo",
-                                 conf.env['ENABLE_LIBXML2'],
-                                 "library 'libxml-2.0 >= 2.7' not found")
-
-    conf.write_config_header('ns3/config-store-config.h', top=True)
-
-
-def build(bld):
-    bld.install_files('${INCLUDEDIR}/%s%s/ns3' % (wutils.APPNAME, wutils.VERSION), '../../ns3/config-store-config.h')
-
-    module = bld.create_ns3_module('config-store', ['core', 'network'])
-    module.source = [
-        'model/attribute-iterator.cc',
-        'model/config-store.cc',
-        'model/attribute-default-iterator.cc',
-        'model/file-config.cc',
-        'model/raw-text-config.cc',
-        ]
-
-    headers = bld(features='ns3header')
-    headers.module = 'config-store'
-    headers.source = [
-        'model/file-config.h',
-        'model/config-store.h',
-        ]
-
-    if bld.env['ENABLE_GTK']:
-        headers.source.append('model/gtk-config-store.h')
-        module.source.extend(['model/gtk-config-store.cc',
-                              'model/model-node-creator.cc',
-                              'model/model-typeid-creator.cc',
-                              'model/display-functions.cc',
-                              ])
-        module.use.append('GTK')
-
-    if bld.env['ENABLE_LIBXML2']:
-        module.source.append('model/xml-config.cc')
-        module.use.append('LIBXML2')
-        # Bug 2637:  use xcrun utility to find where macOS puts headers
-        if sys.platform == 'darwin':
-            find_sdk_path = '/usr/bin/xcrun --show-sdk-path'.split()
-            try:
-                p = subprocess.Popen(find_sdk_path, stdout=subprocess.PIPE)
-                xcrun_output = p.stdout.read().strip().decode("utf-8")
-                module.includes = str(xcrun_output + u'/usr/include/libxml2')
-            except OSError:
-                pass
-
-    if bld.env['ENABLE_EXAMPLES']:
-        bld.recurse('examples')
-
-    bld.ns3_python_bindings()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/bindings/callbacks_list.py ns-3.36/src/core/bindings/callbacks_list.py
--- ns-3.35/src/core/bindings/callbacks_list.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/bindings/callbacks_list.py	2022-04-30 18:23:57.790733000 -0700
@@ -1,6 +1,6 @@
 callback_classes = [
     ['ns3::ObjectBase *', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['bool', 'std::basic_string<char>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'unsigned char *', 'long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['bool', 'std::basic_string<char>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
 ]
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/bindings/modulegen__gcc_ILP32.py ns-3.36/src/core/bindings/modulegen__gcc_ILP32.py
--- ns-3.35/src/core/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/bindings/modulegen__gcc_ILP32.py	2022-04-30 18:23:57.790733000 -0700
@@ -62,6 +62,8 @@
     module.add_class('EventGarbageCollector')
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'])
     ## global-value.h (module 'core'): ns3::GlobalValue [class]
     module.add_class('GlobalValue')
     typehandlers.add_type_alias('std::vector< ns3::GlobalValue * > const_iterator', 'ns3::GlobalValue::Iterator')
@@ -110,8 +112,6 @@
     typehandlers.add_type_alias('std::map< std::string, ns3::LogComponent * >&', 'ns3::LogComponent::ComponentList&')
     ## names.h (module 'core'): ns3::Names [class]
     module.add_class('Names')
-    ## non-copyable.h (module 'core'): ns3::NonCopyable [class]
-    module.add_class('NonCopyable', destructor_visibility='protected')
     ## object-base.h (module 'core'): ns3::ObjectBase [class]
     module.add_class('ObjectBase', allow_subclassing=True)
     ## object.h (module 'core'): ns3::ObjectDeleter [struct]
@@ -135,7 +135,7 @@
     ## simulator.h (module 'core'): ns3::Simulator [enumeration]
     module.add_enum('', ['NO_CONTEXT'], outer_class=root_module['ns3::Simulator'])
     ## singleton.h (module 'core'): ns3::Singleton<ns3::DesMetrics> [class]
-    module.add_class('Singleton', parent=root_module['ns3::NonCopyable'], template_parameters=['ns3::DesMetrics'])
+    module.add_class('Singleton', destructor_visibility='protected', template_parameters=['ns3::DesMetrics'])
     ## system-condition.h (module 'core'): ns3::SystemCondition [class]
     module.add_class('SystemCondition')
     ## system-mutex.h (module 'core'): ns3::SystemMutex [class]
@@ -204,25 +204,25 @@
     module.add_class('EventKey', outer_class=root_module['ns3::Scheduler'])
     ## random-variable-stream.h (module 'core'): ns3::SequentialRandomVariable [class]
     module.add_class('SequentialRandomVariable', parent=root_module['ns3::RandomVariableStream'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::FdReader, ns3::empty, ns3::DefaultDeleter<ns3::FdReader> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::FdReader, ns3::empty, ns3::DefaultDeleter<ns3::FdReader>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::FdReader', 'ns3::empty', 'ns3::DefaultDeleter<ns3::FdReader>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::RefCountBase, ns3::empty, ns3::DefaultDeleter<ns3::RefCountBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::RefCountBase, ns3::empty, ns3::DefaultDeleter<ns3::RefCountBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::RefCountBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::RefCountBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SystemThread, ns3::empty, ns3::DefaultDeleter<ns3::SystemThread> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SystemThread, ns3::empty, ns3::DefaultDeleter<ns3::SystemThread>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::SystemThread', 'ns3::empty', 'ns3::DefaultDeleter<ns3::SystemThread>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
     ## simulator-impl.h (module 'core'): ns3::SimulatorImpl [class]
     module.add_class('SimulatorImpl', parent=root_module['ns3::Object'])
@@ -351,6 +351,8 @@
     module.add_class('StringValue', parent=root_module['ns3::AttributeValue'])
     ## nstime.h (module 'core'): ns3::TimeValue [class]
     module.add_class('TimeValue', parent=root_module['ns3::AttributeValue'])
+    ## tuple.h (module 'core'): ns3::TupleChecker [class]
+    module.add_class('TupleChecker', parent=root_module['ns3::AttributeChecker'])
     ## type-id.h (module 'core'): ns3::TypeIdChecker [class]
     module.add_class('TypeIdChecker', parent=root_module['ns3::AttributeChecker'])
     ## type-id.h (module 'core'): ns3::TypeIdValue [class]
@@ -373,8 +375,9 @@
     module.add_class('CallbackImpl', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char *, long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned char *', 'long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    module.add_container('std::vector< std::string >', 'std::string', container_type='vector')
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::vector< std::string >', 'std::basic_string< char, std::char_traits< char >, std::allocator< char > >', container_type='vector')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::vector< ns3::Ptr< ns3::AttributeChecker const > >', 'ns3::Ptr< ns3::AttributeChecker const >', container_type='vector')
     typehandlers.add_type_alias('ns3::Vector3D', 'ns3::Vector')
     typehandlers.add_type_alias('ns3::Vector3D*', 'ns3::Vector*')
     typehandlers.add_type_alias('ns3::Vector3D&', 'ns3::Vector&')
@@ -505,7 +508,7 @@
 def register_types_ns3_SystemPath(module):
     root_module = module.get_root()
     
-    module.add_container('std::list< std::string >', 'std::string', container_type='list')
+    module.add_container('std::list< std::string >', 'std::basic_string< char, std::char_traits< char >, std::allocator< char > >', container_type='list')
 
 def register_types_ns3_TracedValueCallback(module):
     root_module = module.get_root()
@@ -586,7 +589,6 @@
     register_Ns3LengthQuantity_methods(root_module, root_module['ns3::Length::Quantity'])
     register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
     register_Ns3Names_methods(root_module, root_module['ns3::Names'])
-    register_Ns3NonCopyable_methods(root_module, root_module['ns3::NonCopyable'])
     register_Ns3ObjectBase_methods(root_module, root_module['ns3::ObjectBase'])
     register_Ns3ObjectDeleter_methods(root_module, root_module['ns3::ObjectDeleter'])
     register_Ns3ObjectFactory_methods(root_module, root_module['ns3::ObjectFactory'])
@@ -691,6 +693,7 @@
     register_Ns3StringChecker_methods(root_module, root_module['ns3::StringChecker'])
     register_Ns3StringValue_methods(root_module, root_module['ns3::StringValue'])
     register_Ns3TimeValue_methods(root_module, root_module['ns3::TimeValue'])
+    register_Ns3TupleChecker_methods(root_module, root_module['ns3::TupleChecker'])
     register_Ns3TypeIdChecker_methods(root_module, root_module['ns3::TypeIdChecker'])
     register_Ns3TypeIdValue_methods(root_module, root_module['ns3::TypeIdValue'])
     register_Ns3UintegerValue_methods(root_module, root_module['ns3::UintegerValue'])
@@ -836,7 +839,7 @@
     cls.add_method('Parse', 
                    'void', 
                    [param('int', 'argc'), param('char * *', 'argv')])
-    ## command-line.h (module 'core'): void ns3::CommandLine::Parse(std::vector<std::basic_string<char>, std::allocator<std::basic_string<char> > > args) [member function]
+    ## command-line.h (module 'core'): void ns3::CommandLine::Parse(std::vector<std::basic_string<char>, std::allocator<std::basic_string<char>>> args) [member function]
     cls.add_method('Parse', 
                    'void', 
                    [param('std::vector< std::string >', 'args')])
@@ -1390,12 +1393,6 @@
                    is_static=True)
     return
 
-def register_Ns3NonCopyable_methods(root_module, cls):
-    ## non-copyable.h (module 'core'): ns3::NonCopyable::NonCopyable() [constructor]
-    cls.add_constructor([], 
-                        visibility='protected')
-    return
-
 def register_Ns3ObjectBase_methods(root_module, cls):
     ## object-base.h (module 'core'): ns3::ObjectBase::ObjectBase() [constructor]
     cls.add_constructor([])
@@ -1694,7 +1691,8 @@
                    [], 
                    is_static=True)
     ## singleton.h (module 'core'): ns3::Singleton<ns3::DesMetrics>::Singleton() [constructor]
-    cls.add_constructor([])
+    cls.add_constructor([], 
+                        visibility='protected')
     return
 
 def register_Ns3SystemCondition_methods(root_module, cls):
@@ -2167,8 +2165,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -2468,14 +2466,14 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('>=')
     cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_unary_numeric_operator('-')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
     cls.add_constructor([])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(double const value) [constructor]
@@ -2494,6 +2492,8 @@
     cls.add_constructor([param('long unsigned int const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int const v) [constructor]
     cls.add_constructor([param('long long unsigned int const', 'v')])
+    ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int128_t const v) [constructor]
+    cls.add_constructor([param('int128_t const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t const hi, uint64_t const lo) [constructor]
     cls.add_constructor([param('int64_t const', 'hi'), param('uint64_t const', 'lo')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [constructor]
@@ -2537,7 +2537,7 @@
     return
 
 def register_Ns3DesMetrics_methods(root_module, cls):
-    ## des-metrics.h (module 'core'): void ns3::DesMetrics::Initialize(std::vector<std::basic_string<char>, std::allocator<std::basic_string<char> > > args, std::string outDir="") [member function]
+    ## des-metrics.h (module 'core'): void ns3::DesMetrics::Initialize(std::vector<std::basic_string<char>, std::allocator<std::basic_string<char>>> args, std::string outDir="") [member function]
     cls.add_method('Initialize', 
                    'void', 
                    [param('std::vector< std::string >', 'args'), param('std::string', 'outDir', default_value='""')])
@@ -2787,72 +2787,72 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3FdReader_Ns3Empty_Ns3DefaultDeleter__lt__ns3FdReader__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::FdReader, ns3::empty, ns3::DefaultDeleter<ns3::FdReader> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::FdReader, ns3::empty, ns3::DefaultDeleter<ns3::FdReader>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::FdReader, ns3::empty, ns3::DefaultDeleter<ns3::FdReader> >::SimpleRefCount(ns3::SimpleRefCount<ns3::FdReader, ns3::empty, ns3::DefaultDeleter<ns3::FdReader> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::FdReader, ns3::empty, ns3::DefaultDeleter<ns3::FdReader>>::SimpleRefCount(ns3::SimpleRefCount<ns3::FdReader, ns3::empty, ns3::DefaultDeleter<ns3::FdReader>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::FdReader, ns3::empty, ns3::DefaultDeleter< ns3::FdReader > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3RefCountBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3RefCountBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::RefCountBase, ns3::empty, ns3::DefaultDeleter<ns3::RefCountBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::RefCountBase, ns3::empty, ns3::DefaultDeleter<ns3::RefCountBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::RefCountBase, ns3::empty, ns3::DefaultDeleter<ns3::RefCountBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::RefCountBase, ns3::empty, ns3::DefaultDeleter<ns3::RefCountBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::RefCountBase, ns3::empty, ns3::DefaultDeleter<ns3::RefCountBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::RefCountBase, ns3::empty, ns3::DefaultDeleter<ns3::RefCountBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::RefCountBase, ns3::empty, ns3::DefaultDeleter< ns3::RefCountBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3SystemThread_Ns3Empty_Ns3DefaultDeleter__lt__ns3SystemThread__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SystemThread, ns3::empty, ns3::DefaultDeleter<ns3::SystemThread> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SystemThread, ns3::empty, ns3::DefaultDeleter<ns3::SystemThread>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SystemThread, ns3::empty, ns3::DefaultDeleter<ns3::SystemThread> >::SimpleRefCount(ns3::SimpleRefCount<ns3::SystemThread, ns3::empty, ns3::DefaultDeleter<ns3::SystemThread> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SystemThread, ns3::empty, ns3::DefaultDeleter<ns3::SystemThread>>::SimpleRefCount(ns3::SimpleRefCount<ns3::SystemThread, ns3::empty, ns3::DefaultDeleter<ns3::SystemThread>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::SystemThread, ns3::empty, ns3::DefaultDeleter< ns3::SystemThread > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
@@ -2916,6 +2916,11 @@
                    'ns3::Time', 
                    [], 
                    is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## simulator-impl.h (module 'core'): void ns3::SimulatorImpl::PreEventHook(ns3::EventId const & id) [member function]
+    cls.add_method('PreEventHook', 
+                   'void', 
+                   [param('ns3::EventId const &', 'id')], 
+                   is_virtual=True)
     ## simulator-impl.h (module 'core'): void ns3::SimulatorImpl::Remove(ns3::EventId const & id) [member function]
     cls.add_method('Remove', 
                    'void', 
@@ -2997,10 +3002,10 @@
     cls.add_method('Realtime', 
                    'bool', 
                    [])
-    ## synchronizer.h (module 'core'): void ns3::Synchronizer::SetCondition(bool arg0) [member function]
+    ## synchronizer.h (module 'core'): void ns3::Synchronizer::SetCondition(bool cond) [member function]
     cls.add_method('SetCondition', 
                    'void', 
-                   [param('bool', 'arg0')])
+                   [param('bool', 'cond')])
     ## synchronizer.h (module 'core'): void ns3::Synchronizer::SetOrigin(uint64_t ts) [member function]
     cls.add_method('SetOrigin', 
                    'void', 
@@ -3038,10 +3043,10 @@
                    'bool', 
                    [], 
                    is_pure_virtual=True, is_virtual=True, visibility='protected')
-    ## synchronizer.h (module 'core'): void ns3::Synchronizer::DoSetCondition(bool arg0) [member function]
+    ## synchronizer.h (module 'core'): void ns3::Synchronizer::DoSetCondition(bool cond) [member function]
     cls.add_method('DoSetCondition', 
                    'void', 
-                   [param('bool', 'arg0')], 
+                   [param('bool', 'cond')], 
                    is_pure_virtual=True, is_virtual=True, visibility='protected')
     ## synchronizer.h (module 'core'): void ns3::Synchronizer::DoSetOrigin(uint64_t ns) [member function]
     cls.add_method('DoSetOrigin', 
@@ -3632,27 +3637,27 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['bool'], visibility='protected')
+                   is_static=True, template_parameters=['void'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['std::__cxx11::basic_string<char', ' std::char_traits<char>', ' std::allocator<char> > '], visibility='protected')
+                   is_static=True, template_parameters=['unsigned char*'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['void'], visibility='protected')
+                   is_static=True, template_parameters=['long'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['unsigned char*'], visibility='protected')
+                   is_static=True, template_parameters=['bool'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['long'], visibility='protected')
+                   is_static=True, template_parameters=['std::__cxx11::basic_string<char', ' std::char_traits<char>', ' std::allocator<char> > '], visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -5021,6 +5026,18 @@
                    [param('ns3::Time const &', 'value')])
     return
 
+def register_Ns3TupleChecker_methods(root_module, cls):
+    ## tuple.h (module 'core'): ns3::TupleChecker::TupleChecker() [constructor]
+    cls.add_constructor([])
+    ## tuple.h (module 'core'): ns3::TupleChecker::TupleChecker(ns3::TupleChecker const & arg0) [constructor]
+    cls.add_constructor([param('ns3::TupleChecker const &', 'arg0')])
+    ## tuple.h (module 'core'): std::vector<ns3::Ptr<const ns3::AttributeChecker>, std::allocator<ns3::Ptr<const ns3::AttributeChecker>>> const & ns3::TupleChecker::GetCheckers() const [member function]
+    cls.add_method('GetCheckers', 
+                   'std::vector< ns3::Ptr< ns3::AttributeChecker const > > const &', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    return
+
 def register_Ns3TypeIdChecker_methods(root_module, cls):
     ## type-id.h (module 'core'): ns3::TypeIdChecker::TypeIdChecker() [constructor]
     cls.add_constructor([])
@@ -5189,10 +5206,10 @@
                    'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): bool ns3::CallbackImpl<bool, std::basic_string<char>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(std::basic_string<char, std::char_traits<char>, std::allocator<char> > arg0) [member operator]
+    ## callback.h (module 'core'): bool ns3::CallbackImpl<bool, std::basic_string<char>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(std::basic_string<char, std::char_traits<char>, std::allocator<char>> arg0) [member operator]
     cls.add_method('operator()', 
                    'bool', 
-                   [param('std::string', 'arg0')], 
+                   [param('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'arg0')], 
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
@@ -5267,7 +5284,7 @@
     cls.add_constructor([param('ns3::Config::MatchContainer const &', 'arg0')])
     ## config.h (module 'core'): ns3::Config::MatchContainer::MatchContainer() [constructor]
     cls.add_constructor([])
-    ## config.h (module 'core'): ns3::Config::MatchContainer::MatchContainer(std::vector<ns3::Ptr<ns3::Object>, std::allocator<ns3::Ptr<ns3::Object> > > const & objects, std::vector<std::basic_string<char>, std::allocator<std::basic_string<char> > > const & contexts, std::string path) [constructor]
+    ## config.h (module 'core'): ns3::Config::MatchContainer::MatchContainer(std::vector<ns3::Ptr<ns3::Object>, std::allocator<ns3::Ptr<ns3::Object>>> const & objects, std::vector<std::basic_string<char>, std::allocator<std::basic_string<char>>> const & contexts, std::string path) [constructor]
     cls.add_constructor([param('std::vector< ns3::Ptr< ns3::Object > > const &', 'objects'), param('std::vector< std::string > const &', 'contexts'), param('std::string', 'path')])
     ## config.h (module 'core'): ns3::Config::MatchContainer::Iterator ns3::Config::MatchContainer::Begin() const [member function]
     cls.add_method('Begin', 
@@ -5331,6 +5348,21 @@
     cls.add_method('SetFailSafe', 
                    'bool', 
                    [param('std::string', 'name'), param('ns3::AttributeValue const &', 'value')])
+    ## config.h (module 'core'): ns3::Config::MatchContainer::Iterator ns3::Config::MatchContainer::begin() const [member function]
+    cls.add_method('begin', 
+                   'ns3::Config::MatchContainer::Iterator', 
+                   [], 
+                   is_const=True)
+    ## config.h (module 'core'): ns3::Config::MatchContainer::Iterator ns3::Config::MatchContainer::end() const [member function]
+    cls.add_method('end', 
+                   'ns3::Config::MatchContainer::Iterator', 
+                   [], 
+                   is_const=True)
+    ## config.h (module 'core'): std::size_t ns3::Config::MatchContainer::size() const [member function]
+    cls.add_method('size', 
+                   'std::size_t', 
+                   [], 
+                   is_const=True)
     return
 
 def register_Ns3HashImplementation_methods(root_module, cls):
@@ -5521,6 +5553,11 @@
                         'ns3::Ptr< ns3::PairChecker const >', 
                         [param('ns3::Ptr< ns3::AttributeChecker const > const &', 'p')], 
                         template_parameters=['ns3::PairChecker const', ' ns3::AttributeChecker const'])
+    ## ptr.h (module 'core'): ns3::Ptr<const ns3::TupleChecker> ns3::DynamicCast(ns3::Ptr<const ns3::AttributeChecker> const & p) [free function]
+    module.add_function('DynamicCast', 
+                        'ns3::Ptr< ns3::TupleChecker const >', 
+                        [param('ns3::Ptr< ns3::AttributeChecker const > const &', 'p')], 
+                        template_parameters=['ns3::TupleChecker const', ' ns3::AttributeChecker const'])
     ## length.h (module 'core'): ns3::Length ns3::Feet(double value) [free function]
     module.add_function('Feet', 
                         'ns3::Length', 
@@ -5541,6 +5578,10 @@
     module.add_function('GetLogComponent', 
                         'ns3::LogComponent &', 
                         [param('std::string const', 'name')])
+    ## hash.h (module 'core'): ns3::Hasher & ns3::GetStaticHash() [free function]
+    module.add_function('GetStaticHash', 
+                        'ns3::Hasher &', 
+                        [])
     ## hash.h (module 'core'): uint32_t ns3::Hash32(std::string const s) [free function]
     module.add_function('Hash32', 
                         'uint32_t', 
@@ -5998,7 +6039,7 @@
     module.add_function('FindSelfDirectory', 
                         'std::string', 
                         [])
-    ## system-path.h (module 'core'): std::string ns3::SystemPath::Join(std::list<std::basic_string<char>, std::allocator<std::basic_string<char> > >::const_iterator begin, std::list<std::basic_string<char>, std::allocator<std::basic_string<char> > >::const_iterator end) [free function]
+    ## system-path.h (module 'core'): std::string ns3::SystemPath::Join(std::list<std::basic_string<char>, std::allocator<std::basic_string<char>>>::const_iterator begin, std::list<std::basic_string<char>, std::allocator<std::basic_string<char>>>::const_iterator end) [free function]
     module.add_function('Join', 
                         'std::string', 
                         [param('std::list< std::string > const_iterator', 'begin'), param('std::list< std::string > const_iterator', 'end')])
@@ -6010,11 +6051,11 @@
     module.add_function('MakeTemporaryDirectoryName', 
                         'std::string', 
                         [])
-    ## system-path.h (module 'core'): std::list<std::basic_string<char>, std::allocator<std::basic_string<char> > > ns3::SystemPath::ReadFiles(std::string path) [free function]
+    ## system-path.h (module 'core'): std::list<std::basic_string<char>, std::allocator<std::basic_string<char>>> ns3::SystemPath::ReadFiles(std::string path) [free function]
     module.add_function('ReadFiles', 
                         'std::list< std::string >', 
                         [param('std::string', 'path')])
-    ## system-path.h (module 'core'): std::list<std::basic_string<char>, std::allocator<std::basic_string<char> > > ns3::SystemPath::Split(std::string path) [free function]
+    ## system-path.h (module 'core'): std::list<std::basic_string<char>, std::allocator<std::basic_string<char>>> ns3::SystemPath::Split(std::string path) [free function]
     module.add_function('Split', 
                         'std::list< std::string >', 
                         [param('std::string', 'path')])
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/bindings/modulegen__gcc_LP64.py ns-3.36/src/core/bindings/modulegen__gcc_LP64.py
--- ns-3.35/src/core/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/bindings/modulegen__gcc_LP64.py	2022-04-30 18:23:57.790733000 -0700
@@ -62,6 +62,8 @@
     module.add_class('EventGarbageCollector')
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'])
     ## global-value.h (module 'core'): ns3::GlobalValue [class]
     module.add_class('GlobalValue')
     typehandlers.add_type_alias('std::vector< ns3::GlobalValue * > const_iterator', 'ns3::GlobalValue::Iterator')
@@ -110,8 +112,6 @@
     typehandlers.add_type_alias('std::map< std::string, ns3::LogComponent * >&', 'ns3::LogComponent::ComponentList&')
     ## names.h (module 'core'): ns3::Names [class]
     module.add_class('Names')
-    ## non-copyable.h (module 'core'): ns3::NonCopyable [class]
-    module.add_class('NonCopyable', destructor_visibility='protected')
     ## object-base.h (module 'core'): ns3::ObjectBase [class]
     module.add_class('ObjectBase', allow_subclassing=True)
     ## object.h (module 'core'): ns3::ObjectDeleter [struct]
@@ -135,7 +135,7 @@
     ## simulator.h (module 'core'): ns3::Simulator [enumeration]
     module.add_enum('', ['NO_CONTEXT'], outer_class=root_module['ns3::Simulator'])
     ## singleton.h (module 'core'): ns3::Singleton<ns3::DesMetrics> [class]
-    module.add_class('Singleton', parent=root_module['ns3::NonCopyable'], template_parameters=['ns3::DesMetrics'])
+    module.add_class('Singleton', destructor_visibility='protected', template_parameters=['ns3::DesMetrics'])
     ## system-condition.h (module 'core'): ns3::SystemCondition [class]
     module.add_class('SystemCondition')
     ## system-mutex.h (module 'core'): ns3::SystemMutex [class]
@@ -204,25 +204,25 @@
     module.add_class('EventKey', outer_class=root_module['ns3::Scheduler'])
     ## random-variable-stream.h (module 'core'): ns3::SequentialRandomVariable [class]
     module.add_class('SequentialRandomVariable', parent=root_module['ns3::RandomVariableStream'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::FdReader, ns3::empty, ns3::DefaultDeleter<ns3::FdReader> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::FdReader, ns3::empty, ns3::DefaultDeleter<ns3::FdReader>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::FdReader', 'ns3::empty', 'ns3::DefaultDeleter<ns3::FdReader>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::RefCountBase, ns3::empty, ns3::DefaultDeleter<ns3::RefCountBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::RefCountBase, ns3::empty, ns3::DefaultDeleter<ns3::RefCountBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::RefCountBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::RefCountBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SystemThread, ns3::empty, ns3::DefaultDeleter<ns3::SystemThread> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SystemThread, ns3::empty, ns3::DefaultDeleter<ns3::SystemThread>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::SystemThread', 'ns3::empty', 'ns3::DefaultDeleter<ns3::SystemThread>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
     ## simulator-impl.h (module 'core'): ns3::SimulatorImpl [class]
     module.add_class('SimulatorImpl', parent=root_module['ns3::Object'])
@@ -351,6 +351,8 @@
     module.add_class('StringValue', parent=root_module['ns3::AttributeValue'])
     ## nstime.h (module 'core'): ns3::TimeValue [class]
     module.add_class('TimeValue', parent=root_module['ns3::AttributeValue'])
+    ## tuple.h (module 'core'): ns3::TupleChecker [class]
+    module.add_class('TupleChecker', parent=root_module['ns3::AttributeChecker'])
     ## type-id.h (module 'core'): ns3::TypeIdChecker [class]
     module.add_class('TypeIdChecker', parent=root_module['ns3::AttributeChecker'])
     ## type-id.h (module 'core'): ns3::TypeIdValue [class]
@@ -373,8 +375,9 @@
     module.add_class('CallbackImpl', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char *, long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned char *', 'long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    module.add_container('std::vector< std::string >', 'std::string', container_type='vector')
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::vector< std::string >', 'std::basic_string< char, std::char_traits< char >, std::allocator< char > >', container_type='vector')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::vector< ns3::Ptr< ns3::AttributeChecker const > >', 'ns3::Ptr< ns3::AttributeChecker const >', container_type='vector')
     typehandlers.add_type_alias('ns3::Vector3D', 'ns3::Vector')
     typehandlers.add_type_alias('ns3::Vector3D*', 'ns3::Vector*')
     typehandlers.add_type_alias('ns3::Vector3D&', 'ns3::Vector&')
@@ -505,7 +508,7 @@
 def register_types_ns3_SystemPath(module):
     root_module = module.get_root()
     
-    module.add_container('std::list< std::string >', 'std::string', container_type='list')
+    module.add_container('std::list< std::string >', 'std::basic_string< char, std::char_traits< char >, std::allocator< char > >', container_type='list')
 
 def register_types_ns3_TracedValueCallback(module):
     root_module = module.get_root()
@@ -586,7 +589,6 @@
     register_Ns3LengthQuantity_methods(root_module, root_module['ns3::Length::Quantity'])
     register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
     register_Ns3Names_methods(root_module, root_module['ns3::Names'])
-    register_Ns3NonCopyable_methods(root_module, root_module['ns3::NonCopyable'])
     register_Ns3ObjectBase_methods(root_module, root_module['ns3::ObjectBase'])
     register_Ns3ObjectDeleter_methods(root_module, root_module['ns3::ObjectDeleter'])
     register_Ns3ObjectFactory_methods(root_module, root_module['ns3::ObjectFactory'])
@@ -691,6 +693,7 @@
     register_Ns3StringChecker_methods(root_module, root_module['ns3::StringChecker'])
     register_Ns3StringValue_methods(root_module, root_module['ns3::StringValue'])
     register_Ns3TimeValue_methods(root_module, root_module['ns3::TimeValue'])
+    register_Ns3TupleChecker_methods(root_module, root_module['ns3::TupleChecker'])
     register_Ns3TypeIdChecker_methods(root_module, root_module['ns3::TypeIdChecker'])
     register_Ns3TypeIdValue_methods(root_module, root_module['ns3::TypeIdValue'])
     register_Ns3UintegerValue_methods(root_module, root_module['ns3::UintegerValue'])
@@ -836,7 +839,7 @@
     cls.add_method('Parse', 
                    'void', 
                    [param('int', 'argc'), param('char * *', 'argv')])
-    ## command-line.h (module 'core'): void ns3::CommandLine::Parse(std::vector<std::basic_string<char>, std::allocator<std::basic_string<char> > > args) [member function]
+    ## command-line.h (module 'core'): void ns3::CommandLine::Parse(std::vector<std::basic_string<char>, std::allocator<std::basic_string<char>>> args) [member function]
     cls.add_method('Parse', 
                    'void', 
                    [param('std::vector< std::string >', 'args')])
@@ -1390,12 +1393,6 @@
                    is_static=True)
     return
 
-def register_Ns3NonCopyable_methods(root_module, cls):
-    ## non-copyable.h (module 'core'): ns3::NonCopyable::NonCopyable() [constructor]
-    cls.add_constructor([], 
-                        visibility='protected')
-    return
-
 def register_Ns3ObjectBase_methods(root_module, cls):
     ## object-base.h (module 'core'): ns3::ObjectBase::ObjectBase() [constructor]
     cls.add_constructor([])
@@ -1694,7 +1691,8 @@
                    [], 
                    is_static=True)
     ## singleton.h (module 'core'): ns3::Singleton<ns3::DesMetrics>::Singleton() [constructor]
-    cls.add_constructor([])
+    cls.add_constructor([], 
+                        visibility='protected')
     return
 
 def register_Ns3SystemCondition_methods(root_module, cls):
@@ -2167,8 +2165,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -2468,14 +2466,14 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('>=')
     cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_unary_numeric_operator('-')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
     cls.add_constructor([])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(double const value) [constructor]
@@ -2494,6 +2492,8 @@
     cls.add_constructor([param('long unsigned int const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int const v) [constructor]
     cls.add_constructor([param('long long unsigned int const', 'v')])
+    ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int128_t const v) [constructor]
+    cls.add_constructor([param('int128_t const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t const hi, uint64_t const lo) [constructor]
     cls.add_constructor([param('int64_t const', 'hi'), param('uint64_t const', 'lo')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [constructor]
@@ -2537,7 +2537,7 @@
     return
 
 def register_Ns3DesMetrics_methods(root_module, cls):
-    ## des-metrics.h (module 'core'): void ns3::DesMetrics::Initialize(std::vector<std::basic_string<char>, std::allocator<std::basic_string<char> > > args, std::string outDir="") [member function]
+    ## des-metrics.h (module 'core'): void ns3::DesMetrics::Initialize(std::vector<std::basic_string<char>, std::allocator<std::basic_string<char>>> args, std::string outDir="") [member function]
     cls.add_method('Initialize', 
                    'void', 
                    [param('std::vector< std::string >', 'args'), param('std::string', 'outDir', default_value='""')])
@@ -2787,72 +2787,72 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3FdReader_Ns3Empty_Ns3DefaultDeleter__lt__ns3FdReader__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::FdReader, ns3::empty, ns3::DefaultDeleter<ns3::FdReader> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::FdReader, ns3::empty, ns3::DefaultDeleter<ns3::FdReader>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::FdReader, ns3::empty, ns3::DefaultDeleter<ns3::FdReader> >::SimpleRefCount(ns3::SimpleRefCount<ns3::FdReader, ns3::empty, ns3::DefaultDeleter<ns3::FdReader> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::FdReader, ns3::empty, ns3::DefaultDeleter<ns3::FdReader>>::SimpleRefCount(ns3::SimpleRefCount<ns3::FdReader, ns3::empty, ns3::DefaultDeleter<ns3::FdReader>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::FdReader, ns3::empty, ns3::DefaultDeleter< ns3::FdReader > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3RefCountBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3RefCountBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::RefCountBase, ns3::empty, ns3::DefaultDeleter<ns3::RefCountBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::RefCountBase, ns3::empty, ns3::DefaultDeleter<ns3::RefCountBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::RefCountBase, ns3::empty, ns3::DefaultDeleter<ns3::RefCountBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::RefCountBase, ns3::empty, ns3::DefaultDeleter<ns3::RefCountBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::RefCountBase, ns3::empty, ns3::DefaultDeleter<ns3::RefCountBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::RefCountBase, ns3::empty, ns3::DefaultDeleter<ns3::RefCountBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::RefCountBase, ns3::empty, ns3::DefaultDeleter< ns3::RefCountBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3SystemThread_Ns3Empty_Ns3DefaultDeleter__lt__ns3SystemThread__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SystemThread, ns3::empty, ns3::DefaultDeleter<ns3::SystemThread> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SystemThread, ns3::empty, ns3::DefaultDeleter<ns3::SystemThread>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SystemThread, ns3::empty, ns3::DefaultDeleter<ns3::SystemThread> >::SimpleRefCount(ns3::SimpleRefCount<ns3::SystemThread, ns3::empty, ns3::DefaultDeleter<ns3::SystemThread> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SystemThread, ns3::empty, ns3::DefaultDeleter<ns3::SystemThread>>::SimpleRefCount(ns3::SimpleRefCount<ns3::SystemThread, ns3::empty, ns3::DefaultDeleter<ns3::SystemThread>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::SystemThread, ns3::empty, ns3::DefaultDeleter< ns3::SystemThread > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
@@ -2916,6 +2916,11 @@
                    'ns3::Time', 
                    [], 
                    is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## simulator-impl.h (module 'core'): void ns3::SimulatorImpl::PreEventHook(ns3::EventId const & id) [member function]
+    cls.add_method('PreEventHook', 
+                   'void', 
+                   [param('ns3::EventId const &', 'id')], 
+                   is_virtual=True)
     ## simulator-impl.h (module 'core'): void ns3::SimulatorImpl::Remove(ns3::EventId const & id) [member function]
     cls.add_method('Remove', 
                    'void', 
@@ -2997,10 +3002,10 @@
     cls.add_method('Realtime', 
                    'bool', 
                    [])
-    ## synchronizer.h (module 'core'): void ns3::Synchronizer::SetCondition(bool arg0) [member function]
+    ## synchronizer.h (module 'core'): void ns3::Synchronizer::SetCondition(bool cond) [member function]
     cls.add_method('SetCondition', 
                    'void', 
-                   [param('bool', 'arg0')])
+                   [param('bool', 'cond')])
     ## synchronizer.h (module 'core'): void ns3::Synchronizer::SetOrigin(uint64_t ts) [member function]
     cls.add_method('SetOrigin', 
                    'void', 
@@ -3038,10 +3043,10 @@
                    'bool', 
                    [], 
                    is_pure_virtual=True, is_virtual=True, visibility='protected')
-    ## synchronizer.h (module 'core'): void ns3::Synchronizer::DoSetCondition(bool arg0) [member function]
+    ## synchronizer.h (module 'core'): void ns3::Synchronizer::DoSetCondition(bool cond) [member function]
     cls.add_method('DoSetCondition', 
                    'void', 
-                   [param('bool', 'arg0')], 
+                   [param('bool', 'cond')], 
                    is_pure_virtual=True, is_virtual=True, visibility='protected')
     ## synchronizer.h (module 'core'): void ns3::Synchronizer::DoSetOrigin(uint64_t ns) [member function]
     cls.add_method('DoSetOrigin', 
@@ -3632,27 +3637,27 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['bool'], visibility='protected')
+                   is_static=True, template_parameters=['void'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['std::__cxx11::basic_string<char', ' std::char_traits<char>', ' std::allocator<char> > '], visibility='protected')
+                   is_static=True, template_parameters=['unsigned char*'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['void'], visibility='protected')
+                   is_static=True, template_parameters=['long'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['unsigned char*'], visibility='protected')
+                   is_static=True, template_parameters=['bool'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['long'], visibility='protected')
+                   is_static=True, template_parameters=['std::__cxx11::basic_string<char', ' std::char_traits<char>', ' std::allocator<char> > '], visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -5021,6 +5026,18 @@
                    [param('ns3::Time const &', 'value')])
     return
 
+def register_Ns3TupleChecker_methods(root_module, cls):
+    ## tuple.h (module 'core'): ns3::TupleChecker::TupleChecker() [constructor]
+    cls.add_constructor([])
+    ## tuple.h (module 'core'): ns3::TupleChecker::TupleChecker(ns3::TupleChecker const & arg0) [constructor]
+    cls.add_constructor([param('ns3::TupleChecker const &', 'arg0')])
+    ## tuple.h (module 'core'): std::vector<ns3::Ptr<const ns3::AttributeChecker>, std::allocator<ns3::Ptr<const ns3::AttributeChecker>>> const & ns3::TupleChecker::GetCheckers() const [member function]
+    cls.add_method('GetCheckers', 
+                   'std::vector< ns3::Ptr< ns3::AttributeChecker const > > const &', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    return
+
 def register_Ns3TypeIdChecker_methods(root_module, cls):
     ## type-id.h (module 'core'): ns3::TypeIdChecker::TypeIdChecker() [constructor]
     cls.add_constructor([])
@@ -5189,10 +5206,10 @@
                    'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): bool ns3::CallbackImpl<bool, std::basic_string<char>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(std::basic_string<char, std::char_traits<char>, std::allocator<char> > arg0) [member operator]
+    ## callback.h (module 'core'): bool ns3::CallbackImpl<bool, std::basic_string<char>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(std::basic_string<char, std::char_traits<char>, std::allocator<char>> arg0) [member operator]
     cls.add_method('operator()', 
                    'bool', 
-                   [param('std::string', 'arg0')], 
+                   [param('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'arg0')], 
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
@@ -5267,7 +5284,7 @@
     cls.add_constructor([param('ns3::Config::MatchContainer const &', 'arg0')])
     ## config.h (module 'core'): ns3::Config::MatchContainer::MatchContainer() [constructor]
     cls.add_constructor([])
-    ## config.h (module 'core'): ns3::Config::MatchContainer::MatchContainer(std::vector<ns3::Ptr<ns3::Object>, std::allocator<ns3::Ptr<ns3::Object> > > const & objects, std::vector<std::basic_string<char>, std::allocator<std::basic_string<char> > > const & contexts, std::string path) [constructor]
+    ## config.h (module 'core'): ns3::Config::MatchContainer::MatchContainer(std::vector<ns3::Ptr<ns3::Object>, std::allocator<ns3::Ptr<ns3::Object>>> const & objects, std::vector<std::basic_string<char>, std::allocator<std::basic_string<char>>> const & contexts, std::string path) [constructor]
     cls.add_constructor([param('std::vector< ns3::Ptr< ns3::Object > > const &', 'objects'), param('std::vector< std::string > const &', 'contexts'), param('std::string', 'path')])
     ## config.h (module 'core'): ns3::Config::MatchContainer::Iterator ns3::Config::MatchContainer::Begin() const [member function]
     cls.add_method('Begin', 
@@ -5331,6 +5348,21 @@
     cls.add_method('SetFailSafe', 
                    'bool', 
                    [param('std::string', 'name'), param('ns3::AttributeValue const &', 'value')])
+    ## config.h (module 'core'): ns3::Config::MatchContainer::Iterator ns3::Config::MatchContainer::begin() const [member function]
+    cls.add_method('begin', 
+                   'ns3::Config::MatchContainer::Iterator', 
+                   [], 
+                   is_const=True)
+    ## config.h (module 'core'): ns3::Config::MatchContainer::Iterator ns3::Config::MatchContainer::end() const [member function]
+    cls.add_method('end', 
+                   'ns3::Config::MatchContainer::Iterator', 
+                   [], 
+                   is_const=True)
+    ## config.h (module 'core'): std::size_t ns3::Config::MatchContainer::size() const [member function]
+    cls.add_method('size', 
+                   'std::size_t', 
+                   [], 
+                   is_const=True)
     return
 
 def register_Ns3HashImplementation_methods(root_module, cls):
@@ -5521,6 +5553,11 @@
                         'ns3::Ptr< ns3::PairChecker const >', 
                         [param('ns3::Ptr< ns3::AttributeChecker const > const &', 'p')], 
                         template_parameters=['ns3::PairChecker const', ' ns3::AttributeChecker const'])
+    ## ptr.h (module 'core'): ns3::Ptr<const ns3::TupleChecker> ns3::DynamicCast(ns3::Ptr<const ns3::AttributeChecker> const & p) [free function]
+    module.add_function('DynamicCast', 
+                        'ns3::Ptr< ns3::TupleChecker const >', 
+                        [param('ns3::Ptr< ns3::AttributeChecker const > const &', 'p')], 
+                        template_parameters=['ns3::TupleChecker const', ' ns3::AttributeChecker const'])
     ## length.h (module 'core'): ns3::Length ns3::Feet(double value) [free function]
     module.add_function('Feet', 
                         'ns3::Length', 
@@ -5541,6 +5578,10 @@
     module.add_function('GetLogComponent', 
                         'ns3::LogComponent &', 
                         [param('std::string const', 'name')])
+    ## hash.h (module 'core'): ns3::Hasher & ns3::GetStaticHash() [free function]
+    module.add_function('GetStaticHash', 
+                        'ns3::Hasher &', 
+                        [])
     ## hash.h (module 'core'): uint32_t ns3::Hash32(std::string const s) [free function]
     module.add_function('Hash32', 
                         'uint32_t', 
@@ -5998,7 +6039,7 @@
     module.add_function('FindSelfDirectory', 
                         'std::string', 
                         [])
-    ## system-path.h (module 'core'): std::string ns3::SystemPath::Join(std::list<std::basic_string<char>, std::allocator<std::basic_string<char> > >::const_iterator begin, std::list<std::basic_string<char>, std::allocator<std::basic_string<char> > >::const_iterator end) [free function]
+    ## system-path.h (module 'core'): std::string ns3::SystemPath::Join(std::list<std::basic_string<char>, std::allocator<std::basic_string<char>>>::const_iterator begin, std::list<std::basic_string<char>, std::allocator<std::basic_string<char>>>::const_iterator end) [free function]
     module.add_function('Join', 
                         'std::string', 
                         [param('std::list< std::string > const_iterator', 'begin'), param('std::list< std::string > const_iterator', 'end')])
@@ -6010,11 +6051,11 @@
     module.add_function('MakeTemporaryDirectoryName', 
                         'std::string', 
                         [])
-    ## system-path.h (module 'core'): std::list<std::basic_string<char>, std::allocator<std::basic_string<char> > > ns3::SystemPath::ReadFiles(std::string path) [free function]
+    ## system-path.h (module 'core'): std::list<std::basic_string<char>, std::allocator<std::basic_string<char>>> ns3::SystemPath::ReadFiles(std::string path) [free function]
     module.add_function('ReadFiles', 
                         'std::list< std::string >', 
                         [param('std::string', 'path')])
-    ## system-path.h (module 'core'): std::list<std::basic_string<char>, std::allocator<std::basic_string<char> > > ns3::SystemPath::Split(std::string path) [free function]
+    ## system-path.h (module 'core'): std::list<std::basic_string<char>, std::allocator<std::basic_string<char>>> ns3::SystemPath::Split(std::string path) [free function]
     module.add_function('Split', 
                         'std::list< std::string >', 
                         [param('std::string', 'path')])
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/CMakeLists.txt ns-3.36/src/core/CMakeLists.txt
--- ns-3.35/src/core/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/core/CMakeLists.txt	2022-04-30 18:23:57.790733000 -0700
@@ -0,0 +1,383 @@
+# Set lib core link dependencies
+set(libraries_to_link)
+
+set(gsl_test_sources)
+if(${GSL_FOUND})
+  include_directories(${GSL_INCLUDE_DIRS})
+  set(libraries_to_link
+      ${libraries_to_link}
+      ${GSL_LIBRARIES}
+  )
+  set(gsl_test_sources
+      test/rng-test-suite.cc
+      test/random-variable-stream-test-suite.cc
+  )
+endif()
+
+# Check for dependencies and add sources accordingly
+if(${CMAKE_VERSION}
+   VERSION_LESS
+   "3.11.0"
+)
+  check_include_file_cxx(
+    boost/units/quantity.hpp
+    HAVE_BOOST_UNITS_QUANTITY
+  )
+  check_include_file_cxx(
+    boost/units/systems/si.hpp
+    HAVE_BOOST_UNITS_SI
+  )
+  if(${HAVE_BOOST_UNITS_QUANTITY}
+     AND ${HAVE_BOOST_UNITS_SI}
+  )
+    set(HAVE_BOOST_UNITS
+        TRUE
+    )
+  else()
+    set(HAVE_BOOST_UNITS
+        FALSE
+    )
+  endif()
+else()
+  # Fast path for CMake >= 3.11
+  check_include_files(
+    "boost/units/quantity.hpp;boost/units/systems/si.hpp"
+    HAVE_BOOST_UNITS
+    LANGUAGE
+    CXX
+  )
+endif()
+
+if(${HAVE_BOOST_UNITS})
+  add_definitions(
+    -DHAVE_BOOST
+    -DHAVE_BOOST_UNITS
+  )
+  message(STATUS "Boost Units have been found.")
+else()
+  message(
+    STATUS
+      "Boost Units are an optional feature of length.cc."
+      " Ubuntu ships it within the libboost-dev package."
+      " You may need to clean up the CMake cache after installing it to pass this check."
+  )
+endif()
+
+set(rt_sources)
+set(rt_headers)
+if(${ENABLE_REALTIME})
+  set(rt_sources
+      model/realtime-simulator-impl.cc
+      model/wall-clock-synchronizer.cc
+  )
+  set(rt_headers
+      model/realtime-simulator-impl.h
+      model/wall-clock-synchronizer.h
+  )
+  set(libraries_to_link
+      ${libraries_to_link}
+      ${LIBRT}
+  )
+endif()
+
+set(osclock_sources)
+set(osclock_sources
+    model/unix-system-wall-clock-ms.cc
+)
+
+set(int64x64_sources)
+set(int64x64_headers)
+
+if(${NS3_INT64X64}
+   MATCHES
+   "INT128"
+)
+  set(int64x64_sources
+      model/int64x64-128.cc
+  )
+  set(int64x64_headers
+      model/int64x64-128.h
+  )
+elseif(
+  ${NS3_INT64X64}
+  MATCHES
+  "DOUBLE"
+)
+  set(int64x64_headers
+      model/int64x64-double.h
+  )
+elseif(
+  ${NS3_INT64X64}
+  MATCHES
+  "CAIRO"
+)
+  set(int64x64_sources
+      model/int64x64-cairo.cc
+  )
+  set(int64x64_headers
+      model/int64x64-cairo.h
+      model/cairo-wideint-private.h
+  )
+endif()
+
+set(thread_sources
+    model/system-thread.cc
+    model/unix-fd-reader.cc
+    model/unix-system-condition.cc
+    model/unix-system-mutex.cc
+)
+set(thread_headers
+    model/system-condition.h
+    model/system-mutex.h
+    model/system-thread.h
+    model/unix-fd-reader.h
+)
+set(libraries_to_link
+    ${libraries_to_link}
+    pthread
+)
+set(thread_test_sources
+    test/threaded-test-suite.cc
+)
+
+if(${ENABLE_EXAMPLES})
+  set(example_as_test_sources
+      model/example-as-test.cc
+  )
+  set(example_as_test_headers
+      model/example-as-test.h
+  )
+  set(example_as_test_suite
+      test/examples-as-tests-test-suite.cc
+  )
+endif()
+
+# Embedded version support
+set(embedded_version_sources)
+set(embedded_version_headers)
+if(${ENABLE_BUILD_VERSION})
+  set(embedded_version_sources
+      model/version.cc
+  )
+  set(embedded_version_headers
+      model/version.h
+  )
+endif()
+
+# Define core lib sources
+set(source_files
+    ${rt_sources}
+    ${osclock_sources}
+    ${int64x64_sources}
+    ${thread_sources}
+    ${example_as_test_sources}
+    ${embedded_version_sources}
+    helper/csv-reader.cc
+    helper/random-variable-stream-helper.cc
+    helper/event-garbage-collector.cc
+    model/time.cc
+    model/event-id.cc
+    model/scheduler.cc
+    model/list-scheduler.cc
+    model/map-scheduler.cc
+    model/heap-scheduler.cc
+    model/calendar-scheduler.cc
+    model/priority-queue-scheduler.cc
+    model/event-impl.cc
+    model/simulator.cc
+    model/simulator-impl.cc
+    model/default-simulator-impl.cc
+    model/timer.cc
+    model/watchdog.cc
+    model/synchronizer.cc
+    model/make-event.cc
+    model/log.cc
+    model/breakpoint.cc
+    model/type-id.cc
+    model/attribute-construction-list.cc
+    model/object-base.cc
+    model/ref-count-base.cc
+    model/object.cc
+    model/test.cc
+    model/random-variable-stream.cc
+    model/rng-seed-manager.cc
+    model/rng-stream.cc
+    model/command-line.cc
+    model/attribute.cc
+    model/boolean.cc
+    model/integer.cc
+    model/uinteger.cc
+    model/enum.cc
+    model/double.cc
+    model/int64x64.cc
+    model/string.cc
+    model/pointer.cc
+    model/object-ptr-container.cc
+    model/object-factory.cc
+    model/global-value.cc
+    model/trace-source-accessor.cc
+    model/config.cc
+    model/callback.cc
+    model/names.cc
+    model/vector.cc
+    model/fatal-impl.cc
+    model/system-path.cc
+    model/hash-function.cc
+    model/hash-murmur3.cc
+    model/hash-fnv.cc
+    model/hash.cc
+    model/des-metrics.cc
+    model/ascii-file.cc
+    model/node-printer.cc
+    model/show-progress.cc
+    model/time-printer.cc
+    model/system-wall-clock-timestamp.cc
+    model/length.cc
+    model/trickle-timer.cc
+)
+
+# Define core lib headers
+set(header_files
+    ${rt_headers}
+    ${int64x64_headers}
+    ${thread_headers}
+    ${example_as_test_headers}
+    ${embedded_version_headers}
+    helper/csv-reader.h
+    helper/event-garbage-collector.h
+    helper/random-variable-stream-helper.h
+    model/abort.h
+    model/ascii-file.h
+    model/ascii-test.h
+    model/assert.h
+    model/attribute-accessor-helper.h
+    model/attribute-construction-list.h
+    model/attribute-container-accessor-helper.h
+    model/attribute-container.h
+    model/attribute-helper.h
+    model/attribute.h
+    model/boolean.h
+    model/breakpoint.h
+    model/build-profile.h
+    model/calendar-scheduler.h
+    model/callback.h
+    model/command-line.h
+    model/config.h
+    model/default-deleter.h
+    model/default-simulator-impl.h
+    model/deprecated.h
+    model/des-metrics.h
+    model/double.h
+    model/empty.h
+    model/enum.h
+    model/event-id.h
+    model/event-impl.h
+    model/fatal-error.h
+    model/fatal-impl.h
+    model/global-value.h
+    model/hash-fnv.h
+    model/hash-function.h
+    model/hash-murmur3.h
+    model/hash.h
+    model/heap-scheduler.h
+    model/int-to-type.h
+    model/int64x64-double.h
+    model/int64x64.h
+    model/integer.h
+    model/length.h
+    model/list-scheduler.h
+    model/log-macros-disabled.h
+    model/log-macros-enabled.h
+    model/log.h
+    model/make-event.h
+    model/map-scheduler.h
+    model/math.h
+    model/names.h
+    model/node-printer.h
+    model/nstime.h
+    model/object-base.h
+    model/object-factory.h
+    model/object-map.h
+    model/object-ptr-container.h
+    model/object-vector.h
+    model/object.h
+    model/pair.h
+    model/pointer.h
+    model/priority-queue-scheduler.h
+    model/ptr.h
+    model/random-variable-stream.h
+    model/ref-count-base.h
+    model/rng-seed-manager.h
+    model/rng-stream.h
+    model/scheduler.h
+    model/show-progress.h
+    model/simple-ref-count.h
+    model/simulation-singleton.h
+    model/simulator-impl.h
+    model/simulator.h
+    model/singleton.h
+    model/string.h
+    model/synchronizer.h
+    model/system-path.h
+    model/system-wall-clock-ms.h
+    model/system-wall-clock-timestamp.h
+    model/test.h
+    model/time-printer.h
+    model/timer-impl.h
+    model/timer.h
+    model/trace-source-accessor.h
+    model/traced-callback.h
+    model/traced-value.h
+    model/trickle-timer.h
+    model/tuple.h
+    model/type-id.h
+    model/type-name.h
+    model/type-traits.h
+    model/uinteger.h
+    model/unused.h
+    model/valgrind.h
+    model/vector.h
+    model/watchdog.h
+)
+
+set(test_sources
+    ${example_as_test_suite}
+    ${gsl_test_sources}
+    ${thread_test_sources}
+    test/attribute-container-test-suite.cc
+    test/attribute-test-suite.cc
+    test/build-profile-test-suite.cc
+    test/callback-test-suite.cc
+    test/command-line-test-suite.cc
+    test/config-test-suite.cc
+    test/event-garbage-collector-test-suite.cc
+    test/global-value-test-suite.cc
+    test/hash-test-suite.cc
+    test/int64x64-test-suite.cc
+    test/length-test-suite.cc
+    test/many-uniform-random-variables-one-get-value-call-test-suite.cc
+    test/names-test-suite.cc
+    test/object-test-suite.cc
+    test/one-uniform-random-variable-many-get-value-calls-test-suite.cc
+    test/pair-value-test-suite.cc
+    test/ptr-test-suite.cc
+    test/sample-test-suite.cc
+    test/simulator-test-suite.cc
+    test/time-test-suite.cc
+    test/timer-test-suite.cc
+    test/traced-callback-test-suite.cc
+    test/trickle-timer-test-suite.cc
+    test/tuple-value-test-suite.cc
+    test/type-id-test-suite.cc
+    test/type-traits-test-suite.cc
+    test/watchdog-test-suite.cc
+)
+
+# Build core lib
+build_lib(
+  LIBNAME core
+  SOURCE_FILES ${source_files}
+  HEADER_FILES ${header_files}
+  LIBRARIES_TO_LINK ${libraries_to_link}
+  TEST_SOURCES ${test_sources}
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/doc/deprecated-example.h ns-3.36/src/core/doc/deprecated-example.h
--- ns-3.35/src/core/doc/deprecated-example.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/doc/deprecated-example.h	2022-04-30 18:23:57.790733000 -0700
@@ -30,10 +30,10 @@
  * \deprecated This method will go away in future versions of ns-3.
  * See instead TheNewWay()
  */
-NS_DEPRECATED_3_XX
-void SomethingUseful (void);
+NS_DEPRECATED_3_XX ("see TheNewWay")
+void SomethingUseful ();
 /*
  * Do something more useful.
  */
-void TheNewWay (void);
+void TheNewWay ();
 // [doxygen snippet]
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/examples/CMakeLists.txt ns-3.36/src/core/examples/CMakeLists.txt
--- ns-3.35/src/core/examples/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/core/examples/CMakeLists.txt	2022-04-30 18:23:57.790733000 -0700
@@ -0,0 +1,58 @@
+set(base_examples
+    command-line-example
+    fatal-example
+    hash-example
+    length-example
+    main-callback
+    main-ptr
+    sample-log-time-format
+    sample-random-variable
+    sample-random-variable-stream
+    sample-show-progress
+    sample-simulator
+    system-path-examples
+    test-string-value-formatting
+)
+
+foreach(
+  example
+  ${base_examples}
+)
+  build_lib_example(
+    NAME ${example}
+    SOURCE_FILES ${example}.cc
+    LIBRARIES_TO_LINK ${libcore}
+  )
+endforeach()
+
+build_lib_example(
+  NAME main-random-variable-stream
+  SOURCE_FILES main-random-variable-stream.cc
+  LIBRARIES_TO_LINK
+    ${libcore}
+    ${libconfig-store}
+    ${libstats}
+)
+
+if(${ENABLE_BUILD_VERSION})
+  build_lib_example(
+    NAME build-version-example
+    SOURCE_FILES build-version-example.cc
+    LIBRARIES_TO_LINK ${libcore}
+  )
+endif()
+
+if(${ENABLE_REALTIME})
+  build_lib_example(
+    NAME main-test-sync
+    SOURCE_FILES main-test-sync.cc
+    LIBRARIES_TO_LINK ${libnetwork}
+  )
+endif()
+
+build_lib_example(
+  NAME empirical-random-variable-example
+  SOURCE_FILES empirical-random-variable-example.cc
+  LIBRARIES_TO_LINK ${libcore}
+                    ${libflow-monitor}
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/examples/empirical-random-variable-example.cc ns-3.36/src/core/examples/empirical-random-variable-example.cc
--- ns-3.35/src/core/examples/empirical-random-variable-example.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/examples/empirical-random-variable-example.cc	2022-04-30 18:23:57.790733000 -0700
@@ -29,10 +29,12 @@
 #include <iostream>
 #include <map>
 
+
 /**
  * \file
- * \ingroup core-examples
- * \ingroup randomvariable
+ * \ingroup core-examples randomvariable
+ * \defgroup empirical-rng-example Core example: Empirical random variables use.
+ * 
  * Example program illustrating use of ns3::EmpiricalRandomVariable
  *
  * This example illustrates
@@ -47,8 +49,16 @@
  * random number generator
  */
 
+
 using namespace ns3;
 
+/**
+ * \ingroup empirical-rng-example
+ * 
+ * \brief Sample the random variable only once.
+ * \param mode Rng mode (Normal or Antithetic).
+ * \param erv The empirical random variable.
+ */
 void
 RunSingleSample (std::string mode, Ptr<EmpiricalRandomVariable> erv)
 {
@@ -68,6 +78,14 @@
   erv->SetInterpolate (false);
 }
 
+/**
+ * \ingroup empirical-rng-example
+ * 
+ * \brief Prints a stat line.
+ * \param value The value to print.
+ * \param count The number of times that value has been sampled.
+ * \param n The total number of random values sampled.
+ */
 void
 PrintStatsLine (const double value, const long count, const long n)
 {
@@ -79,6 +97,15 @@
             << std::endl;
 }
 
+/**
+ * \ingroup empirical-rng-example
+ * 
+ * \brief Prints the summary.
+ * \param sum The number of sampled values.
+ * \param n The total number of random values to be drawn.
+ * \param weighted The average of the sample.
+ * \param expected The expected average of the sample.
+ */
 void
 PrintSummary (long sum, long n, double weighted, double expected)
 {
@@ -100,6 +127,14 @@
             << std::endl;
 }
 
+/**
+ * \ingroup empirical-rng-example
+ * 
+ * \brief Sample the random variable.
+ * \param mode Rng mode (Normal or Antithetic).
+ * \param erv The empirical random variable.
+ * \param n Number of samples to draw.
+ */
 void
 RunBothModes (std::string mode, Ptr<EmpiricalRandomVariable> erv, long n)
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/examples/fatal-example.cc ns-3.36/src/core/examples/fatal-example.cc
--- ns-3.35/src/core/examples/fatal-example.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/examples/fatal-example.cc	2022-04-30 18:23:57.790733000 -0700
@@ -26,13 +26,19 @@
 
 /**
  * \file
+ * \defgroup fatal-example Core example: NS_FATAL error handlers
  * \ingroup core-examples
- * \ingroup ptr
+ * \ingroup fatal
+ * 
  * Example program illustrating use of the NS_FATAL error handlers.
  */
 
 using namespace ns3;
 
+/**
+ * \ingroup fatal-example
+ * \brief Triggers a fatal error without message, deferring termination.
+ */
 void
 FatalNoMsg (void)
 {
@@ -41,6 +47,10 @@
   NS_FATAL_ERROR_NO_MSG_CONT ();
 }
 
+/**
+ * \ingroup fatal-example
+ * \brief Triggers a fatal error with an error message, deferring termination.
+ */
 void
 FatalCont (void)
 {
@@ -49,6 +59,10 @@
   NS_FATAL_ERROR_CONT ("fatal error, but continuing");
 }
 
+/**
+ * \ingroup fatal-example
+ * \brief Triggers a fatal error with message, and terminating.
+ */
 void
 Fatal (void)
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/examples/hash-example.cc ns-3.36/src/core/examples/hash-example.cc
--- ns-3.35/src/core/examples/hash-example.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/examples/hash-example.cc	2022-04-30 18:23:57.790733000 -0700
@@ -40,14 +40,12 @@
  *  Example Output:
  *  \verbatim
 
-./waf --run="hasher-example --time \
+./ns3 run="hasher-example --time \
   --dict=/usr/share/dict/web2 \
   --dict=/usr/share/dict/web2a \
   --dict=/usr/share/dict/propernames \
   --dict=/usr/share/dict/connectives"
 
-Waf: Entering directory `build'
-Waf: Leaving directory `build'
 'build' finished successfully (3.028s)
 
 Hasher
@@ -111,7 +109,7 @@
 /**
  * \ingroup hash
  *  Namespace for hasher-example.
-*/
+ */
 namespace Example {
 
 /**
@@ -386,7 +384,7 @@
   /**
    * Time and report the execution of one hash across the entire Dictionary.
    *
-   * \param [in] hindex Index of the hash Collider to use.
+   * \param [in] collider The hash Collider to use.
    */
   void TimeOne (const Collider & collider)
   {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/examples/length-example.cc ns-3.36/src/core/examples/length-example.cc
--- ns-3.35/src/core/examples/length-example.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/examples/length-example.cc	2022-04-30 18:23:57.790733000 -0700
@@ -31,15 +31,19 @@
  */
 
 using namespace ns3;
-using Unit = Length::Unit;
 
+/**
+ * \ingroup core-examples
+ * \ingroup length
+ * \brief Demonstrates the use of ns3::Length constructors.
+ */
 void Constructors ()
 {
     double input = 5;
-    Length::Quantity quantity (input, Unit::Meter);
+    Length::Quantity quantity (input, Length::Unit::Meter);
 
     std::cout << "\nConstructors:"
-              << "\nLength (" << input << ", Unit::Meter) = " << Length (input, Unit::Meter)
+              << "\nLength (" << input << ", Unit::Meter) = " << Length (input, Length::Unit::Meter)
               << "\nLength (" << input << ", \"m\") = " << Length (input, "m")
               << "\nLength (" << input << ", \"meter\") = " << Length (input, "meter")
               << "\nLength (Quantity(" << input << ", Unit::Meter)) = " << Length (quantity)
@@ -52,20 +56,30 @@
               << std::endl;
 }
 
+/**
+ * \ingroup core-examples
+ * \ingroup length
+ * \brief Demonstrates the use of ns3::Length conversions.
+ */
 void Conversions ()
 {
   //construct length using value and unit
-  Length moonDistance (3.84402e8, Unit::Meter);
+  Length moonDistance (3.84402e8, Length::Unit::Meter);
 
   //Demonstrate conversion to various units
   std::cout << "\nConversions: "
             << "\nDistance to moon = " << moonDistance
-            << "\nIn Feet: " << moonDistance.As (Unit::Foot)
-            << "\nIn Miles: " << moonDistance.As (Unit::Mile)
-            << "\nIn Kilometers: " << moonDistance.As (Unit::Kilometer)
+            << "\nIn Feet: " << moonDistance.As (Length::Unit::Foot)
+            << "\nIn Miles: " << moonDistance.As (Length::Unit::Mile)
+            << "\nIn Kilometers: " << moonDistance.As (Length::Unit::Kilometer)
             << std::endl;
 }
 
+/**
+ * \ingroup core-examples
+ * \ingroup length
+ * \brief Demonstrates the use of ns3::Length arithmetic operators.
+ */
 void ArithmeticOperators ()
 {
   double scale = 10;
@@ -89,6 +103,11 @@
 
 }
 
+/**
+ * \ingroup core-examples
+ * \ingroup length
+ * \brief Demonstrates the use of ns3::Length equality operators.
+ */
 void EqualityOperators ()
 {
   Length oneMeter = Meters (1);
@@ -119,6 +138,11 @@
             << std::endl;
 }
 
+/**
+ * \ingroup core-examples
+ * \ingroup length
+ * \brief Demonstrates the use of ns3::Length multiplications and divisions.
+ */
 void DivAndMod ()
 {
   //construct length using helper function
@@ -128,16 +152,16 @@
 
   int64_t count = Div (totalLen, pieceLen, &remainder);
 
-  std::cout << "\nHow many times can a " << totalLen.As (Unit::Foot) << " length "
-            << "be split into " << pieceLen.As (Unit::Foot) << " sized pieces? "
+  std::cout << "\nHow many times can a " << totalLen.As (Length::Unit::Foot) << " length "
+            << "be split into " << pieceLen.As (Length::Unit::Foot) << " sized pieces? "
             << count
-            << "\nremainder: " << remainder.As (Unit::Foot)
+            << "\nremainder: " << remainder.As (Length::Unit::Foot)
             << std::endl;
 
   std::cout << "\nHow much remains after splitting a "
-            << totalLen.As (Unit::Foot) << " length into "
-            << pieceLen.As (Unit::Foot) << " sized pieces? "
-            << Mod (totalLen, pieceLen).As (Unit::Foot)
+            << totalLen.As (Length::Unit::Foot) << " length into "
+            << pieceLen.As (Length::Unit::Foot) << " sized pieces? "
+            << Mod (totalLen, pieceLen).As (Length::Unit::Foot)
             << std::endl;
 }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/examples/sample-log-time-format.cc ns-3.36/src/core/examples/sample-log-time-format.cc
--- ns-3.35/src/core/examples/sample-log-time-format.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/examples/sample-log-time-format.cc	2022-04-30 18:23:57.790733000 -0700
@@ -28,7 +28,7 @@
  * occur at future times.  When run with no arguments, it prints out
  * something like this:
  * \code
- * $ ./waf --run sample-log-time-format
+ * $ ./ns3 run sample-log-time-format
  * RandomVariableStream:RandomVariableStream(0x184e3a0)
  * RandomVariableStream:UniformRandomVariable(0x184e3a0)
  * RandomVariableStream:SetStream(0x184e3a0, -1)
@@ -60,7 +60,7 @@
  * replacement function for printing time.  This can be demonstrated
  * by setting the 'replace-time-printer' parameter to true:
  * \code
- * ./waf --run 'sample-log-time-format --replaceTimePrinter=1'
+ * ./ns3 run 'sample-log-time-format --replaceTimePrinter=1'
  * RandomVariableStream:RandomVariableStream(0x15fb080)
  * RandomVariableStream:UniformRandomVariable(0x15fb080)
  * RandomVariableStream:SetStream(0x15fb080, -1)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/examples/sample-random-variable.cc ns-3.36/src/core/examples/sample-random-variable.cc
--- ns-3.35/src/core/examples/sample-random-variable.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/examples/sample-random-variable.cc	2022-04-30 18:23:57.790733000 -0700
@@ -29,8 +29,8 @@
 using namespace ns3;
 
 /**
- * This program can be run from waf such as
- * `./waf --run sample-random-variable`
+ * This program can be run from ns3 such as
+ * `./ns3 run sample-random-variable`
  *
  * This program is about as simple as possible to display the use of ns-3
  * to generate random numbers.  By default, the uniform random variate that
@@ -46,9 +46,9 @@
  * 1. Through explicit call of SeedManager::SetSeed () and
  *    SeedManager::SetRun () (commented out below)
  * 2. Through the passing of command line arguments such as:
- *    ./waf --command-template="%s --RngRun=<value>" --run program-name`
+ *    ./ns3 run program-name --command-template="%s --RngRun=<value>"`
  * 3. Through the use of the NS_GLOBAL_VALUE environment variable, such as:
- *    `$ NS_GLOBAL_VALUE="RngRun=<value>" ./waf --run program-name`
+ *    `$ NS_GLOBAL_VALUE="RngRun=<value>" ./ns3 run program-name`
  *
  * For instance, setting the run number to 3 will change the program output to
  * 0.775417
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/examples/sample-random-variable-stream.cc ns-3.36/src/core/examples/sample-random-variable-stream.cc
--- ns-3.35/src/core/examples/sample-random-variable-stream.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/examples/sample-random-variable-stream.cc	2022-04-30 18:23:57.790733000 -0700
@@ -27,8 +27,8 @@
  * \ingroup randomvariable
  * Example program illustrating use of ns3::RandomVariableStream
  *
- * This program can be run from waf such as
- * `./waf --run sample-random-variable-stream`
+ * This program can be run from ns3 such as
+ * `./ns3 run sample-random-variable-stream`
  *
  * This program is about as simple as possible to display the use of ns-3
  * to generate random numbers.  By default, the uniform random variate that
@@ -44,9 +44,9 @@
  * 1. Through explicit call of SeedManager::SetSeed () and
  *    SeedManager::SetRun () (commented out below)
  * 2. Through the passing of command line arguments such as:
- *    `./waf --command-template="%s --RngRun=<value>" --run program-name`
+ *    `./ns3 run program-name --command-template="%s --RngRun=<value>"`
  * 3. Through the use of the NS_GLOBAL_VALUE environment variable, such as:
- *    `$ NS_GLOBAL_VALUE="RngRun=<value>" ./waf --run program-name`
+ *    `$ NS_GLOBAL_VALUE="RngRun=<value>" ./ns3 run program-name`
  *
  * For instance, setting the run number to 3 will change the program output to
  * 0.775417
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/examples/sample-rng-plot.py ns-3.36/src/core/examples/sample-rng-plot.py
--- ns-3.35/src/core/examples/sample-rng-plot.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/examples/sample-rng-plot.py	2022-04-30 18:23:57.790733000 -0700
@@ -28,13 +28,26 @@
 import ns.core
 
 # mu, var = 100, 225
+
+## Random number generator.
 rng = ns.core.NormalRandomVariable()
 rng.SetAttribute("Mean", ns.core.DoubleValue(100.0))
 rng.SetAttribute("Variance", ns.core.DoubleValue(225.0))
+## Random number samples.
 x = [rng.GetValue() for t in range(10000)]
 
 # the histogram of the data
-n, bins, patches = plt.hist(x, 50, normed=1, facecolor='g', alpha=0.75)
+
+## Make a probability density histogram
+density = 1
+##Â Plot color
+facecolor='g'
+## Plot alpha value (transparency)
+alpha=0.75
+
+# We don't really need the plot results, we're just going to show it later.
+# n, bins, patches = plt.hist(x, 50, density=1, facecolor='g', alpha=0.75)
+plt.hist(x, 50, density=1, facecolor='g', alpha=0.75)
 
 plt.title('ns-3 histogram')
 plt.text(60, .025, r'$\mu=100,\ \sigma=15$')
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/examples/sample-simulator.cc ns-3.36/src/core/examples/sample-simulator.cc
--- ns-3.35/src/core/examples/sample-simulator.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/examples/sample-simulator.cc	2022-04-30 18:23:57.790733000 -0700
@@ -117,6 +117,14 @@
   EventId id = Simulator::Schedule (Seconds (30.0), &CancelledEvent);
   Simulator::Cancel (id);
 
+  Simulator::Schedule (Seconds (25.0),
+    [] ()
+    {
+      std::cout << "Code within a lambda expression at time " 
+                << Simulator::Now ().As (Time::S)
+                << std::endl;
+    });
+
   Simulator::Run ();
 
   Simulator::Destroy ();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/examples/sample-simulator.py ns-3.36/src/core/examples/sample-simulator.py
--- ns-3.35/src/core/examples/sample-simulator.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/examples/sample-simulator.py	2022-04-30 18:23:57.790733000 -0700
@@ -44,13 +44,21 @@
         print ("Member method received event at", ns.core.Simulator.Now().GetSeconds(), \
             "s started at", value, "s")
 
+## Example function - starts MyModel.
+## \param [in] model The instance of MyModel
+## \return None.
 def ExampleFunction(model):
     print ("ExampleFunction received event at", ns.core.Simulator.Now().GetSeconds(), "s")
     model.Start()
 
+## Example function - triggered at a random time.
+## \param [in] model The instance of MyModel
+## \return None.
 def RandomFunction(model):
     print ("RandomFunction received event at", ns.core.Simulator.Now().GetSeconds(), "s")
 
+## Example function - triggered if an event is canceled (should not be called).
+## \return None.
 def CancelledEvent():
     print ("I should never be called... ")
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/examples/wscript ns-3.36/src/core/examples/wscript
--- ns-3.35/src/core/examples/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/examples/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,68 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    if not bld.env['ENABLE_EXAMPLES']:
-        return;
-
-    obj = bld.create_ns3_program('main-callback', ['core'])
-    obj.source = 'main-callback.cc'
-
-    obj = bld.create_ns3_program('sample-simulator', ['core'])
-    obj.source = 'sample-simulator.cc'
-
-    bld.register_ns3_script('sample-simulator.py', ['core'])
-
-    obj = bld.create_ns3_program('main-ptr', ['core'] )
-    obj.source = 'main-ptr.cc'
-
-    obj = bld.create_ns3_program('main-random-variable-stream', ['core', 'config-store','stats'])
-    obj.source = 'main-random-variable-stream.cc'
-
-    obj = bld.create_ns3_program('sample-random-variable',
-                                 ['core'])
-    obj.source = 'sample-random-variable.cc'
-
-    obj = bld.create_ns3_program('sample-random-variable-stream',
-                                 ['core'])
-    obj.source = 'sample-random-variable-stream.cc'
-
-    obj = bld.create_ns3_program('command-line-example',
-                                 ['core'])
-    obj.source = 'command-line-example.cc'
-
-    obj = bld.create_ns3_program('hash-example',
-                                 ['core'])
-    obj.source = 'hash-example.cc'
-
-    obj = bld.create_ns3_program('sample-log-time-format', ['core'])
-    obj.source = 'sample-log-time-format.cc'
-
-    obj = bld.create_ns3_program('test-string-value-formatting', ['core'])
-    obj.source = 'test-string-value-formatting.cc'
-
-    obj = bld.create_ns3_program('sample-show-progress',
-                                 ['core'])
-    obj.source = 'sample-show-progress.cc'
-
-    obj = bld.create_ns3_program('empirical-random-variable-example', ['core', 'flow-monitor'])
-    obj.source = 'empirical-random-variable-example.cc'
-    
-    obj = bld.create_ns3_program('system-path-examples',
-                                 ['core'])
-    obj.source = 'system-path-examples.cc'
-    
-    obj = bld.create_ns3_program('fatal-example',
-                                 ['core'])
-    obj.source = 'fatal-example.cc'
-
-    if bld.env['ENABLE_BUILD_VERSION']:
-        obj = bld.create_ns3_program('build-version-example',
-                                 ['core'])
-        obj.source = 'build-version-example.cc'
-
-    if bld.env['ENABLE_THREADING'] and bld.env["ENABLE_REAL_TIME"]:
-        obj = bld.create_ns3_program('main-test-sync', ['network'])
-        obj.source = 'main-test-sync.cc'
-
-    obj = bld.create_ns3_program('length-example', ['core'])
-    obj.source = 'length-example.cc'
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/helper/csv-reader.h ns-3.36/src/core/helper/csv-reader.h
--- ns-3.35/src/core/helper/csv-reader.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/helper/csv-reader.h	2022-04-30 18:23:57.790733000 -0700
@@ -40,7 +40,7 @@
 
 /**
  * \ingroup core
- * \defgroup csvreader
+ * \defgroup csvreader CSV File Reader
  *
  * A way to extract data from simple csv files.
  */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/model/attribute-accessor-helper.h ns-3.36/src/core/model/attribute-accessor-helper.h
--- ns-3.35/src/core/model/attribute-accessor-helper.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/model/attribute-accessor-helper.h	2022-04-30 18:23:57.790733000 -0700
@@ -21,7 +21,6 @@
 #define ATTRIBUTE_ACCESSOR_HELPER_H
 
 #include "attribute.h"
-#include "unused.h"
 
 /**
  * \file
@@ -334,10 +333,8 @@
     {}
 
   private:
-    virtual bool DoSet (T *object, const V *v) const
+    virtual bool DoSet ([[maybe_unused]] T *object, [[maybe_unused]] const V *v) const
     {
-      NS_UNUSED (object);
-      NS_UNUSED (v);
       return false;
     }
     virtual bool DoGet (const T *object, V *v) const
@@ -402,10 +399,8 @@
       (object->*m_setter)(tmp);
       return true;
     }
-    virtual bool DoGet (const T *object, V *v) const
+    virtual bool DoGet ([[maybe_unused]] const T *object, [[maybe_unused]] V *v) const
     {
-      NS_UNUSED (object);
-      NS_UNUSED (v);
       return false;
     }
     virtual bool HasGetter (void) const
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/model/attribute.cc ns-3.36/src/core/model/attribute.cc
--- ns-3.35/src/core/model/attribute.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/model/attribute.cc	2022-04-30 18:23:57.790733000 -0700
@@ -25,7 +25,7 @@
 
 /**
  * \file
- * \ingroup attribute
+ * \ingroup attributes
  * ns3::AttributeValue, ns3::AttributeAccessor and
  * ns3::AttributeChecker implementations.
  */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/model/attribute-container-accessor-helper.h ns-3.36/src/core/model/attribute-container-accessor-helper.h
--- ns-3.35/src/core/model/attribute-container-accessor-helper.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/model/attribute-container-accessor-helper.h	2022-04-30 18:23:57.790733000 -0700
@@ -32,42 +32,76 @@
 namespace ns3 {
 
 /**
- * Compile time check if type T has const iterator.
+ * SFINAE compile time check if type T has const iterator.
  */
-template<typename T>
+template <typename T>
 struct has_const_iterator
 {
 private:
-    typedef char                      yes;
-    typedef struct { char array[2]; } no;
+  /// positive result
+  typedef char yes;
+  /// negative result
+  typedef struct
+  {
+    char array[2]; //!< Check value, its size must be different than the "yes" size
+  } no;
+
+  /**
+   * Test function, compiled if type has a const_iterator
+   * \return A value indicating that this specialization has been compiled.
+   */
+  template <typename C> static yes test (typename C::const_iterator *);
+  /**
+   * Test function, compiled if type does not have a const_iterator
+   * \return A value indicating that this specialization has been compiled.
+   */
+  template <typename C> static no test (...);
 
-    template<typename C> static yes test(typename C::const_iterator*);
-    template<typename C> static no  test(...);
 public:
-    static const bool value = sizeof(test<T>(0)) == sizeof(yes);
-    typedef T type;
+  /// Value of the test - true if type has a const_iterator
+  static const bool value = sizeof (test<T> (0)) == sizeof (yes);
+  /// Equivalent name of the type T
+  typedef T type;
 };
 
 /**
- * Compile time check if type T has begin() and end() methods.
+ * SFINAE compile time check if type T has begin() and end() methods.
  */
 template <typename T>
 struct has_begin_end
 {
-    template<typename C> static char (&f(typename std::enable_if<
-      std::is_same<decltype(static_cast<typename C::const_iterator (C::*)() const>(&C::begin)),
-      typename C::const_iterator(C::*)() const>::value, void>::type*))[1];
-
-    template<typename C> static char (&f(...))[2];
-
-    template<typename C> static char (&g(typename std::enable_if<
-      std::is_same<decltype(static_cast<typename C::const_iterator (C::*)() const>(&C::end)),
-      typename C::const_iterator(C::*)() const>::value, void>::type*))[1];
-
-    template<typename C> static char (&g(...))[2];
-
-    static bool const beg_value = sizeof(f<T>(0)) == 1;
-    static bool const end_value = sizeof(g<T>(0)) == 1;
+  /**
+   * Compiled if type T has a begin() method.
+   * \return A value indicating that this specialization has been compiled.
+   */
+  template <typename C> static char (&f (typename std::enable_if<
+    std::is_same<decltype (static_cast<typename C::const_iterator (C::*) () const> (&C::begin)),
+    typename C::const_iterator (C::*) () const>::value, void>::type *))[1];
+
+  /** 
+   * Compiled if type T does not have a begin() method.
+   * \return A value indicating that this specialization has been compiled.
+   */
+  template <typename C> static char (&f (...))[2];
+
+  /**
+   * Compiled if type T has an end() method.
+   * \return A value indicating that this specialization has been compiled.
+   */
+  template <typename C> static char (&g (typename std::enable_if<
+    std::is_same<decltype (static_cast<typename C::const_iterator (C::*) () const> (&C::end)),
+    typename C::const_iterator (C::*) () const>::value, void>::type *))[1];
+
+  /**
+   * Compiled if type T does not have an end() method.
+   * \return A value indicating that this specialization has been compiled.
+   */
+  template <typename C> static char (&g (...))[2];
+
+  /// True if type T has a begin() method.
+  static bool const beg_value = sizeof (f<T> (0)) == 1;
+  /// True if type T has an end() method.
+  static bool const end_value = sizeof (g<T> (0)) == 1;
 };
 
 /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/model/attribute-container.h ns-3.36/src/core/model/attribute-container.h
--- ns-3.35/src/core/model/attribute-container.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/model/attribute-container.h	2022-04-30 18:23:57.790733000 -0700
@@ -40,9 +40,9 @@
 /**
  * A container for one type of attribute.
  * 
- * The container uses \ref A to parse items into elements.
+ * The container uses \p A to parse items into elements.
  * Internally the container is always a list but an instance
- * can return the items in a container specified by \ref C.
+ * can return the items in a container specified by \p C.
  * 
  * @tparam A AttributeValue type to be contained.
  * @tparam C Possibly templated container class returned by Get.
@@ -68,7 +68,7 @@
 
   // use underlying AttributeValue to get return element type
   /** Item type of container returned by Get. */
-  typedef typename std::result_of<decltype(&A::Get)(A)>::type item_type;
+  typedef typename std::invoke_result_t<decltype(&A::Get), A> item_type;
   /** Type of container returned. */
   typedef C<item_type> result_type;
 
@@ -80,7 +80,7 @@
 
   /**
    * Construct from another container.
-   * @tparam CONTAINER[deduced] type of container passed for initialization.
+   * @tparam CONTAINER \deduced type of container passed for initialization.
    * \param c Instance of CONTAINER with which to initialize AttributeContainerValue.
    */
   template <class CONTAINER>
@@ -88,7 +88,7 @@
 
   /**
    * Construct from iterators.
-   * @tparam ITER[deduced] type of iterator.
+   * @tparam ITER \deduced type of iterator.
    * \param[in] begin Iterator that points to first initialization item.
    * \param[in] end Iterator that points ones past last initialization item.
    */
@@ -112,8 +112,8 @@
   /**
    * Copy items from container c.
    * 
-   * This method assumes \ref c has stl-style begin and end methods.
-   * The AttributeContainerValue value is cleared before copying from \ref c.
+   * This method assumes \p c has stl-style begin and end methods.
+   * The AttributeContainerValue value is cleared before copying from \p c.
    * @tparam T type of container.
    * \param c Container from which to copy items.
    */
@@ -170,7 +170,7 @@
    * 
    * The internal container is cleared before values are copied
    * using the push_back method.
-   * @tparam ITER[deduced] iterator type
+   * @tparam ITER \deduced iterator type
    * \param[in] begin Points to first item to copy
    * \param[in] end Points to one after last item to copy
    * \return This object with items copied.
@@ -185,16 +185,24 @@
 class AttributeContainerChecker : public AttributeChecker
 {
 public:
+  /**
+   * Set the item checker
+   * \param itemchecker The item checker
+   */
   virtual void SetItemChecker (Ptr<const AttributeChecker> itemchecker) = 0;
+  /**
+   * Get the item checker
+   * \return The item checker
+   */
   virtual Ptr<const AttributeChecker> GetItemChecker (void) const = 0;
 };
 
 /**
  * Make AttributeContainerChecker from AttributeContainerValue.
- * @tparam A[deduced] AttributeValue type in container.
- * @tparam C[deduced] Container type returned by Get.
- * \param value[in] AttributeContainerValue from which to deduce types.
- * \return AttributeContainerChecker for \ref value.
+ * @tparam A \deduced AttributeValue type in container.
+ * @tparam C \deduced Container type returned by Get.
+ * \param[in] value AttributeContainerValue from which to deduce types.
+ * \return AttributeContainerChecker for value.
  */
 template <class A, template <class...> class C>
 Ptr<AttributeChecker>
@@ -204,7 +212,7 @@
  * Make AttributeContainerChecker using explicit types, initialize item checker.
  * @tparam A AttributeValue type in container.
  * @tparam C Container type returned by Get.
- * \param itemchecker[in] AttributeChecker used for each item in the container.
+ * \param[in] itemchecker AttributeChecker used for each item in the container.
  * \return AttributeContainerChecker.
  */
 template <class A, template <class...> class C=std::list>
@@ -220,6 +228,13 @@
 template <class A, template <class...> class C=std::list>
 Ptr<AttributeChecker> MakeAttributeContainerChecker (void);
 
+/**
+ * Make AttributeContainerAccessor  using explicit types.
+ * @tparam A AttributeValue type in container.
+ * @tparam C Container type returned by Get.
+ * \param[in] a1 AttributeContainer to be used.
+ * \return AttributeContainerAccessor.
+ */
 template <typename A, template <typename...> class C=std::list, typename T1>
 Ptr<const AttributeAccessor> MakeAttributeContainerAccessor (T1 a1);
 
@@ -231,23 +246,29 @@
 
 namespace ns3 {
 
-// This internal class defines templated AttributeContainerChecker class that is instantiated
-// in MakeAttributeContainerChecker. The non-templated base ns3::AttributeContainerChecker
-// is returned from that function. This is the same pattern as ObjectPtrContainer.
-
 namespace internal {
 
+/**
+ * \internal
+ * Templated AttributeContainerChecker class that is instantiated
+ * in MakeAttributeContainerChecker. The non-templated base ns3::AttributeContainerChecker
+ * is returned from that function. This is the same pattern as ObjectPtrContainer.
+ */
 template <class A, template <class...> class C>
 class AttributeContainerChecker : public ns3::AttributeContainerChecker
 {
 public:
   AttributeContainerChecker (void);
+  /**
+   * Explicit constructor
+   * \param itemchecker The AttributeChecker.
+   */
   explicit AttributeContainerChecker (Ptr<const AttributeChecker> itemchecker);
   void SetItemChecker (Ptr<const AttributeChecker> itemchecker);
   Ptr<const AttributeChecker> GetItemChecker (void) const;
 
 private:
-  Ptr<const AttributeChecker> m_itemchecker;
+  Ptr<const AttributeChecker> m_itemchecker; //!< The AttributeChecker
 };
 
 template <class A, template <class...> class C>
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/model/attribute.h ns-3.36/src/core/model/attribute.h
--- ns-3.35/src/core/model/attribute.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/model/attribute.h	2022-04-30 18:23:57.790733000 -0700
@@ -27,7 +27,7 @@
 
 /**
  * \file
- * \ingroup attribute
+ * \ingroup attributes
  * ns3::AttributeValue, ns3::AttributeAccessor and
  * ns3::AttributeChecker declarations.
  */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/model/calendar-scheduler.h ns-3.36/src/core/model/calendar-scheduler.h
--- ns-3.35/src/core/model/calendar-scheduler.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/model/calendar-scheduler.h	2022-04-30 18:23:57.790733000 -0700
@@ -204,7 +204,7 @@
    * Ordering function to identify the insertion point, according to \c m_reverse.
    * \param [in] newEvent The new event being inserted.
    * \param [in] it The current position in the bucket being examined.
-   * \return \c true if the \c newEvent belongs before \it.
+   * \return \c true if the \c newEvent belongs before \c it.
    */
   bool (*Order) (const EventKey & newEvent, const EventKey & it);
   /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/model/callback.h ns-3.36/src/core/model/callback.h
--- ns-3.35/src/core/model/callback.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/model/callback.h	2022-04-30 18:23:57.790733000 -0700
@@ -1385,7 +1385,7 @@
    */
   bool IsNull (void) const
   {
-    return (DoPeekImpl () == 0) ? true : false;
+    return (DoPeekImpl () == 0);
   }
   /** Discard the implementation, set it to null */
   void Nullify (void)
@@ -1572,7 +1572,13 @@
         return false;
       }
   }
-  /** \copydoc Assign */
+  /* Broken: \copydoc Callback::Assign() */
+  /**
+   * Adopt the other's implementation, if type compatible
+   *
+   * \param [in] other Callback
+   * \returns \c true if \pname{other} was type-compatible and could be adopted.
+   */
   bool DoAssign (Ptr<const CallbackImplBase> other)
   {
     if (!DoCheckType (other))
@@ -1948,13 +1954,7 @@
   virtual ~CallbackValue ();
   /** \param [in] base The CallbackBase to use */
   void Set (CallbackBase base);
-  /**
-   * Give value my callback, if type compatible
-   *
-   * \tparam T \deduced The type in which to retrieve the value.
-   * \param [out] value Destination callback
-   * \returns \c true if successful
-   */
+  /* Documented by print-introspected-doxygen.cc */
   template <typename T>
   bool GetAccessor (T &value) const;
   /** \return A copy of this CallBack */
@@ -1975,7 +1975,8 @@
   virtual bool DeserializeFromString (std::string value, Ptr<const AttributeChecker> checker);
 
 private:
-  CallbackBase m_value;                 //!< the CallbackBase
+  /* Documented by print-introspected-doxygen.cc */
+  CallbackBase m_value;
 };
 
 ATTRIBUTE_ACCESSOR_DEFINE (Callback);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/model/command-line.cc ns-3.36/src/core/model/command-line.cc
--- ns-3.35/src/core/model/command-line.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/model/command-line.cc	2022-04-30 18:23:57.790733000 -0700
@@ -47,6 +47,58 @@
  * ns3::CommandLine implementation.
  */
 
+/** CommandLine anonymous namespace. */
+namespace {
+/**
+ * HTML-encode a string, for PrintDoxygenUsage().
+ * Usage and help strings, which are intended for text-only display,
+ * can contain illegal characters for HTML.  This function 
+ * encodes '&', '\"', '\'',  and '<'.
+ * \param [in] source The original string.
+ * \returns The HTML-encoded version.
+ */
+std::string 
+Encode (const std::string & source)
+{
+  std::string buffer;
+  buffer.reserve (1.1 * source.size ());
+
+  for(size_t pos = 0; pos != source.size (); ++pos) 
+    {
+      /* *NS_CHECK_STYLE_OFF* */
+      switch (source[pos]) 
+        {
+        case '&':  buffer.append ("&amp;");          break;
+        case '\"': buffer.append ("&quot;");         break;
+        case '\'': buffer.append ("&apos;");         break;
+          // case '>':  buffer.append ("&gt;");           break;
+
+        case '<':  {
+          // Special case:
+          // "...blah <file..." is not allowed
+          // "...foo<bar..."  is allowed
+          if (buffer.back () == ' ')
+            {
+              buffer.append ("&lt;");
+            }
+          else
+            {
+              buffer.append ("<");
+            }
+
+          break;
+        }
+
+        default:   buffer.append (&source[pos], 1);  break;
+        }
+      /* *NS_CHECK_STYLE_ON* */
+    }
+  return buffer;
+}
+
+}  // anonymous namespace
+
+
 namespace ns3 {
 
 NS_LOG_COMPONENT_DEFINE ("CommandLine");
@@ -148,7 +200,7 @@
     {
       args.erase (args.begin ());  // discard the program name
 
-      for (auto param : args)
+      for (const auto & param : args)
         {
           if (HandleOption (param))
             {
@@ -382,55 +434,47 @@
 
   std::fstream os (outf, std::fstream::out);
 
-
   os << "/**\n \\file " << m_shortName << ".cc\n"
      << "<h3>Usage</h3>\n"
-     << "<code>$ ./waf --run \"" << m_shortName
+     << "<code>$ ./ns3 run \"" << m_shortName
      << (m_options.size ()  ? " [Program Options]" : "")
      << (nonOptions.size () ? " [Program Arguments]" : "")
      << "\"</code>\n";
 
   if (m_usage.length ())
     {
-      os << m_usage << std::endl;
+      os << Encode (m_usage) << "\n";
     }
 
+  auto listOptions = [&os](Items items, std::string pre)
+  {
+    os << "<dl>\n";
+    for (const auto i : items)
+      {
+        os << "  <dt>" << pre << i->m_name << " </dt>\n"
+           << "    <dd>" << Encode (i->m_help);
+
+        if ( i->HasDefault ())
+          {
+            os << " [" << Encode (i->GetDefault ()) << "]";
+          }
+        os << " </dd>\n";
+      }
+    os << "</dl>\n";
+  };
+
   if (!m_options.empty ())
     {
       os << std::endl;
-      os << "<h3>Program Options</h3>\n"
-         << "<dl>\n";
-      for (auto i : m_options)
-        {
-          os << "  <dt>\\c --" << i->m_name << " </dt>\n"
-             << "    <dd>" << i->m_help;
-
-          if ( i->HasDefault ())
-            {
-              os << " [" << i->GetDefault () << "]";
-            }
-          os << " </dd>\n";
-        }
-      os << "</dl>\n";
+      os << "<h3>Program Options</h3>\n";
+      listOptions (m_options, "\\c --");
     }
 
   if (!nonOptions.empty ())
     {
       os << std::endl;
-      os << "<h3>Program Arguments</h3>\n"
-         << "<dl>\n";
-      for (auto i : nonOptions)
-        {
-          os << "  <dt> \\c " << i->m_name << " </dt>\n"
-             << "    <dd>" << i->m_help;
-
-          if ( i->HasDefault ())
-            {
-              os << " [" << i->GetDefault () << "]";
-            }
-          os << " </dd>\n";
-        }
-      os << "</dl>\n";
+      os << "<h3>Program Arguments</h3>\n";
+      listOptions (nonOptions, "\\c ");
     }
 
   os << "*/" << std::endl;
@@ -450,9 +494,7 @@
   // Sort output
   std::vector<std::string> globals;
 
-  for (GlobalValue::Iterator i = GlobalValue::Begin ();
-       i != GlobalValue::End ();
-       ++i)
+  for (auto i = GlobalValue::Begin(); i != GlobalValue::End(); ++i)
     {
       std::stringstream ss;
       ss << "    --" << (*i)->GetName () << "=[";
@@ -464,28 +506,23 @@
       globals.push_back (ss.str ());
     }
   std::sort (globals.begin (), globals.end ());
-  for (std::vector<std::string>::const_iterator it = globals.begin ();
-       it < globals.end ();
-       ++it)
+  for (const auto & s : globals)
     {
-      os << *it;
+      os << s;
     }
 }
 
 void
-CommandLine::PrintAttributes (std::ostream &os, const std::string &type) const
+CommandLine::PrintAttributeList (std::ostream &os, const TypeId tid, std::stringstream & header) const
 {
   NS_LOG_FUNCTION (this);
 
-  TypeId tid;
-  if (!TypeId::LookupByNameFailSafe (type, &tid))
+  if (!tid.GetAttributeN ())
     {
-      NS_FATAL_ERROR ("Unknown type=" << type << " in --PrintAttributes");
+      return;
     }
-
-  os << "Attributes for TypeId " << tid.GetName () << std::endl;
-
-  // Sort output
+  os << header.str() << "\n";
+  // To sort output
   std::vector<std::string> attributes;
 
   for (uint32_t i = 0; i < tid.GetAttributeN (); ++i)
@@ -493,17 +530,44 @@
       std::stringstream ss;
       ss << "    --" << tid.GetAttributeFullName (i) << "=[";
       struct TypeId::AttributeInformation info = tid.GetAttribute (i);
-      ss << info.initialValue->SerializeToString (info.checker) << "]"
-         << std::endl;
-      ss << "        " << info.help << std::endl;
+      ss << info.initialValue->SerializeToString (info.checker) << "]\n"
+         << "        " << info.help << "\n";
       attributes.push_back (ss.str ());
     }
   std::sort (attributes.begin (), attributes.end ());
-  for (std::vector<std::string>::const_iterator it = attributes.begin ();
-       it < attributes.end ();
-       ++it)
+  for (const auto & s : attributes)
     {
-      os << *it;
+      os << s;
+    }
+}
+
+void
+CommandLine::PrintAttributes (std::ostream &os, const std::string &type) const
+{
+  NS_LOG_FUNCTION (this);
+
+  TypeId tid;
+  if (!TypeId::LookupByNameFailSafe (type, &tid))
+    {
+      NS_FATAL_ERROR ("Unknown type=" << type << " in --PrintAttributes");
+    }
+
+  std::stringstream header;
+  header << "Attributes for TypeId " << tid.GetName ();
+  PrintAttributeList (os, tid, header);
+  header.str("");
+
+  //Parent Attributes
+  if (tid.GetParent () != tid)
+    {
+      TypeId tmp = tid.GetParent ();
+      while (tmp.GetParent () != tmp)
+        {
+          header << "Attributes defined in parent class " << tmp.GetName ();
+          PrintAttributeList (os, tmp, header);
+          header.str("");
+          tmp = tmp.GetParent ();
+        }
     }
 }
 
@@ -529,11 +593,9 @@
       groupTypes.push_back (ss.str ());
     }
   std::sort (groupTypes.begin (), groupTypes.end ());
-  for (std::vector<std::string>::const_iterator it = groupTypes.begin ();
-       it < groupTypes.end ();
-       ++it)
+  for (const auto & s : groupTypes)
     {
-      os << *it;
+      os << s;
     }
 }
 
@@ -554,11 +616,9 @@
       types.push_back (ss.str ());
     }
   std::sort (types.begin (), types.end ());
-  for (std::vector<std::string>::const_iterator it = types.begin ();
-       it < types.end ();
-       ++it)
+  for (const auto & s : types)
     {
-      os << *it;
+      os << s;
     }
 }
 
@@ -576,11 +636,9 @@
 
   os << "Registered TypeId groups:" << std::endl;
   // Sets are already sorted
-  for (std::set<std::string>::const_iterator k = groups.begin ();
-       k != groups.end ();
-       ++k)
+  for (const auto & s : groups)
     {
-      os << "    " << *k << std::endl;
+      os << "    " << s << std::endl;
     }
 }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/model/command-line.h ns-3.36/src/core/model/command-line.h
--- ns-3.35/src/core/model/command-line.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/model/command-line.h	2022-04-30 18:23:57.794733300 -0700
@@ -26,6 +26,7 @@
 
 #include "callback.h"
 #include "nstime.h"
+#include "type-id.h"
 
 /**
  * \file
@@ -155,19 +156,19 @@
  * Here is the output from a few runs of that program:
  *
  * \verbatim
-   $ ./waf --run="command-line-example"
+   $ ./ns3 run="command-line-example"
    intArg:   1
    boolArg:  false
    strArg:   "strArg default"
    cbArg:    "cbArg default"
 
-   $ ./waf --run="command-line-example --intArg=2 --boolArg --strArg=Hello --cbArg=World"
+   $ ./ns3 run="command-line-example --intArg=2 --boolArg --strArg=Hello --cbArg=World"
    intArg:   2
    boolArg:  true
    strArg:   "Hello"
    cbArg:    "World"
 
-   $ ./waf --run="command-line-example --help"
+   $ ./ns3 run="command-line-example --help"
    ns3-dev-command-line-example-debug [Program Arguments] [General Arguments]
 
    CommandLine example program.
@@ -538,13 +539,22 @@
    */
   void PrintGlobals (std::ostream &os) const;
   /**
-   * Handler for \c \--PrintAttributes:  print the attributes for a given type.
+   * Handler for \c \--PrintAttributes:  print the attributes for a given type
+   * as well as its parents.
    *
    * \param [in,out] os the output stream.
-   * \param [in] type The TypeId whose Attributes should be displayed
+   * \param [in] type The type name whose Attributes should be displayed,
    */
   void PrintAttributes (std::ostream &os, const std::string &type) const;
   /**
+   * Print the Attributes for a single type.
+   *
+   * \param [in,out] os the output stream.
+   * \param [in] tid The TypeId whose Attributes should be displayed,
+   * \param [in] header A header line to print if \c tid has Attributes
+   */
+  void PrintAttributeList (std::ostream &os, const TypeId tid, std::stringstream & header) const;
+  /**
    * Handler for \c \--PrintGroup:  print all types belonging to a given group.
    *
    * \param [in,out] os The output stream.
@@ -574,6 +584,7 @@
   /**
    * Append usage message in Doxygen format to the file indicated
    * by the NS_COMMANDLINE_INTROSPECTION environment variable.
+   * This is typically only called once, by Parse().
    */
   void PrintDoxygenUsage (void) const;
 
@@ -583,7 +594,7 @@
   std::size_t m_NNonOptions;            /**< The expected number of non-option arguments */
   std::size_t m_nonOptionCount;         /**< The number of actual non-option arguments seen so far. */
   std::string m_usage;                  /**< The Usage string */
-  std::string m_shortName;              /**< The source file name (without `.cc`), as would be given to `waf --run` */
+  std::string m_shortName;              /**< The source file name (without `.cc`), as would be given to `ns3 run` */
 
 };  // class CommandLine
 
@@ -603,7 +614,7 @@
  *
  * \param [in] value The argument name
  * \param [out] val The argument location
- * \tparam \deduced T The type being specialized
+ * \tparam T \deduced The type being specialized
  * \return \c true if parsing was successful
  */
 template <typename T>
@@ -695,7 +706,7 @@
 bool
 CommandLine::UserItem<T>::HasDefault () const
 {
-  return true;
+  return (m_default.size () > 0);
 }
 
 template <typename T>
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/model/config.cc ns-3.36/src/core/model/config.cc
--- ns-3.35/src/core/model/config.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/model/config.cc	2022-04-30 18:23:57.794733300 -0700
@@ -619,29 +619,29 @@
 public:
   // Keep Set and SetFailSafe since their errors are triggered
   // by the underlying ObjecBase functions.
-  /** \copydoc Config::Set() */
+  /** \copydoc ns3::Config::Set() */
   void Set (std::string path, const AttributeValue &value);
-  /** \copydoc Config::SetFailSafe() */
+  /** \copydoc ns3::Config::SetFailSafe() */
   bool SetFailSafe (std::string path, const AttributeValue &value);
-  /** \copydoc Config::ConnectWithoutContextFailSafe() */
+  /** \copydoc ns3::Config::ConnectWithoutContextFailSafe() */
   bool ConnectWithoutContextFailSafe (std::string path, const CallbackBase &cb);
-  /** \copydoc Config::ConnectFailSafe() */
+  /** \copydoc ns3::Config::ConnectFailSafe() */
   bool ConnectFailSafe (std::string path, const CallbackBase &cb);
-  /** \copydoc Config::DisconnectWithoutContext() */
+  /** \copydoc ns3::Config::DisconnectWithoutContext() */
   void DisconnectWithoutContext (std::string path, const CallbackBase &cb);
-  /** \copydoc Config::Disconnect() */
+  /** \copydoc ns3::Config::Disconnect() */
   void Disconnect (std::string path, const CallbackBase &cb);
-  /** \copydoc Config::LookupMatches() */
+  /** \copydoc ns3::Config::LookupMatches() */
   MatchContainer LookupMatches (std::string path);
 
-  /** \copydoc Config::RegisterRootNamespaceObject() */
+  /** \copydoc ns3::Config::RegisterRootNamespaceObject() */
   void RegisterRootNamespaceObject (Ptr<Object> obj);
-  /** \copydoc Config::UnregisterRootNamespaceObject() */
+  /** \copydoc ns3::Config::UnregisterRootNamespaceObject() */
   void UnregisterRootNamespaceObject (Ptr<Object> obj);
 
-  /** \copydoc Config::GetRootNamespaceObjectN() */
+  /** \copydoc ns3::Config::GetRootNamespaceObjectN() */
   std::size_t GetRootNamespaceObjectN (void) const;
-  /** \copydoc Config::GetRootNamespaceObject() */
+  /** \copydoc ns3::Config::GetRootNamespaceObject() */
   Ptr<Object> GetRootNamespaceObject (std::size_t i) const;
 
 private:
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/model/config.h ns-3.36/src/core/model/config.h
--- ns-3.35/src/core/model/config.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/model/config.h	2022-04-30 18:23:57.794733300 -0700
@@ -67,6 +67,10 @@
  */
 void Set (std::string path, const AttributeValue &value);
 /**
+ * \ingroup config
+ * \param [in] path A path to match attributes.
+ * \param [in] value The value to set in all matching attributes.
+ *
  * This function will attempt to find attributes which
  * match the input path and will then set their value to the input
  * value, and will return true if at least one such attribute is found.
@@ -123,6 +127,10 @@
  */
 void ConnectWithoutContext (std::string path, const CallbackBase &cb);
 /**
+ * \ingroup config
+ * \param [in] path A path to match trace sources.
+ * \param [in] cb The callback to connect to the matching trace sources.
+ *
  * This function will attempt to find all trace sources which
  * match the input path and will then connect the input callback
  * to them.  If no matching trace sources are found, this method will 
@@ -153,6 +161,10 @@
  */
 void Connect (std::string path, const CallbackBase &cb);
 /**
+ * \ingroup config
+ * \param [in] path A path to match trace sources.
+ * \param [in] cb The callback to connect to the matching trace sources.
+ *
  * This function will attempt to find all trace sources which
  * match the input path and will then connect the input callback
  * to them in such a way that the callback will receive an extra
@@ -196,16 +208,25 @@
 
   /**
    * \returns An iterator which points to the first item in the container
+   * @{
    */
   MatchContainer::Iterator Begin (void) const;
+  MatchContainer::Iterator begin (void) const { return Begin (); }
+  /** @} */
   /**
    * \returns An iterator which points to the last item in the container
+   * @{
    */
   MatchContainer::Iterator End (void) const;
+  MatchContainer::Iterator end (void) const { return End (); }
+  /** @} */
   /**
    * \returns The number of items in the container
+   * @{
    */
   std::size_t GetN (void) const;
+  std::size_t size (void) const { return GetN (); }
+  /** @} */
   /**
    * \param [in] i Index of item to lookup ([0,n[)
    * \returns The item requested.
@@ -236,6 +257,9 @@
    */
   void Set (std::string name, const AttributeValue &value);
   /**
+   * \param [in] name Name of attribute to set
+   * \param [in] value Value to set to the attribute
+   *
    * Set the specified attribute value to all the objects stored in this
    * container.  This method will return true if any attributes could be
    * set, and false otherwise.
@@ -254,6 +278,9 @@
    */
   void Connect (std::string name, const CallbackBase &cb);
   /**
+   * \param [in] name The name of the trace source to connect to
+   * \param [in] cb The sink to connect to the trace source
+   *
    * Connect the specified sink to all the objects stored in this
    * container.  This method will return true if any trace sources could be
    * connected, and false otherwise.
@@ -272,6 +299,9 @@
    */
   void ConnectWithoutContext (std::string name, const CallbackBase &cb);
   /**
+   * \param [in] name The name of the trace source to connect to
+   * \param [in] cb The sink to connect to the trace source
+   *
    * Connect the specified sink to all the objects stored in this
    * container.  This method will return true if any trace sources could be
    * connected, and false otherwise.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/model/default-simulator-impl.cc ns-3.36/src/core/model/default-simulator-impl.cc
--- ns-3.35/src/core/model/default-simulator-impl.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/model/default-simulator-impl.cc	2022-04-30 18:23:57.794733300 -0700
@@ -20,11 +20,8 @@
 
 #include "simulator.h"
 #include "default-simulator-impl.h"
-#include "scheduler.h"
-#include "event-impl.h"
 
-#include "ptr.h"
-#include "pointer.h"
+#include "scheduler.h"
 #include "assert.h"
 #include "log.h"
 
@@ -61,13 +58,8 @@
 {
   NS_LOG_FUNCTION (this);
   m_stop = false;
-  // uids are allocated from 4.
-  // uid 0 is "invalid" events
-  // uid 1 is "now" events
-  // uid 2 is "destroy" events
-  m_uid = 4;
-  // before ::Run is entered, the m_currentUid will be zero
-  m_currentUid = 0;
+  m_uid = EventId::UID::VALID;
+  m_currentUid = EventId::UID::INVALID;
   m_currentTs = 0;
   m_currentContext = Simulator::NO_CONTEXT;
   m_unscheduledEvents = 0;
@@ -140,6 +132,9 @@
 {
   Scheduler::Event next = m_events->RemoveNext ();
 
+  PreEventHook (EventId (next.impl, next.key.m_ts, 
+                         next.key.m_context, next.key.m_uid));
+
   NS_ASSERT (next.key.m_ts >= m_currentTs);
   m_unscheduledEvents--;
   m_eventCount++;
@@ -283,15 +278,7 @@
 {
   NS_ASSERT_MSG (SystemThread::Equals (m_main), "Simulator::ScheduleNow Thread-unsafe invocation!");
 
-  Scheduler::Event ev;
-  ev.impl = event;
-  ev.key.m_ts = m_currentTs;
-  ev.key.m_context = GetContext ();
-  ev.key.m_uid = m_uid;
-  m_uid++;
-  m_unscheduledEvents++;
-  m_events->Insert (ev);
-  return EventId (event, ev.key.m_ts, ev.key.m_context, ev.key.m_uid);
+  return Schedule (Time (0), event);
 }
 
 EventId
@@ -328,7 +315,7 @@
 void
 DefaultSimulatorImpl::Remove (const EventId &id)
 {
-  if (id.GetUid () == 2)
+  if (id.GetUid () == EventId::UID::DESTROY)
     {
       // destroy events.
       for (DestroyEvents::iterator i = m_destroyEvents.begin (); i != m_destroyEvents.end (); i++)
@@ -370,7 +357,7 @@
 bool
 DefaultSimulatorImpl::IsExpired (const EventId &id) const
 {
-  if (id.GetUid () == 2)
+  if (id.GetUid () == EventId::UID::DESTROY)
     {
       if (id.PeekEventImpl () == 0
           || id.PeekEventImpl ()->IsCancelled ())
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/model/default-simulator-impl.h ns-3.36/src/core/model/default-simulator-impl.h
--- ns-3.35/src/core/model/default-simulator-impl.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/model/default-simulator-impl.h	2022-04-30 18:23:57.794733300 -0700
@@ -22,13 +22,9 @@
 #define DEFAULT_SIMULATOR_IMPL_H
 
 #include "simulator-impl.h"
-#include "scheduler.h"
-#include "event-impl.h"
 #include "system-thread.h"
 #include "system-mutex.h"
 
-#include "ptr.h"
-
 #include <list>
 
 /**
@@ -39,6 +35,9 @@
 
 namespace ns3 {
 
+// Forward
+class Scheduler;
+
 /**
  * \ingroup simulator
  *
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/model/deprecated.h ns-3.36/src/core/model/deprecated.h
--- ns-3.35/src/core/model/deprecated.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/model/deprecated.h	2022-04-30 18:23:57.794733300 -0700
@@ -40,44 +40,51 @@
  * For example,
  * \snippet src/core/doc/deprecated-example.h doxygen snippet
  *
- * To ease future maintenance please use the versioned forms:
- * `NS_DEPRECATED_3_XX`, not the generic `NS_DEPRECATED`
+ * Please follow these two guidelines to ease future maintenance
+ * (primarily the eventual removal of the deprecated code):
+ *
+ * 1.  Please use the versioned form `NS_DEPRECATED_3_XX`, 
+ *     not the generic `NS_DEPRECATED`.
+ *
+ * 2.  Typically only the declaration needs to be deprecated, 
+ *
+ *     \code
+ *     NS_DEPRECATED_3_XX ("see TheNewWay") void SomethingUseful ();
+ *     \endcode
+ *
+ *     but it's helpful to put the same macro as a comment 
+ *     at the site of the definition, to make it easier to find
+ *     all the bits which eventually have to be removed:
+ *
+ *     \code
+ *     \/\* NS_DEPRECATED_3_XX ("see TheNewWay") *\\/
+ *     void SomethingUseful () { ... }
+ *     \endcode.
+ *
+ * \param msg Optional message to add to the compiler warning.
+ *
  */
-#if defined(__GNUC__)
-/* Test for GCC >= 4.1 */
-#define GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100)
-#if (GCC_VERSION >= 40100)
-#define NS_DEPRECATED  __attribute__ ((deprecated))
-#endif
-#undef GCC_VERSION
+#define NS_DEPRECATED(msg) [[deprecated (msg)]]
 
-
-#elif defined(__clang__) || defined(__llvm__)
-#define NS_DEPRECATED  __attribute__ ((deprecated))
-
-#elif defined(_MSC_VER)
-#define NS_DEPRECATED __declspec(deprecated)
-
-#else
-#define NS_DEPRECATED
-#endif
+/**
+ * \ingroup core
+ * \def NS_DEPRECATED_3_36
+ * Tag for things deprecated in version ns-3.36.
+ */
+#define NS_DEPRECATED_3_36(msg) NS_DEPRECATED(msg)
 
 /**
  * \ingroup core
  * \def NS_DEPRECATED_3_35
  * Tag for things deprecated in version ns-3.35.
  */
-#ifdef NS_DEPRECATED
-#define NS_DEPRECATED_3_35 NS_DEPRECATED
-#endif
+#define NS_DEPRECATED_3_35 NS_DEPRECATED("")
 
 /**
  * \ingroup core
  * \def NS_DEPRECATED_3_34
  * Tag for things deprecated in version ns-3.34.
  */
-#ifdef NS_DEPRECATED
-#define NS_DEPRECATED_3_34 NS_DEPRECATED
-#endif
+#define NS_DEPRECATED_3_34 NS_DEPRECATED("")
 
 #endif /* NS3_DEPRECATED_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/model/des-metrics.h ns-3.36/src/core/model/des-metrics.h
--- ns-3.35/src/core/model/des-metrics.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/model/des-metrics.h	2022-04-30 18:23:57.794733300 -0700
@@ -88,14 +88,14 @@
  *
  * Enable DES Metrics at configure time with
  * \verbatim
-   $ waf configure ... --enable-des-metrics \endverbatim
+   $ ns3 configure ... --enable-des-metrics \endverbatim
  *
  * <b> Working with DES Metrics </b>
  *
  * Some useful shell pipelines:
  *
  * \li Run everything, retaining the results directory: <br/>
- *   \code  ./test.py --nowaf --retain \endcode
+ *   \code  ./test.py --nobuild --retain \endcode
  * \li Example traces end up in \c testpy-output/, so move there: <br/>
  *   \code cd testpy-output/$(date +"%F")*_/  \endcode
  *   (Remove the `_', which is to work around a Doxygen limitation.)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/model/enum.cc ns-3.36/src/core/model/enum.cc
--- ns-3.35/src/core/model/enum.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/model/enum.cc	2022-04-30 18:23:57.794733300 -0700
@@ -138,7 +138,7 @@
   auto pvalue = p->Get ();
   auto it = std::find_if (m_valueSet.begin (), m_valueSet.end (),
                           [pvalue] (Value v) { return v.first == pvalue; } );
-  return (it != m_valueSet.end ()) ? true : false;
+  return (it != m_valueSet.end ());
 }
 std::string
 EnumChecker::GetValueTypeName (void) const
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/model/enum.h ns-3.36/src/core/model/enum.h
--- ns-3.35/src/core/model/enum.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/model/enum.h	2022-04-30 18:23:57.794733300 -0700
@@ -155,6 +155,7 @@
  * \returns The AttributeChecker
  * \param [in] v  The default enum value.
  * \param [in] n  The corresponding name.
+ * \param [in] args Any additional arguments.
  */
 template <typename... Ts>
 Ptr<const AttributeChecker>
@@ -174,6 +175,7 @@
  * \param [in] checker The AttributeChecker.
  * \param [in] v  The next enum value.
  * \param [in] n  The corresponding name.
+ * \param [in] args Any additional arguments.
  */
 
 template <typename... Ts>
@@ -187,7 +189,7 @@
 /**
  * Terminate the recursion of variadic arguments.
  *
- * \returns The \pname checker
+ * \returns The \p checker
  * \param [in] checker The AttributeChecker.
  */
 // inline to allow tail call optimization
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/model/event-id.h ns-3.36/src/core/model/event-id.h
--- ns-3.35/src/core/model/event-id.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/model/event-id.h	2022-04-30 18:23:57.794733300 -0700
@@ -53,6 +53,22 @@
 class EventId
 {
 public:
+
+  /** Special values of the event UID. */
+  enum UID 
+    {
+      /** Invalid UID value. */
+      INVALID = 0,
+      /** ScheduleNow() events. */
+      NOW = 1,
+      /** ScheduleDestroy() events. */
+      DESTROY = 2,
+      /** Reserved UID. */
+      RESERVED = 3,
+      /** Schedule(), etc. events. */
+      VALID = 4
+    };
+
   /** Default constructor. This EventId does nothing. */
   EventId ();
   /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/model/example-as-test.cc ns-3.36/src/core/model/example-as-test.cc
--- ns-3.35/src/core/model/example-as-test.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/model/example-as-test.cc	2022-04-30 18:23:57.794733300 -0700
@@ -21,12 +21,12 @@
 #include "example-as-test.h"
 #include "ascii-test.h"
 #include "log.h"
-#include "unused.h"
 #include "assert.h"
 
 #include <string>
 #include <sstream>
-#include <cstdlib>  // itoa(), system ()
+#include <cstdlib>  // itoa(), system (), getenv ()
+#include <cstring>
 
 /**
  * \file
@@ -88,8 +88,8 @@
   std::stringstream ss;
 
   // Use bash as shell to allow use of PIPESTATUS
-  ss << "bash -c './waf --run-no-build " << m_program
-     << " --command-template=\"" << GetCommandTemplate () << "\""
+  ss << "bash -c './ns3 run " << m_program
+     << " --no-build --command-template=\"" << GetCommandTemplate () << "\""
 
     // redirect std::clog, std::cerr to std::cout
      << " 2>&1 "
@@ -100,7 +100,7 @@
      << GetPostProcessingCommand ()
      << " > " << testFile
 
-    // Get the status of waf
+    // Get the status of ns3
      << "; exit ${PIPESTATUS[0]}'";
 
   int status = std::system (ss.str ().c_str ());
@@ -123,6 +123,13 @@
   // Make sure the example didn't outright crash
   NS_TEST_ASSERT_MSG_EQ (status, 0, "example " + m_program + " failed");
 
+  // Check that we're not just introspecting the command-line
+  const char * envVar = std::getenv ("NS_COMMANDLINE_INTROSPECTION");
+  if (envVar != 0 && std::strlen (envVar) != 0)
+    {
+      return;
+    }
+
   // Compare the testFile to the reference file
   NS_ASCII_TEST_EXPECT_EQ (testFile, refFile);
 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/model/example-as-test.h ns-3.36/src/core/model/example-as-test.h
--- ns-3.35/src/core/model/example-as-test.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/model/example-as-test.h	2022-04-30 18:23:57.794733300 -0700
@@ -78,7 +78,7 @@
    * Customization point for more complicated patterns
    * to invoke the example program.
    *
-   * \returns The string to be given to the `waf --command-template=` argument.
+   * \returns The string to be given to the `ns3 --command-template=` argument.
    */
   virtual std::string GetCommandTemplate (void) const;
 
@@ -126,7 +126,7 @@
  * \par Test Addition
  *
  * To use an example program as a test you need to create a test suite
- * file and add it to the appropriate list in your module wscript
+ * file and add it to the appropriate list in your module CMakeLists.txt
  * file. The "good" output reference file needs to be generated for
  * detecting regressions.
  *
@@ -148,7 +148,7 @@
  * the same example is run twice with different arguments.
  *
  * You then need to add that newly created test suite file to the list
- * of test sources in `mymodule/wscript`.   Building of examples
+ * of test sources in `mymodule/CMakeLists.txt`.   Building of examples
  * is an option so you need to guard the inclusion of the test suite:
  *
  * \code{.py}
@@ -156,7 +156,7 @@
  *    module.source.append('model/mymodule-examples-test-suite.cc')
  * \endcode
  *
- * Since you modified a wscript file you need to reconfigure and
+ * Since you modified a CMakeLists.txt file you need to reconfigure and
  * rebuild everything.
  *
  * You just added new tests so you will need to generate the "good"
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/model/global-value.h ns-3.36/src/core/model/global-value.h
--- ns-3.35/src/core/model/global-value.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/model/global-value.h	2022-04-30 18:23:57.794733300 -0700
@@ -108,7 +108,6 @@
    * Get the value.
    * \param [out] value The AttributeValue to set to the value
    *                    of this GlobalValue
-   * \returns The current value of this GlobalValue.
    */
   void GetValue (AttributeValue &value) const;
   /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/model/hash.cc ns-3.36/src/core/model/hash.cc
--- ns-3.35/src/core/model/hash.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/model/hash.cc	2022-04-30 18:23:57.794733300 -0700
@@ -32,6 +32,13 @@
 
 NS_LOG_COMPONENT_DEFINE ("Hash");
 
+Hasher& GetStaticHash (void)
+{
+  static Hasher g_hasher = Hasher ();
+  g_hasher.clear();
+  return g_hasher;
+}
+
 Hasher::Hasher ()
 {
   m_impl = Create <Hash::Function::Murmur3> ();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/model/hash.h ns-3.36/src/core/model/hash.h
--- ns-3.35/src/core/model/hash.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/model/hash.h	2022-04-30 18:23:57.794733300 -0700
@@ -271,32 +271,38 @@
   Global hash functions, inlined for rvo
 */
 
+/**
+  * \brief Get a reference to the static global hasher at g_hasher
+  * \return Reference to the static Hasher instance.
+  */
+Hasher& GetStaticHash (void);
+
 inline
 uint32_t
 Hash32 (const char * buffer, const std::size_t size)
 {
-  return Hasher ().GetHash32 (buffer, size);
+  return GetStaticHash ().GetHash32 (buffer, size);
 }
 
 inline
 uint64_t
 Hash64 (const char * buffer, const std::size_t size)
 {
-  return Hasher ().GetHash64 (buffer, size);
+  return GetStaticHash ().GetHash64 (buffer, size);
 }
 
 inline
 uint32_t
 Hash32 (const std::string s)
 {
-  return Hasher ().GetHash32 (s);
+  return GetStaticHash ().GetHash32 (s);
 }
 
 inline
 uint64_t
 Hash64 (const std::string s)
 {
-  return Hasher ().GetHash64 (s);
+  return GetStaticHash ().GetHash64 (s);
 }
 
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/model/heap-scheduler.cc ns-3.36/src/core/model/heap-scheduler.cc
--- ns-3.35/src/core/model/heap-scheduler.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/model/heap-scheduler.cc	2022-04-30 18:23:57.794733300 -0700
@@ -99,7 +99,7 @@
 HeapScheduler::IsRoot (std::size_t id) const
 {
   NS_LOG_FUNCTION (this << id);
-  return (id == Root ()) ? true : false;
+  return (id == Root ());
 }
 
 std::size_t
@@ -114,7 +114,7 @@
 HeapScheduler::IsBottom (std::size_t id) const
 {
   NS_LOG_FUNCTION (this << id);
-  return (id >= m_heap.size ()) ? true : false;
+  return (id >= m_heap.size ());
 }
 
 void
@@ -146,7 +146,7 @@
 HeapScheduler::IsEmpty (void) const
 {
   NS_LOG_FUNCTION (this);
-  return (m_heap.size () == 1) ? true : false;
+  return (m_heap.size () == 1);
 }
 
 void
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/model/int64x64-128.cc ns-3.36/src/core/model/int64x64-128.cc
--- ns-3.35/src/core/model/int64x64-128.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/model/int64x64-128.cc	2022-04-30 18:23:57.794733300 -0700
@@ -57,7 +57,7 @@
   bool negB = sb < 0;
   ua = negA ? -sa : sa;
   ub = negB ? -sb : sb;
-  return (negA && !negB) || (!negA && negB);
+  return negA != negB;
 }
 
 void
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/model/int64x64-128.h ns-3.36/src/core/model/int64x64-128.h
--- ns-3.35/src/core/model/int64x64-128.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/model/int64x64-128.h	2022-04-30 18:23:57.794733300 -0700
@@ -20,14 +20,24 @@
 #include "ns3/core-config.h"
 
 #if !defined(INT64X64_128_H) && defined (INT64X64_USE_128) && !defined(PYTHON_SCAN)
+/**
+ * \ingroup highprec
+ * Use uint128_t for int64x64_t implementation
+ */
 #define INT64X64_128_H
 
 #include <stdint.h>
 #include <cmath>  // pow
 
 #if defined(HAVE___UINT128_T) && !defined(HAVE_UINT128_T)
+/**
+ * \ingroup highprec
+ * Some compilers do not have this defined, so we define it.
+ * @{
+ */
 typedef __uint128_t uint128_t;
 typedef __int128_t int128_t;
+/** @} */
 #endif
 
 /**
@@ -89,10 +99,13 @@
   {}
   /**
    * \name Construct from a floating point value.
+   */
+  /**
+   * @{
+   * Constructor from a floating point.
    *
    * \param [in] value Floating value to represent.
    */
-  /**@{*/
   inline int64x64_t (const double value)
   {
     const int64x64_t tmp ((long double)value);
@@ -130,10 +143,13 @@
 
   /**
    * \name Construct from an integral type.
+   */
+  /**@{*/
+  /**
+   * Construct from an integral type.
    *
    * \param [in] v Integer value to represent.
    */
-  /**@{*/
   inline int64x64_t (const int v)
     : _v (v)
   {
@@ -164,6 +180,9 @@
   {
     _v <<= 64;
   }
+  inline int64x64_t (const int128_t v)
+    : _v (v)
+  {}
   /**@}*/
 
   /**
@@ -198,6 +217,12 @@
     return *this;
   }
 
+  /** Explicit bool conversion. */
+  inline explicit operator bool () const
+  {
+    return (_v != 0);
+  }
+
   /**
    * Get this value as a double.
    *
@@ -304,15 +329,32 @@
    *  \param [in] rhs Right hand argument
    *  \return The result of the operator.
    */
-  friend bool         operator == (const int64x64_t & lhs, const int64x64_t & rhs);
-
-  friend bool         operator <  (const int64x64_t & lhs, const int64x64_t & rhs);
-  friend bool         operator >  (const int64x64_t & lhs, const int64x64_t & rhs);
-
-  friend int64x64_t & operator += (      int64x64_t & lhs, const int64x64_t & rhs);
-  friend int64x64_t & operator -= (      int64x64_t & lhs, const int64x64_t & rhs);
-  friend int64x64_t & operator *= (      int64x64_t & lhs, const int64x64_t & rhs);
-  friend int64x64_t & operator /= (      int64x64_t & lhs, const int64x64_t & rhs);
+  // *NS_CHECK_STYLE_OFF*
+  friend inline bool operator == (const int64x64_t & lhs, const int64x64_t & rhs) { return lhs._v == rhs._v; };
+  friend inline bool operator <  (const int64x64_t & lhs, const int64x64_t & rhs) { return lhs._v < rhs._v; };
+  friend inline bool operator >  (const int64x64_t & lhs, const int64x64_t & rhs) { return lhs._v > rhs._v; };
+
+  friend inline int64x64_t & operator += (int64x64_t & lhs, const int64x64_t & rhs)
+    {
+      lhs._v += rhs._v;
+       return lhs;
+    };
+  friend inline int64x64_t & operator -= (int64x64_t & lhs, const int64x64_t & rhs)
+    {
+      lhs._v -= rhs._v;
+      return lhs;
+    };
+  friend inline int64x64_t & operator *= (int64x64_t & lhs, const int64x64_t & rhs)
+    {
+      lhs.Mul (rhs);
+      return lhs;
+    };
+  friend inline int64x64_t & operator /= (int64x64_t & lhs, const int64x64_t & rhs)
+    {
+      lhs.Div (rhs);
+      return lhs;
+    };
+  // *NS_CHECK_STYLE_ON*
   /**@}*/
 
   /**
@@ -325,8 +367,9 @@
    *  \param [in] lhs Left hand argument
    *  \return The result of the operator.
    */
-  friend int64x64_t   operator -  (const int64x64_t & lhs);
-  friend int64x64_t   operator !  (const int64x64_t & lhs);
+  friend inline int64x64_t   operator +  (const int64x64_t & lhs) { return lhs; };
+  friend inline int64x64_t   operator -  (const int64x64_t & lhs) { return int64x64_t (-lhs._v); };
+  friend inline int64x64_t   operator !  (const int64x64_t & lhs) { return int64x64_t (!lhs._v); };
   /**@}*/
 
   /**
@@ -385,134 +428,11 @@
    */
   static uint128_t UmulByInvert (const uint128_t a, const uint128_t b);
 
-  /**
-   * Construct from an integral type.
-   *
-   * \param [in] v Integer value to represent.
-   */
-  inline int64x64_t (const int128_t v)
-    : _v (v)
-  {}
-
   int128_t _v;  //!< The Q64.64 value.
 
 };  // class int64x64_t
 
 
-/**
- * \ingroup highprec
- * Equality operator.
- * \param [in] lhs Left hand argument
- * \param [in] rhs Right hand argument
- * \return The result of the operator.
- */
-inline bool operator == (const int64x64_t & lhs, const int64x64_t & rhs)
-{
-  return lhs._v == rhs._v;
-}
-/**
- * \ingroup highprec
- * Less than operator.
- * \param [in] lhs Left hand argument
- * \param [in] rhs Right hand argument
- * \return The result of the operator.
- */
-inline bool operator < (const int64x64_t & lhs, const int64x64_t & rhs)
-{
-  return lhs._v < rhs._v;
-}
-/**
- * \ingroup highprec
- * Greater operator.
- * \param [in] lhs Left hand argument
- * \param [in] rhs Right hand argument
- * \return The result of the operator.
- */
-inline bool operator > (const int64x64_t & lhs, const int64x64_t & rhs)
-{
-  return lhs._v > rhs._v;
-}
-
-/**
- * \ingroup highprec
- * Compound addition operator.
- * \param [in] lhs Left hand argument
- * \param [in] rhs Right hand argument
- * \return The result of the operator.
- */
-inline int64x64_t & operator += (int64x64_t & lhs, const int64x64_t & rhs)
-{
-  lhs._v += rhs._v;
-  return lhs;
-}
-/**
- * \ingroup highprec
- * Compound subtraction operator.
- * \param [in] lhs Left hand argument
- * \param [in] rhs Right hand argument
- * \return The result of the operator.
- */
-inline int64x64_t & operator -= (int64x64_t & lhs, const int64x64_t & rhs)
-{
-  lhs._v -= rhs._v;
-  return lhs;
-}
-/**
- * \ingroup highprec
- * Compound multiplication operator.
- * \param [in] lhs Left hand argument
- * \param [in] rhs Right hand argument
- * \return The result of the operator.
- */
-inline int64x64_t & operator *= (int64x64_t & lhs, const int64x64_t & rhs)
-{
-  lhs.Mul (rhs);
-  return lhs;
-}
-/**
- * \ingroup highprec
- * Compound division operator.
- * \param [in] lhs Left hand argument
- * \param [in] rhs Right hand argument
- * \return The result of the operator.
- */
-inline int64x64_t & operator /= (int64x64_t & lhs, const int64x64_t & rhs)
-{
-  lhs.Div (rhs);
-  return lhs;
-}
-
-/**
- * \ingroup highprec
- * Unary plus operator.
- * \param [in] lhs Left hand argument
- * \return The result of the operator.
- */
-inline int64x64_t operator + (const int64x64_t & lhs)
-{
-  return lhs;
-}
-/**
- * \ingroup highprec
- * Unary negation operator (change sign operator).
- * \param [in] lhs Left hand argument
- * \return The result of the operator.
- */
-inline int64x64_t operator - (const int64x64_t & lhs)
-{
-  return int64x64_t (-lhs._v);
-}
-/**
- * \ingroup highprec
- * Logical not operator.
- * \param [in] lhs Left hand argument
- * \return The result of the operator.
- */
-inline int64x64_t operator ! (const int64x64_t & lhs)
-{
-  return int64x64_t (!lhs._v);
-}
-
 
 } // namespace ns3
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/model/int64x64-cairo.h ns-3.36/src/core/model/int64x64-cairo.h
--- ns-3.35/src/core/model/int64x64-cairo.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/model/int64x64-cairo.h	2022-04-30 18:23:57.794733300 -0700
@@ -19,6 +19,7 @@
 
 #include "ns3/core-config.h"
 #if !defined(INT64X64_CAIRO_H) && defined (INT64X64_USE_CAIRO) && !defined(PYTHON_SCAN)
+/** Using the ns3::int64x64_t based on Cairo 128-bit integers. */
 #define INT64X64_CAIRO_H
 
 #include <cmath>  // pow
@@ -81,11 +82,14 @@
     _v.hi = 0;
     _v.lo = 0;
   }
-  /**@{*/
   /**
-   * Construct from a floating point value.
+   * \name Construct from a floating point value.
+   */
+  /**
+   * @{
+   * Constructor from a floating point.
    *
-   * \param [in] value floating value to represent
+   * \param [in] value Floating value to represent.
    */
   inline int64x64_t (const double value)
   {
@@ -122,6 +126,9 @@
   }
   /**@}*/
 
+  /**
+   * \name Construct from an integral type.
+   */
   /**@{*/
   /**
    * Construct from an integral type.
@@ -191,6 +198,12 @@
     return *this;
   }
 
+  /** Explicit bool conversion. */
+  inline explicit operator bool () const
+  {
+    return (_v != 0);
+  }
+
   /**
    * Get this value as a double.
    *
@@ -295,16 +308,33 @@
    *  \param [in] rhs Right hand argument
    *  \return The result of the operator.
    */
-  friend bool         operator == (const int64x64_t & lhs, const int64x64_t & rhs);
-
-  friend bool         operator <  (const int64x64_t & lhs, const int64x64_t & rhs);
-  friend bool         operator >  (const int64x64_t & lhs, const int64x64_t & rhs);
-
-  friend int64x64_t & operator += (      int64x64_t & lhs, const int64x64_t & rhs);
-  friend int64x64_t & operator -= (      int64x64_t & lhs, const int64x64_t & rhs);
-  friend int64x64_t & operator *= (      int64x64_t & lhs, const int64x64_t & rhs);
-  friend int64x64_t & operator /= (      int64x64_t & lhs, const int64x64_t & rhs);
-  /**@}*/
+  // *NS_CHECK_STYLE_OFF*
+  friend inline bool operator == (const int64x64_t & lhs, const int64x64_t & rhs) { return _cairo_int128_eq (lhs._v, rhs._v); };
+  friend inline bool operator <  (const int64x64_t & lhs, const int64x64_t & rhs) { return _cairo_int128_lt (lhs._v, rhs._v); };
+  friend inline bool operator >  (const int64x64_t & lhs, const int64x64_t & rhs) { return _cairo_int128_gt (lhs._v, rhs._v); };
+
+  friend inline int64x64_t & operator += (int64x64_t & lhs, const int64x64_t & rhs)
+    {
+      lhs._v = _cairo_int128_add ( lhs._v, rhs._v );
+      return lhs;
+    };
+  friend inline int64x64_t & operator -= (int64x64_t & lhs, const int64x64_t & rhs)
+    {
+      lhs._v = _cairo_int128_sub ( lhs._v, rhs._v );
+      return lhs;
+    };
+  friend inline int64x64_t & operator *= (int64x64_t & lhs, const int64x64_t & rhs)
+    {
+      lhs.Mul (rhs);
+      return lhs;
+    };
+  friend inline int64x64_t & operator /= (int64x64_t & lhs, const int64x64_t & rhs)
+    {
+      lhs.Div (rhs);
+      return lhs;
+    };
+  // *NS_CHECK_STYLE_ON*
+  /** @} */
 
   /**
    * \name Unary Operators
@@ -316,9 +346,18 @@
    *  \param [in] lhs Left hand argument
    *  \return The result of the operator.
    */
-  friend int64x64_t   operator -  (const int64x64_t & lhs);
-  friend int64x64_t   operator !  (const int64x64_t & lhs);
-  /**@}*/
+  friend inline int64x64_t   operator +  (const int64x64_t & lhs) { return lhs; };
+  friend inline int64x64_t   operator -  (const int64x64_t & lhs)
+    {
+      int64x64_t tmp = lhs;
+      tmp._v = _cairo_int128_negate (tmp._v);
+      return tmp;
+    };
+  friend inline int64x64_t   operator !  (const int64x64_t & lhs)
+    {
+      return (lhs == int64x64_t ()) ? int64x64_t (1, 0) : int64x64_t ();
+    };
+  /** @} */
 
   /**
    * Implement `*=`.
@@ -381,123 +420,6 @@
 };  // class int64x64_t
 
 
-/**
- * \ingroup highprec
- * Equality operator.
- * \param [in] lhs Left hand argument
- * \param [in] rhs Right hand argument
- * \return The result of the operator.
- */
-inline bool operator == (const int64x64_t & lhs, const int64x64_t & rhs)
-{
-  return _cairo_int128_eq (lhs._v, rhs._v);
-}
-/**
- * \ingroup highprec
- * Less than operator
- * \param [in] lhs Left hand argument
- * \param [in] rhs Right hand argument
- * \return The result of the operator.
- */
-inline bool operator < (const int64x64_t & lhs, const int64x64_t & rhs)
-{
-  return _cairo_int128_lt (lhs._v, rhs._v);
-}
-/**
- * \ingroup highprec
- * Greater operator
- * \param [in] lhs Left hand argument
- * \param [in] rhs Right hand argument
- * \return The result of the operator.
- */
-inline bool operator > (const int64x64_t & lhs, const int64x64_t & rhs)
-{
-  return _cairo_int128_gt (lhs._v, rhs._v);
-}
-
-/**
- * \ingroup highprec
- * Compound addition operator
- * \param [in] lhs Left hand argument
- * \param [in] rhs Right hand argument
- * \return The result of the operator.
- */
-inline int64x64_t & operator += (int64x64_t & lhs, const int64x64_t & rhs)
-{
-  lhs._v = _cairo_int128_add ( lhs._v, rhs._v );
-  return lhs;
-}
-/**
- * \ingroup highprec
- * Compound subtraction operator
- * \param [in] lhs Left hand argument
- * \param [in] rhs Right hand argument
- * \return The result of the operator.
- */
-inline int64x64_t & operator -= (int64x64_t & lhs, const int64x64_t & rhs)
-{
-  lhs._v = _cairo_int128_sub ( lhs._v, rhs._v );
-  return lhs;
-}
-/**
- * \ingroup highprec
- * Compound multiplication operator
- * \param [in] lhs Left hand argument
- * \param [in] rhs Right hand argument
- * \return The result of the operator.
- */
-inline int64x64_t & operator *= (int64x64_t & lhs, const int64x64_t & rhs)
-{
-  lhs.Mul (rhs);
-  return lhs;
-}
-/**
- * \ingroup highprec
- * Compound division operator
- * \param [in] lhs Left hand argument
- * \param [in] rhs Right hand argument
- * \return The result of the operator.
- */
-inline int64x64_t & operator /= (int64x64_t & lhs, const int64x64_t & rhs)
-{
-  lhs.Div (rhs);
-  return lhs;
-}
-
-/**
- * \ingroup highprec
- * Unary plus operator
- * \param [in] lhs Left hand argument
- * \return The result of the operator.
- */
-inline int64x64_t operator + (const int64x64_t & lhs)
-{
-  return lhs;
-}
-/**
- * \ingroup highprec
- * Unary negation operator (change sign operator)
- * \param [in] lhs Left hand argument
- * \return The result of the operator.
- */
-inline int64x64_t operator - (const int64x64_t & lhs)
-{
-  int64x64_t tmp = lhs;
-  tmp._v = _cairo_int128_negate (tmp._v);
-  return tmp;
-}
-/**
- * \ingroup highprec
- * Logical not operator
- * \param [in] lhs Left hand argument
- * \return The result of the operator.
- */
-inline int64x64_t operator ! (const int64x64_t & lhs)
-{
-  return (lhs == int64x64_t ()) ? int64x64_t (1, 0) : int64x64_t ();
-}
-
-
 } // namespace ns3
 
 #endif /* INT64X64_CAIRO_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/model/int64x64-double.h ns-3.36/src/core/model/int64x64-double.h
--- ns-3.35/src/core/model/int64x64-double.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/model/int64x64-double.h	2022-04-30 18:23:57.794733300 -0700
@@ -19,6 +19,7 @@
 
 #include "ns3/core-config.h"
 #if !defined(INT64X64_DOUBLE_H) && (defined (INT64X64_USE_DOUBLE) || defined(PYTHON_SCAN))
+/** Using the ns3::int64x64_t based on double values. */
 #define INT64X64_DOUBLE_H
 
 #include <stdint.h>
@@ -78,20 +79,26 @@
   inline int64x64_t ()
     : _v (0)
   {}
-  /**@{*/
   /**
-   * Construct from a floating point value.
+   * \name Construct from a floating point value.
+   */
+  /**
+   * @{
+   * Constructor from a floating point.
    *
-   * \param [in] v Floating value to represent
+   * \param [in] value Floating value to represent.
    */
-  inline int64x64_t (double v)
-    : _v (v)
+  inline int64x64_t (double value)
+    : _v (value)
   {}
-  inline int64x64_t (long double v)
-    : _v (v)
+  inline int64x64_t (long double value)
+    : _v (value)
   {}
   /**@}*/
 
+  /**
+   * \name Construct from an integral type.
+   */
   /**@{*/
   /**
    * Construct from an integral type.
@@ -105,7 +112,7 @@
     : _v (v)
   {}
   inline int64x64_t (long long int v)
-    : _v (static_cast<double> (v))
+    : _v (static_cast<long double> (v))
   {}
   inline int64x64_t (unsigned int v)
     : _v (v)
@@ -114,7 +121,7 @@
     : _v (v)
   {}
   inline int64x64_t (unsigned long long int v)
-    : _v (static_cast<double> (v))
+    : _v (static_cast<long double> (v))
   {}
   /**@}*/
   /**
@@ -154,6 +161,12 @@
     return *this;
   }
 
+  /** Explicit bool conversion. */
+  inline explicit operator bool () const
+  {
+    return (_v != 0);
+  }
+
   /**
    * Get this value as a double.
    *
@@ -281,36 +294,54 @@
    * \name Arithmetic Operators
    * Arithmetic operators for int64x64_t.
    */
-  /**
+  /*
    * @{
    *  Arithmetic operator.
    *  \param [in] lhs Left hand argument
    *  \param [in] rhs Right hand argument
    *  \return The result of the operator.
    */
-  friend bool         operator == (const int64x64_t & lhs, const int64x64_t & rhs);
-
-  friend bool         operator <  (const int64x64_t & lhs, const int64x64_t & rhs);
-  friend bool         operator >  (const int64x64_t & lhs, const int64x64_t & rhs);
-
-  friend int64x64_t & operator += (      int64x64_t & lhs, const int64x64_t & rhs);
-  friend int64x64_t & operator -= (      int64x64_t & lhs, const int64x64_t & rhs);
-  friend int64x64_t & operator *= (      int64x64_t & lhs, const int64x64_t & rhs);
-  friend int64x64_t & operator /= (      int64x64_t & lhs, const int64x64_t & rhs);
+  // *NS_CHECK_STYLE_OFF*
+  friend inline bool operator == (const int64x64_t & lhs, const int64x64_t & rhs) { return lhs._v == rhs._v; };
+  friend inline bool operator <  (const int64x64_t & lhs, const int64x64_t & rhs) { return lhs._v < rhs._v; };
+  friend inline bool operator >  (const int64x64_t & lhs, const int64x64_t & rhs) { return lhs._v > rhs._v; };
+
+  friend inline int64x64_t & operator += ( int64x64_t & lhs, const int64x64_t & rhs)
+    {
+      lhs._v += rhs._v;
+      return lhs;
+    };
+  friend inline int64x64_t & operator -= ( int64x64_t & lhs, const int64x64_t & rhs)
+    {
+      lhs._v -= rhs._v;
+      return lhs;
+    };
+  friend inline int64x64_t & operator *= ( int64x64_t & lhs, const int64x64_t & rhs)
+    {
+      lhs._v *= rhs._v;
+      return lhs;
+    };
+  friend inline int64x64_t & operator /= ( int64x64_t & lhs, const int64x64_t & rhs)
+    {
+      lhs._v /= rhs._v;
+      return lhs;
+    };
+  // *NS_CHECK_STYLE_ON*
   /**@}*/
 
   /**
    * \name Unary Operators
    * Unary operators for int64x64_t.
    */
-  /**
+  /*
    * @{
    *  Unary operator.
    *  \param [in] lhs Left hand argument
    *  \return The result of the operator.
    */
-  friend int64x64_t   operator -  (const int64x64_t & lhs);
-  friend int64x64_t   operator !  (const int64x64_t & lhs);
+  friend inline int64x64_t   operator +  (const int64x64_t & lhs) { return lhs; };
+  friend inline int64x64_t   operator -  (const int64x64_t & lhs) { return int64x64_t (-lhs._v); };
+  friend inline int64x64_t   operator !  (const int64x64_t & lhs) { return int64x64_t (!lhs._v); };
   /**@}*/
 
   long double _v;  //!< The Q64.64 value.
@@ -318,120 +349,6 @@
 };  // class int64x64_t
 
 
-/**
- * \ingroup highprec
- * Equality operator.
- * \param [in] lhs Left hand argument
- * \param [in] rhs Right hand argument
- * \return The result of the operator.
- */
-inline bool operator == (const int64x64_t & lhs, const int64x64_t & rhs)
-{
-  return lhs._v == rhs._v;
-}
-/**
- * \ingroup highprec
- * Less than operator
- * \param [in] lhs Left hand argument
- * \param [in] rhs Right hand argument
- * \return The result of the operator.
- */
-inline bool operator < (const int64x64_t & lhs, const int64x64_t & rhs)
-{
-  return lhs._v < rhs._v;
-}
-/**
- * \ingroup highprec
- * Greater operator
- * \param [in] lhs Left hand argument
- * \param [in] rhs Right hand argument
- * \return The result of the operator.
- */
-inline bool operator > (const int64x64_t & lhs, const int64x64_t & rhs)
-{
-  return lhs._v > rhs._v;
-}
-
-/**
- * \ingroup highprec
- * Compound addition operator
- * \param [in] lhs Left hand argument
- * \param [in] rhs Right hand argument
- * \return The result of the operator.
- */
-inline int64x64_t & operator += (int64x64_t & lhs, const int64x64_t & rhs)
-{
-  lhs._v += rhs._v;
-  return lhs;
-}
-/**
- * \ingroup highprec
- * Compound subtraction operator
- * \param [in] lhs Left hand argument
- * \param [in] rhs Right hand argument
- * \return The result of the operator.
- */
-inline int64x64_t & operator -= (int64x64_t & lhs, const int64x64_t & rhs)
-{
-  lhs._v -= rhs._v;
-  return lhs;
-}
-/**
- * \ingroup highprec
- * Compound multiplication operator
- * \param [in] lhs Left hand argument
- * \param [in] rhs Right hand argument
- * \return The result of the operator.
- */
-inline int64x64_t & operator *= (int64x64_t & lhs, const int64x64_t & rhs)
-{
-  lhs._v *= rhs._v;
-  return lhs;
-}
-/**
- * \ingroup highprec
- * Compound division operator
- * \param [in] lhs Left hand argument
- * \param [in] rhs Right hand argument
- * \return The result of the operator.
- */
-inline int64x64_t & operator /= (int64x64_t & lhs, const int64x64_t & rhs)
-{
-  lhs._v /= rhs._v;
-  return lhs;
-}
-
-/**
- * \ingroup highprec
- * Unary plus operator
- * \param [in] lhs Left hand argument
- * \return The result of the operator.
- */
-inline int64x64_t operator + (const int64x64_t & lhs)
-{
-  return lhs;
-}
-/**
- * \ingroup highprec
- * Unary negation operator (change sign operator)
- * \param [in] lhs Left hand argument
- * \return The result of the operator.
- */
-inline int64x64_t operator - (const int64x64_t & lhs)
-{
-  return int64x64_t (-lhs._v);
-}
-/**
- * \ingroup highprec
- * Logical not operator
- * \param [in] lhs Left hand argument
- * \return The result of the operator.
- */
-inline int64x64_t operator ! (const int64x64_t & lhs)
-{
-  return int64x64_t (!lhs._v);
-}
-
 
 } // namespace ns3
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/model/int64x64.h ns-3.36/src/core/model/int64x64.h
--- ns-3.35/src/core/model/int64x64.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/model/int64x64.h	2022-04-30 18:23:57.794733300 -0700
@@ -24,7 +24,7 @@
 
 // Order is important here, as it determines which implementation
 // will generate doxygen API docs.  This order mimics the
-// selection logic in wscript, so we generate docs from the
+// selection logic in CMakeLists.txt, so we generate docs from the
 // implementation actually chosen by the configuration.
 #if defined (INT64X64_USE_128) && !defined (PYTHON_SCAN)
 #include "int64x64-128.h"
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/model/length.cc ns-3.36/src/core/model/length.cc
--- ns-3.35/src/core/model/length.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/model/length.cc	2022-04-30 18:23:57.794733300 -0700
@@ -18,7 +18,7 @@
  * Author: Mathew Bielejeski <bielejeski1@llnl.gov>
  */
 
-#include "length.h"
+#include "ns3/length.h"
 
 #include "ns3/log.h"
 
@@ -394,11 +394,6 @@
   return Quantity (value, unit);
 }
 
-//silence doxygen warnings about undocumented functions
-/**
- * \ingroup length
- * @{
- */
 bool
 operator== (const Length& left, const Length& right)
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/model/length.h ns-3.36/src/core/model/length.h
--- ns-3.35/src/core/model/length.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/model/length.h	2022-04-30 18:23:57.798733200 -0700
@@ -101,16 +101,16 @@
  * abbreviated name (nm, km, ft, etc.).
  *
  * \code
-//construct lengths from strings
-Length foot ("1foot");
-Length cm ("1cm");
-Length mile ("1 mile");
-Length km ("1 km");
-
-//nautical mile is special because it is two words
-Length nautmile ("1 nautical mile");
-Length nmi ("1 nmi");
-\endcode
+ *   //construct lengths from strings
+ *   Length foot ("1foot");
+ *   Length cm ("1cm");
+ *   Length mile ("1 mile");
+ *   Length km ("1 km");
+ *
+ *   //nautical mile is special because it is two words
+ *   Length nautmile ("1 nautical mile");
+ *   Length nmi ("1 nmi");
+ * \endcode
  *
  * ### Quantity Constructor ###
  *
@@ -120,10 +120,10 @@
  * equivalent value in meters.
  *
  * \code
-//construct a Length representing 2 kilometers
-Length::Quantity q (2, Length::Unit::Kilometer);
-Length km(q);
-\endcode
+ *   //construct a Length representing 2 kilometers
+ *   Length::Quantity q (2, Length::Unit::Kilometer);
+ *   Length km(q);
+ * \endcode
  *
  * ### Value/Unit Constructor
  *
@@ -134,10 +134,10 @@
  * Length::Unit
  *
  * \code
-//These two contructors are equivalent
-Length l1 (1, "cm");
-Length l2 (1, Length::Unit::Centimeter);
-\endcode
+ *   //These two contructors are equivalent
+ *   Length l1 (1, "cm");
+ *   Length l2 (1, Length::Unit::Centimeter);
+ * \endcode
  *
  * ### boost::units
  *
@@ -146,10 +146,11 @@
  * from boost::unit quantities.
  *
  * \code
-//construct length from a boost::units quantitiy
-boost::units::quantity<boost::units::si::length> q = 5 * boost::units::si::meter;
-Length meters (q);
-\endcode
+ *   //construct length from a boost::units quantitiy
+ *   boost::units::quantity<boost::units::si::length> q
+ *       = 5 * boost::units::si::meter;
+ *   Length meters (q);
+ * \endcode
  *
  * ## Arithmetic Operations ##
  *
@@ -160,26 +161,28 @@
  *   Addition is between two Length instances
  *
  * \code
-std::cout << Length(1, Length::Unit::Meter) + Length (2, Length::Unit::Meter);  // output: "3 m"
-\endcode
+ *   std::cout << Length(1, Length::Unit::Meter) + Length (2, Length::Unit::Meter);  
+ *   // output: "3 m"
+ * \endcode
  *
  * ### Subtraction ###
  *
  *   Subtraction is between two Length instances
  *
  * \code
-std::cout << Length(3, Length::Unit::Meter) - Length (2, Length::Unit::Meter);  // output: "1 m"
-\endcode
+ *   std::cout << Length(3, Length::Unit::Meter) - Length (2, Length::Unit::Meter);  
+ *   // output: "1 m"
+ * \endcode
  *
  * ### Multiplication ###
  *
  *   Multiplication is only supported between a Length and a unitless scalar value
  *
  * \code
-std::cout << Length(1, Length::Unit::Meter) * 5;  // output: "5 m"
-
-std::cout << 5 * Length (1, Length::Unit::Meter);  // output: "5 m"
-\endcode
+ *   std::cout << Length(1, Length::Unit::Meter) * 5;  // output: "5 m"
+ *
+ *   std::cout << 5 * Length (1, Length::Unit::Meter);  // output: "5 m"
+ * \endcode
  *
  *
  * ### Division ###
@@ -191,10 +194,11 @@
  *   Division between two Length objects returns a unitless value.
  *
  * \code
-std::cout << Length(5, Length::Unit::Meter) / 5;  // output: "1 m"
-
-std::cout << Length (5, Length::Unit::Meter) / Length (5, Length::Unit::Meter);  // output: 1
-\endcode
+ *   std::cout << Length(5, Length::Unit::Meter) / 5;  // output: "1 m"
+ *
+ *   std::cout << Length (5, Length::Unit::Meter) / Length (5, Length::Unit::Meter);
+ *   // output: 1
+ * \endcode
  *
  * ## Comparison Operations ##
  *
@@ -207,19 +211,19 @@
  * must match when performing the comparison.
  *
  * \code
-//check for exact match
-Length l (5, Length::Unit::Meter);
-
-bool match = (l == l);  // match is true
-
-Length v1 (0.02, Length::Unit::Meter);
-Length v2 (0.022, Length::Unit::Meter);
-
-match = (v1 == v2);  // match is false
-
-double tolerance = 0.01;
-bool mostly_match = v1.IsEqual (v2, tolerance);  // mostly_match is true
-\endcode
+ *   //check for exact match
+ *   Length l (5, Length::Unit::Meter);
+ *
+ *   bool match = (l == l);  // match is true
+ *
+ *   Length v1 (0.02, Length::Unit::Meter);
+ *   Length v2 (0.022, Length::Unit::Meter);
+ *
+ *   match = (v1 == v2);  // match is false
+ *
+ *   double tolerance = 0.01;
+ *   bool mostly_match = v1.IsEqual (v2, tolerance);  // mostly_match is true
+ * \endcode
  *
  * ## Serialization ##
  *
@@ -228,12 +232,13 @@
  * the Length value in a different unit.
  *
  * \code
-Length m(5, Length::Unit::Meter);
-
-//output: 5 m, 0.005 km, 16.4042 ft
-std::cout << m << ", " << m.As(Length::Unit::Kilometer) << ", " << m.As(Length::Unit::Foot);
-\endcode
+ *   Length m(5, Length::Unit::Meter);
  *
+ *   std::cout << m << ", " 
+ *             << m.As(Length::Unit::Kilometer) << ", " 
+ *             << m.As(Length::Unit::Foot);
+ *   //output: 5 m, 0.005 km, 16.4042 ft
+ * \endcode
  */
 class Length
 {
@@ -294,13 +299,17 @@
 
     /**
      * Copy Assignment Operator
+     * \param [in] other The source to copy from.
+     * \returns this.
      */
-    Quantity& operator= (const Quantity&) = default;
+    Quantity& operator= (const Quantity& other) = default;
 
     /**
      * Move Assignment Operator
+     * \param [in] other The source to move from.
+     * \returns this.
      */
-    Quantity& operator= (Quantity&&) = default;
+    Quantity& operator= (Quantity&& other) = default;
 
     /**
      * The value of the quantity
@@ -525,9 +534,9 @@
    * values to still be considered equal
    *
    * Equivalent to:
-   \code
-   IsEqual(other, tolerance) || IsLess(other, tolerance)
-   \endcode
+   * \code
+   *   IsEqual(other, tolerance) || IsLess(other, tolerance)
+   * \endcode
    *
    * \return true if the values are equal or \p other is
    * greater in value
@@ -542,9 +551,9 @@
    * values to still be considered equal
    *
    * Equivalent to:
-   \code
-   !(IsLessOrEqual(other, tolerance))
-   \endcode
+   * \code
+   *   !(IsLessOrEqual(other, tolerance))
+   * \endcode
    *
    * \return true if the values are not equal and \p other is
    * less in value
@@ -559,9 +568,9 @@
    * values to still be considered equal
    *
    * Equivalent to:
-   \code
-   !IsLess(other, tolerance)
-   \endcode
+   * \code
+   *   !IsLess(other, tolerance)
+   * \endcode
    *
    * \return true if the values are equal or \p other is
    * less in value
@@ -574,11 +583,11 @@
    * Swap the current value with the value in \p other.
    *
    * Equivalent to:
-   \code
-   Length temp(*this);
-   *this = other;
-   other = temp;
-   \endcode
+   * \code
+   *   Length temp(*this);
+   *   *this = other;
+   *   other = temp;
+   * \endcode
    *
    * \param other Length object to swap
    */
@@ -588,9 +597,9 @@
    * Current length value
    *
    * Equivalent to:
-   \code
-   As (Length::Unit::Meter).Value ()
-   \endcode
+   * \code
+   *   As (Length::Unit::Meter).Value ()
+   * \endcode
    * \return The current value, in meters
    */
   double GetDouble () const;
@@ -611,13 +620,10 @@
   double m_value;      //!< Length in meters
 };  // class Length
 
-/**
- * Define LengthValue class to support using Length objects as attributes
- */
 ATTRIBUTE_HELPER_HEADER (Length);
 
 /**
- * \relates Length
+ * \ingroup length
  * \brief Return the symbol of the supplied unit
  *
  * The symbol of the unit is the shortened form of the unit name and is usually
@@ -630,7 +636,7 @@
 std::string ToSymbol (Length::Unit unit);
 
 /**
- * \relates Length
+ * \ingroup length
  * \brief Return the name of the supplied unit
  *
  * The value returned by this function is the common name of \p unit. The output
@@ -648,7 +654,7 @@
 std::string ToName (Length::Unit unit, bool plural = false);
 
 /**
- * \relates Length
+ * \ingroup length
  * \brief Find the equivalent Length::Unit for a unit string
  *
  * The string value can be a symbol or name (plural or singular).
@@ -669,14 +675,14 @@
 std::tuple<bool, Length::Unit> FromString (std::string unitString);
 
 /**
- * \relates Length
+ * \ingroup length
  * \brief Write a length value to an output stream.
  *
  * The output of the length is in meters.
  *
  * Equivalent to:
  * \code
- * stream << l.As (Meter);
+ *   stream << l.As (Meter);
  * \endcode
  *
  * \param stream Output stream
@@ -687,15 +693,15 @@
 std::ostream& operator<< (std::ostream& stream, const Length& l);
 
 /**
- * \relates Length
+ * \ingroup length
  * \brief Write a Quantity to an output stream.
  *
  * The data written to the output stream will have the format \<value\> \<symbol\>
  *
  * Equivalent to:
  * \code
-stream << q.Value () << ' ' << ToSymbol (q.Unit());
-\endcode
+ *   stream << q.Value () << ' ' << ToSymbol (q.Unit());
+ * \endcode
  *
  * \param stream Output stream
  * \param q Quantity to write to the output stream
@@ -705,15 +711,15 @@
 std::ostream& operator<< (std::ostream& stream, const Length::Quantity& q);
 
 /**
- * \relates Length
+ * \ingroup length
  * \brief Write a Length::Unit to an output stream.
  *
  * Writes the name of \p unit to the output stream
  *
  * Equivalent to:
  * \code
-stream << ToName (unit);
-\endcode
+ *   stream << ToName (unit);
+ * \endcode
  *
  * \param stream Output stream
  * \param unit Length unit to output
@@ -723,7 +729,7 @@
 std::ostream& operator<< (std::ostream& stream, Length::Unit unit);
 
 /**
- * \relates Length
+ * \ingroup length
  * \brief Read a length value from an input stream.
  *
  * The expected format of the input is \<number\> \<unit\>
@@ -739,163 +745,162 @@
 std::istream& operator>> (std::istream& stream, Length& l);
 
 /**
- * \relates Length
+ * \ingroup length
  * \brief Compare two length objects for equality.
  *
  * Equivalent to:
  * \code
- * left.IsEqual(right, 0);
+ *   left.IsEqual(right, 0);
  * \endcode
  *
  * \param left Left length object
  * \param right Right length object
  *
- * \return true if \p l and \p r have the same value
+ * \return true if \p left and \p right have the same value
  */
 bool operator== (const Length& left, const Length& right);
 
 /**
- * \relates Length
+ * \ingroup length
  * \brief Compare two length objects for inequality.
  *
  * Equivalent to:
  * \code
- * l.IsNotEqual(r, 0);
+ *   left.IsNotEqual(right, 0);
  * \endcode
  *
- * \param l Left length object
- * \param r Right length object
+ * \param left Left length object
+ * \param right Right length object
  *
- * \return true if \p l and \p r do not have the same value
+ * \return true if \p left and \p right do not have the same value
  */
-bool operator!= (const Length& l, const Length& r);
+bool operator!= (const Length& left, const Length& right);
 
 /**
- * \relates Length
- * \brief Check if \p l has a value less than \p r
+ * \ingroup length
+ * \brief Check if \p left has a value less than \p right
  *
  * Equivalent to:
  * \code
- * l.IsLess(r, 0);
+ *   left.IsLess(right, 0);
  * \endcode
  *
- * \param l Left length object
- * \param r Right length object
+ * \param left Left length object
+ * \param right Right length object
  *
- * \return true if \p l is less than \p r
+ * \return true if \p left is less than \p right
  */
-bool operator< (const Length& l, const Length& r);
+bool operator< (const Length& left, const Length& right);
 
 /**
- * \relates Length
- * \brief Check if \p l has a value less than or equal to \p r
+ * \ingroup length
+ * \brief Check if \p left has a value less than or equal to \p right
  *
  * Equivalent to:
  * \code
- * l.IsLessOrEqual(r, 0);
+ *   left.IsLessOrEqual(right, 0);
  * \endcode
  *
- * \param l Left length object
- * \param r Right length object
+ * \param left Left length object
+ * \param right Right length object
  *
- * \return true if \p l is less than or equal to \p r
+ * \return true if \p left is less than or equal to \p right
  */
-bool operator<= (const Length& l, const Length& r);
+bool operator<= (const Length& left, const Length& right);
 
 /**
- * \relates Length
- * \brief Check if \p l has a value greater than \p r
+ * \ingroup length
+ * \brief Check if \p left has a value greater than \p right
  *
  * Equivalent to:
  * \code
- * l.IsGreater(r, 0);
+ *   left.IsGreater(right, 0);
  * \endcode
  *
- * \param l Left length object
- * \param r Right length object
+ * \param left Left length object
+ * \param right Right length object
  *
- * \return true if \p l is greater than \p r
+ * \return true if \p left is greater than \p right
  */
-bool operator> (const Length& l, const Length& r);
+bool operator> (const Length& left, const Length& right);
 
 /**
- * \relates Length
- * \brief Check if \p l has a value greater than or equal to \p r
+ * \ingroup length
+ * \brief Check if \p left has a value greater than or equal to \p right
  *
  * Equivalent to:
  * \code
- * l.IsGreaterOrEqual(r, 0);
+ *   left.IsGreaterOrEqual(right, 0);
  * \endcode
  *
- * \param l Left length object
- * \param r Right length object
+ * \param left Left length object
+ * \param right Right length object
  *
- * \return true if \p l is greater than or equal to \p r
+ * \return true if \p left is greater than or equal to \p right
  */
-bool operator>= (const Length& l, const Length& r);
+bool operator>= (const Length& left, const Length& right);
 
 /**
- * \relates Length
+ * \ingroup length
  * \brief Add two length values together.
  *
- * Adds the values of \p first to \p second and returns a new
+ * Adds the values of \p left to \p right and returns a new
  * Length object containing the result.
  *
- * \param first A Length object
- * \param second A Length object
+ * \param left A Length object
+ * \param right A Length object
  *
  * \return A newly constructed Length object containing the
- * result of first + second
+ * result of `left + right`.
  */
-Length operator+ (const Length& first, const Length& second);
+Length operator+ (const Length& left, const Length& right);
 
 /**
- * \relates Length
+ * \ingroup length
  * \brief Subtract two length values.
  *
- * Subtracts the value of \p second from \p first and returns a
+ * Subtracts the value of \p right from \p left and returns a
  * new Length object containing the result.
  *
- * \param first A Length object
- * \param second A Length object
+ * \param left A Length object
+ * \param right A Length object
  *
  * \return A newly constructed Length object containing the
- * result of first - second
+ * result of `left - right`.
  */
-Length operator- (const Length& first, const Length& second);
+Length operator- (const Length& left, const Length& right);
 
 /**
- * \relates Length
+ * \ingroup length
  * \brief Multiply a length value by a scalar
  *
- * Multiplies the value \p right by \p scalar and returns a new
+ * Multiplies the value \p l by \p scalar and returns a new
  * Length object containing the result.
  *
+ * \param l The Length object
  * \param scalar Multiplication factor
- * \param right Length value
  *
  * \return A newly constructed Length object containing the result
- * of right * scalar.
+ * of `l * scalar`.
  */
-Length operator* (double scalar, const Length& right);
-
+Length operator* (double scalar, const Length& l);
 /**
- * \relates Length
+ * \ingroup length
  * \brief Multiply a length value by a scalar
  *
- * Multiplies the value \p left by \p scalar and returns a new
+ * Multiplies the value \p l by \p scalar and returns a new
  * Length object containing the result.
  *
- * \param left Length value
+ * \param l The Length object
  * \param scalar Multiplication factor
  *
  * \return A newly constructed Length object containing the result
- * of left * scalar.
+ * of `l * scalar`.
  */
-Length operator* (const Length& left, double scalar);
+Length operator* (const Length& l, double scalar);
 
 /**
- * \relates Length
+ * \ingroup length
  * \brief Divide a length value by a scalar
  *
  * Divides the value \p left by \p scalar and returns a new
@@ -908,12 +913,12 @@
  * \param scalar Multiplication factor
  *
  * \return A newly constructed Length object containing the result
- * of left / scalar.
+ * of `left / scalar`.
  */
 Length operator/ (const Length& left, double scalar);
 
 /**
- * \relates Length
+ * \ingroup length
  * \brief Divide a length value by another length value
  *
  * Divides the value \p numerator by the value \p denominator and
@@ -924,17 +929,17 @@
  * \param numerator The top value of the division
  * \param denominator The bottom value of the division
  *
- * \return A scalar value that is the result of numerator / denominator or
- * NaN if \p denominator is 0
+ * \return A scalar value that is the result of `numerator / denominator` or
+ * NaN if \p denominator is 0.
  */
 double operator/ (const Length& numerator, const Length& denominator);
 
 /**
- * \relates Length
+ * \ingroup length
  * \brief Calculate how many times \p numerator can be split into \p denominator
  * sized pieces.
  *
- * If the result of \p numerator / \p denominator is not a whole number, the
+ * If the result of `numerator / denominator` is not a whole number, the
  * result is rounded toward zero to the nearest whole number.
  * The amount remaining  after the division can be retrieved by passing a pointer
  * to a Length in \p remainder.  The remainder will be less than \p denominator
@@ -952,7 +957,7 @@
 int64_t Div (const Length& numerator, const Length& denominator, Length* remainder = nullptr);
 
 /**
- * \relates Length
+ * \ingroup length
  * \brief Calculate the amount remaining after dividing two lengths
  *
  * The returned value will be less than \p denominator and have the same sign as
@@ -969,107 +974,22 @@
 Length Mod (const Length& numerator, const Length& denominator);
 
 /**
+ * Construct a length from a value in the indicated unit.
+ * @{
  * \ingroup length
- * \relates Length
- */
-/**@{*/
-/**
- * Construct a Length from nanometers
- *
- * \param value Value in nanometers
- *
- * \return Length object constructed using Length::Unit::Nanometer
+ * \param value The numerical value.
+ * \returns Length object.
  */
 Length NanoMeters (double value);
-
-/**
- * Construct a Length from micrometers
- *
- * \param value Value in micrometers
- *
- * \return Length object constructed using Length::Unit::Micrometer
- */
 Length MicroMeters (double value);
-
-/**
- * Construct a Length from millimeters
- *
- * \param value Value in millimeters
- *
- * \return Length object constructed using Length::Unit::Millimeter
- */
 Length MilliMeters (double value);
-
-/**
- * Construct a Length from centimeters
- *
- * \param value Value in centimeters
- *
- * \return Length object constructed using Length::Unit::Centimeter
- */
 Length CentiMeters (double value);
-
-/**
- * Construct a Length from meters
- *
- * \param value Value in meters
- *
- * \return Length object constructed using Length::Unit::Meter
- */
 Length Meters (double value);
-
-/**
- * Construct a Length from kilometers
- *
- * \param value Value in kilometers
- *
- * \return Length object constructed using Length::Unit::Kilometer
- */
 Length KiloMeters (double value);
-
-/**
- * Construct a Length from nautical miles
- *
- * \param value Value in nautical miles
- *
- * \return Length object constructed using Length::Unit::NauticalMile
- */
 Length NauticalMiles (double value);
-
-/**
- * Construct a Length from inches
- *
- * \param value Value in inches
- *
- * \return Length object constructed using Length::Unit::Inch
- */
 Length Inches (double value);
-
-/**
- * Construct a Length from feet
- *
- * \param value Value in feet
- *
- * \return Length object constructed using Length::Unit::Foot
- */
 Length Feet (double value);
-
-/**
- * Construct a Length from yards
- *
- * \param value Value in yards
- *
- * \return Length object constructed using Length::Unit::Yard
- */
 Length Yards (double value);
-
-/**
- * Construct a Length from miles
- *
- * \param value Value in miles
- *
- * \return Length object constructed using Length::Unit::Mile
- */
 Length Miles (double value);
 /**@}*/
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/model/log.h ns-3.36/src/core/model/log.h
--- ns-3.35/src/core/model/log.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/model/log.h	2022-04-30 18:23:57.798733200 -0700
@@ -54,11 +54,11 @@
  * Use the environment variable NS_LOG to define a ':'-separated list of
  * logging components to enable. For example (using bash syntax),
  * \code
- *   $ NS_LOG="OlsrAgent" ./waf --run ...
+ *   $ NS_LOG="OlsrAgent" ./ns3 run ...
  * \endcode
  * would enable one component at all log levels.
  * \code
- *   $NS_LOG="OlsrAgent:Ipv4L3Protocol" ./waf --run ...
+ *   $NS_LOG="OlsrAgent:Ipv4L3Protocol" ./ns3 run ...
  * \endcode
  * would enable two components, at all log levels, etc.
  * \c NS_LOG="*" will enable all available log components at all levels.
@@ -247,7 +247,7 @@
  * \param [in] name The log component name.
  */
 #define NS_LOG_STATIC_TEMPLATE_DEFINE(name) \
-  static LogComponent & NS_UNUSED_GLOBAL (g_log) = GetLogComponent (name)
+  [[maybe_unused]] static LogComponent & g_log = GetLogComponent (name)
 
 /**
  * Use \ref NS_LOG to output a message of level LOG_ERROR.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/model/make-event.h ns-3.36/src/core/model/make-event.h
--- ns-3.35/src/core/model/make-event.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/model/make-event.h	2022-04-30 18:23:57.798733200 -0700
@@ -174,9 +174,9 @@
 
 /**
  * \ingroup events
- * \defgroup makeeventfnptr MakeEvent from Function Pointers.
+ * \defgroup makeeventfnptr MakeEvent from Function Pointers and Lambdas.
  *
- * Create EventImpl instances from function pointers which take
+ * Create EventImpl instances from function pointers or lambdas which take
  * varying numbers of arguments.
  *
  * @{
@@ -306,6 +306,17 @@
 template <typename U1, typename U2, typename U3, typename U4, typename U5, typename U6,
           typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
 EventImpl * MakeEvent (void (*f)(U1,U2,U3,U4,U5,U6), T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6);
+
+/**
+ * Make an EventImpl from a lambda.
+ *
+ * \param [in] function The lambda
+ * \returns The constructed EventImpl.
+ */
+template <typename T>
+EventImpl * MakeEvent (T function);
+
+
 /**@}*/
 
 } // namespace ns3
@@ -600,6 +611,7 @@
   class EventFunctionImpl1 : public EventImpl
   {
   public:
+    [[maybe_unused]]
     typedef void (*F)(U1);
 
     EventFunctionImpl1 (F function, T1 a1)
@@ -629,6 +641,7 @@
   class EventFunctionImpl2 : public EventImpl
   {
   public:
+    [[maybe_unused]]
     typedef void (*F)(U1, U2);
 
     EventFunctionImpl2 (F function, T1 a1, T2 a2)
@@ -661,6 +674,7 @@
   class EventFunctionImpl3 : public EventImpl
   {
   public:
+    [[maybe_unused]]
     typedef void (*F)(U1, U2, U3);
 
     EventFunctionImpl3 (F function, T1 a1, T2 a2, T3 a3)
@@ -695,6 +709,7 @@
   class EventFunctionImpl4 : public EventImpl
   {
   public:
+    [[maybe_unused]]
     typedef void (*F)(U1, U2, U3, U4);
 
     EventFunctionImpl4 (F function, T1 a1, T2 a2, T3 a3, T4 a4)
@@ -731,6 +746,7 @@
   class EventFunctionImpl5 : public EventImpl
   {
   public:
+    [[maybe_unused]]
     typedef void (*F)(U1,U2,U3,U4,U5);
 
     EventFunctionImpl5 (F function, T1 a1, T2 a2, T3 a3, T4 a4, T5 a5)
@@ -769,6 +785,7 @@
   class EventFunctionImpl6 : public EventImpl
   {
   public:
+    [[maybe_unused]]
     typedef void (*F)(U1,U2,U3,U4,U5,U6);
 
     EventFunctionImpl6 (F function, T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6)
@@ -801,6 +818,30 @@
   return ev;
 }
 
+template <typename T>
+EventImpl * MakeEvent (T function)
+{
+  class EventImplFunctional : public EventImpl
+  {
+public:
+    EventImplFunctional (T function)
+      : m_function (function)
+    {
+    }
+    virtual ~EventImplFunctional ()
+    {
+    }
+private:
+    virtual void Notify (void)
+    {
+      m_function();
+    }
+    T m_function;
+  } *ev = new EventImplFunctional (function);
+  return ev;
+}
+
+
 } // namespace ns3
 
 #endif /* MAKE_EVENT_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/model/non-copyable.h ns-3.36/src/core/model/non-copyable.h
--- ns-3.35/src/core/model/non-copyable.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/model/non-copyable.h	1969-12-31 16:00:00.000000000 -0800
@@ -1,77 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2015 Lawrence Livermore National Laboratory
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author:  Peter D. Barnes, Jr. <pdbarnes@llnl.gov>
- */
-
-#ifndef NS3_NON_COPYABLE_H
-#define NS3_NON_COPYABLE_H
-
-/**
- * \file
- * \ingroup access
- * ns3::NonCopyable declaration.
- */
-
-/**
- * \ingroup core
- * \defgroup access NonCopyable and Singleton
- * Helpers to make classes non-copyable or singleton.
- */
-
-namespace ns3 {
-
-/**
- * \ingroup access
- * A base class for (non-Singleton) objects which shouldn't be copied.
- *
- * To prevent copying of your `class ExampleNC` just inherit from NonCopyable:
- * \code
- *   class ExampleNC : private NonCopyable { ... };
- * \endcode
- *
- * This class prevents each instance of a derived class from being copied.
- * If you want only a single global instance of the derived class,
- * see Singleton.
- *
- * \internal
- * This is based on `boost::noncopyable`.
- */
-class NonCopyable
-{
-protected:
-  /** Constructor. */
-  NonCopyable ()
-  {}
-  /** Destructor. */
-  ~NonCopyable ()
-  {}
-
-private:
-  /** Copy constructor.  Private, so not copyable. */
-  NonCopyable (const NonCopyable &);
-  /**
-   * Assignment.  Private, so not copyable.
-   * \param [in] other The dummy argument
-   * \return The unmodified copy.
-   */
-  NonCopyable & operator = (const NonCopyable &other);
-};
-
-} // namespace ns3
-
-#endif /* NS3_NON_COPYABLE_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/model/nstime.h ns-3.36/src/core/model/nstime.h
--- ns-3.35/src/core/model/nstime.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/model/nstime.h	2022-04-30 18:23:57.798733200 -0700
@@ -25,7 +25,6 @@
 #include "attribute-helper.h"
 #include "event-id.h"
 #include "int64x64.h"
-#include "unused.h"
 #include <stdint.h>
 #include <limits>
 #include <cmath>
@@ -550,6 +549,7 @@
   /**
    * Round a Time to a specific unit.
    * Rounding is to nearest integer.
+   * \param [in] unit The unit to round to.
    * \return The Time rounded to the specific unit.
    */
   Time RoundTo (enum Unit unit) const
@@ -724,7 +724,8 @@
   friend bool operator <  (const Time & lhs, const Time & rhs);
   friend bool operator >  (const Time & lhs, const Time & rhs);
   friend bool operator <  (const Time & time,   const EventId & event);
-  /**@}*/
+  /**@}*/  // Comparison operators
+
   /**
    * \name Arithmetic operators
    * @{
@@ -733,70 +734,49 @@
   friend Time operator -  (const Time & lhs, const Time & rhs);
   friend Time operator *  (const Time & lhs, const int64x64_t & rhs);
   friend Time operator *  (const int64x64_t & lhs, const Time & rhs);
+  friend int64x64_t operator / (const Time & lhs, const Time & rhs);
+  friend Time operator /  (const Time & lhs, const int64x64_t & rhs);
+  friend Time operator %  (const Time & lhs, const Time & rhs);
+  friend int64_t Div      (const Time & lhs, const Time & rhs);
+  friend Time Rem         (const Time & lhs, const Time & rhs);
 
   template<class T>
   friend typename std::enable_if<std::is_integral<T>::value, Time>::type
   operator * (const Time& lhs, T rhs);
 
-  //this function uses is_arithmetic because it can be used by both
-  //integers and decimal types
-  /**
-   * Limited to \c is_arithmetic matches for the T argument to reduce the chances
-   * of matching some arbitrary object type.
-   */
+  // Reversed arg version (forwards to `rhs * lhs`) 
+  // Accepts both integers and decimal types
   template<class T>
   friend typename std::enable_if<std::is_arithmetic<T>::value, Time>::type
   operator * (T lhs, const Time& rhs);
 
   template<class T>
-  friend typename std::enable_if<std::is_floating_point<T>::value, Time>::type
-  operator * (const Time& lhs, T rhs);
-
-  friend int64x64_t operator / (const Time & lhs, const Time & rhs);
-  friend Time operator /  (const Time & lhs, const int64x64_t & rhs);
-
-  template<class T>
   friend typename std::enable_if<std::is_integral<T>::value, Time>::type
   operator / (const Time& lhs, T rhs);
 
+  friend Time Abs (const Time & time);
+  friend Time Max (const Time & timeA, const Time & timeB);
+  friend Time Min (const Time & timeA, const Time & timeB);
+
+  /**@}*/  // Arithmetic operators
+
+  // Leave undocumented
+  template<class T>
+  friend typename std::enable_if<std::is_floating_point<T>::value, Time>::type
+  operator * (const Time& lhs, T rhs);
   template<class T>
   friend typename std::enable_if<std::is_floating_point<T>::value, Time>::type
   operator / (const Time& lhs, T rhs);
 
-  friend Time operator %  (const Time & lhs, const Time & rhs);
-  friend int64_t Div      (const Time & lhs, const Time & rhs);
-  friend Time Rem         (const Time & lhs, const Time & rhs);
 
-  /**@}*/
   /**
    * \name Compound assignment operators
    * @{
    */
   friend Time & operator += (Time & lhs, const Time & rhs);
   friend Time & operator -= (Time & lhs, const Time & rhs);
-  /**@}*/
+  /**@}*/  // Compound assignment
 
-  /**
-   * Absolute value function for Time
-   * \param [in] time The input value
-   * \returns The absolute value of the input value
-   */
-  friend Time Abs (const Time & time);
-  /**
-   *  Max function for Time.
-   *  \param [in] timeA The first value
-   *  \param [in] timeB The seconds value
-   *  \returns The max of the two input values.
-   */
-  friend Time Max (const Time & timeA, const Time & timeB);
-  /**
-   *  Min function for Time.
-   *  \param [in] timeA The first value
-   *  \param [in] timeB The seconds value
-   *  \returns The min of the two input values.
-   */
-  friend Time Min (const Time & timeA, const Time & timeB);
-  
 
   int64_t m_data;  //!< Virtual time value, in the current unit.
 
@@ -819,7 +799,7 @@
  * This is internal to the Time implementation.
  * \relates Time
  */
-static bool NS_UNUSED_GLOBAL (g_TimeStaticInit) = Time::StaticInit ();
+[[maybe_unused]] static bool g_TimeStaticInit = Time::StaticInit ();
 
 /**
  * Equality operator for Time.
@@ -980,6 +960,14 @@
   return Time (lhs.m_data * rhs);
 }
 
+// Leave undocumented
+template<class T>
+typename std::enable_if<std::is_floating_point<T>::value, Time>::type
+operator * (const Time& lhs, T rhs)
+{
+  return lhs * int64x64_t(rhs);
+}
+
 /**
  * Scale a Time by a numeric value.
  *
@@ -1001,22 +989,6 @@
 }
 
 /**
- * Scale a Time by a floating point value.
- *
- * \tparam T Floating point data type (float, double, etc.)
- *
- * \param [in] lhs The scale value 
- * \param [in] rhs The Time instance to scale 
- * \returns A new Time instance containing the scaled value 
- */
-template<class T>
-typename std::enable_if<std::is_floating_point<T>::value, Time>::type
-operator * (const Time& lhs, T rhs)
-{
-  return lhs * int64x64_t(rhs);
-}
-
-/**
  * Exact division, returning a dimensionless fixed point number.
  *
  * This can be truncated to integer, or converted to double
@@ -1075,15 +1047,7 @@
   return Time(lhs.m_data / rhs);
 }
 
-/**
- * Divide a Time by a floating point value.
- *
- * \tparam T Floating point data type (float, double, etc.)
- *
- * \param [in] lhs The Time instance to scale 
- * \param [in] rhs The scale value
- * \returns A new Time instance containing the scaled value 
- */
+// Leave undocumented
 template<class T>
 typename std::enable_if<std::is_floating_point<T>::value, Time>::type
 operator / (const Time& lhs, T rhs)
@@ -1091,10 +1055,11 @@
   return lhs / int64x64_t(rhs);
 }
 
+
 /**
  * Remainder (modulus) from the quotient of two Times.
  *
- * This is exactly the same function as Rem()
+ * Rem() and operator% are equivalent:
  *
  *     Rem (ta, tb)  ==  ta % tb;
  *
@@ -1102,12 +1067,20 @@
  * \param [in] lhs The first time value
  * \param [in] rhs The second time value
  * \returns The remainder of `lhs / rhs`.
+ * @{
  */
 inline Time
 operator % (const Time & lhs, const Time & rhs)
 {
   return Time (lhs.m_data % rhs.m_data);
 }
+inline Time
+Rem (const Time & lhs, const Time & rhs)
+{
+  return Time (lhs.m_data % rhs.m_data);
+}
+/** @} */
+
 /**
  * Integer quotient from dividing two Times.
  *
@@ -1134,24 +1107,6 @@
   return lhs.m_data / rhs.m_data;
 }
 /**
- * Remainder (modulus) from the quotient of two Times.
- *
- * This is exactly the same function as operator%()
- *
- *     Rem (ta, tb)  ==  ta % tb;
- *
- * \see Div()
- * \param [in] lhs The first time value
- * \param [in] rhs The second time value
- * \returns The result of the remainder of the first input / second input value.
- */
-inline Time
-Rem (const Time & lhs, const Time & rhs)
-{
-  return Time (lhs.m_data % rhs.m_data);
-}
-
-/**
  * Compound addition assignment for Time.
  * \param [in] lhs The first value
  * \param [in] rhs The second value
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/model/object-base.cc ns-3.36/src/core/model/object-base.cc
--- ns-3.35/src/core/model/object-base.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/model/object-base.cc	2022-04-30 18:23:57.798733200 -0700
@@ -26,6 +26,7 @@
 
 #include <cstdlib>  // getenv
 #include <cstring>  // strlen
+#include <unordered_map>
 
 /**
  * \file
@@ -39,6 +40,64 @@
 
 NS_OBJECT_ENSURE_REGISTERED (ObjectBase);
 
+  /** Unnamed namespace */
+namespace {
+
+/**
+ * Get key, value pairs from the "NS_ATTRIBUTE_DEFAULT" environment variable.
+ *
+ * \param [in] key The key to search for.
+ * \return \c true if the key was found, and the associated value.
+ */
+std::pair<bool, std::string>
+EnvDictionary (std::string key)
+{
+  static std::unordered_map<std::string, std::string> dict;
+
+  if (dict.size () == 0)
+    {
+      const char *envVar = getenv ("NS_ATTRIBUTE_DEFAULT");
+      if (envVar != 0 && std::strlen (envVar) > 0)
+        {
+          std::string env = envVar;
+          std::string::size_type cur = 0;
+          std::string::size_type next = 0;
+          while (next != std::string::npos)
+            {
+              next = env.find (";", cur);
+              std::string tmp = std::string (env, cur, next - cur);
+              std::string::size_type equal = tmp.find ("=");
+              if (equal != std::string::npos)
+                {
+                  std::string name = tmp.substr (0, equal);
+                  std::string envval = tmp.substr (equal + 1, tmp.size () - equal - 1);
+                  dict.insert ({name, envval});
+                }
+              cur = next + 1;
+            }
+        }
+      else
+        {
+          // insert an empty key, so we don't do this again
+          dict.insert ({"", ""});
+        }
+    }
+
+  std::string value;
+  bool found {false};
+
+  auto loc = dict.find (key);
+  if (loc != dict.end ())
+    {
+      value = loc->second;
+      found = true;
+    }
+  return {found, value};
+}
+
+} // unnamed namespace
+  
+
 /**
  * Ensure the TypeId for ObjectBase gets fully configured
  * to anchor the inheritance tree properly.
@@ -76,25 +135,49 @@
   NS_LOG_FUNCTION (this);
 }
 
+/**
+ * \def LOG_WHERE_VALUE(where, value)
+ * Log where and what value we find for the attribute
+ * \param where The source of the value
+ * \param value The value found, or "nothing"
+ */
+#ifdef NS3_LOG_ENABLE
+#define LOG_WHERE_VALUE(where, value)                                   \
+  do {                                                                  \
+    std::string valStr {"nothing"};                                     \
+    if (value)                                                          \
+      {                                                                 \
+        valStr = "\"" + value->SerializeToString (info.checker) + "\""; \
+      }                                                                 \
+    NS_LOG_DEBUG (where << " gave " << valStr);                         \
+  } while (false)
+#else
+#define LOG_WHERE_VALUE(where, value)
+#endif
+  
 void
 ObjectBase::ConstructSelf (const AttributeConstructionList &attributes)
 {
   // loop over the inheritance tree back to the Object base class.
   NS_LOG_FUNCTION (this << &attributes);
   TypeId tid = GetInstanceTypeId ();
-  do
+  do    // Do this tid and all parents
     {
       // loop over all attributes in object type
-      NS_LOG_DEBUG ("construct tid=" << tid.GetName () << ", params=" << tid.GetAttributeN ());
+      NS_LOG_DEBUG ("construct tid=" << tid.GetName () << 
+                    ", params=" << tid.GetAttributeN ());
       for (uint32_t i = 0; i < tid.GetAttributeN (); i++)
         {
           struct TypeId::AttributeInformation info = tid.GetAttribute (i);
           NS_LOG_DEBUG ("try to construct \"" << tid.GetName () << "::" <<
                         info.name << "\"");
-          // is this attribute stored in this AttributeConstructionList instance ?
-          Ptr<AttributeValue> value = attributes.Find (info.checker);
+
+          Ptr<const AttributeValue> value = attributes.Find (info.checker);
+          std::string where = "argument";
+
+          LOG_WHERE_VALUE (where, value);
           // See if this attribute should not be set here in the
-          // constructor.
+          // constructor. 
           if (!(info.flags & TypeId::ATTR_CONSTRUCT))
             {
               // Handle this attribute if it should not be
@@ -103,6 +186,7 @@
                 {
                   // Skip this attribute if it's not in the
                   // AttributeConstructionList.
+                  NS_LOG_DEBUG ("skipping, not settable at construction");
                   continue;
                 }
               else
@@ -114,57 +198,44 @@
                 }
             }
 
-          if (value != 0)
+          if (!value)
             {
-              // We have a matching attribute value.
-              if (DoSet (info.accessor, info.checker, *value))
+              auto [found, val] = EnvDictionary (tid.GetAttributeFullName (i));
+              if (found)
                 {
-                  NS_LOG_DEBUG ("construct \"" << tid.GetName () << "::" <<
-                                info.name << "\"");
-                  continue;
+                  value = Create<StringValue> (val);
+                  where = "env var";
+                  LOG_WHERE_VALUE (where, value);
                 }
             }
 
-          // No matching attribute value so we try to look at the env var.
-          const char *envVar = getenv ("NS_ATTRIBUTE_DEFAULT");
-          if (envVar != 0 && std::strlen (envVar) > 0)
+          bool initial = false;
+          if (!value)
             {
-              std::string env = envVar;
-              std::string::size_type cur = 0;
-              std::string::size_type next = 0;
-              while (next != std::string::npos)
-                {
-                  next = env.find (";", cur);
-                  std::string tmp = std::string (env, cur, next - cur);
-                  std::string::size_type equal = tmp.find ("=");
-                  if (equal != std::string::npos)
-                    {
-                      std::string name = tmp.substr (0, equal);
-                      std::string envval = tmp.substr (equal + 1, tmp.size () - equal - 1);
-                      if (name == tid.GetAttributeFullName (i))
-                        {
-                          if (DoSet (info.accessor, info.checker, StringValue (envval)))
-                            {
-                              NS_LOG_DEBUG ("construct \"" << tid.GetName () << "::" <<
-                                            info.name << "\" from env var");
-                              break;
-                            }
-                        }
-                    }
-                  cur = next + 1;
-                }
+              // Set from Tid initialValue, which is guaranteed to exist
+              value = info.initialValue;
+              where = "initial value";
+              initial = true;
+              LOG_WHERE_VALUE (where, value);
             }
 
-          // No matching attribute value so we try to set the default value.
-          DoSet (info.accessor, info.checker, *info.initialValue);
-          NS_LOG_DEBUG ("construct \"" << tid.GetName () << "::" <<
-                        info.name << "\" from initial value.");
-        }
+          if (DoSet (info.accessor, info.checker, *value) || initial)
+            {
+              // Setting from initial value may fail, e.g. setting
+              // ObjectVectorValue from ""
+              // That's ok, so we still report success since construction is complete
+              NS_LOG_DEBUG ("construct \"" << tid.GetName () << "::" <<
+                            info.name << "\" from " << where);
+            }
+          
+        }  // for i attributes
       tid = tid.GetParent ();
     }
   while (tid != ObjectBase::GetTypeId ());
   NotifyConstructionCompleted ();
+
 }
+#undef LOG_WHERE_VALUE
 
 bool
 ObjectBase::DoSet (Ptr<const AttributeAccessor> accessor,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/model/pair.h ns-3.36/src/core/model/pair.h
--- ns-3.35/src/core/model/pair.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/model/pair.h	2022-04-30 18:23:57.798733200 -0700
@@ -31,6 +31,14 @@
 
 namespace ns3 {
 
+/**
+ * Output streamer for a std::pair.
+ * \tparam A \deduced Type of the `pair.first`.
+ * \tparam B \deduced Type of the `pair.second`.
+ * \param [in,out] os The output stream.
+ * \param [in] p The pair.
+ * \returns The output stream.
+ */
 template <class A, class B>
 std::ostream &
 operator << (std::ostream &os, const std::pair<A, B> &p)
@@ -50,9 +58,9 @@
   /** Type of value stored in the PairValue. */
   typedef std::pair<Ptr<A>, Ptr<B> > value_type;
   /** Type of abscissa (first entry of pair). */
-  typedef typename std::result_of<decltype(&A::Get)(A)>::type first_type;
+  typedef typename std::invoke_result_t<decltype(&A::Get), A> first_type;
   /** Type of ordinal (second entry of pair). */
-  typedef typename std::result_of<decltype(&B::Get)(B)>::type second_type;
+  typedef typename std::invoke_result_t<decltype(&B::Get), B> second_type;
   /** Type returned by Get or passed in Set. */
   typedef typename std::pair<first_type, second_type> result_type;
 
@@ -78,10 +86,7 @@
    * \return stored value as std::pair<A, B>.
    */
   result_type Get (void) const;
-  /**
-   * Set the stored value.
-   * \param[in] value std::pair<A, B> to be stored.
-   */
+  /* Documented by print-introspected-doxygen.cc */
   void Set (const result_type &value);
 
   template <typename T>
@@ -94,6 +99,7 @@
 class PairChecker : public AttributeChecker
 {
 public:
+  /** Type holding an AttributeChecker for each member of a pair. */
   typedef std::pair<Ptr<const AttributeChecker>, Ptr<const AttributeChecker> > checker_pair_type;
 
   /**
@@ -170,13 +176,21 @@
 class PairChecker : public ns3::PairChecker
 {
 public:
+  /** Default c'tor. */
   PairChecker (void);
+  /**
+   * Construct from a pair of AttributeChecker's.
+   * \param firstchecker The AttributeChecker for first.
+   * \param secondchecker The AttributeChecker for second.
+   */
   PairChecker (Ptr<const AttributeChecker> firstchecker, Ptr<const AttributeChecker> secondchecker);
   void SetCheckers (Ptr<const AttributeChecker> firstchecker, Ptr<const AttributeChecker> secondchecker);
   typename ns3::PairChecker::checker_pair_type GetCheckers (void) const;
 
 private:
+  /** The first checker. */
   Ptr<const AttributeChecker> m_firstchecker;
+  /** The second checker. */
   Ptr<const AttributeChecker> m_secondchecker;
 };
 
@@ -334,6 +348,14 @@
   return true;
 }
 
+/**
+ * Create an AttributeAccessor for std::pair<>.
+ * \tparam A \explicit The type of pair.first.
+ * \tparam B \explicit The type of pair.second.
+ * \tparam T1 \deduced The argument pair type.
+ * \param [in] a1 The std::pair to be accessed.
+ * \returns The AttributeAccessor.
+ */
 template <typename A, typename B, typename T1>
 Ptr<const AttributeAccessor> MakePairAccessor (T1 a1)
 {
@@ -342,4 +364,4 @@
 
 } // namespace ns3
 
-#endif // PAIR_H
\ No newline at end of file
+#endif // PAIR_H
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/model/random-variable-stream.cc ns-3.36/src/core/model/random-variable-stream.cc
--- ns-3.35/src/core/model/random-variable-stream.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/model/random-variable-stream.cc	2022-04-30 18:23:57.798733200 -0700
@@ -33,7 +33,6 @@
 #include "log.h"
 #include "rng-stream.h"
 #include "rng-seed-manager.h"
-#include "unused.h"
 #include <cmath>
 #include <iostream>
 #include <algorithm>    // upper_bound
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/model/realtime-simulator-impl.cc ns-3.36/src/core/model/realtime-simulator-impl.cc
--- ns-3.35/src/core/model/realtime-simulator-impl.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/model/realtime-simulator-impl.cc	2022-04-30 18:23:57.798733200 -0700
@@ -80,13 +80,8 @@
 
   m_stop = false;
   m_running = false;
-  // uids are allocated from 4.
-  // uid 0 is "invalid" events
-  // uid 1 is "now" events
-  // uid 2 is "destroy" events
-  m_uid = 4;
-  // before ::Run is entered, the m_currentUid will be zero
-  m_currentUid = 0;
+  m_uid = EventId::UID::VALID;
+  m_currentUid = EventId::UID::INVALID;
   m_currentTs = 0;
   m_currentContext = Simulator::NO_CONTEXT;
   m_unscheduledEvents = 0;
@@ -330,6 +325,10 @@
     NS_ASSERT_MSG (m_events->IsEmpty () == false,
                    "RealtimeSimulatorImpl::ProcessOneEvent(): event queue is empty");
     next = m_events->RemoveNext ();
+
+    PreEventHook (EventId (next.impl, next.key.m_ts, 
+                           next.key.m_context, next.key.m_uid));
+
     m_unscheduledEvents--;
     m_eventCount++;
 
@@ -579,21 +578,7 @@
 RealtimeSimulatorImpl::ScheduleNow (EventImpl *impl)
 {
   NS_LOG_FUNCTION (this << impl);
-  Scheduler::Event ev;
-  {
-    CriticalSection cs (m_mutex);
-
-    ev.impl = impl;
-    ev.key.m_ts = m_currentTs;
-    ev.key.m_context = GetContext ();
-    ev.key.m_uid = m_uid;
-    m_uid++;
-    m_unscheduledEvents++;
-    m_events->Insert (ev);
-    m_synchronizer->Signal ();
-  }
-
-  return EventId (impl, ev.key.m_ts, ev.key.m_context, ev.key.m_uid);
+  return Schedule (Time (0), impl);
 }
 
 Time
@@ -683,10 +668,11 @@
 
     //
     // Time doesn't really matter here (especially in realtime mode).  It is
-    // overridden by the uid of 2 which identifies this as an event to be
+    // overridden by the uid of DESTROY which identifies this as an event to be
     // executed at Simulator::Destroy time.
     //
-    id = EventId (Ptr<EventImpl> (impl, false), m_currentTs, 0xffffffff, 2);
+    id = EventId (Ptr<EventImpl> (impl, false), m_currentTs, 0xffffffff, 
+                  EventId::UID::DESTROY);
     m_destroyEvents.push_back (id);
     m_uid++;
   }
@@ -712,7 +698,7 @@
 void
 RealtimeSimulatorImpl::Remove (const EventId &id)
 {
-  if (id.GetUid () == 2)
+  if (id.GetUid () == EventId::UID::DESTROY)
     {
       // destroy events.
       for (DestroyEvents::iterator i = m_destroyEvents.begin ();
@@ -760,7 +746,7 @@
 bool
 RealtimeSimulatorImpl::IsExpired (const EventId &id) const
 {
-  if (id.GetUid () == 2)
+  if (id.GetUid () == EventId::UID::DESTROY)
     {
       if (id.PeekEventImpl () == 0
           || id.PeekEventImpl ()->IsCancelled ())
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/model/realtime-simulator-impl.h ns-3.36/src/core/model/realtime-simulator-impl.h
--- ns-3.35/src/core/model/realtime-simulator-impl.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/model/realtime-simulator-impl.h	2022-04-30 18:23:57.798733200 -0700
@@ -112,16 +112,25 @@
 
   /** \copydoc ScheduleWithContext(uint32_t,const Time&,EventImpl*) */
   void ScheduleRealtimeWithContext (uint32_t context, const Time &delay, EventImpl *event);
-  /** \copydoc Schedule(const Time&,EventImpl*) */
+  /**
+   * Schedule a future event execution (in the same context).
+   *
+   * @param [in] delay Delay until the event expires.
+   * @param [in] event The event to schedule.
+   */
   void ScheduleRealtime (const Time &delay, EventImpl *event);
   /**
-   * \copybrief ScheduleNow(EventImpl*)
+   * Schedule an event to run at the current virtual time.
    *
    * \param [in] context Event context.
    * \param [in] event The event to schedule.
    */
   void ScheduleRealtimeNowWithContext (uint32_t context, EventImpl *event);
-  /** \copydoc ScheduleNow(EventImpl*) */
+  /**
+   * Schedule an event to run at the current virtual time.
+   *
+   * @param [in] event The event to schedule.
+   */
   void ScheduleRealtimeNow (EventImpl *event);
   /**
    * Get the current real time from the synchronizer.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/model/show-progress.h ns-3.36/src/core/model/show-progress.h
--- ns-3.35/src/core/model/show-progress.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/model/show-progress.h	2022-04-30 18:23:57.798733200 -0700
@@ -165,6 +165,11 @@
   /**
    * Show execution progress.
    * This function actually generates output, when directed by CheckProgress().
+   * \param [in] nEvents The actual number of events processed since the last 
+   *             progress output.
+   * \param [in] ratio The current ratio of elapsed wall clock time to the
+   *             target update interval.
+   * \param [in] speed The execution speed relative to wall clock time.
    */
   void GiveFeedback (uint64_t nEvents, int64x64_t ratio, int64x64_t speed);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/model/simple-ref-count.h ns-3.36/src/core/model/simple-ref-count.h
--- ns-3.35/src/core/model/simple-ref-count.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/model/simple-ref-count.h	2022-04-30 18:23:57.798733200 -0700
@@ -25,7 +25,6 @@
 #include "empty.h"
 #include "default-deleter.h"
 #include "assert.h"
-#include "unused.h"
 #include <stdint.h>
 #include <limits>
 
@@ -81,19 +80,17 @@
    * Copy constructor
    * \param [in] o The object to copy into this one.
    */
-  SimpleRefCount (const SimpleRefCount &o)
+  SimpleRefCount (const SimpleRefCount & o [[maybe_unused]])
     : m_count (1)
   {
-    NS_UNUSED (o);
   }
   /**
    * Assignment operator
    * \param [in] o The object to copy
    * \returns The copy of \pname{o}
    */
-  SimpleRefCount &operator = (const SimpleRefCount &o)
+  SimpleRefCount &operator = ([[maybe_unused]] const SimpleRefCount &o)
   {
-    NS_UNUSED (o);
     return *this;
   }
   /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/model/simulation-singleton.h ns-3.36/src/core/model/simulation-singleton.h
--- ns-3.35/src/core/model/simulation-singleton.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/model/simulation-singleton.h	2022-04-30 18:23:57.798733200 -0700
@@ -43,6 +43,11 @@
 class SimulationSingleton
 {
 public:
+  // Delete default constructor, copy constructor and assignment operator to avoid misuse
+  SimulationSingleton<T> () = delete;
+  SimulationSingleton<T> (const SimulationSingleton<T> &) = delete;
+  SimulationSingleton<T> & operator = (const SimulationSingleton<T> &) = delete;
+
   /**
    * Get a pointer to the singleton instance.
    *
@@ -68,27 +73,6 @@
 
   /** Delete the static instance. */
   static void DeleteObject (void);
-
-  /**
-   * \name %Singleton pattern
-   * Private constructor, copy and assignment operator.
-   *
-   *  Note these do not have to be implemented, since they are
-   *  never called.
-   */
-  /**@{*/
-  /** Default constructor */
-  SimulationSingleton<T> (void);
-
-  /** Copy constructor. */
-  SimulationSingleton<T> (const SimulationSingleton<T> &);
-  /**
-   * Assignment.
-   * \returns The Singleton.
-   */
-  SimulationSingleton<T> operator = (const SimulationSingleton<T> &);
-  /**@}*/
-
 };
 
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/model/simulator.cc ns-3.36/src/core/model/simulator.cc
--- ns-3.35/src/core/model/simulator.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/model/simulator.cc	2022-04-30 18:23:57.798733200 -0700
@@ -286,7 +286,7 @@
 
 Time Now (void)
 {
-  return Time (Simulator::Now ());
+  return Simulator::Now ();
 }
 
 Time
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/model/simulator.h ns-3.36/src/core/model/simulator.h
--- ns-3.35/src/core/model/simulator.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/model/simulator.h	2022-04-30 18:23:57.798733200 -0700
@@ -464,7 +464,6 @@
    * @param [in] delay Delay until the event expires.
    * @param [in] context Event context.
    * @param [in] event The event to schedule.
-   * @returns A unique identifier for the newly-scheduled event.
    */
   static void ScheduleWithContext (uint32_t context, const Time &delay, EventImpl *event);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/model/simulator-impl.h ns-3.36/src/core/model/simulator-impl.h
--- ns-3.35/src/core/model/simulator-impl.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/model/simulator-impl.h	2022-04-30 18:23:57.798733200 -0700
@@ -102,6 +102,13 @@
   /** \copydoc Simulator::GetEventCount */
   virtual uint64_t GetEventCount (void) const = 0;
 
+  /** 
+   * Hook called before processing each event.
+   *
+   * \param [in] id The event about to be processed.
+   */
+  virtual void PreEventHook (const EventId & id) {};
+
 };
 
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/model/singleton.h ns-3.36/src/core/model/singleton.h
--- ns-3.35/src/core/model/singleton.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/model/singleton.h	2022-04-30 18:23:57.798733200 -0700
@@ -20,9 +20,6 @@
 #ifndef SINGLETON_H
 #define SINGLETON_H
 
-#include "non-copyable.h"
-
-
 /**
  * \file
  * \ingroup access
@@ -60,9 +57,13 @@
  * finalizer.
  */
 template <typename T>
-class Singleton : private NonCopyable
+class Singleton
 {
 public:
+  // Delete copy constructor and assignment operator to avoid misuse
+  Singleton<T> (const Singleton<T> &) = delete;
+  Singleton<T> & operator = (const Singleton<T> &) = delete;
+
   /**
    * Get a pointer to the singleton instance.
    *
@@ -73,6 +74,16 @@
    */
   static T * Get (void);
 
+protected:
+  /** Constructor. */
+  Singleton<T> ()
+  {
+  }
+
+  /** Destructor. */
+  virtual ~Singleton<T> ()
+  {
+  }
 };
 
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/model/synchronizer.h ns-3.36/src/core/model/synchronizer.h
--- ns-3.35/src/core/model/synchronizer.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/model/synchronizer.h	2022-04-30 18:23:57.798733200 -0700
@@ -165,9 +165,11 @@
    * waiting in the Synchronize method that an event has happened which demands
    * a reevaluation of the wait time.
    *
+   * @param [in] cond The new value for the condition variable.
+   *
    * @see Signal
    */
-  void SetCondition (bool);
+  void SetCondition (bool cond);
 
   /**
    * @brief Ask the synchronizer to remember what time it is.
@@ -282,9 +284,10 @@
    * waiting in the Synchronize method that an event has happened which
    * demands a reevaluation of the wait time.
    *
+   * @param [in] cond The new value for the condition variable.
    * @see SetCondition
    */
-  virtual void DoSetCondition (bool) = 0;
+  virtual void DoSetCondition (bool cond) = 0;
 
   /**
    * @brief Get the drift between the real time clock used to synchronize
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/model/system-condition.h ns-3.36/src/core/model/system-condition.h
--- ns-3.35/src/core/model/system-condition.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/model/system-condition.h	2022-04-30 18:23:57.798733200 -0700
@@ -67,6 +67,8 @@
  * context and put the processor to sleep until an event happens somewhere
  * else that
  */
+// The last two paragraphs are truncated in the earliest commit of this code:
+// 2008-07-15	Craig Dowell	add system threads and synchronization primitives
 class SystemCondition
 {
 public:
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/model/system-thread.h ns-3.36/src/core/model/system-thread.h
--- ns-3.35/src/core/model/system-thread.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/model/system-thread.h	2022-04-30 18:23:57.798733200 -0700
@@ -163,6 +163,7 @@
    *
    * @param [in] arg This SystemThread instance to communicate to the newly
    *                 launched thread.
+   * @return a null pointer (for compatibility)
    */
   static void * DoRun (void *arg);
 
@@ -174,5 +175,3 @@
 } // namespace ns3
 
 #endif /* SYSTEM_THREAD_H */
-
-
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/model/test.cc ns-3.36/src/core/model/test.cc
--- ns-3.35/src/core/model/test.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/model/test.cc	2022-04-30 18:23:57.798733200 -0700
@@ -325,7 +325,7 @@
       /*
         To count the bad test names, use NS_LOG_UNCOND instead
         of NS_FATAL_ERROR, and the command
-        $ ./waf --run "test-runner --list" 2>&1 | grep "^Invalid" | wc
+        $ ./ns3 run "test-runner --list" 2>&1 | grep "^Invalid" | wc
       */
       NS_LOG_UNCOND ("Invalid test name: cannot contain any of '"
                      << badchars << "': " << testCase->m_name);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/model/test.h ns-3.36/src/core/model/test.h
--- ns-3.35/src/core/model/test.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/model/test.h	2022-04-30 18:23:57.798733200 -0700
@@ -28,7 +28,6 @@
 #include <limits>
 #include <stdint.h>
 
-#include "non-copyable.h"
 #include "system-wall-clock-ms.h"
 
 /**
@@ -111,30 +110,6 @@
 // ===========================================================================
 
 /**
- * \ingroup testingimpl
- * \brief Test that an actual and expected (limit) value are equal and report
- * and abort if not.
- */
-#define NS_TEST_ASSERT_MSG_EQ_INTERNAL(actual, limit, msg, file, line)  \
-  do {                                                                  \
-      if (!((actual) == (limit)))                                       \
-        {                                                               \
-          ASSERT_ON_FAILURE;                                            \
-          std::ostringstream msgStream;                                 \
-          msgStream << msg;                                             \
-          std::ostringstream actualStream;                              \
-          actualStream << actual;                                       \
-          std::ostringstream limitStream;                               \
-          limitStream << limit;                                         \
-          ReportTestFailure (std::string (#actual) + " (actual) == " +  \
-                             std::string (#limit) + " (limit)",         \
-                             actualStream.str (), limitStream.str (),   \
-                             msgStream.str (), file, line);             \
-          CONTINUE_ON_FAILURE;                                          \
-        }                                                               \
-    } while (false)
-
-/**
  * \ingroup testing
  *
  * \brief Test that an actual and expected (limit) value are equal and
@@ -163,15 +138,7 @@
  * numbers (float or double) as it is unlikely to do what you expect.
  * Use NS_TEST_ASSERT_MSG_EQ_TOL instead.
  */
-#define NS_TEST_ASSERT_MSG_EQ(actual, limit, msg) \
-  NS_TEST_ASSERT_MSG_EQ_INTERNAL (actual, limit, msg, __FILE__, __LINE__)
-
-/**
- * \ingroup testingimpl
- * \brief Test that an actual and expected (limit) value are equal and report
- * and abort if not.
- */
-#define NS_TEST_ASSERT_MSG_EQ_RETURNS_BOOL_INTERNAL(actual, limit, msg, file, line) \
+#define NS_TEST_ASSERT_MSG_EQ(actual, limit, msg)                       \
   do {                                                                  \
       if (!((actual) == (limit)))                                       \
         {                                                               \
@@ -185,8 +152,8 @@
           ReportTestFailure (std::string (#actual) + " (actual) == " +  \
                              std::string (#limit) + " (limit)",         \
                              actualStream.str (), limitStream.str (),   \
-                             msgStream.str (), file, line);             \
-          CONTINUE_ON_FAILURE_RETURNS_BOOL;                             \
+                             msgStream.str (), __FILE__, __LINE__);     \
+          CONTINUE_ON_FAILURE;                                          \
         }                                                               \
     } while (false)
 
@@ -222,18 +189,7 @@
  * This function returns a Boolean value.
  *
  */
-#define NS_TEST_ASSERT_MSG_EQ_RETURNS_BOOL(actual, limit, msg) \
-  NS_TEST_ASSERT_MSG_EQ_RETURNS_BOOL_INTERNAL (actual, limit, msg, __FILE__, __LINE__)
-
-/**
- * \ingroup testingimpl
- * \brief Test that an actual and expected (limit) value are equal and
- * report if not.
- *
- * Required to avoid use of return statement which allows use in
- * methods (esp. callbacks) returning void.
- */
-#define NS_TEST_EXPECT_MSG_EQ_INTERNAL(actual, limit, msg, file, line)  \
+#define NS_TEST_ASSERT_MSG_EQ_RETURNS_BOOL(actual, limit, msg)          \
   do {                                                                  \
       if (!((actual) == (limit)))                                       \
         {                                                               \
@@ -247,7 +203,8 @@
           ReportTestFailure (std::string (#actual) + " (actual) == " +  \
                              std::string (#limit) + " (limit)",         \
                              actualStream.str (), limitStream.str (),   \
-                             msgStream.str (), file, line);             \
+                             msgStream.str (), __FILE__, __LINE__);     \
+          CONTINUE_ON_FAILURE_RETURNS_BOOL;                             \
         }                                                               \
     } while (false)
 
@@ -280,22 +237,9 @@
  * numbers (float or double) as it is unlikely to do what you expect.
  * Use NS_TEST_EXPECT_MSG_EQ_TOL instead.
  */
-#define NS_TEST_EXPECT_MSG_EQ(actual, limit, msg) \
-  NS_TEST_EXPECT_MSG_EQ_INTERNAL (actual, limit, msg, __FILE__, __LINE__)
-
-// ===========================================================================
-// Test for equality with a provided tolerance (use for floating point
-// comparisons -- both float and double)
-// ===========================================================================
-
-/**
- * \ingroup testingimpl
- * \brief Test that actual and expected (limit) values are equal to
- * plus or minus some tolerance and report and abort if not.
- */
-#define NS_TEST_ASSERT_MSG_EQ_TOL_INTERNAL(actual, limit, tol, msg, file, line) \
+#define NS_TEST_EXPECT_MSG_EQ(actual, limit, msg)                       \
   do {                                                                  \
-      if ((actual) > (limit) + (tol) || (actual) < (limit) - (tol))     \
+      if (!((actual) == (limit)))                                       \
         {                                                               \
           ASSERT_ON_FAILURE;                                            \
           std::ostringstream msgStream;                                 \
@@ -303,19 +247,20 @@
           std::ostringstream actualStream;                              \
           actualStream << actual;                                       \
           std::ostringstream limitStream;                               \
-          limitStream << limit << " +- " << tol;                        \
-          std::ostringstream condStream;                                \
-          condStream << #actual << " (actual) < " << #limit             \
-                     << " (limit) + " << #tol << " (tol) && "           \
-                     << #actual << " (actual) > " << #limit             \
-                     << " (limit) - " << #tol << " (tol)";              \
-          ReportTestFailure (condStream.str (), actualStream.str (),    \
-                             limitStream.str (), msgStream.str (),      \
-                             file, line);                               \
-          CONTINUE_ON_FAILURE;                                          \
+          limitStream << limit;                                         \
+          ReportTestFailure (std::string (#actual) + " (actual) == " +  \
+                             std::string (#limit) + " (limit)",         \
+                             actualStream.str (), limitStream.str (),   \
+                             msgStream.str (), __FILE__, __LINE__);     \
         }                                                               \
     } while (false)
 
+
+// ===========================================================================
+// Test for equality with a provided tolerance (use for floating point
+// comparisons -- both float and double)
+// ===========================================================================
+
 /**
  * \ingroup testing
  *
@@ -375,15 +320,7 @@
  * \param [in] tol Tolerance of the test.
  * \param [in] msg Message that is output if the test does not pass.
  */
-#define NS_TEST_ASSERT_MSG_EQ_TOL(actual, limit, tol, msg)                 \
-  NS_TEST_ASSERT_MSG_EQ_TOL_INTERNAL (actual, limit, tol, msg, __FILE__, __LINE__)
-
-/**
- * \ingroup testingimpl
- * \brief Test that actual and expected (limit) values are equal to
- * plus or minus some tolerance and report and abort if not.
- */
-#define NS_TEST_ASSERT_MSG_EQ_TOL_RETURNS_BOOL_INTERNAL(actual, limit, tol, msg, file, line) \
+#define NS_TEST_ASSERT_MSG_EQ_TOL(actual, limit, tol, msg)              \
   do {                                                                  \
       if ((actual) > (limit) + (tol) || (actual) < (limit) - (tol))     \
         {                                                               \
@@ -401,9 +338,9 @@
                      << " (limit) - " << #tol << " (tol)";              \
           ReportTestFailure (condStream.str (), actualStream.str (),    \
                              limitStream.str (), msgStream.str (),      \
-                             file, line);                               \
-          CONTINUE_ON_FAILURE_RETURNS_BOOL;                             \
-        }                                `                               \
+                             __FILE__, __LINE__);                       \
+          CONTINUE_ON_FAILURE;                                          \
+        }                                                               \
     } while (false)
 
 /**
@@ -468,18 +405,7 @@
  * This function returns a Boolean value.
  *
  */
-#define NS_TEST_ASSERT_MSG_EQ_TOL_RETURNS_BOOL(actual, limit, tol, msg)  \
-  NS_TEST_ASSERT_MSG_EQ_TOL_RETURNS_BOOL_INTERNAL (actual, limit, tol, msg, __FILE__, __LINE__)
-
-/**
- * \ingroup testingimpl
- * \brief Test that actual and expected (limit) values are equal to
- * plus or minus some tolerance and report if not.
- *
- * Required to avoid use of return statement which allows use in
- * methods (esp. callbacks) returning void.
- */
-#define NS_TEST_EXPECT_MSG_EQ_TOL_INTERNAL(actual, limit, tol, msg, file, line) \
+#define NS_TEST_ASSERT_MSG_EQ_TOL_RETURNS_BOOL(actual, limit, tol, msg) \
   do {                                                                  \
       if ((actual) > (limit) + (tol) || (actual) < (limit) - (tol))     \
         {                                                               \
@@ -497,10 +423,12 @@
                      << " (limit) - " << #tol << " (tol)";              \
           ReportTestFailure (condStream.str (), actualStream.str (),    \
                              limitStream.str (), msgStream.str (),      \
-                             file, line);                               \
+                             __FILE__, __LINE__);                       \
+          CONTINUE_ON_FAILURE_RETURNS_BOOL;                             \
         }                                                               \
     } while (false)
 
+
 /**
  * \ingroup testing
  *
@@ -560,21 +488,9 @@
  * \param [in] tol Tolerance of the test.
  * \param [in] msg Message that is output if the test does not pass.
  */
-#define NS_TEST_EXPECT_MSG_EQ_TOL(actual, limit, tol, msg) \
-  NS_TEST_EXPECT_MSG_EQ_TOL_INTERNAL (actual, limit, tol, msg, __FILE__, __LINE__)
-
-// ===========================================================================
-// Test for inequality
-// ===========================================================================
-
-/**
- * \ingroup testingimpl
- * \brief Test that an actual and expected (limit) value are not equal and
- * report and abort if not.
- */
-#define NS_TEST_ASSERT_MSG_NE_INTERNAL(actual, limit, msg, file, line)  \
+#define NS_TEST_EXPECT_MSG_EQ_TOL(actual, limit, tol, msg)              \
   do {                                                                  \
-      if (!((actual) != (limit)))                                       \
+      if ((actual) > (limit) + (tol) || (actual) < (limit) - (tol))     \
         {                                                               \
           ASSERT_ON_FAILURE;                                            \
           std::ostringstream msgStream;                                 \
@@ -582,15 +498,22 @@
           std::ostringstream actualStream;                              \
           actualStream << actual;                                       \
           std::ostringstream limitStream;                               \
-          limitStream << limit;                                         \
-          ReportTestFailure (std::string (#actual) + " (actual) != " +  \
-                             std::string (#limit) + " (limit)",         \
-                             actualStream.str (), limitStream.str (),   \
-                             msgStream.str (), file, line);             \
-          CONTINUE_ON_FAILURE;                                          \
+          limitStream << limit << " +- " << tol;                        \
+          std::ostringstream condStream;                                \
+          condStream << #actual << " (actual) < " << #limit             \
+                     << " (limit) + " << #tol << " (tol) && "           \
+                     << #actual << " (actual) > " << #limit             \
+                     << " (limit) - " << #tol << " (tol)";              \
+          ReportTestFailure (condStream.str (), actualStream.str (),    \
+                             limitStream.str (), msgStream.str (),      \
+                             __FILE__, __LINE__);                       \
         }                                                               \
     } while (false)
 
+// ===========================================================================
+// Test for inequality
+// ===========================================================================
+
 /**
  * \ingroup testing
  *
@@ -615,19 +538,8 @@
  * \param [in] actual Expression for the actual value found during the test.
  * \param [in] limit Expression for the value that actual is tested against.
  * \param [in] msg Message that is output if the test does not pass.
- *
- * \warning Do not use this macro if you are comparing floating point
- * numbers (float or double).  Use NS_TEST_ASSERT_MSG_FLNE instead.
  */
-#define NS_TEST_ASSERT_MSG_NE(actual, limit, msg) \
-  NS_TEST_ASSERT_MSG_NE_INTERNAL (actual, limit, msg, __FILE__, __LINE__)
-
-/**
- * \ingroup testingimpl
- * \brief Test that an actual and expected (limit) value are not equal and
- * report and abort if not.
- */
-#define NS_TEST_ASSERT_MSG_NE_RETURNS_BOOL_INTERNAL(actual, limit, msg, file, line) \
+#define NS_TEST_ASSERT_MSG_NE(actual, limit, msg)                       \
   do {                                                                  \
       if (!((actual) != (limit)))                                       \
         {                                                               \
@@ -641,8 +553,8 @@
           ReportTestFailure (std::string (#actual) + " (actual) != " +  \
                              std::string (#limit) + " (limit)",         \
                              actualStream.str (), limitStream.str (),   \
-                             msgStream.str (), file, line);             \
-          CONTINUE_ON_FAILURE_RETURNS_BOOL;                             \
+                             msgStream.str (), __FILE__, __LINE__);     \
+          CONTINUE_ON_FAILURE;                                          \
         }                                                               \
     } while (false)
 
@@ -671,24 +583,10 @@
  * \param [in] limit Expression for the expected value of the test.
  * \param [in] msg Message that is output if the test does not pass.
  *
- * \warning Do not use this macro if you are comparing floating point
- * numbers (float or double).  Use NS_TEST_ASSERT_MSG_FLNE instead.
- *
  * This function returns a Boolean value.
  *
  */
-#define NS_TEST_ASSERT_MSG_NE_RETURNS_BOOL(actual, limit, msg) \
-  NS_TEST_ASSERT_MSG_NE_RETURNS_BOOL_INTERNAL (actual, limit, msg, __FILE__, __LINE__)
-
-/**
- * \ingroup testingimpl
- * \brief Test that an actual and expected (limit) value are not equal and
- * report if not.
- *
- * Required to avoid use of return statement which allows use in methods
- * (callbacks) returning void.
- */
-#define NS_TEST_EXPECT_MSG_NE_INTERNAL(actual, limit, msg, file, line)  \
+#define NS_TEST_ASSERT_MSG_NE_RETURNS_BOOL(actual, limit, msg)          \
   do {                                                                  \
       if (!((actual) != (limit)))                                       \
         {                                                               \
@@ -702,7 +600,8 @@
           ReportTestFailure (std::string (#actual) + " (actual) != " +  \
                              std::string (#limit) + " (limit)",         \
                              actualStream.str (), limitStream.str (),   \
-                             msgStream.str (), file, line);             \
+                             msgStream.str (), __FILE__, __LINE__);     \
+          CONTINUE_ON_FAILURE_RETURNS_BOOL;                             \
         }                                                               \
     } while (false)
 
@@ -735,20 +634,8 @@
  * numbers (float or double).  Use NS_TEST_EXPECT_MSG_FLNE instead.
  */
 #define NS_TEST_EXPECT_MSG_NE(actual, limit, msg) \
-  NS_TEST_EXPECT_MSG_NE_INTERNAL (actual, limit, msg, __FILE__, __LINE__)
-
-// ===========================================================================
-// Test for less than relation
-// ===========================================================================
-
-/**
- * \ingroup testingimpl
- * \brief Test that an actual value is less than a limit and report and abort
- * if not.
- */
-#define NS_TEST_ASSERT_MSG_LT_INTERNAL(actual, limit, msg, file, line)  \
   do {                                                                  \
-      if (!((actual) < (limit)))                                        \
+      if (!((actual) != (limit)))                                       \
         {                                                               \
           ASSERT_ON_FAILURE;                                            \
           std::ostringstream msgStream;                                 \
@@ -757,37 +644,16 @@
           actualStream << actual;                                       \
           std::ostringstream limitStream;                               \
           limitStream << limit;                                         \
-          ReportTestFailure (std::string (#actual) + " (actual) < " +   \
+          ReportTestFailure (std::string (#actual) + " (actual) != " +  \
                              std::string (#limit) + " (limit)",         \
                              actualStream.str (), limitStream.str (),   \
-                             msgStream.str (), file, line);             \
-          CONTINUE_ON_FAILURE;                                          \
+                             msgStream.str (), __FILE__, __LINE__);     \
         }                                                               \
     } while (false)
 
-/**
- * \ingroup testingimpl
- * \brief Test that an actual value is less than or equal to a limit and report
- * and abort if not.
- */
-#define NS_TEST_ASSERT_MSG_LT_OR_EQ_INTERNAL(actual, limit, msg, file, line)  \
-  do {                                                                  \
-      if (!((actual) <= (limit)))                                       \
-        {                                                               \
-          ASSERT_ON_FAILURE;                                            \
-          std::ostringstream msgStream;                                 \
-          msgStream << msg;                                             \
-          std::ostringstream actualStream;                              \
-          actualStream << actual;                                       \
-          std::ostringstream limitStream;                               \
-          limitStream << limit;                                         \
-          ReportTestFailure (std::string (#actual) + " (actual) < " +   \
-                             std::string (#limit) + " (limit)",         \
-                             actualStream.str (), limitStream.str (),   \
-                             msgStream.str (), file, line);             \
-          CONTINUE_ON_FAILURE;                                          \
-        }                                                               \
-    } while (false)
+// ===========================================================================
+// Test for less than relation
+// ===========================================================================
 
 /**
  * \ingroup testing
@@ -806,38 +672,7 @@
  * \param [in] limit Expression for the limit value of the test.
  * \param [in] msg Message that is output if the test does not pass.
  */
-#define NS_TEST_ASSERT_MSG_LT(actual, limit, msg) \
-  NS_TEST_ASSERT_MSG_LT_INTERNAL (actual, limit, msg, __FILE__, __LINE__)
-
-/**
- * \ingroup testing
- *
- * \brief Test that an actual value is less than or equal to a limit
- * and report and abort if not.
- *
- * Check to see if the actual value found in a test case is less than
- * or equal to the limit value.  If the actual value is lesser or
- * equal nothing happens, but if the check fails, an error is reported
- * in a consistent way and the execution of the current test case is
- * aborted.
- *
- * The message is interpreted as a stream.
- *
- * \param [in] actual Expression for the actual value found during the test.
- * \param [in] limit Expression for the limit value of the test.
- * \param [in] msg Message that is output if the test does not pass.
- */
-#define NS_TEST_ASSERT_MSG_LT_OR_EQ(actual, limit, msg) \
-  NS_TEST_ASSERT_MSG_LT_OR_EQ_INTERNAL (actual, limit, msg, __FILE__, __LINE__)
-
-/**
- * \ingroup testingimpl
- * \brief Test that an actual value is less than a limit and report if not.
- *
- * Required to avoid use of return statement which allows use in methods
- * (callbacks) returning void.
- */
-#define NS_TEST_EXPECT_MSG_LT_INTERNAL(actual, limit, msg, file, line)  \
+#define NS_TEST_ASSERT_MSG_LT(actual, limit, msg)                       \
   do {                                                                  \
       if (!((actual) < (limit)))                                        \
         {                                                               \
@@ -851,19 +686,30 @@
           ReportTestFailure (std::string (#actual) + " (actual) < " +   \
                              std::string (#limit) + " (limit)",         \
                              actualStream.str (), limitStream.str (),   \
-                             msgStream.str (), file, line);             \
+                             msgStream.str (), __FILE__, __LINE__);     \
+          CONTINUE_ON_FAILURE;                                          \
         }                                                               \
     } while (false)
 
 /**
- * \ingroup testingimpl
+ * \ingroup testing
+ *
  * \brief Test that an actual value is less than or equal to a limit
- * and report if not.
+ * and report and abort if not.
  *
- * Required to avoid use of return statement which allows use in
- * methods (callbacks) returning void.
+ * Check to see if the actual value found in a test case is less than
+ * or equal to the limit value.  If the actual value is lesser or
+ * equal nothing happens, but if the check fails, an error is reported
+ * in a consistent way and the execution of the current test case is
+ * aborted.
+ *
+ * The message is interpreted as a stream.
+ *
+ * \param [in] actual Expression for the actual value found during the test.
+ * \param [in] limit Expression for the limit value of the test.
+ * \param [in] msg Message that is output if the test does not pass.
  */
-#define NS_TEST_EXPECT_MSG_LT_OR_EQ_INTERNAL(actual, limit, msg, file, line)  \
+#define NS_TEST_ASSERT_MSG_LT_OR_EQ(actual, limit, msg)                 \
   do {                                                                  \
       if (!((actual) <= (limit)))                                       \
         {                                                               \
@@ -877,7 +723,8 @@
           ReportTestFailure (std::string (#actual) + " (actual) < " +   \
                              std::string (#limit) + " (limit)",         \
                              actualStream.str (), limitStream.str (),   \
-                             msgStream.str (), file, line);             \
+                             msgStream.str (), __FILE__, __LINE__);     \
+          CONTINUE_ON_FAILURE;                                          \
         }                                                               \
     } while (false)
 
@@ -898,8 +745,24 @@
  * \param [in] limit Expression for the limit value of the test.
  * \param [in] msg Message that is output if the test does not pass.
  */
-#define NS_TEST_EXPECT_MSG_LT(actual, limit, msg) \
-  NS_TEST_EXPECT_MSG_LT_INTERNAL (actual, limit, msg, __FILE__, __LINE__)
+#define NS_TEST_EXPECT_MSG_LT(actual, limit, msg)                       \
+  do {                                                                  \
+      if (!((actual) < (limit)))                                        \
+        {                                                               \
+          ASSERT_ON_FAILURE;                                            \
+          std::ostringstream msgStream;                                 \
+          msgStream << msg;                                             \
+          std::ostringstream actualStream;                              \
+          actualStream << actual;                                       \
+          std::ostringstream limitStream;                               \
+          limitStream << limit;                                         \
+          ReportTestFailure (std::string (#actual) + " (actual) < " +   \
+                             std::string (#limit) + " (limit)",         \
+                             actualStream.str (), limitStream.str (),   \
+                             msgStream.str (), __FILE__, __LINE__);     \
+        }                                                               \
+    } while (false)
+
 
 /**
  * \ingroup testing
@@ -920,20 +783,8 @@
  * \param [in] msg Message that is output if the test does not pass.
  */
 #define NS_TEST_EXPECT_MSG_LT_OR_EQ(actual, limit, msg) \
-  NS_TEST_EXPECT_MSG_LT_OR_EQ_INTERNAL (actual, limit, msg, __FILE__, __LINE__)
-
-// ===========================================================================
-// Test for greater than relation
-// ===========================================================================
-
-/**
- * \ingroup testingimpl
- * \brief Test that an actual value is greater than a limit and report and abort
- * if not.
- */
-#define NS_TEST_ASSERT_MSG_GT_INTERNAL(actual, limit, msg, file, line)  \
   do {                                                                  \
-      if (!((actual) > (limit)))                                        \
+      if (!((actual) <= (limit)))                                       \
         {                                                               \
           ASSERT_ON_FAILURE;                                            \
           std::ostringstream msgStream;                                 \
@@ -942,37 +793,16 @@
           actualStream << actual;                                       \
           std::ostringstream limitStream;                               \
           limitStream << limit;                                         \
-          ReportTestFailure (std::string (#actual) + " (actual) > " +   \
+          ReportTestFailure (std::string (#actual) + " (actual) < " +   \
                              std::string (#limit) + " (limit)",         \
                              actualStream.str (), limitStream.str (),   \
-                             msgStream.str (), file, line);             \
-          CONTINUE_ON_FAILURE;                                          \
+                             msgStream.str (), __FILE__, __LINE__);     \
         }                                                               \
     } while (false)
 
-/**
- * \ingroup testingimpl
- * \brief Test that an actual value is greater than or equal to a
- * limit and report and abort if not.
- */
-#define NS_TEST_ASSERT_MSG_GT_OR_EQ_INTERNAL(actual, limit, msg, file, line)  \
-  do {                                                                  \
-      if (!((actual) >= (limit)))                                       \
-        {                                                               \
-          ASSERT_ON_FAILURE;                                            \
-          std::ostringstream msgStream;                                 \
-          msgStream << msg;                                             \
-          std::ostringstream actualStream;                              \
-          actualStream << actual;                                       \
-          std::ostringstream limitStream;                               \
-          limitStream << limit;                                         \
-          ReportTestFailure (std::string (#actual) + " (actual) > " +   \
-                             std::string (#limit) + " (limit)",         \
-                             actualStream.str (), limitStream.str (),   \
-                             msgStream.str (), file, line);             \
-          CONTINUE_ON_FAILURE;                                          \
-        }                                                               \
-    } while (false)
+// ===========================================================================
+// Test for greater than relation
+// ===========================================================================
 
 /**
  * \ingroup testing
@@ -992,38 +822,7 @@
  * \param [in] limit Expression for the limit value of the test.
  * \param [in] msg Message that is output if the test does not pass.
  */
-#define NS_TEST_ASSERT_MSG_GT(actual, limit, msg) \
-  NS_TEST_ASSERT_MSG_GT_INTERNAL (actual, limit, msg, __FILE__, __LINE__)
-
-/**
- * \ingroup testing
- *
- * \brief Test that an actual value is greater than or equal to a
- * limit and report and abort if not.
- *
- * Check to see if the actual value found in a test case is greater
- * than or equal to the limit value.  If the actual value is greater
- * nothing happens, but if the check fails, an error is reported in a
- * consistent way and the execution of the current test case is
- * aborted.
- *
- * The message is interpreted as a stream.
- *
- * \param [in] actual Expression for the actual value found during the test.
- * \param [in] limit Expression for the limit value of the test.
- * \param [in] msg Message that is output if the test does not pass.
- */
-#define NS_TEST_ASSERT_MSG_GT_OR_EQ(actual, limit, msg) \
-  NS_TEST_ASSERT_MSG_GT_OR_EQ_INTERNAL (actual, limit, msg, __FILE__, __LINE__)
-
-/**
- * \ingroup testingimpl
- * \brief Test that an actual value is greater than a limit and report if not.
- *
- * Required to avoid use of return statement which allows use in methods
- * (callbacks) returning void.
- */
-#define NS_TEST_EXPECT_MSG_GT_INTERNAL(actual, limit, msg, file, line)  \
+#define NS_TEST_ASSERT_MSG_GT(actual, limit, msg)                       \
   do {                                                                  \
       if (!((actual) > (limit)))                                        \
         {                                                               \
@@ -1037,19 +836,30 @@
           ReportTestFailure (std::string (#actual) + " (actual) > " +   \
                              std::string (#limit) + " (limit)",         \
                              actualStream.str (), limitStream.str (),   \
-                             msgStream.str (), file, line);             \
+                             msgStream.str (), __FILE__, __LINE__);     \
+          CONTINUE_ON_FAILURE;                                          \
         }                                                               \
     } while (false)
 
 /**
- * \ingroup testingimpl
- * \brief Test that an actual value is greater than or equal to limit
- * and report if not.
+ * \ingroup testing
+ *
+ * \brief Test that an actual value is greater than or equal to a
+ * limit and report and abort if not.
  *
- * Required to avoid use of return statement which allows use in
- * methods (callbacks) returning void.
+ * Check to see if the actual value found in a test case is greater
+ * than or equal to the limit value.  If the actual value is greater
+ * nothing happens, but if the check fails, an error is reported in a
+ * consistent way and the execution of the current test case is
+ * aborted.
+ *
+ * The message is interpreted as a stream.
+ *
+ * \param [in] actual Expression for the actual value found during the test.
+ * \param [in] limit Expression for the limit value of the test.
+ * \param [in] msg Message that is output if the test does not pass.
  */
-#define NS_TEST_EXPECT_MSG_GT_OR_EQ_INTERNAL(actual, limit, msg, file, line)  \
+#define NS_TEST_ASSERT_MSG_GT_OR_EQ(actual, limit, msg)                 \
   do {                                                                  \
       if (!((actual) >= (limit)))                                       \
         {                                                               \
@@ -1063,7 +873,8 @@
           ReportTestFailure (std::string (#actual) + " (actual) > " +   \
                              std::string (#limit) + " (limit)",         \
                              actualStream.str (), limitStream.str (),   \
-                             msgStream.str (), file, line);             \
+                             msgStream.str (), __FILE__, __LINE__);     \
+          CONTINUE_ON_FAILURE;                                          \
         }                                                               \
     } while (false)
 
@@ -1085,8 +896,23 @@
  * \param [in] limit Expression for the limit value of the test.
  * \param [in] msg Message that is output if the test does not pass.
  */
-#define NS_TEST_EXPECT_MSG_GT(actual, limit, msg) \
-  NS_TEST_EXPECT_MSG_GT_INTERNAL (actual, limit, msg, __FILE__, __LINE__)
+#define NS_TEST_EXPECT_MSG_GT(actual, limit, msg)                       \
+  do {                                                                  \
+      if (!((actual) > (limit)))                                        \
+        {                                                               \
+          ASSERT_ON_FAILURE;                                            \
+          std::ostringstream msgStream;                                 \
+          msgStream << msg;                                             \
+          std::ostringstream actualStream;                              \
+          actualStream << actual;                                       \
+          std::ostringstream limitStream;                               \
+          limitStream << limit;                                         \
+          ReportTestFailure (std::string (#actual) + " (actual) > " +   \
+                             std::string (#limit) + " (limit)",         \
+                             actualStream.str (), limitStream.str (),   \
+                             msgStream.str (), __FILE__, __LINE__);     \
+        }                                                               \
+    } while (false)
 
 /**
  * \ingroup testing
@@ -1106,9 +932,23 @@
  * \param [in] limit Expression for the limit value of the test.
  * \param [in] msg Message that is output if the test does not pass.
  */
-#define NS_TEST_EXPECT_MSG_GT_OR_EQ(actual, limit, msg) \
-  NS_TEST_EXPECT_MSG_GT_OR_EQ_INTERNAL (actual, limit, msg, __FILE__, __LINE__)
-
+#define NS_TEST_EXPECT_MSG_GT_OR_EQ(actual, limit, msg)                 \
+  do {                                                                  \
+      if (!((actual) >= (limit)))                                       \
+        {                                                               \
+          ASSERT_ON_FAILURE;                                            \
+          std::ostringstream msgStream;                                 \
+          msgStream << msg;                                             \
+          std::ostringstream actualStream;                              \
+          actualStream << actual;                                       \
+          std::ostringstream limitStream;                               \
+          limitStream << limit;                                         \
+          ReportTestFailure (std::string (#actual) + " (actual) > " +   \
+                             std::string (#limit) + " (limit)",         \
+                             actualStream.str (), limitStream.str (),   \
+                             msgStream.str (), __FILE__, __LINE__);     \
+        }                                                               \
+    } while (false)
 
 /**
  * \ingroup testing
@@ -1150,7 +990,7 @@
  *
  * \see sample-test-suite.cc
  */
-class TestCase : private NonCopyable
+class TestCase
 {
 public:
   /** \brief How long the test takes to execute. */
@@ -1166,6 +1006,10 @@
    */
   virtual ~TestCase ();
 
+  // Delete copy constructor and assignment operator to avoid misuse
+  TestCase (const TestCase &) = delete;
+  TestCase & operator = (const TestCase &) = delete;
+
   /**
    * \return The name of this test
    */
@@ -1202,7 +1046,7 @@
    * subdirectories, then the variable NS_TEST_SOURCEDIR may not work
    * and the user may want to explicitly pass in a directory string.
    *
-   * Note that NS_TEST_SOURCEDIR is set in src/wscript for each module
+   * Note that NS_TEST_SOURCEDIR is set in src/CMakeLists.txt for each module
    */
   void SetDataDir (std::string directory);
 
@@ -1403,7 +1247,7 @@
  * \brief A simple way to store test vectors (for stimulus or from responses)
  */
 template <typename T>
-class TestVectors : private NonCopyable
+class TestVectors
 {
 public:
   /**
@@ -1415,6 +1259,10 @@
    */
   virtual ~TestVectors ();
 
+  // Delete copy constructor and assignment operator to avoid misuse
+  TestVectors (const TestVectors &) = delete;
+  TestVectors & operator = (const TestVectors &) = delete;
+
   /**
    * \brief Set the expected length of this vector.
    *
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/model/time.cc ns-3.36/src/core/model/time.cc
--- ns-3.35/src/core/model/time.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/model/time.cc	2022-04-30 18:23:57.798733200 -0700
@@ -61,7 +61,10 @@
     return UNIT_COEFF[u] * std::pow (10L, UNIT_POWER[u]); 
   }
 
-  /** Initializer for \c UNIT_VALUE */
+  /** 
+   * Initializer for \c UNIT_VALUE 
+   * \returns The array of scale factors between units.
+   */
   long double *
   InitUnitValue (void)
   {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/model/traced-value.h ns-3.36/src/core/model/traced-value.h
--- ns-3.35/src/core/model/traced-value.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/model/traced-value.h	2022-04-30 18:23:57.802733200 -0700
@@ -75,7 +75,7 @@
  */
 /**
  *  TracedValue Callback signature for POD.
- *
+ * @{
  * \param [in] oldValue original value of the traced variable
  * \param [in] newValue new value of the traced variable
  */
@@ -89,8 +89,11 @@
 typedef void (* Int64) (int64_t  oldValue, int64_t  newValue);
 typedef void (* Uint64)(uint64_t oldValue, uint64_t newValue);
 typedef void (* Double)(double   oldValue, double   newValue);
+/**@}*/
+/** TracedValue Callback signature for void. */
 typedef void (* Void)  (void);
 /**@}*/
+
 }  // namespace TracedValueCallback
 
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/model/tuple.h ns-3.36/src/core/model/tuple.h
--- ns-3.35/src/core/model/tuple.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/core/model/tuple.h	2022-04-30 18:23:57.802733200 -0700
@@ -0,0 +1,534 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2021 Universita' degli Studi di Napoli Federico II
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Stefano Avallone <stavallo@unina.it>
+ */
+
+#ifndef TUPLE_H
+#define TUPLE_H
+
+#include <ns3/attribute-helper.h>
+#include <ns3/string.h>
+
+#include <sstream>
+#include <type_traits>
+#include <utility>
+#include <tuple>
+#include <algorithm>
+
+namespace ns3 {
+
+/**
+ * \brief Stream insertion operator.
+ * See https://en.cppreference.com/w/cpp/utility/apply
+ *
+ * Prints tuple values separated by a comma. E.g., if the tuple contains
+ * v1, v2 and v3, then "v1, v2, v3" will be added to the stream.
+ *
+ * \tparam Args \deduced Tuple arguments
+ * \param os the output stream
+ * \param t the tuple
+ * \returns a reference to the stream
+ */
+template <class... Args>
+std::ostream &
+operator << (std::ostream &os, const std::tuple<Args...> &t)
+{
+  std::apply ([&os](auto&&... args)
+              {
+                std::size_t n{0};
+                ((os << args << (++n != sizeof...(Args) ? ", " : "")), ...);
+              },
+              t);
+  return os;
+}
+
+
+// Doxygen for this class is auto-generated by
+// utils/print-introspected-doxygen.h
+
+/**
+ * Hold objects of type std::tuple<Args...>.
+ * \tparam Args \explicit The list of AttributeValues to be held by this TupleValue
+ */
+template <class... Args>
+class TupleValue : public AttributeValue
+{
+public:
+  /** Type of value stored in the TupleValue. */
+  typedef std::tuple<Args...> value_type;
+  /** Type returned by Get or passed in Set. */
+  typedef std::tuple<std::invoke_result_t<decltype(&Args::Get),Args>...> result_type;
+
+  TupleValue ();
+
+  /**
+   * Construct this TupleValue from a std::tuple
+   *
+   * \param [in] value Value with which to construct.
+   */
+  TupleValue (const result_type &value);
+
+  Ptr<AttributeValue> Copy (void) const override;
+  bool DeserializeFromString (std::string value, Ptr<const AttributeChecker> checker) override;
+  std::string SerializeToString (Ptr<const AttributeChecker> checker) const override;
+
+  /**
+   * Get the stored values as a std::tuple.
+   * 
+   * This differs from the actual value stored in the object which is 
+   * a tuple of Ptr<AV> where AV is a class derived from AttributeValue.
+   * \return stored values as a std::tuple
+   */
+  result_type Get (void) const;
+  /**
+   * Set the stored values.
+   */
+  void Set (const result_type &value);
+
+  /**
+   * Get the attribute values as a tuple.
+   * \return the attribute values as a tuple
+   */
+  value_type GetValue (void) const;
+
+  /**
+   * Set the given variable to the values stored by this TupleValue object.
+   *
+   * \tparam T \deduced the type of the given variable (normally, the argument type
+   *           of a set method or the type of a data member)
+   * \return true if the given variable was set
+   */
+  template <typename T>
+  bool GetAccessor (T &value) const;
+
+private:
+  /**
+   * Set the attribute values starting from the given values.
+   * Used by DeserializeFromString method.
+   *
+   * \tparam Is \deduced index sequence
+   * \param values the given attribute values
+   * \return true if the attribute values of this object were set
+   */
+  template <std::size_t... Is>
+  bool SetValueImpl (std::index_sequence<Is...>, const std::vector<Ptr<AttributeValue>>& values);
+
+  value_type m_value;   //!< Tuple of attribute values
+};
+
+/**
+ * Create a TupleValue object. Enable to write code like this snippet:
+ *
+ * \code
+ * typedef std::tuple<uint16_t, double> Tuple;
+ * typedef std::tuple<UintegerValue, DoubleValue> Pack;
+ *
+ * TupleValue<UintegerValue, DoubleValue> t = MakeTupleValue<Pack> (Tuple {10, 1.5});
+ * \endcode
+ *
+ * \tparam T1 \explicit A std::tuple of the AttributeValue types included in TupleValue
+ * \tparam T2 \deduced A std::tuple of the type of elements stored by TupleValue
+ * \param t the tuple of elements stored by TupleValue
+ * \return a TupleValue object
+ */
+template <class T1, class T2>
+auto MakeTupleValue (T2 t);
+
+
+/**
+ * Checker for attribute values storing tuples.
+ */
+class TupleChecker : public AttributeChecker
+{
+public:
+  /**
+   * Get the checkers for all tuple elements.
+   *
+   * \return the checkers for all tuple elements
+   */
+  virtual const std::vector<Ptr<const AttributeChecker>>& GetCheckers (void) const = 0;
+};
+
+
+/**
+ * Create a TupleChecker from AttributeCheckers associated with TupleValue elements.
+ * 
+ * \tparam Args \explicit Attribute value types
+ * \tparam Ts \deduced Attribute checker types
+ * \param checkers attribute checkers
+ * \return Pointer to TupleChecker instance.
+ */
+template <class... Args, class... Ts>
+Ptr<const AttributeChecker> MakeTupleChecker (Ts... checkers);
+
+
+/**
+ * Create an AttributeAccessor for a class data member of type tuple,
+ * or a lone class get functor or set method.
+ *
+ * \tparam Args \explicit Attribute value types
+ * \tparam T1 \deduced The type of the class data member,
+ *            or the type of the class get functor or set method.
+ * \param a1 The address of the data member,
+ *           or the get or set method.
+ * \return the AttributeAccessor
+ */
+template <class... Args, class T1>
+Ptr<const AttributeAccessor> MakeTupleAccessor (T1 a1);
+
+/**
+ * Create an AttributeAccessor using a pair of get functor
+ * and set methods from a class.
+ *
+ * \tparam Args \explicit Attribute value types
+ * \tparam T1 \deduced The type of the class data member,
+ *            or the type of the class get functor or set method.
+ * \tparam T2 \deduced The type of the getter class functor method.
+ * \param a2 The address of the class method to set the attribute.
+ * \param a1 The address of the data member, or the get or set method.
+ * \return the AttributeAccessor
+ */
+template <class... Args, class T1, class T2>
+Ptr<const AttributeAccessor> MakeTupleAccessor (T1 a1, T2 a2);
+
+
+}   // namespace ns3
+
+/*****************************************************************************
+ * Implementation below
+ *****************************************************************************/
+
+namespace ns3 {
+
+template <class... Args>
+TupleValue<Args...>::TupleValue ()
+  : m_value (std::make_tuple (Args ()...))
+{
+}
+
+template <class... Args>
+TupleValue<Args...>::TupleValue (const result_type &value)
+{
+  Set (value);
+}
+
+template <class... Args>
+Ptr<AttributeValue>
+TupleValue<Args...>::Copy (void) const
+{
+  return Create <TupleValue <Args...>> (Get ());
+}
+
+template <class... Args>
+template <std::size_t... Is>
+bool
+TupleValue<Args...>::SetValueImpl (std::index_sequence<Is...>, const std::vector<Ptr<AttributeValue>>& values)
+{
+  auto valueTuple = std::make_tuple (DynamicCast<Args> (values[Is])...);
+
+  bool ok = ((std::get<Is> (valueTuple) != nullptr) && ...);
+
+  if (ok)
+    {
+      m_value = std::make_tuple (Args (*std::get<Is> (valueTuple))...);
+    }
+  return ok;
+}
+
+template <class... Args>
+bool
+TupleValue<Args...>::DeserializeFromString (std::string value, Ptr<const AttributeChecker> checker)
+{
+  auto tupleChecker = DynamicCast<const TupleChecker> (checker);
+  if (tupleChecker == nullptr)
+    {
+      return false;
+    }
+
+  auto count = tupleChecker->GetCheckers ().size ();
+  if (count != sizeof...(Args))
+    {
+      return false;
+    }
+
+  if (value.empty () || value.front () != '{' || value.back () != '}')
+    {
+      return false;
+    }
+
+  value.erase (value.begin ());
+  value.pop_back ();
+  std::replace (value.data (), value.data () + value.size (), ',', ' ');
+
+  std::istringstream iss (value);
+  std::vector<Ptr<AttributeValue>> values;
+  std::size_t i = 0;
+
+  while (iss >> value)
+    {
+      if (i >= count)
+        {
+          return false;
+        }
+      values.push_back (tupleChecker->GetCheckers ().at (i++)->CreateValidValue (StringValue (value)));
+      if (values.back () == nullptr)
+        {
+          return false;
+        }
+    }
+
+  if (i != count)
+    {
+      return false;
+    }
+
+  return SetValueImpl (std::index_sequence_for<Args...>{}, values);
+}
+
+template <class... Args>
+std::string
+TupleValue<Args...>::SerializeToString (Ptr<const AttributeChecker> checker) const
+{
+  std::ostringstream oss;
+  oss << "{" << Get () << "}";
+  return oss.str ();
+}
+
+template <class... Args>
+typename TupleValue<Args...>::result_type
+TupleValue<Args...>::Get (void) const
+{
+  return std::apply ([](Args... values)
+                     {
+                       return std::make_tuple (values.Get ()...);
+                     },
+                     m_value);
+}
+
+template <class... Args>
+void
+TupleValue<Args...>::Set (const typename TupleValue<Args...>::result_type &value)
+{
+  m_value = std::apply ([](auto&&... args)
+                        {
+                          return std::make_tuple (Args (args)...);
+                        },
+                        value);
+}
+
+template <class... Args>
+typename TupleValue<Args...>::value_type
+TupleValue<Args...>::GetValue (void) const
+{
+  return m_value;
+}
+
+template <class... Args>
+template <typename T>
+bool
+TupleValue<Args...>::GetAccessor (T &value) const
+{
+  value = T (Get ());
+  return true;
+}
+
+
+
+
+// This internal class defines templated TupleChecker class that is instantiated
+// in MakeTupleChecker. The non-templated base ns3::TupleChecker is returned in that
+// function. This is the same pattern as ObjectPtrContainer.
+namespace internal {
+
+/**
+ * Internal checker class templated to each AttributeChecker
+ * for each entry in the tuple.
+ */
+template <class... Args>
+class TupleChecker : public ns3::TupleChecker
+{
+public:
+  /**
+   * Constructor.
+   * \tparam Ts \deduced the type of the attribute checkers
+   * \param checkers the attribute checkers for individual elements of the tuple
+   */
+  template <class... Ts>
+  TupleChecker (Ts... checkers)
+    : m_checkers {checkers...}
+  {
+  }
+  const std::vector<Ptr<const AttributeChecker>>& GetCheckers (void) const override
+  {
+    return m_checkers;
+  }
+  bool Check (const AttributeValue &value) const override
+  {
+    const TupleValue<Args...>* v = dynamic_cast<const TupleValue<Args...>*> (&value);
+    if (v == nullptr)
+      {
+        return false;
+      }
+    return std::apply ([this](Args... values)
+                       {
+                         std::size_t n{0};
+                         return (m_checkers[n++]->Check (values) && ...);
+                       },
+                       v->GetValue ());
+  }
+  std::string GetValueTypeName (void) const override
+  {
+    return "ns3::TupleValue";
+  }
+  bool HasUnderlyingTypeInformation (void) const override
+  {
+    return false;
+  }
+  std::string GetUnderlyingTypeInformation (void) const override
+  {
+    return "";
+  }
+  Ptr<AttributeValue> Create (void) const override
+  {
+    return ns3::Create<TupleValue<Args...>> ();
+  }
+  bool Copy (const AttributeValue &source, AttributeValue &destination) const override
+  {
+    const TupleValue<Args...> *src = dynamic_cast<const TupleValue<Args...> *> (&source);
+    TupleValue<Args...> *dst = dynamic_cast<TupleValue<Args...> *> (&destination);
+    if (src == 0 || dst == 0)
+      {
+        return false;
+      }
+    *dst = *src;
+    return true;
+  }
+
+private:
+  std::vector<Ptr<const AttributeChecker>> m_checkers;    //!< attribute checkers
+};
+
+/**
+ * Helper class defining static methods for MakeTupleChecker and MakeTupleAccessor
+ * that are called when user specifies the list of AttributeValue types included
+ * in a TupleValue type.
+ */
+template <class... Args>
+struct TupleHelper
+{
+  /**
+   * \copydoc ns3::MakeTupleChecker
+   */
+  template <class... Ts>
+  static Ptr<const AttributeChecker> MakeTupleChecker (Ts... checkers)
+    {
+      return Create <internal::TupleChecker<Args...>> (checkers...);
+    }
+  /**
+   * \copydoc ns3::MakeTupleAccessor(T1)
+   */
+  template <class T1>
+  static Ptr<const AttributeAccessor> MakeTupleAccessor (T1 a1)
+  {
+    return MakeAccessorHelper<TupleValue<Args...>> (a1);
+  }
+  /**
+   * \copydoc ns3::MakeTupleAccessor(T1,T2)
+   */
+  template <class T1, class T2>
+  static Ptr<const AttributeAccessor> MakeTupleAccessor (T1 a1, T2 a2)
+  {
+    return MakeAccessorHelper<TupleValue<Args...>> (a1, a2);
+  }
+};
+
+/**
+ * Helper class defining static methods for MakeTupleValue, MakeTupleChecker and
+ * MakeTupleAccessor that are called when user provides a std::tuple of the
+ * AttributeValue types included in a TupleValue type.
+ * This struct is a partial specialization of struct TupleHelper.
+ */
+template <class... Args>
+struct TupleHelper<std::tuple<Args...>>
+{
+  /**
+   * \copydoc ns3::MakeTupleValue
+   */
+  static TupleValue<Args...> MakeTupleValue (const typename TupleValue<Args...>::result_type& t)
+    {
+      return TupleValue<Args...> (t);
+    }
+  /**
+   * \copydoc ns3::MakeTupleChecker
+   */
+  template <class... Ts>
+  static Ptr<const AttributeChecker> MakeTupleChecker (Ts... checkers)
+    {
+      return Create <internal::TupleChecker<Args...>> (checkers...);
+    }
+  /**
+   * \copydoc ns3::MakeTupleAccessor(T1)
+   */
+  template <class T1>
+  static Ptr<const AttributeAccessor> MakeTupleAccessor (T1 a1)
+  {
+    return MakeAccessorHelper<TupleValue<Args...>> (a1);
+  }
+  /**
+   * \copydoc ns3::MakeTupleAccessor(T1,T2)
+   */
+  template <class T1, class T2>
+  static Ptr<const AttributeAccessor> MakeTupleAccessor (T1 a1, T2 a2)
+  {
+    return MakeAccessorHelper<TupleValue<Args...>> (a1, a2);
+  }
+};
+
+} // namespace internal
+
+
+
+template <class T1, class T2>
+auto MakeTupleValue (T2 t)
+{
+  return internal::TupleHelper<T1>::MakeTupleValue (t);
+}
+
+template <class... Args, class... Ts>
+Ptr<const AttributeChecker> MakeTupleChecker (Ts... checkers)
+{
+  return  internal::TupleHelper<Args...>::template MakeTupleChecker<Ts...> (checkers...);
+}
+
+template <class... Args, class T1>
+Ptr<const AttributeAccessor> MakeTupleAccessor (T1 a1)
+{
+  return internal::TupleHelper<Args...>::template MakeTupleAccessor<T1> (a1);
+}
+
+template <class... Args, class T1, class T2>
+Ptr<const AttributeAccessor> MakeTupleAccessor (T1 a1, T2 a2)
+{
+  return internal::TupleHelper<Args...>::template MakeTupleAccessor<T1, T2> (a1, a2);
+}
+
+
+
+} // namespace ns3
+
+#endif // TUPLE_H
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/model/type-id.cc ns-3.36/src/core/model/type-id.cc
--- ns-3.35/src/core/model/type-id.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/model/type-id.cc	2022-04-30 18:23:57.802733200 -0700
@@ -242,7 +242,6 @@
    *             "ns3::" namespace qualifier.
    * \param [in] supportLevel The support/deprecation status for this attribute.
    * \param [in] supportMsg Upgrade hint if this attribute is no longer supported.
-   * \returns This TypeId instance.
    */
   void AddTraceSource (uint16_t uid,
                        std::string name,
@@ -811,7 +810,7 @@
  *         The TypeId class
  *********************************************************************/
 
-TypeId::TypeId (const char *name)
+TypeId::TypeId (const std::string &name)
 {
   NS_LOG_FUNCTION (this << name);
   uint16_t uid = IidManager::Get ()->AllocateUid (name);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/model/type-id.h ns-3.36/src/core/model/type-id.h
--- ns-3.35/src/core/model/type-id.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/model/type-id.h	2022-04-30 18:23:57.802733200 -0700
@@ -176,7 +176,7 @@
    * No two instances can share the same name. The name is expected to be
    * the full c++ typename of associated c++ object.
    */
-  explicit TypeId (const char * name);
+  explicit TypeId (const std::string &name);
 
   /**
    * Get the parent of this TypeId.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/model/type-name.cc ns-3.36/src/core/model/type-name.cc
--- ns-3.35/src/core/model/type-name.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/model/type-name.cc	1969-12-31 16:00:00.000000000 -0800
@@ -1,43 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2007 Georgia Tech Research Corporation
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- */
-
-#include "type-name.h"
-
-/**
- * \file
- * \ingroup attributeimpl
- * ns3::TypeNameGet() function implementations.
- */
-
-namespace ns3 {
-
-// *NS_CHECK_STYLE_OFF*
-template <> std::string TypeNameGet< int8_t  > (void) { return "int8_t"  ; }
-template <> std::string TypeNameGet< int16_t > (void) { return "int16_t" ; }
-template <> std::string TypeNameGet< int32_t > (void) { return "int32_t" ; }
-template <> std::string TypeNameGet< int64_t > (void) { return "int64_t" ; }
-template <> std::string TypeNameGet< uint8_t > (void) { return "uint8_t" ; }
-template <> std::string TypeNameGet< uint16_t> (void) { return "uint16_t"; }
-template <> std::string TypeNameGet< uint32_t> (void) { return "uint32_t"; }
-template <> std::string TypeNameGet< uint64_t> (void) { return "uint64_t"; }
-template <> std::string TypeNameGet< float   > (void) { return "float"   ; }
-template <> std::string TypeNameGet< double  > (void) { return "double"  ; }
-// *NS_CHECK_STYLE_ON*
-
-} // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/model/type-name.h ns-3.36/src/core/model/type-name.h
--- ns-3.35/src/core/model/type-name.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/model/type-name.h	2022-04-30 18:23:57.802733200 -0700
@@ -50,17 +50,19 @@
  * \returns The numeric type name as a string.
  * @{
  */
-template <> std::string TypeNameGet< int8_t  > (void);
-template <> std::string TypeNameGet< int16_t > (void);
-template <> std::string TypeNameGet< int32_t > (void);
-template <> std::string TypeNameGet< int64_t > (void);
-template <> std::string TypeNameGet< uint8_t > (void);
-template <> std::string TypeNameGet< uint16_t> (void);
-template <> std::string TypeNameGet< uint32_t> (void);
-template <> std::string TypeNameGet< uint64_t> (void);
-template <> std::string TypeNameGet< float   > (void);
-template <> std::string TypeNameGet< double  > (void);
-/**@}*/
+// *NS_CHECK_STYLE_OFF*
+template <> inline std::string TypeNameGet< int8_t  > (void) { return "int8_t"  ; };
+template <> inline std::string TypeNameGet< int16_t > (void) { return "int16_t" ; };
+template <> inline std::string TypeNameGet< int32_t > (void) { return "int32_t" ; };
+template <> inline std::string TypeNameGet< int64_t > (void) { return "int64_t" ; };
+template <> inline std::string TypeNameGet< uint8_t > (void) { return "uint8_t" ; };
+template <> inline std::string TypeNameGet< uint16_t> (void) { return "uint16_t"; };
+template <> inline std::string TypeNameGet< uint32_t> (void) { return "uint32_t"; };
+template <> inline std::string TypeNameGet< uint64_t> (void) { return "uint64_t"; };
+template <> inline std::string TypeNameGet< float   > (void) { return "float"   ; };
+template <> inline std::string TypeNameGet< double  > (void) { return "double"  ; };
+// *NS_CHECK_STYLE_ON*
+/** @} */
 
 } // namespace ns3
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/model/unused.h ns-3.36/src/core/model/unused.h
--- ns-3.35/src/core/model/unused.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/model/unused.h	2022-04-30 18:23:57.802733200 -0700
@@ -21,33 +21,59 @@
 #ifndef UNUSED_H
 #define UNUSED_H
 
+#include "ns3/deprecated.h"
+
 /**
  * \file
  * \ingroup core
  * NS_UNUSED and NS_UNUSED_GLOBAL macro definitions.
  */
 
+
 /**
  * \ingroup core
  * \def NS_UNUSED()
  * Mark a local variable as unused.
+ *
+ * \deprecated Please use `[[maybe_unused]]` directly. This macro is being
+ * kept temporarily to support older code.
  */
+
+// We can't use NS_DEPRECATED_3_36 here because NS_UNUSED
+// is used as a statement following a declaration:
+//   int x;
+//   NS_UNUSED (x);
+// NS_DEPRECATED needs to be applied to the declaration
+//   NS_DEPRECATED_3_36 ("use double instead") int x;
+// Instead we resort to a pragma
+
 #ifndef NS_UNUSED
-# define NS_UNUSED(x) ((void)(x))
+# define NS_UNUSED(x) \
+  _Pragma ("GCC warning \"NS_UNUSED is deprecated, use [[maybe_unused]] directly\"") \
+  ((void)(x))
 #endif
 
 /**
  * \ingroup core
  * \def NS_UNUSED_GLOBAL()
  * Mark a variable at file scope as unused.
+ *
+ * \deprecated Please use `[[maybe_unused]]` directly. This macro is being
+ * kept temporarily to support older code.
  */
 #ifndef NS_UNUSED_GLOBAL
 #if defined(__GNUC__)
-# define NS_UNUSED_GLOBAL(x) x __attribute__((unused))
+# define NS_UNUSED_GLOBAL(x) \
+  NS_DEPRECATED_3_36 ("NS_UNUSED_GLOBAL is deprecated, use [[maybe_unused]] directly") \
+  [[maybe_unused]] x
 #elif defined(__LCLINT__)
-# define NS_UNUSED_GLOBAL(x) /*@unused@*/ x
+# define NS_UNUSED_GLOBAL(x) \
+  NS_DEPRECATED_3_36 ("NS_UNUSED_GLOBAL is deprecated, use [[maybe_unused]] directly") \
+  /*@unused@*/ x
 #else
-# define NS_UNUSED_GLOBAL(x) x
+# define NS_UNUSED_GLOBAL(x) \
+  NS_DEPRECATED_3_36 ("NS_UNUSED_GLOBAL is deprecated, use [[maybe_unused]] directly") \
+  x
 #endif
 #endif
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/model/version-defines.h.in ns-3.36/src/core/model/version-defines.h.in
--- ns-3.35/src/core/model/version-defines.h.in	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/model/version-defines.h.in	2022-04-30 18:23:57.802733200 -0700
@@ -134,7 +134,7 @@
 
 /**
  * Indicates the build profile that was specified by the --build-profile option
- * of "waf configure"
+ * of "ns3 configure"
  *
  * Type: string literal
  */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/model/version.h ns-3.36/src/core/model/version.h
--- ns-3.35/src/core/model/version.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/model/version.h	2022-04-30 18:23:57.802733200 -0700
@@ -94,7 +94,7 @@
  * | TagDistance        | 1        |       |
  * | CommitHash         | g6ad7f05 | g at front of hash indicates a git hash |
  * | DirtyWorkingTree   | Variable | Depends on status of git working and stage areas |
- * | BuildProfile       | Variable | Depends on the value of --build-profile option of waf configure |
+ * | BuildProfile       | Variable | Depends on the value of --build-profile option of ns3 configure |
  */
 class Version
 {
@@ -207,7 +207,7 @@
   /**
    * Indicates the type of build that was performed (debug/release/optimized).
    *
-   * This information is set by the --build-profile option of waf configure
+   * This information is set by the --build-profile option of ns3 configure
    *
    * \return String containing the type of build
    */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/test/attribute-container-test-suite.cc ns-3.36/src/core/test/attribute-container-test-suite.cc
--- ns-3.35/src/core/test/attribute-container-test-suite.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/test/attribute-container-test-suite.cc	2022-04-30 18:23:57.802733200 -0700
@@ -42,24 +42,48 @@
 
 NS_LOG_COMPONENT_DEFINE ("AttributeContainerTestSuite");
 
+/**
+ * \file
+ * \ingroup attribute-tests
+ * Attribute container test suite
+ */
+
+/**
+ * \ingroup attribute-tests
+ * Attribute container object.
+ */
 class AttributeContainerObject : public Object
 {
 public:
   AttributeContainerObject ();
   virtual ~AttributeContainerObject ();
 
+  /**
+   * Reverses the list of doubles.
+   */
   void ReverseList ();
 
+  /**
+   * \brief Get the type ID.
+   * \return The object TypeId.
+   */  
   static
   TypeId GetTypeId ();
 
+  /**
+   * \brief Stream insertion operator.
+   *
+   * \param [in] os The reference to the output stream.
+   * \param [in] obj The AttributeContainer object.
+   * \returns The reference to the output stream.
+   */
   friend std::ostream &operator <<(std::ostream &os, const AttributeContainerObject &obj);
 
 private:
-  std::list<double> m_doublelist;
-  std::vector<int> m_intvec;
+  std::list<double> m_doublelist; //!< List of doubles.
+  std::vector<int> m_intvec;      //!< Vector of ints.
   // TODO(jared): need PairValue attributevalue to handle std::pair elements
-  std::map<std::string, int> m_map;
+  std::map<std::string, int> m_map; //!< Map of <std::string, int>.
 };
 
 AttributeContainerObject::AttributeContainerObject ()
@@ -93,7 +117,7 @@
                    AttributeContainerValue <PairValue <StringValue, IntegerValue> > (),
                    MakeAttributeContainerAccessor <PairValue <StringValue, IntegerValue> > (&AttributeContainerObject::m_map),
                    MakeAttributeContainerChecker<PairValue <StringValue, IntegerValue> > (
-                     MakePairChecker<StringValue, IntegerValue> (MakeStringChecker (), MakeIntegerChecker<int> ())))
+                   MakePairChecker<StringValue, IntegerValue> (MakeStringChecker (), MakeIntegerChecker<int> ())))
     ;
   return tid;
 }
@@ -121,8 +145,15 @@
   return os;
 }
 
-// this handles mixed constness and compatible, yet
-// distinct numerical classes (like int and long)
+/**
+ * \ingroup attribute-tests
+ *  
+ * This function handles mixed constness and compatible, yet
+ * distinct numerical classes (like int and long)
+ * \param x The left operand.
+ * \param y The right operand.
+ * \return true if the pairs have the same numerical values.
+ */
 template <class A, class B, class C, class D>
 bool
 operator ==(const std::pair<A, B> &x, const std::pair<C, D> &y)
@@ -130,7 +161,11 @@
   return x.first == y.first && x.second == y.second;
 }
 
-/* Test instantiation, initialization, access */
+/**
+ * \ingroup attribute-tests
+ *  
+ * Test AttributeContainer instantiation, initialization, access
+ */
 class AttributeContainerTestCase : public TestCase
 {
 public:
@@ -232,7 +267,11 @@
   }
 }
 
-// test serdes functions
+/**
+ * \ingroup attribute-tests
+ *  
+ * Attribute serialization and deserialization TestCase.
+ */
 class AttributeContainerSerializationTestCase : public TestCase
 {
 public:
@@ -318,6 +357,11 @@
   }
 }
 
+/**
+ * \ingroup attribute-tests
+ *  
+ * Attribute set and get TestCase.
+ */
 class AttributeContainerSetGetTestCase : public TestCase
 {
 public:
@@ -416,6 +460,11 @@
   }
 }
 
+/**
+ * \ingroup attribute-tests
+ *  
+ * Attribute attribute container TestCase.
+ */
 class AttributeContainerTestSuite : public TestSuite
 {
   public:
@@ -430,4 +479,4 @@
   AddTestCase (new AttributeContainerSetGetTestCase (), TestCase::QUICK);
 }
 
-static AttributeContainerTestSuite AttributeContainerTestSuite; //!< Static variable for test initialization
+static AttributeContainerTestSuite g_attributeContainerTestSuite; //!< Static variable for test initialization
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/test/attribute-test-suite.cc ns-3.36/src/core/test/attribute-test-suite.cc
--- ns-3.35/src/core/test/attribute-test-suite.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/test/attribute-test-suite.cc	2022-04-30 18:23:57.802733200 -0700
@@ -37,8 +37,23 @@
 
 using namespace ns3;
 
+namespace ns3 {
+
+/**
+ * \file
+ * \ingroup attribute-tests
+ * Attribute test suite
+ */
+
 /**
- * Test class for TracedValue callbacks.
+ * \ingroup core-tests
+ * \defgroup attribute-tests Attribute tests
+ */
+
+/**
+ * \ingroup attribute-tests
+ * 
+ * Test class for TracedValue callbacks attributes.
  * \see attribute_ValueClassTest
  */
 class ValueClassTest
@@ -57,30 +72,56 @@
                                        const ValueClassTest newValue);
 };
 
-
-bool operator != (const ValueClassTest &a, const ValueClassTest &b)
+/**
+ * Operator not equal.
+ * \param a The left operand.
+ * \param b The right operand.
+ * \return always true.
+ */
+bool operator != ([[maybe_unused]] const ValueClassTest &a, [[maybe_unused]] const ValueClassTest &b)
 {
-  NS_UNUSED (a);
-  NS_UNUSED (b);
   return true;
 }
-std::ostream & operator << (std::ostream &os, ValueClassTest v)
+/**
+ * \brief Stream insertion operator.
+ *
+ * \param [in] os The reference to the output stream.
+ * \param [in] v The ValueClassTest object.
+ * \returns The reference to the output stream.
+ */
+std::ostream & operator << (std::ostream &os, [[maybe_unused]] ValueClassTest v)
 {
-  NS_UNUSED (v);
   return os;
 }
-std::istream & operator >> (std::istream &is, ValueClassTest &v)
+/**
+ * \brief Stream extraction operator.
+ *
+ * \param [in] is The reference to the input stream.
+ * \param [out] v The ValueClassTest object.
+ * \returns The reference to the input stream.
+ */
+std::istream & operator >> (std::istream &is, [[maybe_unused]] ValueClassTest &v)
 {
-  NS_UNUSED (v);
   return is;
 }
 
 ATTRIBUTE_HELPER_HEADER (ValueClassTest);
 ATTRIBUTE_HELPER_CPP (ValueClassTest);
 
+} // end of ns3 namespace
+
+/**
+ * \ingroup attribute-tests
+ * 
+ * Simple class derived from ns3::Object, used to check attribute constructors.
+ */
 class Derived : public Object
 {
 public:
+  /**
+   * \brief Get the type ID.
+   * \return The object TypeId.
+   */
   static TypeId GetTypeId (void)
   {
     static TypeId tid = TypeId ("ns3::Derived")
@@ -95,15 +136,25 @@
 
 NS_OBJECT_ENSURE_REGISTERED (Derived);
 
+/**
+ * \ingroup attribute-tests
+ * 
+ * Class used to check attributes.
+ */
 class AttributeObjectTest : public Object
 {
 public:
+  /// Test enumerator.
   enum Test_e
   {
-    TEST_A,
-    TEST_B,
-    TEST_C
+    TEST_A, //!< Test value A.
+    TEST_B, //!< Test value B.
+    TEST_C  //!< Test value C.
   };
+  /**
+   * \brief Get the type ID.
+   * \return The object TypeId.
+   */
   static TypeId GetTypeId (void)
   {
     static TypeId tid = TypeId ("ns3::AttributeObjectTest")
@@ -116,8 +167,8 @@
                      MakeBooleanChecker ())
       .AddAttribute ("TestBoolA", "help text",
                      BooleanValue (false),
-                     MakeBooleanAccessor (&AttributeObjectTest::DoSetTestB,
-                                          &AttributeObjectTest::DoGetTestB),
+                     MakeBooleanAccessor (&AttributeObjectTest::DoSetTestA,
+                                          &AttributeObjectTest::DoGetTestA),
                      MakeBooleanChecker ())
       .AddAttribute ("TestInt16", "help text",
                      IntegerValue (-2),
@@ -241,37 +292,46 @@
 
   AttributeObjectTest (void)
   {
-    NS_UNUSED (m_boolTest);
-    NS_UNUSED (m_int16);
-    NS_UNUSED (m_int16WithBounds);
-    NS_UNUSED (m_uint8);
-    NS_UNUSED (m_float);
-    NS_UNUSED (m_enum);
-    NS_UNUSED (m_enumSetGet);
   }
 
   virtual ~AttributeObjectTest (void)
   {}
 
+  /// Add an object to the first vector.
   void AddToVector1 (void)
   {
     m_vector1.push_back (CreateObject<Derived> ());
   }
+  /// Add an object to the second vector.
   void AddToVector2 (void)
   {
     m_vector2.push_back (CreateObject<Derived> ());
   }
 
+  /**
+   * Adds an object to the first map.
+   * \param i The index to assign to the object.
+   */
   void AddToMap1 (uint32_t i)
   {
     m_map1.insert (std::pair <uint32_t, Ptr<Derived> > (i, CreateObject<Derived> ()));
   }
 
+  /**
+   * Invoke the m_cb callback.
+   * \param a The first argument of the callback.
+   * \param b The second argument of the callback.
+   * \param c The third argument of the callback.
+   */
   void InvokeCb (double a, int b, float c)
   {
     m_cb (a,b,c);
   }
 
+  /**
+   * Invoke the m_cbValue callback.
+   * \param a The argument of the callback.
+   */
   void InvokeCbValue (int8_t a)
   {
     if (!m_cbValue.IsNull ())
@@ -281,96 +341,153 @@
   }
 
 private:
-  void DoSetTestB (bool v)
+  /**
+   * Set the m_boolTestA value.
+   * \param v The value to set.
+   */
+  void DoSetTestA (bool v)
   {
     m_boolTestA = v;
   }
-  bool DoGetTestB (void) const
+  /**
+   * Get the m_boolTestA value.
+   * \return the value of m_boolTestA.
+   */
+  bool DoGetTestA (void) const
   {
     return m_boolTestA;
   }
+  /**
+   * Get the m_int16SetGet value.
+   * \return the value of m_int16SetGet.
+   */
   int16_t DoGetInt16 (void) const
   {
     return m_int16SetGet;
   }
+  /**
+   * Set the m_int16SetGet value.
+   * \param v The value to set.
+   */
   void DoSetInt16 (int16_t v)
   {
     m_int16SetGet = v;
   }
+  /**
+   * Get the length of m_vector2.
+   * \return the vector size.
+   */
   std::size_t DoGetVectorN (void) const
   {
     return m_vector2.size ();
   }
+  /**
+   * Get the i-th item of m_vector2.
+   * \param i The index of the element to get.
+   * \return i-th item of m_vector2.
+   */
   Ptr<Derived> DoGetVector (std::size_t i) const
   {
     return m_vector2[i];
   }
+  /**
+   * Set the m_intSrc2 value.
+   * \param v The value to set.
+   * \return true.
+   */
   bool DoSetIntSrc (int8_t v)
   {
     m_intSrc2 = v;
     return true;
   }
+  /**
+   * Get the m_intSrc2 value.
+   * \return the value of m_intSrc2.
+   */
   int8_t DoGetIntSrc (void) const
   {
     return m_intSrc2;
   }
+  /**
+   * Set the m_enumSetGet value.
+   * \param v The value to set.
+   * \return true.
+   */
   bool DoSetEnum (Test_e v)
   {
     m_enumSetGet = v;
     return true;
   }
+  /**
+   * Get the m_enumSetGet value.
+   * \return the value of m_enumSetGet.
+   */
   Test_e DoGetEnum (void) const
   {
     return m_enumSetGet;
   }
 
-  bool m_boolTestA;
-  bool m_boolTest;
-  bool m_boolTestDeprecated;
-  int16_t m_int16;
-  int16_t m_int16WithBounds;
-  int16_t m_int16SetGet;
-  uint8_t m_uint8;
-  float m_float;
-  enum Test_e m_enum;
-  enum Test_e m_enumSetGet;
-  Ptr<RandomVariableStream> m_random;
-  std::vector<Ptr<Derived> > m_vector1;
-  std::vector<Ptr<Derived> > m_vector2;
-  std::map <uint32_t, Ptr<Derived> > m_map1;
-  Callback<void,int8_t> m_cbValue;
-  TracedValue<int8_t> m_intSrc1;
-  TracedValue<int8_t> m_intSrc2;
+  bool m_boolTestA;   //!< Boolean test A.
+  bool m_boolTest;    //!< Boolean test.
+  bool m_boolTestDeprecated;  //!< Boolean test deprecated.
+  int16_t m_int16;            //!< 16-bit integer.
+  int16_t m_int16WithBounds;  //!< 16-bit integer with bounds.
+  int16_t m_int16SetGet;      //!< 16-bit integer set-get.
+  uint8_t m_uint8;            //!< 8-bit integer.
+  float m_float;              //!< float.
+  enum Test_e m_enum;         //!< Enum.
+  enum Test_e m_enumSetGet;   //!< Enum set-get.
+  Ptr<RandomVariableStream> m_random;   //!< Random number generator.
+  std::vector<Ptr<Derived> > m_vector1; //!< First vector of derived objects.
+  std::vector<Ptr<Derived> > m_vector2; //!< Second vector of derived objects.
+  std::map <uint32_t, Ptr<Derived> > m_map1;   //!< Map of uint32_t, derived objects.
+  Callback<void,int8_t> m_cbValue;      //!< Callback accepting an integer.
+  TracedValue<int8_t> m_intSrc1;        //!< First int8_t Traced value.
+  TracedValue<int8_t> m_intSrc2;        //!< Second int8_t Traced value.
 
+  /// Traced callbacks for (double, int, float) values.
   typedef void (* NumericTracedCallback) (double, int, float);
-  TracedCallback<double, int, float> m_cb;
-  TracedValue<ValueClassTest> m_valueSrc;
-  Ptr<Derived> m_ptr;
-  Ptr<Derived> m_ptrInitialized;
-  Ptr<Derived> m_ptrInitialized2;
-  TracedValue<uint8_t> m_uintSrc;
-  TracedValue<enum Test_e> m_enumSrc;
-  TracedValue<double> m_doubleSrc;
-  TracedValue<bool> m_boolSrc;
-  Time m_timeWithBounds;
+  TracedCallback<double, int, float> m_cb;  //!< TracedCallback (double, int, float).
+  TracedValue<ValueClassTest> m_valueSrc;   //!< ValueClassTest Traced value.
+  Ptr<Derived> m_ptr;               //!< Pointer to Derived class.
+  Ptr<Derived> m_ptrInitialized;    //!< Pointer to Derived class.
+  Ptr<Derived> m_ptrInitialized2;   //!< Pointer to Derived class.
+  TracedValue<uint8_t> m_uintSrc;   //!< uint8_t Traced value.
+  TracedValue<enum Test_e> m_enumSrc; //!< enum Traced value.
+  TracedValue<double> m_doubleSrc;  //!< double Traced value.
+  TracedValue<bool> m_boolSrc;      //!< bool Traced value.
+  Time m_timeWithBounds;            //!< Time with bounds
 };
 
 NS_OBJECT_ENSURE_REGISTERED (AttributeObjectTest);
 
-// ===========================================================================
-// Test case template used for generic Attribute Value types -- used to make
-// sure that Attributes work as expected.
-// ===========================================================================
+/**
+ * \ingroup attribute-tests
+ * 
+ * \brief Test case template used for generic Attribute Value types -- used to make
+ * sure that Attributes work as expected.
+ */
 template <typename T>
 class AttributeTestCase : public TestCase
 {
 public:
+  /**
+   * Constructor.
+   * \param description The TestCase description.
+   */
   AttributeTestCase (std::string description);
   virtual ~AttributeTestCase ();
 
 private:
   virtual void DoRun (void);
-
+  /**
+   * Check the attribute path and value.
+   * \param p The object to test.
+   * \param attributeName The attribute name.
+   * \param expectedString The expected attribute name.
+   * \param expectedValue The expected attribute value.
+   * \return true if everything is as expected.
+   */
   bool CheckGetCodePaths (Ptr<Object> p, std::string attributeName, std::string expectedString, T expectedValue);
 };
 
@@ -851,16 +968,26 @@
   NS_TEST_ASSERT_MSG_EQ (ok, true, "Error in SetAttributeFailSafe() but value changes");
 }
 
-// ===========================================================================
-// Test the Attributes of type RandomVariableStream.
-// ===========================================================================
+/**
+ * \ingroup attribute-tests
+ *  
+ * Test the Attributes of type RandomVariableStream.
+ */
 class RandomVariableStreamAttributeTestCase : public TestCase
 {
 public:
+  /**
+   * Constructor.
+   * \param description The TestCase description.
+   */
   RandomVariableStreamAttributeTestCase (std::string description);
   virtual ~RandomVariableStreamAttributeTestCase ()
   {}
 
+  /**
+   * Invoke the m_cbValue.
+   * \param a The value to use on the callback.
+   */
   void InvokeCbValue (int8_t a)
   {
     if (!m_cbValue.IsNull ())
@@ -872,14 +999,19 @@
 private:
   virtual void DoRun (void);
 
+  /// Callback used in the test.
   Callback<void,int8_t> m_cbValue;
 
+  /**
+   * Function called when the callback is used.
+   * \param a The value of the callback.
+   */
   void NotifyCallbackValue (int8_t a)
   {
     m_gotCbValue = a;
   }
 
-  int16_t m_gotCbValue;
+  int16_t m_gotCbValue; //!< Value used to verify that the callback has been invoked.
 };
 
 RandomVariableStreamAttributeTestCase::RandomVariableStreamAttributeTestCase (std::string description)
@@ -908,13 +1040,20 @@
   NS_TEST_ASSERT_MSG_EQ (ok, true, "Could not SetAttributeFailSafe() a ConstantRandomVariable");
 }
 
-// ===========================================================================
-// Test case for Object Vector Attributes.  Generic nature is pretty much lost
-// here, so we just break the class out.
-// ===========================================================================
+/**
+ * \ingroup attribute-tests
+ *  
+ * \brief Test case for Object Vector Attributes.
+ * 
+ * Generic nature is pretty much lost here, so we just break the class out.
+ */
 class ObjectVectorAttributeTestCase : public TestCase
 {
 public:
+  /**
+   * Constructor.
+   * \param description The TestCase description.
+   */
   ObjectVectorAttributeTestCase (std::string description);
   virtual ~ObjectVectorAttributeTestCase ()
   {}
@@ -974,12 +1113,18 @@
   NS_TEST_ASSERT_MSG_EQ (vector.GetN (), 2, "ObjectVectorValue \"TestVector1\" should be incremented");
 }
 
-// ===========================================================================
-// Test case for Object Map Attributes.
-// ===========================================================================
+/**
+ * \ingroup attribute-tests
+ *  
+ * \brief Test case for Object Map Attributes.
+ */
 class ObjectMapAttributeTestCase : public TestCase
 {
 public:
+  /**
+   * Constructor.
+   * \param description The TestCase description.
+   */
   ObjectMapAttributeTestCase (std::string description);
   virtual ~ObjectMapAttributeTestCase ()
   {}
@@ -1039,13 +1184,19 @@
   NS_TEST_ASSERT_MSG_EQ (map.GetN (), 2, "ObjectVectorValue \"TestMap1\" should be incremented");
 }
 
-// ===========================================================================
-// Trace sources with value semantics can be used like Attributes.  Make sure
-// we can use them that way.
-// ===========================================================================
+/**
+ * \ingroup attribute-tests
+ *  
+ * \brief Trace sources with value semantics can be used like Attributes, 
+ * make sure we can use them that way.
+ */
 class IntegerTraceSourceAttributeTestCase : public TestCase
 {
 public:
+  /**
+   * Constructor.
+   * \param description The TestCase description.
+   */
   IntegerTraceSourceAttributeTestCase (std::string description);
   virtual ~IntegerTraceSourceAttributeTestCase ()
   {}
@@ -1131,13 +1282,19 @@
   NS_TEST_ASSERT_MSG_EQ (ok, false, "Unexpectedly could SetAttributeFailSafe() via IntegerValue to -129");
 }
 
-// ===========================================================================
-// Trace sources used like Attributes must also work as trace sources.  Make
-// sure we can use them that way.
-// ===========================================================================
+/**
+ * \ingroup attribute-tests
+ *  
+ * \brief Trace sources used like Attributes must also work as trace sources, 
+ * make sure we can use them that way.
+ */
 class IntegerTraceSourceTestCase : public TestCase
 {
 public:
+  /**
+   * Constructor.
+   * \param description The TestCase description.
+   */
   IntegerTraceSourceTestCase (std::string description);
   virtual ~IntegerTraceSourceTestCase ()
   {}
@@ -1145,12 +1302,16 @@
 private:
   virtual void DoRun (void);
 
-  void NotifySource1 (int8_t old, int8_t n)
+  /**
+   * Notify the call of source 1.
+   * \param old First value.
+   * \param n Second value.
+   */
+  void NotifySource1 ([[maybe_unused]] int8_t old, int8_t n)
   {
-    NS_UNUSED (old);
     m_got1 = n;
   }
-  int64_t m_got1;
+  int64_t m_got1; //!< Value used to verify that source 1 was called.
 };
 
 IntegerTraceSourceTestCase::IntegerTraceSourceTestCase (std::string description)
@@ -1207,13 +1368,19 @@
   NS_TEST_ASSERT_MSG_EQ (m_got1, 0, "Hitting a TracedValue after disconnect still causes callback");
 }
 
-// ===========================================================================
-// Trace sources used like Attributes must also work as trace sources.  Make
-// sure we can use them that way.
-// ===========================================================================
+/**
+ * \ingroup attribute-tests
+ *  
+ * \brief Trace sources used like Attributes must also work as trace sources, 
+ * make sure we can use them that way.
+ */
 class TracedCallbackTestCase : public TestCase
 {
 public:
+  /**
+   * Constructor.
+   * \param description The TestCase description.
+   */
   TracedCallbackTestCase (std::string description);
   virtual ~TracedCallbackTestCase ()
   {}
@@ -1221,14 +1388,18 @@
 private:
   virtual void DoRun (void);
 
-  void NotifySource2 (double a, int b, float c)
+  /**
+   * Notify the call of source 2.
+   * \param a First value.
+   * \param b Second value.
+   * \param c Third value.
+   */
+  void NotifySource2 (double a, [[maybe_unused]] int b, [[maybe_unused]] float c)
   {
-    NS_UNUSED (b);
-    NS_UNUSED (c);
     m_got2 = a;
   }
 
-  double m_got2;
+  double m_got2; //!< Value used to verify that source 2 was called.
 };
 
 TracedCallbackTestCase::TracedCallbackTestCase (std::string description)
@@ -1286,13 +1457,19 @@
   NS_TEST_ASSERT_MSG_EQ (m_got2, 1.0, "Invoking disconnected TracedCallback unexpectedly results in trace callback");
 }
 
-// ===========================================================================
-// Smart pointers (Ptr) are central to our architecture, so they must work as
-// attributes.
-// ===========================================================================
+/**
+ * \ingroup attribute-tests
+ *  
+ * \brief Smart pointers (Ptr) are central to our architecture, so they 
+ * must work as attributes.
+ */
 class PointerAttributeTestCase : public TestCase
 {
 public:
+  /**
+   * Constructor.
+   * \param description The TestCase description.
+   */
   PointerAttributeTestCase (std::string description);
   virtual ~PointerAttributeTestCase ()
   {}
@@ -1300,14 +1477,18 @@
 private:
   virtual void DoRun (void);
 
-  void NotifySource2 (double a, int b, float c)
+  /**
+   * Notify the call of source 2.
+   * \param a First value.
+   * \param b Second value.
+   * \param c Third value.
+   */
+  void NotifySource2 (double a, [[maybe_unused]] int b, [[maybe_unused]] float c)
   {
-    NS_UNUSED (b);
-    NS_UNUSED (c);
     m_got2 = a;
   }
 
-  double m_got2;
+  double m_got2; //!< Value used to verify that source 2 was called.
 };
 
 PointerAttributeTestCase::PointerAttributeTestCase (std::string description)
@@ -1403,16 +1584,26 @@
   NS_TEST_ASSERT_MSG_NE (storedPtr4, storedPtr5, "aotPtr and aotPtr2 are unique, but their Derived member is not");
 }
 
-// ===========================================================================
-// Test the Attributes of type CallbackValue.
-// ===========================================================================
+/**
+ * \ingroup attribute-tests
+ *  
+ * \brief Test the Attributes of type CallbackValue.
+ */
 class CallbackValueTestCase : public TestCase
 {
 public:
+  /**
+   * Constructor.
+   * \param description The TestCase description.
+   */
   CallbackValueTestCase (std::string description);
   virtual ~CallbackValueTestCase ()
   {}
 
+  /**
+   * Function to invoke the callback.
+   * \param a The value.
+   */
   void InvokeCbValue (int8_t a)
   {
     if (!m_cbValue.IsNull ())
@@ -1424,14 +1615,18 @@
 private:
   virtual void DoRun (void);
 
-  Callback<void,int8_t> m_cbValue;
+  Callback<void,int8_t> m_cbValue; //!< The callback
 
+  /**
+   * Function invoked when the callback is fired.
+   * \param a The value.
+   */
   void NotifyCallbackValue (int8_t a)
   {
     m_gotCbValue = a;
   }
 
-  int16_t m_gotCbValue;
+  int16_t m_gotCbValue; //!< Value used to verify that source 2 was called.
 };
 
 CallbackValueTestCase::CallbackValueTestCase (std::string description)
@@ -1488,9 +1683,11 @@
   NS_TEST_ASSERT_MSG_EQ (m_gotCbValue, 2, "Callback Attribute set to null callback unexpectedly fired");
 }
 
-// ===========================================================================
-// The Test Suite that glues all of the Test Cases together.
-// ===========================================================================
+/**
+ * \ingroup attribute-tests
+ *  
+ * \brief The attributes Test Suite.
+ */
 class AttributesTestSuite : public TestSuite
 {
 public:
@@ -1516,4 +1713,4 @@
   AddTestCase (new TracedCallbackTestCase ("Ensure TracedCallback<double, int, float> works as trace source"), TestCase::QUICK);
 }
 
-static AttributesTestSuite attributesTestSuite;
+static AttributesTestSuite g_attributesTestSuite; //!< Static variable for test initialization
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/test/callback-test-suite.cc ns-3.36/src/core/test/callback-test-suite.cc
--- ns-3.35/src/core/test/callback-test-suite.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/test/callback-test-suite.cc	2022-04-30 18:23:57.802733200 -0700
@@ -18,14 +18,26 @@
 
 #include "ns3/test.h"
 #include "ns3/callback.h"
-#include "ns3/unused.h"
 #include <stdint.h>
 
 using namespace ns3;
 
-// ===========================================================================
-// Test the basic Callback mechanism
-// ===========================================================================
+/**
+ * \file
+ * \ingroup callback-tests
+ * Callback test suite
+ */
+
+/**
+ * \ingroup core-tests
+ * \defgroup callback-tests Callback tests
+ */
+
+/**
+ * \ingroup callback-tests
+ * 
+ * Test the basic Callback mechanism.
+ */
 class BasicCallbackTestCase : public TestCase
 {
 public:
@@ -33,24 +45,38 @@
   virtual ~BasicCallbackTestCase ()
   {}
 
+  /**
+   * Callback 1 target function.
+   */
   void Target1 (void)
   {
     m_test1 = true;
   }
+  /**
+   * Callback 2 target function.
+   * \return two.
+   */
   int Target2 (void)
   {
     m_test2 = true;
     return 2;
   }
-  void Target3 (double a)
+  /**
+   * Callback 3 target function.
+   * \param a A parameter (unused).
+   */
+  void Target3 ([[maybe_unused]] double a)
   {
-    NS_UNUSED (a);
     m_test3 = true;
   }
-  int Target4 (double a, int b)
+  /**
+   * Callback 4 target function.
+   * \param a A parameter (unused).
+   * \param b Another parameter (unused).
+   * \return four.
+   */
+  int Target4 ([[maybe_unused]] double a, [[maybe_unused]] int b)
   {
-    NS_UNUSED (a);
-    NS_UNUSED (b);
     m_test4 = true;
     return 4;
   }
@@ -59,28 +85,44 @@
   virtual void DoRun (void);
   virtual void DoSetup (void);
 
-  bool m_test1;
-  bool m_test2;
-  bool m_test3;
-  bool m_test4;
+  bool m_test1; //!< true if Target1 has been called, false otherwise.
+  bool m_test2; //!< true if Target2 has been called, false otherwise.
+  bool m_test3; //!< true if Target3 has been called, false otherwise.
+  bool m_test4; //!< true if Target4 has been called, false otherwise.
 };
 
+/**
+ * Variable to verify that a calback has been called.
+ * @{
+ */
 static bool gBasicCallbackTest5;
 static bool gBasicCallbackTest6;
 static bool gBasicCallbackTest7;
+/** @} */
 
+/**
+ * Callback 5 target function.
+ */
 void
 BasicCallbackTarget5 (void)
 {
   gBasicCallbackTest5 = true;
 }
 
+/**
+ * Callback 6 target function.
+ */
 void
 BasicCallbackTarget6 (int)
 {
   gBasicCallbackTest6 = true;
 }
 
+/**
+ * Callback 6 target function.
+ * \param a The value passed by the callback.
+ * \return the value of the calling function.
+ */
 int
 BasicCallbackTarget7 (int a)
 {
@@ -170,9 +212,11 @@
   NS_TEST_ASSERT_MSG_EQ (gBasicCallbackTest7, true, "Callback did not fire");
 }
 
-// ===========================================================================
-// Test the MakeCallback mechanism
-// ===========================================================================
+/**
+ * \ingroup callback-tests
+ * 
+ * Test the MakeCallback mechanism.
+ */
 class MakeCallbackTestCase : public TestCase
 {
 public:
@@ -180,24 +224,38 @@
   virtual ~MakeCallbackTestCase ()
   {}
 
+  /**
+   * Callback 1 target function.
+   */
   void Target1 (void)
   {
     m_test1 = true;
   }
+  /**
+   * Callback 2 target function.
+   * \return two.
+   */
   int Target2 (void)
   {
     m_test2 = true;
     return 2;
   }
-  void Target3 (double a)
+  /**
+   * Callback 3 target function.
+   * \param a A parameter (unused).
+   */
+  void Target3 ([[maybe_unused]] double a)
   {
-    NS_UNUSED (a);
     m_test3 = true;
   }
-  int Target4 (double a, int b)
+  /**
+   * Callback 4 target function.
+   * \param a A parameter (unused).
+   * \param b Another parameter (unused).
+   * \return four.
+   */
+  int Target4 ([[maybe_unused]] double a, [[maybe_unused]] int b)
   {
-    NS_UNUSED (a);
-    NS_UNUSED (b);
     m_test4 = true;
     return 4;
   }
@@ -206,28 +264,44 @@
   virtual void DoRun (void);
   virtual void DoSetup (void);
 
-  bool m_test1;
-  bool m_test2;
-  bool m_test3;
-  bool m_test4;
+  bool m_test1; //!< true if Target1 has been called, false otherwise.
+  bool m_test2; //!< true if Target2 has been called, false otherwise.
+  bool m_test3; //!< true if Target3 has been called, false otherwise.
+  bool m_test4; //!< true if Target4 has been called, false otherwise.
 };
 
+/**
+ * Variable to verify that a calback has been called.
+ * @{
+ */
 static bool gMakeCallbackTest5;
 static bool gMakeCallbackTest6;
 static bool gMakeCallbackTest7;
+/** @} */
 
+/**
+ * MakeCallback 5 target function.
+ */
 void
 MakeCallbackTarget5 (void)
 {
   gMakeCallbackTest5 = true;
 }
 
+/**
+ * MakeCallback 6 target function.
+ */
 void
 MakeCallbackTarget6 (int)
 {
   gMakeCallbackTest6 = true;
 }
 
+/**
+ * MakeCallback 7 target function.
+ * \param a The value passed by the callback.
+ * \return the value of the calling function.
+ */
 int
 MakeCallbackTarget7 (int a)
 {
@@ -317,9 +391,11 @@
   NS_TEST_ASSERT_MSG_EQ (gMakeCallbackTest7, true, "Callback did not fire");
 }
 
-// ===========================================================================
-// Test the MakeBoundCallback mechanism
-// ===========================================================================
+/**
+ * \ingroup callback-tests
+ * 
+ * Test the MakeBoundCallback mechanism.
+ */
 class MakeBoundCallbackTestCase : public TestCase
 {
 public:
@@ -332,6 +408,10 @@
   virtual void DoSetup (void);
 };
 
+/**
+ * Variable to verify that a calback has been called.
+ * @{
+ */
 static int gMakeBoundCallbackTest1;
 static bool *gMakeBoundCallbackTest2;
 static bool *gMakeBoundCallbackTest3a;
@@ -354,19 +434,36 @@
 static int gMakeBoundCallbackTest9b;
 static int gMakeBoundCallbackTest9c;
 static int gMakeBoundCallbackTest9d;
+/** @} */
 
+// Note: doxygen compounds don not work due to params / return variability.
+
+/**
+ * MakeBoundCallback 1 target function.
+ * \param a The value passed by the callback.
+ */
 void
 MakeBoundCallbackTarget1 (int a)
 {
   gMakeBoundCallbackTest1 = a;
 }
 
+/**
+ * MakeBoundCallback 2 target function.
+ * \param a The value passed by the callback.
+ */
 void
 MakeBoundCallbackTarget2 (bool *a)
 {
   gMakeBoundCallbackTest2 = a;
 }
 
+/**
+ * MakeBoundCallback 3 target function.
+ * \param a The value passed by the callback.
+ * \param b The value passed by the callback.
+ * \return the value 1234.
+ */
 int
 MakeBoundCallbackTarget3 (bool *a, int b)
 {
@@ -375,6 +472,11 @@
   return 1234;
 }
 
+/**
+ * MakeBoundCallback 4 target function.
+ * \param a The value passed by the callback.
+ * \param b The value passed by the callback.
+ */
 void
 MakeBoundCallbackTarget4 (int a, int b)
 {
@@ -382,6 +484,12 @@
   gMakeBoundCallbackTest4b = b;
 }
 
+/**
+ * MakeBoundCallback 5 target function.
+ * \param a The value passed by the callback.
+ * \param b The value passed by the callback.
+ * \return the value 1234.
+ */
 int
 MakeBoundCallbackTarget5 (int a, int b)
 {
@@ -390,6 +498,13 @@
   return 1234;
 }
 
+/**
+ * MakeBoundCallback 5 target function.
+ * \param a The value passed by the callback.
+ * \param b The value passed by the callback.
+ * \param c The value passed by the callback.
+ * \return the value 1234.
+ */
 int
 MakeBoundCallbackTarget6 (int a, int b, int c)
 {
@@ -399,6 +514,12 @@
   return 1234;
 }
 
+/**
+ * MakeBoundCallback 7 target function.
+ * \param a The value passed by the callback.
+ * \param b The value passed by the callback.
+ * \param c The value passed by the callback.
+ */
 void
 MakeBoundCallbackTarget7 (int a, int b, int c)
 {
@@ -407,6 +528,13 @@
   gMakeBoundCallbackTest7c = c;
 }
 
+/**
+ * MakeBoundCallback 8 target function.
+ * \param a The value passed by the callback.
+ * \param b The value passed by the callback.
+ * \param c The value passed by the callback.
+ * \return the value 1234.
+ */
 int
 MakeBoundCallbackTarget8 (int a, int b, int c)
 {
@@ -416,6 +544,14 @@
   return 1234;
 }
 
+/**
+ * MakeBoundCallback 5 target function.
+ * \param a The value passed by the callback.
+ * \param b The value passed by the callback.
+ * \param c The value passed by the callback.
+ * \param d The value passed by the callback.
+ * \return the value 1234.
+ */
 int
 MakeBoundCallbackTarget9 (int a, int b, int c, int d)
 {
@@ -545,9 +681,11 @@
   NS_TEST_ASSERT_MSG_EQ (gMakeBoundCallbackTest9d, 5678, "Callback did not fire or binding not correct");
 }
 
-// ===========================================================================
-// Test the Nullify mechanism
-// ===========================================================================
+/**
+ * \ingroup callback-tests
+ * 
+ * Test the Nullify mechanism.
+ */
 class NullifyCallbackTestCase : public TestCase
 {
 public:
@@ -555,6 +693,9 @@
   virtual ~NullifyCallbackTestCase ()
   {}
 
+  /**
+   * Callback 1 target function.
+   */
   void Target1 (void)
   {
     m_test1 = true;
@@ -564,7 +705,7 @@
   virtual void DoRun (void);
   virtual void DoSetup (void);
 
-  bool m_test1;
+  bool m_test1; //!< true if Target1 has been called, false otherwise.
 };
 
 NullifyCallbackTestCase::NullifyCallbackTestCase ()
@@ -595,10 +736,12 @@
   NS_TEST_ASSERT_MSG_EQ (target1.IsNull (), true, "Nullified Callback reports not IsNull()");
 }
 
-// ===========================================================================
-// Make sure that various MakeCallback template functions compile and execute.
-// Doesn't check an results of the execution.
-// ===========================================================================
+/**
+ * \ingroup callback-tests
+ * 
+ * Make sure that various MakeCallback template functions compile and execute;
+ * doesn't check an results of the execution.
+ */
 class MakeCallbackTemplatesTestCase : public TestCase
 {
 public:
@@ -606,6 +749,9 @@
   virtual ~MakeCallbackTemplatesTestCase ()
   {}
 
+  /**
+   * Callback 1 target function.
+   */
   void Target1 (void)
   {
     m_test1 = true;
@@ -614,10 +760,14 @@
 private:
   virtual void DoRun (void);
 
-  bool m_test1;
+  bool m_test1; //!< true if Target1 has been called, false otherwise.
 };
 
 /* *NS_CHECK_STYLE_OFF* */
+/**
+ * Test function - does nothing.
+ * @{
+ */
 void TestFZero (void) {}
 void TestFOne (int) {}
 void TestFTwo (int, int) {}
@@ -632,29 +782,50 @@
 void TestFRFour (int &, int &, int &, int &) {}
 void TestFRFive (int &, int &, int &, int &, int &) {}
 void TestFRSix (int &, int &, int &, int &, int &, int &) {}
+/** @} */
 /* *NS_CHECK_STYLE_ON* */
 
+/**
+ * \ingroup callback-tests
+ * 
+ * Class used to check the capability of callbacks to call 
+ * public, protected, and private functions.
+ */
 class CallbackTestParent
 {
 public:
+  /// A public function.
   void PublicParent (void)
   {}
 
 protected:
+  /// A protected function.
   void ProtectedParent (void)
   {}
+  /// A static protected function.
   static void StaticProtectedParent (void)
   {}
 
 private:
+  /// A private function.
   void PrivateParent (void)
   {}
 };
 
+/**
+ * \ingroup callback-tests
+ * 
+ * Derived class used to check the capability of callbacks to call 
+ * public, protected, and private functions.
+ */
 class CallbackTestClass : public CallbackTestParent
 {
 public:
   /* *NS_CHECK_STYLE_OFF* */
+  /**
+   * Test function - does nothing.
+   * @{
+   */
   void TestZero (void) {}
   void TestOne (int) {}
   void TestTwo (int, int) {}
@@ -669,8 +840,13 @@
   void TestCFour (int, int, int, int) const {}
   void TestCFive (int, int, int, int, int) const {}
   void TestCSix (int, int, int, int, int, int) const {}
+  /** @} */
   /* *NS_CHECK_STYLE_ON* */
 
+  /**
+   * Tries to make a callback to public and protected functions of a class.
+   * Private are not tested because, as expected, the compilation fails.
+   */
   void CheckParentalRights (void)
   {
     MakeCallback (&CallbackTestParent::StaticProtectedParent);
@@ -678,7 +854,10 @@
     MakeCallback (&CallbackTestClass::ProtectedParent, this);
     // as expected, fails.
     // MakeCallback (&CallbackTestParent::PrivateParent, this);
-    // unexpected, but fails too.  It does fumble me.
+    // as expected, fails.
+    // Pointers do not carry the access restriction info, so it is forbidden
+    // to generate a pointer to a parent's protected function, because
+    // this could lead to un-protect them, e.g., by making it public.
     // MakeCallback (&CallbackTestParent::ProtectedParent, this);
   }
 
@@ -739,9 +918,11 @@
   that.CheckParentalRights ();
 }
 
-// ===========================================================================
-// The Test Suite that glues all of the Test Cases together.
-// ===========================================================================
+/**
+ * \ingroup callback-tests
+ *  
+ * \brief The callback Test Suite.
+ */
 class CallbackTestSuite : public TestSuite
 {
 public:
@@ -758,4 +939,4 @@
   AddTestCase (new MakeCallbackTemplatesTestCase, TestCase::QUICK);
 }
 
-static CallbackTestSuite CallbackTestSuite;
+static CallbackTestSuite g_gallbackTestSuite; //!< Static variable for test initialization
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/test/config-test-suite.cc ns-3.36/src/core/test/config-test-suite.cc
--- ns-3.35/src/core/test/config-test-suite.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/test/config-test-suite.cc	2022-04-30 18:23:57.802733200 -0700
@@ -30,7 +30,6 @@
 #include "ns3/names.h"
 #include "ns3/pointer.h"
 #include "ns3/log.h"
-#include "ns3/unused.h"
 
 
 #include <sstream>
@@ -235,11 +234,6 @@
 
 private:
   int8_t m_x; //!< X attribute target.
-  /** Silence unused variable warning. */
-  void Increment (void)
-  {
-    m_x++;
-  }
 };
 
 TypeId
@@ -633,9 +627,8 @@
    * \param oldValue The old value.
    * \param newValue The new value.
    */
-  void Trace (int16_t oldValue, int16_t newValue)
+  void Trace ([[maybe_unused]] int16_t oldValue, int16_t newValue)
   {
-    NS_UNUSED (oldValue);
     m_newValue = newValue;
   }
   /**
@@ -644,9 +637,8 @@
    * \param old The old value.
    * \param newValue The new value.
    */
-  void TraceWithPath (std::string path, int16_t old, int16_t newValue)
+  void TraceWithPath (std::string path, [[maybe_unused]] int16_t old, int16_t newValue)
   {
-    NS_UNUSED (old);
     m_newValue = newValue;
     m_path = path;
   }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/test/core-example-simulator.reflog ns-3.36/src/core/test/core-example-simulator.reflog
--- ns-3.35/src/core/test/core-example-simulator.reflog	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/test/core-example-simulator.reflog	2022-04-30 18:23:57.802733200 -0700
@@ -1,3 +1,4 @@
 ExampleFunction received event at 10s
 RandomFunction received event at 18.1653s
 Member method received event at 20s started at 10s
+Code within a lambda expression at time +25s
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/test/examples-as-tests-test-suite.cc ns-3.36/src/core/test/examples-as-tests-test-suite.cc
--- ns-3.35/src/core/test/examples-as-tests-test-suite.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/test/examples-as-tests-test-suite.cc	2022-04-30 18:23:57.802733200 -0700
@@ -27,7 +27,6 @@
 
 /**
  * \file
- * \ingroup core-tests
  * \ingroup examples-as-tests
  * Examples-as-tests test suite
  */
@@ -59,7 +58,14 @@
    */
   virtual ~CommandLineExampleTestCase();
 
-  //Inherited function
+  /**
+  * Override this function to filter the version string from
+  * the command-line-example output.
+  * Since the version changes each time a commit is made it shouldn't
+  * be tested as part of the command-line-example output.
+  * 
+  * \returns The string of post-processing commands.
+  */
   virtual std::string GetPostProcessingCommand (void) const;
 };
 
@@ -72,12 +78,6 @@
 CommandLineExampleTestCase::~CommandLineExampleTestCase ()
 {}
 
-/**
- * Override this function to filter the version string from
- * the command-line-example output.
- * Since the version changes each time a commit is made it shouldn't
- * be tested as part of the command-line-example output
- */
 std::string
 CommandLineExampleTestCase::GetPostProcessingCommand (void) const
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/test/int64x64-test-suite.cc ns-3.36/src/core/test/int64x64-test-suite.cc
--- ns-3.35/src/core/test/int64x64-test-suite.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/test/int64x64-test-suite.cc	2022-04-30 18:23:57.802733200 -0700
@@ -21,7 +21,8 @@
 #include "ns3/test.h"
 #include "ns3/valgrind.h"  // Bug 1882
 
-#include <cmath>    // fabs
+#include <cfloat>   // FLT_RADIX,...
+#include <cmath>    // fabs, round
 #include <iomanip>
 #include <limits>   // numeric_limits<>::epsilon ()
 
@@ -34,27 +35,20 @@
 namespace test {
 
 /**
- * \class ns3::int64x64::Int64x64TestSuite
- * \internal
- *
- * Some of these tests are a little unusual for ns-3 in that they
- * are sensitive to implementation, specifically the resolution
- * of the double and long double implementations.
- *
- * To handle this, where needed we define a tolerance to use in the
- * test comparisons.  If you need to increase the tolerance,
- * please append the system and compiler version.  For example:
- *
- * \code
- *   // Darwin 12.5.0 (Mac 10.8.5) g++ 4.2.1
- *   tolerance = 1;
- *   // System Foo gcc 3.9
- *   tolerance = 3;
- * \endcode
+ * \file
+ * \ingroup int64x64-tests
+ * int64x46 test suite
+ */
+
+/**
+ * \ingroup core-tests
+ * \defgroup int64x64-tests int64x64 tests
  */
 
 
 /**
+ * \ingroup int64x64-tests
+ * 
  * Pretty printer for test cases.
  */
 class Printer
@@ -117,12 +111,21 @@
   return os;
 }
 
-
+/**
+ * \ingroup int64x64-tests
+ * 
+ * Test: manipulate the high and low part of every number.
+ */
 class Int64x64HiLoTestCase : public TestCase
 {
 public:
   Int64x64HiLoTestCase ();
   virtual void DoRun (void);
+  /**
+   * Check the high and low parts for correctness.
+   * \param hi The high part of the int64x64_t.
+   * \param lo The low part of the int64x64_t.
+   */
   void Check (const int64_t hi, const uint64_t lo);
 };
 
@@ -187,11 +190,22 @@
 }
 
 
+/**
+ * \ingroup int64x64-tests
+ * 
+ * Test: check GetInt and Round.
+ */
 class Int64x64IntRoundTestCase : public TestCase
 {
 public:
   Int64x64IntRoundTestCase (void);
   virtual void DoRun (void);
+  /**
+   * Check the int64x64 value for correctness.
+   * \param value The int64x64_t value.
+   * \param expectInt The expected integer value.
+   * \param expectRnd TThe expected rounding value.
+   */
   void Check (const int64x64_t value,
               const int64_t expectInt,
               const int64_t expectRnd);
@@ -249,11 +263,23 @@
 }
 
 
+/**
+ * \ingroup int64x64-tests
+ * 
+ * Test: parse int64x64_t numbers as strings.
+ */
 class Int64x64InputTestCase : public TestCase
 {
 public:
   Int64x64InputTestCase ();
   virtual void DoRun (void);
+  /**
+   * Check the iont64x64 for correctness.
+   * \param str String representation of a number.
+   * \param hi The expected high part of the int64x64_t.
+   * \param lo The expected low part of the int64x64_t.
+   * \param tolerance The allowed tolerance.
+   */
   void Check (const std::string & str,
               const int64_t hi, const uint64_t lo,
               const int64_t tolerance = 0);
@@ -323,11 +349,23 @@
 }
 
 
+/**
+ * \ingroup int64x64-tests
+ * 
+ * Test: roundtrip int64x64_t numbers as strings.
+ * 
+ * Prints an int64x64_t and read it back.
+ */
 class Int64x64InputOutputTestCase : public TestCase
 {
 public:
   Int64x64InputOutputTestCase ();
   virtual void DoRun (void);
+  /**
+   * Check the iont64x64 for correctness.
+   * \param str String representation of a number.
+   * \param tolerance The allowed tolerance.
+   */
   void Check (const std::string & str,
               const int64_t tolerance = 0);
 };
@@ -404,16 +442,26 @@
 }
 
 
+/**
+ * \ingroup int64x64-tests
+ * 
+ * Test: basic arithmetic operations.
+ */
 class Int64x64ArithmeticTestCase : public TestCase
 {
 public:
   Int64x64ArithmeticTestCase ();
   virtual void DoRun (void);
-  void Check (const int        test,
-              const int64x64_t value, const int64x64_t expect);
+  /**
+   * Check the int64x64 for correctness.
+   * \param test The test number.
+   * \param value The actual value.
+   * \param expect The expected value.
+   * \param tolerance The allowed tolerance.
+   */
   void Check (const int        test,
               const int64x64_t value, const int64x64_t expect,
-              const int64x64_t tolerance);
+              const int64x64_t tolerance = int64x64_t (0,0));
 };
 
 Int64x64ArithmeticTestCase::Int64x64ArithmeticTestCase ()
@@ -422,14 +470,6 @@
 void
 Int64x64ArithmeticTestCase::Check (const int test,
                                    const int64x64_t value,
-                                   const int64x64_t expect)
-{
-  int64x64_t zero (0,0);
-  Check (test, value, expect, zero);
-}
-void
-Int64x64ArithmeticTestCase::Check (const int test,
-                                   const int64x64_t value,
                                    const int64x64_t expect,
                                    const int64x64_t tolerance)
 {
@@ -547,6 +587,10 @@
 
 
 /**
+ * \ingroup int64x64-tests
+ * 
+ * Test case for bug 455.
+ * 
  * See \bugid{455}
  */
 class Int64x64Bug455TestCase : public TestCase
@@ -554,6 +598,12 @@
 public:
   Int64x64Bug455TestCase ();
   virtual void DoRun (void);
+  /**
+   * Check the int64x64 for correctness.
+   * \param result The actual value.
+   * \param expect The expected value.
+   * \param msg The error message to print.
+   */
   void Check (const double result, const double expect,
               const std::string & msg);
 };
@@ -608,6 +658,10 @@
 
 
 /**
+ * \ingroup int64x64-tests
+ * 
+ * Test case for bug 455.
+ * 
  * See \bugid{863}
  */
 class Int64x64Bug863TestCase : public TestCase
@@ -615,6 +669,12 @@
 public:
   Int64x64Bug863TestCase ();
   virtual void DoRun (void);
+  /**
+   * Check the int64x64 for correctness.
+   * \param result The actual value.
+   * \param expect The expected value.
+   * \param msg The error message to print.
+   */
   void Check (const double result, const double expect,
               const std::string & msg);
 };
@@ -670,6 +730,10 @@
 
 
 /**
+ * \ingroup int64x64-tests
+ * 
+ * Test case for bug 455.
+ * 
  * See \bugid{1786}
  */
 class Int64x64Bug1786TestCase : public TestCase
@@ -677,6 +741,12 @@
 public:
   Int64x64Bug1786TestCase ();
   virtual void DoRun (void);
+  /**
+   * Check the int64x64 for correctness.
+   * \param low The actual low value.
+   * \param value The expected low part printed value.
+   * \param tolerance The allowed tolerance.
+   */
   void Check (const uint64_t low, const std::string & value,
               const int64_t tolerance = 0);
 };
@@ -804,12 +874,23 @@
 }
 
 
+/**
+ * \ingroup int64x64-tests
+ * 
+ * Test: basic compare operations.
+ */
 class Int64x64CompareTestCase : public TestCase
 {
 public:
   Int64x64CompareTestCase ();
   virtual void DoRun (void);
 
+  /**
+   * Check the int64x64 for correctness.
+   * \param result The actual value.
+   * \param expect The expected value.
+   * \param msg The error mesage to print.
+   */
   void Check (const bool result, const bool expect,
               const std::string & msg);
 };
@@ -909,12 +990,29 @@
 }
 
 
+/**
+ * \ingroup int64x64-tests
+ * 
+ * Test: Invert and MulByInvert.
+ */
 class Int64x64InvertTestCase : public TestCase
 {
 public:
   Int64x64InvertTestCase ();
   virtual void DoRun (void);
+  /**
+   * Check the int64x64 for correctness.
+   * \param factor The factor used to invert the number.
+   */
   void Check (const int64_t factor);
+  /**
+   * Check the int64x64 for correctness.
+   * \param factor The factor used to invert the number.
+   * \param result The value.
+   * \param expect The expected value.
+   * \param msg The error mesage to print.
+   * \param tolerance The allowed tolerance.
+   */
   void CheckCase (const uint64_t factor,
                   const int64x64_t result, const int64x64_t expect,
                   const std::string & msg,
@@ -1017,41 +1115,183 @@
 }
 
 
+/**
+ * \ingroup int64x64-tests
+ * 
+ * Test: construct from floating point.
+ */
 class Int64x64DoubleTestCase : public TestCase
 {
 public:
   Int64x64DoubleTestCase ();
   virtual void DoRun (void);
+
+  /**
+   * Check the int64x64 for correctness.
+   * \param intPart The expected integer part value of the int64x64.
+   */
   void Check (const int64_t intPart);
-  void Check (const long double value,
+  /**
+   * Check the int64x64 for correctness.
+   * \param dec The integer part of the value to test.
+   * \param frac The fractional part of the value to test.x
+   * \param intPart The expected integer part value of the int64x64.
+   * \param lo The expected low part value of the int64x64.
+   */
+  void Check (const long double dec,
+              const long double frac,
               const int64_t intPart,
               const uint64_t lo);
 
 private:
-  long double m_last;
-  int64x64_t  m_deltaMax;
-  int         m_deltaCount;
+
+  /**
+   * Compute a multiplier to match the mantissa size on this platform
+   *
+   * Since we will store the fractional part of a double
+   * in the low word (64 bits) of our Q64.64
+   * the most mantissa bits we can take advantage of is
+   *
+   *     EFF_MANT_DIG = std::min (64, LDBL_MANT_DIG)
+   *
+   * We have to bound this for platforms with LDBL_MANT_DIG > 64.
+   *
+   * The number of "missing" bits in the mantissa is
+   *
+   *     MISS_MANT_DIG = 64 - EFF_MANT_DIG = std::max (0, 64 - LDBL_MANT_DIG)
+   *
+   * This will lie in the closed interval [0, 64]
+   */
+  static constexpr int MISS_MANT_DIG = std::max (0, 64 - LDBL_MANT_DIG);
+
+  /**
+   * The smallest low word we expect to get from a conversion.
+   *
+   *     MIN_LOW = 2^MISS_MANT_DIG
+   *
+   * which will be in [1, 2^64].
+   */
+  static constexpr long double MIN_LOW = 1 << MISS_MANT_DIG;
+
+  /**
+   * Smallest mantissa we expect to convert to a non-zero low word.
+   *
+   *     MIN_MANT = MIN_LOW / 2^64
+   *              = 2^(MISS_MANT_DIG - 64)
+   *              = 2^(-EFF_MANT_DIG)
+   *
+   * We scale and round this value to match the
+   * hard-coded fractional values in Check(intPart)
+   * which have 22 decimal digits.
+   * 
+   * Since we use std::round() which isn't constexpr,
+   * just declare this const and initialize below.
+   */
+  static const long double MIN_MANT;
+
+
+  // Member variables
+  long double m_last;       //!< The last value tested.
+  int64x64_t  m_deltaMax;   //!< The maximum observed difference between expected and computed values.
+  int         m_deltaCount; //!< The number of times a delta was recorded.
 };
 
+
+/* static */
+const long double
+Int64x64DoubleTestCase::MIN_MANT =
+  std::round ( 1e22 / std::pow (2.0L, std::min (64, LDBL_MANT_DIG))) / 1e22;
+
 Int64x64DoubleTestCase::Int64x64DoubleTestCase ()
-  : TestCase ("Construct from floating point.")
+  : TestCase ("Construct from floating point."),
+    m_last {0},
+    m_deltaMax {0},
+    m_deltaCount {0}
 {}
 
 void
-Int64x64DoubleTestCase::Check (const long double value,
+Int64x64DoubleTestCase::Check (const long double dec,
+                               const long double frac,
                                const int64_t intPart,
                                const uint64_t lo)
 {
-  // Construct the expected value
-  int64x64_t expect = int64x64_t (0, lo);
-  expect += intPart;
+  // 1.  The double value we're going to convert
+  long double value = dec + frac;
+
+  // 2.  The expected value of the conversion
+  int64x64_t expect (intPart, lo);
+
+  // 1a, 2a.  Handle lower-precision architectures by scaling up the fractional part
+  // We assume MISS_MANT_DIG is much less than 64, MIN_MANT much less than 0.5
+  // Could check lo < MIN_LOW instead...
+
+  /*
+    This approach works for real values with mantissa very near zero,
+    but isn't ideal.  For values near 0.5, say, the low order bits
+    are completely lost, since they exceed the precision of the 
+    double representation.  This shows up on M1 and ARM architectures
+    as the x.5... values all skipped, because they are indistinguishable 
+    from x.5 exactly.
+
+    A more involved alternative would be to separate the
+    "frac" and "low" values in the caller.  Then the underflow
+    rescaling could be applied to the low bits only, 
+    before adding to the frac part.
+    
+    To do this the signature of this function would have to be
+       Check (cld dec, cld frac, int64_t intPart, int64_t low);
+                                                  ^- Note this signed
+    The caller Check (intPart) would look like
+
+      Check (v, 0.0L, intPart,  0x0LL);
+      Check (v, 0.0L, intPart,  0x1LL);
+      Check (v, 0.0L, intPart,  0x2LL);
+      ...
+      Check (v, 0.5L, intPart, -0xFLL);
+      Check (v, 0.5L, intPart, -0xELL);
+      ...
+      Check (v, 0.5L, intPart,  0x0LL);
+      Check (v, 0.5L, intPart,  0x1LL);
+
+    Here we would construct value as
+      long double lowLd = (double)low / std::pow(2.0L, 64);
+      value = dec + frac + lowLd;
+
+    For underflow cases:
+      value = dec + frac + std::max::(lowLd, MIN_MANT);
+  */
 
-  // Actual value of conversion from double
+
+  bool under = false;
+  if (frac && (frac < MIN_MANT))
+    {
+      under = true;
+      value = dec + std::max(frac * MIN_LOW, MIN_MANT);
+      expect = int64x64_t (intPart, lo * MIN_LOW);
+    }
+
+  // 3.  The actual value of the conversion
   const int64x64_t result = int64x64_t (value);
 
-  // Make tolerance depend on magnitude of value
+  // 4.  Absolute error in the conversion
+  const int64x64_t delta = Abs (result - expect);
+
+  // Mark repeats (no change in input floating value) as "skip" (but not integers)
+  const bool skip = (frac && (value == m_last));
+  // Save the value to detect unchanged values next time
+  m_last = value;
+
+  // 5.  Tolerance for the test, scaled to the magnitude of value
+  // Tolerance will be computed from the value, epsilon and margin
+  int64x64_t tolerance;
+
+  // Default epsilon
   long double epsilon = std::numeric_limits<long double>::epsilon ();
+
+  // A few cases need extra tolerance
+  // If you add cases please thoroughly document the configuration
   long double margin = 0;
+
   if (int64x64_t::implementation == int64x64_t::ld_impl)
     {
       // Darwin 12.5.0 (Mac 10.8.5) g++ 4.2.1
@@ -1066,12 +1306,14 @@
       epsilon = std::numeric_limits<double>::epsilon ();
     }
 
-  const int64x64_t tolerance = (margin + std::fabs (value)) * epsilon;
+  // Final tolerance amount
+  tolerance = std::max (1.0L, std::fabs (value)) * epsilon  +  margin * epsilon;
 
-  const int64x64_t delta = Abs (result - expect);
-  const bool skip = value == m_last;
+  // 6.  Is the conversion acceptably close to the expected value?
   const bool pass = delta <= tolerance;
 
+  // 7.  Show the result of this check
+
   // Save stream format flags
   std::ios_base::fmtflags ff = std::cout.flags ();
   std::cout << std::fixed << std::setprecision (22);
@@ -1080,11 +1322,12 @@
             << (skip ? "skip " : (pass ? "pass " : "FAIL "))
             << std::showpos << value << " == "
             << Printer (result)
+            << (under ? " (underflow)" : "")
             << std::endl;
 
-  // Log non-zero delta
-  if ( delta > int64x64_t () )
+  if ( delta )
     {
+      // There was a difference, show the expected value
       std::cout << GetParent ()->GetName ()
                 << std::left  << std::setw (43) << "         expected"
                 << std::right << Printer (expect)
@@ -1092,6 +1335,7 @@
 
       if (delta == tolerance)
         {
+          // Short form: show the delta, and note it equals the tolerance
           std::cout << GetParent ()->GetName ()
                     << std::left  << std::setw (43) << "         delta = tolerance"
                     << std::right << Printer (delta)
@@ -1099,16 +1343,19 @@
         }
       else
         {
+          // Long form, show both delta and tolerance
           std::cout << GetParent ()->GetName ()
                     << std::left  << std::setw (43) << "         delta"
                     << std::right << Printer (delta)
                     << std::endl;
           std::cout << GetParent ()->GetName ()
-                    << std::left  << std::setw (43) << "         +/-"
+                    << std::left  << std::setw (43) << "         tolerance"
                     << std::right << Printer (tolerance)
+                    << " eps: " << epsilon << ", margin: " << margin
                     << std::endl;
         }
 
+      // Record number and max delta
       ++m_deltaCount;
 
       if ( delta > m_deltaMax )
@@ -1117,9 +1364,9 @@
         }
     }
 
+  // Report pass/fail
   NS_TEST_ASSERT_MSG_EQ_TOL (result, expect, tolerance,
                              "int64x64_t (long double) failed");
-  m_last = value;
   std::cout.flags (ff);
 
 }
@@ -1131,78 +1378,121 @@
   std::cout << GetParent ()->GetName () << " Double: "
             << "integer: " << intPart
             << std::endl;
-  m_last = static_cast<long double> (intPart);
+  // Reset last value for new intPart
+  m_last = intPart;
+  // Save current number and max delta, so we can report max from just this intPart
+  int64x64_t  deltaMaxPrior = m_deltaMax;
+  m_deltaMax = 0;
+  int deltaCountPrior = m_deltaCount;
   m_deltaCount = 0;
 
   // Nudging the integer part eliminates deltas around 0
-  long double v = static_cast<long double> (intPart);
+  long double v = intPart;
 
-  Check (v + 0.0000000000000000000542L, intPart,                0x1ULL);
-  Check (v + 0.0000000000000000001084L, intPart,                0x2ULL);
-  Check (v + 0.0000000000000000001626L, intPart,                0x3ULL);
-  Check (v + 0.0000000000000000002168L, intPart,                0x4ULL);
-  Check (v + 0.0000000000000000002710L, intPart,                0x5ULL);
-  Check (v + 0.0000000000000000003253L, intPart,                0x6ULL);
-  Check (v + 0.0000000000000000003795L, intPart,                0x7ULL);
-  Check (v + 0.0000000000000000004337L, intPart,                0x8ULL);
-  Check (v + 0.0000000000000000004879L, intPart,                0x9ULL);
-  Check (v + 0.0000000000000000005421L, intPart,                0xAULL);
-  Check (v + 0.0000000000000000008132L, intPart,                0xFULL);
-  Check (v + 0.0000000000000000130104L, intPart,               0xF0ULL);
-  Check (v + 0.0000000000000002081668L, intPart,              0xF00ULL);
-  Check (v + 0.0000000000000033306691L, intPart,             0xF000ULL);
-  Check (v + 0.0000000000000532907052L, intPart,            0xF0000ULL);
-  Check (v + 0.0000000000008526512829L, intPart,           0xF00000ULL);
-  Check (v + 0.0000000000136424205266L, intPart,          0xF000000ULL);
-  Check (v + 0.0000000002182787284255L, intPart,         0xF0000000ULL);
-  Check (v + 0.0000000034924596548080L, intPart,        0xF00000000ULL);
-  Check (v + 0.0000000558793544769287L, intPart,       0xF000000000ULL);
-  Check (v + 0.0000008940696716308594L, intPart,      0xF0000000000ULL);
-  Check (v + 0.0000143051147460937500L, intPart,     0xF00000000000ULL);
-  Check (v + 0.0002288818359375000000L, intPart,    0xF000000000000ULL);
-  Check (v + 0.0036621093750000000000L, intPart,   0xF0000000000000ULL);
-  Check (v + 0.0585937500000000000000L, intPart,  0xF00000000000000ULL);
-  std::cout << std::endl;
-  Check (v + 0.4999999999999999998374L, intPart, 0x7FFFFFFFFFFFFFFDULL);
-  Check (v + 0.4999999999999999998916L, intPart, 0x7FFFFFFFFFFFFFFEULL);
-  Check (v + 0.4999999999999999999458L, intPart, 0x7FFFFFFFFFFFFFFFULL);
-  Check (v + 0.5000000000000000000000L, intPart, 0x8000000000000000ULL);
-  Check (v + 0.5000000000000000000542L, intPart, 0x8000000000000001ULL);
-  Check (v + 0.5000000000000000001084L, intPart, 0x8000000000000002ULL);
-  Check (v + 0.5000000000000000001626L, intPart, 0x8000000000000003ULL);
-  std::cout << std::endl;
-  Check (v + 0.9375000000000000000000L, intPart, 0xF000000000000000ULL);
-  Check (v + 0.9960937500000000000000L, intPart, 0xFF00000000000000ULL);
-  Check (v + 0.9997558593750000000000L, intPart, 0xFFF0000000000000ULL);
-  Check (v + 0.9999847412109375000000L, intPart, 0xFFFF000000000000ULL);
-  Check (v + 0.9999990463256835937500L, intPart, 0xFFFFF00000000000ULL);
-  Check (v + 0.9999999403953552246094L, intPart, 0xFFFFFF0000000000ULL);
-  Check (v + 0.9999999962747097015381L, intPart, 0xFFFFFFF000000000ULL);
-  Check (v + 0.9999999997671693563461L, intPart, 0xFFFFFFFF00000000ULL);
-  Check (v + 0.9999999999854480847716L, intPart, 0xFFFFFFFFF0000000ULL);
-  Check (v + 0.9999999999990905052982L, intPart, 0xFFFFFFFFFF000000ULL);
-  Check (v + 0.9999999999999431565811L, intPart, 0xFFFFFFFFFFF00000ULL);
-  Check (v + 0.9999999999999964472863L, intPart, 0xFFFFFFFFFFFF0000ULL);
-  Check (v + 0.9999999999999997779554L, intPart, 0xFFFFFFFFFFFFF000ULL);
-  Check (v + 0.9999999999999999861222L, intPart, 0xFFFFFFFFFFFFFF00ULL);
-  Check (v + 0.9999999999999999991326L, intPart, 0xFFFFFFFFFFFFFFF0ULL);
-  Check (v + 0.9999999999999999994037L, intPart, 0xFFFFFFFFFFFFFFF5ULL);
-  Check (v + 0.9999999999999999994579L, intPart, 0xFFFFFFFFFFFFFFF6ULL);
-  Check (v + 0.9999999999999999995121L, intPart, 0xFFFFFFFFFFFFFFF7ULL);
-  Check (v + 0.9999999999999999995663L, intPart, 0xFFFFFFFFFFFFFFF8ULL);
-  Check (v + 0.9999999999999999996205L, intPart, 0xFFFFFFFFFFFFFFF9ULL);
-  Check (v + 0.9999999999999999996747L, intPart, 0xFFFFFFFFFFFFFFFAULL);
-  Check (v + 0.9999999999999999997289L, intPart, 0xFFFFFFFFFFFFFFFBULL);
-  Check (v + 0.9999999999999999997832L, intPart, 0xFFFFFFFFFFFFFFFCULL);
-  Check (v + 0.9999999999999999998374L, intPart, 0xFFFFFFFFFFFFFFFDULL);
-  Check (v + 0.9999999999999999998916L, intPart, 0xFFFFFFFFFFFFFFFEULL);
-  Check (v + 0.9999999999999999999458L, intPart, 0xFFFFFFFFFFFFFFFFULL);
+  Check (v, 0.0L,                      intPart,                0x0ULL);
+  Check (v, 0.0000000000000000000542L, intPart,                0x1ULL);
+  Check (v, 0.0000000000000000001084L, intPart,                0x2ULL);
+  Check (v, 0.0000000000000000001626L, intPart,                0x3ULL);
+  Check (v, 0.0000000000000000002168L, intPart,                0x4ULL);
+  Check (v, 0.0000000000000000002711L, intPart,                0x5ULL);
+  Check (v, 0.0000000000000000003253L, intPart,                0x6ULL);
+  Check (v, 0.0000000000000000003795L, intPart,                0x7ULL);
+  Check (v, 0.0000000000000000004337L, intPart,                0x8ULL);
+  Check (v, 0.0000000000000000004879L, intPart,                0x9ULL);
+  Check (v, 0.0000000000000000005421L, intPart,                0xAULL);
+  Check (v, 0.0000000000000000005963L, intPart,                0xBULL);
+  Check (v, 0.0000000000000000006505L, intPart,                0xCULL);
+  Check (v, 0.0000000000000000007047L, intPart,                0xDULL);
+  Check (v, 0.0000000000000000007589L, intPart,                0xEULL);
+  Check (v, 0.0000000000000000008132L, intPart,                0xFULL);
+  Check (v, 0.0000000000000000130104L, intPart,               0xF0ULL);
+  Check (v, 0.0000000000000002081668L, intPart,              0xF00ULL);
+  Check (v, 0.0000000000000033306691L, intPart,             0xF000ULL);
+  Check (v, 0.0000000000000532907052L, intPart,            0xF0000ULL);
+  Check (v, 0.0000000000008526512829L, intPart,           0xF00000ULL);
+  Check (v, 0.0000000000136424205266L, intPart,          0xF000000ULL);
+  Check (v, 0.0000000002182787284255L, intPart,         0xF0000000ULL);
+  Check (v, 0.0000000034924596548080L, intPart,        0xF00000000ULL);
+  Check (v, 0.0000000558793544769287L, intPart,       0xF000000000ULL);
+  Check (v, 0.0000008940696716308594L, intPart,      0xF0000000000ULL);
+  Check (v, 0.0000143051147460937500L, intPart,     0xF00000000000ULL);
+  Check (v, 0.0002288818359375000000L, intPart,    0xF000000000000ULL);
+  Check (v, 0.0036621093750000000000L, intPart,   0xF0000000000000ULL);
+  Check (v, 0.0585937500000000000000L, intPart,  0xF00000000000000ULL);
+  std::cout << std::endl;
+  Check (v, 0.4999999999999999991326L, intPart, 0x7FFFFFFFFFFFFFF0ULL);
+  Check (v, 0.4999999999999999991868L, intPart, 0x7FFFFFFFFFFFFFF1ULL);
+  Check (v, 0.4999999999999999992411L, intPart, 0x7FFFFFFFFFFFFFF2ULL);
+  Check (v, 0.4999999999999999992953L, intPart, 0x7FFFFFFFFFFFFFF3ULL);
+  Check (v, 0.4999999999999999993495L, intPart, 0x7FFFFFFFFFFFFFF4ULL);
+  Check (v, 0.4999999999999999994037L, intPart, 0x7FFFFFFFFFFFFFF5ULL);
+  Check (v, 0.4999999999999999994579L, intPart, 0x7FFFFFFFFFFFFFF6ULL);
+  Check (v, 0.4999999999999999995121L, intPart, 0x7FFFFFFFFFFFFFF7ULL);
+  Check (v, 0.4999999999999999995663L, intPart, 0x7FFFFFFFFFFFFFF8ULL);
+  Check (v, 0.4999999999999999996205L, intPart, 0x7FFFFFFFFFFFFFF9ULL);
+  Check (v, 0.4999999999999999996747L, intPart, 0x7FFFFFFFFFFFFFFAULL);
+  Check (v, 0.4999999999999999997289L, intPart, 0x7FFFFFFFFFFFFFFBULL);
+  Check (v, 0.4999999999999999997832L, intPart, 0x7FFFFFFFFFFFFFFCULL);
+  Check (v, 0.4999999999999999998374L, intPart, 0x7FFFFFFFFFFFFFFDULL);
+  Check (v, 0.4999999999999999998916L, intPart, 0x7FFFFFFFFFFFFFFEULL);
+  Check (v, 0.4999999999999999999458L, intPart, 0x7FFFFFFFFFFFFFFFULL);
+  Check (v, 0.5000000000000000000000L, intPart, 0x8000000000000000ULL);
+  Check (v, 0.5000000000000000000542L, intPart, 0x8000000000000001ULL);
+  Check (v, 0.5000000000000000001084L, intPart, 0x8000000000000002ULL);
+  Check (v, 0.5000000000000000001626L, intPart, 0x8000000000000003ULL);
+  Check (v, 0.5000000000000000002168L, intPart, 0x8000000000000004ULL);
+  Check (v, 0.5000000000000000002711L, intPart, 0x8000000000000005ULL);
+  Check (v, 0.5000000000000000003253L, intPart, 0x8000000000000006ULL);
+  Check (v, 0.5000000000000000003795L, intPart, 0x8000000000000007ULL);
+  Check (v, 0.5000000000000000004337L, intPart, 0x8000000000000008ULL);
+  Check (v, 0.5000000000000000004879L, intPart, 0x8000000000000009ULL);
+  Check (v, 0.5000000000000000005421L, intPart, 0x800000000000000AULL);
+  Check (v, 0.5000000000000000005963L, intPart, 0x800000000000000BULL);
+  Check (v, 0.5000000000000000006505L, intPart, 0x800000000000000CULL);
+  Check (v, 0.5000000000000000007047L, intPart, 0x800000000000000DULL);
+  Check (v, 0.5000000000000000007589L, intPart, 0x800000000000000EULL);
+  Check (v, 0.5000000000000000008132L, intPart, 0x800000000000000FULL);
+  std::cout << std::endl;
+  Check (v, 0.9375000000000000000000L, intPart, 0xF000000000000000ULL);
+  Check (v, 0.9960937500000000000000L, intPart, 0xFF00000000000000ULL);
+  Check (v, 0.9997558593750000000000L, intPart, 0xFFF0000000000000ULL);
+  Check (v, 0.9999847412109375000000L, intPart, 0xFFFF000000000000ULL);
+  Check (v, 0.9999990463256835937500L, intPart, 0xFFFFF00000000000ULL);
+  Check (v, 0.9999999403953552246094L, intPart, 0xFFFFFF0000000000ULL);
+  Check (v, 0.9999999962747097015381L, intPart, 0xFFFFFFF000000000ULL);
+  Check (v, 0.9999999997671693563461L, intPart, 0xFFFFFFFF00000000ULL);
+  Check (v, 0.9999999999854480847716L, intPart, 0xFFFFFFFFF0000000ULL);
+  Check (v, 0.9999999999990905052982L, intPart, 0xFFFFFFFFFF000000ULL);
+  Check (v, 0.9999999999999431565811L, intPart, 0xFFFFFFFFFFF00000ULL);
+  Check (v, 0.9999999999999964472863L, intPart, 0xFFFFFFFFFFFF0000ULL);
+  Check (v, 0.9999999999999997779554L, intPart, 0xFFFFFFFFFFFFF000ULL);
+  Check (v, 0.9999999999999999861222L, intPart, 0xFFFFFFFFFFFFFF00ULL);
+  Check (v, 0.9999999999999999991326L, intPart, 0xFFFFFFFFFFFFFFF0ULL);
+  Check (v, 0.9999999999999999991868L, intPart, 0xFFFFFFFFFFFFFFF1ULL);
+  Check (v, 0.9999999999999999992411L, intPart, 0xFFFFFFFFFFFFFFF2ULL);
+  Check (v, 0.9999999999999999992943L, intPart, 0xFFFFFFFFFFFFFFF3ULL);
+  Check (v, 0.9999999999999999993495L, intPart, 0xFFFFFFFFFFFFFFF4ULL);
+  Check (v, 0.9999999999999999994037L, intPart, 0xFFFFFFFFFFFFFFF5ULL);
+  Check (v, 0.9999999999999999994579L, intPart, 0xFFFFFFFFFFFFFFF6ULL);
+  Check (v, 0.9999999999999999995121L, intPart, 0xFFFFFFFFFFFFFFF7ULL);
+  Check (v, 0.9999999999999999995663L, intPart, 0xFFFFFFFFFFFFFFF8ULL);
+  Check (v, 0.9999999999999999996205L, intPart, 0xFFFFFFFFFFFFFFF9ULL);
+  Check (v, 0.9999999999999999996747L, intPart, 0xFFFFFFFFFFFFFFFAULL);
+  Check (v, 0.9999999999999999997289L, intPart, 0xFFFFFFFFFFFFFFFBULL);
+  Check (v, 0.9999999999999999997832L, intPart, 0xFFFFFFFFFFFFFFFCULL);
+  Check (v, 0.9999999999999999998374L, intPart, 0xFFFFFFFFFFFFFFFDULL);
+  Check (v, 0.9999999999999999998916L, intPart, 0xFFFFFFFFFFFFFFFEULL);
+  Check (v, 0.9999999999999999999458L, intPart, 0xFFFFFFFFFFFFFFFFULL);
 
   std::cout << GetParent ()->GetName () << " Double: "
-            << "integer: " << intPart
-            << ": delta count: " << m_deltaCount
-            << ", max: " << Printer (m_deltaMax)
+            << "integer:"  << std::setw (4) << intPart
+            << ": deltas:" << std::setw (4) << m_deltaCount
+            << ", max:   " << Printer (m_deltaMax)
             << std::endl;
+
+  // Add the count, max from this intPart to the grand totals
+  m_deltaCount += deltaCountPrior;
+  m_deltaMax = Max (m_deltaMax, deltaMaxPrior);
 }
 
 void
@@ -1214,13 +1504,18 @@
 
   // Save stream format flags
   std::ios_base::fmtflags ff = std::cout.flags ();
-  std::cout << std::scientific << std::setprecision (21);
-
-  m_deltaMax = int64x64_t ();
 
   std::cout << GetParent ()->GetName () << " Double: "
+            <<                    "FLT_RADIX:     " << FLT_RADIX
+            << "\n                 LDBL_MANT_DIG: " << LDBL_MANT_DIG
+            << "\n                 MISS_MANT_DIG: " << MISS_MANT_DIG
+            << "\n                 MIN_LOW:       " << Printer (MIN_LOW)
+            << " (" << std::hexfloat << MIN_LOW << ")" << std::defaultfloat
+            << "\n                 MIN_MANT:      " << Printer (MIN_MANT)
             << std::endl;
 
+  std::cout << std::scientific << std::setprecision (21);
+
   Check (-2);
   Check (-1);
   Check ( 0);
@@ -1228,13 +1523,19 @@
   Check ( 2);
 
   std::cout << GetParent ()->GetName () << " Double: "
-            << "max delta: " << Printer (m_deltaMax)
+            << "Total deltas:" << std::setw (7) << m_deltaCount
+            << ", max delta:  " << Printer (m_deltaMax)
             << std::endl;
 
   std::cout.flags (ff);
 }
 
 
+/**
+ * \ingroup int64x64-tests
+ * 
+ * Test: print the implementation
+ */
 class Int64x64ImplTestCase : public TestCase
 {
 public:
@@ -1261,7 +1562,7 @@
     case (int64x64_t::int128_impl) : std::cout << "int128_impl"; break;
     case (int64x64_t::cairo_impl)  : std::cout << "cairo_impl";  break;
     case (int64x64_t::ld_impl)     : std::cout << "ld_impl";     break;
-    default :                        std::cout << "unknown!";    
+    default :                        std::cout << "unknown!";
       /* *NS_CHECK_STYLE_ON* */
     }
   std::cout << std::endl;
@@ -1278,7 +1579,28 @@
 
 }
 
-static class Int64x64TestSuite : public TestSuite
+/**
+ * \ingroup int64x64-tests
+ * \internal
+ *
+ * The int64x64 Test Suite.
+ * 
+ * Some of these tests are a little unusual for ns-3 in that they
+ * are sensitive to implementation, specifically the resolution
+ * of the double and long double implementations.
+ *
+ * To handle this, where needed we define a tolerance to use in the
+ * test comparisons.  If you need to increase the tolerance,
+ * please append the system and compiler version.  For example:
+ *
+ * \code
+ *   // Darwin 12.5.0 (Mac 10.8.5) g++ 4.2.1
+ *   tolerance = 1;
+ *   // System Foo gcc 3.9
+ *   tolerance = 3;
+ * \endcode
+ */
+class Int64x64TestSuite : public TestSuite
 {
 public:
   Int64x64TestSuite ()
@@ -1297,7 +1619,9 @@
     AddTestCase (new Int64x64InvertTestCase (), TestCase::QUICK);
     AddTestCase (new Int64x64DoubleTestCase (), TestCase::QUICK);
   }
-}  g_int64x64TestSuite;
+};
+
+static Int64x64TestSuite g_int64x64TestSuite; //!< Static variable for test initialization
 
 }  // namespace test
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/test/length-test-suite.cc ns-3.36/src/core/test/length-test-suite.cc
--- ns-3.35/src/core/test/length-test-suite.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/test/length-test-suite.cc	2022-04-30 18:23:57.802733200 -0700
@@ -43,14 +43,12 @@
 
 /**
  * \file
- * \ingroup core-tests
- * \ingroup length
  * \ingroup length-tests
- * Length class test suite.
+ * Length class tests.
  */
 
 /**
- * \ingroup core-tests
+ * \ingroup core-tests length
  * \defgroup length-tests Length test suite
  */
 
@@ -139,13 +137,20 @@
 
   /**
    * Test that a length object can be constructed from a string
-   * @{
+   * \param unitValue  //!< Value to test.
+   * \param meterValue //!< Reference value [m].
+   * \param tolerance  //!< Tolerance.
+   * \param symbols    //!< Unit symbols.
    */
   void TestConstructLengthFromString (double unitValue,
                                       double meterValue,
                                       double tolerance,
                                       const std::initializer_list<std::string>& symbols);
 
+  /**
+   * Test that a length object can be constructed from a string
+   * @{
+   */
   void TestConstructLengthFromMeterString ();
   void TestConstructLengthFromNanoMeterString ();
   void TestConstructLengthFromMicroMeterString ();
@@ -1491,10 +1496,14 @@
   {}
 
 private:
-    //class with Length attribute
+    /// Class with Length attribute
     class TestObject : public Object
     {
     public:
+        /**
+         * \brief Get the type ID.
+         * \return The object TypeId.
+         */
         static TypeId GetTypeId ();
 
         TestObject ()
@@ -1505,7 +1514,7 @@
         {}
 
     private:
-        Length m_length;
+        Length m_length; //!< Length object
     };
 
 private:
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/test/pair-value-test-suite.cc ns-3.36/src/core/test/pair-value-test-suite.cc
--- ns-3.35/src/core/test/pair-value-test-suite.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/test/pair-value-test-suite.cc	2022-04-30 18:23:57.802733200 -0700
@@ -38,20 +38,40 @@
 
 NS_LOG_COMPONENT_DEFINE ("PairTestSuite");
 
+/**
+ * \file
+ * \ingroup pair-tests
+ * Pairs tests.
+ */
+
+/**
+ * \ingroup core-tests
+ * \defgroup pair-tests Pairs tests
+ */
+
+/**
+ * \ingroup pair-tests
+ * 
+ * Object holding pairs of values.
+ */
 class PairObject : public Object
 {
 public:
   PairObject ();
   virtual ~PairObject ();
 
+  /**
+   * \brief Get the type ID.
+   * \return The object TypeId.
+   */
   static
   TypeId GetTypeId ();
 
   friend std::ostream &operator <<(std::ostream &os, const PairObject &obj);
 
 private:
-  std::pair <std::string, std::string> m_stringPair;
-  std::pair <double, int> m_doubleIntPair;
+  std::pair <std::string, std::string> m_stringPair;  //!< A string pair.
+  std::pair <double, int> m_doubleIntPair;             //!< A pair of double, int.
 };
 
 PairObject::PairObject ()
@@ -84,6 +104,13 @@
   return tid;
 }
 
+/**
+ * \brief Stream insertion operator.
+ *
+ * \param [in] os The reference to the output stream.
+ * \param [in] obj The PairObject.
+ * \returns The reference to the output stream.
+ */
 std::ostream &
 operator << (std::ostream &os, const PairObject &obj)
 {
@@ -92,7 +119,11 @@
   return os;
 }
 
-/* Test instantiation, initialization, access */
+/**
+ * \ingroup pair-tests
+ * 
+ * Pair test - Test instantiation, initialization, access.
+ */
 class PairValueTestCase : public TestCase
 {
 public:
@@ -132,6 +163,11 @@
 
 }
 
+/**
+ * \ingroup pair-tests
+ * 
+ * Pair test - test setting through attribute interface.
+ */
 class PairValueSettingsTestCase : public TestCase
 {
 public:
@@ -160,6 +196,11 @@
   NS_TEST_ASSERT_MSG_EQ ((oss.str ()), (ref.str ()), "Pairs not correctly set");
 }
 
+/**
+ * \ingroup pair-tests
+ *  
+ * \brief The pair-value Test Suite.
+ */
 class PairValueTestSuite : public TestSuite
 {
   public:
@@ -173,4 +214,4 @@
   AddTestCase (new PairValueSettingsTestCase (), TestCase::QUICK);
 }
 
-static PairValueTestSuite pairValueTestSuite; //!< Static variable for test initialization
+static PairValueTestSuite g_pairValueTestSuite; //!< Static variable for test initialization
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/test/random-variable-stream-test-suite.cc ns-3.36/src/core/test/random-variable-stream-test-suite.cc
--- ns-3.35/src/core/test/random-variable-stream-test-suite.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/test/random-variable-stream-test-suite.cc	2022-04-30 18:23:57.802733200 -0700
@@ -49,6 +49,13 @@
 namespace RandomVariable {
 
 /**
+ * \file
+ * \ingroup rng-tests
+ * Random number generator streams tests.
+ */
+
+/**
+ * \ingroup rng-tests
  * Base class for RandomVariableStream test suites.
  */
 class TestCaseBase : public TestCase
@@ -301,7 +308,7 @@
    * deterministic value of seed=3 and default run number=1 every time:
    *   NS_GLOBAL_VALUE="RngSeed=3" ./test.py -s random-variable-stream-generators
    * or equivalently (to see log output):
-   *   NS_LOG="RandomVariableStreamGenerators" NS_GLOBAL_VALUE="RngSeed=3" ./waf --run "test-runner --suite=random-variable-stream-generators"
+   *   NS_LOG="RandomVariableStreamGenerators" NS_GLOBAL_VALUE="RngSeed=3" ./ns3 run "test-runner --suite=random-variable-stream-generators"
    *
    * Conversely, this command will cause this test suite to use a seed
    * based on time-of-day, and run number=0: 
@@ -339,6 +346,7 @@
 
 
 /**
+ * \ingroup rng-tests
  * Test case for uniform distribution random variable stream generator.
  */
 class UniformTestCase : public TestCaseBase
@@ -460,6 +468,7 @@
 }
 
 /**
+ * \ingroup rng-tests
  * Test case for antithetic uniform distribution random variable stream generator
  */
 class UniformAntitheticTestCase : public TestCaseBase
@@ -535,6 +544,7 @@
 
 }
 /**
+ * \ingroup rng-tests
  * Test case for constant random variable stream generator
  */
 class ConstantTestCase : public TestCaseBase
@@ -581,6 +591,7 @@
 }
 
 /**
+ * \ingroup rng-tests
  * Test case for sequential random variable stream generator
  */
 class SequentialTestCase : public TestCaseBase
@@ -637,6 +648,7 @@
 }
 
 /**
+ * \ingroup rng-tests
  * Test case for normal distribution random variable stream generator
  */
 class NormalTestCase : public TestCaseBase
@@ -718,6 +730,7 @@
 }
 
 /**
+ * \ingroup rng-tests
  * Test case for antithetic normal distribution random variable stream generator
  */
 class NormalAntitheticTestCase : public TestCaseBase
@@ -801,6 +814,7 @@
 }
 
 /**
+ * \ingroup rng-tests
  * Test case for exponential distribution random variable stream generator
  */
 class ExponentialTestCase : public TestCaseBase
@@ -877,6 +891,7 @@
 }
 
 /**
+ * \ingroup rng-tests
  * Test case for antithetic exponential distribution random variable stream generator
  */
 class ExponentialAntitheticTestCase : public TestCaseBase
@@ -956,6 +971,7 @@
 }
 
 /**
+ * \ingroup rng-tests
  * Test case for Pareto distribution random variable stream generator
  */
 class ParetoTestCase : public TestCaseBase
@@ -1043,6 +1059,7 @@
 }
 
 /**
+ * \ingroup rng-tests
  * Test case for antithetic Pareto distribution random variable stream generator
  */
 class ParetoAntitheticTestCase : public TestCaseBase
@@ -1134,6 +1151,7 @@
 }
 
 /**
+ * \ingroup rng-tests
  * Test case for Weibull distribution random variable stream generator
  */
 class WeibullTestCase : public TestCaseBase
@@ -1238,6 +1256,7 @@
 }
 
 /**
+ * \ingroup rng-tests
  * Test case for antithetic Weibull distribution random variable stream generator
  */
 class WeibullAntitheticTestCase : public TestCaseBase
@@ -1344,6 +1363,7 @@
 }
 
 /**
+ * \ingroup rng-tests
  * Test case for log-normal distribution random variable stream generator
  */
 class LogNormalTestCase : public TestCaseBase
@@ -1440,6 +1460,7 @@
 }
 
 /**
+ * \ingroup rng-tests
  * Test case for antithetic log-normal distribution random variable stream generator
  */
 class LogNormalAntitheticTestCase : public TestCaseBase
@@ -1538,6 +1559,7 @@
 }
 
 /**
+ * \ingroup rng-tests
  * Test case for gamma distribution random variable stream generator
  */
 class GammaTestCase : public TestCaseBase
@@ -1624,6 +1646,7 @@
 }
 
 /**
+ * \ingroup rng-tests
  * Test case for antithetic gamma distribution random variable stream generator
  */
 class GammaAntitheticTestCase : public TestCaseBase
@@ -1714,6 +1737,7 @@
 }
 
 /**
+ * \ingroup rng-tests
  * Test case for Erlang distribution random variable stream generator
  */
 class ErlangTestCase : public TestCaseBase
@@ -1803,6 +1827,7 @@
 }
 
 /**
+ * \ingroup rng-tests
  * Test case for antithetic Erlang distribution random variable stream generator
  */
 class ErlangAntitheticTestCase : public TestCaseBase
@@ -1896,6 +1921,7 @@
 }
 
 /**
+ * \ingroup rng-tests
  * Test case for Zipf distribution random variable stream generator
  */
 class ZipfTestCase : public TestCaseBase
@@ -1971,6 +1997,7 @@
 }
 
 /**
+ * \ingroup rng-tests
  * Test case for antithetic Zipf distribution random variable stream generator
  */
 class ZipfAntitheticTestCase : public TestCaseBase
@@ -2049,6 +2076,7 @@
 }
 
 /**
+ * \ingroup rng-tests
  * Test case for Zeta distribution random variable stream generator
  */
 class ZetaTestCase : public TestCaseBase
@@ -2108,6 +2136,7 @@
 }
 
 /**
+ * \ingroup rng-tests
  * Test case for antithetic Zeta distribution random variable stream generator
  */
 class ZetaAntitheticTestCase : public TestCaseBase
@@ -2170,6 +2199,7 @@
 }
 
 /**
+ * \ingroup rng-tests
  * Test case for deterministic random variable stream generator
  */
 class DeterministicTestCase : public TestCaseBase
@@ -2243,6 +2273,7 @@
 }
 
 /**
+ * \ingroup rng-tests
  * Test case for empirical distribution random variable stream generator
  */
 class EmpiricalTestCase : public TestCaseBase
@@ -2335,6 +2366,7 @@
 }
 
 /**
+ * \ingroup rng-tests
  * Test case for antithetic empirical distribution random variable stream generator
  */
 class EmpiricalAntitheticTestCase : public TestCaseBase
@@ -2405,6 +2437,7 @@
 }
 
 /**
+ * \ingroup rng-tests
  * Test case for caching of Normal RV parameters (see issue #302)
  */
 class NormalCachingTestCase : public TestCaseBase
@@ -2437,6 +2470,7 @@
 }
 
 /**
+ * \ingroup rng-tests
  * RandomVariableStream test suite, covering all random number variable
  * stream generator types.
  */ 
@@ -2489,7 +2523,7 @@
   AddTestCase (new NormalCachingTestCase);
 }
 
-static RandomVariableSuite randomVariableSuite;
+static RandomVariableSuite randomVariableSuite;  //!< Static variable for test initialization
 
 }  // namespace RandomVariable
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/test/rng-test-suite.cc ns-3.36/src/core/test/rng-test-suite.cc
--- ns-3.35/src/core/test/rng-test-suite.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/test/rng-test-suite.cc	2022-04-30 18:23:57.802733200 -0700
@@ -28,6 +28,26 @@
 
 using namespace ns3;
 
+/**
+ * \file
+ * \ingroup rng-tests
+ * Random number generators tests.
+ */
+
+/**
+ * \ingroup core-tests
+ * \defgroup rng-tests Random number generators tests
+ */
+
+/**
+ * \ingroup rng-tests
+ * 
+ * Fill an array with increasing values, in the [start, end] range.
+ * \param array The array to fill.
+ * \param n The size of the array.
+ * \param start The start value.
+ * \param end The end value.
+ */
 void
 FillHistoRangeUniformly (double *array, uint32_t n, double start, double end)
 {
@@ -41,19 +61,29 @@
     }
 }
 
-// ===========================================================================
-// Test case for uniform distribution random number generator
-// ===========================================================================
+/**
+ * \ingroup core-tests
+ * 
+ * Test case for uniform distribution random number generator.
+ */
 class RngUniformTestCase : public TestCase
 {
 public:
+  /// Number of runs.
   static const uint32_t N_RUNS = 5;
+  /// Number of bins.
   static const uint32_t N_BINS = 50;
+  /// Number of measurements.
   static const uint32_t N_MEASUREMENTS = 1000000;
 
   RngUniformTestCase ();
   virtual ~RngUniformTestCase ();
 
+  /**
+   * Run a chi-squared test on the results of the random number generator.
+   * \param u The random number generaor.
+   * \return the chi-squared test result.
+   */
   double ChiSquaredTest (Ptr<UniformRandomVariable> u);
 
 private:
@@ -122,19 +152,29 @@
   NS_TEST_ASSERT_MSG_LT (sum, maxStatistic, "Chi-squared statistic out of range");
 }
 
-// ===========================================================================
-// Test case for normal distribution random number generator
-// ===========================================================================
+/**
+ * \ingroup rng-tests
+ * 
+ * Test case for normal distribution random number generator.
+ */
 class RngNormalTestCase : public TestCase
 {
 public:
+  /// Number of runs.
   static const uint32_t N_RUNS = 5;
+  /// Number of bins.
   static const uint32_t N_BINS = 50;
+  /// Number of measurements.
   static const uint32_t N_MEASUREMENTS = 1000000;
 
   RngNormalTestCase ();
   virtual ~RngNormalTestCase ();
 
+  /**
+   * Run a chi-squared test on the results of the random number generator.
+   * \param n The random number generaor.
+   * \return the chi-squared test result.
+   */
   double ChiSquaredTest (Ptr<NormalRandomVariable> n);
 
 private:
@@ -217,19 +257,29 @@
   NS_TEST_ASSERT_MSG_LT (sum, maxStatistic, "Chi-squared statistic out of range");
 }
 
-// ===========================================================================
-// Test case for exponential distribution random number generator
-// ===========================================================================
+/**
+ * \ingroup rng-tests
+ * 
+ * Test case for exponential distribution random number generator.
+ */
 class RngExponentialTestCase : public TestCase
 {
 public:
+  /// Number of runs.
   static const uint32_t N_RUNS = 5;
+  /// Number of bins.
   static const uint32_t N_BINS = 50;
+  /// Number of measurements.
   static const uint32_t N_MEASUREMENTS = 1000000;
 
   RngExponentialTestCase ();
   virtual ~RngExponentialTestCase ();
 
+  /**
+   * Run a chi-squared test on the results of the random number generator.
+   * \param n The random number generaor.
+   * \return the chi-squared test result.
+   */
   double ChiSquaredTest (Ptr<ExponentialRandomVariable> n);
 
 private:
@@ -311,19 +361,29 @@
   NS_TEST_ASSERT_MSG_LT (sum, maxStatistic, "Chi-squared statistic out of range");
 }
 
-// ===========================================================================
-// Test case for pareto distribution random number generator
-// ===========================================================================
+/**
+ * \ingroup rng-tests
+ * 
+ * Test case for pareto distribution random number generator.
+ */
 class RngParetoTestCase : public TestCase
 {
 public:
+  /// Number of runs.
   static const uint32_t N_RUNS = 5;
+  /// Number of bins.
   static const uint32_t N_BINS = 50;
+  /// Number of measurements.
   static const uint32_t N_MEASUREMENTS = 1000000;
 
   RngParetoTestCase ();
   virtual ~RngParetoTestCase ();
 
+  /**
+   * Run a chi-squared test on the results of the random number generator.
+   * \param p The random number generaor.
+   * \return the chi-squared test result.
+   */
   double ChiSquaredTest (Ptr<ParetoRandomVariable> p);
 
 private:
@@ -410,6 +470,11 @@
   NS_TEST_ASSERT_MSG_LT (sum, maxStatistic, "Chi-squared statistic out of range");
 }
 
+/**
+ * \ingroup rng-tests
+ *  
+ * \brief The random number generators Test Suite.
+ */
 class RngTestSuite : public TestSuite
 {
 public:
@@ -425,4 +490,4 @@
   AddTestCase (new RngParetoTestCase, TestCase::QUICK);
 }
 
-static RngTestSuite rngTestSuite;
+static RngTestSuite g_rngTestSuite; //!< Static variable for test initialization
\ No newline at end of file
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/test/simulator-test-suite.cc ns-3.36/src/core/test/simulator-test-suite.cc
--- ns-3.35/src/core/test/simulator-test-suite.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/test/simulator-test-suite.cc	2022-04-30 18:23:57.802733200 -0700
@@ -27,26 +27,70 @@
 
 using namespace ns3;
 
+/**
+ * \file
+ * \ingroup simulator-tests
+ * Simulator class test suite
+ */
+
+/**
+ * \ingroup core-tests
+ * \defgroup simulator-tests Simulator class tests
+ */
+
+/**
+ * \ingroup simulator-tests
+ *  
+ * \brief Check that basic event handling is working with different Simulator implementations.
+ */
 class SimulatorEventsTestCase : public TestCase
 {
 public:
+  /**
+   * Constructor.
+   * \param schedulerFactory Scheduler factory.
+   */
   SimulatorEventsTestCase (ObjectFactory schedulerFactory);
   virtual void DoRun (void);
-  void EventA (int a);
-  void EventB (int b);
-  void EventC (int c);
-  void EventD (int d);
+  /**
+   * Test Event.
+   * \param value Event parameter.
+   * @{
+   */
+  void EventA (int value);
+  void EventB (int value);
+  void EventC (int value);
+  void EventD (int value);
+  /** @} */
+
+  /**
+   * Test Event.
+   */
   void Eventfoo0 (void);
+
+  /**
+   * Get the simulator time.
+   * \return The actual time [ms].
+   */
   uint64_t NowUs (void);
-  void destroy (void);
-  bool m_b;
+  /**
+   * Checks that the events has been detroyed.
+   */
+  void Destroy (void);
+  /**
+   * Checks that events are properly handled.
+   * @{
+   */
   bool m_a;
+  bool m_b;
   bool m_c;
   bool m_d;
-  EventId m_idC;
   bool m_destroy;
-  EventId m_destroyId;
-  ObjectFactory m_schedulerFactory;
+  /** @} */
+
+  EventId m_idC;        //!< Event C.
+  EventId m_destroyId;  //!< Event to check event lifetime.
+  ObjectFactory m_schedulerFactory; //!< Scheduler factory.
 };
 
 SimulatorEventsTestCase::SimulatorEventsTestCase (ObjectFactory schedulerFactory)
@@ -62,9 +106,8 @@
 }
 
 void
-SimulatorEventsTestCase::EventA (int a)
+SimulatorEventsTestCase::EventA ([[maybe_unused]] int a)
 {
-  NS_UNUSED (a);
   m_a = false;
 }
 
@@ -84,9 +127,8 @@
 }
 
 void
-SimulatorEventsTestCase::EventC (int c)
+SimulatorEventsTestCase::EventC ([[maybe_unused]] int c)
 {
-  NS_UNUSED (c);
   m_c = false;
 }
 
@@ -108,7 +150,7 @@
 {}
 
 void
-SimulatorEventsTestCase::destroy (void)
+SimulatorEventsTestCase::Destroy (void)
 {
   if (m_destroyId.IsExpired ())
     {
@@ -148,17 +190,17 @@
   NS_TEST_EXPECT_MSG_EQ (anotherId.IsExpired (), true, "Event was removed: it is now expired");
 
   m_destroy = false;
-  m_destroyId = Simulator::ScheduleDestroy (&SimulatorEventsTestCase::destroy, this);
+  m_destroyId = Simulator::ScheduleDestroy (&SimulatorEventsTestCase::Destroy, this);
   NS_TEST_EXPECT_MSG_EQ (!m_destroyId.IsExpired (), true, "Event should not have expired yet");
   m_destroyId.Cancel ();
   NS_TEST_EXPECT_MSG_EQ (m_destroyId.IsExpired (), true, "Event was canceled: should have expired now");
 
-  m_destroyId = Simulator::ScheduleDestroy (&SimulatorEventsTestCase::destroy, this);
+  m_destroyId = Simulator::ScheduleDestroy (&SimulatorEventsTestCase::Destroy, this);
   NS_TEST_EXPECT_MSG_EQ (!m_destroyId.IsExpired (), true, "Event should not have expired yet");
   Simulator::Remove (m_destroyId);
   NS_TEST_EXPECT_MSG_EQ (m_destroyId.IsExpired (), true, "Event was canceled: should have expired now");
 
-  m_destroyId = Simulator::ScheduleDestroy (&SimulatorEventsTestCase::destroy, this);
+  m_destroyId = Simulator::ScheduleDestroy (&SimulatorEventsTestCase::Destroy, this);
   NS_TEST_EXPECT_MSG_EQ (!m_destroyId.IsExpired (), true, "Event should not have expired yet");
 
   Simulator::Run ();
@@ -170,20 +212,36 @@
   NS_TEST_EXPECT_MSG_EQ (m_destroy, true, "Event should have run");
 }
 
+
+/**
+ * \ingroup simulator-tests
+ *  
+ * \brief Check that all templates are instantiated correctly.
+ * 
+ * This is a compilation test, it cannot fail at runtime.
+ */
 class SimulatorTemplateTestCase : public TestCase
 {
 public:
   SimulatorTemplateTestCase ();
-  // only here for testing of Ptr<>
-  void Ref (void) const
-  {}
-  void Unref (void) const
-  {}
+  /**
+   * Ref and Unref - only here for testing of Ptr<>
+   * 
+   * @{
+   */
+  void Ref (void) const {};
+  void Unref (void) const {};
+  /** @} */
 
 private:
   virtual void DoRun (void);
 
   /* *NS_CHECK_STYLE_OFF* */
+  /**
+   * Function used for scheduling.
+   * 
+   * @{
+   */
   void bar0 (void) {}
   void bar1 (int) {}
   void bar2 (int, int) {}
@@ -217,10 +275,16 @@
   void cbaz3c (const int &, const int &, const int &) const {}
   void cbaz4c (const int &, const int &, const int &, const int &) const {}
   void cbaz5c (const int &, const int &, const int &, const int &, const int &) const {}
+  /** @} */
   /* *NS_CHECK_STYLE_ON* */
 
 };
 
+/**
+  * Function used for scheduling.
+  * 
+  * @{
+  */
 static void foo0 (void)
 {}
 static void foo1 (int)
@@ -253,6 +317,7 @@
 {}
 static void cber5 (const int &, const int &, const int &, const int &, const int &)
 {}
+/** @} */
 
 SimulatorTemplateTestCase::SimulatorTemplateTestCase ()
   : TestCase ("Check that all templates are instantiated correctly. This is a compilation test, it cannot fail at runtime.")
@@ -465,6 +530,12 @@
   Simulator::Destroy ();
 }
 
+
+/**
+ * \ingroup simulator-tests
+ *  
+ * \brief The simulator Test Suite.
+ */
 class SimulatorTestSuite : public TestSuite
 {
 public:
@@ -484,4 +555,6 @@
     factory.SetTypeId (PriorityQueueScheduler::GetTypeId ());
     AddTestCase (new SimulatorEventsTestCase (factory), TestCase::QUICK);
   }
-} g_simulatorTestSuite;
+};
+
+static SimulatorTestSuite g_simulatorTestSuite; //!< Static variable for test initialization
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/test/threaded-test-suite.cc ns-3.36/src/core/test/threaded-test-suite.cc
--- ns-3.35/src/core/test/threaded-test-suite.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/test/threaded-test-suite.cc	2022-04-30 18:23:57.802733200 -0700
@@ -35,30 +35,81 @@
 
 using namespace ns3;
 
+/// Maximum number of threads.
 #define MAXTHREADS 64
 
+/**
+ * \file
+ * \ingroup threaded-tests
+ * Threaded events test suite
+ */
+
+/**
+ * \ingroup core-tests
+ * \defgroup threaded-tests Threaded events tests
+ */
+
+/**
+ * \ingroup threaded-tests
+ *  
+ * \brief Check threaded event handling with various thread number, schedulers, and  simulator types.
+ */
 class ThreadedSimulatorEventsTestCase : public TestCase
 {
 public:
+  /**
+   * Constructor.
+   * 
+   * \param schedulerFactory The scheduler factory.
+   * \param simulatorType The simulator type.
+   * \param threads The number of threads.
+   */
   ThreadedSimulatorEventsTestCase (ObjectFactory schedulerFactory, const std::string &simulatorType, unsigned int threads);
+  /**
+   * Event A
+   * \param a The Event parameter.
+   */
   void EventA (int a);
+  /**
+   * Event B
+   * \param b The Event parameter.
+   */
   void EventB (int b);
+  /**
+   * Event C
+   * \param c The Event parameter.
+   */
   void EventC (int c);
+  /**
+   * Event D
+   * \param d The Event parameter.
+   */
   void EventD (int d);
+  /**
+   * No-op function, records the thread that called it. 
+   * \param threadno The thread number.
+   */
   void DoNothing (unsigned int threadno);
+  /**
+   * Schedule a thread.
+   * \param context The context.
+   */
   static void SchedulingThread (std::pair<ThreadedSimulatorEventsTestCase *, unsigned int> context);
+  /**
+   * End the thread execution.
+   */
   void End (void);
-  uint64_t m_b;
-  uint64_t m_a;
-  uint64_t m_c;
-  uint64_t m_d;
-  unsigned int m_threads;
-  bool m_threadWaiting[MAXTHREADS];
-  bool m_stop;
-  ObjectFactory m_schedulerFactory;
-  std::string m_simulatorType;
-  std::string m_error;
-  std::list<Ptr<SystemThread> > m_threadlist;
+  uint64_t m_a; //!< The value incremented when EventA is called.
+  uint64_t m_b; //!< The value incremented when EventB is called.
+  uint64_t m_c; //!< The value incremented when EventC is called.
+  uint64_t m_d; //!< The value incremented when EventD is called.
+  unsigned int m_threads; //!< The number of threads.
+  bool m_threadWaiting[MAXTHREADS]; //!< Threads waiting to be scheduled.
+  bool m_stop;  //!< Stop variable.
+  ObjectFactory m_schedulerFactory; //!< Scheduler factory.
+  std::string m_simulatorType;      //!< Simulator type.
+  std::string m_error;              //!< Error condition.
+  std::list<Ptr<SystemThread> > m_threadlist; //!< Thread list.
 
 private:
   virtual void DoSetup (void);
@@ -225,6 +276,11 @@
   NS_TEST_EXPECT_MSG_EQ (m_a, m_d, "Bad scheduling");
 }
 
+/**
+ * \ingroup threaded-tests
+ *  
+ * \brief The threaded simulator Test Suite.
+ */
 class ThreadedSimulatorTestSuite : public TestSuite
 {
 public:
@@ -263,4 +319,7 @@
           }
       }
   }
-} g_threadedSimulatorTestSuite;
+};
+
+/// Static variable for test initialization.
+static ThreadedSimulatorTestSuite g_threadedSimulatorTestSuite; 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/test/timer-test-suite.cc ns-3.36/src/core/test/timer-test-suite.cc
--- ns-3.35/src/core/test/timer-test-suite.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/test/timer-test-suite.cc	2022-04-30 18:23:57.802733200 -0700
@@ -22,15 +22,33 @@
 #include "ns3/simulator.h"
 #include "ns3/nstime.h"
 
+/**
+ * \file
+ * \ingroup timer-tests
+ * Timer test suite
+ */
+
+/**
+ * \ingroup core-tests
+ * \defgroup timer-tests Timer tests
+ */
+
 namespace {
 
 /* *NS_CHECK_STYLE_OFF* */
+/// Function with one int parameter.
 void bari (int) {}
+/// Function with two int parameters.
 void bar2i (int, int) {}
+/// Function with three int parameters.
 void bar3i (int, int, int) {}
+/// Function with four int parameters.
 void bar4i (int, int, int, int) {}
+/// Function with five int parameters.
 void bar5i (int, int, int, int, int) {}
+/// Function with one const int reference parameter.
 void barcir (const int &) {}
+/// Function with one int reference parameter.
 void barir (int &) {}
 /* *NS_CHECK_STYLE_ON* */
 
@@ -38,6 +56,11 @@
 
 using namespace ns3;
 
+/**
+ * \ingroup timer-tests
+ *  
+ * \brief Check correct state transitions.
+ */
 class TimerStateTestCase : public TestCase
 {
 public:
@@ -82,6 +105,11 @@
   NS_TEST_ASSERT_MSG_EQ (timer.GetState (), Timer::EXPIRED, "");
 }
 
+/**
+ * \ingroup timer-tests
+ *  
+ * \brief Check that Timer template magic is working.
+ */
 class TimerTemplateTestCase : public TestCase
 {
 public:
@@ -90,15 +118,25 @@
   virtual void DoTeardown (void);
 
   /* *NS_CHECK_STYLE_OFF* */
+  /// Member function with one int parameter.
   void bazi (int) {}
+  /// Member function with two int parameters.
   void baz2i (int, int) {}
+  /// Member function with three int parameters.
   void baz3i (int, int, int) {}
+  /// Member function with four int parameters.
   void baz4i (int, int, int, int) {}
+  /// Member function with five int parameters.
   void baz5i (int, int, int, int, int) {}
+  /// Member function with six int parameters.
   void baz6i (int, int, int, int, int, int) {}
+  /// Member function with one const int reference parameter.
   void bazcir (const int&) {}
+  /// Member function with one int reference parameter.
   void bazir (int&) {}
+  /// Member function with one int pointer parameter.
   void bazip (int *) {}
+  /// Member function with one const int pointer parameter.
   void bazcip (const int *) {}
   /* *NS_CHECK_STYLE_ON* */
 };
@@ -179,7 +217,12 @@
   Simulator::Destroy ();
 }
 
-static class TimerTestSuite : public TestSuite
+/**
+ * \ingroup timer-tests
+ *  
+ * \brief The timer Test Suite.
+ */
+class TimerTestSuite : public TestSuite
 {
 public:
   TimerTestSuite ()
@@ -188,4 +231,6 @@
     AddTestCase (new TimerStateTestCase (), TestCase::QUICK);
     AddTestCase (new TimerTemplateTestCase (), TestCase::QUICK);
   }
-} g_timerTestSuite;
+};
+
+static TimerTestSuite g_timerTestSuite; //!< Static variable for test initialization
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/test/traced-callback-test-suite.cc ns-3.36/src/core/test/traced-callback-test-suite.cc
--- ns-3.35/src/core/test/traced-callback-test-suite.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/test/traced-callback-test-suite.cc	2022-04-30 18:23:57.802733200 -0700
@@ -18,10 +18,25 @@
 
 #include "ns3/test.h"
 #include "ns3/traced-callback.h"
-#include "ns3/unused.h"
 
 using namespace ns3;
 
+/**
+ * \file
+ * \ingroup tracedcallback-tests
+ * TracedCallback test suite
+ */
+
+/**
+ * \ingroup core-tests
+ * \defgroup tracedcallback-tests TracedCallback class tests
+ */
+
+/**
+ * \ingroup tracedcallback-tests
+ * 
+ * TracedCallback Test case, check basic TracedCallback operation.
+ */
 class BasicTracedCallbackTestCase : public TestCase
 {
 public:
@@ -32,11 +47,21 @@
 private:
   virtual void DoRun (void);
 
+  /**
+   * First callback.
+   * \param a First parameter.
+   * \param b Second parameter.
+   */
   void CbOne (uint8_t a, double b);
+  /**
+   * Second callback.
+   * \param a First parameter.
+   * \param b Second parameter.
+   */
   void CbTwo (uint8_t a, double b);
 
-  bool m_one;
-  bool m_two;
+  bool m_one; //!< Variable set by the first callback.
+  bool m_two; //!< Variable set by the second callback.
 };
 
 BasicTracedCallbackTestCase::BasicTracedCallbackTestCase ()
@@ -44,18 +69,14 @@
 {}
 
 void
-BasicTracedCallbackTestCase::CbOne (uint8_t a, double b)
+BasicTracedCallbackTestCase::CbOne ([[maybe_unused]] uint8_t a, [[maybe_unused]] double b)
 {
-  NS_UNUSED (a);
-  NS_UNUSED (b);
   m_one = true;
 }
 
 void
-BasicTracedCallbackTestCase::CbTwo (uint8_t a, double b)
+BasicTracedCallbackTestCase::CbTwo ([[maybe_unused]] uint8_t a, [[maybe_unused]] double b)
 {
-  NS_UNUSED (a);
-  NS_UNUSED (b);
   m_two = true;
 }
 
@@ -113,6 +134,11 @@
   NS_TEST_ASSERT_MSG_EQ (m_two, true, "Callback CbTwo not called");
 }
 
+/**
+ * \ingroup tracedcallback-tests
+ *  
+ * \brief The traced callback Test Suite.
+ */
 class TracedCallbackTestSuite : public TestSuite
 {
 public:
@@ -125,4 +151,4 @@
   AddTestCase (new BasicTracedCallbackTestCase, TestCase::QUICK);
 }
 
-static TracedCallbackTestSuite tracedCallbackTestSuite;
+static TracedCallbackTestSuite g_tracedCallbackTestSuite; //!< Static variable for test initialization
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/test/tuple-value-test-suite.cc ns-3.36/src/core/test/tuple-value-test-suite.cc
--- ns-3.35/src/core/test/tuple-value-test-suite.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/core/test/tuple-value-test-suite.cc	2022-04-30 18:23:57.802733200 -0700
@@ -0,0 +1,283 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2021 Universita' degli Studi di Napoli Federico II
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Stefano Avallone <stavallo@unina.it>
+ */
+
+#include <ns3/test.h>
+#include <ns3/log.h>
+#include <ns3/tuple.h>
+#include <ns3/double.h>
+#include <ns3/uinteger.h>
+#include <ns3/string.h>
+#include <ns3/ptr.h>
+#include <ns3/object.h>
+#include <ns3/enum.h>
+
+#include <algorithm>
+#include <iterator>
+#include <sstream>
+#include <utility>
+#include <tuple>
+
+
+using namespace ns3;
+
+NS_LOG_COMPONENT_DEFINE ("TupleTestSuite");
+
+/** Object with attribute values storing tuples */
+class TupleObject : public Object
+{
+public:
+  /**
+   * Test enum type
+   */
+  enum TupleTestEnum
+  {
+    VALUE1,
+    VALUE2,
+    VALUE3
+  };
+
+  TupleObject ();
+  virtual ~TupleObject ();
+
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
+  static TypeId GetTypeId ();
+
+  // NOTE EnumValue::Get() return an int, so the tuple element type must be an int
+  // in place of the enum type
+  using Tuple1Value = TupleValue<StringValue, StringValue, EnumValue>;  //!< Tuple1 attribute value
+  using Tuple1 = Tuple1Value::result_type;                              //!< tuple of values
+  using Tuple1Pack = Tuple1Value::value_type;                           //!< tuple of attribute values
+
+  using Tuple2 = std::tuple <double, uint16_t, std::string>;            //!< Tuple2 typedef
+
+  /**
+   * Set tuple1
+   * \param tuple tuple value
+   */
+  void SetTuple1 (const Tuple1& tuple);
+  /**
+   * Get tuple1
+   * \return tuple1
+   */
+  Tuple1 GetTuple1 (void) const;
+  /**
+   * Set tuple2
+   * \param tuple tuple value
+   */
+  void SetTuple2 (const Tuple2& tuple);
+  /**
+   * Get tuple2
+   * \return tuple2
+   */
+  Tuple2 GetTuple2 (void) const;
+
+private:
+  Tuple1 m_tuple1;     //!< first tuple
+  Tuple2 m_tuple2;     //!< second tuple
+};
+
+TypeId
+TupleObject::GetTypeId ()
+{
+  static TypeId tid = TypeId ("ns3::TupleObject")
+    .SetParent<Object> ()
+    .SetGroupName("Test")
+    .AddConstructor<TupleObject> ()
+    .AddAttribute ("StringStringEnumTuple", "Tuple1: string, string, enum",
+                   MakeTupleValue<Tuple1Pack> (Tuple1 {"Hey", "Jude", TupleObject::VALUE1}),
+                   MakeTupleAccessor<Tuple1Pack> (&TupleObject::m_tuple1),
+                   MakeTupleChecker<Tuple1Pack> (MakeStringChecker (), MakeStringChecker (),
+                                            MakeEnumChecker (TupleObject::VALUE1, "VALUE1",
+                                                             TupleObject::VALUE2, "VALUE2")))
+    .AddAttribute ("DoubleUintStringTuple", "Tuple2: double, uint16_t, string",
+                   TupleValue <DoubleValue, UintegerValue, StringValue> ({6.022, 23, "Avogadro"}),
+                   MakeTupleAccessor <DoubleValue, UintegerValue, StringValue> (&TupleObject::SetTuple2,
+                                                                                &TupleObject::GetTuple2),
+                   MakeTupleChecker<DoubleValue, UintegerValue, StringValue> (MakeDoubleChecker<double> (1.0, 10.0),
+                                                                              MakeUintegerChecker<int> (1, 30),
+                                                                              MakeStringChecker ()))
+    ;
+  return tid;
+}
+
+TupleObject::TupleObject ()
+{
+}
+
+TupleObject::~TupleObject ()
+{
+}
+
+void
+TupleObject::SetTuple1 (const Tuple1& tuple)
+{
+  m_tuple1 = tuple;
+}
+
+TupleObject::Tuple1
+TupleObject::GetTuple1 (void) const
+{
+  return m_tuple1;
+}
+
+void
+TupleObject::SetTuple2 (const Tuple2& tuple)
+{
+  m_tuple2 = tuple;
+}
+
+TupleObject::Tuple2
+TupleObject::GetTuple2 (void) const
+{
+  return m_tuple2;
+}
+
+
+/** Test instantiation, initialization, access */
+class TupleValueTestCase : public TestCase
+{
+public:
+  TupleValueTestCase ();
+  virtual ~TupleValueTestCase () {}
+
+private:
+  virtual void DoRun ();
+};
+
+TupleValueTestCase::TupleValueTestCase ()
+  : TestCase ("test TupleValue attribute value")
+{
+}
+
+void
+TupleValueTestCase::DoRun ()
+{
+  auto tupleObject = CreateObject <TupleObject> ();
+
+  // Test that default values have been assigned to tuple 1
+  auto t1 = tupleObject->GetTuple1 ();
+  NS_TEST_ASSERT_MSG_EQ ((std::get<0> (t1) == "Hey"), true, "First element of tuple 1 not correctly set");
+  NS_TEST_ASSERT_MSG_EQ ((std::get<1> (t1) == "Jude"), true, "Second element of tuple 1 not correctly set");
+  NS_TEST_ASSERT_MSG_EQ (std::get<2> (t1), (int)(TupleObject::VALUE1), "Third element of tuple 1 not correctly set");
+
+  // Test that default values have been assigned to tuple 2
+  auto t2 = tupleObject->GetTuple2 ();
+  NS_TEST_ASSERT_MSG_EQ (std::get<0> (t2), 6.022, "First element of tuple 2 not correctly set");
+  NS_TEST_ASSERT_MSG_EQ (std::get<1> (t2), 23, "Second element of tuple 2 not correctly set");
+  NS_TEST_ASSERT_MSG_EQ ((std::get<2> (t2) == "Avogadro"), true, "Third element of tuple 2 not correctly set");
+
+  // Test that we can correctly set and get new values for tuple 1
+  bool ret1 = tupleObject->SetAttributeFailSafe ("StringStringEnumTuple",
+                                                 MakeTupleValue<TupleObject::Tuple1Pack> (TupleObject::Tuple1 {"Norwegian", "Wood", TupleObject::VALUE2}));
+  NS_TEST_ASSERT_MSG_EQ (ret1, true, "Setting valid values to tuple 1 failed");
+
+  TupleValue<StringValue, StringValue, EnumValue> tupleValue1;
+  ret1 = tupleObject->GetAttributeFailSafe ("StringStringEnumTuple", tupleValue1);
+  NS_TEST_ASSERT_MSG_EQ (ret1, true, "Getting values for tuple 1 failed");
+
+  t1 = tupleValue1.Get ();
+  NS_TEST_ASSERT_MSG_EQ ((std::get<0> (t1) == "Norwegian"), true, "First element of tuple 1 not correctly set");
+  NS_TEST_ASSERT_MSG_EQ ((std::get<1> (t1) == "Wood"), true, "Second element of tuple 1 not correctly set");
+  NS_TEST_ASSERT_MSG_EQ (std::get<2> (t1), (int)(TupleObject::VALUE2), "Third element of tuple 1 not correctly set");
+
+  // Test that we can correctly set and get new values for tuple 2
+  bool ret2 = tupleObject->SetAttributeFailSafe ("DoubleUintStringTuple",
+                                                 TupleValue <DoubleValue, UintegerValue, StringValue> ({8.987, 9, "Coulomb"}));
+  NS_TEST_ASSERT_MSG_EQ (ret2, true, "Setting valid values to tuple 2 failed");
+
+  TupleValue <DoubleValue, UintegerValue, StringValue> tupleValue2;
+  ret2 = tupleObject->GetAttributeFailSafe ("DoubleUintStringTuple", tupleValue2);
+  NS_TEST_ASSERT_MSG_EQ (ret2, true, "Getting values for tuple 2 failed");
+
+  t2 = tupleValue2.Get ();
+  NS_TEST_ASSERT_MSG_EQ (std::get<0> (t2), 8.987, "First element of tuple 2 not correctly set");
+  NS_TEST_ASSERT_MSG_EQ (std::get<1> (t2), 9, "Second element of tuple 2 not correctly set");
+  NS_TEST_ASSERT_MSG_EQ ((std::get<2> (t2) == "Coulomb"), true, "Third element of tuple 2 not correctly set");
+
+  // Test that we can set tuple 1 from string
+  ret1 = tupleObject->SetAttributeFailSafe ("StringStringEnumTuple", StringValue ("{Come, Together, VALUE1}"));
+  NS_TEST_ASSERT_MSG_EQ (ret1, true, "Setting valid values to tuple 1 failed");
+
+  t1 = tupleObject->GetTuple1 ();
+  NS_TEST_ASSERT_MSG_EQ ((std::get<0> (t1) == "Come"), true, "First element of tuple 1 not correctly set");
+  NS_TEST_ASSERT_MSG_EQ ((std::get<1> (t1) == "Together"), true, "Second element of tuple 1 not correctly set");
+  NS_TEST_ASSERT_MSG_EQ (std::get<2> (t1), (int)(TupleObject::VALUE1), "Third element of tuple 1 not correctly set");
+
+  // Test that we can set tuple 2 from string
+  ret2 = tupleObject->SetAttributeFailSafe ("DoubleUintStringTuple", StringValue ("{2.99, 8, LightSpeed}"));
+  NS_TEST_ASSERT_MSG_EQ (ret2, true, "Setting valid values to tuple 2 failed");
+
+  t2 = tupleObject->GetTuple2 ();
+  NS_TEST_ASSERT_MSG_EQ (std::get<0> (t2), 2.99, "First element of tuple 2 not correctly set");
+  NS_TEST_ASSERT_MSG_EQ (std::get<1> (t2), 8, "Second element of tuple 2 not correctly set");
+  NS_TEST_ASSERT_MSG_EQ ((std::get<2> (t2) == "LightSpeed"), true, "Third element of tuple 2 not correctly set");
+
+  // Test that setting invalid values fails
+  ret1 = tupleObject->SetAttributeFailSafe ("StringStringEnumTuple",
+                                            TupleValue<StringValue, StringValue> ({"Get", "Back"}));
+  NS_TEST_ASSERT_MSG_EQ (ret1, false, "Too few values");
+  NS_TEST_ASSERT_MSG_EQ ((tupleObject->GetTuple1 () == std::make_tuple ("Come", "Together", (int)(TupleObject::VALUE1))), true,
+                         "Tuple modified after failed assignment");
+
+  ret1 = tupleObject->SetAttributeFailSafe ("StringStringEnumTuple",
+                                            MakeTupleValue<TupleObject::Tuple1Pack> (TupleObject::Tuple1 {"Get", "Back", TupleObject::VALUE3}));
+  NS_TEST_ASSERT_MSG_EQ (ret1, false, "Invalid enum value");
+  NS_TEST_ASSERT_MSG_EQ ((tupleObject->GetTuple1 () == std::make_tuple ("Come", "Together", (int)(TupleObject::VALUE1))), true,
+                         "Tuple modified after failed assignment");
+
+  ret2 = tupleObject->SetAttributeFailSafe ("DoubleUintStringTuple",
+                                            TupleValue <DoubleValue, UintegerValue, StringValue, StringValue> ({4.83, 14, "Josephson", "constant"}));
+  NS_TEST_ASSERT_MSG_EQ (ret2, false, "Too many values");
+  NS_TEST_ASSERT_MSG_EQ ((tupleObject->GetTuple2 () == std::make_tuple (2.99, 8, "LightSpeed")), true,
+                         "Tuple modified after failed assignment");
+
+  ret2 = tupleObject->SetAttributeFailSafe ("DoubleUintStringTuple",
+                                            TupleValue <DoubleValue, UintegerValue, StringValue> ({48.3, 13, "Josephson"}));
+  NS_TEST_ASSERT_MSG_EQ (ret2, false, "Double value out of range");
+  NS_TEST_ASSERT_MSG_EQ ((tupleObject->GetTuple2 () == std::make_tuple (2.99, 8, "LightSpeed")), true,
+                         "Tuple modified after failed assignment");
+
+  ret2 = tupleObject->SetAttributeFailSafe ("DoubleUintStringTuple",
+                                            TupleValue <DoubleValue, UintegerValue, StringValue> ({4.83, 130, "Josephson"}));
+  NS_TEST_ASSERT_MSG_EQ (ret2, false, "Uinteger value out of range");
+  NS_TEST_ASSERT_MSG_EQ ((tupleObject->GetTuple2 () == std::make_tuple (2.99, 8, "LightSpeed")), true,
+                         "Tuple modified after failed assignment");
+
+
+}
+
+
+/** Test suite */
+class TupleValueTestSuite : public TestSuite
+{
+  public:
+    TupleValueTestSuite ();
+};
+
+TupleValueTestSuite::TupleValueTestSuite ()
+  : TestSuite ("tuple-value-test-suite", UNIT)
+{
+  AddTestCase (new TupleValueTestCase (), TestCase::QUICK);
+}
+
+static TupleValueTestSuite g_tupleValueTestSuite; //!< Static variable for test initialization
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/test/type-id-test-suite.cc ns-3.36/src/core/test/type-id-test-suite.cc
--- ns-3.35/src/core/test/type-id-test-suite.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/test/type-id-test-suite.cc	2022-04-30 18:23:57.802733200 -0700
@@ -29,19 +29,30 @@
 #include "ns3/type-id.h"
 #include "ns3/test.h"
 #include "ns3/log.h"
-#include "ns3/unused.h"
 
 using namespace std;
 
 using namespace ns3;
 
-
+/// Const string used to build the test name.
 const std::string suite ("type-id: ");
 
-//----------------------------
-//
-// Test for uniqueness of all TypeIds
-
+/**
+ * \file
+ * \ingroup typeid-tests
+ * TypeId test suite
+ */
+
+/**
+ * \ingroup core-tests
+ * \defgroup typeid-tests TypeId class tests
+ */
+
+/**
+ * \ingroup typeid-tests
+ * 
+ * Test for uniqueness of all TypeIds.
+ */
 class UniqueTypeIdTestCase : public TestCase
 {
 public:
@@ -117,10 +128,11 @@
 }
 
 
-//----------------------------
-//
-// Collision test
-
+/**
+ * \ingroup typeid-tests
+ * 
+ * Collision test.
+ */
 class CollisionTestCase : public TestCase
 {
 public:
@@ -156,8 +168,8 @@
        << "'" << t1Name << "', '" << t2Name << "'"
        << " in alphabetical order:"
        << endl;
-  TypeId t1 (t1Name.c_str ());
-  TypeId t2 (t2Name.c_str ());
+  TypeId t1 (t1Name);
+  TypeId t2 (t2Name);
 
   // Check that they are alphabetical: t1 name < t2 name
   NS_TEST_ASSERT_MSG_EQ ( (t1.GetHash () & HashChainFlag), 0,
@@ -197,31 +209,34 @@
 }
 
 
-//----------------------------
-//
-// Deprecated Attribute test
-
+/**
+ * \ingroup typeid-tests
+ * 
+ * Class used to test deprecated Attributes.
+ */
 class DeprecatedAttribute : public Object
 {
 private:
   // float m_obsAttr;  // this is obsolete, no trivial forwarding
   // int m_oldAttr;  // this has become m_attr
-  int m_attr;
+  int m_attr; //!< An attribute to test deprecation.
 
   // TracedValue<int> m_obsTrace;  // this is obsolete, no trivial forwarding
   // TracedValue<double> m_oldTrace;  // this has become m_trace
-  TracedValue<double> m_trace;
+  TracedValue<double> m_trace;  //!< A TracedValue to test deprecation.
 
 public:
   DeprecatedAttribute ()
     : m_attr (0)
   {
-    NS_UNUSED (m_attr);
   }
   virtual ~DeprecatedAttribute ()
   {}
 
-  // Register a type with a deprecated Attribute and TraceSource
+  /**
+   * \brief Get the type ID.
+   * \return The object TypeId.
+   */
   static TypeId GetTypeId (void)
   {
     static TypeId tid = TypeId ("DeprecatedAttribute")
@@ -276,6 +291,11 @@
 };
 
 
+/**
+ * \ingroup typeid-tests
+ * 
+ * Check deprecated Attributes and TraceSources.
+ */
 class DeprecatedAttributeTestCase : public TestCase
 {
 public:
@@ -334,10 +354,11 @@
 }
 
 
-//----------------------------
-//
-// Performance test
-
+/**
+ * \ingroup typeid-tests
+ * 
+ * Performance test: measure average lookup time.
+ */
 class LookupTimeTestCase : public TestCase
 {
 public:
@@ -347,6 +368,11 @@
 private:
   void DoRun (void);
   void DoSetup (void);
+  /**
+   * Report the performance test results.
+   * \param how How the TypeId is searched (name or hash).
+   * \param delta The time required for the lookup.
+   */
   void Report (const std::string how, const uint32_t delta) const;
 
   enum
@@ -424,10 +450,11 @@
 }
 
 
-//----------------------------
-//
-// TypeId test suites
-
+/**
+ * \ingroup typeid-tests
+ * 
+ * TypeId test suites.
+ */
 class TypeIdTestSuite : public TestSuite
 {
 public:
@@ -449,9 +476,15 @@
   AddTestCase (new DeprecatedAttributeTestCase, QUICK);
 }
 
-static TypeIdTestSuite g_TypeIdTestSuite;
+/// Static variable for test initialization.
+static TypeIdTestSuite g_TypeIdTestSuite; 
 
 
+/**
+ * \ingroup typeid-tests
+ * 
+ * TypeId performance test suites.
+ */
 class TypeIdPerformanceSuite : public TestSuite
 {
 public:
@@ -464,4 +497,5 @@
   AddTestCase (new LookupTimeTestCase, QUICK);
 }
 
+/// Static variable for test initialization.
 static TypeIdPerformanceSuite g_TypeIdPerformanceSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/core/wscript ns-3.36/src/core/wscript
--- ns-3.35/src/core/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/core/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,519 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-import sys
-import re
-
-from waflib import Context, Configure, Options, Utils
-import wutils
-
-int64x64 = {
-    # implementation name: [define, env, highprec]
-    'default': ['INT64X64_USE_128',    'INT64X64_USE_128',    '128-bit integer'], 
-    'int128':  ['INT64X64_USE_128',    'INT64X64_USE_128',    '128-bit integer'], 
-    'cairo':   ['INT64X64_USE_CAIRO',  'INT64X64_USE_CAIRO',  'cairo 128-bit integer'],
-    'double':  ['INT64X64_USE_DOUBLE', 'INT64X64_USE_DOUBLE', 'long double'],
-    }
-
-default_int64x64 = 'default'
-
-def options(opt):
-    assert default_int64x64 in int64x64
-    opt.add_option('--int64x64',
-                   action='store',
-                   default=default_int64x64,
-                   help=("Force the choice of int64x64_t implementation "
-                         "(normally only for debugging).  "
-                         "The supported implementations use int128_t, "
-                         "cairo_int128, or long double.  "
-                         "The int128_t implementation (the preferred option) "
-                         "requires compiler support.  "
-                         "The cairo implementation fallback provides exactly "
-                         "the same numerical results, but possibly at lower "
-                         "execution speed.  The long double implementation "
-                         "may not provide the same numerical results because "
-                         "the implementation-defined numerical precision may "
-                         "be less than the other implementations.  "
-                         "[Allowed Values: %s]"
-                         % ", ".join([repr(p) for p in list(int64x64.keys())])),
-                   choices=list(int64x64.keys()),
-                   dest='int64x64_impl')
-                   
-    opt.add_option('--disable-pthread',
-                   help=('Whether to enable the use of POSIX threads'),
-                   action="store_true", default=False,
-                   dest='disable_pthread')
-
-    opt.add_option('--check-version',
-                    help=("Print the current build version"),
-                    action="store_true", default=False,
-                    dest='check_version')
-
-    opt.add_option('--enable-build-version',
-                    help=("Check git repository for changes and update build version "
-                          "during waf build"),
-                    action="store_true", default=False,
-                    dest='enable_build_version')
-
-def configure(conf):
-
-    conf.load('versioning', ['waf-tools'])
-
-    conf.require_boost_incs('core', 'ns-3 core module', required=False)
-
-    int64x64_impl = Options.options.int64x64_impl
-    if int64x64_impl == 'default' or int64x64_impl == 'int128':
-
-        code_snip_type='''
-        #include <stdint.h>
-        
-        int main(int argc, char **argv) {
-	(void)argc; (void)argv;
-	if ((uint128_t *) 0) return 0;
-	if (sizeof (uint128_t)) return 0;
-	return 1;
-        }
-        '''
-        have_uint128  = conf.check_nonfatal(msg='checking for uint128_t',
-                                            define_name='HAVE_UINT128_T',
-                                            code=code_snip_type)
-
-        code_snip_type='''
-        #include <stdint.h>
-        
-        int main(int argc, char **argv) {
-	(void)argc; (void)argv;
-	if ((__uint128_t *) 0) return 0;
-	if (sizeof (__uint128_t)) return 0;
-	return 1;
-        }
-        '''
-        have__uint128 = conf.check_nonfatal(msg='checking for __uint128_t',
-                                            define_name='HAVE___UINT128_T',
-                                            code=code_snip_type)
-        if have_uint128 or have__uint128:
-            int64x64_impl = 'int128'
-        else:
-            int64x64_impl = 'cairo'
-        
-    def_flag, env_flag, highprec = int64x64[int64x64_impl]
-    # Add a tag confirming default choice
-    if Options.options.int64x64_impl == 'default':
-        highprec += ' (default)'
-    conf.define(def_flag, 1)
-    conf.env[env_flag] = 1
-    conf.msg('Checking high precision implementation', highprec)
-
-    conf.check_nonfatal(header_name='stdint.h', define_name='HAVE_STDINT_H')
-    conf.check_nonfatal(header_name='inttypes.h', define_name='HAVE_INTTYPES_H')
-    conf.check_nonfatal(header_name='sys/inttypes.h', define_name='HAVE_SYS_INT_TYPES_H')
-    conf.check_nonfatal(header_name='sys/types.h', define_name='HAVE_SYS_TYPES_H')
-    conf.check_nonfatal(header_name='sys/stat.h', define_name='HAVE_SYS_STAT_H')
-    conf.check_nonfatal(header_name='dirent.h', define_name='HAVE_DIRENT_H')
-
-    conf.check_nonfatal(header_name='signal.h', define_name='HAVE_SIGNAL_H')
-
-    # Check for POSIX threads
-    test_env = conf.env.derive()
-    if Utils.unversioned_sys_platform() != 'darwin' and Utils.unversioned_sys_platform() != 'cygwin':
-        test_env.append_value('LINKFLAGS', '-pthread')
-        test_env.append_value('CXXFLAGS', '-pthread')
-        test_env.append_value('CCFLAGS', '-pthread')
-    fragment = r"""
-#include <pthread.h>
-int main ()
-{
-   pthread_mutex_t m;
-   pthread_mutex_init (&m, NULL);
-   return 0;
-}
-"""
-    if Options.options.disable_pthread:
-        conf.report_optional_feature("Threading", "Threading Primitives",
-                                     False,
-                                     "Disabled by user request (--disable-pthread)")
-        have_pthread = False
-    else:
-        have_pthread = conf.check_nonfatal(header_name='pthread.h', define_name='HAVE_PTHREAD_H',
-                                           env=test_env, fragment=fragment,
-                                           errmsg='Could not find pthread support (build/config.log for details)')
-    if have_pthread:
-        # darwin accepts -pthread but prints a warning saying it is ignored
-        if Utils.unversioned_sys_platform() != 'darwin' and Utils.unversioned_sys_platform() != 'cygwin':
-            conf.env['CXXFLAGS_PTHREAD'] = '-pthread'
-            conf.env['CCFLAGS_PTHREAD'] = '-pthread'
-            conf.env['LINKFLAGS_PTHREAD'] = '-pthread'
-
-    conf.env['ENABLE_THREADING'] = have_pthread
-
-    conf.report_optional_feature("Threading", "Threading Primitives",
-                                 conf.env['ENABLE_THREADING'],
-                                 "<pthread.h> include not detected")
-
-    conf.check_nonfatal(header_name='stdint.h', define_name='HAVE_STDINT_H')
-    conf.check_nonfatal(header_name='inttypes.h', define_name='HAVE_INTTYPES_H')
-
-    conf.check_nonfatal(header_name='sys/inttypes.h', define_name='HAVE_SYS_INT_TYPES_H')
-
-    if not conf.check_nonfatal(lib='rt', uselib='RT, PTHREAD', define_name='HAVE_RT'):
-        conf.report_optional_feature("RealTime", "Real Time Simulator",
-                                     False, "librt is not available")
-    else:
-        conf.report_optional_feature("RealTime", "Real Time Simulator",
-                                     conf.env['ENABLE_THREADING'],
-                                     "threading not enabled")
-        conf.env["ENABLE_REAL_TIME"] = conf.env['ENABLE_THREADING']
-
-    if Options.options.enable_build_version:
-        conf.env['ENABLE_BUILD_VERSION'] = True 
-        conf.env.append_value('DEFINES', 'ENABLE_BUILD_VERSION=1')
-    else:
-        conf.env['ENABLE_BUILD_VERSION'] = False 
-
-    conf.write_config_header('ns3/core-config.h', top=True)
-
-def build(bld):
-
-
-    bld.install_files('${INCLUDEDIR}/%s%s/ns3' % (wutils.APPNAME, wutils.VERSION), '../../ns3/core-config.h')
-
-    core = bld.create_ns3_module('core')
-    core.source = [
-        'model/time.cc',
-        'model/event-id.cc',
-        'model/scheduler.cc',
-        'model/list-scheduler.cc',
-        'model/map-scheduler.cc',
-        'model/heap-scheduler.cc',
-        'model/calendar-scheduler.cc',
-        'model/priority-queue-scheduler.cc',
-        'model/event-impl.cc',
-        'model/simulator.cc',
-        'model/simulator-impl.cc',
-        'model/default-simulator-impl.cc',
-        'model/timer.cc',
-        'model/watchdog.cc',
-        'model/synchronizer.cc',
-        'model/make-event.cc',
-        'model/log.cc',
-        'model/breakpoint.cc',
-        'model/type-id.cc',
-        'model/attribute-construction-list.cc',
-        'model/object-base.cc',
-        'model/ref-count-base.cc',
-        'model/object.cc',
-        'model/test.cc',
-        'model/random-variable-stream.cc',
-        'model/rng-seed-manager.cc',
-        'model/rng-stream.cc',
-        'model/command-line.cc',
-        'model/type-name.cc',
-        'model/attribute.cc',
-        'model/boolean.cc',
-        'model/integer.cc',
-        'model/uinteger.cc',
-        'model/enum.cc',
-        'model/double.cc',
-        'model/int64x64.cc',
-        'model/string.cc',
-        'model/pointer.cc',
-        'model/object-ptr-container.cc',
-        'model/object-factory.cc',
-        'model/global-value.cc',
-        'model/trace-source-accessor.cc',
-        'model/config.cc',
-        'model/callback.cc',
-        'model/names.cc',
-        'model/vector.cc',
-        'model/fatal-impl.cc',
-        'model/system-path.cc',
-        'helper/random-variable-stream-helper.cc',
-        'helper/event-garbage-collector.cc',
-        'model/hash-function.cc',
-        'model/hash-murmur3.cc',
-        'model/hash-fnv.cc',
-        'model/hash.cc',
-        'model/des-metrics.cc',
-        'model/ascii-file.cc',
-        'model/node-printer.cc',
-        'model/time-printer.cc',
-        'model/show-progress.cc',
-        'model/system-wall-clock-timestamp.cc',
-        'helper/csv-reader.cc',
-        'model/length.cc',
-        'model/trickle-timer.cc',
-        ]
-
-    if (bld.env['ENABLE_EXAMPLES']):
-        core.source.append('model/example-as-test.cc')
-            
-    core_test = bld.create_ns3_module_test_library('core')
-    core_test.source = [
-        'test/attribute-test-suite.cc',
-        'test/attribute-container-test-suite.cc',
-        'test/build-profile-test-suite.cc',
-        'test/callback-test-suite.cc',
-        'test/command-line-test-suite.cc',
-        'test/config-test-suite.cc',
-        'test/global-value-test-suite.cc',
-        'test/int64x64-test-suite.cc',
-        'test/names-test-suite.cc',
-        'test/object-test-suite.cc',
-        'test/ptr-test-suite.cc',
-        'test/event-garbage-collector-test-suite.cc',
-        'test/many-uniform-random-variables-one-get-value-call-test-suite.cc',
-        'test/one-uniform-random-variable-many-get-value-calls-test-suite.cc',
-        'test/pair-value-test-suite.cc',
-        'test/sample-test-suite.cc',
-        'test/simulator-test-suite.cc',
-        'test/time-test-suite.cc',
-        'test/timer-test-suite.cc',
-        'test/traced-callback-test-suite.cc',
-        'test/type-traits-test-suite.cc',
-        'test/watchdog-test-suite.cc',
-        'test/hash-test-suite.cc',
-        'test/type-id-test-suite.cc',
-        'test/length-test-suite.cc',
-        'test/trickle-timer-test-suite.cc',
-        ]
-
-    if (bld.env['ENABLE_EXAMPLES']):
-        core_test.source.extend([
-            'test/examples-as-tests-test-suite.cc',
-            ])
-
-    headers = bld(features='ns3header')
-    headers.module = 'core'
-    headers.source = [
-        'model/nstime.h',
-        'model/event-id.h',
-        'model/event-impl.h',
-        'model/simulator.h',
-        'model/simulator-impl.h',
-        'model/default-simulator-impl.h',
-        'model/scheduler.h',
-        'model/list-scheduler.h',
-        'model/map-scheduler.h',
-        'model/heap-scheduler.h',
-        'model/calendar-scheduler.h',
-        'model/priority-queue-scheduler.h',
-        'model/simulation-singleton.h',
-        'model/singleton.h',
-        'model/timer.h',
-        'model/timer-impl.h',
-        'model/watchdog.h',
-        'model/synchronizer.h',
-        'model/make-event.h',
-        'model/system-wall-clock-ms.h',
-        'model/system-wall-clock-timestamp.h',
-        'model/empty.h',
-        'model/callback.h',
-        'model/object-base.h',
-        'model/ref-count-base.h',
-        'model/simple-ref-count.h',
-        'model/type-id.h',
-        'model/attribute-construction-list.h',
-        'model/ptr.h',
-        'model/object.h',
-        'model/log.h',
-        'model/log-macros-enabled.h',
-        'model/log-macros-disabled.h',
-        'model/assert.h',
-        'model/breakpoint.h',
-        'model/fatal-error.h',
-        'model/test.h',
-        'model/random-variable-stream.h',
-        'model/rng-seed-manager.h',
-        'model/rng-stream.h',
-        'model/command-line.h',
-        'model/type-name.h',
-        'model/type-traits.h',
-        'model/int-to-type.h',
-        'model/attribute.h',
-        'model/attribute-accessor-helper.h',
-        'model/boolean.h',
-        'model/int64x64.h',
-        'model/int64x64-double.h',
-        'model/integer.h',
-        'model/uinteger.h',
-        'model/double.h',
-        'model/enum.h',
-        'model/string.h',
-        'model/pointer.h',
-        'model/object-factory.h',
-        'model/attribute-helper.h',
-        'model/attribute-container.h',
-        'model/attribute-container-accessor-helper.h',
-        'model/global-value.h',
-        'model/traced-callback.h',
-        'model/traced-value.h',
-        'model/trace-source-accessor.h',
-        'model/config.h',
-        'model/object-ptr-container.h',
-        'model/object-vector.h',
-        'model/object-map.h',
-        'model/pair.h',
-        'model/deprecated.h',
-        'model/abort.h',
-        'model/names.h',
-        'model/vector.h',
-        'model/default-deleter.h',
-        'model/fatal-impl.h',
-        'model/system-path.h',
-        'model/unused.h',
-        'model/math.h',
-        'helper/event-garbage-collector.h',
-        'helper/random-variable-stream-helper.h',
-        'model/hash-function.h',
-        'model/hash-murmur3.h',
-        'model/hash-fnv.h',
-        'model/hash.h',
-        'model/valgrind.h',
-        'model/non-copyable.h',
-        'model/build-profile.h',
-        'model/des-metrics.h',
-        'model/ascii-file.h',
-        'model/ascii-test.h',
-        'model/node-printer.h',
-        'model/time-printer.h',
-        'model/show-progress.h',
-        'helper/csv-reader.h',
-        'model/length.h',
-        'model/trickle-timer.h',
-        ]
-
-    if (bld.env['ENABLE_EXAMPLES']):
-        headers.source.append('model/example-as-test.h')
-
-    if sys.platform == 'win32':
-        core.source.extend([
-            'model/win32-system-wall-clock-ms.cc',
-            ])
-    else:
-        core.source.extend([
-            'model/unix-system-wall-clock-ms.cc',
-            ])
-
-
-    env = bld.env
-    if env['INT64X64_USE_DOUBLE']:
-        headers.source.extend(['model/int64x64-double.h'])
-    elif env['INT64X64_USE_128']:
-        headers.source.extend(['model/int64x64-128.h'])
-        core.source.extend(['model/int64x64-128.cc'])
-    elif env['INT64X64_USE_CAIRO']:
-        core.source.extend([
-            'model/int64x64-cairo.cc',
-            ])
-        headers.source.extend([
-            'model/int64x64-cairo.h',
-            'model/cairo-wideint-private.h',
-            ])
-
-    if env['ENABLE_REAL_TIME']:
-        headers.source.extend([
-                'model/realtime-simulator-impl.h',
-                'model/wall-clock-synchronizer.h',
-                ])
-        core.source.extend([
-                'model/realtime-simulator-impl.cc',
-                'model/wall-clock-synchronizer.cc',
-                ])
-        core.use.append('RT')
-        core_test.use.append('RT')
-
-    if env['ENABLE_THREADING']:
-        core.source.extend([
-            'model/system-thread.cc',
-            'model/unix-fd-reader.cc',
-            'model/unix-system-mutex.cc',
-            'model/unix-system-condition.cc',
-            ])
-        core.use.append('PTHREAD')
-        core_test.use.append('PTHREAD')
-        core_test.source.extend(['test/threaded-test-suite.cc'])
-        headers.source.extend([
-                'model/unix-fd-reader.h',
-                'model/system-mutex.h',
-                'model/system-thread.h',
-                'model/system-condition.h',
-                ])
-
-    if env['ENABLE_GSL']:
-        core.use.extend(['GSL', 'GSLCBLAS', 'M'])
-        core_test.use.extend(['GSL', 'GSLCBLAS', 'M'])
-        core_test.source.extend([
-                'test/rng-test-suite.cc',
-                'test/random-variable-stream-test-suite.cc'
-                ])
-
-    vers_tg = None
-    if env['ENABLE_BUILD_VERSION']:
-        version_template = bld.path.find_node('model/version-defines.h.in')
-        version_header = bld.bldnode.make_node('ns3/version-defines.h') 
-
-        vers_tg = bld(features='version-defines', 
-                      source=version_template, 
-                      target=version_header)
-
-        #silence errors about no mapping for version-defines.h.in
-        vers_tg.mappings['.h'] = lambda *a, **k: None
-        vers_tg.mappings['.h.in'] = lambda *a, **k: None
-
-        core.source.append('model/version.cc')
-
-        headers.source.append('model/version.h')
-
-    if bld.env['INCLUDES_BOOST']:
-       core.use.append('BOOST')
-
-    if Options.options.check_version:
-        print_version(bld, vers_tg)
-        raise SystemExit(0)
-        return
-
-    if (bld.env['ENABLE_EXAMPLES']):
-        bld.recurse('examples')
-
-    pymod = bld.ns3_python_bindings()
-    if pymod is not None:
-        pymod.source += ['bindings/module_helpers.cc']
-
-def print_version(bld, tg):
-
-    if tg is None:
-        print ('Build version support is not enabled, reconfigure with --enable-build-version flag')
-        return
-
-    tg.post()
-
-    for task in tg.tasks:
-        if task.__class__.__name__ == 'git_ns3_version_info':
-            #manually run task
-            task.run()
-            break
-
-    handlers = {
-        'VERSION_TAG': lambda s: s.strip('"'),
-        'CLOSEST_TAG': lambda s: s.strip('"'),
-        'VERSION_TAG_DISTANCE': lambda s: '' if s == '0' else "+" + s,
-        'VERSION_COMMIT_HASH': lambda s: "@" + s.strip('"'),
-        'VERSION_DIRTY_FLAG': lambda s: '' if s == '0' else '-dirty',
-        'BUILD_PROFILE': lambda s: "-" + s
-    }
-
-    fields=('VERSION_TAG', 'CLOSEST_TAG', 'VERSION_TAG_DISTANCE', 
-            'VERSION_COMMIT_HASH', 'VERSION_DIRTY_FLAG', 'BUILD_PROFILE') 
-
-    parts = dict()
-
-    for field in fields:
-        if field in bld.env:
-            parts[field] = handlers[field](bld.env[field])
-        else:
-            parts[field] = ''
-
-    if parts['CLOSEST_TAG'] != parts['VERSION_TAG']:
-        parts['CLOSEST_TAG'] = "+" + parts['CLOSEST_TAG']
-    else:
-        parts['CLOSEST_TAG'] = ""
-    
-    print(''.join([parts[f] for f in fields]))
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/csma/bindings/modulegen__gcc_ILP32.py ns-3.36/src/csma/bindings/modulegen__gcc_ILP32.py
--- ns-3.35/src/csma/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/csma/bindings/modulegen__gcc_ILP32.py	2022-04-30 18:23:57.810733300 -0700
@@ -87,6 +87,8 @@
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::TraceSourceAccessor'])
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'], import_from_module='ns.core')
     ## hash.h (module 'core'): ns3::Hasher [class]
     module.add_class('Hasher', import_from_module='ns.core')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
@@ -223,27 +225,27 @@
     module.add_class('RandomVariableStream', import_from_module='ns.core', parent=root_module['ns3::Object'])
     ## random-variable-stream.h (module 'core'): ns3::SequentialRandomVariable [class]
     module.add_class('SequentialRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::OutputStreamWrapper', 'ns3::empty', 'ns3::DefaultDeleter<ns3::OutputStreamWrapper>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::QueueItem', 'ns3::empty', 'ns3::DefaultDeleter<ns3::QueueItem>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
     module.add_class('TraceSourceAccessor', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >'])
@@ -454,7 +456,7 @@
     module.add_enum('EncapsulationMode', ['ILLEGAL', 'DIX', 'LLC'], outer_class=root_module['ns3::CsmaNetDevice'])
     ## queue-item.h (module 'network'): ns3::QueueDiscItem [class]
     module.add_class('QueueDiscItem', import_from_module='ns.network', parent=root_module['ns3::QueueItem'])
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     module.add_container('std::list< unsigned int >', 'unsigned int', container_type='list')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )', 'ns3::TimePrinter')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )*', 'ns3::TimePrinter*')
@@ -3380,8 +3382,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -3609,14 +3611,14 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('>=')
     cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_unary_numeric_operator('-')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
     cls.add_constructor([])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(double const value) [constructor]
@@ -3635,6 +3637,8 @@
     cls.add_constructor([param('long unsigned int const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int const v) [constructor]
     cls.add_constructor([param('long long unsigned int const', 'v')])
+    ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int128_t const v) [constructor]
+    cls.add_constructor([param('int128_t const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t const hi, uint64_t const lo) [constructor]
     cls.add_constructor([param('int64_t const', 'hi'), param('uint64_t const', 'lo')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [constructor]
@@ -3713,6 +3717,10 @@
     cls.add_method('AssignStreams', 
                    'int64_t', 
                    [param('ns3::NetDeviceContainer', 'c'), param('int64_t', 'stream')])
+    ## csma-helper.h (module 'csma'): void ns3::CsmaHelper::DisableFlowControl() [member function]
+    cls.add_method('DisableFlowControl', 
+                   'void', 
+                   [])
     ## csma-helper.h (module 'csma'): ns3::NetDeviceContainer ns3::CsmaHelper::Install(ns3::Ptr<ns3::Node> node) const [member function]
     cls.add_method('Install', 
                    'ns3::NetDeviceContainer', 
@@ -4064,6 +4072,11 @@
     cls.add_method('SetMaxSize', 
                    'void', 
                    [param('ns3::QueueSize', 'size')])
+    ## queue.h (module 'network'): bool ns3::QueueBase::WouldOverflow(uint32_t nPackets, uint32_t nBytes) const [member function]
+    cls.add_method('WouldOverflow', 
+                   'bool', 
+                   [param('uint32_t', 'nPackets'), param('uint32_t', 'nBytes')], 
+                   is_const=True)
     return
 
 def register_Ns3RandomVariableStream_methods(root_module, cls):
@@ -4150,79 +4163,79 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3OutputStreamWrapper_Ns3Empty_Ns3DefaultDeleter__lt__ns3OutputStreamWrapper__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter< ns3::OutputStreamWrapper > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3QueueItem_Ns3Empty_Ns3DefaultDeleter__lt__ns3QueueItem__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> >::SimpleRefCount(ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>>::SimpleRefCount(ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::QueueItem, ns3::empty, ns3::DefaultDeleter< ns3::QueueItem > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
@@ -5548,7 +5561,7 @@
     cls.add_constructor([param('ns3::ListErrorModel const &', 'arg0')])
     ## error-model.h (module 'network'): ns3::ListErrorModel::ListErrorModel() [constructor]
     cls.add_constructor([])
-    ## error-model.h (module 'network'): std::list<unsigned int, std::allocator<unsigned int> > ns3::ListErrorModel::GetList() const [member function]
+    ## error-model.h (module 'network'): std::list<unsigned int, std::allocator<unsigned int>> ns3::ListErrorModel::GetList() const [member function]
     cls.add_method('GetList', 
                    'std::list< unsigned int >', 
                    [], 
@@ -5558,7 +5571,7 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## error-model.h (module 'network'): void ns3::ListErrorModel::SetList(std::list<unsigned int, std::allocator<unsigned int> > const & packetlist) [member function]
+    ## error-model.h (module 'network'): void ns3::ListErrorModel::SetList(std::list<unsigned int, std::allocator<unsigned int>> const & packetlist) [member function]
     cls.add_method('SetList', 
                    'void', 
                    [param('std::list< unsigned int > const &', 'packetlist')])
@@ -5812,10 +5825,16 @@
     cls.add_method('ExtractNeighborIndex', 
                    'uint32_t', 
                    [param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetEpoch() const [member function]
+    cls.add_method('GetEpoch', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() const [member function]
     cls.add_method('GetRemainingBits', 
                    'uint32_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -5826,6 +5845,10 @@
                    'uint32_t', 
                    [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
+    ## nix-vector.h (module 'network'): void ns3::NixVector::SetEpoch(uint32_t epoch) [member function]
+    cls.add_method('SetEpoch', 
+                   'void', 
+                   [param('uint32_t', 'epoch')])
     return
 
 def register_Ns3Node_methods(root_module, cls):
@@ -6202,10 +6225,11 @@
                    'uint32_t', 
                    [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) const [member function]
     cls.add_method('SetNixVector', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')], 
+                   is_const=True)
     ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
     cls.add_method('ToString', 
                    'std::string', 
@@ -6582,7 +6606,7 @@
     cls.add_constructor([param('ns3::ReceiveListErrorModel const &', 'arg0')])
     ## error-model.h (module 'network'): ns3::ReceiveListErrorModel::ReceiveListErrorModel() [constructor]
     cls.add_constructor([])
-    ## error-model.h (module 'network'): std::list<unsigned int, std::allocator<unsigned int> > ns3::ReceiveListErrorModel::GetList() const [member function]
+    ## error-model.h (module 'network'): std::list<unsigned int, std::allocator<unsigned int>> ns3::ReceiveListErrorModel::GetList() const [member function]
     cls.add_method('GetList', 
                    'std::list< unsigned int >', 
                    [], 
@@ -6592,7 +6616,7 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## error-model.h (module 'network'): void ns3::ReceiveListErrorModel::SetList(std::list<unsigned int, std::allocator<unsigned int> > const & packetlist) [member function]
+    ## error-model.h (module 'network'): void ns3::ReceiveListErrorModel::SetList(std::list<unsigned int, std::allocator<unsigned int>> const & packetlist) [member function]
     cls.add_method('SetList', 
                    'void', 
                    [param('std::list< unsigned int > const &', 'packetlist')])
@@ -6993,11 +7017,11 @@
     cls.add_method('Attach', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CsmaChannel >', 'ch')])
-    ## csma-net-device.h (module 'csma'): void ns3::CsmaNetDevice::SetQueue(ns3::Ptr<ns3::Queue<ns3::Packet> > queue) [member function]
+    ## csma-net-device.h (module 'csma'): void ns3::CsmaNetDevice::SetQueue(ns3::Ptr<ns3::Queue<ns3::Packet>> queue) [member function]
     cls.add_method('SetQueue', 
                    'void', 
                    [param('ns3::Ptr< ns3::Queue< ns3::Packet > >', 'queue')])
-    ## csma-net-device.h (module 'csma'): ns3::Ptr<ns3::Queue<ns3::Packet> > ns3::CsmaNetDevice::GetQueue() const [member function]
+    ## csma-net-device.h (module 'csma'): ns3::Ptr<ns3::Queue<ns3::Packet>> ns3::CsmaNetDevice::GetQueue() const [member function]
     cls.add_method('GetQueue', 
                    'ns3::Ptr< ns3::Queue< ns3::Packet > >', 
                    [], 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/csma/bindings/modulegen__gcc_LP64.py ns-3.36/src/csma/bindings/modulegen__gcc_LP64.py
--- ns-3.35/src/csma/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/csma/bindings/modulegen__gcc_LP64.py	2022-04-30 18:23:57.810733300 -0700
@@ -87,6 +87,8 @@
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::TraceSourceAccessor'])
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'], import_from_module='ns.core')
     ## hash.h (module 'core'): ns3::Hasher [class]
     module.add_class('Hasher', import_from_module='ns.core')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
@@ -223,27 +225,27 @@
     module.add_class('RandomVariableStream', import_from_module='ns.core', parent=root_module['ns3::Object'])
     ## random-variable-stream.h (module 'core'): ns3::SequentialRandomVariable [class]
     module.add_class('SequentialRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::OutputStreamWrapper', 'ns3::empty', 'ns3::DefaultDeleter<ns3::OutputStreamWrapper>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::QueueItem', 'ns3::empty', 'ns3::DefaultDeleter<ns3::QueueItem>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
     module.add_class('TraceSourceAccessor', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >'])
@@ -454,7 +456,7 @@
     module.add_enum('EncapsulationMode', ['ILLEGAL', 'DIX', 'LLC'], outer_class=root_module['ns3::CsmaNetDevice'])
     ## queue-item.h (module 'network'): ns3::QueueDiscItem [class]
     module.add_class('QueueDiscItem', import_from_module='ns.network', parent=root_module['ns3::QueueItem'])
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     module.add_container('std::list< unsigned int >', 'unsigned int', container_type='list')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )', 'ns3::TimePrinter')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )*', 'ns3::TimePrinter*')
@@ -3380,8 +3382,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -3609,14 +3611,14 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('>=')
     cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_unary_numeric_operator('-')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
     cls.add_constructor([])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(double const value) [constructor]
@@ -3635,6 +3637,8 @@
     cls.add_constructor([param('long unsigned int const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int const v) [constructor]
     cls.add_constructor([param('long long unsigned int const', 'v')])
+    ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int128_t const v) [constructor]
+    cls.add_constructor([param('int128_t const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t const hi, uint64_t const lo) [constructor]
     cls.add_constructor([param('int64_t const', 'hi'), param('uint64_t const', 'lo')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [constructor]
@@ -3713,6 +3717,10 @@
     cls.add_method('AssignStreams', 
                    'int64_t', 
                    [param('ns3::NetDeviceContainer', 'c'), param('int64_t', 'stream')])
+    ## csma-helper.h (module 'csma'): void ns3::CsmaHelper::DisableFlowControl() [member function]
+    cls.add_method('DisableFlowControl', 
+                   'void', 
+                   [])
     ## csma-helper.h (module 'csma'): ns3::NetDeviceContainer ns3::CsmaHelper::Install(ns3::Ptr<ns3::Node> node) const [member function]
     cls.add_method('Install', 
                    'ns3::NetDeviceContainer', 
@@ -4064,6 +4072,11 @@
     cls.add_method('SetMaxSize', 
                    'void', 
                    [param('ns3::QueueSize', 'size')])
+    ## queue.h (module 'network'): bool ns3::QueueBase::WouldOverflow(uint32_t nPackets, uint32_t nBytes) const [member function]
+    cls.add_method('WouldOverflow', 
+                   'bool', 
+                   [param('uint32_t', 'nPackets'), param('uint32_t', 'nBytes')], 
+                   is_const=True)
     return
 
 def register_Ns3RandomVariableStream_methods(root_module, cls):
@@ -4150,79 +4163,79 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3OutputStreamWrapper_Ns3Empty_Ns3DefaultDeleter__lt__ns3OutputStreamWrapper__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter< ns3::OutputStreamWrapper > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3QueueItem_Ns3Empty_Ns3DefaultDeleter__lt__ns3QueueItem__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> >::SimpleRefCount(ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>>::SimpleRefCount(ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::QueueItem, ns3::empty, ns3::DefaultDeleter< ns3::QueueItem > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
@@ -5548,7 +5561,7 @@
     cls.add_constructor([param('ns3::ListErrorModel const &', 'arg0')])
     ## error-model.h (module 'network'): ns3::ListErrorModel::ListErrorModel() [constructor]
     cls.add_constructor([])
-    ## error-model.h (module 'network'): std::list<unsigned int, std::allocator<unsigned int> > ns3::ListErrorModel::GetList() const [member function]
+    ## error-model.h (module 'network'): std::list<unsigned int, std::allocator<unsigned int>> ns3::ListErrorModel::GetList() const [member function]
     cls.add_method('GetList', 
                    'std::list< unsigned int >', 
                    [], 
@@ -5558,7 +5571,7 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## error-model.h (module 'network'): void ns3::ListErrorModel::SetList(std::list<unsigned int, std::allocator<unsigned int> > const & packetlist) [member function]
+    ## error-model.h (module 'network'): void ns3::ListErrorModel::SetList(std::list<unsigned int, std::allocator<unsigned int>> const & packetlist) [member function]
     cls.add_method('SetList', 
                    'void', 
                    [param('std::list< unsigned int > const &', 'packetlist')])
@@ -5812,10 +5825,16 @@
     cls.add_method('ExtractNeighborIndex', 
                    'uint32_t', 
                    [param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetEpoch() const [member function]
+    cls.add_method('GetEpoch', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() const [member function]
     cls.add_method('GetRemainingBits', 
                    'uint32_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -5826,6 +5845,10 @@
                    'uint32_t', 
                    [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
+    ## nix-vector.h (module 'network'): void ns3::NixVector::SetEpoch(uint32_t epoch) [member function]
+    cls.add_method('SetEpoch', 
+                   'void', 
+                   [param('uint32_t', 'epoch')])
     return
 
 def register_Ns3Node_methods(root_module, cls):
@@ -6202,10 +6225,11 @@
                    'uint32_t', 
                    [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) const [member function]
     cls.add_method('SetNixVector', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')], 
+                   is_const=True)
     ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
     cls.add_method('ToString', 
                    'std::string', 
@@ -6582,7 +6606,7 @@
     cls.add_constructor([param('ns3::ReceiveListErrorModel const &', 'arg0')])
     ## error-model.h (module 'network'): ns3::ReceiveListErrorModel::ReceiveListErrorModel() [constructor]
     cls.add_constructor([])
-    ## error-model.h (module 'network'): std::list<unsigned int, std::allocator<unsigned int> > ns3::ReceiveListErrorModel::GetList() const [member function]
+    ## error-model.h (module 'network'): std::list<unsigned int, std::allocator<unsigned int>> ns3::ReceiveListErrorModel::GetList() const [member function]
     cls.add_method('GetList', 
                    'std::list< unsigned int >', 
                    [], 
@@ -6592,7 +6616,7 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## error-model.h (module 'network'): void ns3::ReceiveListErrorModel::SetList(std::list<unsigned int, std::allocator<unsigned int> > const & packetlist) [member function]
+    ## error-model.h (module 'network'): void ns3::ReceiveListErrorModel::SetList(std::list<unsigned int, std::allocator<unsigned int>> const & packetlist) [member function]
     cls.add_method('SetList', 
                    'void', 
                    [param('std::list< unsigned int > const &', 'packetlist')])
@@ -6993,11 +7017,11 @@
     cls.add_method('Attach', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CsmaChannel >', 'ch')])
-    ## csma-net-device.h (module 'csma'): void ns3::CsmaNetDevice::SetQueue(ns3::Ptr<ns3::Queue<ns3::Packet> > queue) [member function]
+    ## csma-net-device.h (module 'csma'): void ns3::CsmaNetDevice::SetQueue(ns3::Ptr<ns3::Queue<ns3::Packet>> queue) [member function]
     cls.add_method('SetQueue', 
                    'void', 
                    [param('ns3::Ptr< ns3::Queue< ns3::Packet > >', 'queue')])
-    ## csma-net-device.h (module 'csma'): ns3::Ptr<ns3::Queue<ns3::Packet> > ns3::CsmaNetDevice::GetQueue() const [member function]
+    ## csma-net-device.h (module 'csma'): ns3::Ptr<ns3::Queue<ns3::Packet>> ns3::CsmaNetDevice::GetQueue() const [member function]
     cls.add_method('GetQueue', 
                    'ns3::Ptr< ns3::Queue< ns3::Packet > >', 
                    [], 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/csma/CMakeLists.txt ns-3.36/src/csma/CMakeLists.txt
--- ns-3.35/src/csma/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/csma/CMakeLists.txt	2022-04-30 18:23:57.810733300 -0700
@@ -0,0 +1,15 @@
+build_lib(
+  LIBNAME csma
+  SOURCE_FILES
+    helper/csma-helper.cc
+    model/backoff.cc
+    model/csma-channel.cc
+    model/csma-net-device.cc
+  HEADER_FILES
+    helper/csma-helper.h
+    model/backoff.h
+    model/csma-channel.h
+    model/csma-net-device.h
+  LIBRARIES_TO_LINK ${libnetwork}
+  TEST_SOURCES ${test_sources}
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/csma/examples/CMakeLists.txt ns-3.36/src/csma/examples/CMakeLists.txt
--- ns-3.35/src/csma/examples/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/csma/examples/CMakeLists.txt	2022-04-30 18:23:57.814733300 -0700
@@ -0,0 +1,39 @@
+set(base_examples
+    csma-one-subnet
+    csma-broadcast
+    csma-packet-socket
+    csma-multicast
+)
+foreach(
+  example
+  ${base_examples}
+)
+  build_lib_example(
+    NAME ${example}
+    SOURCE_FILES ${example}.cc
+    LIBRARIES_TO_LINK
+      ${libcsma}
+      ${libinternet}
+      ${libapplications}
+  )
+endforeach()
+
+build_lib_example(
+  NAME csma-raw-ip-socket
+  SOURCE_FILES csma-raw-ip-socket.cc
+  LIBRARIES_TO_LINK
+    ${libcsma}
+    ${libinternet}
+    ${libapplications}
+    ${libinternet-apps}
+)
+
+build_lib_example(
+  NAME csma-ping
+  SOURCE_FILES csma-ping.cc
+  LIBRARIES_TO_LINK
+    ${libcsma}
+    ${libinternet}
+    ${libapplications}
+    ${libinternet-apps}
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/csma/examples/wscript ns-3.36/src/csma/examples/wscript
--- ns-3.35/src/csma/examples/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/csma/examples/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,20 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    obj = bld.create_ns3_program('csma-one-subnet', ['csma', 'internet', 'applications'])
-    obj.source = 'csma-one-subnet.cc'
-
-    obj = bld.create_ns3_program('csma-broadcast', ['csma', 'internet', 'applications'])
-    obj.source = 'csma-broadcast.cc'
-
-    obj = bld.create_ns3_program('csma-packet-socket', ['csma', 'internet', 'applications'])
-    obj.source = 'csma-packet-socket.cc'
-
-    obj = bld.create_ns3_program('csma-multicast', ['csma', 'internet', 'applications'])
-    obj.source = 'csma-multicast.cc'
-
-    obj = bld.create_ns3_program('csma-raw-ip-socket', ['csma', 'internet', 'applications', 'internet-apps'])
-    obj.source = 'csma-raw-ip-socket.cc'
-
-    obj = bld.create_ns3_program('csma-ping', ['csma', 'internet', 'applications', 'internet-apps'])
-    obj.source = 'csma-ping.cc'
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/csma/helper/csma-helper.cc ns-3.36/src/csma/helper/csma-helper.cc
--- ns-3.35/src/csma/helper/csma-helper.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/csma/helper/csma-helper.cc	2022-04-30 18:23:57.814733300 -0700
@@ -44,6 +44,7 @@
   m_queueFactory.SetTypeId ("ns3::DropTailQueue<Packet>");
   m_deviceFactory.SetTypeId ("ns3::CsmaNetDevice");
   m_channelFactory.SetTypeId ("ns3::CsmaChannel");
+  m_enableFlowControl = true;
 }
 
 void 
@@ -74,6 +75,12 @@
   m_channelFactory.Set (n1, v1);
 }
 
+void
+CsmaHelper::DisableFlowControl (void)
+{
+  m_enableFlowControl = false;
+}
+
 void 
 CsmaHelper::EnablePcapInternal (std::string prefix, Ptr<NetDevice> nd, bool promiscuous, bool explicitFilename)
 {
@@ -310,11 +317,13 @@
   Ptr<Queue<Packet> > queue = m_queueFactory.Create<Queue<Packet> > ();
   device->SetQueue (queue);
   device->Attach (channel);
-  // Aggregate a NetDeviceQueueInterface object
-  Ptr<NetDeviceQueueInterface> ndqi = CreateObject<NetDeviceQueueInterface> ();
-  ndqi->GetTxQueue (0)->ConnectQueueTraces (queue);
-  device->AggregateObject (ndqi);
-
+  if (m_enableFlowControl)
+    {
+      // Aggregate a NetDeviceQueueInterface object
+      Ptr<NetDeviceQueueInterface> ndqi = CreateObject<NetDeviceQueueInterface> ();
+      ndqi->GetTxQueue (0)->ConnectQueueTraces (queue);
+      device->AggregateObject (ndqi);
+    }
   return device;
 }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/csma/helper/csma-helper.h ns-3.36/src/csma/helper/csma-helper.h
--- ns-3.35/src/csma/helper/csma-helper.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/csma/helper/csma-helper.h	2022-04-30 18:23:57.814733300 -0700
@@ -91,6 +91,16 @@
   void SetChannelAttribute (std::string n1, const AttributeValue &v1);
 
   /**
+   * Disable flow control only if you know what you are doing. By disabling
+   * flow control, this NetDevice will be sent packets even if there is no
+   * room for them (such packets will be likely dropped by this NetDevice).
+   * Also, any queue disc installed on this NetDevice will have no effect,
+   * as every packet enqueued to the traffic control layer queue disc will
+   * be immediately dequeued.
+   */
+  void DisableFlowControl (void);
+
+  /**
    * This method creates an ns3::CsmaChannel with the attributes configured by
    * CsmaHelper::SetChannelAttribute, an ns3::CsmaNetDevice with the attributes
    * configured by CsmaHelper::SetDeviceAttribute and then adds the device
@@ -250,6 +260,7 @@
   ObjectFactory m_queueFactory;   //!< factory for the queues
   ObjectFactory m_deviceFactory;  //!< factory for the NetDevices
   ObjectFactory m_channelFactory; //!< factory for the channel
+  bool m_enableFlowControl;       //!< whether to enable flow control
 };
 
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/csma/wscript ns-3.36/src/csma/wscript
--- ns-3.35/src/csma/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/csma/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,23 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    obj = bld.create_ns3_module('csma', ['network'])
-    obj.source = [
-        'model/backoff.cc',
-        'model/csma-net-device.cc',
-        'model/csma-channel.cc',
-        'helper/csma-helper.cc',
-        ]
-    headers = bld(features='ns3header')
-    headers.module = 'csma'
-    headers.source = [
-        'model/backoff.h',
-        'model/csma-net-device.h',
-        'model/csma-channel.h',
-        'helper/csma-helper.h',
-        ]
-
-    if bld.env['ENABLE_EXAMPLES']:
-        bld.recurse('examples')
-
-    bld.ns3_python_bindings()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/csma-layout/bindings/modulegen__gcc_ILP32.py ns-3.36/src/csma-layout/bindings/modulegen__gcc_ILP32.py
--- ns-3.35/src/csma-layout/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/csma-layout/bindings/modulegen__gcc_ILP32.py	2022-04-30 18:23:57.810733300 -0700
@@ -87,6 +87,8 @@
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::TraceSourceAccessor'])
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'], import_from_module='ns.core')
     ## hash.h (module 'core'): ns3::Hasher [class]
     module.add_class('Hasher', import_from_module='ns.core')
     ## inet6-socket-address.h (module 'network'): ns3::Inet6SocketAddress [class]
@@ -267,29 +269,29 @@
     module.add_class('AggregateIterator', import_from_module='ns.core', outer_class=root_module['ns3::Object'])
     ## pcap-file-wrapper.h (module 'network'): ns3::PcapFileWrapper [class]
     module.add_class('PcapFileWrapper', import_from_module='ns.network', parent=root_module['ns3::Object'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv4MulticastRoute', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv4Route', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv4Route>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::OutputStreamWrapper', 'ns3::empty', 'ns3::DefaultDeleter<ns3::OutputStreamWrapper>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
     ## socket.h (module 'network'): ns3::Socket [class]
     module.add_class('Socket', import_from_module='ns.network', parent=root_module['ns3::Object'])
@@ -501,7 +503,7 @@
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::Socket>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::Socket>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     module.add_container('std::vector< bool >', 'bool', container_type='vector')
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     module.add_container('std::vector< ns3::Ipv6Address >', 'ns3::Ipv6Address', container_type='vector')
     module.add_container('std::map< unsigned int, unsigned int >', ('unsigned int', 'unsigned int'), container_type='map')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )', 'ns3::TimePrinter')
@@ -2539,11 +2541,11 @@
     cls.add_method('Assign', 
                    'ns3::Ipv6InterfaceContainer', 
                    [param('ns3::NetDeviceContainer const &', 'c')])
-    ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6InterfaceContainer ns3::Ipv6AddressHelper::Assign(ns3::NetDeviceContainer const & c, std::vector<bool, std::allocator<bool> > withConfiguration) [member function]
+    ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6InterfaceContainer ns3::Ipv6AddressHelper::Assign(ns3::NetDeviceContainer const & c, std::vector<bool, std::allocator<bool>> withConfiguration) [member function]
     cls.add_method('Assign', 
                    'ns3::Ipv6InterfaceContainer', 
                    [param('ns3::NetDeviceContainer const &', 'c'), param('std::vector< bool >', 'withConfiguration')])
-    ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6InterfaceContainer ns3::Ipv6AddressHelper::Assign(ns3::NetDeviceContainer const & c, std::vector<bool, std::allocator<bool> > withConfiguration, std::vector<bool, std::allocator<bool> > onLink) [member function]
+    ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6InterfaceContainer ns3::Ipv6AddressHelper::Assign(ns3::NetDeviceContainer const & c, std::vector<bool, std::allocator<bool>> withConfiguration, std::vector<bool, std::allocator<bool>> onLink) [member function]
     cls.add_method('Assign', 
                    'ns3::Ipv6InterfaceContainer', 
                    [param('ns3::NetDeviceContainer const &', 'c'), param('std::vector< bool >', 'withConfiguration'), param('std::vector< bool >', 'onLink')])
@@ -4019,8 +4021,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -4243,14 +4245,14 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('>=')
     cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_unary_numeric_operator('-')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
     cls.add_constructor([])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(double const value) [constructor]
@@ -4269,6 +4271,8 @@
     cls.add_constructor([param('long unsigned int const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int const v) [constructor]
     cls.add_constructor([param('long long unsigned int const', 'v')])
+    ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int128_t const v) [constructor]
+    cls.add_constructor([param('int128_t const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t const hi, uint64_t const lo) [constructor]
     cls.add_constructor([param('int64_t const', 'hi'), param('uint64_t const', 'lo')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [constructor]
@@ -4347,6 +4351,10 @@
     cls.add_method('AssignStreams', 
                    'int64_t', 
                    [param('ns3::NetDeviceContainer', 'c'), param('int64_t', 'stream')])
+    ## csma-helper.h (module 'csma'): void ns3::CsmaHelper::DisableFlowControl() [member function]
+    cls.add_method('DisableFlowControl', 
+                   'void', 
+                   [])
     ## csma-helper.h (module 'csma'): ns3::NetDeviceContainer ns3::CsmaHelper::Install(ns3::Ptr<ns3::Node> node) const [member function]
     cls.add_method('Install', 
                    'ns3::NetDeviceContainer', 
@@ -4510,10 +4518,6 @@
     cls.add_method('SetTcp', 
                    'void', 
                    [param('std::string', 'tid')])
-    ## internet-stack-helper.h (module 'internet'): void ns3::InternetStackHelper::SetTcp(std::string tid, std::string attr, ns3::AttributeValue const & val) [member function]
-    cls.add_method('SetTcp', 
-                   'void', 
-                   [param('std::string', 'tid'), param('std::string', 'attr'), param('ns3::AttributeValue const &', 'val')])
     ## internet-stack-helper.h (module 'internet'): void ns3::InternetStackHelper::EnableAsciiIpv4Internal(ns3::Ptr<ns3::OutputStreamWrapper> stream, std::string prefix, ns3::Ptr<ns3::Ipv4> ipv4, uint32_t interface, bool explicitFilename) [member function]
     cls.add_method('EnableAsciiIpv4Internal', 
                    'void', 
@@ -5018,86 +5022,86 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Ipv4MulticastRoute_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv4MulticastRoute__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter< ns3::Ipv4MulticastRoute > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Ipv4Route_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv4Route__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter< ns3::Ipv4Route > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3OutputStreamWrapper_Ns3Empty_Ns3DefaultDeleter__lt__ns3OutputStreamWrapper__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter< ns3::OutputStreamWrapper > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
@@ -5220,7 +5224,7 @@
                    'uint8_t', 
                    [param('uint8_t', 'ipTos')], 
                    is_static=True)
-    ## socket.h (module 'network'): void ns3::Socket::Ipv6JoinGroup(ns3::Ipv6Address address, ns3::Socket::Ipv6MulticastFilterMode filterMode, std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address> > sourceAddresses) [member function]
+    ## socket.h (module 'network'): void ns3::Socket::Ipv6JoinGroup(ns3::Ipv6Address address, ns3::Socket::Ipv6MulticastFilterMode filterMode, std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address>> sourceAddresses) [member function]
     cls.add_method('Ipv6JoinGroup', 
                    'void', 
                    [param('ns3::Ipv6Address', 'address'), param('ns3::Socket::Ipv6MulticastFilterMode', 'filterMode'), param('std::vector< ns3::Ipv6Address >', 'sourceAddresses')], 
@@ -6829,7 +6833,7 @@
                    'ns3::Ipv4Address', 
                    [], 
                    is_const=True)
-    ## ipv4-route.h (module 'internet'): std::map<unsigned int, unsigned int, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, unsigned int> > > ns3::Ipv4MulticastRoute::GetOutputTtlMap() const [member function]
+    ## ipv4-route.h (module 'internet'): std::map<unsigned int, unsigned int, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, unsigned int>>> ns3::Ipv4MulticastRoute::GetOutputTtlMap() const [member function]
     cls.add_method('GetOutputTtlMap', 
                    'std::map< unsigned int, unsigned int >', 
                    [], 
@@ -7754,10 +7758,16 @@
     cls.add_method('ExtractNeighborIndex', 
                    'uint32_t', 
                    [param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetEpoch() const [member function]
+    cls.add_method('GetEpoch', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() const [member function]
     cls.add_method('GetRemainingBits', 
                    'uint32_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -7768,6 +7778,10 @@
                    'uint32_t', 
                    [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
+    ## nix-vector.h (module 'network'): void ns3::NixVector::SetEpoch(uint32_t epoch) [member function]
+    cls.add_method('SetEpoch', 
+                   'void', 
+                   [param('uint32_t', 'epoch')])
     return
 
 def register_Ns3Node_methods(root_module, cls):
@@ -8099,10 +8113,11 @@
                    'uint32_t', 
                    [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) const [member function]
     cls.add_method('SetNixVector', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')], 
+                   is_const=True)
     ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
     cls.add_method('ToString', 
                    'std::string', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/csma-layout/bindings/modulegen__gcc_LP64.py ns-3.36/src/csma-layout/bindings/modulegen__gcc_LP64.py
--- ns-3.35/src/csma-layout/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/csma-layout/bindings/modulegen__gcc_LP64.py	2022-04-30 18:23:57.810733300 -0700
@@ -87,6 +87,8 @@
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::TraceSourceAccessor'])
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'], import_from_module='ns.core')
     ## hash.h (module 'core'): ns3::Hasher [class]
     module.add_class('Hasher', import_from_module='ns.core')
     ## inet6-socket-address.h (module 'network'): ns3::Inet6SocketAddress [class]
@@ -267,29 +269,29 @@
     module.add_class('AggregateIterator', import_from_module='ns.core', outer_class=root_module['ns3::Object'])
     ## pcap-file-wrapper.h (module 'network'): ns3::PcapFileWrapper [class]
     module.add_class('PcapFileWrapper', import_from_module='ns.network', parent=root_module['ns3::Object'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv4MulticastRoute', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv4Route', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv4Route>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::OutputStreamWrapper', 'ns3::empty', 'ns3::DefaultDeleter<ns3::OutputStreamWrapper>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
     ## socket.h (module 'network'): ns3::Socket [class]
     module.add_class('Socket', import_from_module='ns.network', parent=root_module['ns3::Object'])
@@ -501,7 +503,7 @@
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::Socket>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::Socket>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     module.add_container('std::vector< bool >', 'bool', container_type='vector')
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     module.add_container('std::vector< ns3::Ipv6Address >', 'ns3::Ipv6Address', container_type='vector')
     module.add_container('std::map< unsigned int, unsigned int >', ('unsigned int', 'unsigned int'), container_type='map')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )', 'ns3::TimePrinter')
@@ -2539,11 +2541,11 @@
     cls.add_method('Assign', 
                    'ns3::Ipv6InterfaceContainer', 
                    [param('ns3::NetDeviceContainer const &', 'c')])
-    ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6InterfaceContainer ns3::Ipv6AddressHelper::Assign(ns3::NetDeviceContainer const & c, std::vector<bool, std::allocator<bool> > withConfiguration) [member function]
+    ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6InterfaceContainer ns3::Ipv6AddressHelper::Assign(ns3::NetDeviceContainer const & c, std::vector<bool, std::allocator<bool>> withConfiguration) [member function]
     cls.add_method('Assign', 
                    'ns3::Ipv6InterfaceContainer', 
                    [param('ns3::NetDeviceContainer const &', 'c'), param('std::vector< bool >', 'withConfiguration')])
-    ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6InterfaceContainer ns3::Ipv6AddressHelper::Assign(ns3::NetDeviceContainer const & c, std::vector<bool, std::allocator<bool> > withConfiguration, std::vector<bool, std::allocator<bool> > onLink) [member function]
+    ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6InterfaceContainer ns3::Ipv6AddressHelper::Assign(ns3::NetDeviceContainer const & c, std::vector<bool, std::allocator<bool>> withConfiguration, std::vector<bool, std::allocator<bool>> onLink) [member function]
     cls.add_method('Assign', 
                    'ns3::Ipv6InterfaceContainer', 
                    [param('ns3::NetDeviceContainer const &', 'c'), param('std::vector< bool >', 'withConfiguration'), param('std::vector< bool >', 'onLink')])
@@ -4019,8 +4021,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -4243,14 +4245,14 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('>=')
     cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_unary_numeric_operator('-')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
     cls.add_constructor([])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(double const value) [constructor]
@@ -4269,6 +4271,8 @@
     cls.add_constructor([param('long unsigned int const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int const v) [constructor]
     cls.add_constructor([param('long long unsigned int const', 'v')])
+    ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int128_t const v) [constructor]
+    cls.add_constructor([param('int128_t const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t const hi, uint64_t const lo) [constructor]
     cls.add_constructor([param('int64_t const', 'hi'), param('uint64_t const', 'lo')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [constructor]
@@ -4347,6 +4351,10 @@
     cls.add_method('AssignStreams', 
                    'int64_t', 
                    [param('ns3::NetDeviceContainer', 'c'), param('int64_t', 'stream')])
+    ## csma-helper.h (module 'csma'): void ns3::CsmaHelper::DisableFlowControl() [member function]
+    cls.add_method('DisableFlowControl', 
+                   'void', 
+                   [])
     ## csma-helper.h (module 'csma'): ns3::NetDeviceContainer ns3::CsmaHelper::Install(ns3::Ptr<ns3::Node> node) const [member function]
     cls.add_method('Install', 
                    'ns3::NetDeviceContainer', 
@@ -4510,10 +4518,6 @@
     cls.add_method('SetTcp', 
                    'void', 
                    [param('std::string', 'tid')])
-    ## internet-stack-helper.h (module 'internet'): void ns3::InternetStackHelper::SetTcp(std::string tid, std::string attr, ns3::AttributeValue const & val) [member function]
-    cls.add_method('SetTcp', 
-                   'void', 
-                   [param('std::string', 'tid'), param('std::string', 'attr'), param('ns3::AttributeValue const &', 'val')])
     ## internet-stack-helper.h (module 'internet'): void ns3::InternetStackHelper::EnableAsciiIpv4Internal(ns3::Ptr<ns3::OutputStreamWrapper> stream, std::string prefix, ns3::Ptr<ns3::Ipv4> ipv4, uint32_t interface, bool explicitFilename) [member function]
     cls.add_method('EnableAsciiIpv4Internal', 
                    'void', 
@@ -5018,86 +5022,86 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Ipv4MulticastRoute_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv4MulticastRoute__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter< ns3::Ipv4MulticastRoute > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Ipv4Route_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv4Route__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter< ns3::Ipv4Route > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3OutputStreamWrapper_Ns3Empty_Ns3DefaultDeleter__lt__ns3OutputStreamWrapper__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter< ns3::OutputStreamWrapper > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
@@ -5220,7 +5224,7 @@
                    'uint8_t', 
                    [param('uint8_t', 'ipTos')], 
                    is_static=True)
-    ## socket.h (module 'network'): void ns3::Socket::Ipv6JoinGroup(ns3::Ipv6Address address, ns3::Socket::Ipv6MulticastFilterMode filterMode, std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address> > sourceAddresses) [member function]
+    ## socket.h (module 'network'): void ns3::Socket::Ipv6JoinGroup(ns3::Ipv6Address address, ns3::Socket::Ipv6MulticastFilterMode filterMode, std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address>> sourceAddresses) [member function]
     cls.add_method('Ipv6JoinGroup', 
                    'void', 
                    [param('ns3::Ipv6Address', 'address'), param('ns3::Socket::Ipv6MulticastFilterMode', 'filterMode'), param('std::vector< ns3::Ipv6Address >', 'sourceAddresses')], 
@@ -6829,7 +6833,7 @@
                    'ns3::Ipv4Address', 
                    [], 
                    is_const=True)
-    ## ipv4-route.h (module 'internet'): std::map<unsigned int, unsigned int, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, unsigned int> > > ns3::Ipv4MulticastRoute::GetOutputTtlMap() const [member function]
+    ## ipv4-route.h (module 'internet'): std::map<unsigned int, unsigned int, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, unsigned int>>> ns3::Ipv4MulticastRoute::GetOutputTtlMap() const [member function]
     cls.add_method('GetOutputTtlMap', 
                    'std::map< unsigned int, unsigned int >', 
                    [], 
@@ -7754,10 +7758,16 @@
     cls.add_method('ExtractNeighborIndex', 
                    'uint32_t', 
                    [param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetEpoch() const [member function]
+    cls.add_method('GetEpoch', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() const [member function]
     cls.add_method('GetRemainingBits', 
                    'uint32_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -7768,6 +7778,10 @@
                    'uint32_t', 
                    [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
+    ## nix-vector.h (module 'network'): void ns3::NixVector::SetEpoch(uint32_t epoch) [member function]
+    cls.add_method('SetEpoch', 
+                   'void', 
+                   [param('uint32_t', 'epoch')])
     return
 
 def register_Ns3Node_methods(root_module, cls):
@@ -8099,10 +8113,11 @@
                    'uint32_t', 
                    [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) const [member function]
     cls.add_method('SetNixVector', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')], 
+                   is_const=True)
     ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
     cls.add_method('ToString', 
                    'std::string', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/csma-layout/CMakeLists.txt ns-3.36/src/csma-layout/CMakeLists.txt
--- ns-3.35/src/csma-layout/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/csma-layout/CMakeLists.txt	2022-04-30 18:23:57.806733400 -0700
@@ -0,0 +1,10 @@
+build_lib(
+  LIBNAME csma-layout
+  SOURCE_FILES model/csma-star-helper.cc
+  HEADER_FILES model/csma-star-helper.h
+  LIBRARIES_TO_LINK
+    ${libnetwork}
+    ${libinternet}
+    ${libcsma}
+    ${libpoint-to-point}
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/csma-layout/examples/CMakeLists.txt ns-3.36/src/csma-layout/examples/CMakeLists.txt
--- ns-3.35/src/csma-layout/examples/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/csma-layout/examples/CMakeLists.txt	2022-04-30 18:23:57.810733300 -0700
@@ -0,0 +1,9 @@
+build_lib_example(
+  NAME csma-star
+  SOURCE_FILES csma-star.cc
+  LIBRARIES_TO_LINK
+    ${libcsma}
+    ${libcsma-layout}
+    ${libinternet}
+    ${libapplications}
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/csma-layout/examples/wscript ns-3.36/src/csma-layout/examples/wscript
--- ns-3.35/src/csma-layout/examples/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/csma-layout/examples/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,5 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    obj = bld.create_ns3_program('csma-star', ['csma', 'csma-layout', 'internet', 'applications'])
-    obj.source = 'csma-star.cc'
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/csma-layout/model/csma-star-helper.h ns-3.36/src/csma-layout/model/csma-star-helper.h
--- ns-3.35/src/csma-layout/model/csma-star-helper.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/csma-layout/model/csma-star-helper.h	2022-04-30 18:23:57.810733300 -0700
@@ -21,13 +21,13 @@
 
 #include <string>
 
-#include "csma-helper.h"
-#include "ipv4-address-helper.h"
-#include "ipv6-address-helper.h"
-#include "internet-stack-helper.h"
-#include "ipv4-interface-container.h"
-#include "ipv6-interface-container.h"
-#include "ipv6-address-generator.h"
+#include "ns3/csma-helper.h"
+#include "ns3/ipv4-address-helper.h"
+#include "ns3/ipv6-address-helper.h"
+#include "ns3/internet-stack-helper.h"
+#include "ns3/ipv4-interface-container.h"
+#include "ns3/ipv6-interface-container.h"
+#include "ns3/ipv6-address-generator.h"
 
 namespace ns3 {
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/csma-layout/wscript ns-3.36/src/csma-layout/wscript
--- ns-3.35/src/csma-layout/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/csma-layout/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,18 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    obj = bld.create_ns3_module('csma-layout', ['csma', 'network', 'internet'])
-    obj.source = [
-        'model/csma-star-helper.cc',
-        ]
-    headers = bld(features='ns3header')
-    headers.module = 'csma-layout'
-    headers.source = [
-        'model/csma-star-helper.h',
-        ]
-
-    if bld.env['ENABLE_EXAMPLES']:
-        bld.recurse('examples')
-
-    bld.ns3_python_bindings()
-
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/dsdv/bindings/modulegen__gcc_ILP32.py ns-3.36/src/dsdv/bindings/modulegen__gcc_ILP32.py
--- ns-3.35/src/dsdv/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/dsdv/bindings/modulegen__gcc_ILP32.py	2022-04-30 18:23:57.818733500 -0700
@@ -71,6 +71,8 @@
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::TraceSourceAccessor'])
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'], import_from_module='ns.core')
     ## hash.h (module 'core'): ns3::Hasher [class]
     module.add_class('Hasher', import_from_module='ns.core')
     ## inet6-socket-address.h (module 'network'): ns3::Inet6SocketAddress [class]
@@ -242,29 +244,29 @@
     module.add_class('RandomVariableStream', import_from_module='ns.core', parent=root_module['ns3::Object'])
     ## random-variable-stream.h (module 'core'): ns3::SequentialRandomVariable [class]
     module.add_class('SequentialRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv4MulticastRoute', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv4Route', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv4Route>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::OutputStreamWrapper', 'ns3::empty', 'ns3::DefaultDeleter<ns3::OutputStreamWrapper>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
     ## socket.h (module 'network'): ns3::Socket [class]
     module.add_class('Socket', import_from_module='ns.network', parent=root_module['ns3::Object'])
@@ -480,7 +482,7 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::Socket>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## ipv4-list-routing.h (module 'internet'): ns3::Ipv4ListRouting [class]
     module.add_class('Ipv4ListRouting', import_from_module='ns.internet', parent=root_module['ns3::Ipv4RoutingProtocol'])
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     module.add_container('std::vector< ns3::Ipv6Address >', 'ns3::Ipv6Address', container_type='vector')
     module.add_container('std::map< unsigned int, unsigned int >', ('unsigned int', 'unsigned int'), container_type='map')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )', 'ns3::TimePrinter')
@@ -3268,8 +3270,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -3492,14 +3494,14 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('>=')
     cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_unary_numeric_operator('-')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
     cls.add_constructor([])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(double const value) [constructor]
@@ -3518,6 +3520,8 @@
     cls.add_constructor([param('long unsigned int const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int const v) [constructor]
     cls.add_constructor([param('long long unsigned int const', 'v')])
+    ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int128_t const v) [constructor]
+    cls.add_constructor([param('int128_t const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t const hi, uint64_t const lo) [constructor]
     cls.add_constructor([param('int64_t const', 'hi'), param('uint64_t const', 'lo')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [constructor]
@@ -3978,86 +3982,86 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Ipv4MulticastRoute_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv4MulticastRoute__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter< ns3::Ipv4MulticastRoute > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Ipv4Route_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv4Route__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter< ns3::Ipv4Route > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3OutputStreamWrapper_Ns3Empty_Ns3DefaultDeleter__lt__ns3OutputStreamWrapper__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter< ns3::OutputStreamWrapper > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
@@ -4180,7 +4184,7 @@
                    'uint8_t', 
                    [param('uint8_t', 'ipTos')], 
                    is_static=True)
-    ## socket.h (module 'network'): void ns3::Socket::Ipv6JoinGroup(ns3::Ipv6Address address, ns3::Socket::Ipv6MulticastFilterMode filterMode, std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address> > sourceAddresses) [member function]
+    ## socket.h (module 'network'): void ns3::Socket::Ipv6JoinGroup(ns3::Ipv6Address address, ns3::Socket::Ipv6MulticastFilterMode filterMode, std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address>> sourceAddresses) [member function]
     cls.add_method('Ipv6JoinGroup', 
                    'void', 
                    [param('ns3::Ipv6Address', 'address'), param('ns3::Socket::Ipv6MulticastFilterMode', 'filterMode'), param('std::vector< ns3::Ipv6Address >', 'sourceAddresses')], 
@@ -6134,7 +6138,7 @@
                    'ns3::Ipv4Address', 
                    [], 
                    is_const=True)
-    ## ipv4-route.h (module 'internet'): std::map<unsigned int, unsigned int, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, unsigned int> > > ns3::Ipv4MulticastRoute::GetOutputTtlMap() const [member function]
+    ## ipv4-route.h (module 'internet'): std::map<unsigned int, unsigned int, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, unsigned int>>> ns3::Ipv4MulticastRoute::GetOutputTtlMap() const [member function]
     cls.add_method('GetOutputTtlMap', 
                    'std::map< unsigned int, unsigned int >', 
                    [], 
@@ -6580,10 +6584,16 @@
     cls.add_method('ExtractNeighborIndex', 
                    'uint32_t', 
                    [param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetEpoch() const [member function]
+    cls.add_method('GetEpoch', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() const [member function]
     cls.add_method('GetRemainingBits', 
                    'uint32_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -6594,6 +6604,10 @@
                    'uint32_t', 
                    [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
+    ## nix-vector.h (module 'network'): void ns3::NixVector::SetEpoch(uint32_t epoch) [member function]
+    cls.add_method('SetEpoch', 
+                   'void', 
+                   [param('uint32_t', 'epoch')])
     return
 
 def register_Ns3Node_methods(root_module, cls):
@@ -6970,10 +6984,11 @@
                    'uint32_t', 
                    [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) const [member function]
     cls.add_method('SetNixVector', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')], 
+                   is_const=True)
     ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
     cls.add_method('ToString', 
                    'std::string', 
@@ -7890,11 +7905,11 @@
     cls.add_method('GetEventId', 
                    'ns3::EventId', 
                    [param('ns3::Ipv4Address', 'address')])
-    ## dsdv-rtable.h (module 'dsdv'): void ns3::dsdv::RoutingTable::GetListOfAllRoutes(std::map<ns3::Ipv4Address, ns3::dsdv::RoutingTableEntry, std::less<ns3::Ipv4Address>, std::allocator<std::pair<const ns3::Ipv4Address, ns3::dsdv::RoutingTableEntry> > > & allRoutes) [member function]
+    ## dsdv-rtable.h (module 'dsdv'): void ns3::dsdv::RoutingTable::GetListOfAllRoutes(std::map<ns3::Ipv4Address, ns3::dsdv::RoutingTableEntry, std::less<ns3::Ipv4Address>, std::allocator<std::pair<const ns3::Ipv4Address, ns3::dsdv::RoutingTableEntry>>> & allRoutes) [member function]
     cls.add_method('GetListOfAllRoutes', 
                    'void', 
                    [param('std::map< ns3::Ipv4Address, ns3::dsdv::RoutingTableEntry > &', 'allRoutes')])
-    ## dsdv-rtable.h (module 'dsdv'): void ns3::dsdv::RoutingTable::GetListOfDestinationWithNextHop(ns3::Ipv4Address nxtHp, std::map<ns3::Ipv4Address, ns3::dsdv::RoutingTableEntry, std::less<ns3::Ipv4Address>, std::allocator<std::pair<const ns3::Ipv4Address, ns3::dsdv::RoutingTableEntry> > > & dstList) [member function]
+    ## dsdv-rtable.h (module 'dsdv'): void ns3::dsdv::RoutingTable::GetListOfDestinationWithNextHop(ns3::Ipv4Address nxtHp, std::map<ns3::Ipv4Address, ns3::dsdv::RoutingTableEntry, std::less<ns3::Ipv4Address>, std::allocator<std::pair<const ns3::Ipv4Address, ns3::dsdv::RoutingTableEntry>>> & dstList) [member function]
     cls.add_method('GetListOfDestinationWithNextHop', 
                    'void', 
                    [param('ns3::Ipv4Address', 'nxtHp'), param('std::map< ns3::Ipv4Address, ns3::dsdv::RoutingTableEntry > &', 'dstList')])
@@ -7916,7 +7931,7 @@
                    'void', 
                    [param('ns3::Ptr< ns3::OutputStreamWrapper >', 'stream'), param('ns3::Time::Unit', 'unit', default_value='::ns3::Time::Unit::S')], 
                    is_const=True)
-    ## dsdv-rtable.h (module 'dsdv'): void ns3::dsdv::RoutingTable::Purge(std::map<ns3::Ipv4Address, ns3::dsdv::RoutingTableEntry, std::less<ns3::Ipv4Address>, std::allocator<std::pair<const ns3::Ipv4Address, ns3::dsdv::RoutingTableEntry> > > & removedAddresses) [member function]
+    ## dsdv-rtable.h (module 'dsdv'): void ns3::dsdv::RoutingTable::Purge(std::map<ns3::Ipv4Address, ns3::dsdv::RoutingTableEntry, std::less<ns3::Ipv4Address>, std::allocator<std::pair<const ns3::Ipv4Address, ns3::dsdv::RoutingTableEntry>>> & removedAddresses) [member function]
     cls.add_method('Purge', 
                    'void', 
                    [param('std::map< ns3::Ipv4Address, ns3::dsdv::RoutingTableEntry > &', 'removedAddresses')])
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/dsdv/bindings/modulegen__gcc_LP64.py ns-3.36/src/dsdv/bindings/modulegen__gcc_LP64.py
--- ns-3.35/src/dsdv/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/dsdv/bindings/modulegen__gcc_LP64.py	2022-04-30 18:23:57.818733500 -0700
@@ -71,6 +71,8 @@
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::TraceSourceAccessor'])
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'], import_from_module='ns.core')
     ## hash.h (module 'core'): ns3::Hasher [class]
     module.add_class('Hasher', import_from_module='ns.core')
     ## inet6-socket-address.h (module 'network'): ns3::Inet6SocketAddress [class]
@@ -242,29 +244,29 @@
     module.add_class('RandomVariableStream', import_from_module='ns.core', parent=root_module['ns3::Object'])
     ## random-variable-stream.h (module 'core'): ns3::SequentialRandomVariable [class]
     module.add_class('SequentialRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv4MulticastRoute', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv4Route', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv4Route>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::OutputStreamWrapper', 'ns3::empty', 'ns3::DefaultDeleter<ns3::OutputStreamWrapper>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
     ## socket.h (module 'network'): ns3::Socket [class]
     module.add_class('Socket', import_from_module='ns.network', parent=root_module['ns3::Object'])
@@ -480,7 +482,7 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::Socket>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## ipv4-list-routing.h (module 'internet'): ns3::Ipv4ListRouting [class]
     module.add_class('Ipv4ListRouting', import_from_module='ns.internet', parent=root_module['ns3::Ipv4RoutingProtocol'])
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     module.add_container('std::vector< ns3::Ipv6Address >', 'ns3::Ipv6Address', container_type='vector')
     module.add_container('std::map< unsigned int, unsigned int >', ('unsigned int', 'unsigned int'), container_type='map')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )', 'ns3::TimePrinter')
@@ -3268,8 +3270,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -3492,14 +3494,14 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('>=')
     cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_unary_numeric_operator('-')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
     cls.add_constructor([])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(double const value) [constructor]
@@ -3518,6 +3520,8 @@
     cls.add_constructor([param('long unsigned int const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int const v) [constructor]
     cls.add_constructor([param('long long unsigned int const', 'v')])
+    ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int128_t const v) [constructor]
+    cls.add_constructor([param('int128_t const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t const hi, uint64_t const lo) [constructor]
     cls.add_constructor([param('int64_t const', 'hi'), param('uint64_t const', 'lo')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [constructor]
@@ -3978,86 +3982,86 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Ipv4MulticastRoute_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv4MulticastRoute__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter< ns3::Ipv4MulticastRoute > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Ipv4Route_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv4Route__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter< ns3::Ipv4Route > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3OutputStreamWrapper_Ns3Empty_Ns3DefaultDeleter__lt__ns3OutputStreamWrapper__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter< ns3::OutputStreamWrapper > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
@@ -4180,7 +4184,7 @@
                    'uint8_t', 
                    [param('uint8_t', 'ipTos')], 
                    is_static=True)
-    ## socket.h (module 'network'): void ns3::Socket::Ipv6JoinGroup(ns3::Ipv6Address address, ns3::Socket::Ipv6MulticastFilterMode filterMode, std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address> > sourceAddresses) [member function]
+    ## socket.h (module 'network'): void ns3::Socket::Ipv6JoinGroup(ns3::Ipv6Address address, ns3::Socket::Ipv6MulticastFilterMode filterMode, std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address>> sourceAddresses) [member function]
     cls.add_method('Ipv6JoinGroup', 
                    'void', 
                    [param('ns3::Ipv6Address', 'address'), param('ns3::Socket::Ipv6MulticastFilterMode', 'filterMode'), param('std::vector< ns3::Ipv6Address >', 'sourceAddresses')], 
@@ -6134,7 +6138,7 @@
                    'ns3::Ipv4Address', 
                    [], 
                    is_const=True)
-    ## ipv4-route.h (module 'internet'): std::map<unsigned int, unsigned int, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, unsigned int> > > ns3::Ipv4MulticastRoute::GetOutputTtlMap() const [member function]
+    ## ipv4-route.h (module 'internet'): std::map<unsigned int, unsigned int, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, unsigned int>>> ns3::Ipv4MulticastRoute::GetOutputTtlMap() const [member function]
     cls.add_method('GetOutputTtlMap', 
                    'std::map< unsigned int, unsigned int >', 
                    [], 
@@ -6580,10 +6584,16 @@
     cls.add_method('ExtractNeighborIndex', 
                    'uint32_t', 
                    [param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetEpoch() const [member function]
+    cls.add_method('GetEpoch', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() const [member function]
     cls.add_method('GetRemainingBits', 
                    'uint32_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -6594,6 +6604,10 @@
                    'uint32_t', 
                    [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
+    ## nix-vector.h (module 'network'): void ns3::NixVector::SetEpoch(uint32_t epoch) [member function]
+    cls.add_method('SetEpoch', 
+                   'void', 
+                   [param('uint32_t', 'epoch')])
     return
 
 def register_Ns3Node_methods(root_module, cls):
@@ -6970,10 +6984,11 @@
                    'uint32_t', 
                    [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) const [member function]
     cls.add_method('SetNixVector', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')], 
+                   is_const=True)
     ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
     cls.add_method('ToString', 
                    'std::string', 
@@ -7890,11 +7905,11 @@
     cls.add_method('GetEventId', 
                    'ns3::EventId', 
                    [param('ns3::Ipv4Address', 'address')])
-    ## dsdv-rtable.h (module 'dsdv'): void ns3::dsdv::RoutingTable::GetListOfAllRoutes(std::map<ns3::Ipv4Address, ns3::dsdv::RoutingTableEntry, std::less<ns3::Ipv4Address>, std::allocator<std::pair<const ns3::Ipv4Address, ns3::dsdv::RoutingTableEntry> > > & allRoutes) [member function]
+    ## dsdv-rtable.h (module 'dsdv'): void ns3::dsdv::RoutingTable::GetListOfAllRoutes(std::map<ns3::Ipv4Address, ns3::dsdv::RoutingTableEntry, std::less<ns3::Ipv4Address>, std::allocator<std::pair<const ns3::Ipv4Address, ns3::dsdv::RoutingTableEntry>>> & allRoutes) [member function]
     cls.add_method('GetListOfAllRoutes', 
                    'void', 
                    [param('std::map< ns3::Ipv4Address, ns3::dsdv::RoutingTableEntry > &', 'allRoutes')])
-    ## dsdv-rtable.h (module 'dsdv'): void ns3::dsdv::RoutingTable::GetListOfDestinationWithNextHop(ns3::Ipv4Address nxtHp, std::map<ns3::Ipv4Address, ns3::dsdv::RoutingTableEntry, std::less<ns3::Ipv4Address>, std::allocator<std::pair<const ns3::Ipv4Address, ns3::dsdv::RoutingTableEntry> > > & dstList) [member function]
+    ## dsdv-rtable.h (module 'dsdv'): void ns3::dsdv::RoutingTable::GetListOfDestinationWithNextHop(ns3::Ipv4Address nxtHp, std::map<ns3::Ipv4Address, ns3::dsdv::RoutingTableEntry, std::less<ns3::Ipv4Address>, std::allocator<std::pair<const ns3::Ipv4Address, ns3::dsdv::RoutingTableEntry>>> & dstList) [member function]
     cls.add_method('GetListOfDestinationWithNextHop', 
                    'void', 
                    [param('ns3::Ipv4Address', 'nxtHp'), param('std::map< ns3::Ipv4Address, ns3::dsdv::RoutingTableEntry > &', 'dstList')])
@@ -7916,7 +7931,7 @@
                    'void', 
                    [param('ns3::Ptr< ns3::OutputStreamWrapper >', 'stream'), param('ns3::Time::Unit', 'unit', default_value='::ns3::Time::Unit::S')], 
                    is_const=True)
-    ## dsdv-rtable.h (module 'dsdv'): void ns3::dsdv::RoutingTable::Purge(std::map<ns3::Ipv4Address, ns3::dsdv::RoutingTableEntry, std::less<ns3::Ipv4Address>, std::allocator<std::pair<const ns3::Ipv4Address, ns3::dsdv::RoutingTableEntry> > > & removedAddresses) [member function]
+    ## dsdv-rtable.h (module 'dsdv'): void ns3::dsdv::RoutingTable::Purge(std::map<ns3::Ipv4Address, ns3::dsdv::RoutingTableEntry, std::less<ns3::Ipv4Address>, std::allocator<std::pair<const ns3::Ipv4Address, ns3::dsdv::RoutingTableEntry>>> & removedAddresses) [member function]
     cls.add_method('Purge', 
                    'void', 
                    [param('std::map< ns3::Ipv4Address, ns3::dsdv::RoutingTableEntry > &', 'removedAddresses')])
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/dsdv/CMakeLists.txt ns-3.36/src/dsdv/CMakeLists.txt
--- ns-3.35/src/dsdv/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/dsdv/CMakeLists.txt	2022-04-30 18:23:57.814733300 -0700
@@ -0,0 +1,17 @@
+build_lib(
+  LIBNAME dsdv
+  SOURCE_FILES
+    helper/dsdv-helper.cc
+    model/dsdv-packet-queue.cc
+    model/dsdv-packet.cc
+    model/dsdv-routing-protocol.cc
+    model/dsdv-rtable.cc
+  HEADER_FILES
+    helper/dsdv-helper.h
+    model/dsdv-packet-queue.h
+    model/dsdv-packet.h
+    model/dsdv-routing-protocol.h
+    model/dsdv-rtable.h
+  LIBRARIES_TO_LINK ${libinternet}
+  TEST_SOURCES test/dsdv-testcase.cc
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/dsdv/examples/CMakeLists.txt ns-3.36/src/dsdv/examples/CMakeLists.txt
--- ns-3.35/src/dsdv/examples/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/dsdv/examples/CMakeLists.txt	2022-04-30 18:23:57.818733500 -0700
@@ -0,0 +1,9 @@
+build_lib_example(
+  NAME dsdv-manet
+  SOURCE_FILES dsdv-manet.cc
+  LIBRARIES_TO_LINK
+    ${libwifi}
+    ${libinternet}
+    ${libdsdv}
+    ${libapplications}
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/dsdv/examples/wscript ns-3.36/src/dsdv/examples/wscript
--- ns-3.35/src/dsdv/examples/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/dsdv/examples/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,6 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-     obj = bld.create_ns3_program('dsdv-manet', ['wifi', 'internet', 'dsdv', 'applications'])
-     obj.source = 'dsdv-manet.cc'
-
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/dsdv/model/dsdv-routing-protocol.h ns-3.36/src/dsdv/model/dsdv-routing-protocol.h
--- ns-3.35/src/dsdv/model/dsdv-routing-protocol.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/dsdv/model/dsdv-routing-protocol.h	2022-04-30 18:23:57.818733500 -0700
@@ -217,9 +217,15 @@
    */
   void
   RecvDsdv (Ptr<Socket> socket);
-  /// Send packet
+  /**
+   * Send a packet
+   * \param route the route
+   * \param packet the packet
+   * \param header the IPv4 header
+   */
   void
-  Send (Ptr<Ipv4Route>, Ptr<const Packet>, const Ipv4Header &);
+  Send (Ptr<Ipv4Route> route, Ptr<const Packet> packet, const Ipv4Header & header);
+
   /**
    * Create loopback route for given header
    *
@@ -245,9 +251,14 @@
   /// Merge periodic updates
   void
   MergeTriggerPeriodicUpdates ();
-  /// Notify that packet is dropped for some reason
+  /**
+   * Notify that packet is dropped for some reason
+   * \param packet the dropped packet
+   * \param header the IPv4 header
+   * \param err the error number
+   */
   void
-  Drop (Ptr<const Packet>, const Ipv4Header &, Socket::SocketErrno);
+  Drop (Ptr<const Packet> packet, const Ipv4Header & header, Socket::SocketErrno err);
   /// Timer to trigger periodic updates from a node
   Timer m_periodicUpdateTimer;
   /// Timer used by the trigger updates in case of Weighted Settling Time is used
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/dsdv/model/dsdv-rtable.h ns-3.36/src/dsdv/model/dsdv-rtable.h
--- ns-3.35/src/dsdv/model/dsdv-rtable.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/dsdv/model/dsdv-rtable.h	2022-04-30 18:23:57.818733500 -0700
@@ -65,7 +65,7 @@
    * \param iface the interface
    * \param hops the number of hops
    * \param nextHop the IP address of the next hop
-   * \param lifetime the lifetime 
+   * \param lifetime the lifetime
    * \param SettlingTime the settling time
    * \param changedEntries flag for changed entries
    */
@@ -276,6 +276,7 @@
   /**
    * Print routing table entry
    * \param stream the output stream
+   * \param unit the Time unit
    */
   void
   Print (Ptr<OutputStreamWrapper> stream, Time::Unit unit = Time::S) const;
@@ -393,6 +394,7 @@
   /**
    * Print routing table
    * \param stream the output stream
+   * \param unit the Time unit
    */
   void
   Print (Ptr<OutputStreamWrapper> stream, Time::Unit unit = Time::S) const;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/dsdv/wscript ns-3.36/src/dsdv/wscript
--- ns-3.35/src/dsdv/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/dsdv/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,37 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    module = bld.create_ns3_module('dsdv', ['internet'])
-    module.includes = '.'
-    module.source = [
-        'model/dsdv-rtable.cc',
-        'model/dsdv-packet-queue.cc',
-        'model/dsdv-packet.cc',
-        'model/dsdv-routing-protocol.cc',
-        'helper/dsdv-helper.cc',
-        ]
-
-    module_test = bld.create_ns3_module_test_library('dsdv')
-    module_test.source = [
-        'test/dsdv-testcase.cc',
-        ]
-
-    # Tests encapsulating example programs should be listed here
-    if (bld.env['ENABLE_EXAMPLES']):
-        module_test.source.extend([
-        #   'test/dsdv-examples-test-suite.cc',
-            ])
-    
-    headers = bld(features='ns3header')
-    headers.module = 'dsdv'
-    headers.source = [
-        'model/dsdv-rtable.h',
-        'model/dsdv-packet-queue.h',
-        'model/dsdv-packet.h',
-        'model/dsdv-routing-protocol.h',
-        'helper/dsdv-helper.h',
-        ]
-    if (bld.env['ENABLE_EXAMPLES']):
-      bld.recurse('examples')
-
-    bld.ns3_python_bindings()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/dsr/bindings/callbacks_list.py ns-3.36/src/dsr/bindings/callbacks_list.py
--- ns-3.35/src/dsr/bindings/callbacks_list.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/dsr/bindings/callbacks_list.py	2022-04-30 18:23:57.818733500 -0700
@@ -1,25 +1,31 @@
 callback_classes = [
     ['ns3::ObjectBase *', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'const ns3::Address &', 'const ns3::Address &', 'ns3::NetDevice::PacketType', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<ns3::Socket>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['bool', 'ns3::Ptr<ns3::Socket>', 'const ns3::Address &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<ns3::Socket>', 'const ns3::Address &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<ns3::Socket>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'const ns3::Address &', 'const ns3::Address &', 'ns3::NetDevice::PacketType', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<ns3::Packet>', 'ns3::Ipv4Address', 'ns3::Ipv4Address', 'unsigned char', 'ns3::Ptr<ns3::Ipv4Route>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<ns3::Packet>', 'ns3::Ipv6Address', 'ns3::Ipv6Address', 'unsigned char', 'ns3::Ptr<ns3::Ipv6Route>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'const ns3::Ipv4Header &', 'ns3::Ptr<const ns3::Packet>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::Ptr<ns3::Ipv4>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'const ns3::Ipv4Header &', 'ns3::Ptr<const ns3::Packet>', 'ns3::Ipv4L3Protocol::DropReason', 'ns3::Ptr<ns3::Ipv4>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['unsigned long', 'unsigned short', 'unsigned short', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['unsigned long', 'const ns3::WifiTxVector &', 'unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['unsigned long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['bool', 'unsigned short', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['bool', 'const ns3::WifiTxVector &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Mac48Address', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::Mac48Address', 'ns3::Mac48Address', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Ptr<const ns3::ArpCache>', 'ns3::Ipv4Address', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'const ns3::WifiMacHeader &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::WifiMacDropReason', 'ns3::Ptr<const ns3::WifiMacQueueItem>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Ptr<const ns3::WifiMacQueueItem>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'unsigned char', 'ns3::Ptr<const ns3::WifiMacQueueItem>', 'const ns3::WifiTxVector &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'unsigned char', 'ns3::Ptr<const ns3::WifiPsdu>', 'const ns3::WifiTxVector &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'unsigned char', 'std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *', 'const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *', 'unsigned long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Ptr<const ns3::ArpCache>', 'ns3::Ipv4Address', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ipv4Address', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'const ns3::dsr::DsrOptionSRHeader &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
 ]
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/dsr/bindings/modulegen__gcc_ILP32.py ns-3.36/src/dsr/bindings/modulegen__gcc_ILP32.py
--- ns-3.35/src/dsr/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/dsr/bindings/modulegen__gcc_ILP32.py	2022-04-30 18:23:57.818733500 -0700
@@ -35,13 +35,9 @@
     ## wifi-phy-common.h (module 'wifi'): ns3::WifiPpduType [enumeration]
     module.add_enum('WifiPpduType', ['WIFI_PPDU_TYPE_SU', 'WIFI_PPDU_TYPE_DL_MU', 'WIFI_PPDU_TYPE_UL_MU'], import_from_module='ns.wifi')
     ## wifi-phy-common.h (module 'wifi'): ns3::WifiPhyRxfailureReason [enumeration]
-    module.add_enum('WifiPhyRxfailureReason', ['UNKNOWN', 'UNSUPPORTED_SETTINGS', 'CHANNEL_SWITCHING', 'RXING', 'TXING', 'SLEEPING', 'BUSY_DECODING_PREAMBLE', 'PREAMBLE_DETECT_FAILURE', 'RECEPTION_ABORTED_BY_TX', 'L_SIG_FAILURE', 'HT_SIG_FAILURE', 'SIG_A_FAILURE', 'SIG_B_FAILURE', 'PREAMBLE_DETECTION_PACKET_SWITCH', 'FRAME_CAPTURE_PACKET_SWITCH', 'OBSS_PD_CCA_RESET', 'HE_TB_PPDU_TOO_LATE', 'FILTERED'], import_from_module='ns.wifi')
-    ## wifi-standards.h (module 'wifi'): ns3::WifiPhyStandard [enumeration]
-    module.add_enum('WifiPhyStandard', ['WIFI_PHY_STANDARD_80211a', 'WIFI_PHY_STANDARD_80211b', 'WIFI_PHY_STANDARD_80211g', 'WIFI_PHY_STANDARD_80211p', 'WIFI_PHY_STANDARD_80211n', 'WIFI_PHY_STANDARD_80211ac', 'WIFI_PHY_STANDARD_80211ax', 'WIFI_PHY_STANDARD_UNSPECIFIED'], import_from_module='ns.wifi')
-    ## wifi-standards.h (module 'wifi'): ns3::WifiMacStandard [enumeration]
-    module.add_enum('WifiMacStandard', ['WIFI_MAC_STANDARD_80211', 'WIFI_MAC_STANDARD_80211n', 'WIFI_MAC_STANDARD_80211ac', 'WIFI_MAC_STANDARD_80211ax'], import_from_module='ns.wifi')
+    module.add_enum('WifiPhyRxfailureReason', ['UNKNOWN', 'UNSUPPORTED_SETTINGS', 'CHANNEL_SWITCHING', 'RXING', 'TXING', 'SLEEPING', 'POWERED_OFF', 'TRUNCATED_TX', 'BUSY_DECODING_PREAMBLE', 'PREAMBLE_DETECT_FAILURE', 'RECEPTION_ABORTED_BY_TX', 'L_SIG_FAILURE', 'HT_SIG_FAILURE', 'SIG_A_FAILURE', 'SIG_B_FAILURE', 'PREAMBLE_DETECTION_PACKET_SWITCH', 'FRAME_CAPTURE_PACKET_SWITCH', 'OBSS_PD_CCA_RESET', 'HE_TB_PPDU_TOO_LATE', 'FILTERED'], import_from_module='ns.wifi')
     ## wifi-standards.h (module 'wifi'): ns3::WifiStandard [enumeration]
-    module.add_enum('WifiStandard', ['WIFI_STANDARD_80211a', 'WIFI_STANDARD_80211b', 'WIFI_STANDARD_80211g', 'WIFI_STANDARD_80211p', 'WIFI_STANDARD_80211n_2_4GHZ', 'WIFI_STANDARD_80211n_5GHZ', 'WIFI_STANDARD_80211ac', 'WIFI_STANDARD_80211ax_2_4GHZ', 'WIFI_STANDARD_80211ax_5GHZ', 'WIFI_STANDARD_80211ax_6GHZ'], import_from_module='ns.wifi')
+    module.add_enum('WifiStandard', ['WIFI_STANDARD_UNSPECIFIED', 'WIFI_STANDARD_80211a', 'WIFI_STANDARD_80211b', 'WIFI_STANDARD_80211g', 'WIFI_STANDARD_80211p', 'WIFI_STANDARD_80211n', 'WIFI_STANDARD_80211ac', 'WIFI_STANDARD_80211ax'], import_from_module='ns.wifi')
     ## wifi-standards.h (module 'wifi'): ns3::FrequencyChannelType [enumeration]
     module.add_enum('FrequencyChannelType', ['WIFI_PHY_DSSS_CHANNEL', 'WIFI_PHY_OFDM_CHANNEL', 'WIFI_PHY_80211p_CHANNEL'], import_from_module='ns.wifi')
     ## wifi-phy-band.h (module 'wifi'): ns3::WifiPhyBand [enumeration]
@@ -115,6 +111,8 @@
     module.add_class('EventGarbageCollector', import_from_module='ns.core')
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'], import_from_module='ns.core')
     ## hash.h (module 'core'): ns3::Hasher [class]
     module.add_class('Hasher', import_from_module='ns.core')
     ## inet6-socket-address.h (module 'network'): ns3::Inet6SocketAddress [class]
@@ -194,8 +192,6 @@
     typehandlers.add_type_alias('std::vector< ns3::Ptr< ns3::Node > > const_iterator', 'ns3::NodeContainer::Iterator')
     typehandlers.add_type_alias('std::vector< ns3::Ptr< ns3::Node > > const_iterator*', 'ns3::NodeContainer::Iterator*')
     typehandlers.add_type_alias('std::vector< ns3::Ptr< ns3::Node > > const_iterator&', 'ns3::NodeContainer::Iterator&')
-    ## non-copyable.h (module 'core'): ns3::NonCopyable [class]
-    module.add_class('NonCopyable', destructor_visibility='protected', import_from_module='ns.core')
     ## object-base.h (module 'core'): ns3::ObjectBase [class]
     module.add_class('ObjectBase', allow_subclassing=True, import_from_module='ns.core')
     ## object.h (module 'core'): ns3::ObjectDeleter [struct]
@@ -278,24 +274,18 @@
     typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::ConstellationSizeCallback')
     typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::ConstellationSizeCallback*')
     typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::ConstellationSizeCallback&')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::PhyRateCallback')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::PhyRateCallback*')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::PhyRateCallback&')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::PhyRateFromTxVectorCallback')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::PhyRateFromTxVectorCallback*')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::PhyRateFromTxVectorCallback&')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::DataRateCallback')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::DataRateCallback*')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::DataRateCallback&')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::DataRateFromTxVectorCallback')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::DataRateFromTxVectorCallback*')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::DataRateFromTxVectorCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::PhyRateCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::PhyRateCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::PhyRateCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::DataRateCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::DataRateCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::DataRateCallback&')
     typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::NonHtReferenceRateCallback')
     typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::NonHtReferenceRateCallback*')
     typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::NonHtReferenceRateCallback&')
-    typehandlers.add_type_alias('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::ModeAllowedCallback')
-    typehandlers.add_type_alias('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::ModeAllowedCallback*')
-    typehandlers.add_type_alias('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::ModeAllowedCallback&')
+    typehandlers.add_type_alias('ns3::Callback< bool, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::AllowedCallback')
+    typehandlers.add_type_alias('ns3::Callback< bool, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::AllowedCallback*')
+    typehandlers.add_type_alias('ns3::Callback< bool, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::AllowedCallback&')
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStation [struct]
     module.add_class('WifiRemoteStation', import_from_module='ns.wifi')
     ## wifi-remote-station-info.h (module 'wifi'): ns3::WifiRemoteStationInfo [class]
@@ -304,8 +294,6 @@
     module.add_class('WifiRemoteStationState', import_from_module='ns.wifi')
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState [enumeration]
     module.add_enum('', ['BRAND_NEW', 'DISASSOC', 'WAIT_ASSOC_TX_OK', 'GOT_ASSOC_TX_OK'], outer_class=root_module['ns3::WifiRemoteStationState'], import_from_module='ns.wifi')
-    ## wifi-standards.h (module 'wifi'): ns3::WifiStandardInfo [struct]
-    module.add_class('WifiStandardInfo', import_from_module='ns.wifi')
     ## empty.h (module 'core'): ns3::empty [class]
     module.add_class('empty', import_from_module='ns.core')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t [class]
@@ -352,31 +340,31 @@
     module.add_class('RandomVariableStream', import_from_module='ns.core', parent=root_module['ns3::Object'])
     ## random-variable-stream.h (module 'core'): ns3::SequentialRandomVariable [class]
     module.add_class('SequentialRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv4MulticastRoute', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv4Route', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv4Route>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::OutputStreamWrapper', 'ns3::empty', 'ns3::DefaultDeleter<ns3::OutputStreamWrapper>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::WifiInformationElement', 'ns3::empty', 'ns3::DefaultDeleter<ns3::WifiInformationElement>'])
     ## socket.h (module 'network'): ns3::Socket [class]
     module.add_class('Socket', import_from_module='ns.network', parent=root_module['ns3::Object'])
@@ -608,6 +596,12 @@
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, double )&', 'ns3::Packet::SinrTracedCallback&')
     ## random-variable-stream.h (module 'core'): ns3::ParetoRandomVariable [class]
     module.add_class('ParetoRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
+    ## ssid.h (module 'wifi'): ns3::Ssid [class]
+    module.add_class('Ssid', import_from_module='ns.wifi', parent=root_module['ns3::WifiInformationElement'])
+    ## ssid.h (module 'wifi'): ns3::SsidChecker [class]
+    module.add_class('SsidChecker', import_from_module='ns.wifi', parent=root_module['ns3::AttributeChecker'])
+    ## ssid.h (module 'wifi'): ns3::SsidValue [class]
+    module.add_class('SsidValue', import_from_module='ns.wifi', parent=root_module['ns3::AttributeValue'])
     ## tcp-l4-protocol.h (module 'internet'): ns3::TcpL4Protocol [class]
     module.add_class('TcpL4Protocol', import_from_module='ns.internet', parent=root_module['ns3::IpL4Protocol'])
     ## nstime.h (module 'core'): ns3::TimeValue [class]
@@ -630,18 +624,16 @@
     module.add_class('AddressChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
     ## address.h (module 'network'): ns3::AddressValue [class]
     module.add_class('AddressValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['bool', 'const ns3::WifiTxVector &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['bool', 'ns3::Ptr<ns3::Socket>', 'const ns3::Address &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['bool', 'unsigned short', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['ns3::ObjectBase *', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned long long', 'const ns3::WifiTxVector &', 'unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned long long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned long long', 'unsigned short', 'unsigned short', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, const ns3::Ipv4Header &, ns3::Ptr<const ns3::Packet>, ns3::Ipv4L3Protocol::DropReason, ns3::Ptr<ns3::Ipv4>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
@@ -660,6 +652,8 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::Ptr<ns3::Ipv4>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<const ns3::WifiMacQueueItem>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<const ns3::Packet>, unsigned short, const ns3::Address &, const ns3::Address &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'const ns3::Address &', 'const ns3::Address &', 'ns3::NetDevice::PacketType', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
@@ -672,11 +666,19 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::Socket>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::Socket>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::Socket>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::WifiMacDropReason', 'ns3::Ptr<const ns3::WifiMacQueueItem>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned char', 'ns3::Ptr<const ns3::WifiMacQueueItem>', 'const ns3::WifiTxVector &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned char', 'ns3::Ptr<const ns3::WifiPsdu>', 'const ns3::WifiTxVector &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned char', 'std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *', 'const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *', 'unsigned long long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## icmpv4-l4-protocol.h (module 'internet'): ns3::Icmpv4L4Protocol [class]
     module.add_class('Icmpv4L4Protocol', import_from_module='ns.internet', parent=root_module['ns3::IpL4Protocol'])
     module.add_container('std::list< ns3::BlockAckReqType >', 'ns3::BlockAckReqType', container_type='list')
     module.add_container('std::vector< unsigned char >', 'unsigned char', container_type='vector')
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     module.add_container('ns3::WifiModeList', 'ns3::WifiMode', container_type='vector')
     module.add_container('std::vector< ns3::Ipv6Address >', 'ns3::Ipv6Address', container_type='vector')
     module.add_container('std::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStation *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStation * > > >', ('ns3::Mac48Address', 'ns3::WifiRemoteStation *'), container_type='map')
@@ -684,6 +686,8 @@
     module.add_container('std::list< std::pair< ns3::Ptr< ns3::Packet >, ns3::Ipv4Header > >', 'std::pair< ns3::Ptr< ns3::Packet >, ns3::Ipv4Header >', container_type='list')
     module.add_container('std::list< ns3::ArpCache::Entry * >', 'ns3::ArpCache::Entry *', container_type='list')
     module.add_container('std::map< unsigned int, unsigned int >', ('unsigned int', 'unsigned int'), container_type='map')
+    module.add_container('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > >', ('short unsigned int', 'ns3::Ptr< ns3::WifiPsdu >'), container_type='map')
+    module.add_container('std::set< ns3::Mac48Address >', 'ns3::Mac48Address', container_type='set')
     typehandlers.add_type_alias('ns3::SequenceNumber< unsigned int, int >', 'ns3::SequenceNumber32')
     typehandlers.add_type_alias('ns3::SequenceNumber< unsigned int, int >*', 'ns3::SequenceNumber32*')
     typehandlers.add_type_alias('ns3::SequenceNumber< unsigned int, int >&', 'ns3::SequenceNumber32&')
@@ -693,6 +697,9 @@
     typehandlers.add_type_alias('ns3::SequenceNumber< unsigned char, signed char >', 'ns3::SequenceNumber8')
     typehandlers.add_type_alias('ns3::SequenceNumber< unsigned char, signed char >*', 'ns3::SequenceNumber8*')
     typehandlers.add_type_alias('ns3::SequenceNumber< unsigned char, signed char >&', 'ns3::SequenceNumber8&')
+    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > >', 'ns3::WifiPsduMap')
+    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > >*', 'ns3::WifiPsduMap*')
+    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > >&', 'ns3::WifiPsduMap&')
     typehandlers.add_type_alias('uint8_t', 'ns3::WifiInformationElementId')
     typehandlers.add_type_alias('uint8_t*', 'ns3::WifiInformationElementId*')
     typehandlers.add_type_alias('uint8_t&', 'ns3::WifiInformationElementId&')
@@ -801,12 +808,12 @@
 def register_types_ns3_dsr(module):
     root_module = module.get_root()
     
+    ## dsr-option-header.h (module 'dsr'): ns3::dsr::ErrorType [enumeration]
+    module.add_enum('ErrorType', ['NODE_UNREACHABLE', 'FLOW_STATE_NOT_SUPPORTED', 'OPTION_NOT_SUPPORTED'])
     ## dsr-rreq-table.h (module 'dsr'): ns3::dsr::LinkStates [enumeration]
     module.add_enum('LinkStates', ['PROBABLE', 'QUESTIONABLE'])
     ## dsr-network-queue.h (module 'dsr'): ns3::dsr::DsrMessageType [enumeration]
     module.add_enum('DsrMessageType', ['DSR_CONTROL_PACKET', 'DSR_DATA_PACKET'])
-    ## dsr-option-header.h (module 'dsr'): ns3::dsr::ErrorType [enumeration]
-    module.add_enum('ErrorType', ['NODE_UNREACHABLE', 'FLOW_STATE_NOT_SUPPORTED', 'OPTION_NOT_SUPPORTED'])
     ## dsr-rreq-table.h (module 'dsr'): ns3::dsr::BlackList [struct]
     module.add_class('BlackList')
     ## dsr-errorbuff.h (module 'dsr'): ns3::dsr::DsrErrorBuffEntry [class]
@@ -927,7 +934,7 @@
     module.add_container('ns3::dsr::DsrRouteCacheEntry::IP_VECTOR', 'ns3::Ipv4Address', container_type='vector')
     module.add_container('std::vector< ns3::dsr::DsrRouteCache::Neighbor >', 'ns3::dsr::DsrRouteCache::Neighbor', container_type='vector')
     module.add_container('std::vector< ns3::Ptr< ns3::ArpCache > >', 'ns3::Ptr< ns3::ArpCache >', container_type='vector')
-    module.add_container('std::vector< std::string >', 'std::string', container_type='vector')
+    module.add_container('std::vector< std::string >', 'std::basic_string< char, std::char_traits< char >, std::allocator< char > >', container_type='vector')
     module.add_container('std::vector< ns3::dsr::DsrSendBuffEntry >', 'ns3::dsr::DsrSendBuffEntry', container_type='vector')
 
 def register_types_ns3_internal(module):
@@ -989,7 +996,6 @@
     register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
     register_Ns3Mac8Address_methods(root_module, root_module['ns3::Mac8Address'])
     register_Ns3NodeContainer_methods(root_module, root_module['ns3::NodeContainer'])
-    register_Ns3NonCopyable_methods(root_module, root_module['ns3::NonCopyable'])
     register_Ns3ObjectBase_methods(root_module, root_module['ns3::ObjectBase'])
     register_Ns3ObjectDeleter_methods(root_module, root_module['ns3::ObjectDeleter'])
     register_Ns3ObjectFactory_methods(root_module, root_module['ns3::ObjectFactory'])
@@ -1021,7 +1027,6 @@
     register_Ns3WifiRemoteStation_methods(root_module, root_module['ns3::WifiRemoteStation'])
     register_Ns3WifiRemoteStationInfo_methods(root_module, root_module['ns3::WifiRemoteStationInfo'])
     register_Ns3WifiRemoteStationState_methods(root_module, root_module['ns3::WifiRemoteStationState'])
-    register_Ns3WifiStandardInfo_methods(root_module, root_module['ns3::WifiStandardInfo'])
     register_Ns3Empty_methods(root_module, root_module['ns3::empty'])
     register_Ns3Int64x64_t_methods(root_module, root_module['ns3::int64x64_t'])
     register_Ns3Chunk_methods(root_module, root_module['ns3::Chunk'])
@@ -1117,6 +1122,9 @@
     register_Ns3OutputStreamWrapper_methods(root_module, root_module['ns3::OutputStreamWrapper'])
     register_Ns3Packet_methods(root_module, root_module['ns3::Packet'])
     register_Ns3ParetoRandomVariable_methods(root_module, root_module['ns3::ParetoRandomVariable'])
+    register_Ns3Ssid_methods(root_module, root_module['ns3::Ssid'])
+    register_Ns3SsidChecker_methods(root_module, root_module['ns3::SsidChecker'])
+    register_Ns3SsidValue_methods(root_module, root_module['ns3::SsidValue'])
     register_Ns3TcpL4Protocol_methods(root_module, root_module['ns3::TcpL4Protocol'])
     register_Ns3TimeValue_methods(root_module, root_module['ns3::TimeValue'])
     register_Ns3TypeIdChecker_methods(root_module, root_module['ns3::TypeIdChecker'])
@@ -1128,12 +1136,11 @@
     register_Ns3WifiModeValue_methods(root_module, root_module['ns3::WifiModeValue'])
     register_Ns3AddressChecker_methods(root_module, root_module['ns3::AddressChecker'])
     register_Ns3AddressValue_methods(root_module, root_module['ns3::AddressValue'])
+    register_Ns3CallbackImpl__Bool_Const_ns3WifiTxVector___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Bool_Ns3Ptr__lt__ns3Socket__gt___Const_ns3Address___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3CallbackImpl__Bool_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Ns3ObjectBase___star___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Unsigned_long_Const_ns3WifiTxVector___amp___Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned long long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3CallbackImpl__Unsigned_long_Unsigned_short_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Const_ns3Ipv4Header___amp___Ns3Ptr__lt__const_ns3Packet__gt___Ns3Ipv4L3ProtocolDropReason_Ns3Ptr__lt__ns3Ipv4__gt___Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, const ns3::Ipv4Header &, ns3::Ptr<const ns3::Packet>, ns3::Ipv4L3Protocol::DropReason, ns3::Ptr<ns3::Ipv4>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Const_ns3Ipv4Header___amp___Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, const ns3::Ipv4Header &, ns3::Ptr<const ns3::Packet>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
@@ -1143,12 +1150,17 @@
     register_Ns3CallbackImpl__Void_Ns3Mac48Address_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Ns3Ptr__lt__ns3Ipv4__gt___Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::Packet>, ns3::Ptr<ns3::Ipv4>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::Packet>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3WifiMacQueueItem__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3NetDevice__gt___Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_short_Const_ns3Address___amp___Const_ns3Address___amp___Ns3NetDevicePacketType_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<const ns3::Packet>, unsigned short, const ns3::Address &, const ns3::Address &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3NetDevice__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::NetDevice>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3Packet__gt___Ns3Ipv4Address_Ns3Ipv4Address_Unsigned_char_Ns3Ptr__lt__ns3Ipv4Route__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::Packet>, ns3::Ipv4Address, ns3::Ipv4Address, unsigned char, ns3::Ptr<ns3::Ipv4Route>, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3Socket__gt___Const_ns3Address___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3Socket__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3Socket__gt___Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::Socket>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Ns3WifiMacDropReason_Ns3Ptr__lt__const_ns3WifiMacQueueItem__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Unsigned_char_Ns3Ptr__lt__const_ns3WifiMacQueueItem__gt___Const_ns3WifiTxVector___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Unsigned_char_Ns3Ptr__lt__const_ns3WifiPsdu__gt___Const_ns3WifiTxVector___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Unsigned_char_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt____gt____gt____gt_____star___Const_stdSet__lt__ns3Mac48Address__stdLess__lt__ns3Mac48Address__gt____stdAllocator__lt__ns3Mac48Address__gt____gt_____star___Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3Icmpv4L4Protocol_methods(root_module, root_module['ns3::Icmpv4L4Protocol'])
     register_Ns3HashImplementation_methods(root_module, root_module['ns3::Hash::Implementation'])
     register_Ns3HashFunctionFnv1a_methods(root_module, root_module['ns3::Hash::Function::Fnv1a'])
@@ -1340,7 +1352,7 @@
     cls.add_constructor([])
     ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::BlockAckType(ns3::BlockAckType::Variant v) [constructor]
     cls.add_constructor([param('ns3::BlockAckType::Variant', 'v')])
-    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::BlockAckType(ns3::BlockAckType::Variant v, std::vector<unsigned char, std::allocator<unsigned char> > l) [constructor]
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::BlockAckType(ns3::BlockAckType::Variant v, std::vector<unsigned char, std::allocator<unsigned char>> l) [constructor]
     cls.add_constructor([param('ns3::BlockAckType::Variant', 'v'), param('std::vector< unsigned char >', 'l')])
     ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::m_bitmapLen [variable]
     cls.add_instance_attribute('m_bitmapLen', 'std::vector< unsigned char >', is_const=False)
@@ -2976,12 +2988,6 @@
                    is_const=True)
     return
 
-def register_Ns3NonCopyable_methods(root_module, cls):
-    ## non-copyable.h (module 'core'): ns3::NonCopyable::NonCopyable() [constructor]
-    cls.add_constructor([], 
-                        visibility='protected')
-    return
-
 def register_Ns3ObjectBase_methods(root_module, cls):
     ## object-base.h (module 'core'): ns3::ObjectBase::ObjectBase() [constructor]
     cls.add_constructor([])
@@ -3830,8 +3836,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -4164,6 +4170,11 @@
                    'bool', 
                    [param('uint16_t', 'channelWidth'), param('uint8_t', 'nss')], 
                    is_const=True)
+    ## wifi-mode.h (module 'wifi'): bool ns3::WifiMode::IsAllowed(ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('IsAllowed', 
+                   'bool', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True)
     ## wifi-mode.h (module 'wifi'): bool ns3::WifiMode::IsHigherCodeRate(ns3::WifiMode mode) const [member function]
     cls.add_method('IsHigherCodeRate', 
                    'bool', 
@@ -4184,15 +4195,15 @@
 def register_Ns3WifiModeFactory_methods(root_module, cls):
     ## wifi-mode.h (module 'wifi'): ns3::WifiModeFactory::WifiModeFactory(ns3::WifiModeFactory const & arg0) [constructor]
     cls.add_constructor([param('ns3::WifiModeFactory const &', 'arg0')])
-    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMcs(std::string uniqueName, uint8_t mcsValue, ns3::WifiModulationClass modClass, ns3::WifiModeFactory::CodeRateCallback codeRateCallback, ns3::WifiModeFactory::ConstellationSizeCallback constellationSizeCallback, ns3::WifiModeFactory::PhyRateCallback phyRateCallback, ns3::WifiModeFactory::PhyRateFromTxVectorCallback phyRateFromTxVectorCallback, ns3::WifiModeFactory::DataRateCallback dataRateCallback, ns3::WifiModeFactory::DataRateFromTxVectorCallback dataRateFromTxVectorCallback, ns3::WifiModeFactory::NonHtReferenceRateCallback nonHtReferenceRateCallback, ns3::WifiModeFactory::ModeAllowedCallback isModeAllowedCallback) [member function]
+    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMcs(std::string uniqueName, uint8_t mcsValue, ns3::WifiModulationClass modClass, bool isMandatory, ns3::WifiModeFactory::CodeRateCallback codeRateCallback, ns3::WifiModeFactory::ConstellationSizeCallback constellationSizeCallback, ns3::WifiModeFactory::PhyRateCallback phyRateCallback, ns3::WifiModeFactory::DataRateCallback dataRateCallback, ns3::WifiModeFactory::NonHtReferenceRateCallback nonHtReferenceRateCallback, ns3::WifiModeFactory::AllowedCallback isAllowedCallback) [member function]
     cls.add_method('CreateWifiMcs', 
                    'ns3::WifiMode', 
-                   [param('std::string', 'uniqueName'), param('uint8_t', 'mcsValue'), param('ns3::WifiModulationClass', 'modClass'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'codeRateCallback'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'constellationSizeCallback'), param('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateCallback'), param('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateFromTxVectorCallback'), param('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateCallback'), param('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateFromTxVectorCallback'), param('ns3::Callback< unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'nonHtReferenceRateCallback'), param('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'isModeAllowedCallback')], 
+                   [param('std::string', 'uniqueName'), param('uint8_t', 'mcsValue'), param('ns3::WifiModulationClass', 'modClass'), param('bool', 'isMandatory'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'codeRateCallback'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'constellationSizeCallback'), param('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateCallback'), param('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateCallback'), param('ns3::Callback< unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'nonHtReferenceRateCallback'), param('ns3::Callback< bool, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'isAllowedCallback')], 
                    is_static=True)
-    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMode(std::string uniqueName, ns3::WifiModulationClass modClass, bool isMandatory, ns3::WifiModeFactory::CodeRateCallback codeRateCallback, ns3::WifiModeFactory::ConstellationSizeCallback constellationSizeCallback, ns3::WifiModeFactory::PhyRateCallback phyRateCallback, ns3::WifiModeFactory::PhyRateFromTxVectorCallback phyRateFromTxVectorCallback, ns3::WifiModeFactory::DataRateCallback dataRateCallback, ns3::WifiModeFactory::DataRateFromTxVectorCallback dataRateFromTxVectorCallback, ns3::WifiModeFactory::ModeAllowedCallback isModeAllowedCallback) [member function]
+    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMode(std::string uniqueName, ns3::WifiModulationClass modClass, bool isMandatory, ns3::WifiModeFactory::CodeRateCallback codeRateCallback, ns3::WifiModeFactory::ConstellationSizeCallback constellationSizeCallback, ns3::WifiModeFactory::PhyRateCallback phyRateCallback, ns3::WifiModeFactory::DataRateCallback dataRateCallback, ns3::WifiModeFactory::AllowedCallback isAllowedCallback) [member function]
     cls.add_method('CreateWifiMode', 
                    'ns3::WifiMode', 
-                   [param('std::string', 'uniqueName'), param('ns3::WifiModulationClass', 'modClass'), param('bool', 'isMandatory'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'codeRateCallback'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'constellationSizeCallback'), param('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateCallback'), param('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateFromTxVectorCallback'), param('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateCallback'), param('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateFromTxVectorCallback'), param('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'isModeAllowedCallback')], 
+                   [param('std::string', 'uniqueName'), param('ns3::WifiModulationClass', 'modClass'), param('bool', 'isMandatory'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'codeRateCallback'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'constellationSizeCallback'), param('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateCallback'), param('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateCallback'), param('ns3::Callback< bool, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'isAllowedCallback')], 
                    is_static=True)
     return
 
@@ -4270,19 +4281,6 @@
     cls.add_instance_attribute('m_vhtCapabilities', 'ns3::Ptr< ns3::VhtCapabilities const >', is_const=False)
     return
 
-def register_Ns3WifiStandardInfo_methods(root_module, cls):
-    ## wifi-standards.h (module 'wifi'): ns3::WifiStandardInfo::WifiStandardInfo() [constructor]
-    cls.add_constructor([])
-    ## wifi-standards.h (module 'wifi'): ns3::WifiStandardInfo::WifiStandardInfo(ns3::WifiStandardInfo const & arg0) [constructor]
-    cls.add_constructor([param('ns3::WifiStandardInfo const &', 'arg0')])
-    ## wifi-standards.h (module 'wifi'): ns3::WifiStandardInfo::macStandard [variable]
-    cls.add_instance_attribute('macStandard', 'ns3::WifiMacStandard', is_const=False)
-    ## wifi-standards.h (module 'wifi'): ns3::WifiStandardInfo::phyBand [variable]
-    cls.add_instance_attribute('phyBand', 'ns3::WifiPhyBand', is_const=False)
-    ## wifi-standards.h (module 'wifi'): ns3::WifiStandardInfo::phyStandard [variable]
-    cls.add_instance_attribute('phyStandard', 'ns3::WifiPhyStandard', is_const=False)
-    return
-
 def register_Ns3Empty_methods(root_module, cls):
     ## empty.h (module 'core'): ns3::empty::empty() [constructor]
     cls.add_constructor([])
@@ -4300,14 +4298,14 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('>=')
     cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_unary_numeric_operator('-')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
     cls.add_constructor([])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(double const value) [constructor]
@@ -4326,6 +4324,8 @@
     cls.add_constructor([param('long unsigned int const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int const v) [constructor]
     cls.add_constructor([param('long long unsigned int const', 'v')])
+    ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int128_t const v) [constructor]
+    cls.add_constructor([param('int128_t const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t const hi, uint64_t const lo) [constructor]
     cls.add_constructor([param('int64_t const', 'hi'), param('uint64_t const', 'lo')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [constructor]
@@ -5160,93 +5160,93 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Ipv4MulticastRoute_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv4MulticastRoute__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter< ns3::Ipv4MulticastRoute > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Ipv4Route_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv4Route__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter< ns3::Ipv4Route > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3OutputStreamWrapper_Ns3Empty_Ns3DefaultDeleter__lt__ns3OutputStreamWrapper__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter< ns3::OutputStreamWrapper > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3WifiInformationElement_Ns3Empty_Ns3DefaultDeleter__lt__ns3WifiInformationElement__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement> >::SimpleRefCount(ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement>>::SimpleRefCount(ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter< ns3::WifiInformationElement > > const &', 'o')])
     return
 
@@ -5369,7 +5369,7 @@
                    'uint8_t', 
                    [param('uint8_t', 'ipTos')], 
                    is_static=True)
-    ## socket.h (module 'network'): void ns3::Socket::Ipv6JoinGroup(ns3::Ipv6Address address, ns3::Socket::Ipv6MulticastFilterMode filterMode, std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address> > sourceAddresses) [member function]
+    ## socket.h (module 'network'): void ns3::Socket::Ipv6JoinGroup(ns3::Ipv6Address address, ns3::Socket::Ipv6MulticastFilterMode filterMode, std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address>> sourceAddresses) [member function]
     cls.add_method('Ipv6JoinGroup', 
                    'void', 
                    [param('ns3::Ipv6Address', 'address'), param('ns3::Socket::Ipv6MulticastFilterMode', 'filterMode'), param('std::vector< ns3::Ipv6Address >', 'sourceAddresses')], 
@@ -6136,102 +6136,153 @@
     return
 
 def register_Ns3WifiMac_methods(root_module, cls):
+    ## wifi-mac.h (module 'wifi'): static ns3::TypeId ns3::WifiMac::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## wifi-mac.h (module 'wifi'): ns3::WifiMac::WifiMac() [constructor]
     cls.add_constructor([])
-    ## wifi-mac.h (module 'wifi'): ns3::WifiMac::WifiMac(ns3::WifiMac const & arg0) [constructor]
-    cls.add_constructor([param('ns3::WifiMac const &', 'arg0')])
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::ConfigureStandard(ns3::WifiStandard standard) [member function]
-    cls.add_method('ConfigureStandard', 
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetDevice(ns3::Ptr<ns3::WifiNetDevice> const device) [member function]
+    cls.add_method('SetDevice', 
                    'void', 
-                   [param('ns3::WifiStandard', 'standard')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::DoDispose() [member function]
-    cls.add_method('DoDispose', 
+                   [param('ns3::Ptr< ns3::WifiNetDevice > const', 'device')])
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiNetDevice> ns3::WifiMac::GetDevice() const [member function]
+    cls.add_method('GetDevice', 
+                   'ns3::Ptr< ns3::WifiNetDevice >', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::FrameExchangeManager> ns3::WifiMac::GetFrameExchangeManager() const [member function]
+    cls.add_method('GetFrameExchangeManager', 
+                   'ns3::Ptr< ns3::FrameExchangeManager >', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::Txop> ns3::WifiMac::GetTxop() const [member function]
+    cls.add_method('GetTxop', 
+                   'ns3::Ptr< ns3::Txop >', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::WifiMac::GetQosTxop(ns3::AcIndex ac) const [member function]
+    cls.add_method('GetQosTxop', 
+                   'ns3::Ptr< ns3::QosTxop >', 
+                   [param('ns3::AcIndex', 'ac')], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::WifiMac::GetQosTxop(uint8_t tid) const [member function]
+    cls.add_method('GetQosTxop', 
+                   'ns3::Ptr< ns3::QosTxop >', 
+                   [param('uint8_t', 'tid')], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueue> ns3::WifiMac::GetTxopQueue(ns3::AcIndex ac) const [member function]
+    cls.add_method('GetTxopQueue', 
+                   'ns3::Ptr< ns3::WifiMacQueue >', 
+                   [param('ns3::AcIndex', 'ac')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetTypeOfStation(ns3::TypeOfStation type) [member function]
+    cls.add_method('SetTypeOfStation', 
                    'void', 
+                   [param('ns3::TypeOfStation', 'type')])
+    ## wifi-mac.h (module 'wifi'): ns3::TypeOfStation ns3::WifiMac::GetTypeOfStation() const [member function]
+    cls.add_method('GetTypeOfStation', 
+                   'ns3::TypeOfStation', 
                    [], 
-                   is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to, ns3::Mac48Address from) [member function]
-    cls.add_method('Enqueue', 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetSsid(ns3::Ssid ssid) [member function]
+    cls.add_method('SetSsid', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to'), param('ns3::Mac48Address', 'from')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to) [member function]
-    cls.add_method('Enqueue', 
+                   [param('ns3::Ssid', 'ssid')])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetPromisc() [member function]
+    cls.add_method('SetPromisc', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to')], 
-                   is_pure_virtual=True, is_virtual=True)
+                   [])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetCtsToSelfSupported(bool enable) [member function]
+    cls.add_method('SetCtsToSelfSupported', 
+                   'void', 
+                   [param('bool', 'enable')])
     ## wifi-mac.h (module 'wifi'): ns3::Mac48Address ns3::WifiMac::GetAddress() const [member function]
     cls.add_method('GetAddress', 
                    'ns3::Mac48Address', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): ns3::Mac48Address ns3::WifiMac::GetBssid() const [member function]
-    cls.add_method('GetBssid', 
-                   'ns3::Mac48Address', 
-                   [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::NetDevice> ns3::WifiMac::GetDevice() const [member function]
-    cls.add_method('GetDevice', 
-                   'ns3::Ptr< ns3::NetDevice >', 
-                   [], 
                    is_const=True)
-    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::HeConfiguration> ns3::WifiMac::GetHeConfiguration() const [member function]
-    cls.add_method('GetHeConfiguration', 
-                   'ns3::Ptr< ns3::HeConfiguration >', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::HtConfiguration> ns3::WifiMac::GetHtConfiguration() const [member function]
-    cls.add_method('GetHtConfiguration', 
-                   'ns3::Ptr< ns3::HtConfiguration >', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::GetShortSlotTimeSupported() const [member function]
-    cls.add_method('GetShortSlotTimeSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## wifi-mac.h (module 'wifi'): ns3::Ssid ns3::WifiMac::GetSsid() const [member function]
     cls.add_method('GetSsid', 
                    'ns3::Ssid', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): static ns3::TypeId ns3::WifiMac::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## wifi-mac.h (module 'wifi'): ns3::TypeOfStation ns3::WifiMac::GetTypeOfStation() const [member function]
-    cls.add_method('GetTypeOfStation', 
-                   'ns3::TypeOfStation', 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetAddress(ns3::Mac48Address address) [member function]
+    cls.add_method('SetAddress', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Mac48Address ns3::WifiMac::GetBssid() const [member function]
+    cls.add_method('GetBssid', 
+                   'ns3::Mac48Address', 
                    [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetBssid(ns3::Mac48Address bssid) [member function]
+    cls.add_method('SetBssid', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'bssid')])
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::CanForwardPacketsTo(ns3::Mac48Address to) const [member function]
+    cls.add_method('CanForwardPacketsTo', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'to')], 
                    is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::VhtConfiguration> ns3::WifiMac::GetVhtConfiguration() const [member function]
-    cls.add_method('GetVhtConfiguration', 
-                   'ns3::Ptr< ns3::VhtConfiguration >', 
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to, ns3::Mac48Address from) [member function]
+    cls.add_method('Enqueue', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to'), param('ns3::Mac48Address', 'from')], 
+                   is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to) [member function]
+    cls.add_method('Enqueue', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::SupportsSendFrom() const [member function]
+    cls.add_method('SupportsSendFrom', 
+                   'bool', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetWifiPhy(ns3::Ptr<ns3::WifiPhy> phy) [member function]
+    cls.add_method('SetWifiPhy', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPhy >', 'phy')], 
+                   is_virtual=True)
     ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiPhy> ns3::WifiMac::GetWifiPhy() const [member function]
     cls.add_method('GetWifiPhy', 
                    'ns3::Ptr< ns3::WifiPhy >', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::ResetWifiPhy() [member function]
+    cls.add_method('ResetWifiPhy', 
+                   'void', 
+                   [])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetWifiRemoteStationManager(ns3::Ptr<ns3::WifiRemoteStationManager> stationManager) [member function]
+    cls.add_method('SetWifiRemoteStationManager', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiRemoteStationManager >', 'stationManager')])
     ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiRemoteStationManager> ns3::WifiMac::GetWifiRemoteStationManager() const [member function]
     cls.add_method('GetWifiRemoteStationManager', 
                    'ns3::Ptr< ns3::WifiRemoteStationManager >', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyPromiscRx(ns3::Ptr<const ns3::Packet> packet) [member function]
-    cls.add_method('NotifyPromiscRx', 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetForwardUpCallback(ns3::WifiMac::ForwardUpCallback upCallback) [member function]
+    cls.add_method('SetForwardUpCallback', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyRx(ns3::Ptr<const ns3::Packet> packet) [member function]
-    cls.add_method('NotifyRx', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'upCallback')])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetLinkUpCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkUp) [member function]
+    cls.add_method('SetLinkUpCallback', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyRxDrop(ns3::Ptr<const ns3::Packet> packet) [member function]
-    cls.add_method('NotifyRxDrop', 
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkUp')], 
+                   is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetLinkDownCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkDown) [member function]
+    cls.add_method('SetLinkDownCallback', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkDown')])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyChannelSwitching() [member function]
+    cls.add_method('NotifyChannelSwitching', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
     ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyTx(ns3::Ptr<const ns3::Packet> packet) [member function]
     cls.add_method('NotifyTx', 
                    'void', 
@@ -6240,75 +6291,163 @@
     cls.add_method('NotifyTxDrop', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet const >', 'packet')])
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::ResetWifiPhy() [member function]
-    cls.add_method('ResetWifiPhy', 
-                   'void', 
-                   [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetAddress(ns3::Mac48Address address) [member function]
-    cls.add_method('SetAddress', 
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyRx(ns3::Ptr<const ns3::Packet> packet) [member function]
+    cls.add_method('NotifyRx', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetDevice(ns3::Ptr<ns3::NetDevice> const device) [member function]
-    cls.add_method('SetDevice', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyPromiscRx(ns3::Ptr<const ns3::Packet> packet) [member function]
+    cls.add_method('NotifyPromiscRx', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NetDevice > const', 'device')])
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetForwardUpCallback(ns3::WifiMac::ForwardUpCallback upCallback) [member function]
-    cls.add_method('SetForwardUpCallback', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyRxDrop(ns3::Ptr<const ns3::Packet> packet) [member function]
+    cls.add_method('NotifyRxDrop', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'upCallback')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetLinkDownCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkDown) [member function]
-    cls.add_method('SetLinkDownCallback', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::ConfigureStandard(ns3::WifiStandard standard) [member function]
+    cls.add_method('ConfigureStandard', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkDown')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetLinkUpCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkUp) [member function]
-    cls.add_method('SetLinkUpCallback', 
+                   [param('ns3::WifiStandard', 'standard')], 
+                   is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::HtConfiguration> ns3::WifiMac::GetHtConfiguration() const [member function]
+    cls.add_method('GetHtConfiguration', 
+                   'ns3::Ptr< ns3::HtConfiguration >', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::VhtConfiguration> ns3::WifiMac::GetVhtConfiguration() const [member function]
+    cls.add_method('GetVhtConfiguration', 
+                   'ns3::Ptr< ns3::VhtConfiguration >', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::HeConfiguration> ns3::WifiMac::GetHeConfiguration() const [member function]
+    cls.add_method('GetHeConfiguration', 
+                   'ns3::Ptr< ns3::HeConfiguration >', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::ExtendedCapabilities ns3::WifiMac::GetExtendedCapabilities() const [member function]
+    cls.add_method('GetExtendedCapabilities', 
+                   'ns3::ExtendedCapabilities', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::HtCapabilities ns3::WifiMac::GetHtCapabilities() const [member function]
+    cls.add_method('GetHtCapabilities', 
+                   'ns3::HtCapabilities', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::VhtCapabilities ns3::WifiMac::GetVhtCapabilities() const [member function]
+    cls.add_method('GetVhtCapabilities', 
+                   'ns3::VhtCapabilities', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::HeCapabilities ns3::WifiMac::GetHeCapabilities() const [member function]
+    cls.add_method('GetHeCapabilities', 
+                   'ns3::HeCapabilities', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::GetQosSupported() const [member function]
+    cls.add_method('GetQosSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::GetErpSupported() const [member function]
+    cls.add_method('GetErpSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::GetDsssSupported() const [member function]
+    cls.add_method('GetDsssSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::GetHtSupported() const [member function]
+    cls.add_method('GetHtSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::GetVhtSupported() const [member function]
+    cls.add_method('GetVhtSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::GetHeSupported() const [member function]
+    cls.add_method('GetHeSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): uint32_t ns3::WifiMac::GetMaxAmpduSize(ns3::AcIndex ac) const [member function]
+    cls.add_method('GetMaxAmpduSize', 
+                   'uint32_t', 
+                   [param('ns3::AcIndex', 'ac')], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): uint16_t ns3::WifiMac::GetMaxAmsduSize(ns3::AcIndex ac) const [member function]
+    cls.add_method('GetMaxAmsduSize', 
+                   'uint16_t', 
+                   [param('ns3::AcIndex', 'ac')], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkUp')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetPromisc() [member function]
-    cls.add_method('SetPromisc', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::DoDispose() [member function]
+    cls.add_method('DoDispose', 
                    'void', 
                    [], 
-                   is_pure_virtual=True, is_virtual=True)
+                   is_virtual=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::ConfigureContentionWindow(uint32_t cwMin, uint32_t cwMax) [member function]
+    cls.add_method('ConfigureContentionWindow', 
+                   'void', 
+                   [param('uint32_t', 'cwMin'), param('uint32_t', 'cwMax')], 
+                   is_virtual=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetQosSupported(bool enable) [member function]
+    cls.add_method('SetQosSupported', 
+                   'void', 
+                   [param('bool', 'enable')], 
+                   visibility='protected')
     ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetShortSlotTimeSupported(bool enable) [member function]
     cls.add_method('SetShortSlotTimeSupported', 
                    'void', 
                    [param('bool', 'enable')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetSsid(ns3::Ssid ssid) [member function]
-    cls.add_method('SetSsid', 
-                   'void', 
-                   [param('ns3::Ssid', 'ssid')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetTypeOfStation(ns3::TypeOfStation type) [member function]
-    cls.add_method('SetTypeOfStation', 
-                   'void', 
-                   [param('ns3::TypeOfStation', 'type')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetWifiPhy(ns3::Ptr<ns3::WifiPhy> phy) [member function]
-    cls.add_method('SetWifiPhy', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiPhy >', 'phy')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetWifiRemoteStationManager(ns3::Ptr<ns3::WifiRemoteStationManager> stationManager) [member function]
-    cls.add_method('SetWifiRemoteStationManager', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiRemoteStationManager >', 'stationManager')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::SupportsSendFrom() const [member function]
-    cls.add_method('SupportsSendFrom', 
+                   visibility='protected')
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::GetShortSlotTimeSupported() const [member function]
+    cls.add_method('GetShortSlotTimeSupported', 
                    'bool', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::ConfigureDcf(ns3::Ptr<ns3::Txop> dcf, uint32_t cwmin, uint32_t cwmax, bool isDsss, ns3::AcIndex ac) [member function]
-    cls.add_method('ConfigureDcf', 
+                   is_const=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::WifiMac::GetVOQueue() const [member function]
+    cls.add_method('GetVOQueue', 
+                   'ns3::Ptr< ns3::QosTxop >', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::WifiMac::GetVIQueue() const [member function]
+    cls.add_method('GetVIQueue', 
+                   'ns3::Ptr< ns3::QosTxop >', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::WifiMac::GetBEQueue() const [member function]
+    cls.add_method('GetBEQueue', 
+                   'ns3::Ptr< ns3::QosTxop >', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::WifiMac::GetBKQueue() const [member function]
+    cls.add_method('GetBKQueue', 
+                   'ns3::Ptr< ns3::QosTxop >', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::Receive(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('Receive', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
+                   is_virtual=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::ForwardUp(ns3::Ptr<const ns3::Packet> packet, ns3::Mac48Address from, ns3::Mac48Address to) [member function]
+    cls.add_method('ForwardUp', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Txop >', 'dcf'), param('uint32_t', 'cwmin'), param('uint32_t', 'cwmax'), param('bool', 'isDsss'), param('ns3::AcIndex', 'ac')], 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::Mac48Address', 'from'), param('ns3::Mac48Address', 'to')], 
                    visibility='protected')
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::DeaggregateAmsduAndForward(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('DeaggregateAmsduAndForward', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
+                   is_virtual=True, visibility='protected')
     return
 
 def register_Ns3WifiRemoteStationManager_methods(root_module, cls):
@@ -7059,7 +7198,7 @@
     cls.add_method('Lookup', 
                    'ns3::ArpCache::Entry *', 
                    [param('ns3::Ipv4Address', 'destination')])
-    ## arp-cache.h (module 'internet'): std::list<ns3::ArpCache::Entry *, std::allocator<ns3::ArpCache::Entry *> > ns3::ArpCache::LookupInverse(ns3::Address destination) [member function]
+    ## arp-cache.h (module 'internet'): std::list<ns3::ArpCache::Entry *, std::allocator<ns3::ArpCache::Entry *>> ns3::ArpCache::LookupInverse(ns3::Address destination) [member function]
     cls.add_method('LookupInverse', 
                    'std::list< ns3::ArpCache::Entry * >', 
                    [param('ns3::Address', 'destination')])
@@ -7335,42 +7474,42 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::Socket> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::NetDevice> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['bool'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::Packet const> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Address const&'], visibility='protected')
+                   is_static=True, template_parameters=['unsigned short'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['unsigned int'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Address const&'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::NetDevice> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::NetDevice::PacketType'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::Packet const> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::Socket> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['unsigned short'], visibility='protected')
+                   is_static=True, template_parameters=['bool'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::NetDevice::PacketType'], visibility='protected')
+                   is_static=True, template_parameters=['unsigned int'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
@@ -7410,6 +7549,31 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
+                   is_static=True, template_parameters=['ns3::WifiMacDropReason'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiMacQueueItem const> '], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiPsdu const> '], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['std::unordered_map<unsigned short', ' ns3::Ptr<ns3::WifiPsdu>', ' std::hash<unsigned short>', ' std::equal_to<unsigned short>', ' std::allocator<std::pair<unsigned short const', ' ns3::Ptr<ns3::WifiPsdu> > > >*'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['std::set<ns3::Mac48Address', ' std::less<ns3::Mac48Address>', ' std::allocator<ns3::Mac48Address> > const*'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
                    is_static=True, template_parameters=['ns3::dsr::DsrOptionSRHeader const&'], visibility='protected')
     return
 
@@ -7909,19 +8073,14 @@
                    'uint8_t', 
                    [], 
                    is_const=True)
-    ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetHeLtfAndGiForHePpdus() const [member function]
-    cls.add_method('GetHeLtfAndGiForHePpdus', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
     ## he-capabilities.h (module 'wifi'): uint32_t ns3::HeCapabilities::GetHeMacCapabilitiesInfo1() const [member function]
     cls.add_method('GetHeMacCapabilitiesInfo1', 
                    'uint32_t', 
                    [], 
                    is_const=True)
-    ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetHeMacCapabilitiesInfo2() const [member function]
+    ## he-capabilities.h (module 'wifi'): uint16_t ns3::HeCapabilities::GetHeMacCapabilitiesInfo2() const [member function]
     cls.add_method('GetHeMacCapabilitiesInfo2', 
-                   'uint8_t', 
+                   'uint16_t', 
                    [], 
                    is_const=True)
     ## he-capabilities.h (module 'wifi'): uint64_t ns3::HeCapabilities::GetHePhyCapabilitiesInfo1() const [member function]
@@ -7929,11 +8088,26 @@
                    'uint64_t', 
                    [], 
                    is_const=True)
-    ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetHePhyCapabilitiesInfo2() const [member function]
+    ## he-capabilities.h (module 'wifi'): uint16_t ns3::HeCapabilities::GetHePhyCapabilitiesInfo2() const [member function]
     cls.add_method('GetHePhyCapabilitiesInfo2', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetHePhyCapabilitiesInfo3() const [member function]
+    cls.add_method('GetHePhyCapabilitiesInfo3', 
                    'uint8_t', 
                    [], 
                    is_const=True)
+    ## he-capabilities.h (module 'wifi'): bool ns3::HeCapabilities::GetHePpdu4xHeLtf800nsGi() const [member function]
+    cls.add_method('GetHePpdu4xHeLtf800nsGi', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## he-capabilities.h (module 'wifi'): bool ns3::HeCapabilities::GetHeSuPpdu1xHeLtf800nsGi() const [member function]
+    cls.add_method('GetHeSuPpdu1xHeLtf800nsGi', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetHighestMcsSupported() const [member function]
     cls.add_method('GetHighestMcsSupported', 
                    'uint8_t', 
@@ -7993,18 +8167,22 @@
     cls.add_method('SetChannelWidthSet', 
                    'void', 
                    [param('uint8_t', 'channelWidthSet')])
-    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHeLtfAndGiForHePpdus(uint8_t heLtfAndGiForHePpdus) [member function]
-    cls.add_method('SetHeLtfAndGiForHePpdus', 
-                   'void', 
-                   [param('uint8_t', 'heLtfAndGiForHePpdus')])
-    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHeMacCapabilitiesInfo(uint32_t ctrl1, uint8_t ctrl2) [member function]
+    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHeMacCapabilitiesInfo(uint32_t ctrl1, uint16_t ctrl2) [member function]
     cls.add_method('SetHeMacCapabilitiesInfo', 
                    'void', 
-                   [param('uint32_t', 'ctrl1'), param('uint8_t', 'ctrl2')])
-    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHePhyCapabilitiesInfo(uint64_t ctrl1, uint8_t ctrl2) [member function]
+                   [param('uint32_t', 'ctrl1'), param('uint16_t', 'ctrl2')])
+    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHePhyCapabilitiesInfo(uint64_t ctrl1, uint16_t ctrl2, uint8_t ctrl3) [member function]
     cls.add_method('SetHePhyCapabilitiesInfo', 
                    'void', 
-                   [param('uint64_t', 'ctrl1'), param('uint8_t', 'ctrl2')])
+                   [param('uint64_t', 'ctrl1'), param('uint16_t', 'ctrl2'), param('uint8_t', 'ctrl3')])
+    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHePpdu4xHeLtf800nsGi(bool heSuPpdu4xHeLtf800nsGi) [member function]
+    cls.add_method('SetHePpdu4xHeLtf800nsGi', 
+                   'void', 
+                   [param('bool', 'heSuPpdu4xHeLtf800nsGi')])
+    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHeSuPpdu1xHeLtf800nsGi(bool heSuPpdu1xHeLtf800nsGi) [member function]
+    cls.add_method('SetHeSuPpdu1xHeLtf800nsGi', 
+                   'void', 
+                   [param('bool', 'heSuPpdu1xHeLtf800nsGi')])
     ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHeSupported(uint8_t heSupported) [member function]
     cls.add_method('SetHeSupported', 
                    'void', 
@@ -8912,7 +9090,7 @@
                    'ns3::Ipv4Address', 
                    [], 
                    is_const=True)
-    ## ipv4-route.h (module 'internet'): std::map<unsigned int, unsigned int, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, unsigned int> > > ns3::Ipv4MulticastRoute::GetOutputTtlMap() const [member function]
+    ## ipv4-route.h (module 'internet'): std::map<unsigned int, unsigned int, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, unsigned int>>> ns3::Ipv4MulticastRoute::GetOutputTtlMap() const [member function]
     cls.add_method('GetOutputTtlMap', 
                    'std::map< unsigned int, unsigned int >', 
                    [], 
@@ -9358,10 +9536,16 @@
     cls.add_method('ExtractNeighborIndex', 
                    'uint32_t', 
                    [param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetEpoch() const [member function]
+    cls.add_method('GetEpoch', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() const [member function]
     cls.add_method('GetRemainingBits', 
                    'uint32_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -9372,6 +9556,10 @@
                    'uint32_t', 
                    [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
+    ## nix-vector.h (module 'network'): void ns3::NixVector::SetEpoch(uint32_t epoch) [member function]
+    cls.add_method('SetEpoch', 
+                   'void', 
+                   [param('uint32_t', 'epoch')])
     return
 
 def register_Ns3Node_methods(root_module, cls):
@@ -9748,10 +9936,11 @@
                    'uint32_t', 
                    [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) const [member function]
     cls.add_method('SetNixVector', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')], 
+                   is_const=True)
     ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
     cls.add_method('ToString', 
                    'std::string', 
@@ -9802,6 +9991,91 @@
                    is_virtual=True)
     return
 
+def register_Ns3Ssid_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## ssid.h (module 'wifi'): ns3::Ssid::Ssid(ns3::Ssid const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ssid const &', 'arg0')])
+    ## ssid.h (module 'wifi'): ns3::Ssid::Ssid() [constructor]
+    cls.add_constructor([])
+    ## ssid.h (module 'wifi'): ns3::Ssid::Ssid(std::string s) [constructor]
+    cls.add_constructor([param('std::string', 's')])
+    ## ssid.h (module 'wifi'): uint8_t ns3::Ssid::DeserializeInformationField(ns3::Buffer::Iterator start, uint8_t length) [member function]
+    cls.add_method('DeserializeInformationField', 
+                   'uint8_t', 
+                   [param('ns3::Buffer::Iterator', 'start'), param('uint8_t', 'length')], 
+                   is_virtual=True)
+    ## ssid.h (module 'wifi'): ns3::WifiInformationElementId ns3::Ssid::ElementId() const [member function]
+    cls.add_method('ElementId', 
+                   'ns3::WifiInformationElementId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ssid.h (module 'wifi'): uint8_t ns3::Ssid::GetInformationFieldSize() const [member function]
+    cls.add_method('GetInformationFieldSize', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ssid.h (module 'wifi'): bool ns3::Ssid::IsBroadcast() const [member function]
+    cls.add_method('IsBroadcast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ssid.h (module 'wifi'): bool ns3::Ssid::IsEqual(ns3::Ssid const & o) const [member function]
+    cls.add_method('IsEqual', 
+                   'bool', 
+                   [param('ns3::Ssid const &', 'o')], 
+                   is_const=True)
+    ## ssid.h (module 'wifi'): char * ns3::Ssid::PeekString() const [member function]
+    cls.add_method('PeekString', 
+                   'char *', 
+                   [], 
+                   is_const=True)
+    ## ssid.h (module 'wifi'): void ns3::Ssid::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('SerializeInformationField', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    return
+
+def register_Ns3SsidChecker_methods(root_module, cls):
+    ## ssid.h (module 'wifi'): ns3::SsidChecker::SsidChecker() [constructor]
+    cls.add_constructor([])
+    ## ssid.h (module 'wifi'): ns3::SsidChecker::SsidChecker(ns3::SsidChecker const & arg0) [constructor]
+    cls.add_constructor([param('ns3::SsidChecker const &', 'arg0')])
+    return
+
+def register_Ns3SsidValue_methods(root_module, cls):
+    ## ssid.h (module 'wifi'): ns3::SsidValue::SsidValue() [constructor]
+    cls.add_constructor([])
+    ## ssid.h (module 'wifi'): ns3::SsidValue::SsidValue(ns3::Ssid const & value) [constructor]
+    cls.add_constructor([param('ns3::Ssid const &', 'value')])
+    ## ssid.h (module 'wifi'): ns3::SsidValue::SsidValue(ns3::SsidValue const & arg0) [constructor]
+    cls.add_constructor([param('ns3::SsidValue const &', 'arg0')])
+    ## ssid.h (module 'wifi'): ns3::Ptr<ns3::AttributeValue> ns3::SsidValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ssid.h (module 'wifi'): bool ns3::SsidValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## ssid.h (module 'wifi'): ns3::Ssid ns3::SsidValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Ssid', 
+                   [], 
+                   is_const=True)
+    ## ssid.h (module 'wifi'): std::string ns3::SsidValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## ssid.h (module 'wifi'): void ns3::SsidValue::Set(ns3::Ssid const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Ssid const &', 'value')])
+    return
+
 def register_Ns3TcpL4Protocol_methods(root_module, cls):
     ## tcp-l4-protocol.h (module 'internet'): static ns3::TypeId ns3::TcpL4Protocol::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
@@ -10439,47 +10713,47 @@
                    [param('ns3::Address const &', 'value')])
     return
 
-def register_Ns3CallbackImpl__Bool_Ns3Ptr__lt__ns3Socket__gt___Const_ns3Address___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+def register_Ns3CallbackImpl__Bool_Const_ns3WifiTxVector___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< bool, ns3::Ptr< ns3::Socket >, ns3::Address const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    ## callback.h (module 'core'): ns3::CallbackImpl<bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< bool, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
     cls.add_method('DoGetTypeid', 
                    'std::string', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
     cls.add_method('GetTypeid', 
                    'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): bool ns3::CallbackImpl<bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<ns3::Socket> arg0, ns3::Address const & arg1) [member operator]
+    ## callback.h (module 'core'): bool ns3::CallbackImpl<bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::WifiTxVector const & arg0) [member operator]
     cls.add_method('operator()', 
                    'bool', 
-                   [param('ns3::Ptr< ns3::Socket >', 'arg0'), param('ns3::Address const &', 'arg1')], 
+                   [param('ns3::WifiTxVector const &', 'arg0')], 
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3CallbackImpl__Bool_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+def register_Ns3CallbackImpl__Bool_Ns3Ptr__lt__ns3Socket__gt___Const_ns3Address___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    ## callback.h (module 'core'): ns3::CallbackImpl<bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< bool, ns3::Ptr< ns3::Socket >, ns3::Address const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
     cls.add_method('DoGetTypeid', 
                    'std::string', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
     cls.add_method('GetTypeid', 
                    'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): bool ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(short unsigned int arg0, unsigned char arg1) [member operator]
+    ## callback.h (module 'core'): bool ns3::CallbackImpl<bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<ns3::Socket> arg0, ns3::Address const & arg1) [member operator]
     cls.add_method('operator()', 
                    'bool', 
-                   [param('short unsigned int', 'arg0'), param('unsigned char', 'arg1')], 
+                   [param('ns3::Ptr< ns3::Socket >', 'arg0'), param('ns3::Address const &', 'arg1')], 
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
@@ -10549,28 +10823,6 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3CallbackImpl__Unsigned_long_Unsigned_short_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): long unsigned int ns3::CallbackImpl<unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(short unsigned int arg0, short unsigned int arg1, unsigned char arg2) [member operator]
-    cls.add_method('operator()', 
-                   'long unsigned int', 
-                   [param('short unsigned int', 'arg0'), param('short unsigned int', 'arg1'), param('unsigned char', 'arg2')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
 def register_Ns3CallbackImpl__Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
     ## callback.h (module 'core'): ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
@@ -10769,6 +11021,28 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
+def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3WifiMacQueueItem__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::WifiMacQueueItem> arg0) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'arg0')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
 def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3NetDevice__gt___Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_short_Const_ns3Address___amp___Const_ns3Address___amp___Ns3NetDevicePacketType_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<const ns3::Packet>, unsigned short, const ns3::Address &, const ns3::Address &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
@@ -10901,6 +11175,95 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
+def register_Ns3CallbackImpl__Void_Ns3WifiMacDropReason_Ns3Ptr__lt__const_ns3WifiMacQueueItem__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::WifiMacDropReason, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::WifiMacDropReason arg0, ns3::Ptr<const ns3::WifiMacQueueItem> arg1) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('ns3::WifiMacDropReason', 'arg0'), param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'arg1')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Void_Unsigned_char_Ns3Ptr__lt__const_ns3WifiMacQueueItem__gt___Const_ns3WifiTxVector___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, unsigned char, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(unsigned char arg0, ns3::Ptr<const ns3::WifiMacQueueItem> arg1, ns3::WifiTxVector const & arg2) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('unsigned char', 'arg0'), param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'arg1'), param('ns3::WifiTxVector const &', 'arg2')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Void_Unsigned_char_Ns3Ptr__lt__const_ns3WifiPsdu__gt___Const_ns3WifiTxVector___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, unsigned char, ns3::Ptr< ns3::WifiPsdu const >, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(unsigned char arg0, ns3::Ptr<const ns3::WifiPsdu> arg1, ns3::WifiTxVector const & arg2) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('unsigned char', 'arg0'), param('ns3::Ptr< ns3::WifiPsdu const >', 'arg1'), param('ns3::WifiTxVector const &', 'arg2')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Void_Unsigned_char_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt____gt____gt____gt_____star___Const_stdSet__lt__ns3Mac48Address__stdLess__lt__ns3Mac48Address__gt____stdAllocator__lt__ns3Mac48Address__gt____gt_____star___Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, unsigned char, std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu >, std::hash< unsigned short >, std::equal_to< unsigned short >, std::allocator< std::pair< unsigned short const, ns3::Ptr< ns3::WifiPsdu > > > > *, std::set< ns3::Mac48Address, std::less< ns3::Mac48Address >, std::allocator< ns3::Mac48Address > > const, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(unsigned char arg0, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> * arg1, std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> const * arg2, long unsigned int arg3) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('unsigned char', 'arg0'), param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > > *', 'arg1'), param('std::set< ns3::Mac48Address > const *', 'arg2'), param('long unsigned int', 'arg3')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    cls.add_copy_constructor()
+    return
+
 def register_Ns3Icmpv4L4Protocol_methods(root_module, cls):
     ## icmpv4-l4-protocol.h (module 'internet'): ns3::Icmpv4L4Protocol::Icmpv4L4Protocol(ns3::Icmpv4L4Protocol const & arg0) [constructor]
     cls.add_constructor([param('ns3::Icmpv4L4Protocol const &', 'arg0')])
@@ -11182,7 +11545,7 @@
     cls.add_method('Find', 
                    'bool', 
                    [param('ns3::Ipv4Address', 'dst')])
-    ## dsr-errorbuff.h (module 'dsr'): std::vector<ns3::dsr::DsrErrorBuffEntry, std::allocator<ns3::dsr::DsrErrorBuffEntry> > & ns3::dsr::DsrErrorBuffer::GetBuffer() [member function]
+    ## dsr-errorbuff.h (module 'dsr'): std::vector<ns3::dsr::DsrErrorBuffEntry, std::allocator<ns3::dsr::DsrErrorBuffEntry>> & ns3::dsr::DsrErrorBuffer::GetBuffer() [member function]
     cls.add_method('GetBuffer', 
                    'std::vector< ns3::dsr::DsrErrorBuffEntry > &', 
                    [])
@@ -11527,7 +11890,7 @@
                    'uint32_t', 
                    [], 
                    is_const=True)
-    ## dsr-network-queue.h (module 'dsr'): std::vector<ns3::dsr::DsrNetworkQueueEntry, std::allocator<ns3::dsr::DsrNetworkQueueEntry> > & ns3::dsr::DsrNetworkQueue::GetQueue() [member function]
+    ## dsr-network-queue.h (module 'dsr'): std::vector<ns3::dsr::DsrNetworkQueueEntry, std::allocator<ns3::dsr::DsrNetworkQueueEntry>> & ns3::dsr::DsrNetworkQueue::GetQueue() [member function]
     cls.add_method('GetQueue', 
                    'std::vector< ns3::dsr::DsrNetworkQueueEntry > &', 
                    [])
@@ -12074,7 +12437,7 @@
                    'ns3::Ipv4Address', 
                    [param('uint8_t', 'index')], 
                    is_const=True)
-    ## dsr-option-header.h (module 'dsr'): std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address> > ns3::dsr::DsrOptionRrepHeader::GetNodesAddress() const [member function]
+    ## dsr-option-header.h (module 'dsr'): std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address>> ns3::dsr::DsrOptionRrepHeader::GetNodesAddress() const [member function]
     cls.add_method('GetNodesAddress', 
                    'std::vector< ns3::Ipv4Address >', 
                    [], 
@@ -12084,7 +12447,7 @@
                    'uint32_t', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## dsr-option-header.h (module 'dsr'): ns3::Ipv4Address ns3::dsr::DsrOptionRrepHeader::GetTargetAddress(std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address> > ipv4Address) const [member function]
+    ## dsr-option-header.h (module 'dsr'): ns3::Ipv4Address ns3::dsr::DsrOptionRrepHeader::GetTargetAddress(std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address>> ipv4Address) const [member function]
     cls.add_method('GetTargetAddress', 
                    'ns3::Ipv4Address', 
                    [param('std::vector< ns3::Ipv4Address >', 'ipv4Address')], 
@@ -12108,7 +12471,7 @@
     cls.add_method('SetNodeAddress', 
                    'void', 
                    [param('uint8_t', 'index'), param('ns3::Ipv4Address', 'addr')])
-    ## dsr-option-header.h (module 'dsr'): void ns3::dsr::DsrOptionRrepHeader::SetNodesAddress(std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address> > ipv4Address) [member function]
+    ## dsr-option-header.h (module 'dsr'): void ns3::dsr::DsrOptionRrepHeader::SetNodesAddress(std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address>> ipv4Address) [member function]
     cls.add_method('SetNodesAddress', 
                    'void', 
                    [param('std::vector< ns3::Ipv4Address >', 'ipv4Address')])
@@ -12152,7 +12515,7 @@
                    'ns3::Ipv4Address', 
                    [param('uint8_t', 'index')], 
                    is_const=True)
-    ## dsr-option-header.h (module 'dsr'): std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address> > ns3::dsr::DsrOptionRreqHeader::GetNodesAddresses() const [member function]
+    ## dsr-option-header.h (module 'dsr'): std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address>> ns3::dsr::DsrOptionRreqHeader::GetNodesAddresses() const [member function]
     cls.add_method('GetNodesAddresses', 
                    'std::vector< ns3::Ipv4Address >', 
                    [], 
@@ -12194,7 +12557,7 @@
     cls.add_method('SetNodeAddress', 
                    'void', 
                    [param('uint8_t', 'index'), param('ns3::Ipv4Address', 'addr')])
-    ## dsr-option-header.h (module 'dsr'): void ns3::dsr::DsrOptionRreqHeader::SetNodesAddress(std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address> > ipv4Address) [member function]
+    ## dsr-option-header.h (module 'dsr'): void ns3::dsr::DsrOptionRreqHeader::SetNodesAddress(std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address>> ipv4Address) [member function]
     cls.add_method('SetNodesAddress', 
                    'void', 
                    [param('std::vector< ns3::Ipv4Address >', 'ipv4Address')])
@@ -12239,7 +12602,7 @@
                    'uint8_t', 
                    [], 
                    is_const=True)
-    ## dsr-option-header.h (module 'dsr'): std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address> > ns3::dsr::DsrOptionSRHeader::GetNodesAddress() const [member function]
+    ## dsr-option-header.h (module 'dsr'): std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address>> ns3::dsr::DsrOptionSRHeader::GetNodesAddress() const [member function]
     cls.add_method('GetNodesAddress', 
                    'std::vector< ns3::Ipv4Address >', 
                    [], 
@@ -12278,7 +12641,7 @@
     cls.add_method('SetNodeAddress', 
                    'void', 
                    [param('uint8_t', 'index'), param('ns3::Ipv4Address', 'addr')])
-    ## dsr-option-header.h (module 'dsr'): void ns3::dsr::DsrOptionSRHeader::SetNodesAddress(std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address> > ipv4Address) [member function]
+    ## dsr-option-header.h (module 'dsr'): void ns3::dsr::DsrOptionSRHeader::SetNodesAddress(std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address>> ipv4Address) [member function]
     cls.add_method('SetNodesAddress', 
                    'void', 
                    [param('std::vector< ns3::Ipv4Address >', 'ipv4Address')])
@@ -12301,15 +12664,15 @@
     cls.add_constructor([param('ns3::dsr::DsrOptions const &', 'arg0')])
     ## dsr-options.h (module 'dsr'): ns3::dsr::DsrOptions::DsrOptions() [constructor]
     cls.add_constructor([])
-    ## dsr-options.h (module 'dsr'): bool ns3::dsr::DsrOptions::CheckDuplicates(ns3::Ipv4Address ipv4Address, std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address> > & vec) [member function]
+    ## dsr-options.h (module 'dsr'): bool ns3::dsr::DsrOptions::CheckDuplicates(ns3::Ipv4Address ipv4Address, std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address>> & vec) [member function]
     cls.add_method('CheckDuplicates', 
                    'bool', 
                    [param('ns3::Ipv4Address', 'ipv4Address'), param('std::vector< ns3::Ipv4Address > &', 'vec')])
-    ## dsr-options.h (module 'dsr'): bool ns3::dsr::DsrOptions::ContainAddressAfter(ns3::Ipv4Address ipv4Address, ns3::Ipv4Address destAddress, std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address> > & nodeList) [member function]
+    ## dsr-options.h (module 'dsr'): bool ns3::dsr::DsrOptions::ContainAddressAfter(ns3::Ipv4Address ipv4Address, ns3::Ipv4Address destAddress, std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address>> & nodeList) [member function]
     cls.add_method('ContainAddressAfter', 
                    'bool', 
                    [param('ns3::Ipv4Address', 'ipv4Address'), param('ns3::Ipv4Address', 'destAddress'), param('std::vector< ns3::Ipv4Address > &', 'nodeList')])
-    ## dsr-options.h (module 'dsr'): std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address> > ns3::dsr::DsrOptions::CutRoute(ns3::Ipv4Address ipv4Address, std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address> > & nodeList) [member function]
+    ## dsr-options.h (module 'dsr'): std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address>> ns3::dsr::DsrOptions::CutRoute(ns3::Ipv4Address ipv4Address, std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address>> & nodeList) [member function]
     cls.add_method('CutRoute', 
                    'std::vector< ns3::Ipv4Address >', 
                    [param('ns3::Ipv4Address', 'ipv4Address'), param('std::vector< ns3::Ipv4Address > &', 'nodeList')])
@@ -12336,11 +12699,11 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## dsr-options.h (module 'dsr'): bool ns3::dsr::DsrOptions::IfDuplicates(std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address> > & vec, std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address> > & vec2) [member function]
+    ## dsr-options.h (module 'dsr'): bool ns3::dsr::DsrOptions::IfDuplicates(std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address>> & vec, std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address>> & vec2) [member function]
     cls.add_method('IfDuplicates', 
                    'bool', 
                    [param('std::vector< ns3::Ipv4Address > &', 'vec'), param('std::vector< ns3::Ipv4Address > &', 'vec2')])
-    ## dsr-options.h (module 'dsr'): void ns3::dsr::DsrOptions::PrintVector(std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address> > & vec) [member function]
+    ## dsr-options.h (module 'dsr'): void ns3::dsr::DsrOptions::PrintVector(std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address>> & vec) [member function]
     cls.add_method('PrintVector', 
                    'void', 
                    [param('std::vector< ns3::Ipv4Address > &', 'vec')])
@@ -12349,27 +12712,27 @@
                    'uint8_t', 
                    [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Ptr< ns3::Packet >', 'dsrP'), param('ns3::Ipv4Address', 'ipv4Address'), param('ns3::Ipv4Address', 'source'), param('ns3::Ipv4Header const &', 'ipv4Header'), param('uint8_t', 'protocol'), param('bool &', 'isPromisc'), param('ns3::Ipv4Address', 'promiscSource')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## dsr-options.h (module 'dsr'): void ns3::dsr::DsrOptions::RemoveDuplicates(std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address> > & vec) [member function]
+    ## dsr-options.h (module 'dsr'): void ns3::dsr::DsrOptions::RemoveDuplicates(std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address>> & vec) [member function]
     cls.add_method('RemoveDuplicates', 
                    'void', 
                    [param('std::vector< ns3::Ipv4Address > &', 'vec')])
-    ## dsr-options.h (module 'dsr'): bool ns3::dsr::DsrOptions::ReverseRoutes(std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address> > & vec) [member function]
+    ## dsr-options.h (module 'dsr'): bool ns3::dsr::DsrOptions::ReverseRoutes(std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address>> & vec) [member function]
     cls.add_method('ReverseRoutes', 
                    'bool', 
                    [param('std::vector< ns3::Ipv4Address > &', 'vec')])
-    ## dsr-options.h (module 'dsr'): ns3::Ipv4Address ns3::dsr::DsrOptions::ReverseSearchNextHop(ns3::Ipv4Address ipv4Address, std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address> > & vec) [member function]
+    ## dsr-options.h (module 'dsr'): ns3::Ipv4Address ns3::dsr::DsrOptions::ReverseSearchNextHop(ns3::Ipv4Address ipv4Address, std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address>> & vec) [member function]
     cls.add_method('ReverseSearchNextHop', 
                    'ns3::Ipv4Address', 
                    [param('ns3::Ipv4Address', 'ipv4Address'), param('std::vector< ns3::Ipv4Address > &', 'vec')])
-    ## dsr-options.h (module 'dsr'): ns3::Ipv4Address ns3::dsr::DsrOptions::ReverseSearchNextTwoHop(ns3::Ipv4Address ipv4Address, std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address> > & vec) [member function]
+    ## dsr-options.h (module 'dsr'): ns3::Ipv4Address ns3::dsr::DsrOptions::ReverseSearchNextTwoHop(ns3::Ipv4Address ipv4Address, std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address>> & vec) [member function]
     cls.add_method('ReverseSearchNextTwoHop', 
                    'ns3::Ipv4Address', 
                    [param('ns3::Ipv4Address', 'ipv4Address'), param('std::vector< ns3::Ipv4Address > &', 'vec')])
-    ## dsr-options.h (module 'dsr'): void ns3::dsr::DsrOptions::ScheduleReply(ns3::Ptr<ns3::Packet> & packet, std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address> > & nodeList, ns3::Ipv4Address & source, ns3::Ipv4Address & destination) [member function]
+    ## dsr-options.h (module 'dsr'): void ns3::dsr::DsrOptions::ScheduleReply(ns3::Ptr<ns3::Packet> & packet, std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address>> & nodeList, ns3::Ipv4Address & source, ns3::Ipv4Address & destination) [member function]
     cls.add_method('ScheduleReply', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet > &', 'packet'), param('std::vector< ns3::Ipv4Address > &', 'nodeList'), param('ns3::Ipv4Address &', 'source'), param('ns3::Ipv4Address &', 'destination')])
-    ## dsr-options.h (module 'dsr'): ns3::Ipv4Address ns3::dsr::DsrOptions::SearchNextHop(ns3::Ipv4Address ipv4Address, std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address> > & vec) [member function]
+    ## dsr-options.h (module 'dsr'): ns3::Ipv4Address ns3::dsr::DsrOptions::SearchNextHop(ns3::Ipv4Address ipv4Address, std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address>> & vec) [member function]
     cls.add_method('SearchNextHop', 
                    'ns3::Ipv4Address', 
                    [param('ns3::Ipv4Address', 'ipv4Address'), param('std::vector< ns3::Ipv4Address > &', 'vec')])
@@ -12576,7 +12939,7 @@
     cls.add_method('AddArpCache', 
                    'void', 
                    [param('ns3::Ptr< ns3::ArpCache >', 'a')])
-    ## dsr-rcache.h (module 'dsr'): void ns3::dsr::DsrRouteCache::AddNeighbor(std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address> > nodeList, ns3::Ipv4Address ownAddress, ns3::Time expire) [member function]
+    ## dsr-rcache.h (module 'dsr'): void ns3::dsr::DsrRouteCache::AddNeighbor(std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address>> nodeList, ns3::Ipv4Address ownAddress, ns3::Time expire) [member function]
     cls.add_method('AddNeighbor', 
                    'void', 
                    [param('std::vector< ns3::Ipv4Address >', 'nodeList'), param('ns3::Ipv4Address', 'ownAddress'), param('ns3::Time', 'expire')])
@@ -12612,7 +12975,7 @@
     cls.add_method('DeleteRoute', 
                    'bool', 
                    [param('ns3::Ipv4Address', 'dst')])
-    ## dsr-rcache.h (module 'dsr'): bool ns3::dsr::DsrRouteCache::FindSameRoute(ns3::dsr::DsrRouteCacheEntry & rt, std::list<ns3::dsr::DsrRouteCacheEntry, std::allocator<ns3::dsr::DsrRouteCacheEntry> > & rtVector) [member function]
+    ## dsr-rcache.h (module 'dsr'): bool ns3::dsr::DsrRouteCache::FindSameRoute(ns3::dsr::DsrRouteCacheEntry & rt, std::list<ns3::dsr::DsrRouteCacheEntry, std::allocator<ns3::dsr::DsrRouteCacheEntry>> & rtVector) [member function]
     cls.add_method('FindSameRoute', 
                    'bool', 
                    [param('ns3::dsr::DsrRouteCacheEntry &', 'rt'), param('std::list< ns3::dsr::DsrRouteCacheEntry > &', 'rtVector')])
@@ -12709,11 +13072,11 @@
     cls.add_method('Print', 
                    'void', 
                    [param('std::ostream &', 'os')])
-    ## dsr-rcache.h (module 'dsr'): void ns3::dsr::DsrRouteCache::PrintRouteVector(std::list<ns3::dsr::DsrRouteCacheEntry, std::allocator<ns3::dsr::DsrRouteCacheEntry> > route) [member function]
+    ## dsr-rcache.h (module 'dsr'): void ns3::dsr::DsrRouteCache::PrintRouteVector(std::list<ns3::dsr::DsrRouteCacheEntry, std::allocator<ns3::dsr::DsrRouteCacheEntry>> route) [member function]
     cls.add_method('PrintRouteVector', 
                    'void', 
                    [param('std::list< ns3::dsr::DsrRouteCacheEntry >', 'route')])
-    ## dsr-rcache.h (module 'dsr'): void ns3::dsr::DsrRouteCache::PrintVector(std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address> > & vec) [member function]
+    ## dsr-rcache.h (module 'dsr'): void ns3::dsr::DsrRouteCache::PrintVector(std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address>> & vec) [member function]
     cls.add_method('PrintVector', 
                    'void', 
                    [param('std::vector< ns3::Ipv4Address > &', 'vec')])
@@ -12737,7 +13100,7 @@
     cls.add_method('RebuildBestRouteTable', 
                    'void', 
                    [param('ns3::Ipv4Address', 'source')])
-    ## dsr-rcache.h (module 'dsr'): void ns3::dsr::DsrRouteCache::RemoveLastEntry(std::list<ns3::dsr::DsrRouteCacheEntry, std::allocator<ns3::dsr::DsrRouteCacheEntry> > & rtVector) [member function]
+    ## dsr-rcache.h (module 'dsr'): void ns3::dsr::DsrRouteCache::RemoveLastEntry(std::list<ns3::dsr::DsrRouteCacheEntry, std::allocator<ns3::dsr::DsrRouteCacheEntry>> & rtVector) [member function]
     cls.add_method('RemoveLastEntry', 
                    'void', 
                    [param('std::list< ns3::dsr::DsrRouteCacheEntry > &', 'rtVector')])
@@ -12793,7 +13156,7 @@
     cls.add_method('SetUseExtends', 
                    'void', 
                    [param('ns3::Time', 'useExtends')])
-    ## dsr-rcache.h (module 'dsr'): void ns3::dsr::DsrRouteCache::UpdateNeighbor(std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address> > nodeList, ns3::Time expire) [member function]
+    ## dsr-rcache.h (module 'dsr'): void ns3::dsr::DsrRouteCache::UpdateNeighbor(std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address>> nodeList, ns3::Time expire) [member function]
     cls.add_method('UpdateNeighbor', 
                    'void', 
                    [param('std::vector< ns3::Ipv4Address >', 'nodeList'), param('ns3::Time', 'expire')])
@@ -12985,7 +13348,7 @@
                    'ns3::IpL4Protocol::DownTargetCallback6', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## dsr-routing.h (module 'dsr'): std::vector<std::basic_string<char>, std::allocator<std::basic_string<char> > > ns3::dsr::DsrRouting::GetElementsFromContext(std::string context) [member function]
+    ## dsr-routing.h (module 'dsr'): std::vector<std::basic_string<char>, std::allocator<std::basic_string<char>>> ns3::dsr::DsrRouting::GetElementsFromContext(std::string context) [member function]
     cls.add_method('GetElementsFromContext', 
                    'std::vector< std::string >', 
                    [param('std::string', 'context')])
@@ -13083,7 +13446,7 @@
     cls.add_method('PassiveScheduleTimerExpire', 
                    'void', 
                    [param('ns3::dsr::DsrMaintainBuffEntry &', 'mb'), param('uint8_t', 'protocol')])
-    ## dsr-routing.h (module 'dsr'): void ns3::dsr::DsrRouting::PrintVector(std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address> > & vec) [member function]
+    ## dsr-routing.h (module 'dsr'): void ns3::dsr::DsrRouting::PrintVector(std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address>> & vec) [member function]
     cls.add_method('PrintVector', 
                    'void', 
                    [param('std::vector< ns3::Ipv4Address > &', 'vec')])
@@ -13105,7 +13468,7 @@
                    'ns3::IpL4Protocol::RxStatus', 
                    [param('ns3::Ptr< ns3::Packet >', 'p'), param('ns3::Ipv6Header const &', 'header'), param('ns3::Ptr< ns3::Ipv6Interface >', 'incomingInterface')], 
                    is_virtual=True)
-    ## dsr-routing.h (module 'dsr'): void ns3::dsr::DsrRouting::RouteRequestTimerExpire(ns3::Ptr<ns3::Packet> packet, std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address> > address, uint32_t requestId, uint8_t protocol) [member function]
+    ## dsr-routing.h (module 'dsr'): void ns3::dsr::DsrRouting::RouteRequestTimerExpire(ns3::Ptr<ns3::Packet> packet, std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address>> address, uint32_t requestId, uint8_t protocol) [member function]
     cls.add_method('RouteRequestTimerExpire', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet >', 'packet'), param('std::vector< ns3::Ipv4Address >', 'address'), param('uint32_t', 'requestId'), param('uint8_t', 'protocol')])
@@ -13137,7 +13500,7 @@
     cls.add_method('SchedulePassivePacketRetry', 
                    'void', 
                    [param('ns3::dsr::DsrMaintainBuffEntry &', 'mb'), param('uint8_t', 'protocol')])
-    ## dsr-routing.h (module 'dsr'): void ns3::dsr::DsrRouting::ScheduleRreqRetry(ns3::Ptr<ns3::Packet> packet, std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address> > address, bool nonProp, uint32_t requestId, uint8_t protocol) [member function]
+    ## dsr-routing.h (module 'dsr'): void ns3::dsr::DsrRouting::ScheduleRreqRetry(ns3::Ptr<ns3::Packet> packet, std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address>> address, bool nonProp, uint32_t requestId, uint8_t protocol) [member function]
     cls.add_method('ScheduleRreqRetry', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet >', 'packet'), param('std::vector< ns3::Ipv4Address >', 'address'), param('bool', 'nonProp'), param('uint32_t', 'requestId'), param('uint8_t', 'protocol')])
@@ -13145,7 +13508,7 @@
     cls.add_method('Scheduler', 
                    'void', 
                    [param('uint32_t', 'priority')])
-    ## dsr-routing.h (module 'dsr'): ns3::Ipv4Address ns3::dsr::DsrRouting::SearchNextHop(ns3::Ipv4Address ipv4Address, std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address> > & vec) [member function]
+    ## dsr-routing.h (module 'dsr'): ns3::Ipv4Address ns3::dsr::DsrRouting::SearchNextHop(ns3::Ipv4Address ipv4Address, std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address>> & vec) [member function]
     cls.add_method('SearchNextHop', 
                    'ns3::Ipv4Address', 
                    [param('ns3::Ipv4Address', 'ipv4Address'), param('std::vector< ns3::Ipv4Address > &', 'vec')])
@@ -13165,7 +13528,7 @@
     cls.add_method('SendErrorRequest', 
                    'void', 
                    [param('ns3::dsr::DsrOptionRerrUnreachHeader &', 'rerr'), param('uint8_t', 'protocol')])
-    ## dsr-routing.h (module 'dsr'): void ns3::dsr::DsrRouting::SendGratuitousReply(ns3::Ipv4Address replyTo, ns3::Ipv4Address replyFrom, std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address> > & nodeList, uint8_t protocol) [member function]
+    ## dsr-routing.h (module 'dsr'): void ns3::dsr::DsrRouting::SendGratuitousReply(ns3::Ipv4Address replyTo, ns3::Ipv4Address replyFrom, std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address>> & nodeList, uint8_t protocol) [member function]
     cls.add_method('SendGratuitousReply', 
                    'void', 
                    [param('ns3::Ipv4Address', 'replyTo'), param('ns3::Ipv4Address', 'replyFrom'), param('std::vector< ns3::Ipv4Address > &', 'nodeList'), param('uint8_t', 'protocol')])
@@ -13444,7 +13807,7 @@
     cls.add_method('Find', 
                    'bool', 
                    [param('ns3::Ipv4Address', 'dst')])
-    ## dsr-rsendbuff.h (module 'dsr'): std::vector<ns3::dsr::DsrSendBuffEntry, std::allocator<ns3::dsr::DsrSendBuffEntry> > & ns3::dsr::DsrSendBuffer::GetBuffer() [member function]
+    ## dsr-rsendbuff.h (module 'dsr'): std::vector<ns3::dsr::DsrSendBuffEntry, std::allocator<ns3::dsr::DsrSendBuffEntry>> & ns3::dsr::DsrSendBuffer::GetBuffer() [member function]
     cls.add_method('GetBuffer', 
                    'std::vector< ns3::dsr::DsrSendBuffEntry > &', 
                    [])
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/dsr/bindings/modulegen__gcc_LP64.py ns-3.36/src/dsr/bindings/modulegen__gcc_LP64.py
--- ns-3.35/src/dsr/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/dsr/bindings/modulegen__gcc_LP64.py	2022-04-30 18:23:57.818733500 -0700
@@ -35,13 +35,9 @@
     ## wifi-phy-common.h (module 'wifi'): ns3::WifiPpduType [enumeration]
     module.add_enum('WifiPpduType', ['WIFI_PPDU_TYPE_SU', 'WIFI_PPDU_TYPE_DL_MU', 'WIFI_PPDU_TYPE_UL_MU'], import_from_module='ns.wifi')
     ## wifi-phy-common.h (module 'wifi'): ns3::WifiPhyRxfailureReason [enumeration]
-    module.add_enum('WifiPhyRxfailureReason', ['UNKNOWN', 'UNSUPPORTED_SETTINGS', 'CHANNEL_SWITCHING', 'RXING', 'TXING', 'SLEEPING', 'BUSY_DECODING_PREAMBLE', 'PREAMBLE_DETECT_FAILURE', 'RECEPTION_ABORTED_BY_TX', 'L_SIG_FAILURE', 'HT_SIG_FAILURE', 'SIG_A_FAILURE', 'SIG_B_FAILURE', 'PREAMBLE_DETECTION_PACKET_SWITCH', 'FRAME_CAPTURE_PACKET_SWITCH', 'OBSS_PD_CCA_RESET', 'HE_TB_PPDU_TOO_LATE', 'FILTERED'], import_from_module='ns.wifi')
-    ## wifi-standards.h (module 'wifi'): ns3::WifiPhyStandard [enumeration]
-    module.add_enum('WifiPhyStandard', ['WIFI_PHY_STANDARD_80211a', 'WIFI_PHY_STANDARD_80211b', 'WIFI_PHY_STANDARD_80211g', 'WIFI_PHY_STANDARD_80211p', 'WIFI_PHY_STANDARD_80211n', 'WIFI_PHY_STANDARD_80211ac', 'WIFI_PHY_STANDARD_80211ax', 'WIFI_PHY_STANDARD_UNSPECIFIED'], import_from_module='ns.wifi')
-    ## wifi-standards.h (module 'wifi'): ns3::WifiMacStandard [enumeration]
-    module.add_enum('WifiMacStandard', ['WIFI_MAC_STANDARD_80211', 'WIFI_MAC_STANDARD_80211n', 'WIFI_MAC_STANDARD_80211ac', 'WIFI_MAC_STANDARD_80211ax'], import_from_module='ns.wifi')
+    module.add_enum('WifiPhyRxfailureReason', ['UNKNOWN', 'UNSUPPORTED_SETTINGS', 'CHANNEL_SWITCHING', 'RXING', 'TXING', 'SLEEPING', 'POWERED_OFF', 'TRUNCATED_TX', 'BUSY_DECODING_PREAMBLE', 'PREAMBLE_DETECT_FAILURE', 'RECEPTION_ABORTED_BY_TX', 'L_SIG_FAILURE', 'HT_SIG_FAILURE', 'SIG_A_FAILURE', 'SIG_B_FAILURE', 'PREAMBLE_DETECTION_PACKET_SWITCH', 'FRAME_CAPTURE_PACKET_SWITCH', 'OBSS_PD_CCA_RESET', 'HE_TB_PPDU_TOO_LATE', 'FILTERED'], import_from_module='ns.wifi')
     ## wifi-standards.h (module 'wifi'): ns3::WifiStandard [enumeration]
-    module.add_enum('WifiStandard', ['WIFI_STANDARD_80211a', 'WIFI_STANDARD_80211b', 'WIFI_STANDARD_80211g', 'WIFI_STANDARD_80211p', 'WIFI_STANDARD_80211n_2_4GHZ', 'WIFI_STANDARD_80211n_5GHZ', 'WIFI_STANDARD_80211ac', 'WIFI_STANDARD_80211ax_2_4GHZ', 'WIFI_STANDARD_80211ax_5GHZ', 'WIFI_STANDARD_80211ax_6GHZ'], import_from_module='ns.wifi')
+    module.add_enum('WifiStandard', ['WIFI_STANDARD_UNSPECIFIED', 'WIFI_STANDARD_80211a', 'WIFI_STANDARD_80211b', 'WIFI_STANDARD_80211g', 'WIFI_STANDARD_80211p', 'WIFI_STANDARD_80211n', 'WIFI_STANDARD_80211ac', 'WIFI_STANDARD_80211ax'], import_from_module='ns.wifi')
     ## wifi-standards.h (module 'wifi'): ns3::FrequencyChannelType [enumeration]
     module.add_enum('FrequencyChannelType', ['WIFI_PHY_DSSS_CHANNEL', 'WIFI_PHY_OFDM_CHANNEL', 'WIFI_PHY_80211p_CHANNEL'], import_from_module='ns.wifi')
     ## wifi-phy-band.h (module 'wifi'): ns3::WifiPhyBand [enumeration]
@@ -115,6 +111,8 @@
     module.add_class('EventGarbageCollector', import_from_module='ns.core')
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'], import_from_module='ns.core')
     ## hash.h (module 'core'): ns3::Hasher [class]
     module.add_class('Hasher', import_from_module='ns.core')
     ## inet6-socket-address.h (module 'network'): ns3::Inet6SocketAddress [class]
@@ -194,8 +192,6 @@
     typehandlers.add_type_alias('std::vector< ns3::Ptr< ns3::Node > > const_iterator', 'ns3::NodeContainer::Iterator')
     typehandlers.add_type_alias('std::vector< ns3::Ptr< ns3::Node > > const_iterator*', 'ns3::NodeContainer::Iterator*')
     typehandlers.add_type_alias('std::vector< ns3::Ptr< ns3::Node > > const_iterator&', 'ns3::NodeContainer::Iterator&')
-    ## non-copyable.h (module 'core'): ns3::NonCopyable [class]
-    module.add_class('NonCopyable', destructor_visibility='protected', import_from_module='ns.core')
     ## object-base.h (module 'core'): ns3::ObjectBase [class]
     module.add_class('ObjectBase', allow_subclassing=True, import_from_module='ns.core')
     ## object.h (module 'core'): ns3::ObjectDeleter [struct]
@@ -278,24 +274,18 @@
     typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::ConstellationSizeCallback')
     typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::ConstellationSizeCallback*')
     typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::ConstellationSizeCallback&')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::PhyRateCallback')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::PhyRateCallback*')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::PhyRateCallback&')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::PhyRateFromTxVectorCallback')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::PhyRateFromTxVectorCallback*')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::PhyRateFromTxVectorCallback&')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::DataRateCallback')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::DataRateCallback*')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::DataRateCallback&')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::DataRateFromTxVectorCallback')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::DataRateFromTxVectorCallback*')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::DataRateFromTxVectorCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::PhyRateCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::PhyRateCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::PhyRateCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::DataRateCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::DataRateCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::DataRateCallback&')
     typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::NonHtReferenceRateCallback')
     typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::NonHtReferenceRateCallback*')
     typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::NonHtReferenceRateCallback&')
-    typehandlers.add_type_alias('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::ModeAllowedCallback')
-    typehandlers.add_type_alias('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::ModeAllowedCallback*')
-    typehandlers.add_type_alias('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::ModeAllowedCallback&')
+    typehandlers.add_type_alias('ns3::Callback< bool, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::AllowedCallback')
+    typehandlers.add_type_alias('ns3::Callback< bool, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::AllowedCallback*')
+    typehandlers.add_type_alias('ns3::Callback< bool, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::AllowedCallback&')
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStation [struct]
     module.add_class('WifiRemoteStation', import_from_module='ns.wifi')
     ## wifi-remote-station-info.h (module 'wifi'): ns3::WifiRemoteStationInfo [class]
@@ -304,8 +294,6 @@
     module.add_class('WifiRemoteStationState', import_from_module='ns.wifi')
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState [enumeration]
     module.add_enum('', ['BRAND_NEW', 'DISASSOC', 'WAIT_ASSOC_TX_OK', 'GOT_ASSOC_TX_OK'], outer_class=root_module['ns3::WifiRemoteStationState'], import_from_module='ns.wifi')
-    ## wifi-standards.h (module 'wifi'): ns3::WifiStandardInfo [struct]
-    module.add_class('WifiStandardInfo', import_from_module='ns.wifi')
     ## empty.h (module 'core'): ns3::empty [class]
     module.add_class('empty', import_from_module='ns.core')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t [class]
@@ -352,31 +340,31 @@
     module.add_class('RandomVariableStream', import_from_module='ns.core', parent=root_module['ns3::Object'])
     ## random-variable-stream.h (module 'core'): ns3::SequentialRandomVariable [class]
     module.add_class('SequentialRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv4MulticastRoute', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv4Route', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv4Route>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::OutputStreamWrapper', 'ns3::empty', 'ns3::DefaultDeleter<ns3::OutputStreamWrapper>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::WifiInformationElement', 'ns3::empty', 'ns3::DefaultDeleter<ns3::WifiInformationElement>'])
     ## socket.h (module 'network'): ns3::Socket [class]
     module.add_class('Socket', import_from_module='ns.network', parent=root_module['ns3::Object'])
@@ -608,6 +596,12 @@
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, double )&', 'ns3::Packet::SinrTracedCallback&')
     ## random-variable-stream.h (module 'core'): ns3::ParetoRandomVariable [class]
     module.add_class('ParetoRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
+    ## ssid.h (module 'wifi'): ns3::Ssid [class]
+    module.add_class('Ssid', import_from_module='ns.wifi', parent=root_module['ns3::WifiInformationElement'])
+    ## ssid.h (module 'wifi'): ns3::SsidChecker [class]
+    module.add_class('SsidChecker', import_from_module='ns.wifi', parent=root_module['ns3::AttributeChecker'])
+    ## ssid.h (module 'wifi'): ns3::SsidValue [class]
+    module.add_class('SsidValue', import_from_module='ns.wifi', parent=root_module['ns3::AttributeValue'])
     ## tcp-l4-protocol.h (module 'internet'): ns3::TcpL4Protocol [class]
     module.add_class('TcpL4Protocol', import_from_module='ns.internet', parent=root_module['ns3::IpL4Protocol'])
     ## nstime.h (module 'core'): ns3::TimeValue [class]
@@ -630,18 +624,16 @@
     module.add_class('AddressChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
     ## address.h (module 'network'): ns3::AddressValue [class]
     module.add_class('AddressValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['bool', 'const ns3::WifiTxVector &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['bool', 'ns3::Ptr<ns3::Socket>', 'const ns3::Address &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['bool', 'unsigned short', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['ns3::ObjectBase *', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned long', 'const ns3::WifiTxVector &', 'unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned long', 'unsigned short', 'unsigned short', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, const ns3::Ipv4Header &, ns3::Ptr<const ns3::Packet>, ns3::Ipv4L3Protocol::DropReason, ns3::Ptr<ns3::Ipv4>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
@@ -660,6 +652,8 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::Ptr<ns3::Ipv4>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<const ns3::WifiMacQueueItem>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<const ns3::Packet>, unsigned short, const ns3::Address &, const ns3::Address &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'const ns3::Address &', 'const ns3::Address &', 'ns3::NetDevice::PacketType', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
@@ -672,11 +666,19 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::Socket>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::Socket>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::Socket>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::WifiMacDropReason', 'ns3::Ptr<const ns3::WifiMacQueueItem>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned char', 'ns3::Ptr<const ns3::WifiMacQueueItem>', 'const ns3::WifiTxVector &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned char', 'ns3::Ptr<const ns3::WifiPsdu>', 'const ns3::WifiTxVector &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned char', 'std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *', 'const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *', 'unsigned long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## icmpv4-l4-protocol.h (module 'internet'): ns3::Icmpv4L4Protocol [class]
     module.add_class('Icmpv4L4Protocol', import_from_module='ns.internet', parent=root_module['ns3::IpL4Protocol'])
     module.add_container('std::list< ns3::BlockAckReqType >', 'ns3::BlockAckReqType', container_type='list')
     module.add_container('std::vector< unsigned char >', 'unsigned char', container_type='vector')
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     module.add_container('ns3::WifiModeList', 'ns3::WifiMode', container_type='vector')
     module.add_container('std::vector< ns3::Ipv6Address >', 'ns3::Ipv6Address', container_type='vector')
     module.add_container('std::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStation *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStation * > > >', ('ns3::Mac48Address', 'ns3::WifiRemoteStation *'), container_type='map')
@@ -684,6 +686,8 @@
     module.add_container('std::list< std::pair< ns3::Ptr< ns3::Packet >, ns3::Ipv4Header > >', 'std::pair< ns3::Ptr< ns3::Packet >, ns3::Ipv4Header >', container_type='list')
     module.add_container('std::list< ns3::ArpCache::Entry * >', 'ns3::ArpCache::Entry *', container_type='list')
     module.add_container('std::map< unsigned int, unsigned int >', ('unsigned int', 'unsigned int'), container_type='map')
+    module.add_container('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > >', ('short unsigned int', 'ns3::Ptr< ns3::WifiPsdu >'), container_type='map')
+    module.add_container('std::set< ns3::Mac48Address >', 'ns3::Mac48Address', container_type='set')
     typehandlers.add_type_alias('ns3::SequenceNumber< unsigned int, int >', 'ns3::SequenceNumber32')
     typehandlers.add_type_alias('ns3::SequenceNumber< unsigned int, int >*', 'ns3::SequenceNumber32*')
     typehandlers.add_type_alias('ns3::SequenceNumber< unsigned int, int >&', 'ns3::SequenceNumber32&')
@@ -693,6 +697,9 @@
     typehandlers.add_type_alias('ns3::SequenceNumber< unsigned char, signed char >', 'ns3::SequenceNumber8')
     typehandlers.add_type_alias('ns3::SequenceNumber< unsigned char, signed char >*', 'ns3::SequenceNumber8*')
     typehandlers.add_type_alias('ns3::SequenceNumber< unsigned char, signed char >&', 'ns3::SequenceNumber8&')
+    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > >', 'ns3::WifiPsduMap')
+    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > >*', 'ns3::WifiPsduMap*')
+    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > >&', 'ns3::WifiPsduMap&')
     typehandlers.add_type_alias('uint8_t', 'ns3::WifiInformationElementId')
     typehandlers.add_type_alias('uint8_t*', 'ns3::WifiInformationElementId*')
     typehandlers.add_type_alias('uint8_t&', 'ns3::WifiInformationElementId&')
@@ -801,12 +808,12 @@
 def register_types_ns3_dsr(module):
     root_module = module.get_root()
     
+    ## dsr-option-header.h (module 'dsr'): ns3::dsr::ErrorType [enumeration]
+    module.add_enum('ErrorType', ['NODE_UNREACHABLE', 'FLOW_STATE_NOT_SUPPORTED', 'OPTION_NOT_SUPPORTED'])
     ## dsr-rreq-table.h (module 'dsr'): ns3::dsr::LinkStates [enumeration]
     module.add_enum('LinkStates', ['PROBABLE', 'QUESTIONABLE'])
     ## dsr-network-queue.h (module 'dsr'): ns3::dsr::DsrMessageType [enumeration]
     module.add_enum('DsrMessageType', ['DSR_CONTROL_PACKET', 'DSR_DATA_PACKET'])
-    ## dsr-option-header.h (module 'dsr'): ns3::dsr::ErrorType [enumeration]
-    module.add_enum('ErrorType', ['NODE_UNREACHABLE', 'FLOW_STATE_NOT_SUPPORTED', 'OPTION_NOT_SUPPORTED'])
     ## dsr-rreq-table.h (module 'dsr'): ns3::dsr::BlackList [struct]
     module.add_class('BlackList')
     ## dsr-errorbuff.h (module 'dsr'): ns3::dsr::DsrErrorBuffEntry [class]
@@ -927,7 +934,7 @@
     module.add_container('ns3::dsr::DsrRouteCacheEntry::IP_VECTOR', 'ns3::Ipv4Address', container_type='vector')
     module.add_container('std::vector< ns3::dsr::DsrRouteCache::Neighbor >', 'ns3::dsr::DsrRouteCache::Neighbor', container_type='vector')
     module.add_container('std::vector< ns3::Ptr< ns3::ArpCache > >', 'ns3::Ptr< ns3::ArpCache >', container_type='vector')
-    module.add_container('std::vector< std::string >', 'std::string', container_type='vector')
+    module.add_container('std::vector< std::string >', 'std::basic_string< char, std::char_traits< char >, std::allocator< char > >', container_type='vector')
     module.add_container('std::vector< ns3::dsr::DsrSendBuffEntry >', 'ns3::dsr::DsrSendBuffEntry', container_type='vector')
 
 def register_types_ns3_internal(module):
@@ -989,7 +996,6 @@
     register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
     register_Ns3Mac8Address_methods(root_module, root_module['ns3::Mac8Address'])
     register_Ns3NodeContainer_methods(root_module, root_module['ns3::NodeContainer'])
-    register_Ns3NonCopyable_methods(root_module, root_module['ns3::NonCopyable'])
     register_Ns3ObjectBase_methods(root_module, root_module['ns3::ObjectBase'])
     register_Ns3ObjectDeleter_methods(root_module, root_module['ns3::ObjectDeleter'])
     register_Ns3ObjectFactory_methods(root_module, root_module['ns3::ObjectFactory'])
@@ -1021,7 +1027,6 @@
     register_Ns3WifiRemoteStation_methods(root_module, root_module['ns3::WifiRemoteStation'])
     register_Ns3WifiRemoteStationInfo_methods(root_module, root_module['ns3::WifiRemoteStationInfo'])
     register_Ns3WifiRemoteStationState_methods(root_module, root_module['ns3::WifiRemoteStationState'])
-    register_Ns3WifiStandardInfo_methods(root_module, root_module['ns3::WifiStandardInfo'])
     register_Ns3Empty_methods(root_module, root_module['ns3::empty'])
     register_Ns3Int64x64_t_methods(root_module, root_module['ns3::int64x64_t'])
     register_Ns3Chunk_methods(root_module, root_module['ns3::Chunk'])
@@ -1117,6 +1122,9 @@
     register_Ns3OutputStreamWrapper_methods(root_module, root_module['ns3::OutputStreamWrapper'])
     register_Ns3Packet_methods(root_module, root_module['ns3::Packet'])
     register_Ns3ParetoRandomVariable_methods(root_module, root_module['ns3::ParetoRandomVariable'])
+    register_Ns3Ssid_methods(root_module, root_module['ns3::Ssid'])
+    register_Ns3SsidChecker_methods(root_module, root_module['ns3::SsidChecker'])
+    register_Ns3SsidValue_methods(root_module, root_module['ns3::SsidValue'])
     register_Ns3TcpL4Protocol_methods(root_module, root_module['ns3::TcpL4Protocol'])
     register_Ns3TimeValue_methods(root_module, root_module['ns3::TimeValue'])
     register_Ns3TypeIdChecker_methods(root_module, root_module['ns3::TypeIdChecker'])
@@ -1128,12 +1136,11 @@
     register_Ns3WifiModeValue_methods(root_module, root_module['ns3::WifiModeValue'])
     register_Ns3AddressChecker_methods(root_module, root_module['ns3::AddressChecker'])
     register_Ns3AddressValue_methods(root_module, root_module['ns3::AddressValue'])
+    register_Ns3CallbackImpl__Bool_Const_ns3WifiTxVector___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Bool_Ns3Ptr__lt__ns3Socket__gt___Const_ns3Address___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3CallbackImpl__Bool_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Ns3ObjectBase___star___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Unsigned_long_Const_ns3WifiTxVector___amp___Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3CallbackImpl__Unsigned_long_Unsigned_short_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Const_ns3Ipv4Header___amp___Ns3Ptr__lt__const_ns3Packet__gt___Ns3Ipv4L3ProtocolDropReason_Ns3Ptr__lt__ns3Ipv4__gt___Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, const ns3::Ipv4Header &, ns3::Ptr<const ns3::Packet>, ns3::Ipv4L3Protocol::DropReason, ns3::Ptr<ns3::Ipv4>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Const_ns3Ipv4Header___amp___Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, const ns3::Ipv4Header &, ns3::Ptr<const ns3::Packet>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
@@ -1143,12 +1150,17 @@
     register_Ns3CallbackImpl__Void_Ns3Mac48Address_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Ns3Ptr__lt__ns3Ipv4__gt___Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::Packet>, ns3::Ptr<ns3::Ipv4>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::Packet>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3WifiMacQueueItem__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3NetDevice__gt___Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_short_Const_ns3Address___amp___Const_ns3Address___amp___Ns3NetDevicePacketType_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<const ns3::Packet>, unsigned short, const ns3::Address &, const ns3::Address &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3NetDevice__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::NetDevice>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3Packet__gt___Ns3Ipv4Address_Ns3Ipv4Address_Unsigned_char_Ns3Ptr__lt__ns3Ipv4Route__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::Packet>, ns3::Ipv4Address, ns3::Ipv4Address, unsigned char, ns3::Ptr<ns3::Ipv4Route>, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3Socket__gt___Const_ns3Address___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3Socket__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3Socket__gt___Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::Socket>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Ns3WifiMacDropReason_Ns3Ptr__lt__const_ns3WifiMacQueueItem__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Unsigned_char_Ns3Ptr__lt__const_ns3WifiMacQueueItem__gt___Const_ns3WifiTxVector___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Unsigned_char_Ns3Ptr__lt__const_ns3WifiPsdu__gt___Const_ns3WifiTxVector___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Unsigned_char_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt____gt____gt____gt_____star___Const_stdSet__lt__ns3Mac48Address__stdLess__lt__ns3Mac48Address__gt____stdAllocator__lt__ns3Mac48Address__gt____gt_____star___Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3Icmpv4L4Protocol_methods(root_module, root_module['ns3::Icmpv4L4Protocol'])
     register_Ns3HashImplementation_methods(root_module, root_module['ns3::Hash::Implementation'])
     register_Ns3HashFunctionFnv1a_methods(root_module, root_module['ns3::Hash::Function::Fnv1a'])
@@ -1340,7 +1352,7 @@
     cls.add_constructor([])
     ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::BlockAckType(ns3::BlockAckType::Variant v) [constructor]
     cls.add_constructor([param('ns3::BlockAckType::Variant', 'v')])
-    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::BlockAckType(ns3::BlockAckType::Variant v, std::vector<unsigned char, std::allocator<unsigned char> > l) [constructor]
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::BlockAckType(ns3::BlockAckType::Variant v, std::vector<unsigned char, std::allocator<unsigned char>> l) [constructor]
     cls.add_constructor([param('ns3::BlockAckType::Variant', 'v'), param('std::vector< unsigned char >', 'l')])
     ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::m_bitmapLen [variable]
     cls.add_instance_attribute('m_bitmapLen', 'std::vector< unsigned char >', is_const=False)
@@ -2976,12 +2988,6 @@
                    is_const=True)
     return
 
-def register_Ns3NonCopyable_methods(root_module, cls):
-    ## non-copyable.h (module 'core'): ns3::NonCopyable::NonCopyable() [constructor]
-    cls.add_constructor([], 
-                        visibility='protected')
-    return
-
 def register_Ns3ObjectBase_methods(root_module, cls):
     ## object-base.h (module 'core'): ns3::ObjectBase::ObjectBase() [constructor]
     cls.add_constructor([])
@@ -3830,8 +3836,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -4164,6 +4170,11 @@
                    'bool', 
                    [param('uint16_t', 'channelWidth'), param('uint8_t', 'nss')], 
                    is_const=True)
+    ## wifi-mode.h (module 'wifi'): bool ns3::WifiMode::IsAllowed(ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('IsAllowed', 
+                   'bool', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True)
     ## wifi-mode.h (module 'wifi'): bool ns3::WifiMode::IsHigherCodeRate(ns3::WifiMode mode) const [member function]
     cls.add_method('IsHigherCodeRate', 
                    'bool', 
@@ -4184,15 +4195,15 @@
 def register_Ns3WifiModeFactory_methods(root_module, cls):
     ## wifi-mode.h (module 'wifi'): ns3::WifiModeFactory::WifiModeFactory(ns3::WifiModeFactory const & arg0) [constructor]
     cls.add_constructor([param('ns3::WifiModeFactory const &', 'arg0')])
-    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMcs(std::string uniqueName, uint8_t mcsValue, ns3::WifiModulationClass modClass, ns3::WifiModeFactory::CodeRateCallback codeRateCallback, ns3::WifiModeFactory::ConstellationSizeCallback constellationSizeCallback, ns3::WifiModeFactory::PhyRateCallback phyRateCallback, ns3::WifiModeFactory::PhyRateFromTxVectorCallback phyRateFromTxVectorCallback, ns3::WifiModeFactory::DataRateCallback dataRateCallback, ns3::WifiModeFactory::DataRateFromTxVectorCallback dataRateFromTxVectorCallback, ns3::WifiModeFactory::NonHtReferenceRateCallback nonHtReferenceRateCallback, ns3::WifiModeFactory::ModeAllowedCallback isModeAllowedCallback) [member function]
+    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMcs(std::string uniqueName, uint8_t mcsValue, ns3::WifiModulationClass modClass, bool isMandatory, ns3::WifiModeFactory::CodeRateCallback codeRateCallback, ns3::WifiModeFactory::ConstellationSizeCallback constellationSizeCallback, ns3::WifiModeFactory::PhyRateCallback phyRateCallback, ns3::WifiModeFactory::DataRateCallback dataRateCallback, ns3::WifiModeFactory::NonHtReferenceRateCallback nonHtReferenceRateCallback, ns3::WifiModeFactory::AllowedCallback isAllowedCallback) [member function]
     cls.add_method('CreateWifiMcs', 
                    'ns3::WifiMode', 
-                   [param('std::string', 'uniqueName'), param('uint8_t', 'mcsValue'), param('ns3::WifiModulationClass', 'modClass'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'codeRateCallback'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'constellationSizeCallback'), param('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateCallback'), param('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateFromTxVectorCallback'), param('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateCallback'), param('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateFromTxVectorCallback'), param('ns3::Callback< unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'nonHtReferenceRateCallback'), param('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'isModeAllowedCallback')], 
+                   [param('std::string', 'uniqueName'), param('uint8_t', 'mcsValue'), param('ns3::WifiModulationClass', 'modClass'), param('bool', 'isMandatory'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'codeRateCallback'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'constellationSizeCallback'), param('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateCallback'), param('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateCallback'), param('ns3::Callback< unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'nonHtReferenceRateCallback'), param('ns3::Callback< bool, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'isAllowedCallback')], 
                    is_static=True)
-    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMode(std::string uniqueName, ns3::WifiModulationClass modClass, bool isMandatory, ns3::WifiModeFactory::CodeRateCallback codeRateCallback, ns3::WifiModeFactory::ConstellationSizeCallback constellationSizeCallback, ns3::WifiModeFactory::PhyRateCallback phyRateCallback, ns3::WifiModeFactory::PhyRateFromTxVectorCallback phyRateFromTxVectorCallback, ns3::WifiModeFactory::DataRateCallback dataRateCallback, ns3::WifiModeFactory::DataRateFromTxVectorCallback dataRateFromTxVectorCallback, ns3::WifiModeFactory::ModeAllowedCallback isModeAllowedCallback) [member function]
+    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMode(std::string uniqueName, ns3::WifiModulationClass modClass, bool isMandatory, ns3::WifiModeFactory::CodeRateCallback codeRateCallback, ns3::WifiModeFactory::ConstellationSizeCallback constellationSizeCallback, ns3::WifiModeFactory::PhyRateCallback phyRateCallback, ns3::WifiModeFactory::DataRateCallback dataRateCallback, ns3::WifiModeFactory::AllowedCallback isAllowedCallback) [member function]
     cls.add_method('CreateWifiMode', 
                    'ns3::WifiMode', 
-                   [param('std::string', 'uniqueName'), param('ns3::WifiModulationClass', 'modClass'), param('bool', 'isMandatory'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'codeRateCallback'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'constellationSizeCallback'), param('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateCallback'), param('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateFromTxVectorCallback'), param('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateCallback'), param('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateFromTxVectorCallback'), param('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'isModeAllowedCallback')], 
+                   [param('std::string', 'uniqueName'), param('ns3::WifiModulationClass', 'modClass'), param('bool', 'isMandatory'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'codeRateCallback'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'constellationSizeCallback'), param('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateCallback'), param('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateCallback'), param('ns3::Callback< bool, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'isAllowedCallback')], 
                    is_static=True)
     return
 
@@ -4270,19 +4281,6 @@
     cls.add_instance_attribute('m_vhtCapabilities', 'ns3::Ptr< ns3::VhtCapabilities const >', is_const=False)
     return
 
-def register_Ns3WifiStandardInfo_methods(root_module, cls):
-    ## wifi-standards.h (module 'wifi'): ns3::WifiStandardInfo::WifiStandardInfo() [constructor]
-    cls.add_constructor([])
-    ## wifi-standards.h (module 'wifi'): ns3::WifiStandardInfo::WifiStandardInfo(ns3::WifiStandardInfo const & arg0) [constructor]
-    cls.add_constructor([param('ns3::WifiStandardInfo const &', 'arg0')])
-    ## wifi-standards.h (module 'wifi'): ns3::WifiStandardInfo::macStandard [variable]
-    cls.add_instance_attribute('macStandard', 'ns3::WifiMacStandard', is_const=False)
-    ## wifi-standards.h (module 'wifi'): ns3::WifiStandardInfo::phyBand [variable]
-    cls.add_instance_attribute('phyBand', 'ns3::WifiPhyBand', is_const=False)
-    ## wifi-standards.h (module 'wifi'): ns3::WifiStandardInfo::phyStandard [variable]
-    cls.add_instance_attribute('phyStandard', 'ns3::WifiPhyStandard', is_const=False)
-    return
-
 def register_Ns3Empty_methods(root_module, cls):
     ## empty.h (module 'core'): ns3::empty::empty() [constructor]
     cls.add_constructor([])
@@ -4300,14 +4298,14 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('>=')
     cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_unary_numeric_operator('-')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
     cls.add_constructor([])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(double const value) [constructor]
@@ -4326,6 +4324,8 @@
     cls.add_constructor([param('long unsigned int const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int const v) [constructor]
     cls.add_constructor([param('long long unsigned int const', 'v')])
+    ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int128_t const v) [constructor]
+    cls.add_constructor([param('int128_t const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t const hi, uint64_t const lo) [constructor]
     cls.add_constructor([param('int64_t const', 'hi'), param('uint64_t const', 'lo')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [constructor]
@@ -5160,93 +5160,93 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Ipv4MulticastRoute_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv4MulticastRoute__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter< ns3::Ipv4MulticastRoute > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Ipv4Route_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv4Route__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter< ns3::Ipv4Route > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3OutputStreamWrapper_Ns3Empty_Ns3DefaultDeleter__lt__ns3OutputStreamWrapper__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter< ns3::OutputStreamWrapper > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3WifiInformationElement_Ns3Empty_Ns3DefaultDeleter__lt__ns3WifiInformationElement__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement> >::SimpleRefCount(ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement>>::SimpleRefCount(ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter< ns3::WifiInformationElement > > const &', 'o')])
     return
 
@@ -5369,7 +5369,7 @@
                    'uint8_t', 
                    [param('uint8_t', 'ipTos')], 
                    is_static=True)
-    ## socket.h (module 'network'): void ns3::Socket::Ipv6JoinGroup(ns3::Ipv6Address address, ns3::Socket::Ipv6MulticastFilterMode filterMode, std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address> > sourceAddresses) [member function]
+    ## socket.h (module 'network'): void ns3::Socket::Ipv6JoinGroup(ns3::Ipv6Address address, ns3::Socket::Ipv6MulticastFilterMode filterMode, std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address>> sourceAddresses) [member function]
     cls.add_method('Ipv6JoinGroup', 
                    'void', 
                    [param('ns3::Ipv6Address', 'address'), param('ns3::Socket::Ipv6MulticastFilterMode', 'filterMode'), param('std::vector< ns3::Ipv6Address >', 'sourceAddresses')], 
@@ -6136,102 +6136,153 @@
     return
 
 def register_Ns3WifiMac_methods(root_module, cls):
+    ## wifi-mac.h (module 'wifi'): static ns3::TypeId ns3::WifiMac::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## wifi-mac.h (module 'wifi'): ns3::WifiMac::WifiMac() [constructor]
     cls.add_constructor([])
-    ## wifi-mac.h (module 'wifi'): ns3::WifiMac::WifiMac(ns3::WifiMac const & arg0) [constructor]
-    cls.add_constructor([param('ns3::WifiMac const &', 'arg0')])
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::ConfigureStandard(ns3::WifiStandard standard) [member function]
-    cls.add_method('ConfigureStandard', 
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetDevice(ns3::Ptr<ns3::WifiNetDevice> const device) [member function]
+    cls.add_method('SetDevice', 
                    'void', 
-                   [param('ns3::WifiStandard', 'standard')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::DoDispose() [member function]
-    cls.add_method('DoDispose', 
+                   [param('ns3::Ptr< ns3::WifiNetDevice > const', 'device')])
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiNetDevice> ns3::WifiMac::GetDevice() const [member function]
+    cls.add_method('GetDevice', 
+                   'ns3::Ptr< ns3::WifiNetDevice >', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::FrameExchangeManager> ns3::WifiMac::GetFrameExchangeManager() const [member function]
+    cls.add_method('GetFrameExchangeManager', 
+                   'ns3::Ptr< ns3::FrameExchangeManager >', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::Txop> ns3::WifiMac::GetTxop() const [member function]
+    cls.add_method('GetTxop', 
+                   'ns3::Ptr< ns3::Txop >', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::WifiMac::GetQosTxop(ns3::AcIndex ac) const [member function]
+    cls.add_method('GetQosTxop', 
+                   'ns3::Ptr< ns3::QosTxop >', 
+                   [param('ns3::AcIndex', 'ac')], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::WifiMac::GetQosTxop(uint8_t tid) const [member function]
+    cls.add_method('GetQosTxop', 
+                   'ns3::Ptr< ns3::QosTxop >', 
+                   [param('uint8_t', 'tid')], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueue> ns3::WifiMac::GetTxopQueue(ns3::AcIndex ac) const [member function]
+    cls.add_method('GetTxopQueue', 
+                   'ns3::Ptr< ns3::WifiMacQueue >', 
+                   [param('ns3::AcIndex', 'ac')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetTypeOfStation(ns3::TypeOfStation type) [member function]
+    cls.add_method('SetTypeOfStation', 
                    'void', 
+                   [param('ns3::TypeOfStation', 'type')])
+    ## wifi-mac.h (module 'wifi'): ns3::TypeOfStation ns3::WifiMac::GetTypeOfStation() const [member function]
+    cls.add_method('GetTypeOfStation', 
+                   'ns3::TypeOfStation', 
                    [], 
-                   is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to, ns3::Mac48Address from) [member function]
-    cls.add_method('Enqueue', 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetSsid(ns3::Ssid ssid) [member function]
+    cls.add_method('SetSsid', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to'), param('ns3::Mac48Address', 'from')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to) [member function]
-    cls.add_method('Enqueue', 
+                   [param('ns3::Ssid', 'ssid')])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetPromisc() [member function]
+    cls.add_method('SetPromisc', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to')], 
-                   is_pure_virtual=True, is_virtual=True)
+                   [])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetCtsToSelfSupported(bool enable) [member function]
+    cls.add_method('SetCtsToSelfSupported', 
+                   'void', 
+                   [param('bool', 'enable')])
     ## wifi-mac.h (module 'wifi'): ns3::Mac48Address ns3::WifiMac::GetAddress() const [member function]
     cls.add_method('GetAddress', 
                    'ns3::Mac48Address', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): ns3::Mac48Address ns3::WifiMac::GetBssid() const [member function]
-    cls.add_method('GetBssid', 
-                   'ns3::Mac48Address', 
-                   [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::NetDevice> ns3::WifiMac::GetDevice() const [member function]
-    cls.add_method('GetDevice', 
-                   'ns3::Ptr< ns3::NetDevice >', 
-                   [], 
                    is_const=True)
-    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::HeConfiguration> ns3::WifiMac::GetHeConfiguration() const [member function]
-    cls.add_method('GetHeConfiguration', 
-                   'ns3::Ptr< ns3::HeConfiguration >', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::HtConfiguration> ns3::WifiMac::GetHtConfiguration() const [member function]
-    cls.add_method('GetHtConfiguration', 
-                   'ns3::Ptr< ns3::HtConfiguration >', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::GetShortSlotTimeSupported() const [member function]
-    cls.add_method('GetShortSlotTimeSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## wifi-mac.h (module 'wifi'): ns3::Ssid ns3::WifiMac::GetSsid() const [member function]
     cls.add_method('GetSsid', 
                    'ns3::Ssid', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): static ns3::TypeId ns3::WifiMac::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## wifi-mac.h (module 'wifi'): ns3::TypeOfStation ns3::WifiMac::GetTypeOfStation() const [member function]
-    cls.add_method('GetTypeOfStation', 
-                   'ns3::TypeOfStation', 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetAddress(ns3::Mac48Address address) [member function]
+    cls.add_method('SetAddress', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Mac48Address ns3::WifiMac::GetBssid() const [member function]
+    cls.add_method('GetBssid', 
+                   'ns3::Mac48Address', 
                    [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetBssid(ns3::Mac48Address bssid) [member function]
+    cls.add_method('SetBssid', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'bssid')])
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::CanForwardPacketsTo(ns3::Mac48Address to) const [member function]
+    cls.add_method('CanForwardPacketsTo', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'to')], 
                    is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::VhtConfiguration> ns3::WifiMac::GetVhtConfiguration() const [member function]
-    cls.add_method('GetVhtConfiguration', 
-                   'ns3::Ptr< ns3::VhtConfiguration >', 
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to, ns3::Mac48Address from) [member function]
+    cls.add_method('Enqueue', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to'), param('ns3::Mac48Address', 'from')], 
+                   is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to) [member function]
+    cls.add_method('Enqueue', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::SupportsSendFrom() const [member function]
+    cls.add_method('SupportsSendFrom', 
+                   'bool', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetWifiPhy(ns3::Ptr<ns3::WifiPhy> phy) [member function]
+    cls.add_method('SetWifiPhy', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPhy >', 'phy')], 
+                   is_virtual=True)
     ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiPhy> ns3::WifiMac::GetWifiPhy() const [member function]
     cls.add_method('GetWifiPhy', 
                    'ns3::Ptr< ns3::WifiPhy >', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::ResetWifiPhy() [member function]
+    cls.add_method('ResetWifiPhy', 
+                   'void', 
+                   [])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetWifiRemoteStationManager(ns3::Ptr<ns3::WifiRemoteStationManager> stationManager) [member function]
+    cls.add_method('SetWifiRemoteStationManager', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiRemoteStationManager >', 'stationManager')])
     ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiRemoteStationManager> ns3::WifiMac::GetWifiRemoteStationManager() const [member function]
     cls.add_method('GetWifiRemoteStationManager', 
                    'ns3::Ptr< ns3::WifiRemoteStationManager >', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyPromiscRx(ns3::Ptr<const ns3::Packet> packet) [member function]
-    cls.add_method('NotifyPromiscRx', 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetForwardUpCallback(ns3::WifiMac::ForwardUpCallback upCallback) [member function]
+    cls.add_method('SetForwardUpCallback', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyRx(ns3::Ptr<const ns3::Packet> packet) [member function]
-    cls.add_method('NotifyRx', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'upCallback')])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetLinkUpCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkUp) [member function]
+    cls.add_method('SetLinkUpCallback', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyRxDrop(ns3::Ptr<const ns3::Packet> packet) [member function]
-    cls.add_method('NotifyRxDrop', 
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkUp')], 
+                   is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetLinkDownCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkDown) [member function]
+    cls.add_method('SetLinkDownCallback', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkDown')])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyChannelSwitching() [member function]
+    cls.add_method('NotifyChannelSwitching', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
     ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyTx(ns3::Ptr<const ns3::Packet> packet) [member function]
     cls.add_method('NotifyTx', 
                    'void', 
@@ -6240,75 +6291,163 @@
     cls.add_method('NotifyTxDrop', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet const >', 'packet')])
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::ResetWifiPhy() [member function]
-    cls.add_method('ResetWifiPhy', 
-                   'void', 
-                   [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetAddress(ns3::Mac48Address address) [member function]
-    cls.add_method('SetAddress', 
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyRx(ns3::Ptr<const ns3::Packet> packet) [member function]
+    cls.add_method('NotifyRx', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetDevice(ns3::Ptr<ns3::NetDevice> const device) [member function]
-    cls.add_method('SetDevice', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyPromiscRx(ns3::Ptr<const ns3::Packet> packet) [member function]
+    cls.add_method('NotifyPromiscRx', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NetDevice > const', 'device')])
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetForwardUpCallback(ns3::WifiMac::ForwardUpCallback upCallback) [member function]
-    cls.add_method('SetForwardUpCallback', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyRxDrop(ns3::Ptr<const ns3::Packet> packet) [member function]
+    cls.add_method('NotifyRxDrop', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'upCallback')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetLinkDownCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkDown) [member function]
-    cls.add_method('SetLinkDownCallback', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::ConfigureStandard(ns3::WifiStandard standard) [member function]
+    cls.add_method('ConfigureStandard', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkDown')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetLinkUpCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkUp) [member function]
-    cls.add_method('SetLinkUpCallback', 
+                   [param('ns3::WifiStandard', 'standard')], 
+                   is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::HtConfiguration> ns3::WifiMac::GetHtConfiguration() const [member function]
+    cls.add_method('GetHtConfiguration', 
+                   'ns3::Ptr< ns3::HtConfiguration >', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::VhtConfiguration> ns3::WifiMac::GetVhtConfiguration() const [member function]
+    cls.add_method('GetVhtConfiguration', 
+                   'ns3::Ptr< ns3::VhtConfiguration >', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::HeConfiguration> ns3::WifiMac::GetHeConfiguration() const [member function]
+    cls.add_method('GetHeConfiguration', 
+                   'ns3::Ptr< ns3::HeConfiguration >', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::ExtendedCapabilities ns3::WifiMac::GetExtendedCapabilities() const [member function]
+    cls.add_method('GetExtendedCapabilities', 
+                   'ns3::ExtendedCapabilities', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::HtCapabilities ns3::WifiMac::GetHtCapabilities() const [member function]
+    cls.add_method('GetHtCapabilities', 
+                   'ns3::HtCapabilities', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::VhtCapabilities ns3::WifiMac::GetVhtCapabilities() const [member function]
+    cls.add_method('GetVhtCapabilities', 
+                   'ns3::VhtCapabilities', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::HeCapabilities ns3::WifiMac::GetHeCapabilities() const [member function]
+    cls.add_method('GetHeCapabilities', 
+                   'ns3::HeCapabilities', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::GetQosSupported() const [member function]
+    cls.add_method('GetQosSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::GetErpSupported() const [member function]
+    cls.add_method('GetErpSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::GetDsssSupported() const [member function]
+    cls.add_method('GetDsssSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::GetHtSupported() const [member function]
+    cls.add_method('GetHtSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::GetVhtSupported() const [member function]
+    cls.add_method('GetVhtSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::GetHeSupported() const [member function]
+    cls.add_method('GetHeSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): uint32_t ns3::WifiMac::GetMaxAmpduSize(ns3::AcIndex ac) const [member function]
+    cls.add_method('GetMaxAmpduSize', 
+                   'uint32_t', 
+                   [param('ns3::AcIndex', 'ac')], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): uint16_t ns3::WifiMac::GetMaxAmsduSize(ns3::AcIndex ac) const [member function]
+    cls.add_method('GetMaxAmsduSize', 
+                   'uint16_t', 
+                   [param('ns3::AcIndex', 'ac')], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkUp')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetPromisc() [member function]
-    cls.add_method('SetPromisc', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::DoDispose() [member function]
+    cls.add_method('DoDispose', 
                    'void', 
                    [], 
-                   is_pure_virtual=True, is_virtual=True)
+                   is_virtual=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::ConfigureContentionWindow(uint32_t cwMin, uint32_t cwMax) [member function]
+    cls.add_method('ConfigureContentionWindow', 
+                   'void', 
+                   [param('uint32_t', 'cwMin'), param('uint32_t', 'cwMax')], 
+                   is_virtual=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetQosSupported(bool enable) [member function]
+    cls.add_method('SetQosSupported', 
+                   'void', 
+                   [param('bool', 'enable')], 
+                   visibility='protected')
     ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetShortSlotTimeSupported(bool enable) [member function]
     cls.add_method('SetShortSlotTimeSupported', 
                    'void', 
                    [param('bool', 'enable')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetSsid(ns3::Ssid ssid) [member function]
-    cls.add_method('SetSsid', 
-                   'void', 
-                   [param('ns3::Ssid', 'ssid')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetTypeOfStation(ns3::TypeOfStation type) [member function]
-    cls.add_method('SetTypeOfStation', 
-                   'void', 
-                   [param('ns3::TypeOfStation', 'type')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetWifiPhy(ns3::Ptr<ns3::WifiPhy> phy) [member function]
-    cls.add_method('SetWifiPhy', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiPhy >', 'phy')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetWifiRemoteStationManager(ns3::Ptr<ns3::WifiRemoteStationManager> stationManager) [member function]
-    cls.add_method('SetWifiRemoteStationManager', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiRemoteStationManager >', 'stationManager')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::SupportsSendFrom() const [member function]
-    cls.add_method('SupportsSendFrom', 
+                   visibility='protected')
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::GetShortSlotTimeSupported() const [member function]
+    cls.add_method('GetShortSlotTimeSupported', 
                    'bool', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::ConfigureDcf(ns3::Ptr<ns3::Txop> dcf, uint32_t cwmin, uint32_t cwmax, bool isDsss, ns3::AcIndex ac) [member function]
-    cls.add_method('ConfigureDcf', 
+                   is_const=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::WifiMac::GetVOQueue() const [member function]
+    cls.add_method('GetVOQueue', 
+                   'ns3::Ptr< ns3::QosTxop >', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::WifiMac::GetVIQueue() const [member function]
+    cls.add_method('GetVIQueue', 
+                   'ns3::Ptr< ns3::QosTxop >', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::WifiMac::GetBEQueue() const [member function]
+    cls.add_method('GetBEQueue', 
+                   'ns3::Ptr< ns3::QosTxop >', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::WifiMac::GetBKQueue() const [member function]
+    cls.add_method('GetBKQueue', 
+                   'ns3::Ptr< ns3::QosTxop >', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::Receive(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('Receive', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
+                   is_virtual=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::ForwardUp(ns3::Ptr<const ns3::Packet> packet, ns3::Mac48Address from, ns3::Mac48Address to) [member function]
+    cls.add_method('ForwardUp', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Txop >', 'dcf'), param('uint32_t', 'cwmin'), param('uint32_t', 'cwmax'), param('bool', 'isDsss'), param('ns3::AcIndex', 'ac')], 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::Mac48Address', 'from'), param('ns3::Mac48Address', 'to')], 
                    visibility='protected')
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::DeaggregateAmsduAndForward(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('DeaggregateAmsduAndForward', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
+                   is_virtual=True, visibility='protected')
     return
 
 def register_Ns3WifiRemoteStationManager_methods(root_module, cls):
@@ -7059,7 +7198,7 @@
     cls.add_method('Lookup', 
                    'ns3::ArpCache::Entry *', 
                    [param('ns3::Ipv4Address', 'destination')])
-    ## arp-cache.h (module 'internet'): std::list<ns3::ArpCache::Entry *, std::allocator<ns3::ArpCache::Entry *> > ns3::ArpCache::LookupInverse(ns3::Address destination) [member function]
+    ## arp-cache.h (module 'internet'): std::list<ns3::ArpCache::Entry *, std::allocator<ns3::ArpCache::Entry *>> ns3::ArpCache::LookupInverse(ns3::Address destination) [member function]
     cls.add_method('LookupInverse', 
                    'std::list< ns3::ArpCache::Entry * >', 
                    [param('ns3::Address', 'destination')])
@@ -7335,42 +7474,42 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::Socket> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::NetDevice> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['bool'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::Packet const> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Address const&'], visibility='protected')
+                   is_static=True, template_parameters=['unsigned short'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['unsigned int'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Address const&'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::NetDevice> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::NetDevice::PacketType'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::Packet const> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::Socket> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['unsigned short'], visibility='protected')
+                   is_static=True, template_parameters=['bool'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::NetDevice::PacketType'], visibility='protected')
+                   is_static=True, template_parameters=['unsigned int'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
@@ -7410,6 +7549,31 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
+                   is_static=True, template_parameters=['ns3::WifiMacDropReason'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiMacQueueItem const> '], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiPsdu const> '], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['std::unordered_map<unsigned short', ' ns3::Ptr<ns3::WifiPsdu>', ' std::hash<unsigned short>', ' std::equal_to<unsigned short>', ' std::allocator<std::pair<unsigned short const', ' ns3::Ptr<ns3::WifiPsdu> > > >*'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['std::set<ns3::Mac48Address', ' std::less<ns3::Mac48Address>', ' std::allocator<ns3::Mac48Address> > const*'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
                    is_static=True, template_parameters=['ns3::dsr::DsrOptionSRHeader const&'], visibility='protected')
     return
 
@@ -7909,19 +8073,14 @@
                    'uint8_t', 
                    [], 
                    is_const=True)
-    ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetHeLtfAndGiForHePpdus() const [member function]
-    cls.add_method('GetHeLtfAndGiForHePpdus', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
     ## he-capabilities.h (module 'wifi'): uint32_t ns3::HeCapabilities::GetHeMacCapabilitiesInfo1() const [member function]
     cls.add_method('GetHeMacCapabilitiesInfo1', 
                    'uint32_t', 
                    [], 
                    is_const=True)
-    ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetHeMacCapabilitiesInfo2() const [member function]
+    ## he-capabilities.h (module 'wifi'): uint16_t ns3::HeCapabilities::GetHeMacCapabilitiesInfo2() const [member function]
     cls.add_method('GetHeMacCapabilitiesInfo2', 
-                   'uint8_t', 
+                   'uint16_t', 
                    [], 
                    is_const=True)
     ## he-capabilities.h (module 'wifi'): uint64_t ns3::HeCapabilities::GetHePhyCapabilitiesInfo1() const [member function]
@@ -7929,11 +8088,26 @@
                    'uint64_t', 
                    [], 
                    is_const=True)
-    ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetHePhyCapabilitiesInfo2() const [member function]
+    ## he-capabilities.h (module 'wifi'): uint16_t ns3::HeCapabilities::GetHePhyCapabilitiesInfo2() const [member function]
     cls.add_method('GetHePhyCapabilitiesInfo2', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetHePhyCapabilitiesInfo3() const [member function]
+    cls.add_method('GetHePhyCapabilitiesInfo3', 
                    'uint8_t', 
                    [], 
                    is_const=True)
+    ## he-capabilities.h (module 'wifi'): bool ns3::HeCapabilities::GetHePpdu4xHeLtf800nsGi() const [member function]
+    cls.add_method('GetHePpdu4xHeLtf800nsGi', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## he-capabilities.h (module 'wifi'): bool ns3::HeCapabilities::GetHeSuPpdu1xHeLtf800nsGi() const [member function]
+    cls.add_method('GetHeSuPpdu1xHeLtf800nsGi', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetHighestMcsSupported() const [member function]
     cls.add_method('GetHighestMcsSupported', 
                    'uint8_t', 
@@ -7993,18 +8167,22 @@
     cls.add_method('SetChannelWidthSet', 
                    'void', 
                    [param('uint8_t', 'channelWidthSet')])
-    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHeLtfAndGiForHePpdus(uint8_t heLtfAndGiForHePpdus) [member function]
-    cls.add_method('SetHeLtfAndGiForHePpdus', 
-                   'void', 
-                   [param('uint8_t', 'heLtfAndGiForHePpdus')])
-    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHeMacCapabilitiesInfo(uint32_t ctrl1, uint8_t ctrl2) [member function]
+    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHeMacCapabilitiesInfo(uint32_t ctrl1, uint16_t ctrl2) [member function]
     cls.add_method('SetHeMacCapabilitiesInfo', 
                    'void', 
-                   [param('uint32_t', 'ctrl1'), param('uint8_t', 'ctrl2')])
-    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHePhyCapabilitiesInfo(uint64_t ctrl1, uint8_t ctrl2) [member function]
+                   [param('uint32_t', 'ctrl1'), param('uint16_t', 'ctrl2')])
+    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHePhyCapabilitiesInfo(uint64_t ctrl1, uint16_t ctrl2, uint8_t ctrl3) [member function]
     cls.add_method('SetHePhyCapabilitiesInfo', 
                    'void', 
-                   [param('uint64_t', 'ctrl1'), param('uint8_t', 'ctrl2')])
+                   [param('uint64_t', 'ctrl1'), param('uint16_t', 'ctrl2'), param('uint8_t', 'ctrl3')])
+    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHePpdu4xHeLtf800nsGi(bool heSuPpdu4xHeLtf800nsGi) [member function]
+    cls.add_method('SetHePpdu4xHeLtf800nsGi', 
+                   'void', 
+                   [param('bool', 'heSuPpdu4xHeLtf800nsGi')])
+    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHeSuPpdu1xHeLtf800nsGi(bool heSuPpdu1xHeLtf800nsGi) [member function]
+    cls.add_method('SetHeSuPpdu1xHeLtf800nsGi', 
+                   'void', 
+                   [param('bool', 'heSuPpdu1xHeLtf800nsGi')])
     ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHeSupported(uint8_t heSupported) [member function]
     cls.add_method('SetHeSupported', 
                    'void', 
@@ -8912,7 +9090,7 @@
                    'ns3::Ipv4Address', 
                    [], 
                    is_const=True)
-    ## ipv4-route.h (module 'internet'): std::map<unsigned int, unsigned int, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, unsigned int> > > ns3::Ipv4MulticastRoute::GetOutputTtlMap() const [member function]
+    ## ipv4-route.h (module 'internet'): std::map<unsigned int, unsigned int, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, unsigned int>>> ns3::Ipv4MulticastRoute::GetOutputTtlMap() const [member function]
     cls.add_method('GetOutputTtlMap', 
                    'std::map< unsigned int, unsigned int >', 
                    [], 
@@ -9358,10 +9536,16 @@
     cls.add_method('ExtractNeighborIndex', 
                    'uint32_t', 
                    [param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetEpoch() const [member function]
+    cls.add_method('GetEpoch', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() const [member function]
     cls.add_method('GetRemainingBits', 
                    'uint32_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -9372,6 +9556,10 @@
                    'uint32_t', 
                    [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
+    ## nix-vector.h (module 'network'): void ns3::NixVector::SetEpoch(uint32_t epoch) [member function]
+    cls.add_method('SetEpoch', 
+                   'void', 
+                   [param('uint32_t', 'epoch')])
     return
 
 def register_Ns3Node_methods(root_module, cls):
@@ -9748,10 +9936,11 @@
                    'uint32_t', 
                    [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) const [member function]
     cls.add_method('SetNixVector', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')], 
+                   is_const=True)
     ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
     cls.add_method('ToString', 
                    'std::string', 
@@ -9802,6 +9991,91 @@
                    is_virtual=True)
     return
 
+def register_Ns3Ssid_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## ssid.h (module 'wifi'): ns3::Ssid::Ssid(ns3::Ssid const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ssid const &', 'arg0')])
+    ## ssid.h (module 'wifi'): ns3::Ssid::Ssid() [constructor]
+    cls.add_constructor([])
+    ## ssid.h (module 'wifi'): ns3::Ssid::Ssid(std::string s) [constructor]
+    cls.add_constructor([param('std::string', 's')])
+    ## ssid.h (module 'wifi'): uint8_t ns3::Ssid::DeserializeInformationField(ns3::Buffer::Iterator start, uint8_t length) [member function]
+    cls.add_method('DeserializeInformationField', 
+                   'uint8_t', 
+                   [param('ns3::Buffer::Iterator', 'start'), param('uint8_t', 'length')], 
+                   is_virtual=True)
+    ## ssid.h (module 'wifi'): ns3::WifiInformationElementId ns3::Ssid::ElementId() const [member function]
+    cls.add_method('ElementId', 
+                   'ns3::WifiInformationElementId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ssid.h (module 'wifi'): uint8_t ns3::Ssid::GetInformationFieldSize() const [member function]
+    cls.add_method('GetInformationFieldSize', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ssid.h (module 'wifi'): bool ns3::Ssid::IsBroadcast() const [member function]
+    cls.add_method('IsBroadcast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ssid.h (module 'wifi'): bool ns3::Ssid::IsEqual(ns3::Ssid const & o) const [member function]
+    cls.add_method('IsEqual', 
+                   'bool', 
+                   [param('ns3::Ssid const &', 'o')], 
+                   is_const=True)
+    ## ssid.h (module 'wifi'): char * ns3::Ssid::PeekString() const [member function]
+    cls.add_method('PeekString', 
+                   'char *', 
+                   [], 
+                   is_const=True)
+    ## ssid.h (module 'wifi'): void ns3::Ssid::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('SerializeInformationField', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    return
+
+def register_Ns3SsidChecker_methods(root_module, cls):
+    ## ssid.h (module 'wifi'): ns3::SsidChecker::SsidChecker() [constructor]
+    cls.add_constructor([])
+    ## ssid.h (module 'wifi'): ns3::SsidChecker::SsidChecker(ns3::SsidChecker const & arg0) [constructor]
+    cls.add_constructor([param('ns3::SsidChecker const &', 'arg0')])
+    return
+
+def register_Ns3SsidValue_methods(root_module, cls):
+    ## ssid.h (module 'wifi'): ns3::SsidValue::SsidValue() [constructor]
+    cls.add_constructor([])
+    ## ssid.h (module 'wifi'): ns3::SsidValue::SsidValue(ns3::Ssid const & value) [constructor]
+    cls.add_constructor([param('ns3::Ssid const &', 'value')])
+    ## ssid.h (module 'wifi'): ns3::SsidValue::SsidValue(ns3::SsidValue const & arg0) [constructor]
+    cls.add_constructor([param('ns3::SsidValue const &', 'arg0')])
+    ## ssid.h (module 'wifi'): ns3::Ptr<ns3::AttributeValue> ns3::SsidValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ssid.h (module 'wifi'): bool ns3::SsidValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## ssid.h (module 'wifi'): ns3::Ssid ns3::SsidValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Ssid', 
+                   [], 
+                   is_const=True)
+    ## ssid.h (module 'wifi'): std::string ns3::SsidValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## ssid.h (module 'wifi'): void ns3::SsidValue::Set(ns3::Ssid const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Ssid const &', 'value')])
+    return
+
 def register_Ns3TcpL4Protocol_methods(root_module, cls):
     ## tcp-l4-protocol.h (module 'internet'): static ns3::TypeId ns3::TcpL4Protocol::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
@@ -10439,47 +10713,47 @@
                    [param('ns3::Address const &', 'value')])
     return
 
-def register_Ns3CallbackImpl__Bool_Ns3Ptr__lt__ns3Socket__gt___Const_ns3Address___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+def register_Ns3CallbackImpl__Bool_Const_ns3WifiTxVector___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< bool, ns3::Ptr< ns3::Socket >, ns3::Address const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    ## callback.h (module 'core'): ns3::CallbackImpl<bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< bool, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
     cls.add_method('DoGetTypeid', 
                    'std::string', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
     cls.add_method('GetTypeid', 
                    'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): bool ns3::CallbackImpl<bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<ns3::Socket> arg0, ns3::Address const & arg1) [member operator]
+    ## callback.h (module 'core'): bool ns3::CallbackImpl<bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::WifiTxVector const & arg0) [member operator]
     cls.add_method('operator()', 
                    'bool', 
-                   [param('ns3::Ptr< ns3::Socket >', 'arg0'), param('ns3::Address const &', 'arg1')], 
+                   [param('ns3::WifiTxVector const &', 'arg0')], 
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3CallbackImpl__Bool_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+def register_Ns3CallbackImpl__Bool_Ns3Ptr__lt__ns3Socket__gt___Const_ns3Address___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    ## callback.h (module 'core'): ns3::CallbackImpl<bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< bool, ns3::Ptr< ns3::Socket >, ns3::Address const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
     cls.add_method('DoGetTypeid', 
                    'std::string', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
     cls.add_method('GetTypeid', 
                    'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): bool ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(short unsigned int arg0, unsigned char arg1) [member operator]
+    ## callback.h (module 'core'): bool ns3::CallbackImpl<bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<ns3::Socket> arg0, ns3::Address const & arg1) [member operator]
     cls.add_method('operator()', 
                    'bool', 
-                   [param('short unsigned int', 'arg0'), param('unsigned char', 'arg1')], 
+                   [param('ns3::Ptr< ns3::Socket >', 'arg0'), param('ns3::Address const &', 'arg1')], 
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
@@ -10549,28 +10823,6 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3CallbackImpl__Unsigned_long_Unsigned_short_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): long unsigned int ns3::CallbackImpl<unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(short unsigned int arg0, short unsigned int arg1, unsigned char arg2) [member operator]
-    cls.add_method('operator()', 
-                   'long unsigned int', 
-                   [param('short unsigned int', 'arg0'), param('short unsigned int', 'arg1'), param('unsigned char', 'arg2')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
 def register_Ns3CallbackImpl__Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
     ## callback.h (module 'core'): ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
@@ -10769,6 +11021,28 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
+def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3WifiMacQueueItem__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::WifiMacQueueItem> arg0) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'arg0')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
 def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3NetDevice__gt___Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_short_Const_ns3Address___amp___Const_ns3Address___amp___Ns3NetDevicePacketType_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<const ns3::Packet>, unsigned short, const ns3::Address &, const ns3::Address &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
@@ -10901,6 +11175,95 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
+def register_Ns3CallbackImpl__Void_Ns3WifiMacDropReason_Ns3Ptr__lt__const_ns3WifiMacQueueItem__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::WifiMacDropReason, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::WifiMacDropReason arg0, ns3::Ptr<const ns3::WifiMacQueueItem> arg1) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('ns3::WifiMacDropReason', 'arg0'), param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'arg1')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Void_Unsigned_char_Ns3Ptr__lt__const_ns3WifiMacQueueItem__gt___Const_ns3WifiTxVector___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, unsigned char, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(unsigned char arg0, ns3::Ptr<const ns3::WifiMacQueueItem> arg1, ns3::WifiTxVector const & arg2) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('unsigned char', 'arg0'), param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'arg1'), param('ns3::WifiTxVector const &', 'arg2')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Void_Unsigned_char_Ns3Ptr__lt__const_ns3WifiPsdu__gt___Const_ns3WifiTxVector___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, unsigned char, ns3::Ptr< ns3::WifiPsdu const >, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(unsigned char arg0, ns3::Ptr<const ns3::WifiPsdu> arg1, ns3::WifiTxVector const & arg2) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('unsigned char', 'arg0'), param('ns3::Ptr< ns3::WifiPsdu const >', 'arg1'), param('ns3::WifiTxVector const &', 'arg2')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Void_Unsigned_char_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt____gt____gt____gt_____star___Const_stdSet__lt__ns3Mac48Address__stdLess__lt__ns3Mac48Address__gt____stdAllocator__lt__ns3Mac48Address__gt____gt_____star___Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, unsigned char, std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu >, std::hash< unsigned short >, std::equal_to< unsigned short >, std::allocator< std::pair< unsigned short const, ns3::Ptr< ns3::WifiPsdu > > > > *, std::set< ns3::Mac48Address, std::less< ns3::Mac48Address >, std::allocator< ns3::Mac48Address > > const, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(unsigned char arg0, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> * arg1, std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> const * arg2, long unsigned int arg3) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('unsigned char', 'arg0'), param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > > *', 'arg1'), param('std::set< ns3::Mac48Address > const *', 'arg2'), param('long unsigned int', 'arg3')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    cls.add_copy_constructor()
+    return
+
 def register_Ns3Icmpv4L4Protocol_methods(root_module, cls):
     ## icmpv4-l4-protocol.h (module 'internet'): ns3::Icmpv4L4Protocol::Icmpv4L4Protocol(ns3::Icmpv4L4Protocol const & arg0) [constructor]
     cls.add_constructor([param('ns3::Icmpv4L4Protocol const &', 'arg0')])
@@ -11182,7 +11545,7 @@
     cls.add_method('Find', 
                    'bool', 
                    [param('ns3::Ipv4Address', 'dst')])
-    ## dsr-errorbuff.h (module 'dsr'): std::vector<ns3::dsr::DsrErrorBuffEntry, std::allocator<ns3::dsr::DsrErrorBuffEntry> > & ns3::dsr::DsrErrorBuffer::GetBuffer() [member function]
+    ## dsr-errorbuff.h (module 'dsr'): std::vector<ns3::dsr::DsrErrorBuffEntry, std::allocator<ns3::dsr::DsrErrorBuffEntry>> & ns3::dsr::DsrErrorBuffer::GetBuffer() [member function]
     cls.add_method('GetBuffer', 
                    'std::vector< ns3::dsr::DsrErrorBuffEntry > &', 
                    [])
@@ -11527,7 +11890,7 @@
                    'uint32_t', 
                    [], 
                    is_const=True)
-    ## dsr-network-queue.h (module 'dsr'): std::vector<ns3::dsr::DsrNetworkQueueEntry, std::allocator<ns3::dsr::DsrNetworkQueueEntry> > & ns3::dsr::DsrNetworkQueue::GetQueue() [member function]
+    ## dsr-network-queue.h (module 'dsr'): std::vector<ns3::dsr::DsrNetworkQueueEntry, std::allocator<ns3::dsr::DsrNetworkQueueEntry>> & ns3::dsr::DsrNetworkQueue::GetQueue() [member function]
     cls.add_method('GetQueue', 
                    'std::vector< ns3::dsr::DsrNetworkQueueEntry > &', 
                    [])
@@ -12074,7 +12437,7 @@
                    'ns3::Ipv4Address', 
                    [param('uint8_t', 'index')], 
                    is_const=True)
-    ## dsr-option-header.h (module 'dsr'): std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address> > ns3::dsr::DsrOptionRrepHeader::GetNodesAddress() const [member function]
+    ## dsr-option-header.h (module 'dsr'): std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address>> ns3::dsr::DsrOptionRrepHeader::GetNodesAddress() const [member function]
     cls.add_method('GetNodesAddress', 
                    'std::vector< ns3::Ipv4Address >', 
                    [], 
@@ -12084,7 +12447,7 @@
                    'uint32_t', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## dsr-option-header.h (module 'dsr'): ns3::Ipv4Address ns3::dsr::DsrOptionRrepHeader::GetTargetAddress(std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address> > ipv4Address) const [member function]
+    ## dsr-option-header.h (module 'dsr'): ns3::Ipv4Address ns3::dsr::DsrOptionRrepHeader::GetTargetAddress(std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address>> ipv4Address) const [member function]
     cls.add_method('GetTargetAddress', 
                    'ns3::Ipv4Address', 
                    [param('std::vector< ns3::Ipv4Address >', 'ipv4Address')], 
@@ -12108,7 +12471,7 @@
     cls.add_method('SetNodeAddress', 
                    'void', 
                    [param('uint8_t', 'index'), param('ns3::Ipv4Address', 'addr')])
-    ## dsr-option-header.h (module 'dsr'): void ns3::dsr::DsrOptionRrepHeader::SetNodesAddress(std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address> > ipv4Address) [member function]
+    ## dsr-option-header.h (module 'dsr'): void ns3::dsr::DsrOptionRrepHeader::SetNodesAddress(std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address>> ipv4Address) [member function]
     cls.add_method('SetNodesAddress', 
                    'void', 
                    [param('std::vector< ns3::Ipv4Address >', 'ipv4Address')])
@@ -12152,7 +12515,7 @@
                    'ns3::Ipv4Address', 
                    [param('uint8_t', 'index')], 
                    is_const=True)
-    ## dsr-option-header.h (module 'dsr'): std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address> > ns3::dsr::DsrOptionRreqHeader::GetNodesAddresses() const [member function]
+    ## dsr-option-header.h (module 'dsr'): std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address>> ns3::dsr::DsrOptionRreqHeader::GetNodesAddresses() const [member function]
     cls.add_method('GetNodesAddresses', 
                    'std::vector< ns3::Ipv4Address >', 
                    [], 
@@ -12194,7 +12557,7 @@
     cls.add_method('SetNodeAddress', 
                    'void', 
                    [param('uint8_t', 'index'), param('ns3::Ipv4Address', 'addr')])
-    ## dsr-option-header.h (module 'dsr'): void ns3::dsr::DsrOptionRreqHeader::SetNodesAddress(std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address> > ipv4Address) [member function]
+    ## dsr-option-header.h (module 'dsr'): void ns3::dsr::DsrOptionRreqHeader::SetNodesAddress(std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address>> ipv4Address) [member function]
     cls.add_method('SetNodesAddress', 
                    'void', 
                    [param('std::vector< ns3::Ipv4Address >', 'ipv4Address')])
@@ -12239,7 +12602,7 @@
                    'uint8_t', 
                    [], 
                    is_const=True)
-    ## dsr-option-header.h (module 'dsr'): std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address> > ns3::dsr::DsrOptionSRHeader::GetNodesAddress() const [member function]
+    ## dsr-option-header.h (module 'dsr'): std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address>> ns3::dsr::DsrOptionSRHeader::GetNodesAddress() const [member function]
     cls.add_method('GetNodesAddress', 
                    'std::vector< ns3::Ipv4Address >', 
                    [], 
@@ -12278,7 +12641,7 @@
     cls.add_method('SetNodeAddress', 
                    'void', 
                    [param('uint8_t', 'index'), param('ns3::Ipv4Address', 'addr')])
-    ## dsr-option-header.h (module 'dsr'): void ns3::dsr::DsrOptionSRHeader::SetNodesAddress(std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address> > ipv4Address) [member function]
+    ## dsr-option-header.h (module 'dsr'): void ns3::dsr::DsrOptionSRHeader::SetNodesAddress(std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address>> ipv4Address) [member function]
     cls.add_method('SetNodesAddress', 
                    'void', 
                    [param('std::vector< ns3::Ipv4Address >', 'ipv4Address')])
@@ -12301,15 +12664,15 @@
     cls.add_constructor([param('ns3::dsr::DsrOptions const &', 'arg0')])
     ## dsr-options.h (module 'dsr'): ns3::dsr::DsrOptions::DsrOptions() [constructor]
     cls.add_constructor([])
-    ## dsr-options.h (module 'dsr'): bool ns3::dsr::DsrOptions::CheckDuplicates(ns3::Ipv4Address ipv4Address, std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address> > & vec) [member function]
+    ## dsr-options.h (module 'dsr'): bool ns3::dsr::DsrOptions::CheckDuplicates(ns3::Ipv4Address ipv4Address, std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address>> & vec) [member function]
     cls.add_method('CheckDuplicates', 
                    'bool', 
                    [param('ns3::Ipv4Address', 'ipv4Address'), param('std::vector< ns3::Ipv4Address > &', 'vec')])
-    ## dsr-options.h (module 'dsr'): bool ns3::dsr::DsrOptions::ContainAddressAfter(ns3::Ipv4Address ipv4Address, ns3::Ipv4Address destAddress, std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address> > & nodeList) [member function]
+    ## dsr-options.h (module 'dsr'): bool ns3::dsr::DsrOptions::ContainAddressAfter(ns3::Ipv4Address ipv4Address, ns3::Ipv4Address destAddress, std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address>> & nodeList) [member function]
     cls.add_method('ContainAddressAfter', 
                    'bool', 
                    [param('ns3::Ipv4Address', 'ipv4Address'), param('ns3::Ipv4Address', 'destAddress'), param('std::vector< ns3::Ipv4Address > &', 'nodeList')])
-    ## dsr-options.h (module 'dsr'): std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address> > ns3::dsr::DsrOptions::CutRoute(ns3::Ipv4Address ipv4Address, std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address> > & nodeList) [member function]
+    ## dsr-options.h (module 'dsr'): std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address>> ns3::dsr::DsrOptions::CutRoute(ns3::Ipv4Address ipv4Address, std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address>> & nodeList) [member function]
     cls.add_method('CutRoute', 
                    'std::vector< ns3::Ipv4Address >', 
                    [param('ns3::Ipv4Address', 'ipv4Address'), param('std::vector< ns3::Ipv4Address > &', 'nodeList')])
@@ -12336,11 +12699,11 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## dsr-options.h (module 'dsr'): bool ns3::dsr::DsrOptions::IfDuplicates(std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address> > & vec, std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address> > & vec2) [member function]
+    ## dsr-options.h (module 'dsr'): bool ns3::dsr::DsrOptions::IfDuplicates(std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address>> & vec, std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address>> & vec2) [member function]
     cls.add_method('IfDuplicates', 
                    'bool', 
                    [param('std::vector< ns3::Ipv4Address > &', 'vec'), param('std::vector< ns3::Ipv4Address > &', 'vec2')])
-    ## dsr-options.h (module 'dsr'): void ns3::dsr::DsrOptions::PrintVector(std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address> > & vec) [member function]
+    ## dsr-options.h (module 'dsr'): void ns3::dsr::DsrOptions::PrintVector(std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address>> & vec) [member function]
     cls.add_method('PrintVector', 
                    'void', 
                    [param('std::vector< ns3::Ipv4Address > &', 'vec')])
@@ -12349,27 +12712,27 @@
                    'uint8_t', 
                    [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Ptr< ns3::Packet >', 'dsrP'), param('ns3::Ipv4Address', 'ipv4Address'), param('ns3::Ipv4Address', 'source'), param('ns3::Ipv4Header const &', 'ipv4Header'), param('uint8_t', 'protocol'), param('bool &', 'isPromisc'), param('ns3::Ipv4Address', 'promiscSource')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## dsr-options.h (module 'dsr'): void ns3::dsr::DsrOptions::RemoveDuplicates(std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address> > & vec) [member function]
+    ## dsr-options.h (module 'dsr'): void ns3::dsr::DsrOptions::RemoveDuplicates(std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address>> & vec) [member function]
     cls.add_method('RemoveDuplicates', 
                    'void', 
                    [param('std::vector< ns3::Ipv4Address > &', 'vec')])
-    ## dsr-options.h (module 'dsr'): bool ns3::dsr::DsrOptions::ReverseRoutes(std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address> > & vec) [member function]
+    ## dsr-options.h (module 'dsr'): bool ns3::dsr::DsrOptions::ReverseRoutes(std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address>> & vec) [member function]
     cls.add_method('ReverseRoutes', 
                    'bool', 
                    [param('std::vector< ns3::Ipv4Address > &', 'vec')])
-    ## dsr-options.h (module 'dsr'): ns3::Ipv4Address ns3::dsr::DsrOptions::ReverseSearchNextHop(ns3::Ipv4Address ipv4Address, std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address> > & vec) [member function]
+    ## dsr-options.h (module 'dsr'): ns3::Ipv4Address ns3::dsr::DsrOptions::ReverseSearchNextHop(ns3::Ipv4Address ipv4Address, std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address>> & vec) [member function]
     cls.add_method('ReverseSearchNextHop', 
                    'ns3::Ipv4Address', 
                    [param('ns3::Ipv4Address', 'ipv4Address'), param('std::vector< ns3::Ipv4Address > &', 'vec')])
-    ## dsr-options.h (module 'dsr'): ns3::Ipv4Address ns3::dsr::DsrOptions::ReverseSearchNextTwoHop(ns3::Ipv4Address ipv4Address, std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address> > & vec) [member function]
+    ## dsr-options.h (module 'dsr'): ns3::Ipv4Address ns3::dsr::DsrOptions::ReverseSearchNextTwoHop(ns3::Ipv4Address ipv4Address, std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address>> & vec) [member function]
     cls.add_method('ReverseSearchNextTwoHop', 
                    'ns3::Ipv4Address', 
                    [param('ns3::Ipv4Address', 'ipv4Address'), param('std::vector< ns3::Ipv4Address > &', 'vec')])
-    ## dsr-options.h (module 'dsr'): void ns3::dsr::DsrOptions::ScheduleReply(ns3::Ptr<ns3::Packet> & packet, std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address> > & nodeList, ns3::Ipv4Address & source, ns3::Ipv4Address & destination) [member function]
+    ## dsr-options.h (module 'dsr'): void ns3::dsr::DsrOptions::ScheduleReply(ns3::Ptr<ns3::Packet> & packet, std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address>> & nodeList, ns3::Ipv4Address & source, ns3::Ipv4Address & destination) [member function]
     cls.add_method('ScheduleReply', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet > &', 'packet'), param('std::vector< ns3::Ipv4Address > &', 'nodeList'), param('ns3::Ipv4Address &', 'source'), param('ns3::Ipv4Address &', 'destination')])
-    ## dsr-options.h (module 'dsr'): ns3::Ipv4Address ns3::dsr::DsrOptions::SearchNextHop(ns3::Ipv4Address ipv4Address, std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address> > & vec) [member function]
+    ## dsr-options.h (module 'dsr'): ns3::Ipv4Address ns3::dsr::DsrOptions::SearchNextHop(ns3::Ipv4Address ipv4Address, std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address>> & vec) [member function]
     cls.add_method('SearchNextHop', 
                    'ns3::Ipv4Address', 
                    [param('ns3::Ipv4Address', 'ipv4Address'), param('std::vector< ns3::Ipv4Address > &', 'vec')])
@@ -12576,7 +12939,7 @@
     cls.add_method('AddArpCache', 
                    'void', 
                    [param('ns3::Ptr< ns3::ArpCache >', 'a')])
-    ## dsr-rcache.h (module 'dsr'): void ns3::dsr::DsrRouteCache::AddNeighbor(std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address> > nodeList, ns3::Ipv4Address ownAddress, ns3::Time expire) [member function]
+    ## dsr-rcache.h (module 'dsr'): void ns3::dsr::DsrRouteCache::AddNeighbor(std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address>> nodeList, ns3::Ipv4Address ownAddress, ns3::Time expire) [member function]
     cls.add_method('AddNeighbor', 
                    'void', 
                    [param('std::vector< ns3::Ipv4Address >', 'nodeList'), param('ns3::Ipv4Address', 'ownAddress'), param('ns3::Time', 'expire')])
@@ -12612,7 +12975,7 @@
     cls.add_method('DeleteRoute', 
                    'bool', 
                    [param('ns3::Ipv4Address', 'dst')])
-    ## dsr-rcache.h (module 'dsr'): bool ns3::dsr::DsrRouteCache::FindSameRoute(ns3::dsr::DsrRouteCacheEntry & rt, std::list<ns3::dsr::DsrRouteCacheEntry, std::allocator<ns3::dsr::DsrRouteCacheEntry> > & rtVector) [member function]
+    ## dsr-rcache.h (module 'dsr'): bool ns3::dsr::DsrRouteCache::FindSameRoute(ns3::dsr::DsrRouteCacheEntry & rt, std::list<ns3::dsr::DsrRouteCacheEntry, std::allocator<ns3::dsr::DsrRouteCacheEntry>> & rtVector) [member function]
     cls.add_method('FindSameRoute', 
                    'bool', 
                    [param('ns3::dsr::DsrRouteCacheEntry &', 'rt'), param('std::list< ns3::dsr::DsrRouteCacheEntry > &', 'rtVector')])
@@ -12709,11 +13072,11 @@
     cls.add_method('Print', 
                    'void', 
                    [param('std::ostream &', 'os')])
-    ## dsr-rcache.h (module 'dsr'): void ns3::dsr::DsrRouteCache::PrintRouteVector(std::list<ns3::dsr::DsrRouteCacheEntry, std::allocator<ns3::dsr::DsrRouteCacheEntry> > route) [member function]
+    ## dsr-rcache.h (module 'dsr'): void ns3::dsr::DsrRouteCache::PrintRouteVector(std::list<ns3::dsr::DsrRouteCacheEntry, std::allocator<ns3::dsr::DsrRouteCacheEntry>> route) [member function]
     cls.add_method('PrintRouteVector', 
                    'void', 
                    [param('std::list< ns3::dsr::DsrRouteCacheEntry >', 'route')])
-    ## dsr-rcache.h (module 'dsr'): void ns3::dsr::DsrRouteCache::PrintVector(std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address> > & vec) [member function]
+    ## dsr-rcache.h (module 'dsr'): void ns3::dsr::DsrRouteCache::PrintVector(std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address>> & vec) [member function]
     cls.add_method('PrintVector', 
                    'void', 
                    [param('std::vector< ns3::Ipv4Address > &', 'vec')])
@@ -12737,7 +13100,7 @@
     cls.add_method('RebuildBestRouteTable', 
                    'void', 
                    [param('ns3::Ipv4Address', 'source')])
-    ## dsr-rcache.h (module 'dsr'): void ns3::dsr::DsrRouteCache::RemoveLastEntry(std::list<ns3::dsr::DsrRouteCacheEntry, std::allocator<ns3::dsr::DsrRouteCacheEntry> > & rtVector) [member function]
+    ## dsr-rcache.h (module 'dsr'): void ns3::dsr::DsrRouteCache::RemoveLastEntry(std::list<ns3::dsr::DsrRouteCacheEntry, std::allocator<ns3::dsr::DsrRouteCacheEntry>> & rtVector) [member function]
     cls.add_method('RemoveLastEntry', 
                    'void', 
                    [param('std::list< ns3::dsr::DsrRouteCacheEntry > &', 'rtVector')])
@@ -12793,7 +13156,7 @@
     cls.add_method('SetUseExtends', 
                    'void', 
                    [param('ns3::Time', 'useExtends')])
-    ## dsr-rcache.h (module 'dsr'): void ns3::dsr::DsrRouteCache::UpdateNeighbor(std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address> > nodeList, ns3::Time expire) [member function]
+    ## dsr-rcache.h (module 'dsr'): void ns3::dsr::DsrRouteCache::UpdateNeighbor(std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address>> nodeList, ns3::Time expire) [member function]
     cls.add_method('UpdateNeighbor', 
                    'void', 
                    [param('std::vector< ns3::Ipv4Address >', 'nodeList'), param('ns3::Time', 'expire')])
@@ -12985,7 +13348,7 @@
                    'ns3::IpL4Protocol::DownTargetCallback6', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## dsr-routing.h (module 'dsr'): std::vector<std::basic_string<char>, std::allocator<std::basic_string<char> > > ns3::dsr::DsrRouting::GetElementsFromContext(std::string context) [member function]
+    ## dsr-routing.h (module 'dsr'): std::vector<std::basic_string<char>, std::allocator<std::basic_string<char>>> ns3::dsr::DsrRouting::GetElementsFromContext(std::string context) [member function]
     cls.add_method('GetElementsFromContext', 
                    'std::vector< std::string >', 
                    [param('std::string', 'context')])
@@ -13083,7 +13446,7 @@
     cls.add_method('PassiveScheduleTimerExpire', 
                    'void', 
                    [param('ns3::dsr::DsrMaintainBuffEntry &', 'mb'), param('uint8_t', 'protocol')])
-    ## dsr-routing.h (module 'dsr'): void ns3::dsr::DsrRouting::PrintVector(std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address> > & vec) [member function]
+    ## dsr-routing.h (module 'dsr'): void ns3::dsr::DsrRouting::PrintVector(std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address>> & vec) [member function]
     cls.add_method('PrintVector', 
                    'void', 
                    [param('std::vector< ns3::Ipv4Address > &', 'vec')])
@@ -13105,7 +13468,7 @@
                    'ns3::IpL4Protocol::RxStatus', 
                    [param('ns3::Ptr< ns3::Packet >', 'p'), param('ns3::Ipv6Header const &', 'header'), param('ns3::Ptr< ns3::Ipv6Interface >', 'incomingInterface')], 
                    is_virtual=True)
-    ## dsr-routing.h (module 'dsr'): void ns3::dsr::DsrRouting::RouteRequestTimerExpire(ns3::Ptr<ns3::Packet> packet, std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address> > address, uint32_t requestId, uint8_t protocol) [member function]
+    ## dsr-routing.h (module 'dsr'): void ns3::dsr::DsrRouting::RouteRequestTimerExpire(ns3::Ptr<ns3::Packet> packet, std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address>> address, uint32_t requestId, uint8_t protocol) [member function]
     cls.add_method('RouteRequestTimerExpire', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet >', 'packet'), param('std::vector< ns3::Ipv4Address >', 'address'), param('uint32_t', 'requestId'), param('uint8_t', 'protocol')])
@@ -13137,7 +13500,7 @@
     cls.add_method('SchedulePassivePacketRetry', 
                    'void', 
                    [param('ns3::dsr::DsrMaintainBuffEntry &', 'mb'), param('uint8_t', 'protocol')])
-    ## dsr-routing.h (module 'dsr'): void ns3::dsr::DsrRouting::ScheduleRreqRetry(ns3::Ptr<ns3::Packet> packet, std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address> > address, bool nonProp, uint32_t requestId, uint8_t protocol) [member function]
+    ## dsr-routing.h (module 'dsr'): void ns3::dsr::DsrRouting::ScheduleRreqRetry(ns3::Ptr<ns3::Packet> packet, std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address>> address, bool nonProp, uint32_t requestId, uint8_t protocol) [member function]
     cls.add_method('ScheduleRreqRetry', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet >', 'packet'), param('std::vector< ns3::Ipv4Address >', 'address'), param('bool', 'nonProp'), param('uint32_t', 'requestId'), param('uint8_t', 'protocol')])
@@ -13145,7 +13508,7 @@
     cls.add_method('Scheduler', 
                    'void', 
                    [param('uint32_t', 'priority')])
-    ## dsr-routing.h (module 'dsr'): ns3::Ipv4Address ns3::dsr::DsrRouting::SearchNextHop(ns3::Ipv4Address ipv4Address, std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address> > & vec) [member function]
+    ## dsr-routing.h (module 'dsr'): ns3::Ipv4Address ns3::dsr::DsrRouting::SearchNextHop(ns3::Ipv4Address ipv4Address, std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address>> & vec) [member function]
     cls.add_method('SearchNextHop', 
                    'ns3::Ipv4Address', 
                    [param('ns3::Ipv4Address', 'ipv4Address'), param('std::vector< ns3::Ipv4Address > &', 'vec')])
@@ -13165,7 +13528,7 @@
     cls.add_method('SendErrorRequest', 
                    'void', 
                    [param('ns3::dsr::DsrOptionRerrUnreachHeader &', 'rerr'), param('uint8_t', 'protocol')])
-    ## dsr-routing.h (module 'dsr'): void ns3::dsr::DsrRouting::SendGratuitousReply(ns3::Ipv4Address replyTo, ns3::Ipv4Address replyFrom, std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address> > & nodeList, uint8_t protocol) [member function]
+    ## dsr-routing.h (module 'dsr'): void ns3::dsr::DsrRouting::SendGratuitousReply(ns3::Ipv4Address replyTo, ns3::Ipv4Address replyFrom, std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address>> & nodeList, uint8_t protocol) [member function]
     cls.add_method('SendGratuitousReply', 
                    'void', 
                    [param('ns3::Ipv4Address', 'replyTo'), param('ns3::Ipv4Address', 'replyFrom'), param('std::vector< ns3::Ipv4Address > &', 'nodeList'), param('uint8_t', 'protocol')])
@@ -13444,7 +13807,7 @@
     cls.add_method('Find', 
                    'bool', 
                    [param('ns3::Ipv4Address', 'dst')])
-    ## dsr-rsendbuff.h (module 'dsr'): std::vector<ns3::dsr::DsrSendBuffEntry, std::allocator<ns3::dsr::DsrSendBuffEntry> > & ns3::dsr::DsrSendBuffer::GetBuffer() [member function]
+    ## dsr-rsendbuff.h (module 'dsr'): std::vector<ns3::dsr::DsrSendBuffEntry, std::allocator<ns3::dsr::DsrSendBuffEntry>> & ns3::dsr::DsrSendBuffer::GetBuffer() [member function]
     cls.add_method('GetBuffer', 
                    'std::vector< ns3::dsr::DsrSendBuffEntry > &', 
                    [])
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/dsr/CMakeLists.txt ns-3.36/src/dsr/CMakeLists.txt
--- ns-3.35/src/dsr/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/dsr/CMakeLists.txt	2022-04-30 18:23:57.818733500 -0700
@@ -0,0 +1,36 @@
+build_lib(
+  LIBNAME dsr
+  SOURCE_FILES
+    helper/dsr-helper.cc
+    helper/dsr-main-helper.cc
+    model/dsr-errorbuff.cc
+    model/dsr-fs-header.cc
+    model/dsr-gratuitous-reply-table.cc
+    model/dsr-maintain-buff.cc
+    model/dsr-network-queue.cc
+    model/dsr-option-header.cc
+    model/dsr-options.cc
+    model/dsr-passive-buff.cc
+    model/dsr-rcache.cc
+    model/dsr-routing.cc
+    model/dsr-rreq-table.cc
+    model/dsr-rsendbuff.cc
+  HEADER_FILES
+    helper/dsr-helper.h
+    helper/dsr-main-helper.h
+    model/dsr-errorbuff.h
+    model/dsr-fs-header.h
+    model/dsr-gratuitous-reply-table.h
+    model/dsr-maintain-buff.h
+    model/dsr-network-queue.h
+    model/dsr-option-header.h
+    model/dsr-options.h
+    model/dsr-passive-buff.h
+    model/dsr-rcache.h
+    model/dsr-routing.h
+    model/dsr-rreq-table.h
+    model/dsr-rsendbuff.h
+  LIBRARIES_TO_LINK ${libinternet}
+                    ${libwifi}
+  TEST_SOURCES test/dsr-test-suite.cc
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/dsr/examples/CMakeLists.txt ns-3.36/src/dsr/examples/CMakeLists.txt
--- ns-3.35/src/dsr/examples/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/dsr/examples/CMakeLists.txt	2022-04-30 18:23:57.818733500 -0700
@@ -0,0 +1,13 @@
+build_lib_example(
+  NAME dsr
+  SOURCE_FILES dsr.cc
+  LIBRARIES_TO_LINK
+    ${libcore}
+    ${libnetwork}
+    ${libinternet}
+    ${libapplications}
+    ${libmobility}
+    ${libconfig-store}
+    ${libwifi}
+    ${libdsr}
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/dsr/examples/wscript ns-3.36/src/dsr/examples/wscript
--- ns-3.35/src/dsr/examples/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/dsr/examples/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,6 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    obj = bld.create_ns3_program('dsr', ['core', 'network', 'internet', 'applications', 'mobility', 'config-store', 'wifi', 'dsr'])
-    obj.source = 'dsr.cc'
-
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/dsr/model/dsr-options.cc ns-3.36/src/dsr/model/dsr-options.cc
--- ns-3.35/src/dsr/model/dsr-options.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/dsr/model/dsr-options.cc	2022-04-30 18:23:57.822733400 -0700
@@ -1450,7 +1450,7 @@
   /*
    * The error serialized size
    */
-  uint32_t rerrSize;
+  [[maybe_unused]] uint32_t rerrSize;
   NS_LOG_DEBUG ("The error type value here " << (uint32_t)errorType);
   if (errorType == 1) // unreachable ip address
     {
@@ -1494,7 +1494,6 @@
       p->RemoveHeader (rerrUnsupport);
       rerrSize = rerrUnsupport.GetSerializedSize ();
 
-      NS_UNUSED (rerrSize);
       /// \todo This is for the other two error options, not supporting for now
       // uint32_t serialized = DoSendError (p, rerrUnsupport, rerrSize, ipv4Address, protocol);
       uint32_t serialized = 0;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/dsr/model/dsr-rcache.h ns-3.36/src/dsr/model/dsr-rcache.h
--- ns-3.35/src/dsr/model/dsr-rcache.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/dsr/model/dsr-rcache.h	2022-04-30 18:23:57.822733400 -0700
@@ -389,6 +389,9 @@
   DsrRouteCache ();
   virtual ~DsrRouteCache ();
 
+  // Delete assignment operator to avoid misuse
+  DsrRouteCache & operator = (DsrRouteCache const &) = delete;
+
   /**
    * \brief Remove the aged route cache entries when the route cache is full
    * \param rtVector the route cache to scan.
@@ -742,11 +745,6 @@
   }
 
 private:
-  /**
-   * \brief assignment operator - defined but not implemented to avoid misuse.
-   * \return
-   */
-  DsrRouteCache & operator= (DsrRouteCache const &);
   DsrRouteCacheEntry::IP_VECTOR m_vector;               ///< The route vector to save the ip addresses for intermediate nodes.
   uint32_t m_maxCacheLen;                               ///< The maximum number of packets that we allow a routing protocol to buffer.
   Time     RouteCacheTimeout;                           ///< The maximum period of time that dsr is allowed to for an unused route.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/dsr/wscript ns-3.36/src/dsr/wscript
--- ns-3.35/src/dsr/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/dsr/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,56 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    module = bld.create_ns3_module('dsr', ['internet', 'wifi'])
-    module.includes = '.'
-    module.source = [
-        'model/dsr-routing.cc',
-        'model/dsr-options.cc',
-        'model/dsr-fs-header.cc',
-        'model/dsr-option-header.cc',
-        'model/dsr-maintain-buff.cc',
-        'model/dsr-passive-buff.cc',
-        'model/dsr-rsendbuff.cc',
-        'model/dsr-rcache.cc',
-        'model/dsr-rreq-table.cc',
-        'model/dsr-gratuitous-reply-table.cc',
-        'model/dsr-errorbuff.cc',
-        'model/dsr-network-queue.cc',
-        'helper/dsr-helper.cc',
-        'helper/dsr-main-helper.cc',
-        ]
-        
-    module_test = bld.create_ns3_module_test_library('dsr')
-    module_test.source = [
-        'test/dsr-test-suite.cc',
-        ]
-        
-    # Tests encapsulating example programs should be listed here
-    if (bld.env['ENABLE_EXAMPLES']):
-        module_test.source.extend([
-        #   'test/dsr-examples-test-suite.cc',
-            ])
-    
-    headers = bld(features='ns3header')
-    headers.module = 'dsr'
-    headers.source = [
-        'model/dsr-routing.h',
-        'model/dsr-options.h',
-        'model/dsr-fs-header.h',
-        'model/dsr-option-header.h',
-        'model/dsr-maintain-buff.h',
-        'model/dsr-passive-buff.h',
-        'model/dsr-rsendbuff.h',
-        'model/dsr-rcache.h',
-        'model/dsr-rreq-table.h',
-        'model/dsr-gratuitous-reply-table.h',
-        'model/dsr-errorbuff.h',
-        'model/dsr-network-queue.h',
-        'helper/dsr-helper.h',
-        'helper/dsr-main-helper.h',
-        ]
-
-    if (bld.env['ENABLE_EXAMPLES']):
-      bld.recurse('examples')
-
-    bld.ns3_python_bindings()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/energy/bindings/modulegen__gcc_ILP32.py ns-3.36/src/energy/bindings/modulegen__gcc_ILP32.py
--- ns-3.35/src/energy/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/energy/bindings/modulegen__gcc_ILP32.py	2022-04-30 18:23:57.838733400 -0700
@@ -80,6 +80,8 @@
     module.add_class('EnergySourceHelper', allow_subclassing=True)
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'], import_from_module='ns.core')
     ## hash.h (module 'core'): ns3::Hasher [class]
     module.add_class('Hasher', import_from_module='ns.core')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
@@ -208,23 +210,23 @@
     module.add_class('RandomVariableStream', import_from_module='ns.core', parent=root_module['ns3::Object'])
     ## random-variable-stream.h (module 'core'): ns3::SequentialRandomVariable [class]
     module.add_class('SequentialRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
     module.add_class('TraceSourceAccessor', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >'])
@@ -408,7 +410,7 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Time', 'ns3::Time', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )', 'ns3::TimePrinter')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )*', 'ns3::TimePrinter*')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )&', 'ns3::TimePrinter&')
@@ -3029,8 +3031,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -3253,14 +3255,14 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('>=')
     cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_unary_numeric_operator('-')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
     cls.add_constructor([])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(double const value) [constructor]
@@ -3279,6 +3281,8 @@
     cls.add_constructor([param('long unsigned int const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int const v) [constructor]
     cls.add_constructor([param('long long unsigned int const', 'v')])
+    ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int128_t const v) [constructor]
+    cls.add_constructor([param('int128_t const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t const hi, uint64_t const lo) [constructor]
     cls.add_constructor([param('int64_t const', 'hi'), param('uint64_t const', 'lo')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [constructor]
@@ -3580,65 +3584,65 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
@@ -5397,10 +5401,16 @@
     cls.add_method('ExtractNeighborIndex', 
                    'uint32_t', 
                    [param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetEpoch() const [member function]
+    cls.add_method('GetEpoch', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() const [member function]
     cls.add_method('GetRemainingBits', 
                    'uint32_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -5411,6 +5421,10 @@
                    'uint32_t', 
                    [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
+    ## nix-vector.h (module 'network'): void ns3::NixVector::SetEpoch(uint32_t epoch) [member function]
+    cls.add_method('SetEpoch', 
+                   'void', 
+                   [param('uint32_t', 'epoch')])
     return
 
 def register_Ns3Node_methods(root_module, cls):
@@ -5774,10 +5788,11 @@
                    'uint32_t', 
                    [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) const [member function]
     cls.add_method('SetNixVector', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')], 
+                   is_const=True)
     ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
     cls.add_method('ToString', 
                    'std::string', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/energy/bindings/modulegen__gcc_LP64.py ns-3.36/src/energy/bindings/modulegen__gcc_LP64.py
--- ns-3.35/src/energy/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/energy/bindings/modulegen__gcc_LP64.py	2022-04-30 18:23:57.838733400 -0700
@@ -80,6 +80,8 @@
     module.add_class('EnergySourceHelper', allow_subclassing=True)
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'], import_from_module='ns.core')
     ## hash.h (module 'core'): ns3::Hasher [class]
     module.add_class('Hasher', import_from_module='ns.core')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
@@ -208,23 +210,23 @@
     module.add_class('RandomVariableStream', import_from_module='ns.core', parent=root_module['ns3::Object'])
     ## random-variable-stream.h (module 'core'): ns3::SequentialRandomVariable [class]
     module.add_class('SequentialRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
     module.add_class('TraceSourceAccessor', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >'])
@@ -408,7 +410,7 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Time', 'ns3::Time', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )', 'ns3::TimePrinter')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )*', 'ns3::TimePrinter*')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )&', 'ns3::TimePrinter&')
@@ -3029,8 +3031,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -3253,14 +3255,14 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('>=')
     cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_unary_numeric_operator('-')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
     cls.add_constructor([])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(double const value) [constructor]
@@ -3279,6 +3281,8 @@
     cls.add_constructor([param('long unsigned int const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int const v) [constructor]
     cls.add_constructor([param('long long unsigned int const', 'v')])
+    ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int128_t const v) [constructor]
+    cls.add_constructor([param('int128_t const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t const hi, uint64_t const lo) [constructor]
     cls.add_constructor([param('int64_t const', 'hi'), param('uint64_t const', 'lo')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [constructor]
@@ -3580,65 +3584,65 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
@@ -5397,10 +5401,16 @@
     cls.add_method('ExtractNeighborIndex', 
                    'uint32_t', 
                    [param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetEpoch() const [member function]
+    cls.add_method('GetEpoch', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() const [member function]
     cls.add_method('GetRemainingBits', 
                    'uint32_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -5411,6 +5421,10 @@
                    'uint32_t', 
                    [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
+    ## nix-vector.h (module 'network'): void ns3::NixVector::SetEpoch(uint32_t epoch) [member function]
+    cls.add_method('SetEpoch', 
+                   'void', 
+                   [param('uint32_t', 'epoch')])
     return
 
 def register_Ns3Node_methods(root_module, cls):
@@ -5774,10 +5788,11 @@
                    'uint32_t', 
                    [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) const [member function]
     cls.add_method('SetNixVector', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')], 
+                   is_const=True)
     ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
     cls.add_method('ToString', 
                    'std::string', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/energy/CMakeLists.txt ns-3.36/src/energy/CMakeLists.txt
--- ns-3.35/src/energy/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/energy/CMakeLists.txt	2022-04-30 18:23:57.822733400 -0700
@@ -0,0 +1,42 @@
+build_lib(
+  LIBNAME energy
+  SOURCE_FILES
+    helper/basic-energy-harvester-helper.cc
+    helper/basic-energy-source-helper.cc
+    helper/energy-harvester-container.cc
+    helper/energy-harvester-helper.cc
+    helper/energy-model-helper.cc
+    helper/energy-source-container.cc
+    helper/li-ion-energy-source-helper.cc
+    helper/rv-battery-model-helper.cc
+    model/basic-energy-harvester.cc
+    model/basic-energy-source.cc
+    model/device-energy-model-container.cc
+    model/device-energy-model.cc
+    model/energy-harvester.cc
+    model/energy-source.cc
+    model/li-ion-energy-source.cc
+    model/rv-battery-model.cc
+    model/simple-device-energy-model.cc
+  HEADER_FILES
+    helper/basic-energy-harvester-helper.h
+    helper/basic-energy-source-helper.h
+    helper/energy-harvester-container.h
+    helper/energy-harvester-helper.h
+    helper/energy-model-helper.h
+    helper/energy-source-container.h
+    helper/li-ion-energy-source-helper.h
+    helper/rv-battery-model-helper.h
+    model/basic-energy-harvester.h
+    model/basic-energy-source.h
+    model/device-energy-model-container.h
+    model/device-energy-model.h
+    model/energy-harvester.h
+    model/energy-source.h
+    model/li-ion-energy-source.h
+    model/rv-battery-model.h
+    model/simple-device-energy-model.h
+  LIBRARIES_TO_LINK ${libnetwork}
+  TEST_SOURCES test/basic-energy-harvester-test.cc
+               test/li-ion-energy-source-test.cc
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/energy/examples/basic-energy-model-test.cc ns-3.36/src/energy/examples/basic-energy-model-test.cc
--- ns-3.35/src/energy/examples/basic-energy-model-test.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/energy/examples/basic-energy-model-test.cc	2022-04-30 18:23:57.838733400 -0700
@@ -64,11 +64,11 @@
   bool StateSwitchTest (WifiPhyState state);
 
 private:
-  double m_timeS;     // in seconds
-  double m_tolerance; // tolerance for power estimation
+  double m_timeS;     //!< Time in seconds
+  double m_tolerance; //!< Tolerance for power estimation
 
-  ObjectFactory m_energySource;
-  ObjectFactory m_deviceEnergyModel;
+  ObjectFactory m_energySource;       //!< Energy source factory
+  ObjectFactory m_deviceEnergyModel;  //!< Device energy model factory
 };
 
 BasicEnergyUpdateTest::BasicEnergyUpdateTest ()
@@ -281,11 +281,11 @@
   bool DepletionTestCase (double simTimeS, double updateIntervalS);
 
 private:
-  int m_numOfNodes;         // number of nodes in simulation
-  int m_callbackCount;      // counter for # of callbacks invoked
-  double m_simTimeS;        // maximum simulation time, in seconds
-  double m_timeStepS;       // simulation time step size, in seconds
-  double m_updateIntervalS; // update interval of each device model
+  int m_numOfNodes;         //!< number of nodes in simulation
+  int m_callbackCount;      //!< counter for # of callbacks invoked
+  double m_simTimeS;        //!< maximum simulation time, in seconds
+  double m_timeStepS;       //!< simulation time step size, in seconds
+  double m_updateIntervalS; //!< update interval of each device model
 
 };
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/energy/examples/CMakeLists.txt ns-3.36/src/energy/examples/CMakeLists.txt
--- ns-3.35/src/energy/examples/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/energy/examples/CMakeLists.txt	2022-04-30 18:23:57.838733400 -0700
@@ -0,0 +1,24 @@
+build_lib_example(
+  NAME li-ion-energy-source
+  SOURCE_FILES li-ion-energy-source.cc
+  LIBRARIES_TO_LINK ${libcore}
+                    ${libenergy}
+)
+
+build_lib_example(
+  NAME rv-battery-model-test
+  SOURCE_FILES rv-battery-model-test.cc
+  LIBRARIES_TO_LINK
+    ${libcore}
+    ${libenergy}
+    ${libwifi}
+)
+
+build_lib_example(
+  NAME basic-energy-model-test
+  SOURCE_FILES basic-energy-model-test.cc
+  LIBRARIES_TO_LINK
+    ${libcore}
+    ${libenergy}
+    ${libwifi}
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/energy/examples/rv-battery-model-test.cc ns-3.36/src/energy/examples/rv-battery-model-test.cc
--- ns-3.35/src/energy/examples/rv-battery-model-test.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/energy/examples/rv-battery-model-test.cc	2022-04-30 18:23:57.838733400 -0700
@@ -39,6 +39,8 @@
 NS_LOG_COMPONENT_DEFINE ("RvBatteryModelTestSuite");
 
 /**
+ * \ingroup energy
+ * 
  * This example was originally devised as a test, then it was converted
  * to an example.
  *
@@ -86,17 +88,18 @@
                          std::vector<Time> timeStamps,
                          Time expLifetime);
 
+  /// Load profile of the battery
   typedef struct LoadProfile
   {
-    std::vector<double> loads;
-    std::vector<Time> timeStamps;
-    Time itsyLifetime;
-    Time dualFoilLifeTime;
+    std::vector<double> loads;      //!< Loads container
+    std::vector<Time> timeStamps;   //!< Timestamps container
+    Time itsyLifetime;              //!< Expected lifetime for an ITSY battery
+    Time dualFoilLifeTime;          //!< Expected lifetime for a Dualfoil battery
   } LoadProfile;
 
-  std::vector<LoadProfile> m_loadProfiles;
-  double m_alpha;
-  double m_beta;
+  std::vector<LoadProfile> m_loadProfiles; //!< Load profiles
+  double m_alpha; //!< Alpha parameter of the battery model
+  double m_beta;  //!< Beta parameter of the battery model
 };
 
 BatteryLifetimeTest::BatteryLifetimeTest ()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/energy/examples/wscript ns-3.36/src/energy/examples/wscript
--- ns-3.35/src/energy/examples/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/energy/examples/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,14 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    if not bld.env['ENABLE_EXAMPLES']:
-        return;
-
-    obj = bld.create_ns3_program('li-ion-energy-source', ['core', 'energy'])
-    obj.source = 'li-ion-energy-source.cc'
-
-    obj = bld.create_ns3_program('rv-battery-model-test', ['core', 'energy', 'wifi'])
-    obj.source = 'rv-battery-model-test.cc'
-    
-    obj = bld.create_ns3_program('basic-energy-model-test', ['core', 'energy', 'wifi'])
-    obj.source = 'basic-energy-model-test.cc'
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/energy/helper/basic-energy-harvester-helper.h ns-3.36/src/energy/helper/basic-energy-harvester-helper.h
--- ns-3.35/src/energy/helper/basic-energy-harvester-helper.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/energy/helper/basic-energy-harvester-helper.h	2022-04-30 18:23:57.838733400 -0700
@@ -44,7 +44,7 @@
   virtual Ptr<EnergyHarvester> DoInstall (Ptr<EnergySource> source) const;
 
 private:
-  ObjectFactory m_basicEnergyHarvester;
+  ObjectFactory m_basicEnergyHarvester; //!< Energy source factory
 
 };
   
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/energy/helper/basic-energy-source-helper.h ns-3.36/src/energy/helper/basic-energy-source-helper.h
--- ns-3.35/src/energy/helper/basic-energy-source-helper.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/energy/helper/basic-energy-source-helper.h	2022-04-30 18:23:57.838733400 -0700
@@ -43,7 +43,7 @@
   virtual Ptr<EnergySource> DoInstall (Ptr<Node> node) const;
 
 private:
-  ObjectFactory m_basicEnergySource;
+  ObjectFactory m_basicEnergySource; //!< Energy source factory
 
 };
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/energy/helper/energy-harvester-container.h ns-3.36/src/energy/helper/energy-harvester-container.h
--- ns-3.35/src/energy/helper/energy-harvester-container.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/energy/helper/energy-harvester-container.h	2022-04-30 18:23:57.838733400 -0700
@@ -45,9 +45,14 @@
 class EnergyHarvesterContainer : public Object
 {
 public:
+  /// Const iterator for EnergyHarvester container
   typedef std::vector< Ptr<EnergyHarvester> >::const_iterator Iterator;
 
 public:
+  /**
+   * \brief Get the type ID.
+   * \return The object TypeId.
+   */
   static TypeId GetTypeId (void);
   /**
    * Creates an empty EnergyHarvesterContainer.
@@ -180,7 +185,7 @@
   virtual void DoInitialize (void);
 
 private:
-  std::vector< Ptr<EnergyHarvester> > m_harvesters;
+  std::vector< Ptr<EnergyHarvester> > m_harvesters; //!< Harvester container
 
 };
     
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/energy/helper/energy-harvester-helper.h ns-3.36/src/energy/helper/energy-harvester-helper.h
--- ns-3.35/src/energy/helper/energy-harvester-helper.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/energy/helper/energy-harvester-helper.h	2022-04-30 18:23:57.838733400 -0700
@@ -72,7 +72,7 @@
   EnergyHarvesterContainer Install (EnergySourceContainer sourceContainer) const;
 
   /**
-   * \param nodeName Name of node where EnergyHarvester will be installed.
+   * \param sourceName Name of node where EnergyHarvester will be installed.
    * \returns An EnergyHarvesterContainer which contains all the EnergyHarvesters.
    *
    * This function installs an EnergyHarvester onto a node.
@@ -81,7 +81,7 @@
 
 private:
   /**
-   * \param node Pointer to node where the energy harvester is to be installed.
+   * \param source Pointer to node where the energy harvester is to be installed.
    * \returns Pointer to the created EnergyHarvester.
    *
    * Child classes of EnergyHarvesterHelper only have to implement this function,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/energy/helper/energy-source-container.h ns-3.36/src/energy/helper/energy-source-container.h
--- ns-3.35/src/energy/helper/energy-source-container.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/energy/helper/energy-source-container.h	2022-04-30 18:23:57.838733400 -0700
@@ -44,9 +44,14 @@
 class EnergySourceContainer : public Object
 {
 public:
+  /// Const iterator for EnergySource container
   typedef std::vector< Ptr<EnergySource> >::const_iterator Iterator;
 
 public:
+  /**
+   * \brief Get the type ID.
+   * \return The object TypeId.
+   */
   static TypeId GetTypeId (void);
   /**
    * Creates an empty EnergySourceContainer.
@@ -173,7 +178,7 @@
   virtual void DoInitialize (void);
 
 private:
-  std::vector< Ptr<EnergySource> > m_sources;
+  std::vector< Ptr<EnergySource> > m_sources; //!< Energy source container
 
 };
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/energy/helper/li-ion-energy-source-helper.h ns-3.36/src/energy/helper/li-ion-energy-source-helper.h
--- ns-3.35/src/energy/helper/li-ion-energy-source-helper.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/energy/helper/li-ion-energy-source-helper.h	2022-04-30 18:23:57.838733400 -0700
@@ -45,7 +45,7 @@
   virtual Ptr<EnergySource> DoInstall (Ptr<Node> node) const;
 
 private:
-  ObjectFactory m_liIonEnergySource;
+  ObjectFactory m_liIonEnergySource; //!< LiIon Battery factory
 
 };
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/energy/helper/rv-battery-model-helper.h ns-3.36/src/energy/helper/rv-battery-model-helper.h
--- ns-3.35/src/energy/helper/rv-battery-model-helper.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/energy/helper/rv-battery-model-helper.h	2022-04-30 18:23:57.838733400 -0700
@@ -43,7 +43,7 @@
   virtual Ptr<EnergySource> DoInstall (Ptr<Node> node) const;
 
 private:
-  ObjectFactory m_rvBatteryModel;
+  ObjectFactory m_rvBatteryModel; //!< RV Battery factory
 
 };
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/energy/model/basic-energy-harvester.h ns-3.36/src/energy/model/basic-energy-harvester.h
--- ns-3.35/src/energy/model/basic-energy-harvester.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/energy/model/basic-energy-harvester.h	2022-04-30 18:23:57.838733400 -0700
@@ -48,6 +48,10 @@
 class BasicEnergyHarvester: public EnergyHarvester
 {
 public:
+  /**
+   * \brief Get the type ID.
+   * \return The object TypeId.
+   */
   static TypeId GetTypeId (void);
 
   BasicEnergyHarvester ();
@@ -115,14 +119,14 @@
 
 private:
 
-  Ptr<RandomVariableStream> m_harvestablePower; // Random variable for the harvestable power
+  Ptr<RandomVariableStream> m_harvestablePower; //!< Random variable for the harvestable power
 
-  TracedValue<double> m_harvestedPower;         // current harvested power, in Watt
-  TracedValue<double> m_totalEnergyHarvestedJ;  // total harvested energy, in Joule
+  TracedValue<double> m_harvestedPower;         //!< current harvested power, in Watt
+  TracedValue<double> m_totalEnergyHarvestedJ;  //!< total harvested energy, in Joule
 
-  EventId m_energyHarvestingUpdateEvent;        // energy harvesting event
-  Time m_lastHarvestingUpdateTime;              // last harvesting time
-  Time m_harvestedPowerUpdateInterval;          // harvestable energy update interval
+  EventId m_energyHarvestingUpdateEvent;        //!< energy harvesting event
+  Time m_lastHarvestingUpdateTime;              //!< last harvesting time
+  Time m_harvestedPowerUpdateInterval;          //!< harvestable energy update interval
 
 };
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/energy/model/basic-energy-source.h ns-3.36/src/energy/model/basic-energy-source.h
--- ns-3.35/src/energy/model/basic-energy-source.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/energy/model/basic-energy-source.h	2022-04-30 18:23:57.838733400 -0700
@@ -37,6 +37,10 @@
 class BasicEnergySource : public EnergySource
 {
 public:
+  /**
+   * \brief Get the type ID.
+   * \return The object TypeId.
+   */
   static TypeId GetTypeId (void);
   BasicEnergySource ();
   virtual ~BasicEnergySource ();
@@ -136,16 +140,19 @@
   void CalculateRemainingEnergy (void);
 
 private:
-  double m_initialEnergyJ;                // initial energy, in Joules
-  double m_supplyVoltageV;                // supply voltage, in Volts
-  double m_lowBatteryTh;                  // low battery threshold, as a fraction of the initial energy
-  double m_highBatteryTh;                 // high battery threshold, as a fraction of the initial energy
-  bool m_depleted;                        // set to true when the remaining energy goes below the low threshold,
-                                          // set to false again when the remaining energy exceeds the high threshold
-  TracedValue<double> m_remainingEnergyJ; // remaining energy, in Joules
-  EventId m_energyUpdateEvent;            // energy update event
-  Time m_lastUpdateTime;                  // last update time
-  Time m_energyUpdateInterval;            // energy update interval
+  double m_initialEnergyJ;                //!< initial energy, in Joules
+  double m_supplyVoltageV;                //!< supply voltage, in Volts
+  double m_lowBatteryTh;                  //!< low battery threshold, as a fraction of the initial energy
+  double m_highBatteryTh;                 //!< high battery threshold, as a fraction of the initial energy
+  /**
+   * set to true when the remaining energy goes below the low threshold,
+   * set to false again when the remaining energy exceeds the high threshold
+   */
+  bool m_depleted;
+  TracedValue<double> m_remainingEnergyJ; //!< remaining energy, in Joules
+  EventId m_energyUpdateEvent;            //!< energy update event
+  Time m_lastUpdateTime;                  //!< last update time
+  Time m_energyUpdateInterval;            //!< energy update interval
 
 };
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/energy/model/device-energy-model-container.h ns-3.36/src/energy/model/device-energy-model-container.h
--- ns-3.35/src/energy/model/device-energy-model-container.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/energy/model/device-energy-model-container.h	2022-04-30 18:23:57.838733400 -0700
@@ -43,6 +43,7 @@
 class DeviceEnergyModelContainer
 {
 public:
+  /// Const iterator of DeviceEnergyModel container
   typedef std::vector< Ptr<DeviceEnergyModel> >::const_iterator Iterator;
 
 public:
@@ -168,7 +169,7 @@
   void Clear (void);
 
 private:
-  std::vector< Ptr<DeviceEnergyModel> > m_models;
+  std::vector< Ptr<DeviceEnergyModel> > m_models; //!< Container of Energy models
 
 };
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/energy/model/device-energy-model.h ns-3.36/src/energy/model/device-energy-model.h
--- ns-3.35/src/energy/model/device-energy-model.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/energy/model/device-energy-model.h	2022-04-30 18:23:57.838733400 -0700
@@ -50,6 +50,10 @@
   typedef Callback<void, int> ChangeStateCallback;
 
 public:
+  /**
+   * \brief Get the type ID.
+   * \return The object TypeId.
+   */
   static TypeId GetTypeId (void);
   DeviceEnergyModel ();
   virtual ~DeviceEnergyModel ();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/energy/model/energy-harvester.h ns-3.36/src/energy/model/energy-harvester.h
--- ns-3.35/src/energy/model/energy-harvester.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/energy/model/energy-harvester.h	2022-04-30 18:23:57.838733400 -0700
@@ -36,21 +36,18 @@
 class EnergySource;
 
 /**
- * \defgroup energy Energy Models
- *
- */
-
-/**
  * \ingroup energy
  *
  * \brief Energy harvester base class.
- *
- *
  */
 
 class EnergyHarvester : public Object
 {
 public:
+  /**
+   * \brief Get the type ID.
+   * \return The object TypeId.
+   */
   static TypeId GetTypeId (void);
 
   EnergyHarvester ();
@@ -82,7 +79,7 @@
   void SetEnergySource (Ptr<EnergySource> source);
 
   /**
-   * \returns source Pointer to energy source connected to the harvester.
+   * \returns Pointer to energy source connected to the harvester.
    *
    * When a subclass needs to get access to the connected energy source,
    * it can invoke this method.
@@ -90,7 +87,7 @@
   Ptr<EnergySource> GetEnergySource (void) const;
 
   /**
-   * \returns power Amount of power currently provided by the harvester.
+   * \returns Amount of power currently provided by the harvester.
    *
    * This method is called by the energy source connected to the harvester in order
    * to determine the amount of energy that the harvester provided since last update.
@@ -111,6 +108,8 @@
    *
    * This method should be used to connect the logic behind the particular implementation
    * of the energy harvester with the energy source.
+   * 
+   * \returns Amount of power currently provided by the harvester.
    */
   virtual double DoGetPower (void) const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/energy/model/energy-source.h ns-3.36/src/energy/model/energy-source.h
--- ns-3.35/src/energy/model/energy-source.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/energy/model/energy-source.h	2022-04-30 18:23:57.838733400 -0700
@@ -38,7 +38,12 @@
   
 /**
  * \defgroup energy Energy Models
- *
+ */
+
+/**
+ * \ingroup energy
+ * \ingroup tests
+ * \defgroup energy-tests Energy module tests
  */
 
 /**
@@ -81,6 +86,10 @@
 class EnergySource : public Object
 {
 public:
+  /**
+   * \brief Get the type ID.
+   * \return The object TypeId.
+   */
   static TypeId GetTypeId (void);
   EnergySource ();
   virtual ~EnergySource ();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/energy/model/li-ion-energy-source.h ns-3.36/src/energy/model/li-ion-energy-source.h
--- ns-3.35/src/energy/model/li-ion-energy-source.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/energy/model/li-ion-energy-source.h	2022-04-30 18:23:57.838733400 -0700
@@ -72,6 +72,10 @@
 class LiIonEnergySource : public EnergySource
 {
 public:
+  /**
+   * \brief Get the type ID.
+   * \return The object TypeId.
+   */
   static TypeId GetTypeId (void);
   LiIonEnergySource ();
   virtual ~LiIonEnergySource ();
@@ -173,6 +177,7 @@
 
   /**
    *  \param current the actual discharge current value.
+   *  \return the cell voltage 
    *
    *  Get the cell voltage in function of the discharge current.
    *  It consider different discharge curves for different discharge currents
@@ -181,23 +186,23 @@
   double GetVoltage (double current) const;
 
 private:
-  double m_initialEnergyJ;                // initial energy, in Joules
-  TracedValue<double> m_remainingEnergyJ; // remaining energy, in Joules
-  double m_drainedCapacity;               // capacity drained from the cell, in Ah
-  double m_supplyVoltageV;                // actual voltage of the cell
-  double m_lowBatteryTh;                  // low battery threshold, as a fraction of the initial energy
-  EventId m_energyUpdateEvent;            // energy update event
-  Time m_lastUpdateTime;                  // last update time
-  Time m_energyUpdateInterval;            // energy update interval
-  double m_eFull;                         // initial voltage of the cell, in Volts
-  double m_eNom;                          // nominal voltage of the cell, in Volts
-  double m_eExp;                          // cell voltage at the end of the exponential zone, in Volts
-  double m_internalResistance;            // internal resistance of the cell, in Ohms
-  double m_qRated;                        // rated capacity of the cell, in Ah
-  double m_qNom;                          // cell capacity at the end of the nominal zone, in Ah
-  double m_qExp;                          // capacity value at the end of the exponential zone, in Ah
-  double m_typCurrent;                    // typical discharge current used to fit the curves
-  double m_minVoltTh;                     // minimum threshold voltage to consider the battery depleted
+  double m_initialEnergyJ;                //!< initial energy, in Joules
+  TracedValue<double> m_remainingEnergyJ; //!< remaining energy, in Joules
+  double m_drainedCapacity;               //!< capacity drained from the cell, in Ah
+  double m_supplyVoltageV;                //!< actual voltage of the cell
+  double m_lowBatteryTh;                  //!< low battery threshold, as a fraction of the initial energy
+  EventId m_energyUpdateEvent;            //!< energy update event
+  Time m_lastUpdateTime;                  //!< last update time
+  Time m_energyUpdateInterval;            //!< energy update interval
+  double m_eFull;                         //!< initial voltage of the cell, in Volts
+  double m_eNom;                          //!< nominal voltage of the cell, in Volts
+  double m_eExp;                          //!< cell voltage at the end of the exponential zone, in Volts
+  double m_internalResistance;            //!< internal resistance of the cell, in Ohms
+  double m_qRated;                        //!< rated capacity of the cell, in Ah
+  double m_qNom;                          //!< cell capacity at the end of the nominal zone, in Ah
+  double m_qExp;                          //!< capacity value at the end of the exponential zone, in Ah
+  double m_typCurrent;                    //!< typical discharge current used to fit the curves
+  double m_minVoltTh;                     //!< minimum threshold voltage to consider the battery depleted
 };
 
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/energy/model/rv-battery-model.h ns-3.36/src/energy/model/rv-battery-model.h
--- ns-3.35/src/energy/model/rv-battery-model.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/energy/model/rv-battery-model.h	2022-04-30 18:23:57.838733400 -0700
@@ -50,6 +50,10 @@
 class RvBatteryModel : public EnergySource
 {
 public:
+  /**
+   * \brief Get the type ID.
+   * \return The object TypeId.
+   */
   static TypeId GetTypeId (void);
   RvBatteryModel ();
   virtual ~RvBatteryModel ();
@@ -216,17 +220,17 @@
   double RvModelAFunction (Time t, Time sk, Time sk_1, double beta);
 
 private:
-  double m_openCircuitVoltage;
-  double m_cutoffVoltage;
-  double m_alpha; // alpha value of RV model, in Coulomb
-  double m_beta;  // beta value of RV model, in second^-1
-
-  double m_previousLoad;  // load value (total current) of previous sampling
-  std::vector<double> m_load;     // load profile
-  std::vector<Time> m_timeStamps; // time stamps of load profile
-  Time m_lastSampleTime;
+  double m_openCircuitVoltage; //!< Open circuit voltage (in Volts)
+  double m_cutoffVoltage;      //!< Cutoff voltage (in Volts)
+  double m_alpha; //!< alpha value of RV model, in Coulomb
+  double m_beta;  //!< beta value of RV model, in second^-1
+
+  double m_previousLoad;  //!< load value (total current) of previous sampling
+  std::vector<double> m_load;     //!< load profile
+  std::vector<Time> m_timeStamps; //!< time stamps of load profile
+  Time m_lastSampleTime;          //!< Last sample time
 
-  int m_numOfTerms; // # of terms for infinite sum in battery level estimation
+  int m_numOfTerms; //!< Number# of terms for infinite sum in battery level estimation
 
   /**
    * Battery level is defined as: output of Discharge function / alpha value
@@ -246,15 +250,16 @@
    */
   TracedValue<double> m_batteryLevel;
 
-  double m_lowBatteryTh;           // low battery threshold, as a fraction of the initial energy
+  double m_lowBatteryTh;           //!< low battery threshold, as a fraction of the initial energy
 
   /**
+   * Sampling interval.
    * (1 / sampling interval) = sampling frequency
    */
-  Time m_samplingInterval;
-  EventId m_currentSampleEvent;
+  Time m_samplingInterval; 
+  EventId m_currentSampleEvent; //!< Current sample event
 
-  TracedValue<Time> m_lifetime;   // time of death of the battery
+  TracedValue<Time> m_lifetime;   //!< time of death of the battery
 };
 
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/energy/model/simple-device-energy-model.h ns-3.36/src/energy/model/simple-device-energy-model.h
--- ns-3.35/src/energy/model/simple-device-energy-model.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/energy/model/simple-device-energy-model.h	2022-04-30 18:23:57.838733400 -0700
@@ -38,6 +38,10 @@
 class SimpleDeviceEnergyModel : public DeviceEnergyModel
 {
 public:
+  /**
+   * \brief Get the type ID.
+   * \return The object TypeId.
+   */
   static TypeId GetTypeId (void);
   SimpleDeviceEnergyModel ();
   virtual ~SimpleDeviceEnergyModel ();
@@ -128,11 +132,11 @@
    */
   virtual double DoGetCurrentA (void) const;
 
-  Time m_lastUpdateTime;
-  double m_actualCurrentA;
-  Ptr<EnergySource> m_source;
-  Ptr<Node> m_node;
-  TracedValue<double> m_totalEnergyConsumption;
+  Time m_lastUpdateTime;        //!< Last update time
+  double m_actualCurrentA;      //!< actual curred (in Ampere)
+  Ptr<EnergySource> m_source;   //!< Energy source
+  Ptr<Node> m_node;             //!< Node
+  TracedValue<double> m_totalEnergyConsumption; //!< Total energy consumption trace
 };
 
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/energy/test/basic-energy-harvester-test.cc ns-3.36/src/energy/test/basic-energy-harvester-test.cc
--- ns-3.35/src/energy/test/basic-energy-harvester-test.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/energy/test/basic-energy-harvester-test.cc	2022-04-30 18:23:57.838733400 -0700
@@ -33,6 +33,11 @@
 
 NS_LOG_COMPONENT_DEFINE ("BasicEnergyHarvesterTestSuite");
 
+/**
+ * \ingroup energy-tests
+ *
+ * \brief Energy Harvester Test
+ */
 class BasicEnergyHarvesterTestCase : public TestCase
 {
 public:
@@ -41,11 +46,11 @@
 
   void DoRun (void);
 
-  double m_timeS;     // in seconds
-  double m_tolerance; // tolerance for energy estimation
+  double m_timeS;     //!< Time, in seconds
+  double m_tolerance; //!< Tolerance for energy estimation
 
-  ObjectFactory m_energySource;
-  ObjectFactory m_energyHarvester;
+  ObjectFactory m_energySource; //!< Energy source factory
+  ObjectFactory m_energyHarvester; //!< Energy harvester factory
 
 };
 
@@ -118,6 +123,11 @@
 
 }
 
+/**
+ * \ingroup energy-tests
+ *
+ * \brief Energy harvester TestSuite
+ */
 class BasicEnergyHarvesterTestSuite : public TestSuite
 {
 public:
@@ -130,5 +140,5 @@
   AddTestCase (new BasicEnergyHarvesterTestCase, TestCase::QUICK);
 }
 
-// create an instance of the test suite
+/// create an instance of the test suite
 static BasicEnergyHarvesterTestSuite g_basicEnergyHarvesterTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/energy/test/li-ion-energy-source-test.cc ns-3.36/src/energy/test/li-ion-energy-source-test.cc
--- ns-3.35/src/energy/test/li-ion-energy-source-test.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/energy/test/li-ion-energy-source-test.cc	2022-04-30 18:23:57.838733400 -0700
@@ -29,6 +29,12 @@
 
 NS_LOG_COMPONENT_DEFINE ("LiIonEnergySourceTestSuite");
 
+
+/**
+ * \ingroup energy-tests
+ *
+ * \brief LiIon battery Test
+ */
 class LiIonEnergyTestCase : public TestCase
 {
 public:
@@ -37,7 +43,7 @@
 
   void DoRun (void);
 
-  Ptr<Node> m_node;
+  Ptr<Node> m_node; //!< Node to aggreagte the source to.
 };
 
 LiIonEnergyTestCase::LiIonEnergyTestCase ()
@@ -77,6 +83,11 @@
                              "Incorrect consumed energy!");
 }
 
+/**
+ * \ingroup energy-tests
+ *
+ * \brief LiIon battery TestSuite
+ */
 class LiIonEnergySourceTestSuite : public TestSuite
 {
 public:
@@ -89,5 +100,5 @@
   AddTestCase (new LiIonEnergyTestCase, TestCase::QUICK);
 }
 
-// create an instance of the test suite
+/// create an instance of the test suite
 static LiIonEnergySourceTestSuite g_liIonEnergySourceTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/energy/wscript ns-3.36/src/energy/wscript
--- ns-3.35/src/energy/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/energy/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,62 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    obj = bld.create_ns3_module('energy', ['network'])
-    obj.source = [
-        'model/energy-source.cc',
-        'model/basic-energy-source.cc',
-        'model/li-ion-energy-source.cc',
-        'model/rv-battery-model.cc',
-        'model/device-energy-model.cc',
-        'model/device-energy-model-container.cc',
-        'model/simple-device-energy-model.cc',
-        'model/energy-harvester.cc',
-        'model/basic-energy-harvester.cc',
-        'helper/energy-source-container.cc',
-        'helper/energy-model-helper.cc',
-        'helper/basic-energy-source-helper.cc',
-        'helper/li-ion-energy-source-helper.cc',
-        'helper/rv-battery-model-helper.cc',
-        'helper/energy-harvester-container.cc',
-        'helper/energy-harvester-helper.cc',
-        'helper/basic-energy-harvester-helper.cc',
-        ]
-
-    obj_test = bld.create_ns3_module_test_library('energy')
-    obj_test.source = [
-        'test/li-ion-energy-source-test.cc',
-        'test/basic-energy-harvester-test.cc',
-        ]
-
-    # Tests encapsulating example programs should be listed here
-    if (bld.env['ENABLE_EXAMPLES']):
-        obj_test.source.extend([
-        #   'test/energy-examples-test-suite.cc',
-            ])
-    
-    headers = bld(features='ns3header')
-    headers.module = 'energy'
-    headers.source = [
-        'model/energy-source.h',
-        'model/basic-energy-source.h',
-        'model/li-ion-energy-source.h',
-        'model/rv-battery-model.h',
-        'model/device-energy-model.h',
-        'model/device-energy-model-container.h',
-        'model/simple-device-energy-model.h',
-        'model/energy-harvester.h',
-        'model/basic-energy-harvester.h',
-        'helper/energy-source-container.h',
-        'helper/energy-model-helper.h',
-        'helper/basic-energy-source-helper.h',
-        'helper/li-ion-energy-source-helper.h',
-        'helper/rv-battery-model-helper.h',
-        'helper/energy-harvester-container.h',
-        'helper/energy-harvester-helper.h',
-        'helper/basic-energy-harvester-helper.h',
-        ]
-
-    if (bld.env['ENABLE_EXAMPLES']):
-      bld.recurse('examples')
-
-    bld.ns3_python_bindings()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/fd-net-device/bindings/modulegen_customizations.py ns-3.36/src/fd-net-device/bindings/modulegen_customizations.py
--- ns-3.35/src/fd-net-device/bindings/modulegen_customizations.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/fd-net-device/bindings/modulegen_customizations.py	2022-04-30 18:23:57.842733400 -0700
@@ -11,10 +11,6 @@
         if 'ns3::TapFdNetDeviceHelper'in root_module:
             root_module.classes.remove(root_module['ns3::TapFdNetDeviceHelper'])
 
-    if 'PlanetLabFdNetDevice' not in enabled_features:
-        if 'ns3::PlanetLabFdNetDeviceHelper'in root_module:
-            root_module.classes.remove(root_module['ns3::PlanetLabFdNetDeviceHelper'])
-
     if 'FdNetDevice' not in enabled_features:
         for clsname in ['FdNetDevice', 'FdNetDeviceHelper', 'FdNetDeviceFdReader']: 
             if 'ns3::%s' % clsname in root_module:
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/fd-net-device/bindings/modulegen__gcc_ILP32.py ns-3.36/src/fd-net-device/bindings/modulegen__gcc_ILP32.py
--- ns-3.35/src/fd-net-device/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/fd-net-device/bindings/modulegen__gcc_ILP32.py	2022-04-30 18:23:57.842733400 -0700
@@ -83,6 +83,8 @@
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::TraceSourceAccessor'])
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'], import_from_module='ns.core')
     ## hash.h (module 'core'): ns3::Hasher [class]
     module.add_class('Hasher', import_from_module='ns.core')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
@@ -213,29 +215,29 @@
     module.add_class('AggregateIterator', import_from_module='ns.core', outer_class=root_module['ns3::Object'])
     ## pcap-file-wrapper.h (module 'network'): ns3::PcapFileWrapper [class]
     module.add_class('PcapFileWrapper', import_from_module='ns.network', parent=root_module['ns3::Object'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::FdReader, ns3::empty, ns3::DefaultDeleter<ns3::FdReader> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::FdReader, ns3::empty, ns3::DefaultDeleter<ns3::FdReader>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::FdReader', 'ns3::empty', 'ns3::DefaultDeleter<ns3::FdReader>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::OutputStreamWrapper', 'ns3::empty', 'ns3::DefaultDeleter<ns3::OutputStreamWrapper>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SystemThread, ns3::empty, ns3::DefaultDeleter<ns3::SystemThread> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SystemThread, ns3::empty, ns3::DefaultDeleter<ns3::SystemThread>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::SystemThread', 'ns3::empty', 'ns3::DefaultDeleter<ns3::SystemThread>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
     ## system-thread.h (module 'core'): ns3::SystemThread [class]
     module.add_class('SystemThread', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::SystemThread, ns3::empty, ns3::DefaultDeleter<ns3::SystemThread> >'])
@@ -373,7 +375,7 @@
     module.add_enum('EncapsulationMode', ['DIX', 'LLC', 'DIXPI'], outer_class=root_module['ns3::FdNetDevice'])
     ## fd-net-device.h (module 'fd-net-device'): ns3::FdNetDeviceFdReader [class]
     module.add_class('FdNetDeviceFdReader', parent=root_module['ns3::FdReader'])
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )', 'ns3::TimePrinter')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )*', 'ns3::TimePrinter*')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )&', 'ns3::TimePrinter&')
@@ -3163,8 +3165,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -3387,14 +3389,14 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('>=')
     cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_unary_numeric_operator('-')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
     cls.add_constructor([])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(double const value) [constructor]
@@ -3413,6 +3415,8 @@
     cls.add_constructor([param('long unsigned int const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int const v) [constructor]
     cls.add_constructor([param('long long unsigned int const', 'v')])
+    ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int128_t const v) [constructor]
+    cls.add_constructor([param('int128_t const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t const hi, uint64_t const lo) [constructor]
     cls.add_constructor([param('int64_t const', 'hi'), param('uint64_t const', 'lo')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [constructor]
@@ -3722,86 +3726,86 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3FdReader_Ns3Empty_Ns3DefaultDeleter__lt__ns3FdReader__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::FdReader, ns3::empty, ns3::DefaultDeleter<ns3::FdReader> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::FdReader, ns3::empty, ns3::DefaultDeleter<ns3::FdReader>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::FdReader, ns3::empty, ns3::DefaultDeleter<ns3::FdReader> >::SimpleRefCount(ns3::SimpleRefCount<ns3::FdReader, ns3::empty, ns3::DefaultDeleter<ns3::FdReader> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::FdReader, ns3::empty, ns3::DefaultDeleter<ns3::FdReader>>::SimpleRefCount(ns3::SimpleRefCount<ns3::FdReader, ns3::empty, ns3::DefaultDeleter<ns3::FdReader>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::FdReader, ns3::empty, ns3::DefaultDeleter< ns3::FdReader > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3OutputStreamWrapper_Ns3Empty_Ns3DefaultDeleter__lt__ns3OutputStreamWrapper__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter< ns3::OutputStreamWrapper > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3SystemThread_Ns3Empty_Ns3DefaultDeleter__lt__ns3SystemThread__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SystemThread, ns3::empty, ns3::DefaultDeleter<ns3::SystemThread> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SystemThread, ns3::empty, ns3::DefaultDeleter<ns3::SystemThread>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SystemThread, ns3::empty, ns3::DefaultDeleter<ns3::SystemThread> >::SimpleRefCount(ns3::SimpleRefCount<ns3::SystemThread, ns3::empty, ns3::DefaultDeleter<ns3::SystemThread> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SystemThread, ns3::empty, ns3::DefaultDeleter<ns3::SystemThread>>::SimpleRefCount(ns3::SimpleRefCount<ns3::SystemThread, ns3::empty, ns3::DefaultDeleter<ns3::SystemThread>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::SystemThread, ns3::empty, ns3::DefaultDeleter< ns3::SystemThread > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
@@ -4652,10 +4656,16 @@
     cls.add_method('ExtractNeighborIndex', 
                    'uint32_t', 
                    [param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetEpoch() const [member function]
+    cls.add_method('GetEpoch', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() const [member function]
     cls.add_method('GetRemainingBits', 
                    'uint32_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -4666,6 +4676,10 @@
                    'uint32_t', 
                    [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
+    ## nix-vector.h (module 'network'): void ns3::NixVector::SetEpoch(uint32_t epoch) [member function]
+    cls.add_method('SetEpoch', 
+                   'void', 
+                   [param('uint32_t', 'epoch')])
     return
 
 def register_Ns3Node_methods(root_module, cls):
@@ -4997,10 +5011,11 @@
                    'uint32_t', 
                    [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) const [member function]
     cls.add_method('SetNixVector', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')], 
+                   is_const=True)
     ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
     cls.add_method('ToString', 
                    'std::string', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/fd-net-device/bindings/modulegen__gcc_LP64.py ns-3.36/src/fd-net-device/bindings/modulegen__gcc_LP64.py
--- ns-3.35/src/fd-net-device/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/fd-net-device/bindings/modulegen__gcc_LP64.py	2022-04-30 18:23:57.842733400 -0700
@@ -83,6 +83,8 @@
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::TraceSourceAccessor'])
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'], import_from_module='ns.core')
     ## hash.h (module 'core'): ns3::Hasher [class]
     module.add_class('Hasher', import_from_module='ns.core')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
@@ -213,29 +215,29 @@
     module.add_class('AggregateIterator', import_from_module='ns.core', outer_class=root_module['ns3::Object'])
     ## pcap-file-wrapper.h (module 'network'): ns3::PcapFileWrapper [class]
     module.add_class('PcapFileWrapper', import_from_module='ns.network', parent=root_module['ns3::Object'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::FdReader, ns3::empty, ns3::DefaultDeleter<ns3::FdReader> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::FdReader, ns3::empty, ns3::DefaultDeleter<ns3::FdReader>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::FdReader', 'ns3::empty', 'ns3::DefaultDeleter<ns3::FdReader>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::OutputStreamWrapper', 'ns3::empty', 'ns3::DefaultDeleter<ns3::OutputStreamWrapper>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SystemThread, ns3::empty, ns3::DefaultDeleter<ns3::SystemThread> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SystemThread, ns3::empty, ns3::DefaultDeleter<ns3::SystemThread>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::SystemThread', 'ns3::empty', 'ns3::DefaultDeleter<ns3::SystemThread>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
     ## system-thread.h (module 'core'): ns3::SystemThread [class]
     module.add_class('SystemThread', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::SystemThread, ns3::empty, ns3::DefaultDeleter<ns3::SystemThread> >'])
@@ -373,7 +375,7 @@
     module.add_enum('EncapsulationMode', ['DIX', 'LLC', 'DIXPI'], outer_class=root_module['ns3::FdNetDevice'])
     ## fd-net-device.h (module 'fd-net-device'): ns3::FdNetDeviceFdReader [class]
     module.add_class('FdNetDeviceFdReader', parent=root_module['ns3::FdReader'])
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )', 'ns3::TimePrinter')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )*', 'ns3::TimePrinter*')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )&', 'ns3::TimePrinter&')
@@ -3163,8 +3165,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -3387,14 +3389,14 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('>=')
     cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_unary_numeric_operator('-')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
     cls.add_constructor([])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(double const value) [constructor]
@@ -3413,6 +3415,8 @@
     cls.add_constructor([param('long unsigned int const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int const v) [constructor]
     cls.add_constructor([param('long long unsigned int const', 'v')])
+    ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int128_t const v) [constructor]
+    cls.add_constructor([param('int128_t const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t const hi, uint64_t const lo) [constructor]
     cls.add_constructor([param('int64_t const', 'hi'), param('uint64_t const', 'lo')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [constructor]
@@ -3722,86 +3726,86 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3FdReader_Ns3Empty_Ns3DefaultDeleter__lt__ns3FdReader__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::FdReader, ns3::empty, ns3::DefaultDeleter<ns3::FdReader> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::FdReader, ns3::empty, ns3::DefaultDeleter<ns3::FdReader>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::FdReader, ns3::empty, ns3::DefaultDeleter<ns3::FdReader> >::SimpleRefCount(ns3::SimpleRefCount<ns3::FdReader, ns3::empty, ns3::DefaultDeleter<ns3::FdReader> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::FdReader, ns3::empty, ns3::DefaultDeleter<ns3::FdReader>>::SimpleRefCount(ns3::SimpleRefCount<ns3::FdReader, ns3::empty, ns3::DefaultDeleter<ns3::FdReader>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::FdReader, ns3::empty, ns3::DefaultDeleter< ns3::FdReader > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3OutputStreamWrapper_Ns3Empty_Ns3DefaultDeleter__lt__ns3OutputStreamWrapper__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter< ns3::OutputStreamWrapper > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3SystemThread_Ns3Empty_Ns3DefaultDeleter__lt__ns3SystemThread__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SystemThread, ns3::empty, ns3::DefaultDeleter<ns3::SystemThread> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SystemThread, ns3::empty, ns3::DefaultDeleter<ns3::SystemThread>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SystemThread, ns3::empty, ns3::DefaultDeleter<ns3::SystemThread> >::SimpleRefCount(ns3::SimpleRefCount<ns3::SystemThread, ns3::empty, ns3::DefaultDeleter<ns3::SystemThread> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SystemThread, ns3::empty, ns3::DefaultDeleter<ns3::SystemThread>>::SimpleRefCount(ns3::SimpleRefCount<ns3::SystemThread, ns3::empty, ns3::DefaultDeleter<ns3::SystemThread>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::SystemThread, ns3::empty, ns3::DefaultDeleter< ns3::SystemThread > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
@@ -4652,10 +4656,16 @@
     cls.add_method('ExtractNeighborIndex', 
                    'uint32_t', 
                    [param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetEpoch() const [member function]
+    cls.add_method('GetEpoch', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() const [member function]
     cls.add_method('GetRemainingBits', 
                    'uint32_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -4666,6 +4676,10 @@
                    'uint32_t', 
                    [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
+    ## nix-vector.h (module 'network'): void ns3::NixVector::SetEpoch(uint32_t epoch) [member function]
+    cls.add_method('SetEpoch', 
+                   'void', 
+                   [param('uint32_t', 'epoch')])
     return
 
 def register_Ns3Node_methods(root_module, cls):
@@ -4997,10 +5011,11 @@
                    'uint32_t', 
                    [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) const [member function]
     cls.add_method('SetNixVector', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')], 
+                   is_const=True)
     ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
     cls.add_method('ToString', 
                    'std::string', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/fd-net-device/CMakeLists.txt ns-3.36/src/fd-net-device/CMakeLists.txt
--- ns-3.35/src/fd-net-device/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/fd-net-device/CMakeLists.txt	2022-04-30 18:23:57.838733400 -0700
@@ -0,0 +1,332 @@
+option(
+  NS3_DPDK
+  "Enable fd-net-device DPDK features"
+  OFF
+)
+
+set(module_enabled_features) # modulegen_customizations consumes this list
+
+mark_as_advanced(ENABLE_THREADING)
+set(ENABLE_THREADING
+    ${HAVE_PTHREAD_H}
+)
+
+check_include_file_cxx(
+  net/ethernet.h
+  HAVE_NET_ETHERNET_H
+)
+check_include_file_cxx(
+  netpacket/packet.h
+  HAVE_PACKET_H
+)
+check_include_file_cxx(
+  net/if.h
+  HAVE_IF_NETS_H
+)
+check_include_file_cxx(
+  linux/if_tun.h
+  HAVE_IF_TUN_H
+)
+check_include_file_cxx(
+  net/netmap_user.h
+  HAVE_NETMAP_USER_H
+)
+check_include_file_cxx(
+  sys/ioctl.h
+  HAVE_SYS_IOCTL_H
+)
+
+include(FindPkgConfig)
+if(PKG_CONFIG_FOUND)
+  pkg_check_modules(
+    DPDK
+    libdpdk
+  )
+endif()
+
+mark_as_advanced(
+  ENABLE_FDNETDEV
+  ENABLE_DPDKDEVNET
+  ENABLE_TAPNETDEV
+  ENABLE_EMUNETDEV
+  ENABLE_NETMAP_EMU
+)
+set(ENABLE_FDNETDEV
+    False
+    CACHE INTERNAL
+          ""
+)
+set(ENABLE_DPDKDEVNET
+    False
+    CACHE INTERNAL
+          ""
+)
+set(ENABLE_TAPNETDEV
+    False
+    CACHE INTERNAL
+          ""
+)
+set(ENABLE_EMUNETDEV
+    False
+    CACHE INTERNAL
+          ""
+)
+set(ENABLE_NETMAP_EMU
+    False
+    CACHE INTERNAL
+          ""
+)
+
+if(HAVE_NET_ETHERNET_H)
+  set(ENABLE_FDNETDEV
+      True
+      CACHE INTERNAL
+            ""
+  )
+
+  if(${NS3_DPDK})
+    if(PKG_CONFIG_FOUND)
+      if(DPDK_FOUND)
+
+        set(ENABLE_DPDKDEVNET
+            True
+            CACHE INTERNAL
+                  ""
+        )
+      else()
+        message(FATAL_ERROR "DPDK not found.")
+      endif()
+    else()
+      message(FATAL_ERROR "Pkgconfig was not found and is required by DPDK.")
+    endif()
+  endif()
+
+  if(HAVE_IF_NETS_H
+     AND HAVE_IF_TUN_H
+     AND HAVE_SYS_IOCTL_H
+     AND ${ENABLE_TAP}
+     AND ${ENABLE_REALTIME}
+     AND ${ENABLE_EMU}
+  )
+    set(ENABLE_TAPNETDEV
+        True
+        CACHE INTERNAL
+              ""
+    )
+  endif()
+
+  if(HAVE_IF_NETS_H
+     AND HAVE_PACKET_H
+     AND HAVE_SYS_IOCTL_H
+     AND ${ENABLE_EMU}
+  )
+    set(ENABLE_EMUNETDEV
+        True
+        CACHE INTERNAL
+              ""
+    )
+    add_definitions(-DHAVE_PACKET_H)
+  endif()
+
+  if(HAVE_IF_NETS_H
+     AND HAVE_NETMAP_USER_H
+     AND HAVE_SYS_IOCTL_H
+  )
+    set(ENABLE_NETMAP_EMU
+        True
+        CACHE INTERNAL
+              ""
+    )
+    add_definitions(-DHAVE_NETMAP_USER_H)
+  endif()
+endif()
+
+if(${ENABLE_FDNETDEV})
+  set(fd-net-device_creators)
+  list(
+    APPEND
+    module_enabled_features
+    FdNetDevice
+  )
+
+  if(${ENABLE_EMUNETDEV})
+    set(emu_sources
+        helper/emu-fd-net-device-helper.cc
+    )
+    set(emu_headers
+        helper/emu-fd-net-device-helper.h
+    )
+
+    add_executable(
+      raw-sock-creator
+      helper/creator-utils.cc
+      helper/encode-decode.cc
+      helper/raw-sock-creator.cc
+    )
+    add_definitions(
+      -DRAW_SOCK_CREATOR="${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/src/fd-net-device/ns${NS3_VER}-raw-sock-creator${build_profile_suffix}"
+    )
+    set_runtime_outputdirectory(
+      raw-sock-creator
+      ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/src/fd-net-device/
+      ""
+    )
+
+    list(
+      APPEND
+      fd-net-device_creators
+      raw-sock-creator
+    )
+    list(
+      APPEND
+      module_enabled_features
+      EmuFdNetDevice
+    )
+  endif()
+
+  if(${ENABLE_TAPNETDEV})
+    set(tap_sources
+        helper/tap-fd-net-device-helper.cc
+    )
+    set(tap_headers
+        helper/tap-fd-net-device-helper.h
+    )
+
+    add_executable(
+      tap-device-creator
+      helper/creator-utils.cc
+      helper/encode-decode.cc
+      helper/tap-device-creator.cc
+    )
+    add_definitions(
+      -DTAP_DEV_CREATOR="${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/src/fd-net-device/ns${NS3_VER}-tap-device-creator${build_profile_suffix}"
+    )
+    set_runtime_outputdirectory(
+      tap-device-creator
+      ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/src/fd-net-device/
+      ""
+    )
+
+    list(
+      APPEND
+      fd-net-device_creators
+      tap-device-creator
+    )
+    list(
+      APPEND
+      module_enabled_features
+      TapFdNetDevice
+    )
+  endif()
+
+  if(${ENABLE_NETMAP_EMU})
+    set(netmap_sources
+        helper/netmap-net-device-helper.cc
+        model/netmap-net-device.cc
+    )
+    set(netmap_headers
+        helper/netmap-net-device-helper.h
+        model/netmap-net-device.h
+    )
+
+    add_executable(
+      netmap-device-creator
+      helper/creator-utils.cc
+      helper/encode-decode.cc
+      helper/netmap-device-creator.cc
+    )
+    add_definitions(
+      -DNETMAP_DEV_CREATOR="${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/src/fd-net-device/ns${NS3_VER}-netmap-device-creator${build_profile_suffix}"
+    )
+    set_runtime_outputdirectory(
+      netmap-device-creator
+      ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/src/fd-net-device/
+      ""
+    )
+
+    list(
+      APPEND
+      fd-net-device_creators
+      netmap-device-creator
+    )
+  endif()
+
+  if(${ENABLE_DPDKDEVNET})
+    set(dpdk_sources
+        model/dpdk-net-device.cc
+        helper/dpdk-net-device-helper.cc
+    )
+    set(dpdk_headers
+        model/dpdk-net-device.h
+        helper/dpdk-net-device-helper.h
+    )
+    add_definitions(-DHAVE_DPDK_USER_H)
+    set(dpdk_libraries
+        ${LIB_AS_NEEDED_PRE}
+        ${DPDK_LIBRARIES}
+        ${LIB_AS_NEEDED_POST}
+    )
+  endif()
+
+  set(source_files
+      ${tap_sources}
+      ${emu_sources}
+      ${netmap_sources}
+      ${dpdk_sources}
+      helper/creator-utils.cc
+      helper/encode-decode.cc
+      helper/fd-net-device-helper.cc
+      model/fd-net-device.cc
+  )
+
+  set(header_files
+      ${tap_headers}
+      ${emu_headers}
+      ${netmap_headers}
+      ${dpdk_headers}
+      model/fd-net-device.h
+      helper/fd-net-device-helper.h
+  )
+
+  set(libraries_to_link
+      ${libnetwork}
+      ${dpdk_libraries}
+  )
+
+  set(test_sources)
+
+  build_lib(
+    LIBNAME fd-net-device
+    SOURCE_FILES ${source_files}
+    HEADER_FILES ${header_files}
+    LIBRARIES_TO_LINK ${libraries_to_link}
+    TEST_SOURCES ${test_sources}
+    MODULE_ENABLED_FEATURES ${module_enabled_features}
+  )
+
+  if(${ENABLE_DPDKDEVNET})
+    target_include_directories(
+      ${libfd-net-device-obj}
+      PRIVATE ${DPDK_INCLUDE_DIRS}
+    )
+    target_compile_options(
+      ${libfd-net-device-obj}
+      PRIVATE ${DPDK_CFLAGS}
+    )
+  endif()
+
+  list(
+    LENGTH
+    fd-net-device_creators
+    num_creators
+  )
+  if(${num_creators}
+     GREATER
+     0
+  )
+    add_dependencies(
+      ${libfd-net-device}
+      ${fd-net-device_creators}
+    )
+  endif()
+endif()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/fd-net-device/doc/dpdk-net-device.rst ns-3.36/src/fd-net-device/doc/dpdk-net-device.rst
--- ns-3.35/src/fd-net-device/doc/dpdk-net-device.rst	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/fd-net-device/doc/dpdk-net-device.rst	2022-04-30 18:23:57.842733400 -0700
@@ -148,7 +148,7 @@
  export RTE_SDK=/home/username/dpdk/dpdk-stable-19.11.1
  export RTE_TARGET=x86_64-native-linuxapp-gcc
 
-(Note: In case DPDK is moved, ns-3 needs to be reconfigured using ``./waf configure [options]``)
+(Note: In case DPDK is moved, ns-3 needs to be reconfigured using ``./ns3 configure [options]``)
 
 It is advisable that you export these variables in ``.bashrc`` or similar for reusability.
 
@@ -231,7 +231,7 @@
 Usage
 *****
 
-The status of DPDK support is shown in the output of ``./waf configure``.  If
+The status of DPDK support is shown in the output of ``./ns3 configure``.  If
 it is found, a user should see:
 
 .. sourcecode:: text
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/fd-net-device/doc/fd-net-device.rst ns-3.36/src/fd-net-device/doc/fd-net-device.rst
--- ns-3.35/src/fd-net-device/doc/fd-net-device.rst	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/fd-net-device/doc/fd-net-device.rst	2022-04-30 18:23:57.842733400 -0700
@@ -18,15 +18,12 @@
 and |ns3| traffic is consumed. 
 
 Different mechanisms to associate a simulation to external traffic can 
-be provided through helper classes.  Three specific helpers are provided:
+be provided through helper classes.  Two specific helpers are provided:
 
 * EmuFdNetDeviceHelper (to associate the |ns3| device with a physical device
   in the host machine)
 * TapFdNetDeviceHelper (to associate the ns-3 device with the file descriptor 
   from a tap device in the host machine)
-* PlanteLabFdNetDeviceHelper (to automate the creation of tap devices in 
-  PlanetLab nodes, enabling |ns3| simulations that can send and receive 
-  traffic though the Internet using PlanetLab resource.
 
 Model Description
 *****************
@@ -143,7 +140,7 @@
 limitations.  For instance, threading, real-time simulation mode, and the
 ability to create TUN/TAP devices are prerequisites to using the
 provided helpers.  Support for these modes can be found in the output
-of the ``waf configure`` step, e.g.:
+of the ``ns3 configure`` step, e.g.:
 
 .. sourcecode:: text
 
@@ -196,7 +193,7 @@
 root, we provide a small "creator" program that runs as root and does any
 required high-permission sockets work. The easiest way to set the right 
 privileges for the "creator" programs, is by enabling the ``--enable-sudo``
-flag when performing ``waf configure``.
+flag when performing ``ns3 configure``.
 
 We do a similar thing for both the ``Emu`` and the ``Tap`` devices.  The
 high-level view is that the ``CreateFileDescriptor`` method creates a local interprocess
@@ -377,80 +374,6 @@
   helper.Install (node);
 
 
-PlanetLabFdNetDeviceHelper
-##########################
-
-PlanetLab is a world wide distributed network testbed composed of 
-nodes connected to the Internet. 
-Running ns-3 simulations in PlanetLab nodes using the 
-PlanetLabFdNetDeviceHelper allows to send simulated traffic generated by
-ns-3 directly to the Internet. This setup can be useful to validate 
-ns-3 Internet protocols or other future protocols implemented in ns-3.
-
-To run experiments using PlanetLab nodes it is required to have a 
-PlanetLab account. 
-Only members of PlanetLab partner institutions can obtain such accounts
-( for more information visit http://www.planet-lab.org/ or 
-http://www.planet-lab.eu ).
-Once the account is obtained, a PlanetLab `slice` must be requested in 
-order to conduct experiments. 
-A slice represents an experiment unit related to a group of PlanetLab users, 
-and can be associated to virtual machines in different PlanetLab nodes.
-Slices can also be customized by adding configuration tags to it 
-(this is done by PlanetLab administrators).
-
-The PlanetLabFdNetDeviceHelper creates TAP devices on PlanetLab nodes
-using specific PlanetLab mechanisms (i.e. the vsys system), and 
-associates the TAP device to a FdNetDevice in ns-3. 
-The functionality provided by this helper is similar to that provided
-by the FdTapNetDeviceHelper, except that the underlying mechanisms
-to create the TAP device are different.
-
-.. sourcecode:: text
-
- +-------------------------------------+    
- |         PlanetLab  host             |
- +-------------------------------------+    
- |    ns-3 simulation   |              |                       
- +----------------------+              |    
- |       ns-3 Node      |              |   
- |  +----------------+  |              |   
- |  |    ns-3 TCP    |  |              |   
- |  +----------------+  |              |   
- |  |    ns-3 IP     |  |              |   
- |  +----------------+  |              |   
- |  |   FdNetDevice  |  |              |  
- |--+----------------+--+    +------+  |
- |       | TAP  |            | eth0 |  | 
- |       +------+            +------+  |
- |     192.168.0.1               |     |
- +-------------------------------|-----+ 
-                                 |
-                                 |
-                                 ------------ (Internet) -----                             
-
-
-In order to be able to assign private IPv4 addresses to the TAP devices, 
-account holders must request the `vsys_vnet` tag to be added to their slice
-by PlanetLab administrators. 
-The vsys_vnet tag is associated to private network segment and only addresses
-from this segment can be used in experiments.
-
-The syntax used to create a TAP device with this helper is similar to that
-used for the previously described helpers:
-
-::
-
-  PlanetLabFdNetDeviceHelper helper;
-  helper.SetTapIpAddress (tapIp);
-  helper.SetTapMask (tapMask);
-  ...
-  helper.Install (node);
-
-
-PlanetLab nodes have a Fedora based distribution, so ns-3 can be installed
-following the instructions for ns-3 Linux installation.
-
 Attributes
 ==========
 
@@ -518,8 +441,6 @@
   traffic over a real channel.
 * ``fd-emu-udp-echo.cc``: This example uses the EmuFdNetDeviceHelper to send UDP
   traffic over a real channel.
-* ``fd-planetlab-ping.cc``: This example shows how to set up an experiment to send
-  ICMP traffic from a PlanetLab node to the Internet.
 * ``fd-tap-ping.cc``: This example uses the TapFdNetDeviceHelper to send ICMP
   traffic over a real channel.
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/fd-net-device/doc/netmap-net-device.rst ns-3.36/src/fd-net-device/doc/netmap-net-device.rst
--- ns-3.35/src/fd-net-device/doc/netmap-net-device.rst	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/fd-net-device/doc/netmap-net-device.rst	2022-04-30 18:23:57.842733400 -0700
@@ -127,7 +127,7 @@
   Netmap emulation FdNetDevice  : not enabled (needs net/netmap_user.h)
 
 To run FdNetDevice-enabled simulations, one must pass the ``--enable-sudo``
-option to ``./waf configure``, or else run the simulations with root
+option to ``./ns3 configure``, or else run the simulations with root
 privileges.
 
 Helpers
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/fd-net-device/examples/CMakeLists.txt ns-3.36/src/fd-net-device/examples/CMakeLists.txt
--- ns-3.35/src/fd-net-device/examples/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/fd-net-device/examples/CMakeLists.txt	2022-04-30 18:23:57.842733400 -0700
@@ -0,0 +1,112 @@
+include_directories(${DPDK_INCLUDE_DIRS})
+
+build_lib_example(
+  NAME dummy-network
+  SOURCE_FILES dummy-network.cc
+  LIBRARIES_TO_LINK
+    ${libfd-net-device}
+    ${libinternet}
+    ${libinternet-apps}
+)
+
+build_lib_example(
+  NAME fd2fd-onoff
+  SOURCE_FILES fd2fd-onoff.cc
+  LIBRARIES_TO_LINK
+    ${libfd-net-device}
+    ${libinternet}
+    ${libapplications}
+)
+
+if(${ENABLE_REALTIME})
+  build_lib_example(
+    NAME realtime-dummy-network
+    SOURCE_FILES realtime-dummy-network.cc
+    LIBRARIES_TO_LINK
+      ${libfd-net-device}
+      ${libinternet}
+      ${libapplications}
+      ${libinternet-apps}
+  )
+
+  build_lib_example(
+    NAME realtime-fd2fd-onoff
+    SOURCE_FILES realtime-fd2fd-onoff.cc
+    LIBRARIES_TO_LINK
+      ${libfd-net-device}
+      ${libinternet}
+      ${libapplications}
+  )
+endif()
+
+if(${ENABLE_EMU})
+  build_lib_example(
+    NAME fd-emu-ping
+    SOURCE_FILES fd-emu-ping.cc
+    LIBRARIES_TO_LINK
+      ${libfd-net-device}
+      ${libinternet}
+      ${libinternet-apps}
+  )
+
+  build_lib_example(
+    NAME fd-emu-udp-echo
+    SOURCE_FILES fd-emu-udp-echo.cc
+    LIBRARIES_TO_LINK
+      ${libfd-net-device}
+      ${libinternet}
+      ${libapplications}
+  )
+
+  build_lib_example(
+    NAME fd-emu-onoff
+    SOURCE_FILES fd-emu-onoff.cc
+    LIBRARIES_TO_LINK
+      ${libfd-net-device}
+      ${libinternet}
+      ${libapplications}
+  )
+
+  build_lib_example(
+    NAME fd-emu-send
+    SOURCE_FILES fd-emu-send.cc
+    LIBRARIES_TO_LINK
+      ${libfd-net-device}
+      ${libinternet}
+      ${libapplications}
+      ${libinternet-apps}
+      ${libtraffic-control}
+  )
+
+  build_lib_example(
+    NAME fd-emu-tc
+    SOURCE_FILES fd-emu-tc.cc
+    LIBRARIES_TO_LINK
+      ${libfd-net-device}
+      ${libinternet}
+      ${libapplications}
+      ${libinternet-apps}
+      ${libtraffic-control}
+  )
+endif()
+
+if(${ENABLE_TAPNETDEV})
+  build_lib_example(
+    NAME fd-tap-ping
+    SOURCE_FILES fd-tap-ping.cc
+    LIBRARIES_TO_LINK
+      ${libfd-net-device}
+      ${libinternet}
+      ${libinternet-apps}
+  )
+
+  build_lib_example(
+    NAME fd-tap-ping6
+    SOURCE_FILES fd-tap-ping6.cc
+    LIBRARIES_TO_LINK
+      ${libfd-net-device}
+      ${libinternet}
+      ${libinternet-apps}
+      ${libcsma}
+  )
+endif()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/fd-net-device/examples/fd2fd-onoff.cc ns-3.36/src/fd-net-device/examples/fd2fd-onoff.cc
--- ns-3.35/src/fd-net-device/examples/fd2fd-onoff.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/fd-net-device/examples/fd2fd-onoff.cc	2022-04-30 18:23:57.842733400 -0700
@@ -37,8 +37,8 @@
 //
 // Steps to run the experiment:
 //
-// $ ./waf --run="fd2fd-onoff"
-// $ ./waf --run="fd2fd-onoff --tcpMode=1"
+// $ ./ns3 run="fd2fd-onoff"
+// $ ./ns3 run="fd2fd-onoff --tcpMode=1"
 //
 
 #include <sys/socket.h>
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/fd-net-device/examples/fd-emu-onoff.cc ns-3.36/src/fd-net-device/examples/fd-emu-onoff.cc
--- ns-3.35/src/fd-net-device/examples/fd-emu-onoff.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/fd-net-device/examples/fd-emu-onoff.cc	2022-04-30 18:23:57.842733400 -0700
@@ -78,7 +78,7 @@
 //      build netmap/dpdk separately.
 //
 // 4 - Give root suid to the raw or netmap socket creator binary.
-//     If the --enable-sudo option was used to configure ns-3 with waf, then the following
+//     If the --enable-sudo option was used to configure ns-3 with ns3, then the following
 //     step will not be necessary.
 //
 // both hosts: $ sudo chown root.root build/src/fd-net-device/ns3-dev-raw-sock-creator
@@ -96,11 +96,11 @@
 //
 // 6 - Run the server side:
 //
-// server host: $ ./waf --run="fd-emu-onoff --serverMode=1"
+// server host: $ ./ns3 run="fd-emu-onoff --serverMode=1"
 //
 // 7 - Run the client side:
 //
-// client host: $ ./waf --run="fd-emu-onoff"
+// client host: $ ./ns3 run="fd-emu-onoff"
 //
 
 #include <iostream>
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/fd-net-device/examples/fd-emu-ping.cc ns-3.36/src/fd-net-device/examples/fd-emu-ping.cc
--- ns-3.35/src/fd-net-device/examples/fd-emu-ping.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/fd-net-device/examples/fd-emu-ping.cc	2022-04-30 18:23:57.842733400 -0700
@@ -69,7 +69,7 @@
 //     on your host.  Search for "Ipv4Address gateway" and replace the string
 //     "1.2.3.4" string with the gateway IP address.
 //  6) Give root suid to the raw or netmap socket creator binary.
-//     If the --enable-sudo option was used to configure ns-3 with waf, then the following
+//     If the --enable-sudo option was used to configure ns-3 with ns3, then the following
 //     step will not be necessary.
 //
 //     $ sudo chown root.root build/src/fd-net-device/ns3-dev-raw-sock-creator
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/fd-net-device/examples/fd-planetlab-ping.cc ns-3.36/src/fd-net-device/examples/fd-planetlab-ping.cc
--- ns-3.35/src/fd-net-device/examples/fd-planetlab-ping.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/fd-net-device/examples/fd-planetlab-ping.cc	1969-12-31 16:00:00.000000000 -0800
@@ -1,209 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2012 University of Washington, 2012 INRIA 
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-// Allow ns-3 to ping a real host somewhere, using emulation mode and ping
-// the simulated node from the host.
-//
-//
-//   +-------------------------------------+    
-//   |          PlanetLab host             |
-//   +-------------------------------------+    
-//   |    ns-3 simulation   |              |                       
-//   +----------------------+              |    
-//   |       ns-3 Node      |              |   
-//   |  +----------------+  |              |   
-//   |  |    ns-3 TCP    |  |              |   
-//   |  +----------------+  |              |   
-//   |  |    ns-3 IPv4   |  |              |   
-//   |  +----------------+  |              |   
-//   |  |   FdNetDevice  |  |              |  
-//   |--+----------------+--+    +------+  |
-//   |       | TAP  |            | eth0 |  | 
-//   |       +------+            +------+  |
-//   |       1.2.3.4                 |     |
-//   +-------------------------------|-----+ 
-//                                   |
-//                                   |
-//                                   ------------ (Internet) -----                             
-//
-// To use this example:
-//  1) A ns-3 creator binary will create the TAP device for you in the host machine.
-//     For this you need to provide the network address to allocate IP addresses
-//     for the TAP/TU device and the ns-3 FdNetDevice.
-//  2) Once the experiment is running you can ping the FdNetDevice IP address from
-//     the host machine.
-//  3) For more information on the required configuration to create TAP devices
-//     on PlanetLab refer to:
-//     http://minerva.netgroup.uniroma2.it/fairvpn/wiki/TapDevice
-//
-
-#include "ns3/abort.h"
-#include "ns3/core-module.h"
-#include "ns3/internet-module.h"
-#include "ns3/network-module.h"
-#include "ns3/fd-net-device-module.h"
-#include "ns3/internet-apps-module.h"
-#include "ns3/ipv4-static-routing-helper.h"
-#include "ns3/ipv4-list-routing-helper.h"
-
-using namespace ns3;
-
-NS_LOG_COMPONENT_DEFINE ("PlanetLabTAPPingExample");
-
-static void
-PingRtt (std::string context, Time rtt)
-{
-  NS_LOG_UNCOND ("Received Response with RTT = " << rtt);
-}
-
-int
-main (int argc, char *argv[])
-{
-  NS_LOG_INFO ("Ping Emulation Example with TAP on PlanetLab host");
-
-  std::string remote ("173.194.34.51"); // example.com
-  //
-  //  Make sure network and mask correspond to those assigned to your PlanetLab
-  //  slice, through the tag vsys_vnet x.x.x.x/yy .
-  //  In this case The network should be x.x.x.x and the mask should correspond to
-  //  the prefix yy.
-  //
-  std::string network ("1.2.3.4");
-  std::string mask ("255.255.255.0");
-
-  //
-  // Allow the user to override any of the defaults at run-time, via
-  // command-line arguments
-  //
-  CommandLine cmd (__FILE__);
-  cmd.AddValue ("remote", "Remote IP address (dotted decimal only please)", remote);
-  cmd.AddValue ("tapNetwork", "Network address to assign the TAP device IP address (dotted decimal only please). Note that the network address must be that from the vsys_vnet tag which must exist in your PlanetLab slice.", network);
-  cmd.AddValue ("tapMask", "Network mask for configure the TAP device (dotted decimal only please)", mask);
-  cmd.Parse (argc, argv);
-
-  NS_ABORT_MSG_IF (network == "1.2.3.4", "You must change the local IP address before running this example");
-
-  Ipv4Address remoteIp (remote.c_str ());
-  Ipv4Address tapNetwork (network.c_str ());
-  Ipv4Mask tapMask (mask.c_str ());
-
-  //
-  // Since we are using a real piece of hardware we need to use the realtime
-  // simulator.
-  //
-  GlobalValue::Bind ("SimulatorImplementationType", StringValue ("ns3::RealtimeSimulatorImpl"));
-
-  //
-  // Since we are going to be talking to real-world machines, we need to enable
-  // calculation of checksums in our protocols.
-  //
-  GlobalValue::Bind ("ChecksumEnabled", BooleanValue (true));
-
-  //
-  // In such a simple topology, the use of the helper API can be a hindrance
-  // so we drop down into the low level API and do it manually.
-  //
-  // First we need a single node.
-  //
-  NS_LOG_INFO ("Create Node");
-  Ptr<Node> node = CreateObject<Node> ();
-
-  // Create an fd device, set a MAC address and point the device to the
-  // Linux device name.  The device needs a transmit queueing discipline so
-  // create a droptail queue and give it to the device.  Finally, "install"
-  // the device into the node.
-  //
-  Ipv4AddressHelper addresses;
-  addresses.SetBase (tapNetwork, tapMask);
-  Ipv4Address tapIp = addresses.NewAddress ();
-
-  NS_LOG_INFO ("Create Device");
-  PlanetLabFdNetDeviceHelper helper;
-  helper.SetTapIpAddress (tapIp);
-  helper.SetTapMask (tapMask);
-
-  NetDeviceContainer devices = helper.Install (node);
-  Ptr<NetDevice> device = devices.Get (0);
-
-  //
-  // Add a default internet stack to the node (ARP, IPv4, ICMP, UDP and TCP).
-  //
-  NS_LOG_INFO ("Add Internet Stack");
-  InternetStackHelper internetStackHelper;
-  internetStackHelper.Install (node);
-
-  //
-  // Add an address to the ns-3 device in the same network than one
-  // assigned to the TAP.
-  //
-  NS_LOG_INFO ("Create IPv4 Interface");
-  Ptr<Ipv4> ipv4 = node->GetObject<Ipv4> ();
-  uint32_t interface = ipv4->AddInterface (device);
-  Ipv4Address devIp = addresses.NewAddress ();
-  Ipv4InterfaceAddress address = Ipv4InterfaceAddress (devIp, tapMask);
-  ipv4->AddAddress (interface, address);
-  ipv4->SetMetric (interface, 1);
-  ipv4->SetUp (interface);
-
-  //
-  // Add a route to the ns-3 device so it can reach the outside world though the
-  // TAP.
-  //
-  Ipv4StaticRoutingHelper ipv4RoutingHelper;
-  Ptr<Ipv4StaticRouting> staticRouting = ipv4RoutingHelper.GetStaticRouting (ipv4);
-  staticRouting->SetDefaultRoute (tapIp, interface);
-
-  //
-  // Create the ping application.  This application knows how to send
-  // ICMP echo requests.  Setting up the packet sink manually is a bit
-  // of a hassle and since there is no law that says we cannot mix the
-  // helper API with the low level API, let's just use the helper.
-  //
-  NS_LOG_INFO ("Create V4Ping Appliation");
-  Ptr<V4Ping> app = CreateObject<V4Ping> ();
-  app->SetAttribute ("Remote", Ipv4AddressValue (remoteIp));
-  app->SetAttribute ("Verbose", BooleanValue (true) );
-  node->AddApplication (app);
-  app->SetStartTime (Seconds (1.0));
-  app->SetStopTime (Seconds (21.0));
-
-  //
-  // Give the application a name.  This makes life much easier when constructing
-  // config paths.
-  //
-  Names::Add ("app", app);
-
-  //
-  // Hook a trace to print something when the response comes back.
-  //
-  Config::Connect ("/Names/app/Rtt", MakeCallback (&PingRtt));
-
-  //
-  // Enable a promiscuous pcap trace to see what is coming and going on our device.
-  //
-  helper.EnablePcap ("fd-planete-ping", device, true);
-
-  //
-  // Now, do the actual emulation.
-  //
-  NS_LOG_INFO ("Run Emulation.");
-  Simulator::Stop (Seconds (22.0));
-  Simulator::Run ();
-  Simulator::Destroy ();
-  NS_LOG_INFO ("Done.");
-}
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/fd-net-device/examples/fd-tap-ping.cc ns-3.36/src/fd-net-device/examples/fd-tap-ping.cc
--- ns-3.35/src/fd-net-device/examples/fd-tap-ping.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/fd-net-device/examples/fd-tap-ping.cc	2022-04-30 18:23:57.842733400 -0700
@@ -19,26 +19,26 @@
 // Allow ns-3 to ping a real host somewhere, using emulation mode and ping
 // the simulated node from the host.
 //
-//   +-------------------------------------+    
+//   +-------------------------------------+
 //   |                host                 |
-//   +-------------------------------------+    
-//   |    ns-3 simulation   |              |                       
-//   +----------------------+              |    
-//   |       ns-3 Node      |              |   
-//   |  +----------------+  |              |   
-//   |  |    ns-3 TCP    |  |              |   
-//   |  +----------------+  |              |   
-//   |  |    ns-3 IPv4   |  |              |   
-//   |  +----------------+  |              |   
-//   |  |   FdNetDevice  |  |              |  
+//   +-------------------------------------+
+//   |    ns-3 simulation   |              |
+//   +----------------------+              |
+//   |       ns-3 Node      |              |
+//   |  +----------------+  |              |
+//   |  |    ns-3 TCP    |  |              |
+//   |  +----------------+  |              |
+//   |  |    ns-3 IPv4   |  |              |
+//   |  +----------------+  |              |
+//   |  |   FdNetDevice  |  |              |
 //   |--+----------------+--+    +------+  |
-//   |       | TAP  |            | eth0 |  | 
+//   |       | TAP  |            | eth0 |  |
 //   |       +------+            +------+  |
 //   |       1.2.3.4                 |     |
-//   +-------------------------------|-----+ 
+//   +-------------------------------|-----+
 //                                   |
 //                                   |                             +-------------+
-//                                   ------------ (Internet) ----- | Remote host |                            
+//                                   ------------ (Internet) ----- | Remote host |
 //                                                                 +-------------+
 //
 // To use this example:
@@ -51,22 +51,22 @@
 //     So for Linux systems, make sure to configure:
 //     # echo 1 > /proc/sys/net/ipv4/ip_forward
 //
-//     Also enable natting so the ICMP replies from the remote host can reach 
-//     back the TAP. 
+//     Also enable natting so the ICMP replies from the remote host can reach
+//     back the TAP.
 //     - TAP-network-address is the same as 'tapNetwork'
 //     - TAP-network-mask is the same as 'tapMask'
 //     # iptables -t nat -A POSTROUTING -s <TAP-network-address>/<TAP-network-mask> -j MASQUERADE
 //
 //  3) Before running the example make sure that the tap creator binary has root suid.
-//     If the --enable-sudo option was used to configure ns-3 with waf, then the following
+//     If the --enable-sudo option was used to configure ns-3 with ns3, then the following
 //     step will not be necessary.
 //
 //     # chown root.root build/src/fd-net-device/ns3-dev-tap-device-creator
 //     # sudo chmod 4755 build/src/fd-net-device/ns3-dev-tap-device-creator
 //
-//  4)  The example can be executed as follows using waf:
-//  
-//     ./waf --run fd-tap-ping --command-template="%s --tapNetwork=<TAP-network-address> --tapMask=<TAP-network-mask>" 
+//  4)  The example can be executed as follows using ns3:
+//
+//     ./ns3 run fd-tap-ping --command-template="%s --tapNetwork=<TAP-network-address> --tapMask=<TAP-network-mask>"
 //
 
 #include "ns3/abort.h"
@@ -117,7 +117,7 @@
   Ipv4Address tapNetwork (network.c_str ());
   Ipv4Mask tapMask (mask.c_str ());
 
-  bool modePi = ( pi == "yes" ? true : false);
+  bool modePi = (pi == "yes");
 
   //
   // Since we are using a real piece of hardware we need to use the realtime
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/fd-net-device/examples/realtime-fd2fd-onoff.cc ns-3.36/src/fd-net-device/examples/realtime-fd2fd-onoff.cc
--- ns-3.35/src/fd-net-device/examples/realtime-fd2fd-onoff.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/fd-net-device/examples/realtime-fd2fd-onoff.cc	2022-04-30 18:23:57.846733600 -0700
@@ -37,7 +37,7 @@
 //
 // Steps to run the experiment:
 //
-// $ ./waf --run="fd2fd-onoff"
+// $ ./ns3 run="fd2fd-onoff"
 //
 
 #include <sys/socket.h>
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/fd-net-device/examples/wscript ns-3.36/src/fd-net-device/examples/wscript
--- ns-3.35/src/fd-net-device/examples/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/fd-net-device/examples/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,41 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    env = bld.env
-    if not env['ENABLE_FDNETDEV']:
-        return
-
-    obj = bld.create_ns3_program('dummy-network', ['fd-net-device', 'internet', 'internet-apps'])
-    obj.source = 'dummy-network.cc'
-    obj = bld.create_ns3_program('fd2fd-onoff', ['fd-net-device', 'internet', 'applications'])
-    obj.source = 'fd2fd-onoff.cc'
-
-    if bld.env["ENABLE_REAL_TIME"]:
-        obj = bld.create_ns3_program('realtime-dummy-network', ['fd-net-device', 'internet', 'internet-apps'])
-        obj.source = 'realtime-dummy-network.cc'
-        obj = bld.create_ns3_program('realtime-fd2fd-onoff', ['fd-net-device', 'internet', 'applications'])
-        obj.source = 'realtime-fd2fd-onoff.cc'
-
-    if bld.env['ENABLE_EMU' or 'ENABLE_NETMAP_EMU' or 'ENABLE_DPDKNETDEV']:
-        obj = bld.create_ns3_program('fd-emu-ping', ['fd-net-device', 'internet', 'internet-apps'])
-        obj.source = 'fd-emu-ping.cc'
-        obj = bld.create_ns3_program('fd-emu-onoff', ['fd-net-device', 'internet', 'applications'])
-        obj.source = 'fd-emu-onoff.cc'
-        obj = bld.create_ns3_program('fd-emu-tc', ['fd-net-device', 'internet', 'internet-apps', 'applications', 'traffic-control'])
-        obj.source = 'fd-emu-tc.cc'
-        obj = bld.create_ns3_program('fd-emu-send', ['fd-net-device', 'internet', 'internet-apps', 'applications', 'traffic-control'])
-        obj.source = 'fd-emu-send.cc'
-
-    if bld.env['ENABLE_EMU']:
-        obj = bld.create_ns3_program('fd-emu-udp-echo', ['fd-net-device', 'internet', 'applications'])
-        obj.source = 'fd-emu-udp-echo.cc'
-
-    if bld.env['ENABLE_TAP']:
-        obj = bld.create_ns3_program('fd-tap-ping', ['fd-net-device', 'internet', 'internet-apps'])
-        obj.source = 'fd-tap-ping.cc'
-        obj = bld.create_ns3_program('fd-tap-ping6', ['fd-net-device', 'internet', 'internet-apps', 'csma'])
-        obj.source = 'fd-tap-ping6.cc'
-
-    if bld.env['ENABLE_PLANETLAB']:
-        obj = bld.create_ns3_program('fd-planetlab-ping', ['fd-net-device', 'internet', 'internet-apps'])
-        obj.source = 'fd-planetlab-ping.cc'
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/fd-net-device/helper/emu-fd-net-device-helper.h ns-3.36/src/fd-net-device/helper/emu-fd-net-device-helper.h
--- ns-3.35/src/fd-net-device/helper/emu-fd-net-device-helper.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/fd-net-device/helper/emu-fd-net-device-helper.h	2022-04-30 18:23:57.846733600 -0700
@@ -80,6 +80,7 @@
 
   /**
    * Sets a file descriptor on the FileDescriptorNetDevice.
+   * \param device the device to install the file descriptor in
    */
   virtual void SetFileDescriptor (Ptr<FdNetDevice> device) const;
 
@@ -94,7 +95,7 @@
    * The Unix/Linux name of the underlying device (e.g., eth0)
    */
   std::string m_deviceName;
-  bool m_hostQdiscBypass;
+  bool m_hostQdiscBypass; //!< True if request host qdisc bypass
 };
 
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/fd-net-device/helper/fd-net-device-helper.h ns-3.36/src/fd-net-device/helper/fd-net-device-helper.h
--- ns-3.35/src/fd-net-device/helper/fd-net-device-helper.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/fd-net-device/helper/fd-net-device-helper.h	2022-04-30 18:23:57.846733600 -0700
@@ -57,7 +57,7 @@
   /**
    * Set the TypeId of the Objects to be created by this helper.
    *
-   * \param [in] tid The TypeId of the object to instantiate.
+   * \param [in] type The TypeId of the object to instantiate.
    */
   void SetTypeId (std::string type);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/fd-net-device/helper/planetlab-fd-net-device-helper.cc ns-3.36/src/fd-net-device/helper/planetlab-fd-net-device-helper.cc
--- ns-3.35/src/fd-net-device/helper/planetlab-fd-net-device-helper.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/fd-net-device/helper/planetlab-fd-net-device-helper.cc	1969-12-31 16:00:00.000000000 -0800
@@ -1,335 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2012 INRIA
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Alina Quereilhac <alina.quereilhac@inria.fr>
- *         Claudio Freire <klaussfreire@sourceforge.net>
- *
- */
-
-#include "planetlab-fd-net-device-helper.h"
-#include "encode-decode.h"
-
-#include "ns3/abort.h"
-#include "ns3/config.h"
-#include "ns3/fd-net-device.h"
-#include "ns3/log.h"
-#include "ns3/names.h"
-#include "ns3/object-factory.h"
-#include "ns3/packet.h"
-#include "ns3/simulator.h"
-#include "ns3/trace-helper.h"
-#include "ns3/internet-module.h"
-
-#include <arpa/inet.h>
-#include <errno.h>
-#include <iostream>
-#include <iomanip>
-#include <limits>
-#include <linux/if_tun.h>
-#include <memory>
-#include <net/ethernet.h>
-#include <net/if.h>
-#include <netinet/in.h>
-#include <netpacket/packet.h>
-
-#include <stdlib.h>
-#include <string.h>
-#include <sys/wait.h>
-#include <sys/stat.h>
-#include <sys/socket.h>
-#include <sys/un.h>
-#include <sys/ioctl.h>
-#include <time.h>
-#include <unistd.h>
-
-#include <string>
-
-namespace ns3 {
-
-NS_LOG_COMPONENT_DEFINE ("PlanetLabFdNetDeviceHelper");
-
-#define PLANETLAB_MAGIC 75867
-
-PlanetLabFdNetDeviceHelper::PlanetLabFdNetDeviceHelper ()
-{
-  m_tapIp = Ipv4Address ("255.255.255.255");
-  m_tapMask = Ipv4Mask ("255.255.255.255");
-}
-
-void
-PlanetLabFdNetDeviceHelper::SetTapIpAddress (Ipv4Address address)
-{
-  m_tapIp = address;
-}
-
-void
-PlanetLabFdNetDeviceHelper::SetTapMask (Ipv4Mask mask)
-{
-  m_tapMask = mask;
-}
-
-Ptr<NetDevice>
-PlanetLabFdNetDeviceHelper::InstallPriv (Ptr<Node> node) const
-{
-  Ptr<NetDevice> d = FdNetDeviceHelper::InstallPriv (node);
-  Ptr<FdNetDevice> device = d->GetObject<FdNetDevice> ();
-
-  //
-  // The PlanetLab mechanism to create a TAP device doesn't allow
-  // for the moment to set the IFF_NOPI flag. In consequence, a PI
-  // header will be present in the traffic.
-  // We need to explicitly set the encapsulation mode to DIXPI,
-  // so the FdNetDevice is able to treat correctly the traffic
-  // traversing TAP device.
-  //
-  Ptr<FdNetDevice> fdnd = device->GetObject<FdNetDevice> ();
-  fdnd->SetEncapsulationMode (FdNetDevice::DIXPI);
-
-  SetFileDescriptor (device);
-  return device;
-}
-
-void
-PlanetLabFdNetDeviceHelper::SetFileDescriptor (Ptr<FdNetDevice> device) const
-{
-  NS_LOG_LOGIC ("Creating TAP device");
-
-  //
-  // Call out to a separate process running as suid root in order to create a
-  // TAP device.  We do this to avoid having the entire simulation running as root.
-  //
-  int fd = CreateFileDescriptor ();
-  device->SetFileDescriptor (fd);
-}
-
-int
-PlanetLabFdNetDeviceHelper::CreateFileDescriptor (void) const
-{
-  NS_LOG_FUNCTION (this);
-
-  //
-  // We're going to fork and exec that program soon, but first we need to have
-  // a socket to talk to it with.  So we create a local interprocess (Unix)
-  // socket for that purpose.
-  //
-  int sock = socket (PF_UNIX, SOCK_DGRAM, 0);
-  NS_ABORT_MSG_IF (sock == -1, "PlanetLabFdNetDeviceHelper::CreateFileDescriptor(): Unix socket creation error, errno = " << strerror (errno));
-
-  //
-  // Bind to that socket and let the kernel allocate an endpoint
-  //
-  struct sockaddr_un un;
-  memset (&un, 0, sizeof (un));
-  un.sun_family = AF_UNIX;
-  int status = bind (sock, (struct sockaddr*)&un, sizeof (sa_family_t));
-  NS_ABORT_MSG_IF (status == -1, "PlanetLabFdNetDeviceHelper::CreateFileDescriptor(): Could not bind(): errno = " << strerror (errno));
-  NS_LOG_INFO ("Created Unix socket");
-  NS_LOG_INFO ("sun_family = " << un.sun_family);
-  NS_LOG_INFO ("sun_path = " << un.sun_path);
-
-  //
-  // We have a socket here, but we want to get it there -- to the program we're
-  // going to exec.  What we'll do is to do a getsockname and then encode the
-  // resulting address information as a string, and then send the string to the
-  // program as an argument.  So we need to get the sock name.
-  //
-  socklen_t len = sizeof (un);
-  status = getsockname (sock, (struct sockaddr*)&un, &len);
-  NS_ABORT_MSG_IF (status == -1, "PlanetLabFdNetDeviceHelper::CreateFileDescriptor(): Could not getsockname(): errno = " << strerror (errno));
-
-  //
-  // Now encode that socket name (family and path) as a string of hex digits
-  //
-  std::string path = BufferToString ((uint8_t *)&un, len);
-  NS_LOG_INFO ("Encoded Unix socket as \"" << path << "\"");
-
-  //
-  // Fork and exec the process to create our socket.  If we're us (the parent)
-  // we wait for the child (the creator) to complete and read the socket it
-  // created and passed back using the ancillary data mechanism.
-  //
-  pid_t pid = ::fork ();
-  if (pid == 0)
-    {
-      NS_LOG_DEBUG ("Child process");
-
-      //
-      // build a command line argument from the encoded endpoint string that
-      // the socket creation process will use to figure out how to respond to
-      // the (now) parent process.  We're going to have to give this program
-      // quite a bit of information.
-      //
-      // -i<IP-address> The IP address to assign to the new tap device;
-      // -n<network-prefix> The network prefix to assign to the new tap device;
-      // -t Set the IFF_TAP flag
-      // -p<path> the path to the unix socket described above.
-      //
-      // Example tap-creator -i1.2.3.1 -n24 -t -pblah
-      //
-
-      std::ostringstream ossIp;
-      ossIp << "-i" << m_tapIp;
-
-      std::ostringstream ossPrefix;
-      ossPrefix << "-n" << m_tapMask.GetPrefixLength ();
-
-      std::ostringstream ossMode;
-      ossMode << "-t";
-
-      std::ostringstream ossPath;
-      ossPath << "-p" << path;
-
-      //
-      // Execute the socket creation process image.
-      //
-      status = ::execlp (PLANETLAB_TAP_CREATOR,
-                         PLANETLAB_TAP_CREATOR,               // argv[0] (filename)
-                         ossIp.str ().c_str (),               // argv[1] (-i<IP address>)
-                         ossPrefix.str ().c_str (),           // argv[2] (-n<prefix>)
-                         ossMode.str ().c_str (),             // argv[3] (-t <tap>)
-                         ossPath.str ().c_str (),             // argv[4] (-p<path>)
-                         (char *)NULL);
-
-      //
-      // If the execlp successfully completes, it never returns.  If it returns it failed or the OS is
-      // broken.  In either case, we bail.
-      //
-      NS_FATAL_ERROR ("PlanetLabFdNetDeviceHelper::CreateFileDescriptor(): Back from execlp(), errno = " << ::strerror (errno));
-    }
-  else
-    {
-      NS_LOG_DEBUG ("Parent process");
-      //
-      // We're the process running the emu net device.  We need to wait for the
-      // socket creator process to finish its job.
-      //
-      int st;
-      pid_t waited = waitpid (pid, &st, 0);
-      NS_ABORT_MSG_IF (waited == -1, "PlanetLabFdNetDeviceHelper::CreateFileDescriptor(): waitpid() fails, errno = " << strerror (errno));
-      NS_ASSERT_MSG (pid == waited, "PlanetLabFdNetDeviceHelper::CreateFileDescriptor(): pid mismatch");
-
-      //
-      // Check to see if the socket creator exited normally and then take a
-      // look at the exit code.  If it bailed, so should we.  If it didn't
-      // even exit normally, we bail too.
-      //
-      if (WIFEXITED (st))
-        {
-          int exitStatus = WEXITSTATUS (st);
-          NS_ABORT_MSG_IF (exitStatus != 0,
-                           "PlanetLabFdNetDeviceHelper::CreateFileDescriptor(): socket creator exited normally with status " << exitStatus);
-        }
-      else
-        {
-          NS_FATAL_ERROR ("PlanetLabFdNetDeviceHelper::CreateFileDescriptor(): socket creator exited abnormally");
-        }
-
-      //
-      // At this point, the socket creator has run successfully and should
-      // have created our tap device, initialized it with the information we
-      // passed and sent it back to the socket address we provided.  A socket
-      // (fd) we can use to talk to this tap device should be waiting on the
-      // Unix socket we set up to receive information back from the creator
-      // program.  We've got to do a bunch of grunt work to get at it, though.
-      //
-      // The struct iovec below is part of a scatter-gather list.  It describes a
-      // buffer.  In this case, it describes a buffer (an integer) that will
-      // get the data that comes back from the socket creator process.  It will
-      // be a magic number that we use as a consistency/sanity check.
-      //
-      struct iovec iov;
-      uint32_t magic;
-      iov.iov_base = &magic;
-      iov.iov_len = sizeof(magic);
-
-      //
-      // The CMSG macros you'll see below are used to create and access control
-      // messages (which is another name for ancillary data).  The ancillary
-      // data is made up of pairs of struct cmsghdr structures and associated
-      // data arrays.
-      //
-      // First, we're going to allocate a buffer on the stack to receive our
-      // data array (that contains the socket).  Sometimes you'll see this called
-      // an "ancillary element" but the msghdr uses the control message termimology
-      // so we call it "control."
-      //
-      size_t msg_size = sizeof(int);
-      char control[CMSG_SPACE (msg_size)];
-
-      //
-      // There is a msghdr that is used to minimize the number of parameters
-      // passed to recvmsg (which we will use to receive our ancillary data).
-      // This structure uses terminology corresponding to control messages, so
-      // you'll see msg_control, which is the pointer to the ancillary data and
-      // controllen which is the size of the ancillary data array.
-      //
-      // So, initialize the message header that describes the ancillary/control
-      // data we expect to receive and point it to buffer.
-      //
-      struct msghdr msg;
-      msg.msg_name = 0;
-      msg.msg_namelen = 0;
-      msg.msg_iov = &iov;
-      msg.msg_iovlen = 1;
-      msg.msg_control = control;
-      msg.msg_controllen = sizeof (control);
-      msg.msg_flags = 0;
-
-      //
-      // Now we can actually receive the interesting bits from the tap
-      // creator process.  Lots of pain to get four bytes.
-      //
-      ssize_t bytesRead = recvmsg (sock, &msg, 0);
-      NS_ABORT_MSG_IF (bytesRead != sizeof(int), "PlanetLabFdNetDeviceHelper::CreateFileDescriptor(): Wrong byte count from socket creator");
-
-      //
-      // There may be a number of message headers/ancillary data arrays coming in.
-      // Let's look for the one with a type SCM_RIGHTS which indicates it's the
-      // one we're interested in.
-      //
-      struct cmsghdr *cmsg;
-      for (cmsg = CMSG_FIRSTHDR (&msg); cmsg != NULL; cmsg = CMSG_NXTHDR (&msg, cmsg))
-        {
-          if (cmsg->cmsg_level == SOL_SOCKET
-              && cmsg->cmsg_type == SCM_RIGHTS)
-            {
-              //
-              // This is the type of message we want.  Check to see if the magic
-              // number is correct and then pull out the socket we care about if
-              // it matches
-              //
-              if (magic == PLANETLAB_MAGIC)
-                {
-                  NS_LOG_INFO ("Got SCM_RIGHTS with correct magic " << magic);
-                  int *rawSocket = (int*)CMSG_DATA (cmsg);
-                  NS_LOG_INFO ("Got the socket from the socket creator = " << *rawSocket);
-                  return *rawSocket;
-                }
-              else
-                {
-                  NS_LOG_INFO ("Got SCM_RIGHTS, but with bad magic " << magic);
-                }
-            }
-        }
-      NS_FATAL_ERROR ("Did not get the raw socket from the socket creator");
-    }
-
-}
-
-} // namespace ns3
-
-
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/fd-net-device/helper/planetlab-fd-net-device-helper.h ns-3.36/src/fd-net-device/helper/planetlab-fd-net-device-helper.h
--- ns-3.35/src/fd-net-device/helper/planetlab-fd-net-device-helper.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/fd-net-device/helper/planetlab-fd-net-device-helper.h	1969-12-31 16:00:00.000000000 -0800
@@ -1,105 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2012 INRIA
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Alina Quereilhac <alina.quereilhac@inria.fr>
- *         Claudio Freire <klaussfreire@sourceforge.net>
- */
-
-#ifndef PLANETLAB_FD_NET_DEVICE_HELPER_H
-#define PLANETLAB_FD_NET_DEVICE_HELPER_H
-
-#include <string>
-
-#include "ns3/attribute.h"
-#include "ns3/fd-net-device.h"
-#include "ns3/object-factory.h"
-#include "ns3/mac48-address.h"
-#include "ns3/net-device-container.h"
-#include "ns3/node-container.h"
-
-#include "emu-fd-net-device-helper.h"
-
-namespace ns3 {
-
-/**
- * \ingroup fd-net-device
- * \brief build a set of FdNetDevice objects attached to a virtual TAP network
- * interface
- *
- */
-class PlanetLabFdNetDeviceHelper : public EmuFdNetDeviceHelper
-{
-public:
-  /**
-   * Construct a PlanetLabFdNetDeviceHelper.
-   */
-  PlanetLabFdNetDeviceHelper ();
-  virtual ~PlanetLabFdNetDeviceHelper ()
-  {
-  }
-
-  /**
-   * Set the device IPv4 address.
-   *
-   * \param address The IPv4 address for the TAP device.
-   */
-  void SetTapIpAddress (Ipv4Address address);
-
-  /**
-   * Set the network mask for the TAP device.
-   *
-   * \param mask The network mask for the TAP device.
-   */
-  void SetTapMask (Ipv4Mask mask);
-
-protected:
-
-  /**
-   * This method creates an ns3::FdNetDevice attached to a virtual TAP network
-   * interface
-   *
-   * \param node The node to install the device in
-   * \returns A container holding the added net device.
-   */
-  Ptr<NetDevice> InstallPriv (Ptr<Node> node) const;
-
-  /**
-   * Sets a file descriptor on the FileDescriptorNetDevice.
-   */
-  virtual void SetFileDescriptor (Ptr<FdNetDevice> device) const;
-
-  /**
-   * Call out to a separate process running as suid root in order to create a
-   * TAP device and obtain the file descriptor associated to it.
-   */
-  virtual int CreateFileDescriptor (void) const;
-
-  /**
-   * The IP address for the TAP device.
-   */
-  Ipv4Address m_tapIp;
-
-  /**
-   * The network mask for the TAP device.
-   */
-  Ipv4Mask m_tapMask;
-
-};
-
-} // namespace ns3
-
-#endif /* PLANETLAB_FD_NET_DEVICE_HELPER_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/fd-net-device/helper/planetlab-tap-creator.cc ns-3.36/src/fd-net-device/helper/planetlab-tap-creator.cc
--- ns-3.35/src/fd-net-device/helper/planetlab-tap-creator.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/fd-net-device/helper/planetlab-tap-creator.cc	1969-12-31 16:00:00.000000000 -0800
@@ -1,234 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2012 INRIA
- *
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Alina Quereilhac <alina.quereilhac@inria.fr>
- *         Claudio Freire <klaussfreire@sourceforge.net>
- *         
- */
-
-#include <unistd.h>
-#include <stdint.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string>
-#include <string.h> // for strerror
-#include <iostream>
-#include <iomanip>
-#include <sstream>
-#include <errno.h>
-#include <fcntl.h>
-#include <sys/ioctl.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/un.h>
-#include <net/if.h>
-#include <linux/if_tun.h>
-#include <net/route.h>
-#include <netinet/in.h>
-
-#include "creator-utils.h"
-
-#define PLANETLAB_MAGIC 75867
-
-#define VSYS_TUNTAP "/vsys/fd_tuntap.control"
-#define VSYS_VIFUP_IN "/vsys/vif_up.in"
-#define VSYS_VIFUP_OUT "/vsys/vif_up.out"
-
-using namespace ns3;
-
-/**
- *
- * Reads vif FD from "fd", writes interface name to vif_name, and returns vif FD.
- * vif_name should be IFNAMSIZ chars long.
- *
- */
-int
-ReceiveVifFd (int fd, char *vif_name)
-{
-  struct msghdr msg;
-  struct iovec iov;
-  int rv;
-  size_t ccmsg[CMSG_SPACE (sizeof(int)) / sizeof(size_t)];
-  struct cmsghdr *cmsg;
-
-  /* Use IOV to read interface name */
-  iov.iov_base = vif_name;
-  iov.iov_len = IFNAMSIZ;
-
-  msg.msg_name = 0;
-  msg.msg_namelen = 0;
-  msg.msg_iov = &iov;
-  msg.msg_iovlen = 1;
-  /* old BSD implementations should use msg_accrights instead of
-   * msg_control; the interface is different. */
-  msg.msg_control = ccmsg;
-  msg.msg_controllen = sizeof(ccmsg);
-
-  while (((rv = recvmsg (fd, &msg, 0)) == -1) && errno == EINTR)
-    {
-    }
-  ABORT_IF (rv == -1, "Could not receive fd from Vsys", 0);
-  ABORT_IF (!rv, "Could not receive fd from Vsys (EOF)", 0);
-
-  cmsg = CMSG_FIRSTHDR (&msg);
-  ABORT_IF (!cmsg->cmsg_type == SCM_RIGHTS, "got control message of unknown type" << cmsg->cmsg_type, 0);
-
-  int* retfd  = (int*)CMSG_DATA (cmsg);
-  return *retfd;
-}
-
-/**
- *
- * Creates a TUN/TAP device on a PlanetLab virtual machine (sliver).
- * PlanetLab provides the Vsys API to enable privileged operating system calls
- * in an environment with restricted privileges.
- * To create a TUN/TAP device the it is necessary to connect to the
- * /vsys/fd_tuntap.control socket, and send the device initialization parameters.
- *
- */
-int
-TunAlloc (int iftype, char *if_name)
-{
-  int control_fd;
-  struct sockaddr_un addr;
-  int ret;
-
-  control_fd = socket (AF_UNIX, SOCK_STREAM, 0);
-  ABORT_IF (control_fd == -1, "Could not create UNIX socket", 0);
-
-  memset (&addr, 0, sizeof(struct sockaddr_un));
-
-  /* Clear structure */
-  addr.sun_family = AF_UNIX;
-  strncpy (addr.sun_path, VSYS_TUNTAP, sizeof(addr.sun_path) - 1);
-
-  ret = connect (control_fd, (struct sockaddr *) &addr,
-                 sizeof(struct sockaddr_un));
-  ABORT_IF (ret == -1, "Could not connect to Vsys control socket", 0);
-
-  /* passing type param */
-  ret = send (control_fd, &iftype, sizeof(iftype), 0);
-  ABORT_IF (ret != sizeof(iftype), "Could not send parameter to Vsys control socket", 0);
-
-  return ReceiveVifFd (control_fd, if_name);
-
-}
-
-/**
- *
- * Sets the TAP/TUN interface up.
- * When a TAP/TUN device is created on PlanetLab it must be set up
- * writing some configuration information to the vsys fifo at /vsys/vif_up.in
- *
- */
-void
-SetTunUp (const char *ip, const char *prefix, const char *if_name)
-{
-  FILE *in;
-  FILE *out;
-  char errbuff[4096];
-
-  memset(errbuff, 0, 4096);
-
-  in = fopen (VSYS_VIFUP_IN, "a");
-
-  if (in == NULL)
-    {
-      ABORT_IF (in == NULL, "Failed to open " << VSYS_VIFUP_IN, 0);
-    }
-
-  out = fopen (VSYS_VIFUP_OUT, "r");
-
-  if (out == NULL)
-    {
-      ABORT_IF (out == NULL, "Failed to open " << VSYS_VIFUP_OUT, 0);
-    }
-
-  // send input to process
-  fprintf (in, "%s\n%s\n%s\nsnat=1\n", if_name, ip, prefix);
-
-  // close pipe to indicate end parameter passing and flush the fifo
-  fclose (in);
-
-  fread((void*)errbuff, 4096, 1, out);
- 
-  // the error buffer will not be empty if we read an error
-  ABORT_IF (strcmp(errbuff, "") != 0, errbuff, 0);
-
-  fclose (out);
-}
-
-int
-main (int argc, char *argv[])
-{
-  int c;
-  char *ip = NULL;
-  char *prefix = NULL;
-  char *path = NULL;
-  int iftype = IFF_TUN;
-  char if_name[4096];
-
-  memset(if_name, 0, 4096);
-  opterr = 0;
-
-  while ((c = getopt (argc, argv, "vi:n:tp:")) != -1)
-    {
-      switch (c)
-        {
-        case 'i':
-          ip = optarg;            // ip address of the new device
-          break;
-        case 'n':
-          prefix = optarg;        // prefix for the new device
-          break;
-        case 't':
-          iftype = IFF_TAP;       // mode for the device (TAP or TUN)
-          break;
-        case 'p':
-          path = optarg;          // path back to the tap bridge
-          break;
-        case 'v':
-          gVerbose = true;
-          break;
-        }
-    }
-
-  ABORT_IF (ip == NULL, "IP Address is a required argument", 0);
-  LOG ("Provided IP Address is \"" << ip << "\"");
-
-  ABORT_IF (prefix == NULL, "Prefix is a required argument", 0);
-  LOG ("Provided prefix \"" << prefix << "\"");
-
-  ABORT_IF (path == NULL, "path is a required argument", 0);
-  LOG ("Provided path is \"" << path << "\"");
-
-  LOG ("Creating Tap");
-  // allocate a TAP device in planetLab
-  int fd = TunAlloc (iftype, if_name);
-  ABORT_IF (fd == -1, "main(): Unable to create tap device", 1);
-
-  // set the TAP interface up
-  SetTunUp (ip, prefix, (const char*)if_name);
-
-  //
-  // Send the socket back to the tap net device so it can go about its business
-  //
-  SendSocket (path, fd, PLANETLAB_MAGIC);
-
-  return 0;
-}
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/fd-net-device/helper/tap-fd-net-device-helper.h ns-3.36/src/fd-net-device/helper/tap-fd-net-device-helper.h
--- ns-3.35/src/fd-net-device/helper/tap-fd-net-device-helper.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/fd-net-device/helper/tap-fd-net-device-helper.h	2022-04-30 18:23:57.846733600 -0700
@@ -105,12 +105,14 @@
 
   /**
    * Sets a file descriptor on the FileDescriptorNetDevice.
+   * \param device the device to install the file descriptor in
    */
   virtual void SetFileDescriptor (Ptr<FdNetDevice> device) const;
 
   /**
    * Call out to a separate process running as suid root in order to create a
    * TAP device and obtain the file descriptor associated to it.
+   * \returns The file descriptor associated with the TAP device.
    */
   virtual int CreateFileDescriptor (void) const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/fd-net-device/model/dpdk-net-device.cc ns-3.36/src/fd-net-device/model/dpdk-net-device.cc
--- ns-3.35/src/fd-net-device/model/dpdk-net-device.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/fd-net-device/model/dpdk-net-device.cc	2022-04-30 18:23:57.846733600 -0700
@@ -25,8 +25,6 @@
 #include "ns3/log.h"
 #include "ns3/net-device-queue-interface.h"
 #include "ns3/simulator.h"
-#include "ns3/system-thread.h"
-#include "ns3/system-condition.h"
 #include "ns3/system-mutex.h"
 #include "ns3/uinteger.h"
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/fd-net-device/model/dpdk-net-device.h ns-3.36/src/fd-net-device/model/dpdk-net-device.h
--- ns-3.35/src/fd-net-device/model/dpdk-net-device.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/fd-net-device/model/dpdk-net-device.h	2022-04-30 18:23:57.846733600 -0700
@@ -96,6 +96,8 @@
 
   /**
    * A function to handle rx & tx operations.
+   * \param arg a pointer to the DpdkNetDevice
+   * \return zero on failure or exit.
    */
   static int LaunchCore (void *arg);
 
@@ -117,11 +119,14 @@
 
   /**
    * Free the given packet buffer.
+   * \param buf the pointer to the buffer to be freed
    */
   virtual void FreeBuffer (uint8_t* buf);
 
   /**
    * Allocate packet buffer.
+   * \param len the length of the buffer
+   * \return A pointer to the newly created buffer.
    */
   virtual uint8_t* AllocateBuffer (size_t len);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/fd-net-device/model/fd-net-device.h ns-3.36/src/fd-net-device/model/fd-net-device.h
--- ns-3.35/src/fd-net-device/model/fd-net-device.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/fd-net-device/model/fd-net-device.h	2022-04-30 18:23:57.846733600 -0700
@@ -59,6 +59,7 @@
 
   /**
    * Set size of the read buffer.
+   * \param bufferSize the buffer size
    */
   void SetBufferSize (uint32_t bufferSize);
 
@@ -115,6 +116,9 @@
    */
   virtual ~FdNetDevice ();
 
+  // Delete assignment operator to avoid misuse
+  FdNetDevice (FdNetDevice const &) = delete;
+
   /**
    * Set the link layer encapsulation mode of this device.
    *
@@ -132,7 +136,7 @@
 
   /**
    * Set the associated file descriptor.
-   *
+   * \param fd the file descriptor
    */
   void SetFileDescriptor (int fd);
 
@@ -211,16 +215,21 @@
 
   /**
    * Allocate packet buffer.
+   * \param len the length of the buffer
+   * \return A pointer to the newly allocated buffer.
    */
-  virtual uint8_t* AllocateBuffer(size_t len);
+  virtual uint8_t* AllocateBuffer (size_t len);
 
   /**
    * Free the given packet buffer.
+   * \param buf the buffer to free
    */
   virtual void FreeBuffer (uint8_t* buf);
 
   /**
    * Callback to invoke when a new frame is received
+   * \param buf a buffer containing the received frame
+   * \param len the length of the frame
    */
   void ReceiveCallback (uint8_t *buf, ssize_t len);
 
@@ -236,14 +245,6 @@
 
 private:
   /**
-   * \brief Copy constructor
-   *
-   * Defined and unimplemented to avoid misuse as suggested in
-   * http://www.nsnam.org/wiki/NS-3_Python_Bindings#.22invalid_use_of_incomplete_type.22
-   */
-  FdNetDevice (FdNetDevice const &);
-
-  /**
    * Spin up the device
    */
   void StartDevice (void);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/fd-net-device/model/netmap-net-device.h ns-3.36/src/fd-net-device/model/netmap-net-device.h
--- ns-3.35/src/fd-net-device/model/netmap-net-device.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/fd-net-device/model/netmap-net-device.h	2022-04-30 18:23:57.846733600 -0700
@@ -179,15 +179,15 @@
 
   /**
    * \brief Set the netmap receiver rings info
-   * \param nTxRings the number of receiver rings
-   * \param nTxRingsSlots the number of slots for each receiver ring
+   * \param nRxRings the number of receiver rings
+   * \param nRxRingsSlots the number of slots for each receiver ring
    */
   void SetRxRingsInfo (uint32_t nRxRings, uint32_t nRxRingsSlots);
 
   /**
    * \brief The function Writes a packet into the netmap transmission ring.
    * \param buffer the pointer to packet
-   * \param lenght the packet lenght
+   * \param length the packet length
    * \return the number of written bytes
    */
   virtual ssize_t Write (uint8_t *buffer, size_t length);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/fd-net-device/wscript ns-3.36/src/fd-net-device/wscript
--- ns-3.35/src/fd-net-device/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/fd-net-device/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,295 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-import os.path
-
-from waflib import Options
-
-def options(opt):
-    opt.add_option('--force-planetlab',
-                   help=('Forces compilation of PlanetLab even if not supported by the local system'),
-                   dest='force_planetlab', default=False, action="store_true")
-
-def configure(conf):
-    conf.env['ENABLE_FDNETDEV'] = False
-
-    if conf.env['ENABLE_THREADING']:
-        # Check for system dependencies
-        have_sysioctl = conf.check_nonfatal(header_name='sys/ioctl.h', 
-            define_name = 'HAVE_SYS_IOCTL_H')
-        have_netif =  conf.check_nonfatal(header_name='net/if.h',
-            define_name = 'HAVE_IF_NETS_H')
-
-        # Enable the FdNetDevice module. 
-        # Besides threading support, we also require ethernet.h
-        conf.env['ENABLE_FDNETDEV'] = conf.check_nonfatal(header_name='net/ethernet.h',
-                                                          define_name='HAVE_NET_ETHERNET_H')
-        if conf.env['ENABLE_FDNETDEV']:
-            conf.report_optional_feature("FdNetDevice", 
-                                         "File descriptor NetDevice",
-                                         True,
-                                         "FdNetDevice module enabled")
-
-            # Check if dpdk environment variables are set. Also check if we have correct paths set.
-            env_rte_sdk = os.environ.get('RTE_SDK', '')
-            env_rte_target = os.environ.get('RTE_TARGET', '')
-            have_dpdk_src = env_rte_sdk != '' and env_rte_target != '' and \
-                            os.path.exists(os.path.join(env_rte_sdk, env_rte_target, 'include/rte_eal.h')) and \
-                            os.path.exists(os.path.join(env_rte_sdk, env_rte_target, 'lib/librte_eal.so'))
-
-            have_dpdk_pkg = False
-            if not have_dpdk_src:
-                # Check if libdpdk is installed as package
-                have_dpdk_pkg = conf.check_cfg(package='libdpdk', uselib_store='DPDK',
-                                  args=['--cflags', '--libs'], mandatory=False)
-
-            conf.env['ENABLE_DPDKNETDEV'] = have_dpdk_pkg or have_dpdk_src
-
-            if conf.env['ENABLE_DPDKNETDEV']:
-                # Set DPDK Lib Mode. pkg if the package if installed or src if built from source.
-                dpdk_lib_mode = 'pkg' if have_dpdk_pkg else 'src'
-                conf.env.append_value('DPDK_LIB_MODE', [dpdk_lib_mode])
-                conf.env.append_value('DEFINES', ['HAVE_DPDK_USER_H'])
-                if have_dpdk_pkg:
-                    conf.report_optional_feature("DpdkNetDevice",
-                                                "DPDK NetDevice",
-                                                True,
-                                                "DPDKNetDevice module enabled (from libdpdk)")
-                else:
-                    conf.report_optional_feature("DpdkNetDevice",
-                                                "DPDK NetDevice",
-                                                True,
-                                                "DPDKNetDevice module enabled (from source)")
-            else:
-                conf.report_optional_feature("DpdkNetDevice",
-                                            "DPDK NetDevice",
-                                            False,
-                                            "libdpdk not found, $RTE_SDK and/or $RTE_TARGET environment variable not set or incorrect")
-        else:
-            conf.report_optional_feature("FdNetDevice", 
-                                         "File descriptor NetDevice",
-                                         False,
-                                         "<net/ethernet.h> include not detected")
-
-    else:
-        conf.report_optional_feature("FdNetDevice", 
-            "File descriptor NetDevice",
-            False,
-            "needs threading support which is not available")
-
-    if conf.env['ENABLE_FDNETDEV']:
-        blddir = os.path.abspath(os.path.join(conf.bldnode.abspath(), conf.variant))
-        dir = os.path.abspath(os.path.join(blddir, "src/fd-net-device"))
-        conf.env.append_value('NS3_EXECUTABLE_PATH', dir)
-
-        if conf.env['ENABLE_DPDKNETDEV']:
-            if 'src' in conf.env['DPDK_LIB_MODE']:
-                dpdk_build = os.path.join(os.environ['RTE_SDK'], os.environ['RTE_TARGET'])
-                conf.env.append_value('CXXFLAGS', ['-I' + os.path.join(dpdk_build, 'include'), '-mssse3'])
-                conf.env.append_value('LINKFLAGS', ['-I' + os.path.join(dpdk_build, 'include')])
-                conf.env.append_value('LINKFLAGS', ['-L' + os.path.join(dpdk_build, 'lib')])
-                conf.env.SHLIB_MARKER += ',-lrte_eal,-lrte_ethdev,-lrte_pmd_virtio,-lrte_pmd_e1000,-lrte_pmd_ixgbe,-lrte_pmd_i40e,-lnuma,-ldl,-lrte_mempool,-lrte_mbuf,-lrte_ring,-lrte_kvargs,-lrte_net'
-        else:
-            # Add this module to the list of modules that won't be built
-            # if they are enabled.
-            conf.env['MODULES_NOT_BUILT'].append('dpdk-net-device')
-
-    else:
-        # Add this module to the list of modules that won't be built
-        # if they are enabled.
-        conf.env['MODULES_NOT_BUILT'].append('fd-net-device')
-
-    # Next, check for whether specialized FdNetDevice features are enabled
-    # such as tap device support, raw socket support, netmap support, and planetlab
-    
-    if conf.env['ENABLE_FDNETDEV']:
-        conf.env['ENABLE_TAP'] = conf.check_nonfatal(
-           header_name='linux/if_tun.h', 
-           define_name='HAVE_IF_TUN_H') and have_sysioctl and have_netif
-
-        if conf.env['ENABLE_TAP']:
-            conf.report_optional_feature("TapFdNetDevice", 
-                "Tap FdNetDevice", 
-                True,
-                "Tap support enabled")
-        else:
-            conf.report_optional_feature("TapFdNetDevice", 
-                "Tap FdNetDevice", 
-                False,
-                "needs linux/if_tun.h")
-
-        # Enable use of raw socket (EMU) helper.
-        conf.env['ENABLE_EMU'] = conf.check_nonfatal(
-           header_name='netpacket/packet.h',
-           define_name='HAVE_PACKET_H') and have_sysioctl and have_netif
-
-        if conf.env['ENABLE_EMU']:
-            conf.report_optional_feature("EmuFdNetDevice", 
-                "Emulation FdNetDevice", 
-                True,
-                "Emulation support enabled")
-        else:
-            conf.report_optional_feature("EmuFdNetDevice", 
-                "Emulation FdNetDevice", 
-                False,
-                "needs netpacket/packet.h")
-
-        # Enable use of netmap EMU support
-        conf.env['ENABLE_NETMAP_EMU'] = conf.check_nonfatal(
-           header_name='net/netmap_user.h',
-           define_name='HAVE_NETMAP_USER_H') and have_sysioctl and have_netif
-
-        if conf.env['ENABLE_NETMAP_EMU']:
-            conf.report_optional_feature("NetmapFdNetDevice",
-                "Netmap emulation FdNetDevice",
-                True,
-                "Netmap emulation support enabled")
-        else:
-            conf.report_optional_feature("NetmapFdNetDevice",
-                "Netmap emulation FdNetDevice",
-                False,
-                "needs net/netmap_user.h")
-
-        # Enable use of PlanetLab TAP helper
-        # TODO: How to validate 
-        (sysname, nodename, release, version, machine) = os.uname()
-        if release.find('onelab') != -1 or Options.options.force_planetlab:
-            conf.env['ENABLE_PLANETLAB'] = True
-
-        if conf.env['ENABLE_PLANETLAB']:
-            conf.report_optional_feature("PlanetLabFdNetDevice", 
-                "PlanetLab FdNetDevice", 
-                True,
-                "Planetlab support enabled")
-        else:
-            conf.report_optional_feature("PlanetLabFdNetDevice", 
-                "PlanetLab FdNetDevice", 
-                False,
-                "PlanetLab operating system not detected (see option --force-planetlab)")
-
-def build(bld):
-    # Don't do anything for this module if emu's not enabled.
-    if not bld.env['ENABLE_FDNETDEV']:
-        return
-
-    module = bld.create_ns3_module('fd-net-device', ['network'])
-    module.source = [
-        'model/fd-net-device.cc',
-        'helper/fd-net-device-helper.cc',
-        'helper/encode-decode.cc',
-        'helper/creator-utils.cc',
-        ]
-
-    headers = bld(features='ns3header')
-    headers.module = 'fd-net-device'
-    headers.source = [
-        'model/fd-net-device.h',
-        'helper/fd-net-device-helper.h',
-        ]
-
-    if bld.env['ENABLE_TAP']:
-        if not bld.env['PLATFORM'].startswith('freebsd'):
-            module.source.extend([
-                'helper/tap-fd-net-device-helper.cc',
-            ])
-
-            headers.source.extend([
-                'helper/tap-fd-net-device-helper.h',
-            ])
-
-            creator = bld.create_suid_program('tap-device-creator')
-            creator.source = [
-                'helper/tap-device-creator.cc',
-                'helper/encode-decode.cc',
-                'helper/creator-utils.cc',
-            ]
-
-        module.env.append_value("DEFINES", 
-           "TAP_DEV_CREATOR=\"%s\"" % (creator.target,))
-
-    if bld.env['ENABLE_DPDKNETDEV']:
-        module.use.append('DPDK')
-        module.source.extend([
-            'helper/dpdk-net-device-helper.cc',
-            'model/dpdk-net-device.cc'
-        ])
-        headers.source.extend([
-            'helper/dpdk-net-device-helper.h',
-            'model/dpdk-net-device.h'
-        ])
-        if 'src' in bld.env['DPDK_LIB_MODE']:
-            # Add DPDK libraries to library path
-            dpdk_build = os.path.join(os.environ['RTE_SDK'], os.environ['RTE_TARGET'])
-            if os.environ.get('LD_LIBRARY_PATH', '') == '':
-                os.environ['LD_LIBRARY_PATH'] = os.path.join(dpdk_build, 'lib')
-            else:
-                os.environ['LD_LIBRARY_PATH'] += ':' + os.path.join(dpdk_build, 'lib')
-            # Add $RTE_SDK/usertools to PATH env
-            if os.environ.get('PATH', '') == '':
-                os.environ['PATH'] = os.path.join(os.environ['RTE_SDK'], 'usertools')
-            else:
-                os.environ['PATH'] += ':' + os.path.join(os.environ['RTE_SDK'], 'usertools')
-
-    if bld.env['ENABLE_EMU']:
-        module.source.extend([
-            'helper/emu-fd-net-device-helper.cc',
-        ])
-
-        headers.source.extend([
-            'helper/emu-fd-net-device-helper.h',
-        ])
-
-        creator = bld.create_suid_program('raw-sock-creator')
-        creator.source = [
-           'helper/raw-sock-creator.cc',
-           'helper/encode-decode.cc',
-           'helper/creator-utils.cc',
-        ]
-
-        module.env.append_value("DEFINES", 
-           "RAW_SOCK_CREATOR=\"%s\"" % (creator.target,))
-
-    if bld.env['ENABLE_NETMAP_EMU']:
-        module.source.extend([
-            'model/netmap-net-device.cc',
-            'helper/netmap-net-device-helper.cc',
-        ])
-
-        headers.source.extend([
-            'model/netmap-net-device.h',
-            'helper/netmap-net-device-helper.h',
-        ])
-
-        creator = bld.create_suid_program('netmap-device-creator')
-        creator.source = [
-           'helper/netmap-device-creator.cc',
-           'helper/encode-decode.cc',
-           'helper/creator-utils.cc',
-        ]
-
-        module.env.append_value("DEFINES",
-           "NETMAP_DEV_CREATOR=\"%s\"" % (creator.target,))
-
-    if bld.env['ENABLE_PLANETLAB']:
-        module.source.extend([
-            'helper/planetlab-fd-net-device-helper.cc',
-        ])
-
-        headers.source.extend([
-           'helper/planetlab-fd-net-device-helper.h',
-        ])
-
-        creator = bld.create_suid_program('planetlab-tap-creator')
-        creator.source = [
-           'helper/planetlab-tap-creator.cc',
-           'helper/encode-decode.cc',
-           'helper/creator-utils.cc',
-        ]
-
-        module.env.append_value("DEFINES", 
-           "PLANETLAB_TAP_CREATOR=\"%s\"" % (creator.target,))
-
-    if bld.env['ENABLE_EXAMPLES']:
-        bld.recurse('examples')
-
-    bld.ns3_python_bindings()
-
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/flow-monitor/bindings/modulegen__gcc_ILP32.py ns-3.36/src/flow-monitor/bindings/modulegen__gcc_ILP32.py
--- ns-3.35/src/flow-monitor/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/flow-monitor/bindings/modulegen__gcc_ILP32.py	2022-04-30 18:23:57.846733600 -0700
@@ -71,6 +71,8 @@
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::TraceSourceAccessor'])
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'], import_from_module='ns.core')
     ## flow-monitor-helper.h (module 'flow-monitor'): ns3::FlowMonitorHelper [class]
     module.add_class('FlowMonitorHelper')
     ## hash.h (module 'core'): ns3::Hasher [class]
@@ -216,33 +218,33 @@
     module.add_class('Object', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter >'])
     ## object.h (module 'core'): ns3::Object::AggregateIterator [class]
     module.add_class('AggregateIterator', import_from_module='ns.core', outer_class=root_module['ns3::Object'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::FlowClassifier, ns3::empty, ns3::DefaultDeleter<ns3::FlowClassifier> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::FlowClassifier, ns3::empty, ns3::DefaultDeleter<ns3::FlowClassifier>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::FlowClassifier', 'ns3::empty', 'ns3::DefaultDeleter<ns3::FlowClassifier>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv4MulticastRoute', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv4Route', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv4Route>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::OutputStreamWrapper', 'ns3::empty', 'ns3::DefaultDeleter<ns3::OutputStreamWrapper>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::QueueItem', 'ns3::empty', 'ns3::DefaultDeleter<ns3::QueueItem>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
     ## socket.h (module 'network'): ns3::Socket [class]
     module.add_class('Socket', import_from_module='ns.network', parent=root_module['ns3::Object'])
@@ -505,7 +507,7 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::Socket>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## queue-item.h (module 'network'): ns3::QueueDiscItem [class]
     module.add_class('QueueDiscItem', import_from_module='ns.network', parent=root_module['ns3::QueueItem'])
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     module.add_container('std::vector< ns3::Ipv6Address >', 'ns3::Ipv6Address', container_type='vector')
     module.add_container('std::vector< unsigned int >', 'unsigned int', container_type='vector')
     module.add_container('std::vector< unsigned long long >', 'long unsigned int', container_type='vector')
@@ -516,18 +518,18 @@
     module.add_container('std::vector< std::pair< ns3::Ipv4Header::DscpType, unsigned int > >', 'std::pair< ns3::Ipv4Header::DscpType, unsigned int >', container_type='vector')
     module.add_container('std::map< unsigned int, unsigned int >', ('unsigned int', 'unsigned int'), container_type='map')
     module.add_container('std::vector< std::pair< ns3::Ipv6Header::DscpType, unsigned int > >', 'std::pair< ns3::Ipv6Header::DscpType, unsigned int >', container_type='vector')
-    typehandlers.add_type_alias('void ( * ) ( std::ostream & )', 'ns3::TimePrinter')
-    typehandlers.add_type_alias('void ( * ) ( std::ostream & )*', 'ns3::TimePrinter*')
-    typehandlers.add_type_alias('void ( * ) ( std::ostream & )&', 'ns3::TimePrinter&')
-    typehandlers.add_type_alias('void ( * ) ( std::ostream & )', 'ns3::NodePrinter')
-    typehandlers.add_type_alias('void ( * ) ( std::ostream & )*', 'ns3::NodePrinter*')
-    typehandlers.add_type_alias('void ( * ) ( std::ostream & )&', 'ns3::NodePrinter&')
     typehandlers.add_type_alias('uint32_t', 'ns3::FlowId')
     typehandlers.add_type_alias('uint32_t*', 'ns3::FlowId*')
     typehandlers.add_type_alias('uint32_t&', 'ns3::FlowId&')
     typehandlers.add_type_alias('uint32_t', 'ns3::FlowPacketId')
     typehandlers.add_type_alias('uint32_t*', 'ns3::FlowPacketId*')
     typehandlers.add_type_alias('uint32_t&', 'ns3::FlowPacketId&')
+    typehandlers.add_type_alias('void ( * ) ( std::ostream & )', 'ns3::TimePrinter')
+    typehandlers.add_type_alias('void ( * ) ( std::ostream & )*', 'ns3::TimePrinter*')
+    typehandlers.add_type_alias('void ( * ) ( std::ostream & )&', 'ns3::TimePrinter&')
+    typehandlers.add_type_alias('void ( * ) ( std::ostream & )', 'ns3::NodePrinter')
+    typehandlers.add_type_alias('void ( * ) ( std::ostream & )*', 'ns3::NodePrinter*')
+    typehandlers.add_type_alias('void ( * ) ( std::ostream & )&', 'ns3::NodePrinter&')
     
     ## Register a nested module for the namespace FatalImpl
     
@@ -3236,8 +3238,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -3460,14 +3462,14 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('>=')
     cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_unary_numeric_operator('-')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
     cls.add_constructor([])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(double const value) [constructor]
@@ -3486,6 +3488,8 @@
     cls.add_constructor([param('long unsigned int const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int const v) [constructor]
     cls.add_constructor([param('long long unsigned int const', 'v')])
+    ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int128_t const v) [constructor]
+    cls.add_constructor([param('int128_t const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t const hi, uint64_t const lo) [constructor]
     cls.add_constructor([param('int64_t const', 'hi'), param('uint64_t const', 'lo')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [constructor]
@@ -3990,100 +3994,100 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3FlowClassifier_Ns3Empty_Ns3DefaultDeleter__lt__ns3FlowClassifier__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::FlowClassifier, ns3::empty, ns3::DefaultDeleter<ns3::FlowClassifier> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::FlowClassifier, ns3::empty, ns3::DefaultDeleter<ns3::FlowClassifier>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::FlowClassifier, ns3::empty, ns3::DefaultDeleter<ns3::FlowClassifier> >::SimpleRefCount(ns3::SimpleRefCount<ns3::FlowClassifier, ns3::empty, ns3::DefaultDeleter<ns3::FlowClassifier> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::FlowClassifier, ns3::empty, ns3::DefaultDeleter<ns3::FlowClassifier>>::SimpleRefCount(ns3::SimpleRefCount<ns3::FlowClassifier, ns3::empty, ns3::DefaultDeleter<ns3::FlowClassifier>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::FlowClassifier, ns3::empty, ns3::DefaultDeleter< ns3::FlowClassifier > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Ipv4MulticastRoute_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv4MulticastRoute__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter< ns3::Ipv4MulticastRoute > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Ipv4Route_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv4Route__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter< ns3::Ipv4Route > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3OutputStreamWrapper_Ns3Empty_Ns3DefaultDeleter__lt__ns3OutputStreamWrapper__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter< ns3::OutputStreamWrapper > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3QueueItem_Ns3Empty_Ns3DefaultDeleter__lt__ns3QueueItem__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> >::SimpleRefCount(ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>>::SimpleRefCount(ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::QueueItem, ns3::empty, ns3::DefaultDeleter< ns3::QueueItem > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
@@ -4206,7 +4210,7 @@
                    'uint8_t', 
                    [param('uint8_t', 'ipTos')], 
                    is_static=True)
-    ## socket.h (module 'network'): void ns3::Socket::Ipv6JoinGroup(ns3::Ipv6Address address, ns3::Socket::Ipv6MulticastFilterMode filterMode, std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address> > sourceAddresses) [member function]
+    ## socket.h (module 'network'): void ns3::Socket::Ipv6JoinGroup(ns3::Ipv6Address address, ns3::Socket::Ipv6MulticastFilterMode filterMode, std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address>> sourceAddresses) [member function]
     cls.add_method('Ipv6JoinGroup', 
                    'void', 
                    [param('ns3::Ipv6Address', 'address'), param('ns3::Socket::Ipv6MulticastFilterMode', 'filterMode'), param('std::vector< ns3::Ipv6Address >', 'sourceAddresses')], 
@@ -5599,7 +5603,7 @@
                    'ns3::Ipv4FlowClassifier::FiveTuple', 
                    [param('uint32_t', 'flowId')], 
                    is_const=True)
-    ## ipv4-flow-classifier.h (module 'flow-monitor'): std::vector<std::pair<ns3::Ipv4Header::DscpType, unsigned int>, std::allocator<std::pair<ns3::Ipv4Header::DscpType, unsigned int> > > ns3::Ipv4FlowClassifier::GetDscpCounts(ns3::FlowId flowId) const [member function]
+    ## ipv4-flow-classifier.h (module 'flow-monitor'): std::vector<std::pair<ns3::Ipv4Header::DscpType, unsigned int>, std::allocator<std::pair<ns3::Ipv4Header::DscpType, unsigned int>>> ns3::Ipv4FlowClassifier::GetDscpCounts(ns3::FlowId flowId) const [member function]
     cls.add_method('GetDscpCounts', 
                    'std::vector< std::pair< ns3::Ipv4Header::DscpType, unsigned int > >', 
                    [param('uint32_t', 'flowId')], 
@@ -5946,7 +5950,7 @@
                    'ns3::Ipv4Address', 
                    [], 
                    is_const=True)
-    ## ipv4-route.h (module 'internet'): std::map<unsigned int, unsigned int, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, unsigned int> > > ns3::Ipv4MulticastRoute::GetOutputTtlMap() const [member function]
+    ## ipv4-route.h (module 'internet'): std::map<unsigned int, unsigned int, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, unsigned int>>> ns3::Ipv4MulticastRoute::GetOutputTtlMap() const [member function]
     cls.add_method('GetOutputTtlMap', 
                    'std::map< unsigned int, unsigned int >', 
                    [], 
@@ -6320,7 +6324,7 @@
                    'ns3::Ipv6FlowClassifier::FiveTuple', 
                    [param('uint32_t', 'flowId')], 
                    is_const=True)
-    ## ipv6-flow-classifier.h (module 'flow-monitor'): std::vector<std::pair<ns3::Ipv6Header::DscpType, unsigned int>, std::allocator<std::pair<ns3::Ipv6Header::DscpType, unsigned int> > > ns3::Ipv6FlowClassifier::GetDscpCounts(ns3::FlowId flowId) const [member function]
+    ## ipv6-flow-classifier.h (module 'flow-monitor'): std::vector<std::pair<ns3::Ipv6Header::DscpType, unsigned int>, std::allocator<std::pair<ns3::Ipv6Header::DscpType, unsigned int>>> ns3::Ipv6FlowClassifier::GetDscpCounts(ns3::FlowId flowId) const [member function]
     cls.add_method('GetDscpCounts', 
                    'std::vector< std::pair< ns3::Ipv6Header::DscpType, unsigned int > >', 
                    [param('uint32_t', 'flowId')], 
@@ -6941,10 +6945,16 @@
     cls.add_method('ExtractNeighborIndex', 
                    'uint32_t', 
                    [param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetEpoch() const [member function]
+    cls.add_method('GetEpoch', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() const [member function]
     cls.add_method('GetRemainingBits', 
                    'uint32_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -6955,6 +6965,10 @@
                    'uint32_t', 
                    [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
+    ## nix-vector.h (module 'network'): void ns3::NixVector::SetEpoch(uint32_t epoch) [member function]
+    cls.add_method('SetEpoch', 
+                   'void', 
+                   [param('uint32_t', 'epoch')])
     return
 
 def register_Ns3Node_methods(root_module, cls):
@@ -7286,10 +7300,11 @@
                    'uint32_t', 
                    [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) const [member function]
     cls.add_method('SetNixVector', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')], 
+                   is_const=True)
     ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
     cls.add_method('ToString', 
                    'std::string', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/flow-monitor/bindings/modulegen__gcc_LP64.py ns-3.36/src/flow-monitor/bindings/modulegen__gcc_LP64.py
--- ns-3.35/src/flow-monitor/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/flow-monitor/bindings/modulegen__gcc_LP64.py	2022-04-30 18:23:57.846733600 -0700
@@ -71,6 +71,8 @@
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::TraceSourceAccessor'])
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'], import_from_module='ns.core')
     ## flow-monitor-helper.h (module 'flow-monitor'): ns3::FlowMonitorHelper [class]
     module.add_class('FlowMonitorHelper')
     ## hash.h (module 'core'): ns3::Hasher [class]
@@ -216,33 +218,33 @@
     module.add_class('Object', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter >'])
     ## object.h (module 'core'): ns3::Object::AggregateIterator [class]
     module.add_class('AggregateIterator', import_from_module='ns.core', outer_class=root_module['ns3::Object'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::FlowClassifier, ns3::empty, ns3::DefaultDeleter<ns3::FlowClassifier> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::FlowClassifier, ns3::empty, ns3::DefaultDeleter<ns3::FlowClassifier>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::FlowClassifier', 'ns3::empty', 'ns3::DefaultDeleter<ns3::FlowClassifier>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv4MulticastRoute', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv4Route', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv4Route>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::OutputStreamWrapper', 'ns3::empty', 'ns3::DefaultDeleter<ns3::OutputStreamWrapper>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::QueueItem', 'ns3::empty', 'ns3::DefaultDeleter<ns3::QueueItem>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
     ## socket.h (module 'network'): ns3::Socket [class]
     module.add_class('Socket', import_from_module='ns.network', parent=root_module['ns3::Object'])
@@ -505,7 +507,7 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::Socket>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## queue-item.h (module 'network'): ns3::QueueDiscItem [class]
     module.add_class('QueueDiscItem', import_from_module='ns.network', parent=root_module['ns3::QueueItem'])
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     module.add_container('std::vector< ns3::Ipv6Address >', 'ns3::Ipv6Address', container_type='vector')
     module.add_container('std::vector< unsigned int >', 'unsigned int', container_type='vector')
     module.add_container('std::vector< unsigned long >', 'long unsigned int', container_type='vector')
@@ -516,18 +518,18 @@
     module.add_container('std::vector< std::pair< ns3::Ipv4Header::DscpType, unsigned int > >', 'std::pair< ns3::Ipv4Header::DscpType, unsigned int >', container_type='vector')
     module.add_container('std::map< unsigned int, unsigned int >', ('unsigned int', 'unsigned int'), container_type='map')
     module.add_container('std::vector< std::pair< ns3::Ipv6Header::DscpType, unsigned int > >', 'std::pair< ns3::Ipv6Header::DscpType, unsigned int >', container_type='vector')
-    typehandlers.add_type_alias('void ( * ) ( std::ostream & )', 'ns3::TimePrinter')
-    typehandlers.add_type_alias('void ( * ) ( std::ostream & )*', 'ns3::TimePrinter*')
-    typehandlers.add_type_alias('void ( * ) ( std::ostream & )&', 'ns3::TimePrinter&')
-    typehandlers.add_type_alias('void ( * ) ( std::ostream & )', 'ns3::NodePrinter')
-    typehandlers.add_type_alias('void ( * ) ( std::ostream & )*', 'ns3::NodePrinter*')
-    typehandlers.add_type_alias('void ( * ) ( std::ostream & )&', 'ns3::NodePrinter&')
     typehandlers.add_type_alias('uint32_t', 'ns3::FlowId')
     typehandlers.add_type_alias('uint32_t*', 'ns3::FlowId*')
     typehandlers.add_type_alias('uint32_t&', 'ns3::FlowId&')
     typehandlers.add_type_alias('uint32_t', 'ns3::FlowPacketId')
     typehandlers.add_type_alias('uint32_t*', 'ns3::FlowPacketId*')
     typehandlers.add_type_alias('uint32_t&', 'ns3::FlowPacketId&')
+    typehandlers.add_type_alias('void ( * ) ( std::ostream & )', 'ns3::TimePrinter')
+    typehandlers.add_type_alias('void ( * ) ( std::ostream & )*', 'ns3::TimePrinter*')
+    typehandlers.add_type_alias('void ( * ) ( std::ostream & )&', 'ns3::TimePrinter&')
+    typehandlers.add_type_alias('void ( * ) ( std::ostream & )', 'ns3::NodePrinter')
+    typehandlers.add_type_alias('void ( * ) ( std::ostream & )*', 'ns3::NodePrinter*')
+    typehandlers.add_type_alias('void ( * ) ( std::ostream & )&', 'ns3::NodePrinter&')
     
     ## Register a nested module for the namespace FatalImpl
     
@@ -3236,8 +3238,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -3460,14 +3462,14 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('>=')
     cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_unary_numeric_operator('-')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
     cls.add_constructor([])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(double const value) [constructor]
@@ -3486,6 +3488,8 @@
     cls.add_constructor([param('long unsigned int const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int const v) [constructor]
     cls.add_constructor([param('long long unsigned int const', 'v')])
+    ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int128_t const v) [constructor]
+    cls.add_constructor([param('int128_t const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t const hi, uint64_t const lo) [constructor]
     cls.add_constructor([param('int64_t const', 'hi'), param('uint64_t const', 'lo')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [constructor]
@@ -3990,100 +3994,100 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3FlowClassifier_Ns3Empty_Ns3DefaultDeleter__lt__ns3FlowClassifier__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::FlowClassifier, ns3::empty, ns3::DefaultDeleter<ns3::FlowClassifier> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::FlowClassifier, ns3::empty, ns3::DefaultDeleter<ns3::FlowClassifier>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::FlowClassifier, ns3::empty, ns3::DefaultDeleter<ns3::FlowClassifier> >::SimpleRefCount(ns3::SimpleRefCount<ns3::FlowClassifier, ns3::empty, ns3::DefaultDeleter<ns3::FlowClassifier> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::FlowClassifier, ns3::empty, ns3::DefaultDeleter<ns3::FlowClassifier>>::SimpleRefCount(ns3::SimpleRefCount<ns3::FlowClassifier, ns3::empty, ns3::DefaultDeleter<ns3::FlowClassifier>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::FlowClassifier, ns3::empty, ns3::DefaultDeleter< ns3::FlowClassifier > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Ipv4MulticastRoute_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv4MulticastRoute__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter< ns3::Ipv4MulticastRoute > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Ipv4Route_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv4Route__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter< ns3::Ipv4Route > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3OutputStreamWrapper_Ns3Empty_Ns3DefaultDeleter__lt__ns3OutputStreamWrapper__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter< ns3::OutputStreamWrapper > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3QueueItem_Ns3Empty_Ns3DefaultDeleter__lt__ns3QueueItem__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> >::SimpleRefCount(ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>>::SimpleRefCount(ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::QueueItem, ns3::empty, ns3::DefaultDeleter< ns3::QueueItem > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
@@ -4206,7 +4210,7 @@
                    'uint8_t', 
                    [param('uint8_t', 'ipTos')], 
                    is_static=True)
-    ## socket.h (module 'network'): void ns3::Socket::Ipv6JoinGroup(ns3::Ipv6Address address, ns3::Socket::Ipv6MulticastFilterMode filterMode, std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address> > sourceAddresses) [member function]
+    ## socket.h (module 'network'): void ns3::Socket::Ipv6JoinGroup(ns3::Ipv6Address address, ns3::Socket::Ipv6MulticastFilterMode filterMode, std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address>> sourceAddresses) [member function]
     cls.add_method('Ipv6JoinGroup', 
                    'void', 
                    [param('ns3::Ipv6Address', 'address'), param('ns3::Socket::Ipv6MulticastFilterMode', 'filterMode'), param('std::vector< ns3::Ipv6Address >', 'sourceAddresses')], 
@@ -5599,7 +5603,7 @@
                    'ns3::Ipv4FlowClassifier::FiveTuple', 
                    [param('uint32_t', 'flowId')], 
                    is_const=True)
-    ## ipv4-flow-classifier.h (module 'flow-monitor'): std::vector<std::pair<ns3::Ipv4Header::DscpType, unsigned int>, std::allocator<std::pair<ns3::Ipv4Header::DscpType, unsigned int> > > ns3::Ipv4FlowClassifier::GetDscpCounts(ns3::FlowId flowId) const [member function]
+    ## ipv4-flow-classifier.h (module 'flow-monitor'): std::vector<std::pair<ns3::Ipv4Header::DscpType, unsigned int>, std::allocator<std::pair<ns3::Ipv4Header::DscpType, unsigned int>>> ns3::Ipv4FlowClassifier::GetDscpCounts(ns3::FlowId flowId) const [member function]
     cls.add_method('GetDscpCounts', 
                    'std::vector< std::pair< ns3::Ipv4Header::DscpType, unsigned int > >', 
                    [param('uint32_t', 'flowId')], 
@@ -5946,7 +5950,7 @@
                    'ns3::Ipv4Address', 
                    [], 
                    is_const=True)
-    ## ipv4-route.h (module 'internet'): std::map<unsigned int, unsigned int, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, unsigned int> > > ns3::Ipv4MulticastRoute::GetOutputTtlMap() const [member function]
+    ## ipv4-route.h (module 'internet'): std::map<unsigned int, unsigned int, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, unsigned int>>> ns3::Ipv4MulticastRoute::GetOutputTtlMap() const [member function]
     cls.add_method('GetOutputTtlMap', 
                    'std::map< unsigned int, unsigned int >', 
                    [], 
@@ -6320,7 +6324,7 @@
                    'ns3::Ipv6FlowClassifier::FiveTuple', 
                    [param('uint32_t', 'flowId')], 
                    is_const=True)
-    ## ipv6-flow-classifier.h (module 'flow-monitor'): std::vector<std::pair<ns3::Ipv6Header::DscpType, unsigned int>, std::allocator<std::pair<ns3::Ipv6Header::DscpType, unsigned int> > > ns3::Ipv6FlowClassifier::GetDscpCounts(ns3::FlowId flowId) const [member function]
+    ## ipv6-flow-classifier.h (module 'flow-monitor'): std::vector<std::pair<ns3::Ipv6Header::DscpType, unsigned int>, std::allocator<std::pair<ns3::Ipv6Header::DscpType, unsigned int>>> ns3::Ipv6FlowClassifier::GetDscpCounts(ns3::FlowId flowId) const [member function]
     cls.add_method('GetDscpCounts', 
                    'std::vector< std::pair< ns3::Ipv6Header::DscpType, unsigned int > >', 
                    [param('uint32_t', 'flowId')], 
@@ -6941,10 +6945,16 @@
     cls.add_method('ExtractNeighborIndex', 
                    'uint32_t', 
                    [param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetEpoch() const [member function]
+    cls.add_method('GetEpoch', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() const [member function]
     cls.add_method('GetRemainingBits', 
                    'uint32_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -6955,6 +6965,10 @@
                    'uint32_t', 
                    [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
+    ## nix-vector.h (module 'network'): void ns3::NixVector::SetEpoch(uint32_t epoch) [member function]
+    cls.add_method('SetEpoch', 
+                   'void', 
+                   [param('uint32_t', 'epoch')])
     return
 
 def register_Ns3Node_methods(root_module, cls):
@@ -7286,10 +7300,11 @@
                    'uint32_t', 
                    [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) const [member function]
     cls.add_method('SetNixVector', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')], 
+                   is_const=True)
     ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
     cls.add_method('ToString', 
                    'std::string', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/flow-monitor/CMakeLists.txt ns-3.36/src/flow-monitor/CMakeLists.txt
--- ns-3.35/src/flow-monitor/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/flow-monitor/CMakeLists.txt	2022-04-30 18:23:57.846733600 -0700
@@ -0,0 +1,23 @@
+build_lib(
+  LIBNAME flow-monitor
+  SOURCE_FILES
+    helper/flow-monitor-helper.cc
+    model/flow-classifier.cc
+    model/flow-monitor.cc
+    model/flow-probe.cc
+    model/ipv4-flow-classifier.cc
+    model/ipv4-flow-probe.cc
+    model/ipv6-flow-classifier.cc
+    model/ipv6-flow-probe.cc
+  HEADER_FILES
+    helper/flow-monitor-helper.h
+    model/flow-classifier.h
+    model/flow-monitor.h
+    model/flow-probe.h
+    model/ipv4-flow-classifier.h
+    model/ipv4-flow-probe.h
+    model/ipv6-flow-classifier.h
+    model/ipv6-flow-probe.h
+  LIBRARIES_TO_LINK ${libinternet}
+                    ${libconfig-store}
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/flow-monitor/examples/CMakeLists.txt ns-3.36/src/flow-monitor/examples/CMakeLists.txt
--- ns-3.35/src/flow-monitor/examples/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/flow-monitor/examples/CMakeLists.txt	2022-04-30 18:23:57.846733600 -0700
@@ -0,0 +1 @@
+
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/flow-monitor/examples/wifi-olsr-flowmon.py ns-3.36/src/flow-monitor/examples/wifi-olsr-flowmon.py
--- ns-3.35/src/flow-monitor/examples/wifi-olsr-flowmon.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/flow-monitor/examples/wifi-olsr-flowmon.py	2022-04-30 18:23:57.846733600 -0700
@@ -56,7 +56,6 @@
     wifiChannel = ns.wifi.YansWifiChannelHelper.Default()
     wifiPhy.SetChannel(wifiChannel.Create())
     ssid = ns.wifi.Ssid("wifi-default")
-    wifi.SetRemoteStationManager("ns3::ArfWifiManager")
     wifiMac.SetType ("ns3::AdhocWifiMac",
                      "Ssid", ns.wifi.SsidValue(ssid))
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/flow-monitor/examples/wscript ns-3.36/src/flow-monitor/examples/wscript
--- ns-3.35/src/flow-monitor/examples/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/flow-monitor/examples/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,4 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    bld.register_ns3_script('wifi-olsr-flowmon.py', ['flow-monitor', 'internet', 'wifi', 'olsr', 'applications', 'mobility'])
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/flow-monitor/helper/flow-monitor-helper.h ns-3.36/src/flow-monitor/helper/flow-monitor-helper.h
--- ns-3.35/src/flow-monitor/helper/flow-monitor-helper.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/flow-monitor/helper/flow-monitor-helper.h	2022-04-30 18:23:57.846733600 -0700
@@ -43,6 +43,10 @@
   FlowMonitorHelper ();
   ~FlowMonitorHelper ();
 
+  // Delete copy constructor and assignment operator to avoid misuse
+  FlowMonitorHelper (const FlowMonitorHelper &) = delete;
+  FlowMonitorHelper& operator= (const FlowMonitorHelper &) = delete;
+
   /**
    * \brief Set an attribute for the to-be-created FlowMonitor object
    * \param n1 attribute name
@@ -113,20 +117,6 @@
   void SerializeToXmlFile (std::string fileName, bool enableHistograms, bool enableProbes);
 
 private:
-  /**
-   * \brief Copy constructor
-   *
-   * Defined and unimplemented to avoid misuse
-   */
-  FlowMonitorHelper (const FlowMonitorHelper&);
-  /**
-   * \brief Copy constructor
-   *
-   * Defined and unimplemented to avoid misuse
-   * \returns
-   */
-  FlowMonitorHelper& operator= (const FlowMonitorHelper&);
-
   ObjectFactory m_monitorFactory;        //!< Object factory
   Ptr<FlowMonitor> m_flowMonitor;        //!< the FlowMonitor object
   Ptr<FlowClassifier> m_flowClassifier4; //!< the FlowClassifier object for IPv4
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/flow-monitor/model/flow-classifier.h ns-3.36/src/flow-monitor/model/flow-classifier.h
--- ns-3.35/src/flow-monitor/model/flow-classifier.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/flow-monitor/model/flow-classifier.h	2022-04-30 18:23:57.846733600 -0700
@@ -55,17 +55,15 @@
 private:
   FlowId m_lastNewFlowId; //!< Last known Flow ID
 
-  /// Defined and not implemented to avoid misuse
-  FlowClassifier (FlowClassifier const &);
-  /// Defined and not implemented to avoid misuse
-  /// \returns
-  FlowClassifier& operator= (FlowClassifier const &);
-
 public:
 
   FlowClassifier ();
   virtual ~FlowClassifier ();
 
+  // Delete copy constructor and assignment operator to avoid misuse
+  FlowClassifier (FlowClassifier const &) = delete;
+  FlowClassifier& operator= (FlowClassifier const &) = delete;
+
   /// Serializes the results to an std::ostream in XML format
   /// \param os the output stream
   /// \param indent number of spaces to use as base indentation level
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/flow-monitor/model/flow-probe.h ns-3.36/src/flow-monitor/model/flow-probe.h
--- ns-3.35/src/flow-monitor/model/flow-probe.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/flow-monitor/model/flow-probe.h	2022-04-30 18:23:57.846733600 -0700
@@ -38,13 +38,6 @@
 /// regarding only the packets that pass through that probe.
 class FlowProbe : public Object
 {
-private:
-  /// Defined and not implemented to avoid misuse
-  FlowProbe (FlowProbe const &);
-  /// Defined and not implemented to avoid misuse
-  /// \returns
-  FlowProbe& operator= (FlowProbe const &);
-
 protected:
   /// Constructor
   /// \param flowMonitor the FlowMonitor this probe is associated with
@@ -53,6 +46,10 @@
 
 public:
   virtual ~FlowProbe ();
+  
+  // Delete copy constructor and assignment operator to avoid misuse
+  FlowProbe (FlowProbe const &) = delete;
+  FlowProbe& operator= (FlowProbe const &) = delete;
 
   /// Register this type.
   /// \return The TypeId.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/flow-monitor/wscript ns-3.36/src/flow-monitor/wscript
--- ns-3.35/src/flow-monitor/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/flow-monitor/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,41 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    obj = bld.create_ns3_module('flow-monitor', ['internet', 'config-store', 'stats'])
-    obj.source = ["model/%s" % s for s in [
-       'flow-monitor.cc',
-       'flow-classifier.cc',
-       'flow-probe.cc',
-       'ipv4-flow-classifier.cc',
-       'ipv4-flow-probe.cc',
-       'ipv6-flow-classifier.cc',
-       'ipv6-flow-probe.cc',
-        ]]
-    obj.source.append("helper/flow-monitor-helper.cc")
-
-    module_test = bld.create_ns3_module_test_library('flow-monitor')
-    module_test.source = [ ]
-
-    # Tests encapsulating example programs should be listed here
-    if (bld.env['ENABLE_EXAMPLES']):
-        module_test.source.extend([
-        #   'test/flow-monitor-examples-test-suite.cc',
-            ])
-    
-    headers = bld(features='ns3header')
-    headers.module = 'flow-monitor'
-    headers.source = ["model/%s" % s for s in [
-       'flow-monitor.h',
-       'flow-probe.h',
-       'flow-classifier.h',
-       'ipv4-flow-classifier.h',
-       'ipv4-flow-probe.h',
-       'ipv6-flow-classifier.h',
-       'ipv6-flow-probe.h',
-        ]]
-    headers.source.append("helper/flow-monitor-helper.h")
-
-    if bld.env['ENABLE_EXAMPLES']:
-        bld.recurse('examples')
-
-    bld.ns3_python_bindings()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/bindings/callbacks_list.py ns-3.36/src/internet/bindings/callbacks_list.py
--- ns-3.35/src/internet/bindings/callbacks_list.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/bindings/callbacks_list.py	2022-04-30 18:23:57.850733500 -0700
@@ -3,12 +3,8 @@
     ['void', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['bool', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'const ns3::Address &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['bool', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'const ns3::Address &', 'const ns3::Address &', 'ns3::NetDevice::PacketType', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Ptr<const ns3::ArpCache>', 'ns3::Ipv4Address', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'const ns3::Address &', 'const ns3::Address &', 'ns3::NetDevice::PacketType', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Ptr<ns3::Packet>', 'ns3::Ipv4Address', 'ns3::Ipv4Address', 'unsigned char', 'ns3::Ptr<ns3::Ipv4Route>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Ptr<ns3::Packet>', 'ns3::Ipv6Address', 'ns3::Ipv6Address', 'unsigned char', 'ns3::Ptr<ns3::Ipv6Route>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<ns3::Socket>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['bool', 'ns3::Ptr<ns3::Socket>', 'const ns3::Address &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<ns3::Socket>', 'const ns3::Address &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
@@ -19,7 +15,11 @@
     ['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::Ptr<ns3::Ipv6>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'const ns3::Ipv6Header &', 'ns3::Ptr<const ns3::Packet>', 'ns3::Ipv6L3Protocol::DropReason', 'ns3::Ptr<ns3::Ipv6>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'const ns3::Ipv6Header &', 'ns3::Ptr<const ns3::Packet>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'std::basic_string<char>', 'ns3::Ptr<const ns3::Packet>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Ptr<const ns3::ArpCache>', 'ns3::Ipv4Address', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Ptr<ns3::Packet>', 'ns3::Ipv4Address', 'ns3::Ipv4Address', 'unsigned char', 'ns3::Ptr<ns3::Ipv4Route>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Ptr<ns3::Packet>', 'ns3::Ipv6Address', 'ns3::Ipv6Address', 'unsigned char', 'ns3::Ptr<ns3::Ipv6Route>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<ns3::Packet>', 'ns3::Ipv4Header', 'unsigned short', 'ns3::Ptr<ns3::Ipv4Interface>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ipv4Address', 'unsigned char', 'unsigned char', 'unsigned char', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'unsigned int', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/bindings/modulegen__gcc_ILP32.py ns-3.36/src/internet/bindings/modulegen__gcc_ILP32.py
--- ns-3.35/src/internet/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/bindings/modulegen__gcc_ILP32.py	2022-04-30 18:23:57.854733500 -0700
@@ -87,6 +87,8 @@
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::TraceSourceAccessor'])
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'], import_from_module='ns.core')
     ## global-route-manager.h (module 'internet'): ns3::GlobalRouteManager [class]
     module.add_class('GlobalRouteManager')
     ## global-route-manager-impl.h (module 'internet'): ns3::GlobalRouteManagerImpl [class]
@@ -345,9 +347,9 @@
     module.add_class('TracedValue', import_from_module='ns.core', template_parameters=['ns3::DataRate'])
     ## traced-value.h (module 'core'): ns3::TracedValue<ns3::DataRate> [class]
     root_module['ns3::TracedValue< ns3::DataRate >'].implicitly_converts_to(root_module['ns3::DataRate'])
-    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::SequenceNumber<unsigned int, int> > [class]
+    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::SequenceNumber<unsigned int, int>> [class]
     module.add_class('TracedValue', import_from_module='ns.core', template_parameters=['ns3::SequenceNumber<unsigned int, int>'])
-    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::SequenceNumber<unsigned int, int> > [class]
+    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::SequenceNumber<unsigned int, int>> [class]
     root_module['ns3::TracedValue< ns3::SequenceNumber<unsigned int, int> >'].implicitly_converts_to(root_module['ns3::SequenceNumber32'])
     ## traced-value.h (module 'core'): ns3::TracedValue<ns3::TcpSocket::TcpStates_t> [class]
     module.add_class('TracedValue', import_from_module='ns.core', template_parameters=['ns3::TcpSocket::TcpStates_t'])
@@ -517,35 +519,35 @@
     module.add_class('RttMeanDeviation', parent=root_module['ns3::RttEstimator'])
     ## random-variable-stream.h (module 'core'): ns3::SequentialRandomVariable [class]
     module.add_class('SequentialRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv4MulticastRoute', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv4Route', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv4Route>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv6MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6MulticastRoute> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv6MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6MulticastRoute>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv6MulticastRoute', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv6MulticastRoute>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv6Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6Route> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv6Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6Route>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv6Route', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv6Route>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::OutputStreamWrapper', 'ns3::empty', 'ns3::DefaultDeleter<ns3::OutputStreamWrapper>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::QueueItem', 'ns3::empty', 'ns3::DefaultDeleter<ns3::QueueItem>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
     ## socket.h (module 'network'): ns3::Socket [class]
     module.add_class('Socket', import_from_module='ns.network', parent=root_module['ns3::Object'])
@@ -1184,7 +1186,7 @@
     module.add_container('std::vector< bool >', 'bool', container_type='vector')
     module.add_container('std::list< ns3::Ipv6EndPoint * >', 'ns3::Ipv6EndPoint *', container_type='list')
     module.add_container('ns3::Ipv6EndPointDemux::EndPoints', 'ns3::Ipv6EndPoint *', container_type='list')
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     module.add_container('std::list< ns3::RipRte >', 'ns3::RipRte', container_type='list')
     module.add_container('std::list< ns3::RipNgRte >', 'ns3::RipNgRte', container_type='list')
     module.add_container('std::vector< ns3::Ipv6Address >', 'ns3::Ipv6Address', container_type='vector')
@@ -3696,7 +3698,7 @@
     cls.add_constructor([param('ns3::Ipv4MulticastRoutingTableEntry const &', 'route')])
     ## ipv4-routing-table-entry.h (module 'internet'): ns3::Ipv4MulticastRoutingTableEntry::Ipv4MulticastRoutingTableEntry(ns3::Ipv4MulticastRoutingTableEntry const * route) [constructor]
     cls.add_constructor([param('ns3::Ipv4MulticastRoutingTableEntry const *', 'route')])
-    ## ipv4-routing-table-entry.h (module 'internet'): static ns3::Ipv4MulticastRoutingTableEntry ns3::Ipv4MulticastRoutingTableEntry::CreateMulticastRoute(ns3::Ipv4Address origin, ns3::Ipv4Address group, uint32_t inputInterface, std::vector<unsigned int, std::allocator<unsigned int> > outputInterfaces) [member function]
+    ## ipv4-routing-table-entry.h (module 'internet'): static ns3::Ipv4MulticastRoutingTableEntry ns3::Ipv4MulticastRoutingTableEntry::CreateMulticastRoute(ns3::Ipv4Address origin, ns3::Ipv4Address group, uint32_t inputInterface, std::vector<unsigned int, std::allocator<unsigned int>> outputInterfaces) [member function]
     cls.add_method('CreateMulticastRoute', 
                    'ns3::Ipv4MulticastRoutingTableEntry', 
                    [param('ns3::Ipv4Address', 'origin'), param('ns3::Ipv4Address', 'group'), param('uint32_t', 'inputInterface'), param('std::vector< unsigned int >', 'outputInterfaces')], 
@@ -3726,7 +3728,7 @@
                    'uint32_t', 
                    [param('uint32_t', 'n')], 
                    is_const=True)
-    ## ipv4-routing-table-entry.h (module 'internet'): std::vector<unsigned int, std::allocator<unsigned int> > ns3::Ipv4MulticastRoutingTableEntry::GetOutputInterfaces() const [member function]
+    ## ipv4-routing-table-entry.h (module 'internet'): std::vector<unsigned int, std::allocator<unsigned int>> ns3::Ipv4MulticastRoutingTableEntry::GetOutputInterfaces() const [member function]
     cls.add_method('GetOutputInterfaces', 
                    'std::vector< unsigned int >', 
                    [], 
@@ -4235,11 +4237,11 @@
     cls.add_method('Assign', 
                    'ns3::Ipv6InterfaceContainer', 
                    [param('ns3::NetDeviceContainer const &', 'c')])
-    ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6InterfaceContainer ns3::Ipv6AddressHelper::Assign(ns3::NetDeviceContainer const & c, std::vector<bool, std::allocator<bool> > withConfiguration) [member function]
+    ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6InterfaceContainer ns3::Ipv6AddressHelper::Assign(ns3::NetDeviceContainer const & c, std::vector<bool, std::allocator<bool>> withConfiguration) [member function]
     cls.add_method('Assign', 
                    'ns3::Ipv6InterfaceContainer', 
                    [param('ns3::NetDeviceContainer const &', 'c'), param('std::vector< bool >', 'withConfiguration')])
-    ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6InterfaceContainer ns3::Ipv6AddressHelper::Assign(ns3::NetDeviceContainer const & c, std::vector<bool, std::allocator<bool> > withConfiguration, std::vector<bool, std::allocator<bool> > onLink) [member function]
+    ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6InterfaceContainer ns3::Ipv6AddressHelper::Assign(ns3::NetDeviceContainer const & c, std::vector<bool, std::allocator<bool>> withConfiguration, std::vector<bool, std::allocator<bool>> onLink) [member function]
     cls.add_method('Assign', 
                    'ns3::Ipv6InterfaceContainer', 
                    [param('ns3::NetDeviceContainer const &', 'c'), param('std::vector< bool >', 'withConfiguration'), param('std::vector< bool >', 'onLink')])
@@ -4543,7 +4545,7 @@
     cls.add_constructor([param('ns3::Ipv6MulticastRoutingTableEntry const &', 'route')])
     ## ipv6-routing-table-entry.h (module 'internet'): ns3::Ipv6MulticastRoutingTableEntry::Ipv6MulticastRoutingTableEntry(ns3::Ipv6MulticastRoutingTableEntry const * route) [constructor]
     cls.add_constructor([param('ns3::Ipv6MulticastRoutingTableEntry const *', 'route')])
-    ## ipv6-routing-table-entry.h (module 'internet'): static ns3::Ipv6MulticastRoutingTableEntry ns3::Ipv6MulticastRoutingTableEntry::CreateMulticastRoute(ns3::Ipv6Address origin, ns3::Ipv6Address group, uint32_t inputInterface, std::vector<unsigned int, std::allocator<unsigned int> > outputInterfaces) [member function]
+    ## ipv6-routing-table-entry.h (module 'internet'): static ns3::Ipv6MulticastRoutingTableEntry ns3::Ipv6MulticastRoutingTableEntry::CreateMulticastRoute(ns3::Ipv6Address origin, ns3::Ipv6Address group, uint32_t inputInterface, std::vector<unsigned int, std::allocator<unsigned int>> outputInterfaces) [member function]
     cls.add_method('CreateMulticastRoute', 
                    'ns3::Ipv6MulticastRoutingTableEntry', 
                    [param('ns3::Ipv6Address', 'origin'), param('ns3::Ipv6Address', 'group'), param('uint32_t', 'inputInterface'), param('std::vector< unsigned int >', 'outputInterfaces')], 
@@ -4573,7 +4575,7 @@
                    'uint32_t', 
                    [param('uint32_t', 'n')], 
                    is_const=True)
-    ## ipv6-routing-table-entry.h (module 'internet'): std::vector<unsigned int, std::allocator<unsigned int> > ns3::Ipv6MulticastRoutingTableEntry::GetOutputInterfaces() const [member function]
+    ## ipv6-routing-table-entry.h (module 'internet'): std::vector<unsigned int, std::allocator<unsigned int>> ns3::Ipv6MulticastRoutingTableEntry::GetOutputInterfaces() const [member function]
     cls.add_method('GetOutputInterfaces', 
                    'std::vector< unsigned int >', 
                    [], 
@@ -6643,40 +6645,40 @@
     return
 
 def register_Ns3TracedValue__Ns3SequenceNumber__lt__unsigned_int__int__gt___methods(root_module, cls):
-    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::SequenceNumber<unsigned int, int> >::TracedValue() [constructor]
+    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::SequenceNumber<unsigned int, int>>::TracedValue() [constructor]
     cls.add_constructor([])
-    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::SequenceNumber<unsigned int, int> >::TracedValue(ns3::TracedValue<ns3::SequenceNumber<unsigned int, int> > const & o) [constructor]
+    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::SequenceNumber<unsigned int, int>>::TracedValue(ns3::TracedValue<ns3::SequenceNumber<unsigned int, int>> const & o) [constructor]
     cls.add_constructor([param('ns3::TracedValue< ns3::SequenceNumber< unsigned int, int > > const &', 'o')])
-    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::SequenceNumber<unsigned int, int> >::TracedValue(ns3::SequenceNumber<unsigned int, int> const & v) [constructor]
+    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::SequenceNumber<unsigned int, int>>::TracedValue(ns3::SequenceNumber<unsigned int, int> const & v) [constructor]
     cls.add_constructor([param('ns3::SequenceNumber< unsigned int, int > const &', 'v')])
-    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::SequenceNumber<unsigned int, int> >::TracedValue(ns3::TracedValue<ns3::SequenceNumber<unsigned int, int> > const & other) [constructor]
+    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::SequenceNumber<unsigned int, int>>::TracedValue(ns3::TracedValue<ns3::SequenceNumber<unsigned int, int>> const & other) [constructor]
     cls.add_constructor([param('ns3::TracedValue< ns3::SequenceNumber< unsigned int, int > > const &', 'other')])
-    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::SequenceNumber<unsigned int, int> >::TracedValue(ns3::TracedValue<ns3::SequenceNumber<unsigned int, int> > const & other) [constructor]
+    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::SequenceNumber<unsigned int, int>>::TracedValue(ns3::TracedValue<ns3::SequenceNumber<unsigned int, int>> const & other) [constructor]
     cls.add_constructor([param('ns3::TracedValue< ns3::SequenceNumber< unsigned int, int > > const &', 'other')])
-    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::SequenceNumber<unsigned int, int> >::TracedValue(int const & other) [constructor]
+    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::SequenceNumber<unsigned int, int>>::TracedValue(int const & other) [constructor]
     cls.add_constructor([param('int const &', 'other')])
-    ## traced-value.h (module 'core'): void ns3::TracedValue<ns3::SequenceNumber<unsigned int, int> >::Connect(ns3::CallbackBase const & cb, std::string path) [member function]
+    ## traced-value.h (module 'core'): void ns3::TracedValue<ns3::SequenceNumber<unsigned int, int>>::Connect(ns3::CallbackBase const & cb, std::string path) [member function]
     cls.add_method('Connect', 
                    'void', 
                    [param('ns3::CallbackBase const &', 'cb'), param('std::string', 'path')])
-    ## traced-value.h (module 'core'): void ns3::TracedValue<ns3::SequenceNumber<unsigned int, int> >::ConnectWithoutContext(ns3::CallbackBase const & cb) [member function]
+    ## traced-value.h (module 'core'): void ns3::TracedValue<ns3::SequenceNumber<unsigned int, int>>::ConnectWithoutContext(ns3::CallbackBase const & cb) [member function]
     cls.add_method('ConnectWithoutContext', 
                    'void', 
                    [param('ns3::CallbackBase const &', 'cb')])
-    ## traced-value.h (module 'core'): void ns3::TracedValue<ns3::SequenceNumber<unsigned int, int> >::Disconnect(ns3::CallbackBase const & cb, std::string path) [member function]
+    ## traced-value.h (module 'core'): void ns3::TracedValue<ns3::SequenceNumber<unsigned int, int>>::Disconnect(ns3::CallbackBase const & cb, std::string path) [member function]
     cls.add_method('Disconnect', 
                    'void', 
                    [param('ns3::CallbackBase const &', 'cb'), param('std::string', 'path')])
-    ## traced-value.h (module 'core'): void ns3::TracedValue<ns3::SequenceNumber<unsigned int, int> >::DisconnectWithoutContext(ns3::CallbackBase const & cb) [member function]
+    ## traced-value.h (module 'core'): void ns3::TracedValue<ns3::SequenceNumber<unsigned int, int>>::DisconnectWithoutContext(ns3::CallbackBase const & cb) [member function]
     cls.add_method('DisconnectWithoutContext', 
                    'void', 
                    [param('ns3::CallbackBase const &', 'cb')])
-    ## traced-value.h (module 'core'): ns3::SequenceNumber<unsigned int, int> ns3::TracedValue<ns3::SequenceNumber<unsigned int, int> >::Get() const [member function]
+    ## traced-value.h (module 'core'): ns3::SequenceNumber<unsigned int, int> ns3::TracedValue<ns3::SequenceNumber<unsigned int, int>>::Get() const [member function]
     cls.add_method('Get', 
                    'ns3::SequenceNumber< unsigned int, int >', 
                    [], 
                    is_const=True)
-    ## traced-value.h (module 'core'): void ns3::TracedValue<ns3::SequenceNumber<unsigned int, int> >::Set(ns3::SequenceNumber<unsigned int, int> const & v) [member function]
+    ## traced-value.h (module 'core'): void ns3::TracedValue<ns3::SequenceNumber<unsigned int, int>>::Set(ns3::SequenceNumber<unsigned int, int> const & v) [member function]
     cls.add_method('Set', 
                    'void', 
                    [param('ns3::SequenceNumber< unsigned int, int > const &', 'v')])
@@ -6834,14 +6836,10 @@
     cls.add_constructor([param('ns3::TracedValue< unsigned int > const &', 'o')])
     ## traced-value.h (module 'core'): ns3::TracedValue<unsigned int>::TracedValue(unsigned int const & v) [constructor]
     cls.add_constructor([param('unsigned int const &', 'v')])
-    ## traced-value.h (module 'core'): ns3::TracedValue<unsigned int>::TracedValue(ns3::TracedValue<unsigned int> const & other) [constructor]
-    cls.add_constructor([param('ns3::TracedValue< unsigned int > const &', 'other')])
     ## traced-value.h (module 'core'): ns3::TracedValue<unsigned int>::TracedValue(int const & other) [constructor]
     cls.add_constructor([param('int const &', 'other')])
     ## traced-value.h (module 'core'): ns3::TracedValue<unsigned int>::TracedValue(unsigned int const & other) [constructor]
     cls.add_constructor([param('unsigned int const &', 'other')])
-    ## traced-value.h (module 'core'): ns3::TracedValue<unsigned int>::TracedValue(ns3::TracedValue<unsigned int> const & other) [constructor]
-    cls.add_constructor([param('ns3::TracedValue< unsigned int > const &', 'other')])
     ## traced-value.h (module 'core'): void ns3::TracedValue<unsigned int>::Connect(ns3::CallbackBase const & cb, std::string path) [member function]
     cls.add_method('Connect', 
                    'void', 
@@ -6874,8 +6872,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -7153,14 +7151,14 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('>=')
     cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_unary_numeric_operator('-')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
     cls.add_constructor([])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(double const value) [constructor]
@@ -7179,6 +7177,8 @@
     cls.add_constructor([param('long unsigned int const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int const v) [constructor]
     cls.add_constructor([param('long long unsigned int const', 'v')])
+    ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int128_t const v) [constructor]
+    cls.add_constructor([param('int128_t const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t const hi, uint64_t const lo) [constructor]
     cls.add_constructor([param('int64_t const', 'hi'), param('uint64_t const', 'lo')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [constructor]
@@ -8005,11 +8005,6 @@
                    'ns3::TypeId', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## icmpv6-header.h (module 'internet'): ns3::Ptr<ns3::Packet> ns3::Icmpv6OptionRedirected::GetPacket() const [member function]
-    cls.add_method('GetPacket', 
-                   'ns3::Ptr< ns3::Packet >', 
-                   [], 
-                   is_const=True)
     ## icmpv6-header.h (module 'internet'): uint32_t ns3::Icmpv6OptionRedirected::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -8051,11 +8046,6 @@
                    'ns3::TypeId', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## icmpv6-header.h (module 'internet'): ns3::Ptr<ns3::Packet> ns3::Icmpv6ParameterError::GetPacket() const [member function]
-    cls.add_method('GetPacket', 
-                   'ns3::Ptr< ns3::Packet >', 
-                   [], 
-                   is_const=True)
     ## icmpv6-header.h (module 'internet'): uint32_t ns3::Icmpv6ParameterError::GetPtr() const [member function]
     cls.add_method('GetPtr', 
                    'uint32_t', 
@@ -8326,11 +8316,6 @@
                    'ns3::TypeId', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## icmpv6-header.h (module 'internet'): ns3::Ptr<ns3::Packet> ns3::Icmpv6TimeExceeded::GetPacket() const [member function]
-    cls.add_method('GetPacket', 
-                   'ns3::Ptr< ns3::Packet >', 
-                   [], 
-                   is_const=True)
     ## icmpv6-header.h (module 'internet'): uint32_t ns3::Icmpv6TimeExceeded::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -8377,11 +8362,6 @@
                    'uint32_t', 
                    [], 
                    is_const=True)
-    ## icmpv6-header.h (module 'internet'): ns3::Ptr<ns3::Packet> ns3::Icmpv6TooBig::GetPacket() const [member function]
-    cls.add_method('GetPacket', 
-                   'ns3::Ptr< ns3::Packet >', 
-                   [], 
-                   is_const=True)
     ## icmpv6-header.h (module 'internet'): uint32_t ns3::Icmpv6TooBig::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -8473,10 +8453,6 @@
     cls.add_method('SetTcp', 
                    'void', 
                    [param('std::string', 'tid')])
-    ## internet-stack-helper.h (module 'internet'): void ns3::InternetStackHelper::SetTcp(std::string tid, std::string attr, ns3::AttributeValue const & val) [member function]
-    cls.add_method('SetTcp', 
-                   'void', 
-                   [param('std::string', 'tid'), param('std::string', 'attr'), param('ns3::AttributeValue const &', 'val')])
     ## internet-stack-helper.h (module 'internet'): void ns3::InternetStackHelper::EnableAsciiIpv4Internal(ns3::Ptr<ns3::OutputStreamWrapper> stream, std::string prefix, ns3::Ptr<ns3::Ipv4> ipv4, uint32_t interface, bool explicitFilename) [member function]
     cls.add_method('EnableAsciiIpv4Internal', 
                    'void', 
@@ -9681,7 +9657,7 @@
                    'ns3::TypeId', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## rip-header.h (module 'internet'): std::list<ns3::RipRte, std::allocator<ns3::RipRte> > ns3::RipHeader::GetRteList() const [member function]
+    ## rip-header.h (module 'internet'): std::list<ns3::RipRte, std::allocator<ns3::RipRte>> ns3::RipHeader::GetRteList() const [member function]
     cls.add_method('GetRteList', 
                    'std::list< ns3::RipRte >', 
                    [], 
@@ -9746,7 +9722,7 @@
                    'ns3::TypeId', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## ripng-header.h (module 'internet'): std::list<ns3::RipNgRte, std::allocator<ns3::RipNgRte> > ns3::RipNgHeader::GetRteList() const [member function]
+    ## ripng-header.h (module 'internet'): std::list<ns3::RipNgRte, std::allocator<ns3::RipNgRte>> ns3::RipNgHeader::GetRteList() const [member function]
     cls.add_method('GetRteList', 
                    'std::list< ns3::RipNgRte >', 
                    [], 
@@ -10059,107 +10035,107 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Ipv4MulticastRoute_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv4MulticastRoute__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter< ns3::Ipv4MulticastRoute > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Ipv4Route_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv4Route__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter< ns3::Ipv4Route > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Ipv6MulticastRoute_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv6MulticastRoute__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv6MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6MulticastRoute> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv6MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6MulticastRoute>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv6MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6MulticastRoute> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv6MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6MulticastRoute> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv6MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6MulticastRoute>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv6MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6MulticastRoute>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Ipv6MulticastRoute, ns3::empty, ns3::DefaultDeleter< ns3::Ipv6MulticastRoute > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Ipv6Route_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv6Route__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv6Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6Route> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv6Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6Route>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv6Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6Route> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv6Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6Route> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv6Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6Route>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv6Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6Route>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Ipv6Route, ns3::empty, ns3::DefaultDeleter< ns3::Ipv6Route > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3OutputStreamWrapper_Ns3Empty_Ns3DefaultDeleter__lt__ns3OutputStreamWrapper__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter< ns3::OutputStreamWrapper > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3QueueItem_Ns3Empty_Ns3DefaultDeleter__lt__ns3QueueItem__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> >::SimpleRefCount(ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>>::SimpleRefCount(ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::QueueItem, ns3::empty, ns3::DefaultDeleter< ns3::QueueItem > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
@@ -10282,7 +10258,7 @@
                    'uint8_t', 
                    [param('uint8_t', 'ipTos')], 
                    is_static=True)
-    ## socket.h (module 'network'): void ns3::Socket::Ipv6JoinGroup(ns3::Ipv6Address address, ns3::Socket::Ipv6MulticastFilterMode filterMode, std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address> > sourceAddresses) [member function]
+    ## socket.h (module 'network'): void ns3::Socket::Ipv6JoinGroup(ns3::Ipv6Address address, ns3::Socket::Ipv6MulticastFilterMode filterMode, std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address>> sourceAddresses) [member function]
     cls.add_method('Ipv6JoinGroup', 
                    'void', 
                    [param('ns3::Ipv6Address', 'address'), param('ns3::Socket::Ipv6MulticastFilterMode', 'filterMode'), param('std::vector< ns3::Ipv6Address >', 'sourceAddresses')], 
@@ -13680,7 +13656,7 @@
     cls.add_method('Lookup', 
                    'ns3::ArpCache::Entry *', 
                    [param('ns3::Ipv4Address', 'destination')])
-    ## arp-cache.h (module 'internet'): std::list<ns3::ArpCache::Entry *, std::allocator<ns3::ArpCache::Entry *> > ns3::ArpCache::LookupInverse(ns3::Address destination) [member function]
+    ## arp-cache.h (module 'internet'): std::list<ns3::ArpCache::Entry *, std::allocator<ns3::ArpCache::Entry *>> ns3::ArpCache::LookupInverse(ns3::Address destination) [member function]
     cls.add_method('LookupInverse', 
                    'std::list< ns3::ArpCache::Entry * >', 
                    [param('ns3::Address', 'destination')])
@@ -14158,12 +14134,12 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::Packet const> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::NetDevice> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::NetDevice> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::Packet const> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
@@ -14183,72 +14159,72 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::Packet> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::Socket> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ipv4Address'], visibility='protected')
+                   is_static=True, template_parameters=['bool'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['unsigned char'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ipv4Header const&'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::Ipv4Route> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::Ipv4> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ipv6Address'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ipv4L3Protocol::DropReason'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::Ipv6Route> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::Ipv6> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::Socket> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ipv6Header const&'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['bool'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ipv6L3Protocol::DropReason'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ipv4Header const&'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::Packet> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::Ipv4> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ipv4Address'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ipv4L3Protocol::DropReason'], visibility='protected')
+                   is_static=True, template_parameters=['unsigned char'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::Ipv6> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::Ipv4Route> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ipv6Header const&'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ipv6Address'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ipv6L3Protocol::DropReason'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::Ipv6Route> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
@@ -14932,11 +14908,6 @@
                    'ns3::TypeId', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## icmpv6-header.h (module 'internet'): ns3::Ptr<ns3::Packet> ns3::Icmpv6DestinationUnreachable::GetPacket() const [member function]
-    cls.add_method('GetPacket', 
-                   'ns3::Ptr< ns3::Packet >', 
-                   [], 
-                   is_const=True)
     ## icmpv6-header.h (module 'internet'): uint32_t ns3::Icmpv6DestinationUnreachable::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -15746,7 +15717,7 @@
                    'ns3::Ipv4Address', 
                    [], 
                    is_const=True)
-    ## ipv4-route.h (module 'internet'): std::map<unsigned int, unsigned int, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, unsigned int> > > ns3::Ipv4MulticastRoute::GetOutputTtlMap() const [member function]
+    ## ipv4-route.h (module 'internet'): std::map<unsigned int, unsigned int, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, unsigned int>>> ns3::Ipv4MulticastRoute::GetOutputTtlMap() const [member function]
     cls.add_method('GetOutputTtlMap', 
                    'std::map< unsigned int, unsigned int >', 
                    [], 
@@ -16055,7 +16026,7 @@
     cls.add_method('AddHostRouteTo', 
                    'void', 
                    [param('ns3::Ipv4Address', 'dest'), param('uint32_t', 'interface'), param('uint32_t', 'metric', default_value='0')])
-    ## ipv4-static-routing.h (module 'internet'): void ns3::Ipv4StaticRouting::AddMulticastRoute(ns3::Ipv4Address origin, ns3::Ipv4Address group, uint32_t inputInterface, std::vector<unsigned int, std::allocator<unsigned int> > outputInterfaces) [member function]
+    ## ipv4-static-routing.h (module 'internet'): void ns3::Ipv4StaticRouting::AddMulticastRoute(ns3::Ipv4Address origin, ns3::Ipv4Address group, uint32_t inputInterface, std::vector<unsigned int, std::allocator<unsigned int>> outputInterfaces) [member function]
     cls.add_method('AddMulticastRoute', 
                    'void', 
                    [param('ns3::Ipv4Address', 'origin'), param('ns3::Ipv4Address', 'group'), param('uint32_t', 'inputInterface'), param('std::vector< unsigned int >', 'outputInterfaces')])
@@ -16668,7 +16639,7 @@
                    'uint8_t', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## ipv6-extension.h (module 'internet'): void ns3::Ipv6ExtensionFragment::GetFragments(ns3::Ptr<ns3::Packet> packet, ns3::Ipv6Header ipv6Header, uint32_t fragmentSize, std::list<std::pair<ns3::Ptr<ns3::Packet>, ns3::Ipv6Header>, std::allocator<std::pair<ns3::Ptr<ns3::Packet>, ns3::Ipv6Header> > > & listFragments) [member function]
+    ## ipv6-extension.h (module 'internet'): void ns3::Ipv6ExtensionFragment::GetFragments(ns3::Ptr<ns3::Packet> packet, ns3::Ipv6Header ipv6Header, uint32_t fragmentSize, std::list<std::pair<ns3::Ptr<ns3::Packet>, ns3::Ipv6Header>, std::allocator<std::pair<ns3::Ptr<ns3::Packet>, ns3::Ipv6Header>>> & listFragments) [member function]
     cls.add_method('GetFragments', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Ipv6Header', 'ipv6Header'), param('uint32_t', 'fragmentSize'), param('std::list< std::pair< ns3::Ptr< ns3::Packet >, ns3::Ipv6Header > > &', 'listFragments')])
@@ -16799,7 +16770,7 @@
                    'ns3::Ipv6Address', 
                    [param('uint8_t', 'index')], 
                    is_const=True)
-    ## ipv6-extension-header.h (module 'internet'): std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address> > ns3::Ipv6ExtensionLooseRoutingHeader::GetRoutersAddress() const [member function]
+    ## ipv6-extension-header.h (module 'internet'): std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address>> ns3::Ipv6ExtensionLooseRoutingHeader::GetRoutersAddress() const [member function]
     cls.add_method('GetRoutersAddress', 
                    'std::vector< ns3::Ipv6Address >', 
                    [], 
@@ -16832,7 +16803,7 @@
     cls.add_method('SetRouterAddress', 
                    'void', 
                    [param('uint8_t', 'index'), param('ns3::Ipv6Address', 'addr')])
-    ## ipv6-extension-header.h (module 'internet'): void ns3::Ipv6ExtensionLooseRoutingHeader::SetRoutersAddress(std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address> > routersAddress) [member function]
+    ## ipv6-extension-header.h (module 'internet'): void ns3::Ipv6ExtensionLooseRoutingHeader::SetRoutersAddress(std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address>> routersAddress) [member function]
     cls.add_method('SetRoutersAddress', 
                    'void', 
                    [param('std::vector< ns3::Ipv6Address >', 'routersAddress')])
@@ -17362,7 +17333,7 @@
                    'ns3::Ipv6Address', 
                    [], 
                    is_const=True)
-    ## ipv6-route.h (module 'internet'): std::map<unsigned int, unsigned int, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, unsigned int> > > ns3::Ipv6MulticastRoute::GetOutputTtlMap() const [member function]
+    ## ipv6-route.h (module 'internet'): std::map<unsigned int, unsigned int, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, unsigned int>>> ns3::Ipv6MulticastRoute::GetOutputTtlMap() const [member function]
     cls.add_method('GetOutputTtlMap', 
                    'std::map< unsigned int, unsigned int >', 
                    [], 
@@ -17743,7 +17714,7 @@
     cls.add_method('AddHostRouteTo', 
                    'void', 
                    [param('ns3::Ipv6Address', 'dest'), param('uint32_t', 'interface'), param('uint32_t', 'metric', default_value='0')])
-    ## ipv6-static-routing.h (module 'internet'): void ns3::Ipv6StaticRouting::AddMulticastRoute(ns3::Ipv6Address origin, ns3::Ipv6Address group, uint32_t inputInterface, std::vector<unsigned int, std::allocator<unsigned int> > outputInterfaces) [member function]
+    ## ipv6-static-routing.h (module 'internet'): void ns3::Ipv6StaticRouting::AddMulticastRoute(ns3::Ipv6Address origin, ns3::Ipv6Address group, uint32_t inputInterface, std::vector<unsigned int, std::allocator<unsigned int>> outputInterfaces) [member function]
     cls.add_method('AddMulticastRoute', 
                    'void', 
                    [param('ns3::Ipv6Address', 'origin'), param('ns3::Ipv6Address', 'group'), param('uint32_t', 'inputInterface'), param('std::vector< unsigned int >', 'outputInterfaces')])
@@ -17992,7 +17963,7 @@
                    'ns3::NdiscCache::Entry *', 
                    [param('ns3::Ipv6Address', 'dst')], 
                    is_virtual=True)
-    ## ndisc-cache.h (module 'internet'): std::list<ns3::NdiscCache::Entry *, std::allocator<ns3::NdiscCache::Entry *> > ns3::NdiscCache::LookupInverse(ns3::Address dst) [member function]
+    ## ndisc-cache.h (module 'internet'): std::list<ns3::NdiscCache::Entry *, std::allocator<ns3::NdiscCache::Entry *>> ns3::NdiscCache::LookupInverse(ns3::Address dst) [member function]
     cls.add_method('LookupInverse', 
                    'std::list< ns3::NdiscCache::Entry * >', 
                    [param('ns3::Address', 'dst')])
@@ -18117,7 +18088,7 @@
     cls.add_method('MarkProbe', 
                    'void', 
                    [])
-    ## ndisc-cache.h (module 'internet'): std::list<std::pair<ns3::Ptr<ns3::Packet>, ns3::Ipv6Header>, std::allocator<std::pair<ns3::Ptr<ns3::Packet>, ns3::Ipv6Header> > > ns3::NdiscCache::Entry::MarkReachable(ns3::Address mac) [member function]
+    ## ndisc-cache.h (module 'internet'): std::list<std::pair<ns3::Ptr<ns3::Packet>, ns3::Ipv6Header>, std::allocator<std::pair<ns3::Ptr<ns3::Packet>, ns3::Ipv6Header>>> ns3::NdiscCache::Entry::MarkReachable(ns3::Address mac) [member function]
     cls.add_method('MarkReachable', 
                    'std::list< std::pair< ns3::Ptr< ns3::Packet >, ns3::Ipv6Header > >', 
                    [param('ns3::Address', 'mac')])
@@ -18125,7 +18096,7 @@
     cls.add_method('MarkReachable', 
                    'void', 
                    [])
-    ## ndisc-cache.h (module 'internet'): std::list<std::pair<ns3::Ptr<ns3::Packet>, ns3::Ipv6Header>, std::allocator<std::pair<ns3::Ptr<ns3::Packet>, ns3::Ipv6Header> > > ns3::NdiscCache::Entry::MarkStale(ns3::Address mac) [member function]
+    ## ndisc-cache.h (module 'internet'): std::list<std::pair<ns3::Ptr<ns3::Packet>, ns3::Ipv6Header>, std::allocator<std::pair<ns3::Ptr<ns3::Packet>, ns3::Ipv6Header>>> ns3::NdiscCache::Entry::MarkStale(ns3::Address mac) [member function]
     cls.add_method('MarkStale', 
                    'std::list< std::pair< ns3::Ptr< ns3::Packet >, ns3::Ipv6Header > >', 
                    [param('ns3::Address', 'mac')])
@@ -18336,10 +18307,16 @@
     cls.add_method('ExtractNeighborIndex', 
                    'uint32_t', 
                    [param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetEpoch() const [member function]
+    cls.add_method('GetEpoch', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() const [member function]
     cls.add_method('GetRemainingBits', 
                    'uint32_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -18350,6 +18327,10 @@
                    'uint32_t', 
                    [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
+    ## nix-vector.h (module 'network'): void ns3::NixVector::SetEpoch(uint32_t epoch) [member function]
+    cls.add_method('SetEpoch', 
+                   'void', 
+                   [param('uint32_t', 'epoch')])
     return
 
 def register_Ns3Node_methods(root_module, cls):
@@ -18726,10 +18707,11 @@
                    'uint32_t', 
                    [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) const [member function]
     cls.add_method('SetNixVector', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')], 
+                   is_const=True)
     ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
     cls.add_method('ToString', 
                    'std::string', 
@@ -18846,7 +18828,7 @@
     cls.add_method('AssignStreams', 
                    'int64_t', 
                    [param('int64_t', 'stream')])
-    ## rip.h (module 'internet'): std::set<unsigned int, std::less<unsigned int>, std::allocator<unsigned int> > ns3::Rip::GetInterfaceExclusions() const [member function]
+    ## rip.h (module 'internet'): std::set<unsigned int, std::less<unsigned int>, std::allocator<unsigned int>> ns3::Rip::GetInterfaceExclusions() const [member function]
     cls.add_method('GetInterfaceExclusions', 
                    'std::set< unsigned int >', 
                    [], 
@@ -18896,7 +18878,7 @@
                    'ns3::Ptr< ns3::Ipv4Route >', 
                    [param('ns3::Ptr< ns3::Packet >', 'p'), param('ns3::Ipv4Header const &', 'header'), param('ns3::Ptr< ns3::NetDevice >', 'oif'), param('ns3::Socket::SocketErrno &', 'sockerr')], 
                    is_virtual=True)
-    ## rip.h (module 'internet'): void ns3::Rip::SetInterfaceExclusions(std::set<unsigned int, std::less<unsigned int>, std::allocator<unsigned int> > exceptions) [member function]
+    ## rip.h (module 'internet'): void ns3::Rip::SetInterfaceExclusions(std::set<unsigned int, std::less<unsigned int>, std::allocator<unsigned int>> exceptions) [member function]
     cls.add_method('SetInterfaceExclusions', 
                    'void', 
                    [param('std::set< unsigned int >', 'exceptions')])
@@ -18934,7 +18916,7 @@
     cls.add_method('AssignStreams', 
                    'int64_t', 
                    [param('int64_t', 'stream')])
-    ## ripng.h (module 'internet'): std::set<unsigned int, std::less<unsigned int>, std::allocator<unsigned int> > ns3::RipNg::GetInterfaceExclusions() const [member function]
+    ## ripng.h (module 'internet'): std::set<unsigned int, std::less<unsigned int>, std::allocator<unsigned int>> ns3::RipNg::GetInterfaceExclusions() const [member function]
     cls.add_method('GetInterfaceExclusions', 
                    'std::set< unsigned int >', 
                    [], 
@@ -18994,7 +18976,7 @@
                    'ns3::Ptr< ns3::Ipv6Route >', 
                    [param('ns3::Ptr< ns3::Packet >', 'p'), param('ns3::Ipv6Header const &', 'header'), param('ns3::Ptr< ns3::NetDevice >', 'oif'), param('ns3::Socket::SocketErrno &', 'sockerr')], 
                    is_virtual=True)
-    ## ripng.h (module 'internet'): void ns3::RipNg::SetInterfaceExclusions(std::set<unsigned int, std::less<unsigned int>, std::allocator<unsigned int> > exceptions) [member function]
+    ## ripng.h (module 'internet'): void ns3::RipNg::SetInterfaceExclusions(std::set<unsigned int, std::less<unsigned int>, std::allocator<unsigned int>> exceptions) [member function]
     cls.add_method('SetInterfaceExclusions', 
                    'void', 
                    [param('std::set< unsigned int >', 'exceptions')])
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/bindings/modulegen__gcc_LP64.py ns-3.36/src/internet/bindings/modulegen__gcc_LP64.py
--- ns-3.35/src/internet/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/bindings/modulegen__gcc_LP64.py	2022-04-30 18:23:57.854733500 -0700
@@ -87,6 +87,8 @@
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::TraceSourceAccessor'])
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'], import_from_module='ns.core')
     ## global-route-manager.h (module 'internet'): ns3::GlobalRouteManager [class]
     module.add_class('GlobalRouteManager')
     ## global-route-manager-impl.h (module 'internet'): ns3::GlobalRouteManagerImpl [class]
@@ -345,9 +347,9 @@
     module.add_class('TracedValue', import_from_module='ns.core', template_parameters=['ns3::DataRate'])
     ## traced-value.h (module 'core'): ns3::TracedValue<ns3::DataRate> [class]
     root_module['ns3::TracedValue< ns3::DataRate >'].implicitly_converts_to(root_module['ns3::DataRate'])
-    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::SequenceNumber<unsigned int, int> > [class]
+    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::SequenceNumber<unsigned int, int>> [class]
     module.add_class('TracedValue', import_from_module='ns.core', template_parameters=['ns3::SequenceNumber<unsigned int, int>'])
-    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::SequenceNumber<unsigned int, int> > [class]
+    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::SequenceNumber<unsigned int, int>> [class]
     root_module['ns3::TracedValue< ns3::SequenceNumber<unsigned int, int> >'].implicitly_converts_to(root_module['ns3::SequenceNumber32'])
     ## traced-value.h (module 'core'): ns3::TracedValue<ns3::TcpSocket::TcpStates_t> [class]
     module.add_class('TracedValue', import_from_module='ns.core', template_parameters=['ns3::TcpSocket::TcpStates_t'])
@@ -517,35 +519,35 @@
     module.add_class('RttMeanDeviation', parent=root_module['ns3::RttEstimator'])
     ## random-variable-stream.h (module 'core'): ns3::SequentialRandomVariable [class]
     module.add_class('SequentialRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv4MulticastRoute', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv4Route', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv4Route>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv6MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6MulticastRoute> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv6MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6MulticastRoute>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv6MulticastRoute', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv6MulticastRoute>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv6Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6Route> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv6Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6Route>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv6Route', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv6Route>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::OutputStreamWrapper', 'ns3::empty', 'ns3::DefaultDeleter<ns3::OutputStreamWrapper>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::QueueItem', 'ns3::empty', 'ns3::DefaultDeleter<ns3::QueueItem>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
     ## socket.h (module 'network'): ns3::Socket [class]
     module.add_class('Socket', import_from_module='ns.network', parent=root_module['ns3::Object'])
@@ -1184,7 +1186,7 @@
     module.add_container('std::vector< bool >', 'bool', container_type='vector')
     module.add_container('std::list< ns3::Ipv6EndPoint * >', 'ns3::Ipv6EndPoint *', container_type='list')
     module.add_container('ns3::Ipv6EndPointDemux::EndPoints', 'ns3::Ipv6EndPoint *', container_type='list')
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     module.add_container('std::list< ns3::RipRte >', 'ns3::RipRte', container_type='list')
     module.add_container('std::list< ns3::RipNgRte >', 'ns3::RipNgRte', container_type='list')
     module.add_container('std::vector< ns3::Ipv6Address >', 'ns3::Ipv6Address', container_type='vector')
@@ -3696,7 +3698,7 @@
     cls.add_constructor([param('ns3::Ipv4MulticastRoutingTableEntry const &', 'route')])
     ## ipv4-routing-table-entry.h (module 'internet'): ns3::Ipv4MulticastRoutingTableEntry::Ipv4MulticastRoutingTableEntry(ns3::Ipv4MulticastRoutingTableEntry const * route) [constructor]
     cls.add_constructor([param('ns3::Ipv4MulticastRoutingTableEntry const *', 'route')])
-    ## ipv4-routing-table-entry.h (module 'internet'): static ns3::Ipv4MulticastRoutingTableEntry ns3::Ipv4MulticastRoutingTableEntry::CreateMulticastRoute(ns3::Ipv4Address origin, ns3::Ipv4Address group, uint32_t inputInterface, std::vector<unsigned int, std::allocator<unsigned int> > outputInterfaces) [member function]
+    ## ipv4-routing-table-entry.h (module 'internet'): static ns3::Ipv4MulticastRoutingTableEntry ns3::Ipv4MulticastRoutingTableEntry::CreateMulticastRoute(ns3::Ipv4Address origin, ns3::Ipv4Address group, uint32_t inputInterface, std::vector<unsigned int, std::allocator<unsigned int>> outputInterfaces) [member function]
     cls.add_method('CreateMulticastRoute', 
                    'ns3::Ipv4MulticastRoutingTableEntry', 
                    [param('ns3::Ipv4Address', 'origin'), param('ns3::Ipv4Address', 'group'), param('uint32_t', 'inputInterface'), param('std::vector< unsigned int >', 'outputInterfaces')], 
@@ -3726,7 +3728,7 @@
                    'uint32_t', 
                    [param('uint32_t', 'n')], 
                    is_const=True)
-    ## ipv4-routing-table-entry.h (module 'internet'): std::vector<unsigned int, std::allocator<unsigned int> > ns3::Ipv4MulticastRoutingTableEntry::GetOutputInterfaces() const [member function]
+    ## ipv4-routing-table-entry.h (module 'internet'): std::vector<unsigned int, std::allocator<unsigned int>> ns3::Ipv4MulticastRoutingTableEntry::GetOutputInterfaces() const [member function]
     cls.add_method('GetOutputInterfaces', 
                    'std::vector< unsigned int >', 
                    [], 
@@ -4235,11 +4237,11 @@
     cls.add_method('Assign', 
                    'ns3::Ipv6InterfaceContainer', 
                    [param('ns3::NetDeviceContainer const &', 'c')])
-    ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6InterfaceContainer ns3::Ipv6AddressHelper::Assign(ns3::NetDeviceContainer const & c, std::vector<bool, std::allocator<bool> > withConfiguration) [member function]
+    ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6InterfaceContainer ns3::Ipv6AddressHelper::Assign(ns3::NetDeviceContainer const & c, std::vector<bool, std::allocator<bool>> withConfiguration) [member function]
     cls.add_method('Assign', 
                    'ns3::Ipv6InterfaceContainer', 
                    [param('ns3::NetDeviceContainer const &', 'c'), param('std::vector< bool >', 'withConfiguration')])
-    ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6InterfaceContainer ns3::Ipv6AddressHelper::Assign(ns3::NetDeviceContainer const & c, std::vector<bool, std::allocator<bool> > withConfiguration, std::vector<bool, std::allocator<bool> > onLink) [member function]
+    ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6InterfaceContainer ns3::Ipv6AddressHelper::Assign(ns3::NetDeviceContainer const & c, std::vector<bool, std::allocator<bool>> withConfiguration, std::vector<bool, std::allocator<bool>> onLink) [member function]
     cls.add_method('Assign', 
                    'ns3::Ipv6InterfaceContainer', 
                    [param('ns3::NetDeviceContainer const &', 'c'), param('std::vector< bool >', 'withConfiguration'), param('std::vector< bool >', 'onLink')])
@@ -4543,7 +4545,7 @@
     cls.add_constructor([param('ns3::Ipv6MulticastRoutingTableEntry const &', 'route')])
     ## ipv6-routing-table-entry.h (module 'internet'): ns3::Ipv6MulticastRoutingTableEntry::Ipv6MulticastRoutingTableEntry(ns3::Ipv6MulticastRoutingTableEntry const * route) [constructor]
     cls.add_constructor([param('ns3::Ipv6MulticastRoutingTableEntry const *', 'route')])
-    ## ipv6-routing-table-entry.h (module 'internet'): static ns3::Ipv6MulticastRoutingTableEntry ns3::Ipv6MulticastRoutingTableEntry::CreateMulticastRoute(ns3::Ipv6Address origin, ns3::Ipv6Address group, uint32_t inputInterface, std::vector<unsigned int, std::allocator<unsigned int> > outputInterfaces) [member function]
+    ## ipv6-routing-table-entry.h (module 'internet'): static ns3::Ipv6MulticastRoutingTableEntry ns3::Ipv6MulticastRoutingTableEntry::CreateMulticastRoute(ns3::Ipv6Address origin, ns3::Ipv6Address group, uint32_t inputInterface, std::vector<unsigned int, std::allocator<unsigned int>> outputInterfaces) [member function]
     cls.add_method('CreateMulticastRoute', 
                    'ns3::Ipv6MulticastRoutingTableEntry', 
                    [param('ns3::Ipv6Address', 'origin'), param('ns3::Ipv6Address', 'group'), param('uint32_t', 'inputInterface'), param('std::vector< unsigned int >', 'outputInterfaces')], 
@@ -4573,7 +4575,7 @@
                    'uint32_t', 
                    [param('uint32_t', 'n')], 
                    is_const=True)
-    ## ipv6-routing-table-entry.h (module 'internet'): std::vector<unsigned int, std::allocator<unsigned int> > ns3::Ipv6MulticastRoutingTableEntry::GetOutputInterfaces() const [member function]
+    ## ipv6-routing-table-entry.h (module 'internet'): std::vector<unsigned int, std::allocator<unsigned int>> ns3::Ipv6MulticastRoutingTableEntry::GetOutputInterfaces() const [member function]
     cls.add_method('GetOutputInterfaces', 
                    'std::vector< unsigned int >', 
                    [], 
@@ -6643,40 +6645,40 @@
     return
 
 def register_Ns3TracedValue__Ns3SequenceNumber__lt__unsigned_int__int__gt___methods(root_module, cls):
-    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::SequenceNumber<unsigned int, int> >::TracedValue() [constructor]
+    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::SequenceNumber<unsigned int, int>>::TracedValue() [constructor]
     cls.add_constructor([])
-    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::SequenceNumber<unsigned int, int> >::TracedValue(ns3::TracedValue<ns3::SequenceNumber<unsigned int, int> > const & o) [constructor]
+    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::SequenceNumber<unsigned int, int>>::TracedValue(ns3::TracedValue<ns3::SequenceNumber<unsigned int, int>> const & o) [constructor]
     cls.add_constructor([param('ns3::TracedValue< ns3::SequenceNumber< unsigned int, int > > const &', 'o')])
-    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::SequenceNumber<unsigned int, int> >::TracedValue(ns3::SequenceNumber<unsigned int, int> const & v) [constructor]
+    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::SequenceNumber<unsigned int, int>>::TracedValue(ns3::SequenceNumber<unsigned int, int> const & v) [constructor]
     cls.add_constructor([param('ns3::SequenceNumber< unsigned int, int > const &', 'v')])
-    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::SequenceNumber<unsigned int, int> >::TracedValue(ns3::TracedValue<ns3::SequenceNumber<unsigned int, int> > const & other) [constructor]
+    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::SequenceNumber<unsigned int, int>>::TracedValue(ns3::TracedValue<ns3::SequenceNumber<unsigned int, int>> const & other) [constructor]
     cls.add_constructor([param('ns3::TracedValue< ns3::SequenceNumber< unsigned int, int > > const &', 'other')])
-    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::SequenceNumber<unsigned int, int> >::TracedValue(ns3::TracedValue<ns3::SequenceNumber<unsigned int, int> > const & other) [constructor]
+    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::SequenceNumber<unsigned int, int>>::TracedValue(ns3::TracedValue<ns3::SequenceNumber<unsigned int, int>> const & other) [constructor]
     cls.add_constructor([param('ns3::TracedValue< ns3::SequenceNumber< unsigned int, int > > const &', 'other')])
-    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::SequenceNumber<unsigned int, int> >::TracedValue(int const & other) [constructor]
+    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::SequenceNumber<unsigned int, int>>::TracedValue(int const & other) [constructor]
     cls.add_constructor([param('int const &', 'other')])
-    ## traced-value.h (module 'core'): void ns3::TracedValue<ns3::SequenceNumber<unsigned int, int> >::Connect(ns3::CallbackBase const & cb, std::string path) [member function]
+    ## traced-value.h (module 'core'): void ns3::TracedValue<ns3::SequenceNumber<unsigned int, int>>::Connect(ns3::CallbackBase const & cb, std::string path) [member function]
     cls.add_method('Connect', 
                    'void', 
                    [param('ns3::CallbackBase const &', 'cb'), param('std::string', 'path')])
-    ## traced-value.h (module 'core'): void ns3::TracedValue<ns3::SequenceNumber<unsigned int, int> >::ConnectWithoutContext(ns3::CallbackBase const & cb) [member function]
+    ## traced-value.h (module 'core'): void ns3::TracedValue<ns3::SequenceNumber<unsigned int, int>>::ConnectWithoutContext(ns3::CallbackBase const & cb) [member function]
     cls.add_method('ConnectWithoutContext', 
                    'void', 
                    [param('ns3::CallbackBase const &', 'cb')])
-    ## traced-value.h (module 'core'): void ns3::TracedValue<ns3::SequenceNumber<unsigned int, int> >::Disconnect(ns3::CallbackBase const & cb, std::string path) [member function]
+    ## traced-value.h (module 'core'): void ns3::TracedValue<ns3::SequenceNumber<unsigned int, int>>::Disconnect(ns3::CallbackBase const & cb, std::string path) [member function]
     cls.add_method('Disconnect', 
                    'void', 
                    [param('ns3::CallbackBase const &', 'cb'), param('std::string', 'path')])
-    ## traced-value.h (module 'core'): void ns3::TracedValue<ns3::SequenceNumber<unsigned int, int> >::DisconnectWithoutContext(ns3::CallbackBase const & cb) [member function]
+    ## traced-value.h (module 'core'): void ns3::TracedValue<ns3::SequenceNumber<unsigned int, int>>::DisconnectWithoutContext(ns3::CallbackBase const & cb) [member function]
     cls.add_method('DisconnectWithoutContext', 
                    'void', 
                    [param('ns3::CallbackBase const &', 'cb')])
-    ## traced-value.h (module 'core'): ns3::SequenceNumber<unsigned int, int> ns3::TracedValue<ns3::SequenceNumber<unsigned int, int> >::Get() const [member function]
+    ## traced-value.h (module 'core'): ns3::SequenceNumber<unsigned int, int> ns3::TracedValue<ns3::SequenceNumber<unsigned int, int>>::Get() const [member function]
     cls.add_method('Get', 
                    'ns3::SequenceNumber< unsigned int, int >', 
                    [], 
                    is_const=True)
-    ## traced-value.h (module 'core'): void ns3::TracedValue<ns3::SequenceNumber<unsigned int, int> >::Set(ns3::SequenceNumber<unsigned int, int> const & v) [member function]
+    ## traced-value.h (module 'core'): void ns3::TracedValue<ns3::SequenceNumber<unsigned int, int>>::Set(ns3::SequenceNumber<unsigned int, int> const & v) [member function]
     cls.add_method('Set', 
                    'void', 
                    [param('ns3::SequenceNumber< unsigned int, int > const &', 'v')])
@@ -6834,14 +6836,10 @@
     cls.add_constructor([param('ns3::TracedValue< unsigned int > const &', 'o')])
     ## traced-value.h (module 'core'): ns3::TracedValue<unsigned int>::TracedValue(unsigned int const & v) [constructor]
     cls.add_constructor([param('unsigned int const &', 'v')])
-    ## traced-value.h (module 'core'): ns3::TracedValue<unsigned int>::TracedValue(ns3::TracedValue<unsigned int> const & other) [constructor]
-    cls.add_constructor([param('ns3::TracedValue< unsigned int > const &', 'other')])
     ## traced-value.h (module 'core'): ns3::TracedValue<unsigned int>::TracedValue(int const & other) [constructor]
     cls.add_constructor([param('int const &', 'other')])
     ## traced-value.h (module 'core'): ns3::TracedValue<unsigned int>::TracedValue(unsigned int const & other) [constructor]
     cls.add_constructor([param('unsigned int const &', 'other')])
-    ## traced-value.h (module 'core'): ns3::TracedValue<unsigned int>::TracedValue(ns3::TracedValue<unsigned int> const & other) [constructor]
-    cls.add_constructor([param('ns3::TracedValue< unsigned int > const &', 'other')])
     ## traced-value.h (module 'core'): void ns3::TracedValue<unsigned int>::Connect(ns3::CallbackBase const & cb, std::string path) [member function]
     cls.add_method('Connect', 
                    'void', 
@@ -6874,8 +6872,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -7153,14 +7151,14 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('>=')
     cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_unary_numeric_operator('-')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
     cls.add_constructor([])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(double const value) [constructor]
@@ -7179,6 +7177,8 @@
     cls.add_constructor([param('long unsigned int const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int const v) [constructor]
     cls.add_constructor([param('long long unsigned int const', 'v')])
+    ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int128_t const v) [constructor]
+    cls.add_constructor([param('int128_t const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t const hi, uint64_t const lo) [constructor]
     cls.add_constructor([param('int64_t const', 'hi'), param('uint64_t const', 'lo')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [constructor]
@@ -8005,11 +8005,6 @@
                    'ns3::TypeId', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## icmpv6-header.h (module 'internet'): ns3::Ptr<ns3::Packet> ns3::Icmpv6OptionRedirected::GetPacket() const [member function]
-    cls.add_method('GetPacket', 
-                   'ns3::Ptr< ns3::Packet >', 
-                   [], 
-                   is_const=True)
     ## icmpv6-header.h (module 'internet'): uint32_t ns3::Icmpv6OptionRedirected::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -8051,11 +8046,6 @@
                    'ns3::TypeId', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## icmpv6-header.h (module 'internet'): ns3::Ptr<ns3::Packet> ns3::Icmpv6ParameterError::GetPacket() const [member function]
-    cls.add_method('GetPacket', 
-                   'ns3::Ptr< ns3::Packet >', 
-                   [], 
-                   is_const=True)
     ## icmpv6-header.h (module 'internet'): uint32_t ns3::Icmpv6ParameterError::GetPtr() const [member function]
     cls.add_method('GetPtr', 
                    'uint32_t', 
@@ -8326,11 +8316,6 @@
                    'ns3::TypeId', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## icmpv6-header.h (module 'internet'): ns3::Ptr<ns3::Packet> ns3::Icmpv6TimeExceeded::GetPacket() const [member function]
-    cls.add_method('GetPacket', 
-                   'ns3::Ptr< ns3::Packet >', 
-                   [], 
-                   is_const=True)
     ## icmpv6-header.h (module 'internet'): uint32_t ns3::Icmpv6TimeExceeded::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -8377,11 +8362,6 @@
                    'uint32_t', 
                    [], 
                    is_const=True)
-    ## icmpv6-header.h (module 'internet'): ns3::Ptr<ns3::Packet> ns3::Icmpv6TooBig::GetPacket() const [member function]
-    cls.add_method('GetPacket', 
-                   'ns3::Ptr< ns3::Packet >', 
-                   [], 
-                   is_const=True)
     ## icmpv6-header.h (module 'internet'): uint32_t ns3::Icmpv6TooBig::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -8473,10 +8453,6 @@
     cls.add_method('SetTcp', 
                    'void', 
                    [param('std::string', 'tid')])
-    ## internet-stack-helper.h (module 'internet'): void ns3::InternetStackHelper::SetTcp(std::string tid, std::string attr, ns3::AttributeValue const & val) [member function]
-    cls.add_method('SetTcp', 
-                   'void', 
-                   [param('std::string', 'tid'), param('std::string', 'attr'), param('ns3::AttributeValue const &', 'val')])
     ## internet-stack-helper.h (module 'internet'): void ns3::InternetStackHelper::EnableAsciiIpv4Internal(ns3::Ptr<ns3::OutputStreamWrapper> stream, std::string prefix, ns3::Ptr<ns3::Ipv4> ipv4, uint32_t interface, bool explicitFilename) [member function]
     cls.add_method('EnableAsciiIpv4Internal', 
                    'void', 
@@ -9681,7 +9657,7 @@
                    'ns3::TypeId', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## rip-header.h (module 'internet'): std::list<ns3::RipRte, std::allocator<ns3::RipRte> > ns3::RipHeader::GetRteList() const [member function]
+    ## rip-header.h (module 'internet'): std::list<ns3::RipRte, std::allocator<ns3::RipRte>> ns3::RipHeader::GetRteList() const [member function]
     cls.add_method('GetRteList', 
                    'std::list< ns3::RipRte >', 
                    [], 
@@ -9746,7 +9722,7 @@
                    'ns3::TypeId', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## ripng-header.h (module 'internet'): std::list<ns3::RipNgRte, std::allocator<ns3::RipNgRte> > ns3::RipNgHeader::GetRteList() const [member function]
+    ## ripng-header.h (module 'internet'): std::list<ns3::RipNgRte, std::allocator<ns3::RipNgRte>> ns3::RipNgHeader::GetRteList() const [member function]
     cls.add_method('GetRteList', 
                    'std::list< ns3::RipNgRte >', 
                    [], 
@@ -10059,107 +10035,107 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Ipv4MulticastRoute_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv4MulticastRoute__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter< ns3::Ipv4MulticastRoute > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Ipv4Route_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv4Route__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter< ns3::Ipv4Route > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Ipv6MulticastRoute_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv6MulticastRoute__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv6MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6MulticastRoute> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv6MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6MulticastRoute>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv6MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6MulticastRoute> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv6MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6MulticastRoute> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv6MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6MulticastRoute>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv6MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6MulticastRoute>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Ipv6MulticastRoute, ns3::empty, ns3::DefaultDeleter< ns3::Ipv6MulticastRoute > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Ipv6Route_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv6Route__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv6Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6Route> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv6Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6Route>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv6Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6Route> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv6Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6Route> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv6Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6Route>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv6Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6Route>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Ipv6Route, ns3::empty, ns3::DefaultDeleter< ns3::Ipv6Route > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3OutputStreamWrapper_Ns3Empty_Ns3DefaultDeleter__lt__ns3OutputStreamWrapper__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter< ns3::OutputStreamWrapper > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3QueueItem_Ns3Empty_Ns3DefaultDeleter__lt__ns3QueueItem__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> >::SimpleRefCount(ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>>::SimpleRefCount(ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::QueueItem, ns3::empty, ns3::DefaultDeleter< ns3::QueueItem > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
@@ -10282,7 +10258,7 @@
                    'uint8_t', 
                    [param('uint8_t', 'ipTos')], 
                    is_static=True)
-    ## socket.h (module 'network'): void ns3::Socket::Ipv6JoinGroup(ns3::Ipv6Address address, ns3::Socket::Ipv6MulticastFilterMode filterMode, std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address> > sourceAddresses) [member function]
+    ## socket.h (module 'network'): void ns3::Socket::Ipv6JoinGroup(ns3::Ipv6Address address, ns3::Socket::Ipv6MulticastFilterMode filterMode, std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address>> sourceAddresses) [member function]
     cls.add_method('Ipv6JoinGroup', 
                    'void', 
                    [param('ns3::Ipv6Address', 'address'), param('ns3::Socket::Ipv6MulticastFilterMode', 'filterMode'), param('std::vector< ns3::Ipv6Address >', 'sourceAddresses')], 
@@ -13680,7 +13656,7 @@
     cls.add_method('Lookup', 
                    'ns3::ArpCache::Entry *', 
                    [param('ns3::Ipv4Address', 'destination')])
-    ## arp-cache.h (module 'internet'): std::list<ns3::ArpCache::Entry *, std::allocator<ns3::ArpCache::Entry *> > ns3::ArpCache::LookupInverse(ns3::Address destination) [member function]
+    ## arp-cache.h (module 'internet'): std::list<ns3::ArpCache::Entry *, std::allocator<ns3::ArpCache::Entry *>> ns3::ArpCache::LookupInverse(ns3::Address destination) [member function]
     cls.add_method('LookupInverse', 
                    'std::list< ns3::ArpCache::Entry * >', 
                    [param('ns3::Address', 'destination')])
@@ -14158,12 +14134,12 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::Packet const> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::NetDevice> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::NetDevice> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::Packet const> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
@@ -14183,72 +14159,72 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::Packet> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::Socket> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ipv4Address'], visibility='protected')
+                   is_static=True, template_parameters=['bool'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['unsigned char'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ipv4Header const&'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::Ipv4Route> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::Ipv4> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ipv6Address'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ipv4L3Protocol::DropReason'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::Ipv6Route> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::Ipv6> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::Socket> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ipv6Header const&'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['bool'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ipv6L3Protocol::DropReason'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ipv4Header const&'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::Packet> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::Ipv4> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ipv4Address'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ipv4L3Protocol::DropReason'], visibility='protected')
+                   is_static=True, template_parameters=['unsigned char'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::Ipv6> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::Ipv4Route> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ipv6Header const&'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ipv6Address'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ipv6L3Protocol::DropReason'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::Ipv6Route> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
@@ -14932,11 +14908,6 @@
                    'ns3::TypeId', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## icmpv6-header.h (module 'internet'): ns3::Ptr<ns3::Packet> ns3::Icmpv6DestinationUnreachable::GetPacket() const [member function]
-    cls.add_method('GetPacket', 
-                   'ns3::Ptr< ns3::Packet >', 
-                   [], 
-                   is_const=True)
     ## icmpv6-header.h (module 'internet'): uint32_t ns3::Icmpv6DestinationUnreachable::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -15746,7 +15717,7 @@
                    'ns3::Ipv4Address', 
                    [], 
                    is_const=True)
-    ## ipv4-route.h (module 'internet'): std::map<unsigned int, unsigned int, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, unsigned int> > > ns3::Ipv4MulticastRoute::GetOutputTtlMap() const [member function]
+    ## ipv4-route.h (module 'internet'): std::map<unsigned int, unsigned int, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, unsigned int>>> ns3::Ipv4MulticastRoute::GetOutputTtlMap() const [member function]
     cls.add_method('GetOutputTtlMap', 
                    'std::map< unsigned int, unsigned int >', 
                    [], 
@@ -16055,7 +16026,7 @@
     cls.add_method('AddHostRouteTo', 
                    'void', 
                    [param('ns3::Ipv4Address', 'dest'), param('uint32_t', 'interface'), param('uint32_t', 'metric', default_value='0')])
-    ## ipv4-static-routing.h (module 'internet'): void ns3::Ipv4StaticRouting::AddMulticastRoute(ns3::Ipv4Address origin, ns3::Ipv4Address group, uint32_t inputInterface, std::vector<unsigned int, std::allocator<unsigned int> > outputInterfaces) [member function]
+    ## ipv4-static-routing.h (module 'internet'): void ns3::Ipv4StaticRouting::AddMulticastRoute(ns3::Ipv4Address origin, ns3::Ipv4Address group, uint32_t inputInterface, std::vector<unsigned int, std::allocator<unsigned int>> outputInterfaces) [member function]
     cls.add_method('AddMulticastRoute', 
                    'void', 
                    [param('ns3::Ipv4Address', 'origin'), param('ns3::Ipv4Address', 'group'), param('uint32_t', 'inputInterface'), param('std::vector< unsigned int >', 'outputInterfaces')])
@@ -16668,7 +16639,7 @@
                    'uint8_t', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## ipv6-extension.h (module 'internet'): void ns3::Ipv6ExtensionFragment::GetFragments(ns3::Ptr<ns3::Packet> packet, ns3::Ipv6Header ipv6Header, uint32_t fragmentSize, std::list<std::pair<ns3::Ptr<ns3::Packet>, ns3::Ipv6Header>, std::allocator<std::pair<ns3::Ptr<ns3::Packet>, ns3::Ipv6Header> > > & listFragments) [member function]
+    ## ipv6-extension.h (module 'internet'): void ns3::Ipv6ExtensionFragment::GetFragments(ns3::Ptr<ns3::Packet> packet, ns3::Ipv6Header ipv6Header, uint32_t fragmentSize, std::list<std::pair<ns3::Ptr<ns3::Packet>, ns3::Ipv6Header>, std::allocator<std::pair<ns3::Ptr<ns3::Packet>, ns3::Ipv6Header>>> & listFragments) [member function]
     cls.add_method('GetFragments', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Ipv6Header', 'ipv6Header'), param('uint32_t', 'fragmentSize'), param('std::list< std::pair< ns3::Ptr< ns3::Packet >, ns3::Ipv6Header > > &', 'listFragments')])
@@ -16799,7 +16770,7 @@
                    'ns3::Ipv6Address', 
                    [param('uint8_t', 'index')], 
                    is_const=True)
-    ## ipv6-extension-header.h (module 'internet'): std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address> > ns3::Ipv6ExtensionLooseRoutingHeader::GetRoutersAddress() const [member function]
+    ## ipv6-extension-header.h (module 'internet'): std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address>> ns3::Ipv6ExtensionLooseRoutingHeader::GetRoutersAddress() const [member function]
     cls.add_method('GetRoutersAddress', 
                    'std::vector< ns3::Ipv6Address >', 
                    [], 
@@ -16832,7 +16803,7 @@
     cls.add_method('SetRouterAddress', 
                    'void', 
                    [param('uint8_t', 'index'), param('ns3::Ipv6Address', 'addr')])
-    ## ipv6-extension-header.h (module 'internet'): void ns3::Ipv6ExtensionLooseRoutingHeader::SetRoutersAddress(std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address> > routersAddress) [member function]
+    ## ipv6-extension-header.h (module 'internet'): void ns3::Ipv6ExtensionLooseRoutingHeader::SetRoutersAddress(std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address>> routersAddress) [member function]
     cls.add_method('SetRoutersAddress', 
                    'void', 
                    [param('std::vector< ns3::Ipv6Address >', 'routersAddress')])
@@ -17362,7 +17333,7 @@
                    'ns3::Ipv6Address', 
                    [], 
                    is_const=True)
-    ## ipv6-route.h (module 'internet'): std::map<unsigned int, unsigned int, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, unsigned int> > > ns3::Ipv6MulticastRoute::GetOutputTtlMap() const [member function]
+    ## ipv6-route.h (module 'internet'): std::map<unsigned int, unsigned int, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, unsigned int>>> ns3::Ipv6MulticastRoute::GetOutputTtlMap() const [member function]
     cls.add_method('GetOutputTtlMap', 
                    'std::map< unsigned int, unsigned int >', 
                    [], 
@@ -17743,7 +17714,7 @@
     cls.add_method('AddHostRouteTo', 
                    'void', 
                    [param('ns3::Ipv6Address', 'dest'), param('uint32_t', 'interface'), param('uint32_t', 'metric', default_value='0')])
-    ## ipv6-static-routing.h (module 'internet'): void ns3::Ipv6StaticRouting::AddMulticastRoute(ns3::Ipv6Address origin, ns3::Ipv6Address group, uint32_t inputInterface, std::vector<unsigned int, std::allocator<unsigned int> > outputInterfaces) [member function]
+    ## ipv6-static-routing.h (module 'internet'): void ns3::Ipv6StaticRouting::AddMulticastRoute(ns3::Ipv6Address origin, ns3::Ipv6Address group, uint32_t inputInterface, std::vector<unsigned int, std::allocator<unsigned int>> outputInterfaces) [member function]
     cls.add_method('AddMulticastRoute', 
                    'void', 
                    [param('ns3::Ipv6Address', 'origin'), param('ns3::Ipv6Address', 'group'), param('uint32_t', 'inputInterface'), param('std::vector< unsigned int >', 'outputInterfaces')])
@@ -17992,7 +17963,7 @@
                    'ns3::NdiscCache::Entry *', 
                    [param('ns3::Ipv6Address', 'dst')], 
                    is_virtual=True)
-    ## ndisc-cache.h (module 'internet'): std::list<ns3::NdiscCache::Entry *, std::allocator<ns3::NdiscCache::Entry *> > ns3::NdiscCache::LookupInverse(ns3::Address dst) [member function]
+    ## ndisc-cache.h (module 'internet'): std::list<ns3::NdiscCache::Entry *, std::allocator<ns3::NdiscCache::Entry *>> ns3::NdiscCache::LookupInverse(ns3::Address dst) [member function]
     cls.add_method('LookupInverse', 
                    'std::list< ns3::NdiscCache::Entry * >', 
                    [param('ns3::Address', 'dst')])
@@ -18117,7 +18088,7 @@
     cls.add_method('MarkProbe', 
                    'void', 
                    [])
-    ## ndisc-cache.h (module 'internet'): std::list<std::pair<ns3::Ptr<ns3::Packet>, ns3::Ipv6Header>, std::allocator<std::pair<ns3::Ptr<ns3::Packet>, ns3::Ipv6Header> > > ns3::NdiscCache::Entry::MarkReachable(ns3::Address mac) [member function]
+    ## ndisc-cache.h (module 'internet'): std::list<std::pair<ns3::Ptr<ns3::Packet>, ns3::Ipv6Header>, std::allocator<std::pair<ns3::Ptr<ns3::Packet>, ns3::Ipv6Header>>> ns3::NdiscCache::Entry::MarkReachable(ns3::Address mac) [member function]
     cls.add_method('MarkReachable', 
                    'std::list< std::pair< ns3::Ptr< ns3::Packet >, ns3::Ipv6Header > >', 
                    [param('ns3::Address', 'mac')])
@@ -18125,7 +18096,7 @@
     cls.add_method('MarkReachable', 
                    'void', 
                    [])
-    ## ndisc-cache.h (module 'internet'): std::list<std::pair<ns3::Ptr<ns3::Packet>, ns3::Ipv6Header>, std::allocator<std::pair<ns3::Ptr<ns3::Packet>, ns3::Ipv6Header> > > ns3::NdiscCache::Entry::MarkStale(ns3::Address mac) [member function]
+    ## ndisc-cache.h (module 'internet'): std::list<std::pair<ns3::Ptr<ns3::Packet>, ns3::Ipv6Header>, std::allocator<std::pair<ns3::Ptr<ns3::Packet>, ns3::Ipv6Header>>> ns3::NdiscCache::Entry::MarkStale(ns3::Address mac) [member function]
     cls.add_method('MarkStale', 
                    'std::list< std::pair< ns3::Ptr< ns3::Packet >, ns3::Ipv6Header > >', 
                    [param('ns3::Address', 'mac')])
@@ -18336,10 +18307,16 @@
     cls.add_method('ExtractNeighborIndex', 
                    'uint32_t', 
                    [param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetEpoch() const [member function]
+    cls.add_method('GetEpoch', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() const [member function]
     cls.add_method('GetRemainingBits', 
                    'uint32_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -18350,6 +18327,10 @@
                    'uint32_t', 
                    [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
+    ## nix-vector.h (module 'network'): void ns3::NixVector::SetEpoch(uint32_t epoch) [member function]
+    cls.add_method('SetEpoch', 
+                   'void', 
+                   [param('uint32_t', 'epoch')])
     return
 
 def register_Ns3Node_methods(root_module, cls):
@@ -18726,10 +18707,11 @@
                    'uint32_t', 
                    [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) const [member function]
     cls.add_method('SetNixVector', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')], 
+                   is_const=True)
     ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
     cls.add_method('ToString', 
                    'std::string', 
@@ -18846,7 +18828,7 @@
     cls.add_method('AssignStreams', 
                    'int64_t', 
                    [param('int64_t', 'stream')])
-    ## rip.h (module 'internet'): std::set<unsigned int, std::less<unsigned int>, std::allocator<unsigned int> > ns3::Rip::GetInterfaceExclusions() const [member function]
+    ## rip.h (module 'internet'): std::set<unsigned int, std::less<unsigned int>, std::allocator<unsigned int>> ns3::Rip::GetInterfaceExclusions() const [member function]
     cls.add_method('GetInterfaceExclusions', 
                    'std::set< unsigned int >', 
                    [], 
@@ -18896,7 +18878,7 @@
                    'ns3::Ptr< ns3::Ipv4Route >', 
                    [param('ns3::Ptr< ns3::Packet >', 'p'), param('ns3::Ipv4Header const &', 'header'), param('ns3::Ptr< ns3::NetDevice >', 'oif'), param('ns3::Socket::SocketErrno &', 'sockerr')], 
                    is_virtual=True)
-    ## rip.h (module 'internet'): void ns3::Rip::SetInterfaceExclusions(std::set<unsigned int, std::less<unsigned int>, std::allocator<unsigned int> > exceptions) [member function]
+    ## rip.h (module 'internet'): void ns3::Rip::SetInterfaceExclusions(std::set<unsigned int, std::less<unsigned int>, std::allocator<unsigned int>> exceptions) [member function]
     cls.add_method('SetInterfaceExclusions', 
                    'void', 
                    [param('std::set< unsigned int >', 'exceptions')])
@@ -18934,7 +18916,7 @@
     cls.add_method('AssignStreams', 
                    'int64_t', 
                    [param('int64_t', 'stream')])
-    ## ripng.h (module 'internet'): std::set<unsigned int, std::less<unsigned int>, std::allocator<unsigned int> > ns3::RipNg::GetInterfaceExclusions() const [member function]
+    ## ripng.h (module 'internet'): std::set<unsigned int, std::less<unsigned int>, std::allocator<unsigned int>> ns3::RipNg::GetInterfaceExclusions() const [member function]
     cls.add_method('GetInterfaceExclusions', 
                    'std::set< unsigned int >', 
                    [], 
@@ -18994,7 +18976,7 @@
                    'ns3::Ptr< ns3::Ipv6Route >', 
                    [param('ns3::Ptr< ns3::Packet >', 'p'), param('ns3::Ipv6Header const &', 'header'), param('ns3::Ptr< ns3::NetDevice >', 'oif'), param('ns3::Socket::SocketErrno &', 'sockerr')], 
                    is_virtual=True)
-    ## ripng.h (module 'internet'): void ns3::RipNg::SetInterfaceExclusions(std::set<unsigned int, std::less<unsigned int>, std::allocator<unsigned int> > exceptions) [member function]
+    ## ripng.h (module 'internet'): void ns3::RipNg::SetInterfaceExclusions(std::set<unsigned int, std::less<unsigned int>, std::allocator<unsigned int>> exceptions) [member function]
     cls.add_method('SetInterfaceExclusions', 
                    'void', 
                    [param('std::set< unsigned int >', 'exceptions')])
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/CMakeLists.txt ns-3.36/src/internet/CMakeLists.txt
--- ns-3.35/src/internet/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/internet/CMakeLists.txt	2022-04-30 18:23:57.850733500 -0700
@@ -0,0 +1,339 @@
+set(source_files
+    helper/internet-stack-helper.cc
+    helper/internet-trace-helper.cc
+    helper/ipv4-address-helper.cc
+    helper/ipv4-global-routing-helper.cc
+    helper/ipv4-interface-container.cc
+    helper/ipv4-list-routing-helper.cc
+    helper/ipv4-routing-helper.cc
+    helper/ipv4-static-routing-helper.cc
+    helper/ipv6-address-helper.cc
+    helper/ipv6-interface-container.cc
+    helper/ipv6-list-routing-helper.cc
+    helper/ipv6-routing-helper.cc
+    helper/ipv6-static-routing-helper.cc
+    helper/rip-helper.cc
+    helper/ripng-helper.cc
+    model/arp-cache.cc
+    model/arp-header.cc
+    model/arp-l3-protocol.cc
+    model/arp-queue-disc-item.cc
+    model/candidate-queue.cc
+    model/global-route-manager-impl.cc
+    model/global-route-manager.cc
+    model/global-router-interface.cc
+    model/icmpv4-l4-protocol.cc
+    model/icmpv4.cc
+    model/icmpv6-header.cc
+    model/icmpv6-l4-protocol.cc
+    model/ip-l4-protocol.cc
+    model/ipv4-address-generator.cc
+    model/ipv4-end-point-demux.cc
+    model/ipv4-end-point.cc
+    model/ipv4-global-routing.cc
+    model/ipv4-header.cc
+    model/ipv4-interface-address.cc
+    model/ipv4-interface.cc
+    model/ipv4-l3-protocol.cc
+    model/ipv4-list-routing.cc
+    model/ipv4-packet-filter.cc
+    model/ipv4-packet-info-tag.cc
+    model/ipv4-packet-probe.cc
+    model/ipv4-queue-disc-item.cc
+    model/ipv4-raw-socket-factory-impl.cc
+    model/ipv4-raw-socket-factory.cc
+    model/ipv4-raw-socket-impl.cc
+    model/ipv4-route.cc
+    model/ipv4-routing-protocol.cc
+    model/ipv4-routing-table-entry.cc
+    model/ipv4-static-routing.cc
+    model/ipv4.cc
+    model/ipv6-address-generator.cc
+    model/ipv6-autoconfigured-prefix.cc
+    model/ipv6-end-point-demux.cc
+    model/ipv6-end-point.cc
+    model/ipv6-extension-demux.cc
+    model/ipv6-extension-header.cc
+    model/ipv6-extension.cc
+    model/ipv6-header.cc
+    model/ipv6-interface-address.cc
+    model/ipv6-interface.cc
+    model/ipv6-l3-protocol.cc
+    model/ipv6-list-routing.cc
+    model/ipv6-option-demux.cc
+    model/ipv6-option-header.cc
+    model/ipv6-option.cc
+    model/ipv6-packet-filter.cc
+    model/ipv6-packet-info-tag.cc
+    model/ipv6-packet-probe.cc
+    model/ipv6-pmtu-cache.cc
+    model/ipv6-queue-disc-item.cc
+    model/ipv6-raw-socket-factory-impl.cc
+    model/ipv6-raw-socket-factory.cc
+    model/ipv6-raw-socket-impl.cc
+    model/ipv6-route.cc
+    model/ipv6-routing-protocol.cc
+    model/ipv6-routing-table-entry.cc
+    model/ipv6-static-routing.cc
+    model/ipv6.cc
+    model/loopback-net-device.cc
+    model/ndisc-cache.cc
+    model/pending-data.cc
+    model/rip-header.cc
+    model/rip.cc
+    model/ripng-header.cc
+    model/ripng.cc
+    model/rtt-estimator.cc
+    model/tcp-bbr.cc
+    model/tcp-bic.cc
+    model/tcp-congestion-ops.cc
+    model/tcp-cubic.cc
+    model/tcp-dctcp.cc
+    model/tcp-header.cc
+    model/tcp-highspeed.cc
+    model/tcp-htcp.cc
+    model/tcp-hybla.cc
+    model/tcp-illinois.cc
+    model/tcp-l4-protocol.cc
+    model/tcp-ledbat.cc
+    model/tcp-linux-reno.cc
+    model/tcp-lp.cc
+    model/tcp-option-rfc793.cc
+    model/tcp-option-sack-permitted.cc
+    model/tcp-option-sack.cc
+    model/tcp-option-ts.cc
+    model/tcp-option-winscale.cc
+    model/tcp-option.cc
+    model/tcp-prr-recovery.cc
+    model/tcp-rate-ops.cc
+    model/tcp-recovery-ops.cc
+    model/tcp-rx-buffer.cc
+    model/tcp-scalable.cc
+    model/tcp-socket-base.cc
+    model/tcp-socket-factory-impl.cc
+    model/tcp-socket-factory.cc
+    model/tcp-socket-state.cc
+    model/tcp-socket.cc
+    model/tcp-tx-buffer.cc
+    model/tcp-tx-item.cc
+    model/tcp-vegas.cc
+    model/tcp-veno.cc
+    model/tcp-westwood.cc
+    model/tcp-yeah.cc
+    model/udp-header.cc
+    model/udp-l4-protocol.cc
+    model/udp-socket-factory-impl.cc
+    model/udp-socket-factory.cc
+    model/udp-socket-impl.cc
+    model/udp-socket.cc
+)
+
+set(header_files
+    ${header_files}
+    helper/internet-stack-helper.h
+    helper/internet-trace-helper.h
+    helper/ipv4-address-helper.h
+    helper/ipv4-global-routing-helper.h
+    helper/ipv4-interface-container.h
+    helper/ipv4-list-routing-helper.h
+    helper/ipv4-routing-helper.h
+    helper/ipv4-static-routing-helper.h
+    helper/ipv6-address-helper.h
+    helper/ipv6-interface-container.h
+    helper/ipv6-list-routing-helper.h
+    helper/ipv6-routing-helper.h
+    helper/ipv6-static-routing-helper.h
+    helper/rip-helper.h
+    helper/ripng-helper.h
+    model/arp-cache.h
+    model/arp-header.h
+    model/arp-l3-protocol.h
+    model/arp-queue-disc-item.h
+    model/candidate-queue.h
+    model/global-route-manager-impl.h
+    model/global-route-manager.h
+    model/global-router-interface.h
+    model/icmpv4-l4-protocol.h
+    model/icmpv4.h
+    model/icmpv6-header.h
+    model/icmpv6-l4-protocol.h
+    model/ip-l4-protocol.h
+    model/ipv4-address-generator.h
+    model/ipv4-end-point-demux.h
+    model/ipv4-end-point.h
+    model/ipv4-global-routing.h
+    model/ipv4-header.h
+    model/ipv4-interface-address.h
+    model/ipv4-interface.h
+    model/ipv4-l3-protocol.h
+    model/ipv4-list-routing.h
+    model/ipv4-packet-filter.h
+    model/ipv4-packet-info-tag.h
+    model/ipv4-packet-probe.h
+    model/ipv4-queue-disc-item.h
+    model/ipv4-raw-socket-factory.h
+    model/ipv4-raw-socket-impl.h
+    model/ipv4-route.h
+    model/ipv4-routing-protocol.h
+    model/ipv4-routing-table-entry.h
+    model/ipv4-static-routing.h
+    model/ipv4.h
+    model/ipv6-address-generator.h
+    model/ipv6-end-point-demux.h
+    model/ipv6-end-point.h
+    model/ipv6-extension-demux.h
+    model/ipv6-extension-header.h
+    model/ipv6-extension.h
+    model/ipv6-header.h
+    model/ipv6-interface-address.h
+    model/ipv6-interface.h
+    model/ipv6-l3-protocol.h
+    model/ipv6-list-routing.h
+    model/ipv6-option-header.h
+    model/ipv6-option.h
+    model/ipv6-packet-filter.h
+    model/ipv6-packet-info-tag.h
+    model/ipv6-packet-probe.h
+    model/ipv6-pmtu-cache.h
+    model/ipv6-queue-disc-item.h
+    model/ipv6-raw-socket-factory.h
+    model/ipv6-route.h
+    model/ipv6-routing-protocol.h
+    model/ipv6-routing-table-entry.h
+    model/ipv6-static-routing.h
+    model/ipv6.h
+    model/loopback-net-device.h
+    model/ndisc-cache.h
+    model/rip-header.h
+    model/rip.h
+    model/ripng-header.h
+    model/ripng.h
+    model/rtt-estimator.h
+    model/tcp-bbr.h
+    model/tcp-bic.h
+    model/tcp-congestion-ops.h
+    model/tcp-cubic.h
+    model/tcp-dctcp.h
+    model/tcp-header.h
+    model/tcp-highspeed.h
+    model/tcp-htcp.h
+    model/tcp-hybla.h
+    model/tcp-illinois.h
+    model/tcp-l4-protocol.h
+    model/tcp-ledbat.h
+    model/tcp-linux-reno.h
+    model/tcp-lp.h
+    model/tcp-option-rfc793.h
+    model/tcp-option-sack-permitted.h
+    model/tcp-option-sack.h
+    model/tcp-option-ts.h
+    model/tcp-option-winscale.h
+    model/tcp-option.h
+    model/tcp-prr-recovery.h
+    model/tcp-rate-ops.h
+    model/tcp-recovery-ops.h
+    model/tcp-rx-buffer.h
+    model/tcp-scalable.h
+    model/tcp-socket-base.h
+    model/tcp-socket-factory.h
+    model/tcp-socket-state.h
+    model/tcp-socket.h
+    model/tcp-tx-buffer.h
+    model/tcp-tx-item.h
+    model/tcp-vegas.h
+    model/tcp-veno.h
+    model/tcp-westwood.h
+    model/tcp-yeah.h
+    model/udp-header.h
+    model/udp-l4-protocol.h
+    model/udp-socket-factory.h
+    model/udp-socket.h
+    model/windowed-filter.h
+)
+
+set(test_sources
+    test/global-route-manager-impl-test-suite.cc
+    test/icmp-test.cc
+    test/ipv4-address-generator-test-suite.cc
+    test/ipv4-address-helper-test-suite.cc
+    test/ipv4-deduplication-test.cc
+    test/ipv4-forwarding-test.cc
+    test/ipv4-fragmentation-test.cc
+    test/ipv4-global-routing-test-suite.cc
+    test/ipv4-header-test.cc
+    test/ipv4-list-routing-test-suite.cc
+    test/ipv4-packet-info-tag-test-suite.cc
+    test/ipv4-raw-test.cc
+    test/ipv4-rip-test.cc
+    test/ipv4-static-routing-test-suite.cc
+    test/ipv4-test.cc
+    test/ipv6-address-duplication-test.cc
+    test/ipv6-address-generator-test-suite.cc
+    test/ipv6-address-helper-test-suite.cc
+    test/ipv6-dual-stack-test-suite.cc
+    test/ipv6-extension-header-test-suite.cc
+    test/ipv6-forwarding-test.cc
+    test/ipv6-fragmentation-test.cc
+    test/ipv6-list-routing-test-suite.cc
+    test/ipv6-packet-info-tag-test-suite.cc
+    test/ipv6-raw-test.cc
+    test/ipv6-ripng-test.cc
+    test/ipv6-test.cc
+    test/rtt-test.cc
+    test/tcp-advertised-window-test.cc
+    test/tcp-bbr-test.cc
+    test/tcp-bic-test.cc
+    test/tcp-bytes-in-flight-test.cc
+    test/tcp-classic-recovery-test.cc
+    test/tcp-close-test.cc
+    test/tcp-cong-avoid-test.cc
+    test/tcp-datasentcb-test.cc
+    test/tcp-dctcp-test.cc
+    test/tcp-ecn-test.cc
+    test/tcp-endpoint-bug2211.cc
+    test/tcp-error-model.cc
+    test/tcp-fast-retr-test.cc
+    test/tcp-general-test.cc
+    test/tcp-header-test.cc
+    test/tcp-highspeed-test.cc
+    test/tcp-htcp-test.cc
+    test/tcp-hybla-test.cc
+    test/tcp-illinois-test.cc
+    test/tcp-ledbat-test.cc
+    test/tcp-linux-reno-test.cc
+    test/tcp-loss-test.cc
+    test/tcp-lp-test.cc
+    test/tcp-option-test.cc
+    test/tcp-pacing-test.cc
+    test/tcp-pkts-acked-test.cc
+    test/tcp-prr-recovery-test.cc
+    test/tcp-rate-ops-test.cc
+    test/tcp-rto-test.cc
+    test/tcp-rtt-estimation.cc
+    test/tcp-rx-buffer-test.cc
+    test/tcp-sack-permitted-test.cc
+    test/tcp-scalable-test.cc
+    test/tcp-slow-start-test.cc
+    test/tcp-syn-connection-failed-test.cc
+    test/tcp-test.cc
+    test/tcp-timestamp-test.cc
+    test/tcp-tx-buffer-test.cc
+    test/tcp-vegas-test.cc
+    test/tcp-veno-test.cc
+    test/tcp-wscaling-test.cc
+    test/tcp-yeah-test.cc
+    test/tcp-zero-window-test.cc
+    test/udp-test.cc
+)
+
+build_lib(
+  LIBNAME internet
+  SOURCE_FILES ${source_files}
+  HEADER_FILES ${header_files}
+  LIBRARIES_TO_LINK
+    ${libnetwork}
+    ${libcore}
+    ${libbridge}
+    ${libtraffic-control}
+  TEST_SOURCES ${test_sources}
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/doc/tcp.rst ns-3.36/src/internet/doc/tcp.rst
--- ns-3.35/src/internet/doc/tcp.rst	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/doc/tcp.rst	2022-04-30 18:23:57.858733400 -0700
@@ -25,16 +25,12 @@
 * class :cpp:class:`TcpCongestionOps`: This supports different variants of 
   congestion control-- a key topic of simulation-based TCP research.
 
-There are presently two active and one legacy implementations of TCP available for |ns3|.
+There are presently two active implementations of TCP available for |ns3|.
 
 * a natively implemented TCP for ns-3
 * support for kernel implementations via `Direct Code Execution (DCE) <https://www.nsnam.org/overview/projects/direct-code-execution/>`__
-* (legacy) support for kernel implementations for the `Network Simulation Cradle (NSC) <http://www.wand.net.nz/~stj2/nsc/>`__
 
-NSC is no longer actively supported; it requires use of gcc-5 or gcc-4.9, and
-only covers up to Linux kernel version 2.6.29.
-
-Direct Code Execution is also limited in its support for newer kernels; at
+Direct Code Execution is limited in its support for newer kernels; at
 present, only Linux kernel 4.4 is supported.  However, the TCP implementations
 in kernel 4.4 can still be used for ns-3 validation or for specialized
 simulation use cases.
@@ -137,8 +133,7 @@
 abstract base class :cpp:class:`TcpSocketFactory`. How does the script tell
 |ns3| that it wants the native |ns3| TCP vs. some other one? Well, when
 internet stacks are added to the node, the default TCP implementation that is
-aggregated to the node is the |ns3| TCP. This can be overridden as we show
-below when using Network Simulation Cradle. So, by default, when using the |ns3|
+aggregated to the node is the |ns3| TCP.  So, by default, when using the |ns3|
 helper API, the TCP that is aggregated to nodes with an Internet stack is the
 native |ns3| TCP.
 
@@ -552,13 +547,15 @@
 
 Westwood
 ^^^^^^^^
-Westwood and Westwood+ employ the AIAD (Additive Increase/Adaptive Decrease)Â·
-congestion control paradigm. When a congestion episode happens,Â·
+Westwood and Westwood+ employ the AIAD (Additive Increase/Adaptive Decrease)
+congestion control paradigm. When a congestion episode happens,
 instead of halving the cwnd, these protocols try to estimate the network's
-bandwidth and use the estimated value to adjust the cwnd.Â·
-While Westwood performs the bandwidth sampling every ACK reception,Â·
+bandwidth and use the estimated value to adjust the cwnd.
+While Westwood performs the bandwidth sampling every ACK reception,
 Westwood+ samples the bandwidth every RTT.
 
+WARNING: this TCP model lacks validation and regression tests; use with caution.
+
 More information at: http://dl.acm.org/citation.cfm?id=381704 and
 http://dl.acm.org/citation.cfm?id=2512757
 
@@ -819,7 +816,7 @@
 
 ::
 
-  ./waf --run "tcp-variants-comparison --transport_prot=TcpHtcp --bandwidth=20Mbps --duration=10"
+  ./ns3 run "tcp-variants-comparison --transport_prot=TcpHtcp --bandwidth=20Mbps --duration=10"
 
 More information (paper): http://www.hamilton.ie/net/htcp3.pdf
 
@@ -1406,14 +1403,9 @@
 * **tcp-pacing-test:** Unit tests on dynamic TCP pacing rate
 
 Several tests have dependencies outside of the ``internet`` module, so they
-are located in a system test directory called ``src/test/ns3tcp``. Three
-of these six tests involve use of the Network Simulation Cradle, and are
-disabled if NSC is not enabled in the build.  
+are located in a system test directory called ``src/test/ns3tcp``.
 
-* **ns3-tcp-cwnd:** Check to see that ns-3 TCP congestion control works against liblinux2.6.26.so implementation
-* **ns3-tcp-interoperability:** Check to see that ns-3 TCP interoperates with liblinux2.6.26.so implementation
 * **ns3-tcp-loss:** Check behavior of ns-3 TCP upon packet losses
-* **nsc-tcp-loss:** Check behavior of NSC TCP upon packet losses
 * **ns3-tcp-no-delay:** Check that ns-3 TCP Nagle's algorithm works correctly and that it can be disabled
 * **ns3-tcp-socket:** Check that ns-3 TCP successfully transfers an application data write of various sizes
 * **ns3-tcp-state:** Check the operation of the TCP state machine for several cases
@@ -1965,7 +1957,7 @@
 
 .. code-block:: bash
 
-   ./waf shell
+   ./ns3 shell
    gdb --args ./build/utils/ns3-dev-test-runner-debug --test-name=tcp-zero-window-test --stop-on-failure --fullness=QUICK --assert-on-failure --verbose
    (gdb) run
 
@@ -2154,12 +2146,12 @@
    PASS: TestSuite tcp-zero-window-test
    1 of 1 tests passed (1 passed, 0 skipped, 0 failed, 0 crashed, 0 valgrind errors)
 
-To see INFO messages, use a combination of ./waf shell and gdb (really useful):
+To see INFO messages, use a combination of ./ns3 shell and gdb (really useful):
 
 .. code-block:: bash
 
 
-    ./waf shell && gdb --args ./build/utils/ns3-dev-test-runner-debug --test-name=tcp-zero-window-test --stop-on-failure --fullness=QUICK --assert-on-failure --verbose
+    ./ns3 shell && gdb --args ./build/utils/ns3-dev-test-runner-debug --test-name=tcp-zero-window-test --stop-on-failure --fullness=QUICK --assert-on-failure --verbose
 
 and then, hit "Run".
 
@@ -2171,307 +2163,3 @@
    process. For instance, commits created to make this test case running without
    errors are 11633:6b74df04cf44, (others to be merged).
 
-Network Simulation Cradle
-*************************
-
-The `Network Simulation Cradle (NSC) <http://www.wand.net.nz/~stj2/nsc/>`_ is a
-framework for wrapping real-world network code into simulators, allowing
-simulation of real-world behavior at little extra cost. This work has been
-validated by comparing situations using a test network with the same situations
-in the simulator. To date, it has been shown that the NSC is able to produce
-extremely accurate results. NSC supports four real world stacks: FreeBSD,
-OpenBSD, lwIP and Linux. Emphasis has been placed on not changing any of the
-network stacks by hand. Not a single line of code has been changed in the
-network protocol implementations of any of the above four stacks. However, a
-custom C parser was built to programmatically change source code.
-
-NSC has previously been ported to |ns2| and OMNeT++, and was 
-was added to |ns3| in September 2008 (ns-3.2 release). This section
-describes the |ns3| port of NSC and how to use it.
-
-NSC has been obsoleted by the Linux kernel support within 
-`Direct Code Execution (DCE) <http://www.nsnam.org/docs/dce/manual/singlehtml/index.html>`__. However, NSC is still available through the bake build
-system. NSC supports Linux kernels 2.6.18 and 2.6.26, and an experimental
-version of 2.6.29 exists on ns-3's code server
-(http://code.nsnam.org/fw/nsc-linux-2.6.29/), but newer
-versions of the kernel have not been ported.  
-
-Prerequisites
-+++++++++++++
-
-Presently, NSC has been tested and shown to work on these platforms:
-Linux i386 and Linux x86-64. NSC does not support powerpc. Use on
-FreeBSD or OS X is unsupported (although it may be able to work).
-
-Building NSC requires the packages flex and bison.  
-
-NSC requires use of gcc-4.9 or gcc-5 series, and will not build on 
-newer systems lacking the older compilers.
-
-Configuring and Downloading
-+++++++++++++++++++++++++++
-
-NSC must either be downloaded separately from
-its own repository, or downloading when using the 
-`bake build system <http://www.nsnam.org/docs/tutorial/html/getting-started.html#downloading-ns3-using-bake>`_ of 
-|ns3|.
-
-For ns-3.17 through ns-3.28 releases, when using bake, one obtains NSC implicitly as part of an "allinone" configuration, such as:
-
-.. sourcecode:: bash
-
-  $ cd bake
-  $ python bake.py configure -e ns-allinone-3.27
-  $ python bake.py download
-  $ python bake.py build
-
-For ns-3.29 and later versions, including the 'ns-3-allinone' development
-version, one must explicitly add NSC ('nsc-0.5.3') to the bake configuration, 
-such as:
-
-.. sourcecode:: bash
-
-  $ cd bake
-  $ python bake.py configure -e ns-allinone-3.29 -e nsc-0.5.3
-  $ python bake.py download
-  $ python bake.py build
-
-Instead of a released version, one may use the ns-3 development version
-by specifying "ns-3-allinone" to the configure step above.
-
-NSC may also be downloaded from 
-`its download site <http://research.wand.net.nz/software/nsc.php>`_ 
-using Mercurial:
-
-.. sourcecode:: bash
-
-  $ hg clone https://secure.wand.net.nz/mercurial/nsc
-
-Prior to the ns-3.17 release, NSC was included in the allinone tarball and
-the released version did not need to be separately downloaded.
-
-Building and validating
-+++++++++++++++++++++++
-
-NSC may be built as part of the bake build process; alternatively, one
-may build NSC by itself using its build system; e.g.:
-
-.. sourcecode:: bash
-
-  $ cd nsc-dev
-  $ python scons.py
-
-Once NSC has been built either manually or through the bake system, change
-into the |ns3| source directory and try running the following configuration:
-
-.. sourcecode:: bash
-
-  $ ./waf configure
-
-If NSC has been previously built and found by waf, then you will see:
-
-.. sourcecode:: bash
-
-  Network Simulation Cradle     : enabled
-
-If NSC has not been found, you will see:
-
-.. sourcecode:: bash
-
-  Network Simulation Cradle     : not enabled (NSC not found (see option --with-nsc))
-
-In this case, you must pass the relative or absolute path to the NSC libraries
-with the "--with-nsc" configure option; e.g.
-
-.. sourcecode:: bash
-
-  $ ./waf configure --with-nsc=/path/to/my/nsc/directory
-
-For |ns3| releases prior to the ns-3.17 release, using the ``build.py`` 
-script in ns-3-allinone directory, NSC will be built by default unless the 
-platform does not support it. To explicitly disable it when building |ns3|, 
-type:
-
-.. sourcecode:: bash
-
-  $ ./waf configure --enable-examples --enable-tests --disable-nsc
-
-If waf detects NSC, then building |ns3| with NSC is performed the same way
-with waf as without it. Once |ns3| is built, try running the following
-test suite:
-
-.. sourcecode:: bash
-
-    $ ./test.py -s ns3-tcp-interoperability
-
-If NSC has been successfully built, the following test should show up 
-in the results:
-
-.. sourcecode:: text
-
-    PASS TestSuite ns3-tcp-interoperability
-
-This confirms that NSC is ready to use.
-
-Usage
-+++++
-
-There are a few example files. Try:
-
-.. sourcecode:: bash
-
-    $ ./waf --run tcp-nsc-zoo
-    $ ./waf --run tcp-nsc-lfn
-
-These examples will deposit some ``.pcap`` files in your directory,
-which can be examined by tcpdump or wireshark.
-
-Let's look at the ``examples/tcp/tcp-nsc-zoo.cc`` file for some typical
-usage. How does it differ from using native |ns3| TCP? There is one main
-configuration line, when using NSC and the |ns3| helper API, that needs to be
-set::
-
-  InternetStackHelper internetStack;
-
-  internetStack.SetNscStack ("liblinux2.6.26.so");
-  // this switches nodes 0 and 1 to NSCs Linux 2.6.26 stack.
-  internetStack.Install (n.Get(0));
-  internetStack.Install (n.Get(1));
-
-
-The key line is the ``SetNscStack``. This tells the InternetStack
-helper to aggregate instances of NSC TCP instead of native |ns3| TCP
-to the remaining nodes. It is important that this function be called
-**before** calling the ``Install()`` function, as shown above.
-
-Which stacks are available to use? Presently, the focus has been on
-Linux 2.6.18 and Linux 2.6.26 stacks for |ns3|. To see which stacks
-were built, one can execute the following find command at the |ns3| top level
-directory:
-
-.. sourcecode:: bash
-
-    $ find nsc -name "*.so" -type f 
-    nsc/linux-2.6.18/liblinux2.6.18.so
-    nsc/linux-2.6.26/liblinux2.6.26.so
-
-This tells us that we may either pass the library name liblinux2.6.18.so or
-liblinux2.6.26.so to the above configuration step.
-
-Stack configuration
-+++++++++++++++++++
-
-NSC TCP shares the same configuration attributes that are common across TCP
-sockets, as described above and documented in `Doxygen
-<http://www.nsnam.org/doxygen/classns3_1_1_tcp_socket.html>`_
-
-Additionally, NSC TCP exports a lot of configuration variables into the 
-|ns3| attributes system, via a `sysctl <http://en.wikipedia.org/wiki/Sysctl>`_-like interface. In the ``examples/tcp/tcp-nsc-zoo`` example, you
-can see the following configuration::
-
-
-  // this disables TCP SACK, wscale and timestamps on node 1 (the attributes 
-    represent sysctl-values).
-  Config::Set ("/NodeList/1/$ns3::Ns3NscStack<linux2.6.26>/net.ipv4.tcp_sack", 
-    StringValue ("0"));
-  Config::Set ("/NodeList/1/$ns3::Ns3NscStack<linux2.6.26>/net.ipv4.tcp_timestamps", 
-  StringValue ("0"));
-  Config::Set ("/NodeList/1/$ns3::Ns3NscStack<linux2.6.26>/net.ipv4.tcp_window_scaling", 
-  StringValue ("0"));
-
-These additional configuration variables are not available to native |ns3| TCP.
-
-Also note that default values for TCP attributes in |ns3| TCP may differ from the NSC TCP implementation. Specifically in |ns3|:
-
-  1) TCP default MSS is 536
-  2) TCP Delayed ACK count is 2
-		
-Therefore when making comparisons between results obtained using NSC and |ns3| TCP, care must be taken to ensure these values are set appropriately. See /examples/tcp/tcp-nsc-comparison.cc for an example.
-
-NSC API
-+++++++
-
-This subsection describes the API that NSC presents to |ns3| or any other
-simulator. NSC provides its API in the form of a number of classes that are
-defined in ``sim/sim_interface.h`` in the nsc directory.
-
-* **INetStack** INetStack contains the 'low level' operations for the operating
-  system network stack, e.g. in and output functions from and to the network
-  stack (think of this as the 'network driver interface'). There are also
-  functions to create new TCP or UDP sockets.
-* **ISendCallback** This is called by NSC when a packet should be sent out to
-  the network. This simulator should use this callback to re-inject the packet
-  into the simulator so the actual data can be delivered/routed to its
-  destination, where it will eventually be handed into Receive() (and eventually
-  back to the receivers NSC instance via INetStack->if_receive()).
-* **INetStreamSocket** This is the structure defining a particular connection
-  endpoint (file descriptor). It contains methods to operate on this endpoint,
-  e.g. connect, disconnect, accept, listen, send_data/read_data, ...
-* **IInterruptCallback** This contains the wakeup() callback, which is called by
-  NSC whenever something of interest happens. Think of wakeup() as a replacement
-  of the operating systems wakeup function: Whenever the operating system would
-  wake up a process that has been waiting for an operation to complete (for
-  example the TCP handshake during connect()), NSC invokes the wakeup() callback
-  to allow the simulator to check for state changes in its connection endpoints. 
-
-ns-3 implementation
-+++++++++++++++++++
-
-The |ns3| implementation makes use of the above NSC API, and is implemented as
-follows.
-
-The three main parts are:
-
-* :cpp:class:`ns3::NscTcpL4Protocol`: a subclass of Ipv4L4Protocol (and two NSC
-  classes: ISendCallback and IInterruptCallback)
-* :cpp:class:`ns3::NscTcpSocketImpl`: a subclass of TcpSocket 
-* :cpp:class:`ns3::NscTcpSocketFactoryImpl`: a factory to create new NSC
-  sockets
-
-``src/internet/model/nsc-tcp-l4-protocol`` is the main class. Upon
-Initialization, it loads an NSC network stack to use (via dlopen()). Each
-instance of this class may use a different stack. The stack (=shared library) to
-use is set using the SetNscLibrary() method (at this time its called indirectly
-via the internet stack helper). The NSC stack is then set up accordingly (timers
-etc). The NscTcpL4Protocol::Receive() function hands the packet it receives
-(must be a complete TCP/IP packet) to the NSC stack for further processing. To
-be able to send packets, this class implements the NSC send_callback() method.
-This method is called by NSC whenever the NSC stack wishes to send a packet out
-to the network. Its arguments are a raw buffer, containing a complete TCP/IP
-packet, and a length value. This method therefore has to convert the raw data to
-a Ptr<Packet> usable by |ns3|. In order to avoid various IPv4 header issues,
-the NSC IP header is not included. Instead, the TCP header and the actual
-payload are put into the Ptr<Packet>, after this the Packet is passed down to
-layer 3 for sending the packet out (no further special treatment is needed in
-the send code path).
-
-This class calls ``ns3::NscTcpSocketImpl`` both from the NSC wakeup() callback
-and from the receive path (to ensure that possibly queued data is scheduled for
-sending).
-
-``src/internet/model/nsc-tcp-socket-impl`` implements the NSC socket interface.
-Each instance has its own m_nscTcpSocket. Data that is sent will be handed to
-the NSC stack via m_nscTcpSocket->send_data() (and not to NscTcpL4Protocol, this
-is the major difference compared to |ns3| TCP). The class also queues up data
-that is sent before the underlying descriptor has entered an ESTABLISHED state.
-This class is called from the NscTcpL4Protocol class, when the NscTcpL4Protocol
-wakeup() callback is invoked by NSC. NscTcpSocketImpl then checks the current
-connection state (SYN_SENT, ESTABLISHED, LISTEN...) and schedules appropriate
-callbacks as needed, e.g. a LISTEN socket will schedule accept() to see if a new
-connection must be accepted, an ESTABLISHED socket schedules any pending data
-for writing, schedule a read() callback, etc.
-
-Note that ``ns3::NscTcpSocketImpl`` does not interact with NSC TCP directly:
-instead, data is redirected to NSC. NSC TCP calls the NSC TCP sockets of a node
-when its wakeup() callback is invoked by NSC.
-
-Limitations
-+++++++++++
-
-* NSC only works on single-interface nodes; attempting to run it on a
-  multi-interface node will cause a program error.  
-* Cygwin and OS X PPC are not supported; OS X Intel is not supported but may work
-* The non-Linux stacks of NSC are not supported in |ns3|
-* Not all socket API callbacks are supported
-
-For more information, see `this wiki page <http://www.nsnam.org/wiki/Network_Simulation_Cradle_Integration>`_.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/examples/CMakeLists.txt ns-3.36/src/internet/examples/CMakeLists.txt
--- ns-3.35/src/internet/examples/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/internet/examples/CMakeLists.txt	2022-04-30 18:23:57.858733400 -0700
@@ -0,0 +1,8 @@
+build_lib_example(
+  NAME main-simple
+  SOURCE_FILES main-simple.cc
+  LIBRARIES_TO_LINK
+    ${libnetwork}
+    ${libinternet}
+    ${libapplications}
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/examples/wscript ns-3.36/src/internet/examples/wscript
--- ns-3.35/src/internet/examples/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/examples/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,9 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    if not bld.env['ENABLE_EXAMPLES']:
-        return;
-
-    obj = bld.create_ns3_program('main-simple',
-                                 ['network', 'internet', 'applications'])
-    obj.source = 'main-simple.cc'
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/helper/internet-stack-helper.cc ns-3.36/src/internet/helper/internet-stack-helper.cc
--- ns-3.35/src/internet/helper/internet-stack-helper.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/helper/internet-stack-helper.cc	2022-04-30 18:23:57.858733400 -0700
@@ -258,13 +258,6 @@
 }
 
 void 
-InternetStackHelper::SetTcp (std::string tid, std::string n0, const AttributeValue &v0)
-{
-  m_tcpFactory.SetTypeId (tid);
-  m_tcpFactory.Set (n0,v0);
-}
-
-void 
 InternetStackHelper::Install (NodeContainer c) const
 {
   for (NodeContainer::Iterator i = c.Begin (); i != c.End (); ++i)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/helper/internet-stack-helper.h ns-3.36/src/internet/helper/internet-stack-helper.h
--- ns-3.35/src/internet/helper/internet-stack-helper.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/helper/internet-stack-helper.h	2022-04-30 18:23:57.858733400 -0700
@@ -186,20 +186,6 @@
   void SetTcp (std::string tid);
 
   /**
-   * \brief This function is used to setup the Network Simulation Cradle stack with library value.
-   * 
-   * Give the NSC stack a shared library file name to use when creating the 
-   * stack implementation.  The attr string is actually the attribute name to 
-   * be setup and val is its value. The attribute is the stack implementation 
-   * to be used and the value is the shared library name.
-   * 
-   * \param tid The type id, for the case of nsc it would be "ns3::NscTcpL4Protocol" 
-   * \param attr The attribute name that must be setup, for example "Library"
-   * \param val The attribute value, which will be in fact the shared library name (example:"liblinux2.6.26.so")
-   */
-  void SetTcp (std::string tid, std::string attr, const AttributeValue &val); 
-
-  /**
    * \brief Enable/disable IPv4 stack install.
    * \param enable enable state
    */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/model/arp-cache.cc ns-3.36/src/internet/model/arp-cache.cc
--- ns-3.35/src/internet/model/arp-cache.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/model/arp-cache.cc	2022-04-30 18:23:57.858733400 -0700
@@ -37,7 +37,7 @@
 
 NS_OBJECT_ENSURE_REGISTERED (ArpCache);
 
-TypeId 
+TypeId
 ArpCache::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::ArpCache")
@@ -85,7 +85,7 @@
 }
 
 ArpCache::ArpCache ()
-  : m_device (0), 
+  : m_device (0),
     m_interface (0)
 {
   NS_LOG_FUNCTION (this);
@@ -96,7 +96,7 @@
   NS_LOG_FUNCTION (this);
 }
 
-void 
+void
 ArpCache::DoDispose (void)
 {
   NS_LOG_FUNCTION (this);
@@ -132,19 +132,19 @@
   return m_interface;
 }
 
-void 
+void
 ArpCache::SetAliveTimeout (Time aliveTimeout)
 {
   NS_LOG_FUNCTION (this << aliveTimeout);
   m_aliveTimeout = aliveTimeout;
 }
-void 
+void
 ArpCache::SetDeadTimeout (Time deadTimeout)
 {
   NS_LOG_FUNCTION (this << deadTimeout);
   m_deadTimeout = deadTimeout;
 }
-void 
+void
 ArpCache::SetWaitReplyTimeout (Time waitReplyTimeout)
 {
   NS_LOG_FUNCTION (this << waitReplyTimeout);
@@ -170,7 +170,7 @@
   return m_waitReplyTimeout;
 }
 
-void 
+void
 ArpCache::SetArpRequestCallback (Callback<void, Ptr<const ArpCache>,
                                           Ipv4Address> arpRequestCallback)
 {
@@ -178,7 +178,7 @@
   m_arpRequestCallback = arpRequestCallback;
 }
 
-void 
+void
 ArpCache::StartWaitReplyTimer (void)
 {
   NS_LOG_FUNCTION (this);
@@ -186,7 +186,7 @@
     {
       NS_LOG_LOGIC ("Starting WaitReplyTimer at " << Simulator::Now () << " for " <<
                     m_waitReplyTimeout);
-      m_waitReplyTimer = Simulator::Schedule (m_waitReplyTimeout, 
+      m_waitReplyTimer = Simulator::Schedule (m_waitReplyTimeout,
                                               &ArpCache::HandleWaitReplyTimeout, this);
     }
 }
@@ -197,7 +197,7 @@
   NS_LOG_FUNCTION (this);
   ArpCache::Entry* entry;
   bool restartWaitReplyTimer = false;
-  for (CacheI i = m_arpCache.begin (); i != m_arpCache.end (); i++) 
+  for (CacheI i = m_arpCache.begin (); i != m_arpCache.end (); i++)
     {
       entry = (*i).second;
       if (entry != 0 && entry->IsWaitReply ())
@@ -235,16 +235,16 @@
   if (restartWaitReplyTimer)
     {
       NS_LOG_LOGIC ("Restarting WaitReplyTimer at " << Simulator::Now ().GetSeconds ());
-      m_waitReplyTimer = Simulator::Schedule (m_waitReplyTimeout, 
+      m_waitReplyTimer = Simulator::Schedule (m_waitReplyTimeout,
                                               &ArpCache::HandleWaitReplyTimeout, this);
     }
 }
 
-void 
+void
 ArpCache::Flush (void)
 {
   NS_LOG_FUNCTION (this);
-  for (CacheI i = m_arpCache.begin (); i != m_arpCache.end (); i++) 
+  for (CacheI i = m_arpCache.begin (); i != m_arpCache.end (); i++)
     {
       delete (*i).second;
     }
@@ -342,7 +342,7 @@
 ArpCache::Remove (ArpCache::Entry *entry)
 {
   NS_LOG_FUNCTION (this << entry);
-  
+
   for (CacheI i = m_arpCache.begin (); i != m_arpCache.end (); i++)
     {
       if ((*i).second == entry)
@@ -365,34 +365,34 @@
 }
 
 
-bool 
+bool
 ArpCache::Entry::IsDead (void)
 {
   NS_LOG_FUNCTION (this);
-  return (m_state == DEAD) ? true : false;
+  return (m_state == DEAD);
 }
-bool 
+bool
 ArpCache::Entry::IsAlive (void)
 {
   NS_LOG_FUNCTION (this);
-  return (m_state == ALIVE) ? true : false;
+  return (m_state == ALIVE);
 }
 bool
 ArpCache::Entry::IsWaitReply (void)
 {
   NS_LOG_FUNCTION (this);
-  return (m_state == WAIT_REPLY) ? true : false;
+  return (m_state == WAIT_REPLY);
 }
 bool
 ArpCache::Entry::IsPermanent (void)
 {
   NS_LOG_FUNCTION (this);
-  return (m_state == PERMANENT) ? true : false;
+  return (m_state == PERMANENT);
 }
 
 
-void 
-ArpCache::Entry::MarkDead (void) 
+void
+ArpCache::Entry::MarkDead (void)
 {
   NS_LOG_FUNCTION (this);
   NS_ASSERT (m_state == ALIVE || m_state == WAIT_REPLY || m_state == DEAD);
@@ -401,7 +401,7 @@
   UpdateSeen ();
 }
 void
-ArpCache::Entry::MarkAlive (Address macAddress) 
+ArpCache::Entry::MarkAlive (Address macAddress)
 {
   NS_LOG_FUNCTION (this << macAddress);
   NS_ASSERT (m_state == WAIT_REPLY);
@@ -436,7 +436,7 @@
   m_pending.push_back (waiting);
   return true;
 }
-void 
+void
 ArpCache::Entry::MarkWaitReply (Ipv4PayloadHeaderPair waiting)
 {
   NS_LOG_FUNCTION (this << waiting.first);
@@ -456,13 +456,13 @@
   NS_LOG_FUNCTION (this);
   return m_macAddress;
 }
-void 
+void
 ArpCache::Entry::SetMacAddress (Address macAddress)
 {
   NS_LOG_FUNCTION (this);
   m_macAddress = macAddress;
 }
-Ipv4Address 
+Ipv4Address
 ArpCache::Entry::GetIpv4Address (void) const
 {
   NS_LOG_FUNCTION (this);
@@ -493,17 +493,17 @@
       /* NOTREACHED */
     }
 }
-bool 
+bool
 ArpCache::Entry::IsExpired (void) const
 {
   NS_LOG_FUNCTION (this);
   Time timeout = GetTimeout ();
   Time delta = Simulator::Now () - m_lastSeen;
   NS_LOG_DEBUG ("delta=" << delta.GetSeconds () << "s");
-  if (delta > timeout) 
+  if (delta > timeout)
     {
       return true;
-    } 
+    }
   return false;
 }
 ArpCache::Ipv4PayloadHeaderPair
@@ -522,13 +522,13 @@
       return p;
     }
 }
-void 
+void
 ArpCache::Entry::ClearPendingPacket (void)
 {
   NS_LOG_FUNCTION (this);
   m_pending.clear ();
 }
-void 
+void
 ArpCache::Entry::UpdateSeen (void)
 {
   NS_LOG_FUNCTION (this);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/model/arp-cache.h ns-3.36/src/internet/model/arp-cache.h
--- ns-3.35/src/internet/model/arp-cache.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/model/arp-cache.h	2022-04-30 18:23:57.858733400 -0700
@@ -50,21 +50,6 @@
  */
 class ArpCache : public Object
 {
-private:
-  /**
-   * \brief Copy constructor
-   *
-   * Defined and unimplemented to avoid misuse
-   */
-  ArpCache (ArpCache const &);
-  /**
-   * \brief Copy constructor
-   *
-   * Defined and unimplemented to avoid misuse
-   * \returns
-   */
-  ArpCache& operator= (ArpCache const &);
-
 public:
   /**
    * \brief Get the type ID.
@@ -72,9 +57,14 @@
    */
   static TypeId GetTypeId (void);
   class Entry;
+
   ArpCache ();
   ~ArpCache ();
 
+  // Delete copy constructor and assignment operator to avoid misuse
+  ArpCache (ArpCache const &) = delete;
+  ArpCache & operator = (ArpCache const &) = delete;
+
   /**
    * \brief Set the NetDevice and Ipv4Interface associated with the ArpCache
    *
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/model/arp-header.cc ns-3.36/src/internet/model/arp-header.cc
--- ns-3.35/src/internet/model/arp-header.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/model/arp-header.cc	2022-04-30 18:23:57.858733400 -0700
@@ -29,7 +29,7 @@
 
 NS_OBJECT_ENSURE_REGISTERED (ArpHeader);
 
-void 
+void
 ArpHeader::SetRequest (Address sourceHardwareAddress,
                        Ipv4Address sourceProtocolAddress,
                        Address destinationHardwareAddress,
@@ -42,7 +42,7 @@
   m_ipv4Source = sourceProtocolAddress;
   m_ipv4Dest = destinationProtocolAddress;
 }
-void 
+void
 ArpHeader::SetReply (Address sourceHardwareAddress,
                      Ipv4Address sourceProtocolAddress,
                      Address destinationHardwareAddress,
@@ -55,37 +55,37 @@
   m_ipv4Source = sourceProtocolAddress;
   m_ipv4Dest = destinationProtocolAddress;
 }
-bool 
+bool
 ArpHeader::IsRequest (void) const
 {
   NS_LOG_FUNCTION (this);
-  return (m_type == ARP_TYPE_REQUEST) ? true : false;
+  return m_type == ARP_TYPE_REQUEST;
 }
-bool 
+bool
 ArpHeader::IsReply (void) const
 {
   NS_LOG_FUNCTION (this);
-  return (m_type == ARP_TYPE_REPLY) ? true : false;
+  return m_type == ARP_TYPE_REPLY;
 }
-Address 
+Address
 ArpHeader::GetSourceHardwareAddress (void) const
 {
   NS_LOG_FUNCTION (this);
   return m_macSource;
 }
-Address 
+Address
 ArpHeader::GetDestinationHardwareAddress (void) const
 {
   NS_LOG_FUNCTION (this);
   return m_macDest;
 }
-Ipv4Address 
+Ipv4Address
 ArpHeader::GetSourceIpv4Address (void) const
 {
   NS_LOG_FUNCTION (this);
   return m_ipv4Source;
 }
-Ipv4Address 
+Ipv4Address
 ArpHeader::GetDestinationIpv4Address (void) const
 {
   NS_LOG_FUNCTION (this);
@@ -93,7 +93,7 @@
 }
 
 
-TypeId 
+TypeId
 ArpHeader::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::ArpHeader")
@@ -103,28 +103,28 @@
   ;
   return tid;
 }
-TypeId 
+TypeId
 ArpHeader::GetInstanceTypeId (void) const
 {
   NS_LOG_FUNCTION (this);
   return GetTypeId ();
 }
-void 
+void
 ArpHeader::Print (std::ostream &os) const
 {
   NS_LOG_FUNCTION (this << &os);
-  if (IsRequest ()) 
+  if (IsRequest ())
     {
       os << "request "
          << "source mac: " << m_macSource << " "
          << "source ipv4: " << m_ipv4Source << " "
          << "dest ipv4: " << m_ipv4Dest
       ;
-    } 
-  else 
+    }
+  else
     {
       NS_ASSERT (IsReply ());
-      os << "reply " 
+      os << "reply "
          << "source mac: " << m_macSource << " "
          << "source ipv4: " << m_ipv4Source << " "
          << "dest mac: " << m_macDest << " "
@@ -132,7 +132,7 @@
       ;
     }
 }
-uint32_t 
+uint32_t
 ArpHeader::GetSerializedSize (void) const
 {
   NS_LOG_FUNCTION (this);
@@ -178,7 +178,7 @@
   //
   // It is implicit here that we have a protocol type of 0x800 (IP).
   // It is also implicit here that we are using Ipv4 (PLN == 4).
-  // If this isn't the case, we need to return an error since we don't want to 
+  // If this isn't the case, we need to return an error since we don't want to
   // be too fragile if we get connected to real networks.
   //
   if (protocolType != 0x800 || protocolAddressLen != 4)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/model/arp-l3-protocol.h ns-3.36/src/internet/model/arp-l3-protocol.h
--- ns-3.35/src/internet/model/arp-l3-protocol.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/model/arp-l3-protocol.h	2022-04-30 18:23:57.858733400 -0700
@@ -63,6 +63,10 @@
   ArpL3Protocol ();
   virtual ~ArpL3Protocol ();
 
+  // Delete copy constructor and assignment operator to avoid misuse
+  ArpL3Protocol (const ArpL3Protocol &) = delete;
+  ArpL3Protocol & operator = (const ArpL3Protocol &) = delete;
+
   /**
    * \brief Set the node the ARP L3 protocol is associated with
    * \param node the node
@@ -128,21 +132,6 @@
   virtual void NotifyNewAggregate ();
 private:
   typedef std::list<Ptr<ArpCache> > CacheList; //!< container of the ARP caches
-  /**
-   * \brief Copy constructor
-   *
-   * Defined and unimplemented to avoid misuse
-   * \param o
-   */
-  ArpL3Protocol (const ArpL3Protocol &o);
-  /**
-   * \brief Copy constructor
-   *
-   * Defined and unimplemented to avoid misuse
-   * \param o
-   * \returns
-   */
-  ArpL3Protocol &operator = (const ArpL3Protocol &o);
 
   /**
    * \brief Finds the cache associated with a NetDevice
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/model/arp-queue-disc-item.h ns-3.36/src/internet/model/arp-queue-disc-item.h
--- ns-3.35/src/internet/model/arp-queue-disc-item.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/model/arp-queue-disc-item.h	2022-04-30 18:23:57.858733400 -0700
@@ -44,8 +44,14 @@
    */
   ArpQueueDiscItem (Ptr<Packet> p, const Address & addr, uint16_t protocol, const ArpHeader & header);
 
+  /** Destructor. */
   virtual ~ArpQueueDiscItem ();
 
+  // Delete default constructor, copy constructor and assignment operator to avoid misuse
+  ArpQueueDiscItem () = delete;
+  ArpQueueDiscItem (const ArpQueueDiscItem &) = delete;
+  ArpQueueDiscItem & operator = (const ArpQueueDiscItem &) = delete;
+
   /**
    * \return the correct packet size (header plus payload).
    */
@@ -82,28 +88,8 @@
   virtual uint32_t Hash (uint32_t perturbation) const;
 
 private:
-  /**
-   * \brief Default constructor
-   *
-   * Defined and unimplemented to avoid misuse
-   */
-  ArpQueueDiscItem ();
-  /**
-   * \brief Copy constructor
-   *
-   * Defined and unimplemented to avoid misuse
-   */
-  ArpQueueDiscItem (const ArpQueueDiscItem &);
-  /**
-   * \brief Assignment operator
-   *
-   * Defined and unimplemented to avoid misuse
-   * \returns
-   */
-  ArpQueueDiscItem &operator = (const ArpQueueDiscItem &);
-
   ArpHeader m_header;  //!< The ARP header.
-  bool m_headerAdded;   //!< True if the header has already been added to the packet.
+  bool m_headerAdded;  //!< True if the header has already been added to the packet.
 };
 
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/model/icmpv6-header.cc ns-3.36/src/internet/model/icmpv6-header.cc
--- ns-3.35/src/internet/model/icmpv6-header.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/model/icmpv6-header.cc	2022-04-30 18:23:57.862733600 -0700
@@ -1069,17 +1069,11 @@
   NS_LOG_FUNCTION (this);
 }
 
-Ptr<Packet> Icmpv6DestinationUnreachable::GetPacket () const
-{
-  NS_LOG_FUNCTION (this);
-  return m_packet;
-}
-
 void Icmpv6DestinationUnreachable::SetPacket (Ptr<Packet> p)
 {
   NS_LOG_FUNCTION (this << *p);
   NS_ASSERT (p->GetSize () <= 1280);
-  m_packet = p;
+  m_packet = p->Copy ();
 }
 
 void Icmpv6DestinationUnreachable::Print (std::ostream& os) const
@@ -1091,7 +1085,9 @@
 uint32_t Icmpv6DestinationUnreachable::GetSerializedSize () const
 {
   NS_LOG_FUNCTION (this);
-  return 8 + m_packet->GetSize ();
+  // The real size of the header is 8 + m_packet->GetSize ()
+  // HOWEVER we just serialize the first 8 bytes, as the rest is serialized separately.
+  return 8;
 }
 
 void Icmpv6DestinationUnreachable::Serialize (Buffer::Iterator start) const
@@ -1100,40 +1096,40 @@
   uint16_t checksum = 0;
   Buffer::Iterator i = start;
 
-  i.WriteU8 (GetType ());
-  i.WriteU8 (GetCode ());
-  i.WriteHtonU16 (0);
-  i.WriteHtonU32 (0);
+  Buffer secondaryBuffer;
+  secondaryBuffer.AddAtStart (8 + m_packet->GetSize ());
+  Buffer::Iterator iter = secondaryBuffer.Begin ();
+
+  iter.WriteU8 (GetType ());
+  iter.WriteU8 (GetCode ());
+  iter.WriteU16 (0);
+  iter.WriteU32 (0);
 
   uint32_t size = m_packet->GetSize ();
   uint8_t *buf = new uint8_t[size];
   m_packet->CopyData (buf, size);
-  i.Write (buf, size);
+  iter.Write (buf, size);
   delete[] buf;
 
-  i = start;
-  checksum = i.CalculateIpChecksum (i.GetSize (), GetChecksum ());
+  iter = secondaryBuffer.Begin ();
+  checksum = iter.CalculateIpChecksum (iter.GetSize (), GetChecksum ());
 
-  i = start;
-  i.Next (2);
+  i.WriteU8 (GetType ());
+  i.WriteU8 (GetCode ());
   i.WriteU16 (checksum);
+  i.WriteU32 (0);
 }
 
 uint32_t Icmpv6DestinationUnreachable::Deserialize (Buffer::Iterator start)
 {
   NS_LOG_FUNCTION (this << &start);
-  uint16_t length = start.GetRemainingSize () - 8;
-  uint8_t* data = new uint8_t[length];
   Buffer::Iterator i = start;
 
   SetType (i.ReadU8 ());
   SetCode (i.ReadU8 ());
   m_checksum = i.ReadU16 ();
-  i.ReadNtohU32 ();
-  i.Read (data, length);
-  m_packet = Create<Packet> (data, length);
+  i.ReadU32 ();
 
-  delete[] data;
   return GetSerializedSize ();
 }
 
@@ -1168,17 +1164,11 @@
   NS_LOG_FUNCTION (this);
 }
 
-Ptr<Packet> Icmpv6TooBig::GetPacket () const
-{
-  NS_LOG_FUNCTION (this);
-  return m_packet;
-}
-
 void Icmpv6TooBig::SetPacket (Ptr<Packet> p)
 {
   NS_LOG_FUNCTION (this << *p);
   NS_ASSERT (p->GetSize () <= 1280);
-  m_packet = p;
+  m_packet = p->Copy ();
 }
 
 uint32_t Icmpv6TooBig::GetMtu () const
@@ -1202,7 +1192,9 @@
 uint32_t Icmpv6TooBig::GetSerializedSize () const 
 {
   NS_LOG_FUNCTION (this);
-  return 8 + m_packet->GetSize ();
+  // The real size of the header is 8 + m_packet->GetSize ()
+  // HOWEVER we just serialize the first 8 bytes, as the rest is serialized separately.
+  return 8;
 }
 
 void Icmpv6TooBig::Serialize (Buffer::Iterator start) const
@@ -1211,40 +1203,40 @@
   uint16_t checksum = 0;
   Buffer::Iterator i = start;
 
-  i.WriteU8 (GetType ());
-  i.WriteU8 (GetCode ());
-  i.WriteHtonU16 (0);
-  i.WriteHtonU32 (GetMtu ());
+  Buffer secondaryBuffer;
+  secondaryBuffer.AddAtStart (8 + m_packet->GetSize ());
+  Buffer::Iterator iter = secondaryBuffer.Begin ();
+
+  iter.WriteU8 (GetType ());
+  iter.WriteU8 (GetCode ());
+  iter.WriteU16 (0);
+  iter.WriteHtonU32 (GetMtu ());
 
   uint32_t size = m_packet->GetSize ();
   uint8_t *buf = new uint8_t[size];
   m_packet->CopyData (buf, size);
-  i.Write (buf, size);
+  iter.Write (buf, size);
   delete[] buf;
 
-  i = start;
-  checksum = i.CalculateIpChecksum (i.GetSize (), GetChecksum ());
+  iter = secondaryBuffer.Begin ();
+  checksum = iter.CalculateIpChecksum (iter.GetSize (), GetChecksum ());
 
-  i = start;
-  i.Next (2);
+  i.WriteU8 (GetType ());
+  i.WriteU8 (GetCode ());
   i.WriteU16 (checksum);
+  i.WriteHtonU32 (GetMtu ());
 }
 
 uint32_t Icmpv6TooBig::Deserialize (Buffer::Iterator start) 
 {
   NS_LOG_FUNCTION (this << &start);
-  uint16_t length = start.GetRemainingSize () - 8;
-  uint8_t* data = new uint8_t[length];
   Buffer::Iterator i = start;
 
   SetType (i.ReadU8 ());
   SetCode (i.ReadU8 ());
   m_checksum = i.ReadU16 ();
   SetMtu (i.ReadNtohU32 ());
-  i.Read (data, length);
-  m_packet = Create<Packet> (data, length);
 
-  delete[] data;
   return GetSerializedSize ();
 }
 
@@ -1278,17 +1270,12 @@
   NS_LOG_FUNCTION (this);
 }
 
-Ptr<Packet> Icmpv6TimeExceeded::GetPacket () const 
-{
-  NS_LOG_FUNCTION (this);
-  return m_packet;
-}
 
 void Icmpv6TimeExceeded::SetPacket (Ptr<Packet> p) 
 {
   NS_LOG_FUNCTION (this << *p);
   NS_ASSERT (p->GetSize () <= 1280);
-  m_packet = p;
+  m_packet = p->Copy ();
 }
 
 void Icmpv6TimeExceeded::Print (std::ostream& os) const
@@ -1300,51 +1287,51 @@
 uint32_t Icmpv6TimeExceeded::GetSerializedSize () const
 {
   NS_LOG_FUNCTION (this);
-  return 8 + m_packet->GetSize ();
+  // The real size of the header is 8 + m_packet->GetSize ()
+  // HOWEVER we just serialize the first 8 bytes, as the rest is serialized separately.
+  return 8;
 }
 
 void Icmpv6TimeExceeded::Serialize (Buffer::Iterator start) const
 {
   NS_LOG_FUNCTION (this << &start);
-  
   uint16_t checksum = 0;
   Buffer::Iterator i = start;
 
-  i.WriteU8 (GetType ());
-  i.WriteU8 (GetCode ());
-  i.WriteHtonU16 (0);
-  i.WriteHtonU32 (0);
+  Buffer secondaryBuffer;
+  secondaryBuffer.AddAtStart (8 + m_packet->GetSize ());
+  Buffer::Iterator iter = secondaryBuffer.Begin ();
+
+  iter.WriteU8 (GetType ());
+  iter.WriteU8 (GetCode ());
+  iter.WriteU16 (0);
+  iter.WriteU32 (0);
 
   uint32_t size = m_packet->GetSize ();
   uint8_t *buf = new uint8_t[size];
   m_packet->CopyData (buf, size);
-  i.Write (buf, size);
+  iter.Write (buf, size);
   delete[] buf;
 
-  i = start;
-  checksum = i.CalculateIpChecksum (i.GetSize (), GetChecksum ());
+  iter = secondaryBuffer.Begin ();
+  checksum = iter.CalculateIpChecksum (iter.GetSize (), GetChecksum ());
 
-  i = start;
-  i.Next (2);
+  i.WriteU8 (GetType ());
+  i.WriteU8 (GetCode ());
   i.WriteU16 (checksum);
+  i.WriteU32 (0);
 }
 
 uint32_t Icmpv6TimeExceeded::Deserialize (Buffer::Iterator start)
 {
   NS_LOG_FUNCTION (this << &start);
-  
-  uint16_t length = start.GetRemainingSize () - 8;
-  uint8_t* data = new uint8_t[length];
   Buffer::Iterator i = start;
 
   SetType (i.ReadU8 ());
   SetCode (i.ReadU8 ());
   m_checksum = i.ReadU16 ();
-  i.ReadNtohU32 ();
-  i.Read (data, length);
-  m_packet = Create<Packet> (data, length);
+  i.ReadU32 ();
 
-  delete[] data;
   return GetSerializedSize ();
 }
 
@@ -1379,17 +1366,11 @@
   NS_LOG_FUNCTION (this);
 }
 
-Ptr<Packet> Icmpv6ParameterError::GetPacket () const
-{
-  NS_LOG_FUNCTION (this);
-  return m_packet;
-}
-
 void Icmpv6ParameterError::SetPacket (Ptr<Packet> p)
 {
   NS_LOG_FUNCTION (this << *p);
   NS_ASSERT (p->GetSize () <= 1280);
-  m_packet = p;
+  m_packet = p->Copy ();
 }
 
 uint32_t Icmpv6ParameterError::GetPtr () const
@@ -1413,7 +1394,9 @@
 uint32_t Icmpv6ParameterError::GetSerializedSize () const 
 {
   NS_LOG_FUNCTION (this);
-  return 8 + m_packet->GetSize ();
+  // The real size of the header is 8 + m_packet->GetSize ()
+  // HOWEVER we just serialize the first 8 bytes, as the rest is serialized separately.
+  return 8;
 }
 
 void Icmpv6ParameterError::Serialize (Buffer::Iterator start) const 
@@ -1422,39 +1405,39 @@
   uint16_t checksum = 0;
   Buffer::Iterator i = start;
 
-  i.WriteU8 (GetType ());
-  i.WriteU8 (GetCode ());
-  i.WriteHtonU16 (0);
-  i.WriteHtonU32 (GetPtr ());
+  Buffer secondaryBuffer;
+  secondaryBuffer.AddAtStart (8 + m_packet->GetSize ());
+  Buffer::Iterator iter = secondaryBuffer.Begin ();
+
+  iter.WriteU8 (GetType ());
+  iter.WriteU8 (GetCode ());
+  iter.WriteU16 (0);
+  iter.WriteHtonU32 (GetPtr ());
 
   uint32_t size = m_packet->GetSize ();
   uint8_t *buf = new uint8_t[size];
   m_packet->CopyData (buf, size);
-  i.Write (buf, size);
+  iter.Write (buf, size);
   delete[] buf;
 
-  i = start;
-  checksum = i.CalculateIpChecksum (i.GetSize (), GetChecksum ());
+  iter = secondaryBuffer.Begin ();
+  checksum = iter.CalculateIpChecksum (iter.GetSize (), GetChecksum ());
 
-  i = start;
-  i.Next (2);
+  i.WriteU8 (GetType ());
+  i.WriteU8 (GetCode ());
   i.WriteU16 (checksum);
+  i.WriteHtonU32 (GetPtr ());
 }
 
 uint32_t Icmpv6ParameterError::Deserialize (Buffer::Iterator start) 
 {
   NS_LOG_FUNCTION (this << &start);
-  uint16_t length = start.GetRemainingSize () - 8;
-  uint8_t* data = new uint8_t[length];
   Buffer::Iterator i = start;
 
   SetType (i.ReadU8 ());
   SetCode (i.ReadU8 ());
   m_checksum = i.ReadU16 ();
   SetPtr (i.ReadNtohU32 ());
-  i.Read (data, length);
-  m_packet = Create<Packet> (data, length);
-  delete[] data;
 
   return GetSerializedSize ();
 }
@@ -1949,17 +1932,11 @@
   m_packet = 0;
 }
 
-Ptr<Packet> Icmpv6OptionRedirected::GetPacket () const
-{
-  NS_LOG_FUNCTION (this);
-  return m_packet;
-}
-
 void Icmpv6OptionRedirected::SetPacket (Ptr<Packet> packet)
 {
   NS_LOG_FUNCTION (this << *packet);
   NS_ASSERT (packet->GetSize () <= 1280);
-  m_packet = packet;
+  m_packet = packet->Copy ();
   SetLength (1 + (m_packet->GetSize () / 8));
 }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/model/icmpv6-header.h ns-3.36/src/internet/model/icmpv6-header.h
--- ns-3.35/src/internet/model/icmpv6-header.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/model/icmpv6-header.h	2022-04-30 18:23:57.862733600 -0700
@@ -1061,12 +1061,6 @@
   virtual TypeId GetInstanceTypeId () const;
 
   /**
-   * \brief Get the incorrect packet.
-   * \return the incorrect packet
-   */
-  Ptr<Packet> GetPacket () const;
-
-  /**
    * \brief Set the incorrect packet.
    * \param p the incorrect packet
    */
@@ -1135,12 +1129,6 @@
   virtual TypeId GetInstanceTypeId () const;
 
   /**
-   * \brief Get the incorrect packet.
-   * \return the incorrect packet
-   */
-  Ptr<Packet> GetPacket () const;
-
-  /**
    * \brief Set the incorrect packet.
    * \param p the incorrect packet
    */
@@ -1227,12 +1215,6 @@
   virtual TypeId GetInstanceTypeId () const;
 
   /**
-   * \brief Get the incorrect packet.
-   * \return the incorrect packet
-   */
-  Ptr<Packet> GetPacket () const;
-
-  /**
    * \brief Set the incorrect packet.
    * \param p the incorrect packet
    */
@@ -1302,12 +1284,6 @@
   virtual TypeId GetInstanceTypeId () const;
 
   /**
-   * \brief Get the incorrect packet.
-   * \return the incorrect packet
-   */
-  Ptr<Packet> GetPacket () const;
-
-  /**
    * \brief Set the incorrect packet.
    * \param p the incorrect packet
    */
@@ -1755,12 +1731,6 @@
   virtual ~Icmpv6OptionRedirected ();
 
   /**
-   * \brief Get the redirected packet.
-   * \return the redirected packet
-   */
-  Ptr<Packet> GetPacket () const;
-
-  /**
    * \brief Set the redirected packet.
    * \param packet the redirected packet
    */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/model/icmpv6-l4-protocol.cc ns-3.36/src/internet/model/icmpv6-l4-protocol.cc
--- ns-3.35/src/internet/model/icmpv6-l4-protocol.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/model/icmpv6-l4-protocol.cc	2022-04-30 18:23:57.862733600 -0700
@@ -881,14 +881,13 @@
 
   Icmpv6DestinationUnreachable unreach;
   pkt->RemoveHeader (unreach);
-  Ptr<Packet> origPkt = unreach.GetPacket ();
 
   Ipv6Header ipHeader;
-  if ( origPkt->GetSize () > ipHeader.GetSerializedSize () )
+  if (pkt->GetSize () > ipHeader.GetSerializedSize ())
     {
-      origPkt->RemoveHeader (ipHeader);
+      pkt->RemoveHeader (ipHeader);
       uint8_t payload[8];
-      origPkt->CopyData (payload, 8);
+      pkt->CopyData (payload, 8);
       Forward (src, unreach, unreach.GetCode (), ipHeader, payload);
     }
 }
@@ -900,13 +899,16 @@
 
   Icmpv6TimeExceeded timeexceeded;
   pkt->RemoveHeader (timeexceeded);
-  Ptr<Packet> origPkt = timeexceeded.GetPacket ();
-  Ipv6Header ipHeader;
-  uint8_t payload[8];
-  origPkt->RemoveHeader (ipHeader);
-  origPkt->CopyData (payload, 8);
 
-  Forward (src, timeexceeded, timeexceeded.GetCode (), ipHeader, payload);
+  Ipv6Header ipHeader;
+  if (pkt->GetSize () > ipHeader.GetSerializedSize ())
+    {
+      Ipv6Header ipHeader;
+      pkt->RemoveHeader (ipHeader);
+      uint8_t payload[8];
+      pkt->CopyData (payload, 8);
+      Forward (src, timeexceeded, timeexceeded.GetCode (), ipHeader, payload);
+    }
 }
 
 void Icmpv6L4Protocol::HandlePacketTooBig (Ptr<Packet> p, Ipv6Address const &src, Ipv6Address const &dst, Ptr<Ipv6Interface> interface)
@@ -916,17 +918,19 @@
 
   Icmpv6TooBig tooBig;
   pkt->RemoveHeader (tooBig);
-  Ptr<Packet> origPkt = tooBig.GetPacket ();
 
   Ipv6Header ipHeader;
-  origPkt->RemoveHeader (ipHeader);
-  uint8_t payload[8];
-  origPkt->CopyData (payload, 8);
+  if (pkt->GetSize () > ipHeader.GetSerializedSize ())
+    {
+      pkt->RemoveHeader (ipHeader);
+      uint8_t payload[8];
+      pkt->CopyData (payload, 8);
 
-  Ptr<Ipv6L3Protocol> ipv6 = m_node->GetObject<Ipv6L3Protocol> ();
-  ipv6->SetPmtu(ipHeader.GetDestination(), tooBig.GetMtu ());
+      Ptr<Ipv6L3Protocol> ipv6 = m_node->GetObject<Ipv6L3Protocol> ();
+      ipv6->SetPmtu (ipHeader.GetDestination (), tooBig.GetMtu ());
 
-  Forward (src, tooBig, tooBig.GetMtu (), ipHeader, payload);
+      Forward (src, tooBig, tooBig.GetMtu (), ipHeader, payload);
+    }
 }
 
 void Icmpv6L4Protocol::HandleParameterError (Ptr<Packet> p, Ipv6Address const &src, Ipv6Address const &dst, Ptr<Ipv6Interface> interface)
@@ -936,13 +940,15 @@
 
   Icmpv6ParameterError paramErr;
   pkt->RemoveHeader (paramErr);
-  Ptr<Packet> origPkt = paramErr.GetPacket ();
 
   Ipv6Header ipHeader;
-  origPkt->RemoveHeader (ipHeader);
-  uint8_t payload[8];
-  origPkt->CopyData (payload, 8);
-  Forward (src, paramErr, paramErr.GetCode (), ipHeader, payload);
+  if (pkt->GetSize () > ipHeader.GetSerializedSize ())
+    {
+      pkt->RemoveHeader (ipHeader);
+      uint8_t payload[8];
+      pkt->CopyData (payload, 8);
+      Forward (src, paramErr, paramErr.GetCode (), ipHeader, payload);
+    }
 }
 
 void Icmpv6L4Protocol::SendMessage (Ptr<Packet> packet, Ipv6Address src, Ipv6Address dst, uint8_t ttl)
@@ -1101,9 +1107,9 @@
 void Icmpv6L4Protocol::SendErrorDestinationUnreachable (Ptr<Packet> malformedPacket, Ipv6Address dst, uint8_t code)
 {
   NS_LOG_FUNCTION (this << malformedPacket << dst << (uint32_t)code);
-  Ptr<Packet> p = Create<Packet> ();
   uint32_t malformedPacketSize = malformedPacket->GetSize ();
   Icmpv6DestinationUnreachable header;
+  header.SetCode (code);
 
   NS_LOG_LOGIC ("Send Destination Unreachable ( to " << dst << " code " << (uint32_t)code << " )");
 
@@ -1111,23 +1117,23 @@
   if (malformedPacketSize <= 1280 - 48)
     {
       header.SetPacket (malformedPacket);
+      SendMessage (malformedPacket, dst, header, 255);
     }
   else
     {
       Ptr<Packet> fragment = malformedPacket->CreateFragment (0, 1280 - 48);
       header.SetPacket (fragment);
+      SendMessage (fragment, dst, header, 255);
     }
-
-  header.SetCode (code);
-  SendMessage (p, dst, header, 255);
 }
 
 void Icmpv6L4Protocol::SendErrorTooBig (Ptr<Packet> malformedPacket, Ipv6Address dst, uint32_t mtu)
 {
   NS_LOG_FUNCTION (this << malformedPacket << dst << mtu);
-  Ptr<Packet> p = Create<Packet> ();
   uint32_t malformedPacketSize = malformedPacket->GetSize ();
   Icmpv6TooBig header;
+  header.SetCode (0);
+  header.SetMtu (mtu);
 
   NS_LOG_LOGIC ("Send Too Big ( to " << dst << " )");
 
@@ -1135,24 +1141,22 @@
   if (malformedPacketSize <= 1280 - 48)
     {
       header.SetPacket (malformedPacket);
+      SendMessage (malformedPacket, dst, header, 255);
     }
   else
     {
       Ptr<Packet> fragment = malformedPacket->CreateFragment (0, 1280 - 48);
       header.SetPacket (fragment);
+      SendMessage (fragment, dst, header, 255);
     }
-
-  header.SetCode (0);
-  header.SetMtu (mtu);
-  SendMessage (p, dst, header, 255);
 }
 
 void Icmpv6L4Protocol::SendErrorTimeExceeded (Ptr<Packet> malformedPacket, Ipv6Address dst, uint8_t code)
 {
   NS_LOG_FUNCTION (this << malformedPacket << dst << static_cast<uint32_t> (code));
-  Ptr<Packet> p = Create<Packet> ();
   uint32_t malformedPacketSize = malformedPacket->GetSize ();
   Icmpv6TimeExceeded header;
+  header.SetCode (code);
 
   NS_LOG_LOGIC ("Send Time Exceeded ( to " << dst << " code " << (uint32_t)code << " )");
 
@@ -1160,23 +1164,23 @@
   if (malformedPacketSize <= 1280 - 48)
     {
       header.SetPacket (malformedPacket);
+      SendMessage (malformedPacket, dst, header, 255);
     }
   else
     {
       Ptr<Packet> fragment = malformedPacket->CreateFragment (0, 1280 - 48);
       header.SetPacket (fragment);
+      SendMessage (fragment, dst, header, 255);
     }
-
-  header.SetCode (code);
-  SendMessage (p, dst, header, 255);
 }
 
 void Icmpv6L4Protocol::SendErrorParameterError (Ptr<Packet> malformedPacket, Ipv6Address dst, uint8_t code, uint32_t ptr)
 {
   NS_LOG_FUNCTION (this << malformedPacket << dst << static_cast<uint32_t> (code) << ptr);
-  Ptr<Packet> p = Create<Packet> ();
   uint32_t malformedPacketSize = malformedPacket->GetSize ();
   Icmpv6ParameterError header;
+  header.SetCode (code);
+  header.SetPtr (ptr);
 
   NS_LOG_LOGIC ("Send Parameter Error ( to " << dst << " code " << (uint32_t)code << " )");
 
@@ -1184,16 +1188,14 @@
   if (malformedPacketSize <= 1280 - 48 )
     {
       header.SetPacket (malformedPacket);
+      SendMessage (malformedPacket, dst, header, 255);
     }
   else
     {
       Ptr<Packet> fragment = malformedPacket->CreateFragment (0, 1280 - 48);
       header.SetPacket (fragment);
+      SendMessage (fragment, dst, header, 255);
     }
-
-  header.SetCode (code);
-  header.SetPtr (ptr);
-  SendMessage (p, dst, header, 255);
 }
 
 void Icmpv6L4Protocol::SendRedirection (Ptr<Packet> redirectedPacket, Ipv6Address src, Ipv6Address dst, Ipv6Address redirTarget, Ipv6Address redirDestination, Address redirHardwareTarget)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/model/ipv4-interface.h ns-3.36/src/internet/model/ipv4-interface.h
--- ns-3.35/src/internet/model/ipv4-interface.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/model/ipv4-interface.h	2022-04-30 18:23:57.866733600 -0700
@@ -62,6 +62,10 @@
   Ipv4Interface ();
   virtual ~Ipv4Interface();
 
+  // Delete copy constructor and assignment operator to avoid misuse
+  Ipv4Interface (const Ipv4Interface &) = delete;
+  Ipv4Interface & operator = (const Ipv4Interface &) = delete;
+
   /**
    * \brief Set node associated with interface.
    * \param node node
@@ -190,24 +194,8 @@
 
 protected:
   virtual void DoDispose (void);
-private:
-  /**
-   * \brief Copy constructor
-   * \param o object to copy
-   *
-   * Defined and unimplemented to avoid misuse
-   */
-  Ipv4Interface (const Ipv4Interface &o);
-
-  /**
-   * \brief Assignment operator
-   * \param o object to copy
-   * \returns the copied object
-   *
-   * Defined and unimplemented to avoid misuse
-   */
-  Ipv4Interface &operator = (const Ipv4Interface &o);
 
+private:
   /**
    * \brief Initialize interface.
    */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/model/ipv4-l3-protocol.cc ns-3.36/src/internet/model/ipv4-l3-protocol.cc
--- ns-3.35/src/internet/model/ipv4-l3-protocol.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/model/ipv4-l3-protocol.cc	2022-04-30 18:23:57.866733600 -0700
@@ -585,14 +585,14 @@
 
   if (ipv4Interface->IsUp ())
     {
-      m_rxTrace (packet, m_node->GetObject<Ipv4> (), interface);
+      m_rxTrace (packet, this, interface);
     }
   else
     {
       NS_LOG_LOGIC ("Dropping received packet -- interface is down");
       Ipv4Header ipHeader;
       packet->RemoveHeader (ipHeader);
-      m_dropTrace (ipHeader, packet, DROP_INTERFACE_DOWN, m_node->GetObject<Ipv4> (), interface);
+      m_dropTrace (ipHeader, packet, DROP_INTERFACE_DOWN, this, interface);
       return;
     }
 
@@ -612,7 +612,7 @@
   if (!ipHeader.IsChecksumOk ()) 
     {
       NS_LOG_LOGIC ("Dropping received packet -- checksum not ok");
-      m_dropTrace (ipHeader, packet, DROP_BAD_CHECKSUM, m_node->GetObject<Ipv4> (), interface);
+      m_dropTrace (ipHeader, packet, DROP_BAD_CHECKSUM, this, interface);
       return;
     }
 
@@ -656,7 +656,7 @@
   if (m_enableDpd && ipHeader.GetDestination ().IsMulticast () && UpdateDuplicate (packet, ipHeader))
     {
       NS_LOG_LOGIC ("Dropping received packet -- duplicate.");
-      m_dropTrace (ipHeader, packet, DROP_DUPLICATE, m_node->GetObject<Ipv4> (), interface);
+      m_dropTrace (ipHeader, packet, DROP_DUPLICATE, this, interface);
       return;
     }
 
@@ -669,7 +669,7 @@
                                       ))
     {
       NS_LOG_WARN ("No route found for forwarding packet.  Drop.");
-      m_dropTrace (ipHeader, packet, DROP_NO_ROUTE, m_node->GetObject<Ipv4> (), interface);
+      m_dropTrace (ipHeader, packet, DROP_NO_ROUTE, this, interface);
     }
 }
 
@@ -741,9 +741,12 @@
 Ipv4L3Protocol::CallTxTrace (const Ipv4Header & ipHeader, Ptr<Packet> packet,
                                     Ptr<Ipv4> ipv4, uint32_t interface)
 {
-  Ptr<Packet> packetCopy = packet->Copy ();
-  packetCopy->AddHeader (ipHeader);
-  m_txTrace (packetCopy, ipv4, interface);
+  if (!m_txTrace.IsEmpty ())
+    {
+      Ptr<Packet> packetCopy = packet->Copy ();
+      packetCopy->AddHeader (ipHeader);
+      m_txTrace (packetCopy, ipv4, interface);
+    }
 }
 
 void 
@@ -895,7 +898,7 @@
   else
     {
       NS_LOG_WARN ("No route to host.  Drop.");
-      m_dropTrace (ipHeader, packet, DROP_NO_ROUTE, m_node->GetObject<Ipv4> (), 0);
+      m_dropTrace (ipHeader, packet, DROP_NO_ROUTE, this, 0);
       DecreaseIdentification (source, destination, protocol);
     }
 }
@@ -968,7 +971,7 @@
   if (route == 0)
     {
       NS_LOG_WARN ("No route to host.  Drop.");
-      m_dropTrace (ipHeader, packet, DROP_NO_ROUTE, m_node->GetObject<Ipv4> (), 0);
+      m_dropTrace (ipHeader, packet, DROP_NO_ROUTE, this, 0);
       return;
     }
   Ptr<NetDevice> outDev = route->GetOutputDevice ();
@@ -1000,13 +1003,13 @@
           for ( std::list<Ipv4PayloadHeaderPair>::iterator it = listFragments.begin (); it != listFragments.end (); it++ )
             {
               NS_LOG_LOGIC ("Sending fragment " << *(it->first) );
-              CallTxTrace (it->second, it->first, m_node->GetObject<Ipv4> (), interface);
+              CallTxTrace (it->second, it->first, this, interface);
               outInterface->Send (it->first, it->second, target);
             }
         }
       else
         {
-          CallTxTrace (ipHeader, packet, m_node->GetObject<Ipv4> (), interface);
+          CallTxTrace (ipHeader, packet, this, interface);
           outInterface->Send (packet, ipHeader, target);
         }
     }
@@ -1033,7 +1036,7 @@
       if (ipHeader.GetTtl () == 0)
         {
           NS_LOG_WARN ("TTL exceeded.  Drop.");
-          m_dropTrace (header, packet, DROP_TTL_EXPIRED, m_node->GetObject<Ipv4> (), interface);
+          m_dropTrace (header, packet, DROP_TTL_EXPIRED, this, interface);
           return;
         }
       NS_LOG_LOGIC ("Forward multicast via interface " << interface);
@@ -1070,7 +1073,7 @@
           icmp->SendTimeExceededTtl (ipHeader, packet, false);
         }
       NS_LOG_WARN ("TTL exceeded.  Drop.");
-      m_dropTrace (header, packet, DROP_TTL_EXPIRED, m_node->GetObject<Ipv4> (), interface);
+      m_dropTrace (header, packet, DROP_TTL_EXPIRED, this, interface);
       return;
     }
   // in case the packet still has a priority tag attached, remove it
@@ -1431,7 +1434,7 @@
 {
   NS_LOG_FUNCTION (this << p << ipHeader << sockErrno);
   NS_LOG_LOGIC ("Route input failure-- dropping packet to " << ipHeader << " with errno " << sockErrno); 
-  m_dropTrace (ipHeader, p, DROP_ROUTE_ERROR, m_node->GetObject<Ipv4> (), 0);
+  m_dropTrace (ipHeader, p, DROP_ROUTE_ERROR, this, 0);
 
   // \todo Send an ICMP no route.
 }
@@ -1731,7 +1734,7 @@
       Ptr<Icmpv4L4Protocol> icmp = GetIcmp ();
       icmp->SendTimeExceededTtl (ipHeader, packet, true);
     }
-  m_dropTrace (ipHeader, packet, DROP_FRAGMENT_TIMEOUT, m_node->GetObject<Ipv4> (), iif);
+  m_dropTrace (ipHeader, packet, DROP_FRAGMENT_TIMEOUT, this, iif);
 
   // clear the buffers
   it->second = 0;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/model/ipv4-l3-protocol.h ns-3.36/src/internet/model/ipv4-l3-protocol.h
--- ns-3.35/src/internet/model/ipv4-l3-protocol.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/model/ipv4-l3-protocol.h	2022-04-30 18:23:57.866733600 -0700
@@ -90,6 +90,10 @@
   Ipv4L3Protocol();
   virtual ~Ipv4L3Protocol ();
 
+  // Delete copy constructor and assignment operator to avoid misuse
+  Ipv4L3Protocol (const Ipv4L3Protocol &) = delete;
+  Ipv4L3Protocol & operator = (const Ipv4L3Protocol &) = delete;
+
   /**
    * \enum DropReason
    * \brief Reason why a packet has been dropped.
@@ -225,9 +229,9 @@
   /**
    * TracedCallback signature for packet send, forward, or local deliver events.
    *
-   * \param [in] header The Ipv6Header.
-   * \param [in] packet The packet.
-   * \param [in] interface
+   * \param [in] header the Ipv4Header
+   * \param [in] packet the packet
+   * \param [in] interface IP-level interface number
    */
   typedef void (* SentTracedCallback)
       (const Ipv4Header & header, Ptr<const Packet> packet, uint32_t interface);
@@ -235,10 +239,9 @@
   /**
    * TracedCallback signature for packet transmission or reception events.
    *
-   * \param [in] header The Ipv4Header.
-   * \param [in] packet The packet.
-   * \param [in] ipv4
-   * \param [in] interface
+   * \param [in] packet the packet.
+   * \param [in] ipv4 the Ipv4 protocol
+   * \param [in] interface IP-level interface number
    * \deprecated The non-const \c Ptr<Ipv4> argument is deprecated
    * and will be changed to \c Ptr<const Ipv4> in a future release.
    */
@@ -248,11 +251,11 @@
   /**
    * TracedCallback signature for packet drop events.
    *
-   * \param [in] header The Ipv4Header.
-   * \param [in] packet The packet.
-   * \param [in] reason The reason the packet was dropped.
-   * \param [in] ipv4
-   * \param [in] interface
+   * \param [in] header the Ipv4Header.
+   * \param [in] packet the packet.
+   * \param [in] reason the reason the packet was dropped.
+   * \param [in] ipv4 the Ipv4 protocol
+   * \param [in] interface IP-level interface number
    * \deprecated The non-const \c Ptr<Ipv4> argument is deprecated
    * and will be changed to \c Ptr<const Ipv4> in a future release.
    */
@@ -276,21 +279,6 @@
    */
   friend class ::Ipv4L3ProtocolTestCase;
 
-  /**
-   * \brief Copy constructor.
-   *
-   * Defined but not implemented to avoid misuse
-   */
-  Ipv4L3Protocol(const Ipv4L3Protocol &);
-
-  /**
-   * \brief Copy constructor.
-   *
-   * Defined but not implemented to avoid misuse
-   * \returns the copied object
-   */
-  Ipv4L3Protocol &operator = (const Ipv4L3Protocol &);
-
   // class Ipv4 attributes
   virtual void SetIpForward (bool forward);
   virtual bool GetIpForward (void) const;
@@ -430,7 +418,7 @@
    * \param ipHeader the IP header that will be added to the packet
    * \param packet the packet
    * \param ipv4 the Ipv4 protocol
-   * \param interface the interface index
+   * \param interface the IP-level interface index
    *
    * Note: If the TracedCallback API ever is extended, we could consider
    * to check for connected functions before adding the header
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/model/ipv4-queue-disc-item.h ns-3.36/src/internet/model/ipv4-queue-disc-item.h
--- ns-3.35/src/internet/model/ipv4-queue-disc-item.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/model/ipv4-queue-disc-item.h	2022-04-30 18:23:57.866733600 -0700
@@ -46,6 +46,11 @@
 
   virtual ~Ipv4QueueDiscItem ();
 
+  // Delete default constructor, copy constructor and assignment operator to avoid misuse
+  Ipv4QueueDiscItem () = delete;
+  Ipv4QueueDiscItem (const Ipv4QueueDiscItem &) = delete;
+  Ipv4QueueDiscItem & operator = (const Ipv4QueueDiscItem &) = delete;
+
   /**
    * \return the correct packet size (header plus payload).
    */
@@ -96,26 +101,6 @@
   virtual uint32_t Hash (uint32_t perturbation) const;
 
 private:
-  /**
-   * \brief Default constructor
-   *
-   * Defined and unimplemented to avoid misuse
-   */
-  Ipv4QueueDiscItem ();
-  /**
-   * \brief Copy constructor
-   *
-   * Defined and unimplemented to avoid misuse
-   */
-  Ipv4QueueDiscItem (const Ipv4QueueDiscItem &);
-  /**
-   * \brief Assignment operator
-   *
-   * Defined and unimplemented to avoid misuse
-   * \returns
-   */
-  Ipv4QueueDiscItem &operator = (const Ipv4QueueDiscItem &);
-
   Ipv4Header m_header;  //!< The IPv4 header.
   bool m_headerAdded;   //!< True if the header has already been added to the packet.
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/model/ipv6.h ns-3.36/src/internet/model/ipv6.h
--- ns-3.35/src/internet/model/ipv6.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/model/ipv6.h	2022-04-30 18:23:57.870733500 -0700
@@ -365,7 +365,9 @@
 
   /**
    * \brief Higher-level layers call this method to send a packet
-   * down the stack to the MAC and PHY layers.
+   * down the stack to the MAC and PHY layers. All PMTU values are
+   * stored at this level, so packet size calculations should be
+   * done mathematically at higher levels.
    *
    * \param packet packet to send
    * \param source source address of packet
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/model/ipv6-header.cc ns-3.36/src/internet/model/ipv6-header.cc
--- ns-3.35/src/internet/model/ipv6-header.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/model/ipv6-header.cc	2022-04-30 18:23:57.870733500 -0700
@@ -194,7 +194,7 @@
     }
 
   m_trafficClass = (uint8_t)((vTcFl >> 20) & 0x000000ff);
-  m_flowLabel = vTcFl & 0xfff00000;
+  m_flowLabel = vTcFl & 0xfffff;
   m_payloadLength = i.ReadNtohU16 ();
   m_nextHeader = i.ReadU8 ();
   m_hopLimit = i.ReadU8 ();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/model/ipv6-interface.h ns-3.36/src/internet/model/ipv6-interface.h
--- ns-3.35/src/internet/model/ipv6-interface.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/model/ipv6-interface.h	2022-04-30 18:23:57.870733500 -0700
@@ -67,6 +67,10 @@
    */
   virtual ~Ipv6Interface ();
 
+  // Delete copy constructor and assignment operator to avoid misuse
+  Ipv6Interface (const Ipv6Interface &) = delete;
+  Ipv6Interface & operator = (const Ipv6Interface &) = delete;
+
   /**
    * \brief Set node associated with interface.
    * \param node node
@@ -280,23 +284,6 @@
 
 private:
   /**
-   * \brief Copy constructor
-   * \param o object to copy
-   *
-   * Defined and unimplemented to avoid misuse
-   */
-  Ipv6Interface (const Ipv6Interface &o);
-
-  /**
-   * \brief Assignment operator
-   * \param o object to copy
-   * \returns the copied object
-   *
-   * Defined and unimplemented to avoid misuse
-   */
-  Ipv6Interface &operator = (const Ipv6Interface &o);
-
-  /**
    * \brief Container for the Ipv6InterfaceAddresses.
    */
   typedef std::list<std::pair<Ipv6InterfaceAddress, Ipv6Address> > Ipv6InterfaceAddressList;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/model/ipv6-l3-protocol.cc ns-3.36/src/internet/model/ipv6-l3-protocol.cc
--- ns-3.35/src/internet/model/ipv6-l3-protocol.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/model/ipv6-l3-protocol.cc	2022-04-30 18:23:57.870733500 -0700
@@ -601,6 +601,11 @@
   NS_LOG_FUNCTION (this << interface << dest);
   Ipv6Address ret;
 
+  if (dest.IsLocalhost ())
+    {
+      return Ipv6Address::GetLoopback ();
+    }
+  
   if (dest.IsLinkLocal () || dest.IsLinkLocalMulticast ())
     {
       for (uint32_t i = 0; i < GetNAddresses (interface); i++)
@@ -632,6 +637,8 @@
     }
 
   // no specific match found. Use a global address (any useful is fine).
+  NS_ASSERT_MSG (!ret.IsAny (),
+                 "Could not find any address for " << dest << " on interface " << interface);
   return ret;
 }
 
@@ -920,7 +927,7 @@
   else
     {
       NS_LOG_WARN ("No route to host, drop!");
-      m_dropTrace (hdr, packet, DROP_NO_ROUTE, m_node->GetObject<Ipv6> (), GetInterfaceForDevice (oif));
+      m_dropTrace (hdr, packet, DROP_NO_ROUTE, this, GetInterfaceForDevice (oif));
     }
 }
 
@@ -937,14 +944,14 @@
 
   if (ipv6Interface->IsUp ())
     {
-      m_rxTrace (packet, m_node->GetObject<Ipv6> (), interface);
+      m_rxTrace (packet, this, interface);
     }
   else
     {
       NS_LOG_LOGIC ("Dropping received packet-- interface is down");
       Ipv6Header hdr;
       packet->RemoveHeader (hdr);
-      m_dropTrace (hdr, packet, DROP_INTERFACE_DOWN, m_node->GetObject<Ipv6> (), interface);
+      m_dropTrace (hdr, packet, DROP_INTERFACE_DOWN, this, interface);
       return;
     }
 
@@ -1008,7 +1015,7 @@
 
       if (isDropped)
         {
-          m_dropTrace (hdr, packet, dropReason, m_node->GetObject<Ipv6> (), interface);
+          m_dropTrace (hdr, packet, dropReason, this, interface);
         }
 
       if (stopProcessing)
@@ -1081,9 +1088,12 @@
 Ipv6L3Protocol::CallTxTrace (const Ipv6Header & ipHeader, Ptr<Packet> packet,
                                     Ptr<Ipv6> ipv6, uint32_t interface)
 {
-  Ptr<Packet> packetCopy = packet->Copy ();
-  packetCopy->AddHeader (ipHeader);
-  m_txTrace (packetCopy, ipv6, interface);
+  if (!m_txTrace.IsEmpty ())
+  {
+    Ptr<Packet> packetCopy = packet->Copy ();
+    packetCopy->AddHeader (ipHeader);
+    m_txTrace (packetCopy, ipv6, interface);
+  }
 }
 
 void Ipv6L3Protocol::SendRealOut (Ptr<Ipv6Route> route, Ptr<Packet> packet, Ipv6Header const& ipHeader)
@@ -1106,35 +1116,42 @@
   // Check packet size
   std::list<Ipv6ExtensionFragment::Ipv6PayloadHeaderPair> fragments;
 
+  // Check if this is the source of the packet
+  bool fromMe = false;
+  for (uint32_t i = 0; i < GetNInterfaces (); i++ )
+    {
+      for (uint32_t j = 0; j < GetNAddresses (i); j++ )
+        {
+          if (GetAddress (i,j).GetAddress () == ipHeader.GetSource ())
+            {
+              fromMe = true;
+              break;
+            }
+        }
+    }
+
+  size_t targetMtu = 0;
+
   // Check if we have a Path MTU stored. If so, use it. Else, use the link MTU.
-  size_t targetMtu = (size_t)(m_pmtuCache->GetPmtu (ipHeader.GetDestination()));
+  // Note: PMTU must not be cached in intermediate nodes, and must be checked only by the source node
+  if (fromMe)
+    {
+      targetMtu = (size_t)(m_pmtuCache->GetPmtu (ipHeader.GetDestination ()));
+    }
   if (targetMtu == 0)
     {
       targetMtu = dev->GetMtu ();
     }
 
-  if (packet->GetSize () > targetMtu + 40) /* 40 => size of IPv6 header */
+  if (packet->GetSize () + ipHeader.GetSerializedSize () > targetMtu)
     {
       // Router => drop
-
-      bool fromMe = false;
-      for (uint32_t i=0; i<GetNInterfaces(); i++ )
-        {
-          for (uint32_t j=0; j<GetNAddresses(i); j++ )
-            {
-              if (GetAddress(i,j).GetAddress() == ipHeader.GetSource())
-                {
-                  fromMe = true;
-                  break;
-                }
-            }
-        }
       if (!fromMe)
         {
           Ptr<Icmpv6L4Protocol> icmpv6 = GetIcmpv6 ();
           if ( icmpv6 )
             {
-              packet->AddHeader(ipHeader);
+              packet->AddHeader (ipHeader);
               icmpv6->SendErrorTooBig (packet, ipHeader.GetSource (), dev->GetMtu ());
             }
           return;
@@ -1160,20 +1177,20 @@
 
               for (std::list<Ipv6ExtensionFragment::Ipv6PayloadHeaderPair>::const_iterator it = fragments.begin (); it != fragments.end (); it++)
                 {
-                  CallTxTrace (it->second, it->first, m_node->GetObject<Ipv6> (), interface);
+                  CallTxTrace (it->second, it->first, this, interface);
                   outInterface->Send (it->first, it->second, route->GetGateway ());
                 }
             }
           else
             {
-              CallTxTrace (ipHeader, packet, m_node->GetObject<Ipv6> (), interface);
+              CallTxTrace (ipHeader, packet, this, interface);
               outInterface->Send (packet, ipHeader, route->GetGateway ());
             }
         }
       else
         {
           NS_LOG_LOGIC ("Dropping-- outgoing interface is down: " << route->GetGateway ());
-          m_dropTrace (ipHeader, packet, DROP_INTERFACE_DOWN, m_node->GetObject<Ipv6> (), interface);
+          m_dropTrace (ipHeader, packet, DROP_INTERFACE_DOWN, this, interface);
         }
     }
   else
@@ -1188,20 +1205,20 @@
 
               for (std::list<Ipv6ExtensionFragment::Ipv6PayloadHeaderPair>::const_iterator it = fragments.begin (); it != fragments.end (); it++)
                 {
-                  CallTxTrace (it->second, it->first, m_node->GetObject<Ipv6> (), interface);
+                  CallTxTrace (it->second, it->first, this, interface);
                   outInterface->Send (it->first, it->second, ipHeader.GetDestination ());
                 }
             }
           else
             {
-              CallTxTrace (ipHeader, packet, m_node->GetObject<Ipv6> (), interface);
+              CallTxTrace (ipHeader, packet, this, interface);
               outInterface->Send (packet, ipHeader, ipHeader.GetDestination ());
             }
         }
       else
         {
           NS_LOG_LOGIC ("Dropping-- outgoing interface is down: " << ipHeader.GetDestination ());
-          m_dropTrace (ipHeader, packet, DROP_INTERFACE_DOWN, m_node->GetObject<Ipv6> (), interface);
+          m_dropTrace (ipHeader, packet, DROP_INTERFACE_DOWN, this, interface);
         }
     }
 }
@@ -1215,7 +1232,7 @@
   if (header.GetDestination().IsDocumentation ())
     {
       NS_LOG_WARN ("Received a packet for 2001:db8::/32 (documentation class).  Drop.");
-      m_dropTrace (header, p, DROP_ROUTE_ERROR, m_node->GetObject<Ipv6> (), 0);
+      m_dropTrace (header, p, DROP_ROUTE_ERROR, this, 0);
       return;
     }
 
@@ -1233,7 +1250,7 @@
   if (ipHeader.GetHopLimit () == 0)
     {
       NS_LOG_WARN ("TTL exceeded.  Drop.");
-      m_dropTrace (ipHeader, packet, DROP_TTL_EXPIRED, m_node->GetObject<Ipv6> (), 0);
+      m_dropTrace (ipHeader, packet, DROP_TTL_EXPIRED, this, 0);
       // Do not reply to multicast IPv6 address
       if (ipHeader.GetDestination ().IsMulticast () == false)
         {
@@ -1308,7 +1325,7 @@
       if (h.GetHopLimit () == 0)
         {
           NS_LOG_WARN ("TTL exceeded.  Drop.");
-          m_dropTrace (header, packet, DROP_TTL_EXPIRED, m_node->GetObject<Ipv6> (), interfaceId);
+          m_dropTrace (header, packet, DROP_TTL_EXPIRED, this, interfaceId);
           return;
         }
       NS_LOG_LOGIC ("Forward multicast via interface " << interfaceId);
@@ -1365,7 +1382,7 @@
 
           if (isDropped)
             {
-              m_dropTrace (ip, packet, dropReason, m_node->GetObject<Ipv6> (), iif);
+              m_dropTrace (ip, packet, dropReason, this, iif);
             }
 
           if (stopProcessing)
@@ -1395,7 +1412,7 @@
                 {
                   GetIcmpv6 ()->SendErrorParameterError (malformedPacket, dst, Icmpv6Header::ICMPV6_UNKNOWN_NEXT_HEADER, ip.GetSerializedSize () + nextHeaderPosition);
                 }
-              m_dropTrace (ip, p, DROP_UNKNOWN_PROTOCOL, m_node->GetObject<Ipv6> (), iif);
+              m_dropTrace (ip, p, DROP_UNKNOWN_PROTOCOL, this, iif);
               break;
             }
           else
@@ -1439,7 +1456,7 @@
   NS_LOG_FUNCTION (this << p << ipHeader << sockErrno);
   NS_LOG_LOGIC ("Route input failure-- dropping packet to " << ipHeader << " with errno " << sockErrno);
 
-  m_dropTrace (ipHeader, p, DROP_ROUTE_ERROR, m_node->GetObject<Ipv6> (), 0);
+  m_dropTrace (ipHeader, p, DROP_ROUTE_ERROR, this, 0);
 
   if (!ipHeader.GetDestination ().IsMulticast ())
     {
@@ -1520,7 +1537,7 @@
 
 void Ipv6L3Protocol::ReportDrop (Ipv6Header ipHeader, Ptr<Packet> p, DropReason dropReason)
 {
-  m_dropTrace (ipHeader, p, dropReason, m_node->GetObject<Ipv6> (), 0);
+  m_dropTrace (ipHeader, p, dropReason, this, 0);
 }
 
 void Ipv6L3Protocol::AddMulticastAddress (Ipv6Address address, uint32_t interface)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/model/ipv6-l3-protocol.h ns-3.36/src/internet/model/ipv6-l3-protocol.h
--- ns-3.35/src/internet/model/ipv6-l3-protocol.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/model/ipv6-l3-protocol.h	2022-04-30 18:23:57.870733500 -0700
@@ -99,6 +99,10 @@
    */
   virtual ~Ipv6L3Protocol ();
 
+  // Delete copy constructor and assignment operator to avoid misuse
+  Ipv6L3Protocol (const Ipv6L3Protocol &) = delete;
+  Ipv6L3Protocol & operator = (const Ipv6L3Protocol &) = delete;
+
   /**
    * \brief Set node associated with this stack.
    * \param node node to set
@@ -372,20 +376,19 @@
    * TracedCallback signature for packet sent, forwarded or
    * local-delivered events.
    *
-   * \param [in] header The Ipv6Header.
-   * \param [in] packet The packet.
-   * \param [in] interface
+   * \param [in] header the Ipv6Header.
+   * \param [in] packet the packet.
+   * \param [in] interface the IP-level interface index
    */
   typedef void (* SentTracedCallback)
     (const Ipv6Header & header, Ptr<const Packet> packet, uint32_t interface);
-   
+
   /**
    * TracedCallback signature for packet transmission or reception events.
    *
-   * \param [in] header The Ipv6Header.
-   * \param [in] packet The packet.
-   * \param [in] ipv6
-   * \param [in] interface
+   * \param [in] packet the packet.
+   * \param [in] ipv6 the Ipv6 protocol
+   * \param [in] interface the IP-level interface index
    * \deprecated The non-const \c Ptr<Ipv6> argument is deprecated
    * and will be changed to \c Ptr<const Ipv6> in a future release.
    */
@@ -395,11 +398,11 @@
   /**
    * TracedCallback signature for packet drop events.
    *
-   * \param [in] header The Ipv6Header.
-   * \param [in] packet The packet.
-   * \param [in] reason The reason the packet was dropped.
-   * \param [in] ipv6
-   * \param [in] interface
+   * \param [in] header the Ipv6Header.
+   * \param [in] packet the packet.
+   * \param [in] reason the reason the packet was dropped.
+   * \param [in] ipv6 the Ipv6 protocol
+   * \param [in] interface the IP-level interface index
    * \deprecated The non-const \c Ptr<Ipv6> argument is deprecated
    * and will be changed to \c Ptr<const Ipv6> in a future release.
    */
@@ -533,7 +536,7 @@
    * \param ipHeader the IP header that will be added to the packet
    * \param packet the packet
    * \param ipv6 the Ipv6 protocol
-   * \param interface the interface index
+   * \param interface the IP-level interface index
    *
    * Note: If the TracedCallback API ever is extended, we could consider
    * to check for connected functions before adding the header
@@ -569,21 +572,6 @@
   TracedCallback<const Ipv6Header &, Ptr<const Packet>, uint32_t> m_localDeliverTrace;
 
   /**
-   * \brief Copy constructor.
-   *
-   * Defined but not implemented to avoid misuse
-   */
-  Ipv6L3Protocol (const Ipv6L3Protocol&);
-
-  /**
-   * \brief Copy constructor.
-   *
-   * Defined but not implemented to avoid misuse
-   * \returns the copied object
-   */
-  Ipv6L3Protocol &operator = (const Ipv6L3Protocol&);
-
-  /**
    * \brief Construct an IPv6 header.
    * \param src source IPv6 address
    * \param dst destination IPv6 address
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/model/ipv6-queue-disc-item.h ns-3.36/src/internet/model/ipv6-queue-disc-item.h
--- ns-3.35/src/internet/model/ipv6-queue-disc-item.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/model/ipv6-queue-disc-item.h	2022-04-30 18:23:57.870733500 -0700
@@ -46,6 +46,11 @@
 
   virtual ~Ipv6QueueDiscItem ();
 
+  // Delete default constructor, copy constructor and assignment operator to avoid misuse
+  Ipv6QueueDiscItem () = delete;
+  Ipv6QueueDiscItem (const Ipv6QueueDiscItem &) = delete;
+  Ipv6QueueDiscItem & operator = (const Ipv6QueueDiscItem &) = delete;
+
   /**
    * \return the correct packet size (header plus payload).
    */
@@ -96,26 +101,6 @@
   virtual uint32_t Hash (uint32_t perturbation) const;
 
 private:
-  /**
-   * \brief Default constructor
-   *
-   * Defined and unimplemented to avoid misuse
-   */
-  Ipv6QueueDiscItem ();
-  /**
-   * \brief Copy constructor
-   *
-   * Defined and unimplemented to avoid misuse
-   */
-  Ipv6QueueDiscItem (const Ipv6QueueDiscItem &);
-  /**
-   * \brief Assignment operator
-   *
-   * Defined and unimplemented to avoid misuse
-   * \returns
-   */
-  Ipv6QueueDiscItem &operator = (const Ipv6QueueDiscItem &);
-
   Ipv6Header m_header;  //!< The IPv6 header.
   bool m_headerAdded;   //!< True if the header has already been added to the packet.
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/model/ndisc-cache.h ns-3.36/src/internet/model/ndisc-cache.h
--- ns-3.35/src/internet/model/ndisc-cache.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/model/ndisc-cache.h	2022-04-30 18:23:57.870733500 -0700
@@ -72,6 +72,10 @@
    */
   ~NdiscCache ();
 
+  // Delete default and copy constructor, and assignment operator to avoid misuse
+  NdiscCache (NdiscCache const &) = delete;
+  NdiscCache & operator = (NdiscCache const &) = delete;
+
   /**
    * \brief Get the NetDevice associated with this cache.
    * \return NetDevice
@@ -438,24 +442,7 @@
    */
   Cache m_ndCache;
 
-
 private:
-
-  /**
-   * \brief Copy constructor.
-   *
-   * Not implemented to avoid misuse
-   */
-  NdiscCache (NdiscCache const &);
-
-  /**
-   * \brief Copy constructor.
-   *
-   * Not implemented to avoid misuse
-   * \returns
-   */
-  NdiscCache& operator= (NdiscCache const &);
-
   /**
    * \brief The NetDevice.
    */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/model/nsc-sysctl.cc ns-3.36/src/internet/model/nsc-sysctl.cc
--- ns-3.35/src/internet/model/nsc-sysctl.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/model/nsc-sysctl.cc	1969-12-31 16:00:00.000000000 -0800
@@ -1,166 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
- */
-
-#include "ns3/string.h"
-#include "nsc-sysctl.h"
-
-#include "sim_interface.h"
-
-namespace ns3 {
-
-/**
- * \ingroup nsctcp
- *
- * This object represent the underlying nsc stack attributes and
- * provide a ns-3-like system to access them though sysctls
- */
-class NscStackStringAccessor : public AttributeAccessor
-{
-public:
-  /**
-   * \brief Constructor
-   * \param name name of the attribute
-   */
-  NscStackStringAccessor (std::string name) : m_name (name) {}
-
-  virtual bool Set (ObjectBase * object, const AttributeValue &val) const;
-  virtual bool Get (const ObjectBase * object, AttributeValue &val) const;
-  virtual bool HasGetter (void) const;
-  virtual bool HasSetter (void) const;
-private:
-  std::string m_name; //!< name of the attribute
-};
-
-bool NscStackStringAccessor::HasGetter (void) const
-{
-  return true;
-}
-
-bool NscStackStringAccessor::HasSetter (void) const
-{
-  return true;
-}
-
-
-bool NscStackStringAccessor::Set (ObjectBase * object, const AttributeValue & val) const
-{
-  const StringValue *value = dynamic_cast<const StringValue *> (&val);
-  if (value == 0)
-    {
-      return false;
-    }
-  Ns3NscStack *obj = dynamic_cast<Ns3NscStack *> (object);
-  if (obj == 0)
-    {
-      return false;
-    }
-  obj->Set (m_name, value->Get ());
-  return true;
-}
-
-bool NscStackStringAccessor::Get (const ObjectBase * object, AttributeValue &val) const
-{
-  StringValue *value = dynamic_cast<StringValue *> (&val);
-  if (value == 0)
-    {
-      return false;
-    }
-  const Ns3NscStack *obj = dynamic_cast<const Ns3NscStack *> (object);
-  if (obj == 0)
-    {
-      return false;
-    }
-  value->Set (obj->Get (m_name));
-  return true;
-}
-
-
-TypeId
-Ns3NscStack::GetInstanceTypeId (void) const
-{
-  if (m_stack == 0)
-    {
-      // if we have no stack, we are a normal NscStack without any attributes.
-      return GetTypeId ();
-    }
-  std::string name = "ns3::Ns3NscStack<";
-  name += m_stack->get_name ();
-  name += ">";
-  TypeId tid;
-  if (TypeId::LookupByNameFailSafe (name, &tid))
-    {
-      // if the relevant TypeId has already been registered, no need to do it again.
-      return tid;
-    }
-  else
-    {
-      // Now, we register a new TypeId for this stack which will look
-      // like a subclass of the Ns3NscStack. The class Ns3NscStack is effectively
-      // mutating into a subclass of itself from the point of view of the TypeId
-      // system _here_
-      tid = TypeId (name.c_str ());
-      tid.SetParent<Ns3NscStack> ();
-      char buf[256];
-      for (int i=0; m_stack->sysctl_getnum (i, buf, sizeof(buf)) > 0; i++)
-        {
-          char value[256];
-          if (m_stack->sysctl_get (buf, value, sizeof(value)) > 0)
-            {
-              tid.AddAttribute (buf, "Help text",
-                                StringValue (value),
-                                Create<NscStackStringAccessor> (buf),
-                                MakeStringChecker ());
-            }
-        }
-      return tid;
-    }
-}
-
-std::string
-Ns3NscStack::Get (std::string name) const
-{
-  char buf[512];
-  if (m_stack->sysctl_get (name.c_str (), buf, sizeof(buf)) <= 0)
-    { // name.c_str () is not a valid sysctl name, or internal NSC error (eg. error converting value)
-      return NULL;
-    }
-  return std::string (buf);
-}
-
-void
-Ns3NscStack::Set (std::string name, std::string value)
-{
-  int ret = m_stack->sysctl_set (name.c_str (), value.c_str ());
-  if (ret < 0)
-    {
-      NS_FATAL_ERROR ("setting " << name << " to " << value << "failed (retval " << ret << ")");
-    }
-}
-
-NS_OBJECT_ENSURE_REGISTERED (Ns3NscStack);
-
-TypeId
-Ns3NscStack::Ns3NscStack::GetTypeId (void)
-{
-  static TypeId tid = TypeId ("ns3::Ns3NscStack")
-    .SetParent<Object> ()
-  ;
-  return tid;
-}
-
-} // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/model/nsc-sysctl.h ns-3.36/src/internet/model/nsc-sysctl.h
--- ns-3.35/src/internet/model/nsc-sysctl.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/model/nsc-sysctl.h	1969-12-31 16:00:00.000000000 -0800
@@ -1,70 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
- */
-
-#include <string>
-
-#include "ns3/attribute.h"
-#include "ns3/object.h"
-
-struct INetStack;
-
-namespace ns3 {
-
-/**
- * \ingroup nsctcp
- *
- * This object represents the underlying nsc stack,
- * which is aggregated to a Node object, and which provides access to the
- * sysctls of the nsc stack through attributes.
- */
-class Ns3NscStack : public Object
-{
-public:
-  /**
-   * \brief Get the type ID.
-   * \return the object TypeId
-   */
-  static TypeId GetTypeId (void);
-  virtual TypeId GetInstanceTypeId (void) const;
-  /**
-   * \brief Set the underlying stack
-   * \param stack the stack
-   */
-  void SetStack (INetStack *stack) { m_stack = stack; }
-
-private:
-  /**
-   * \brief NscStackStringAccessor friend class.
-   * \relates NscStackStringAccessor
-   */
-  friend class NscStackStringAccessor;
-  /**
-   * \brief Set an attribute
-   * \param name the attribute name
-   * \param value the attribute value
-   */
-  void Set (std::string name, std::string value);
-  /**
-   * \brief Get an attribute
-   * \param name the attribute name
-   * \returns the attribute value
-   */
-  std::string Get (std::string name) const;
-  INetStack *m_stack; //!< the underlying stack
-};
-} // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/model/nsc-tcp-l4-protocol.cc ns-3.36/src/internet/model/nsc-tcp-l4-protocol.cc
--- ns-3.35/src/internet/model/nsc-tcp-l4-protocol.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/model/nsc-tcp-l4-protocol.cc	1969-12-31 16:00:00.000000000 -0800
@@ -1,526 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * based on earlier integration work by Tom Henderson and Sam Jansen.
- * 2008 Florian Westphal <fw@strlen.de>
- */
-
-#include "ns3/assert.h"
-#include "ns3/log.h"
-#include "ns3/nstime.h"
-
-#include "ns3/packet.h"
-#include "ns3/node.h"
-#include "ns3/ipv4-route.h"
-
-#include "ns3/object-vector.h"
-#include "ns3/string.h"
-#include "tcp-header.h"
-#include "ipv4-end-point-demux.h"
-#include "ipv4-end-point.h"
-#include "ipv4-l3-protocol.h"
-#include "nsc-tcp-l4-protocol.h"
-#include "nsc-tcp-socket-impl.h"
-#include "nsc-sysctl.h"
-#include "nsc-tcp-socket-factory-impl.h"
-#include "sim_interface.h"
-
-#include <vector>
-#include <sstream>
-#include <dlfcn.h>
-#include <iomanip>
-
-#include <netinet/in.h>
-#include <arpa/inet.h>
-
-namespace ns3 {
-
-NS_LOG_COMPONENT_DEFINE ("NscTcpL4Protocol");
-
-NS_OBJECT_ENSURE_REGISTERED (NscTcpL4Protocol);
-
-/* see http://www.iana.org/assignments/protocol-numbers */
-const uint8_t NscTcpL4Protocol::PROT_NUMBER = 6;
-
-/**
- * \ingroup nsctcp
- * \brief Nsc interface implementation class.
- */
-class NscInterfaceImpl : public ISendCallback, public IInterruptCallback 
-{
-public:
-  /**
-   * Constructor
-   * \param prot the NSC TCP protocol
-   */
-  NscInterfaceImpl (Ptr<NscTcpL4Protocol> prot);
-private:
-  /**
-   * \brief Invoked by NSCs 'ethernet driver' to re-inject a packet into ns-3.
-   *
-   * A packet is an octet soup consisting of an IP Header, TCP Header
-   * and user payload, if any
-   *
-   * \param data the data
-   * \param datalen the data length
-   */
-  virtual void send_callback (const void *data, int datalen);
-  /**
-   * \brief Called by the NSC stack whenever something of interest has happened
-   *
-   * Examples: when data arrives on a socket, a listen socket
-   * has a new connection pending, etc.
-   */
-  virtual void wakeup ();
-  /**
-   * \brief Called by the Linux stack RNG initialization
-   *
-   * Its also used by the cradle code to add a timestamp to
-   * printk/printf/debug output.
-   *
-   * \param [out] sec seconds
-   * \param [out] usec microseconds
-   *
-   */
-  virtual void gettime (unsigned int *sec, unsigned int *usec);
-private:
-  Ptr<NscTcpL4Protocol> m_prot; //!< the NSC TCP protocol
-};
-
-NscInterfaceImpl::NscInterfaceImpl (Ptr<NscTcpL4Protocol> prot)
-  : m_prot (prot)
-{
-}
-
-void
-NscInterfaceImpl::send_callback (const void *data, int datalen)
-{
-  m_prot->send_callback (data, datalen);
-}
-void
-NscInterfaceImpl::wakeup ()
-{
-  m_prot->wakeup ();
-}
-void
-NscInterfaceImpl::gettime (unsigned int *sec, unsigned int *usec)
-{
-  m_prot->gettime (sec,usec);
-}
-
-
-#undef NS_LOG_APPEND_CONTEXT
-#define NS_LOG_APPEND_CONTEXT                                   \
-  if (m_node) { std::clog << Simulator::Now ().As (Time::S) << " [node " << m_node->GetId () << "] "; } 
-
-TypeId 
-NscTcpL4Protocol::GetTypeId (void)
-{
-  static TypeId tid = TypeId ("ns3::NscTcpL4Protocol")
-    .SetParent<IpL4Protocol> ()
-    .SetGroupName ("Internet")
-    .AddConstructor<NscTcpL4Protocol>()
-    .AddAttribute ("SocketList", "The list of sockets associated to this protocol.",
-                   ObjectVectorValue (),
-                   MakeObjectVectorAccessor (&NscTcpL4Protocol::m_sockets),
-                   MakeObjectVectorChecker<NscTcpSocketImpl> ())
-    .AddAttribute ("Library",
-                   "Set the linux library to be used to create the stack",
-                   TypeId::ATTR_GET|TypeId::ATTR_CONSTRUCT,
-                   StringValue ("liblinux2.6.26.so"),
-                   MakeStringAccessor (&NscTcpL4Protocol::GetNscLibrary,&NscTcpL4Protocol::SetNscLibrary),
-                   MakeStringChecker ())
-  ;
-  return tid;
-}
-
-/**
- * \brief External Random number generator
- *
- * \todo make it random...
- *
- * \returns a random number
- */
-int external_rand ()
-{
-  return 1;
-}
-
-NscTcpL4Protocol::NscTcpL4Protocol ()
-  : m_endPoints (new Ipv4EndPointDemux ()),
-    m_nscStack (0),
-    m_nscInterface (new NscInterfaceImpl (this)),
-    m_softTimer (Timer::CANCEL_ON_DESTROY)
-{
-  m_dlopenHandle = NULL;
-  NS_LOG_LOGIC ("Made a NscTcpL4Protocol "<<this);
-}
-
-NscTcpL4Protocol::~NscTcpL4Protocol ()
-{
-  NS_LOG_FUNCTION (this);
-  dlclose (m_dlopenHandle);
-}
-
-void
-NscTcpL4Protocol::SetNscLibrary (const std::string &soname)
-{
-  if (soname!="")
-    {
-      m_nscLibrary = soname;
-      NS_ASSERT (!m_dlopenHandle);
-      m_dlopenHandle = dlopen (soname.c_str (), RTLD_NOW);
-      if (m_dlopenHandle == NULL)
-        NS_FATAL_ERROR (dlerror ());
-    }
-}
-
-std::string 
-NscTcpL4Protocol::GetNscLibrary () const
-{
-  return m_nscLibrary;
-}
-void 
-NscTcpL4Protocol::SetNode (Ptr<Node> node)
-{
-  m_node = node;
-
-  if (m_nscStack)
-    { // stack has already been loaded...
-      return;
-    }
-
-  NS_ASSERT (m_dlopenHandle);
-
-  FCreateStack create = (FCreateStack)dlsym (m_dlopenHandle, "nsc_create_stack");
-  NS_ASSERT (create);
-  m_nscStack = create (m_nscInterface, m_nscInterface, external_rand);
-  int hzval = m_nscStack->get_hz ();
-
-  NS_ASSERT (hzval > 0);
-
-  m_softTimer.SetFunction (&NscTcpL4Protocol::SoftInterrupt, this);
-  m_softTimer.SetDelay (MilliSeconds (1000/hzval));
-  m_nscStack->init (hzval);
-  // This enables stack and NSC debug messages
-  // m_nscStack->set_diagnostic(1000);
-
-  Ptr<Ns3NscStack> nscStack = Create<Ns3NscStack> ();
-  nscStack->SetStack (m_nscStack);
-  node->AggregateObject (nscStack);
-
-  m_softTimer.Schedule ();
-
-  // its likely no ns-3 interface exits at this point, so
-  // we dealy adding the nsc interface until the start of the simulation.
-  Simulator::ScheduleNow (&NscTcpL4Protocol::AddInterface, this);
-}
-
-void
-NscTcpL4Protocol::NotifyNewAggregate ()
-{ 
-  if (m_node == 0)
-    {
-      Ptr<Node>node = this->GetObject<Node> ();
-      if (node != 0)
-        {
-          Ptr<Ipv4L3Protocol> ipv4 = this->GetObject<Ipv4L3Protocol> ();
-          if (ipv4 != 0 && m_downTarget.IsNull ())
-            {
-              this->SetNode (node);
-              ipv4->Insert (this);
-              Ptr<NscTcpSocketFactoryImpl> tcpFactory = CreateObject<NscTcpSocketFactoryImpl> ();
-              tcpFactory->SetTcp (this);
-              node->AggregateObject (tcpFactory);
-              this->SetDownTarget (MakeCallback (&Ipv4L3Protocol::Send, ipv4));
-            }
-        }
-    }
-  IpL4Protocol::NotifyNewAggregate ();
-}
-
-int 
-NscTcpL4Protocol::GetProtocolNumber (void) const
-{
-  return PROT_NUMBER;
-}
-int 
-NscTcpL4Protocol::GetVersion (void) const
-{
-  return 2;
-}
-
-void
-NscTcpL4Protocol::DoDispose (void)
-{
-  NS_LOG_FUNCTION (this);
-
-  for (std::vector<Ptr<NscTcpSocketImpl> >::iterator i = m_sockets.begin (); i != m_sockets.end (); i++)
-    {
-      *i = 0;
-    }
-  m_sockets.clear ();
-
-
-  if (m_endPoints != 0)
-    {
-      delete m_endPoints;
-      m_endPoints = 0;
-    }
-  m_node = 0;
-  delete m_nscInterface;
-  m_nscInterface = 0;
-  m_downTarget.Nullify ();
-  IpL4Protocol::DoDispose ();
-}
-
-Ptr<Socket>
-NscTcpL4Protocol::CreateSocket (void)
-{
-  NS_LOG_FUNCTION (this);
-
-  Ptr<NscTcpSocketImpl> socket = CreateObject<NscTcpSocketImpl> ();
-  socket->SetNode (m_node);
-  socket->SetTcp (this);
-  m_sockets.push_back (socket);
-  return socket;
-}
-
-Ipv4EndPoint *
-NscTcpL4Protocol::Allocate (void)
-{
-  NS_LOG_FUNCTION (this);
-  return m_endPoints->Allocate ();
-}
-
-Ipv4EndPoint *
-NscTcpL4Protocol::Allocate (Ipv4Address address)
-{
-  NS_LOG_FUNCTION (this << address);
-  return m_endPoints->Allocate (address);
-}
-
-Ipv4EndPoint *
-NscTcpL4Protocol::Allocate (Ptr<NetDevice> boundNetDevice, uint16_t port)
-{
-  NS_LOG_FUNCTION (this << boundNetDevice << port);
-  return m_endPoints->Allocate (boundNetDevice, port);
-}
-
-Ipv4EndPoint *
-NscTcpL4Protocol::Allocate (Ptr<NetDevice> boundNetDevice, Ipv4Address address, uint16_t port)
-{
-  NS_LOG_FUNCTION (this << boundNetDevice << address << port);
-  return m_endPoints->Allocate (boundNetDevice, address, port);
-}
-
-Ipv4EndPoint *
-NscTcpL4Protocol::Allocate (Ptr<NetDevice> boundNetDevice, 
-                            Ipv4Address localAddress, uint16_t localPort,
-                            Ipv4Address peerAddress, uint16_t peerPort)
-{
-  NS_LOG_FUNCTION (this << boundNetDevice << localAddress << localPort << peerAddress << peerPort);
-  return m_endPoints->Allocate (boundNetDevice,
-                                localAddress, localPort,
-                                peerAddress, peerPort);
-}
-
-void 
-NscTcpL4Protocol::DeAllocate (Ipv4EndPoint *endPoint)
-{
-  NS_LOG_FUNCTION (this << endPoint);
-  // NSC m_endPoints->DeAllocate (endPoint);
-}
-
-IpL4Protocol::RxStatus
-NscTcpL4Protocol::Receive (Ptr<Packet> packet,
-                           Ipv4Header const &header,
-                           Ptr<Ipv4Interface> incomingInterface)
-{
-  NS_LOG_FUNCTION (this << packet << header << incomingInterface);
-  Ipv4Header ipHeader;
-  uint32_t packetSize = packet->GetSize ();
-
-  // The way things work at the moment, the IP header has been removed
-  // by the ns-3 IPv4 processing code. However, the NSC stack expects
-  // a complete IP packet, so we add the IP header back.
-  // Since the original header is already gone, we create a new one
-  // based on the information we have.
-  ipHeader.SetSource (header.GetSource ());
-  ipHeader.SetDestination (header.GetDestination ());
-  ipHeader.SetProtocol (PROT_NUMBER);
-  ipHeader.SetPayloadSize (packetSize);
-  ipHeader.SetTtl (1);
-  // all NSC stacks check the IP checksum
-  ipHeader.EnableChecksum ();
-
-  packet->AddHeader (ipHeader);
-  packetSize = packet->GetSize ();
-
-  uint8_t *buf = new uint8_t[packetSize];
-  packet->CopyData (buf, packetSize);
-  const uint8_t *data = const_cast<uint8_t *>(buf);
-
-  // deliver complete packet to the NSC network stack
-  m_nscStack->if_receive_packet (0, data, packetSize);
-  delete[] buf;
-
-  wakeup ();
-  return IpL4Protocol::RX_OK;
-}
-
-IpL4Protocol::RxStatus
-NscTcpL4Protocol::Receive(Ptr<Packet>, Ipv6Header const &, Ptr<Ipv6Interface>)
-{
-  return IpL4Protocol::RX_ENDPOINT_UNREACH;
-}
-
-void NscTcpL4Protocol::SoftInterrupt (void)
-{
-  m_nscStack->timer_interrupt ();
-  m_nscStack->increment_ticks ();
-  m_softTimer.Schedule ();
-}
-
-void NscTcpL4Protocol::send_callback (const void* data, int datalen)
-{
-  Ptr<Packet> p;
-  uint32_t ipv4Saddr, ipv4Daddr;
-
-  NS_ASSERT (datalen > 20);
-
-
-  // create packet, without IP header. The TCP header is not touched.
-  // Not using the IP header makes integration easier, but it destroys
-  // eg. ECN.
-  const uint8_t *rawdata = reinterpret_cast<const uint8_t *>(data);
-  rawdata += 20; // skip IP header. IP options aren't supported at this time.
-  datalen -= 20;
-  p = Create<Packet> (rawdata, datalen);
-
-  // we need the real source/destination ipv4 addresses for Send ().
-  const uint32_t *ipheader = reinterpret_cast<const uint32_t *>(data);
-  ipv4Saddr = *(ipheader+3);
-  ipv4Daddr = *(ipheader+4);
-
-  Ipv4Address saddr (ntohl (ipv4Saddr));
-  Ipv4Address daddr (ntohl (ipv4Daddr));
-
-  Ptr<Ipv4L3Protocol> ipv4 = m_node->GetObject<Ipv4L3Protocol> ();
-  NS_ASSERT_MSG (ipv4, "nsc callback invoked, but node has no ipv4 object");
-
-  m_downTarget (p, saddr, daddr, PROT_NUMBER, 0);
-  m_nscStack->if_send_finish (0);
-}
-
-void NscTcpL4Protocol::wakeup ()
-{
-  // \todo
-  // this should schedule a timer to read from all tcp sockets now... this is
-  // an indication that data might be waiting on the socket
-
-  Ipv4EndPointDemux::EndPoints endPoints = m_endPoints->GetAllEndPoints ();
-  for (Ipv4EndPointDemux::EndPointsI endPoint = endPoints.begin ();
-       endPoint != endPoints.end (); endPoint++) {
-      // NSC HACK: (ab)use TcpSocket::ForwardUp for signalling
-      (*endPoint)->ForwardUp (NULL, Ipv4Header (), 0, 0);
-    }
-}
-
-void NscTcpL4Protocol::gettime (unsigned int* sec, unsigned int* usec)
-{
-  // Only used by the Linux network stack, e.g. during ISN generation
-  // and in the kernel rng initialization routine. Also used in Linux
-  // printk output.
-  Time t = Simulator::Now ();
-  int64_t us = t.GetMicroSeconds ();
-  *sec = us / (1000*1000);
-  *usec = us - *sec * (1000*1000);
-}
-
-
-void NscTcpL4Protocol::AddInterface (void)
-{
-  Ptr<Ipv4> ip = m_node->GetObject<Ipv4> ();
-  const uint32_t nInterfaces = ip->GetNInterfaces ();
-
-  NS_ASSERT_MSG (nInterfaces <= 2, "nsc does not support multiple interfaces per node");
-
-  // start from 1, ignore the loopback interface (HACK)
-  // we really don't need the loop, but its here to illustrate
-  // how things _should_ be (once nsc can deal with multiple interfaces...)
-  for (uint32_t i = 1; i < nInterfaces; i++)
-    {
-      Ipv4InterfaceAddress ifAddr = ip->GetAddress (i, 0);
-      Ipv4Address addr = ifAddr.GetLocal ();
-      Ipv4Mask mask = ifAddr.GetMask ();
-      uint16_t mtu = ip->GetMtu (i);
-
-      std::ostringstream addrOss, maskOss;
-
-      addr.Print (addrOss);
-      mask.Print (maskOss);
-
-      NS_LOG_LOGIC ("if_attach " << addrOss.str ().c_str () << " " << maskOss.str ().c_str () << " " << mtu);
-
-      std::string addrStr = addrOss.str ();
-      std::string maskStr = maskOss.str ();
-      const char* addrCStr = addrStr.c_str ();
-      const char* maskCStr = maskStr.c_str ();
-      m_nscStack->if_attach (addrCStr, maskCStr, mtu);
-
-      if (i == 1)
-        {
-          // The NSC stack requires a default gateway and only supports
-          // single-interface nodes.  The below is a hack, but
-          // it turns out that we can pass the interface address to nsc as
-          // a default gateway.  Bug 1398 has been opened to track this
-          // issue (NSC's limitation to single-interface nodes)
-          //
-          // Previous versions of this code tried to assign the "next"
-          // IP address of the subnet but this was found to fail for
-          // some use cases in /30 subnets.
-
-          // \todo \bugid{1398} NSC's limitation to single-interface nodes
-          m_nscStack->add_default_gateway (addrOss.str ().c_str ());
-        }
-    }
-}
-
-void
-NscTcpL4Protocol::SetDownTarget (IpL4Protocol::DownTargetCallback callback)
-{
-  m_downTarget = callback;
-}
-
-void
-NscTcpL4Protocol::SetDownTarget6 (IpL4Protocol::DownTargetCallback6 callback)
-{
-}
-
-IpL4Protocol::DownTargetCallback
-NscTcpL4Protocol::GetDownTarget (void) const
-{
-  return m_downTarget;
-}
-
-IpL4Protocol::DownTargetCallback6
-NscTcpL4Protocol::GetDownTarget6 (void) const
-{
-  return (IpL4Protocol::DownTargetCallback6)0;
-}
-
-} // namespace ns3
-
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/model/nsc-tcp-l4-protocol.h ns-3.36/src/internet/model/nsc-tcp-l4-protocol.h
--- ns-3.35/src/internet/model/nsc-tcp-l4-protocol.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/model/nsc-tcp-l4-protocol.h	1969-12-31 16:00:00.000000000 -0800
@@ -1,232 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-#ifndef NSC_TCP_L4_PROTOCOL_H
-#define NSC_TCP_L4_PROTOCOL_H
-
-#include <stdint.h>
-
-#include "ns3/packet.h"
-#include "ns3/ipv4-address.h"
-#include "ns3/ptr.h"
-#include "ns3/object-factory.h"
-#include "ns3/timer.h"
-#include "ip-l4-protocol.h"
-
-struct INetStack;
-
-namespace ns3 {
-
-class Node;
-class Socket;
-class Ipv4EndPointDemux;
-class Ipv4Interface;
-class NscTcpSocketImpl;
-class Ipv4EndPoint;
-class NscInterfaceImpl;
-class NetDevice;
-
-/**
- * \ingroup nsctcp
- * 
- * \brief Nsc wrapper glue, to interface with the Ipv4 protocol underneath.
- */
-class NscTcpL4Protocol : public IpL4Protocol {
-public:
-  static const uint8_t PROT_NUMBER; //!< protocol number (0x6)
-  /**
-   * \brief Get the type ID.
-   * \return the object TypeId
-   */
-  static TypeId GetTypeId (void);
-
-  NscTcpL4Protocol ();
-  virtual ~NscTcpL4Protocol ();
-
-  /**
-   * Set node associated with this stack
-   * \param node the node
-   */
-  void SetNode (Ptr<Node> node);
-
-  /**
-   * Set the NSC library to be used
-   * \param lib the library path
-   */
-  void SetNscLibrary (const std::string &lib);
-
-  /**
-   * Get the NSC library being used
-   * \returns the library path
-   */
-  std::string GetNscLibrary (void) const;
-  virtual int GetProtocolNumber (void) const;
-
-  /**
-   * Get the NSC version
-   * \returns the NSC version
-   */
-  virtual int GetVersion (void) const;
-
-  /**
-   * \return A smart Socket pointer to a NscTcpSocketImpl, allocated by this instance
-   * of the TCP protocol
-   */
-  Ptr<Socket> CreateSocket (void);
-
-  /**
-   * \brief Allocate an IPv4 Endpoint
-   * \return the Endpoint
-   */
-  Ipv4EndPoint *Allocate (void);
-  /**
-   * \brief Allocate an IPv4 Endpoint
-   * \param address address to use
-   * \return the Endpoint
-   */
-  Ipv4EndPoint *Allocate (Ipv4Address address);
-  /**
-   * \brief Allocate an IPv4 Endpoint
-   * \param boundNetDevice Bound NetDevice (if any)
-   * \param port port to use
-   * \return the Endpoint
-   */
-  Ipv4EndPoint *Allocate (Ptr<NetDevice> boundNetDevice, uint16_t port);
-  /**
-   * \brief Allocate an IPv4 Endpoint
-   * \param boundNetDevice Bound NetDevice (if any)
-   * \param address address to use
-   * \param port port to use
-   * \return the Endpoint
-   */
-  Ipv4EndPoint *Allocate (Ptr<NetDevice> boundNetDevice, Ipv4Address address, uint16_t port);
-  /**
-   * \brief Allocate an IPv4 Endpoint
-   * \param boundNetDevice Bound NetDevice (if any)
-   * \param localAddress local address to use
-   * \param localPort local port to use
-   * \param peerAddress remote address to use
-   * \param peerPort remote port to use
-   * \return the Endpoint
-   */
-  Ipv4EndPoint *Allocate (Ptr<NetDevice> boundNetDevice,
-                          Ipv4Address localAddress, uint16_t localPort,
-                          Ipv4Address peerAddress, uint16_t peerPort);
-
-
-  /**
-   * \brief Remove an IPv4 Endpoint.
-   * \param endPoint the end point to remove
-   */
-  void DeAllocate (Ipv4EndPoint *endPoint);
-
-  virtual IpL4Protocol::RxStatus Receive (Ptr<Packet> p,
-                                          Ipv4Header const &header,
-                                          Ptr<Ipv4Interface> incomingInterface);
-  virtual IpL4Protocol::RxStatus Receive (Ptr<Packet> p,
-                                          Ipv6Header const &header,
-                                          Ptr<Ipv6Interface> interface);
-
-  // From IpL4Protocol
-  virtual void SetDownTarget (IpL4Protocol::DownTargetCallback cb);
-  virtual void SetDownTarget6 (IpL4Protocol::DownTargetCallback6 cb);
-  // From IpL4Protocol
-  virtual IpL4Protocol::DownTargetCallback GetDownTarget (void) const;
-  virtual IpL4Protocol::DownTargetCallback6 GetDownTarget6 (void) const;
-protected:
-  virtual void DoDispose (void);
-  virtual void NotifyNewAggregate ();
-private:
-  /**
-   * \brief Copy constructor
-   *
-   * Defined and not implemented to avoid misuse
-   */
-  NscTcpL4Protocol (NscTcpL4Protocol const &);
-  /**
-   * \brief Copy constructor
-   *
-   * Defined and not implemented to avoid misuse
-   * \returns
-   */
-  NscTcpL4Protocol& operator= (NscTcpL4Protocol const &);
-
-  // NSC callbacks.
-  // NSC invokes these hooks to interact with the simulator.
-  // In any case, these methods are only to be called by NSC.
-
-  /**
-   * \brief Invoked by NSCs 'ethernet driver' to re-inject a packet into ns-3.
-   *
-   * A packet is an octet soup consisting of an IP Header, TCP Header
-   * and user payload, if any
-   *
-   * \param data the data
-   * \param datalen the data length
-   */
-  void send_callback (const void *data, int datalen);
-  /**
-   * \brief Called by the NSC stack whenever something of interest has happened
-   *
-   * Examples: when data arrives on a socket, a listen socket
-   * has a new connection pending, etc.
-   */
-  void wakeup ();
-  /**
-   * \brief Called by the Linux stack RNG initialization
-   *
-   * Its also used by the cradle code to add a timestamp to
-   * printk/printf/debug output.
-   * \param sec seconds
-   * \param usec microseconds
-   */
-  void gettime (unsigned int *sec, unsigned int *usec);
-  /**
-   * \brief Add an interface
-   *
-   * Actually NSC only supports one interface per node (\bugid{1398})
-   */
-  void AddInterface (void);
-
-  /**
-   * \brief Provide a "soft" interrupt to NSC
-   */
-  void SoftInterrupt (void);
-  /**
-   * \brief NscInterfaceImpl friend class.
-   * \relates NscInterfaceImpl
-   */
-  friend class NscInterfaceImpl;
-  /**
-   * \brief NscTcpSocketImpl friend class.
-   * \relates NscTcpSocketImpl
-   */
-  friend class NscTcpSocketImpl;
-
-  Ptr<Node> m_node; //!< the node this stack is associated with
-  Ipv4EndPointDemux *m_endPoints; //!< A list of IPv4 end points.
-  INetStack* m_nscStack; //!< the NSC stack.
-  NscInterfaceImpl *m_nscInterface; //!< the NSC Interface.
-  void *m_dlopenHandle; //!< dynamic library handle.
-  std::string m_nscLibrary; //!< path to the NSC library.
-  Timer m_softTimer; //!< Soft interrupt timer
-  std::vector<Ptr<NscTcpSocketImpl> > m_sockets; //!< list of sockets
-  IpL4Protocol::DownTargetCallback m_downTarget; //!< Callback to send packets over IPv4
-};
-
-} // namespace ns3
-
-#endif /* NSC_TCP_L4_PROTOCOL_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/model/nsc-tcp-socket-factory-impl.cc ns-3.36/src/internet/model/nsc-tcp-socket-factory-impl.cc
--- ns-3.35/src/internet/model/nsc-tcp-socket-factory-impl.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/model/nsc-tcp-socket-factory-impl.cc	1969-12-31 16:00:00.000000000 -0800
@@ -1,51 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-#include "nsc-tcp-l4-protocol.h"
-#include "nsc-tcp-socket-factory-impl.h"
-#include "ns3/socket.h"
-#include "ns3/assert.h"
-
-namespace ns3 {
-
-NscTcpSocketFactoryImpl::NscTcpSocketFactoryImpl ()
-  : m_tcp (0)
-{
-}
-NscTcpSocketFactoryImpl::~NscTcpSocketFactoryImpl ()
-{
-  NS_ASSERT (m_tcp == 0);
-}
-
-void
-NscTcpSocketFactoryImpl::SetTcp (Ptr<NscTcpL4Protocol> tcp)
-{
-  m_tcp = tcp;
-}
-
-Ptr<Socket>
-NscTcpSocketFactoryImpl::CreateSocket (void)
-{
-  return m_tcp->CreateSocket ();
-}
-
-void 
-NscTcpSocketFactoryImpl::DoDispose (void)
-{
-  m_tcp = 0;
-  TcpSocketFactory::DoDispose ();
-}
-
-} // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/model/nsc-tcp-socket-factory-impl.h ns-3.36/src/internet/model/nsc-tcp-socket-factory-impl.h
--- ns-3.35/src/internet/model/nsc-tcp-socket-factory-impl.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/model/nsc-tcp-socket-factory-impl.h	1969-12-31 16:00:00.000000000 -0800
@@ -1,66 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-#ifndef NSC_TCP_SOCKET_FACTORY_IMPL_H
-#define NSC_TCP_SOCKET_FACTORY_IMPL_H
-
-#include "ns3/tcp-socket-factory.h"
-#include "ns3/ptr.h"
-
-namespace ns3 {
-
-class NscTcpL4Protocol;
-
-/**
- * \ingroup internet
- * \defgroup nsctcp NscTcp
- *
- * An alternate implementation of TCP for ns-3 is provided by the
- * Network Simulation Cradle (NSC) project. NSC is a separately linked
- * library that provides ported TCP stacks from popular operating systems
- * such as Linux and FreeBSD.  Glue code such as the ns-3 NSC code
- * allows users to delegate Internet stack processing to the logic
- * from these operating systems.  This allows a user to reproduce
- * with high fidelity the behavior of a real TCP stack.
- */
-
-/**
- * \ingroup nsctcp
- *
- * \brief socket factory implementation for creating instances of NSC TCP
- */
-class NscTcpSocketFactoryImpl : public TcpSocketFactory
-{
-public:
-  NscTcpSocketFactoryImpl ();
-  virtual ~NscTcpSocketFactoryImpl ();
-
-  /**
-   * \brief Set the associated TCP L4 protocol.
-   * \param tcp the TCP L4 protocol
-   */
-  void SetTcp (Ptr<NscTcpL4Protocol> tcp);
-
-  virtual Ptr<Socket> CreateSocket (void);
-
-protected:
-  virtual void DoDispose (void);
-private:
-  Ptr<NscTcpL4Protocol> m_tcp; //!< the associated TCP L4 protocol
-};
-
-} // namespace ns3
-
-#endif /* NSC_TCP_SOCKET_FACTORY_IMPL_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/model/nsc-tcp-socket-impl.cc ns-3.36/src/internet/model/nsc-tcp-socket-impl.cc
--- ns-3.35/src/internet/model/nsc-tcp-socket-impl.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/model/nsc-tcp-socket-impl.cc	1969-12-31 16:00:00.000000000 -0800
@@ -1,937 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * based on tcp-socket-impl.cc, Author: Raj Bhattacharjea <raj.b@gatech.edu>
- * Author: Florian Westphal <fw@strlen.de>
- */
-
-#define NS_LOG_APPEND_CONTEXT                                   \
-  if (m_node) { std::clog << Simulator::Now ().As (Time::S) << " [node " << m_node->GetId () << "] "; } 
-
-#include "ns3/node.h"
-#include "ns3/inet-socket-address.h"
-#include "ns3/log.h"
-#include "ns3/ipv4.h"
-#include "ipv4-end-point.h"
-#include "nsc-tcp-l4-protocol.h"
-#include "nsc-tcp-socket-impl.h"
-#include "ns3/simulation-singleton.h"
-#include "ns3/simulator.h"
-#include "ns3/packet.h"
-#include "ns3/uinteger.h"
-#include "ns3/trace-source-accessor.h"
-
-#include <algorithm>
-
-// for ntohs().
-#include <arpa/inet.h>
-#include <netinet/in.h>
-#include "sim_interface.h"
-
-#include "sim_errno.h"
-
-
-namespace ns3 {
-
-NS_LOG_COMPONENT_DEFINE ("NscTcpSocketImpl");
-
-NS_OBJECT_ENSURE_REGISTERED (NscTcpSocketImpl);
-
-TypeId
-NscTcpSocketImpl::GetTypeId ()
-{
-  static TypeId tid = TypeId ("ns3::NscTcpSocketImpl")
-    .SetParent<TcpSocket> ()
-    .SetGroupName ("Internet")
-    .AddTraceSource ("CongestionWindow",
-                     "The TCP connection's congestion window",
-                     MakeTraceSourceAccessor (&NscTcpSocketImpl::m_cWnd),
-                     "ns3::TracedValueCallback::Uint32")
-    .AddTraceSource ("SlowStartThreshold",
-                     "TCP slow start threshold (bytes)",
-                     MakeTraceSourceAccessor (&NscTcpSocketImpl::m_ssThresh),
-                     "ns3::TracedValueCallback::Uint32")
-    .AddTraceSource ("State",
-                     "TCP state",
-                     MakeTraceSourceAccessor (&NscTcpSocketImpl::m_state),
-                     "ns3::TcpStatesTracedValueCallback")
-  ;
-  return tid;
-}
-
-NscTcpSocketImpl::NscTcpSocketImpl ()
-  : m_endPoint (0),
-    m_node (0),
-    m_tcp (0),
-    m_localAddress (Ipv4Address::GetZero ()),
-    m_localPort (0),
-    m_peerAddress ("0.0.0.0", 0),
-    m_errno (ERROR_NOTERROR),
-    m_shutdownSend (false),
-    m_shutdownRecv (false),
-    m_connected (false),
-    m_state (CLOSED),
-    m_closeOnEmpty (false),
-    m_txBufferSize (0),
-    m_lastMeasuredRtt (Seconds (0.0))
-{
-  NS_LOG_FUNCTION (this);
-}
-
-NscTcpSocketImpl::NscTcpSocketImpl(const NscTcpSocketImpl& sock)
-  : TcpSocket (sock), //copy the base class callbacks
-    m_delAckMaxCount (sock.m_delAckMaxCount),
-    m_delAckTimeout (sock.m_delAckTimeout),
-    m_noDelay (sock.m_noDelay),
-    m_endPoint (0),
-    m_node (sock.m_node),
-    m_tcp (sock.m_tcp),
-    m_remoteAddress (sock.m_remoteAddress),
-    m_remotePort (sock.m_remotePort),
-    m_localAddress (sock.m_localAddress),
-    m_localPort (sock.m_localPort),
-    m_peerAddress (sock.m_peerAddress),
-    m_errno (sock.m_errno),
-    m_shutdownSend (sock.m_shutdownSend),
-    m_shutdownRecv (sock.m_shutdownRecv),
-    m_connected (sock.m_connected),
-    m_state (sock.m_state),
-    m_closeOnEmpty (sock.m_closeOnEmpty),
-    m_txBufferSize (sock.m_txBufferSize),
-    m_segmentSize (sock.m_segmentSize),
-    m_rxWindowSize (sock.m_rxWindowSize),
-    m_advertisedWindowSize (sock.m_advertisedWindowSize),
-    m_cWnd (sock.m_cWnd),
-    m_ssThresh (sock.m_ssThresh),
-    m_initialCWnd (sock.m_initialCWnd),
-    m_initialSsThresh (sock.m_initialSsThresh),
-    m_lastMeasuredRtt (Seconds (0.0)),
-    m_cnTimeout (sock.m_cnTimeout),
-    m_synRetries (sock.m_synRetries),
-    m_rxAvailable (0),
-    m_nscTcpSocket (0),
-    m_sndBufSize (sock.m_sndBufSize)
-{
-  NS_LOG_FUNCTION (this);
-  NS_LOG_LOGIC ("Invoked the copy constructor");
-  //copy the pending data if necessary
-  if(!sock.m_txBuffer.empty () )
-    {
-      m_txBuffer = sock.m_txBuffer;
-    }
-  //can't "copy" the endpoint just yes, must do this when we know the peer info
-  //too; this is in SYN_ACK_TX
-}
-
-NscTcpSocketImpl::~NscTcpSocketImpl ()
-{
-  NS_LOG_FUNCTION (this);
-  m_node = 0;
-  if (m_endPoint != 0)
-    {
-      NS_ASSERT (m_tcp != 0);
-      /**
-       * Note that this piece of code is a bit tricky:
-       * when DeAllocate is called, it will call into
-       * Ipv4EndPointDemux::Deallocate which triggers
-       * a delete of the associated endPoint which triggers
-       * in turn a call to the method NscTcpSocketImpl::Destroy below
-       * will will zero the m_endPoint field.
-       */
-      NS_ASSERT (m_endPoint != 0);
-      m_tcp->DeAllocate (m_endPoint);
-      NS_ASSERT (m_endPoint == 0);
-    }
-  m_tcp = 0;
-}
-
-void
-NscTcpSocketImpl::SetNode (Ptr<Node> node)
-{
-  m_node = node;
-  // Initialize some variables 
-  m_cWnd = m_initialCWnd * m_segmentSize;
-  m_ssThresh = m_initialSsThresh;
-  m_rxWindowSize = m_advertisedWindowSize;
-}
-
-void 
-NscTcpSocketImpl::SetTcp (Ptr<NscTcpL4Protocol> tcp)
-{
-  m_nscTcpSocket = tcp->m_nscStack->new_tcp_socket ();
-  m_tcp = tcp;
-}
-
-
-enum Socket::SocketErrno
-NscTcpSocketImpl::GetErrno (void) const
-{
-  NS_LOG_FUNCTION (this);
-  return m_errno;
-}
-
-enum Socket::SocketType
-NscTcpSocketImpl::GetSocketType (void) const
-{
-  return NS3_SOCK_STREAM;
-}
-
-Ptr<Node>
-NscTcpSocketImpl::GetNode (void) const
-{
-  NS_LOG_FUNCTION (this);
-  return m_node;
-}
-
-void 
-NscTcpSocketImpl::Destroy (void)
-{
-  NS_LOG_FUNCTION (this);
-  m_node = 0;
-  m_endPoint = 0;
-  m_tcp = 0;
-}
-int
-NscTcpSocketImpl::FinishBind (void)
-{
-  NS_LOG_FUNCTION (this);
-  if (m_endPoint == 0)
-    {
-      return -1;
-    }
-  m_endPoint->SetRxCallback (MakeCallback (&NscTcpSocketImpl::ForwardUp, Ptr<NscTcpSocketImpl>(this)));
-  m_endPoint->SetDestroyCallback (MakeCallback (&NscTcpSocketImpl::Destroy, Ptr<NscTcpSocketImpl>(this)));
-  m_localAddress = m_endPoint->GetLocalAddress ();
-  m_localPort = m_endPoint->GetLocalPort ();
-  return 0;
-}
-
-int
-NscTcpSocketImpl::Bind (void)
-{
-  NS_LOG_FUNCTION (this);
-  m_endPoint = m_tcp->Allocate ();
-  return FinishBind ();
-}
-int
-NscTcpSocketImpl::Bind6 ()
-{
-  NS_LOG_LOGIC ("NscTcpSocketImpl: ERROR_AFNOSUPPORT - Bind6 not supported");
-  m_errno = ERROR_AFNOSUPPORT;
-  return (-1);
-}
-int 
-NscTcpSocketImpl::Bind (const Address &address)
-{
-  NS_LOG_FUNCTION (this<<address);
-  if (!InetSocketAddress::IsMatchingType (address))
-    {
-      return ERROR_INVAL;
-    }
-  InetSocketAddress transport = InetSocketAddress::ConvertFrom (address);
-  Ipv4Address ipv4 = transport.GetIpv4 ();
-  uint16_t port = transport.GetPort ();
-  if (ipv4 == Ipv4Address::GetAny () && port == 0)
-    {
-      m_endPoint = m_tcp->Allocate ();
-      NS_LOG_LOGIC ("NscTcpSocketImpl "<<this<<" got an endpoint: "<<m_endPoint);
-    }
-  else if (ipv4 == Ipv4Address::GetAny () && port != 0)
-    {
-      m_endPoint = m_tcp->Allocate (GetBoundNetDevice (), port);
-      NS_LOG_LOGIC ("NscTcpSocketImpl "<<this<<" got an endpoint: "<<m_endPoint);
-    }
-  else if (ipv4 != Ipv4Address::GetAny () && port == 0)
-    {
-      m_endPoint = m_tcp->Allocate (ipv4);
-      NS_LOG_LOGIC ("NscTcpSocketImpl "<<this<<" got an endpoint: "<<m_endPoint);
-    }
-  else if (ipv4 != Ipv4Address::GetAny () && port != 0)
-    {
-      m_endPoint = m_tcp->Allocate (GetBoundNetDevice (), ipv4, port);
-      NS_LOG_LOGIC ("NscTcpSocketImpl "<<this<<" got an endpoint: "<<m_endPoint);
-    }
-
-  m_localPort = port;
-  return FinishBind ();
-}
-
-/* Inherit from Socket class: Bind this socket to the specified NetDevice */
-void
-NscTcpSocketImpl::BindToNetDevice (Ptr<NetDevice> netdevice)
-{
-  NS_LOG_FUNCTION (this << netdevice);
-  Socket::BindToNetDevice (netdevice); // Includes sanity check
-  if (m_endPoint != 0)
-    {
-      m_endPoint->BindToNetDevice (netdevice);
-    }
-  return;
-}
-
-int 
-NscTcpSocketImpl::ShutdownSend (void)
-{
-  NS_LOG_FUNCTION (this);
-  m_shutdownSend = true;
-  return 0;
-}
-int 
-NscTcpSocketImpl::ShutdownRecv (void)
-{
-  NS_LOG_FUNCTION (this);
-  m_shutdownRecv = true;
-  return 0;
-}
-
-int
-NscTcpSocketImpl::Close (void)
-{
-  NS_LOG_FUNCTION (this << m_state);
-
-  if (m_state == CLOSED)
-    {
-      return -1;
-    }
-  if (!m_txBuffer.empty ())
-    { // App close with pending data must wait until all data transmitted
-      m_closeOnEmpty = true;
-      NS_LOG_LOGIC ("Socket " << this <<
-                    " deferring close, state " << m_state);
-      return 0;
-    }
-
-  NS_LOG_LOGIC ("NscTcp socket " << this << " calling disconnect(); moving to CLOSED");
-  m_nscTcpSocket->disconnect ();
-  m_state = CLOSED;
-  ShutdownSend ();
-  return 0;
-}
-
-int
-NscTcpSocketImpl::Connect (const Address & address)
-{
-  NS_LOG_FUNCTION (this << address);
-  if (m_endPoint == 0)
-    {
-      if (Bind () == -1)
-        {
-          NS_ASSERT (m_endPoint == 0);
-          return -1;
-        }
-      NS_ASSERT (m_endPoint != 0);
-    }
-  InetSocketAddress transport = InetSocketAddress::ConvertFrom (address);
-  m_remoteAddress = transport.GetIpv4 ();
-  m_remotePort = transport.GetPort ();
-
-  std::ostringstream ss;
-  m_remoteAddress.Print (ss);
-  std::string ipstring = ss.str ();
-
-  m_nscTcpSocket->connect (ipstring.c_str (), m_remotePort);
-  m_state = SYN_SENT;
-  return 0;
-}
-
-int
-NscTcpSocketImpl::Send (const Ptr<Packet> p, uint32_t flags)
-{
-  NS_LOG_FUNCTION (this << p);
-
-  NS_ASSERT (p->GetSize () > 0);
-  if (m_state == ESTABLISHED || m_state == SYN_SENT || m_state == CLOSE_WAIT)
-    {
-      if (p->GetSize () > GetTxAvailable ())
-        {
-          m_errno = ERROR_MSGSIZE;
-          return -1;
-        }
-
-      uint32_t sent = p->GetSize ();
-      if (m_state == ESTABLISHED)
-        {
-          m_txBuffer.push (p);
-          m_txBufferSize += sent;
-          SendPendingData ();
-        }
-      else
-        { // SYN_SET -- Queue Data
-          m_txBuffer.push (p);
-          m_txBufferSize += sent;
-        }
-      return sent;
-    }
-  else
-    {
-      m_errno = ERROR_NOTCONN;
-      return -1;
-    }
-}
-
-int
-NscTcpSocketImpl::SendTo (Ptr<Packet> p, uint32_t flags, const Address &address)
-{
-  NS_LOG_FUNCTION (this << address << p);
-  if (!m_connected)
-    {
-      m_errno = ERROR_NOTCONN;
-      return -1;
-    }
-  else
-    {
-      return Send (p, flags); //drop the address according to BSD manpages
-    }
-}
-
-uint32_t
-NscTcpSocketImpl::GetTxAvailable (void) const
-{
-  NS_LOG_FUNCTION (this);
-  if (m_txBufferSize != 0)
-    {
-      NS_ASSERT (m_txBufferSize <= m_sndBufSize);
-      return m_sndBufSize - m_txBufferSize;
-    }
-  else
-    {
-      return m_sndBufSize;
-    }
-}
-
-int
-NscTcpSocketImpl::Listen (void)
-{
-  NS_LOG_FUNCTION (this);
-  m_nscTcpSocket->listen (m_localPort);
-  m_state = LISTEN;
-  return 0;
-}
-
-
-void
-NscTcpSocketImpl::NSCWakeup ()
-{
-  NS_LOG_FUNCTION (this);
-  switch (m_state) {
-    case SYN_SENT:
-      if (!m_nscTcpSocket->is_connected ())
-        break;
-      m_state = ESTABLISHED;
-      Simulator::ScheduleNow (&NscTcpSocketImpl::ConnectionSucceeded, this);
-    // fall through to schedule read/write events
-    case ESTABLISHED:
-      if (!m_txBuffer.empty ())
-        {
-          Simulator::ScheduleNow (&NscTcpSocketImpl::SendPendingData, this);
-        }
-      else
-        {
-          if (GetTxAvailable ())
-            {
-              NotifySend (GetTxAvailable ());
-            }
-        }
-      Simulator::ScheduleNow (&NscTcpSocketImpl::ReadPendingData, this);
-      break;
-    case LISTEN:
-      Simulator::ScheduleNow (&NscTcpSocketImpl::Accept, this);
-      break;
-    case CLOSED: break;
-    default:
-      NS_LOG_DEBUG (this << " invalid state: " << m_state);
-    }
-}
-
-Ptr<Packet>
-NscTcpSocketImpl::Recv (uint32_t maxSize, uint32_t flags)
-{
-  NS_LOG_FUNCTION (this << maxSize << flags);
-  if (m_deliveryQueue.empty () )
-    {
-      m_errno = ERROR_AGAIN;
-      return 0;
-    }
-  Ptr<Packet> p = m_deliveryQueue.front ();
-  if (p->GetSize () <= maxSize)
-    {
-      m_deliveryQueue.pop ();
-      m_rxAvailable -= p->GetSize ();
-    }
-  else
-    {
-      m_errno = ERROR_AGAIN;
-      p = 0;
-    }
-  return p;
-}
-
-Ptr<Packet>
-NscTcpSocketImpl::RecvFrom (uint32_t maxSize, uint32_t flags,
-                            Address &fromAddress)
-{
-  NS_LOG_FUNCTION (this << maxSize << flags);
-  Ptr<Packet> packet = Recv (maxSize, flags);
-  GetPeerName (fromAddress);
-  return packet;
-}
-
-int
-NscTcpSocketImpl::GetSockName (Address &address) const
-{
-  NS_LOG_FUNCTION (this << address);
-  address = InetSocketAddress (m_localAddress, m_localPort);
-  return 0;
-}
-
-int
-NscTcpSocketImpl::GetPeerName (Address &address) const
-{
-  NS_LOG_FUNCTION (this << address);
-
-  if (!m_endPoint)
-    {
-      m_errno = ERROR_NOTCONN;
-      return -1;
-    }
-  address = InetSocketAddress (m_endPoint->GetPeerAddress (),
-                               m_endPoint->GetPeerPort ());
-  return 0;
-}
-
-uint32_t
-NscTcpSocketImpl::GetRxAvailable (void) const
-{
-  NS_LOG_FUNCTION (this);
-  // We separately maintain this state to avoid walking the queue 
-  // every time this might be called
-  return m_rxAvailable;
-}
-
-void
-NscTcpSocketImpl::ForwardUp (Ptr<Packet> packet, Ipv4Header header, uint16_t port,
-                             Ptr<Ipv4Interface> incomingInterface)
-{
-  NSCWakeup ();
-}
-
-void NscTcpSocketImpl::CompleteFork (void)
-{
-  // The address pairs (m_localAddress, m_localPort, m_remoteAddress, m_remotePort)
-  // are bogus, but this isn't important at the moment, because
-  // address <-> Socket handling is done by NSC internally.
-  // We only need to add the new ns-3 socket to the list of sockets, so
-  // we use plain Allocate() instead of Allocate(m_localAddress, ... )
-  struct sockaddr_in sin;
-  size_t sin_len = sizeof(sin);
-
-  if (0 == m_nscTcpSocket->getpeername ((struct sockaddr*) &sin, &sin_len)) {
-      m_remotePort = ntohs (sin.sin_port);
-      m_remoteAddress = Ipv4Address::Deserialize ((const uint8_t*) &sin.sin_addr);
-      m_peerAddress = InetSocketAddress (m_remoteAddress, m_remotePort);
-    }
-
-  m_endPoint = m_tcp->Allocate ();
-
-  //the cloned socket with be in listen state, so manually change state
-  NS_ASSERT (m_state == LISTEN);
-  m_state = ESTABLISHED;
-
-  sin_len = sizeof(sin);
-
-  if (0 == m_nscTcpSocket->getsockname ((struct sockaddr *) &sin, &sin_len))
-    m_localAddress = Ipv4Address::Deserialize ((const uint8_t*) &sin.sin_addr);
-
-  NS_LOG_LOGIC ("NscTcpSocketImpl " << this << " accepted connection from " 
-                                    << m_remoteAddress << ":" << m_remotePort
-                                    << " to " << m_localAddress << ":" << m_localPort);
-  //equivalent to FinishBind
-  m_endPoint->SetRxCallback (MakeCallback (&NscTcpSocketImpl::ForwardUp, Ptr<NscTcpSocketImpl>(this)));
-  m_endPoint->SetDestroyCallback (MakeCallback (&NscTcpSocketImpl::Destroy, Ptr<NscTcpSocketImpl>(this)));
-
-  NotifyNewConnectionCreated (this, m_peerAddress);
-}
-
-void NscTcpSocketImpl::ConnectionSucceeded ()
-{ // We would preferred to have scheduled an event directly to
-  // NotifyConnectionSucceeded, but (sigh) these are protected
-  // and we can get the address of it :(
-  struct sockaddr_in sin;
-  size_t sin_len = sizeof(sin);
-  if (0 == m_nscTcpSocket->getsockname ((struct sockaddr *) &sin, &sin_len)) {
-      m_localAddress = Ipv4Address::Deserialize ((const uint8_t*)&sin.sin_addr);
-      m_localPort = ntohs (sin.sin_port);
-    }
-
-  NS_LOG_LOGIC ("NscTcpSocketImpl " << this << " connected to "
-                                    << m_remoteAddress << ":" << m_remotePort
-                                    << " from " << m_localAddress << ":" << m_localPort);
-  NotifyConnectionSucceeded ();
-}
-
-
-bool NscTcpSocketImpl::Accept (void)
-{
-  if (m_state == CLOSED)
-    {  // Happens if application closes listening socket after Accept() was scheduled.
-      return false;
-    }
-  NS_ASSERT (m_state == LISTEN);
-
-  if (!m_nscTcpSocket->is_listening ())
-    {
-      return false;
-    }
-  INetStreamSocket *newsock;
-  int res = m_nscTcpSocket->accept (&newsock);
-  if (res != 0)
-    {
-      return false;
-    }
-// We could obtain a fromAddress using getpeername, but we've already
-// finished the tcp handshake here, i.e. this is a new connection
-// and not a connection request.
-// if (!NotifyConnectionRequest(fromAddress))
-//   return true;
-
-  // Clone the socket
-  Ptr<NscTcpSocketImpl> newSock = Copy ();
-  newSock->m_nscTcpSocket = newsock;
-  NS_LOG_LOGIC ("Cloned a NscTcpSocketImpl " << newSock);
-
-  Simulator::ScheduleNow (&NscTcpSocketImpl::CompleteFork, newSock);
-  return true;
-}
-
-bool NscTcpSocketImpl::ReadPendingData (void)
-{
-  if (m_state != ESTABLISHED)
-    {
-      return false;
-    }
-  int len, err;
-  uint8_t buffer[8192];
-  len = sizeof(buffer);
-  m_errno = ERROR_NOTERROR;
-  err = m_nscTcpSocket->read_data (buffer, &len);
-  if (err == 0 && len == 0)
-    {
-      NS_LOG_LOGIC ("ReadPendingData got EOF from socket");
-      m_state = CLOSE_WAIT;
-      return false;
-    }
-  m_errno = GetNativeNs3Errno (err);
-  switch (m_errno)
-    {
-    case ERROR_NOTERROR: break;   // some data was sent
-    case ERROR_AGAIN: return false;
-    default:
-      NS_LOG_WARN ("Error (" << err << ") " <<
-                   "during read_data, ns-3 errno set to" << m_errno);
-      m_state = CLOSED;
-      return false;
-    }
-
-  Ptr<Packet> p =  Create<Packet> (buffer, len);
-
-  m_deliveryQueue.push (p);
-  m_rxAvailable += p->GetSize ();
-
-  NotifyDataRecv ();
-  return true;
-}
-
-bool NscTcpSocketImpl::SendPendingData (void)
-{
-  NS_LOG_FUNCTION (this);
-  NS_LOG_LOGIC ("ENTERING SendPendingData");
-
-  if (m_txBuffer.empty ())
-    {
-      return false;
-    }
-
-  int ret;
-  size_t size, written = 0;
-
-  do {
-      NS_ASSERT (!m_txBuffer.empty ());
-      Ptr<Packet> &p = m_txBuffer.front ();
-      size = p->GetSize ();
-      NS_ASSERT (size > 0);
-
-      m_errno = ERROR_NOTERROR;
-
-      uint8_t *buf = new uint8_t[size];
-      p->CopyData (buf, size);
-      ret = m_nscTcpSocket->send_data ((const char *)buf, size);
-      delete[] buf;
-
-      if (ret <= 0)
-        {
-          break;
-        }
-      written += ret;
-
-      NS_ASSERT (m_txBufferSize >= (size_t)ret);
-      m_txBufferSize -= ret;
-
-      if ((size_t)ret < size)
-        {
-          p->RemoveAtStart (ret);
-          break;
-        }
-
-      m_txBuffer.pop ();
-
-      if (m_txBuffer.empty ())
-        {
-          if (m_closeOnEmpty)
-            {
-              m_nscTcpSocket->disconnect ();
-              m_state = CLOSED;
-            }
-          break;
-        }
-    } while ((size_t) ret == size);
-
-  if (written > 0)
-    {
-      NS_LOG_DEBUG ("Notifying data sent, remaining txbuffer size: " << m_txBufferSize);
-      Simulator::ScheduleNow (&NscTcpSocketImpl::NotifyDataSent, this, ret);
-      return true;
-    }
-  else
-    {
-      NS_LOG_DEBUG ("Not notifying data sent, return value " << ret);
-    }
-  return false;
-}
-
-Ptr<NscTcpSocketImpl> NscTcpSocketImpl::Copy ()
-{
-  return CopyObject<NscTcpSocketImpl> (this);
-}
-
-void
-NscTcpSocketImpl::SetSndBufSize (uint32_t size)
-{
-  m_sndBufSize = size;
-}
-
-uint32_t
-NscTcpSocketImpl::GetSndBufSize (void) const
-{
-  return m_sndBufSize;
-}
-
-void
-NscTcpSocketImpl::SetRcvBufSize (uint32_t size)
-{
-  m_rcvBufSize = size;
-}
-
-uint32_t
-NscTcpSocketImpl::GetRcvBufSize (void) const
-{
-  return m_rcvBufSize;
-}
-
-void
-NscTcpSocketImpl::SetSegSize (uint32_t size)
-{
-  m_segmentSize = size;
-}
-
-uint32_t
-NscTcpSocketImpl::GetSegSize (void) const
-{
-  return m_segmentSize;
-}
-
-void
-NscTcpSocketImpl::SetAdvWin (uint32_t window)
-{
-  m_advertisedWindowSize = window;
-}
-
-uint32_t
-NscTcpSocketImpl::GetAdvWin (void) const
-{
-  return m_advertisedWindowSize;
-}
-
-void
-NscTcpSocketImpl::SetInitialSSThresh (uint32_t threshold)
-{
-  m_initialSsThresh = threshold;
-}
-
-uint32_t
-NscTcpSocketImpl::GetInitialSSThresh (void) const
-{
-  return m_initialSsThresh;
-}
-
-void
-NscTcpSocketImpl::SetInitialCwnd (uint32_t cwnd)
-{
-  m_initialCWnd = cwnd;
-}
-
-uint32_t
-NscTcpSocketImpl::GetInitialCwnd (void) const
-{
-  return m_initialCWnd;
-}
-
-void 
-NscTcpSocketImpl::SetConnTimeout (Time timeout)
-{
-  m_cnTimeout = timeout;
-}
-
-Time
-NscTcpSocketImpl::GetConnTimeout (void) const
-{
-  return m_cnTimeout;
-}
-
-void 
-NscTcpSocketImpl::SetSynRetries (uint32_t count)
-{
-  m_synRetries = count;
-}
-
-uint32_t 
-NscTcpSocketImpl::GetSynRetries (void) const
-{
-  return m_synRetries;
-}
-
-void 
-NscTcpSocketImpl::SetDelAckTimeout (Time timeout)
-{
-  m_delAckTimeout = timeout;
-}
-
-void
-NscTcpSocketImpl::SetDataRetries (uint32_t retries)
-{
-  NS_LOG_FUNCTION (this << retries);
-  m_dataRetries = retries;
-}
-
-uint32_t
-NscTcpSocketImpl::GetDataRetries (void) const
-{
-  NS_LOG_FUNCTION (this);
-  return m_dataRetries;
-}
-
-Time
-NscTcpSocketImpl::GetDelAckTimeout (void) const
-{
-  return m_delAckTimeout;
-}
-
-void
-NscTcpSocketImpl::SetDelAckMaxCount (uint32_t count)
-{
-  m_delAckMaxCount = count;
-}
-
-uint32_t
-NscTcpSocketImpl::GetDelAckMaxCount (void) const
-{
-  return m_delAckMaxCount;
-}
-
-void
-NscTcpSocketImpl::SetTcpNoDelay (bool noDelay)
-{
-  m_noDelay = noDelay;
-}
-
-bool
-NscTcpSocketImpl::GetTcpNoDelay (void) const
-{
-  return m_noDelay;
-}
-
-void 
-NscTcpSocketImpl::SetPersistTimeout (Time timeout)
-{
-  m_persistTimeout = timeout;
-}
-
-Time
-NscTcpSocketImpl::GetPersistTimeout (void) const
-{
-  return m_persistTimeout;
-}
-
-enum Socket::SocketErrno
-NscTcpSocketImpl::GetNativeNs3Errno (int error) const
-{
-  enum nsc_errno err;
-
-  if (error >= 0)
-    {
-      return ERROR_NOTERROR;
-    }
-  err = (enum nsc_errno) error;
-  switch (err)
-    {
-    case NSC_EADDRINUSE:   // fallthrough
-    case NSC_EADDRNOTAVAIL: return ERROR_AFNOSUPPORT;
-    case NSC_EINPROGRESS:   // Although nsc sockets are nonblocking, we pretend they're not.
-    case NSC_EAGAIN: return ERROR_AGAIN;
-    case NSC_EISCONN:   // fallthrough
-    case NSC_EALREADY: return ERROR_ISCONN;
-    case NSC_ECONNREFUSED: return ERROR_NOROUTETOHOST;   /// \todo better mapping?
-    case NSC_ECONNRESET:   // for no, all of these fall through
-    case NSC_EHOSTDOWN:
-    case NSC_ENETUNREACH:
-    case NSC_EHOSTUNREACH: return ERROR_NOROUTETOHOST;
-    case NSC_EMSGSIZE: return ERROR_MSGSIZE;
-    case NSC_ENOTCONN: return ERROR_NOTCONN;
-    case NSC_ESHUTDOWN: return ERROR_SHUTDOWN;
-    case NSC_ETIMEDOUT: return ERROR_NOTCONN;   /// \todo this mapping isn't correct
-    case NSC_ENOTDIR:   // used by eg. sysctl(2). Shouldn't happen normally,
-    // but is triggered by e.g. show_config().
-    case NSC_EUNKNOWN: return ERROR_INVAL;   // Catches stacks that 'return -1' without real mapping
-    }
-  NS_ASSERT_MSG (0, "Unknown NSC error");
-  return ERROR_INVAL;
-}
-
-bool
-NscTcpSocketImpl::SetAllowBroadcast (bool allowBroadcast)
-{
-  if (allowBroadcast)
-    {
-      return false;
-    }
-  return true;
-}
-
-bool
-NscTcpSocketImpl::GetAllowBroadcast () const
-{
-  return false;
-}
-
-} // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/model/nsc-tcp-socket-impl.h ns-3.36/src/internet/model/nsc-tcp-socket-impl.h
--- ns-3.35/src/internet/model/nsc-tcp-socket-impl.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/model/nsc-tcp-socket-impl.h	1969-12-31 16:00:00.000000000 -0800
@@ -1,277 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-#ifndef NSC_TCP_SOCKET_IMPL_H
-#define NSC_TCP_SOCKET_IMPL_H
-
-#include <stdint.h>
-#include <queue>
-#include <vector>
-
-#include "ns3/callback.h"
-#include "ns3/traced-value.h"
-#include "ns3/tcp-socket.h"
-#include "ns3/ptr.h"
-#include "ns3/ipv4-address.h"
-#include "ns3/inet-socket-address.h"
-#include "ns3/event-id.h"
-#include "pending-data.h"
-#include "ns3/sequence-number.h"
-
-struct INetStreamSocket;
-
-namespace ns3 {
-
-class Ipv4EndPoint;
-class Node;
-class Packet;
-class NscTcpL4Protocol;
-class TcpHeader;
-
-/**
- * \ingroup socket
- * \ingroup nsctcp
- *
- * \brief Socket logic for the NSC TCP sockets.
- * 
- * Most of the TCP internal
- * logic is handled by the NSC tcp library itself; this class maps ns3::Socket
- * calls to the NSC TCP library.
- */
-class NscTcpSocketImpl : public TcpSocket
-{
-public:
-  /**
-   * \brief Get the type ID.
-   * \return the object TypeId
-   */
-  static TypeId GetTypeId (void);
-  /**
-   * Create an unbound tcp socket.
-   */
-  NscTcpSocketImpl ();
-
-  /**
-   * Clone a TCP socket, for use upon receiving a connection request in LISTEN state
-   *
-   * \param sock the original Tcp Socket
-   */
-  NscTcpSocketImpl (const NscTcpSocketImpl& sock);
-  virtual ~NscTcpSocketImpl ();
-
-  /**
-   * \brief Set the associated node.
-   * \param node the node
-   */
-  void SetNode (Ptr<Node> node);
-
-  /**
-   * \brief Set the associated TCP L4 protocol.
-   * \param tcp the TCP L4 protocol
-   */
-  void SetTcp (Ptr<NscTcpL4Protocol> tcp);
-
-  virtual enum SocketErrno GetErrno (void) const;
-  virtual enum SocketType GetSocketType (void) const;
-  virtual int GetPeerName (Address &address) const;
-  virtual Ptr<Node> GetNode (void) const;
-  virtual int Bind (void);
-  virtual int Bind6 (void);
-  virtual int Bind (const Address &address);
-  virtual int Close (void);
-  virtual int ShutdownSend (void);
-  virtual int ShutdownRecv (void);
-  virtual int Connect (const Address &address);
-  virtual int Listen (void);
-  virtual uint32_t GetTxAvailable (void) const;
-  virtual int Send (Ptr<Packet> p, uint32_t flags);
-  virtual int SendTo (Ptr<Packet> p, uint32_t flags, const Address &toAddress);
-  virtual uint32_t GetRxAvailable (void) const;
-  virtual Ptr<Packet> Recv (uint32_t maxSize, uint32_t flags);
-  virtual Ptr<Packet> RecvFrom (uint32_t maxSize, uint32_t flags,
-                                Address &fromAddress);
-  virtual int GetSockName (Address &address) const; 
-  virtual bool SetAllowBroadcast (bool allowBroadcast);
-  virtual bool GetAllowBroadcast () const;
-  virtual void BindToNetDevice (Ptr<NetDevice> netdevice); // NetDevice with my m_endPoint
-
-private:
-  /**
-   * \brief Called by NscTcpSocketImpl::ForwardUp()
-   *
-   * Actually performs the ForwardUp operations
-   */
-  void NSCWakeup (void);
-  /**
-   * \brief Tcp friend class.
-   * \relates Tcp
-   */
-  friend class Tcp;
-  // invoked by Tcp class
-  /**
-   * Finish the binding process
-   * \returns 0 on success, -1 on failure
-   */
-  int FinishBind (void);
-  /**
-   * \brief Called by the L3 protocol when it received a packet to pass on to TCP.
-   *
-   * \param p the incoming packet
-   * \param header the packet's IPv4 header
-   * \param port the incoming port
-   * \param incomingInterface the incoming interface
-   */
-  void ForwardUp (Ptr<Packet> p, Ipv4Header header, uint16_t port, 
-                  Ptr<Ipv4Interface> incomingInterface);
-  /**
-   * \brief Kill this socket by zeroing its attributes (IPv4)
-   *
-   * This is a callback function configured to m_endpoint in
-   * SetupCallback(), invoked when the endpoint is destroyed.
-   */
-  void Destroy (void);
-  //methods for state
-  /**
-   * \brief Send all the pending data
-   * \returns true on success
-   */
-  bool SendPendingData (void);
-  /**
-   * \brief Read all the pending data
-   * \returns true on success
-   */
-  bool ReadPendingData (void);
-  /**
-   * \brief Accept an incoming connection
-   * \returns true on success
-   */
-  bool Accept (void);
-  /**
-   * \brief Complete the Fork operations (after a connection has been accepted)
-   */
-  void CompleteFork (void);
-
-  /**
-   * \brief Called when a connection is in Established state
-   */
-  void ConnectionSucceeded ();
-
-  // Manage data tx/rx
-  // \todo This should be virtual and overridden
-  /**
-   * \brief Copy self
-   * \returns a copy of self
-   */
-  Ptr<NscTcpSocketImpl> Copy ();
-
-  // attribute related
-  virtual void SetSndBufSize (uint32_t size);
-  virtual uint32_t GetSndBufSize (void) const;
-  virtual void SetRcvBufSize (uint32_t size);
-  virtual uint32_t GetRcvBufSize (void) const;
-  virtual void SetSegSize (uint32_t size);
-  virtual uint32_t GetSegSize (void) const;
-  /**
-   * \brief Set the Advertised Window size
-   * \param window the window size
-   */
-  virtual void SetAdvWin (uint32_t window);
-  /**
-   * \brief Get the Advertised Window size
-   * \returns the window size
-   */
-  virtual uint32_t GetAdvWin (void) const;
-  virtual void SetInitialSSThresh (uint32_t threshold);
-  virtual uint32_t GetInitialSSThresh (void) const;
-  virtual void SetInitialCwnd (uint32_t cwnd);
-  virtual uint32_t GetInitialCwnd (void) const;
-  virtual void SetConnTimeout (Time timeout);
-  virtual Time GetConnTimeout (void) const;
-  virtual uint32_t GetSynRetries (void) const;
-  virtual void SetSynRetries (uint32_t count);
-  virtual void SetDataRetries (uint32_t retries);
-  virtual uint32_t GetDataRetries (void) const;
-  virtual void SetDelAckTimeout (Time timeout);
-  virtual Time GetDelAckTimeout (void) const;
-  virtual void SetDelAckMaxCount (uint32_t count);
-  virtual uint32_t GetDelAckMaxCount (void) const;
-  virtual void SetTcpNoDelay (bool noDelay);
-  virtual bool GetTcpNoDelay (void) const;
-  virtual void SetPersistTimeout (Time timeout);
-  virtual Time GetPersistTimeout (void) const;
-
-  /**
-   * \brief Translate between a NSC error and a ns-3 error code
-   * \param err NSC error
-   * \returns ns-3 error code
-   */
-  enum Socket::SocketErrno GetNativeNs3Errno (int err) const;
-  uint32_t m_delAckMaxCount;  //!< Number of packet to fire an ACK before delay timeout
-  Time m_delAckTimeout;       //!< Time to delay an ACK
-  bool m_noDelay;             //!< Disable ACk delay
-
-  Ipv4EndPoint *m_endPoint;     //!< the IPv4 endpoint
-  Ptr<Node> m_node;             //!< the associated node
-  Ptr<NscTcpL4Protocol> m_tcp;  //!< the associated TCP L4 protocol
-  Ipv4Address m_remoteAddress;  //!< peer IP address
-  uint16_t m_remotePort;        //!< peer port
-  //these two are so that the socket/endpoint cloning works
-  Ipv4Address m_localAddress;   //!< local address
-  uint16_t m_localPort;         //!< local port
-  InetSocketAddress m_peerAddress; //!< peer IP and port
-  mutable enum SocketErrno m_errno; //!< last error number
-  bool m_shutdownSend;          //!< Send no longer allowed
-  bool m_shutdownRecv;          //!< Receive no longer allowed
-  bool m_connected;             //!< Connection established
-
-  //manage the state information
-  TracedValue<TcpStates_t> m_state; //!< state information
-  bool m_closeOnEmpty;              //!< true if socket will close when buffer is empty
-
-  //needed to queue data when in SYN_SENT state
-  std::queue<Ptr<Packet> > m_txBuffer; //!< transmission buffer
-  uint32_t m_txBufferSize;             //!< transmission buffer size
-
-  // Window management
-  uint32_t                       m_segmentSize;          //!< SegmentSize
-  uint32_t                       m_rxWindowSize;         //!< Receive window size
-  uint32_t                       m_advertisedWindowSize; //!< Window to advertise
-  TracedValue<uint32_t>          m_cWnd;                 //!< Congestion window
-  TracedValue<uint32_t>          m_ssThresh;             //!< Slow Start Threshold
-  uint32_t                       m_initialCWnd;          //!< Initial cWnd value
-  uint32_t                       m_initialSsThresh;      //!< Initial Slow Start Threshold
-
-  // Round trip time estimation
-  Time m_lastMeasuredRtt; //!< Last measured RTT
-
-  // Timer-related members
-  Time              m_cnTimeout;       //!< Timeout for connection retry
-  uint32_t          m_synRetries;      //!< Count of remaining connection retries
-  uint32_t          m_dataRetries;     //!< Count of remaining data retransmission attempts
-  Time              m_persistTimeout;  //!< Time between sending 1-byte probes
-
-  // Temporary queue for delivering data to application
-  std::queue<Ptr<Packet> > m_deliveryQueue; //!< receive buffer
-  uint32_t m_rxAvailable;                   //!< receive buffer available size
-  INetStreamSocket* m_nscTcpSocket;         //!< the real NSC TCP socket
-
-  // Attributes
-  uint32_t m_sndBufSize;   //!< buffer limit for the outgoing queue
-  uint32_t m_rcvBufSize;   //!< maximum receive socket buffer size
-};
-
-} // namespace ns3
-
-#endif /* NSC_TCP_SOCKET_IMPL_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/model/rip.cc ns-3.36/src/internet/model/rip.cc
--- ns-3.35/src/internet/model/rip.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/model/rip.cc	2022-04-30 18:23:57.870733500 -0700
@@ -23,7 +23,6 @@
 #include "ns3/log.h"
 #include "ns3/abort.h"
 #include "ns3/assert.h"
-#include "ns3/unused.h"
 #include "ns3/random-variable-stream.h"
 #include "ns3/ipv4-route.h"
 #include "ns3/node.h"
@@ -205,7 +204,7 @@
       NS_LOG_LOGIC ("RouteOutput (): Multicast destination");
     }
 
-  rtentry = Lookup (destination, oif);
+  rtentry = Lookup (destination, true, oif);
   if (rtentry)
     {
       sockerr = Socket::ERROR_NOTERROR;
@@ -276,7 +275,7 @@
     }
   // Next, try to find a route
   NS_LOG_LOGIC ("Unicast destination");
-  Ptr<Ipv4Route> rtentry = Lookup (header.GetDestination ());
+  Ptr<Ipv4Route> rtentry = Lookup (header.GetDestination (), false);
 
   if (rtentry != 0)
     {
@@ -582,8 +581,7 @@
   Ipv4RoutingProtocol::DoDispose ();
 }
 
-
-Ptr<Ipv4Route> Rip::Lookup (Ipv4Address dst, Ptr<NetDevice> interface)
+Ptr<Ipv4Route> Rip::Lookup (Ipv4Address dst, bool setSource, Ptr<NetDevice> interface)
 {
   NS_LOG_FUNCTION (this << dst << interface);
 
@@ -633,13 +631,16 @@
                   uint32_t interfaceIdx = route->GetInterface ();
                   rtentry = Create<Ipv4Route> ();
 
-                  if (route->GetDest ().IsAny ()) /* default route */
-                    {
-                      rtentry->SetSource (m_ipv4->SourceAddressSelection (interfaceIdx, route->GetGateway ()));
-                    }
-                  else
+                  if (setSource)
                     {
-                      rtentry->SetSource (m_ipv4->SourceAddressSelection (interfaceIdx, route->GetDest ()));
+                      if (route->GetDest ().IsAny ()) /* default route */
+                        {
+                          rtentry->SetSource (m_ipv4->SourceAddressSelection (interfaceIdx, route->GetGateway ()));
+                        }
+                      else
+                        {
+                          rtentry->SetSource (m_ipv4->SourceAddressSelection (interfaceIdx, route->GetDest ()));
+                        }
                     }
 
                   rtentry->SetDestination (route->GetDest ());
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/model/rip.h ns-3.36/src/internet/model/rip.h
--- ns-3.35/src/internet/model/rip.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/model/rip.h	2022-04-30 18:23:57.870733500 -0700
@@ -305,10 +305,11 @@
   /**
    * \brief Lookup in the forwarding table for destination.
    * \param dest destination address
+   * \param setSource set source address in the route
    * \param interface output interface if any (put 0 otherwise)
    * \return Ipv4Route to route the packet to reach dest address
    */
-  Ptr<Ipv4Route> Lookup (Ipv4Address dest, Ptr<NetDevice> = 0);
+  Ptr<Ipv4Route> Lookup (Ipv4Address dest, bool setSource, Ptr<NetDevice> = 0);
 
   /**
    * Receive and process unicast packet
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/model/ripng.cc ns-3.36/src/internet/model/ripng.cc
--- ns-3.35/src/internet/model/ripng.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/model/ripng.cc	2022-04-30 18:23:57.874733700 -0700
@@ -23,7 +23,6 @@
 #include "ns3/log.h"
 #include "ns3/abort.h"
 #include "ns3/assert.h"
-#include "ns3/unused.h"
 #include "ns3/random-variable-stream.h"
 #include "ns3/ipv6-route.h"
 #include "ns3/node.h"
@@ -197,7 +196,7 @@
       NS_LOG_LOGIC ("RouteOutput (): Multicast destination");
     }
 
-  rtentry = Lookup (destination, oif);
+  rtentry = Lookup (destination, true, oif);
   if (rtentry)
     {
       sockerr = Socket::ERROR_NOTERROR;
@@ -250,7 +249,7 @@
     }
   // Next, try to find a route
   NS_LOG_LOGIC ("Unicast destination");
-  Ptr<Ipv6Route> rtentry = Lookup (header.GetDestination ());
+  Ptr<Ipv6Route> rtentry = Lookup (header.GetDestination (), false);
 
   if (rtentry != 0)
     {
@@ -555,8 +554,7 @@
   Ipv6RoutingProtocol::DoDispose ();
 }
 
-
-Ptr<Ipv6Route> RipNg::Lookup (Ipv6Address dst, Ptr<NetDevice> interface)
+Ptr<Ipv6Route> RipNg::Lookup (Ipv6Address dst, bool setSource, Ptr<NetDevice> interface)
 {
   NS_LOG_FUNCTION (this << dst << interface);
 
@@ -606,17 +604,20 @@
                   uint32_t interfaceIdx = route->GetInterface ();
                   rtentry = Create<Ipv6Route> ();
 
-                  if (route->GetGateway ().IsAny ())
-                    {
-                      rtentry->SetSource (m_ipv6->SourceAddressSelection (interfaceIdx, route->GetDest ()));
-                    }
-                  else if (route->GetDest ().IsAny ()) /* default route */
-                    {
-                      rtentry->SetSource (m_ipv6->SourceAddressSelection (interfaceIdx, route->GetPrefixToUse ().IsAny () ? dst : route->GetPrefixToUse ()));
-                    }
-                  else
+                  if (setSource)
                     {
-                      rtentry->SetSource (m_ipv6->SourceAddressSelection (interfaceIdx, route->GetDest ()));
+                      if (route->GetGateway ().IsAny ())
+                        {
+                          rtentry->SetSource (m_ipv6->SourceAddressSelection (interfaceIdx, route->GetDest ()));
+                        }
+                      else if (route->GetDest ().IsAny ()) /* default route */
+                        {
+                          rtentry->SetSource (m_ipv6->SourceAddressSelection (interfaceIdx, route->GetPrefixToUse ().IsAny () ? dst : route->GetPrefixToUse ()));
+                        }
+                      else
+                        {
+                          rtentry->SetSource (m_ipv6->SourceAddressSelection (interfaceIdx, route->GetDest ()));
+                        }
                     }
 
                   rtentry->SetDestination (route->GetDest ());
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/model/ripng.h ns-3.36/src/internet/model/ripng.h
--- ns-3.35/src/internet/model/ripng.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/model/ripng.h	2022-04-30 18:23:57.874733700 -0700
@@ -310,10 +310,11 @@
   /**
    * \brief Lookup in the forwarding table for destination.
    * \param dest destination address
+   * \param setSource set source address in the route
    * \param interface output interface if any (put 0 otherwise)
    * \return Ipv6Route to route the packet to reach dest address
    */
-  Ptr<Ipv6Route> Lookup (Ipv6Address dest, Ptr<NetDevice> = 0);
+  Ptr<Ipv6Route> Lookup (Ipv6Address dest, bool setSource, Ptr<NetDevice> = 0);
 
   /**
    * Receive and process unicast packet
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/model/sim_errno.h ns-3.36/src/internet/model/sim_errno.h
--- ns-3.35/src/internet/model/sim_errno.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/model/sim_errno.h	1969-12-31 16:00:00.000000000 -0800
@@ -1,61 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2008 INRIA
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Mathieu Lacage <mathieu.lacage@cutebugs.net>
- */
-
-#ifndef NSC_SIM_ERRNO_H
-#define NSC_SIM_ERRNO_H
-
-/**
- * \ingroup nsctcp
- *
- * List of network stack errors that may happen in a simulation,
- * and can be handled by the simulator in a sane way.
- *
- * Note that NSC handles several errors internally though
- * nsc_assert, BUG() and friends, because they (should) never
- * happen in a simulation (e.g. ESOCKTNOSUPPORT).
- *
- * These values are returned by the various methods provided by nsc.
- * They must always be < 0, as values >= 0 are a success indicator;
- * e.g. send_data() will return the number of bytes sent or one of
- * the nsc_errno numbers below, accept() will return 0 on success or
- * one of the nsc_errno numbers below, etc.
- *
- */
-enum nsc_errno {
-  NSC_EUNKNOWN = -1,
-  NSC_EADDRINUSE = -10,
-  NSC_EADDRNOTAVAIL = -11,
-  NSC_EAGAIN = -12,
-  NSC_EALREADY = -25,
-  NSC_ECONNREFUSED = -32,
-  NSC_ECONNRESET = -33,
-  NSC_EHOSTDOWN = -50,
-  NSC_EHOSTUNREACH = -51,
-  NSC_EINPROGRESS = -60,
-  NSC_EISCONN = -61,
-  NSC_EMSGSIZE = -70,
-  NSC_ENETUNREACH = -82,
-  NSC_ENOTCONN = -86,
-  NSC_ENOTDIR = -87,        // used by sysctl(2)
-  NSC_ESHUTDOWN = -130,
-  NSC_ETIMEDOUT = -140,
-};
-
-#endif /* NSC_SIM_ERRNO_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/model/sim_interface.h ns-3.36/src/internet/model/sim_interface.h
--- ns-3.35/src/internet/model/sim_interface.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/model/sim_interface.h	1969-12-31 16:00:00.000000000 -0800
@@ -1,436 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
-  Network Simulation Cradle
-  Copyright (C) 2003-2005 Sam Jansen
-
-  This program is free software; you can redistribute it and/or modify it
-  under the terms of the GNU General Public License as published by the Free
-  Software Foundation; either version 2 of the License, or (at your option)
-  any later version.
-
-  This program is distributed in the hope that it will be useful, but WITHOUT
-  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-  FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
-  more details.
-
-  You should have received a copy of the GNU General Public License along
-  with this program; if not, write to the Free Software Foundation, Inc., 59
-  Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-*/
-
-#ifndef NSC_SIM_INTERFACE_H
-#define NSC_SIM_INTERFACE_H
-
-#define NSC_VERSION 0x000500
-
-/**
- * \ingroup nsctcp
- * \brief Struct interface to NSC stack
- */
-struct INetStack
-{
-  virtual ~INetStack() {}
-
-  /**
-   * \brief Initialize the stack
-   * \param hz timer_interrupt frequency
-   */
-  virtual void init (int hz) = 0;
-
-  /**
-   * \brief Deliver complete packet to the NSC network stack
-   * \param if_id interface ID
-   * \param data data
-   * \param datalen data length
-   */
-  virtual void if_receive_packet (int if_id, const void *data, int datalen) = 0;
-  /**
-   * \brief Send complete packet to the NSC network stack
-   * \param data data
-   * \param datalen data length
-   */
-  virtual void if_send_packet (const void *data, int datalen) = 0;
-  /**
-   * \brief Signal the completion of send procedure to the NSC network stack
-   * \param if_id interface ID
-   */
-  virtual void if_send_finish (int if_id) = 0;
-
-  /**
-   * \brief Attach an interface to the stack
-   * \param addr address
-   * \param mask network mask
-   * \param mtu MTU
-   */
-  virtual void if_attach (const char *addr, const char *mask, int mtu) = 0;
-  /**
-   * \brief Add a default gateway to the interface
-   * \param addr gateway address
-   */
-  virtual void add_default_gateway (const char *addr) = 0;
-
-  /**
-   * \brief Returns the internal id of the stack instance.
-   *
-   * Purely for debugging/diagnostic purposes.
-   * \return internal stack id
-   */
-  virtual int get_id () = 0;
-
-  /**
-   * \brief Return a short one-word name of the stack
-   *
-   * Should return a short one-word name of the stack. Eg. Linux 2.4.x ->
-   * linux24, FreeBSD 5.x -> freebsd5. This can be used to identify output
-   * from a stack, for example a packet trace file.
-   * \return short one-word name of the stack
-   */
-  virtual const char *get_name () = 0;
-
-  /**
-   * \brief Get the timer_interrupt frequency
-   *
-   * This is used so the simulator can call the stack timer_interrupt function
-   * the correct amount of times per second. For example, lwip has a hz of 10,
-   * which it returns here to say that it's timer_interrupt should be called
-   * 10 times a second. FreeBSD uses 100, as does Linux 2.4, while Linux 2.6
-   * uses 1000. (This is often configurable in the kernel in question, also.)
-   *
-   * \return frequency
-   */
-  virtual int get_hz () = 0;
-
-  /**
-   * \brief The stack timer_interrupt function
-   */
-  virtual void timer_interrupt () = 0;
-
-  /**
-   * \brief Increment the time ticks
-   */
-  virtual void increment_ticks () = 0;
-
-  /**
-   * \brief Set the buffer size
-   * \param size the buffer size.
-   */
-  virtual void buffer_size (int size) = 0;
-
-  /**
-   * \brief Create a new UDP socket
-   * \returns A new UDP socket.
-   */
-  virtual struct INetDatagramSocket *new_udp_socket () { return NULL; }
-  /**
-   * \brief Create a new TCP socket
-   * \returns A new TCP socket.
-   */
-  virtual struct INetStreamSocket *new_tcp_socket () { return NULL; }
-  /**
-   * \brief Create a new SCTP socket
-   * \returns A new SCTP socket.
-   */
-  virtual struct INetStreamSocket *new_sctp_socket () { return NULL; }
-
-  // The following I've made optional to implement for now. Eases
-  // integration of new features.
-  /**
-   * \brief use sysctl to modify system parameters
-   * \param sysctl_name name of the parameter to modify
-   * \param oldval old value
-   * \param oldlenp old value length
-   * \param newval new value
-   * \param newlen new value length
-   * \returns The status code.
-   */
-  virtual int sysctl (const char *sysctl_name, void *oldval, size_t *oldlenp,
-                      void *newval, size_t newlen)
-  {
-    return -1;
-  }
-
-  // alternate, simpler interface. the stack cradle code is expected
-  // to convert the string-value to something that the stack can handle.
-  // The idea here is that this is a front-end to the sysctl(2) call,
-  // much like the sysctl(8) program.
-  /**
-   * \brief Set system parameters using sysctl
-   * \param name name of the parameter to modify
-   * \param value new value
-   * \returns
-   */
-  virtual int sysctl_set (const char *name, const char *value)
-  {
-    return -1;
-  }
-
-  // same as above, cradle code is expected to convert the sysctl value
-  // into a string.
-  // returns length of the string in value, i.e. retval > len: 'output truncated'.
-  /**
-   * \brief Get system parameters using sysctl
-   * \param name name of the parameter to modify
-   * \param value value
-   * \param len value length
-   * \returns length of the string in value, i.e. retval > len: 'output truncated'.
-   */
-  virtual int sysctl_get (const char *name, char *value, size_t len)
-  {
-    return -1;
-  }
-
-  /**
-   * \brief Tell the cradle code to put the name of sysctl number 'idx' into name[].
-   *
-   * The idea is that this can be used to get a list of all available sysctls:
-   * \verbatim
-     char buf[256]
-     for (i=0; sysctl_getnum(i, buf, sizeof(buf)) > 0 ;i++)
-        puts(buf);
-     \endverbatim
-   *
-   * \param idx index
-   * \param name sysctl name
-   * \param len sysctl length
-   * \returns -1 if idx is out of range and the length of the sysctl name otherwise.
-   */
-  virtual int sysctl_getnum (size_t idx, char *name, size_t len)
-  {
-    return -1;
-  }
-
-  /**
-   * \brief Show the NSC configuration
-   */
-  virtual void show_config ()
-  {
-    ;
-  }
-
-  /**
-   * \brief Optional function to get variables for this stack
-   * \param var the variable
-   * \param result the result
-   * \param result_len result length
-   * \returns true on success
-   */
-  virtual bool get_var (const char *var, char *result, int result_len)
-  {
-    return false;
-  }
-
-  /**
-   * \brief Optional function to set variables for this stack
-   * \param var the variable
-   * \param val the new value
-   * \returns true on success
-   */
-  virtual bool set_var (const char *var, const char *val)
-  {
-    return false;
-  }
-
-  /**
-   * \brief Set the level of debugging or diagnostic information to print out.
-   *
-   * This normally means kernel messages printed out during initialisation but
-   * may also include extra debugging messages that are part of NSC.
-   *
-   * \param level debugging/diagnostic level
-   */
-  virtual void set_diagnostic (int level) {}
-
-  /**
-   * \brief Simple interface to support sending any textual command to a stack
-   *
-   * @returns 0 on success
-   */
-  virtual int cmd (const char *)
-  {
-    return 1;
-  }
-};
-
-/**
- * \ingroup nsctcp
- * \brief Struct interface to NSC Stream (i.e., TCP) Sockets
- */
-struct INetStreamSocket
-{
-  virtual ~INetStreamSocket() {}
-
-  /**
-   * \brief Connect to a remote peer
-   */
-  virtual void connect (const char *, int) = 0;
-  /**
-   * \brief Disconnect from a remote peer
-   */
-  virtual void disconnect () = 0;
-  /**
-   * \brief Put the socket in Listening state on a port
-   */
-  virtual void listen (int) = 0;
-  /**
-   * \brief Accept an incoming connection
-   * \param handler a handler to the INetStreamSocket.
-   * \returns The status code.
-   */
-  virtual int accept (INetStreamSocket **handler) = 0;
-  /**
-   * \brief Send some data
-   * \param data the data
-   * \param datalen data length
-   * \return the number of data sent or -1 on error
-   */
-  virtual int send_data (const void *data, int datalen) = 0;
-  /**
-   * \brief Read some data
-   * \param buf the buffer to store the data
-   * \param buflen buffer length
-   * \return the number of data read or -1 on error
-   */
-  virtual int read_data (void *buf, int *buflen) = 0;
-  /**
-   * \brief Set the socket options
-   *
-   * We need to pass the option name in as a string here. The reason for
-   * this is that different operating systems you compile on will have
-   * different numbers defined for the constants SO_SNDBUF and so on.
-   *
-   * \param optname name of the option
-   * \param val option value
-   * \param valsize size of the option value
-   * \returns
-   */
-  virtual int setsockopt (char *optname, void *val, size_t valsize) = 0;
-  /**
-   * \brief Print the socket state
-   */
-  virtual void print_state (FILE *) = 0;
-  /**
-   * \brief Check the connection state
-   * \returns true if socket is in connected state
-   */
-  virtual bool is_connected () = 0;
-  /**
-   * \brief Check the listening state
-   * \returns true if socket is in listening state
-   */
-  virtual bool is_listening () = 0;
-  /**
-   * \brief Get the peer name
-   *
-   * \note not implemented
-   *
-   * \param sa sockaddr structure to fill
-   * \param salen sockaddr structure length
-   * \returns -1 on error (always returns -1)
-   */
-  virtual int getpeername (struct sockaddr *sa, size_t *salen) {
-    return -1;
-  }
-  /**
-   * \brief Get the socket local name
-   *
-   * \note not implemented
-   *
-   * \param sa sockaddr structure to fill
-   * \param salen sockaddr structure length
-   * \returns -1 on error (always returns -1)
-   */
-  virtual int getsockname (struct sockaddr *sa, size_t *salen) {
-    return -1;
-  }
-  /**
-   * \brief Optional function used to get variables for this TCP connection.
-   *
-   * \note not implemented
-   *
-   * \param var variable requested
-   * \param result result result
-   * \param result_len result length
-   * \return always false
-   */
-  virtual bool get_var (const char *var, char *result, int result_len)
-  {
-    return false;
-  }
-  /**
-   * \brief Optional function used to set variables for this TCP connection.
-   *
-   * \note not implemented
-   *
-   * \param var variable to set
-   * \param val value to set
-   * \return always false
-   */
-  virtual bool set_var (const char *var, const char *val)
-  {
-    return false;
-  }
-};
-
-/**
- * \ingroup nsctcp
- * \brief Struct interface to NSC Datagram (i.e., UDP) Sockets
- */
-struct INetDatagramSocket
-{
-  virtual ~INetDatagramSocket() {}
-
-  /**
-   * \brief Set the destination address and port
-   */
-  virtual void set_destination (const char *, int) = 0;
-  /**
-   * \brief Send a datagram
-   * \param data the data
-   * \param datalen data length
-   */
-  virtual void send_data (const void *data, int datalen) = 0;
-};
-
-/**
- * \ingroup nsctcp
- * \brief Struct interface to NSC send capabilities
- */
-struct ISendCallback
-{
-  virtual ~ISendCallback() {}
-
-  /**
-   * \brief Invoked by NSCs 'ethernet driver' to re-inject a packet into ns-3.
-   * \param data the data.
-   * \param datalen the data length.
-   */
-  virtual void send_callback (const void *data, int datalen) = 0;
-};
-
-/**
- * \ingroup nsctcp
- * \brief Struct interface to NSC soft interrupt capabilities
- */
-struct IInterruptCallback
-{
-  virtual ~IInterruptCallback() {}
-
-  /**
-   * \brief Called by the NSC stack whenever something of interest has happened
-   */
-  virtual void wakeup () = 0;
-  /**
-   * \brief Get the actual time
-   */
-  virtual void gettime (unsigned int *, unsigned int *) = 0;
-};
-
-typedef int (*FRandom)();
-typedef INetStack *(*FCreateStack)(ISendCallback *, IInterruptCallback *, 
-                                   FRandom);
-
-#define CREATE_STACK_FUNC(a,b,c) extern "C" INetStack *nsc_create_stack ( \
-    ISendCallback *a, IInterruptCallback *b, FRandom c)
-
-#endif /* NSC_SIM_INTERFACE_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/model/tcp-bbr.h ns-3.36/src/internet/model/tcp-bbr.h
--- ns-3.35/src/internet/model/tcp-bbr.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/model/tcp-bbr.h	2022-04-30 18:23:57.874733700 -0700
@@ -33,6 +33,14 @@
 
 namespace ns3 {
 
+/**
+ * \ingroup congestionOps
+ *
+ * \brief BBR congestion control algorithm
+ * 
+ * This class implement the BBR (Bottleneck Bandwidth and Round-trip propagation time)
+ * congestion control type.
+ */
 class TcpBbr : public TcpCongestionOps
 {
 public:
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/model/tcp-congestion-ops.cc ns-3.36/src/internet/model/tcp-congestion-ops.cc
--- ns-3.35/src/internet/model/tcp-congestion-ops.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/model/tcp-congestion-ops.cc	2022-04-30 18:23:57.874733700 -0700
@@ -82,12 +82,10 @@
 
 void
 TcpCongestionOps::CongControl (Ptr<TcpSocketState> tcb,
-                               const TcpRateOps::TcpRateConnection &rc,
-                               const TcpRateOps::TcpRateSample &rs)
+                               [[maybe_unused]] const TcpRateOps::TcpRateConnection &rc,
+                               [[maybe_unused]] const TcpRateOps::TcpRateSample &rs)
 {
   NS_LOG_FUNCTION (this << tcb);
-  NS_UNUSED (rc);
-  NS_UNUSED (rs);
 }
 
 // RENO
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/model/tcp-congestion-ops.h ns-3.36/src/internet/model/tcp-congestion-ops.h
--- ns-3.35/src/internet/model/tcp-congestion-ops.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/model/tcp-congestion-ops.h	2022-04-30 18:23:57.874733700 -0700
@@ -79,9 +79,8 @@
    *
    * \param tcb internal congestion state
    */
-  virtual void Init (Ptr<TcpSocketState> tcb)
+  virtual void Init ([[maybe_unused]] Ptr<TcpSocketState> tcb)
     {
-      NS_UNUSED (tcb);
     }
 
   /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/model/tcp-cubic.h ns-3.36/src/internet/model/tcp-cubic.h
--- ns-3.35/src/internet/model/tcp-cubic.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/model/tcp-cubic.h	2022-04-30 18:23:57.874733700 -0700
@@ -43,7 +43,7 @@
  * Following the Linux implementation, we included the Hybrid Slow Start,
  * that effectively prevents the overshooting of slow start
  * while maintaining a full utilization of the network. This new type of slow
- * start can be disabled through the \Attribute{HyStart} attribute.
+ * start can be disabled through the HyStart attribute.
  *
  * CUBIC TCP is implemented and used by default in Linux kernels 2.6.19
  * and above; this version follows the implementation in Linux 3.14, which
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/model/tcp-l4-protocol.h ns-3.36/src/internet/model/tcp-l4-protocol.h
--- ns-3.35/src/internet/model/tcp-l4-protocol.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/model/tcp-l4-protocol.h	2022-04-30 18:23:57.874733700 -0700
@@ -89,6 +89,10 @@
   TcpL4Protocol ();
   virtual ~TcpL4Protocol ();
 
+  // Delete copy constructor and assignment operator to avoid misuse
+  TcpL4Protocol (const TcpL4Protocol &) = delete;
+  TcpL4Protocol & operator = (const TcpL4Protocol &) = delete;
+
   /**
    * Set node associated with this stack
    * \param node the node
@@ -325,20 +329,6 @@
   IpL4Protocol::DownTargetCallback6 m_downTarget6; //!< Callback to send packets over IPv6
 
   /**
-   * \brief Copy constructor
-   *
-   * Defined and not implemented to avoid misuse
-   */
-  TcpL4Protocol (const TcpL4Protocol &);
-  /**
-   * \brief Copy constructor
-   *
-   * Defined and not implemented to avoid misuse
-   * \returns
-   */
-  TcpL4Protocol &operator = (const TcpL4Protocol &);
-
-  /**
    * \brief Send a packet via TCP (IPv4)
    *
    * \param pkt The packet to send
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/model/tcp-linux-reno.h ns-3.36/src/internet/model/tcp-linux-reno.h
--- ns-3.35/src/internet/model/tcp-linux-reno.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/model/tcp-linux-reno.h	2022-04-30 18:23:57.874733700 -0700
@@ -28,6 +28,14 @@
 
 namespace ns3 {
 
+/**
+ * \ingroup congestionOps
+ *
+ * \brief Reno congestion control algorithm
+ * 
+ * This class implement the Reno congestion control type
+ * and it mimics the one implemented in the Linux kernel.
+ */
 class TcpLinuxReno : public TcpCongestionOps
 {
 public:
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/model/tcp-lp.h ns-3.36/src/internet/model/tcp-lp.h
--- ns-3.35/src/internet/model/tcp-lp.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/model/tcp-lp.h	2022-04-30 18:23:57.874733700 -0700
@@ -32,6 +32,11 @@
 
 class TcpSocketState;
 
+/**
+ * \ingroup congestionOps
+ *
+ * \brief TCP-LP (Low Priority) congestion control algorithm
+ */
 class TcpLp : public TcpNewReno
 {
 public:
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/model/tcp-prr-recovery.cc ns-3.36/src/internet/model/tcp-prr-recovery.cc
--- ns-3.35/src/internet/model/tcp-prr-recovery.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/model/tcp-prr-recovery.cc	2022-04-30 18:23:57.874733700 -0700
@@ -69,11 +69,11 @@
 }
 
 void
-TcpPrrRecovery::EnterRecovery (Ptr<TcpSocketState> tcb, uint32_t dupAckCount,
+TcpPrrRecovery::EnterRecovery (Ptr<TcpSocketState> tcb, 
+                               [[maybe_unused]] uint32_t dupAckCount,
                                uint32_t unAckDataCount, uint32_t deliveredBytes)
 {
   NS_LOG_FUNCTION (this << tcb << dupAckCount << unAckDataCount);
-  NS_UNUSED (dupAckCount);
 
   m_prrOut = 0;
   m_prrDelivered = 0;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/model/tcp-recovery-ops.cc ns-3.36/src/internet/model/tcp-recovery-ops.cc
--- ns-3.35/src/internet/model/tcp-recovery-ops.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/model/tcp-recovery-ops.cc	2022-04-30 18:23:57.874733700 -0700
@@ -95,20 +95,18 @@
 
 void
 TcpClassicRecovery::EnterRecovery (Ptr<TcpSocketState> tcb, uint32_t dupAckCount,
-                                   uint32_t unAckDataCount, uint32_t deliveredBytes)
+                                   [[maybe_unused]] uint32_t unAckDataCount, 
+                                   [[maybe_unused]] uint32_t deliveredBytes)
 {
   NS_LOG_FUNCTION (this << tcb << dupAckCount << unAckDataCount);
-  NS_UNUSED (unAckDataCount);
-  NS_UNUSED (deliveredBytes);
   tcb->m_cWnd = tcb->m_ssThresh;
   tcb->m_cWndInfl = tcb->m_ssThresh + (dupAckCount * tcb->m_segmentSize);
 }
 
 void
-TcpClassicRecovery::DoRecovery (Ptr<TcpSocketState> tcb, uint32_t deliveredBytes)
+TcpClassicRecovery::DoRecovery (Ptr<TcpSocketState> tcb, [[maybe_unused]] uint32_t deliveredBytes)
 {
   NS_LOG_FUNCTION (this << tcb << deliveredBytes);
-  NS_UNUSED (deliveredBytes);
   tcb->m_cWndInfl += tcb->m_segmentSize;
 }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/model/tcp-socket-base.cc ns-3.36/src/internet/model/tcp-socket-base.cc
--- ns-3.35/src/internet/model/tcp-socket-base.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/model/tcp-socket-base.cc	2022-04-30 18:23:57.874733700 -0700
@@ -860,9 +860,8 @@
 
 /* Inherit from Socket class: In TcpSocketBase, it is same as Send() call */
 int
-TcpSocketBase::SendTo (Ptr<Packet> p, uint32_t flags, const Address &address)
+TcpSocketBase::SendTo (Ptr<Packet> p, uint32_t flags, [[maybe_unused]] const Address &address)
 {
-  NS_UNUSED (address);
   return Send (p, flags); // SendTo() and Send() are the same
 }
 
@@ -2304,9 +2303,9 @@
 /* Received a packet upon SYN_RCVD */
 void
 TcpSocketBase::ProcessSynRcvd (Ptr<Packet> packet, const TcpHeader& tcpHeader,
-                               const Address& fromAddress, const Address& toAddress)
+                               const Address& fromAddress, 
+                               [[maybe_unused]] const Address& toAddress)
 {
-  NS_UNUSED (toAddress);
   NS_LOG_FUNCTION (this << tcpHeader);
 
   // Extract the flags. PSH, URG, CWR and ECE are disregarded.
@@ -2886,11 +2885,10 @@
    TcpSocketBase cloned, allocate a new end point to handle the incoming
    connection and send a SYN+ACK to complete the handshake. */
 void
-TcpSocketBase::CompleteFork (Ptr<Packet> p, const TcpHeader& h,
+TcpSocketBase::CompleteFork ([[maybe_unused]] Ptr<Packet> p, const TcpHeader& h,
                              const Address& fromAddress, const Address& toAddress)
 {
   NS_LOG_FUNCTION (this << p << h << fromAddress << toAddress);
-  NS_UNUSED (p);
   // Get port and address from peer (connecting host)
   if (InetSocketAddress::IsMatchingType (toAddress))
     {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/model/tcp-tx-buffer.cc ns-3.36/src/internet/model/tcp-tx-buffer.cc
--- ns-3.35/src/internet/model/tcp-tx-buffer.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/model/tcp-tx-buffer.cc	2022-04-30 18:23:57.874733700 -0700
@@ -686,9 +686,8 @@
       if (i == m_sentList.end ())
         {
           // Move data from app list to sent list, so we can delete the item
-          Ptr<Packet> p = CopyFromSequence (offset, m_firstByteSeq)->GetPacketCopy ();
+          [[maybe_unused]] Ptr<Packet> p = CopyFromSequence (offset, m_firstByteSeq)->GetPacketCopy ();
           NS_ASSERT (p != nullptr);
-          NS_UNUSED (p);
           i = m_sentList.begin ();
           NS_ASSERT (i != m_sentList.end ());
         }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/model/tcp-westwood.cc ns-3.36/src/internet/model/tcp-westwood.cc
--- ns-3.35/src/internet/model/tcp-westwood.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/model/tcp-westwood.cc	2022-04-30 18:23:57.878733600 -0700
@@ -59,7 +59,7 @@
                   MakeEnumChecker(TcpWestwood::WESTWOOD, "Westwood",TcpWestwood::WESTWOODPLUS, "WestwoodPlus"))
     .AddTraceSource("EstimatedBW", "The estimated bandwidth",
                     MakeTraceSourceAccessor(&TcpWestwood::m_currentBW),
-                    "ns3::TracedValueCallback::Double")
+                    "ns3::TracedValueCallback::DataRate")
   ;
   return tid;
 }
@@ -130,34 +130,34 @@
 
   NS_ASSERT (!rtt.IsZero ());
 
-  m_currentBW = m_ackedSegments * tcb->m_segmentSize / rtt.GetSeconds ();
-
   if (m_pType == TcpWestwood::WESTWOOD)
     {
       Time currentAck = Simulator::Now ();
-      m_currentBW = m_ackedSegments * tcb->m_segmentSize / (currentAck - m_lastAck).GetSeconds ();
+
+      NS_ABORT_MSG_IF (currentAck == m_lastAck,
+        "This violates a model assumption and would lead to divide-by-zero; please report to ns-3 maintainers if this occurs.");
+
+      m_currentBW = DataRate (m_ackedSegments * tcb->m_segmentSize * 8.0 / (currentAck - m_lastAck).GetSeconds ());
       m_lastAck = currentAck;
     }
   else if (m_pType == TcpWestwood::WESTWOODPLUS)
     {
-      m_currentBW = m_ackedSegments * tcb->m_segmentSize / rtt.GetSeconds ();
+      m_currentBW = DataRate (m_ackedSegments * tcb->m_segmentSize * 8.0 / rtt.GetSeconds ());
       m_IsCount = false;
     }
 
   m_ackedSegments = 0;
+
   NS_LOG_LOGIC ("Estimated BW: " << m_currentBW);
 
   // Filter the BW sample
 
-  double alpha = 0.9;
+  constexpr double alpha = 0.9;
 
-  if (m_fType == TcpWestwood::NONE)
+  if (m_fType == TcpWestwood::TUSTIN)
     {
-    }
-  else if (m_fType == TcpWestwood::TUSTIN)
-    {
-      double sample_bwe = m_currentBW;
-      m_currentBW = (alpha * m_lastBW) + ((1 - alpha) * ((sample_bwe + m_lastSampleBW) / 2));
+      DataRate sample_bwe = m_currentBW;
+      m_currentBW = (m_lastBW * alpha) + (((sample_bwe + m_lastSampleBW) * 0.5) * (1 - alpha));
       m_lastSampleBW = sample_bwe;
       m_lastBW = m_currentBW;
     }
@@ -167,15 +167,15 @@
 
 uint32_t
 TcpWestwood::GetSsThresh (Ptr<const TcpSocketState> tcb,
-                          uint32_t bytesInFlight)
+                          [[maybe_unused]] uint32_t bytesInFlight)
 {
-  NS_UNUSED (bytesInFlight);
-  NS_LOG_LOGIC ("CurrentBW: " << m_currentBW << " minRtt: " <<
-                tcb->m_minRtt << " ssthresh: " <<
-                m_currentBW * static_cast<double> (tcb->m_minRtt.GetSeconds ()));
+  uint32_t ssThresh = static_cast<uint32_t> ((m_currentBW * tcb->m_minRtt) / 8.0);
+
+  NS_LOG_LOGIC ("CurrentBW: " << m_currentBW <<
+                " minRtt: " << tcb->m_minRtt <<
+                " ssThresh: " << ssThresh);
 
-  return std::max (2*tcb->m_segmentSize,
-                   uint32_t (m_currentBW * static_cast<double> (tcb->m_minRtt.GetSeconds ())));
+  return std::max (2 * tcb->m_segmentSize, ssThresh);
 }
 
 Ptr<TcpCongestionOps>
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/model/tcp-westwood.h ns-3.36/src/internet/model/tcp-westwood.h
--- ns-3.35/src/internet/model/tcp-westwood.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/model/tcp-westwood.h	2022-04-30 18:23:57.878733600 -0700
@@ -34,17 +34,14 @@
 #define TCP_WESTWOOD_H
 
 #include "tcp-congestion-ops.h"
+#include "ns3/data-rate.h"
 #include "ns3/tcp-recovery-ops.h"
-#include "ns3/sequence-number.h"
 #include "ns3/traced-value.h"
 #include "ns3/event-id.h"
 
 namespace ns3 {
 
-class Packet;
-class TcpHeader;
 class Time;
-class EventId;
 
 /**
  * \ingroup congestionOps
@@ -63,6 +60,8 @@
  * the number of acknowledged segments on the receipt of an ACK.
  * The EstimateBW estimates the bandwidth based on the value returned by CountAck
  * and the sampling interval (last ACK inter-arrival time for Westwood and last RTT for Westwood+).
+ *
+ * WARNING: this TCP model lacks validation and regression tests; use with caution.
  */
 class TcpWestwood : public TcpNewReno
 {
@@ -124,9 +123,9 @@
   void EstimateBW (const Time& rtt, Ptr<TcpSocketState> tcb);
 
 protected:
-  TracedValue<double>    m_currentBW;              //!< Current value of the estimated BW
-  double                 m_lastSampleBW;           //!< Last bandwidth sample
-  double                 m_lastBW;                 //!< Last bandwidth sample after being filtered
+  TracedValue<DataRate>  m_currentBW;              //!< Current value of the estimated BW
+  DataRate               m_lastSampleBW;           //!< Last bandwidth sample
+  DataRate               m_lastBW;                 //!< Last bandwidth sample after being filtered
   enum ProtocolType      m_pType;                  //!< 0 for Westwood, 1 for Westwood+
   enum FilterType        m_fType;                  //!< 0 for none, 1 for Tustin
 
@@ -134,7 +133,6 @@
   bool                   m_IsCount;                //!< Start keeping track of m_ackedSegments for Westwood+ if TRUE
   EventId                m_bwEstimateEvent;        //!< The BW estimation event for Westwood+
   Time                   m_lastAck;                //!< The last ACK time
-
 };
 
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/model/udp-l4-protocol.h ns-3.36/src/internet/model/udp-l4-protocol.h
--- ns-3.35/src/internet/model/udp-l4-protocol.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/model/udp-l4-protocol.h	2022-04-30 18:23:57.878733600 -0700
@@ -70,6 +70,10 @@
   UdpL4Protocol ();
   virtual ~UdpL4Protocol ();
 
+  // Delete copy constructor and assignment operator to avoid misuse
+  UdpL4Protocol (const UdpL4Protocol &) = delete;
+  UdpL4Protocol &operator = (const UdpL4Protocol &) = delete;
+
   /**
    * Set node associated with this stack
    * \param node the node
@@ -257,20 +261,6 @@
   Ipv4EndPointDemux *m_endPoints; //!< A list of IPv4 end points.
   Ipv6EndPointDemux *m_endPoints6; //!< A list of IPv6 end points.
 
-  /**
-   * \brief Copy constructor
-   *
-   * Defined and not implemented to avoid misuse
-   */
-  UdpL4Protocol (const UdpL4Protocol &);
-  /**
-   * \brief Copy constructor
-   *
-   * Defined and not implemented to avoid misuse
-   * \returns
-   */
-  UdpL4Protocol &operator = (const UdpL4Protocol &);
-
   std::vector<Ptr<UdpSocketImpl> > m_sockets;      //!< list of sockets
   IpL4Protocol::DownTargetCallback m_downTarget;   //!< Callback to send packets over IPv4
   IpL4Protocol::DownTargetCallback6 m_downTarget6; //!< Callback to send packets over IPv6
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/test/global-route-manager-impl-test-suite.cc ns-3.36/src/internet/test/global-route-manager-impl-test-suite.cc
--- ns-3.35/src/internet/test/global-route-manager-impl-test-suite.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/test/global-route-manager-impl-test-suite.cc	2022-04-30 18:23:57.878733600 -0700
@@ -201,7 +201,7 @@
   srmlsdb->Insert (lsa1->GetLinkStateId (), lsa1);
   srmlsdb->Insert (lsa2->GetLinkStateId (), lsa2);
   srmlsdb->Insert (lsa3->GetLinkStateId (), lsa3);
-  NS_ASSERT (lsa2 == srmlsdb->GetLSA (lsa2->GetLinkStateId ()));
+  NS_TEST_ASSERT_MSG_EQ (lsa2, srmlsdb->GetLSA (lsa2->GetLinkStateId ()), "The Ipv4Address is not stored as the link state ID");
 
   // next, calculate routes based on the manually created LSDB
   GlobalRouteManagerImpl* srm = new GlobalRouteManagerImpl ();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/test/icmp-test.cc ns-3.36/src/internet/test/icmp-test.cc
--- ns-3.35/src/internet/test/icmp-test.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/test/icmp-test.cc	2022-04-30 18:23:57.878733600 -0700
@@ -435,7 +435,7 @@
 {
   Address from;
   Ptr<Packet> p = socket->RecvFrom (from);
-  m_receivedPacket = p->Copy ();
+  Ptr<Packet> pkt = p->Copy ();
 
   if (Inet6SocketAddress::IsMatchingType (from))
     {
@@ -448,12 +448,9 @@
       Icmpv6Header icmpv6;
       p->RemoveHeader (icmpv6);
 
-      // Ignore the neighbor discovery (ICMPV6_ND) packets
-      if (!(((int)icmpv6.GetType () >= 133) && ((int)icmpv6.GetType () <= 137)))
+      if (icmpv6.GetType () == Icmpv6Header::ICMPV6_ECHO_REPLY)
         {
-          NS_TEST_EXPECT_MSG_EQ ((int) icmpv6.GetType (),
-                                 Icmpv6Header::ICMPV6_ECHO_REPLY,
-                                 "The received Packet is not a ICMPV6_ECHO_REPLY");
+          m_receivedPacket = pkt->Copy ();
         }
     }
 }
@@ -502,7 +499,7 @@
                                   &IcmpV6EchoReplyTestCase::SendData, this, socket, i.GetAddress (1,1));
   Simulator::Run ();
 
-  NS_TEST_EXPECT_MSG_EQ (m_receivedPacket->GetSize (), 72, " Unexpected ICMPV6_ECHO_REPLY packet size");
+  NS_TEST_EXPECT_MSG_EQ (m_receivedPacket->GetSize (), 52, " Unexpected ICMPV6_ECHO_REPLY packet size");
 
   Simulator::Destroy ();
 }
@@ -579,7 +576,7 @@
 {
   Address from;
   Ptr<Packet> p = socket->RecvFrom (from);
-  m_receivedPacket = p->Copy ();
+  Ptr<Packet> pkt = p->Copy ();
 
   if (Inet6SocketAddress::IsMatchingType (from))
     {
@@ -594,12 +591,10 @@
       Icmpv6Header icmpv6;
       p->RemoveHeader (icmpv6);
 
-      // Ignore the neighbor discovery (ICMPV6_ND) packets
-      if (!(((int)icmpv6.GetType () >= 133) && ((int)icmpv6.GetType () <= 137)))
+      // Ignore any packet except ICMPV6_ERROR_TIME_EXCEEDED
+      if (icmpv6.GetType () == Icmpv6Header::ICMPV6_ERROR_TIME_EXCEEDED)
         {
-          NS_TEST_EXPECT_MSG_EQ ((int) icmpv6.GetType (),
-                                 Icmpv6Header::ICMPV6_ERROR_TIME_EXCEEDED,
-                                 "The received Packet is not a ICMPV6_ERROR_TIME_EXCEEDED");
+          m_receivedPacket = pkt->Copy ();
         }
     }
 }
@@ -663,7 +658,7 @@
                                   &IcmpV6TimeExceedTestCase::SendData, this, socket, interfaces2.GetAddress (1,1));
   Simulator::Run ();
 
-  NS_TEST_EXPECT_MSG_EQ (m_receivedPacket->GetSize (), 72, " Unexpected ICMPV6_ECHO_REPLY packet size");
+  NS_TEST_EXPECT_MSG_EQ (m_receivedPacket->GetSize (), 100, " Unexpected ICMPV6_ECHO_REPLY packet size");
 
   Simulator::Destroy ();
 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/test/ipv4-deduplication-test.cc ns-3.36/src/internet/test/ipv4-deduplication-test.cc
--- ns-3.35/src/internet/test/ipv4-deduplication-test.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/test/ipv4-deduplication-test.cc	2022-04-30 18:23:57.878733600 -0700
@@ -199,7 +199,7 @@
   uint32_t availableData;
   availableData = socket->GetRxAvailable ();
   Ptr<Packet> packet = socket->Recv (std::numeric_limits<uint32_t>::max (), 0);
-  NS_ASSERT (availableData == packet->GetSize ());
+  NS_TEST_ASSERT_MSG_EQ (availableData, packet->GetSize (), "Received packet size is not equal to the Rx buffer size");
 
   auto node = socket->GetNode ();
   std::string name = Names::FindName (node);
@@ -339,7 +339,7 @@
       //// many Unix variants.
       //// So, we just log it and fall through to LookupStatic ()
       auto ipv4 = (*iter)->GetObject <Ipv4> ();
-      NS_ASSERT_MSG ((bool) ipv4, "Node " << Names::FindName (*iter) << " does not have Ipv4 aggregate");
+      NS_TEST_ASSERT_MSG_EQ ((bool) ipv4, true, "Node " << Names::FindName (*iter) << " does not have Ipv4 aggregate");
       auto routing = staticRouting.GetStaticRouting (ipv4);
       routing->AddHostRouteTo (targetAddr.c_str (), ipv4->GetInterfaceForDevice (*diter), 0);
 
@@ -615,7 +615,7 @@
       //// many Unix variants.
       //// So, we just log it and fall through to LookupStatic ()
       auto ipv4 = (*iter)->GetObject <Ipv4> ();
-      NS_ASSERT_MSG ((bool) ipv4, "Node " << (*iter)->GetId () << " does not have Ipv4 aggregate");
+      NS_TEST_ASSERT_MSG_EQ ((bool) ipv4, true, "Node " << (*iter)->GetId () << " does not have Ipv4 aggregate");
       auto routing = staticRouting.GetStaticRouting (ipv4);
       routing->AddHostRouteTo (targetAddr.c_str (), ipv4->GetInterfaceForDevice (*diter), 0);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/test/ipv4-forwarding-test.cc ns-3.36/src/internet/test/ipv4-forwarding-test.cc
--- ns-3.35/src/internet/test/ipv4-forwarding-test.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/test/ipv4-forwarding-test.cc	2022-04-30 18:23:57.878733600 -0700
@@ -91,7 +91,7 @@
   uint32_t availableData;
   availableData = socket->GetRxAvailable ();
   m_receivedPacket = socket->Recv (std::numeric_limits<uint32_t>::max (), 0);
-  NS_ASSERT (availableData == m_receivedPacket->GetSize ());
+  NS_TEST_ASSERT_MSG_EQ (availableData, m_receivedPacket->GetSize (), "Received packet size is not equal to Rx buffer size");
 }
 
 void
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/test/ipv4-global-routing-test-suite.cc ns-3.36/src/internet/test/ipv4-global-routing-test-suite.cc
--- ns-3.35/src/internet/test/ipv4-global-routing-test-suite.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/test/ipv4-global-routing-test-suite.cc	2022-04-30 18:23:57.878733600 -0700
@@ -1139,7 +1139,7 @@
   uint32_t availableData;
   availableData = socket->GetRxAvailable ();
   m_receivedPacket = socket->Recv (std::numeric_limits<uint32_t>::max (), 0);
-  NS_ASSERT (availableData == m_receivedPacket->GetSize ());
+  NS_TEST_ASSERT_MSG_EQ (availableData, m_receivedPacket->GetSize (), "Received packet size is not equal to Rx buffer size");
   //cast availableData to void, to suppress 'availableData' set but not used
   //compiler warning
   (void) availableData;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/test/ipv4-header-test.cc ns-3.36/src/internet/test/ipv4-header-test.cc
--- ns-3.35/src/internet/test/ipv4-header-test.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/test/ipv4-header-test.cc	2022-04-30 18:23:57.878733600 -0700
@@ -113,9 +113,9 @@
   uint32_t availableData;
   availableData = socket->GetRxAvailable ();
   m_receivedPacket = socket->Recv (2, MSG_PEEK);
-  NS_ASSERT (m_receivedPacket->GetSize () == 2);
+  NS_TEST_ASSERT_MSG_EQ (m_receivedPacket->GetSize (),2, "Received packet size is  not equal to 2");
   m_receivedPacket = socket->Recv (std::numeric_limits<uint32_t>::max (), 0);
-  NS_ASSERT (availableData == m_receivedPacket->GetSize ());
+  NS_TEST_ASSERT_MSG_EQ (availableData, m_receivedPacket->GetSize (), "Received packet size is not equal to Rx buffer size");
   m_receivedPacket->PeekHeader (m_receivedHeader);
 }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/test/ipv4-raw-test.cc ns-3.36/src/internet/test/ipv4-raw-test.cc
--- ns-3.35/src/internet/test/ipv4-raw-test.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/test/ipv4-raw-test.cc	2022-04-30 18:23:57.878733600 -0700
@@ -138,9 +138,9 @@
   uint32_t availableData;
   availableData = socket->GetRxAvailable ();
   m_receivedPacket = socket->Recv (2, MSG_PEEK);
-  NS_ASSERT (m_receivedPacket->GetSize () == 2);
+  NS_TEST_ASSERT_MSG_EQ (m_receivedPacket->GetSize (), 2, "ReceivedPacket size is not equal to 2");
   m_receivedPacket = socket->Recv (std::numeric_limits<uint32_t>::max (), 0);
-  NS_ASSERT (availableData == m_receivedPacket->GetSize ());
+  NS_TEST_ASSERT_MSG_EQ (availableData, m_receivedPacket->GetSize (), "Received packet size is not equal to Rx buffer size");
 }
 
 void Ipv4RawSocketImplTest::ReceivePkt2 (Ptr<Socket> socket)
@@ -148,9 +148,9 @@
   uint32_t availableData;
   availableData = socket->GetRxAvailable ();
   m_receivedPacket2 = socket->Recv (2, MSG_PEEK);
-  NS_ASSERT (m_receivedPacket2->GetSize () == 2);
+  NS_TEST_ASSERT_MSG_EQ (m_receivedPacket2->GetSize (), 2, "ReceivedPacket size is not equal to 2");
   m_receivedPacket2 = socket->Recv (std::numeric_limits<uint32_t>::max (), 0);
-  NS_ASSERT (availableData == m_receivedPacket2->GetSize ());
+  NS_TEST_ASSERT_MSG_EQ (availableData, m_receivedPacket2->GetSize (), "Received packet size is not equal to Rx buffer size");
 }
 
 void
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/test/ipv4-rip-test.cc ns-3.36/src/internet/test/ipv4-rip-test.cc
--- ns-3.35/src/internet/test/ipv4-rip-test.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/test/ipv4-rip-test.cc	2022-04-30 18:23:57.878733600 -0700
@@ -91,7 +91,7 @@
   uint32_t availableData;
   availableData = socket->GetRxAvailable ();
   m_receivedPacket = socket->Recv (std::numeric_limits<uint32_t>::max (), 0);
-  NS_ASSERT (availableData == m_receivedPacket->GetSize ());
+  NS_TEST_ASSERT_MSG_EQ (availableData, m_receivedPacket->GetSize (), "Received Packet size is not equal to the Rx buffer size");
   //cast availableData to void, to suppress 'availableData' set but not used
   //compiler warning
   (void) availableData;
@@ -313,7 +313,7 @@
   uint32_t availableData;
   availableData = socket->GetRxAvailable ();
   m_receivedPacket = socket->Recv (std::numeric_limits<uint32_t>::max (), 0);
-  NS_ASSERT (availableData == m_receivedPacket->GetSize ());
+  NS_TEST_ASSERT_MSG_EQ (availableData, m_receivedPacket->GetSize (), "Received Packet size is not equal to the Rx buffer size");
   //cast availableData to void, to suppress 'availableData' set but not used
   //compiler warning
   (void) availableData;
@@ -535,7 +535,7 @@
   availableData = socket->GetRxAvailable ();
   Address srcAddr;
   Ptr<Packet> receivedPacketProbe = socket->RecvFrom (std::numeric_limits<uint32_t>::max (), 0, srcAddr);
-  NS_ASSERT (availableData == receivedPacketProbe->GetSize ());
+  NS_TEST_ASSERT_MSG_EQ (availableData, receivedPacketProbe->GetSize (), "Received Packet size is not equal to the Rx buffer size");
   Ipv4Address senderAddress = InetSocketAddress::ConvertFrom (srcAddr).GetIpv4 ();
 
   if (senderAddress == "192.168.0.2")
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/test/ipv4-static-routing-test-suite.cc ns-3.36/src/internet/test/ipv4-static-routing-test-suite.cc
--- ns-3.35/src/internet/test/ipv4-static-routing-test-suite.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/test/ipv4-static-routing-test-suite.cc	2022-04-30 18:23:57.878733600 -0700
@@ -91,7 +91,7 @@
   uint32_t availableData;
   availableData = socket->GetRxAvailable ();
   m_receivedPacket = socket->Recv (std::numeric_limits<uint32_t>::max (), 0);
-  NS_ASSERT (availableData == m_receivedPacket->GetSize ());
+  NS_TEST_ASSERT_MSG_EQ (availableData, m_receivedPacket->GetSize (), "Received packet size is not equal to Rx buffer size");
   //cast availableData to void, to suppress 'availableData' set but not used
   //compiler warning
   (void) availableData;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/test/ipv6-forwarding-test.cc ns-3.36/src/internet/test/ipv6-forwarding-test.cc
--- ns-3.35/src/internet/test/ipv6-forwarding-test.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/test/ipv6-forwarding-test.cc	2022-04-30 18:23:57.878733600 -0700
@@ -89,7 +89,7 @@
   uint32_t availableData;
   availableData = socket->GetRxAvailable ();
   m_receivedPacket = socket->Recv (std::numeric_limits<uint32_t>::max (), 0);
-  NS_ASSERT (availableData == m_receivedPacket->GetSize ());
+  NS_TEST_ASSERT_MSG_EQ (availableData, m_receivedPacket->GetSize (), "Received packet size is not equal to Rx buffer size");
   //cast availableData to void, to suppress 'availableData' set but not used
   //compiler warning
   (void) availableData;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/test/ipv6-fragmentation-test.cc ns-3.36/src/internet/test/ipv6-fragmentation-test.cc
--- ns-3.35/src/internet/test/ipv6-fragmentation-test.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/test/ipv6-fragmentation-test.cc	2022-04-30 18:23:57.878733600 -0700
@@ -176,6 +176,26 @@
    * \returns The sent packet.
    */
   Ptr<Packet> SendClient (void);
+
+  /**
+   * \brief Handle Server's incoming packets.
+   * Ensure no packet greater than MTU is received
+   *
+   * \param packet the packet.
+   * \param ipv6 the Ipv6 protocol.
+   * \param interface the IP-level interface index.
+   */
+  void HandleServerRx (Ptr<const Packet> packet, Ptr<Ipv6> ipv6, uint32_t interface);
+
+  /**
+   * \brief Handle Client's transmitting packets.
+   * Ensure no packet greater than MTU is transmitted
+   *
+   * \param packet the packet.
+   * \param ipv6 the Ipv6 protocol.
+   * \param interface the IP-level interface index.
+   */
+  void HandleClientTx (Ptr<const Packet> packet, Ptr<Ipv6> ipv6, uint32_t interface);
 };
 
 
@@ -320,6 +340,16 @@
   return p;
 }
 
+void Ipv6FragmentationTest::HandleServerRx (Ptr<const Packet> packet, Ptr<Ipv6> ipv6, uint32_t interface)
+{
+  NS_TEST_EXPECT_MSG_LT_OR_EQ (packet->GetSize (), ipv6->GetMtu (interface), "Received packet size > MTU: packetSizes: " << packet->GetSize ());
+}
+
+void Ipv6FragmentationTest::HandleClientTx (Ptr<const Packet> packet, Ptr<Ipv6> ipv6, uint32_t interface)
+{
+  NS_TEST_EXPECT_MSG_LT_OR_EQ (packet->GetSize (), ipv6->GetMtu (interface), "Transmitted packet size > MTU: packetSizes: " << packet->GetSize ());
+}
+
 void
 Ipv6FragmentationTest::DoRun (void)
 {
@@ -345,6 +375,7 @@
     Ipv6InterfaceAddress ipv6Addr = Ipv6InterfaceAddress (Ipv6Address ("2001::1"), Ipv6Prefix (32));
     ipv6->AddAddress (netdev_idx, ipv6Addr);
     ipv6->SetUp (netdev_idx);
+    ipv6->TraceConnectWithoutContext ("Rx", MakeCallback (&Ipv6FragmentationTest::HandleServerRx, this));
   }
   StartServer (serverNode);
 
@@ -365,6 +396,7 @@
     Ipv6InterfaceAddress ipv6Addr = Ipv6InterfaceAddress (Ipv6Address ("2001::2"), Ipv6Prefix (32));
     ipv6->AddAddress (netdev_idx, ipv6Addr);
     ipv6->SetUp (netdev_idx);
+    ipv6->TraceConnectWithoutContext ("Tx", MakeCallback (&Ipv6FragmentationTest::HandleClientTx, this));
   }
   StartClient (clientNode);
 
@@ -376,7 +408,7 @@
 
 
   // some small packets, some rather big ones
-  uint32_t packetSizes[5] = {2000, 2500, 5000, 10000, 65000};
+  uint32_t packetSizes[5] = {1500, 2000, 5000, 10000, 65000};
 
   // using the alphabet
   uint8_t fillData[78];
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/test/ipv6-raw-test.cc ns-3.36/src/internet/test/ipv6-raw-test.cc
--- ns-3.35/src/internet/test/ipv6-raw-test.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/test/ipv6-raw-test.cc	2022-04-30 18:23:57.878733600 -0700
@@ -127,9 +127,9 @@
   uint32_t availableData;
   availableData = socket->GetRxAvailable ();
   m_receivedPacket = socket->Recv (2, MSG_PEEK);
-  NS_ASSERT (m_receivedPacket->GetSize () == 2);
+  NS_TEST_ASSERT_MSG_EQ (m_receivedPacket->GetSize (), 2, "ReceivedPacket size is not equal to 2");
   m_receivedPacket = socket->Recv (std::numeric_limits<uint32_t>::max (), 0);
-  NS_ASSERT (availableData == m_receivedPacket->GetSize ());
+  NS_TEST_ASSERT_MSG_EQ (availableData, m_receivedPacket->GetSize (), "Received packet size is not equal to Rx buffer size");
 }
 
 void Ipv6RawSocketImplTest::ReceivePkt2 (Ptr<Socket> socket)
@@ -138,9 +138,9 @@
   Address addr;
   availableData = socket->GetRxAvailable ();
   m_receivedPacket2 = socket->Recv (2, MSG_PEEK);
-  NS_ASSERT (m_receivedPacket2->GetSize () == 2);
+  NS_TEST_ASSERT_MSG_EQ (m_receivedPacket2->GetSize (), 2, "ReceivedPacket size is not equal to 2");
   m_receivedPacket2 = socket->RecvFrom (std::numeric_limits<uint32_t>::max (), 0, addr);
-  NS_ASSERT (availableData == m_receivedPacket2->GetSize ());
+  NS_TEST_ASSERT_MSG_EQ (availableData, m_receivedPacket2->GetSize (), "Received packet size is not equal to Rx buffer size");
   Inet6SocketAddress v6addr = Inet6SocketAddress::ConvertFrom (addr);
   NS_TEST_EXPECT_MSG_EQ (v6addr.GetIpv6 (), Ipv6Address ("2001:db8::2"), "recvfrom");
 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/test/ipv6-ripng-test.cc ns-3.36/src/internet/test/ipv6-ripng-test.cc
--- ns-3.35/src/internet/test/ipv6-ripng-test.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/test/ipv6-ripng-test.cc	2022-04-30 18:23:57.878733600 -0700
@@ -90,7 +90,7 @@
   uint32_t availableData;
   availableData = socket->GetRxAvailable ();
   m_receivedPacket = socket->Recv (std::numeric_limits<uint32_t>::max (), 0);
-  NS_ASSERT (availableData == m_receivedPacket->GetSize ());
+  NS_TEST_ASSERT_MSG_EQ (availableData, m_receivedPacket->GetSize (), "Received packet size is not equal to Rx buffer size");
   //cast availableData to void, to suppress 'availableData' set but not used
   //compiler warning
   (void) availableData;
@@ -313,7 +313,7 @@
   uint32_t availableData;
   availableData = socket->GetRxAvailable ();
   m_receivedPacket = socket->Recv (std::numeric_limits<uint32_t>::max (), 0);
-  NS_ASSERT (availableData == m_receivedPacket->GetSize ());
+  NS_TEST_ASSERT_MSG_EQ (availableData, m_receivedPacket->GetSize (), "Received packet size is not equal to Rx buffer size");
   //cast availableData to void, to suppress 'availableData' set but not used
   //compiler warning
   (void) availableData;
@@ -532,7 +532,7 @@
   availableData = socket->GetRxAvailable ();
   Address srcAddr;
   Ptr<Packet> receivedPacketProbe = socket->RecvFrom (std::numeric_limits<uint32_t>::max (), 0, srcAddr);
-  NS_ASSERT (availableData == receivedPacketProbe->GetSize ());
+  NS_TEST_ASSERT_MSG_EQ (availableData, receivedPacketProbe->GetSize (), "ReceivedPacketProbe size is not equal to the Rx buffer size");
   Ipv6Address senderAddress = Inet6SocketAddress::ConvertFrom (srcAddr).GetIpv6 ();
 
   if (senderAddress == "fe80::200:ff:fe00:4")
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/test/tcp-advertised-window-test.cc ns-3.36/src/internet/test/tcp-advertised-window-test.cc
--- ns-3.35/src/internet/test/tcp-advertised-window-test.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/test/tcp-advertised-window-test.cc	2022-04-30 18:23:57.878733600 -0700
@@ -16,7 +16,6 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  *
  */
-
 #include "tcp-general-test.h"
 #include "ns3/node.h"
 #include "ns3/log.h"
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/test/tcp-cong-avoid-test.cc ns-3.36/src/internet/test/tcp-cong-avoid-test.cc
--- ns-3.35/src/internet/test/tcp-cong-avoid-test.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/test/tcp-cong-avoid-test.cc	2022-04-30 18:23:57.878733600 -0700
@@ -18,7 +18,6 @@
  */
 #include "ns3/log.h"
 #include "ns3/simple-channel.h"
-#include "ns3/tcp-westwood.h"
 #include "ns3/config.h"
 #include "ns3/test.h"
 #include "tcp-general-test.h"
@@ -66,7 +65,7 @@
    * \param desc The test description.
    */
   TcpNewRenoCongAvoidNormalTest (uint32_t segmentSize, uint32_t packetSize,
-                                 uint32_t packets, TypeId& congControl,
+                                 uint32_t packets, const TypeId& congControl,
                                  const std::string &desc);
 protected:
   virtual void CWndTrace (uint32_t oldValue, uint32_t newValue);
@@ -95,7 +94,7 @@
 TcpNewRenoCongAvoidNormalTest::TcpNewRenoCongAvoidNormalTest (uint32_t segmentSize,
                                                               uint32_t packetSize,
                                                               uint32_t packets,
-                                                              TypeId &typeId,
+                                                              const TypeId &typeId,
                                                               const std::string &desc)
   : TcpGeneralTest (desc),
     m_segmentSize (segmentSize),
@@ -193,19 +192,19 @@
 public:
   TcpRenoCongAvoidTestSuite () : TestSuite ("tcp-cong-avoid-test", UNIT)
   {
-    std::list<TypeId> types;
-    types.insert (types.begin (), TcpWestwood::GetTypeId ());
-    types.insert (types.begin (), TcpNewReno::GetTypeId ());
+    std::list<TypeId> types = {
+      TcpNewReno::GetTypeId (),
+    };
 
-    for (std::list<TypeId>::iterator it = types.begin (); it != types.end (); ++it)
+    for (const auto &t : types)
       {
+        std::string typeName = t.GetName ();
+
         for (uint32_t i = 10; i <= 50; i += 10)
           {
-            AddTestCase (new TcpNewRenoCongAvoidNormalTest (500, 500, i, (*it),
-                                                            "cong avoid MSS=500, pkt_size=500," + (*it).GetName ()),
+            AddTestCase (new TcpNewRenoCongAvoidNormalTest (500, 500, i, t, "cong avoid MSS=500, pkt_size=500," + typeName),
                          TestCase::QUICK);
-            AddTestCase (new TcpNewRenoCongAvoidNormalTest (500, 1000, i, (*it),
-                                                            "cong avoid MSS=500, pkt_size=1000," + (*it).GetName ()),
+            AddTestCase (new TcpNewRenoCongAvoidNormalTest (500, 1000, i, t, "cong avoid MSS=500, pkt_size=1000," + typeName),
                          TestCase::QUICK);
           }
       }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/test/tcp-fast-retr-test.cc ns-3.36/src/internet/test/tcp-fast-retr-test.cc
--- ns-3.35/src/internet/test/tcp-fast-retr-test.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/test/tcp-fast-retr-test.cc	2022-04-30 18:23:57.878733600 -0700
@@ -375,7 +375,7 @@
 void
 TcpFastRetrTest::AfterRTOExpired (const Ptr<const TcpSocketState> tcb, SocketWho who)
 {
-  NS_ASSERT_MSG (true == false, "RTO isn't expected here");
+  NS_TEST_ASSERT_MSG_EQ (true, false, "RTO isn't expected here");
 }
 
 void
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/test/tcp-general-test.cc ns-3.36/src/internet/test/tcp-general-test.cc
--- ns-3.35/src/internet/test/tcp-general-test.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/test/tcp-general-test.cc	2022-04-30 18:23:57.878733600 -0700
@@ -350,9 +350,8 @@
 }
 
 void
-TcpGeneralTest::PhyDropCb (std::string context, Ptr<const Packet> p)
+TcpGeneralTest::PhyDropCb (std::string context, [[maybe_unused]] Ptr<const Packet> p)
 {
-  NS_UNUSED (p);
   if (context.compare ("SENDER") == 0)
     {
       PhyDrop (SENDER);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/test/tcp-general-test.h ns-3.36/src/internet/test/tcp-general-test.h
--- ns-3.35/src/internet/test/tcp-general-test.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/test/tcp-general-test.h	2022-04-30 18:23:57.878733600 -0700
@@ -696,11 +696,9 @@
    * \param oldValue old value
    * \param newValue new value
    */
-  virtual void CongStateTrace (const TcpSocketState::TcpCongState_t oldValue,
-                               const TcpSocketState::TcpCongState_t newValue)
+  virtual void CongStateTrace ([[maybe_unused]] const TcpSocketState::TcpCongState_t oldValue,
+                               [[maybe_unused]] const TcpSocketState::TcpCongState_t newValue)
   {
-    NS_UNUSED (oldValue);
-    NS_UNUSED (newValue);
   }
 
   /**
@@ -709,10 +707,9 @@
    * \param oldValue old value
    * \param newValue new value
    */
-  virtual void CWndTrace (uint32_t oldValue, uint32_t newValue)
+  virtual void CWndTrace ([[maybe_unused]] uint32_t oldValue,
+                          [[maybe_unused]] uint32_t newValue)
   {
-    NS_UNUSED (oldValue);
-    NS_UNUSED (newValue);
   }
 
   /**
@@ -721,10 +718,9 @@
    * \param oldValue old value
    * \param newValue new value
    */
-  virtual void CWndInflTrace (uint32_t oldValue, uint32_t newValue)
+  virtual void CWndInflTrace ([[maybe_unused]] uint32_t oldValue,
+                              [[maybe_unused]] uint32_t newValue)
   {
-    NS_UNUSED (oldValue);
-    NS_UNUSED (newValue);
   }
 
   /**
@@ -735,10 +731,9 @@
    * \param oldTime old value
    * \param newTime new value
    */
-  virtual void RttTrace (Time oldTime, Time newTime)
+  virtual void RttTrace ([[maybe_unused]] Time oldTime,
+                         [[maybe_unused]] Time newTime)
   {
-    NS_UNUSED (oldTime);
-    NS_UNUSED (newTime);
   }
 
   /**
@@ -749,10 +744,9 @@
    * \param oldValue old value
    * \param newValue new value
    */
-  virtual void SsThreshTrace (uint32_t oldValue, uint32_t newValue)
+  virtual void SsThreshTrace ([[maybe_unused]] uint32_t oldValue,
+                              [[maybe_unused]] uint32_t newValue)
   {
-    NS_UNUSED (oldValue);
-    NS_UNUSED (newValue);
   }
 
   /**
@@ -763,10 +757,9 @@
    * \param oldValue old value
    * \param newValue new value
    */
-  virtual void BytesInFlightTrace (uint32_t oldValue, uint32_t newValue)
+  virtual void BytesInFlightTrace ([[maybe_unused]] uint32_t oldValue,
+                                   [[maybe_unused]] uint32_t newValue)
   {
-    NS_UNUSED (oldValue);
-    NS_UNUSED (newValue);
   }
 
   /**
@@ -777,10 +770,9 @@
    * \param oldValue old value
    * \param newValue new value
    */
-  virtual void RtoTrace (Time oldValue, Time newValue)
+  virtual void RtoTrace ([[maybe_unused]] Time oldValue,
+                         [[maybe_unused]] Time newValue)
   {
-    NS_UNUSED (oldValue);
-    NS_UNUSED (newValue);
   }
 
   /**
@@ -791,10 +783,9 @@
    * \param oldValue old value
    * \param newValue new value
    */
-  virtual void NextTxSeqTrace (SequenceNumber32 oldValue, SequenceNumber32 newValue)
+  virtual void NextTxSeqTrace ([[maybe_unused]] SequenceNumber32 oldValue,
+                               [[maybe_unused]] SequenceNumber32 newValue)
   {
-    NS_UNUSED (oldValue);
-    NS_UNUSED (newValue);
   }
 
   /**
@@ -805,37 +796,33 @@
    * \param oldValue old value
    * \param newValue new value
    */
-  virtual void HighestTxSeqTrace (SequenceNumber32 oldValue, SequenceNumber32 newValue)
+  virtual void HighestTxSeqTrace ([[maybe_unused]] SequenceNumber32 oldValue,
+                                  [[maybe_unused]] SequenceNumber32 newValue)
   {
-    NS_UNUSED (oldValue);
-    NS_UNUSED (newValue);
   }
 
   /**
    * \brief Track the rate value of TcpRateLinux.
    * \param rate updated value of TcpRate.
    */
-  virtual void RateUpdatedTrace (const TcpRateLinux::TcpRateConnection &rate)
+  virtual void RateUpdatedTrace ([[maybe_unused]] const TcpRateLinux::TcpRateConnection &rate)
   {
-    NS_UNUSED (rate);
   }
 
   /**
    * \brief Track the rate sample value of TcpRateLinux.
    * \param sample updated value of TcpRateSample.
    */
-  virtual void RateSampleUpdatedTrace (const TcpRateLinux::TcpRateSample &sample)
+  virtual void RateSampleUpdatedTrace ([[maybe_unused]] const TcpRateLinux::TcpRateSample &sample)
   {
-    NS_UNUSED (sample);
   }
 
   /**
    * \brief Socket closed normally
    * \param who the socket closed (SENDER or RECEIVER)
    */
-  virtual void NormalClose (SocketWho who)
+  virtual void NormalClose ([[maybe_unused]] SocketWho who)
   {
-    NS_UNUSED (who);
   }
 
   /**
@@ -843,28 +830,25 @@
    *
    * \param who the socket closed (SENDER or RECEIVER)
    */
-  virtual void ErrorClose  (SocketWho who)
+  virtual void ErrorClose  ([[maybe_unused]] SocketWho who)
   {
     /** \todo indicate the error */
-    NS_UNUSED (who);
   }
 
   /**
    * \brief Drop on the queue
    * \param who where the drop occurred (SENDER or RECEIVER)
    */
-  virtual void QueueDrop   (SocketWho who)
+  virtual void QueueDrop   ([[maybe_unused]] SocketWho who)
   {
-    NS_UNUSED (who);
   }
 
   /**
    * \brief Link drop
    * \param who where the drop occurred (SENDER or RECEIVER)
    */
-  virtual void PhyDrop     (SocketWho who)
+  virtual void PhyDrop     ([[maybe_unused]] SocketWho who)
   {
-    NS_UNUSED (who);
   }
 
   /**
@@ -876,12 +860,10 @@
    * \param h the header of segment
    * \param who the socket which has received the ACK (SENDER or RECEIVER)
    */
-  virtual void RcvAck      (const Ptr<const TcpSocketState> tcb,
-                            const TcpHeader& h, SocketWho who)
+  virtual void RcvAck      ([[maybe_unused]] const Ptr<const TcpSocketState> tcb,
+                            [[maybe_unused]] const TcpHeader& h,
+                            [[maybe_unused]] SocketWho who)
   {
-    NS_UNUSED (tcb);
-    NS_UNUSED (h);
-    NS_UNUSED (who);
   }
 
   /**
@@ -893,12 +875,10 @@
    * \param h the header of segment
    * \param who the socket which has processed the ACK (SENDER or RECEIVER)
    */
-  virtual void ProcessedAck (const Ptr<const TcpSocketState> tcb,
-                             const TcpHeader& h, SocketWho who)
+  virtual void ProcessedAck ([[maybe_unused]] const Ptr<const TcpSocketState> tcb,
+                             [[maybe_unused]] const TcpHeader& h,
+                             [[maybe_unused]] SocketWho who)
   {
-    NS_UNUSED (tcb);
-    NS_UNUSED (h);
-    NS_UNUSED (who);
   }
 
   /**
@@ -925,10 +905,9 @@
    * \param tcb Transmission control block
    * \param who where the RTO has expired (SENDER or RECEIVER)
    */
-  virtual void AfterRTOExpired (const Ptr<const TcpSocketState> tcb, SocketWho who)
+  virtual void AfterRTOExpired ([[maybe_unused]] const Ptr<const TcpSocketState> tcb,
+                                [[maybe_unused]] SocketWho who)
   {
-    NS_UNUSED (tcb);
-    NS_UNUSED (who);
   }
 
   /**
@@ -937,10 +916,9 @@
    * \param tcb Transmission control block
    * \param who where the RTO has expired (SENDER or RECEIVER)
    */
-  virtual void BeforeRTOExpired (const Ptr<const TcpSocketState> tcb, SocketWho who)
+  virtual void BeforeRTOExpired ([[maybe_unused]] const Ptr<const TcpSocketState> tcb,
+                                 [[maybe_unused]] SocketWho who)
   {
-    NS_UNUSED (tcb);
-    NS_UNUSED (who);
   }
 
   /**
@@ -950,13 +928,11 @@
    * \param isRetransmission self-explanatory
    * \param who where the rtt history was updated
    */
-  virtual void UpdatedRttHistory (const SequenceNumber32 & seq, uint32_t sz,
-                                  bool isRetransmission, SocketWho who)
+  virtual void UpdatedRttHistory ([[maybe_unused]] const SequenceNumber32 & seq,
+                                  [[maybe_unused]] uint32_t sz,
+                                  [[maybe_unused]] bool isRetransmission,
+                                  [[maybe_unused]] SocketWho who)
   {
-    NS_UNUSED (seq);
-    NS_UNUSED (sz);
-    NS_UNUSED (isRetransmission);
-    NS_UNUSED (who);
   }
 
   /**
@@ -965,10 +941,9 @@
    * \param size the amount of bytes transmitted
    * \param who where the RTO has expired (SENDER or RECEIVER)
    */
-  virtual void DataSent (uint32_t size, SocketWho who)
+  virtual void DataSent ([[maybe_unused]] uint32_t size,
+                         [[maybe_unused]] SocketWho who)
   {
-    NS_UNUSED (size);
-    NS_UNUSED (who);
   }
 
   /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/test/tcp-hybla-test.cc ns-3.36/src/internet/test/tcp-hybla-test.cc
--- ns-3.35/src/internet/test/tcp-hybla-test.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/test/tcp-hybla-test.cc	2022-04-30 18:23:57.878733600 -0700
@@ -79,9 +79,8 @@
 }
 
 void
-TcpHyblaIncrementTest::RhoUpdated (double oldVal, double newVal)
+TcpHyblaIncrementTest::RhoUpdated ([[maybe_unused]] double oldVal, double newVal)
 {
-  NS_UNUSED (oldVal);
   m_rho = newVal;
 }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/test/tcp-rate-ops-test.cc ns-3.36/src/internet/test/tcp-rate-ops-test.cc
--- ns-3.35/src/internet/test/tcp-rate-ops-test.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/test/tcp-rate-ops-test.cc	2022-04-30 18:23:57.882733600 -0700
@@ -359,9 +359,8 @@
 }
 
 void
-TcpRateLinuxWithSocketsTest::BytesInFlightTrace (uint32_t oldValue, uint32_t newValue)
+TcpRateLinuxWithSocketsTest::BytesInFlightTrace ([[maybe_unused]] uint32_t oldValue, uint32_t newValue)
 {
-  NS_UNUSED (oldValue);
   m_bytesInFlight = newValue;
 }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/test/tcp-rto-test.cc ns-3.36/src/internet/test/tcp-rto-test.cc
--- ns-3.35/src/internet/test/tcp-rto-test.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/test/tcp-rto-test.cc	2022-04-30 18:23:57.882733600 -0700
@@ -19,7 +19,6 @@
 
 #include "ns3/node.h"
 #include "ns3/log.h"
-#include "ns3/tcp-westwood.h"
 #include "ns3/simple-channel.h"
 #include "ns3/rtt-estimator.h"
 #include "tcp-general-test.h"
@@ -50,7 +49,7 @@
    * \param congControl Congestion control type.
    * \param msg Test description.
    */
-  TcpRtoTest (TypeId &congControl, const std::string &msg);
+  TcpRtoTest (const TypeId &congControl, const std::string &msg);
 
 protected:
 
@@ -69,7 +68,7 @@
   bool m_segmentReceived; //!< True if segments have been received.
 };
 
-TcpRtoTest::TcpRtoTest (TypeId &congControl, const std::string &desc)
+TcpRtoTest::TcpRtoTest (const TypeId &congControl, const std::string &desc)
   : TcpGeneralTest (desc),
     m_afterRTOExpired (false),
     m_segmentReceived (false)
@@ -183,12 +182,12 @@
 public:
   /**
    * \brief Constructor.
-   * \param congControl Congestion control type.
+   * \param congControl congestion control type
    * \param seqToDrop sequence number to drop
    * \param minRto minimum RTO
-   * \param msg Test description.
+   * \param msg test description
    */
-  TcpSsThreshRtoTest (TypeId &congControl, uint32_t seqToDrop, Time minRto, const std::string &msg);
+  TcpSsThreshRtoTest (const TypeId &congControl, uint32_t seqToDrop, Time minRto, const std::string &msg);
 
 protected:
 
@@ -201,7 +200,7 @@
 
   virtual void ConfigureEnvironment ();
 
-    /**
+  /**
    * \brief Called when a packet has been dropped.
    * \param ipH IPv4 header.
    * \param tcpH TCP header.
@@ -217,7 +216,7 @@
   Time m_minRtoTime; //!< the minimum RTO time
 };
 
-TcpSsThreshRtoTest::TcpSsThreshRtoTest (TypeId &congControl, uint32_t seqToDrop, Time minRto, const std::string &desc)
+TcpSsThreshRtoTest::TcpSsThreshRtoTest (const TypeId &congControl, uint32_t seqToDrop, Time minRto, const std::string &desc)
   : TcpGeneralTest (desc),
     m_seqToDrop (seqToDrop),
     m_minRtoTime (minRto)
@@ -251,7 +250,7 @@
 
   Ptr<TcpSeqErrorModel> errorModel = CreateObject<TcpSeqErrorModel> ();
 
-  for (uint32_t i = 0; i<3; ++i)
+  for (uint32_t i = 0; i < 3; ++i)
     {
       errorModel->AddSeqToKill (SequenceNumber32 (m_seqToDrop));
     }
@@ -263,7 +262,7 @@
 
 void
 TcpSsThreshRtoTest::PktDropped (const Ipv4Header &ipH, const TcpHeader& tcpH,
-                            Ptr<const Packet> p)
+                                Ptr<const Packet> p)
 {
   NS_LOG_DEBUG ("DROPPED! " << tcpH);
 }
@@ -302,8 +301,8 @@
   NS_LOG_DEBUG ("After RTO for " << who);
   Ptr<TcpSocketMsgBase> senderSocket = GetSenderSocket();
 
-  // compute the ssThresh according to RFC 5681, using the 
-  uint32_t ssThresh = std::max(m_bytesInFlightBeforeRto/2, 2*tcb->m_segmentSize);
+  // compute the ssThresh according to RFC 5681, using the
+  uint32_t ssThresh = std::max (m_bytesInFlightBeforeRto / 2, 2 * tcb->m_segmentSize);
 
   NS_LOG_DEBUG ("ssThresh " << ssThresh << " m_ssThreshSocket " << m_ssThreshSocket);
 
@@ -328,7 +327,7 @@
    * \param congControl Congestion control type.
    * \param msg Test description.
    */
-  TcpTimeRtoTest (TypeId &congControl, const std::string &msg);
+  TcpTimeRtoTest (const TypeId &congControl, const std::string &msg);
 
 protected:
   virtual Ptr<TcpSocketMsgBase> CreateSenderSocket (Ptr<Node> node);
@@ -355,8 +354,8 @@
 };
 
 
-TcpTimeRtoTest::TcpTimeRtoTest (TypeId &congControl, const std::string &desc)
-  :   TcpGeneralTest (desc),
+TcpTimeRtoTest::TcpTimeRtoTest (const TypeId &congControl, const std::string &desc)
+  : TcpGeneralTest (desc),
     m_senderSentSegments (0),
     m_closed (false)
 {
@@ -386,7 +385,7 @@
   Ptr<TcpSeqErrorModel> errorModel = CreateObject<TcpSeqErrorModel> ();
 
   // Drop packet for 7 times. At the 7th, the connection should be dropped.
-  for (uint32_t i = 0; i<7; ++i)
+  for (uint32_t i = 0; i < 7; ++i)
     {
       errorModel->AddSeqToKill (SequenceNumber32 (1));
     }
@@ -408,7 +407,7 @@
 
       if (h.GetFlags () & TcpHeader::SYN)
         {
-          NS_ASSERT (m_senderSentSegments == 1);
+          NS_TEST_ASSERT_MSG_EQ (m_senderSentSegments, 1, "Number of segments sent is different than 1");
 
           Time s_rto = GetRto (SENDER);
           NS_TEST_ASSERT_MSG_EQ (s_rto, GetConnTimeout (SENDER),
@@ -420,7 +419,7 @@
           NS_LOG_INFO ("TX: " << h << m_senderSentSegments);
 
           NS_TEST_ASSERT_MSG_EQ (h.GetSequenceNumber ().GetValue (), 1,
-                                 "First packet has been correctly sent");
+                                 "First packet was not correctly sent");
 
           // Remember, from RFC:
           // m_rto = Max (m_rtt->GetEstimate () +
@@ -434,13 +433,13 @@
               Time clockGranularity = GetClockGranularity (SENDER);
               m_previousRTO = rttEstimator->GetEstimate ();
 
-              if (clockGranularity > rttEstimator->GetVariation ()*4)
+              if (clockGranularity > rttEstimator->GetVariation () * 4)
                 {
                   m_previousRTO += clockGranularity;
                 }
               else
                 {
-                  m_previousRTO += rttEstimator->GetVariation ()*4;
+                  m_previousRTO += rttEstimator->GetVariation () * 4;
                 }
 
               m_previousRTO = Max (m_previousRTO, GetMinRto (SENDER));
@@ -459,12 +458,11 @@
     }
   else if (who == RECEIVER)
     {
-
     }
 }
 
 void
-TcpTimeRtoTest::ErrorClose  (SocketWho who)
+TcpTimeRtoTest::ErrorClose (SocketWho who)
 {
   m_closed = true;
 }
@@ -478,7 +476,7 @@
 
   if (actualRto < Seconds (60))
     {
-      NS_TEST_ASSERT_MSG_EQ_TOL (actualRto, m_previousRTO+m_previousRTO, Seconds (0.01),
+      NS_TEST_ASSERT_MSG_EQ_TOL (actualRto, m_previousRTO + m_previousRTO, Seconds (0.01),
                                  "RTO has not doubled after an expiration");
       m_previousRTO += m_previousRTO;
     }
@@ -515,25 +513,31 @@
 public:
   TcpRtoTestSuite () : TestSuite ("tcp-rto-test", UNIT)
   {
-    std::list<TypeId> types;
-    types.insert (types.begin (), TcpNewReno::GetTypeId ());
-    types.insert (types.begin (), TcpWestwood::GetTypeId ());
+    std::list<TypeId> types = {
+      TcpNewReno::GetTypeId (),
+    };
 
-    for (std::list<TypeId>::iterator it = types.begin (); it != types.end (); ++it)
+    for (const auto &t : types)
       {
-        AddTestCase (new TcpRtoTest ((*it), (*it).GetName () + " RTO retransmit testing"), TestCase::QUICK);
-        uint32_t seqToDrop = 25001;
-        Time minRto = Seconds (0.5);
+        AddTestCase (new TcpRtoTest (t, t.GetName () + " RTO retransmit testing"), TestCase::QUICK);
+
+        constexpr uint32_t seqToDrop = 25001;
+
         // With RTO of 0.5 seconds, BytesInFlight winds down to zero before RTO
-        AddTestCase (new TcpSsThreshRtoTest ((*it), seqToDrop, minRto, (*it).GetName () + " RTO ssthresh testing, set to 2*MSL"), TestCase::QUICK);
-        // With RTO of 0.005 seconds, FlightSize/2 > 2*SMSS 
-        minRto = Seconds (0.005);
-        AddTestCase (new TcpSsThreshRtoTest ((*it), seqToDrop, minRto, (*it).GetName () + " RTO ssthresh testing, set to half of BytesInFlight"), TestCase::QUICK);
-        AddTestCase (new TcpTimeRtoTest ((*it), (*it).GetName () + " RTO timing testing"), TestCase::QUICK);
+        AddTestCase (new TcpSsThreshRtoTest (
+                        t, seqToDrop, Seconds (0.5),
+                        t.GetName () + " RTO ssthresh testing, set to 2*MSL"),
+                     TestCase::QUICK);
+
+        // With RTO of 0.005 seconds, FlightSize/2 > 2*SMSS
+        AddTestCase (new TcpSsThreshRtoTest (
+                        t, seqToDrop, Seconds (0.005),
+                        t.GetName () + " RTO ssthresh testing, set to half of BytesInFlight"),
+                     TestCase::QUICK);
+
+        AddTestCase (new TcpTimeRtoTest (t, t.GetName () + " RTO timing testing"), TestCase::QUICK);
       }
   }
 };
 
 static TcpRtoTestSuite g_TcpRtoTestSuite; //!< Static variable for test initialization
-
-
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/test/tcp-rtt-estimation.cc ns-3.36/src/internet/test/tcp-rtt-estimation.cc
--- ns-3.35/src/internet/test/tcp-rtt-estimation.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/test/tcp-rtt-estimation.cc	2022-04-30 18:23:57.882733600 -0700
@@ -127,7 +127,7 @@
         }
 
       Ptr<RttEstimator> rttEstimator = GetRttEstimator (SENDER);
-      NS_ASSERT (rttEstimator != 0);
+      NS_TEST_ASSERT_MSG_NE (rttEstimator, 0, "rtt is 0 (and should be different from zero)");
       NS_LOG_DEBUG ("S Tx: seq=" << h.GetSequenceNumber () << " ack=" << h.GetAckNumber ());
       NS_TEST_ASSERT_MSG_NE (rttEstimator->GetEstimate (), Seconds (1),
                              "Default Estimate for the RTT");
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/test/tcp-slow-start-test.cc ns-3.36/src/internet/test/tcp-slow-start-test.cc
--- ns-3.35/src/internet/test/tcp-slow-start-test.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/test/tcp-slow-start-test.cc	2022-04-30 18:23:57.882733600 -0700
@@ -21,7 +21,6 @@
 #include "ns3/simple-channel.h"
 #include "ns3/node.h"
 #include "ns3/config.h"
-#include "ns3/tcp-westwood.h"
 #include "ns3/tcp-header.h"
 #include "tcp-general-test.h"
 
@@ -58,7 +57,7 @@
    * \param desc Test description.
    */
   TcpSlowStartNormalTest (uint32_t segmentSize, uint32_t packetSize,
-                          uint32_t initSsTh, uint32_t packets, TypeId& congControl,
+                          uint32_t initSsTh, uint32_t packets, const TypeId& congControl,
                           const std::string &desc);
 
 protected:
@@ -88,7 +87,7 @@
                                                 uint32_t packetSize,
                                                 uint32_t initSsTh,
                                                 uint32_t packets,
-                                                TypeId &typeId,
+                                                const TypeId &typeId,
                                                 const std::string &desc)
   : TcpGeneralTest (desc),
     m_ackedBytes (0),
@@ -231,7 +230,7 @@
    * \param desc Test description.
    */
   TcpSlowStartAttackerTest (uint32_t segmentSize, uint32_t packetSize,
-                            uint32_t initSsTh, uint32_t packets, TypeId& congControl,
+                            uint32_t initSsTh, uint32_t packets, const TypeId& congControl,
                             const std::string &desc);
 
 protected:
@@ -242,7 +241,8 @@
                                                     uint32_t packetSize,
                                                     uint32_t initSsTh,
                                                     uint32_t packets,
-                                                    TypeId &typeId, const std::string &msg)
+                                                    const TypeId &typeId,
+                                                    const std::string &msg)
   : TcpSlowStartNormalTest (segmentSize, packetSize, initSsTh, packets, typeId, msg)
 {
 
@@ -273,30 +273,31 @@
   TcpSlowStartTestSuite () : TestSuite ("tcp-slow-start-test", UNIT)
   {
     // This test have less packets to transmit than SsTh
-    std::list<TypeId> types;
-    types.insert (types.begin (), TcpNewReno::GetTypeId ());
-    types.insert (types.begin (), TcpWestwood::GetTypeId ());
+    std::list<TypeId> types = {
+      TcpNewReno::GetTypeId (),
+    };
 
-    for (std::list<TypeId>::iterator it = types.begin (); it != types.end (); ++it)
+    for (const auto &t : types)
       {
-        AddTestCase (new TcpSlowStartNormalTest (500, 500, 10000, 10, (*it),
-                                                 "slow start 500 byte, " + (*it).GetName ()),
+        std::string typeName = t.GetName ();
+
+        AddTestCase (new TcpSlowStartNormalTest (500, 500, 10000, 10, t,
+                                                 "slow start 500 byte, " + typeName),
                      TestCase::QUICK);
-        AddTestCase (new TcpSlowStartNormalTest (1000, 1000, 10000, 9, (*it),
-                                                 "slow start 1000 byte, " + (*it).GetName ()),
+        AddTestCase (new TcpSlowStartNormalTest (1000, 1000, 10000, 9, t,
+                                                 "slow start 1000 byte, " + typeName),
                      TestCase::QUICK);
-        AddTestCase (new TcpSlowStartNormalTest (500, 250, 10000, 10, (*it),
-                                                 "slow start small packets, " + (*it).GetName ()),
+        AddTestCase (new TcpSlowStartNormalTest (500, 250, 10000, 10, t,
+                                                 "slow start small packets, " + typeName),
                      TestCase::QUICK);
-        AddTestCase (new TcpSlowStartAttackerTest (500, 500, 10000, 10, (*it),
-                                                   "slow start ack attacker, 500 byte, " + (*it).GetName ()),
+        AddTestCase (new TcpSlowStartAttackerTest (500, 500, 10000, 10, t,
+                                                   "slow start ack attacker, 500 byte, " + typeName),
                      TestCase::QUICK);
-        AddTestCase (new TcpSlowStartAttackerTest (1000, 1000, 10000, 9, (*it),
-                                                   "slow start ack attacker, 1000 byte, " + (*it).GetName ()),
+        AddTestCase (new TcpSlowStartAttackerTest (1000, 1000, 10000, 9, t,
+                                                   "slow start ack attacker, 1000 byte, " + typeName),
                      TestCase::QUICK);
       }
   }
 };
 
 static TcpSlowStartTestSuite g_tcpSlowStartTestSuite; //!< Static variable for test initialization
-
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/test/udp-test.cc ns-3.36/src/internet/test/udp-test.cc
--- ns-3.35/src/internet/test/udp-test.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/test/udp-test.cc	2022-04-30 18:23:57.882733600 -0700
@@ -89,7 +89,7 @@
   uint32_t availableData;
   availableData = socket->GetRxAvailable ();
   m_receivedPacket = socket->Recv (std::numeric_limits<uint32_t>::max (), 0);
-  NS_ASSERT (availableData == m_receivedPacket->GetSize ());
+  NS_TEST_ASSERT_MSG_EQ (availableData, m_receivedPacket->GetSize (), "ReceivedPacket size is not equal to the Rx buffer size");
 }
 
 void
@@ -141,7 +141,7 @@
   uint32_t availableData;
   availableData = socket->GetRxAvailable ();
   m_receivedPacket = socket->Recv (std::numeric_limits<uint32_t>::max (), 0);
-  NS_ASSERT (availableData == m_receivedPacket->GetSize ());
+  NS_TEST_ASSERT_MSG_EQ (availableData, m_receivedPacket->GetSize (), "ReceivedPacket size is not equal to the Rx buffer size");
   //cast availableData to void, to suppress 'availableData' set but not used
   //compiler warning
   (void) availableData;
@@ -245,7 +245,7 @@
   uint32_t availableData;
   availableData = socket->GetRxAvailable ();
   m_receivedPacket = socket->Recv (std::numeric_limits<uint32_t>::max (), 0);
-  NS_ASSERT (availableData == m_receivedPacket->GetSize ());
+  NS_TEST_ASSERT_MSG_EQ (availableData, m_receivedPacket->GetSize (), "ReceivedPacket size is not equal to the Rx buffer size");
 }
 
 void UdpSocketImplTest::ReceivePkt2 (Ptr<Socket> socket)
@@ -253,7 +253,7 @@
   uint32_t availableData;
   availableData = socket->GetRxAvailable ();
   m_receivedPacket2 = socket->Recv (std::numeric_limits<uint32_t>::max (), 0);
-  NS_ASSERT (availableData == m_receivedPacket2->GetSize ());
+  NS_TEST_ASSERT_MSG_EQ (availableData, m_receivedPacket2->GetSize (), "ReceivedPacket size is not equal to the Rx buffer size");
 }
 
 void UdpSocketImplTest::SentPkt (Ptr<const QueueDiscItem> item)
@@ -552,7 +552,7 @@
   uint32_t availableData;
   availableData = socket->GetRxAvailable ();
   m_receivedPacket = socket->Recv (std::numeric_limits<uint32_t>::max (), 0);
-  NS_ASSERT (availableData == m_receivedPacket->GetSize ());
+  NS_TEST_ASSERT_MSG_EQ (availableData, m_receivedPacket->GetSize (), "ReceivedPacket size is not equal to the Rx buffer size");
   //cast availableData to void, to suppress 'availableData' set but not used
   //compiler warning
   (void) availableData;
@@ -563,7 +563,7 @@
   uint32_t availableData;
   availableData = socket->GetRxAvailable ();
   m_receivedPacket2 = socket->Recv (std::numeric_limits<uint32_t>::max (), 0);
-  NS_ASSERT (availableData == m_receivedPacket2->GetSize ());
+  NS_TEST_ASSERT_MSG_EQ (availableData, m_receivedPacket2->GetSize (), "ReceivedPacket size is not equal to the Rx buffer size");
   //cast availableData to void, to suppress 'availableData' set but not used
   //compiler warning
   (void) availableData;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet/wscript ns-3.36/src/internet/wscript
--- ns-3.35/src/internet/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,461 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-import os
-import sys
-
-from waflib import Options, Logs, Utils, Task
-
-
-# Required NSC version
-NSC_RELEASE_NAME = "nsc-0.5.3"
-
-
-def options(opt):
-    opt.add_option('--with-nsc',
-                   help=('Use Network Simulation Cradle, given by the indicated path,'
-                         ' to allow the use of real-world network stacks'),
-                   default='', dest='with_nsc')
-    opt.add_option('--disable-nsc',
-                   help=('Disable Network Simulation Cradle support'),
-                   dest='disable_nsc', default=False, action="store_true")
-
-def configure(conf):
-    conf.env['ENABLE_NSC'] = False
-
-    if Options.options.disable_nsc:
-        conf.report_optional_feature("nsc", "Network Simulation Cradle", False,
-                                     "disabled by user request")
-        return
-
-    # checks for flex and bison, which is needed to build NSCs globaliser
-    # TODO: how to move these checks into the allinone scripts?
-    #def check_nsc_buildutils():
-    #    import flex
-    #    import bison
-    #    conf.check_tool('flex bison')
-    #    conf.check(lib='fl', mandatory=True)
-
-    # Check for the location of NSC
-    lib_to_check = 'liblinux2.6.26.so'
-    if Options.options.with_nsc:
-        if os.path.isdir(Options.options.with_nsc):
-            conf.msg("Checking for NSC location", ("%s (given)" % Options.options.with_nsc))
-            conf.env['WITH_NSC'] = os.path.abspath(Options.options.with_nsc)
-    else:
-        # bake.py uses ../../build, while ns-3-dev uses ../nsc,
-        # and ns-3 release uses ../NSC_RELEASE_NAME
-        nsc_bake_build_dir = os.path.join('..', '..', 'build')
-        nsc_bake_lib_dir = os.path.join(nsc_bake_build_dir, 'lib')
-        nsc_dir = os.path.join('..', "nsc")
-        nsc_release_dir = os.path.join('..', NSC_RELEASE_NAME)
-        if os.path.exists(os.path.join(nsc_bake_lib_dir, lib_to_check)):
-            conf.msg("Checking for NSC location",("%s (guessed)" % nsc_bake_build_dir))
-            conf.env['WITH_NSC'] = os.path.abspath(nsc_bake_build_dir)
-        elif os.path.isdir(nsc_dir):
-            conf.msg("Checking for NSC location",("%s (guessed)" % nsc_dir))
-            conf.env['WITH_NSC'] = os.path.abspath(nsc_dir)
-        elif os.path.isdir(nsc_release_dir):
-            conf.msg("Checking for NSC location", ("%s (guessed)" % nsc_release_dir))
-            conf.env['WITH_NSC'] = os.path.abspath(nsc_release_dir)
-        del nsc_bake_build_dir
-        del nsc_bake_lib_dir
-        del nsc_dir
-        del nsc_release_dir
-
-    if not conf.env['WITH_NSC']:
-        conf.msg("Checking for NSC location", False)
-        conf.report_optional_feature("nsc", "Network Simulation Cradle", False,
-                                     "NSC not found (see option --with-nsc)")
-        return
-    
-    if Utils.unversioned_sys_platform() in ['linux', 'freebsd']:
-        arch = os.uname()[4]
-    else:
-        arch = None
-    ok = False
-    if arch in ('amd64', 'x86_64', 'i686', 'i586', 'i486', 'i386'):
-        conf.env['NSC_ENABLED'] = True
-        conf.env.append_value('CXXDEFINES', 'NETWORK_SIMULATION_CRADLE')
-        conf.check_nonfatal(mandatory=True, lib='dl', define_name='HAVE_DL', uselib_store='DL')
-        ok = True
-    conf.msg('Checking for NSC supported architecture ' + (arch or ''), ok)
-    
-    if not ok:
-        conf.env['NSC_ENABLED'] = False
-        conf.report_optional_feature("nsc", "Network Simulation Cradle", False,
-                                     "architecture %r not supported" % arch)
-        return
-
-    found = False
-    for path in ['.', 'lib', 'lib64', 'linux-2.6.26']:
-        if os.path.exists(os.path.join(conf.env['WITH_NSC'], path, lib_to_check)):
-            # append the NSC kernel dir to the module path so that this dir
-            # will end up in the LD_LIBRARY_PATH, thus allowing the NSC NS-3
-            # module to find the necessary NSC shared libraries.
-            found = True
-            conf.env.append_value('NS3_MODULE_PATH',
-                                  os.path.abspath(os.path.join(conf.env['WITH_NSC'], path)))
-    if not found:
-        conf.env['NSC_ENABLED'] = False
-        conf.report_optional_feature("nsc", "Network Simulation Cradle", False,
-                                     "NSC library %s is missing: NSC has not been built?" % lib_to_check)
-    else:
-        conf.report_optional_feature("nsc", "Network Simulation Cradle", True, "")
-
-
-def build(bld):
-    # bridge dependency is due to global routing
-    obj = bld.create_ns3_module('internet', ['bridge', 'traffic-control', 'network', 'core'])
-    obj.source = [
-        'model/ip-l4-protocol.cc',
-        'model/udp-header.cc',
-        'model/tcp-header.cc',
-        'model/ipv4-interface.cc',
-        'model/ipv4-l3-protocol.cc',
-        'model/ipv4-end-point.cc',
-        'model/udp-l4-protocol.cc',
-        'model/tcp-l4-protocol.cc',
-        'model/arp-header.cc',
-        'model/arp-cache.cc',
-        'model/arp-l3-protocol.cc',
-        'model/arp-queue-disc-item.cc',
-        'model/udp-socket-impl.cc',
-        'model/ipv4-end-point-demux.cc',
-        'model/udp-socket-factory-impl.cc',
-        'model/tcp-socket-factory-impl.cc',
-        'model/pending-data.cc',
-        'model/rtt-estimator.cc',
-        'model/ipv4-raw-socket-factory-impl.cc',
-        'model/ipv4-raw-socket-impl.cc',
-        'model/icmpv4.cc',
-        'model/icmpv4-l4-protocol.cc',
-        'model/loopback-net-device.cc',
-        'model/ndisc-cache.cc',
-        'model/ipv6-interface.cc',
-        'model/icmpv6-header.cc',
-        'model/ipv6-l3-protocol.cc',
-        'model/ipv6-end-point.cc',
-        'model/ipv6-end-point-demux.cc',
-        'model/ipv6-raw-socket-factory-impl.cc',
-        'model/ipv6-raw-socket-impl.cc',
-        'model/ipv6-autoconfigured-prefix.cc',
-        'model/ipv6-extension.cc',
-        'model/ipv6-extension-header.cc',
-        'model/ipv6-extension-demux.cc',
-        'model/ipv6-option.cc',
-        'model/ipv6-option-header.cc',
-        'model/ipv6-option-demux.cc',
-        'model/icmpv6-l4-protocol.cc',
-        'model/tcp-socket-base.cc',
-        'model/tcp-socket-state.cc',
-        'model/tcp-highspeed.cc',
-        'model/tcp-hybla.cc',
-        'model/tcp-vegas.cc',
-        'model/tcp-congestion-ops.cc',
-        'model/tcp-linux-reno.cc',
-        'model/tcp-westwood.cc',
-        'model/tcp-scalable.cc', 
-        'model/tcp-veno.cc',
-        'model/tcp-bic.cc',
-        'model/tcp-cubic.cc',
-        'model/tcp-yeah.cc',
-        'model/tcp-ledbat.cc',
-        'model/tcp-illinois.cc',
-        'model/tcp-htcp.cc',
-        'model/tcp-lp.cc',
-        'model/tcp-dctcp.cc',
-        'model/tcp-bbr.cc',
-        'model/tcp-rx-buffer.cc',
-        'model/tcp-tx-buffer.cc',
-        'model/tcp-tx-item.cc',
-        'model/tcp-rate-ops.cc',
-        'model/tcp-option.cc',
-        'model/tcp-option-rfc793.cc',
-        'model/tcp-option-winscale.cc',
-        'model/tcp-option-ts.cc',
-        'model/tcp-option-sack-permitted.cc',
-        'model/tcp-option-sack.cc',
-        'model/ipv4-packet-info-tag.cc',
-        'model/ipv6-packet-info-tag.cc',
-        'model/ipv4-interface-address.cc',
-        'model/ipv4-address-generator.cc',
-        'model/ipv4-header.cc',
-        'model/ipv4-queue-disc-item.cc',
-        'model/ipv4-packet-filter.cc',
-        'model/ipv4-route.cc',
-        'model/ipv4-routing-protocol.cc',
-        'model/udp-socket.cc',
-        'model/udp-socket-factory.cc',
-        'model/tcp-socket.cc',
-        'model/tcp-socket-factory.cc',
-        'model/tcp-recovery-ops.cc',
-        'model/tcp-prr-recovery.cc',
-        'model/ipv4.cc',
-        'model/ipv4-raw-socket-factory.cc',
-        'model/ipv6-header.cc',
-        'model/ipv6-queue-disc-item.cc',
-        'model/ipv6-packet-filter.cc',
-        'model/ipv6-interface-address.cc',
-        'model/ipv6-route.cc',
-        'model/ipv6.cc',
-        'model/ipv6-raw-socket-factory.cc',
-        'model/ipv6-routing-protocol.cc',
-        'model/ipv4-list-routing.cc',
-        'model/ipv6-list-routing.cc',
-        'helper/ipv4-list-routing-helper.cc',
-        'helper/ipv6-list-routing-helper.cc',
-        'model/ipv4-static-routing.cc',
-        'model/ipv4-routing-table-entry.cc',
-        'model/ipv6-static-routing.cc',
-        'model/ipv6-routing-table-entry.cc',
-        'helper/ipv4-static-routing-helper.cc',
-        'helper/ipv6-static-routing-helper.cc',
-        'model/global-router-interface.cc',
-        'model/global-route-manager.cc',
-        'model/global-route-manager-impl.cc',
-        'model/candidate-queue.cc',
-        'model/ipv4-global-routing.cc',
-        'helper/ipv4-global-routing-helper.cc',
-        'helper/internet-stack-helper.cc',
-        'helper/internet-trace-helper.cc',
-        'helper/ipv4-address-helper.cc',
-        'helper/ipv4-interface-container.cc',
-        'helper/ipv4-routing-helper.cc',
-        'helper/ipv6-address-helper.cc',
-        'helper/ipv6-interface-container.cc',
-        'helper/ipv6-routing-helper.cc',
-        'model/ipv6-address-generator.cc',
-        'model/ipv4-packet-probe.cc',
-        'model/ipv6-packet-probe.cc',
-        'model/ipv6-pmtu-cache.cc',
-        'model/ripng.cc',
-        'model/ripng-header.cc',
-        'helper/ripng-helper.cc',
-        'model/rip.cc',
-        'model/rip-header.cc',
-        'helper/rip-helper.cc',
-        ]
-
-    internet_test = bld.create_ns3_module_test_library('internet')
-    internet_test.source = [
-        'test/global-route-manager-impl-test-suite.cc',
-        'test/ipv4-address-generator-test-suite.cc',
-        'test/ipv4-address-helper-test-suite.cc',
-        'test/ipv4-list-routing-test-suite.cc',
-        'test/ipv4-packet-info-tag-test-suite.cc',
-        'test/ipv4-raw-test.cc',
-        'test/ipv4-header-test.cc',
-        'test/ipv4-fragmentation-test.cc',
-        'test/ipv4-forwarding-test.cc',
-        'test/ipv4-test.cc',
-        'test/ipv4-static-routing-test-suite.cc',
-        'test/ipv4-global-routing-test-suite.cc',
-        'test/ipv6-extension-header-test-suite.cc',
-        'test/ipv6-list-routing-test-suite.cc',
-        'test/ipv6-packet-info-tag-test-suite.cc',
-        'test/ipv6-test.cc',
-        'test/ipv6-raw-test.cc',
-        'test/ipv6-address-duplication-test.cc',
-        'test/tcp-test.cc',
-        'test/tcp-timestamp-test.cc',
-        'test/tcp-sack-permitted-test.cc',
-        'test/tcp-wscaling-test.cc',
-        'test/tcp-option-test.cc',
-        'test/tcp-header-test.cc',
-        'test/tcp-ecn-test.cc',
-        'test/tcp-general-test.cc',
-        'test/tcp-error-model.cc',
-        'test/tcp-slow-start-test.cc',
-        'test/tcp-cong-avoid-test.cc',
-        'test/tcp-fast-retr-test.cc',
-        'test/tcp-rto-test.cc',
-        'test/tcp-highspeed-test.cc',
-        'test/tcp-hybla-test.cc',
-        'test/tcp-vegas-test.cc',
-        'test/tcp-scalable-test.cc',
-        'test/tcp-veno-test.cc',
-        'test/tcp-bic-test.cc',
-        'test/tcp-yeah-test.cc',
-        'test/tcp-illinois-test.cc',
-        'test/tcp-htcp-test.cc',
-        'test/tcp-lp-test.cc',
-        'test/tcp-ledbat-test.cc',
-        'test/tcp-zero-window-test.cc',
-        'test/tcp-pkts-acked-test.cc',
-        'test/tcp-rtt-estimation.cc',
-        'test/tcp-bytes-in-flight-test.cc',
-        'test/tcp-advertised-window-test.cc',
-        'test/tcp-classic-recovery-test.cc',
-        'test/tcp-prr-recovery-test.cc',
-        'test/tcp-loss-test.cc',
-        'test/tcp-linux-reno-test.cc',
-        'test/udp-test.cc',
-        'test/ipv6-address-generator-test-suite.cc',
-        'test/ipv6-dual-stack-test-suite.cc',
-        'test/ipv6-fragmentation-test.cc',
-        'test/ipv6-forwarding-test.cc',
-        'test/ipv6-ripng-test.cc',
-        'test/ipv6-address-helper-test-suite.cc',
-        'test/rtt-test.cc',
-        'test/tcp-tx-buffer-test.cc',
-        'test/tcp-rx-buffer-test.cc',
-        'test/tcp-endpoint-bug2211.cc',
-        'test/tcp-datasentcb-test.cc',
-        'test/tcp-rate-ops-test.cc',
-        'test/ipv4-rip-test.cc',
-        'test/tcp-close-test.cc',
-        'test/icmp-test.cc',
-        'test/ipv4-deduplication-test.cc',
-        'test/tcp-dctcp-test.cc',
-        'test/tcp-syn-connection-failed-test.cc',
-        'test/tcp-pacing-test.cc',
-        'test/tcp-bbr-test.cc',
-        ]
-    # Tests encapsulating example programs should be listed here
-    if (bld.env['ENABLE_EXAMPLES']):
-        internet_test.source.extend([
-        #   'test/internet-examples-test-suite.cc',
-            ])
-    
-    privateheaders = bld(features='ns3privateheader')
-    privateheaders.module = 'internet'
-    privateheaders.source = [
-        ]
-    headers = bld(features='ns3header')
-    headers.module = 'internet'
-    headers.source = [
-        'model/udp-header.h',
-        'model/tcp-header.h',
-        'model/tcp-option.h',
-        'model/tcp-option-winscale.h',
-        'model/tcp-option-ts.h',
-        'model/tcp-option-sack-permitted.h',
-        'model/tcp-option-sack.h',
-        'model/tcp-option-rfc793.h',
-        'model/icmpv4.h',
-        'model/icmpv6-header.h',
-        # used by routing
-        'model/ipv4-interface.h',
-        'model/ipv4-l3-protocol.h',
-        'model/ipv4-end-point.h',
-        'model/ipv4-end-point-demux.h',
-        'model/ipv6-l3-protocol.h',
-        'model/ipv6-extension.h',
-        'model/ipv6-extension-demux.h',
-        'model/ipv6-extension-header.h',
-        'model/ipv6-option.h',
-        'model/ipv6-option-header.h',
-        'model/ipv6-end-point.h',
-        'model/ipv6-end-point-demux.h',
-        'model/arp-l3-protocol.h',
-        'model/udp-l4-protocol.h',
-        'model/tcp-l4-protocol.h',
-        'model/icmpv4-l4-protocol.h',
-        'model/ip-l4-protocol.h',
-        'model/arp-header.h',
-        'model/arp-cache.h',
-        'model/arp-queue-disc-item.h',
-        'model/icmpv6-l4-protocol.h',
-        'model/ipv6-interface.h',
-        'model/ndisc-cache.h',
-        'model/loopback-net-device.h',
-        'model/ipv4-packet-info-tag.h',
-        'model/ipv6-packet-info-tag.h',
-        'model/ipv4-interface-address.h',
-        'model/ipv4-address-generator.h',
-        'model/ipv4-header.h',
-        'model/ipv4-queue-disc-item.h',
-        'model/ipv4-packet-filter.h',
-        'model/ipv4-route.h',
-        'model/ipv4-routing-protocol.h',
-        'model/udp-socket.h',
-        'model/udp-socket-factory.h',
-        'model/tcp-socket.h',
-        'model/tcp-socket-factory.h',
-        'model/ipv4.h',
-        'model/ipv4-raw-socket-factory.h',
-        'model/ipv4-raw-socket-impl.h',
-        'model/ipv6-header.h',
-        'model/ipv6-queue-disc-item.h',
-        'model/ipv6-packet-filter.h',
-        'model/ipv6-interface-address.h',
-        'model/ipv6-route.h',
-        'model/ipv6.h',
-        'model/ipv6-raw-socket-factory.h',
-        'model/ipv6-routing-protocol.h',
-        'model/ipv4-list-routing.h',
-        'model/ipv6-list-routing.h',
-        'helper/ipv4-list-routing-helper.h',
-        'helper/ipv6-list-routing-helper.h',
-        'model/ipv4-static-routing.h',
-        'model/ipv4-routing-table-entry.h',
-        'model/ipv6-static-routing.h',
-        'model/ipv6-routing-table-entry.h',
-        'helper/ipv4-static-routing-helper.h',
-        'helper/ipv6-static-routing-helper.h',
-        'model/global-router-interface.h',
-        'model/global-route-manager.h',
-        'model/global-route-manager-impl.h',
-        'model/candidate-queue.h',
-        'model/ipv4-global-routing.h',
-        'helper/ipv4-global-routing-helper.h',
-        'helper/internet-stack-helper.h',
-        'helper/internet-trace-helper.h',
-        'helper/ipv4-address-helper.h',
-        'helper/ipv4-interface-container.h',
-        'helper/ipv4-routing-helper.h',
-        'helper/ipv6-address-helper.h',
-        'helper/ipv6-interface-container.h',
-        'helper/ipv6-routing-helper.h',
-        'model/ipv6-address-generator.h',
-        'model/tcp-highspeed.h',
-        'model/tcp-hybla.h',
-        'model/tcp-vegas.h',
-        'model/tcp-congestion-ops.h',
-        'model/tcp-linux-reno.h',
-        'model/tcp-westwood.h',
-        'model/tcp-scalable.h',
-        'model/tcp-veno.h',
-        'model/tcp-bic.h',
-        'model/tcp-cubic.h',
-        'model/tcp-yeah.h',
-        'model/tcp-illinois.h',
-        'model/tcp-htcp.h',
-        'model/tcp-lp.h',
-        'model/tcp-dctcp.h',
-        'model/windowed-filter.h',
-        'model/tcp-bbr.h',
-        'model/tcp-ledbat.h',
-        'model/tcp-socket-base.h',
-        'model/tcp-socket-state.h',
-        'model/tcp-tx-buffer.h',
-        'model/tcp-tx-item.h',
-        'model/tcp-rate-ops.h',
-        'model/tcp-rx-buffer.h',
-        'model/tcp-recovery-ops.h',
-        'model/tcp-prr-recovery.h',
-        'model/rtt-estimator.h',
-        'model/ipv4-packet-probe.h',
-        'model/ipv6-packet-probe.h',
-        'model/ipv6-pmtu-cache.h',
-        'model/ripng.h',
-        'model/ripng-header.h',
-        'helper/ripng-helper.h',
-        'model/rip.h',
-        'model/rip-header.h',
-        'helper/rip-helper.h',
-       ]
-
-    if bld.env['NSC_ENABLED']:
-        obj.source.append ('model/nsc-tcp-socket-impl.cc')
-        obj.source.append ('model/nsc-tcp-l4-protocol.cc')
-        obj.source.append ('model/nsc-tcp-socket-factory-impl.cc')
-        obj.source.append ('model/nsc-sysctl.cc')
-        headers.source.append('model/nsc-tcp-l4-protocol.h')
-        obj.use.append('DL')
-        internet_test.use.append('DL')
-
-    if (bld.env['ENABLE_EXAMPLES']):
-        bld.recurse('examples')
-
-    bld.ns3_python_bindings()
-
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet-apps/bindings/callbacks_list.py ns-3.36/src/internet-apps/bindings/callbacks_list.py
--- ns-3.35/src/internet-apps/bindings/callbacks_list.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet-apps/bindings/callbacks_list.py	2022-04-30 18:23:57.846733600 -0700
@@ -2,11 +2,11 @@
     ['ns3::ObjectBase *', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'const ns3::Address &', 'const ns3::Address &', 'ns3::NetDevice::PacketType', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'const ns3::Ipv4Address &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<ns3::Socket>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['bool', 'ns3::Ptr<ns3::Socket>', 'const ns3::Address &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<ns3::Socket>', 'const ns3::Address &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<ns3::Socket>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'const ns3::Ipv4Address &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::Ptr<ns3::Ipv6>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'const ns3::Ipv6Header &', 'ns3::Ptr<const ns3::Packet>', 'ns3::Ipv6L3Protocol::DropReason', 'ns3::Ptr<ns3::Ipv6>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'const ns3::Ipv6Header &', 'ns3::Ptr<const ns3::Packet>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet-apps/bindings/modulegen__gcc_ILP32.py ns-3.36/src/internet-apps/bindings/modulegen__gcc_ILP32.py
--- ns-3.35/src/internet-apps/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet-apps/bindings/modulegen__gcc_ILP32.py	2022-04-30 18:23:57.850733500 -0700
@@ -86,6 +86,8 @@
     module.add_class('DhcpHelper')
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'], import_from_module='ns.core')
     ## hash.h (module 'core'): ns3::Hasher [class]
     module.add_class('Hasher', import_from_module='ns.core')
     ## inet6-socket-address.h (module 'network'): ns3::Inet6SocketAddress [class]
@@ -245,33 +247,33 @@
     module.add_class('RandomVariableStream', import_from_module='ns.core', parent=root_module['ns3::Object'])
     ## random-variable-stream.h (module 'core'): ns3::SequentialRandomVariable [class]
     module.add_class('SequentialRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv4MulticastRoute', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv4Route', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv4Route>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::OutputStreamWrapper', 'ns3::empty', 'ns3::DefaultDeleter<ns3::OutputStreamWrapper>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::RadvdInterface, ns3::empty, ns3::DefaultDeleter<ns3::RadvdInterface> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::RadvdInterface, ns3::empty, ns3::DefaultDeleter<ns3::RadvdInterface>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::RadvdInterface', 'ns3::empty', 'ns3::DefaultDeleter<ns3::RadvdInterface>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::RadvdPrefix, ns3::empty, ns3::DefaultDeleter<ns3::RadvdPrefix> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::RadvdPrefix, ns3::empty, ns3::DefaultDeleter<ns3::RadvdPrefix>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::RadvdPrefix', 'ns3::empty', 'ns3::DefaultDeleter<ns3::RadvdPrefix>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
     ## socket.h (module 'network'): ns3::Socket [class]
     module.add_class('Socket', import_from_module='ns.network', parent=root_module['ns3::Object'])
@@ -532,7 +534,7 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::Socket>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Time', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     module.add_container('std::vector< ns3::Ipv6Address >', 'ns3::Ipv6Address', container_type='vector')
     module.add_container('std::map< unsigned int, unsigned int >', ('unsigned int', 'unsigned int'), container_type='map')
     module.add_container('std::list< ns3::Ptr< ns3::RadvdPrefix > >', 'ns3::Ptr< ns3::RadvdPrefix >', container_type='list')
@@ -2889,6 +2891,8 @@
     cls.add_constructor([param('ns3::ObjectFactory const &', 'arg0')])
     ## object-factory.h (module 'core'): ns3::ObjectFactory::ObjectFactory() [constructor]
     cls.add_constructor([])
+    ## object-factory.h (module 'core'): ns3::ObjectFactory::ObjectFactory(std::string const & typeId) [constructor]
+    cls.add_constructor([param('std::string const &', 'typeId')])
     ## object-factory.h (module 'core'): ns3::Ptr<ns3::Object> ns3::ObjectFactory::Create() const [member function]
     cls.add_method('Create', 
                    'ns3::Ptr< ns3::Object >', 
@@ -3163,7 +3167,7 @@
     cls.add_method('SetRemote', 
                    'void', 
                    [param('ns3::Ipv6Address', 'ip')])
-    ## ping6-helper.h (module 'internet-apps'): void ns3::Ping6Helper::SetRoutersAddress(std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address> > routers) [member function]
+    ## ping6-helper.h (module 'internet-apps'): void ns3::Ping6Helper::SetRoutersAddress(std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address>> routers) [member function]
     cls.add_method('SetRoutersAddress', 
                    'void', 
                    [param('std::vector< ns3::Ipv6Address >', 'routers')])
@@ -3655,8 +3659,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -3941,14 +3945,14 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('>=')
     cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_unary_numeric_operator('-')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
     cls.add_constructor([])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(double const value) [constructor]
@@ -3967,6 +3971,8 @@
     cls.add_constructor([param('long unsigned int const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int const v) [constructor]
     cls.add_constructor([param('long long unsigned int const', 'v')])
+    ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int128_t const v) [constructor]
+    cls.add_constructor([param('int128_t const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t const hi, uint64_t const lo) [constructor]
     cls.add_constructor([param('int64_t const', 'hi'), param('uint64_t const', 'lo')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [constructor]
@@ -4382,100 +4388,100 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Ipv4MulticastRoute_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv4MulticastRoute__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter< ns3::Ipv4MulticastRoute > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Ipv4Route_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv4Route__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter< ns3::Ipv4Route > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3OutputStreamWrapper_Ns3Empty_Ns3DefaultDeleter__lt__ns3OutputStreamWrapper__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter< ns3::OutputStreamWrapper > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3RadvdInterface_Ns3Empty_Ns3DefaultDeleter__lt__ns3RadvdInterface__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::RadvdInterface, ns3::empty, ns3::DefaultDeleter<ns3::RadvdInterface> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::RadvdInterface, ns3::empty, ns3::DefaultDeleter<ns3::RadvdInterface>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::RadvdInterface, ns3::empty, ns3::DefaultDeleter<ns3::RadvdInterface> >::SimpleRefCount(ns3::SimpleRefCount<ns3::RadvdInterface, ns3::empty, ns3::DefaultDeleter<ns3::RadvdInterface> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::RadvdInterface, ns3::empty, ns3::DefaultDeleter<ns3::RadvdInterface>>::SimpleRefCount(ns3::SimpleRefCount<ns3::RadvdInterface, ns3::empty, ns3::DefaultDeleter<ns3::RadvdInterface>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::RadvdInterface, ns3::empty, ns3::DefaultDeleter< ns3::RadvdInterface > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3RadvdPrefix_Ns3Empty_Ns3DefaultDeleter__lt__ns3RadvdPrefix__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::RadvdPrefix, ns3::empty, ns3::DefaultDeleter<ns3::RadvdPrefix> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::RadvdPrefix, ns3::empty, ns3::DefaultDeleter<ns3::RadvdPrefix>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::RadvdPrefix, ns3::empty, ns3::DefaultDeleter<ns3::RadvdPrefix> >::SimpleRefCount(ns3::SimpleRefCount<ns3::RadvdPrefix, ns3::empty, ns3::DefaultDeleter<ns3::RadvdPrefix> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::RadvdPrefix, ns3::empty, ns3::DefaultDeleter<ns3::RadvdPrefix>>::SimpleRefCount(ns3::SimpleRefCount<ns3::RadvdPrefix, ns3::empty, ns3::DefaultDeleter<ns3::RadvdPrefix>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::RadvdPrefix, ns3::empty, ns3::DefaultDeleter< ns3::RadvdPrefix > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
@@ -4598,7 +4604,7 @@
                    'uint8_t', 
                    [param('uint8_t', 'ipTos')], 
                    is_static=True)
-    ## socket.h (module 'network'): void ns3::Socket::Ipv6JoinGroup(ns3::Ipv6Address address, ns3::Socket::Ipv6MulticastFilterMode filterMode, std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address> > sourceAddresses) [member function]
+    ## socket.h (module 'network'): void ns3::Socket::Ipv6JoinGroup(ns3::Ipv6Address address, ns3::Socket::Ipv6MulticastFilterMode filterMode, std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address>> sourceAddresses) [member function]
     cls.add_method('Ipv6JoinGroup', 
                    'void', 
                    [param('ns3::Ipv6Address', 'address'), param('ns3::Socket::Ipv6MulticastFilterMode', 'filterMode'), param('std::vector< ns3::Ipv6Address >', 'sourceAddresses')], 
@@ -5626,22 +5632,22 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ipv4Address const&'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::Socket> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::Socket> '], visibility='protected')
+                   is_static=True, template_parameters=['bool'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['bool'], visibility='protected')
+                   is_static=True, template_parameters=['unsigned int'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['unsigned int'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ipv4Address const&'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
@@ -6780,7 +6786,7 @@
                    'ns3::Ipv4Address', 
                    [], 
                    is_const=True)
-    ## ipv4-route.h (module 'internet'): std::map<unsigned int, unsigned int, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, unsigned int> > > ns3::Ipv4MulticastRoute::GetOutputTtlMap() const [member function]
+    ## ipv4-route.h (module 'internet'): std::map<unsigned int, unsigned int, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, unsigned int>>> ns3::Ipv4MulticastRoute::GetOutputTtlMap() const [member function]
     cls.add_method('GetOutputTtlMap', 
                    'std::map< unsigned int, unsigned int >', 
                    [], 
@@ -7761,10 +7767,16 @@
     cls.add_method('ExtractNeighborIndex', 
                    'uint32_t', 
                    [param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetEpoch() const [member function]
+    cls.add_method('GetEpoch', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() const [member function]
     cls.add_method('GetRemainingBits', 
                    'uint32_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -7775,6 +7787,10 @@
                    'uint32_t', 
                    [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
+    ## nix-vector.h (module 'network'): void ns3::NixVector::SetEpoch(uint32_t epoch) [member function]
+    cls.add_method('SetEpoch', 
+                   'void', 
+                   [param('uint32_t', 'epoch')])
     return
 
 def register_Ns3Node_methods(root_module, cls):
@@ -8151,10 +8167,11 @@
                    'uint32_t', 
                    [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) const [member function]
     cls.add_method('SetNixVector', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')], 
+                   is_const=True)
     ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
     cls.add_method('ToString', 
                    'std::string', 
@@ -8227,7 +8244,7 @@
     cls.add_method('SetRemote', 
                    'void', 
                    [param('ns3::Ipv6Address', 'ipv6')])
-    ## ping6.h (module 'internet-apps'): void ns3::Ping6::SetRouters(std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address> > routers) [member function]
+    ## ping6.h (module 'internet-apps'): void ns3::Ping6::SetRouters(std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address>> routers) [member function]
     cls.add_method('SetRouters', 
                    'void', 
                    [param('std::vector< ns3::Ipv6Address >', 'routers')])
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet-apps/bindings/modulegen__gcc_LP64.py ns-3.36/src/internet-apps/bindings/modulegen__gcc_LP64.py
--- ns-3.35/src/internet-apps/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet-apps/bindings/modulegen__gcc_LP64.py	2022-04-30 18:23:57.850733500 -0700
@@ -86,6 +86,8 @@
     module.add_class('DhcpHelper')
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'], import_from_module='ns.core')
     ## hash.h (module 'core'): ns3::Hasher [class]
     module.add_class('Hasher', import_from_module='ns.core')
     ## inet6-socket-address.h (module 'network'): ns3::Inet6SocketAddress [class]
@@ -245,33 +247,33 @@
     module.add_class('RandomVariableStream', import_from_module='ns.core', parent=root_module['ns3::Object'])
     ## random-variable-stream.h (module 'core'): ns3::SequentialRandomVariable [class]
     module.add_class('SequentialRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv4MulticastRoute', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv4Route', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv4Route>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::OutputStreamWrapper', 'ns3::empty', 'ns3::DefaultDeleter<ns3::OutputStreamWrapper>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::RadvdInterface, ns3::empty, ns3::DefaultDeleter<ns3::RadvdInterface> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::RadvdInterface, ns3::empty, ns3::DefaultDeleter<ns3::RadvdInterface>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::RadvdInterface', 'ns3::empty', 'ns3::DefaultDeleter<ns3::RadvdInterface>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::RadvdPrefix, ns3::empty, ns3::DefaultDeleter<ns3::RadvdPrefix> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::RadvdPrefix, ns3::empty, ns3::DefaultDeleter<ns3::RadvdPrefix>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::RadvdPrefix', 'ns3::empty', 'ns3::DefaultDeleter<ns3::RadvdPrefix>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
     ## socket.h (module 'network'): ns3::Socket [class]
     module.add_class('Socket', import_from_module='ns.network', parent=root_module['ns3::Object'])
@@ -532,7 +534,7 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::Socket>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Time', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     module.add_container('std::vector< ns3::Ipv6Address >', 'ns3::Ipv6Address', container_type='vector')
     module.add_container('std::map< unsigned int, unsigned int >', ('unsigned int', 'unsigned int'), container_type='map')
     module.add_container('std::list< ns3::Ptr< ns3::RadvdPrefix > >', 'ns3::Ptr< ns3::RadvdPrefix >', container_type='list')
@@ -2889,6 +2891,8 @@
     cls.add_constructor([param('ns3::ObjectFactory const &', 'arg0')])
     ## object-factory.h (module 'core'): ns3::ObjectFactory::ObjectFactory() [constructor]
     cls.add_constructor([])
+    ## object-factory.h (module 'core'): ns3::ObjectFactory::ObjectFactory(std::string const & typeId) [constructor]
+    cls.add_constructor([param('std::string const &', 'typeId')])
     ## object-factory.h (module 'core'): ns3::Ptr<ns3::Object> ns3::ObjectFactory::Create() const [member function]
     cls.add_method('Create', 
                    'ns3::Ptr< ns3::Object >', 
@@ -3163,7 +3167,7 @@
     cls.add_method('SetRemote', 
                    'void', 
                    [param('ns3::Ipv6Address', 'ip')])
-    ## ping6-helper.h (module 'internet-apps'): void ns3::Ping6Helper::SetRoutersAddress(std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address> > routers) [member function]
+    ## ping6-helper.h (module 'internet-apps'): void ns3::Ping6Helper::SetRoutersAddress(std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address>> routers) [member function]
     cls.add_method('SetRoutersAddress', 
                    'void', 
                    [param('std::vector< ns3::Ipv6Address >', 'routers')])
@@ -3655,8 +3659,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -3941,14 +3945,14 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('>=')
     cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_unary_numeric_operator('-')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
     cls.add_constructor([])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(double const value) [constructor]
@@ -3967,6 +3971,8 @@
     cls.add_constructor([param('long unsigned int const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int const v) [constructor]
     cls.add_constructor([param('long long unsigned int const', 'v')])
+    ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int128_t const v) [constructor]
+    cls.add_constructor([param('int128_t const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t const hi, uint64_t const lo) [constructor]
     cls.add_constructor([param('int64_t const', 'hi'), param('uint64_t const', 'lo')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [constructor]
@@ -4382,100 +4388,100 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Ipv4MulticastRoute_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv4MulticastRoute__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter< ns3::Ipv4MulticastRoute > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Ipv4Route_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv4Route__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter< ns3::Ipv4Route > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3OutputStreamWrapper_Ns3Empty_Ns3DefaultDeleter__lt__ns3OutputStreamWrapper__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter< ns3::OutputStreamWrapper > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3RadvdInterface_Ns3Empty_Ns3DefaultDeleter__lt__ns3RadvdInterface__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::RadvdInterface, ns3::empty, ns3::DefaultDeleter<ns3::RadvdInterface> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::RadvdInterface, ns3::empty, ns3::DefaultDeleter<ns3::RadvdInterface>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::RadvdInterface, ns3::empty, ns3::DefaultDeleter<ns3::RadvdInterface> >::SimpleRefCount(ns3::SimpleRefCount<ns3::RadvdInterface, ns3::empty, ns3::DefaultDeleter<ns3::RadvdInterface> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::RadvdInterface, ns3::empty, ns3::DefaultDeleter<ns3::RadvdInterface>>::SimpleRefCount(ns3::SimpleRefCount<ns3::RadvdInterface, ns3::empty, ns3::DefaultDeleter<ns3::RadvdInterface>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::RadvdInterface, ns3::empty, ns3::DefaultDeleter< ns3::RadvdInterface > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3RadvdPrefix_Ns3Empty_Ns3DefaultDeleter__lt__ns3RadvdPrefix__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::RadvdPrefix, ns3::empty, ns3::DefaultDeleter<ns3::RadvdPrefix> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::RadvdPrefix, ns3::empty, ns3::DefaultDeleter<ns3::RadvdPrefix>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::RadvdPrefix, ns3::empty, ns3::DefaultDeleter<ns3::RadvdPrefix> >::SimpleRefCount(ns3::SimpleRefCount<ns3::RadvdPrefix, ns3::empty, ns3::DefaultDeleter<ns3::RadvdPrefix> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::RadvdPrefix, ns3::empty, ns3::DefaultDeleter<ns3::RadvdPrefix>>::SimpleRefCount(ns3::SimpleRefCount<ns3::RadvdPrefix, ns3::empty, ns3::DefaultDeleter<ns3::RadvdPrefix>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::RadvdPrefix, ns3::empty, ns3::DefaultDeleter< ns3::RadvdPrefix > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
@@ -4598,7 +4604,7 @@
                    'uint8_t', 
                    [param('uint8_t', 'ipTos')], 
                    is_static=True)
-    ## socket.h (module 'network'): void ns3::Socket::Ipv6JoinGroup(ns3::Ipv6Address address, ns3::Socket::Ipv6MulticastFilterMode filterMode, std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address> > sourceAddresses) [member function]
+    ## socket.h (module 'network'): void ns3::Socket::Ipv6JoinGroup(ns3::Ipv6Address address, ns3::Socket::Ipv6MulticastFilterMode filterMode, std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address>> sourceAddresses) [member function]
     cls.add_method('Ipv6JoinGroup', 
                    'void', 
                    [param('ns3::Ipv6Address', 'address'), param('ns3::Socket::Ipv6MulticastFilterMode', 'filterMode'), param('std::vector< ns3::Ipv6Address >', 'sourceAddresses')], 
@@ -5626,22 +5632,22 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ipv4Address const&'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::Socket> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::Socket> '], visibility='protected')
+                   is_static=True, template_parameters=['bool'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['bool'], visibility='protected')
+                   is_static=True, template_parameters=['unsigned int'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['unsigned int'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ipv4Address const&'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
@@ -6780,7 +6786,7 @@
                    'ns3::Ipv4Address', 
                    [], 
                    is_const=True)
-    ## ipv4-route.h (module 'internet'): std::map<unsigned int, unsigned int, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, unsigned int> > > ns3::Ipv4MulticastRoute::GetOutputTtlMap() const [member function]
+    ## ipv4-route.h (module 'internet'): std::map<unsigned int, unsigned int, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, unsigned int>>> ns3::Ipv4MulticastRoute::GetOutputTtlMap() const [member function]
     cls.add_method('GetOutputTtlMap', 
                    'std::map< unsigned int, unsigned int >', 
                    [], 
@@ -7761,10 +7767,16 @@
     cls.add_method('ExtractNeighborIndex', 
                    'uint32_t', 
                    [param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetEpoch() const [member function]
+    cls.add_method('GetEpoch', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() const [member function]
     cls.add_method('GetRemainingBits', 
                    'uint32_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -7775,6 +7787,10 @@
                    'uint32_t', 
                    [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
+    ## nix-vector.h (module 'network'): void ns3::NixVector::SetEpoch(uint32_t epoch) [member function]
+    cls.add_method('SetEpoch', 
+                   'void', 
+                   [param('uint32_t', 'epoch')])
     return
 
 def register_Ns3Node_methods(root_module, cls):
@@ -8151,10 +8167,11 @@
                    'uint32_t', 
                    [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) const [member function]
     cls.add_method('SetNixVector', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')], 
+                   is_const=True)
     ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
     cls.add_method('ToString', 
                    'std::string', 
@@ -8227,7 +8244,7 @@
     cls.add_method('SetRemote', 
                    'void', 
                    [param('ns3::Ipv6Address', 'ipv6')])
-    ## ping6.h (module 'internet-apps'): void ns3::Ping6::SetRouters(std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address> > routers) [member function]
+    ## ping6.h (module 'internet-apps'): void ns3::Ping6::SetRouters(std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address>> routers) [member function]
     cls.add_method('SetRouters', 
                    'void', 
                    [param('std::vector< ns3::Ipv6Address >', 'routers')])
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet-apps/CMakeLists.txt ns-3.36/src/internet-apps/CMakeLists.txt
--- ns-3.35/src/internet-apps/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/internet-apps/CMakeLists.txt	2022-04-30 18:23:57.846733600 -0700
@@ -0,0 +1,36 @@
+build_lib(
+  LIBNAME internet-apps
+  SOURCE_FILES
+    helper/dhcp-helper.cc
+    helper/ping6-helper.cc
+    helper/radvd-helper.cc
+    helper/v4ping-helper.cc
+    helper/v4traceroute-helper.cc
+    model/dhcp-client.cc
+    model/dhcp-header.cc
+    model/dhcp-server.cc
+    model/ping6.cc
+    model/radvd-interface.cc
+    model/radvd-prefix.cc
+    model/radvd.cc
+    model/v4ping.cc
+    model/v4traceroute.cc
+  HEADER_FILES
+    helper/dhcp-helper.h
+    helper/ping6-helper.h
+    helper/radvd-helper.h
+    helper/v4ping-helper.h
+    helper/v4traceroute-helper.h
+    model/dhcp-client.h
+    model/dhcp-header.h
+    model/dhcp-server.h
+    model/ping6.h
+    model/radvd-interface.h
+    model/radvd-prefix.h
+    model/radvd.h
+    model/v4ping.h
+    model/v4traceroute.h
+  LIBRARIES_TO_LINK ${libinternet}
+  TEST_SOURCES test/dhcp-test.cc
+               test/ipv6-radvd-test.cc
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet-apps/examples/CMakeLists.txt ns-3.36/src/internet-apps/examples/CMakeLists.txt
--- ns-3.35/src/internet-apps/examples/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/internet-apps/examples/CMakeLists.txt	2022-04-30 18:23:57.850733500 -0700
@@ -0,0 +1,23 @@
+build_lib_example(
+  NAME dhcp-example
+  SOURCE_FILES dhcp-example.cc
+  LIBRARIES_TO_LINK
+    ${libinternet}
+    ${libinternet-apps}
+    ${libcsma}
+    ${libpoint-to-point}
+    ${libapplications}
+)
+
+build_lib_example(
+  NAME traceroute-example
+  SOURCE_FILES traceroute-example.cc
+  LIBRARIES_TO_LINK
+    ${libaodv}
+    ${libcore}
+    ${libnetwork}
+    ${libinternet}
+    ${libpoint-to-point}
+    ${libwifi}
+    ${libinternet-apps}
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet-apps/examples/dhcp-example.cc ns-3.36/src/internet-apps/examples/dhcp-example.cc
--- ns-3.35/src/internet-apps/examples/dhcp-example.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet-apps/examples/dhcp-example.cc	2022-04-30 18:23:57.850733500 -0700
@@ -55,6 +55,7 @@
  */
 
 #include "ns3/core-module.h"
+#include "ns3/network-module.h"
 #include "ns3/internet-apps-module.h"
 #include "ns3/csma-module.h"
 #include "ns3/internet-module.h"
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet-apps/examples/wscript ns-3.36/src/internet-apps/examples/wscript
--- ns-3.35/src/internet-apps/examples/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet-apps/examples/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,11 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    if not bld.env['ENABLE_EXAMPLES']:
-        return;
-
-    obj = bld.create_ns3_program('dhcp-example', ['internet', 'internet-apps', 'csma', 'point-to-point', 'applications'])
-    obj.source = 'dhcp-example.cc'
-    
-    obj = bld.create_ns3_program('traceroute-example', ['aodv', 'core', 'network', 'internet', 'point-to-point', 'wifi','internet-apps'])
-    obj.source = 'traceroute-example.cc'
\ No newline at end of file
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet-apps/model/dhcp-server.h ns-3.36/src/internet-apps/model/dhcp-server.h
--- ns-3.35/src/internet-apps/model/dhcp-server.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet-apps/model/dhcp-server.h	2022-04-30 18:23:57.850733500 -0700
@@ -32,6 +32,7 @@
 
 namespace ns3 {
 
+class InetSocketAddress;
 class Socket;
 class Packet;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet-apps/model/v4traceroute.cc ns-3.36/src/internet-apps/model/v4traceroute.cc
--- ns-3.35/src/internet-apps/model/v4traceroute.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet-apps/model/v4traceroute.cc	2022-04-30 18:23:57.850733500 -0700
@@ -97,9 +97,8 @@
     m_maxTtl (30),
     m_waitIcmpReplyTimeout (Seconds (5))
 {
-  osRoute.clear ();
-  routeIpv4.clear ();
-
+  m_osRoute.clear ();
+  m_routeIpv4.clear ();
 }
 
 V4TraceRoute::~V4TraceRoute ()
@@ -111,7 +110,7 @@
 void
 V4TraceRoute::Print (Ptr<OutputStreamWrapper> stream)
 {
-  printStream = stream;
+  m_printStream = stream;
 }
 
 void
@@ -123,16 +122,16 @@
 
   if (m_verbose)
     {
-	  NS_LOG_UNCOND("Traceroute to " << m_remote << ", "
-                << m_maxTtl << " hops Max, "
-                << m_size << " bytes of data.");
+      NS_LOG_UNCOND("Traceroute to " << m_remote << ", "
+                                     << m_maxTtl << " hops Max, "
+                                     << m_size << " bytes of data.");
     }
 
-  if (printStream != NULL)
+  if (m_printStream != NULL)
     {
-      *printStream->GetStream () << "Traceroute to " << m_remote << ", "
-                                 << m_maxTtl << " hops Max, "
-                                 << m_size << " bytes of data.\n";
+      *m_printStream->GetStream () << "Traceroute to " << m_remote << ", "
+                                   << m_maxTtl << " hops Max, "
+                                   << m_size << " bytes of data.\n";
     }
 
 
@@ -172,16 +171,6 @@
     {
       m_socket->Close ();
     }
-
-  if (m_verbose)
-    {
-	  NS_LOG_UNCOND("\nTrace Complete");
-    }
-
-  if (printStream != NULL)
-    {
-      *printStream->GetStream () << "Trace Complete\n" << std::endl;
-    }
 }
 
 void
@@ -261,28 +250,31 @@
               NS_ASSERT (Simulator::Now () >= sendTime);
               Time delta = Simulator::Now () - sendTime;
 
-              routeIpv4.str ("");
-              routeIpv4.clear ();
-              routeIpv4 << realFrom.GetIpv4 ();
-              osRoute << delta.As (Time::MS);
+              m_routeIpv4.str ("");
+              m_routeIpv4.clear ();
+              m_routeIpv4 << realFrom.GetIpv4 ();
+              m_osRoute << delta.As (Time::MS);
               if (m_probeCount == m_maxProbes)
                 {
                   if (m_verbose)
                     {
-                	  NS_LOG_UNCOND(m_ttl << " " << routeIpv4.str () << " " << osRoute.str ());
+                      NS_LOG_UNCOND(m_ttl << " " << m_routeIpv4.str () << " " << m_osRoute.str ());
                     }
 
-                  if (printStream != NULL)
+                  if (m_printStream != NULL)
                     {
-                      *printStream->GetStream () << m_ttl << " "
-                                                 << routeIpv4.str () << " "
-                                                 << osRoute.str () << "\n";
+                      *m_printStream->GetStream () << m_ttl << " "
+                                                   << m_routeIpv4.str () << " "
+                                                   << m_osRoute.str () << "\n";
                     }
-                  osRoute.str ("");
-                  osRoute.clear ();
-                  routeIpv4.str ("");
-                  routeIpv4.clear ();
-
+                  m_osRoute.str ("");
+                  m_osRoute.clear ();
+                  m_routeIpv4.str ("");
+                  m_routeIpv4.clear ();
+                }
+              else
+                {
+                  m_osRoute << " ";
                 }
 
               m_waitIcmpReplyTimer.Cancel ();
@@ -308,13 +300,10 @@
 
           if (i != m_sent.end () && echo.GetIdentifier () == 0)
             {
-              uint32_t * buf = new uint32_t [m_size];
               uint32_t dataSize = echo.GetDataSize ();
 
               if (dataSize == m_size)
                 {
-                  echo.GetData ((uint8_t *)buf);
-
                   Time sendTime = i->second;
                   NS_ASSERT (Simulator::Now () >= sendTime);
                   Time delta = Simulator::Now () - sendTime;
@@ -323,33 +312,45 @@
 
                   if (m_verbose)
                     {
-                      routeIpv4.str ("");
-                      routeIpv4.clear ();
-                      routeIpv4 << realFrom.GetIpv4 ();
-                      osRoute << delta.As (Time::MS);
+                      m_routeIpv4.str ("");
+                      m_routeIpv4.clear ();
+                      m_routeIpv4 << realFrom.GetIpv4 ();
+                      m_osRoute << delta.As (Time::MS);
 
                       if (m_probeCount == m_maxProbes)
                         {
-                    	  NS_LOG_UNCOND(m_ttl << " " << routeIpv4.str () << " " << osRoute.str ());
-                          if (printStream != NULL)
+                          NS_LOG_UNCOND(m_ttl << " " << m_routeIpv4.str () << " " << m_osRoute.str ());
+                          if (m_printStream != NULL)
                             {
-                              *printStream->GetStream () << m_ttl << " "
-                                                         << routeIpv4.str () << " "
-                                                         << osRoute.str () << "\n";
+                              *m_printStream->GetStream () << m_ttl << " "
+                                                           << m_routeIpv4.str () << " "
+                                                           << m_osRoute.str () << "\n";
                             }
 
-                          osRoute.clear ();
-                          routeIpv4.clear ();
+                          m_osRoute.clear ();
+                          m_routeIpv4.clear ();
+                        }
+                      else
+                        {
+                          m_osRoute << " ";
                         }
                     }
                 }
-              delete[] buf;
             }
 
           m_waitIcmpReplyTimer.Cancel ();
           if (m_probeCount == m_maxProbes)
             {
-              StopApplication ();
+              if (m_verbose)
+                {
+                  NS_LOG_UNCOND ("\nTrace Complete");
+                }
+
+              if (m_printStream != NULL)
+                {
+                  *m_printStream->GetStream () << "Trace Complete\n" << std::endl;
+                }
+              Simulator::ScheduleNow (&V4TraceRoute::StopApplication, this);
             }
           else if (m_ttl < m_maxTtl + 1)
             {
@@ -378,14 +379,9 @@
   // (where any difference would show up anyway) and borrow that code.  Don't
   // be too surprised when you see that this is a little endian convention.
   //
-  uint8_t* data = new uint8_t[m_size];
-  for (uint32_t i = 0; i < m_size; ++i)
-    {
-      data[i] = 0;
-    }
   NS_ASSERT (m_size >= 16);
 
-  Ptr<Packet> dataPacket = Create<Packet> ((uint8_t *) data, m_size);
+  Ptr<Packet> dataPacket = Create<Packet> (m_size);
   echo.SetData (dataPacket);
   p->AddHeader (echo);
   Icmpv4Header header;
@@ -414,9 +410,6 @@
 
   InetSocketAddress dst = InetSocketAddress (m_remote, 0);
   m_socket->SendTo (p, 0, dst);
-
-  delete[] data;
-
 }
 
 
@@ -444,24 +437,24 @@
       m_next = Simulator::Schedule (m_interval, &V4TraceRoute::StartWaitReplyTimer, this);
     }
 
-  osRoute << "*  ";
+  m_osRoute << "*  ";
   if (m_probeCount == m_maxProbes)
     {
       if (m_verbose)
         {
-    	  NS_LOG_UNCOND(m_ttl << " " << routeIpv4.str () << " " << osRoute.str ());
+          NS_LOG_UNCOND(m_ttl << " " << m_routeIpv4.str () << " " << m_osRoute.str ());
         }
 
-      if (printStream != NULL)
+      if (m_printStream != NULL)
         {
-          *printStream->GetStream () << m_ttl
-                                     << " " << routeIpv4.str () << " "
-                                     << osRoute.str () << "\n";
+          *m_printStream->GetStream () << m_ttl
+                                       << " " << m_routeIpv4.str () << " "
+                                       << m_osRoute.str () << "\n";
         }
-      osRoute.str ("");
-      osRoute.clear ();
-      routeIpv4.str ("");
-      routeIpv4.clear ();
+      m_osRoute.str ("");
+      m_osRoute.clear ();
+      m_routeIpv4.str ("");
+      m_routeIpv4.clear ();
     }
 }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet-apps/model/v4traceroute.h ns-3.36/src/internet-apps/model/v4traceroute.h
--- ns-3.35/src/internet-apps/model/v4traceroute.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet-apps/model/v4traceroute.h	2022-04-30 18:23:57.850733500 -0700
@@ -126,14 +126,13 @@
   EventId m_waitIcmpReplyTimer;
   /// All sent but not answered packets. Map icmp seqno -> when sent
   std::map<uint16_t, Time> m_sent;
-  /// Stream of characters used for printing the traceroute results
-  std::ostringstream os;
+
   /// Stream of characters used for printing a single route
-  std::ostringstream osRoute;
+  std::ostringstream m_osRoute;
   /// The Ipv4 address of the latest hop found
-  std::ostringstream routeIpv4;
+  std::ostringstream m_routeIpv4;
   /// Stream of the traceroute used for the output file
-  Ptr<OutputStreamWrapper> printStream;
+  Ptr<OutputStreamWrapper> m_printStream;
 
 
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/internet-apps/wscript ns-3.36/src/internet-apps/wscript
--- ns-3.35/src/internet-apps/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/internet-apps/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,62 +0,0 @@
-# -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-# def options(opt):
-#     pass
-
-# def configure(conf):
-#     conf.check_nonfatal(header_name='stdint.h', define_name='HAVE_STDINT_H')
-
-def build(bld):
-    module = bld.create_ns3_module('internet-apps', ['internet'])
-    module.source = [
-        'model/ping6.cc',
-        'model/radvd-interface.cc',
-        'model/radvd-prefix.cc',
-        'model/radvd.cc',
-        'model/v4ping.cc',
-        'model/v4traceroute.cc',
-        'model/dhcp-header.cc',
-        'model/dhcp-server.cc',
-        'model/dhcp-client.cc',
-        'helper/ping6-helper.cc',
-        'helper/radvd-helper.cc',
-        'helper/v4ping-helper.cc',
-        'helper/v4traceroute-helper.cc',
-        'helper/dhcp-helper.cc',
-        ]
-
-    applications_test = bld.create_ns3_module_test_library('internet-apps')
-    applications_test.source = [
-        'test/dhcp-test.cc',
-        'test/ipv6-radvd-test.cc',
-        ]
-
-    # Tests encapsulating example programs should be listed here
-    if (bld.env['ENABLE_EXAMPLES']):
-        applications_test.source.extend([
-        #   'test/internet-apps-examples-test-suite.cc',
-            ])
-    
-    headers = bld(features='ns3header')
-    headers.module = 'internet-apps'
-    headers.source = [
-        'model/ping6.h',
-        'model/radvd.h',
-        'model/radvd-interface.h',
-        'model/radvd-prefix.h',
-        'model/v4ping.h',
-        'model/v4traceroute.h',
-        'model/dhcp-header.h',
-        'model/dhcp-server.h',
-        'model/dhcp-client.h',
-        'helper/ping6-helper.h',
-        'helper/v4ping-helper.h',
-        'helper/v4traceroute-helper.h',
-        'helper/radvd-helper.h',
-        'helper/dhcp-helper.h',
-        ]
-
-    if (bld.env['ENABLE_EXAMPLES']):
-        bld.recurse('examples')
-
-    bld.ns3_python_bindings()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lr-wpan/bindings/callbacks_list.py ns-3.36/src/lr-wpan/bindings/callbacks_list.py
--- ns-3.35/src/lr-wpan/bindings/callbacks_list.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lr-wpan/bindings/callbacks_list.py	2022-04-30 18:23:57.882733600 -0700
@@ -1,5 +1,9 @@
 callback_classes = [
     ['ns3::ObjectBase *', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['bool', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'const ns3::Address &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'const ns3::Address &', 'const ns3::Address &', 'ns3::NetDevice::PacketType', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'unsigned int', 'ns3::Ptr<ns3::Packet>', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::LrWpanPhyEnumeration', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::LrWpanPhyEnumeration', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
@@ -9,7 +13,6 @@
     ['void', 'ns3::Ptr<const ns3::Packet>', 'double', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Time', 'ns3::LrWpanPhyEnumeration', 'ns3::LrWpanPhyEnumeration', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::LrWpanPhyEnumeration', 'ns3::LrWpanPhyEnumeration', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::McpsDataConfirmParams', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::McpsDataIndicationParams', 'ns3::Ptr<ns3::Packet>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::MlmeStartConfirmParams', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
@@ -20,10 +23,7 @@
     ['void', 'ns3::Ptr<const ns3::Packet>', 'unsigned char', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::LrWpanMacState', 'ns3::LrWpanMacState', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::SuperframeStatus', 'ns3::SuperframeStatus', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'std::basic_string<char>', 'ns3::Ptr<const ns3::Packet>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::LrWpanMacState', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['bool', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'const ns3::Address &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'const ns3::Address &', 'const ns3::Address &', 'ns3::NetDevice::PacketType', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'std::basic_string<char>', 'ns3::Ptr<const ns3::Packet>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
 ]
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lr-wpan/bindings/modulegen__gcc_ILP32.py ns-3.36/src/lr-wpan/bindings/modulegen__gcc_ILP32.py
--- ns-3.35/src/lr-wpan/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lr-wpan/bindings/modulegen__gcc_ILP32.py	2022-04-30 18:23:57.890733700 -0700
@@ -107,6 +107,8 @@
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::TraceSourceAccessor'])
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'], import_from_module='ns.core')
     ## lr-wpan-fields.h (module 'lr-wpan'): ns3::GtsFields [class]
     module.add_class('GtsFields')
     ## hash.h (module 'core'): ns3::Hasher [class]
@@ -295,29 +297,29 @@
     module.add_class('AggregateIterator', import_from_module='ns.core', outer_class=root_module['ns3::Object'])
     ## pcap-file-wrapper.h (module 'network'): ns3::PcapFileWrapper [class]
     module.add_class('PcapFileWrapper', import_from_module='ns.network', parent=root_module['ns3::Object'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LrWpanInterferenceHelper, ns3::empty, ns3::DefaultDeleter<ns3::LrWpanInterferenceHelper> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LrWpanInterferenceHelper, ns3::empty, ns3::DefaultDeleter<ns3::LrWpanInterferenceHelper>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::LrWpanInterferenceHelper', 'ns3::empty', 'ns3::DefaultDeleter<ns3::LrWpanInterferenceHelper>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::OutputStreamWrapper', 'ns3::empty', 'ns3::DefaultDeleter<ns3::OutputStreamWrapper>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::SpectrumSignalParameters', 'ns3::empty', 'ns3::DefaultDeleter<ns3::SpectrumSignalParameters>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
     ## spectrum-phy.h (module 'spectrum'): ns3::SpectrumPhy [class]
     module.add_class('SpectrumPhy', import_from_module='ns.spectrum', parent=root_module['ns3::Object'])
@@ -519,7 +521,7 @@
     module.add_class('LrWpanNetDevice', parent=root_module['ns3::NetDevice'])
     ## lr-wpan-net-device.h (module 'lr-wpan'): ns3::LrWpanNetDevice::PseudoMacAddressMode_e [enumeration]
     module.add_enum('PseudoMacAddressMode_e', ['RFC4944', 'RFC6282'], outer_class=root_module['ns3::LrWpanNetDevice'])
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     typehandlers.add_type_alias('ns3::Callback< void, ns3::LrWpanMacState, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::LrWpanMacStateCallback')
     typehandlers.add_type_alias('ns3::Callback< void, ns3::LrWpanMacState, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::LrWpanMacStateCallback*')
     typehandlers.add_type_alias('ns3::Callback< void, ns3::LrWpanMacState, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::LrWpanMacStateCallback&')
@@ -574,6 +576,15 @@
     typehandlers.add_type_alias('ns3::Callback< void, ns3::MlmePollConfirmParams, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::MlmePollConfirmCallback')
     typehandlers.add_type_alias('ns3::Callback< void, ns3::MlmePollConfirmParams, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::MlmePollConfirmCallback*')
     typehandlers.add_type_alias('ns3::Callback< void, ns3::MlmePollConfirmParams, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::MlmePollConfirmCallback&')
+    typehandlers.add_type_alias('ns3::SequenceNumber< unsigned int, int >', 'ns3::SequenceNumber32')
+    typehandlers.add_type_alias('ns3::SequenceNumber< unsigned int, int >*', 'ns3::SequenceNumber32*')
+    typehandlers.add_type_alias('ns3::SequenceNumber< unsigned int, int >&', 'ns3::SequenceNumber32&')
+    typehandlers.add_type_alias('ns3::SequenceNumber< unsigned short, short >', 'ns3::SequenceNumber16')
+    typehandlers.add_type_alias('ns3::SequenceNumber< unsigned short, short >*', 'ns3::SequenceNumber16*')
+    typehandlers.add_type_alias('ns3::SequenceNumber< unsigned short, short >&', 'ns3::SequenceNumber16&')
+    typehandlers.add_type_alias('ns3::SequenceNumber< unsigned char, signed char >', 'ns3::SequenceNumber8')
+    typehandlers.add_type_alias('ns3::SequenceNumber< unsigned char, signed char >*', 'ns3::SequenceNumber8*')
+    typehandlers.add_type_alias('ns3::SequenceNumber< unsigned char, signed char >&', 'ns3::SequenceNumber8&')
     typehandlers.add_type_alias('ns3::LrWpanEdPower', 'ns3::LrWpanEdPower')
     typehandlers.add_type_alias('ns3::LrWpanEdPower*', 'ns3::LrWpanEdPower*')
     typehandlers.add_type_alias('ns3::LrWpanEdPower&', 'ns3::LrWpanEdPower&')
@@ -620,15 +631,6 @@
     typehandlers.add_type_alias('ns3::Callback< void, ns3::LrWpanPhyEnumeration, ns3::LrWpanPibAttributeIdentifier, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::PlmeSetAttributeConfirmCallback')
     typehandlers.add_type_alias('ns3::Callback< void, ns3::LrWpanPhyEnumeration, ns3::LrWpanPibAttributeIdentifier, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::PlmeSetAttributeConfirmCallback*')
     typehandlers.add_type_alias('ns3::Callback< void, ns3::LrWpanPhyEnumeration, ns3::LrWpanPibAttributeIdentifier, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::PlmeSetAttributeConfirmCallback&')
-    typehandlers.add_type_alias('ns3::SequenceNumber< unsigned int, int >', 'ns3::SequenceNumber32')
-    typehandlers.add_type_alias('ns3::SequenceNumber< unsigned int, int >*', 'ns3::SequenceNumber32*')
-    typehandlers.add_type_alias('ns3::SequenceNumber< unsigned int, int >&', 'ns3::SequenceNumber32&')
-    typehandlers.add_type_alias('ns3::SequenceNumber< unsigned short, short >', 'ns3::SequenceNumber16')
-    typehandlers.add_type_alias('ns3::SequenceNumber< unsigned short, short >*', 'ns3::SequenceNumber16*')
-    typehandlers.add_type_alias('ns3::SequenceNumber< unsigned short, short >&', 'ns3::SequenceNumber16&')
-    typehandlers.add_type_alias('ns3::SequenceNumber< unsigned char, signed char >', 'ns3::SequenceNumber8')
-    typehandlers.add_type_alias('ns3::SequenceNumber< unsigned char, signed char >*', 'ns3::SequenceNumber8*')
-    typehandlers.add_type_alias('ns3::SequenceNumber< unsigned char, signed char >&', 'ns3::SequenceNumber8&')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )', 'ns3::TimePrinter')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )*', 'ns3::TimePrinter*')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )&', 'ns3::TimePrinter&')
@@ -697,6 +699,21 @@
 def register_types_ns3_TracedValueCallback(module):
     root_module = module.get_root()
     
+    typehandlers.add_type_alias('void ( * ) ( ns3::Time, ns3::Time )', 'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Time, ns3::Time )*', 'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Time, ns3::Time )&', 'ns3::TracedValueCallback::Time&')
+    typehandlers.add_type_alias('void ( * ) ( ns3::LrWpanMacState, ns3::LrWpanMacState )', 'ns3::TracedValueCallback::LrWpanMacState')
+    typehandlers.add_type_alias('void ( * ) ( ns3::LrWpanMacState, ns3::LrWpanMacState )*', 'ns3::TracedValueCallback::LrWpanMacState*')
+    typehandlers.add_type_alias('void ( * ) ( ns3::LrWpanMacState, ns3::LrWpanMacState )&', 'ns3::TracedValueCallback::LrWpanMacState&')
+    typehandlers.add_type_alias('void ( * ) ( ns3::SuperframeStatus, ns3::SuperframeStatus )', 'ns3::TracedValueCallback::SuperframeStatus')
+    typehandlers.add_type_alias('void ( * ) ( ns3::SuperframeStatus, ns3::SuperframeStatus )*', 'ns3::TracedValueCallback::SuperframeStatus*')
+    typehandlers.add_type_alias('void ( * ) ( ns3::SuperframeStatus, ns3::SuperframeStatus )&', 'ns3::TracedValueCallback::SuperframeStatus&')
+    typehandlers.add_type_alias('void ( * ) ( ns3::SequenceNumber32, ns3::SequenceNumber32 )', 'ns3::TracedValueCallback::SequenceNumber32')
+    typehandlers.add_type_alias('void ( * ) ( ns3::SequenceNumber32, ns3::SequenceNumber32 )*', 'ns3::TracedValueCallback::SequenceNumber32*')
+    typehandlers.add_type_alias('void ( * ) ( ns3::SequenceNumber32, ns3::SequenceNumber32 )&', 'ns3::TracedValueCallback::SequenceNumber32&')
+    typehandlers.add_type_alias('void ( * ) ( ns3::LrWpanPhyEnumeration, ns3::LrWpanPhyEnumeration )', 'ns3::TracedValueCallback::LrWpanPhyEnumeration')
+    typehandlers.add_type_alias('void ( * ) ( ns3::LrWpanPhyEnumeration, ns3::LrWpanPhyEnumeration )*', 'ns3::TracedValueCallback::LrWpanPhyEnumeration*')
+    typehandlers.add_type_alias('void ( * ) ( ns3::LrWpanPhyEnumeration, ns3::LrWpanPhyEnumeration )&', 'ns3::TracedValueCallback::LrWpanPhyEnumeration&')
     typehandlers.add_type_alias('void ( * ) ( bool, bool )', 'ns3::TracedValueCallback::Bool')
     typehandlers.add_type_alias('void ( * ) ( bool, bool )*', 'ns3::TracedValueCallback::Bool*')
     typehandlers.add_type_alias('void ( * ) ( bool, bool )&', 'ns3::TracedValueCallback::Bool&')
@@ -730,21 +747,6 @@
     typehandlers.add_type_alias('void ( * ) (  )', 'ns3::TracedValueCallback::Void')
     typehandlers.add_type_alias('void ( * ) (  )*', 'ns3::TracedValueCallback::Void*')
     typehandlers.add_type_alias('void ( * ) (  )&', 'ns3::TracedValueCallback::Void&')
-    typehandlers.add_type_alias('void ( * ) ( ns3::LrWpanMacState, ns3::LrWpanMacState )', 'ns3::TracedValueCallback::LrWpanMacState')
-    typehandlers.add_type_alias('void ( * ) ( ns3::LrWpanMacState, ns3::LrWpanMacState )*', 'ns3::TracedValueCallback::LrWpanMacState*')
-    typehandlers.add_type_alias('void ( * ) ( ns3::LrWpanMacState, ns3::LrWpanMacState )&', 'ns3::TracedValueCallback::LrWpanMacState&')
-    typehandlers.add_type_alias('void ( * ) ( ns3::SuperframeStatus, ns3::SuperframeStatus )', 'ns3::TracedValueCallback::SuperframeStatus')
-    typehandlers.add_type_alias('void ( * ) ( ns3::SuperframeStatus, ns3::SuperframeStatus )*', 'ns3::TracedValueCallback::SuperframeStatus*')
-    typehandlers.add_type_alias('void ( * ) ( ns3::SuperframeStatus, ns3::SuperframeStatus )&', 'ns3::TracedValueCallback::SuperframeStatus&')
-    typehandlers.add_type_alias('void ( * ) ( ns3::LrWpanPhyEnumeration, ns3::LrWpanPhyEnumeration )', 'ns3::TracedValueCallback::LrWpanPhyEnumeration')
-    typehandlers.add_type_alias('void ( * ) ( ns3::LrWpanPhyEnumeration, ns3::LrWpanPhyEnumeration )*', 'ns3::TracedValueCallback::LrWpanPhyEnumeration*')
-    typehandlers.add_type_alias('void ( * ) ( ns3::LrWpanPhyEnumeration, ns3::LrWpanPhyEnumeration )&', 'ns3::TracedValueCallback::LrWpanPhyEnumeration&')
-    typehandlers.add_type_alias('void ( * ) ( ns3::Time, ns3::Time )', 'ns3::TracedValueCallback::Time')
-    typehandlers.add_type_alias('void ( * ) ( ns3::Time, ns3::Time )*', 'ns3::TracedValueCallback::Time*')
-    typehandlers.add_type_alias('void ( * ) ( ns3::Time, ns3::Time )&', 'ns3::TracedValueCallback::Time&')
-    typehandlers.add_type_alias('void ( * ) ( ns3::SequenceNumber32, ns3::SequenceNumber32 )', 'ns3::TracedValueCallback::SequenceNumber32')
-    typehandlers.add_type_alias('void ( * ) ( ns3::SequenceNumber32, ns3::SequenceNumber32 )*', 'ns3::TracedValueCallback::SequenceNumber32*')
-    typehandlers.add_type_alias('void ( * ) ( ns3::SequenceNumber32, ns3::SequenceNumber32 )&', 'ns3::TracedValueCallback::SequenceNumber32&')
 
 def register_types_ns3_internal(module):
     root_module = module.get_root()
@@ -4067,8 +4069,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -4291,14 +4293,14 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('>=')
     cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_unary_numeric_operator('-')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
     cls.add_constructor([])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(double const value) [constructor]
@@ -4317,6 +4319,8 @@
     cls.add_constructor([param('long unsigned int const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int const v) [constructor]
     cls.add_constructor([param('long long unsigned int const', 'v')])
+    ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int128_t const v) [constructor]
+    cls.add_constructor([param('int128_t const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t const hi, uint64_t const lo) [constructor]
     cls.add_constructor([param('int64_t const', 'hi'), param('uint64_t const', 'lo')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [constructor]
@@ -4984,86 +4988,86 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3LrWpanInterferenceHelper_Ns3Empty_Ns3DefaultDeleter__lt__ns3LrWpanInterferenceHelper__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LrWpanInterferenceHelper, ns3::empty, ns3::DefaultDeleter<ns3::LrWpanInterferenceHelper> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LrWpanInterferenceHelper, ns3::empty, ns3::DefaultDeleter<ns3::LrWpanInterferenceHelper>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LrWpanInterferenceHelper, ns3::empty, ns3::DefaultDeleter<ns3::LrWpanInterferenceHelper> >::SimpleRefCount(ns3::SimpleRefCount<ns3::LrWpanInterferenceHelper, ns3::empty, ns3::DefaultDeleter<ns3::LrWpanInterferenceHelper> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LrWpanInterferenceHelper, ns3::empty, ns3::DefaultDeleter<ns3::LrWpanInterferenceHelper>>::SimpleRefCount(ns3::SimpleRefCount<ns3::LrWpanInterferenceHelper, ns3::empty, ns3::DefaultDeleter<ns3::LrWpanInterferenceHelper>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::LrWpanInterferenceHelper, ns3::empty, ns3::DefaultDeleter< ns3::LrWpanInterferenceHelper > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3OutputStreamWrapper_Ns3Empty_Ns3DefaultDeleter__lt__ns3OutputStreamWrapper__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter< ns3::OutputStreamWrapper > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3SpectrumSignalParameters_Ns3Empty_Ns3DefaultDeleter__lt__ns3SpectrumSignalParameters__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters> >::SimpleRefCount(ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters>>::SimpleRefCount(ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter< ns3::SpectrumSignalParameters > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
@@ -5105,9 +5109,9 @@
                    'ns3::Ptr< ns3::SpectrumModel const >', 
                    [], 
                    is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::AntennaModel> ns3::SpectrumPhy::GetRxAntenna() const [member function]
-    cls.add_method('GetRxAntenna', 
-                   'ns3::Ptr< ns3::AntennaModel >', 
+    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::Object> ns3::SpectrumPhy::GetAntenna() const [member function]
+    cls.add_method('GetAntenna', 
+                   'ns3::Ptr< ns3::Object >', 
                    [], 
                    is_const=True, is_pure_virtual=True, is_virtual=True)
     ## spectrum-phy.h (module 'spectrum'): void ns3::SpectrumPhy::StartRx(ns3::Ptr<ns3::SpectrumSignalParameters> params) [member function]
@@ -5454,77 +5458,77 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::Packet const> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::NetDevice> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['double'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::Packet const> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Time'], visibility='protected')
+                   is_static=True, template_parameters=['unsigned short'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['unsigned char'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Address const&'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::MlmeBeaconNotifyIndicationParams'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::NetDevice::PacketType'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::Packet> '], visibility='protected')
+                   is_static=True, template_parameters=['double'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::MlmeSyncLossIndicationParams'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Time'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::MlmePollConfirmParams'], visibility='protected')
+                   is_static=True, template_parameters=['unsigned char'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::MlmeStartConfirmParams'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::MlmeBeaconNotifyIndicationParams'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::McpsDataIndicationParams'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::Packet> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::McpsDataConfirmParams'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::MlmeSyncLossIndicationParams'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::NetDevice> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::MlmePollConfirmParams'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['unsigned short'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::MlmeStartConfirmParams'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Address const&'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::McpsDataIndicationParams'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::NetDevice::PacketType'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::McpsDataConfirmParams'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
@@ -6582,9 +6586,9 @@
     cls.add_method('SetAntenna', 
                    'void', 
                    [param('ns3::Ptr< ns3::AntennaModel >', 'a')])
-    ## lr-wpan-phy.h (module 'lr-wpan'): ns3::Ptr<ns3::AntennaModel> ns3::LrWpanPhy::GetRxAntenna() const [member function]
-    cls.add_method('GetRxAntenna', 
-                   'ns3::Ptr< ns3::AntennaModel >', 
+    ## lr-wpan-phy.h (module 'lr-wpan'): ns3::Ptr<ns3::Object> ns3::LrWpanPhy::GetAntenna() const [member function]
+    cls.add_method('GetAntenna', 
+                   'ns3::Ptr< ns3::Object >', 
                    [], 
                    is_const=True, is_virtual=True)
     ## lr-wpan-phy.h (module 'lr-wpan'): ns3::Ptr<const ns3::SpectrumModel> ns3::LrWpanPhy::GetRxSpectrumModel() const [member function]
@@ -6989,10 +6993,16 @@
     cls.add_method('ExtractNeighborIndex', 
                    'uint32_t', 
                    [param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetEpoch() const [member function]
+    cls.add_method('GetEpoch', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() const [member function]
     cls.add_method('GetRemainingBits', 
                    'uint32_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -7003,6 +7013,10 @@
                    'uint32_t', 
                    [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
+    ## nix-vector.h (module 'network'): void ns3::NixVector::SetEpoch(uint32_t epoch) [member function]
+    cls.add_method('SetEpoch', 
+                   'void', 
+                   [param('uint32_t', 'epoch')])
     return
 
 def register_Ns3Node_methods(root_module, cls):
@@ -7334,10 +7348,11 @@
                    'uint32_t', 
                    [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) const [member function]
     cls.add_method('SetNixVector', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')], 
+                   is_const=True)
     ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
     cls.add_method('ToString', 
                    'std::string', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lr-wpan/bindings/modulegen__gcc_LP64.py ns-3.36/src/lr-wpan/bindings/modulegen__gcc_LP64.py
--- ns-3.35/src/lr-wpan/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lr-wpan/bindings/modulegen__gcc_LP64.py	2022-04-30 18:23:57.890733700 -0700
@@ -107,6 +107,8 @@
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::TraceSourceAccessor'])
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'], import_from_module='ns.core')
     ## lr-wpan-fields.h (module 'lr-wpan'): ns3::GtsFields [class]
     module.add_class('GtsFields')
     ## hash.h (module 'core'): ns3::Hasher [class]
@@ -295,29 +297,29 @@
     module.add_class('AggregateIterator', import_from_module='ns.core', outer_class=root_module['ns3::Object'])
     ## pcap-file-wrapper.h (module 'network'): ns3::PcapFileWrapper [class]
     module.add_class('PcapFileWrapper', import_from_module='ns.network', parent=root_module['ns3::Object'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LrWpanInterferenceHelper, ns3::empty, ns3::DefaultDeleter<ns3::LrWpanInterferenceHelper> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LrWpanInterferenceHelper, ns3::empty, ns3::DefaultDeleter<ns3::LrWpanInterferenceHelper>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::LrWpanInterferenceHelper', 'ns3::empty', 'ns3::DefaultDeleter<ns3::LrWpanInterferenceHelper>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::OutputStreamWrapper', 'ns3::empty', 'ns3::DefaultDeleter<ns3::OutputStreamWrapper>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::SpectrumSignalParameters', 'ns3::empty', 'ns3::DefaultDeleter<ns3::SpectrumSignalParameters>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
     ## spectrum-phy.h (module 'spectrum'): ns3::SpectrumPhy [class]
     module.add_class('SpectrumPhy', import_from_module='ns.spectrum', parent=root_module['ns3::Object'])
@@ -519,7 +521,7 @@
     module.add_class('LrWpanNetDevice', parent=root_module['ns3::NetDevice'])
     ## lr-wpan-net-device.h (module 'lr-wpan'): ns3::LrWpanNetDevice::PseudoMacAddressMode_e [enumeration]
     module.add_enum('PseudoMacAddressMode_e', ['RFC4944', 'RFC6282'], outer_class=root_module['ns3::LrWpanNetDevice'])
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     typehandlers.add_type_alias('ns3::Callback< void, ns3::LrWpanMacState, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::LrWpanMacStateCallback')
     typehandlers.add_type_alias('ns3::Callback< void, ns3::LrWpanMacState, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::LrWpanMacStateCallback*')
     typehandlers.add_type_alias('ns3::Callback< void, ns3::LrWpanMacState, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::LrWpanMacStateCallback&')
@@ -574,6 +576,15 @@
     typehandlers.add_type_alias('ns3::Callback< void, ns3::MlmePollConfirmParams, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::MlmePollConfirmCallback')
     typehandlers.add_type_alias('ns3::Callback< void, ns3::MlmePollConfirmParams, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::MlmePollConfirmCallback*')
     typehandlers.add_type_alias('ns3::Callback< void, ns3::MlmePollConfirmParams, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::MlmePollConfirmCallback&')
+    typehandlers.add_type_alias('ns3::SequenceNumber< unsigned int, int >', 'ns3::SequenceNumber32')
+    typehandlers.add_type_alias('ns3::SequenceNumber< unsigned int, int >*', 'ns3::SequenceNumber32*')
+    typehandlers.add_type_alias('ns3::SequenceNumber< unsigned int, int >&', 'ns3::SequenceNumber32&')
+    typehandlers.add_type_alias('ns3::SequenceNumber< unsigned short, short >', 'ns3::SequenceNumber16')
+    typehandlers.add_type_alias('ns3::SequenceNumber< unsigned short, short >*', 'ns3::SequenceNumber16*')
+    typehandlers.add_type_alias('ns3::SequenceNumber< unsigned short, short >&', 'ns3::SequenceNumber16&')
+    typehandlers.add_type_alias('ns3::SequenceNumber< unsigned char, signed char >', 'ns3::SequenceNumber8')
+    typehandlers.add_type_alias('ns3::SequenceNumber< unsigned char, signed char >*', 'ns3::SequenceNumber8*')
+    typehandlers.add_type_alias('ns3::SequenceNumber< unsigned char, signed char >&', 'ns3::SequenceNumber8&')
     typehandlers.add_type_alias('ns3::LrWpanEdPower', 'ns3::LrWpanEdPower')
     typehandlers.add_type_alias('ns3::LrWpanEdPower*', 'ns3::LrWpanEdPower*')
     typehandlers.add_type_alias('ns3::LrWpanEdPower&', 'ns3::LrWpanEdPower&')
@@ -620,15 +631,6 @@
     typehandlers.add_type_alias('ns3::Callback< void, ns3::LrWpanPhyEnumeration, ns3::LrWpanPibAttributeIdentifier, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::PlmeSetAttributeConfirmCallback')
     typehandlers.add_type_alias('ns3::Callback< void, ns3::LrWpanPhyEnumeration, ns3::LrWpanPibAttributeIdentifier, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::PlmeSetAttributeConfirmCallback*')
     typehandlers.add_type_alias('ns3::Callback< void, ns3::LrWpanPhyEnumeration, ns3::LrWpanPibAttributeIdentifier, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::PlmeSetAttributeConfirmCallback&')
-    typehandlers.add_type_alias('ns3::SequenceNumber< unsigned int, int >', 'ns3::SequenceNumber32')
-    typehandlers.add_type_alias('ns3::SequenceNumber< unsigned int, int >*', 'ns3::SequenceNumber32*')
-    typehandlers.add_type_alias('ns3::SequenceNumber< unsigned int, int >&', 'ns3::SequenceNumber32&')
-    typehandlers.add_type_alias('ns3::SequenceNumber< unsigned short, short >', 'ns3::SequenceNumber16')
-    typehandlers.add_type_alias('ns3::SequenceNumber< unsigned short, short >*', 'ns3::SequenceNumber16*')
-    typehandlers.add_type_alias('ns3::SequenceNumber< unsigned short, short >&', 'ns3::SequenceNumber16&')
-    typehandlers.add_type_alias('ns3::SequenceNumber< unsigned char, signed char >', 'ns3::SequenceNumber8')
-    typehandlers.add_type_alias('ns3::SequenceNumber< unsigned char, signed char >*', 'ns3::SequenceNumber8*')
-    typehandlers.add_type_alias('ns3::SequenceNumber< unsigned char, signed char >&', 'ns3::SequenceNumber8&')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )', 'ns3::TimePrinter')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )*', 'ns3::TimePrinter*')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )&', 'ns3::TimePrinter&')
@@ -697,6 +699,21 @@
 def register_types_ns3_TracedValueCallback(module):
     root_module = module.get_root()
     
+    typehandlers.add_type_alias('void ( * ) ( ns3::Time, ns3::Time )', 'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Time, ns3::Time )*', 'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Time, ns3::Time )&', 'ns3::TracedValueCallback::Time&')
+    typehandlers.add_type_alias('void ( * ) ( ns3::LrWpanMacState, ns3::LrWpanMacState )', 'ns3::TracedValueCallback::LrWpanMacState')
+    typehandlers.add_type_alias('void ( * ) ( ns3::LrWpanMacState, ns3::LrWpanMacState )*', 'ns3::TracedValueCallback::LrWpanMacState*')
+    typehandlers.add_type_alias('void ( * ) ( ns3::LrWpanMacState, ns3::LrWpanMacState )&', 'ns3::TracedValueCallback::LrWpanMacState&')
+    typehandlers.add_type_alias('void ( * ) ( ns3::SuperframeStatus, ns3::SuperframeStatus )', 'ns3::TracedValueCallback::SuperframeStatus')
+    typehandlers.add_type_alias('void ( * ) ( ns3::SuperframeStatus, ns3::SuperframeStatus )*', 'ns3::TracedValueCallback::SuperframeStatus*')
+    typehandlers.add_type_alias('void ( * ) ( ns3::SuperframeStatus, ns3::SuperframeStatus )&', 'ns3::TracedValueCallback::SuperframeStatus&')
+    typehandlers.add_type_alias('void ( * ) ( ns3::SequenceNumber32, ns3::SequenceNumber32 )', 'ns3::TracedValueCallback::SequenceNumber32')
+    typehandlers.add_type_alias('void ( * ) ( ns3::SequenceNumber32, ns3::SequenceNumber32 )*', 'ns3::TracedValueCallback::SequenceNumber32*')
+    typehandlers.add_type_alias('void ( * ) ( ns3::SequenceNumber32, ns3::SequenceNumber32 )&', 'ns3::TracedValueCallback::SequenceNumber32&')
+    typehandlers.add_type_alias('void ( * ) ( ns3::LrWpanPhyEnumeration, ns3::LrWpanPhyEnumeration )', 'ns3::TracedValueCallback::LrWpanPhyEnumeration')
+    typehandlers.add_type_alias('void ( * ) ( ns3::LrWpanPhyEnumeration, ns3::LrWpanPhyEnumeration )*', 'ns3::TracedValueCallback::LrWpanPhyEnumeration*')
+    typehandlers.add_type_alias('void ( * ) ( ns3::LrWpanPhyEnumeration, ns3::LrWpanPhyEnumeration )&', 'ns3::TracedValueCallback::LrWpanPhyEnumeration&')
     typehandlers.add_type_alias('void ( * ) ( bool, bool )', 'ns3::TracedValueCallback::Bool')
     typehandlers.add_type_alias('void ( * ) ( bool, bool )*', 'ns3::TracedValueCallback::Bool*')
     typehandlers.add_type_alias('void ( * ) ( bool, bool )&', 'ns3::TracedValueCallback::Bool&')
@@ -730,21 +747,6 @@
     typehandlers.add_type_alias('void ( * ) (  )', 'ns3::TracedValueCallback::Void')
     typehandlers.add_type_alias('void ( * ) (  )*', 'ns3::TracedValueCallback::Void*')
     typehandlers.add_type_alias('void ( * ) (  )&', 'ns3::TracedValueCallback::Void&')
-    typehandlers.add_type_alias('void ( * ) ( ns3::LrWpanMacState, ns3::LrWpanMacState )', 'ns3::TracedValueCallback::LrWpanMacState')
-    typehandlers.add_type_alias('void ( * ) ( ns3::LrWpanMacState, ns3::LrWpanMacState )*', 'ns3::TracedValueCallback::LrWpanMacState*')
-    typehandlers.add_type_alias('void ( * ) ( ns3::LrWpanMacState, ns3::LrWpanMacState )&', 'ns3::TracedValueCallback::LrWpanMacState&')
-    typehandlers.add_type_alias('void ( * ) ( ns3::SuperframeStatus, ns3::SuperframeStatus )', 'ns3::TracedValueCallback::SuperframeStatus')
-    typehandlers.add_type_alias('void ( * ) ( ns3::SuperframeStatus, ns3::SuperframeStatus )*', 'ns3::TracedValueCallback::SuperframeStatus*')
-    typehandlers.add_type_alias('void ( * ) ( ns3::SuperframeStatus, ns3::SuperframeStatus )&', 'ns3::TracedValueCallback::SuperframeStatus&')
-    typehandlers.add_type_alias('void ( * ) ( ns3::LrWpanPhyEnumeration, ns3::LrWpanPhyEnumeration )', 'ns3::TracedValueCallback::LrWpanPhyEnumeration')
-    typehandlers.add_type_alias('void ( * ) ( ns3::LrWpanPhyEnumeration, ns3::LrWpanPhyEnumeration )*', 'ns3::TracedValueCallback::LrWpanPhyEnumeration*')
-    typehandlers.add_type_alias('void ( * ) ( ns3::LrWpanPhyEnumeration, ns3::LrWpanPhyEnumeration )&', 'ns3::TracedValueCallback::LrWpanPhyEnumeration&')
-    typehandlers.add_type_alias('void ( * ) ( ns3::Time, ns3::Time )', 'ns3::TracedValueCallback::Time')
-    typehandlers.add_type_alias('void ( * ) ( ns3::Time, ns3::Time )*', 'ns3::TracedValueCallback::Time*')
-    typehandlers.add_type_alias('void ( * ) ( ns3::Time, ns3::Time )&', 'ns3::TracedValueCallback::Time&')
-    typehandlers.add_type_alias('void ( * ) ( ns3::SequenceNumber32, ns3::SequenceNumber32 )', 'ns3::TracedValueCallback::SequenceNumber32')
-    typehandlers.add_type_alias('void ( * ) ( ns3::SequenceNumber32, ns3::SequenceNumber32 )*', 'ns3::TracedValueCallback::SequenceNumber32*')
-    typehandlers.add_type_alias('void ( * ) ( ns3::SequenceNumber32, ns3::SequenceNumber32 )&', 'ns3::TracedValueCallback::SequenceNumber32&')
 
 def register_types_ns3_internal(module):
     root_module = module.get_root()
@@ -4067,8 +4069,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -4291,14 +4293,14 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('>=')
     cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_unary_numeric_operator('-')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
     cls.add_constructor([])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(double const value) [constructor]
@@ -4317,6 +4319,8 @@
     cls.add_constructor([param('long unsigned int const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int const v) [constructor]
     cls.add_constructor([param('long long unsigned int const', 'v')])
+    ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int128_t const v) [constructor]
+    cls.add_constructor([param('int128_t const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t const hi, uint64_t const lo) [constructor]
     cls.add_constructor([param('int64_t const', 'hi'), param('uint64_t const', 'lo')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [constructor]
@@ -4984,86 +4988,86 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3LrWpanInterferenceHelper_Ns3Empty_Ns3DefaultDeleter__lt__ns3LrWpanInterferenceHelper__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LrWpanInterferenceHelper, ns3::empty, ns3::DefaultDeleter<ns3::LrWpanInterferenceHelper> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LrWpanInterferenceHelper, ns3::empty, ns3::DefaultDeleter<ns3::LrWpanInterferenceHelper>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LrWpanInterferenceHelper, ns3::empty, ns3::DefaultDeleter<ns3::LrWpanInterferenceHelper> >::SimpleRefCount(ns3::SimpleRefCount<ns3::LrWpanInterferenceHelper, ns3::empty, ns3::DefaultDeleter<ns3::LrWpanInterferenceHelper> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LrWpanInterferenceHelper, ns3::empty, ns3::DefaultDeleter<ns3::LrWpanInterferenceHelper>>::SimpleRefCount(ns3::SimpleRefCount<ns3::LrWpanInterferenceHelper, ns3::empty, ns3::DefaultDeleter<ns3::LrWpanInterferenceHelper>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::LrWpanInterferenceHelper, ns3::empty, ns3::DefaultDeleter< ns3::LrWpanInterferenceHelper > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3OutputStreamWrapper_Ns3Empty_Ns3DefaultDeleter__lt__ns3OutputStreamWrapper__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter< ns3::OutputStreamWrapper > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3SpectrumSignalParameters_Ns3Empty_Ns3DefaultDeleter__lt__ns3SpectrumSignalParameters__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters> >::SimpleRefCount(ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters>>::SimpleRefCount(ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter< ns3::SpectrumSignalParameters > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
@@ -5105,9 +5109,9 @@
                    'ns3::Ptr< ns3::SpectrumModel const >', 
                    [], 
                    is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::AntennaModel> ns3::SpectrumPhy::GetRxAntenna() const [member function]
-    cls.add_method('GetRxAntenna', 
-                   'ns3::Ptr< ns3::AntennaModel >', 
+    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::Object> ns3::SpectrumPhy::GetAntenna() const [member function]
+    cls.add_method('GetAntenna', 
+                   'ns3::Ptr< ns3::Object >', 
                    [], 
                    is_const=True, is_pure_virtual=True, is_virtual=True)
     ## spectrum-phy.h (module 'spectrum'): void ns3::SpectrumPhy::StartRx(ns3::Ptr<ns3::SpectrumSignalParameters> params) [member function]
@@ -5454,77 +5458,77 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::Packet const> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::NetDevice> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['double'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::Packet const> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Time'], visibility='protected')
+                   is_static=True, template_parameters=['unsigned short'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['unsigned char'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Address const&'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::MlmeBeaconNotifyIndicationParams'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::NetDevice::PacketType'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::Packet> '], visibility='protected')
+                   is_static=True, template_parameters=['double'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::MlmeSyncLossIndicationParams'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Time'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::MlmePollConfirmParams'], visibility='protected')
+                   is_static=True, template_parameters=['unsigned char'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::MlmeStartConfirmParams'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::MlmeBeaconNotifyIndicationParams'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::McpsDataIndicationParams'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::Packet> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::McpsDataConfirmParams'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::MlmeSyncLossIndicationParams'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::NetDevice> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::MlmePollConfirmParams'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['unsigned short'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::MlmeStartConfirmParams'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Address const&'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::McpsDataIndicationParams'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::NetDevice::PacketType'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::McpsDataConfirmParams'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
@@ -6582,9 +6586,9 @@
     cls.add_method('SetAntenna', 
                    'void', 
                    [param('ns3::Ptr< ns3::AntennaModel >', 'a')])
-    ## lr-wpan-phy.h (module 'lr-wpan'): ns3::Ptr<ns3::AntennaModel> ns3::LrWpanPhy::GetRxAntenna() const [member function]
-    cls.add_method('GetRxAntenna', 
-                   'ns3::Ptr< ns3::AntennaModel >', 
+    ## lr-wpan-phy.h (module 'lr-wpan'): ns3::Ptr<ns3::Object> ns3::LrWpanPhy::GetAntenna() const [member function]
+    cls.add_method('GetAntenna', 
+                   'ns3::Ptr< ns3::Object >', 
                    [], 
                    is_const=True, is_virtual=True)
     ## lr-wpan-phy.h (module 'lr-wpan'): ns3::Ptr<const ns3::SpectrumModel> ns3::LrWpanPhy::GetRxSpectrumModel() const [member function]
@@ -6989,10 +6993,16 @@
     cls.add_method('ExtractNeighborIndex', 
                    'uint32_t', 
                    [param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetEpoch() const [member function]
+    cls.add_method('GetEpoch', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() const [member function]
     cls.add_method('GetRemainingBits', 
                    'uint32_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -7003,6 +7013,10 @@
                    'uint32_t', 
                    [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
+    ## nix-vector.h (module 'network'): void ns3::NixVector::SetEpoch(uint32_t epoch) [member function]
+    cls.add_method('SetEpoch', 
+                   'void', 
+                   [param('uint32_t', 'epoch')])
     return
 
 def register_Ns3Node_methods(root_module, cls):
@@ -7334,10 +7348,11 @@
                    'uint32_t', 
                    [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) const [member function]
     cls.add_method('SetNixVector', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')], 
+                   is_const=True)
     ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
     cls.add_method('ToString', 
                    'std::string', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lr-wpan/CMakeLists.txt ns-3.36/src/lr-wpan/CMakeLists.txt
--- ns-3.35/src/lr-wpan/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/lr-wpan/CMakeLists.txt	2022-04-30 18:23:57.882733600 -0700
@@ -0,0 +1,50 @@
+build_lib(
+  LIBNAME lr-wpan
+  SOURCE_FILES
+    helper/lr-wpan-helper.cc
+    model/lr-wpan-csmaca.cc
+    model/lr-wpan-error-model.cc
+    model/lr-wpan-fields.cc
+    model/lr-wpan-interference-helper.cc
+    model/lr-wpan-lqi-tag.cc
+    model/lr-wpan-mac-header.cc
+    model/lr-wpan-mac-pl-headers.cc
+    model/lr-wpan-mac-trailer.cc
+    model/lr-wpan-mac.cc
+    model/lr-wpan-net-device.cc
+    model/lr-wpan-phy.cc
+    model/lr-wpan-spectrum-signal-parameters.cc
+    model/lr-wpan-spectrum-value-helper.cc
+  HEADER_FILES
+    helper/lr-wpan-helper.h
+    model/lr-wpan-csmaca.h
+    model/lr-wpan-error-model.h
+    model/lr-wpan-fields.h
+    model/lr-wpan-interference-helper.h
+    model/lr-wpan-lqi-tag.h
+    model/lr-wpan-mac-header.h
+    model/lr-wpan-mac-pl-headers.h
+    model/lr-wpan-mac-trailer.h
+    model/lr-wpan-mac.h
+    model/lr-wpan-net-device.h
+    model/lr-wpan-phy.h
+    model/lr-wpan-spectrum-signal-parameters.h
+    model/lr-wpan-spectrum-value-helper.h
+  LIBRARIES_TO_LINK
+    ${libnetwork}
+    ${libcore}
+    ${libmobility}
+    ${libspectrum}
+    ${libpropagation}
+  TEST_SOURCES
+    test/lr-wpan-ack-test.cc
+    test/lr-wpan-cca-test.cc
+    test/lr-wpan-collision-test.cc
+    test/lr-wpan-ed-test.cc
+    test/lr-wpan-error-model-test.cc
+    test/lr-wpan-packet-test.cc
+    test/lr-wpan-pd-plme-sap-test.cc
+    test/lr-wpan-spectrum-value-helper-test.cc
+    test/lr-wpan-ifs-test.cc
+    test/lr-wpan-slotted-csmaca-test.cc
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lr-wpan/examples/CMakeLists.txt ns-3.36/src/lr-wpan/examples/CMakeLists.txt
--- ns-3.35/src/lr-wpan/examples/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/lr-wpan/examples/CMakeLists.txt	2022-04-30 18:23:57.890733700 -0700
@@ -0,0 +1,31 @@
+set(base_examples
+    lr-wpan-data
+    lr-wpan-mlme
+    lr-wpan-packet-print
+    lr-wpan-phy-test
+)
+
+foreach(
+  example
+  ${base_examples}
+)
+  build_lib_example(
+    NAME ${example}
+    SOURCE_FILES ${example}.cc
+    LIBRARIES_TO_LINK ${liblr-wpan}
+  )
+endforeach()
+
+build_lib_example(
+  NAME lr-wpan-error-distance-plot
+  SOURCE_FILES lr-wpan-error-distance-plot.cc
+  LIBRARIES_TO_LINK ${liblr-wpan}
+                    ${libstats}
+)
+
+build_lib_example(
+  NAME lr-wpan-error-model-plot
+  SOURCE_FILES lr-wpan-error-model-plot.cc
+  LIBRARIES_TO_LINK ${liblr-wpan}
+                    ${libstats}
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lr-wpan/examples/wscript ns-3.36/src/lr-wpan/examples/wscript
--- ns-3.35/src/lr-wpan/examples/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lr-wpan/examples/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,20 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    obj = bld.create_ns3_program('lr-wpan-packet-print', ['lr-wpan'])
-    obj.source = 'lr-wpan-packet-print.cc'
-
-    obj = bld.create_ns3_program('lr-wpan-phy-test', ['lr-wpan'])
-    obj.source = 'lr-wpan-phy-test.cc'
-
-    obj = bld.create_ns3_program('lr-wpan-data', ['lr-wpan'])
-    obj.source = 'lr-wpan-data.cc'
-
-    obj = bld.create_ns3_program('lr-wpan-error-model-plot', ['lr-wpan', 'stats'])
-    obj.source = 'lr-wpan-error-model-plot.cc'
-
-    obj = bld.create_ns3_program('lr-wpan-error-distance-plot', ['lr-wpan', 'stats'])
-    obj.source = 'lr-wpan-error-distance-plot.cc'
-    
-    obj = bld.create_ns3_program('lr-wpan-mlme', ['lr-wpan'])
-    obj.source = 'lr-wpan-mlme.cc'
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lr-wpan/model/lr-wpan-csmaca.cc ns-3.36/src/lr-wpan/model/lr-wpan-csmaca.cc
--- ns-3.35/src/lr-wpan/model/lr-wpan-csmaca.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lr-wpan/model/lr-wpan-csmaca.cc	2022-04-30 18:23:57.890733700 -0700
@@ -195,8 +195,8 @@
   uint64_t elapsedSuperframeSymbols;
   uint64_t symbolRate;
   Time timeAtBoundary;
-  Time elapsedCap;
-  Time beaconTime;
+  [[maybe_unused]] Time elapsedCap;
+  [[maybe_unused]] Time beaconTime;
 
 
   currentTime = Simulator::Now ();
@@ -210,8 +210,6 @@
       beaconTime = Seconds ((double) m_mac->m_rxBeaconSymbols / symbolRate);
       elapsedCap = elapsedSuperframe - beaconTime;
       NS_LOG_DEBUG ("Elapsed incoming CAP symbols: " << (elapsedCap.GetSeconds () * symbolRate)  << " (" << elapsedCap.As (Time::S) << ")");
-      NS_UNUSED (beaconTime);
-      NS_UNUSED (elapsedCap);
     }
   else
     {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lr-wpan/model/lr-wpan-lqi-tag.h ns-3.36/src/lr-wpan/model/lr-wpan-lqi-tag.h
--- ns-3.35/src/lr-wpan/model/lr-wpan-lqi-tag.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lr-wpan/model/lr-wpan-lqi-tag.h	2022-04-30 18:23:57.890733700 -0700
@@ -25,6 +25,15 @@
 
 namespace ns3 {
 
+/**
+ * \ingroup lr-wpan
+ * Represent the LQI (Link Quality Estination).
+ * 
+ * The LQI Tag is added to each received packet, and can be 
+ * used by upper layers to estimate the channel conditions.
+ * 
+ * The LQI is the total packet success rate scaled to 0-255.
+ */
 class LrWpanLqiTag : public Tag
 {
 public:
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lr-wpan/model/lr-wpan-phy.cc ns-3.36/src/lr-wpan/model/lr-wpan-phy.cc
--- ns-3.35/src/lr-wpan/model/lr-wpan-phy.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lr-wpan/model/lr-wpan-phy.cc	2022-04-30 18:23:57.890733700 -0700
@@ -259,8 +259,8 @@
     }
 }
 
-Ptr<AntennaModel>
-LrWpanPhy::GetRxAntenna (void) const
+Ptr<Object>
+LrWpanPhy::GetAntenna (void) const
 {
   NS_LOG_FUNCTION (this);
   return m_antenna;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lr-wpan/model/lr-wpan-phy.h ns-3.36/src/lr-wpan/model/lr-wpan-phy.h
--- ns-3.35/src/lr-wpan/model/lr-wpan-phy.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lr-wpan/model/lr-wpan-phy.h	2022-04-30 18:23:57.890733700 -0700
@@ -294,7 +294,7 @@
    * \param a the antenna
    */
   void SetAntenna (Ptr<AntennaModel> a);
-  Ptr<AntennaModel> GetRxAntenna (void) const;
+  Ptr<Object> GetAntenna (void) const;
   virtual Ptr<const SpectrumModel> GetRxSpectrumModel (void) const;
 
   /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lr-wpan/wscript ns-3.36/src/lr-wpan/wscript
--- ns-3.35/src/lr-wpan/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lr-wpan/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,64 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    obj = bld.create_ns3_module('lr-wpan', ['core', 'network', 'mobility', 'spectrum', 'propagation'])
-    obj.source = [
-        'model/lr-wpan-error-model.cc',
-        'model/lr-wpan-interference-helper.cc',
-        'model/lr-wpan-phy.cc',
-        'model/lr-wpan-mac.cc',
-        'model/lr-wpan-mac-header.cc',
-        'model/lr-wpan-mac-pl-headers.cc',
-        'model/lr-wpan-fields.cc',
-        'model/lr-wpan-mac-trailer.cc',
-        'model/lr-wpan-csmaca.cc',
-        'model/lr-wpan-net-device.cc',
-        'model/lr-wpan-spectrum-value-helper.cc',
-        'model/lr-wpan-spectrum-signal-parameters.cc',
-        'model/lr-wpan-lqi-tag.cc',
-        'helper/lr-wpan-helper.cc',
-        ]
-
-    module_test = bld.create_ns3_module_test_library('lr-wpan')
-    module_test.source = [
-        'test/lr-wpan-ack-test.cc',
-        'test/lr-wpan-cca-test.cc',
-        'test/lr-wpan-collision-test.cc',
-        'test/lr-wpan-ed-test.cc',
-        'test/lr-wpan-error-model-test.cc',
-        'test/lr-wpan-packet-test.cc',
-        'test/lr-wpan-pd-plme-sap-test.cc',
-        'test/lr-wpan-spectrum-value-helper-test.cc',
-        'test/lr-wpan-ifs-test.cc',
-        'test/lr-wpan-slotted-csmaca-test.cc',
-        ]
-     
-    # Tests encapsulating example programs should be listed here
-    if (bld.env['ENABLE_EXAMPLES']):
-        module_test.source.extend([
-        #   'test/lr-wpan-examples-test-suite.cc',
-            ])
-    
-    headers = bld(features='ns3header')
-    headers.module = 'lr-wpan'
-    headers.source = [
-        'model/lr-wpan-error-model.h',
-        'model/lr-wpan-interference-helper.h',
-        'model/lr-wpan-phy.h',
-        'model/lr-wpan-mac.h',
-        'model/lr-wpan-mac-header.h',
-        'model/lr-wpan-mac-pl-headers.h',
-        'model/lr-wpan-fields.h',
-        'model/lr-wpan-mac-trailer.h',
-        'model/lr-wpan-csmaca.h',
-        'model/lr-wpan-net-device.h',
-        'model/lr-wpan-spectrum-value-helper.h',
-        'model/lr-wpan-spectrum-signal-parameters.h',
-        'model/lr-wpan-lqi-tag.h',
-        'helper/lr-wpan-helper.h',
-        ]
-
-    if (bld.env['ENABLE_EXAMPLES']):
-        bld.recurse('examples')
-
-    bld.ns3_python_bindings()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/bindings/callbacks_list.py ns-3.36/src/lte/bindings/callbacks_list.py
--- ns-3.35/src/lte/bindings/callbacks_list.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/bindings/callbacks_list.py	2022-04-30 18:23:57.894733700 -0700
@@ -3,15 +3,21 @@
     ['void', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['bool', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'const ns3::Address &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['bool', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'const ns3::Address &', 'const ns3::Address &', 'ns3::NetDevice::PacketType', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Ptr<ns3::Socket>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['bool', 'ns3::Ptr<ns3::Socket>', 'const ns3::Address &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Ptr<ns3::Socket>', 'const ns3::Address &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Ptr<ns3::Socket>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'const ns3::Address &', 'const ns3::Address &', 'ns3::NetDevice::PacketType', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::DlSchedulingCallbackInfo', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'unsigned int', 'unsigned int', 'unsigned short', 'unsigned char', 'unsigned short', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::MobilityModel>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::SpectrumPhy>', 'ns3::Ptr<const ns3::SpectrumPhy>', 'double', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::MobilityModel>', 'ns3::Ptr<const ns3::MobilityModel>', 'double', 'double', 'double', 'double', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<ns3::SpectrumSignalParameters>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<ns3::Packet>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'std::list<ns3::Ptr<ns3::LteControlMessage>, std::allocator<ns3::Ptr<ns3::LteControlMessage> > >', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'std::list<ns3::Ptr<ns3::LteControlMessage>, std::allocator<ns3::Ptr<ns3::LteControlMessage>>>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'unsigned short', 'ns3::Ptr<ns3::SpectrumValue>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::DlInfoListElement_s', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::UlInfoListElement_s', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
@@ -23,11 +29,7 @@
     ['void', 'unsigned short', 'unsigned short', 'ns3::LteUePhy::State', 'ns3::LteUePhy::State', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'unsigned short', 'unsigned short', 'double', 'double', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'unsigned short', 'unsigned short', 'double', 'double', 'bool', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'unsigned short', 'const std::vector<int, std::allocator<int> > &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Ptr<ns3::Socket>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['bool', 'ns3::Ptr<ns3::Socket>', 'const ns3::Address &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Ptr<ns3::Socket>', 'const ns3::Address &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Ptr<ns3::Socket>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'unsigned short', 'const std::vector<int, std::allocator<int>> &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['bool', 'ns3::Ptr<ns3::Packet>', 'const ns3::Address &', 'const ns3::Address &', 'unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::EpcUeNas::State', 'ns3::EpcUeNas::State', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'const ns3::SpectrumValue &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
@@ -40,11 +42,9 @@
     ['void', 'unsigned long', 'unsigned short', 'unsigned short', 'unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'unsigned long', 'unsigned short', 'unsigned short', 'ns3::LteRrcSap::MeasurementReport', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'unsigned long', 'unsigned short', 'unsigned short', 'std::basic_string<char>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::DlSchedulingCallbackInfo', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'unsigned int', 'unsigned int', 'unsigned short', 'unsigned char', 'unsigned short', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'unsigned long', 'bool', 'unsigned char', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'unsigned long', 'unsigned short', 'unsigned short', 'ns3::LteUeRrc::State', 'ns3::LteUeRrc::State', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'unsigned long', 'unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Ptr<ns3::LteUeRrc>', 'std::list<ns3::LteRrcSap::SCellToAddMod, std::allocator<ns3::LteRrcSap::SCellToAddMod> >', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Ptr<ns3::LteUeRrc>', 'std::list<ns3::LteRrcSap::SCellToAddMod, std::allocator<ns3::LteRrcSap::SCellToAddMod>>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'unsigned long', 'unsigned short', 'unsigned short', 'std::basic_string<char>', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
 ]
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/bindings/modulegen__gcc_ILP32.py ns-3.36/src/lte/bindings/modulegen__gcc_ILP32.py
--- ns-3.35/src/lte/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/bindings/modulegen__gcc_ILP32.py	2022-04-30 18:23:57.894733700 -0700
@@ -36,6 +36,8 @@
     module.add_enum('MaxSize_e', ['MAX_SIZE'], outer_class=root_module['ns3::Address'], import_from_module='ns.network')
     ## eps-bearer.h (module 'lte'): ns3::AllocationRetentionPriority [struct]
     module.add_class('AllocationRetentionPriority')
+    ## angles.h (module 'antenna'): ns3::Angles [class]
+    module.add_class('Angles', import_from_module='ns.antenna')
     ## attribute-construction-list.h (module 'core'): ns3::AttributeConstructionList [class]
     module.add_class('AttributeConstructionList', import_from_module='ns.core')
     ## attribute-construction-list.h (module 'core'): ns3::AttributeConstructionList::Item [struct]
@@ -257,6 +259,8 @@
     module.add_class('EutranMeasurementMapping')
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'], import_from_module='ns.core')
     ## ff-mac-csched-sap.h (module 'lte'): ns3::FfMacCschedSapProvider [class]
     module.add_class('FfMacCschedSapProvider', allow_subclassing=True)
     ## ff-mac-csched-sap.h (module 'lte'): ns3::FfMacCschedSapProvider::CschedCellConfigReqParameters [struct]
@@ -544,10 +548,12 @@
     module.add_class('MeasResultBestNeighCell', outer_class=root_module['ns3::LteRrcSap'])
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultEutra [struct]
     module.add_class('MeasResultEutra', outer_class=root_module['ns3::LteRrcSap'])
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultScell [struct]
-    module.add_class('MeasResultScell', outer_class=root_module['ns3::LteRrcSap'])
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultServFreqList [struct]
-    module.add_class('MeasResultServFreqList', outer_class=root_module['ns3::LteRrcSap'])
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultPCell [struct]
+    module.add_class('MeasResultPCell', outer_class=root_module['ns3::LteRrcSap'])
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultSCell [struct]
+    module.add_class('MeasResultSCell', outer_class=root_module['ns3::LteRrcSap'])
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultServFreq [struct]
+    module.add_class('MeasResultServFreq', outer_class=root_module['ns3::LteRrcSap'])
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResults [struct]
     module.add_class('MeasResults', outer_class=root_module['ns3::LteRrcSap'])
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasurementReport [struct]
@@ -1010,6 +1016,13 @@
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::PacketBurst const > )&', 'ns3::PacketBurst::TracedCallback&')
     ## lte-pdcp-tag.h (module 'lte'): ns3::PdcpTag [class]
     module.add_class('PdcpTag', parent=root_module['ns3::Tag'])
+    ## phased-array-model.h (module 'antenna'): ns3::PhasedArrayModel [class]
+    module.add_class('PhasedArrayModel', import_from_module='ns.antenna', parent=root_module['ns3::Object'])
+    typehandlers.add_type_alias('std::vector< std::complex< double > >', 'ns3::PhasedArrayModel::ComplexVector')
+    typehandlers.add_type_alias('std::vector< std::complex< double > >*', 'ns3::PhasedArrayModel::ComplexVector*')
+    typehandlers.add_type_alias('std::vector< std::complex< double > >&', 'ns3::PhasedArrayModel::ComplexVector&')
+    ## phased-array-spectrum-propagation-loss-model.h (module 'spectrum'): ns3::PhasedArraySpectrumPropagationLossModel [class]
+    module.add_class('PhasedArraySpectrumPropagationLossModel', import_from_module='ns.spectrum', parent=root_module['ns3::Object'])
     ## propagation-delay-model.h (module 'propagation'): ns3::PropagationDelayModel [class]
     module.add_class('PropagationDelayModel', import_from_module='ns.propagation', parent=root_module['ns3::Object'])
     ## propagation-loss-model.h (module 'propagation'): ns3::PropagationLossModel [class]
@@ -1028,49 +1041,49 @@
     module.add_class('RlcTag', parent=root_module['ns3::Tag'])
     ## random-variable-stream.h (module 'core'): ns3::SequentialRandomVariable [class]
     module.add_class('SequentialRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EpcTft, ns3::empty, ns3::DefaultDeleter<ns3::EpcTft> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EpcTft, ns3::empty, ns3::DefaultDeleter<ns3::EpcTft>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EpcTft', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EpcTft>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EpcTftClassifier, ns3::empty, ns3::DefaultDeleter<ns3::EpcTftClassifier> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EpcTftClassifier, ns3::empty, ns3::DefaultDeleter<ns3::EpcTftClassifier>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EpcTftClassifier', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EpcTftClassifier>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv4MulticastRoute', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv4Route', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv4Route>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LteChunkProcessor, ns3::empty, ns3::DefaultDeleter<ns3::LteChunkProcessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LteChunkProcessor, ns3::empty, ns3::DefaultDeleter<ns3::LteChunkProcessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::LteChunkProcessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::LteChunkProcessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LteControlMessage, ns3::empty, ns3::DefaultDeleter<ns3::LteControlMessage> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LteControlMessage, ns3::empty, ns3::DefaultDeleter<ns3::LteControlMessage>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::LteControlMessage', 'ns3::empty', 'ns3::DefaultDeleter<ns3::LteControlMessage>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LteHarqPhy, ns3::empty, ns3::DefaultDeleter<ns3::LteHarqPhy> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LteHarqPhy, ns3::empty, ns3::DefaultDeleter<ns3::LteHarqPhy>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::LteHarqPhy', 'ns3::empty', 'ns3::DefaultDeleter<ns3::LteHarqPhy>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::SpectrumModel', 'ns3::empty', 'ns3::DefaultDeleter<ns3::SpectrumModel>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::SpectrumSignalParameters', 'ns3::empty', 'ns3::DefaultDeleter<ns3::SpectrumSignalParameters>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::SpectrumValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::SpectrumValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::VendorSpecificValue, ns3::empty, ns3::DefaultDeleter<ns3::VendorSpecificValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::VendorSpecificValue, ns3::empty, ns3::DefaultDeleter<ns3::VendorSpecificValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::VendorSpecificValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::VendorSpecificValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::X2CellInfo, ns3::empty, ns3::DefaultDeleter<ns3::X2CellInfo> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::X2CellInfo, ns3::empty, ns3::DefaultDeleter<ns3::X2CellInfo>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::X2CellInfo', 'ns3::empty', 'ns3::DefaultDeleter<ns3::X2CellInfo>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::X2IfaceInfo, ns3::empty, ns3::DefaultDeleter<ns3::X2IfaceInfo> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::X2IfaceInfo, ns3::empty, ns3::DefaultDeleter<ns3::X2IfaceInfo>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::X2IfaceInfo', 'ns3::empty', 'ns3::DefaultDeleter<ns3::X2IfaceInfo>'])
     ## socket.h (module 'network'): ns3::Socket [class]
     module.add_class('Socket', import_from_module='ns.network', parent=root_module['ns3::Object'])
@@ -1140,6 +1153,8 @@
     module.add_class('ZetaRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
     ## random-variable-stream.h (module 'core'): ns3::ZipfRandomVariable [class]
     module.add_class('ZipfRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
+    ## antenna-model.h (module 'antenna'): ns3::AntennaModel [class]
+    module.add_class('AntennaModel', import_from_module='ns.antenna', parent=root_module['ns3::Object'])
     ## application.h (module 'network'): ns3::Application [class]
     module.add_class('Application', import_from_module='ns.network', parent=root_module['ns3::Object'])
     typehandlers.add_type_alias('void ( * ) ( ns3::Time const &, ns3::Address const & )', 'ns3::Application::DelayAddressCallback')
@@ -1714,8 +1729,8 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<const ns3::PacketBurst>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::SpectrumPhy>, ns3::Ptr<const ns3::SpectrumPhy>, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<const ns3::SpectrumPhy>', 'ns3::Ptr<const ns3::SpectrumPhy>', 'double', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::LteUeRrc>, std::list<ns3::LteRrcSap::SCellToAddMod, std::allocator<ns3::LteRrcSap::SCellToAddMod> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::LteUeRrc>', 'std::list<ns3::LteRrcSap::SCellToAddMod, std::allocator<ns3::LteRrcSap::SCellToAddMod> >', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::LteUeRrc>, std::list<ns3::LteRrcSap::SCellToAddMod, std::allocator<ns3::LteRrcSap::SCellToAddMod>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::LteUeRrc>', 'std::list<ns3::LteRrcSap::SCellToAddMod, std::allocator<ns3::LteRrcSap::SCellToAddMod>>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<const ns3::Packet>, unsigned short, const ns3::Address &, const ns3::Address &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'const ns3::Address &', 'const ns3::Address &', 'ns3::NetDevice::PacketType', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
@@ -1754,8 +1769,8 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned long long', 'unsigned short', 'unsigned short', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned long long, unsigned short, unsigned short, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned long long', 'unsigned short', 'unsigned short', 'unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned short, const std::vector<int, std::allocator<int> > &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned short', 'const std::vector<int, std::allocator<int> > &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned short, const std::vector<int, std::allocator<int>> &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned short', 'const std::vector<int, std::allocator<int>> &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned short, ns3::Ptr<ns3::SpectrumValue>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned short', 'ns3::Ptr<ns3::SpectrumValue>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned short, unsigned char, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
@@ -1848,6 +1863,7 @@
     module.add_class('RrcConnectionSetupHeader', parent=root_module['ns3::RrcDlCcchMessage'])
     ## lte-enb-net-device.h (module 'lte'): ns3::LteEnbNetDevice [class]
     module.add_class('LteEnbNetDevice', parent=root_module['ns3::LteNetDevice'])
+    module.add_container('std::vector< double >', 'double', container_type='vector')
     module.add_container('std::vector< ns3::CeBitmap_e >', 'ns3::CeBitmap_e', container_type='vector')
     module.add_container('std::vector< std::vector< ns3::RlcPduListElement_s > >', 'std::vector< ns3::RlcPduListElement_s >', container_type='vector')
     module.add_container('std::vector< unsigned char >', 'unsigned char', container_type='vector')
@@ -1888,7 +1904,7 @@
     module.add_container('std::vector< ns3::UlDciListElement_s >', 'ns3::UlDciListElement_s', container_type='vector')
     module.add_container('std::vector< ns3::PhichListElement_s >', 'ns3::PhichListElement_s', container_type='vector')
     module.add_container('std::list< ns3::EpcTft::PacketFilter >', 'ns3::EpcTft::PacketFilter', container_type='list')
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     module.add_container('std::vector< ns3::LteCcmRrcSapProvider::LcsConfig >', 'ns3::LteCcmRrcSapProvider::LcsConfig', container_type='vector')
     module.add_container('std::vector< ns3::LteRrcSap::LogicalChannelConfig >', 'ns3::LteRrcSap::LogicalChannelConfig', container_type='vector')
     module.add_container('std::map< unsigned short, std::vector< double > >', ('short unsigned int', 'std::vector< double >'), container_type='map')
@@ -1903,9 +1919,8 @@
     module.add_container('std::list< ns3::LteRrcSap::ReportConfigToAddMod >', 'ns3::LteRrcSap::ReportConfigToAddMod', container_type='list')
     module.add_container('std::list< ns3::LteRrcSap::MeasIdToAddMod >', 'ns3::LteRrcSap::MeasIdToAddMod', container_type='list')
     module.add_container('std::list< unsigned int >', 'unsigned int', container_type='list')
-    module.add_container('std::list< ns3::LteRrcSap::MeasResultScell >', 'ns3::LteRrcSap::MeasResultScell', container_type='list')
-    module.add_container('std::list< ns3::LteRrcSap::MeasResultBestNeighCell >', 'ns3::LteRrcSap::MeasResultBestNeighCell', container_type='list')
     module.add_container('std::list< ns3::LteRrcSap::MeasResultEutra >', 'ns3::LteRrcSap::MeasResultEutra', container_type='list')
+    module.add_container('std::list< ns3::LteRrcSap::MeasResultServFreq >', 'ns3::LteRrcSap::MeasResultServFreq', container_type='list')
     module.add_container('std::list< ns3::LteRrcSap::SCellToAddMod >', 'ns3::LteRrcSap::SCellToAddMod', container_type='list')
     module.add_container('std::map< int, double >', ('int', 'double'), container_type='map')
     module.add_container('std::vector< ns3::LteUeCcmRrcSapProvider::LcsConfig >', 'ns3::LteUeCcmRrcSapProvider::LcsConfig', container_type='vector')
@@ -1913,8 +1928,9 @@
     module.add_container('std::vector< ns3::HigherLayerSelected_s >', 'ns3::HigherLayerSelected_s', container_type='vector')
     module.add_container('std::vector< ns3::SiMessageListElement_s >', 'ns3::SiMessageListElement_s', container_type='vector')
     module.add_container('std::list< ns3::Ptr< ns3::Packet > >', 'ns3::Ptr< ns3::Packet >', container_type='list')
+    module.add_container('std::vector< std::complex< double > >', 'std::complex< double >', container_type='vector')
+    module.add_container('ns3::PhasedArrayModel::ComplexVector', 'std::complex< double >', container_type='vector')
     module.add_container('std::vector< ns3::Ipv6Address >', 'ns3::Ipv6Address', container_type='vector')
-    module.add_container('std::vector< double >', 'double', container_type='vector')
     module.add_container('std::vector< ns3::BandInfo >', 'ns3::BandInfo', container_type='vector')
     module.add_container('std::map< unsigned char, ns3::ComponentCarrier >', ('unsigned char', 'ns3::ComponentCarrier'), container_type='map')
     module.add_container('std::list< ns3::GtpcModifyBearerRequestMessage::BearerContextToBeModified >', 'ns3::GtpcModifyBearerRequestMessage::BearerContextToBeModified', container_type='list')
@@ -1947,27 +1963,6 @@
     typehandlers.add_type_alias('std::vector< unsigned char >', 'ns3::UlHarqProcessesStatus_t')
     typehandlers.add_type_alias('std::vector< unsigned char >*', 'ns3::UlHarqProcessesStatus_t*')
     typehandlers.add_type_alias('std::vector< unsigned char >&', 'ns3::UlHarqProcessesStatus_t&')
-    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, unsigned int >', 'ns3::Uint32Map')
-    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, unsigned int >*', 'ns3::Uint32Map*')
-    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, unsigned int >&', 'ns3::Uint32Map&')
-    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, unsigned long long >', 'ns3::Uint64Map')
-    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, unsigned long long >*', 'ns3::Uint64Map*')
-    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, unsigned long long >&', 'ns3::Uint64Map&')
-    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, ns3::Ptr< ns3::MinMaxAvgTotalCalculator< unsigned int > > >', 'ns3::Uint32StatsMap')
-    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, ns3::Ptr< ns3::MinMaxAvgTotalCalculator< unsigned int > > >*', 'ns3::Uint32StatsMap*')
-    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, ns3::Ptr< ns3::MinMaxAvgTotalCalculator< unsigned int > > >&', 'ns3::Uint32StatsMap&')
-    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, ns3::Ptr< ns3::MinMaxAvgTotalCalculator< unsigned long long > > >', 'ns3::Uint64StatsMap')
-    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, ns3::Ptr< ns3::MinMaxAvgTotalCalculator< unsigned long long > > >*', 'ns3::Uint64StatsMap*')
-    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, ns3::Ptr< ns3::MinMaxAvgTotalCalculator< unsigned long long > > >&', 'ns3::Uint64StatsMap&')
-    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, double >', 'ns3::DoubleMap')
-    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, double >*', 'ns3::DoubleMap*')
-    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, double >&', 'ns3::DoubleMap&')
-    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, ns3::LteFlowId_t >', 'ns3::FlowIdMap')
-    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, ns3::LteFlowId_t >*', 'ns3::FlowIdMap*')
-    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, ns3::LteFlowId_t >&', 'ns3::FlowIdMap&')
-    typehandlers.add_type_alias('std::vector< std::vector< ns3::Ptr< ns3::PacketBurst > > >', 'ns3::DlHarqProcessesBuffer_t')
-    typehandlers.add_type_alias('std::vector< std::vector< ns3::Ptr< ns3::PacketBurst > > >*', 'ns3::DlHarqProcessesBuffer_t*')
-    typehandlers.add_type_alias('std::vector< std::vector< ns3::Ptr< ns3::PacketBurst > > >&', 'ns3::DlHarqProcessesBuffer_t&')
     typehandlers.add_type_alias('ns3::Callback< void, ns3::SpectrumValue const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::LteChunkProcessorCallback')
     typehandlers.add_type_alias('ns3::Callback< void, ns3::SpectrumValue const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::LteChunkProcessorCallback*')
     typehandlers.add_type_alias('ns3::Callback< void, ns3::SpectrumValue const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::LteChunkProcessorCallback&')
@@ -2025,6 +2020,27 @@
     typehandlers.add_type_alias('ns3::Vector3DChecker*', 'ns3::VectorChecker*')
     typehandlers.add_type_alias('ns3::Vector3DChecker&', 'ns3::VectorChecker&')
     module.add_typedef(root_module['ns3::Vector3DChecker'], 'VectorChecker')
+    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, unsigned int >', 'ns3::Uint32Map')
+    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, unsigned int >*', 'ns3::Uint32Map*')
+    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, unsigned int >&', 'ns3::Uint32Map&')
+    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, unsigned long long >', 'ns3::Uint64Map')
+    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, unsigned long long >*', 'ns3::Uint64Map*')
+    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, unsigned long long >&', 'ns3::Uint64Map&')
+    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, ns3::Ptr< ns3::MinMaxAvgTotalCalculator< unsigned int > > >', 'ns3::Uint32StatsMap')
+    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, ns3::Ptr< ns3::MinMaxAvgTotalCalculator< unsigned int > > >*', 'ns3::Uint32StatsMap*')
+    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, ns3::Ptr< ns3::MinMaxAvgTotalCalculator< unsigned int > > >&', 'ns3::Uint32StatsMap&')
+    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, ns3::Ptr< ns3::MinMaxAvgTotalCalculator< unsigned long long > > >', 'ns3::Uint64StatsMap')
+    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, ns3::Ptr< ns3::MinMaxAvgTotalCalculator< unsigned long long > > >*', 'ns3::Uint64StatsMap*')
+    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, ns3::Ptr< ns3::MinMaxAvgTotalCalculator< unsigned long long > > >&', 'ns3::Uint64StatsMap&')
+    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, double >', 'ns3::DoubleMap')
+    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, double >*', 'ns3::DoubleMap*')
+    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, double >&', 'ns3::DoubleMap&')
+    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, ns3::LteFlowId_t >', 'ns3::FlowIdMap')
+    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, ns3::LteFlowId_t >*', 'ns3::FlowIdMap*')
+    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, ns3::LteFlowId_t >&', 'ns3::FlowIdMap&')
+    typehandlers.add_type_alias('std::vector< std::vector< ns3::Ptr< ns3::PacketBurst > > >', 'ns3::DlHarqProcessesBuffer_t')
+    typehandlers.add_type_alias('std::vector< std::vector< ns3::Ptr< ns3::PacketBurst > > >*', 'ns3::DlHarqProcessesBuffer_t*')
+    typehandlers.add_type_alias('std::vector< std::vector< ns3::Ptr< ns3::PacketBurst > > >&', 'ns3::DlHarqProcessesBuffer_t&')
     typehandlers.add_type_alias('std::vector< double >', 'ns3::Values')
     typehandlers.add_type_alias('std::vector< double >*', 'ns3::Values*')
     typehandlers.add_type_alias('std::vector< double >&', 'ns3::Values&')
@@ -2080,7 +2096,7 @@
     typehandlers.add_type_alias('std::vector< ns3::Ptr< ns3::Object > > const_iterator*', 'ns3::Config::MatchContainer::Iterator*')
     typehandlers.add_type_alias('std::vector< ns3::Ptr< ns3::Object > > const_iterator&', 'ns3::Config::MatchContainer::Iterator&')
     module.add_container('std::vector< ns3::Ptr< ns3::Object > >', 'ns3::Ptr< ns3::Object >', container_type='vector')
-    module.add_container('std::vector< std::string >', 'std::string', container_type='vector')
+    module.add_container('std::vector< std::string >', 'std::basic_string< char, std::char_traits< char >, std::allocator< char > >', container_type='vector')
 
 def register_types_ns3_FatalImpl(module):
     root_module = module.get_root()
@@ -2166,6 +2182,7 @@
 def register_methods(root_module):
     register_Ns3Address_methods(root_module, root_module['ns3::Address'])
     register_Ns3AllocationRetentionPriority_methods(root_module, root_module['ns3::AllocationRetentionPriority'])
+    register_Ns3Angles_methods(root_module, root_module['ns3::Angles'])
     register_Ns3AttributeConstructionList_methods(root_module, root_module['ns3::AttributeConstructionList'])
     register_Ns3AttributeConstructionListItem_methods(root_module, root_module['ns3::AttributeConstructionList::Item'])
     register_Ns3BandInfo_methods(root_module, root_module['ns3::BandInfo'])
@@ -2383,8 +2400,9 @@
     register_Ns3LteRrcSapMeasObjectToAddMod_methods(root_module, root_module['ns3::LteRrcSap::MeasObjectToAddMod'])
     register_Ns3LteRrcSapMeasResultBestNeighCell_methods(root_module, root_module['ns3::LteRrcSap::MeasResultBestNeighCell'])
     register_Ns3LteRrcSapMeasResultEutra_methods(root_module, root_module['ns3::LteRrcSap::MeasResultEutra'])
-    register_Ns3LteRrcSapMeasResultScell_methods(root_module, root_module['ns3::LteRrcSap::MeasResultScell'])
-    register_Ns3LteRrcSapMeasResultServFreqList_methods(root_module, root_module['ns3::LteRrcSap::MeasResultServFreqList'])
+    register_Ns3LteRrcSapMeasResultPCell_methods(root_module, root_module['ns3::LteRrcSap::MeasResultPCell'])
+    register_Ns3LteRrcSapMeasResultSCell_methods(root_module, root_module['ns3::LteRrcSap::MeasResultSCell'])
+    register_Ns3LteRrcSapMeasResultServFreq_methods(root_module, root_module['ns3::LteRrcSap::MeasResultServFreq'])
     register_Ns3LteRrcSapMeasResults_methods(root_module, root_module['ns3::LteRrcSap::MeasResults'])
     register_Ns3LteRrcSapMeasurementReport_methods(root_module, root_module['ns3::LteRrcSap::MeasurementReport'])
     register_Ns3LteRrcSapMobilityControlInfo_methods(root_module, root_module['ns3::LteRrcSap::MobilityControlInfo'])
@@ -2545,6 +2563,8 @@
     register_Ns3ObjectAggregateIterator_methods(root_module, root_module['ns3::Object::AggregateIterator'])
     register_Ns3PacketBurst_methods(root_module, root_module['ns3::PacketBurst'])
     register_Ns3PdcpTag_methods(root_module, root_module['ns3::PdcpTag'])
+    register_Ns3PhasedArrayModel_methods(root_module, root_module['ns3::PhasedArrayModel'])
+    register_Ns3PhasedArraySpectrumPropagationLossModel_methods(root_module, root_module['ns3::PhasedArraySpectrumPropagationLossModel'])
     register_Ns3PropagationDelayModel_methods(root_module, root_module['ns3::PropagationDelayModel'])
     register_Ns3PropagationLossModel_methods(root_module, root_module['ns3::PropagationLossModel'])
     register_Ns3RadioEnvironmentMapHelper_methods(root_module, root_module['ns3::RadioEnvironmentMapHelper'])
@@ -2602,6 +2622,7 @@
     register_Ns3X2IfaceInfo_methods(root_module, root_module['ns3::X2IfaceInfo'])
     register_Ns3ZetaRandomVariable_methods(root_module, root_module['ns3::ZetaRandomVariable'])
     register_Ns3ZipfRandomVariable_methods(root_module, root_module['ns3::ZipfRandomVariable'])
+    register_Ns3AntennaModel_methods(root_module, root_module['ns3::AntennaModel'])
     register_Ns3Application_methods(root_module, root_module['ns3::Application'])
     register_Ns3Asn1Header_methods(root_module, root_module['ns3::Asn1Header'])
     register_Ns3AttributeAccessor_methods(root_module, root_module['ns3::AttributeAccessor'])
@@ -2806,7 +2827,7 @@
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::Packet>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3PacketBurst__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::PacketBurst>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3SpectrumPhy__gt___Ns3Ptr__lt__const_ns3SpectrumPhy__gt___Double_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::SpectrumPhy>, ns3::Ptr<const ns3::SpectrumPhy>, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3LteUeRrc__gt___StdList__lt__ns3LteRrcSapSCellToAddMod__stdAllocator__lt__ns3LteRrcSapSCellToAddMod__gt_____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::LteUeRrc>, std::list<ns3::LteRrcSap::SCellToAddMod, std::allocator<ns3::LteRrcSap::SCellToAddMod> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3LteUeRrc__gt___StdList__lt__ns3LteRrcSapSCellToAddMod__stdAllocator__lt__ns3LteRrcSapSCellToAddMod__gt____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::LteUeRrc>, std::list<ns3::LteRrcSap::SCellToAddMod, std::allocator<ns3::LteRrcSap::SCellToAddMod>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3NetDevice__gt___Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_short_Const_ns3Address___amp___Const_ns3Address___amp___Ns3NetDevicePacketType_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<const ns3::Packet>, unsigned short, const ns3::Address &, const ns3::Address &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3NetDevice__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::NetDevice>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3Packet__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::Packet>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
@@ -2826,7 +2847,7 @@
     register_Ns3CallbackImpl__Void_Unsigned_long_Unsigned_short_Unsigned_short_StdBasic_string__lt__char__gt___Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned long long, unsigned short, unsigned short, std::basic_string<char>, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Unsigned_long_Unsigned_short_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Unsigned_long_Unsigned_short_Unsigned_short_Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned long long, unsigned short, unsigned short, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3CallbackImpl__Void_Unsigned_short_Const_stdVector__lt__int__stdAllocator__lt__int__gt_____gt_____amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned short, const std::vector<int, std::allocator<int> > &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Unsigned_short_Const_stdVector__lt__int__stdAllocator__lt__int__gt____gt_____amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned short, const std::vector<int, std::allocator<int>> &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Unsigned_short_Ns3Ptr__lt__ns3SpectrumValue__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned short, ns3::Ptr<ns3::SpectrumValue>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Unsigned_short_Unsigned_char_Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned short, unsigned char, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Unsigned_short_Unsigned_char_Unsigned_int_Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned short, unsigned char, unsigned int, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
@@ -2961,6 +2982,38 @@
     cls.add_instance_attribute('priorityLevel', 'uint8_t', is_const=False)
     return
 
+def register_Ns3Angles_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## angles.h (module 'antenna'): ns3::Angles::Angles(ns3::Angles const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Angles const &', 'arg0')])
+    ## angles.h (module 'antenna'): ns3::Angles::Angles(double azimuth, double inclination) [constructor]
+    cls.add_constructor([param('double', 'azimuth'), param('double', 'inclination')])
+    ## angles.h (module 'antenna'): ns3::Angles::Angles(ns3::Vector v) [constructor]
+    cls.add_constructor([param('ns3::Vector', 'v')])
+    ## angles.h (module 'antenna'): ns3::Angles::Angles(ns3::Vector v, ns3::Vector o) [constructor]
+    cls.add_constructor([param('ns3::Vector', 'v'), param('ns3::Vector', 'o')])
+    ## angles.h (module 'antenna'): double ns3::Angles::GetAzimuth() const [member function]
+    cls.add_method('GetAzimuth', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## angles.h (module 'antenna'): double ns3::Angles::GetInclination() const [member function]
+    cls.add_method('GetInclination', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## angles.h (module 'antenna'): void ns3::Angles::SetAzimuth(double azimuth) [member function]
+    cls.add_method('SetAzimuth', 
+                   'void', 
+                   [param('double', 'azimuth')])
+    ## angles.h (module 'antenna'): void ns3::Angles::SetInclination(double inclination) [member function]
+    cls.add_method('SetInclination', 
+                   'void', 
+                   [param('double', 'inclination')])
+    ## angles.h (module 'antenna'): ns3::Angles::m_printDeg [variable]
+    cls.add_static_attribute('m_printDeg', 'bool', is_const=False)
+    return
+
 def register_Ns3AttributeConstructionList_methods(root_module, cls):
     ## attribute-construction-list.h (module 'core'): ns3::AttributeConstructionList::AttributeConstructionList(ns3::AttributeConstructionList const & arg0) [constructor]
     cls.add_constructor([param('ns3::AttributeConstructionList const &', 'arg0')])
@@ -4268,12 +4321,12 @@
     cls.add_constructor([])
     ## epc-s1ap-sap.h (module 'lte'): ns3::EpcS1apSapEnb::EpcS1apSapEnb(ns3::EpcS1apSapEnb const & arg0) [constructor]
     cls.add_constructor([param('ns3::EpcS1apSapEnb const &', 'arg0')])
-    ## epc-s1ap-sap.h (module 'lte'): void ns3::EpcS1apSapEnb::InitialContextSetupRequest(uint64_t mmeUeS1Id, uint16_t enbUeS1Id, std::list<ns3::EpcS1apSapEnb::ErabToBeSetupItem, std::allocator<ns3::EpcS1apSapEnb::ErabToBeSetupItem> > erabToBeSetupList) [member function]
+    ## epc-s1ap-sap.h (module 'lte'): void ns3::EpcS1apSapEnb::InitialContextSetupRequest(uint64_t mmeUeS1Id, uint16_t enbUeS1Id, std::list<ns3::EpcS1apSapEnb::ErabToBeSetupItem, std::allocator<ns3::EpcS1apSapEnb::ErabToBeSetupItem>> erabToBeSetupList) [member function]
     cls.add_method('InitialContextSetupRequest', 
                    'void', 
                    [param('uint64_t', 'mmeUeS1Id'), param('uint16_t', 'enbUeS1Id'), param('std::list< ns3::EpcS1apSapEnb::ErabToBeSetupItem >', 'erabToBeSetupList')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## epc-s1ap-sap.h (module 'lte'): void ns3::EpcS1apSapEnb::PathSwitchRequestAcknowledge(uint64_t enbUeS1Id, uint64_t mmeUeS1Id, uint16_t cgi, std::list<ns3::EpcS1apSapEnb::ErabSwitchedInUplinkItem, std::allocator<ns3::EpcS1apSapEnb::ErabSwitchedInUplinkItem> > erabToBeSwitchedInUplinkList) [member function]
+    ## epc-s1ap-sap.h (module 'lte'): void ns3::EpcS1apSapEnb::PathSwitchRequestAcknowledge(uint64_t enbUeS1Id, uint64_t mmeUeS1Id, uint16_t cgi, std::list<ns3::EpcS1apSapEnb::ErabSwitchedInUplinkItem, std::allocator<ns3::EpcS1apSapEnb::ErabSwitchedInUplinkItem>> erabToBeSwitchedInUplinkList) [member function]
     cls.add_method('PathSwitchRequestAcknowledge', 
                    'void', 
                    [param('uint64_t', 'enbUeS1Id'), param('uint64_t', 'mmeUeS1Id'), param('uint16_t', 'cgi'), param('std::list< ns3::EpcS1apSapEnb::ErabSwitchedInUplinkItem >', 'erabToBeSwitchedInUplinkList')], 
@@ -4313,12 +4366,12 @@
     cls.add_constructor([])
     ## epc-s1ap-sap.h (module 'lte'): ns3::EpcS1apSapMme::EpcS1apSapMme(ns3::EpcS1apSapMme const & arg0) [constructor]
     cls.add_constructor([param('ns3::EpcS1apSapMme const &', 'arg0')])
-    ## epc-s1ap-sap.h (module 'lte'): void ns3::EpcS1apSapMme::ErabReleaseIndication(uint64_t mmeUeS1Id, uint16_t enbUeS1Id, std::list<ns3::EpcS1apSapMme::ErabToBeReleasedIndication, std::allocator<ns3::EpcS1apSapMme::ErabToBeReleasedIndication> > erabToBeReleaseIndication) [member function]
+    ## epc-s1ap-sap.h (module 'lte'): void ns3::EpcS1apSapMme::ErabReleaseIndication(uint64_t mmeUeS1Id, uint16_t enbUeS1Id, std::list<ns3::EpcS1apSapMme::ErabToBeReleasedIndication, std::allocator<ns3::EpcS1apSapMme::ErabToBeReleasedIndication>> erabToBeReleaseIndication) [member function]
     cls.add_method('ErabReleaseIndication', 
                    'void', 
                    [param('uint64_t', 'mmeUeS1Id'), param('uint16_t', 'enbUeS1Id'), param('std::list< ns3::EpcS1apSapMme::ErabToBeReleasedIndication >', 'erabToBeReleaseIndication')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## epc-s1ap-sap.h (module 'lte'): void ns3::EpcS1apSapMme::InitialContextSetupResponse(uint64_t mmeUeS1Id, uint16_t enbUeS1Id, std::list<ns3::EpcS1apSapMme::ErabSetupItem, std::allocator<ns3::EpcS1apSapMme::ErabSetupItem> > erabSetupList) [member function]
+    ## epc-s1ap-sap.h (module 'lte'): void ns3::EpcS1apSapMme::InitialContextSetupResponse(uint64_t mmeUeS1Id, uint16_t enbUeS1Id, std::list<ns3::EpcS1apSapMme::ErabSetupItem, std::allocator<ns3::EpcS1apSapMme::ErabSetupItem>> erabSetupList) [member function]
     cls.add_method('InitialContextSetupResponse', 
                    'void', 
                    [param('uint64_t', 'mmeUeS1Id'), param('uint16_t', 'enbUeS1Id'), param('std::list< ns3::EpcS1apSapMme::ErabSetupItem >', 'erabSetupList')], 
@@ -4328,7 +4381,7 @@
                    'void', 
                    [param('uint64_t', 'mmeUeS1Id'), param('uint16_t', 'enbUeS1Id'), param('uint64_t', 'stmsi'), param('uint16_t', 'ecgi')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## epc-s1ap-sap.h (module 'lte'): void ns3::EpcS1apSapMme::PathSwitchRequest(uint64_t enbUeS1Id, uint64_t mmeUeS1Id, uint16_t gci, std::list<ns3::EpcS1apSapMme::ErabSwitchedInDownlinkItem, std::allocator<ns3::EpcS1apSapMme::ErabSwitchedInDownlinkItem> > erabToBeSwitchedInDownlinkList) [member function]
+    ## epc-s1ap-sap.h (module 'lte'): void ns3::EpcS1apSapMme::PathSwitchRequest(uint64_t enbUeS1Id, uint64_t mmeUeS1Id, uint16_t gci, std::list<ns3::EpcS1apSapMme::ErabSwitchedInDownlinkItem, std::allocator<ns3::EpcS1apSapMme::ErabSwitchedInDownlinkItem>> erabToBeSwitchedInDownlinkList) [member function]
     cls.add_method('PathSwitchRequest', 
                    'void', 
                    [param('uint64_t', 'enbUeS1Id'), param('uint64_t', 'mmeUeS1Id'), param('uint16_t', 'gci'), param('std::list< ns3::EpcS1apSapMme::ErabSwitchedInDownlinkItem >', 'erabToBeSwitchedInDownlinkList')], 
@@ -5519,7 +5572,7 @@
     cls.add_instance_attribute('serializedSizeBearerQos', 'uint32_t const', is_const=True)
     ## epc-gtpc-header.h (module 'lte'): ns3::GtpcIes::serializedSizePacketFilter [variable]
     cls.add_instance_attribute('serializedSizePacketFilter', 'uint32_t const', is_const=True)
-    ## epc-gtpc-header.h (module 'lte'): uint32_t ns3::GtpcIes::GetSerializedSizeBearerTft(std::list<ns3::EpcTft::PacketFilter, std::allocator<ns3::EpcTft::PacketFilter> > packetFilters) const [member function]
+    ## epc-gtpc-header.h (module 'lte'): uint32_t ns3::GtpcIes::GetSerializedSizeBearerTft(std::list<ns3::EpcTft::PacketFilter, std::allocator<ns3::EpcTft::PacketFilter>> packetFilters) const [member function]
     cls.add_method('GetSerializedSizeBearerTft', 
                    'uint32_t', 
                    [param('std::list< ns3::EpcTft::PacketFilter >', 'packetFilters')], 
@@ -5575,7 +5628,7 @@
     cls.add_method('DeserializeBearerQos', 
                    'uint32_t', 
                    [param('ns3::Buffer::Iterator &', 'i'), param('ns3::EpsBearer &', 'bearerQos')])
-    ## epc-gtpc-header.h (module 'lte'): void ns3::GtpcIes::SerializeBearerTft(ns3::Buffer::Iterator & i, std::list<ns3::EpcTft::PacketFilter, std::allocator<ns3::EpcTft::PacketFilter> > packetFilters) const [member function]
+    ## epc-gtpc-header.h (module 'lte'): void ns3::GtpcIes::SerializeBearerTft(ns3::Buffer::Iterator & i, std::list<ns3::EpcTft::PacketFilter, std::allocator<ns3::EpcTft::PacketFilter>> packetFilters) const [member function]
     cls.add_method('SerializeBearerTft', 
                    'void', 
                    [param('ns3::Buffer::Iterator &', 'i'), param('std::list< ns3::EpcTft::PacketFilter >', 'packetFilters')], 
@@ -6370,11 +6423,11 @@
     cls.add_method('Assign', 
                    'ns3::Ipv6InterfaceContainer', 
                    [param('ns3::NetDeviceContainer const &', 'c')])
-    ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6InterfaceContainer ns3::Ipv6AddressHelper::Assign(ns3::NetDeviceContainer const & c, std::vector<bool, std::allocator<bool> > withConfiguration) [member function]
+    ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6InterfaceContainer ns3::Ipv6AddressHelper::Assign(ns3::NetDeviceContainer const & c, std::vector<bool, std::allocator<bool>> withConfiguration) [member function]
     cls.add_method('Assign', 
                    'ns3::Ipv6InterfaceContainer', 
                    [param('ns3::NetDeviceContainer const &', 'c'), param('std::vector< bool >', 'withConfiguration')])
-    ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6InterfaceContainer ns3::Ipv6AddressHelper::Assign(ns3::NetDeviceContainer const & c, std::vector<bool, std::allocator<bool> > withConfiguration, std::vector<bool, std::allocator<bool> > onLink) [member function]
+    ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6InterfaceContainer ns3::Ipv6AddressHelper::Assign(ns3::NetDeviceContainer const & c, std::vector<bool, std::allocator<bool>> withConfiguration, std::vector<bool, std::allocator<bool>> onLink) [member function]
     cls.add_method('Assign', 
                    'ns3::Ipv6InterfaceContainer', 
                    [param('ns3::NetDeviceContainer const &', 'c'), param('std::vector< bool >', 'withConfiguration'), param('std::vector< bool >', 'onLink')])
@@ -6837,7 +6890,7 @@
                    'ns3::LteMacSapUser *', 
                    [param('ns3::LteEnbCmacSapProvider::LcInfo', 'lcInfo'), param('ns3::LteMacSapUser *', 'rlcMacSapUser')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## lte-ccm-rrc-sap.h (module 'lte'): std::vector<unsigned char, std::allocator<unsigned char> > ns3::LteCcmRrcSapProvider::ReleaseDataRadioBearer(uint16_t rnti, uint8_t lcid) [member function]
+    ## lte-ccm-rrc-sap.h (module 'lte'): std::vector<unsigned char, std::allocator<unsigned char>> ns3::LteCcmRrcSapProvider::ReleaseDataRadioBearer(uint16_t rnti, uint8_t lcid) [member function]
     cls.add_method('ReleaseDataRadioBearer', 
                    'std::vector< unsigned char >', 
                    [param('uint16_t', 'rnti'), param('uint8_t', 'lcid')], 
@@ -6852,7 +6905,7 @@
                    'void', 
                    [param('uint16_t', 'rnti'), param('ns3::LteRrcSap::MeasResults', 'measResults')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## lte-ccm-rrc-sap.h (module 'lte'): std::vector<ns3::LteCcmRrcSapProvider::LcsConfig, std::allocator<ns3::LteCcmRrcSapProvider::LcsConfig> > ns3::LteCcmRrcSapProvider::SetupDataRadioBearer(ns3::EpsBearer bearer, uint8_t bearerId, uint16_t rnti, uint8_t lcid, uint8_t lcGroup, ns3::LteMacSapUser * msu) [member function]
+    ## lte-ccm-rrc-sap.h (module 'lte'): std::vector<ns3::LteCcmRrcSapProvider::LcsConfig, std::allocator<ns3::LteCcmRrcSapProvider::LcsConfig>> ns3::LteCcmRrcSapProvider::SetupDataRadioBearer(ns3::EpsBearer bearer, uint8_t bearerId, uint16_t rnti, uint8_t lcid, uint8_t lcGroup, ns3::LteMacSapUser * msu) [member function]
     cls.add_method('SetupDataRadioBearer', 
                    'std::vector< ns3::LteCcmRrcSapProvider::LcsConfig >', 
                    [param('ns3::EpsBearer', 'bearer'), param('uint8_t', 'bearerId'), param('uint16_t', 'rnti'), param('uint8_t', 'lcid'), param('uint8_t', 'lcGroup'), param('ns3::LteMacSapUser *', 'msu')], 
@@ -6877,7 +6930,7 @@
     cls.add_constructor([])
     ## lte-ccm-rrc-sap.h (module 'lte'): ns3::LteCcmRrcSapUser::LteCcmRrcSapUser(ns3::LteCcmRrcSapUser const & arg0) [constructor]
     cls.add_constructor([param('ns3::LteCcmRrcSapUser const &', 'arg0')])
-    ## lte-ccm-rrc-sap.h (module 'lte'): void ns3::LteCcmRrcSapUser::AddLcs(std::vector<ns3::LteRrcSap::LogicalChannelConfig, std::allocator<ns3::LteRrcSap::LogicalChannelConfig> > lcConfig) [member function]
+    ## lte-ccm-rrc-sap.h (module 'lte'): void ns3::LteCcmRrcSapUser::AddLcs(std::vector<ns3::LteRrcSap::LogicalChannelConfig, std::allocator<ns3::LteRrcSap::LogicalChannelConfig>> lcConfig) [member function]
     cls.add_method('AddLcs', 
                    'void', 
                    [param('std::vector< ns3::LteRrcSap::LogicalChannelConfig >', 'lcConfig')], 
@@ -7272,12 +7325,12 @@
     cls.add_constructor([])
     ## lte-ffr-sap.h (module 'lte'): ns3::LteFfrSapProvider::LteFfrSapProvider(ns3::LteFfrSapProvider const & arg0) [constructor]
     cls.add_constructor([param('ns3::LteFfrSapProvider const &', 'arg0')])
-    ## lte-ffr-sap.h (module 'lte'): std::vector<bool, std::allocator<bool> > ns3::LteFfrSapProvider::GetAvailableDlRbg() [member function]
+    ## lte-ffr-sap.h (module 'lte'): std::vector<bool, std::allocator<bool>> ns3::LteFfrSapProvider::GetAvailableDlRbg() [member function]
     cls.add_method('GetAvailableDlRbg', 
                    'std::vector< bool >', 
                    [], 
                    is_pure_virtual=True, is_virtual=True)
-    ## lte-ffr-sap.h (module 'lte'): std::vector<bool, std::allocator<bool> > ns3::LteFfrSapProvider::GetAvailableUlRbg() [member function]
+    ## lte-ffr-sap.h (module 'lte'): std::vector<bool, std::allocator<bool>> ns3::LteFfrSapProvider::GetAvailableUlRbg() [member function]
     cls.add_method('GetAvailableUlRbg', 
                    'std::vector< bool >', 
                    [], 
@@ -7312,7 +7365,7 @@
                    'void', 
                    [param('ns3::FfMacSchedSapProvider::SchedUlCqiInfoReqParameters const &', 'params')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## lte-ffr-sap.h (module 'lte'): void ns3::LteFfrSapProvider::ReportUlCqiInfo(std::map<unsigned short, std::vector<double, std::allocator<double> >, std::less<unsigned short>, std::allocator<std::pair<const unsigned short, std::vector<double, std::allocator<double> > > > > ulCqiMap) [member function]
+    ## lte-ffr-sap.h (module 'lte'): void ns3::LteFfrSapProvider::ReportUlCqiInfo(std::map<unsigned short, std::vector<double, std::allocator<double>>, std::less<unsigned short>, std::allocator<std::pair<const unsigned short, std::vector<double, std::allocator<double>>>>> ulCqiMap) [member function]
     cls.add_method('ReportUlCqiInfo', 
                    'void', 
                    [param('std::map< unsigned short, std::vector< double > >', 'ulCqiMap')], 
@@ -7378,9 +7431,9 @@
     cls.add_constructor([])
     ## lte-handover-management-sap.h (module 'lte'): ns3::LteHandoverManagementSapUser::LteHandoverManagementSapUser(ns3::LteHandoverManagementSapUser const & arg0) [constructor]
     cls.add_constructor([param('ns3::LteHandoverManagementSapUser const &', 'arg0')])
-    ## lte-handover-management-sap.h (module 'lte'): uint8_t ns3::LteHandoverManagementSapUser::AddUeMeasReportConfigForHandover(ns3::LteRrcSap::ReportConfigEutra reportConfig) [member function]
+    ## lte-handover-management-sap.h (module 'lte'): std::vector<unsigned char, std::allocator<unsigned char>> ns3::LteHandoverManagementSapUser::AddUeMeasReportConfigForHandover(ns3::LteRrcSap::ReportConfigEutra reportConfig) [member function]
     cls.add_method('AddUeMeasReportConfigForHandover', 
-                   'uint8_t', 
+                   'std::vector< unsigned char >', 
                    [param('ns3::LteRrcSap::ReportConfigEutra', 'reportConfig')], 
                    is_pure_virtual=True, is_virtual=True)
     ## lte-handover-management-sap.h (module 'lte'): void ns3::LteHandoverManagementSapUser::TriggerHandover(uint16_t rnti, uint16_t targetCellId) [member function]
@@ -7515,7 +7568,7 @@
                    'double', 
                    [param('ns3::SpectrumValue const &', 'sinr')], 
                    is_static=True)
-    ## lte-mi-error-model.h (module 'lte'): static ns3::TbStats_t ns3::LteMiErrorModel::GetTbDecodificationStats(ns3::SpectrumValue const & sinr, std::vector<int, std::allocator<int> > const & map, uint16_t size, uint8_t mcs, ns3::HarqProcessInfoList_t miHistory) [member function]
+    ## lte-mi-error-model.h (module 'lte'): static ns3::TbStats_t ns3::LteMiErrorModel::GetTbDecodificationStats(ns3::SpectrumValue const & sinr, std::vector<int, std::allocator<int>> const & map, uint16_t size, uint8_t mcs, ns3::HarqProcessInfoList_t miHistory) [member function]
     cls.add_method('GetTbDecodificationStats', 
                    'ns3::TbStats_t', 
                    [param('ns3::SpectrumValue const &', 'sinr'), param('std::vector< int > const &', 'map'), param('uint16_t', 'size'), param('uint8_t', 'mcs'), param('std::vector< ns3::HarqProcessInfoElement_t >', 'miHistory')], 
@@ -7525,7 +7578,7 @@
                    'double', 
                    [param('double', 'mib'), param('uint8_t', 'ecrId'), param('uint16_t', 'cbSize')], 
                    is_static=True)
-    ## lte-mi-error-model.h (module 'lte'): static double ns3::LteMiErrorModel::Mib(ns3::SpectrumValue const & sinr, std::vector<int, std::allocator<int> > const & map, uint8_t mcs) [member function]
+    ## lte-mi-error-model.h (module 'lte'): static double ns3::LteMiErrorModel::Mib(ns3::SpectrumValue const & sinr, std::vector<int, std::allocator<int>> const & map, uint8_t mcs) [member function]
     cls.add_method('Mib', 
                    'double', 
                    [param('ns3::SpectrumValue const &', 'sinr'), param('std::vector< int > const &', 'map'), param('uint8_t', 'mcs')], 
@@ -7948,18 +8001,12 @@
     cls.add_constructor([])
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultBestNeighCell::MeasResultBestNeighCell(ns3::LteRrcSap::MeasResultBestNeighCell const & arg0) [constructor]
     cls.add_constructor([param('ns3::LteRrcSap::MeasResultBestNeighCell const &', 'arg0')])
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultBestNeighCell::haveRsrpResult [variable]
-    cls.add_instance_attribute('haveRsrpResult', 'bool', is_const=False)
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultBestNeighCell::haveRsrqResult [variable]
-    cls.add_instance_attribute('haveRsrqResult', 'bool', is_const=False)
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultBestNeighCell::physCellId [variable]
     cls.add_instance_attribute('physCellId', 'uint16_t', is_const=False)
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultBestNeighCell::rsrpResult [variable]
     cls.add_instance_attribute('rsrpResult', 'uint8_t', is_const=False)
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultBestNeighCell::rsrqResult [variable]
     cls.add_instance_attribute('rsrqResult', 'uint8_t', is_const=False)
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultBestNeighCell::servFreqId [variable]
-    cls.add_instance_attribute('servFreqId', 'uint16_t', is_const=False)
     return
 
 def register_Ns3LteRrcSapMeasResultEutra_methods(root_module, cls):
@@ -7983,36 +8030,43 @@
     cls.add_instance_attribute('rsrqResult', 'uint8_t', is_const=False)
     return
 
-def register_Ns3LteRrcSapMeasResultScell_methods(root_module, cls):
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultScell::MeasResultScell() [constructor]
+def register_Ns3LteRrcSapMeasResultPCell_methods(root_module, cls):
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultPCell::MeasResultPCell() [constructor]
     cls.add_constructor([])
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultScell::MeasResultScell(ns3::LteRrcSap::MeasResultScell const & arg0) [constructor]
-    cls.add_constructor([param('ns3::LteRrcSap::MeasResultScell const &', 'arg0')])
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultScell::haveRsrpResult [variable]
-    cls.add_instance_attribute('haveRsrpResult', 'bool', is_const=False)
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultScell::haveRsrqResult [variable]
-    cls.add_instance_attribute('haveRsrqResult', 'bool', is_const=False)
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultScell::rsrpResult [variable]
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultPCell::MeasResultPCell(ns3::LteRrcSap::MeasResultPCell const & arg0) [constructor]
+    cls.add_constructor([param('ns3::LteRrcSap::MeasResultPCell const &', 'arg0')])
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultPCell::rsrpResult [variable]
     cls.add_instance_attribute('rsrpResult', 'uint8_t', is_const=False)
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultScell::rsrqResult [variable]
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultPCell::rsrqResult [variable]
     cls.add_instance_attribute('rsrqResult', 'uint8_t', is_const=False)
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultScell::servFreqId [variable]
-    cls.add_instance_attribute('servFreqId', 'uint16_t', is_const=False)
     return
 
-def register_Ns3LteRrcSapMeasResultServFreqList_methods(root_module, cls):
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultServFreqList::MeasResultServFreqList() [constructor]
+def register_Ns3LteRrcSapMeasResultSCell_methods(root_module, cls):
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultSCell::MeasResultSCell() [constructor]
     cls.add_constructor([])
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultServFreqList::MeasResultServFreqList(ns3::LteRrcSap::MeasResultServFreqList const & arg0) [constructor]
-    cls.add_constructor([param('ns3::LteRrcSap::MeasResultServFreqList const &', 'arg0')])
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultServFreqList::haveMeasurementResultsNeighCell [variable]
-    cls.add_instance_attribute('haveMeasurementResultsNeighCell', 'bool', is_const=False)
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultServFreqList::haveMeasurementResultsServingSCells [variable]
-    cls.add_instance_attribute('haveMeasurementResultsServingSCells', 'bool', is_const=False)
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultServFreqList::measResultBestNeighCell [variable]
-    cls.add_instance_attribute('measResultBestNeighCell', 'std::list< ns3::LteRrcSap::MeasResultBestNeighCell >', is_const=False)
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultServFreqList::measResultScell [variable]
-    cls.add_instance_attribute('measResultScell', 'std::list< ns3::LteRrcSap::MeasResultScell >', is_const=False)
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultSCell::MeasResultSCell(ns3::LteRrcSap::MeasResultSCell const & arg0) [constructor]
+    cls.add_constructor([param('ns3::LteRrcSap::MeasResultSCell const &', 'arg0')])
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultSCell::rsrpResult [variable]
+    cls.add_instance_attribute('rsrpResult', 'uint8_t', is_const=False)
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultSCell::rsrqResult [variable]
+    cls.add_instance_attribute('rsrqResult', 'uint8_t', is_const=False)
+    return
+
+def register_Ns3LteRrcSapMeasResultServFreq_methods(root_module, cls):
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultServFreq::MeasResultServFreq() [constructor]
+    cls.add_constructor([])
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultServFreq::MeasResultServFreq(ns3::LteRrcSap::MeasResultServFreq const & arg0) [constructor]
+    cls.add_constructor([param('ns3::LteRrcSap::MeasResultServFreq const &', 'arg0')])
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultServFreq::haveMeasResultBestNeighCell [variable]
+    cls.add_instance_attribute('haveMeasResultBestNeighCell', 'bool', is_const=False)
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultServFreq::haveMeasResultSCell [variable]
+    cls.add_instance_attribute('haveMeasResultSCell', 'bool', is_const=False)
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultServFreq::measResultBestNeighCell [variable]
+    cls.add_instance_attribute('measResultBestNeighCell', 'ns3::LteRrcSap::MeasResultBestNeighCell', is_const=False)
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultServFreq::measResultSCell [variable]
+    cls.add_instance_attribute('measResultSCell', 'ns3::LteRrcSap::MeasResultSCell', is_const=False)
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultServFreq::servFreqId [variable]
+    cls.add_instance_attribute('servFreqId', 'uint16_t', is_const=False)
     return
 
 def register_Ns3LteRrcSapMeasResults_methods(root_module, cls):
@@ -8022,18 +8076,16 @@
     cls.add_constructor([param('ns3::LteRrcSap::MeasResults const &', 'arg0')])
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResults::haveMeasResultNeighCells [variable]
     cls.add_instance_attribute('haveMeasResultNeighCells', 'bool', is_const=False)
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResults::haveScellsMeas [variable]
-    cls.add_instance_attribute('haveScellsMeas', 'bool', is_const=False)
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResults::haveMeasResultServFreqList [variable]
+    cls.add_instance_attribute('haveMeasResultServFreqList', 'bool', is_const=False)
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResults::measId [variable]
     cls.add_instance_attribute('measId', 'uint8_t', is_const=False)
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResults::measResultListEutra [variable]
     cls.add_instance_attribute('measResultListEutra', 'std::list< ns3::LteRrcSap::MeasResultEutra >', is_const=False)
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResults::measScellResultList [variable]
-    cls.add_instance_attribute('measScellResultList', 'ns3::LteRrcSap::MeasResultServFreqList', is_const=False)
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResults::rsrpResult [variable]
-    cls.add_instance_attribute('rsrpResult', 'uint8_t', is_const=False)
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResults::rsrqResult [variable]
-    cls.add_instance_attribute('rsrqResult', 'uint8_t', is_const=False)
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResults::measResultPCell [variable]
+    cls.add_instance_attribute('measResultPCell', 'ns3::LteRrcSap::MeasResultPCell', is_const=False)
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResults::measResultServFreqList [variable]
+    cls.add_instance_attribute('measResultServFreqList', 'std::list< ns3::LteRrcSap::MeasResultServFreq >', is_const=False)
     return
 
 def register_Ns3LteRrcSapMeasurementReport_methods(root_module, cls):
@@ -8090,10 +8142,10 @@
     cls.add_constructor([])
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::NonCriticalExtensionConfiguration::NonCriticalExtensionConfiguration(ns3::LteRrcSap::NonCriticalExtensionConfiguration const & arg0) [constructor]
     cls.add_constructor([param('ns3::LteRrcSap::NonCriticalExtensionConfiguration const &', 'arg0')])
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::NonCriticalExtensionConfiguration::sCellToAddModList [variable]
+    cls.add_instance_attribute('sCellToAddModList', 'std::list< ns3::LteRrcSap::SCellToAddMod >', is_const=False)
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::NonCriticalExtensionConfiguration::sCellToReleaseList [variable]
-    cls.add_instance_attribute('sCellToReleaseList', 'std::list< unsigned int >', is_const=False)
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::NonCriticalExtensionConfiguration::sCellsToAddModList [variable]
-    cls.add_instance_attribute('sCellsToAddModList', 'std::list< ns3::LteRrcSap::SCellToAddMod >', is_const=False)
+    cls.add_instance_attribute('sCellToReleaseList', 'std::list< unsigned char >', is_const=False)
     return
 
 def register_Ns3LteRrcSapNonUlConfiguration_methods(root_module, cls):
@@ -8523,8 +8575,8 @@
     cls.add_instance_attribute('haveRadioResourceConfigDedicatedSCell', 'bool', is_const=False)
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::SCellToAddMod::radioResourceConfigCommonSCell [variable]
     cls.add_instance_attribute('radioResourceConfigCommonSCell', 'ns3::LteRrcSap::RadioResourceConfigCommonSCell', is_const=False)
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::SCellToAddMod::radioResourceConfigDedicateSCell [variable]
-    cls.add_instance_attribute('radioResourceConfigDedicateSCell', 'ns3::LteRrcSap::RadioResourceConfigDedicatedSCell', is_const=False)
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::SCellToAddMod::radioResourceConfigDedicatedSCell [variable]
+    cls.add_instance_attribute('radioResourceConfigDedicatedSCell', 'ns3::LteRrcSap::RadioResourceConfigDedicatedSCell', is_const=False)
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::SCellToAddMod::sCellIndex [variable]
     cls.add_instance_attribute('sCellIndex', 'uint32_t', is_const=False)
     return
@@ -8704,17 +8756,17 @@
                    'ns3::Ptr< ns3::SpectrumValue >', 
                    [param('double', 'noiseFigure'), param('ns3::Ptr< ns3::SpectrumModel >', 'spectrumModel')], 
                    is_static=True)
-    ## lte-spectrum-value-helper.h (module 'lte'): static ns3::Ptr<ns3::SpectrumValue> ns3::LteSpectrumValueHelper::CreateTxPowerSpectralDensity(uint32_t earfcn, uint16_t bandwidth, double powerTx, std::vector<int, std::allocator<int> > activeRbs) [member function]
+    ## lte-spectrum-value-helper.h (module 'lte'): static ns3::Ptr<ns3::SpectrumValue> ns3::LteSpectrumValueHelper::CreateTxPowerSpectralDensity(uint32_t earfcn, uint16_t bandwidth, double powerTx, std::vector<int, std::allocator<int>> activeRbs) [member function]
     cls.add_method('CreateTxPowerSpectralDensity', 
                    'ns3::Ptr< ns3::SpectrumValue >', 
                    [param('uint32_t', 'earfcn'), param('uint16_t', 'bandwidth'), param('double', 'powerTx'), param('std::vector< int >', 'activeRbs')], 
                    is_static=True)
-    ## lte-spectrum-value-helper.h (module 'lte'): static ns3::Ptr<ns3::SpectrumValue> ns3::LteSpectrumValueHelper::CreateTxPowerSpectralDensity(uint32_t earfcn, uint16_t bandwidth, double powerTx, std::map<int, double, std::less<int>, std::allocator<std::pair<const int, double> > > powerTxMap, std::vector<int, std::allocator<int> > activeRbs) [member function]
+    ## lte-spectrum-value-helper.h (module 'lte'): static ns3::Ptr<ns3::SpectrumValue> ns3::LteSpectrumValueHelper::CreateTxPowerSpectralDensity(uint32_t earfcn, uint16_t bandwidth, double powerTx, std::map<int, double, std::less<int>, std::allocator<std::pair<const int, double>>> powerTxMap, std::vector<int, std::allocator<int>> activeRbs) [member function]
     cls.add_method('CreateTxPowerSpectralDensity', 
                    'ns3::Ptr< ns3::SpectrumValue >', 
                    [param('uint32_t', 'earfcn'), param('uint16_t', 'bandwidth'), param('double', 'powerTx'), param('std::map< int, double >', 'powerTxMap'), param('std::vector< int >', 'activeRbs')], 
                    is_static=True)
-    ## lte-spectrum-value-helper.h (module 'lte'): static ns3::Ptr<ns3::SpectrumValue> ns3::LteSpectrumValueHelper::CreateUlTxPowerSpectralDensity(uint16_t earfcn, uint16_t bandwidth, double powerTx, std::vector<int, std::allocator<int> > activeRbs) [member function]
+    ## lte-spectrum-value-helper.h (module 'lte'): static ns3::Ptr<ns3::SpectrumValue> ns3::LteSpectrumValueHelper::CreateUlTxPowerSpectralDensity(uint16_t earfcn, uint16_t bandwidth, double powerTx, std::vector<int, std::allocator<int>> activeRbs) [member function]
     cls.add_method('CreateUlTxPowerSpectralDensity', 
                    'ns3::Ptr< ns3::SpectrumValue >', 
                    [param('uint16_t', 'earfcn'), param('uint16_t', 'bandwidth'), param('double', 'powerTx'), param('std::vector< int >', 'activeRbs')], 
@@ -8761,7 +8813,7 @@
     cls.add_constructor([])
     ## lte-ue-ccm-rrc-sap.h (module 'lte'): ns3::LteUeCcmRrcSapProvider::LteUeCcmRrcSapProvider(ns3::LteUeCcmRrcSapProvider const & arg0) [constructor]
     cls.add_constructor([param('ns3::LteUeCcmRrcSapProvider const &', 'arg0')])
-    ## lte-ue-ccm-rrc-sap.h (module 'lte'): std::vector<ns3::LteUeCcmRrcSapProvider::LcsConfig, std::allocator<ns3::LteUeCcmRrcSapProvider::LcsConfig> > ns3::LteUeCcmRrcSapProvider::AddLc(uint8_t lcId, ns3::LteUeCmacSapProvider::LogicalChannelConfig lcConfig, ns3::LteMacSapUser * msu) [member function]
+    ## lte-ue-ccm-rrc-sap.h (module 'lte'): std::vector<ns3::LteUeCcmRrcSapProvider::LcsConfig, std::allocator<ns3::LteUeCcmRrcSapProvider::LcsConfig>> ns3::LteUeCcmRrcSapProvider::AddLc(uint8_t lcId, ns3::LteUeCmacSapProvider::LogicalChannelConfig lcConfig, ns3::LteMacSapUser * msu) [member function]
     cls.add_method('AddLc', 
                    'std::vector< ns3::LteUeCcmRrcSapProvider::LcsConfig >', 
                    [param('uint8_t', 'lcId'), param('ns3::LteUeCmacSapProvider::LogicalChannelConfig', 'lcConfig'), param('ns3::LteMacSapUser *', 'msu')], 
@@ -8776,7 +8828,7 @@
                    'void', 
                    [], 
                    is_pure_virtual=True, is_virtual=True)
-    ## lte-ue-ccm-rrc-sap.h (module 'lte'): std::vector<unsigned short, std::allocator<unsigned short> > ns3::LteUeCcmRrcSapProvider::RemoveLc(uint8_t lcid) [member function]
+    ## lte-ue-ccm-rrc-sap.h (module 'lte'): std::vector<unsigned short, std::allocator<unsigned short>> ns3::LteUeCcmRrcSapProvider::RemoveLc(uint8_t lcid) [member function]
     cls.add_method('RemoveLc', 
                    'std::vector< unsigned short >', 
                    [param('uint8_t', 'lcid')], 
@@ -8806,7 +8858,7 @@
     cls.add_constructor([])
     ## lte-ue-ccm-rrc-sap.h (module 'lte'): ns3::LteUeCcmRrcSapUser::LteUeCcmRrcSapUser(ns3::LteUeCcmRrcSapUser const & arg0) [constructor]
     cls.add_constructor([param('ns3::LteUeCcmRrcSapUser const &', 'arg0')])
-    ## lte-ue-ccm-rrc-sap.h (module 'lte'): void ns3::LteUeCcmRrcSapUser::ComponentCarrierEnabling(std::vector<unsigned char, std::allocator<unsigned char> > componentCarrierList) [member function]
+    ## lte-ue-ccm-rrc-sap.h (module 'lte'): void ns3::LteUeCcmRrcSapUser::ComponentCarrierEnabling(std::vector<unsigned char, std::allocator<unsigned char>> componentCarrierList) [member function]
     cls.add_method('ComponentCarrierEnabling', 
                    'void', 
                    [param('std::vector< unsigned char >', 'componentCarrierList')], 
@@ -8954,6 +9006,16 @@
                    'void', 
                    [param('uint32_t', 'ulEarfcn'), param('uint16_t', 'ulBandwidth')], 
                    is_pure_virtual=True, is_virtual=True)
+    ## lte-ue-cphy-sap.h (module 'lte'): uint16_t ns3::LteUeCphySapProvider::GetCellId() [member function]
+    cls.add_method('GetCellId', 
+                   'uint16_t', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## lte-ue-cphy-sap.h (module 'lte'): uint32_t ns3::LteUeCphySapProvider::GetDlEarfcn() [member function]
+    cls.add_method('GetDlEarfcn', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
     ## lte-ue-cphy-sap.h (module 'lte'): void ns3::LteUeCphySapProvider::Reset() [member function]
     cls.add_method('Reset', 
                    'void', 
@@ -10697,8 +10759,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -11179,14 +11241,14 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('>=')
     cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_unary_numeric_operator('-')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
     cls.add_constructor([])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(double const value) [constructor]
@@ -11205,6 +11267,8 @@
     cls.add_constructor([param('long unsigned int const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int const v) [constructor]
     cls.add_constructor([param('long long unsigned int const', 'v')])
+    ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int128_t const v) [constructor]
+    cls.add_constructor([param('int128_t const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t const hi, uint64_t const lo) [constructor]
     cls.add_constructor([param('int64_t const', 'hi'), param('uint64_t const', 'lo')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [constructor]
@@ -12397,7 +12461,7 @@
     cls.add_method('AddPacket', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet >', 'packet')])
-    ## packet-burst.h (module 'network'): std::list<ns3::Ptr<ns3::Packet>, std::allocator<ns3::Ptr<ns3::Packet> > >::const_iterator ns3::PacketBurst::Begin() const [member function]
+    ## packet-burst.h (module 'network'): std::list<ns3::Ptr<ns3::Packet>, std::allocator<ns3::Ptr<ns3::Packet>>>::const_iterator ns3::PacketBurst::Begin() const [member function]
     cls.add_method('Begin', 
                    'std::list< ns3::Ptr< ns3::Packet > > const_iterator', 
                    [], 
@@ -12407,7 +12471,7 @@
                    'ns3::Ptr< ns3::PacketBurst >', 
                    [], 
                    is_const=True)
-    ## packet-burst.h (module 'network'): std::list<ns3::Ptr<ns3::Packet>, std::allocator<ns3::Ptr<ns3::Packet> > >::const_iterator ns3::PacketBurst::End() const [member function]
+    ## packet-burst.h (module 'network'): std::list<ns3::Ptr<ns3::Packet>, std::allocator<ns3::Ptr<ns3::Packet>>>::const_iterator ns3::PacketBurst::End() const [member function]
     cls.add_method('End', 
                    'std::list< ns3::Ptr< ns3::Packet > > const_iterator', 
                    [], 
@@ -12417,7 +12481,7 @@
                    'uint32_t', 
                    [], 
                    is_const=True)
-    ## packet-burst.h (module 'network'): std::list<ns3::Ptr<ns3::Packet>, std::allocator<ns3::Ptr<ns3::Packet> > > ns3::PacketBurst::GetPackets() const [member function]
+    ## packet-burst.h (module 'network'): std::list<ns3::Ptr<ns3::Packet>, std::allocator<ns3::Ptr<ns3::Packet>>> ns3::PacketBurst::GetPackets() const [member function]
     cls.add_method('GetPackets', 
                    'std::list< ns3::Ptr< ns3::Packet > >', 
                    [], 
@@ -12487,6 +12551,102 @@
                    [param('ns3::Time', 'senderTimestamp')])
     return
 
+def register_Ns3PhasedArrayModel_methods(root_module, cls):
+    ## phased-array-model.h (module 'antenna'): ns3::PhasedArrayModel::PhasedArrayModel(ns3::PhasedArrayModel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::PhasedArrayModel const &', 'arg0')])
+    ## phased-array-model.h (module 'antenna'): ns3::PhasedArrayModel::PhasedArrayModel() [constructor]
+    cls.add_constructor([])
+    ## phased-array-model.h (module 'antenna'): ns3::Ptr<const ns3::AntennaModel> ns3::PhasedArrayModel::GetAntennaElement() const [member function]
+    cls.add_method('GetAntennaElement', 
+                   'ns3::Ptr< ns3::AntennaModel const >', 
+                   [], 
+                   is_const=True)
+    ## phased-array-model.h (module 'antenna'): ns3::PhasedArrayModel::ComplexVector ns3::PhasedArrayModel::GetBeamformingVector() const [member function]
+    cls.add_method('GetBeamformingVector', 
+                   'ns3::PhasedArrayModel::ComplexVector', 
+                   [], 
+                   is_const=True)
+    ## phased-array-model.h (module 'antenna'): ns3::PhasedArrayModel::ComplexVector ns3::PhasedArrayModel::GetBeamformingVector(ns3::Angles a) const [member function]
+    cls.add_method('GetBeamformingVector', 
+                   'ns3::PhasedArrayModel::ComplexVector', 
+                   [param('ns3::Angles', 'a')], 
+                   is_const=True)
+    ## phased-array-model.h (module 'antenna'): std::pair<double, double> ns3::PhasedArrayModel::GetElementFieldPattern(ns3::Angles a) const [member function]
+    cls.add_method('GetElementFieldPattern', 
+                   'std::pair< double, double >', 
+                   [param('ns3::Angles', 'a')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## phased-array-model.h (module 'antenna'): ns3::Vector ns3::PhasedArrayModel::GetElementLocation(uint64_t index) const [member function]
+    cls.add_method('GetElementLocation', 
+                   'ns3::Vector', 
+                   [param('uint64_t', 'index')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## phased-array-model.h (module 'antenna'): uint32_t ns3::PhasedArrayModel::GetId() const [member function]
+    cls.add_method('GetId', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## phased-array-model.h (module 'antenna'): uint64_t ns3::PhasedArrayModel::GetNumberOfElements() const [member function]
+    cls.add_method('GetNumberOfElements', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## phased-array-model.h (module 'antenna'): ns3::PhasedArrayModel::ComplexVector ns3::PhasedArrayModel::GetSteeringVector(ns3::Angles a) const [member function]
+    cls.add_method('GetSteeringVector', 
+                   'ns3::PhasedArrayModel::ComplexVector', 
+                   [param('ns3::Angles', 'a')], 
+                   is_const=True)
+    ## phased-array-model.h (module 'antenna'): static ns3::TypeId ns3::PhasedArrayModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## phased-array-model.h (module 'antenna'): void ns3::PhasedArrayModel::SetAntennaElement(ns3::Ptr<ns3::AntennaModel> antennaElement) [member function]
+    cls.add_method('SetAntennaElement', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::AntennaModel >', 'antennaElement')])
+    ## phased-array-model.h (module 'antenna'): void ns3::PhasedArrayModel::SetBeamformingVector(ns3::PhasedArrayModel::ComplexVector const & beamformingVector) [member function]
+    cls.add_method('SetBeamformingVector', 
+                   'void', 
+                   [param('ns3::PhasedArrayModel::ComplexVector const &', 'beamformingVector')])
+    ## phased-array-model.h (module 'antenna'): static double ns3::PhasedArrayModel::ComputeNorm(ns3::PhasedArrayModel::ComplexVector const & vector) [member function]
+    cls.add_method('ComputeNorm', 
+                   'double', 
+                   [param('ns3::PhasedArrayModel::ComplexVector const &', 'vector')], 
+                   is_static=True, visibility='protected')
+    return
+
+def register_Ns3PhasedArraySpectrumPropagationLossModel_methods(root_module, cls):
+    ## phased-array-spectrum-propagation-loss-model.h (module 'spectrum'): ns3::PhasedArraySpectrumPropagationLossModel::PhasedArraySpectrumPropagationLossModel(ns3::PhasedArraySpectrumPropagationLossModel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::PhasedArraySpectrumPropagationLossModel const &', 'arg0')])
+    ## phased-array-spectrum-propagation-loss-model.h (module 'spectrum'): ns3::PhasedArraySpectrumPropagationLossModel::PhasedArraySpectrumPropagationLossModel() [constructor]
+    cls.add_constructor([])
+    ## phased-array-spectrum-propagation-loss-model.h (module 'spectrum'): ns3::Ptr<ns3::SpectrumValue> ns3::PhasedArraySpectrumPropagationLossModel::CalcRxPowerSpectralDensity(ns3::Ptr<const ns3::SpectrumValue> txPsd, ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b, ns3::Ptr<const ns3::PhasedArrayModel> aPhasedArrayModel, ns3::Ptr<const ns3::PhasedArrayModel> bPhasedArrayModel) const [member function]
+    cls.add_method('CalcRxPowerSpectralDensity', 
+                   'ns3::Ptr< ns3::SpectrumValue >', 
+                   [param('ns3::Ptr< ns3::SpectrumValue const >', 'txPsd'), param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b'), param('ns3::Ptr< ns3::PhasedArrayModel const >', 'aPhasedArrayModel'), param('ns3::Ptr< ns3::PhasedArrayModel const >', 'bPhasedArrayModel')], 
+                   is_const=True)
+    ## phased-array-spectrum-propagation-loss-model.h (module 'spectrum'): static ns3::TypeId ns3::PhasedArraySpectrumPropagationLossModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## phased-array-spectrum-propagation-loss-model.h (module 'spectrum'): void ns3::PhasedArraySpectrumPropagationLossModel::SetNext(ns3::Ptr<ns3::PhasedArraySpectrumPropagationLossModel> next) [member function]
+    cls.add_method('SetNext', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::PhasedArraySpectrumPropagationLossModel >', 'next')])
+    ## phased-array-spectrum-propagation-loss-model.h (module 'spectrum'): void ns3::PhasedArraySpectrumPropagationLossModel::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## phased-array-spectrum-propagation-loss-model.h (module 'spectrum'): ns3::Ptr<ns3::SpectrumValue> ns3::PhasedArraySpectrumPropagationLossModel::DoCalcRxPowerSpectralDensity(ns3::Ptr<const ns3::SpectrumValue> txPsd, ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b, ns3::Ptr<const ns3::PhasedArrayModel> aPhasedArrayModel, ns3::Ptr<const ns3::PhasedArrayModel> bPhasedArrayModel) const [member function]
+    cls.add_method('DoCalcRxPowerSpectralDensity', 
+                   'ns3::Ptr< ns3::SpectrumValue >', 
+                   [param('ns3::Ptr< ns3::SpectrumValue const >', 'txPsd'), param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b'), param('ns3::Ptr< ns3::PhasedArrayModel const >', 'aPhasedArrayModel'), param('ns3::Ptr< ns3::PhasedArrayModel const >', 'bPhasedArrayModel')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
+    return
+
 def register_Ns3PropagationDelayModel_methods(root_module, cls):
     ## propagation-delay-model.h (module 'propagation'): ns3::PropagationDelayModel::PropagationDelayModel() [constructor]
     cls.add_constructor([])
@@ -12510,7 +12670,7 @@
     cls.add_method('DoAssignStreams', 
                    'int64_t', 
                    [param('int64_t', 'stream')], 
-                   is_pure_virtual=True, is_virtual=True, visibility='private')
+                   is_pure_virtual=True, is_virtual=True, visibility='protected')
     return
 
 def register_Ns3PropagationLossModel_methods(root_module, cls):
@@ -12538,16 +12698,16 @@
     cls.add_method('AssignStreams', 
                    'int64_t', 
                    [param('int64_t', 'stream')])
+    ## propagation-loss-model.h (module 'propagation'): int64_t ns3::PropagationLossModel::DoAssignStreams(int64_t stream) [member function]
+    cls.add_method('DoAssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')], 
+                   is_pure_virtual=True, is_virtual=True, visibility='protected')
     ## propagation-loss-model.h (module 'propagation'): double ns3::PropagationLossModel::DoCalcRxPower(double txPowerDbm, ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
     cls.add_method('DoCalcRxPower', 
                    'double', 
                    [param('double', 'txPowerDbm'), param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
                    is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
-    ## propagation-loss-model.h (module 'propagation'): int64_t ns3::PropagationLossModel::DoAssignStreams(int64_t stream) [member function]
-    cls.add_method('DoAssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'stream')], 
-                   is_pure_virtual=True, is_virtual=True, visibility='private')
     return
 
 def register_Ns3RadioEnvironmentMapHelper_methods(root_module, cls):
@@ -12772,156 +12932,156 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EpcTft_Ns3Empty_Ns3DefaultDeleter__lt__ns3EpcTft__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EpcTft, ns3::empty, ns3::DefaultDeleter<ns3::EpcTft> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EpcTft, ns3::empty, ns3::DefaultDeleter<ns3::EpcTft>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EpcTft, ns3::empty, ns3::DefaultDeleter<ns3::EpcTft> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EpcTft, ns3::empty, ns3::DefaultDeleter<ns3::EpcTft> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EpcTft, ns3::empty, ns3::DefaultDeleter<ns3::EpcTft>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EpcTft, ns3::empty, ns3::DefaultDeleter<ns3::EpcTft>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EpcTft, ns3::empty, ns3::DefaultDeleter< ns3::EpcTft > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EpcTftClassifier_Ns3Empty_Ns3DefaultDeleter__lt__ns3EpcTftClassifier__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EpcTftClassifier, ns3::empty, ns3::DefaultDeleter<ns3::EpcTftClassifier> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EpcTftClassifier, ns3::empty, ns3::DefaultDeleter<ns3::EpcTftClassifier>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EpcTftClassifier, ns3::empty, ns3::DefaultDeleter<ns3::EpcTftClassifier> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EpcTftClassifier, ns3::empty, ns3::DefaultDeleter<ns3::EpcTftClassifier> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EpcTftClassifier, ns3::empty, ns3::DefaultDeleter<ns3::EpcTftClassifier>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EpcTftClassifier, ns3::empty, ns3::DefaultDeleter<ns3::EpcTftClassifier>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EpcTftClassifier, ns3::empty, ns3::DefaultDeleter< ns3::EpcTftClassifier > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Ipv4MulticastRoute_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv4MulticastRoute__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter< ns3::Ipv4MulticastRoute > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Ipv4Route_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv4Route__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter< ns3::Ipv4Route > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3LteChunkProcessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3LteChunkProcessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LteChunkProcessor, ns3::empty, ns3::DefaultDeleter<ns3::LteChunkProcessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LteChunkProcessor, ns3::empty, ns3::DefaultDeleter<ns3::LteChunkProcessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LteChunkProcessor, ns3::empty, ns3::DefaultDeleter<ns3::LteChunkProcessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::LteChunkProcessor, ns3::empty, ns3::DefaultDeleter<ns3::LteChunkProcessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LteChunkProcessor, ns3::empty, ns3::DefaultDeleter<ns3::LteChunkProcessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::LteChunkProcessor, ns3::empty, ns3::DefaultDeleter<ns3::LteChunkProcessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::LteChunkProcessor, ns3::empty, ns3::DefaultDeleter< ns3::LteChunkProcessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3LteControlMessage_Ns3Empty_Ns3DefaultDeleter__lt__ns3LteControlMessage__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LteControlMessage, ns3::empty, ns3::DefaultDeleter<ns3::LteControlMessage> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LteControlMessage, ns3::empty, ns3::DefaultDeleter<ns3::LteControlMessage>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LteControlMessage, ns3::empty, ns3::DefaultDeleter<ns3::LteControlMessage> >::SimpleRefCount(ns3::SimpleRefCount<ns3::LteControlMessage, ns3::empty, ns3::DefaultDeleter<ns3::LteControlMessage> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LteControlMessage, ns3::empty, ns3::DefaultDeleter<ns3::LteControlMessage>>::SimpleRefCount(ns3::SimpleRefCount<ns3::LteControlMessage, ns3::empty, ns3::DefaultDeleter<ns3::LteControlMessage>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::LteControlMessage, ns3::empty, ns3::DefaultDeleter< ns3::LteControlMessage > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3LteHarqPhy_Ns3Empty_Ns3DefaultDeleter__lt__ns3LteHarqPhy__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LteHarqPhy, ns3::empty, ns3::DefaultDeleter<ns3::LteHarqPhy> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LteHarqPhy, ns3::empty, ns3::DefaultDeleter<ns3::LteHarqPhy>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LteHarqPhy, ns3::empty, ns3::DefaultDeleter<ns3::LteHarqPhy> >::SimpleRefCount(ns3::SimpleRefCount<ns3::LteHarqPhy, ns3::empty, ns3::DefaultDeleter<ns3::LteHarqPhy> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LteHarqPhy, ns3::empty, ns3::DefaultDeleter<ns3::LteHarqPhy>>::SimpleRefCount(ns3::SimpleRefCount<ns3::LteHarqPhy, ns3::empty, ns3::DefaultDeleter<ns3::LteHarqPhy>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::LteHarqPhy, ns3::empty, ns3::DefaultDeleter< ns3::LteHarqPhy > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3SpectrumModel_Ns3Empty_Ns3DefaultDeleter__lt__ns3SpectrumModel__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel> >::SimpleRefCount(ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel>>::SimpleRefCount(ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter< ns3::SpectrumModel > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3SpectrumSignalParameters_Ns3Empty_Ns3DefaultDeleter__lt__ns3SpectrumSignalParameters__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters> >::SimpleRefCount(ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters>>::SimpleRefCount(ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter< ns3::SpectrumSignalParameters > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3SpectrumValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3SpectrumValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter< ns3::SpectrumValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3VendorSpecificValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3VendorSpecificValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::VendorSpecificValue, ns3::empty, ns3::DefaultDeleter<ns3::VendorSpecificValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::VendorSpecificValue, ns3::empty, ns3::DefaultDeleter<ns3::VendorSpecificValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::VendorSpecificValue, ns3::empty, ns3::DefaultDeleter<ns3::VendorSpecificValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::VendorSpecificValue, ns3::empty, ns3::DefaultDeleter<ns3::VendorSpecificValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::VendorSpecificValue, ns3::empty, ns3::DefaultDeleter<ns3::VendorSpecificValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::VendorSpecificValue, ns3::empty, ns3::DefaultDeleter<ns3::VendorSpecificValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::VendorSpecificValue, ns3::empty, ns3::DefaultDeleter< ns3::VendorSpecificValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3X2CellInfo_Ns3Empty_Ns3DefaultDeleter__lt__ns3X2CellInfo__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::X2CellInfo, ns3::empty, ns3::DefaultDeleter<ns3::X2CellInfo> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::X2CellInfo, ns3::empty, ns3::DefaultDeleter<ns3::X2CellInfo>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::X2CellInfo, ns3::empty, ns3::DefaultDeleter<ns3::X2CellInfo> >::SimpleRefCount(ns3::SimpleRefCount<ns3::X2CellInfo, ns3::empty, ns3::DefaultDeleter<ns3::X2CellInfo> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::X2CellInfo, ns3::empty, ns3::DefaultDeleter<ns3::X2CellInfo>>::SimpleRefCount(ns3::SimpleRefCount<ns3::X2CellInfo, ns3::empty, ns3::DefaultDeleter<ns3::X2CellInfo>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::X2CellInfo, ns3::empty, ns3::DefaultDeleter< ns3::X2CellInfo > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3X2IfaceInfo_Ns3Empty_Ns3DefaultDeleter__lt__ns3X2IfaceInfo__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::X2IfaceInfo, ns3::empty, ns3::DefaultDeleter<ns3::X2IfaceInfo> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::X2IfaceInfo, ns3::empty, ns3::DefaultDeleter<ns3::X2IfaceInfo>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::X2IfaceInfo, ns3::empty, ns3::DefaultDeleter<ns3::X2IfaceInfo> >::SimpleRefCount(ns3::SimpleRefCount<ns3::X2IfaceInfo, ns3::empty, ns3::DefaultDeleter<ns3::X2IfaceInfo> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::X2IfaceInfo, ns3::empty, ns3::DefaultDeleter<ns3::X2IfaceInfo>>::SimpleRefCount(ns3::SimpleRefCount<ns3::X2IfaceInfo, ns3::empty, ns3::DefaultDeleter<ns3::X2IfaceInfo>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::X2IfaceInfo, ns3::empty, ns3::DefaultDeleter< ns3::X2IfaceInfo > > const &', 'o')])
     return
 
@@ -13044,7 +13204,7 @@
                    'uint8_t', 
                    [param('uint8_t', 'ipTos')], 
                    is_static=True)
-    ## socket.h (module 'network'): void ns3::Socket::Ipv6JoinGroup(ns3::Ipv6Address address, ns3::Socket::Ipv6MulticastFilterMode filterMode, std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address> > sourceAddresses) [member function]
+    ## socket.h (module 'network'): void ns3::Socket::Ipv6JoinGroup(ns3::Ipv6Address address, ns3::Socket::Ipv6MulticastFilterMode filterMode, std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address>> sourceAddresses) [member function]
     cls.add_method('Ipv6JoinGroup', 
                    'void', 
                    [param('ns3::Ipv6Address', 'address'), param('ns3::Socket::Ipv6MulticastFilterMode', 'filterMode'), param('std::vector< ns3::Ipv6Address >', 'sourceAddresses')], 
@@ -13610,16 +13770,16 @@
     cls.add_binary_comparison_operator('==')
     ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(ns3::SpectrumModel const & arg0) [constructor]
     cls.add_constructor([param('ns3::SpectrumModel const &', 'arg0')])
-    ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(std::vector<double, std::allocator<double> > const & centerFreqs) [constructor]
+    ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(std::vector<double, std::allocator<double>> const & centerFreqs) [constructor]
     cls.add_constructor([param('std::vector< double > const &', 'centerFreqs')])
     ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(ns3::Bands const & bands) [constructor]
     cls.add_constructor([param('ns3::Bands const &', 'bands')])
-    ## spectrum-model.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo> >::const_iterator ns3::SpectrumModel::Begin() const [member function]
+    ## spectrum-model.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo>>::const_iterator ns3::SpectrumModel::Begin() const [member function]
     cls.add_method('Begin', 
                    'std::vector< ns3::BandInfo > const_iterator', 
                    [], 
                    is_const=True)
-    ## spectrum-model.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo> >::const_iterator ns3::SpectrumModel::End() const [member function]
+    ## spectrum-model.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo>>::const_iterator ns3::SpectrumModel::End() const [member function]
     cls.add_method('End', 
                    'std::vector< ns3::BandInfo > const_iterator', 
                    [], 
@@ -13679,9 +13839,9 @@
                    'ns3::Ptr< ns3::SpectrumModel const >', 
                    [], 
                    is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::AntennaModel> ns3::SpectrumPhy::GetRxAntenna() const [member function]
-    cls.add_method('GetRxAntenna', 
-                   'ns3::Ptr< ns3::AntennaModel >', 
+    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::Object> ns3::SpectrumPhy::GetAntenna() const [member function]
+    cls.add_method('GetAntenna', 
+                   'ns3::Ptr< ns3::Object >', 
                    [], 
                    is_const=True, is_pure_virtual=True, is_virtual=True)
     ## spectrum-phy.h (module 'spectrum'): void ns3::SpectrumPhy::StartRx(ns3::Ptr<ns3::SpectrumSignalParameters> params) [member function]
@@ -13732,14 +13892,14 @@
                    'ns3::Ptr< ns3::SpectrumSignalParameters >', 
                    [], 
                    is_virtual=True)
-    ## spectrum-signal-parameters.h (module 'spectrum'): ns3::SpectrumSignalParameters::psd [variable]
-    cls.add_instance_attribute('psd', 'ns3::Ptr< ns3::SpectrumValue >', is_const=False)
     ## spectrum-signal-parameters.h (module 'spectrum'): ns3::SpectrumSignalParameters::duration [variable]
     cls.add_instance_attribute('duration', 'ns3::Time', is_const=False)
-    ## spectrum-signal-parameters.h (module 'spectrum'): ns3::SpectrumSignalParameters::txPhy [variable]
-    cls.add_instance_attribute('txPhy', 'ns3::Ptr< ns3::SpectrumPhy >', is_const=False)
+    ## spectrum-signal-parameters.h (module 'spectrum'): ns3::SpectrumSignalParameters::psd [variable]
+    cls.add_instance_attribute('psd', 'ns3::Ptr< ns3::SpectrumValue >', is_const=False)
     ## spectrum-signal-parameters.h (module 'spectrum'): ns3::SpectrumSignalParameters::txAntenna [variable]
     cls.add_instance_attribute('txAntenna', 'ns3::Ptr< ns3::AntennaModel >', is_const=False)
+    ## spectrum-signal-parameters.h (module 'spectrum'): ns3::SpectrumSignalParameters::txPhy [variable]
+    cls.add_instance_attribute('txPhy', 'ns3::Ptr< ns3::SpectrumPhy >', is_const=False)
     return
 
 def register_Ns3SpectrumValue_methods(root_module, cls):
@@ -13767,22 +13927,22 @@
     cls.add_constructor([param('ns3::Ptr< ns3::SpectrumModel const >', 'sm')])
     ## spectrum-value.h (module 'spectrum'): ns3::SpectrumValue::SpectrumValue() [constructor]
     cls.add_constructor([])
-    ## spectrum-value.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo> >::const_iterator ns3::SpectrumValue::ConstBandsBegin() const [member function]
+    ## spectrum-value.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo>>::const_iterator ns3::SpectrumValue::ConstBandsBegin() const [member function]
     cls.add_method('ConstBandsBegin', 
                    'std::vector< ns3::BandInfo > const_iterator', 
                    [], 
                    is_const=True)
-    ## spectrum-value.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo> >::const_iterator ns3::SpectrumValue::ConstBandsEnd() const [member function]
+    ## spectrum-value.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo>>::const_iterator ns3::SpectrumValue::ConstBandsEnd() const [member function]
     cls.add_method('ConstBandsEnd', 
                    'std::vector< ns3::BandInfo > const_iterator', 
                    [], 
                    is_const=True)
-    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double> >::const_iterator ns3::SpectrumValue::ConstValuesBegin() const [member function]
+    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double>>::const_iterator ns3::SpectrumValue::ConstValuesBegin() const [member function]
     cls.add_method('ConstValuesBegin', 
                    'std::vector< double > const_iterator', 
                    [], 
                    is_const=True)
-    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double> >::const_iterator ns3::SpectrumValue::ConstValuesEnd() const [member function]
+    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double>>::const_iterator ns3::SpectrumValue::ConstValuesEnd() const [member function]
     cls.add_method('ConstValuesEnd', 
                    'std::vector< double > const_iterator', 
                    [], 
@@ -13812,11 +13972,11 @@
                    'double const &', 
                    [param('uint32_t', 'pos')], 
                    is_const=True)
-    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double> >::iterator ns3::SpectrumValue::ValuesBegin() [member function]
+    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double>>::iterator ns3::SpectrumValue::ValuesBegin() [member function]
     cls.add_method('ValuesBegin', 
                    'std::vector< double > iterator', 
                    [])
-    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double> >::iterator ns3::SpectrumValue::ValuesEnd() [member function]
+    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double>>::iterator ns3::SpectrumValue::ValuesEnd() [member function]
     cls.add_method('ValuesEnd', 
                    'std::vector< double > iterator', 
                    [])
@@ -14029,7 +14189,7 @@
                    'uint8_t', 
                    [], 
                    is_const=True)
-    ## lte-enb-rrc.h (module 'lte'): std::vector<ns3::EpcX2Sap::ErabToBeSetupItem, std::allocator<ns3::EpcX2Sap::ErabToBeSetupItem> > ns3::UeManager::GetErabList() [member function]
+    ## lte-enb-rrc.h (module 'lte'): std::vector<ns3::EpcX2Sap::ErabToBeSetupItem, std::allocator<ns3::EpcX2Sap::ErabToBeSetupItem>> ns3::UeManager::GetErabList() [member function]
     cls.add_method('GetErabList', 
                    'std::vector< ns3::EpcX2Sap::ErabToBeSetupItem >', 
                    [])
@@ -14047,10 +14207,10 @@
                    'uint16_t', 
                    [], 
                    is_const=True)
-    ## lte-enb-rrc.h (module 'lte'): ns3::LteRrcSap::RrcConnectionReconfiguration ns3::UeManager::GetRrcConnectionReconfigurationForHandover() [member function]
+    ## lte-enb-rrc.h (module 'lte'): ns3::LteRrcSap::RrcConnectionReconfiguration ns3::UeManager::GetRrcConnectionReconfigurationForHandover(uint8_t componentCarrierId) [member function]
     cls.add_method('GetRrcConnectionReconfigurationForHandover', 
                    'ns3::LteRrcSap::RrcConnectionReconfiguration', 
-                   [])
+                   [param('uint8_t', 'componentCarrierId')])
     ## lte-enb-rrc.h (module 'lte'): uint16_t ns3::UeManager::GetSrsConfigurationIndex() const [member function]
     cls.add_method('GetSrsConfigurationIndex', 
                    'uint16_t', 
@@ -14265,12 +14425,12 @@
 def register_Ns3X2CellInfo_methods(root_module, cls):
     ## epc-x2.h (module 'lte'): ns3::X2CellInfo::X2CellInfo(ns3::X2CellInfo const & arg0) [constructor]
     cls.add_constructor([param('ns3::X2CellInfo const &', 'arg0')])
-    ## epc-x2.h (module 'lte'): ns3::X2CellInfo::X2CellInfo(uint16_t localCellId, uint16_t remoteCellId) [constructor]
-    cls.add_constructor([param('uint16_t', 'localCellId'), param('uint16_t', 'remoteCellId')])
-    ## epc-x2.h (module 'lte'): ns3::X2CellInfo::m_localCellId [variable]
-    cls.add_instance_attribute('m_localCellId', 'uint16_t', is_const=False)
-    ## epc-x2.h (module 'lte'): ns3::X2CellInfo::m_remoteCellId [variable]
-    cls.add_instance_attribute('m_remoteCellId', 'uint16_t', is_const=False)
+    ## epc-x2.h (module 'lte'): ns3::X2CellInfo::X2CellInfo(std::vector<unsigned short, std::allocator<unsigned short>> localCellIds, std::vector<unsigned short, std::allocator<unsigned short>> remoteCellIds) [constructor]
+    cls.add_constructor([param('std::vector< unsigned short >', 'localCellIds'), param('std::vector< unsigned short >', 'remoteCellIds')])
+    ## epc-x2.h (module 'lte'): ns3::X2CellInfo::m_localCellIds [variable]
+    cls.add_instance_attribute('m_localCellIds', 'std::vector< unsigned short >', is_const=False)
+    ## epc-x2.h (module 'lte'): ns3::X2CellInfo::m_remoteCellIds [variable]
+    cls.add_instance_attribute('m_remoteCellIds', 'std::vector< unsigned short >', is_const=False)
     return
 
 def register_Ns3X2IfaceInfo_methods(root_module, cls):
@@ -14357,6 +14517,23 @@
                    is_virtual=True)
     return
 
+def register_Ns3AntennaModel_methods(root_module, cls):
+    ## antenna-model.h (module 'antenna'): ns3::AntennaModel::AntennaModel(ns3::AntennaModel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::AntennaModel const &', 'arg0')])
+    ## antenna-model.h (module 'antenna'): ns3::AntennaModel::AntennaModel() [constructor]
+    cls.add_constructor([])
+    ## antenna-model.h (module 'antenna'): double ns3::AntennaModel::GetGainDb(ns3::Angles a) [member function]
+    cls.add_method('GetGainDb', 
+                   'double', 
+                   [param('ns3::Angles', 'a')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## antenna-model.h (module 'antenna'): static ns3::TypeId ns3::AntennaModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    return
+
 def register_Ns3Application_methods(root_module, cls):
     ## application.h (module 'network'): ns3::Application::Application(ns3::Application const & arg0) [constructor]
     cls.add_constructor([param('ns3::Application const &', 'arg0')])
@@ -14886,97 +15063,102 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::NetDevice> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::Socket> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::Packet const> '], visibility='protected')
+                   is_static=True, template_parameters=['bool'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['unsigned short'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Address const&'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Address const&'], visibility='protected')
+                   is_static=True, template_parameters=['unsigned int'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::NetDevice::PacketType'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::NetDevice> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::MobilityModel const> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::Packet const> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::SpectrumPhy const> '], visibility='protected')
+                   is_static=True, template_parameters=['unsigned short'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['double'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::NetDevice::PacketType'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::SpectrumSignalParameters> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::DlSchedulingCallbackInfo'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::PacketBurst const> '], visibility='protected')
+                   is_static=True, template_parameters=['unsigned char'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::PhyReceptionStatParameters'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::MobilityModel const> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['unsigned char'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::SpectrumPhy const> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::SpectrumValue> '], visibility='protected')
+                   is_static=True, template_parameters=['double'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::PhyTransmissionStatParameters'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::SpectrumSignalParameters> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::LteUePhy::State'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::PacketBurst const> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['bool'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::PhyReceptionStatParameters'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['std::vector<int', ' std::allocator<int> > const&'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::SpectrumValue> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::Socket> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::PhyTransmissionStatParameters'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['unsigned int'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::LteUePhy::State'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['std::vector<int', ' std::allocator<int> > const&'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
@@ -15016,11 +15198,6 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::DlSchedulingCallbackInfo'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
                    is_static=True, template_parameters=['ns3::LteUeRrc::State'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
@@ -15076,7 +15253,7 @@
                    'void', 
                    [], 
                    is_virtual=True)
-    ## cc-helper.h (module 'lte'): std::map<unsigned char, ns3::ComponentCarrier, std::less<unsigned char>, std::allocator<std::pair<const unsigned char, ns3::ComponentCarrier> > > ns3::CcHelper::EquallySpacedCcs() [member function]
+    ## cc-helper.h (module 'lte'): std::map<unsigned char, ns3::ComponentCarrier, std::less<unsigned char>, std::allocator<std::pair<const unsigned char, ns3::ComponentCarrier>>> ns3::CcHelper::EquallySpacedCcs() [member function]
     cls.add_method('EquallySpacedCcs', 
                    'std::map< unsigned char, ns3::ComponentCarrier >', 
                    [])
@@ -15826,10 +16003,10 @@
     cls.add_constructor([param('ns3::EpcEnbApplication const &', 'arg0')])
     ## epc-enb-application.h (module 'lte'): ns3::EpcEnbApplication::EpcEnbApplication(ns3::Ptr<ns3::Socket> lteSocket, ns3::Ptr<ns3::Socket> lteSocket6, uint16_t cellId) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::Socket >', 'lteSocket'), param('ns3::Ptr< ns3::Socket >', 'lteSocket6'), param('uint16_t', 'cellId')])
-    ## epc-enb-application.h (module 'lte'): void ns3::EpcEnbApplication::AddS1Interface(ns3::Ptr<ns3::Socket> s1uSocket, ns3::Ipv4Address enbAddress, ns3::Ipv4Address sgwAddress) [member function]
+    ## epc-enb-application.h (module 'lte'): void ns3::EpcEnbApplication::AddS1Interface(ns3::Ptr<ns3::Socket> s1uSocket, ns3::Ipv4Address enbS1uAddress, ns3::Ipv4Address sgwS1uAddress) [member function]
     cls.add_method('AddS1Interface', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Socket >', 's1uSocket'), param('ns3::Ipv4Address', 'enbAddress'), param('ns3::Ipv4Address', 'sgwAddress')])
+                   [param('ns3::Ptr< ns3::Socket >', 's1uSocket'), param('ns3::Ipv4Address', 'enbS1uAddress'), param('ns3::Ipv4Address', 'sgwS1uAddress')])
     ## epc-enb-application.h (module 'lte'): ns3::EpcEnbS1SapProvider * ns3::EpcEnbApplication::GetS1SapProvider() [member function]
     cls.add_method('GetS1SapProvider', 
                    'ns3::EpcEnbS1SapProvider *', 
@@ -15891,15 +16068,15 @@
                    'uint8_t', 
                    [param('ns3::Ptr< ns3::NetDevice >', 'ueLteDevice'), param('uint64_t', 'imsi'), param('ns3::Ptr< ns3::EpcTft >', 'tft'), param('ns3::EpsBearer', 'bearer')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## epc-helper.h (module 'lte'): void ns3::EpcHelper::AddEnb(ns3::Ptr<ns3::Node> enbNode, ns3::Ptr<ns3::NetDevice> lteEnbNetDevice, uint16_t cellId) [member function]
+    ## epc-helper.h (module 'lte'): void ns3::EpcHelper::AddEnb(ns3::Ptr<ns3::Node> enbNode, ns3::Ptr<ns3::NetDevice> lteEnbNetDevice, std::vector<unsigned short, std::allocator<unsigned short>> cellIds) [member function]
     cls.add_method('AddEnb', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Node >', 'enbNode'), param('ns3::Ptr< ns3::NetDevice >', 'lteEnbNetDevice'), param('uint16_t', 'cellId')], 
+                   [param('ns3::Ptr< ns3::Node >', 'enbNode'), param('ns3::Ptr< ns3::NetDevice >', 'lteEnbNetDevice'), param('std::vector< unsigned short >', 'cellIds')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## epc-helper.h (module 'lte'): void ns3::EpcHelper::AddS1Interface(ns3::Ptr<ns3::Node> enb, ns3::Ipv4Address enbAddress, ns3::Ipv4Address sgwAddress, uint16_t cellId=0) [member function]
+    ## epc-helper.h (module 'lte'): void ns3::EpcHelper::AddS1Interface(ns3::Ptr<ns3::Node> enb, ns3::Ipv4Address enbAddress, ns3::Ipv4Address sgwAddress, std::vector<unsigned short, std::allocator<unsigned short>> cellIds) [member function]
     cls.add_method('AddS1Interface', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Node >', 'enb'), param('ns3::Ipv4Address', 'enbAddress'), param('ns3::Ipv4Address', 'sgwAddress'), param('uint16_t', 'cellId', default_value='0')], 
+                   [param('ns3::Ptr< ns3::Node >', 'enb'), param('ns3::Ipv4Address', 'enbAddress'), param('ns3::Ipv4Address', 'sgwAddress'), param('std::vector< unsigned short >', 'cellIds')], 
                    is_pure_virtual=True, is_virtual=True)
     ## epc-helper.h (module 'lte'): void ns3::EpcHelper::AddUe(ns3::Ptr<ns3::NetDevice> ueLteDevice, uint64_t imsi) [member function]
     cls.add_method('AddUe', 
@@ -16086,7 +16263,7 @@
                    'ns3::Ptr< ns3::EpcTft >', 
                    [], 
                    is_static=True)
-    ## epc-tft.h (module 'lte'): std::list<ns3::EpcTft::PacketFilter, std::allocator<ns3::EpcTft::PacketFilter> > ns3::EpcTft::GetPacketFilters() const [member function]
+    ## epc-tft.h (module 'lte'): std::list<ns3::EpcTft::PacketFilter, std::allocator<ns3::EpcTft::PacketFilter>> ns3::EpcTft::GetPacketFilters() const [member function]
     cls.add_method('GetPacketFilters', 
                    'std::list< ns3::EpcTft::PacketFilter >', 
                    [], 
@@ -16247,10 +16424,10 @@
     cls.add_constructor([param('ns3::EpcX2 const &', 'arg0')])
     ## epc-x2.h (module 'lte'): ns3::EpcX2::EpcX2() [constructor]
     cls.add_constructor([])
-    ## epc-x2.h (module 'lte'): void ns3::EpcX2::AddX2Interface(uint16_t enb1CellId, ns3::Ipv4Address enb1X2Address, uint16_t enb2CellId, ns3::Ipv4Address enb2X2Address) [member function]
+    ## epc-x2.h (module 'lte'): void ns3::EpcX2::AddX2Interface(uint16_t enb1CellId, ns3::Ipv4Address enb1X2Address, std::vector<unsigned short, std::allocator<unsigned short>> enb2CellIds, ns3::Ipv4Address enb2X2Address) [member function]
     cls.add_method('AddX2Interface', 
                    'void', 
-                   [param('uint16_t', 'enb1CellId'), param('ns3::Ipv4Address', 'enb1X2Address'), param('uint16_t', 'enb2CellId'), param('ns3::Ipv4Address', 'enb2X2Address')])
+                   [param('uint16_t', 'enb1CellId'), param('ns3::Ipv4Address', 'enb1X2Address'), param('std::vector< unsigned short >', 'enb2CellIds'), param('ns3::Ipv4Address', 'enb2X2Address')])
     ## epc-x2.h (module 'lte'): void ns3::EpcX2::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
@@ -16403,7 +16580,7 @@
                    'uint32_t', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_virtual=True)
-    ## epc-x2-header.h (module 'lte'): std::vector<ns3::EpcX2Sap::ErabAdmittedItem, std::allocator<ns3::EpcX2Sap::ErabAdmittedItem> > ns3::EpcX2HandoverRequestAckHeader::GetAdmittedBearers() const [member function]
+    ## epc-x2-header.h (module 'lte'): std::vector<ns3::EpcX2Sap::ErabAdmittedItem, std::allocator<ns3::EpcX2Sap::ErabAdmittedItem>> ns3::EpcX2HandoverRequestAckHeader::GetAdmittedBearers() const [member function]
     cls.add_method('GetAdmittedBearers', 
                    'std::vector< ns3::EpcX2Sap::ErabAdmittedItem >', 
                    [], 
@@ -16423,7 +16600,7 @@
                    'uint16_t', 
                    [], 
                    is_const=True)
-    ## epc-x2-header.h (module 'lte'): std::vector<ns3::EpcX2Sap::ErabNotAdmittedItem, std::allocator<ns3::EpcX2Sap::ErabNotAdmittedItem> > ns3::EpcX2HandoverRequestAckHeader::GetNotAdmittedBearers() const [member function]
+    ## epc-x2-header.h (module 'lte'): std::vector<ns3::EpcX2Sap::ErabNotAdmittedItem, std::allocator<ns3::EpcX2Sap::ErabNotAdmittedItem>> ns3::EpcX2HandoverRequestAckHeader::GetNotAdmittedBearers() const [member function]
     cls.add_method('GetNotAdmittedBearers', 
                    'std::vector< ns3::EpcX2Sap::ErabNotAdmittedItem >', 
                    [], 
@@ -16458,7 +16635,7 @@
                    'void', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_const=True, is_virtual=True)
-    ## epc-x2-header.h (module 'lte'): void ns3::EpcX2HandoverRequestAckHeader::SetAdmittedBearers(std::vector<ns3::EpcX2Sap::ErabAdmittedItem, std::allocator<ns3::EpcX2Sap::ErabAdmittedItem> > bearers) [member function]
+    ## epc-x2-header.h (module 'lte'): void ns3::EpcX2HandoverRequestAckHeader::SetAdmittedBearers(std::vector<ns3::EpcX2Sap::ErabAdmittedItem, std::allocator<ns3::EpcX2Sap::ErabAdmittedItem>> bearers) [member function]
     cls.add_method('SetAdmittedBearers', 
                    'void', 
                    [param('std::vector< ns3::EpcX2Sap::ErabAdmittedItem >', 'bearers')])
@@ -16466,7 +16643,7 @@
     cls.add_method('SetNewEnbUeX2apId', 
                    'void', 
                    [param('uint16_t', 'x2apId')])
-    ## epc-x2-header.h (module 'lte'): void ns3::EpcX2HandoverRequestAckHeader::SetNotAdmittedBearers(std::vector<ns3::EpcX2Sap::ErabNotAdmittedItem, std::allocator<ns3::EpcX2Sap::ErabNotAdmittedItem> > bearers) [member function]
+    ## epc-x2-header.h (module 'lte'): void ns3::EpcX2HandoverRequestAckHeader::SetNotAdmittedBearers(std::vector<ns3::EpcX2Sap::ErabNotAdmittedItem, std::allocator<ns3::EpcX2Sap::ErabNotAdmittedItem>> bearers) [member function]
     cls.add_method('SetNotAdmittedBearers', 
                    'void', 
                    [param('std::vector< ns3::EpcX2Sap::ErabNotAdmittedItem >', 'bearers')])
@@ -16486,7 +16663,7 @@
                    'uint32_t', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_virtual=True)
-    ## epc-x2-header.h (module 'lte'): std::vector<ns3::EpcX2Sap::ErabToBeSetupItem, std::allocator<ns3::EpcX2Sap::ErabToBeSetupItem> > ns3::EpcX2HandoverRequestHeader::GetBearers() const [member function]
+    ## epc-x2-header.h (module 'lte'): std::vector<ns3::EpcX2Sap::ErabToBeSetupItem, std::allocator<ns3::EpcX2Sap::ErabToBeSetupItem>> ns3::EpcX2HandoverRequestHeader::GetBearers() const [member function]
     cls.add_method('GetBearers', 
                    'std::vector< ns3::EpcX2Sap::ErabToBeSetupItem >', 
                    [], 
@@ -16556,7 +16733,7 @@
                    'void', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_const=True, is_virtual=True)
-    ## epc-x2-header.h (module 'lte'): void ns3::EpcX2HandoverRequestHeader::SetBearers(std::vector<ns3::EpcX2Sap::ErabToBeSetupItem, std::allocator<ns3::EpcX2Sap::ErabToBeSetupItem> > bearers) [member function]
+    ## epc-x2-header.h (module 'lte'): void ns3::EpcX2HandoverRequestHeader::SetBearers(std::vector<ns3::EpcX2Sap::ErabToBeSetupItem, std::allocator<ns3::EpcX2Sap::ErabToBeSetupItem>> bearers) [member function]
     cls.add_method('SetBearers', 
                    'void', 
                    [param('std::vector< ns3::EpcX2Sap::ErabToBeSetupItem >', 'bearers')])
@@ -16659,7 +16836,7 @@
                    'uint32_t', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_virtual=True)
-    ## epc-x2-header.h (module 'lte'): std::vector<ns3::EpcX2Sap::CellInformationItem, std::allocator<ns3::EpcX2Sap::CellInformationItem> > ns3::EpcX2LoadInformationHeader::GetCellInformationList() const [member function]
+    ## epc-x2-header.h (module 'lte'): std::vector<ns3::EpcX2Sap::CellInformationItem, std::allocator<ns3::EpcX2Sap::CellInformationItem>> ns3::EpcX2LoadInformationHeader::GetCellInformationList() const [member function]
     cls.add_method('GetCellInformationList', 
                    'std::vector< ns3::EpcX2Sap::CellInformationItem >', 
                    [], 
@@ -16699,7 +16876,7 @@
                    'void', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_const=True, is_virtual=True)
-    ## epc-x2-header.h (module 'lte'): void ns3::EpcX2LoadInformationHeader::SetCellInformationList(std::vector<ns3::EpcX2Sap::CellInformationItem, std::allocator<ns3::EpcX2Sap::CellInformationItem> > cellInformationList) [member function]
+    ## epc-x2-header.h (module 'lte'): void ns3::EpcX2LoadInformationHeader::SetCellInformationList(std::vector<ns3::EpcX2Sap::CellInformationItem, std::allocator<ns3::EpcX2Sap::CellInformationItem>> cellInformationList) [member function]
     cls.add_method('SetCellInformationList', 
                    'void', 
                    [param('std::vector< ns3::EpcX2Sap::CellInformationItem >', 'cellInformationList')])
@@ -16715,7 +16892,7 @@
                    'uint32_t', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_virtual=True)
-    ## epc-x2-header.h (module 'lte'): std::vector<ns3::EpcX2Sap::CellMeasurementResultItem, std::allocator<ns3::EpcX2Sap::CellMeasurementResultItem> > ns3::EpcX2ResourceStatusUpdateHeader::GetCellMeasurementResultList() const [member function]
+    ## epc-x2-header.h (module 'lte'): std::vector<ns3::EpcX2Sap::CellMeasurementResultItem, std::allocator<ns3::EpcX2Sap::CellMeasurementResultItem>> ns3::EpcX2ResourceStatusUpdateHeader::GetCellMeasurementResultList() const [member function]
     cls.add_method('GetCellMeasurementResultList', 
                    'std::vector< ns3::EpcX2Sap::CellMeasurementResultItem >', 
                    [], 
@@ -16765,7 +16942,7 @@
                    'void', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_const=True, is_virtual=True)
-    ## epc-x2-header.h (module 'lte'): void ns3::EpcX2ResourceStatusUpdateHeader::SetCellMeasurementResultList(std::vector<ns3::EpcX2Sap::CellMeasurementResultItem, std::allocator<ns3::EpcX2Sap::CellMeasurementResultItem> > cellMeasurementResultList) [member function]
+    ## epc-x2-header.h (module 'lte'): void ns3::EpcX2ResourceStatusUpdateHeader::SetCellMeasurementResultList(std::vector<ns3::EpcX2Sap::CellMeasurementResultItem, std::allocator<ns3::EpcX2Sap::CellMeasurementResultItem>> cellMeasurementResultList) [member function]
     cls.add_method('SetCellMeasurementResultList', 
                    'void', 
                    [param('std::vector< ns3::EpcX2Sap::CellMeasurementResultItem >', 'cellMeasurementResultList')])
@@ -16789,7 +16966,7 @@
                    'uint32_t', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_virtual=True)
-    ## epc-x2-header.h (module 'lte'): std::vector<ns3::EpcX2Sap::ErabsSubjectToStatusTransferItem, std::allocator<ns3::EpcX2Sap::ErabsSubjectToStatusTransferItem> > ns3::EpcX2SnStatusTransferHeader::GetErabsSubjectToStatusTransferList() const [member function]
+    ## epc-x2-header.h (module 'lte'): std::vector<ns3::EpcX2Sap::ErabsSubjectToStatusTransferItem, std::allocator<ns3::EpcX2Sap::ErabsSubjectToStatusTransferItem>> ns3::EpcX2SnStatusTransferHeader::GetErabsSubjectToStatusTransferList() const [member function]
     cls.add_method('GetErabsSubjectToStatusTransferList', 
                    'std::vector< ns3::EpcX2Sap::ErabsSubjectToStatusTransferItem >', 
                    [], 
@@ -16839,7 +17016,7 @@
                    'void', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_const=True, is_virtual=True)
-    ## epc-x2-header.h (module 'lte'): void ns3::EpcX2SnStatusTransferHeader::SetErabsSubjectToStatusTransferList(std::vector<ns3::EpcX2Sap::ErabsSubjectToStatusTransferItem, std::allocator<ns3::EpcX2Sap::ErabsSubjectToStatusTransferItem> > erabs) [member function]
+    ## epc-x2-header.h (module 'lte'): void ns3::EpcX2SnStatusTransferHeader::SetErabsSubjectToStatusTransferList(std::vector<ns3::EpcX2Sap::ErabsSubjectToStatusTransferItem, std::allocator<ns3::EpcX2Sap::ErabsSubjectToStatusTransferItem>> erabs) [member function]
     cls.add_method('SetErabsSubjectToStatusTransferList', 
                    'void', 
                    [param('std::vector< ns3::EpcX2Sap::ErabsSubjectToStatusTransferItem >', 'erabs')])
@@ -17293,7 +17470,7 @@
                    'uint32_t', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_virtual=True)
-    ## epc-gtpc-header.h (module 'lte'): std::list<ns3::GtpcModifyBearerRequestMessage::BearerContextToBeModified, std::allocator<ns3::GtpcModifyBearerRequestMessage::BearerContextToBeModified> > ns3::GtpcModifyBearerRequestMessage::GetBearerContextsToBeModified() const [member function]
+    ## epc-gtpc-header.h (module 'lte'): std::list<ns3::GtpcModifyBearerRequestMessage::BearerContextToBeModified, std::allocator<ns3::GtpcModifyBearerRequestMessage::BearerContextToBeModified>> ns3::GtpcModifyBearerRequestMessage::GetBearerContextsToBeModified() const [member function]
     cls.add_method('GetBearerContextsToBeModified', 
                    'std::list< ns3::GtpcModifyBearerRequestMessage::BearerContextToBeModified >', 
                    [], 
@@ -17338,7 +17515,7 @@
                    'void', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_const=True, is_virtual=True)
-    ## epc-gtpc-header.h (module 'lte'): void ns3::GtpcModifyBearerRequestMessage::SetBearerContextsToBeModified(std::list<ns3::GtpcModifyBearerRequestMessage::BearerContextToBeModified, std::allocator<ns3::GtpcModifyBearerRequestMessage::BearerContextToBeModified> > bearerContexts) [member function]
+    ## epc-gtpc-header.h (module 'lte'): void ns3::GtpcModifyBearerRequestMessage::SetBearerContextsToBeModified(std::list<ns3::GtpcModifyBearerRequestMessage::BearerContextToBeModified, std::allocator<ns3::GtpcModifyBearerRequestMessage::BearerContextToBeModified>> bearerContexts) [member function]
     cls.add_method('SetBearerContextsToBeModified', 
                    'void', 
                    [param('std::list< ns3::GtpcModifyBearerRequestMessage::BearerContextToBeModified >', 'bearerContexts')])
@@ -17883,7 +18060,7 @@
                    'ns3::Ipv4Address', 
                    [], 
                    is_const=True)
-    ## ipv4-route.h (module 'internet'): std::map<unsigned int, unsigned int, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, unsigned int> > > ns3::Ipv4MulticastRoute::GetOutputTtlMap() const [member function]
+    ## ipv4-route.h (module 'internet'): std::map<unsigned int, unsigned int, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, unsigned int>>> ns3::Ipv4MulticastRoute::GetOutputTtlMap() const [member function]
     cls.add_method('GetOutputTtlMap', 
                    'std::map< unsigned int, unsigned int >', 
                    [], 
@@ -18309,7 +18486,7 @@
     cls.add_constructor([param('ns3::LteAmc const &', 'arg0')])
     ## lte-amc.h (module 'lte'): ns3::LteAmc::LteAmc() [constructor]
     cls.add_constructor([])
-    ## lte-amc.h (module 'lte'): std::vector<int, std::allocator<int> > ns3::LteAmc::CreateCqiFeedbacks(ns3::SpectrumValue const & sinr, uint8_t rbgSize=0) [member function]
+    ## lte-amc.h (module 'lte'): std::vector<int, std::allocator<int>> ns3::LteAmc::CreateCqiFeedbacks(ns3::SpectrumValue const & sinr, uint8_t rbgSize=0) [member function]
     cls.add_method('CreateCqiFeedbacks', 
                    'std::vector< int >', 
                    [param('ns3::SpectrumValue const &', 'sinr'), param('uint8_t', 'rbgSize', default_value='0')])
@@ -18557,9 +18734,9 @@
     cls.add_constructor([param('ns3::LteEnbRrc const &', 'arg0')])
     ## lte-enb-rrc.h (module 'lte'): ns3::LteEnbRrc::LteEnbRrc() [constructor]
     cls.add_constructor([])
-    ## lte-enb-rrc.h (module 'lte'): uint8_t ns3::LteEnbRrc::AddUeMeasReportConfig(ns3::LteRrcSap::ReportConfigEutra config) [member function]
+    ## lte-enb-rrc.h (module 'lte'): std::vector<unsigned char, std::allocator<unsigned char>> ns3::LteEnbRrc::AddUeMeasReportConfig(ns3::LteRrcSap::ReportConfigEutra config) [member function]
     cls.add_method('AddUeMeasReportConfig', 
-                   'uint8_t', 
+                   'std::vector< unsigned char >', 
                    [param('ns3::LteRrcSap::ReportConfigEutra', 'config')])
     ## lte-enb-rrc.h (module 'lte'): void ns3::LteEnbRrc::AddX2Neighbour(uint16_t cellId) [member function]
     cls.add_method('AddX2Neighbour', 
@@ -18573,11 +18750,11 @@
     cls.add_method('ComponentCarrierToCellId', 
                    'uint16_t', 
                    [param('uint8_t', 'componentCarrierId')])
-    ## lte-enb-rrc.h (module 'lte'): void ns3::LteEnbRrc::ConfigureCarriers(std::map<unsigned char, ns3::Ptr<ns3::ComponentCarrierBaseStation>, std::less<unsigned char>, std::allocator<std::pair<const unsigned char, ns3::Ptr<ns3::ComponentCarrierBaseStation> > > > ccPhyConf) [member function]
+    ## lte-enb-rrc.h (module 'lte'): void ns3::LteEnbRrc::ConfigureCarriers(std::map<unsigned char, ns3::Ptr<ns3::ComponentCarrierBaseStation>, std::less<unsigned char>, std::allocator<std::pair<const unsigned char, ns3::Ptr<ns3::ComponentCarrierBaseStation>>>> ccPhyConf) [member function]
     cls.add_method('ConfigureCarriers', 
                    'void', 
                    [param('std::map< unsigned char, ns3::Ptr< ns3::ComponentCarrierBaseStation > >', 'ccPhyConf')])
-    ## lte-enb-rrc.h (module 'lte'): void ns3::LteEnbRrc::ConfigureCell(std::map<unsigned char, ns3::Ptr<ns3::ComponentCarrierBaseStation>, std::less<unsigned char>, std::allocator<std::pair<const unsigned char, ns3::Ptr<ns3::ComponentCarrierBaseStation> > > > ccPhyConf) [member function]
+    ## lte-enb-rrc.h (module 'lte'): void ns3::LteEnbRrc::ConfigureCell(std::map<unsigned char, ns3::Ptr<ns3::ComponentCarrierBaseStation>, std::less<unsigned char>, std::allocator<std::pair<const unsigned char, ns3::Ptr<ns3::ComponentCarrierBaseStation>>>> ccPhyConf) [member function]
     cls.add_method('ConfigureCell', 
                    'void', 
                    [param('std::map< unsigned char, ns3::Ptr< ns3::ComponentCarrierBaseStation > >', 'ccPhyConf')])
@@ -18667,6 +18844,11 @@
     cls.add_method('HandoverLeavingTimeout', 
                    'void', 
                    [param('uint16_t', 'rnti')])
+    ## lte-enb-rrc.h (module 'lte'): bool ns3::LteEnbRrc::HasCellId(uint16_t cellId) const [member function]
+    cls.add_method('HasCellId', 
+                   'bool', 
+                   [param('uint16_t', 'cellId')], 
+                   is_const=True)
     ## lte-enb-rrc.h (module 'lte'): bool ns3::LteEnbRrc::HasUeManager(uint16_t rnti) const [member function]
     cls.add_method('HasUeManager', 
                    'bool', 
@@ -18895,12 +19077,12 @@
                    'void', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## lte-ffr-algorithm.h (module 'lte'): std::vector<bool, std::allocator<bool> > ns3::LteFfrAlgorithm::DoGetAvailableDlRbg() [member function]
+    ## lte-ffr-algorithm.h (module 'lte'): std::vector<bool, std::allocator<bool>> ns3::LteFfrAlgorithm::DoGetAvailableDlRbg() [member function]
     cls.add_method('DoGetAvailableDlRbg', 
                    'std::vector< bool >', 
                    [], 
                    is_pure_virtual=True, is_virtual=True, visibility='protected')
-    ## lte-ffr-algorithm.h (module 'lte'): std::vector<bool, std::allocator<bool> > ns3::LteFfrAlgorithm::DoGetAvailableUlRbg() [member function]
+    ## lte-ffr-algorithm.h (module 'lte'): std::vector<bool, std::allocator<bool>> ns3::LteFfrAlgorithm::DoGetAvailableUlRbg() [member function]
     cls.add_method('DoGetAvailableUlRbg', 
                    'std::vector< bool >', 
                    [], 
@@ -18945,7 +19127,7 @@
                    'void', 
                    [param('ns3::FfMacSchedSapProvider::SchedUlCqiInfoReqParameters const &', 'params')], 
                    is_pure_virtual=True, is_virtual=True, visibility='protected')
-    ## lte-ffr-algorithm.h (module 'lte'): void ns3::LteFfrAlgorithm::DoReportUlCqiInfo(std::map<unsigned short, std::vector<double, std::allocator<double> >, std::less<unsigned short>, std::allocator<std::pair<const unsigned short, std::vector<double, std::allocator<double> > > > > ulCqiMap) [member function]
+    ## lte-ffr-algorithm.h (module 'lte'): void ns3::LteFfrAlgorithm::DoReportUlCqiInfo(std::map<unsigned short, std::vector<double, std::allocator<double>>, std::less<unsigned short>, std::allocator<std::pair<const unsigned short, std::vector<double, std::allocator<double>>>>> ulCqiMap) [member function]
     cls.add_method('DoReportUlCqiInfo', 
                    'void', 
                    [param('std::map< unsigned short, std::vector< double > >', 'ulCqiMap')], 
@@ -19007,12 +19189,12 @@
                    'void', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## lte-ffr-distributed-algorithm.h (module 'lte'): std::vector<bool, std::allocator<bool> > ns3::LteFfrDistributedAlgorithm::DoGetAvailableDlRbg() [member function]
+    ## lte-ffr-distributed-algorithm.h (module 'lte'): std::vector<bool, std::allocator<bool>> ns3::LteFfrDistributedAlgorithm::DoGetAvailableDlRbg() [member function]
     cls.add_method('DoGetAvailableDlRbg', 
                    'std::vector< bool >', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## lte-ffr-distributed-algorithm.h (module 'lte'): std::vector<bool, std::allocator<bool> > ns3::LteFfrDistributedAlgorithm::DoGetAvailableUlRbg() [member function]
+    ## lte-ffr-distributed-algorithm.h (module 'lte'): std::vector<bool, std::allocator<bool>> ns3::LteFfrDistributedAlgorithm::DoGetAvailableUlRbg() [member function]
     cls.add_method('DoGetAvailableUlRbg', 
                    'std::vector< bool >', 
                    [], 
@@ -19062,7 +19244,7 @@
                    'void', 
                    [param('ns3::FfMacSchedSapProvider::SchedUlCqiInfoReqParameters const &', 'params')], 
                    is_virtual=True, visibility='protected')
-    ## lte-ffr-distributed-algorithm.h (module 'lte'): void ns3::LteFfrDistributedAlgorithm::DoReportUlCqiInfo(std::map<unsigned short, std::vector<double, std::allocator<double> >, std::less<unsigned short>, std::allocator<std::pair<const unsigned short, std::vector<double, std::allocator<double> > > > > ulCqiMap) [member function]
+    ## lte-ffr-distributed-algorithm.h (module 'lte'): void ns3::LteFfrDistributedAlgorithm::DoReportUlCqiInfo(std::map<unsigned short, std::vector<double, std::allocator<double>>, std::less<unsigned short>, std::allocator<std::pair<const unsigned short, std::vector<double, std::allocator<double>>>>> ulCqiMap) [member function]
     cls.add_method('DoReportUlCqiInfo', 
                    'void', 
                    [param('std::map< unsigned short, std::vector< double > >', 'ulCqiMap')], 
@@ -19109,12 +19291,12 @@
                    'void', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## lte-ffr-enhanced-algorithm.h (module 'lte'): std::vector<bool, std::allocator<bool> > ns3::LteFfrEnhancedAlgorithm::DoGetAvailableDlRbg() [member function]
+    ## lte-ffr-enhanced-algorithm.h (module 'lte'): std::vector<bool, std::allocator<bool>> ns3::LteFfrEnhancedAlgorithm::DoGetAvailableDlRbg() [member function]
     cls.add_method('DoGetAvailableDlRbg', 
                    'std::vector< bool >', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## lte-ffr-enhanced-algorithm.h (module 'lte'): std::vector<bool, std::allocator<bool> > ns3::LteFfrEnhancedAlgorithm::DoGetAvailableUlRbg() [member function]
+    ## lte-ffr-enhanced-algorithm.h (module 'lte'): std::vector<bool, std::allocator<bool>> ns3::LteFfrEnhancedAlgorithm::DoGetAvailableUlRbg() [member function]
     cls.add_method('DoGetAvailableUlRbg', 
                    'std::vector< bool >', 
                    [], 
@@ -19164,7 +19346,7 @@
                    'void', 
                    [param('ns3::FfMacSchedSapProvider::SchedUlCqiInfoReqParameters const &', 'params')], 
                    is_virtual=True, visibility='protected')
-    ## lte-ffr-enhanced-algorithm.h (module 'lte'): void ns3::LteFfrEnhancedAlgorithm::DoReportUlCqiInfo(std::map<unsigned short, std::vector<double, std::allocator<double> >, std::less<unsigned short>, std::allocator<std::pair<const unsigned short, std::vector<double, std::allocator<double> > > > > ulCqiMap) [member function]
+    ## lte-ffr-enhanced-algorithm.h (module 'lte'): void ns3::LteFfrEnhancedAlgorithm::DoReportUlCqiInfo(std::map<unsigned short, std::vector<double, std::allocator<double>>, std::less<unsigned short>, std::allocator<std::pair<const unsigned short, std::vector<double, std::allocator<double>>>>> ulCqiMap) [member function]
     cls.add_method('DoReportUlCqiInfo', 
                    'void', 
                    [param('std::map< unsigned short, std::vector< double > >', 'ulCqiMap')], 
@@ -19211,12 +19393,12 @@
                    'void', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## lte-ffr-soft-algorithm.h (module 'lte'): std::vector<bool, std::allocator<bool> > ns3::LteFfrSoftAlgorithm::DoGetAvailableDlRbg() [member function]
+    ## lte-ffr-soft-algorithm.h (module 'lte'): std::vector<bool, std::allocator<bool>> ns3::LteFfrSoftAlgorithm::DoGetAvailableDlRbg() [member function]
     cls.add_method('DoGetAvailableDlRbg', 
                    'std::vector< bool >', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## lte-ffr-soft-algorithm.h (module 'lte'): std::vector<bool, std::allocator<bool> > ns3::LteFfrSoftAlgorithm::DoGetAvailableUlRbg() [member function]
+    ## lte-ffr-soft-algorithm.h (module 'lte'): std::vector<bool, std::allocator<bool>> ns3::LteFfrSoftAlgorithm::DoGetAvailableUlRbg() [member function]
     cls.add_method('DoGetAvailableUlRbg', 
                    'std::vector< bool >', 
                    [], 
@@ -19266,7 +19448,7 @@
                    'void', 
                    [param('ns3::FfMacSchedSapProvider::SchedUlCqiInfoReqParameters const &', 'params')], 
                    is_virtual=True, visibility='protected')
-    ## lte-ffr-soft-algorithm.h (module 'lte'): void ns3::LteFfrSoftAlgorithm::DoReportUlCqiInfo(std::map<unsigned short, std::vector<double, std::allocator<double> >, std::less<unsigned short>, std::allocator<std::pair<const unsigned short, std::vector<double, std::allocator<double> > > > > ulCqiMap) [member function]
+    ## lte-ffr-soft-algorithm.h (module 'lte'): void ns3::LteFfrSoftAlgorithm::DoReportUlCqiInfo(std::map<unsigned short, std::vector<double, std::allocator<double>>, std::less<unsigned short>, std::allocator<std::pair<const unsigned short, std::vector<double, std::allocator<double>>>>> ulCqiMap) [member function]
     cls.add_method('DoReportUlCqiInfo', 
                    'void', 
                    [param('std::map< unsigned short, std::vector< double > >', 'ulCqiMap')], 
@@ -19313,12 +19495,12 @@
                    'void', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## lte-fr-hard-algorithm.h (module 'lte'): std::vector<bool, std::allocator<bool> > ns3::LteFrHardAlgorithm::DoGetAvailableDlRbg() [member function]
+    ## lte-fr-hard-algorithm.h (module 'lte'): std::vector<bool, std::allocator<bool>> ns3::LteFrHardAlgorithm::DoGetAvailableDlRbg() [member function]
     cls.add_method('DoGetAvailableDlRbg', 
                    'std::vector< bool >', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## lte-fr-hard-algorithm.h (module 'lte'): std::vector<bool, std::allocator<bool> > ns3::LteFrHardAlgorithm::DoGetAvailableUlRbg() [member function]
+    ## lte-fr-hard-algorithm.h (module 'lte'): std::vector<bool, std::allocator<bool>> ns3::LteFrHardAlgorithm::DoGetAvailableUlRbg() [member function]
     cls.add_method('DoGetAvailableUlRbg', 
                    'std::vector< bool >', 
                    [], 
@@ -19368,7 +19550,7 @@
                    'void', 
                    [param('ns3::FfMacSchedSapProvider::SchedUlCqiInfoReqParameters const &', 'params')], 
                    is_virtual=True, visibility='protected')
-    ## lte-fr-hard-algorithm.h (module 'lte'): void ns3::LteFrHardAlgorithm::DoReportUlCqiInfo(std::map<unsigned short, std::vector<double, std::allocator<double> >, std::less<unsigned short>, std::allocator<std::pair<const unsigned short, std::vector<double, std::allocator<double> > > > > ulCqiMap) [member function]
+    ## lte-fr-hard-algorithm.h (module 'lte'): void ns3::LteFrHardAlgorithm::DoReportUlCqiInfo(std::map<unsigned short, std::vector<double, std::allocator<double>>, std::less<unsigned short>, std::allocator<std::pair<const unsigned short, std::vector<double, std::allocator<double>>>>> ulCqiMap) [member function]
     cls.add_method('DoReportUlCqiInfo', 
                    'void', 
                    [param('std::map< unsigned short, std::vector< double > >', 'ulCqiMap')], 
@@ -19415,12 +19597,12 @@
                    'void', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## lte-fr-no-op-algorithm.h (module 'lte'): std::vector<bool, std::allocator<bool> > ns3::LteFrNoOpAlgorithm::DoGetAvailableDlRbg() [member function]
+    ## lte-fr-no-op-algorithm.h (module 'lte'): std::vector<bool, std::allocator<bool>> ns3::LteFrNoOpAlgorithm::DoGetAvailableDlRbg() [member function]
     cls.add_method('DoGetAvailableDlRbg', 
                    'std::vector< bool >', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## lte-fr-no-op-algorithm.h (module 'lte'): std::vector<bool, std::allocator<bool> > ns3::LteFrNoOpAlgorithm::DoGetAvailableUlRbg() [member function]
+    ## lte-fr-no-op-algorithm.h (module 'lte'): std::vector<bool, std::allocator<bool>> ns3::LteFrNoOpAlgorithm::DoGetAvailableUlRbg() [member function]
     cls.add_method('DoGetAvailableUlRbg', 
                    'std::vector< bool >', 
                    [], 
@@ -19470,7 +19652,7 @@
                    'void', 
                    [param('ns3::FfMacSchedSapProvider::SchedUlCqiInfoReqParameters const &', 'params')], 
                    is_virtual=True, visibility='protected')
-    ## lte-fr-no-op-algorithm.h (module 'lte'): void ns3::LteFrNoOpAlgorithm::DoReportUlCqiInfo(std::map<unsigned short, std::vector<double, std::allocator<double> >, std::less<unsigned short>, std::allocator<std::pair<const unsigned short, std::vector<double, std::allocator<double> > > > > ulCqiMap) [member function]
+    ## lte-fr-no-op-algorithm.h (module 'lte'): void ns3::LteFrNoOpAlgorithm::DoReportUlCqiInfo(std::map<unsigned short, std::vector<double, std::allocator<double>>, std::less<unsigned short>, std::allocator<std::pair<const unsigned short, std::vector<double, std::allocator<double>>>>> ulCqiMap) [member function]
     cls.add_method('DoReportUlCqiInfo', 
                    'void', 
                    [param('std::map< unsigned short, std::vector< double > >', 'ulCqiMap')], 
@@ -19517,12 +19699,12 @@
                    'void', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## lte-fr-soft-algorithm.h (module 'lte'): std::vector<bool, std::allocator<bool> > ns3::LteFrSoftAlgorithm::DoGetAvailableDlRbg() [member function]
+    ## lte-fr-soft-algorithm.h (module 'lte'): std::vector<bool, std::allocator<bool>> ns3::LteFrSoftAlgorithm::DoGetAvailableDlRbg() [member function]
     cls.add_method('DoGetAvailableDlRbg', 
                    'std::vector< bool >', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## lte-fr-soft-algorithm.h (module 'lte'): std::vector<bool, std::allocator<bool> > ns3::LteFrSoftAlgorithm::DoGetAvailableUlRbg() [member function]
+    ## lte-fr-soft-algorithm.h (module 'lte'): std::vector<bool, std::allocator<bool>> ns3::LteFrSoftAlgorithm::DoGetAvailableUlRbg() [member function]
     cls.add_method('DoGetAvailableUlRbg', 
                    'std::vector< bool >', 
                    [], 
@@ -19572,7 +19754,7 @@
                    'void', 
                    [param('ns3::FfMacSchedSapProvider::SchedUlCqiInfoReqParameters const &', 'params')], 
                    is_virtual=True, visibility='protected')
-    ## lte-fr-soft-algorithm.h (module 'lte'): void ns3::LteFrSoftAlgorithm::DoReportUlCqiInfo(std::map<unsigned short, std::vector<double, std::allocator<double> >, std::less<unsigned short>, std::allocator<std::pair<const unsigned short, std::vector<double, std::allocator<double> > > > > ulCqiMap) [member function]
+    ## lte-fr-soft-algorithm.h (module 'lte'): void ns3::LteFrSoftAlgorithm::DoReportUlCqiInfo(std::map<unsigned short, std::vector<double, std::allocator<double>>, std::less<unsigned short>, std::allocator<std::pair<const unsigned short, std::vector<double, std::allocator<double>>>>> ulCqiMap) [member function]
     cls.add_method('DoReportUlCqiInfo', 
                    'void', 
                    [param('std::map< unsigned short, std::vector< double > >', 'ulCqiMap')], 
@@ -19619,12 +19801,12 @@
                    'void', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## lte-fr-strict-algorithm.h (module 'lte'): std::vector<bool, std::allocator<bool> > ns3::LteFrStrictAlgorithm::DoGetAvailableDlRbg() [member function]
+    ## lte-fr-strict-algorithm.h (module 'lte'): std::vector<bool, std::allocator<bool>> ns3::LteFrStrictAlgorithm::DoGetAvailableDlRbg() [member function]
     cls.add_method('DoGetAvailableDlRbg', 
                    'std::vector< bool >', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## lte-fr-strict-algorithm.h (module 'lte'): std::vector<bool, std::allocator<bool> > ns3::LteFrStrictAlgorithm::DoGetAvailableUlRbg() [member function]
+    ## lte-fr-strict-algorithm.h (module 'lte'): std::vector<bool, std::allocator<bool>> ns3::LteFrStrictAlgorithm::DoGetAvailableUlRbg() [member function]
     cls.add_method('DoGetAvailableUlRbg', 
                    'std::vector< bool >', 
                    [], 
@@ -19674,7 +19856,7 @@
                    'void', 
                    [param('ns3::FfMacSchedSapProvider::SchedUlCqiInfoReqParameters const &', 'params')], 
                    is_virtual=True, visibility='protected')
-    ## lte-fr-strict-algorithm.h (module 'lte'): void ns3::LteFrStrictAlgorithm::DoReportUlCqiInfo(std::map<unsigned short, std::vector<double, std::allocator<double> >, std::less<unsigned short>, std::allocator<std::pair<const unsigned short, std::vector<double, std::allocator<double> > > > > ulCqiMap) [member function]
+    ## lte-fr-strict-algorithm.h (module 'lte'): void ns3::LteFrStrictAlgorithm::DoReportUlCqiInfo(std::map<unsigned short, std::vector<double, std::allocator<double>>, std::less<unsigned short>, std::allocator<std::pair<const unsigned short, std::vector<double, std::allocator<double>>>>> ulCqiMap) [member function]
     cls.add_method('DoReportUlCqiInfo', 
                    'void', 
                    [param('std::map< unsigned short, std::vector< double > >', 'ulCqiMap')], 
@@ -19810,10 +19992,10 @@
     cls.add_method('Attach', 
                    'void', 
                    [param('ns3::NetDeviceContainer', 'ueDevices'), param('ns3::Ptr< ns3::NetDevice >', 'enbDevice')])
-    ## lte-helper.h (module 'lte'): void ns3::LteHelper::Attach(ns3::Ptr<ns3::NetDevice> ueDevice, ns3::Ptr<ns3::NetDevice> enbDevice) [member function]
+    ## lte-helper.h (module 'lte'): void ns3::LteHelper::Attach(ns3::Ptr<ns3::NetDevice> ueDevice, ns3::Ptr<ns3::NetDevice> enbDevice, uint8_t componentCarrierId=0) [member function]
     cls.add_method('Attach', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NetDevice >', 'ueDevice'), param('ns3::Ptr< ns3::NetDevice >', 'enbDevice')])
+                   [param('ns3::Ptr< ns3::NetDevice >', 'ueDevice'), param('ns3::Ptr< ns3::NetDevice >', 'enbDevice'), param('uint8_t', 'componentCarrierId', default_value='0')])
     ## lte-helper.h (module 'lte'): void ns3::LteHelper::AttachToClosestEnb(ns3::NetDeviceContainer ueDevices, ns3::NetDeviceContainer enbDevices) [member function]
     cls.add_method('AttachToClosestEnb', 
                    'void', 
@@ -20254,7 +20436,7 @@
     cls.add_method('GetComponentCarrierId', 
                    'uint8_t', 
                    [])
-    ## lte-phy.h (module 'lte'): std::list<ns3::Ptr<ns3::LteControlMessage>, std::allocator<ns3::Ptr<ns3::LteControlMessage> > > ns3::LtePhy::GetControlMessages() [member function]
+    ## lte-phy.h (module 'lte'): std::list<ns3::Ptr<ns3::LteControlMessage>, std::allocator<ns3::Ptr<ns3::LteControlMessage>>> ns3::LtePhy::GetControlMessages() [member function]
     cls.add_method('GetControlMessages', 
                    'std::list< ns3::Ptr< ns3::LteControlMessage > >', 
                    [])
@@ -20629,9 +20811,9 @@
                    'ns3::Ptr< ns3::SpectrumModel const >', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## lte-spectrum-phy.h (module 'lte'): ns3::Ptr<ns3::AntennaModel> ns3::LteSpectrumPhy::GetRxAntenna() const [member function]
-    cls.add_method('GetRxAntenna', 
-                   'ns3::Ptr< ns3::AntennaModel >', 
+    ## lte-spectrum-phy.h (module 'lte'): ns3::Ptr<ns3::Object> ns3::LteSpectrumPhy::GetAntenna() const [member function]
+    cls.add_method('GetAntenna', 
+                   'ns3::Ptr< ns3::Object >', 
                    [], 
                    is_const=True, is_virtual=True)
     ## lte-spectrum-phy.h (module 'lte'): void ns3::LteSpectrumPhy::StartRx(ns3::Ptr<ns3::SpectrumSignalParameters> params) [member function]
@@ -20671,11 +20853,11 @@
     cls.add_method('SetAntenna', 
                    'void', 
                    [param('ns3::Ptr< ns3::AntennaModel >', 'a')])
-    ## lte-spectrum-phy.h (module 'lte'): bool ns3::LteSpectrumPhy::StartTxDataFrame(ns3::Ptr<ns3::PacketBurst> pb, std::list<ns3::Ptr<ns3::LteControlMessage>, std::allocator<ns3::Ptr<ns3::LteControlMessage> > > ctrlMsgList, ns3::Time duration) [member function]
+    ## lte-spectrum-phy.h (module 'lte'): bool ns3::LteSpectrumPhy::StartTxDataFrame(ns3::Ptr<ns3::PacketBurst> pb, std::list<ns3::Ptr<ns3::LteControlMessage>, std::allocator<ns3::Ptr<ns3::LteControlMessage>>> ctrlMsgList, ns3::Time duration) [member function]
     cls.add_method('StartTxDataFrame', 
                    'bool', 
                    [param('ns3::Ptr< ns3::PacketBurst >', 'pb'), param('std::list< ns3::Ptr< ns3::LteControlMessage > >', 'ctrlMsgList'), param('ns3::Time', 'duration')])
-    ## lte-spectrum-phy.h (module 'lte'): bool ns3::LteSpectrumPhy::StartTxDlCtrlFrame(std::list<ns3::Ptr<ns3::LteControlMessage>, std::allocator<ns3::Ptr<ns3::LteControlMessage> > > ctrlMsgList, bool pss) [member function]
+    ## lte-spectrum-phy.h (module 'lte'): bool ns3::LteSpectrumPhy::StartTxDlCtrlFrame(std::list<ns3::Ptr<ns3::LteControlMessage>, std::allocator<ns3::Ptr<ns3::LteControlMessage>>> ctrlMsgList, bool pss) [member function]
     cls.add_method('StartTxDlCtrlFrame', 
                    'bool', 
                    [param('std::list< ns3::Ptr< ns3::LteControlMessage > >', 'ctrlMsgList'), param('bool', 'pss')])
@@ -20747,7 +20929,7 @@
     cls.add_method('AddCtrlSinrChunkProcessor', 
                    'void', 
                    [param('ns3::Ptr< ns3::LteChunkProcessor >', 'p')])
-    ## lte-spectrum-phy.h (module 'lte'): void ns3::LteSpectrumPhy::AddExpectedTb(uint16_t rnti, uint8_t ndi, uint16_t size, uint8_t mcs, std::vector<int, std::allocator<int> > map, uint8_t layer, uint8_t harqId, uint8_t rv, bool downlink) [member function]
+    ## lte-spectrum-phy.h (module 'lte'): void ns3::LteSpectrumPhy::AddExpectedTb(uint16_t rnti, uint8_t ndi, uint16_t size, uint8_t mcs, std::vector<int, std::allocator<int>> map, uint8_t layer, uint8_t harqId, uint8_t rv, bool downlink) [member function]
     cls.add_method('AddExpectedTb', 
                    'void', 
                    [param('uint16_t', 'rnti'), param('uint8_t', 'ndi'), param('uint16_t', 'size'), param('uint8_t', 'mcs'), param('std::vector< int >', 'map'), param('uint8_t', 'layer'), param('uint8_t', 'harqId'), param('uint8_t', 'rv'), param('bool', 'downlink')])
@@ -20774,65 +20956,65 @@
     return
 
 def register_Ns3LteSpectrumSignalParameters_methods(root_module, cls):
+    ## lte-spectrum-signal-parameters.h (module 'lte'): ns3::LteSpectrumSignalParameters::LteSpectrumSignalParameters() [constructor]
+    cls.add_constructor([])
+    ## lte-spectrum-signal-parameters.h (module 'lte'): ns3::LteSpectrumSignalParameters::LteSpectrumSignalParameters(ns3::LteSpectrumSignalParameters const & p) [constructor]
+    cls.add_constructor([param('ns3::LteSpectrumSignalParameters const &', 'p')])
     ## lte-spectrum-signal-parameters.h (module 'lte'): ns3::Ptr<ns3::SpectrumSignalParameters> ns3::LteSpectrumSignalParameters::Copy() [member function]
     cls.add_method('Copy', 
                    'ns3::Ptr< ns3::SpectrumSignalParameters >', 
                    [], 
                    is_virtual=True)
-    ## lte-spectrum-signal-parameters.h (module 'lte'): ns3::LteSpectrumSignalParameters::LteSpectrumSignalParameters() [constructor]
-    cls.add_constructor([])
-    ## lte-spectrum-signal-parameters.h (module 'lte'): ns3::LteSpectrumSignalParameters::LteSpectrumSignalParameters(ns3::LteSpectrumSignalParameters const & p) [constructor]
-    cls.add_constructor([param('ns3::LteSpectrumSignalParameters const &', 'p')])
     ## lte-spectrum-signal-parameters.h (module 'lte'): ns3::LteSpectrumSignalParameters::packetBurst [variable]
     cls.add_instance_attribute('packetBurst', 'ns3::Ptr< ns3::PacketBurst >', is_const=False)
     return
 
 def register_Ns3LteSpectrumSignalParametersDataFrame_methods(root_module, cls):
+    ## lte-spectrum-signal-parameters.h (module 'lte'): ns3::LteSpectrumSignalParametersDataFrame::LteSpectrumSignalParametersDataFrame() [constructor]
+    cls.add_constructor([])
+    ## lte-spectrum-signal-parameters.h (module 'lte'): ns3::LteSpectrumSignalParametersDataFrame::LteSpectrumSignalParametersDataFrame(ns3::LteSpectrumSignalParametersDataFrame const & p) [constructor]
+    cls.add_constructor([param('ns3::LteSpectrumSignalParametersDataFrame const &', 'p')])
     ## lte-spectrum-signal-parameters.h (module 'lte'): ns3::Ptr<ns3::SpectrumSignalParameters> ns3::LteSpectrumSignalParametersDataFrame::Copy() [member function]
     cls.add_method('Copy', 
                    'ns3::Ptr< ns3::SpectrumSignalParameters >', 
                    [], 
                    is_virtual=True)
-    ## lte-spectrum-signal-parameters.h (module 'lte'): ns3::LteSpectrumSignalParametersDataFrame::LteSpectrumSignalParametersDataFrame() [constructor]
-    cls.add_constructor([])
-    ## lte-spectrum-signal-parameters.h (module 'lte'): ns3::LteSpectrumSignalParametersDataFrame::LteSpectrumSignalParametersDataFrame(ns3::LteSpectrumSignalParametersDataFrame const & p) [constructor]
-    cls.add_constructor([param('ns3::LteSpectrumSignalParametersDataFrame const &', 'p')])
-    ## lte-spectrum-signal-parameters.h (module 'lte'): ns3::LteSpectrumSignalParametersDataFrame::packetBurst [variable]
-    cls.add_instance_attribute('packetBurst', 'ns3::Ptr< ns3::PacketBurst >', is_const=False)
-    ## lte-spectrum-signal-parameters.h (module 'lte'): ns3::LteSpectrumSignalParametersDataFrame::ctrlMsgList [variable]
-    cls.add_instance_attribute('ctrlMsgList', 'std::list< ns3::Ptr< ns3::LteControlMessage > >', is_const=False)
     ## lte-spectrum-signal-parameters.h (module 'lte'): ns3::LteSpectrumSignalParametersDataFrame::cellId [variable]
     cls.add_instance_attribute('cellId', 'uint16_t', is_const=False)
+    ## lte-spectrum-signal-parameters.h (module 'lte'): ns3::LteSpectrumSignalParametersDataFrame::ctrlMsgList [variable]
+    cls.add_instance_attribute('ctrlMsgList', 'std::list< ns3::Ptr< ns3::LteControlMessage > >', is_const=False)
+    ## lte-spectrum-signal-parameters.h (module 'lte'): ns3::LteSpectrumSignalParametersDataFrame::packetBurst [variable]
+    cls.add_instance_attribute('packetBurst', 'ns3::Ptr< ns3::PacketBurst >', is_const=False)
     return
 
 def register_Ns3LteSpectrumSignalParametersDlCtrlFrame_methods(root_module, cls):
+    ## lte-spectrum-signal-parameters.h (module 'lte'): ns3::LteSpectrumSignalParametersDlCtrlFrame::LteSpectrumSignalParametersDlCtrlFrame() [constructor]
+    cls.add_constructor([])
+    ## lte-spectrum-signal-parameters.h (module 'lte'): ns3::LteSpectrumSignalParametersDlCtrlFrame::LteSpectrumSignalParametersDlCtrlFrame(ns3::LteSpectrumSignalParametersDlCtrlFrame const & p) [constructor]
+    cls.add_constructor([param('ns3::LteSpectrumSignalParametersDlCtrlFrame const &', 'p')])
     ## lte-spectrum-signal-parameters.h (module 'lte'): ns3::Ptr<ns3::SpectrumSignalParameters> ns3::LteSpectrumSignalParametersDlCtrlFrame::Copy() [member function]
     cls.add_method('Copy', 
                    'ns3::Ptr< ns3::SpectrumSignalParameters >', 
                    [], 
                    is_virtual=True)
-    ## lte-spectrum-signal-parameters.h (module 'lte'): ns3::LteSpectrumSignalParametersDlCtrlFrame::LteSpectrumSignalParametersDlCtrlFrame() [constructor]
-    cls.add_constructor([])
-    ## lte-spectrum-signal-parameters.h (module 'lte'): ns3::LteSpectrumSignalParametersDlCtrlFrame::LteSpectrumSignalParametersDlCtrlFrame(ns3::LteSpectrumSignalParametersDlCtrlFrame const & p) [constructor]
-    cls.add_constructor([param('ns3::LteSpectrumSignalParametersDlCtrlFrame const &', 'p')])
-    ## lte-spectrum-signal-parameters.h (module 'lte'): ns3::LteSpectrumSignalParametersDlCtrlFrame::ctrlMsgList [variable]
-    cls.add_instance_attribute('ctrlMsgList', 'std::list< ns3::Ptr< ns3::LteControlMessage > >', is_const=False)
     ## lte-spectrum-signal-parameters.h (module 'lte'): ns3::LteSpectrumSignalParametersDlCtrlFrame::cellId [variable]
     cls.add_instance_attribute('cellId', 'uint16_t', is_const=False)
+    ## lte-spectrum-signal-parameters.h (module 'lte'): ns3::LteSpectrumSignalParametersDlCtrlFrame::ctrlMsgList [variable]
+    cls.add_instance_attribute('ctrlMsgList', 'std::list< ns3::Ptr< ns3::LteControlMessage > >', is_const=False)
     ## lte-spectrum-signal-parameters.h (module 'lte'): ns3::LteSpectrumSignalParametersDlCtrlFrame::pss [variable]
     cls.add_instance_attribute('pss', 'bool', is_const=False)
     return
 
 def register_Ns3LteSpectrumSignalParametersUlSrsFrame_methods(root_module, cls):
+    ## lte-spectrum-signal-parameters.h (module 'lte'): ns3::LteSpectrumSignalParametersUlSrsFrame::LteSpectrumSignalParametersUlSrsFrame() [constructor]
+    cls.add_constructor([])
+    ## lte-spectrum-signal-parameters.h (module 'lte'): ns3::LteSpectrumSignalParametersUlSrsFrame::LteSpectrumSignalParametersUlSrsFrame(ns3::LteSpectrumSignalParametersUlSrsFrame const & p) [constructor]
+    cls.add_constructor([param('ns3::LteSpectrumSignalParametersUlSrsFrame const &', 'p')])
     ## lte-spectrum-signal-parameters.h (module 'lte'): ns3::Ptr<ns3::SpectrumSignalParameters> ns3::LteSpectrumSignalParametersUlSrsFrame::Copy() [member function]
     cls.add_method('Copy', 
                    'ns3::Ptr< ns3::SpectrumSignalParameters >', 
                    [], 
                    is_virtual=True)
-    ## lte-spectrum-signal-parameters.h (module 'lte'): ns3::LteSpectrumSignalParametersUlSrsFrame::LteSpectrumSignalParametersUlSrsFrame() [constructor]
-    cls.add_constructor([])
-    ## lte-spectrum-signal-parameters.h (module 'lte'): ns3::LteSpectrumSignalParametersUlSrsFrame::LteSpectrumSignalParametersUlSrsFrame(ns3::LteSpectrumSignalParametersUlSrsFrame const & p) [constructor]
-    cls.add_constructor([param('ns3::LteSpectrumSignalParametersUlSrsFrame const &', 'p')])
     ## lte-spectrum-signal-parameters.h (module 'lte'): ns3::LteSpectrumSignalParametersUlSrsFrame::cellId [variable]
     cls.add_instance_attribute('cellId', 'uint16_t', is_const=False)
     return
@@ -21092,11 +21274,11 @@
                    'ns3::LteUePhy::State', 
                    [], 
                    is_const=True)
-    ## lte-ue-phy.h (module 'lte'): std::vector<int, std::allocator<int> > ns3::LteUePhy::GetSubChannelsForReception() [member function]
+    ## lte-ue-phy.h (module 'lte'): std::vector<int, std::allocator<int>> ns3::LteUePhy::GetSubChannelsForReception() [member function]
     cls.add_method('GetSubChannelsForReception', 
                    'std::vector< int >', 
                    [])
-    ## lte-ue-phy.h (module 'lte'): std::vector<int, std::allocator<int> > ns3::LteUePhy::GetSubChannelsForTransmission() [member function]
+    ## lte-ue-phy.h (module 'lte'): std::vector<int, std::allocator<int>> ns3::LteUePhy::GetSubChannelsForTransmission() [member function]
     cls.add_method('GetSubChannelsForTransmission', 
                    'std::vector< int >', 
                    [])
@@ -21124,7 +21306,7 @@
     cls.add_method('PhyPduReceived', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet >', 'p')])
-    ## lte-ue-phy.h (module 'lte'): void ns3::LteUePhy::ReceiveLteControlMessageList(std::list<ns3::Ptr<ns3::LteControlMessage>, std::allocator<ns3::Ptr<ns3::LteControlMessage> > > msgList) [member function]
+    ## lte-ue-phy.h (module 'lte'): void ns3::LteUePhy::ReceiveLteControlMessageList(std::list<ns3::Ptr<ns3::LteControlMessage>, std::allocator<ns3::Ptr<ns3::LteControlMessage>>> msgList) [member function]
     cls.add_method('ReceiveLteControlMessageList', 
                    'void', 
                    [param('std::list< ns3::Ptr< ns3::LteControlMessage > >', 'msgList')], 
@@ -21169,11 +21351,11 @@
     cls.add_method('SetNoiseFigure', 
                    'void', 
                    [param('double', 'nf')])
-    ## lte-ue-phy.h (module 'lte'): void ns3::LteUePhy::SetSubChannelsForReception(std::vector<int, std::allocator<int> > mask) [member function]
+    ## lte-ue-phy.h (module 'lte'): void ns3::LteUePhy::SetSubChannelsForReception(std::vector<int, std::allocator<int>> mask) [member function]
     cls.add_method('SetSubChannelsForReception', 
                    'void', 
                    [param('std::vector< int >', 'mask')])
-    ## lte-ue-phy.h (module 'lte'): void ns3::LteUePhy::SetSubChannelsForTransmission(std::vector<int, std::allocator<int> > mask) [member function]
+    ## lte-ue-phy.h (module 'lte'): void ns3::LteUePhy::SetSubChannelsForTransmission(std::vector<int, std::allocator<int>> mask) [member function]
     cls.add_method('SetSubChannelsForTransmission', 
                    'void', 
                    [param('std::vector< int >', 'mask')])
@@ -21242,15 +21424,15 @@
     cls.add_method('GetPcmax', 
                    'double', 
                    [])
-    ## lte-ue-power-control.h (module 'lte'): double ns3::LteUePowerControl::GetPucchTxPower(std::vector<int, std::allocator<int> > rb) [member function]
+    ## lte-ue-power-control.h (module 'lte'): double ns3::LteUePowerControl::GetPucchTxPower(std::vector<int, std::allocator<int>> rb) [member function]
     cls.add_method('GetPucchTxPower', 
                    'double', 
                    [param('std::vector< int >', 'rb')])
-    ## lte-ue-power-control.h (module 'lte'): double ns3::LteUePowerControl::GetPuschTxPower(std::vector<int, std::allocator<int> > rb) [member function]
+    ## lte-ue-power-control.h (module 'lte'): double ns3::LteUePowerControl::GetPuschTxPower(std::vector<int, std::allocator<int>> rb) [member function]
     cls.add_method('GetPuschTxPower', 
                    'double', 
                    [param('std::vector< int >', 'rb')])
-    ## lte-ue-power-control.h (module 'lte'): double ns3::LteUePowerControl::GetSrsTxPower(std::vector<int, std::allocator<int> > rb) [member function]
+    ## lte-ue-power-control.h (module 'lte'): double ns3::LteUePowerControl::GetSrsTxPower(std::vector<int, std::allocator<int>> rb) [member function]
     cls.add_method('GetSrsTxPower', 
                    'double', 
                    [param('std::vector< int >', 'rb')])
@@ -21388,6 +21570,11 @@
     cls.add_method('InitializeSap', 
                    'void', 
                    [])
+    ## lte-ue-rrc.h (module 'lte'): bool ns3::LteUeRrc::IsServingCell(uint16_t cellId) const [member function]
+    cls.add_method('IsServingCell', 
+                   'bool', 
+                   [param('uint16_t', 'cellId')], 
+                   is_const=True)
     ## lte-ue-rrc.h (module 'lte'): void ns3::LteUeRrc::SetAsSapUser(ns3::LteAsSapUser * s) [member function]
     cls.add_method('SetAsSapUser', 
                    'void', 
@@ -21432,6 +21619,11 @@
     cls.add_method('StorePreviousCellId', 
                    'void', 
                    [param('uint16_t', 'cellId')])
+    ## lte-ue-rrc.h (module 'lte'): static std::string const ns3::LteUeRrc::ToString(ns3::LteUeRrc::State s) [member function]
+    cls.add_method('ToString', 
+                   'std::string const', 
+                   [param('ns3::LteUeRrc::State', 's')], 
+                   is_static=True)
     ## lte-ue-rrc.h (module 'lte'): ns3::LteUeRrc::m_numberOfComponentCarriers [variable]
     cls.add_instance_attribute('m_numberOfComponentCarriers', 'uint16_t', is_const=False)
     ## lte-ue-rrc.h (module 'lte'): void ns3::LteUeRrc::DoDispose() [member function]
@@ -21585,28 +21777,17 @@
     return
 
 def register_Ns3MacStatsCalculator_methods(root_module, cls):
-    ## mac-stats-calculator.h (module 'lte'): ns3::MacStatsCalculator::MacStatsCalculator(ns3::MacStatsCalculator const & arg0) [constructor]
-    cls.add_constructor([param('ns3::MacStatsCalculator const &', 'arg0')])
     ## mac-stats-calculator.h (module 'lte'): ns3::MacStatsCalculator::MacStatsCalculator() [constructor]
     cls.add_constructor([])
-    ## mac-stats-calculator.h (module 'lte'): void ns3::MacStatsCalculator::DlScheduling(uint16_t cellId, uint64_t imsi, ns3::DlSchedulingCallbackInfo dlSchedulingCallbackInfo) [member function]
-    cls.add_method('DlScheduling', 
-                   'void', 
-                   [param('uint16_t', 'cellId'), param('uint64_t', 'imsi'), param('ns3::DlSchedulingCallbackInfo', 'dlSchedulingCallbackInfo')])
-    ## mac-stats-calculator.h (module 'lte'): static void ns3::MacStatsCalculator::DlSchedulingCallback(ns3::Ptr<ns3::MacStatsCalculator> macStats, std::string path, ns3::DlSchedulingCallbackInfo dlSchedulingCallbackInfo) [member function]
-    cls.add_method('DlSchedulingCallback', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::MacStatsCalculator >', 'macStats'), param('std::string', 'path'), param('ns3::DlSchedulingCallbackInfo', 'dlSchedulingCallbackInfo')], 
-                   is_static=True)
-    ## mac-stats-calculator.h (module 'lte'): std::string ns3::MacStatsCalculator::GetDlOutputFilename() [member function]
-    cls.add_method('GetDlOutputFilename', 
-                   'std::string', 
-                   [])
     ## mac-stats-calculator.h (module 'lte'): static ns3::TypeId ns3::MacStatsCalculator::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## mac-stats-calculator.h (module 'lte'): void ns3::MacStatsCalculator::SetUlOutputFilename(std::string outputFilename) [member function]
+    cls.add_method('SetUlOutputFilename', 
+                   'void', 
+                   [param('std::string', 'outputFilename')])
     ## mac-stats-calculator.h (module 'lte'): std::string ns3::MacStatsCalculator::GetUlOutputFilename() [member function]
     cls.add_method('GetUlOutputFilename', 
                    'std::string', 
@@ -21615,14 +21796,23 @@
     cls.add_method('SetDlOutputFilename', 
                    'void', 
                    [param('std::string', 'outputFilename')])
-    ## mac-stats-calculator.h (module 'lte'): void ns3::MacStatsCalculator::SetUlOutputFilename(std::string outputFilename) [member function]
-    cls.add_method('SetUlOutputFilename', 
+    ## mac-stats-calculator.h (module 'lte'): std::string ns3::MacStatsCalculator::GetDlOutputFilename() [member function]
+    cls.add_method('GetDlOutputFilename', 
+                   'std::string', 
+                   [])
+    ## mac-stats-calculator.h (module 'lte'): void ns3::MacStatsCalculator::DlScheduling(uint16_t cellId, uint64_t imsi, ns3::DlSchedulingCallbackInfo dlSchedulingCallbackInfo) [member function]
+    cls.add_method('DlScheduling', 
                    'void', 
-                   [param('std::string', 'outputFilename')])
+                   [param('uint16_t', 'cellId'), param('uint64_t', 'imsi'), param('ns3::DlSchedulingCallbackInfo', 'dlSchedulingCallbackInfo')])
     ## mac-stats-calculator.h (module 'lte'): void ns3::MacStatsCalculator::UlScheduling(uint16_t cellId, uint64_t imsi, uint32_t frameNo, uint32_t subframeNo, uint16_t rnti, uint8_t mcsTb, uint16_t sizeTb, uint8_t componentCarrierId) [member function]
     cls.add_method('UlScheduling', 
                    'void', 
                    [param('uint16_t', 'cellId'), param('uint64_t', 'imsi'), param('uint32_t', 'frameNo'), param('uint32_t', 'subframeNo'), param('uint16_t', 'rnti'), param('uint8_t', 'mcsTb'), param('uint16_t', 'sizeTb'), param('uint8_t', 'componentCarrierId')])
+    ## mac-stats-calculator.h (module 'lte'): static void ns3::MacStatsCalculator::DlSchedulingCallback(ns3::Ptr<ns3::MacStatsCalculator> macStats, std::string path, ns3::DlSchedulingCallbackInfo dlSchedulingCallbackInfo) [member function]
+    cls.add_method('DlSchedulingCallback', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::MacStatsCalculator >', 'macStats'), param('std::string', 'path'), param('ns3::DlSchedulingCallbackInfo', 'dlSchedulingCallbackInfo')], 
+                   is_static=True)
     ## mac-stats-calculator.h (module 'lte'): static void ns3::MacStatsCalculator::UlSchedulingCallback(ns3::Ptr<ns3::MacStatsCalculator> macStats, std::string path, uint32_t frameNo, uint32_t subframeNo, uint16_t rnti, uint8_t mcs, uint16_t size, uint8_t componentCarrierId) [member function]
     cls.add_method('UlSchedulingCallback', 
                    'void', 
@@ -22069,10 +22259,16 @@
     cls.add_method('ExtractNeighborIndex', 
                    'uint32_t', 
                    [param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetEpoch() const [member function]
+    cls.add_method('GetEpoch', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() const [member function]
     cls.add_method('GetRemainingBits', 
                    'uint32_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -22083,6 +22279,10 @@
                    'uint32_t', 
                    [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
+    ## nix-vector.h (module 'network'): void ns3::NixVector::SetEpoch(uint32_t epoch) [member function]
+    cls.add_method('SetEpoch', 
+                   'void', 
+                   [param('uint32_t', 'epoch')])
     return
 
 def register_Ns3NoBackhaulEpcHelper_methods(root_module, cls):
@@ -22095,15 +22295,15 @@
                    'uint8_t', 
                    [param('ns3::Ptr< ns3::NetDevice >', 'ueLteDevice'), param('uint64_t', 'imsi'), param('ns3::Ptr< ns3::EpcTft >', 'tft'), param('ns3::EpsBearer', 'bearer')], 
                    is_virtual=True)
-    ## no-backhaul-epc-helper.h (module 'lte'): void ns3::NoBackhaulEpcHelper::AddEnb(ns3::Ptr<ns3::Node> enbNode, ns3::Ptr<ns3::NetDevice> lteEnbNetDevice, uint16_t cellId) [member function]
+    ## no-backhaul-epc-helper.h (module 'lte'): void ns3::NoBackhaulEpcHelper::AddEnb(ns3::Ptr<ns3::Node> enbNode, ns3::Ptr<ns3::NetDevice> lteEnbNetDevice, std::vector<unsigned short, std::allocator<unsigned short>> cellIds) [member function]
     cls.add_method('AddEnb', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Node >', 'enbNode'), param('ns3::Ptr< ns3::NetDevice >', 'lteEnbNetDevice'), param('uint16_t', 'cellId')], 
+                   [param('ns3::Ptr< ns3::Node >', 'enbNode'), param('ns3::Ptr< ns3::NetDevice >', 'lteEnbNetDevice'), param('std::vector< unsigned short >', 'cellIds')], 
                    is_virtual=True)
-    ## no-backhaul-epc-helper.h (module 'lte'): void ns3::NoBackhaulEpcHelper::AddS1Interface(ns3::Ptr<ns3::Node> enb, ns3::Ipv4Address enbAddress, ns3::Ipv4Address sgwAddress, uint16_t cellId=0) [member function]
+    ## no-backhaul-epc-helper.h (module 'lte'): void ns3::NoBackhaulEpcHelper::AddS1Interface(ns3::Ptr<ns3::Node> enb, ns3::Ipv4Address enbAddress, ns3::Ipv4Address sgwAddress, std::vector<unsigned short, std::allocator<unsigned short>> cellIds) [member function]
     cls.add_method('AddS1Interface', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Node >', 'enb'), param('ns3::Ipv4Address', 'enbAddress'), param('ns3::Ipv4Address', 'sgwAddress'), param('uint16_t', 'cellId', default_value='0')], 
+                   [param('ns3::Ptr< ns3::Node >', 'enb'), param('ns3::Ipv4Address', 'enbAddress'), param('ns3::Ipv4Address', 'sgwAddress'), param('std::vector< unsigned short >', 'cellIds')], 
                    is_virtual=True)
     ## no-backhaul-epc-helper.h (module 'lte'): void ns3::NoBackhaulEpcHelper::AddUe(ns3::Ptr<ns3::NetDevice> ueLteDevice, uint64_t imsi) [member function]
     cls.add_method('AddUe', 
@@ -22227,7 +22427,7 @@
                    'void', 
                    [param('ns3::LteMacSapUser::ReceivePduParameters', 'rxPduParams')], 
                    is_virtual=True, visibility='protected')
-    ## no-op-component-carrier-manager.h (module 'lte'): std::vector<unsigned char, std::allocator<unsigned char> > ns3::NoOpComponentCarrierManager::DoReleaseDataRadioBearer(uint16_t rnti, uint8_t lcid) [member function]
+    ## no-op-component-carrier-manager.h (module 'lte'): std::vector<unsigned char, std::allocator<unsigned char>> ns3::NoOpComponentCarrierManager::DoReleaseDataRadioBearer(uint16_t rnti, uint8_t lcid) [member function]
     cls.add_method('DoReleaseDataRadioBearer', 
                    'std::vector< unsigned char >', 
                    [param('uint16_t', 'rnti'), param('uint8_t', 'lcid')], 
@@ -22247,7 +22447,7 @@
                    'void', 
                    [param('uint16_t', 'rnti'), param('ns3::LteRrcSap::MeasResults', 'measResults')], 
                    is_virtual=True, visibility='protected')
-    ## no-op-component-carrier-manager.h (module 'lte'): std::vector<ns3::LteCcmRrcSapProvider::LcsConfig, std::allocator<ns3::LteCcmRrcSapProvider::LcsConfig> > ns3::NoOpComponentCarrierManager::DoSetupDataRadioBearer(ns3::EpsBearer bearer, uint8_t bearerId, uint16_t rnti, uint8_t lcid, uint8_t lcGroup, ns3::LteMacSapUser * msu) [member function]
+    ## no-op-component-carrier-manager.h (module 'lte'): std::vector<ns3::LteCcmRrcSapProvider::LcsConfig, std::allocator<ns3::LteCcmRrcSapProvider::LcsConfig>> ns3::NoOpComponentCarrierManager::DoSetupDataRadioBearer(ns3::EpsBearer bearer, uint8_t bearerId, uint16_t rnti, uint8_t lcid, uint8_t lcGroup, ns3::LteMacSapUser * msu) [member function]
     cls.add_method('DoSetupDataRadioBearer', 
                    'std::vector< ns3::LteCcmRrcSapProvider::LcsConfig >', 
                    [param('ns3::EpsBearer', 'bearer'), param('uint8_t', 'bearerId'), param('uint16_t', 'rnti'), param('uint8_t', 'lcid'), param('uint8_t', 'lcGroup'), param('ns3::LteMacSapUser *', 'msu')], 
@@ -22667,10 +22867,11 @@
                    'uint32_t', 
                    [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) const [member function]
     cls.add_method('SetNixVector', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')], 
+                   is_const=True)
     ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
     cls.add_method('ToString', 
                    'std::string', 
@@ -22773,28 +22974,17 @@
     return
 
 def register_Ns3PhyRxStatsCalculator_methods(root_module, cls):
-    ## phy-rx-stats-calculator.h (module 'lte'): ns3::PhyRxStatsCalculator::PhyRxStatsCalculator(ns3::PhyRxStatsCalculator const & arg0) [constructor]
-    cls.add_constructor([param('ns3::PhyRxStatsCalculator const &', 'arg0')])
     ## phy-rx-stats-calculator.h (module 'lte'): ns3::PhyRxStatsCalculator::PhyRxStatsCalculator() [constructor]
     cls.add_constructor([])
-    ## phy-rx-stats-calculator.h (module 'lte'): void ns3::PhyRxStatsCalculator::DlPhyReception(ns3::PhyReceptionStatParameters params) [member function]
-    cls.add_method('DlPhyReception', 
-                   'void', 
-                   [param('ns3::PhyReceptionStatParameters', 'params')])
-    ## phy-rx-stats-calculator.h (module 'lte'): static void ns3::PhyRxStatsCalculator::DlPhyReceptionCallback(ns3::Ptr<ns3::PhyRxStatsCalculator> phyRxStats, std::string path, ns3::PhyReceptionStatParameters params) [member function]
-    cls.add_method('DlPhyReceptionCallback', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::PhyRxStatsCalculator >', 'phyRxStats'), param('std::string', 'path'), param('ns3::PhyReceptionStatParameters', 'params')], 
-                   is_static=True)
-    ## phy-rx-stats-calculator.h (module 'lte'): std::string ns3::PhyRxStatsCalculator::GetDlRxOutputFilename() [member function]
-    cls.add_method('GetDlRxOutputFilename', 
-                   'std::string', 
-                   [])
     ## phy-rx-stats-calculator.h (module 'lte'): static ns3::TypeId ns3::PhyRxStatsCalculator::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## phy-rx-stats-calculator.h (module 'lte'): void ns3::PhyRxStatsCalculator::SetUlRxOutputFilename(std::string outputFilename) [member function]
+    cls.add_method('SetUlRxOutputFilename', 
+                   'void', 
+                   [param('std::string', 'outputFilename')])
     ## phy-rx-stats-calculator.h (module 'lte'): std::string ns3::PhyRxStatsCalculator::GetUlRxOutputFilename() [member function]
     cls.add_method('GetUlRxOutputFilename', 
                    'std::string', 
@@ -22803,14 +22993,23 @@
     cls.add_method('SetDlRxOutputFilename', 
                    'void', 
                    [param('std::string', 'outputFilename')])
-    ## phy-rx-stats-calculator.h (module 'lte'): void ns3::PhyRxStatsCalculator::SetUlRxOutputFilename(std::string outputFilename) [member function]
-    cls.add_method('SetUlRxOutputFilename', 
+    ## phy-rx-stats-calculator.h (module 'lte'): std::string ns3::PhyRxStatsCalculator::GetDlRxOutputFilename() [member function]
+    cls.add_method('GetDlRxOutputFilename', 
+                   'std::string', 
+                   [])
+    ## phy-rx-stats-calculator.h (module 'lte'): void ns3::PhyRxStatsCalculator::DlPhyReception(ns3::PhyReceptionStatParameters params) [member function]
+    cls.add_method('DlPhyReception', 
                    'void', 
-                   [param('std::string', 'outputFilename')])
+                   [param('ns3::PhyReceptionStatParameters', 'params')])
     ## phy-rx-stats-calculator.h (module 'lte'): void ns3::PhyRxStatsCalculator::UlPhyReception(ns3::PhyReceptionStatParameters params) [member function]
     cls.add_method('UlPhyReception', 
                    'void', 
                    [param('ns3::PhyReceptionStatParameters', 'params')])
+    ## phy-rx-stats-calculator.h (module 'lte'): static void ns3::PhyRxStatsCalculator::DlPhyReceptionCallback(ns3::Ptr<ns3::PhyRxStatsCalculator> phyRxStats, std::string path, ns3::PhyReceptionStatParameters params) [member function]
+    cls.add_method('DlPhyReceptionCallback', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::PhyRxStatsCalculator >', 'phyRxStats'), param('std::string', 'path'), param('ns3::PhyReceptionStatParameters', 'params')], 
+                   is_static=True)
     ## phy-rx-stats-calculator.h (module 'lte'): static void ns3::PhyRxStatsCalculator::UlPhyReceptionCallback(ns3::Ptr<ns3::PhyRxStatsCalculator> phyRxStats, std::string path, ns3::PhyReceptionStatParameters params) [member function]
     cls.add_method('UlPhyReceptionCallback', 
                    'void', 
@@ -22819,91 +23018,78 @@
     return
 
 def register_Ns3PhyStatsCalculator_methods(root_module, cls):
-    ## phy-stats-calculator.h (module 'lte'): ns3::PhyStatsCalculator::PhyStatsCalculator(ns3::PhyStatsCalculator const & arg0) [constructor]
-    cls.add_constructor([param('ns3::PhyStatsCalculator const &', 'arg0')])
     ## phy-stats-calculator.h (module 'lte'): ns3::PhyStatsCalculator::PhyStatsCalculator() [constructor]
     cls.add_constructor([])
-    ## phy-stats-calculator.h (module 'lte'): std::string ns3::PhyStatsCalculator::GetCurrentCellRsrpSinrFilename() [member function]
-    cls.add_method('GetCurrentCellRsrpSinrFilename', 
-                   'std::string', 
-                   [])
-    ## phy-stats-calculator.h (module 'lte'): std::string ns3::PhyStatsCalculator::GetInterferenceFilename() [member function]
-    cls.add_method('GetInterferenceFilename', 
-                   'std::string', 
-                   [])
     ## phy-stats-calculator.h (module 'lte'): static ns3::TypeId ns3::PhyStatsCalculator::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## phy-stats-calculator.h (module 'lte'): void ns3::PhyStatsCalculator::SetCurrentCellRsrpSinrFilename(std::string filename) [member function]
+    cls.add_method('SetCurrentCellRsrpSinrFilename', 
+                   'void', 
+                   [param('std::string', 'filename')])
+    ## phy-stats-calculator.h (module 'lte'): std::string ns3::PhyStatsCalculator::GetCurrentCellRsrpSinrFilename() [member function]
+    cls.add_method('GetCurrentCellRsrpSinrFilename', 
+                   'std::string', 
+                   [])
+    ## phy-stats-calculator.h (module 'lte'): void ns3::PhyStatsCalculator::SetUeSinrFilename(std::string filename) [member function]
+    cls.add_method('SetUeSinrFilename', 
+                   'void', 
+                   [param('std::string', 'filename')])
     ## phy-stats-calculator.h (module 'lte'): std::string ns3::PhyStatsCalculator::GetUeSinrFilename() [member function]
     cls.add_method('GetUeSinrFilename', 
                    'std::string', 
                    [])
+    ## phy-stats-calculator.h (module 'lte'): void ns3::PhyStatsCalculator::SetInterferenceFilename(std::string filename) [member function]
+    cls.add_method('SetInterferenceFilename', 
+                   'void', 
+                   [param('std::string', 'filename')])
+    ## phy-stats-calculator.h (module 'lte'): std::string ns3::PhyStatsCalculator::GetInterferenceFilename() [member function]
+    cls.add_method('GetInterferenceFilename', 
+                   'std::string', 
+                   [])
     ## phy-stats-calculator.h (module 'lte'): void ns3::PhyStatsCalculator::ReportCurrentCellRsrpSinr(uint16_t cellId, uint64_t imsi, uint16_t rnti, double rsrp, double sinr, uint8_t componentCarrierId) [member function]
     cls.add_method('ReportCurrentCellRsrpSinr', 
                    'void', 
                    [param('uint16_t', 'cellId'), param('uint64_t', 'imsi'), param('uint16_t', 'rnti'), param('double', 'rsrp'), param('double', 'sinr'), param('uint8_t', 'componentCarrierId')])
-    ## phy-stats-calculator.h (module 'lte'): static void ns3::PhyStatsCalculator::ReportCurrentCellRsrpSinrCallback(ns3::Ptr<ns3::PhyStatsCalculator> phyStats, std::string path, uint16_t cellId, uint16_t rnti, double rsrp, double sinr, uint8_t componentCarrierId) [member function]
-    cls.add_method('ReportCurrentCellRsrpSinrCallback', 
+    ## phy-stats-calculator.h (module 'lte'): void ns3::PhyStatsCalculator::ReportUeSinr(uint16_t cellId, uint64_t imsi, uint16_t rnti, double sinrLinear, uint8_t componentCarrierId) [member function]
+    cls.add_method('ReportUeSinr', 
                    'void', 
-                   [param('ns3::Ptr< ns3::PhyStatsCalculator >', 'phyStats'), param('std::string', 'path'), param('uint16_t', 'cellId'), param('uint16_t', 'rnti'), param('double', 'rsrp'), param('double', 'sinr'), param('uint8_t', 'componentCarrierId')], 
-                   is_static=True)
+                   [param('uint16_t', 'cellId'), param('uint64_t', 'imsi'), param('uint16_t', 'rnti'), param('double', 'sinrLinear'), param('uint8_t', 'componentCarrierId')])
     ## phy-stats-calculator.h (module 'lte'): void ns3::PhyStatsCalculator::ReportInterference(uint16_t cellId, ns3::Ptr<ns3::SpectrumValue> interference) [member function]
     cls.add_method('ReportInterference', 
                    'void', 
                    [param('uint16_t', 'cellId'), param('ns3::Ptr< ns3::SpectrumValue >', 'interference')])
-    ## phy-stats-calculator.h (module 'lte'): static void ns3::PhyStatsCalculator::ReportInterference(ns3::Ptr<ns3::PhyStatsCalculator> phyStats, std::string path, uint16_t cellId, ns3::Ptr<ns3::SpectrumValue> interference) [member function]
-    cls.add_method('ReportInterference', 
+    ## phy-stats-calculator.h (module 'lte'): static void ns3::PhyStatsCalculator::ReportCurrentCellRsrpSinrCallback(ns3::Ptr<ns3::PhyStatsCalculator> phyStats, std::string path, uint16_t cellId, uint16_t rnti, double rsrp, double sinr, uint8_t componentCarrierId) [member function]
+    cls.add_method('ReportCurrentCellRsrpSinrCallback', 
                    'void', 
-                   [param('ns3::Ptr< ns3::PhyStatsCalculator >', 'phyStats'), param('std::string', 'path'), param('uint16_t', 'cellId'), param('ns3::Ptr< ns3::SpectrumValue >', 'interference')], 
+                   [param('ns3::Ptr< ns3::PhyStatsCalculator >', 'phyStats'), param('std::string', 'path'), param('uint16_t', 'cellId'), param('uint16_t', 'rnti'), param('double', 'rsrp'), param('double', 'sinr'), param('uint8_t', 'componentCarrierId')], 
                    is_static=True)
-    ## phy-stats-calculator.h (module 'lte'): void ns3::PhyStatsCalculator::ReportUeSinr(uint16_t cellId, uint64_t imsi, uint16_t rnti, double sinrLinear, uint8_t componentCarrierId) [member function]
-    cls.add_method('ReportUeSinr', 
-                   'void', 
-                   [param('uint16_t', 'cellId'), param('uint64_t', 'imsi'), param('uint16_t', 'rnti'), param('double', 'sinrLinear'), param('uint8_t', 'componentCarrierId')])
     ## phy-stats-calculator.h (module 'lte'): static void ns3::PhyStatsCalculator::ReportUeSinr(ns3::Ptr<ns3::PhyStatsCalculator> phyStats, std::string path, uint16_t cellId, uint16_t rnti, double sinrLinear, uint8_t componentCarrierId) [member function]
     cls.add_method('ReportUeSinr', 
                    'void', 
                    [param('ns3::Ptr< ns3::PhyStatsCalculator >', 'phyStats'), param('std::string', 'path'), param('uint16_t', 'cellId'), param('uint16_t', 'rnti'), param('double', 'sinrLinear'), param('uint8_t', 'componentCarrierId')], 
                    is_static=True)
-    ## phy-stats-calculator.h (module 'lte'): void ns3::PhyStatsCalculator::SetCurrentCellRsrpSinrFilename(std::string filename) [member function]
-    cls.add_method('SetCurrentCellRsrpSinrFilename', 
-                   'void', 
-                   [param('std::string', 'filename')])
-    ## phy-stats-calculator.h (module 'lte'): void ns3::PhyStatsCalculator::SetInterferenceFilename(std::string filename) [member function]
-    cls.add_method('SetInterferenceFilename', 
-                   'void', 
-                   [param('std::string', 'filename')])
-    ## phy-stats-calculator.h (module 'lte'): void ns3::PhyStatsCalculator::SetUeSinrFilename(std::string filename) [member function]
-    cls.add_method('SetUeSinrFilename', 
+    ## phy-stats-calculator.h (module 'lte'): static void ns3::PhyStatsCalculator::ReportInterference(ns3::Ptr<ns3::PhyStatsCalculator> phyStats, std::string path, uint16_t cellId, ns3::Ptr<ns3::SpectrumValue> interference) [member function]
+    cls.add_method('ReportInterference', 
                    'void', 
-                   [param('std::string', 'filename')])
+                   [param('ns3::Ptr< ns3::PhyStatsCalculator >', 'phyStats'), param('std::string', 'path'), param('uint16_t', 'cellId'), param('ns3::Ptr< ns3::SpectrumValue >', 'interference')], 
+                   is_static=True)
     return
 
 def register_Ns3PhyTxStatsCalculator_methods(root_module, cls):
-    ## phy-tx-stats-calculator.h (module 'lte'): ns3::PhyTxStatsCalculator::PhyTxStatsCalculator(ns3::PhyTxStatsCalculator const & arg0) [constructor]
-    cls.add_constructor([param('ns3::PhyTxStatsCalculator const &', 'arg0')])
     ## phy-tx-stats-calculator.h (module 'lte'): ns3::PhyTxStatsCalculator::PhyTxStatsCalculator() [constructor]
     cls.add_constructor([])
-    ## phy-tx-stats-calculator.h (module 'lte'): void ns3::PhyTxStatsCalculator::DlPhyTransmission(ns3::PhyTransmissionStatParameters params) [member function]
-    cls.add_method('DlPhyTransmission', 
-                   'void', 
-                   [param('ns3::PhyTransmissionStatParameters', 'params')])
-    ## phy-tx-stats-calculator.h (module 'lte'): static void ns3::PhyTxStatsCalculator::DlPhyTransmissionCallback(ns3::Ptr<ns3::PhyTxStatsCalculator> phyTxStats, std::string path, ns3::PhyTransmissionStatParameters params) [member function]
-    cls.add_method('DlPhyTransmissionCallback', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::PhyTxStatsCalculator >', 'phyTxStats'), param('std::string', 'path'), param('ns3::PhyTransmissionStatParameters', 'params')], 
-                   is_static=True)
-    ## phy-tx-stats-calculator.h (module 'lte'): std::string ns3::PhyTxStatsCalculator::GetDlTxOutputFilename() [member function]
-    cls.add_method('GetDlTxOutputFilename', 
-                   'std::string', 
-                   [])
     ## phy-tx-stats-calculator.h (module 'lte'): static ns3::TypeId ns3::PhyTxStatsCalculator::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## phy-tx-stats-calculator.h (module 'lte'): void ns3::PhyTxStatsCalculator::SetUlTxOutputFilename(std::string outputFilename) [member function]
+    cls.add_method('SetUlTxOutputFilename', 
+                   'void', 
+                   [param('std::string', 'outputFilename')])
     ## phy-tx-stats-calculator.h (module 'lte'): std::string ns3::PhyTxStatsCalculator::GetUlTxOutputFilename() [member function]
     cls.add_method('GetUlTxOutputFilename', 
                    'std::string', 
@@ -22912,14 +23098,23 @@
     cls.add_method('SetDlTxOutputFilename', 
                    'void', 
                    [param('std::string', 'outputFilename')])
-    ## phy-tx-stats-calculator.h (module 'lte'): void ns3::PhyTxStatsCalculator::SetUlTxOutputFilename(std::string outputFilename) [member function]
-    cls.add_method('SetUlTxOutputFilename', 
+    ## phy-tx-stats-calculator.h (module 'lte'): std::string ns3::PhyTxStatsCalculator::GetDlTxOutputFilename() [member function]
+    cls.add_method('GetDlTxOutputFilename', 
+                   'std::string', 
+                   [])
+    ## phy-tx-stats-calculator.h (module 'lte'): void ns3::PhyTxStatsCalculator::DlPhyTransmission(ns3::PhyTransmissionStatParameters params) [member function]
+    cls.add_method('DlPhyTransmission', 
                    'void', 
-                   [param('std::string', 'outputFilename')])
+                   [param('ns3::PhyTransmissionStatParameters', 'params')])
     ## phy-tx-stats-calculator.h (module 'lte'): void ns3::PhyTxStatsCalculator::UlPhyTransmission(ns3::PhyTransmissionStatParameters params) [member function]
     cls.add_method('UlPhyTransmission', 
                    'void', 
                    [param('ns3::PhyTransmissionStatParameters', 'params')])
+    ## phy-tx-stats-calculator.h (module 'lte'): static void ns3::PhyTxStatsCalculator::DlPhyTransmissionCallback(ns3::Ptr<ns3::PhyTxStatsCalculator> phyTxStats, std::string path, ns3::PhyTransmissionStatParameters params) [member function]
+    cls.add_method('DlPhyTransmissionCallback', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::PhyTxStatsCalculator >', 'phyTxStats'), param('std::string', 'path'), param('ns3::PhyTransmissionStatParameters', 'params')], 
+                   is_static=True)
     ## phy-tx-stats-calculator.h (module 'lte'): static void ns3::PhyTxStatsCalculator::UlPhyTransmissionCallback(ns3::Ptr<ns3::PhyTxStatsCalculator> phyTxStats, std::string path, ns3::PhyTransmissionStatParameters params) [member function]
     cls.add_method('UlPhyTransmissionCallback', 
                    'void', 
@@ -22932,10 +23127,10 @@
     cls.add_constructor([param('ns3::PointToPointEpcHelper const &', 'arg0')])
     ## point-to-point-epc-helper.h (module 'lte'): ns3::PointToPointEpcHelper::PointToPointEpcHelper() [constructor]
     cls.add_constructor([])
-    ## point-to-point-epc-helper.h (module 'lte'): void ns3::PointToPointEpcHelper::AddEnb(ns3::Ptr<ns3::Node> enbNode, ns3::Ptr<ns3::NetDevice> lteEnbNetDevice, uint16_t cellId) [member function]
+    ## point-to-point-epc-helper.h (module 'lte'): void ns3::PointToPointEpcHelper::AddEnb(ns3::Ptr<ns3::Node> enbNode, ns3::Ptr<ns3::NetDevice> lteEnbNetDevice, std::vector<unsigned short, std::allocator<unsigned short>> cellIds) [member function]
     cls.add_method('AddEnb', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Node >', 'enbNode'), param('ns3::Ptr< ns3::NetDevice >', 'lteEnbNetDevice'), param('uint16_t', 'cellId')], 
+                   [param('ns3::Ptr< ns3::Node >', 'enbNode'), param('ns3::Ptr< ns3::NetDevice >', 'lteEnbNetDevice'), param('std::vector< unsigned short >', 'cellIds')], 
                    is_virtual=True)
     ## point-to-point-epc-helper.h (module 'lte'): void ns3::PointToPointEpcHelper::DoDispose() [member function]
     cls.add_method('DoDispose', 
@@ -23094,7 +23289,7 @@
     cls.add_method('GetDlDelay', 
                    'double', 
                    [param('uint64_t', 'imsi'), param('uint8_t', 'lcid')])
-    ## radio-bearer-stats-calculator.h (module 'lte'): std::vector<double, std::allocator<double> > ns3::RadioBearerStatsCalculator::GetDlDelayStats(uint64_t imsi, uint8_t lcid) [member function]
+    ## radio-bearer-stats-calculator.h (module 'lte'): std::vector<double, std::allocator<double>> ns3::RadioBearerStatsCalculator::GetDlDelayStats(uint64_t imsi, uint8_t lcid) [member function]
     cls.add_method('GetDlDelayStats', 
                    'std::vector< double >', 
                    [param('uint64_t', 'imsi'), param('uint8_t', 'lcid')])
@@ -23106,7 +23301,7 @@
     cls.add_method('GetDlPdcpOutputFilename', 
                    'std::string', 
                    [])
-    ## radio-bearer-stats-calculator.h (module 'lte'): std::vector<double, std::allocator<double> > ns3::RadioBearerStatsCalculator::GetDlPduSizeStats(uint64_t imsi, uint8_t lcid) [member function]
+    ## radio-bearer-stats-calculator.h (module 'lte'): std::vector<double, std::allocator<double>> ns3::RadioBearerStatsCalculator::GetDlPduSizeStats(uint64_t imsi, uint8_t lcid) [member function]
     cls.add_method('GetDlPduSizeStats', 
                    'std::vector< double >', 
                    [param('uint64_t', 'imsi'), param('uint8_t', 'lcid')])
@@ -23149,7 +23344,7 @@
     cls.add_method('GetUlDelay', 
                    'double', 
                    [param('uint64_t', 'imsi'), param('uint8_t', 'lcid')])
-    ## radio-bearer-stats-calculator.h (module 'lte'): std::vector<double, std::allocator<double> > ns3::RadioBearerStatsCalculator::GetUlDelayStats(uint64_t imsi, uint8_t lcid) [member function]
+    ## radio-bearer-stats-calculator.h (module 'lte'): std::vector<double, std::allocator<double>> ns3::RadioBearerStatsCalculator::GetUlDelayStats(uint64_t imsi, uint8_t lcid) [member function]
     cls.add_method('GetUlDelayStats', 
                    'std::vector< double >', 
                    [param('uint64_t', 'imsi'), param('uint8_t', 'lcid')])
@@ -23161,7 +23356,7 @@
     cls.add_method('GetUlPdcpOutputFilename', 
                    'std::string', 
                    [])
-    ## radio-bearer-stats-calculator.h (module 'lte'): std::vector<double, std::allocator<double> > ns3::RadioBearerStatsCalculator::GetUlPduSizeStats(uint64_t imsi, uint8_t lcid) [member function]
+    ## radio-bearer-stats-calculator.h (module 'lte'): std::vector<double, std::allocator<double>> ns3::RadioBearerStatsCalculator::GetUlPduSizeStats(uint64_t imsi, uint8_t lcid) [member function]
     cls.add_method('GetUlPduSizeStats', 
                    'std::vector< double >', 
                    [param('uint64_t', 'imsi'), param('uint8_t', 'lcid')])
@@ -23221,12 +23416,12 @@
                    'uint16_t', 
                    [], 
                    is_const=True)
-    ## lte-control-messages.h (module 'lte'): std::list<ns3::RarLteControlMessage::Rar, std::allocator<ns3::RarLteControlMessage::Rar> >::const_iterator ns3::RarLteControlMessage::RarListBegin() const [member function]
+    ## lte-control-messages.h (module 'lte'): std::list<ns3::RarLteControlMessage::Rar, std::allocator<ns3::RarLteControlMessage::Rar>>::const_iterator ns3::RarLteControlMessage::RarListBegin() const [member function]
     cls.add_method('RarListBegin', 
                    'std::list< ns3::RarLteControlMessage::Rar > const_iterator', 
                    [], 
                    is_const=True)
-    ## lte-control-messages.h (module 'lte'): std::list<ns3::RarLteControlMessage::Rar, std::allocator<ns3::RarLteControlMessage::Rar> >::const_iterator ns3::RarLteControlMessage::RarListEnd() const [member function]
+    ## lte-control-messages.h (module 'lte'): std::list<ns3::RarLteControlMessage::Rar, std::allocator<ns3::RarLteControlMessage::Rar>>::const_iterator ns3::RarLteControlMessage::RarListEnd() const [member function]
     cls.add_method('RarListEnd', 
                    'std::list< ns3::RarLteControlMessage::Rar > const_iterator', 
                    [], 
@@ -23291,9 +23486,9 @@
                    'ns3::Ptr< ns3::SpectrumModel const >', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## rem-spectrum-phy.h (module 'lte'): ns3::Ptr<ns3::AntennaModel> ns3::RemSpectrumPhy::GetRxAntenna() const [member function]
-    cls.add_method('GetRxAntenna', 
-                   'ns3::Ptr< ns3::AntennaModel >', 
+    ## rem-spectrum-phy.h (module 'lte'): ns3::Ptr<ns3::Object> ns3::RemSpectrumPhy::GetAntenna() const [member function]
+    cls.add_method('GetAntenna', 
+                   'ns3::Ptr< ns3::Object >', 
                    [], 
                    is_const=True, is_virtual=True)
     ## rem-spectrum-phy.h (module 'lte'): void ns3::RemSpectrumPhy::StartRx(ns3::Ptr<ns3::SpectrumSignalParameters> params) [member function]
@@ -23433,7 +23628,7 @@
                    'ns3::Buffer::Iterator', 
                    [param('ns3::LteRrcSap::CellIdentification *', 'ci'), param('ns3::Buffer::Iterator', 'bIterator')], 
                    visibility='protected')
-    ## lte-rrc-header.h (module 'lte'): ns3::Buffer::Iterator ns3::RrcAsn1Header::DeserializeDrbToAddModList(std::list<ns3::LteRrcSap::DrbToAddMod, std::allocator<ns3::LteRrcSap::DrbToAddMod> > * drbToAddModLis, ns3::Buffer::Iterator bIterator) [member function]
+    ## lte-rrc-header.h (module 'lte'): ns3::Buffer::Iterator ns3::RrcAsn1Header::DeserializeDrbToAddModList(std::list<ns3::LteRrcSap::DrbToAddMod, std::allocator<ns3::LteRrcSap::DrbToAddMod>> * drbToAddModLis, ns3::Buffer::Iterator bIterator) [member function]
     cls.add_method('DeserializeDrbToAddModList', 
                    'ns3::Buffer::Iterator', 
                    [param('std::list< ns3::LteRrcSap::DrbToAddMod > *', 'drbToAddModLis'), param('ns3::Buffer::Iterator', 'bIterator')], 
@@ -23508,7 +23703,7 @@
                    'ns3::Buffer::Iterator', 
                    [param('ns3::LteRrcSap::RadioResourceConfigDedicatedSCell *', 'rrcdsc'), param('ns3::Buffer::Iterator', 'bIterator')], 
                    visibility='protected')
-    ## lte-rrc-header.h (module 'lte'): ns3::Buffer::Iterator ns3::RrcAsn1Header::DeserializeSrbToAddModList(std::list<ns3::LteRrcSap::SrbToAddMod, std::allocator<ns3::LteRrcSap::SrbToAddMod> > * srbToAddModList, ns3::Buffer::Iterator bIterator) [member function]
+    ## lte-rrc-header.h (module 'lte'): ns3::Buffer::Iterator ns3::RrcAsn1Header::DeserializeSrbToAddModList(std::list<ns3::LteRrcSap::SrbToAddMod, std::allocator<ns3::LteRrcSap::SrbToAddMod>> * srbToAddModList, ns3::Buffer::Iterator bIterator) [member function]
     cls.add_method('DeserializeSrbToAddModList', 
                    'ns3::Buffer::Iterator', 
                    [param('std::list< ns3::LteRrcSap::SrbToAddMod > *', 'srbToAddModList'), param('ns3::Buffer::Iterator', 'bIterator')], 
@@ -23558,7 +23753,7 @@
                    'void', 
                    [param('std::ostream &', 'os'), param('ns3::LteRrcSap::RadioResourceConfigDedicated', 'radioResourceConfigDedicated')], 
                    is_const=True, visibility='protected')
-    ## lte-rrc-header.h (module 'lte'): void ns3::RrcAsn1Header::SerializeDrbToAddModList(std::list<ns3::LteRrcSap::DrbToAddMod, std::allocator<ns3::LteRrcSap::DrbToAddMod> > drbToAddModList) const [member function]
+    ## lte-rrc-header.h (module 'lte'): void ns3::RrcAsn1Header::SerializeDrbToAddModList(std::list<ns3::LteRrcSap::DrbToAddMod, std::allocator<ns3::LteRrcSap::DrbToAddMod>> drbToAddModList) const [member function]
     cls.add_method('SerializeDrbToAddModList', 
                    'void', 
                    [param('std::list< ns3::LteRrcSap::DrbToAddMod >', 'drbToAddModList')], 
@@ -23633,7 +23828,7 @@
                    'void', 
                    [param('ns3::LteRrcSap::RadioResourceConfigDedicatedSCell', 'rrcdsc')], 
                    is_const=True, visibility='protected')
-    ## lte-rrc-header.h (module 'lte'): void ns3::RrcAsn1Header::SerializeSrbToAddModList(std::list<ns3::LteRrcSap::SrbToAddMod, std::allocator<ns3::LteRrcSap::SrbToAddMod> > srbToAddModList) const [member function]
+    ## lte-rrc-header.h (module 'lte'): void ns3::RrcAsn1Header::SerializeSrbToAddModList(std::list<ns3::LteRrcSap::SrbToAddMod, std::allocator<ns3::LteRrcSap::SrbToAddMod>> srbToAddModList) const [member function]
     cls.add_method('SerializeSrbToAddModList', 
                    'void', 
                    [param('std::list< ns3::LteRrcSap::SrbToAddMod >', 'srbToAddModList')], 
@@ -23814,7 +24009,7 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## simple-ue-component-carrier-manager.h (module 'lte'): std::vector<ns3::LteUeCcmRrcSapProvider::LcsConfig, std::allocator<ns3::LteUeCcmRrcSapProvider::LcsConfig> > ns3::SimpleUeComponentCarrierManager::DoAddLc(uint8_t lcId, ns3::LteUeCmacSapProvider::LogicalChannelConfig lcConfig, ns3::LteMacSapUser * msu) [member function]
+    ## simple-ue-component-carrier-manager.h (module 'lte'): std::vector<ns3::LteUeCcmRrcSapProvider::LcsConfig, std::allocator<ns3::LteUeCcmRrcSapProvider::LcsConfig>> ns3::SimpleUeComponentCarrierManager::DoAddLc(uint8_t lcId, ns3::LteUeCmacSapProvider::LogicalChannelConfig lcConfig, ns3::LteMacSapUser * msu) [member function]
     cls.add_method('DoAddLc', 
                    'std::vector< ns3::LteUeCcmRrcSapProvider::LcsConfig >', 
                    [param('uint8_t', 'lcId'), param('ns3::LteUeCmacSapProvider::LogicalChannelConfig', 'lcConfig'), param('ns3::LteMacSapUser *', 'msu')], 
@@ -23849,7 +24044,7 @@
                    'void', 
                    [param('ns3::LteMacSapUser::ReceivePduParameters', 'rxPduParams')], 
                    visibility='protected')
-    ## simple-ue-component-carrier-manager.h (module 'lte'): std::vector<unsigned short, std::allocator<unsigned short> > ns3::SimpleUeComponentCarrierManager::DoRemoveLc(uint8_t lcid) [member function]
+    ## simple-ue-component-carrier-manager.h (module 'lte'): std::vector<unsigned short, std::allocator<unsigned short>> ns3::SimpleUeComponentCarrierManager::DoRemoveLc(uint8_t lcid) [member function]
     cls.add_method('DoRemoveLc', 
                    'std::vector< unsigned short >', 
                    [param('uint8_t', 'lcid')], 
@@ -23881,6 +24076,10 @@
     cls.add_constructor([param('ns3::SpectrumChannel const &', 'arg0')])
     ## spectrum-channel.h (module 'spectrum'): ns3::SpectrumChannel::SpectrumChannel() [constructor]
     cls.add_constructor([])
+    ## spectrum-channel.h (module 'spectrum'): void ns3::SpectrumChannel::AddPhasedArraySpectrumPropagationLossModel(ns3::Ptr<ns3::PhasedArraySpectrumPropagationLossModel> loss) [member function]
+    cls.add_method('AddPhasedArraySpectrumPropagationLossModel', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::PhasedArraySpectrumPropagationLossModel >', 'loss')])
     ## spectrum-channel.h (module 'spectrum'): void ns3::SpectrumChannel::AddPropagationLossModel(ns3::Ptr<ns3::PropagationLossModel> loss) [member function]
     cls.add_method('AddPropagationLossModel', 
                    'void', 
@@ -23899,6 +24098,10 @@
                    'void', 
                    [], 
                    is_virtual=True)
+    ## spectrum-channel.h (module 'spectrum'): ns3::Ptr<ns3::PhasedArraySpectrumPropagationLossModel> ns3::SpectrumChannel::GetPhasedArraySpectrumPropagationLossModel() [member function]
+    cls.add_method('GetPhasedArraySpectrumPropagationLossModel', 
+                   'ns3::Ptr< ns3::PhasedArraySpectrumPropagationLossModel >', 
+                   [])
     ## spectrum-channel.h (module 'spectrum'): ns3::Ptr<ns3::PropagationLossModel> ns3::SpectrumChannel::GetPropagationLossModel() [member function]
     cls.add_method('GetPropagationLossModel', 
                    'ns3::Ptr< ns3::PropagationLossModel >', 
@@ -23912,6 +24115,11 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## spectrum-channel.h (module 'spectrum'): void ns3::SpectrumChannel::RemoveRx(ns3::Ptr<ns3::SpectrumPhy> phy) [member function]
+    cls.add_method('RemoveRx', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::SpectrumPhy >', 'phy')], 
+                   is_pure_virtual=True, is_virtual=True)
     ## spectrum-channel.h (module 'spectrum'): void ns3::SpectrumChannel::SetPropagationDelayModel(ns3::Ptr<ns3::PropagationDelayModel> delay) [member function]
     cls.add_method('SetPropagationDelayModel', 
                    'void', 
@@ -24995,22 +25203,22 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3LteUeRrc__gt___StdList__lt__ns3LteRrcSapSCellToAddMod__stdAllocator__lt__ns3LteRrcSapSCellToAddMod__gt_____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::LteUeRrc>, std::list<ns3::LteRrcSap::SCellToAddMod, std::allocator<ns3::LteRrcSap::SCellToAddMod> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3LteUeRrc__gt___StdList__lt__ns3LteRrcSapSCellToAddMod__stdAllocator__lt__ns3LteRrcSapSCellToAddMod__gt____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::LteUeRrc>, std::list<ns3::LteRrcSap::SCellToAddMod, std::allocator<ns3::LteRrcSap::SCellToAddMod>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::LteUeRrc>, std::list<ns3::LteRrcSap::SCellToAddMod, std::allocator<ns3::LteRrcSap::SCellToAddMod> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<ns3::LteUeRrc>, std::list<ns3::LteRrcSap::SCellToAddMod, std::allocator<ns3::LteRrcSap::SCellToAddMod> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::LteUeRrc>, std::list<ns3::LteRrcSap::SCellToAddMod, std::allocator<ns3::LteRrcSap::SCellToAddMod>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<ns3::LteUeRrc>, std::list<ns3::LteRrcSap::SCellToAddMod, std::allocator<ns3::LteRrcSap::SCellToAddMod>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
     cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::LteUeRrc >, std::list< ns3::LteRrcSap::SCellToAddMod >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::LteUeRrc>, std::list<ns3::LteRrcSap::SCellToAddMod, std::allocator<ns3::LteRrcSap::SCellToAddMod> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::LteUeRrc>, std::list<ns3::LteRrcSap::SCellToAddMod, std::allocator<ns3::LteRrcSap::SCellToAddMod>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
     cls.add_method('DoGetTypeid', 
                    'std::string', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::LteUeRrc>, std::list<ns3::LteRrcSap::SCellToAddMod, std::allocator<ns3::LteRrcSap::SCellToAddMod> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::LteUeRrc>, std::list<ns3::LteRrcSap::SCellToAddMod, std::allocator<ns3::LteRrcSap::SCellToAddMod>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
     cls.add_method('GetTypeid', 
                    'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<ns3::LteUeRrc>, std::list<ns3::LteRrcSap::SCellToAddMod, std::allocator<ns3::LteRrcSap::SCellToAddMod> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<ns3::LteUeRrc> arg0, std::list<ns3::LteRrcSap::SCellToAddMod, std::allocator<ns3::LteRrcSap::SCellToAddMod> > arg1) [member operator]
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<ns3::LteUeRrc>, std::list<ns3::LteRrcSap::SCellToAddMod, std::allocator<ns3::LteRrcSap::SCellToAddMod>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<ns3::LteUeRrc> arg0, std::list<ns3::LteRrcSap::SCellToAddMod, std::allocator<ns3::LteRrcSap::SCellToAddMod>> arg1) [member operator]
     cls.add_method('operator()', 
                    'void', 
                    [param('ns3::Ptr< ns3::LteUeRrc >', 'arg0'), param('std::list< ns3::LteRrcSap::SCellToAddMod >', 'arg1')], 
@@ -25363,10 +25571,10 @@
                    'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned long long, unsigned short, unsigned short, std::basic_string<char>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(long unsigned int arg0, short unsigned int arg1, short unsigned int arg2, std::basic_string<char, std::char_traits<char>, std::allocator<char> > arg3) [member operator]
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned long long, unsigned short, unsigned short, std::basic_string<char>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(long unsigned int arg0, short unsigned int arg1, short unsigned int arg2, std::basic_string<char, std::char_traits<char>, std::allocator<char>> arg3) [member operator]
     cls.add_method('operator()', 
                    'void', 
-                   [param('long unsigned int', 'arg0'), param('short unsigned int', 'arg1'), param('short unsigned int', 'arg2'), param('std::string', 'arg3')], 
+                   [param('long unsigned int', 'arg0'), param('short unsigned int', 'arg1'), param('short unsigned int', 'arg2'), param('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'arg3')], 
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
@@ -25385,10 +25593,10 @@
                    'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned long long, unsigned short, unsigned short, std::basic_string<char>, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(long unsigned int arg0, short unsigned int arg1, short unsigned int arg2, std::basic_string<char, std::char_traits<char>, std::allocator<char> > arg3, unsigned char arg4) [member operator]
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned long long, unsigned short, unsigned short, std::basic_string<char>, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(long unsigned int arg0, short unsigned int arg1, short unsigned int arg2, std::basic_string<char, std::char_traits<char>, std::allocator<char>> arg3, unsigned char arg4) [member operator]
     cls.add_method('operator()', 
                    'void', 
-                   [param('long unsigned int', 'arg0'), param('short unsigned int', 'arg1'), param('short unsigned int', 'arg2'), param('std::string', 'arg3'), param('unsigned char', 'arg4')], 
+                   [param('long unsigned int', 'arg0'), param('short unsigned int', 'arg1'), param('short unsigned int', 'arg2'), param('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'arg3'), param('unsigned char', 'arg4')], 
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
@@ -25436,22 +25644,22 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3CallbackImpl__Void_Unsigned_short_Const_stdVector__lt__int__stdAllocator__lt__int__gt_____gt_____amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned short, const std::vector<int, std::allocator<int> > &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+def register_Ns3CallbackImpl__Void_Unsigned_short_Const_stdVector__lt__int__stdAllocator__lt__int__gt____gt_____amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned short, const std::vector<int, std::allocator<int>> &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned short, const std::vector<int, std::allocator<int> > &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, unsigned short, const std::vector<int, std::allocator<int> > &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned short, const std::vector<int, std::allocator<int>> &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, unsigned short, const std::vector<int, std::allocator<int>> &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
     cls.add_constructor([param('ns3::CallbackImpl< void, unsigned short, std::vector< int, std::allocator< int > > const, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, unsigned short, const std::vector<int, std::allocator<int> > &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, unsigned short, const std::vector<int, std::allocator<int>> &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
     cls.add_method('DoGetTypeid', 
                    'std::string', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, unsigned short, const std::vector<int, std::allocator<int> > &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, unsigned short, const std::vector<int, std::allocator<int>> &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
     cls.add_method('GetTypeid', 
                    'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned short, const std::vector<int, std::allocator<int> > &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(short unsigned int arg0, std::vector<int, std::allocator<int> > const & arg1) [member operator]
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned short, const std::vector<int, std::allocator<int>> &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(short unsigned int arg0, std::vector<int, std::allocator<int>> const & arg1) [member operator]
     cls.add_method('operator()', 
                    'void', 
                    [param('short unsigned int', 'arg0'), param('std::vector< int > const &', 'arg1')], 
@@ -25758,10 +25966,10 @@
     cls.add_constructor([param('ns3::EmuEpcHelper const &', 'arg0')])
     ## emu-epc-helper.h (module 'lte'): ns3::EmuEpcHelper::EmuEpcHelper() [constructor]
     cls.add_constructor([])
-    ## emu-epc-helper.h (module 'lte'): void ns3::EmuEpcHelper::AddEnb(ns3::Ptr<ns3::Node> enbNode, ns3::Ptr<ns3::NetDevice> lteEnbNetDevice, uint16_t cellId) [member function]
+    ## emu-epc-helper.h (module 'lte'): void ns3::EmuEpcHelper::AddEnb(ns3::Ptr<ns3::Node> enbNode, ns3::Ptr<ns3::NetDevice> lteEnbNetDevice, std::vector<unsigned short, std::allocator<unsigned short>> cellIds) [member function]
     cls.add_method('AddEnb', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Node >', 'enbNode'), param('ns3::Ptr< ns3::NetDevice >', 'lteEnbNetDevice'), param('uint16_t', 'cellId')], 
+                   [param('ns3::Ptr< ns3::Node >', 'enbNode'), param('ns3::Ptr< ns3::NetDevice >', 'lteEnbNetDevice'), param('std::vector< unsigned short >', 'cellIds')], 
                    is_virtual=True)
     ## emu-epc-helper.h (module 'lte'): void ns3::EmuEpcHelper::AddX2Interface(ns3::Ptr<ns3::Node> enbNode1, ns3::Ptr<ns3::Node> enbNode2) [member function]
     cls.add_method('AddX2Interface', 
@@ -25948,7 +26156,7 @@
                    'uint32_t', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_virtual=True)
-    ## epc-gtpc-header.h (module 'lte'): std::list<ns3::GtpcCreateSessionRequestMessage::BearerContextToBeCreated, std::allocator<ns3::GtpcCreateSessionRequestMessage::BearerContextToBeCreated> > ns3::GtpcCreateSessionRequestMessage::GetBearerContextsToBeCreated() const [member function]
+    ## epc-gtpc-header.h (module 'lte'): std::list<ns3::GtpcCreateSessionRequestMessage::BearerContextToBeCreated, std::allocator<ns3::GtpcCreateSessionRequestMessage::BearerContextToBeCreated>> ns3::GtpcCreateSessionRequestMessage::GetBearerContextsToBeCreated() const [member function]
     cls.add_method('GetBearerContextsToBeCreated', 
                    'std::list< ns3::GtpcCreateSessionRequestMessage::BearerContextToBeCreated >', 
                    [], 
@@ -25998,7 +26206,7 @@
                    'void', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_const=True, is_virtual=True)
-    ## epc-gtpc-header.h (module 'lte'): void ns3::GtpcCreateSessionRequestMessage::SetBearerContextsToBeCreated(std::list<ns3::GtpcCreateSessionRequestMessage::BearerContextToBeCreated, std::allocator<ns3::GtpcCreateSessionRequestMessage::BearerContextToBeCreated> > bearerContexts) [member function]
+    ## epc-gtpc-header.h (module 'lte'): void ns3::GtpcCreateSessionRequestMessage::SetBearerContextsToBeCreated(std::list<ns3::GtpcCreateSessionRequestMessage::BearerContextToBeCreated, std::allocator<ns3::GtpcCreateSessionRequestMessage::BearerContextToBeCreated>> bearerContexts) [member function]
     cls.add_method('SetBearerContextsToBeCreated', 
                    'void', 
                    [param('std::list< ns3::GtpcCreateSessionRequestMessage::BearerContextToBeCreated >', 'bearerContexts')])
@@ -26041,7 +26249,7 @@
                    'uint32_t', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_virtual=True)
-    ## epc-gtpc-header.h (module 'lte'): std::list<ns3::GtpcCreateSessionResponseMessage::BearerContextCreated, std::allocator<ns3::GtpcCreateSessionResponseMessage::BearerContextCreated> > ns3::GtpcCreateSessionResponseMessage::GetBearerContextsCreated() const [member function]
+    ## epc-gtpc-header.h (module 'lte'): std::list<ns3::GtpcCreateSessionResponseMessage::BearerContextCreated, std::allocator<ns3::GtpcCreateSessionResponseMessage::BearerContextCreated>> ns3::GtpcCreateSessionResponseMessage::GetBearerContextsCreated() const [member function]
     cls.add_method('GetBearerContextsCreated', 
                    'std::list< ns3::GtpcCreateSessionResponseMessage::BearerContextCreated >', 
                    [], 
@@ -26086,7 +26294,7 @@
                    'void', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_const=True, is_virtual=True)
-    ## epc-gtpc-header.h (module 'lte'): void ns3::GtpcCreateSessionResponseMessage::SetBearerContextsCreated(std::list<ns3::GtpcCreateSessionResponseMessage::BearerContextCreated, std::allocator<ns3::GtpcCreateSessionResponseMessage::BearerContextCreated> > bearerContexts) [member function]
+    ## epc-gtpc-header.h (module 'lte'): void ns3::GtpcCreateSessionResponseMessage::SetBearerContextsCreated(std::list<ns3::GtpcCreateSessionResponseMessage::BearerContextCreated, std::allocator<ns3::GtpcCreateSessionResponseMessage::BearerContextCreated>> bearerContexts) [member function]
     cls.add_method('SetBearerContextsCreated', 
                    'void', 
                    [param('std::list< ns3::GtpcCreateSessionResponseMessage::BearerContextCreated >', 'bearerContexts')])
@@ -26127,7 +26335,7 @@
                    'uint32_t', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_virtual=True)
-    ## epc-gtpc-header.h (module 'lte'): std::list<ns3::GtpcDeleteBearerCommandMessage::BearerContext, std::allocator<ns3::GtpcDeleteBearerCommandMessage::BearerContext> > ns3::GtpcDeleteBearerCommandMessage::GetBearerContexts() const [member function]
+    ## epc-gtpc-header.h (module 'lte'): std::list<ns3::GtpcDeleteBearerCommandMessage::BearerContext, std::allocator<ns3::GtpcDeleteBearerCommandMessage::BearerContext>> ns3::GtpcDeleteBearerCommandMessage::GetBearerContexts() const [member function]
     cls.add_method('GetBearerContexts', 
                    'std::list< ns3::GtpcDeleteBearerCommandMessage::BearerContext >', 
                    [], 
@@ -26162,7 +26370,7 @@
                    'void', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_const=True, is_virtual=True)
-    ## epc-gtpc-header.h (module 'lte'): void ns3::GtpcDeleteBearerCommandMessage::SetBearerContexts(std::list<ns3::GtpcDeleteBearerCommandMessage::BearerContext, std::allocator<ns3::GtpcDeleteBearerCommandMessage::BearerContext> > bearerContexts) [member function]
+    ## epc-gtpc-header.h (module 'lte'): void ns3::GtpcDeleteBearerCommandMessage::SetBearerContexts(std::list<ns3::GtpcDeleteBearerCommandMessage::BearerContext, std::allocator<ns3::GtpcDeleteBearerCommandMessage::BearerContext>> bearerContexts) [member function]
     cls.add_method('SetBearerContexts', 
                    'void', 
                    [param('std::list< ns3::GtpcDeleteBearerCommandMessage::BearerContext >', 'bearerContexts')])
@@ -26215,12 +26423,12 @@
                    'uint32_t', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## epc-gtpc-header.h (module 'lte'): std::list<unsigned char, std::allocator<unsigned char> > ns3::GtpcDeleteBearerRequestMessage::GetEpsBearerIds() const [member function]
+    ## epc-gtpc-header.h (module 'lte'): std::list<unsigned char, std::allocator<unsigned char>> ns3::GtpcDeleteBearerRequestMessage::GetEpsBearerIds() const [member function]
     cls.add_method('GetEpsBearerIds', 
                    'std::list< unsigned char >', 
                    [], 
                    is_const=True)
-    ## epc-gtpc-header.h (module 'lte'): void ns3::GtpcDeleteBearerRequestMessage::SetEpsBearerIds(std::list<unsigned char, std::allocator<unsigned char> > epsBearerIds) [member function]
+    ## epc-gtpc-header.h (module 'lte'): void ns3::GtpcDeleteBearerRequestMessage::SetEpsBearerIds(std::list<unsigned char, std::allocator<unsigned char>> epsBearerIds) [member function]
     cls.add_method('SetEpsBearerIds', 
                    'void', 
                    [param('std::list< unsigned char >', 'epsBearerIds')])
@@ -26275,12 +26483,12 @@
     cls.add_method('SetCause', 
                    'void', 
                    [param('ns3::GtpcIes::Cause_t', 'cause')])
-    ## epc-gtpc-header.h (module 'lte'): std::list<unsigned char, std::allocator<unsigned char> > ns3::GtpcDeleteBearerResponseMessage::GetEpsBearerIds() const [member function]
+    ## epc-gtpc-header.h (module 'lte'): std::list<unsigned char, std::allocator<unsigned char>> ns3::GtpcDeleteBearerResponseMessage::GetEpsBearerIds() const [member function]
     cls.add_method('GetEpsBearerIds', 
                    'std::list< unsigned char >', 
                    [], 
                    is_const=True)
-    ## epc-gtpc-header.h (module 'lte'): void ns3::GtpcDeleteBearerResponseMessage::SetEpsBearerIds(std::list<unsigned char, std::allocator<unsigned char> > epsBearerIds) [member function]
+    ## epc-gtpc-header.h (module 'lte'): void ns3::GtpcDeleteBearerResponseMessage::SetEpsBearerIds(std::list<unsigned char, std::allocator<unsigned char>> epsBearerIds) [member function]
     cls.add_method('SetEpsBearerIds', 
                    'void', 
                    [param('std::list< unsigned char >', 'epsBearerIds')])
@@ -26359,7 +26567,7 @@
     cls.add_constructor([])
     ## lte-enb-phy.h (module 'lte'): ns3::LteEnbPhy::LteEnbPhy(ns3::Ptr<ns3::LteSpectrumPhy> dlPhy, ns3::Ptr<ns3::LteSpectrumPhy> ulPhy) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::LteSpectrumPhy >', 'dlPhy'), param('ns3::Ptr< ns3::LteSpectrumPhy >', 'ulPhy')])
-    ## lte-enb-phy.h (module 'lte'): void ns3::LteEnbPhy::CalcChannelQualityForUe(std::vector<double, std::allocator<double> > sinr, ns3::Ptr<ns3::LteSpectrumPhy> ue) [member function]
+    ## lte-enb-phy.h (module 'lte'): void ns3::LteEnbPhy::CalcChannelQualityForUe(std::vector<double, std::allocator<double>> sinr, ns3::Ptr<ns3::LteSpectrumPhy> ue) [member function]
     cls.add_method('CalcChannelQualityForUe', 
                    'void', 
                    [param('std::vector< double >', 'sinr'), param('ns3::Ptr< ns3::LteSpectrumPhy >', 'ue')])
@@ -26381,7 +26589,7 @@
                    'ns3::Ptr< ns3::SpectrumValue >', 
                    [], 
                    is_virtual=True)
-    ## lte-enb-phy.h (module 'lte'): std::list<ns3::UlDciLteControlMessage, std::allocator<ns3::UlDciLteControlMessage> > ns3::LteEnbPhy::DequeueUlDci() [member function]
+    ## lte-enb-phy.h (module 'lte'): std::list<ns3::UlDciLteControlMessage, std::allocator<ns3::UlDciLteControlMessage>> ns3::LteEnbPhy::DequeueUlDci() [member function]
     cls.add_method('DequeueUlDci', 
                    'std::list< ns3::UlDciLteControlMessage >', 
                    [])
@@ -26427,7 +26635,7 @@
                    'ns3::Ptr< ns3::LteSpectrumPhy >', 
                    [], 
                    is_const=True)
-    ## lte-enb-phy.h (module 'lte'): std::vector<int, std::allocator<int> > ns3::LteEnbPhy::GetDownlinkSubChannels() [member function]
+    ## lte-enb-phy.h (module 'lte'): std::vector<int, std::allocator<int>> ns3::LteEnbPhy::GetDownlinkSubChannels() [member function]
     cls.add_method('GetDownlinkSubChannels', 
                    'std::vector< int >', 
                    [])
@@ -26477,10 +26685,10 @@
                    'void', 
                    [param('ns3::Ptr< ns3::LteControlMessage >', 'msg')], 
                    is_virtual=True)
-    ## lte-enb-phy.h (module 'lte'): void ns3::LteEnbPhy::ReceiveLteControlMessageList(std::list<ns3::Ptr<ns3::LteControlMessage>, std::allocator<ns3::Ptr<ns3::LteControlMessage> > > arg0) [member function]
+    ## lte-enb-phy.h (module 'lte'): void ns3::LteEnbPhy::ReceiveLteControlMessageList(std::list<ns3::Ptr<ns3::LteControlMessage>, std::allocator<ns3::Ptr<ns3::LteControlMessage>>> msgList) [member function]
     cls.add_method('ReceiveLteControlMessageList', 
                    'void', 
-                   [param('std::list< ns3::Ptr< ns3::LteControlMessage > >', 'arg0')], 
+                   [param('std::list< ns3::Ptr< ns3::LteControlMessage > >', 'msgList')], 
                    is_virtual=True)
     ## lte-enb-phy.h (module 'lte'): void ns3::LteEnbPhy::ReportInterference(ns3::SpectrumValue const & interf) [member function]
     cls.add_method('ReportInterference', 
@@ -26497,7 +26705,7 @@
                    'void', 
                    [param('ns3::UlInfoListElement_s', 'mes')], 
                    is_virtual=True)
-    ## lte-enb-phy.h (module 'lte'): void ns3::LteEnbPhy::SendControlChannels(std::list<ns3::Ptr<ns3::LteControlMessage>, std::allocator<ns3::Ptr<ns3::LteControlMessage> > > ctrlMsgList) [member function]
+    ## lte-enb-phy.h (module 'lte'): void ns3::LteEnbPhy::SendControlChannels(std::list<ns3::Ptr<ns3::LteControlMessage>, std::allocator<ns3::Ptr<ns3::LteControlMessage>>> ctrlMsgList) [member function]
     cls.add_method('SendControlChannels', 
                    'void', 
                    [param('std::list< ns3::Ptr< ns3::LteControlMessage > >', 'ctrlMsgList')])
@@ -26505,11 +26713,11 @@
     cls.add_method('SendDataChannels', 
                    'void', 
                    [param('ns3::Ptr< ns3::PacketBurst >', 'pb')])
-    ## lte-enb-phy.h (module 'lte'): void ns3::LteEnbPhy::SetDownlinkSubChannels(std::vector<int, std::allocator<int> > mask) [member function]
+    ## lte-enb-phy.h (module 'lte'): void ns3::LteEnbPhy::SetDownlinkSubChannels(std::vector<int, std::allocator<int>> mask) [member function]
     cls.add_method('SetDownlinkSubChannels', 
                    'void', 
                    [param('std::vector< int >', 'mask')])
-    ## lte-enb-phy.h (module 'lte'): void ns3::LteEnbPhy::SetDownlinkSubChannelsWithPowerAllocation(std::vector<int, std::allocator<int> > mask) [member function]
+    ## lte-enb-phy.h (module 'lte'): void ns3::LteEnbPhy::SetDownlinkSubChannelsWithPowerAllocation(std::vector<int, std::allocator<int>> mask) [member function]
     cls.add_method('SetDownlinkSubChannelsWithPowerAllocation', 
                    'void', 
                    [param('std::vector< int >', 'mask')])
@@ -26760,11 +26968,11 @@
     cls.add_method('GetTargetEnb', 
                    'ns3::Ptr< ns3::LteEnbNetDevice >', 
                    [])
-    ## lte-ue-net-device.h (module 'lte'): void ns3::LteUeNetDevice::SetCcMap(std::map<unsigned char, ns3::Ptr<ns3::ComponentCarrierUe>, std::less<unsigned char>, std::allocator<std::pair<const unsigned char, ns3::Ptr<ns3::ComponentCarrierUe> > > > ccm) [member function]
+    ## lte-ue-net-device.h (module 'lte'): void ns3::LteUeNetDevice::SetCcMap(std::map<unsigned char, ns3::Ptr<ns3::ComponentCarrierUe>, std::less<unsigned char>, std::allocator<std::pair<const unsigned char, ns3::Ptr<ns3::ComponentCarrierUe>>>> ccm) [member function]
     cls.add_method('SetCcMap', 
                    'void', 
                    [param('std::map< unsigned char, ns3::Ptr< ns3::ComponentCarrierUe > >', 'ccm')])
-    ## lte-ue-net-device.h (module 'lte'): std::map<unsigned char, ns3::Ptr<ns3::ComponentCarrierUe>, std::less<unsigned char>, std::allocator<std::pair<const unsigned char, ns3::Ptr<ns3::ComponentCarrierUe> > > > ns3::LteUeNetDevice::GetCcMap() [member function]
+    ## lte-ue-net-device.h (module 'lte'): std::map<unsigned char, ns3::Ptr<ns3::ComponentCarrierUe>, std::less<unsigned char>, std::allocator<std::pair<const unsigned char, ns3::Ptr<ns3::ComponentCarrierUe>>>> ns3::LteUeNetDevice::GetCcMap() [member function]
     cls.add_method('GetCcMap', 
                    'std::map< unsigned char, ns3::Ptr< ns3::ComponentCarrierUe > >', 
                    [])
@@ -26852,12 +27060,12 @@
                    'uint32_t', 
                    [param('ns3::Buffer::Iterator', 'bIterator')], 
                    is_virtual=True)
-    ## lte-rrc-header.h (module 'lte'): std::list<ns3::LteRrcSap::DrbToAddMod, std::allocator<ns3::LteRrcSap::DrbToAddMod> > ns3::RrcConnectionReconfigurationHeader::GetDrbToAddModList() const [member function]
+    ## lte-rrc-header.h (module 'lte'): std::list<ns3::LteRrcSap::DrbToAddMod, std::allocator<ns3::LteRrcSap::DrbToAddMod>> ns3::RrcConnectionReconfigurationHeader::GetDrbToAddModList() const [member function]
     cls.add_method('GetDrbToAddModList', 
                    'std::list< ns3::LteRrcSap::DrbToAddMod >', 
                    [], 
                    is_const=True)
-    ## lte-rrc-header.h (module 'lte'): std::list<unsigned char, std::allocator<unsigned char> > ns3::RrcConnectionReconfigurationHeader::GetDrbToReleaseList() const [member function]
+    ## lte-rrc-header.h (module 'lte'): std::list<unsigned char, std::allocator<unsigned char>> ns3::RrcConnectionReconfigurationHeader::GetDrbToReleaseList() const [member function]
     cls.add_method('GetDrbToReleaseList', 
                    'std::list< unsigned char >', 
                    [], 
@@ -26914,7 +27122,7 @@
                    'uint8_t', 
                    [], 
                    is_const=True)
-    ## lte-rrc-header.h (module 'lte'): std::list<ns3::LteRrcSap::SrbToAddMod, std::allocator<ns3::LteRrcSap::SrbToAddMod> > ns3::RrcConnectionReconfigurationHeader::GetSrbToAddModList() const [member function]
+    ## lte-rrc-header.h (module 'lte'): std::list<ns3::LteRrcSap::SrbToAddMod, std::allocator<ns3::LteRrcSap::SrbToAddMod>> ns3::RrcConnectionReconfigurationHeader::GetSrbToAddModList() const [member function]
     cls.add_method('GetSrbToAddModList', 
                    'std::list< ns3::LteRrcSap::SrbToAddMod >', 
                    [], 
@@ -27243,12 +27451,12 @@
                    'uint32_t', 
                    [param('ns3::Buffer::Iterator', 'bIterator')], 
                    is_virtual=True)
-    ## lte-rrc-header.h (module 'lte'): std::list<ns3::LteRrcSap::DrbToAddMod, std::allocator<ns3::LteRrcSap::DrbToAddMod> > ns3::RrcConnectionSetupHeader::GetDrbToAddModList() const [member function]
+    ## lte-rrc-header.h (module 'lte'): std::list<ns3::LteRrcSap::DrbToAddMod, std::allocator<ns3::LteRrcSap::DrbToAddMod>> ns3::RrcConnectionSetupHeader::GetDrbToAddModList() const [member function]
     cls.add_method('GetDrbToAddModList', 
                    'std::list< ns3::LteRrcSap::DrbToAddMod >', 
                    [], 
                    is_const=True)
-    ## lte-rrc-header.h (module 'lte'): std::list<unsigned char, std::allocator<unsigned char> > ns3::RrcConnectionSetupHeader::GetDrbToReleaseList() const [member function]
+    ## lte-rrc-header.h (module 'lte'): std::list<unsigned char, std::allocator<unsigned char>> ns3::RrcConnectionSetupHeader::GetDrbToReleaseList() const [member function]
     cls.add_method('GetDrbToReleaseList', 
                    'std::list< unsigned char >', 
                    [], 
@@ -27273,7 +27481,7 @@
                    'uint8_t', 
                    [], 
                    is_const=True)
-    ## lte-rrc-header.h (module 'lte'): std::list<ns3::LteRrcSap::SrbToAddMod, std::allocator<ns3::LteRrcSap::SrbToAddMod> > ns3::RrcConnectionSetupHeader::GetSrbToAddModList() const [member function]
+    ## lte-rrc-header.h (module 'lte'): std::list<ns3::LteRrcSap::SrbToAddMod, std::allocator<ns3::LteRrcSap::SrbToAddMod>> ns3::RrcConnectionSetupHeader::GetSrbToAddModList() const [member function]
     cls.add_method('GetSrbToAddModList', 
                    'std::list< ns3::LteRrcSap::SrbToAddMod >', 
                    [], 
@@ -27352,6 +27560,11 @@
                    'uint16_t', 
                    [], 
                    is_const=True)
+    ## lte-enb-net-device.h (module 'lte'): std::vector<unsigned short, std::allocator<unsigned short>> ns3::LteEnbNetDevice::GetCellIds() const [member function]
+    cls.add_method('GetCellIds', 
+                   'std::vector< unsigned short >', 
+                   [], 
+                   is_const=True)
     ## lte-enb-net-device.h (module 'lte'): bool ns3::LteEnbNetDevice::HasCellId(uint16_t cellId) const [member function]
     cls.add_method('HasCellId', 
                    'bool', 
@@ -27411,11 +27624,11 @@
     cls.add_method('SetCsgIndication', 
                    'void', 
                    [param('bool', 'csgIndication')])
-    ## lte-enb-net-device.h (module 'lte'): void ns3::LteEnbNetDevice::SetCcMap(std::map<unsigned char, ns3::Ptr<ns3::ComponentCarrierBaseStation>, std::less<unsigned char>, std::allocator<std::pair<const unsigned char, ns3::Ptr<ns3::ComponentCarrierBaseStation> > > > ccm) [member function]
+    ## lte-enb-net-device.h (module 'lte'): void ns3::LteEnbNetDevice::SetCcMap(std::map<unsigned char, ns3::Ptr<ns3::ComponentCarrierBaseStation>, std::less<unsigned char>, std::allocator<std::pair<const unsigned char, ns3::Ptr<ns3::ComponentCarrierBaseStation>>>> ccm) [member function]
     cls.add_method('SetCcMap', 
                    'void', 
                    [param('std::map< unsigned char, ns3::Ptr< ns3::ComponentCarrierBaseStation > >', 'ccm')])
-    ## lte-enb-net-device.h (module 'lte'): std::map<unsigned char, ns3::Ptr<ns3::ComponentCarrierBaseStation>, std::less<unsigned char>, std::allocator<std::pair<const unsigned char, ns3::Ptr<ns3::ComponentCarrierBaseStation> > > > ns3::LteEnbNetDevice::GetCcMap() const [member function]
+    ## lte-enb-net-device.h (module 'lte'): std::map<unsigned char, ns3::Ptr<ns3::ComponentCarrierBaseStation>, std::less<unsigned char>, std::allocator<std::pair<const unsigned char, ns3::Ptr<ns3::ComponentCarrierBaseStation>>>> ns3::LteEnbNetDevice::GetCcMap() const [member function]
     cls.add_method('GetCcMap', 
                    'std::map< unsigned char, ns3::Ptr< ns3::ComponentCarrierBaseStation > >', 
                    [], 
@@ -27432,7 +27645,7 @@
     cls.add_constructor([param('ns3::Config::MatchContainer const &', 'arg0')])
     ## config.h (module 'core'): ns3::Config::MatchContainer::MatchContainer() [constructor]
     cls.add_constructor([])
-    ## config.h (module 'core'): ns3::Config::MatchContainer::MatchContainer(std::vector<ns3::Ptr<ns3::Object>, std::allocator<ns3::Ptr<ns3::Object> > > const & objects, std::vector<std::basic_string<char>, std::allocator<std::basic_string<char> > > const & contexts, std::string path) [constructor]
+    ## config.h (module 'core'): ns3::Config::MatchContainer::MatchContainer(std::vector<ns3::Ptr<ns3::Object>, std::allocator<ns3::Ptr<ns3::Object>>> const & objects, std::vector<std::basic_string<char>, std::allocator<std::basic_string<char>>> const & contexts, std::string path) [constructor]
     cls.add_constructor([param('std::vector< ns3::Ptr< ns3::Object > > const &', 'objects'), param('std::vector< std::string > const &', 'contexts'), param('std::string', 'path')])
     ## config.h (module 'core'): ns3::Config::MatchContainer::Iterator ns3::Config::MatchContainer::Begin() const [member function]
     cls.add_method('Begin', 
@@ -27496,6 +27709,21 @@
     cls.add_method('SetFailSafe', 
                    'bool', 
                    [param('std::string', 'name'), param('ns3::AttributeValue const &', 'value')])
+    ## config.h (module 'core'): ns3::Config::MatchContainer::Iterator ns3::Config::MatchContainer::begin() const [member function]
+    cls.add_method('begin', 
+                   'ns3::Config::MatchContainer::Iterator', 
+                   [], 
+                   is_const=True)
+    ## config.h (module 'core'): ns3::Config::MatchContainer::Iterator ns3::Config::MatchContainer::end() const [member function]
+    cls.add_method('end', 
+                   'ns3::Config::MatchContainer::Iterator', 
+                   [], 
+                   is_const=True)
+    ## config.h (module 'core'): std::size_t ns3::Config::MatchContainer::size() const [member function]
+    cls.add_method('size', 
+                   'std::size_t', 
+                   [], 
+                   is_const=True)
     return
 
 def register_Ns3HashImplementation_methods(root_module, cls):
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/bindings/modulegen__gcc_LP64.py ns-3.36/src/lte/bindings/modulegen__gcc_LP64.py
--- ns-3.35/src/lte/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/bindings/modulegen__gcc_LP64.py	2022-04-30 18:23:57.894733700 -0700
@@ -36,6 +36,8 @@
     module.add_enum('MaxSize_e', ['MAX_SIZE'], outer_class=root_module['ns3::Address'], import_from_module='ns.network')
     ## eps-bearer.h (module 'lte'): ns3::AllocationRetentionPriority [struct]
     module.add_class('AllocationRetentionPriority')
+    ## angles.h (module 'antenna'): ns3::Angles [class]
+    module.add_class('Angles', import_from_module='ns.antenna')
     ## attribute-construction-list.h (module 'core'): ns3::AttributeConstructionList [class]
     module.add_class('AttributeConstructionList', import_from_module='ns.core')
     ## attribute-construction-list.h (module 'core'): ns3::AttributeConstructionList::Item [struct]
@@ -257,6 +259,8 @@
     module.add_class('EutranMeasurementMapping')
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'], import_from_module='ns.core')
     ## ff-mac-csched-sap.h (module 'lte'): ns3::FfMacCschedSapProvider [class]
     module.add_class('FfMacCschedSapProvider', allow_subclassing=True)
     ## ff-mac-csched-sap.h (module 'lte'): ns3::FfMacCschedSapProvider::CschedCellConfigReqParameters [struct]
@@ -544,10 +548,12 @@
     module.add_class('MeasResultBestNeighCell', outer_class=root_module['ns3::LteRrcSap'])
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultEutra [struct]
     module.add_class('MeasResultEutra', outer_class=root_module['ns3::LteRrcSap'])
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultScell [struct]
-    module.add_class('MeasResultScell', outer_class=root_module['ns3::LteRrcSap'])
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultServFreqList [struct]
-    module.add_class('MeasResultServFreqList', outer_class=root_module['ns3::LteRrcSap'])
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultPCell [struct]
+    module.add_class('MeasResultPCell', outer_class=root_module['ns3::LteRrcSap'])
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultSCell [struct]
+    module.add_class('MeasResultSCell', outer_class=root_module['ns3::LteRrcSap'])
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultServFreq [struct]
+    module.add_class('MeasResultServFreq', outer_class=root_module['ns3::LteRrcSap'])
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResults [struct]
     module.add_class('MeasResults', outer_class=root_module['ns3::LteRrcSap'])
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasurementReport [struct]
@@ -1010,6 +1016,13 @@
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::PacketBurst const > )&', 'ns3::PacketBurst::TracedCallback&')
     ## lte-pdcp-tag.h (module 'lte'): ns3::PdcpTag [class]
     module.add_class('PdcpTag', parent=root_module['ns3::Tag'])
+    ## phased-array-model.h (module 'antenna'): ns3::PhasedArrayModel [class]
+    module.add_class('PhasedArrayModel', import_from_module='ns.antenna', parent=root_module['ns3::Object'])
+    typehandlers.add_type_alias('std::vector< std::complex< double > >', 'ns3::PhasedArrayModel::ComplexVector')
+    typehandlers.add_type_alias('std::vector< std::complex< double > >*', 'ns3::PhasedArrayModel::ComplexVector*')
+    typehandlers.add_type_alias('std::vector< std::complex< double > >&', 'ns3::PhasedArrayModel::ComplexVector&')
+    ## phased-array-spectrum-propagation-loss-model.h (module 'spectrum'): ns3::PhasedArraySpectrumPropagationLossModel [class]
+    module.add_class('PhasedArraySpectrumPropagationLossModel', import_from_module='ns.spectrum', parent=root_module['ns3::Object'])
     ## propagation-delay-model.h (module 'propagation'): ns3::PropagationDelayModel [class]
     module.add_class('PropagationDelayModel', import_from_module='ns.propagation', parent=root_module['ns3::Object'])
     ## propagation-loss-model.h (module 'propagation'): ns3::PropagationLossModel [class]
@@ -1028,49 +1041,49 @@
     module.add_class('RlcTag', parent=root_module['ns3::Tag'])
     ## random-variable-stream.h (module 'core'): ns3::SequentialRandomVariable [class]
     module.add_class('SequentialRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EpcTft, ns3::empty, ns3::DefaultDeleter<ns3::EpcTft> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EpcTft, ns3::empty, ns3::DefaultDeleter<ns3::EpcTft>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EpcTft', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EpcTft>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EpcTftClassifier, ns3::empty, ns3::DefaultDeleter<ns3::EpcTftClassifier> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EpcTftClassifier, ns3::empty, ns3::DefaultDeleter<ns3::EpcTftClassifier>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EpcTftClassifier', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EpcTftClassifier>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv4MulticastRoute', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv4Route', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv4Route>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LteChunkProcessor, ns3::empty, ns3::DefaultDeleter<ns3::LteChunkProcessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LteChunkProcessor, ns3::empty, ns3::DefaultDeleter<ns3::LteChunkProcessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::LteChunkProcessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::LteChunkProcessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LteControlMessage, ns3::empty, ns3::DefaultDeleter<ns3::LteControlMessage> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LteControlMessage, ns3::empty, ns3::DefaultDeleter<ns3::LteControlMessage>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::LteControlMessage', 'ns3::empty', 'ns3::DefaultDeleter<ns3::LteControlMessage>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LteHarqPhy, ns3::empty, ns3::DefaultDeleter<ns3::LteHarqPhy> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LteHarqPhy, ns3::empty, ns3::DefaultDeleter<ns3::LteHarqPhy>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::LteHarqPhy', 'ns3::empty', 'ns3::DefaultDeleter<ns3::LteHarqPhy>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::SpectrumModel', 'ns3::empty', 'ns3::DefaultDeleter<ns3::SpectrumModel>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::SpectrumSignalParameters', 'ns3::empty', 'ns3::DefaultDeleter<ns3::SpectrumSignalParameters>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::SpectrumValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::SpectrumValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::VendorSpecificValue, ns3::empty, ns3::DefaultDeleter<ns3::VendorSpecificValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::VendorSpecificValue, ns3::empty, ns3::DefaultDeleter<ns3::VendorSpecificValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::VendorSpecificValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::VendorSpecificValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::X2CellInfo, ns3::empty, ns3::DefaultDeleter<ns3::X2CellInfo> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::X2CellInfo, ns3::empty, ns3::DefaultDeleter<ns3::X2CellInfo>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::X2CellInfo', 'ns3::empty', 'ns3::DefaultDeleter<ns3::X2CellInfo>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::X2IfaceInfo, ns3::empty, ns3::DefaultDeleter<ns3::X2IfaceInfo> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::X2IfaceInfo, ns3::empty, ns3::DefaultDeleter<ns3::X2IfaceInfo>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::X2IfaceInfo', 'ns3::empty', 'ns3::DefaultDeleter<ns3::X2IfaceInfo>'])
     ## socket.h (module 'network'): ns3::Socket [class]
     module.add_class('Socket', import_from_module='ns.network', parent=root_module['ns3::Object'])
@@ -1140,6 +1153,8 @@
     module.add_class('ZetaRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
     ## random-variable-stream.h (module 'core'): ns3::ZipfRandomVariable [class]
     module.add_class('ZipfRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
+    ## antenna-model.h (module 'antenna'): ns3::AntennaModel [class]
+    module.add_class('AntennaModel', import_from_module='ns.antenna', parent=root_module['ns3::Object'])
     ## application.h (module 'network'): ns3::Application [class]
     module.add_class('Application', import_from_module='ns.network', parent=root_module['ns3::Object'])
     typehandlers.add_type_alias('void ( * ) ( ns3::Time const &, ns3::Address const & )', 'ns3::Application::DelayAddressCallback')
@@ -1714,8 +1729,8 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<const ns3::PacketBurst>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::SpectrumPhy>, ns3::Ptr<const ns3::SpectrumPhy>, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<const ns3::SpectrumPhy>', 'ns3::Ptr<const ns3::SpectrumPhy>', 'double', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::LteUeRrc>, std::list<ns3::LteRrcSap::SCellToAddMod, std::allocator<ns3::LteRrcSap::SCellToAddMod> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::LteUeRrc>', 'std::list<ns3::LteRrcSap::SCellToAddMod, std::allocator<ns3::LteRrcSap::SCellToAddMod> >', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::LteUeRrc>, std::list<ns3::LteRrcSap::SCellToAddMod, std::allocator<ns3::LteRrcSap::SCellToAddMod>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::LteUeRrc>', 'std::list<ns3::LteRrcSap::SCellToAddMod, std::allocator<ns3::LteRrcSap::SCellToAddMod>>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<const ns3::Packet>, unsigned short, const ns3::Address &, const ns3::Address &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'const ns3::Address &', 'const ns3::Address &', 'ns3::NetDevice::PacketType', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
@@ -1754,8 +1769,8 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned long', 'unsigned short', 'unsigned short', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned long, unsigned short, unsigned short, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned long', 'unsigned short', 'unsigned short', 'unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned short, const std::vector<int, std::allocator<int> > &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned short', 'const std::vector<int, std::allocator<int> > &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned short, const std::vector<int, std::allocator<int>> &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned short', 'const std::vector<int, std::allocator<int>> &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned short, ns3::Ptr<ns3::SpectrumValue>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned short', 'ns3::Ptr<ns3::SpectrumValue>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned short, unsigned char, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
@@ -1848,6 +1863,7 @@
     module.add_class('RrcConnectionSetupHeader', parent=root_module['ns3::RrcDlCcchMessage'])
     ## lte-enb-net-device.h (module 'lte'): ns3::LteEnbNetDevice [class]
     module.add_class('LteEnbNetDevice', parent=root_module['ns3::LteNetDevice'])
+    module.add_container('std::vector< double >', 'double', container_type='vector')
     module.add_container('std::vector< ns3::CeBitmap_e >', 'ns3::CeBitmap_e', container_type='vector')
     module.add_container('std::vector< std::vector< ns3::RlcPduListElement_s > >', 'std::vector< ns3::RlcPduListElement_s >', container_type='vector')
     module.add_container('std::vector< unsigned char >', 'unsigned char', container_type='vector')
@@ -1888,7 +1904,7 @@
     module.add_container('std::vector< ns3::UlDciListElement_s >', 'ns3::UlDciListElement_s', container_type='vector')
     module.add_container('std::vector< ns3::PhichListElement_s >', 'ns3::PhichListElement_s', container_type='vector')
     module.add_container('std::list< ns3::EpcTft::PacketFilter >', 'ns3::EpcTft::PacketFilter', container_type='list')
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     module.add_container('std::vector< ns3::LteCcmRrcSapProvider::LcsConfig >', 'ns3::LteCcmRrcSapProvider::LcsConfig', container_type='vector')
     module.add_container('std::vector< ns3::LteRrcSap::LogicalChannelConfig >', 'ns3::LteRrcSap::LogicalChannelConfig', container_type='vector')
     module.add_container('std::map< unsigned short, std::vector< double > >', ('short unsigned int', 'std::vector< double >'), container_type='map')
@@ -1903,9 +1919,8 @@
     module.add_container('std::list< ns3::LteRrcSap::ReportConfigToAddMod >', 'ns3::LteRrcSap::ReportConfigToAddMod', container_type='list')
     module.add_container('std::list< ns3::LteRrcSap::MeasIdToAddMod >', 'ns3::LteRrcSap::MeasIdToAddMod', container_type='list')
     module.add_container('std::list< unsigned int >', 'unsigned int', container_type='list')
-    module.add_container('std::list< ns3::LteRrcSap::MeasResultScell >', 'ns3::LteRrcSap::MeasResultScell', container_type='list')
-    module.add_container('std::list< ns3::LteRrcSap::MeasResultBestNeighCell >', 'ns3::LteRrcSap::MeasResultBestNeighCell', container_type='list')
     module.add_container('std::list< ns3::LteRrcSap::MeasResultEutra >', 'ns3::LteRrcSap::MeasResultEutra', container_type='list')
+    module.add_container('std::list< ns3::LteRrcSap::MeasResultServFreq >', 'ns3::LteRrcSap::MeasResultServFreq', container_type='list')
     module.add_container('std::list< ns3::LteRrcSap::SCellToAddMod >', 'ns3::LteRrcSap::SCellToAddMod', container_type='list')
     module.add_container('std::map< int, double >', ('int', 'double'), container_type='map')
     module.add_container('std::vector< ns3::LteUeCcmRrcSapProvider::LcsConfig >', 'ns3::LteUeCcmRrcSapProvider::LcsConfig', container_type='vector')
@@ -1913,8 +1928,9 @@
     module.add_container('std::vector< ns3::HigherLayerSelected_s >', 'ns3::HigherLayerSelected_s', container_type='vector')
     module.add_container('std::vector< ns3::SiMessageListElement_s >', 'ns3::SiMessageListElement_s', container_type='vector')
     module.add_container('std::list< ns3::Ptr< ns3::Packet > >', 'ns3::Ptr< ns3::Packet >', container_type='list')
+    module.add_container('std::vector< std::complex< double > >', 'std::complex< double >', container_type='vector')
+    module.add_container('ns3::PhasedArrayModel::ComplexVector', 'std::complex< double >', container_type='vector')
     module.add_container('std::vector< ns3::Ipv6Address >', 'ns3::Ipv6Address', container_type='vector')
-    module.add_container('std::vector< double >', 'double', container_type='vector')
     module.add_container('std::vector< ns3::BandInfo >', 'ns3::BandInfo', container_type='vector')
     module.add_container('std::map< unsigned char, ns3::ComponentCarrier >', ('unsigned char', 'ns3::ComponentCarrier'), container_type='map')
     module.add_container('std::list< ns3::GtpcModifyBearerRequestMessage::BearerContextToBeModified >', 'ns3::GtpcModifyBearerRequestMessage::BearerContextToBeModified', container_type='list')
@@ -1947,27 +1963,6 @@
     typehandlers.add_type_alias('std::vector< unsigned char >', 'ns3::UlHarqProcessesStatus_t')
     typehandlers.add_type_alias('std::vector< unsigned char >*', 'ns3::UlHarqProcessesStatus_t*')
     typehandlers.add_type_alias('std::vector< unsigned char >&', 'ns3::UlHarqProcessesStatus_t&')
-    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, unsigned int >', 'ns3::Uint32Map')
-    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, unsigned int >*', 'ns3::Uint32Map*')
-    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, unsigned int >&', 'ns3::Uint32Map&')
-    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, unsigned long >', 'ns3::Uint64Map')
-    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, unsigned long >*', 'ns3::Uint64Map*')
-    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, unsigned long >&', 'ns3::Uint64Map&')
-    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, ns3::Ptr< ns3::MinMaxAvgTotalCalculator< unsigned int > > >', 'ns3::Uint32StatsMap')
-    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, ns3::Ptr< ns3::MinMaxAvgTotalCalculator< unsigned int > > >*', 'ns3::Uint32StatsMap*')
-    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, ns3::Ptr< ns3::MinMaxAvgTotalCalculator< unsigned int > > >&', 'ns3::Uint32StatsMap&')
-    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, ns3::Ptr< ns3::MinMaxAvgTotalCalculator< unsigned long > > >', 'ns3::Uint64StatsMap')
-    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, ns3::Ptr< ns3::MinMaxAvgTotalCalculator< unsigned long > > >*', 'ns3::Uint64StatsMap*')
-    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, ns3::Ptr< ns3::MinMaxAvgTotalCalculator< unsigned long > > >&', 'ns3::Uint64StatsMap&')
-    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, double >', 'ns3::DoubleMap')
-    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, double >*', 'ns3::DoubleMap*')
-    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, double >&', 'ns3::DoubleMap&')
-    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, ns3::LteFlowId_t >', 'ns3::FlowIdMap')
-    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, ns3::LteFlowId_t >*', 'ns3::FlowIdMap*')
-    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, ns3::LteFlowId_t >&', 'ns3::FlowIdMap&')
-    typehandlers.add_type_alias('std::vector< std::vector< ns3::Ptr< ns3::PacketBurst > > >', 'ns3::DlHarqProcessesBuffer_t')
-    typehandlers.add_type_alias('std::vector< std::vector< ns3::Ptr< ns3::PacketBurst > > >*', 'ns3::DlHarqProcessesBuffer_t*')
-    typehandlers.add_type_alias('std::vector< std::vector< ns3::Ptr< ns3::PacketBurst > > >&', 'ns3::DlHarqProcessesBuffer_t&')
     typehandlers.add_type_alias('ns3::Callback< void, ns3::SpectrumValue const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::LteChunkProcessorCallback')
     typehandlers.add_type_alias('ns3::Callback< void, ns3::SpectrumValue const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::LteChunkProcessorCallback*')
     typehandlers.add_type_alias('ns3::Callback< void, ns3::SpectrumValue const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::LteChunkProcessorCallback&')
@@ -2025,6 +2020,27 @@
     typehandlers.add_type_alias('ns3::Vector3DChecker*', 'ns3::VectorChecker*')
     typehandlers.add_type_alias('ns3::Vector3DChecker&', 'ns3::VectorChecker&')
     module.add_typedef(root_module['ns3::Vector3DChecker'], 'VectorChecker')
+    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, unsigned int >', 'ns3::Uint32Map')
+    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, unsigned int >*', 'ns3::Uint32Map*')
+    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, unsigned int >&', 'ns3::Uint32Map&')
+    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, unsigned long >', 'ns3::Uint64Map')
+    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, unsigned long >*', 'ns3::Uint64Map*')
+    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, unsigned long >&', 'ns3::Uint64Map&')
+    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, ns3::Ptr< ns3::MinMaxAvgTotalCalculator< unsigned int > > >', 'ns3::Uint32StatsMap')
+    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, ns3::Ptr< ns3::MinMaxAvgTotalCalculator< unsigned int > > >*', 'ns3::Uint32StatsMap*')
+    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, ns3::Ptr< ns3::MinMaxAvgTotalCalculator< unsigned int > > >&', 'ns3::Uint32StatsMap&')
+    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, ns3::Ptr< ns3::MinMaxAvgTotalCalculator< unsigned long > > >', 'ns3::Uint64StatsMap')
+    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, ns3::Ptr< ns3::MinMaxAvgTotalCalculator< unsigned long > > >*', 'ns3::Uint64StatsMap*')
+    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, ns3::Ptr< ns3::MinMaxAvgTotalCalculator< unsigned long > > >&', 'ns3::Uint64StatsMap&')
+    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, double >', 'ns3::DoubleMap')
+    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, double >*', 'ns3::DoubleMap*')
+    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, double >&', 'ns3::DoubleMap&')
+    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, ns3::LteFlowId_t >', 'ns3::FlowIdMap')
+    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, ns3::LteFlowId_t >*', 'ns3::FlowIdMap*')
+    typehandlers.add_type_alias('std::map< ns3::ImsiLcidPair_t, ns3::LteFlowId_t >&', 'ns3::FlowIdMap&')
+    typehandlers.add_type_alias('std::vector< std::vector< ns3::Ptr< ns3::PacketBurst > > >', 'ns3::DlHarqProcessesBuffer_t')
+    typehandlers.add_type_alias('std::vector< std::vector< ns3::Ptr< ns3::PacketBurst > > >*', 'ns3::DlHarqProcessesBuffer_t*')
+    typehandlers.add_type_alias('std::vector< std::vector< ns3::Ptr< ns3::PacketBurst > > >&', 'ns3::DlHarqProcessesBuffer_t&')
     typehandlers.add_type_alias('std::vector< double >', 'ns3::Values')
     typehandlers.add_type_alias('std::vector< double >*', 'ns3::Values*')
     typehandlers.add_type_alias('std::vector< double >&', 'ns3::Values&')
@@ -2080,7 +2096,7 @@
     typehandlers.add_type_alias('std::vector< ns3::Ptr< ns3::Object > > const_iterator*', 'ns3::Config::MatchContainer::Iterator*')
     typehandlers.add_type_alias('std::vector< ns3::Ptr< ns3::Object > > const_iterator&', 'ns3::Config::MatchContainer::Iterator&')
     module.add_container('std::vector< ns3::Ptr< ns3::Object > >', 'ns3::Ptr< ns3::Object >', container_type='vector')
-    module.add_container('std::vector< std::string >', 'std::string', container_type='vector')
+    module.add_container('std::vector< std::string >', 'std::basic_string< char, std::char_traits< char >, std::allocator< char > >', container_type='vector')
 
 def register_types_ns3_FatalImpl(module):
     root_module = module.get_root()
@@ -2166,6 +2182,7 @@
 def register_methods(root_module):
     register_Ns3Address_methods(root_module, root_module['ns3::Address'])
     register_Ns3AllocationRetentionPriority_methods(root_module, root_module['ns3::AllocationRetentionPriority'])
+    register_Ns3Angles_methods(root_module, root_module['ns3::Angles'])
     register_Ns3AttributeConstructionList_methods(root_module, root_module['ns3::AttributeConstructionList'])
     register_Ns3AttributeConstructionListItem_methods(root_module, root_module['ns3::AttributeConstructionList::Item'])
     register_Ns3BandInfo_methods(root_module, root_module['ns3::BandInfo'])
@@ -2383,8 +2400,9 @@
     register_Ns3LteRrcSapMeasObjectToAddMod_methods(root_module, root_module['ns3::LteRrcSap::MeasObjectToAddMod'])
     register_Ns3LteRrcSapMeasResultBestNeighCell_methods(root_module, root_module['ns3::LteRrcSap::MeasResultBestNeighCell'])
     register_Ns3LteRrcSapMeasResultEutra_methods(root_module, root_module['ns3::LteRrcSap::MeasResultEutra'])
-    register_Ns3LteRrcSapMeasResultScell_methods(root_module, root_module['ns3::LteRrcSap::MeasResultScell'])
-    register_Ns3LteRrcSapMeasResultServFreqList_methods(root_module, root_module['ns3::LteRrcSap::MeasResultServFreqList'])
+    register_Ns3LteRrcSapMeasResultPCell_methods(root_module, root_module['ns3::LteRrcSap::MeasResultPCell'])
+    register_Ns3LteRrcSapMeasResultSCell_methods(root_module, root_module['ns3::LteRrcSap::MeasResultSCell'])
+    register_Ns3LteRrcSapMeasResultServFreq_methods(root_module, root_module['ns3::LteRrcSap::MeasResultServFreq'])
     register_Ns3LteRrcSapMeasResults_methods(root_module, root_module['ns3::LteRrcSap::MeasResults'])
     register_Ns3LteRrcSapMeasurementReport_methods(root_module, root_module['ns3::LteRrcSap::MeasurementReport'])
     register_Ns3LteRrcSapMobilityControlInfo_methods(root_module, root_module['ns3::LteRrcSap::MobilityControlInfo'])
@@ -2545,6 +2563,8 @@
     register_Ns3ObjectAggregateIterator_methods(root_module, root_module['ns3::Object::AggregateIterator'])
     register_Ns3PacketBurst_methods(root_module, root_module['ns3::PacketBurst'])
     register_Ns3PdcpTag_methods(root_module, root_module['ns3::PdcpTag'])
+    register_Ns3PhasedArrayModel_methods(root_module, root_module['ns3::PhasedArrayModel'])
+    register_Ns3PhasedArraySpectrumPropagationLossModel_methods(root_module, root_module['ns3::PhasedArraySpectrumPropagationLossModel'])
     register_Ns3PropagationDelayModel_methods(root_module, root_module['ns3::PropagationDelayModel'])
     register_Ns3PropagationLossModel_methods(root_module, root_module['ns3::PropagationLossModel'])
     register_Ns3RadioEnvironmentMapHelper_methods(root_module, root_module['ns3::RadioEnvironmentMapHelper'])
@@ -2602,6 +2622,7 @@
     register_Ns3X2IfaceInfo_methods(root_module, root_module['ns3::X2IfaceInfo'])
     register_Ns3ZetaRandomVariable_methods(root_module, root_module['ns3::ZetaRandomVariable'])
     register_Ns3ZipfRandomVariable_methods(root_module, root_module['ns3::ZipfRandomVariable'])
+    register_Ns3AntennaModel_methods(root_module, root_module['ns3::AntennaModel'])
     register_Ns3Application_methods(root_module, root_module['ns3::Application'])
     register_Ns3Asn1Header_methods(root_module, root_module['ns3::Asn1Header'])
     register_Ns3AttributeAccessor_methods(root_module, root_module['ns3::AttributeAccessor'])
@@ -2806,7 +2827,7 @@
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::Packet>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3PacketBurst__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::PacketBurst>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3SpectrumPhy__gt___Ns3Ptr__lt__const_ns3SpectrumPhy__gt___Double_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::SpectrumPhy>, ns3::Ptr<const ns3::SpectrumPhy>, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3LteUeRrc__gt___StdList__lt__ns3LteRrcSapSCellToAddMod__stdAllocator__lt__ns3LteRrcSapSCellToAddMod__gt_____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::LteUeRrc>, std::list<ns3::LteRrcSap::SCellToAddMod, std::allocator<ns3::LteRrcSap::SCellToAddMod> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3LteUeRrc__gt___StdList__lt__ns3LteRrcSapSCellToAddMod__stdAllocator__lt__ns3LteRrcSapSCellToAddMod__gt____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::LteUeRrc>, std::list<ns3::LteRrcSap::SCellToAddMod, std::allocator<ns3::LteRrcSap::SCellToAddMod>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3NetDevice__gt___Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_short_Const_ns3Address___amp___Const_ns3Address___amp___Ns3NetDevicePacketType_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<const ns3::Packet>, unsigned short, const ns3::Address &, const ns3::Address &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3NetDevice__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::NetDevice>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3Packet__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::Packet>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
@@ -2826,7 +2847,7 @@
     register_Ns3CallbackImpl__Void_Unsigned_long_Unsigned_short_Unsigned_short_StdBasic_string__lt__char__gt___Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned long, unsigned short, unsigned short, std::basic_string<char>, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Unsigned_long_Unsigned_short_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Unsigned_long_Unsigned_short_Unsigned_short_Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned long, unsigned short, unsigned short, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3CallbackImpl__Void_Unsigned_short_Const_stdVector__lt__int__stdAllocator__lt__int__gt_____gt_____amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned short, const std::vector<int, std::allocator<int> > &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Unsigned_short_Const_stdVector__lt__int__stdAllocator__lt__int__gt____gt_____amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned short, const std::vector<int, std::allocator<int>> &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Unsigned_short_Ns3Ptr__lt__ns3SpectrumValue__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned short, ns3::Ptr<ns3::SpectrumValue>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Unsigned_short_Unsigned_char_Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned short, unsigned char, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Unsigned_short_Unsigned_char_Unsigned_int_Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned short, unsigned char, unsigned int, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
@@ -2961,6 +2982,38 @@
     cls.add_instance_attribute('priorityLevel', 'uint8_t', is_const=False)
     return
 
+def register_Ns3Angles_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## angles.h (module 'antenna'): ns3::Angles::Angles(ns3::Angles const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Angles const &', 'arg0')])
+    ## angles.h (module 'antenna'): ns3::Angles::Angles(double azimuth, double inclination) [constructor]
+    cls.add_constructor([param('double', 'azimuth'), param('double', 'inclination')])
+    ## angles.h (module 'antenna'): ns3::Angles::Angles(ns3::Vector v) [constructor]
+    cls.add_constructor([param('ns3::Vector', 'v')])
+    ## angles.h (module 'antenna'): ns3::Angles::Angles(ns3::Vector v, ns3::Vector o) [constructor]
+    cls.add_constructor([param('ns3::Vector', 'v'), param('ns3::Vector', 'o')])
+    ## angles.h (module 'antenna'): double ns3::Angles::GetAzimuth() const [member function]
+    cls.add_method('GetAzimuth', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## angles.h (module 'antenna'): double ns3::Angles::GetInclination() const [member function]
+    cls.add_method('GetInclination', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## angles.h (module 'antenna'): void ns3::Angles::SetAzimuth(double azimuth) [member function]
+    cls.add_method('SetAzimuth', 
+                   'void', 
+                   [param('double', 'azimuth')])
+    ## angles.h (module 'antenna'): void ns3::Angles::SetInclination(double inclination) [member function]
+    cls.add_method('SetInclination', 
+                   'void', 
+                   [param('double', 'inclination')])
+    ## angles.h (module 'antenna'): ns3::Angles::m_printDeg [variable]
+    cls.add_static_attribute('m_printDeg', 'bool', is_const=False)
+    return
+
 def register_Ns3AttributeConstructionList_methods(root_module, cls):
     ## attribute-construction-list.h (module 'core'): ns3::AttributeConstructionList::AttributeConstructionList(ns3::AttributeConstructionList const & arg0) [constructor]
     cls.add_constructor([param('ns3::AttributeConstructionList const &', 'arg0')])
@@ -4268,12 +4321,12 @@
     cls.add_constructor([])
     ## epc-s1ap-sap.h (module 'lte'): ns3::EpcS1apSapEnb::EpcS1apSapEnb(ns3::EpcS1apSapEnb const & arg0) [constructor]
     cls.add_constructor([param('ns3::EpcS1apSapEnb const &', 'arg0')])
-    ## epc-s1ap-sap.h (module 'lte'): void ns3::EpcS1apSapEnb::InitialContextSetupRequest(uint64_t mmeUeS1Id, uint16_t enbUeS1Id, std::list<ns3::EpcS1apSapEnb::ErabToBeSetupItem, std::allocator<ns3::EpcS1apSapEnb::ErabToBeSetupItem> > erabToBeSetupList) [member function]
+    ## epc-s1ap-sap.h (module 'lte'): void ns3::EpcS1apSapEnb::InitialContextSetupRequest(uint64_t mmeUeS1Id, uint16_t enbUeS1Id, std::list<ns3::EpcS1apSapEnb::ErabToBeSetupItem, std::allocator<ns3::EpcS1apSapEnb::ErabToBeSetupItem>> erabToBeSetupList) [member function]
     cls.add_method('InitialContextSetupRequest', 
                    'void', 
                    [param('uint64_t', 'mmeUeS1Id'), param('uint16_t', 'enbUeS1Id'), param('std::list< ns3::EpcS1apSapEnb::ErabToBeSetupItem >', 'erabToBeSetupList')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## epc-s1ap-sap.h (module 'lte'): void ns3::EpcS1apSapEnb::PathSwitchRequestAcknowledge(uint64_t enbUeS1Id, uint64_t mmeUeS1Id, uint16_t cgi, std::list<ns3::EpcS1apSapEnb::ErabSwitchedInUplinkItem, std::allocator<ns3::EpcS1apSapEnb::ErabSwitchedInUplinkItem> > erabToBeSwitchedInUplinkList) [member function]
+    ## epc-s1ap-sap.h (module 'lte'): void ns3::EpcS1apSapEnb::PathSwitchRequestAcknowledge(uint64_t enbUeS1Id, uint64_t mmeUeS1Id, uint16_t cgi, std::list<ns3::EpcS1apSapEnb::ErabSwitchedInUplinkItem, std::allocator<ns3::EpcS1apSapEnb::ErabSwitchedInUplinkItem>> erabToBeSwitchedInUplinkList) [member function]
     cls.add_method('PathSwitchRequestAcknowledge', 
                    'void', 
                    [param('uint64_t', 'enbUeS1Id'), param('uint64_t', 'mmeUeS1Id'), param('uint16_t', 'cgi'), param('std::list< ns3::EpcS1apSapEnb::ErabSwitchedInUplinkItem >', 'erabToBeSwitchedInUplinkList')], 
@@ -4313,12 +4366,12 @@
     cls.add_constructor([])
     ## epc-s1ap-sap.h (module 'lte'): ns3::EpcS1apSapMme::EpcS1apSapMme(ns3::EpcS1apSapMme const & arg0) [constructor]
     cls.add_constructor([param('ns3::EpcS1apSapMme const &', 'arg0')])
-    ## epc-s1ap-sap.h (module 'lte'): void ns3::EpcS1apSapMme::ErabReleaseIndication(uint64_t mmeUeS1Id, uint16_t enbUeS1Id, std::list<ns3::EpcS1apSapMme::ErabToBeReleasedIndication, std::allocator<ns3::EpcS1apSapMme::ErabToBeReleasedIndication> > erabToBeReleaseIndication) [member function]
+    ## epc-s1ap-sap.h (module 'lte'): void ns3::EpcS1apSapMme::ErabReleaseIndication(uint64_t mmeUeS1Id, uint16_t enbUeS1Id, std::list<ns3::EpcS1apSapMme::ErabToBeReleasedIndication, std::allocator<ns3::EpcS1apSapMme::ErabToBeReleasedIndication>> erabToBeReleaseIndication) [member function]
     cls.add_method('ErabReleaseIndication', 
                    'void', 
                    [param('uint64_t', 'mmeUeS1Id'), param('uint16_t', 'enbUeS1Id'), param('std::list< ns3::EpcS1apSapMme::ErabToBeReleasedIndication >', 'erabToBeReleaseIndication')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## epc-s1ap-sap.h (module 'lte'): void ns3::EpcS1apSapMme::InitialContextSetupResponse(uint64_t mmeUeS1Id, uint16_t enbUeS1Id, std::list<ns3::EpcS1apSapMme::ErabSetupItem, std::allocator<ns3::EpcS1apSapMme::ErabSetupItem> > erabSetupList) [member function]
+    ## epc-s1ap-sap.h (module 'lte'): void ns3::EpcS1apSapMme::InitialContextSetupResponse(uint64_t mmeUeS1Id, uint16_t enbUeS1Id, std::list<ns3::EpcS1apSapMme::ErabSetupItem, std::allocator<ns3::EpcS1apSapMme::ErabSetupItem>> erabSetupList) [member function]
     cls.add_method('InitialContextSetupResponse', 
                    'void', 
                    [param('uint64_t', 'mmeUeS1Id'), param('uint16_t', 'enbUeS1Id'), param('std::list< ns3::EpcS1apSapMme::ErabSetupItem >', 'erabSetupList')], 
@@ -4328,7 +4381,7 @@
                    'void', 
                    [param('uint64_t', 'mmeUeS1Id'), param('uint16_t', 'enbUeS1Id'), param('uint64_t', 'stmsi'), param('uint16_t', 'ecgi')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## epc-s1ap-sap.h (module 'lte'): void ns3::EpcS1apSapMme::PathSwitchRequest(uint64_t enbUeS1Id, uint64_t mmeUeS1Id, uint16_t gci, std::list<ns3::EpcS1apSapMme::ErabSwitchedInDownlinkItem, std::allocator<ns3::EpcS1apSapMme::ErabSwitchedInDownlinkItem> > erabToBeSwitchedInDownlinkList) [member function]
+    ## epc-s1ap-sap.h (module 'lte'): void ns3::EpcS1apSapMme::PathSwitchRequest(uint64_t enbUeS1Id, uint64_t mmeUeS1Id, uint16_t gci, std::list<ns3::EpcS1apSapMme::ErabSwitchedInDownlinkItem, std::allocator<ns3::EpcS1apSapMme::ErabSwitchedInDownlinkItem>> erabToBeSwitchedInDownlinkList) [member function]
     cls.add_method('PathSwitchRequest', 
                    'void', 
                    [param('uint64_t', 'enbUeS1Id'), param('uint64_t', 'mmeUeS1Id'), param('uint16_t', 'gci'), param('std::list< ns3::EpcS1apSapMme::ErabSwitchedInDownlinkItem >', 'erabToBeSwitchedInDownlinkList')], 
@@ -5519,7 +5572,7 @@
     cls.add_instance_attribute('serializedSizeBearerQos', 'uint32_t const', is_const=True)
     ## epc-gtpc-header.h (module 'lte'): ns3::GtpcIes::serializedSizePacketFilter [variable]
     cls.add_instance_attribute('serializedSizePacketFilter', 'uint32_t const', is_const=True)
-    ## epc-gtpc-header.h (module 'lte'): uint32_t ns3::GtpcIes::GetSerializedSizeBearerTft(std::list<ns3::EpcTft::PacketFilter, std::allocator<ns3::EpcTft::PacketFilter> > packetFilters) const [member function]
+    ## epc-gtpc-header.h (module 'lte'): uint32_t ns3::GtpcIes::GetSerializedSizeBearerTft(std::list<ns3::EpcTft::PacketFilter, std::allocator<ns3::EpcTft::PacketFilter>> packetFilters) const [member function]
     cls.add_method('GetSerializedSizeBearerTft', 
                    'uint32_t', 
                    [param('std::list< ns3::EpcTft::PacketFilter >', 'packetFilters')], 
@@ -5575,7 +5628,7 @@
     cls.add_method('DeserializeBearerQos', 
                    'uint32_t', 
                    [param('ns3::Buffer::Iterator &', 'i'), param('ns3::EpsBearer &', 'bearerQos')])
-    ## epc-gtpc-header.h (module 'lte'): void ns3::GtpcIes::SerializeBearerTft(ns3::Buffer::Iterator & i, std::list<ns3::EpcTft::PacketFilter, std::allocator<ns3::EpcTft::PacketFilter> > packetFilters) const [member function]
+    ## epc-gtpc-header.h (module 'lte'): void ns3::GtpcIes::SerializeBearerTft(ns3::Buffer::Iterator & i, std::list<ns3::EpcTft::PacketFilter, std::allocator<ns3::EpcTft::PacketFilter>> packetFilters) const [member function]
     cls.add_method('SerializeBearerTft', 
                    'void', 
                    [param('ns3::Buffer::Iterator &', 'i'), param('std::list< ns3::EpcTft::PacketFilter >', 'packetFilters')], 
@@ -6370,11 +6423,11 @@
     cls.add_method('Assign', 
                    'ns3::Ipv6InterfaceContainer', 
                    [param('ns3::NetDeviceContainer const &', 'c')])
-    ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6InterfaceContainer ns3::Ipv6AddressHelper::Assign(ns3::NetDeviceContainer const & c, std::vector<bool, std::allocator<bool> > withConfiguration) [member function]
+    ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6InterfaceContainer ns3::Ipv6AddressHelper::Assign(ns3::NetDeviceContainer const & c, std::vector<bool, std::allocator<bool>> withConfiguration) [member function]
     cls.add_method('Assign', 
                    'ns3::Ipv6InterfaceContainer', 
                    [param('ns3::NetDeviceContainer const &', 'c'), param('std::vector< bool >', 'withConfiguration')])
-    ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6InterfaceContainer ns3::Ipv6AddressHelper::Assign(ns3::NetDeviceContainer const & c, std::vector<bool, std::allocator<bool> > withConfiguration, std::vector<bool, std::allocator<bool> > onLink) [member function]
+    ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6InterfaceContainer ns3::Ipv6AddressHelper::Assign(ns3::NetDeviceContainer const & c, std::vector<bool, std::allocator<bool>> withConfiguration, std::vector<bool, std::allocator<bool>> onLink) [member function]
     cls.add_method('Assign', 
                    'ns3::Ipv6InterfaceContainer', 
                    [param('ns3::NetDeviceContainer const &', 'c'), param('std::vector< bool >', 'withConfiguration'), param('std::vector< bool >', 'onLink')])
@@ -6837,7 +6890,7 @@
                    'ns3::LteMacSapUser *', 
                    [param('ns3::LteEnbCmacSapProvider::LcInfo', 'lcInfo'), param('ns3::LteMacSapUser *', 'rlcMacSapUser')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## lte-ccm-rrc-sap.h (module 'lte'): std::vector<unsigned char, std::allocator<unsigned char> > ns3::LteCcmRrcSapProvider::ReleaseDataRadioBearer(uint16_t rnti, uint8_t lcid) [member function]
+    ## lte-ccm-rrc-sap.h (module 'lte'): std::vector<unsigned char, std::allocator<unsigned char>> ns3::LteCcmRrcSapProvider::ReleaseDataRadioBearer(uint16_t rnti, uint8_t lcid) [member function]
     cls.add_method('ReleaseDataRadioBearer', 
                    'std::vector< unsigned char >', 
                    [param('uint16_t', 'rnti'), param('uint8_t', 'lcid')], 
@@ -6852,7 +6905,7 @@
                    'void', 
                    [param('uint16_t', 'rnti'), param('ns3::LteRrcSap::MeasResults', 'measResults')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## lte-ccm-rrc-sap.h (module 'lte'): std::vector<ns3::LteCcmRrcSapProvider::LcsConfig, std::allocator<ns3::LteCcmRrcSapProvider::LcsConfig> > ns3::LteCcmRrcSapProvider::SetupDataRadioBearer(ns3::EpsBearer bearer, uint8_t bearerId, uint16_t rnti, uint8_t lcid, uint8_t lcGroup, ns3::LteMacSapUser * msu) [member function]
+    ## lte-ccm-rrc-sap.h (module 'lte'): std::vector<ns3::LteCcmRrcSapProvider::LcsConfig, std::allocator<ns3::LteCcmRrcSapProvider::LcsConfig>> ns3::LteCcmRrcSapProvider::SetupDataRadioBearer(ns3::EpsBearer bearer, uint8_t bearerId, uint16_t rnti, uint8_t lcid, uint8_t lcGroup, ns3::LteMacSapUser * msu) [member function]
     cls.add_method('SetupDataRadioBearer', 
                    'std::vector< ns3::LteCcmRrcSapProvider::LcsConfig >', 
                    [param('ns3::EpsBearer', 'bearer'), param('uint8_t', 'bearerId'), param('uint16_t', 'rnti'), param('uint8_t', 'lcid'), param('uint8_t', 'lcGroup'), param('ns3::LteMacSapUser *', 'msu')], 
@@ -6877,7 +6930,7 @@
     cls.add_constructor([])
     ## lte-ccm-rrc-sap.h (module 'lte'): ns3::LteCcmRrcSapUser::LteCcmRrcSapUser(ns3::LteCcmRrcSapUser const & arg0) [constructor]
     cls.add_constructor([param('ns3::LteCcmRrcSapUser const &', 'arg0')])
-    ## lte-ccm-rrc-sap.h (module 'lte'): void ns3::LteCcmRrcSapUser::AddLcs(std::vector<ns3::LteRrcSap::LogicalChannelConfig, std::allocator<ns3::LteRrcSap::LogicalChannelConfig> > lcConfig) [member function]
+    ## lte-ccm-rrc-sap.h (module 'lte'): void ns3::LteCcmRrcSapUser::AddLcs(std::vector<ns3::LteRrcSap::LogicalChannelConfig, std::allocator<ns3::LteRrcSap::LogicalChannelConfig>> lcConfig) [member function]
     cls.add_method('AddLcs', 
                    'void', 
                    [param('std::vector< ns3::LteRrcSap::LogicalChannelConfig >', 'lcConfig')], 
@@ -7272,12 +7325,12 @@
     cls.add_constructor([])
     ## lte-ffr-sap.h (module 'lte'): ns3::LteFfrSapProvider::LteFfrSapProvider(ns3::LteFfrSapProvider const & arg0) [constructor]
     cls.add_constructor([param('ns3::LteFfrSapProvider const &', 'arg0')])
-    ## lte-ffr-sap.h (module 'lte'): std::vector<bool, std::allocator<bool> > ns3::LteFfrSapProvider::GetAvailableDlRbg() [member function]
+    ## lte-ffr-sap.h (module 'lte'): std::vector<bool, std::allocator<bool>> ns3::LteFfrSapProvider::GetAvailableDlRbg() [member function]
     cls.add_method('GetAvailableDlRbg', 
                    'std::vector< bool >', 
                    [], 
                    is_pure_virtual=True, is_virtual=True)
-    ## lte-ffr-sap.h (module 'lte'): std::vector<bool, std::allocator<bool> > ns3::LteFfrSapProvider::GetAvailableUlRbg() [member function]
+    ## lte-ffr-sap.h (module 'lte'): std::vector<bool, std::allocator<bool>> ns3::LteFfrSapProvider::GetAvailableUlRbg() [member function]
     cls.add_method('GetAvailableUlRbg', 
                    'std::vector< bool >', 
                    [], 
@@ -7312,7 +7365,7 @@
                    'void', 
                    [param('ns3::FfMacSchedSapProvider::SchedUlCqiInfoReqParameters const &', 'params')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## lte-ffr-sap.h (module 'lte'): void ns3::LteFfrSapProvider::ReportUlCqiInfo(std::map<unsigned short, std::vector<double, std::allocator<double> >, std::less<unsigned short>, std::allocator<std::pair<const unsigned short, std::vector<double, std::allocator<double> > > > > ulCqiMap) [member function]
+    ## lte-ffr-sap.h (module 'lte'): void ns3::LteFfrSapProvider::ReportUlCqiInfo(std::map<unsigned short, std::vector<double, std::allocator<double>>, std::less<unsigned short>, std::allocator<std::pair<const unsigned short, std::vector<double, std::allocator<double>>>>> ulCqiMap) [member function]
     cls.add_method('ReportUlCqiInfo', 
                    'void', 
                    [param('std::map< unsigned short, std::vector< double > >', 'ulCqiMap')], 
@@ -7378,9 +7431,9 @@
     cls.add_constructor([])
     ## lte-handover-management-sap.h (module 'lte'): ns3::LteHandoverManagementSapUser::LteHandoverManagementSapUser(ns3::LteHandoverManagementSapUser const & arg0) [constructor]
     cls.add_constructor([param('ns3::LteHandoverManagementSapUser const &', 'arg0')])
-    ## lte-handover-management-sap.h (module 'lte'): uint8_t ns3::LteHandoverManagementSapUser::AddUeMeasReportConfigForHandover(ns3::LteRrcSap::ReportConfigEutra reportConfig) [member function]
+    ## lte-handover-management-sap.h (module 'lte'): std::vector<unsigned char, std::allocator<unsigned char>> ns3::LteHandoverManagementSapUser::AddUeMeasReportConfigForHandover(ns3::LteRrcSap::ReportConfigEutra reportConfig) [member function]
     cls.add_method('AddUeMeasReportConfigForHandover', 
-                   'uint8_t', 
+                   'std::vector< unsigned char >', 
                    [param('ns3::LteRrcSap::ReportConfigEutra', 'reportConfig')], 
                    is_pure_virtual=True, is_virtual=True)
     ## lte-handover-management-sap.h (module 'lte'): void ns3::LteHandoverManagementSapUser::TriggerHandover(uint16_t rnti, uint16_t targetCellId) [member function]
@@ -7515,7 +7568,7 @@
                    'double', 
                    [param('ns3::SpectrumValue const &', 'sinr')], 
                    is_static=True)
-    ## lte-mi-error-model.h (module 'lte'): static ns3::TbStats_t ns3::LteMiErrorModel::GetTbDecodificationStats(ns3::SpectrumValue const & sinr, std::vector<int, std::allocator<int> > const & map, uint16_t size, uint8_t mcs, ns3::HarqProcessInfoList_t miHistory) [member function]
+    ## lte-mi-error-model.h (module 'lte'): static ns3::TbStats_t ns3::LteMiErrorModel::GetTbDecodificationStats(ns3::SpectrumValue const & sinr, std::vector<int, std::allocator<int>> const & map, uint16_t size, uint8_t mcs, ns3::HarqProcessInfoList_t miHistory) [member function]
     cls.add_method('GetTbDecodificationStats', 
                    'ns3::TbStats_t', 
                    [param('ns3::SpectrumValue const &', 'sinr'), param('std::vector< int > const &', 'map'), param('uint16_t', 'size'), param('uint8_t', 'mcs'), param('std::vector< ns3::HarqProcessInfoElement_t >', 'miHistory')], 
@@ -7525,7 +7578,7 @@
                    'double', 
                    [param('double', 'mib'), param('uint8_t', 'ecrId'), param('uint16_t', 'cbSize')], 
                    is_static=True)
-    ## lte-mi-error-model.h (module 'lte'): static double ns3::LteMiErrorModel::Mib(ns3::SpectrumValue const & sinr, std::vector<int, std::allocator<int> > const & map, uint8_t mcs) [member function]
+    ## lte-mi-error-model.h (module 'lte'): static double ns3::LteMiErrorModel::Mib(ns3::SpectrumValue const & sinr, std::vector<int, std::allocator<int>> const & map, uint8_t mcs) [member function]
     cls.add_method('Mib', 
                    'double', 
                    [param('ns3::SpectrumValue const &', 'sinr'), param('std::vector< int > const &', 'map'), param('uint8_t', 'mcs')], 
@@ -7948,18 +8001,12 @@
     cls.add_constructor([])
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultBestNeighCell::MeasResultBestNeighCell(ns3::LteRrcSap::MeasResultBestNeighCell const & arg0) [constructor]
     cls.add_constructor([param('ns3::LteRrcSap::MeasResultBestNeighCell const &', 'arg0')])
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultBestNeighCell::haveRsrpResult [variable]
-    cls.add_instance_attribute('haveRsrpResult', 'bool', is_const=False)
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultBestNeighCell::haveRsrqResult [variable]
-    cls.add_instance_attribute('haveRsrqResult', 'bool', is_const=False)
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultBestNeighCell::physCellId [variable]
     cls.add_instance_attribute('physCellId', 'uint16_t', is_const=False)
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultBestNeighCell::rsrpResult [variable]
     cls.add_instance_attribute('rsrpResult', 'uint8_t', is_const=False)
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultBestNeighCell::rsrqResult [variable]
     cls.add_instance_attribute('rsrqResult', 'uint8_t', is_const=False)
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultBestNeighCell::servFreqId [variable]
-    cls.add_instance_attribute('servFreqId', 'uint16_t', is_const=False)
     return
 
 def register_Ns3LteRrcSapMeasResultEutra_methods(root_module, cls):
@@ -7983,36 +8030,43 @@
     cls.add_instance_attribute('rsrqResult', 'uint8_t', is_const=False)
     return
 
-def register_Ns3LteRrcSapMeasResultScell_methods(root_module, cls):
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultScell::MeasResultScell() [constructor]
+def register_Ns3LteRrcSapMeasResultPCell_methods(root_module, cls):
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultPCell::MeasResultPCell() [constructor]
     cls.add_constructor([])
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultScell::MeasResultScell(ns3::LteRrcSap::MeasResultScell const & arg0) [constructor]
-    cls.add_constructor([param('ns3::LteRrcSap::MeasResultScell const &', 'arg0')])
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultScell::haveRsrpResult [variable]
-    cls.add_instance_attribute('haveRsrpResult', 'bool', is_const=False)
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultScell::haveRsrqResult [variable]
-    cls.add_instance_attribute('haveRsrqResult', 'bool', is_const=False)
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultScell::rsrpResult [variable]
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultPCell::MeasResultPCell(ns3::LteRrcSap::MeasResultPCell const & arg0) [constructor]
+    cls.add_constructor([param('ns3::LteRrcSap::MeasResultPCell const &', 'arg0')])
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultPCell::rsrpResult [variable]
     cls.add_instance_attribute('rsrpResult', 'uint8_t', is_const=False)
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultScell::rsrqResult [variable]
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultPCell::rsrqResult [variable]
     cls.add_instance_attribute('rsrqResult', 'uint8_t', is_const=False)
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultScell::servFreqId [variable]
-    cls.add_instance_attribute('servFreqId', 'uint16_t', is_const=False)
     return
 
-def register_Ns3LteRrcSapMeasResultServFreqList_methods(root_module, cls):
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultServFreqList::MeasResultServFreqList() [constructor]
+def register_Ns3LteRrcSapMeasResultSCell_methods(root_module, cls):
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultSCell::MeasResultSCell() [constructor]
     cls.add_constructor([])
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultServFreqList::MeasResultServFreqList(ns3::LteRrcSap::MeasResultServFreqList const & arg0) [constructor]
-    cls.add_constructor([param('ns3::LteRrcSap::MeasResultServFreqList const &', 'arg0')])
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultServFreqList::haveMeasurementResultsNeighCell [variable]
-    cls.add_instance_attribute('haveMeasurementResultsNeighCell', 'bool', is_const=False)
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultServFreqList::haveMeasurementResultsServingSCells [variable]
-    cls.add_instance_attribute('haveMeasurementResultsServingSCells', 'bool', is_const=False)
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultServFreqList::measResultBestNeighCell [variable]
-    cls.add_instance_attribute('measResultBestNeighCell', 'std::list< ns3::LteRrcSap::MeasResultBestNeighCell >', is_const=False)
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultServFreqList::measResultScell [variable]
-    cls.add_instance_attribute('measResultScell', 'std::list< ns3::LteRrcSap::MeasResultScell >', is_const=False)
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultSCell::MeasResultSCell(ns3::LteRrcSap::MeasResultSCell const & arg0) [constructor]
+    cls.add_constructor([param('ns3::LteRrcSap::MeasResultSCell const &', 'arg0')])
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultSCell::rsrpResult [variable]
+    cls.add_instance_attribute('rsrpResult', 'uint8_t', is_const=False)
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultSCell::rsrqResult [variable]
+    cls.add_instance_attribute('rsrqResult', 'uint8_t', is_const=False)
+    return
+
+def register_Ns3LteRrcSapMeasResultServFreq_methods(root_module, cls):
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultServFreq::MeasResultServFreq() [constructor]
+    cls.add_constructor([])
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultServFreq::MeasResultServFreq(ns3::LteRrcSap::MeasResultServFreq const & arg0) [constructor]
+    cls.add_constructor([param('ns3::LteRrcSap::MeasResultServFreq const &', 'arg0')])
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultServFreq::haveMeasResultBestNeighCell [variable]
+    cls.add_instance_attribute('haveMeasResultBestNeighCell', 'bool', is_const=False)
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultServFreq::haveMeasResultSCell [variable]
+    cls.add_instance_attribute('haveMeasResultSCell', 'bool', is_const=False)
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultServFreq::measResultBestNeighCell [variable]
+    cls.add_instance_attribute('measResultBestNeighCell', 'ns3::LteRrcSap::MeasResultBestNeighCell', is_const=False)
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultServFreq::measResultSCell [variable]
+    cls.add_instance_attribute('measResultSCell', 'ns3::LteRrcSap::MeasResultSCell', is_const=False)
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultServFreq::servFreqId [variable]
+    cls.add_instance_attribute('servFreqId', 'uint16_t', is_const=False)
     return
 
 def register_Ns3LteRrcSapMeasResults_methods(root_module, cls):
@@ -8022,18 +8076,16 @@
     cls.add_constructor([param('ns3::LteRrcSap::MeasResults const &', 'arg0')])
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResults::haveMeasResultNeighCells [variable]
     cls.add_instance_attribute('haveMeasResultNeighCells', 'bool', is_const=False)
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResults::haveScellsMeas [variable]
-    cls.add_instance_attribute('haveScellsMeas', 'bool', is_const=False)
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResults::haveMeasResultServFreqList [variable]
+    cls.add_instance_attribute('haveMeasResultServFreqList', 'bool', is_const=False)
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResults::measId [variable]
     cls.add_instance_attribute('measId', 'uint8_t', is_const=False)
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResults::measResultListEutra [variable]
     cls.add_instance_attribute('measResultListEutra', 'std::list< ns3::LteRrcSap::MeasResultEutra >', is_const=False)
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResults::measScellResultList [variable]
-    cls.add_instance_attribute('measScellResultList', 'ns3::LteRrcSap::MeasResultServFreqList', is_const=False)
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResults::rsrpResult [variable]
-    cls.add_instance_attribute('rsrpResult', 'uint8_t', is_const=False)
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResults::rsrqResult [variable]
-    cls.add_instance_attribute('rsrqResult', 'uint8_t', is_const=False)
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResults::measResultPCell [variable]
+    cls.add_instance_attribute('measResultPCell', 'ns3::LteRrcSap::MeasResultPCell', is_const=False)
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResults::measResultServFreqList [variable]
+    cls.add_instance_attribute('measResultServFreqList', 'std::list< ns3::LteRrcSap::MeasResultServFreq >', is_const=False)
     return
 
 def register_Ns3LteRrcSapMeasurementReport_methods(root_module, cls):
@@ -8090,10 +8142,10 @@
     cls.add_constructor([])
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::NonCriticalExtensionConfiguration::NonCriticalExtensionConfiguration(ns3::LteRrcSap::NonCriticalExtensionConfiguration const & arg0) [constructor]
     cls.add_constructor([param('ns3::LteRrcSap::NonCriticalExtensionConfiguration const &', 'arg0')])
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::NonCriticalExtensionConfiguration::sCellToAddModList [variable]
+    cls.add_instance_attribute('sCellToAddModList', 'std::list< ns3::LteRrcSap::SCellToAddMod >', is_const=False)
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::NonCriticalExtensionConfiguration::sCellToReleaseList [variable]
-    cls.add_instance_attribute('sCellToReleaseList', 'std::list< unsigned int >', is_const=False)
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::NonCriticalExtensionConfiguration::sCellsToAddModList [variable]
-    cls.add_instance_attribute('sCellsToAddModList', 'std::list< ns3::LteRrcSap::SCellToAddMod >', is_const=False)
+    cls.add_instance_attribute('sCellToReleaseList', 'std::list< unsigned char >', is_const=False)
     return
 
 def register_Ns3LteRrcSapNonUlConfiguration_methods(root_module, cls):
@@ -8523,8 +8575,8 @@
     cls.add_instance_attribute('haveRadioResourceConfigDedicatedSCell', 'bool', is_const=False)
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::SCellToAddMod::radioResourceConfigCommonSCell [variable]
     cls.add_instance_attribute('radioResourceConfigCommonSCell', 'ns3::LteRrcSap::RadioResourceConfigCommonSCell', is_const=False)
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::SCellToAddMod::radioResourceConfigDedicateSCell [variable]
-    cls.add_instance_attribute('radioResourceConfigDedicateSCell', 'ns3::LteRrcSap::RadioResourceConfigDedicatedSCell', is_const=False)
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::SCellToAddMod::radioResourceConfigDedicatedSCell [variable]
+    cls.add_instance_attribute('radioResourceConfigDedicatedSCell', 'ns3::LteRrcSap::RadioResourceConfigDedicatedSCell', is_const=False)
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::SCellToAddMod::sCellIndex [variable]
     cls.add_instance_attribute('sCellIndex', 'uint32_t', is_const=False)
     return
@@ -8704,17 +8756,17 @@
                    'ns3::Ptr< ns3::SpectrumValue >', 
                    [param('double', 'noiseFigure'), param('ns3::Ptr< ns3::SpectrumModel >', 'spectrumModel')], 
                    is_static=True)
-    ## lte-spectrum-value-helper.h (module 'lte'): static ns3::Ptr<ns3::SpectrumValue> ns3::LteSpectrumValueHelper::CreateTxPowerSpectralDensity(uint32_t earfcn, uint16_t bandwidth, double powerTx, std::vector<int, std::allocator<int> > activeRbs) [member function]
+    ## lte-spectrum-value-helper.h (module 'lte'): static ns3::Ptr<ns3::SpectrumValue> ns3::LteSpectrumValueHelper::CreateTxPowerSpectralDensity(uint32_t earfcn, uint16_t bandwidth, double powerTx, std::vector<int, std::allocator<int>> activeRbs) [member function]
     cls.add_method('CreateTxPowerSpectralDensity', 
                    'ns3::Ptr< ns3::SpectrumValue >', 
                    [param('uint32_t', 'earfcn'), param('uint16_t', 'bandwidth'), param('double', 'powerTx'), param('std::vector< int >', 'activeRbs')], 
                    is_static=True)
-    ## lte-spectrum-value-helper.h (module 'lte'): static ns3::Ptr<ns3::SpectrumValue> ns3::LteSpectrumValueHelper::CreateTxPowerSpectralDensity(uint32_t earfcn, uint16_t bandwidth, double powerTx, std::map<int, double, std::less<int>, std::allocator<std::pair<const int, double> > > powerTxMap, std::vector<int, std::allocator<int> > activeRbs) [member function]
+    ## lte-spectrum-value-helper.h (module 'lte'): static ns3::Ptr<ns3::SpectrumValue> ns3::LteSpectrumValueHelper::CreateTxPowerSpectralDensity(uint32_t earfcn, uint16_t bandwidth, double powerTx, std::map<int, double, std::less<int>, std::allocator<std::pair<const int, double>>> powerTxMap, std::vector<int, std::allocator<int>> activeRbs) [member function]
     cls.add_method('CreateTxPowerSpectralDensity', 
                    'ns3::Ptr< ns3::SpectrumValue >', 
                    [param('uint32_t', 'earfcn'), param('uint16_t', 'bandwidth'), param('double', 'powerTx'), param('std::map< int, double >', 'powerTxMap'), param('std::vector< int >', 'activeRbs')], 
                    is_static=True)
-    ## lte-spectrum-value-helper.h (module 'lte'): static ns3::Ptr<ns3::SpectrumValue> ns3::LteSpectrumValueHelper::CreateUlTxPowerSpectralDensity(uint16_t earfcn, uint16_t bandwidth, double powerTx, std::vector<int, std::allocator<int> > activeRbs) [member function]
+    ## lte-spectrum-value-helper.h (module 'lte'): static ns3::Ptr<ns3::SpectrumValue> ns3::LteSpectrumValueHelper::CreateUlTxPowerSpectralDensity(uint16_t earfcn, uint16_t bandwidth, double powerTx, std::vector<int, std::allocator<int>> activeRbs) [member function]
     cls.add_method('CreateUlTxPowerSpectralDensity', 
                    'ns3::Ptr< ns3::SpectrumValue >', 
                    [param('uint16_t', 'earfcn'), param('uint16_t', 'bandwidth'), param('double', 'powerTx'), param('std::vector< int >', 'activeRbs')], 
@@ -8761,7 +8813,7 @@
     cls.add_constructor([])
     ## lte-ue-ccm-rrc-sap.h (module 'lte'): ns3::LteUeCcmRrcSapProvider::LteUeCcmRrcSapProvider(ns3::LteUeCcmRrcSapProvider const & arg0) [constructor]
     cls.add_constructor([param('ns3::LteUeCcmRrcSapProvider const &', 'arg0')])
-    ## lte-ue-ccm-rrc-sap.h (module 'lte'): std::vector<ns3::LteUeCcmRrcSapProvider::LcsConfig, std::allocator<ns3::LteUeCcmRrcSapProvider::LcsConfig> > ns3::LteUeCcmRrcSapProvider::AddLc(uint8_t lcId, ns3::LteUeCmacSapProvider::LogicalChannelConfig lcConfig, ns3::LteMacSapUser * msu) [member function]
+    ## lte-ue-ccm-rrc-sap.h (module 'lte'): std::vector<ns3::LteUeCcmRrcSapProvider::LcsConfig, std::allocator<ns3::LteUeCcmRrcSapProvider::LcsConfig>> ns3::LteUeCcmRrcSapProvider::AddLc(uint8_t lcId, ns3::LteUeCmacSapProvider::LogicalChannelConfig lcConfig, ns3::LteMacSapUser * msu) [member function]
     cls.add_method('AddLc', 
                    'std::vector< ns3::LteUeCcmRrcSapProvider::LcsConfig >', 
                    [param('uint8_t', 'lcId'), param('ns3::LteUeCmacSapProvider::LogicalChannelConfig', 'lcConfig'), param('ns3::LteMacSapUser *', 'msu')], 
@@ -8776,7 +8828,7 @@
                    'void', 
                    [], 
                    is_pure_virtual=True, is_virtual=True)
-    ## lte-ue-ccm-rrc-sap.h (module 'lte'): std::vector<unsigned short, std::allocator<unsigned short> > ns3::LteUeCcmRrcSapProvider::RemoveLc(uint8_t lcid) [member function]
+    ## lte-ue-ccm-rrc-sap.h (module 'lte'): std::vector<unsigned short, std::allocator<unsigned short>> ns3::LteUeCcmRrcSapProvider::RemoveLc(uint8_t lcid) [member function]
     cls.add_method('RemoveLc', 
                    'std::vector< unsigned short >', 
                    [param('uint8_t', 'lcid')], 
@@ -8806,7 +8858,7 @@
     cls.add_constructor([])
     ## lte-ue-ccm-rrc-sap.h (module 'lte'): ns3::LteUeCcmRrcSapUser::LteUeCcmRrcSapUser(ns3::LteUeCcmRrcSapUser const & arg0) [constructor]
     cls.add_constructor([param('ns3::LteUeCcmRrcSapUser const &', 'arg0')])
-    ## lte-ue-ccm-rrc-sap.h (module 'lte'): void ns3::LteUeCcmRrcSapUser::ComponentCarrierEnabling(std::vector<unsigned char, std::allocator<unsigned char> > componentCarrierList) [member function]
+    ## lte-ue-ccm-rrc-sap.h (module 'lte'): void ns3::LteUeCcmRrcSapUser::ComponentCarrierEnabling(std::vector<unsigned char, std::allocator<unsigned char>> componentCarrierList) [member function]
     cls.add_method('ComponentCarrierEnabling', 
                    'void', 
                    [param('std::vector< unsigned char >', 'componentCarrierList')], 
@@ -8954,6 +9006,16 @@
                    'void', 
                    [param('uint32_t', 'ulEarfcn'), param('uint16_t', 'ulBandwidth')], 
                    is_pure_virtual=True, is_virtual=True)
+    ## lte-ue-cphy-sap.h (module 'lte'): uint16_t ns3::LteUeCphySapProvider::GetCellId() [member function]
+    cls.add_method('GetCellId', 
+                   'uint16_t', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## lte-ue-cphy-sap.h (module 'lte'): uint32_t ns3::LteUeCphySapProvider::GetDlEarfcn() [member function]
+    cls.add_method('GetDlEarfcn', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
     ## lte-ue-cphy-sap.h (module 'lte'): void ns3::LteUeCphySapProvider::Reset() [member function]
     cls.add_method('Reset', 
                    'void', 
@@ -10697,8 +10759,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -11179,14 +11241,14 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('>=')
     cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_unary_numeric_operator('-')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
     cls.add_constructor([])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(double const value) [constructor]
@@ -11205,6 +11267,8 @@
     cls.add_constructor([param('long unsigned int const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int const v) [constructor]
     cls.add_constructor([param('long long unsigned int const', 'v')])
+    ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int128_t const v) [constructor]
+    cls.add_constructor([param('int128_t const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t const hi, uint64_t const lo) [constructor]
     cls.add_constructor([param('int64_t const', 'hi'), param('uint64_t const', 'lo')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [constructor]
@@ -12397,7 +12461,7 @@
     cls.add_method('AddPacket', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet >', 'packet')])
-    ## packet-burst.h (module 'network'): std::list<ns3::Ptr<ns3::Packet>, std::allocator<ns3::Ptr<ns3::Packet> > >::const_iterator ns3::PacketBurst::Begin() const [member function]
+    ## packet-burst.h (module 'network'): std::list<ns3::Ptr<ns3::Packet>, std::allocator<ns3::Ptr<ns3::Packet>>>::const_iterator ns3::PacketBurst::Begin() const [member function]
     cls.add_method('Begin', 
                    'std::list< ns3::Ptr< ns3::Packet > > const_iterator', 
                    [], 
@@ -12407,7 +12471,7 @@
                    'ns3::Ptr< ns3::PacketBurst >', 
                    [], 
                    is_const=True)
-    ## packet-burst.h (module 'network'): std::list<ns3::Ptr<ns3::Packet>, std::allocator<ns3::Ptr<ns3::Packet> > >::const_iterator ns3::PacketBurst::End() const [member function]
+    ## packet-burst.h (module 'network'): std::list<ns3::Ptr<ns3::Packet>, std::allocator<ns3::Ptr<ns3::Packet>>>::const_iterator ns3::PacketBurst::End() const [member function]
     cls.add_method('End', 
                    'std::list< ns3::Ptr< ns3::Packet > > const_iterator', 
                    [], 
@@ -12417,7 +12481,7 @@
                    'uint32_t', 
                    [], 
                    is_const=True)
-    ## packet-burst.h (module 'network'): std::list<ns3::Ptr<ns3::Packet>, std::allocator<ns3::Ptr<ns3::Packet> > > ns3::PacketBurst::GetPackets() const [member function]
+    ## packet-burst.h (module 'network'): std::list<ns3::Ptr<ns3::Packet>, std::allocator<ns3::Ptr<ns3::Packet>>> ns3::PacketBurst::GetPackets() const [member function]
     cls.add_method('GetPackets', 
                    'std::list< ns3::Ptr< ns3::Packet > >', 
                    [], 
@@ -12487,6 +12551,102 @@
                    [param('ns3::Time', 'senderTimestamp')])
     return
 
+def register_Ns3PhasedArrayModel_methods(root_module, cls):
+    ## phased-array-model.h (module 'antenna'): ns3::PhasedArrayModel::PhasedArrayModel(ns3::PhasedArrayModel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::PhasedArrayModel const &', 'arg0')])
+    ## phased-array-model.h (module 'antenna'): ns3::PhasedArrayModel::PhasedArrayModel() [constructor]
+    cls.add_constructor([])
+    ## phased-array-model.h (module 'antenna'): ns3::Ptr<const ns3::AntennaModel> ns3::PhasedArrayModel::GetAntennaElement() const [member function]
+    cls.add_method('GetAntennaElement', 
+                   'ns3::Ptr< ns3::AntennaModel const >', 
+                   [], 
+                   is_const=True)
+    ## phased-array-model.h (module 'antenna'): ns3::PhasedArrayModel::ComplexVector ns3::PhasedArrayModel::GetBeamformingVector() const [member function]
+    cls.add_method('GetBeamformingVector', 
+                   'ns3::PhasedArrayModel::ComplexVector', 
+                   [], 
+                   is_const=True)
+    ## phased-array-model.h (module 'antenna'): ns3::PhasedArrayModel::ComplexVector ns3::PhasedArrayModel::GetBeamformingVector(ns3::Angles a) const [member function]
+    cls.add_method('GetBeamformingVector', 
+                   'ns3::PhasedArrayModel::ComplexVector', 
+                   [param('ns3::Angles', 'a')], 
+                   is_const=True)
+    ## phased-array-model.h (module 'antenna'): std::pair<double, double> ns3::PhasedArrayModel::GetElementFieldPattern(ns3::Angles a) const [member function]
+    cls.add_method('GetElementFieldPattern', 
+                   'std::pair< double, double >', 
+                   [param('ns3::Angles', 'a')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## phased-array-model.h (module 'antenna'): ns3::Vector ns3::PhasedArrayModel::GetElementLocation(uint64_t index) const [member function]
+    cls.add_method('GetElementLocation', 
+                   'ns3::Vector', 
+                   [param('uint64_t', 'index')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## phased-array-model.h (module 'antenna'): uint32_t ns3::PhasedArrayModel::GetId() const [member function]
+    cls.add_method('GetId', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## phased-array-model.h (module 'antenna'): uint64_t ns3::PhasedArrayModel::GetNumberOfElements() const [member function]
+    cls.add_method('GetNumberOfElements', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## phased-array-model.h (module 'antenna'): ns3::PhasedArrayModel::ComplexVector ns3::PhasedArrayModel::GetSteeringVector(ns3::Angles a) const [member function]
+    cls.add_method('GetSteeringVector', 
+                   'ns3::PhasedArrayModel::ComplexVector', 
+                   [param('ns3::Angles', 'a')], 
+                   is_const=True)
+    ## phased-array-model.h (module 'antenna'): static ns3::TypeId ns3::PhasedArrayModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## phased-array-model.h (module 'antenna'): void ns3::PhasedArrayModel::SetAntennaElement(ns3::Ptr<ns3::AntennaModel> antennaElement) [member function]
+    cls.add_method('SetAntennaElement', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::AntennaModel >', 'antennaElement')])
+    ## phased-array-model.h (module 'antenna'): void ns3::PhasedArrayModel::SetBeamformingVector(ns3::PhasedArrayModel::ComplexVector const & beamformingVector) [member function]
+    cls.add_method('SetBeamformingVector', 
+                   'void', 
+                   [param('ns3::PhasedArrayModel::ComplexVector const &', 'beamformingVector')])
+    ## phased-array-model.h (module 'antenna'): static double ns3::PhasedArrayModel::ComputeNorm(ns3::PhasedArrayModel::ComplexVector const & vector) [member function]
+    cls.add_method('ComputeNorm', 
+                   'double', 
+                   [param('ns3::PhasedArrayModel::ComplexVector const &', 'vector')], 
+                   is_static=True, visibility='protected')
+    return
+
+def register_Ns3PhasedArraySpectrumPropagationLossModel_methods(root_module, cls):
+    ## phased-array-spectrum-propagation-loss-model.h (module 'spectrum'): ns3::PhasedArraySpectrumPropagationLossModel::PhasedArraySpectrumPropagationLossModel(ns3::PhasedArraySpectrumPropagationLossModel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::PhasedArraySpectrumPropagationLossModel const &', 'arg0')])
+    ## phased-array-spectrum-propagation-loss-model.h (module 'spectrum'): ns3::PhasedArraySpectrumPropagationLossModel::PhasedArraySpectrumPropagationLossModel() [constructor]
+    cls.add_constructor([])
+    ## phased-array-spectrum-propagation-loss-model.h (module 'spectrum'): ns3::Ptr<ns3::SpectrumValue> ns3::PhasedArraySpectrumPropagationLossModel::CalcRxPowerSpectralDensity(ns3::Ptr<const ns3::SpectrumValue> txPsd, ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b, ns3::Ptr<const ns3::PhasedArrayModel> aPhasedArrayModel, ns3::Ptr<const ns3::PhasedArrayModel> bPhasedArrayModel) const [member function]
+    cls.add_method('CalcRxPowerSpectralDensity', 
+                   'ns3::Ptr< ns3::SpectrumValue >', 
+                   [param('ns3::Ptr< ns3::SpectrumValue const >', 'txPsd'), param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b'), param('ns3::Ptr< ns3::PhasedArrayModel const >', 'aPhasedArrayModel'), param('ns3::Ptr< ns3::PhasedArrayModel const >', 'bPhasedArrayModel')], 
+                   is_const=True)
+    ## phased-array-spectrum-propagation-loss-model.h (module 'spectrum'): static ns3::TypeId ns3::PhasedArraySpectrumPropagationLossModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## phased-array-spectrum-propagation-loss-model.h (module 'spectrum'): void ns3::PhasedArraySpectrumPropagationLossModel::SetNext(ns3::Ptr<ns3::PhasedArraySpectrumPropagationLossModel> next) [member function]
+    cls.add_method('SetNext', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::PhasedArraySpectrumPropagationLossModel >', 'next')])
+    ## phased-array-spectrum-propagation-loss-model.h (module 'spectrum'): void ns3::PhasedArraySpectrumPropagationLossModel::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## phased-array-spectrum-propagation-loss-model.h (module 'spectrum'): ns3::Ptr<ns3::SpectrumValue> ns3::PhasedArraySpectrumPropagationLossModel::DoCalcRxPowerSpectralDensity(ns3::Ptr<const ns3::SpectrumValue> txPsd, ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b, ns3::Ptr<const ns3::PhasedArrayModel> aPhasedArrayModel, ns3::Ptr<const ns3::PhasedArrayModel> bPhasedArrayModel) const [member function]
+    cls.add_method('DoCalcRxPowerSpectralDensity', 
+                   'ns3::Ptr< ns3::SpectrumValue >', 
+                   [param('ns3::Ptr< ns3::SpectrumValue const >', 'txPsd'), param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b'), param('ns3::Ptr< ns3::PhasedArrayModel const >', 'aPhasedArrayModel'), param('ns3::Ptr< ns3::PhasedArrayModel const >', 'bPhasedArrayModel')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
+    return
+
 def register_Ns3PropagationDelayModel_methods(root_module, cls):
     ## propagation-delay-model.h (module 'propagation'): ns3::PropagationDelayModel::PropagationDelayModel() [constructor]
     cls.add_constructor([])
@@ -12510,7 +12670,7 @@
     cls.add_method('DoAssignStreams', 
                    'int64_t', 
                    [param('int64_t', 'stream')], 
-                   is_pure_virtual=True, is_virtual=True, visibility='private')
+                   is_pure_virtual=True, is_virtual=True, visibility='protected')
     return
 
 def register_Ns3PropagationLossModel_methods(root_module, cls):
@@ -12538,16 +12698,16 @@
     cls.add_method('AssignStreams', 
                    'int64_t', 
                    [param('int64_t', 'stream')])
+    ## propagation-loss-model.h (module 'propagation'): int64_t ns3::PropagationLossModel::DoAssignStreams(int64_t stream) [member function]
+    cls.add_method('DoAssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')], 
+                   is_pure_virtual=True, is_virtual=True, visibility='protected')
     ## propagation-loss-model.h (module 'propagation'): double ns3::PropagationLossModel::DoCalcRxPower(double txPowerDbm, ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
     cls.add_method('DoCalcRxPower', 
                    'double', 
                    [param('double', 'txPowerDbm'), param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
                    is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
-    ## propagation-loss-model.h (module 'propagation'): int64_t ns3::PropagationLossModel::DoAssignStreams(int64_t stream) [member function]
-    cls.add_method('DoAssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'stream')], 
-                   is_pure_virtual=True, is_virtual=True, visibility='private')
     return
 
 def register_Ns3RadioEnvironmentMapHelper_methods(root_module, cls):
@@ -12772,156 +12932,156 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EpcTft_Ns3Empty_Ns3DefaultDeleter__lt__ns3EpcTft__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EpcTft, ns3::empty, ns3::DefaultDeleter<ns3::EpcTft> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EpcTft, ns3::empty, ns3::DefaultDeleter<ns3::EpcTft>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EpcTft, ns3::empty, ns3::DefaultDeleter<ns3::EpcTft> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EpcTft, ns3::empty, ns3::DefaultDeleter<ns3::EpcTft> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EpcTft, ns3::empty, ns3::DefaultDeleter<ns3::EpcTft>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EpcTft, ns3::empty, ns3::DefaultDeleter<ns3::EpcTft>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EpcTft, ns3::empty, ns3::DefaultDeleter< ns3::EpcTft > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EpcTftClassifier_Ns3Empty_Ns3DefaultDeleter__lt__ns3EpcTftClassifier__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EpcTftClassifier, ns3::empty, ns3::DefaultDeleter<ns3::EpcTftClassifier> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EpcTftClassifier, ns3::empty, ns3::DefaultDeleter<ns3::EpcTftClassifier>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EpcTftClassifier, ns3::empty, ns3::DefaultDeleter<ns3::EpcTftClassifier> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EpcTftClassifier, ns3::empty, ns3::DefaultDeleter<ns3::EpcTftClassifier> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EpcTftClassifier, ns3::empty, ns3::DefaultDeleter<ns3::EpcTftClassifier>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EpcTftClassifier, ns3::empty, ns3::DefaultDeleter<ns3::EpcTftClassifier>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EpcTftClassifier, ns3::empty, ns3::DefaultDeleter< ns3::EpcTftClassifier > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Ipv4MulticastRoute_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv4MulticastRoute__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter< ns3::Ipv4MulticastRoute > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Ipv4Route_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv4Route__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter< ns3::Ipv4Route > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3LteChunkProcessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3LteChunkProcessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LteChunkProcessor, ns3::empty, ns3::DefaultDeleter<ns3::LteChunkProcessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LteChunkProcessor, ns3::empty, ns3::DefaultDeleter<ns3::LteChunkProcessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LteChunkProcessor, ns3::empty, ns3::DefaultDeleter<ns3::LteChunkProcessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::LteChunkProcessor, ns3::empty, ns3::DefaultDeleter<ns3::LteChunkProcessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LteChunkProcessor, ns3::empty, ns3::DefaultDeleter<ns3::LteChunkProcessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::LteChunkProcessor, ns3::empty, ns3::DefaultDeleter<ns3::LteChunkProcessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::LteChunkProcessor, ns3::empty, ns3::DefaultDeleter< ns3::LteChunkProcessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3LteControlMessage_Ns3Empty_Ns3DefaultDeleter__lt__ns3LteControlMessage__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LteControlMessage, ns3::empty, ns3::DefaultDeleter<ns3::LteControlMessage> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LteControlMessage, ns3::empty, ns3::DefaultDeleter<ns3::LteControlMessage>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LteControlMessage, ns3::empty, ns3::DefaultDeleter<ns3::LteControlMessage> >::SimpleRefCount(ns3::SimpleRefCount<ns3::LteControlMessage, ns3::empty, ns3::DefaultDeleter<ns3::LteControlMessage> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LteControlMessage, ns3::empty, ns3::DefaultDeleter<ns3::LteControlMessage>>::SimpleRefCount(ns3::SimpleRefCount<ns3::LteControlMessage, ns3::empty, ns3::DefaultDeleter<ns3::LteControlMessage>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::LteControlMessage, ns3::empty, ns3::DefaultDeleter< ns3::LteControlMessage > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3LteHarqPhy_Ns3Empty_Ns3DefaultDeleter__lt__ns3LteHarqPhy__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LteHarqPhy, ns3::empty, ns3::DefaultDeleter<ns3::LteHarqPhy> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LteHarqPhy, ns3::empty, ns3::DefaultDeleter<ns3::LteHarqPhy>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LteHarqPhy, ns3::empty, ns3::DefaultDeleter<ns3::LteHarqPhy> >::SimpleRefCount(ns3::SimpleRefCount<ns3::LteHarqPhy, ns3::empty, ns3::DefaultDeleter<ns3::LteHarqPhy> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LteHarqPhy, ns3::empty, ns3::DefaultDeleter<ns3::LteHarqPhy>>::SimpleRefCount(ns3::SimpleRefCount<ns3::LteHarqPhy, ns3::empty, ns3::DefaultDeleter<ns3::LteHarqPhy>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::LteHarqPhy, ns3::empty, ns3::DefaultDeleter< ns3::LteHarqPhy > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3SpectrumModel_Ns3Empty_Ns3DefaultDeleter__lt__ns3SpectrumModel__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel> >::SimpleRefCount(ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel>>::SimpleRefCount(ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter< ns3::SpectrumModel > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3SpectrumSignalParameters_Ns3Empty_Ns3DefaultDeleter__lt__ns3SpectrumSignalParameters__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters> >::SimpleRefCount(ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters>>::SimpleRefCount(ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter< ns3::SpectrumSignalParameters > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3SpectrumValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3SpectrumValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter< ns3::SpectrumValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3VendorSpecificValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3VendorSpecificValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::VendorSpecificValue, ns3::empty, ns3::DefaultDeleter<ns3::VendorSpecificValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::VendorSpecificValue, ns3::empty, ns3::DefaultDeleter<ns3::VendorSpecificValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::VendorSpecificValue, ns3::empty, ns3::DefaultDeleter<ns3::VendorSpecificValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::VendorSpecificValue, ns3::empty, ns3::DefaultDeleter<ns3::VendorSpecificValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::VendorSpecificValue, ns3::empty, ns3::DefaultDeleter<ns3::VendorSpecificValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::VendorSpecificValue, ns3::empty, ns3::DefaultDeleter<ns3::VendorSpecificValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::VendorSpecificValue, ns3::empty, ns3::DefaultDeleter< ns3::VendorSpecificValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3X2CellInfo_Ns3Empty_Ns3DefaultDeleter__lt__ns3X2CellInfo__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::X2CellInfo, ns3::empty, ns3::DefaultDeleter<ns3::X2CellInfo> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::X2CellInfo, ns3::empty, ns3::DefaultDeleter<ns3::X2CellInfo>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::X2CellInfo, ns3::empty, ns3::DefaultDeleter<ns3::X2CellInfo> >::SimpleRefCount(ns3::SimpleRefCount<ns3::X2CellInfo, ns3::empty, ns3::DefaultDeleter<ns3::X2CellInfo> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::X2CellInfo, ns3::empty, ns3::DefaultDeleter<ns3::X2CellInfo>>::SimpleRefCount(ns3::SimpleRefCount<ns3::X2CellInfo, ns3::empty, ns3::DefaultDeleter<ns3::X2CellInfo>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::X2CellInfo, ns3::empty, ns3::DefaultDeleter< ns3::X2CellInfo > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3X2IfaceInfo_Ns3Empty_Ns3DefaultDeleter__lt__ns3X2IfaceInfo__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::X2IfaceInfo, ns3::empty, ns3::DefaultDeleter<ns3::X2IfaceInfo> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::X2IfaceInfo, ns3::empty, ns3::DefaultDeleter<ns3::X2IfaceInfo>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::X2IfaceInfo, ns3::empty, ns3::DefaultDeleter<ns3::X2IfaceInfo> >::SimpleRefCount(ns3::SimpleRefCount<ns3::X2IfaceInfo, ns3::empty, ns3::DefaultDeleter<ns3::X2IfaceInfo> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::X2IfaceInfo, ns3::empty, ns3::DefaultDeleter<ns3::X2IfaceInfo>>::SimpleRefCount(ns3::SimpleRefCount<ns3::X2IfaceInfo, ns3::empty, ns3::DefaultDeleter<ns3::X2IfaceInfo>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::X2IfaceInfo, ns3::empty, ns3::DefaultDeleter< ns3::X2IfaceInfo > > const &', 'o')])
     return
 
@@ -13044,7 +13204,7 @@
                    'uint8_t', 
                    [param('uint8_t', 'ipTos')], 
                    is_static=True)
-    ## socket.h (module 'network'): void ns3::Socket::Ipv6JoinGroup(ns3::Ipv6Address address, ns3::Socket::Ipv6MulticastFilterMode filterMode, std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address> > sourceAddresses) [member function]
+    ## socket.h (module 'network'): void ns3::Socket::Ipv6JoinGroup(ns3::Ipv6Address address, ns3::Socket::Ipv6MulticastFilterMode filterMode, std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address>> sourceAddresses) [member function]
     cls.add_method('Ipv6JoinGroup', 
                    'void', 
                    [param('ns3::Ipv6Address', 'address'), param('ns3::Socket::Ipv6MulticastFilterMode', 'filterMode'), param('std::vector< ns3::Ipv6Address >', 'sourceAddresses')], 
@@ -13610,16 +13770,16 @@
     cls.add_binary_comparison_operator('==')
     ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(ns3::SpectrumModel const & arg0) [constructor]
     cls.add_constructor([param('ns3::SpectrumModel const &', 'arg0')])
-    ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(std::vector<double, std::allocator<double> > const & centerFreqs) [constructor]
+    ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(std::vector<double, std::allocator<double>> const & centerFreqs) [constructor]
     cls.add_constructor([param('std::vector< double > const &', 'centerFreqs')])
     ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(ns3::Bands const & bands) [constructor]
     cls.add_constructor([param('ns3::Bands const &', 'bands')])
-    ## spectrum-model.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo> >::const_iterator ns3::SpectrumModel::Begin() const [member function]
+    ## spectrum-model.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo>>::const_iterator ns3::SpectrumModel::Begin() const [member function]
     cls.add_method('Begin', 
                    'std::vector< ns3::BandInfo > const_iterator', 
                    [], 
                    is_const=True)
-    ## spectrum-model.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo> >::const_iterator ns3::SpectrumModel::End() const [member function]
+    ## spectrum-model.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo>>::const_iterator ns3::SpectrumModel::End() const [member function]
     cls.add_method('End', 
                    'std::vector< ns3::BandInfo > const_iterator', 
                    [], 
@@ -13679,9 +13839,9 @@
                    'ns3::Ptr< ns3::SpectrumModel const >', 
                    [], 
                    is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::AntennaModel> ns3::SpectrumPhy::GetRxAntenna() const [member function]
-    cls.add_method('GetRxAntenna', 
-                   'ns3::Ptr< ns3::AntennaModel >', 
+    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::Object> ns3::SpectrumPhy::GetAntenna() const [member function]
+    cls.add_method('GetAntenna', 
+                   'ns3::Ptr< ns3::Object >', 
                    [], 
                    is_const=True, is_pure_virtual=True, is_virtual=True)
     ## spectrum-phy.h (module 'spectrum'): void ns3::SpectrumPhy::StartRx(ns3::Ptr<ns3::SpectrumSignalParameters> params) [member function]
@@ -13732,14 +13892,14 @@
                    'ns3::Ptr< ns3::SpectrumSignalParameters >', 
                    [], 
                    is_virtual=True)
-    ## spectrum-signal-parameters.h (module 'spectrum'): ns3::SpectrumSignalParameters::psd [variable]
-    cls.add_instance_attribute('psd', 'ns3::Ptr< ns3::SpectrumValue >', is_const=False)
     ## spectrum-signal-parameters.h (module 'spectrum'): ns3::SpectrumSignalParameters::duration [variable]
     cls.add_instance_attribute('duration', 'ns3::Time', is_const=False)
-    ## spectrum-signal-parameters.h (module 'spectrum'): ns3::SpectrumSignalParameters::txPhy [variable]
-    cls.add_instance_attribute('txPhy', 'ns3::Ptr< ns3::SpectrumPhy >', is_const=False)
+    ## spectrum-signal-parameters.h (module 'spectrum'): ns3::SpectrumSignalParameters::psd [variable]
+    cls.add_instance_attribute('psd', 'ns3::Ptr< ns3::SpectrumValue >', is_const=False)
     ## spectrum-signal-parameters.h (module 'spectrum'): ns3::SpectrumSignalParameters::txAntenna [variable]
     cls.add_instance_attribute('txAntenna', 'ns3::Ptr< ns3::AntennaModel >', is_const=False)
+    ## spectrum-signal-parameters.h (module 'spectrum'): ns3::SpectrumSignalParameters::txPhy [variable]
+    cls.add_instance_attribute('txPhy', 'ns3::Ptr< ns3::SpectrumPhy >', is_const=False)
     return
 
 def register_Ns3SpectrumValue_methods(root_module, cls):
@@ -13767,22 +13927,22 @@
     cls.add_constructor([param('ns3::Ptr< ns3::SpectrumModel const >', 'sm')])
     ## spectrum-value.h (module 'spectrum'): ns3::SpectrumValue::SpectrumValue() [constructor]
     cls.add_constructor([])
-    ## spectrum-value.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo> >::const_iterator ns3::SpectrumValue::ConstBandsBegin() const [member function]
+    ## spectrum-value.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo>>::const_iterator ns3::SpectrumValue::ConstBandsBegin() const [member function]
     cls.add_method('ConstBandsBegin', 
                    'std::vector< ns3::BandInfo > const_iterator', 
                    [], 
                    is_const=True)
-    ## spectrum-value.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo> >::const_iterator ns3::SpectrumValue::ConstBandsEnd() const [member function]
+    ## spectrum-value.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo>>::const_iterator ns3::SpectrumValue::ConstBandsEnd() const [member function]
     cls.add_method('ConstBandsEnd', 
                    'std::vector< ns3::BandInfo > const_iterator', 
                    [], 
                    is_const=True)
-    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double> >::const_iterator ns3::SpectrumValue::ConstValuesBegin() const [member function]
+    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double>>::const_iterator ns3::SpectrumValue::ConstValuesBegin() const [member function]
     cls.add_method('ConstValuesBegin', 
                    'std::vector< double > const_iterator', 
                    [], 
                    is_const=True)
-    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double> >::const_iterator ns3::SpectrumValue::ConstValuesEnd() const [member function]
+    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double>>::const_iterator ns3::SpectrumValue::ConstValuesEnd() const [member function]
     cls.add_method('ConstValuesEnd', 
                    'std::vector< double > const_iterator', 
                    [], 
@@ -13812,11 +13972,11 @@
                    'double const &', 
                    [param('uint32_t', 'pos')], 
                    is_const=True)
-    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double> >::iterator ns3::SpectrumValue::ValuesBegin() [member function]
+    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double>>::iterator ns3::SpectrumValue::ValuesBegin() [member function]
     cls.add_method('ValuesBegin', 
                    'std::vector< double > iterator', 
                    [])
-    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double> >::iterator ns3::SpectrumValue::ValuesEnd() [member function]
+    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double>>::iterator ns3::SpectrumValue::ValuesEnd() [member function]
     cls.add_method('ValuesEnd', 
                    'std::vector< double > iterator', 
                    [])
@@ -14029,7 +14189,7 @@
                    'uint8_t', 
                    [], 
                    is_const=True)
-    ## lte-enb-rrc.h (module 'lte'): std::vector<ns3::EpcX2Sap::ErabToBeSetupItem, std::allocator<ns3::EpcX2Sap::ErabToBeSetupItem> > ns3::UeManager::GetErabList() [member function]
+    ## lte-enb-rrc.h (module 'lte'): std::vector<ns3::EpcX2Sap::ErabToBeSetupItem, std::allocator<ns3::EpcX2Sap::ErabToBeSetupItem>> ns3::UeManager::GetErabList() [member function]
     cls.add_method('GetErabList', 
                    'std::vector< ns3::EpcX2Sap::ErabToBeSetupItem >', 
                    [])
@@ -14047,10 +14207,10 @@
                    'uint16_t', 
                    [], 
                    is_const=True)
-    ## lte-enb-rrc.h (module 'lte'): ns3::LteRrcSap::RrcConnectionReconfiguration ns3::UeManager::GetRrcConnectionReconfigurationForHandover() [member function]
+    ## lte-enb-rrc.h (module 'lte'): ns3::LteRrcSap::RrcConnectionReconfiguration ns3::UeManager::GetRrcConnectionReconfigurationForHandover(uint8_t componentCarrierId) [member function]
     cls.add_method('GetRrcConnectionReconfigurationForHandover', 
                    'ns3::LteRrcSap::RrcConnectionReconfiguration', 
-                   [])
+                   [param('uint8_t', 'componentCarrierId')])
     ## lte-enb-rrc.h (module 'lte'): uint16_t ns3::UeManager::GetSrsConfigurationIndex() const [member function]
     cls.add_method('GetSrsConfigurationIndex', 
                    'uint16_t', 
@@ -14265,12 +14425,12 @@
 def register_Ns3X2CellInfo_methods(root_module, cls):
     ## epc-x2.h (module 'lte'): ns3::X2CellInfo::X2CellInfo(ns3::X2CellInfo const & arg0) [constructor]
     cls.add_constructor([param('ns3::X2CellInfo const &', 'arg0')])
-    ## epc-x2.h (module 'lte'): ns3::X2CellInfo::X2CellInfo(uint16_t localCellId, uint16_t remoteCellId) [constructor]
-    cls.add_constructor([param('uint16_t', 'localCellId'), param('uint16_t', 'remoteCellId')])
-    ## epc-x2.h (module 'lte'): ns3::X2CellInfo::m_localCellId [variable]
-    cls.add_instance_attribute('m_localCellId', 'uint16_t', is_const=False)
-    ## epc-x2.h (module 'lte'): ns3::X2CellInfo::m_remoteCellId [variable]
-    cls.add_instance_attribute('m_remoteCellId', 'uint16_t', is_const=False)
+    ## epc-x2.h (module 'lte'): ns3::X2CellInfo::X2CellInfo(std::vector<unsigned short, std::allocator<unsigned short>> localCellIds, std::vector<unsigned short, std::allocator<unsigned short>> remoteCellIds) [constructor]
+    cls.add_constructor([param('std::vector< unsigned short >', 'localCellIds'), param('std::vector< unsigned short >', 'remoteCellIds')])
+    ## epc-x2.h (module 'lte'): ns3::X2CellInfo::m_localCellIds [variable]
+    cls.add_instance_attribute('m_localCellIds', 'std::vector< unsigned short >', is_const=False)
+    ## epc-x2.h (module 'lte'): ns3::X2CellInfo::m_remoteCellIds [variable]
+    cls.add_instance_attribute('m_remoteCellIds', 'std::vector< unsigned short >', is_const=False)
     return
 
 def register_Ns3X2IfaceInfo_methods(root_module, cls):
@@ -14357,6 +14517,23 @@
                    is_virtual=True)
     return
 
+def register_Ns3AntennaModel_methods(root_module, cls):
+    ## antenna-model.h (module 'antenna'): ns3::AntennaModel::AntennaModel(ns3::AntennaModel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::AntennaModel const &', 'arg0')])
+    ## antenna-model.h (module 'antenna'): ns3::AntennaModel::AntennaModel() [constructor]
+    cls.add_constructor([])
+    ## antenna-model.h (module 'antenna'): double ns3::AntennaModel::GetGainDb(ns3::Angles a) [member function]
+    cls.add_method('GetGainDb', 
+                   'double', 
+                   [param('ns3::Angles', 'a')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## antenna-model.h (module 'antenna'): static ns3::TypeId ns3::AntennaModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    return
+
 def register_Ns3Application_methods(root_module, cls):
     ## application.h (module 'network'): ns3::Application::Application(ns3::Application const & arg0) [constructor]
     cls.add_constructor([param('ns3::Application const &', 'arg0')])
@@ -14886,97 +15063,102 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::NetDevice> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::Socket> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::Packet const> '], visibility='protected')
+                   is_static=True, template_parameters=['bool'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['unsigned short'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Address const&'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Address const&'], visibility='protected')
+                   is_static=True, template_parameters=['unsigned int'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::NetDevice::PacketType'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::NetDevice> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::MobilityModel const> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::Packet const> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::SpectrumPhy const> '], visibility='protected')
+                   is_static=True, template_parameters=['unsigned short'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['double'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::NetDevice::PacketType'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::SpectrumSignalParameters> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::DlSchedulingCallbackInfo'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::PacketBurst const> '], visibility='protected')
+                   is_static=True, template_parameters=['unsigned char'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::PhyReceptionStatParameters'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::MobilityModel const> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['unsigned char'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::SpectrumPhy const> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::SpectrumValue> '], visibility='protected')
+                   is_static=True, template_parameters=['double'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::PhyTransmissionStatParameters'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::SpectrumSignalParameters> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::LteUePhy::State'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::PacketBurst const> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['bool'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::PhyReceptionStatParameters'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['std::vector<int', ' std::allocator<int> > const&'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::SpectrumValue> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::Socket> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::PhyTransmissionStatParameters'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['unsigned int'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::LteUePhy::State'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['std::vector<int', ' std::allocator<int> > const&'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
@@ -15016,11 +15198,6 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::DlSchedulingCallbackInfo'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
                    is_static=True, template_parameters=['ns3::LteUeRrc::State'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
@@ -15076,7 +15253,7 @@
                    'void', 
                    [], 
                    is_virtual=True)
-    ## cc-helper.h (module 'lte'): std::map<unsigned char, ns3::ComponentCarrier, std::less<unsigned char>, std::allocator<std::pair<const unsigned char, ns3::ComponentCarrier> > > ns3::CcHelper::EquallySpacedCcs() [member function]
+    ## cc-helper.h (module 'lte'): std::map<unsigned char, ns3::ComponentCarrier, std::less<unsigned char>, std::allocator<std::pair<const unsigned char, ns3::ComponentCarrier>>> ns3::CcHelper::EquallySpacedCcs() [member function]
     cls.add_method('EquallySpacedCcs', 
                    'std::map< unsigned char, ns3::ComponentCarrier >', 
                    [])
@@ -15826,10 +16003,10 @@
     cls.add_constructor([param('ns3::EpcEnbApplication const &', 'arg0')])
     ## epc-enb-application.h (module 'lte'): ns3::EpcEnbApplication::EpcEnbApplication(ns3::Ptr<ns3::Socket> lteSocket, ns3::Ptr<ns3::Socket> lteSocket6, uint16_t cellId) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::Socket >', 'lteSocket'), param('ns3::Ptr< ns3::Socket >', 'lteSocket6'), param('uint16_t', 'cellId')])
-    ## epc-enb-application.h (module 'lte'): void ns3::EpcEnbApplication::AddS1Interface(ns3::Ptr<ns3::Socket> s1uSocket, ns3::Ipv4Address enbAddress, ns3::Ipv4Address sgwAddress) [member function]
+    ## epc-enb-application.h (module 'lte'): void ns3::EpcEnbApplication::AddS1Interface(ns3::Ptr<ns3::Socket> s1uSocket, ns3::Ipv4Address enbS1uAddress, ns3::Ipv4Address sgwS1uAddress) [member function]
     cls.add_method('AddS1Interface', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Socket >', 's1uSocket'), param('ns3::Ipv4Address', 'enbAddress'), param('ns3::Ipv4Address', 'sgwAddress')])
+                   [param('ns3::Ptr< ns3::Socket >', 's1uSocket'), param('ns3::Ipv4Address', 'enbS1uAddress'), param('ns3::Ipv4Address', 'sgwS1uAddress')])
     ## epc-enb-application.h (module 'lte'): ns3::EpcEnbS1SapProvider * ns3::EpcEnbApplication::GetS1SapProvider() [member function]
     cls.add_method('GetS1SapProvider', 
                    'ns3::EpcEnbS1SapProvider *', 
@@ -15891,15 +16068,15 @@
                    'uint8_t', 
                    [param('ns3::Ptr< ns3::NetDevice >', 'ueLteDevice'), param('uint64_t', 'imsi'), param('ns3::Ptr< ns3::EpcTft >', 'tft'), param('ns3::EpsBearer', 'bearer')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## epc-helper.h (module 'lte'): void ns3::EpcHelper::AddEnb(ns3::Ptr<ns3::Node> enbNode, ns3::Ptr<ns3::NetDevice> lteEnbNetDevice, uint16_t cellId) [member function]
+    ## epc-helper.h (module 'lte'): void ns3::EpcHelper::AddEnb(ns3::Ptr<ns3::Node> enbNode, ns3::Ptr<ns3::NetDevice> lteEnbNetDevice, std::vector<unsigned short, std::allocator<unsigned short>> cellIds) [member function]
     cls.add_method('AddEnb', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Node >', 'enbNode'), param('ns3::Ptr< ns3::NetDevice >', 'lteEnbNetDevice'), param('uint16_t', 'cellId')], 
+                   [param('ns3::Ptr< ns3::Node >', 'enbNode'), param('ns3::Ptr< ns3::NetDevice >', 'lteEnbNetDevice'), param('std::vector< unsigned short >', 'cellIds')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## epc-helper.h (module 'lte'): void ns3::EpcHelper::AddS1Interface(ns3::Ptr<ns3::Node> enb, ns3::Ipv4Address enbAddress, ns3::Ipv4Address sgwAddress, uint16_t cellId=0) [member function]
+    ## epc-helper.h (module 'lte'): void ns3::EpcHelper::AddS1Interface(ns3::Ptr<ns3::Node> enb, ns3::Ipv4Address enbAddress, ns3::Ipv4Address sgwAddress, std::vector<unsigned short, std::allocator<unsigned short>> cellIds) [member function]
     cls.add_method('AddS1Interface', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Node >', 'enb'), param('ns3::Ipv4Address', 'enbAddress'), param('ns3::Ipv4Address', 'sgwAddress'), param('uint16_t', 'cellId', default_value='0')], 
+                   [param('ns3::Ptr< ns3::Node >', 'enb'), param('ns3::Ipv4Address', 'enbAddress'), param('ns3::Ipv4Address', 'sgwAddress'), param('std::vector< unsigned short >', 'cellIds')], 
                    is_pure_virtual=True, is_virtual=True)
     ## epc-helper.h (module 'lte'): void ns3::EpcHelper::AddUe(ns3::Ptr<ns3::NetDevice> ueLteDevice, uint64_t imsi) [member function]
     cls.add_method('AddUe', 
@@ -16086,7 +16263,7 @@
                    'ns3::Ptr< ns3::EpcTft >', 
                    [], 
                    is_static=True)
-    ## epc-tft.h (module 'lte'): std::list<ns3::EpcTft::PacketFilter, std::allocator<ns3::EpcTft::PacketFilter> > ns3::EpcTft::GetPacketFilters() const [member function]
+    ## epc-tft.h (module 'lte'): std::list<ns3::EpcTft::PacketFilter, std::allocator<ns3::EpcTft::PacketFilter>> ns3::EpcTft::GetPacketFilters() const [member function]
     cls.add_method('GetPacketFilters', 
                    'std::list< ns3::EpcTft::PacketFilter >', 
                    [], 
@@ -16247,10 +16424,10 @@
     cls.add_constructor([param('ns3::EpcX2 const &', 'arg0')])
     ## epc-x2.h (module 'lte'): ns3::EpcX2::EpcX2() [constructor]
     cls.add_constructor([])
-    ## epc-x2.h (module 'lte'): void ns3::EpcX2::AddX2Interface(uint16_t enb1CellId, ns3::Ipv4Address enb1X2Address, uint16_t enb2CellId, ns3::Ipv4Address enb2X2Address) [member function]
+    ## epc-x2.h (module 'lte'): void ns3::EpcX2::AddX2Interface(uint16_t enb1CellId, ns3::Ipv4Address enb1X2Address, std::vector<unsigned short, std::allocator<unsigned short>> enb2CellIds, ns3::Ipv4Address enb2X2Address) [member function]
     cls.add_method('AddX2Interface', 
                    'void', 
-                   [param('uint16_t', 'enb1CellId'), param('ns3::Ipv4Address', 'enb1X2Address'), param('uint16_t', 'enb2CellId'), param('ns3::Ipv4Address', 'enb2X2Address')])
+                   [param('uint16_t', 'enb1CellId'), param('ns3::Ipv4Address', 'enb1X2Address'), param('std::vector< unsigned short >', 'enb2CellIds'), param('ns3::Ipv4Address', 'enb2X2Address')])
     ## epc-x2.h (module 'lte'): void ns3::EpcX2::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
@@ -16403,7 +16580,7 @@
                    'uint32_t', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_virtual=True)
-    ## epc-x2-header.h (module 'lte'): std::vector<ns3::EpcX2Sap::ErabAdmittedItem, std::allocator<ns3::EpcX2Sap::ErabAdmittedItem> > ns3::EpcX2HandoverRequestAckHeader::GetAdmittedBearers() const [member function]
+    ## epc-x2-header.h (module 'lte'): std::vector<ns3::EpcX2Sap::ErabAdmittedItem, std::allocator<ns3::EpcX2Sap::ErabAdmittedItem>> ns3::EpcX2HandoverRequestAckHeader::GetAdmittedBearers() const [member function]
     cls.add_method('GetAdmittedBearers', 
                    'std::vector< ns3::EpcX2Sap::ErabAdmittedItem >', 
                    [], 
@@ -16423,7 +16600,7 @@
                    'uint16_t', 
                    [], 
                    is_const=True)
-    ## epc-x2-header.h (module 'lte'): std::vector<ns3::EpcX2Sap::ErabNotAdmittedItem, std::allocator<ns3::EpcX2Sap::ErabNotAdmittedItem> > ns3::EpcX2HandoverRequestAckHeader::GetNotAdmittedBearers() const [member function]
+    ## epc-x2-header.h (module 'lte'): std::vector<ns3::EpcX2Sap::ErabNotAdmittedItem, std::allocator<ns3::EpcX2Sap::ErabNotAdmittedItem>> ns3::EpcX2HandoverRequestAckHeader::GetNotAdmittedBearers() const [member function]
     cls.add_method('GetNotAdmittedBearers', 
                    'std::vector< ns3::EpcX2Sap::ErabNotAdmittedItem >', 
                    [], 
@@ -16458,7 +16635,7 @@
                    'void', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_const=True, is_virtual=True)
-    ## epc-x2-header.h (module 'lte'): void ns3::EpcX2HandoverRequestAckHeader::SetAdmittedBearers(std::vector<ns3::EpcX2Sap::ErabAdmittedItem, std::allocator<ns3::EpcX2Sap::ErabAdmittedItem> > bearers) [member function]
+    ## epc-x2-header.h (module 'lte'): void ns3::EpcX2HandoverRequestAckHeader::SetAdmittedBearers(std::vector<ns3::EpcX2Sap::ErabAdmittedItem, std::allocator<ns3::EpcX2Sap::ErabAdmittedItem>> bearers) [member function]
     cls.add_method('SetAdmittedBearers', 
                    'void', 
                    [param('std::vector< ns3::EpcX2Sap::ErabAdmittedItem >', 'bearers')])
@@ -16466,7 +16643,7 @@
     cls.add_method('SetNewEnbUeX2apId', 
                    'void', 
                    [param('uint16_t', 'x2apId')])
-    ## epc-x2-header.h (module 'lte'): void ns3::EpcX2HandoverRequestAckHeader::SetNotAdmittedBearers(std::vector<ns3::EpcX2Sap::ErabNotAdmittedItem, std::allocator<ns3::EpcX2Sap::ErabNotAdmittedItem> > bearers) [member function]
+    ## epc-x2-header.h (module 'lte'): void ns3::EpcX2HandoverRequestAckHeader::SetNotAdmittedBearers(std::vector<ns3::EpcX2Sap::ErabNotAdmittedItem, std::allocator<ns3::EpcX2Sap::ErabNotAdmittedItem>> bearers) [member function]
     cls.add_method('SetNotAdmittedBearers', 
                    'void', 
                    [param('std::vector< ns3::EpcX2Sap::ErabNotAdmittedItem >', 'bearers')])
@@ -16486,7 +16663,7 @@
                    'uint32_t', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_virtual=True)
-    ## epc-x2-header.h (module 'lte'): std::vector<ns3::EpcX2Sap::ErabToBeSetupItem, std::allocator<ns3::EpcX2Sap::ErabToBeSetupItem> > ns3::EpcX2HandoverRequestHeader::GetBearers() const [member function]
+    ## epc-x2-header.h (module 'lte'): std::vector<ns3::EpcX2Sap::ErabToBeSetupItem, std::allocator<ns3::EpcX2Sap::ErabToBeSetupItem>> ns3::EpcX2HandoverRequestHeader::GetBearers() const [member function]
     cls.add_method('GetBearers', 
                    'std::vector< ns3::EpcX2Sap::ErabToBeSetupItem >', 
                    [], 
@@ -16556,7 +16733,7 @@
                    'void', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_const=True, is_virtual=True)
-    ## epc-x2-header.h (module 'lte'): void ns3::EpcX2HandoverRequestHeader::SetBearers(std::vector<ns3::EpcX2Sap::ErabToBeSetupItem, std::allocator<ns3::EpcX2Sap::ErabToBeSetupItem> > bearers) [member function]
+    ## epc-x2-header.h (module 'lte'): void ns3::EpcX2HandoverRequestHeader::SetBearers(std::vector<ns3::EpcX2Sap::ErabToBeSetupItem, std::allocator<ns3::EpcX2Sap::ErabToBeSetupItem>> bearers) [member function]
     cls.add_method('SetBearers', 
                    'void', 
                    [param('std::vector< ns3::EpcX2Sap::ErabToBeSetupItem >', 'bearers')])
@@ -16659,7 +16836,7 @@
                    'uint32_t', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_virtual=True)
-    ## epc-x2-header.h (module 'lte'): std::vector<ns3::EpcX2Sap::CellInformationItem, std::allocator<ns3::EpcX2Sap::CellInformationItem> > ns3::EpcX2LoadInformationHeader::GetCellInformationList() const [member function]
+    ## epc-x2-header.h (module 'lte'): std::vector<ns3::EpcX2Sap::CellInformationItem, std::allocator<ns3::EpcX2Sap::CellInformationItem>> ns3::EpcX2LoadInformationHeader::GetCellInformationList() const [member function]
     cls.add_method('GetCellInformationList', 
                    'std::vector< ns3::EpcX2Sap::CellInformationItem >', 
                    [], 
@@ -16699,7 +16876,7 @@
                    'void', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_const=True, is_virtual=True)
-    ## epc-x2-header.h (module 'lte'): void ns3::EpcX2LoadInformationHeader::SetCellInformationList(std::vector<ns3::EpcX2Sap::CellInformationItem, std::allocator<ns3::EpcX2Sap::CellInformationItem> > cellInformationList) [member function]
+    ## epc-x2-header.h (module 'lte'): void ns3::EpcX2LoadInformationHeader::SetCellInformationList(std::vector<ns3::EpcX2Sap::CellInformationItem, std::allocator<ns3::EpcX2Sap::CellInformationItem>> cellInformationList) [member function]
     cls.add_method('SetCellInformationList', 
                    'void', 
                    [param('std::vector< ns3::EpcX2Sap::CellInformationItem >', 'cellInformationList')])
@@ -16715,7 +16892,7 @@
                    'uint32_t', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_virtual=True)
-    ## epc-x2-header.h (module 'lte'): std::vector<ns3::EpcX2Sap::CellMeasurementResultItem, std::allocator<ns3::EpcX2Sap::CellMeasurementResultItem> > ns3::EpcX2ResourceStatusUpdateHeader::GetCellMeasurementResultList() const [member function]
+    ## epc-x2-header.h (module 'lte'): std::vector<ns3::EpcX2Sap::CellMeasurementResultItem, std::allocator<ns3::EpcX2Sap::CellMeasurementResultItem>> ns3::EpcX2ResourceStatusUpdateHeader::GetCellMeasurementResultList() const [member function]
     cls.add_method('GetCellMeasurementResultList', 
                    'std::vector< ns3::EpcX2Sap::CellMeasurementResultItem >', 
                    [], 
@@ -16765,7 +16942,7 @@
                    'void', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_const=True, is_virtual=True)
-    ## epc-x2-header.h (module 'lte'): void ns3::EpcX2ResourceStatusUpdateHeader::SetCellMeasurementResultList(std::vector<ns3::EpcX2Sap::CellMeasurementResultItem, std::allocator<ns3::EpcX2Sap::CellMeasurementResultItem> > cellMeasurementResultList) [member function]
+    ## epc-x2-header.h (module 'lte'): void ns3::EpcX2ResourceStatusUpdateHeader::SetCellMeasurementResultList(std::vector<ns3::EpcX2Sap::CellMeasurementResultItem, std::allocator<ns3::EpcX2Sap::CellMeasurementResultItem>> cellMeasurementResultList) [member function]
     cls.add_method('SetCellMeasurementResultList', 
                    'void', 
                    [param('std::vector< ns3::EpcX2Sap::CellMeasurementResultItem >', 'cellMeasurementResultList')])
@@ -16789,7 +16966,7 @@
                    'uint32_t', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_virtual=True)
-    ## epc-x2-header.h (module 'lte'): std::vector<ns3::EpcX2Sap::ErabsSubjectToStatusTransferItem, std::allocator<ns3::EpcX2Sap::ErabsSubjectToStatusTransferItem> > ns3::EpcX2SnStatusTransferHeader::GetErabsSubjectToStatusTransferList() const [member function]
+    ## epc-x2-header.h (module 'lte'): std::vector<ns3::EpcX2Sap::ErabsSubjectToStatusTransferItem, std::allocator<ns3::EpcX2Sap::ErabsSubjectToStatusTransferItem>> ns3::EpcX2SnStatusTransferHeader::GetErabsSubjectToStatusTransferList() const [member function]
     cls.add_method('GetErabsSubjectToStatusTransferList', 
                    'std::vector< ns3::EpcX2Sap::ErabsSubjectToStatusTransferItem >', 
                    [], 
@@ -16839,7 +17016,7 @@
                    'void', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_const=True, is_virtual=True)
-    ## epc-x2-header.h (module 'lte'): void ns3::EpcX2SnStatusTransferHeader::SetErabsSubjectToStatusTransferList(std::vector<ns3::EpcX2Sap::ErabsSubjectToStatusTransferItem, std::allocator<ns3::EpcX2Sap::ErabsSubjectToStatusTransferItem> > erabs) [member function]
+    ## epc-x2-header.h (module 'lte'): void ns3::EpcX2SnStatusTransferHeader::SetErabsSubjectToStatusTransferList(std::vector<ns3::EpcX2Sap::ErabsSubjectToStatusTransferItem, std::allocator<ns3::EpcX2Sap::ErabsSubjectToStatusTransferItem>> erabs) [member function]
     cls.add_method('SetErabsSubjectToStatusTransferList', 
                    'void', 
                    [param('std::vector< ns3::EpcX2Sap::ErabsSubjectToStatusTransferItem >', 'erabs')])
@@ -17293,7 +17470,7 @@
                    'uint32_t', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_virtual=True)
-    ## epc-gtpc-header.h (module 'lte'): std::list<ns3::GtpcModifyBearerRequestMessage::BearerContextToBeModified, std::allocator<ns3::GtpcModifyBearerRequestMessage::BearerContextToBeModified> > ns3::GtpcModifyBearerRequestMessage::GetBearerContextsToBeModified() const [member function]
+    ## epc-gtpc-header.h (module 'lte'): std::list<ns3::GtpcModifyBearerRequestMessage::BearerContextToBeModified, std::allocator<ns3::GtpcModifyBearerRequestMessage::BearerContextToBeModified>> ns3::GtpcModifyBearerRequestMessage::GetBearerContextsToBeModified() const [member function]
     cls.add_method('GetBearerContextsToBeModified', 
                    'std::list< ns3::GtpcModifyBearerRequestMessage::BearerContextToBeModified >', 
                    [], 
@@ -17338,7 +17515,7 @@
                    'void', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_const=True, is_virtual=True)
-    ## epc-gtpc-header.h (module 'lte'): void ns3::GtpcModifyBearerRequestMessage::SetBearerContextsToBeModified(std::list<ns3::GtpcModifyBearerRequestMessage::BearerContextToBeModified, std::allocator<ns3::GtpcModifyBearerRequestMessage::BearerContextToBeModified> > bearerContexts) [member function]
+    ## epc-gtpc-header.h (module 'lte'): void ns3::GtpcModifyBearerRequestMessage::SetBearerContextsToBeModified(std::list<ns3::GtpcModifyBearerRequestMessage::BearerContextToBeModified, std::allocator<ns3::GtpcModifyBearerRequestMessage::BearerContextToBeModified>> bearerContexts) [member function]
     cls.add_method('SetBearerContextsToBeModified', 
                    'void', 
                    [param('std::list< ns3::GtpcModifyBearerRequestMessage::BearerContextToBeModified >', 'bearerContexts')])
@@ -17883,7 +18060,7 @@
                    'ns3::Ipv4Address', 
                    [], 
                    is_const=True)
-    ## ipv4-route.h (module 'internet'): std::map<unsigned int, unsigned int, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, unsigned int> > > ns3::Ipv4MulticastRoute::GetOutputTtlMap() const [member function]
+    ## ipv4-route.h (module 'internet'): std::map<unsigned int, unsigned int, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, unsigned int>>> ns3::Ipv4MulticastRoute::GetOutputTtlMap() const [member function]
     cls.add_method('GetOutputTtlMap', 
                    'std::map< unsigned int, unsigned int >', 
                    [], 
@@ -18309,7 +18486,7 @@
     cls.add_constructor([param('ns3::LteAmc const &', 'arg0')])
     ## lte-amc.h (module 'lte'): ns3::LteAmc::LteAmc() [constructor]
     cls.add_constructor([])
-    ## lte-amc.h (module 'lte'): std::vector<int, std::allocator<int> > ns3::LteAmc::CreateCqiFeedbacks(ns3::SpectrumValue const & sinr, uint8_t rbgSize=0) [member function]
+    ## lte-amc.h (module 'lte'): std::vector<int, std::allocator<int>> ns3::LteAmc::CreateCqiFeedbacks(ns3::SpectrumValue const & sinr, uint8_t rbgSize=0) [member function]
     cls.add_method('CreateCqiFeedbacks', 
                    'std::vector< int >', 
                    [param('ns3::SpectrumValue const &', 'sinr'), param('uint8_t', 'rbgSize', default_value='0')])
@@ -18557,9 +18734,9 @@
     cls.add_constructor([param('ns3::LteEnbRrc const &', 'arg0')])
     ## lte-enb-rrc.h (module 'lte'): ns3::LteEnbRrc::LteEnbRrc() [constructor]
     cls.add_constructor([])
-    ## lte-enb-rrc.h (module 'lte'): uint8_t ns3::LteEnbRrc::AddUeMeasReportConfig(ns3::LteRrcSap::ReportConfigEutra config) [member function]
+    ## lte-enb-rrc.h (module 'lte'): std::vector<unsigned char, std::allocator<unsigned char>> ns3::LteEnbRrc::AddUeMeasReportConfig(ns3::LteRrcSap::ReportConfigEutra config) [member function]
     cls.add_method('AddUeMeasReportConfig', 
-                   'uint8_t', 
+                   'std::vector< unsigned char >', 
                    [param('ns3::LteRrcSap::ReportConfigEutra', 'config')])
     ## lte-enb-rrc.h (module 'lte'): void ns3::LteEnbRrc::AddX2Neighbour(uint16_t cellId) [member function]
     cls.add_method('AddX2Neighbour', 
@@ -18573,11 +18750,11 @@
     cls.add_method('ComponentCarrierToCellId', 
                    'uint16_t', 
                    [param('uint8_t', 'componentCarrierId')])
-    ## lte-enb-rrc.h (module 'lte'): void ns3::LteEnbRrc::ConfigureCarriers(std::map<unsigned char, ns3::Ptr<ns3::ComponentCarrierBaseStation>, std::less<unsigned char>, std::allocator<std::pair<const unsigned char, ns3::Ptr<ns3::ComponentCarrierBaseStation> > > > ccPhyConf) [member function]
+    ## lte-enb-rrc.h (module 'lte'): void ns3::LteEnbRrc::ConfigureCarriers(std::map<unsigned char, ns3::Ptr<ns3::ComponentCarrierBaseStation>, std::less<unsigned char>, std::allocator<std::pair<const unsigned char, ns3::Ptr<ns3::ComponentCarrierBaseStation>>>> ccPhyConf) [member function]
     cls.add_method('ConfigureCarriers', 
                    'void', 
                    [param('std::map< unsigned char, ns3::Ptr< ns3::ComponentCarrierBaseStation > >', 'ccPhyConf')])
-    ## lte-enb-rrc.h (module 'lte'): void ns3::LteEnbRrc::ConfigureCell(std::map<unsigned char, ns3::Ptr<ns3::ComponentCarrierBaseStation>, std::less<unsigned char>, std::allocator<std::pair<const unsigned char, ns3::Ptr<ns3::ComponentCarrierBaseStation> > > > ccPhyConf) [member function]
+    ## lte-enb-rrc.h (module 'lte'): void ns3::LteEnbRrc::ConfigureCell(std::map<unsigned char, ns3::Ptr<ns3::ComponentCarrierBaseStation>, std::less<unsigned char>, std::allocator<std::pair<const unsigned char, ns3::Ptr<ns3::ComponentCarrierBaseStation>>>> ccPhyConf) [member function]
     cls.add_method('ConfigureCell', 
                    'void', 
                    [param('std::map< unsigned char, ns3::Ptr< ns3::ComponentCarrierBaseStation > >', 'ccPhyConf')])
@@ -18667,6 +18844,11 @@
     cls.add_method('HandoverLeavingTimeout', 
                    'void', 
                    [param('uint16_t', 'rnti')])
+    ## lte-enb-rrc.h (module 'lte'): bool ns3::LteEnbRrc::HasCellId(uint16_t cellId) const [member function]
+    cls.add_method('HasCellId', 
+                   'bool', 
+                   [param('uint16_t', 'cellId')], 
+                   is_const=True)
     ## lte-enb-rrc.h (module 'lte'): bool ns3::LteEnbRrc::HasUeManager(uint16_t rnti) const [member function]
     cls.add_method('HasUeManager', 
                    'bool', 
@@ -18895,12 +19077,12 @@
                    'void', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## lte-ffr-algorithm.h (module 'lte'): std::vector<bool, std::allocator<bool> > ns3::LteFfrAlgorithm::DoGetAvailableDlRbg() [member function]
+    ## lte-ffr-algorithm.h (module 'lte'): std::vector<bool, std::allocator<bool>> ns3::LteFfrAlgorithm::DoGetAvailableDlRbg() [member function]
     cls.add_method('DoGetAvailableDlRbg', 
                    'std::vector< bool >', 
                    [], 
                    is_pure_virtual=True, is_virtual=True, visibility='protected')
-    ## lte-ffr-algorithm.h (module 'lte'): std::vector<bool, std::allocator<bool> > ns3::LteFfrAlgorithm::DoGetAvailableUlRbg() [member function]
+    ## lte-ffr-algorithm.h (module 'lte'): std::vector<bool, std::allocator<bool>> ns3::LteFfrAlgorithm::DoGetAvailableUlRbg() [member function]
     cls.add_method('DoGetAvailableUlRbg', 
                    'std::vector< bool >', 
                    [], 
@@ -18945,7 +19127,7 @@
                    'void', 
                    [param('ns3::FfMacSchedSapProvider::SchedUlCqiInfoReqParameters const &', 'params')], 
                    is_pure_virtual=True, is_virtual=True, visibility='protected')
-    ## lte-ffr-algorithm.h (module 'lte'): void ns3::LteFfrAlgorithm::DoReportUlCqiInfo(std::map<unsigned short, std::vector<double, std::allocator<double> >, std::less<unsigned short>, std::allocator<std::pair<const unsigned short, std::vector<double, std::allocator<double> > > > > ulCqiMap) [member function]
+    ## lte-ffr-algorithm.h (module 'lte'): void ns3::LteFfrAlgorithm::DoReportUlCqiInfo(std::map<unsigned short, std::vector<double, std::allocator<double>>, std::less<unsigned short>, std::allocator<std::pair<const unsigned short, std::vector<double, std::allocator<double>>>>> ulCqiMap) [member function]
     cls.add_method('DoReportUlCqiInfo', 
                    'void', 
                    [param('std::map< unsigned short, std::vector< double > >', 'ulCqiMap')], 
@@ -19007,12 +19189,12 @@
                    'void', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## lte-ffr-distributed-algorithm.h (module 'lte'): std::vector<bool, std::allocator<bool> > ns3::LteFfrDistributedAlgorithm::DoGetAvailableDlRbg() [member function]
+    ## lte-ffr-distributed-algorithm.h (module 'lte'): std::vector<bool, std::allocator<bool>> ns3::LteFfrDistributedAlgorithm::DoGetAvailableDlRbg() [member function]
     cls.add_method('DoGetAvailableDlRbg', 
                    'std::vector< bool >', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## lte-ffr-distributed-algorithm.h (module 'lte'): std::vector<bool, std::allocator<bool> > ns3::LteFfrDistributedAlgorithm::DoGetAvailableUlRbg() [member function]
+    ## lte-ffr-distributed-algorithm.h (module 'lte'): std::vector<bool, std::allocator<bool>> ns3::LteFfrDistributedAlgorithm::DoGetAvailableUlRbg() [member function]
     cls.add_method('DoGetAvailableUlRbg', 
                    'std::vector< bool >', 
                    [], 
@@ -19062,7 +19244,7 @@
                    'void', 
                    [param('ns3::FfMacSchedSapProvider::SchedUlCqiInfoReqParameters const &', 'params')], 
                    is_virtual=True, visibility='protected')
-    ## lte-ffr-distributed-algorithm.h (module 'lte'): void ns3::LteFfrDistributedAlgorithm::DoReportUlCqiInfo(std::map<unsigned short, std::vector<double, std::allocator<double> >, std::less<unsigned short>, std::allocator<std::pair<const unsigned short, std::vector<double, std::allocator<double> > > > > ulCqiMap) [member function]
+    ## lte-ffr-distributed-algorithm.h (module 'lte'): void ns3::LteFfrDistributedAlgorithm::DoReportUlCqiInfo(std::map<unsigned short, std::vector<double, std::allocator<double>>, std::less<unsigned short>, std::allocator<std::pair<const unsigned short, std::vector<double, std::allocator<double>>>>> ulCqiMap) [member function]
     cls.add_method('DoReportUlCqiInfo', 
                    'void', 
                    [param('std::map< unsigned short, std::vector< double > >', 'ulCqiMap')], 
@@ -19109,12 +19291,12 @@
                    'void', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## lte-ffr-enhanced-algorithm.h (module 'lte'): std::vector<bool, std::allocator<bool> > ns3::LteFfrEnhancedAlgorithm::DoGetAvailableDlRbg() [member function]
+    ## lte-ffr-enhanced-algorithm.h (module 'lte'): std::vector<bool, std::allocator<bool>> ns3::LteFfrEnhancedAlgorithm::DoGetAvailableDlRbg() [member function]
     cls.add_method('DoGetAvailableDlRbg', 
                    'std::vector< bool >', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## lte-ffr-enhanced-algorithm.h (module 'lte'): std::vector<bool, std::allocator<bool> > ns3::LteFfrEnhancedAlgorithm::DoGetAvailableUlRbg() [member function]
+    ## lte-ffr-enhanced-algorithm.h (module 'lte'): std::vector<bool, std::allocator<bool>> ns3::LteFfrEnhancedAlgorithm::DoGetAvailableUlRbg() [member function]
     cls.add_method('DoGetAvailableUlRbg', 
                    'std::vector< bool >', 
                    [], 
@@ -19164,7 +19346,7 @@
                    'void', 
                    [param('ns3::FfMacSchedSapProvider::SchedUlCqiInfoReqParameters const &', 'params')], 
                    is_virtual=True, visibility='protected')
-    ## lte-ffr-enhanced-algorithm.h (module 'lte'): void ns3::LteFfrEnhancedAlgorithm::DoReportUlCqiInfo(std::map<unsigned short, std::vector<double, std::allocator<double> >, std::less<unsigned short>, std::allocator<std::pair<const unsigned short, std::vector<double, std::allocator<double> > > > > ulCqiMap) [member function]
+    ## lte-ffr-enhanced-algorithm.h (module 'lte'): void ns3::LteFfrEnhancedAlgorithm::DoReportUlCqiInfo(std::map<unsigned short, std::vector<double, std::allocator<double>>, std::less<unsigned short>, std::allocator<std::pair<const unsigned short, std::vector<double, std::allocator<double>>>>> ulCqiMap) [member function]
     cls.add_method('DoReportUlCqiInfo', 
                    'void', 
                    [param('std::map< unsigned short, std::vector< double > >', 'ulCqiMap')], 
@@ -19211,12 +19393,12 @@
                    'void', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## lte-ffr-soft-algorithm.h (module 'lte'): std::vector<bool, std::allocator<bool> > ns3::LteFfrSoftAlgorithm::DoGetAvailableDlRbg() [member function]
+    ## lte-ffr-soft-algorithm.h (module 'lte'): std::vector<bool, std::allocator<bool>> ns3::LteFfrSoftAlgorithm::DoGetAvailableDlRbg() [member function]
     cls.add_method('DoGetAvailableDlRbg', 
                    'std::vector< bool >', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## lte-ffr-soft-algorithm.h (module 'lte'): std::vector<bool, std::allocator<bool> > ns3::LteFfrSoftAlgorithm::DoGetAvailableUlRbg() [member function]
+    ## lte-ffr-soft-algorithm.h (module 'lte'): std::vector<bool, std::allocator<bool>> ns3::LteFfrSoftAlgorithm::DoGetAvailableUlRbg() [member function]
     cls.add_method('DoGetAvailableUlRbg', 
                    'std::vector< bool >', 
                    [], 
@@ -19266,7 +19448,7 @@
                    'void', 
                    [param('ns3::FfMacSchedSapProvider::SchedUlCqiInfoReqParameters const &', 'params')], 
                    is_virtual=True, visibility='protected')
-    ## lte-ffr-soft-algorithm.h (module 'lte'): void ns3::LteFfrSoftAlgorithm::DoReportUlCqiInfo(std::map<unsigned short, std::vector<double, std::allocator<double> >, std::less<unsigned short>, std::allocator<std::pair<const unsigned short, std::vector<double, std::allocator<double> > > > > ulCqiMap) [member function]
+    ## lte-ffr-soft-algorithm.h (module 'lte'): void ns3::LteFfrSoftAlgorithm::DoReportUlCqiInfo(std::map<unsigned short, std::vector<double, std::allocator<double>>, std::less<unsigned short>, std::allocator<std::pair<const unsigned short, std::vector<double, std::allocator<double>>>>> ulCqiMap) [member function]
     cls.add_method('DoReportUlCqiInfo', 
                    'void', 
                    [param('std::map< unsigned short, std::vector< double > >', 'ulCqiMap')], 
@@ -19313,12 +19495,12 @@
                    'void', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## lte-fr-hard-algorithm.h (module 'lte'): std::vector<bool, std::allocator<bool> > ns3::LteFrHardAlgorithm::DoGetAvailableDlRbg() [member function]
+    ## lte-fr-hard-algorithm.h (module 'lte'): std::vector<bool, std::allocator<bool>> ns3::LteFrHardAlgorithm::DoGetAvailableDlRbg() [member function]
     cls.add_method('DoGetAvailableDlRbg', 
                    'std::vector< bool >', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## lte-fr-hard-algorithm.h (module 'lte'): std::vector<bool, std::allocator<bool> > ns3::LteFrHardAlgorithm::DoGetAvailableUlRbg() [member function]
+    ## lte-fr-hard-algorithm.h (module 'lte'): std::vector<bool, std::allocator<bool>> ns3::LteFrHardAlgorithm::DoGetAvailableUlRbg() [member function]
     cls.add_method('DoGetAvailableUlRbg', 
                    'std::vector< bool >', 
                    [], 
@@ -19368,7 +19550,7 @@
                    'void', 
                    [param('ns3::FfMacSchedSapProvider::SchedUlCqiInfoReqParameters const &', 'params')], 
                    is_virtual=True, visibility='protected')
-    ## lte-fr-hard-algorithm.h (module 'lte'): void ns3::LteFrHardAlgorithm::DoReportUlCqiInfo(std::map<unsigned short, std::vector<double, std::allocator<double> >, std::less<unsigned short>, std::allocator<std::pair<const unsigned short, std::vector<double, std::allocator<double> > > > > ulCqiMap) [member function]
+    ## lte-fr-hard-algorithm.h (module 'lte'): void ns3::LteFrHardAlgorithm::DoReportUlCqiInfo(std::map<unsigned short, std::vector<double, std::allocator<double>>, std::less<unsigned short>, std::allocator<std::pair<const unsigned short, std::vector<double, std::allocator<double>>>>> ulCqiMap) [member function]
     cls.add_method('DoReportUlCqiInfo', 
                    'void', 
                    [param('std::map< unsigned short, std::vector< double > >', 'ulCqiMap')], 
@@ -19415,12 +19597,12 @@
                    'void', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## lte-fr-no-op-algorithm.h (module 'lte'): std::vector<bool, std::allocator<bool> > ns3::LteFrNoOpAlgorithm::DoGetAvailableDlRbg() [member function]
+    ## lte-fr-no-op-algorithm.h (module 'lte'): std::vector<bool, std::allocator<bool>> ns3::LteFrNoOpAlgorithm::DoGetAvailableDlRbg() [member function]
     cls.add_method('DoGetAvailableDlRbg', 
                    'std::vector< bool >', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## lte-fr-no-op-algorithm.h (module 'lte'): std::vector<bool, std::allocator<bool> > ns3::LteFrNoOpAlgorithm::DoGetAvailableUlRbg() [member function]
+    ## lte-fr-no-op-algorithm.h (module 'lte'): std::vector<bool, std::allocator<bool>> ns3::LteFrNoOpAlgorithm::DoGetAvailableUlRbg() [member function]
     cls.add_method('DoGetAvailableUlRbg', 
                    'std::vector< bool >', 
                    [], 
@@ -19470,7 +19652,7 @@
                    'void', 
                    [param('ns3::FfMacSchedSapProvider::SchedUlCqiInfoReqParameters const &', 'params')], 
                    is_virtual=True, visibility='protected')
-    ## lte-fr-no-op-algorithm.h (module 'lte'): void ns3::LteFrNoOpAlgorithm::DoReportUlCqiInfo(std::map<unsigned short, std::vector<double, std::allocator<double> >, std::less<unsigned short>, std::allocator<std::pair<const unsigned short, std::vector<double, std::allocator<double> > > > > ulCqiMap) [member function]
+    ## lte-fr-no-op-algorithm.h (module 'lte'): void ns3::LteFrNoOpAlgorithm::DoReportUlCqiInfo(std::map<unsigned short, std::vector<double, std::allocator<double>>, std::less<unsigned short>, std::allocator<std::pair<const unsigned short, std::vector<double, std::allocator<double>>>>> ulCqiMap) [member function]
     cls.add_method('DoReportUlCqiInfo', 
                    'void', 
                    [param('std::map< unsigned short, std::vector< double > >', 'ulCqiMap')], 
@@ -19517,12 +19699,12 @@
                    'void', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## lte-fr-soft-algorithm.h (module 'lte'): std::vector<bool, std::allocator<bool> > ns3::LteFrSoftAlgorithm::DoGetAvailableDlRbg() [member function]
+    ## lte-fr-soft-algorithm.h (module 'lte'): std::vector<bool, std::allocator<bool>> ns3::LteFrSoftAlgorithm::DoGetAvailableDlRbg() [member function]
     cls.add_method('DoGetAvailableDlRbg', 
                    'std::vector< bool >', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## lte-fr-soft-algorithm.h (module 'lte'): std::vector<bool, std::allocator<bool> > ns3::LteFrSoftAlgorithm::DoGetAvailableUlRbg() [member function]
+    ## lte-fr-soft-algorithm.h (module 'lte'): std::vector<bool, std::allocator<bool>> ns3::LteFrSoftAlgorithm::DoGetAvailableUlRbg() [member function]
     cls.add_method('DoGetAvailableUlRbg', 
                    'std::vector< bool >', 
                    [], 
@@ -19572,7 +19754,7 @@
                    'void', 
                    [param('ns3::FfMacSchedSapProvider::SchedUlCqiInfoReqParameters const &', 'params')], 
                    is_virtual=True, visibility='protected')
-    ## lte-fr-soft-algorithm.h (module 'lte'): void ns3::LteFrSoftAlgorithm::DoReportUlCqiInfo(std::map<unsigned short, std::vector<double, std::allocator<double> >, std::less<unsigned short>, std::allocator<std::pair<const unsigned short, std::vector<double, std::allocator<double> > > > > ulCqiMap) [member function]
+    ## lte-fr-soft-algorithm.h (module 'lte'): void ns3::LteFrSoftAlgorithm::DoReportUlCqiInfo(std::map<unsigned short, std::vector<double, std::allocator<double>>, std::less<unsigned short>, std::allocator<std::pair<const unsigned short, std::vector<double, std::allocator<double>>>>> ulCqiMap) [member function]
     cls.add_method('DoReportUlCqiInfo', 
                    'void', 
                    [param('std::map< unsigned short, std::vector< double > >', 'ulCqiMap')], 
@@ -19619,12 +19801,12 @@
                    'void', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## lte-fr-strict-algorithm.h (module 'lte'): std::vector<bool, std::allocator<bool> > ns3::LteFrStrictAlgorithm::DoGetAvailableDlRbg() [member function]
+    ## lte-fr-strict-algorithm.h (module 'lte'): std::vector<bool, std::allocator<bool>> ns3::LteFrStrictAlgorithm::DoGetAvailableDlRbg() [member function]
     cls.add_method('DoGetAvailableDlRbg', 
                    'std::vector< bool >', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## lte-fr-strict-algorithm.h (module 'lte'): std::vector<bool, std::allocator<bool> > ns3::LteFrStrictAlgorithm::DoGetAvailableUlRbg() [member function]
+    ## lte-fr-strict-algorithm.h (module 'lte'): std::vector<bool, std::allocator<bool>> ns3::LteFrStrictAlgorithm::DoGetAvailableUlRbg() [member function]
     cls.add_method('DoGetAvailableUlRbg', 
                    'std::vector< bool >', 
                    [], 
@@ -19674,7 +19856,7 @@
                    'void', 
                    [param('ns3::FfMacSchedSapProvider::SchedUlCqiInfoReqParameters const &', 'params')], 
                    is_virtual=True, visibility='protected')
-    ## lte-fr-strict-algorithm.h (module 'lte'): void ns3::LteFrStrictAlgorithm::DoReportUlCqiInfo(std::map<unsigned short, std::vector<double, std::allocator<double> >, std::less<unsigned short>, std::allocator<std::pair<const unsigned short, std::vector<double, std::allocator<double> > > > > ulCqiMap) [member function]
+    ## lte-fr-strict-algorithm.h (module 'lte'): void ns3::LteFrStrictAlgorithm::DoReportUlCqiInfo(std::map<unsigned short, std::vector<double, std::allocator<double>>, std::less<unsigned short>, std::allocator<std::pair<const unsigned short, std::vector<double, std::allocator<double>>>>> ulCqiMap) [member function]
     cls.add_method('DoReportUlCqiInfo', 
                    'void', 
                    [param('std::map< unsigned short, std::vector< double > >', 'ulCqiMap')], 
@@ -19810,10 +19992,10 @@
     cls.add_method('Attach', 
                    'void', 
                    [param('ns3::NetDeviceContainer', 'ueDevices'), param('ns3::Ptr< ns3::NetDevice >', 'enbDevice')])
-    ## lte-helper.h (module 'lte'): void ns3::LteHelper::Attach(ns3::Ptr<ns3::NetDevice> ueDevice, ns3::Ptr<ns3::NetDevice> enbDevice) [member function]
+    ## lte-helper.h (module 'lte'): void ns3::LteHelper::Attach(ns3::Ptr<ns3::NetDevice> ueDevice, ns3::Ptr<ns3::NetDevice> enbDevice, uint8_t componentCarrierId=0) [member function]
     cls.add_method('Attach', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NetDevice >', 'ueDevice'), param('ns3::Ptr< ns3::NetDevice >', 'enbDevice')])
+                   [param('ns3::Ptr< ns3::NetDevice >', 'ueDevice'), param('ns3::Ptr< ns3::NetDevice >', 'enbDevice'), param('uint8_t', 'componentCarrierId', default_value='0')])
     ## lte-helper.h (module 'lte'): void ns3::LteHelper::AttachToClosestEnb(ns3::NetDeviceContainer ueDevices, ns3::NetDeviceContainer enbDevices) [member function]
     cls.add_method('AttachToClosestEnb', 
                    'void', 
@@ -20254,7 +20436,7 @@
     cls.add_method('GetComponentCarrierId', 
                    'uint8_t', 
                    [])
-    ## lte-phy.h (module 'lte'): std::list<ns3::Ptr<ns3::LteControlMessage>, std::allocator<ns3::Ptr<ns3::LteControlMessage> > > ns3::LtePhy::GetControlMessages() [member function]
+    ## lte-phy.h (module 'lte'): std::list<ns3::Ptr<ns3::LteControlMessage>, std::allocator<ns3::Ptr<ns3::LteControlMessage>>> ns3::LtePhy::GetControlMessages() [member function]
     cls.add_method('GetControlMessages', 
                    'std::list< ns3::Ptr< ns3::LteControlMessage > >', 
                    [])
@@ -20629,9 +20811,9 @@
                    'ns3::Ptr< ns3::SpectrumModel const >', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## lte-spectrum-phy.h (module 'lte'): ns3::Ptr<ns3::AntennaModel> ns3::LteSpectrumPhy::GetRxAntenna() const [member function]
-    cls.add_method('GetRxAntenna', 
-                   'ns3::Ptr< ns3::AntennaModel >', 
+    ## lte-spectrum-phy.h (module 'lte'): ns3::Ptr<ns3::Object> ns3::LteSpectrumPhy::GetAntenna() const [member function]
+    cls.add_method('GetAntenna', 
+                   'ns3::Ptr< ns3::Object >', 
                    [], 
                    is_const=True, is_virtual=True)
     ## lte-spectrum-phy.h (module 'lte'): void ns3::LteSpectrumPhy::StartRx(ns3::Ptr<ns3::SpectrumSignalParameters> params) [member function]
@@ -20671,11 +20853,11 @@
     cls.add_method('SetAntenna', 
                    'void', 
                    [param('ns3::Ptr< ns3::AntennaModel >', 'a')])
-    ## lte-spectrum-phy.h (module 'lte'): bool ns3::LteSpectrumPhy::StartTxDataFrame(ns3::Ptr<ns3::PacketBurst> pb, std::list<ns3::Ptr<ns3::LteControlMessage>, std::allocator<ns3::Ptr<ns3::LteControlMessage> > > ctrlMsgList, ns3::Time duration) [member function]
+    ## lte-spectrum-phy.h (module 'lte'): bool ns3::LteSpectrumPhy::StartTxDataFrame(ns3::Ptr<ns3::PacketBurst> pb, std::list<ns3::Ptr<ns3::LteControlMessage>, std::allocator<ns3::Ptr<ns3::LteControlMessage>>> ctrlMsgList, ns3::Time duration) [member function]
     cls.add_method('StartTxDataFrame', 
                    'bool', 
                    [param('ns3::Ptr< ns3::PacketBurst >', 'pb'), param('std::list< ns3::Ptr< ns3::LteControlMessage > >', 'ctrlMsgList'), param('ns3::Time', 'duration')])
-    ## lte-spectrum-phy.h (module 'lte'): bool ns3::LteSpectrumPhy::StartTxDlCtrlFrame(std::list<ns3::Ptr<ns3::LteControlMessage>, std::allocator<ns3::Ptr<ns3::LteControlMessage> > > ctrlMsgList, bool pss) [member function]
+    ## lte-spectrum-phy.h (module 'lte'): bool ns3::LteSpectrumPhy::StartTxDlCtrlFrame(std::list<ns3::Ptr<ns3::LteControlMessage>, std::allocator<ns3::Ptr<ns3::LteControlMessage>>> ctrlMsgList, bool pss) [member function]
     cls.add_method('StartTxDlCtrlFrame', 
                    'bool', 
                    [param('std::list< ns3::Ptr< ns3::LteControlMessage > >', 'ctrlMsgList'), param('bool', 'pss')])
@@ -20747,7 +20929,7 @@
     cls.add_method('AddCtrlSinrChunkProcessor', 
                    'void', 
                    [param('ns3::Ptr< ns3::LteChunkProcessor >', 'p')])
-    ## lte-spectrum-phy.h (module 'lte'): void ns3::LteSpectrumPhy::AddExpectedTb(uint16_t rnti, uint8_t ndi, uint16_t size, uint8_t mcs, std::vector<int, std::allocator<int> > map, uint8_t layer, uint8_t harqId, uint8_t rv, bool downlink) [member function]
+    ## lte-spectrum-phy.h (module 'lte'): void ns3::LteSpectrumPhy::AddExpectedTb(uint16_t rnti, uint8_t ndi, uint16_t size, uint8_t mcs, std::vector<int, std::allocator<int>> map, uint8_t layer, uint8_t harqId, uint8_t rv, bool downlink) [member function]
     cls.add_method('AddExpectedTb', 
                    'void', 
                    [param('uint16_t', 'rnti'), param('uint8_t', 'ndi'), param('uint16_t', 'size'), param('uint8_t', 'mcs'), param('std::vector< int >', 'map'), param('uint8_t', 'layer'), param('uint8_t', 'harqId'), param('uint8_t', 'rv'), param('bool', 'downlink')])
@@ -20774,65 +20956,65 @@
     return
 
 def register_Ns3LteSpectrumSignalParameters_methods(root_module, cls):
+    ## lte-spectrum-signal-parameters.h (module 'lte'): ns3::LteSpectrumSignalParameters::LteSpectrumSignalParameters() [constructor]
+    cls.add_constructor([])
+    ## lte-spectrum-signal-parameters.h (module 'lte'): ns3::LteSpectrumSignalParameters::LteSpectrumSignalParameters(ns3::LteSpectrumSignalParameters const & p) [constructor]
+    cls.add_constructor([param('ns3::LteSpectrumSignalParameters const &', 'p')])
     ## lte-spectrum-signal-parameters.h (module 'lte'): ns3::Ptr<ns3::SpectrumSignalParameters> ns3::LteSpectrumSignalParameters::Copy() [member function]
     cls.add_method('Copy', 
                    'ns3::Ptr< ns3::SpectrumSignalParameters >', 
                    [], 
                    is_virtual=True)
-    ## lte-spectrum-signal-parameters.h (module 'lte'): ns3::LteSpectrumSignalParameters::LteSpectrumSignalParameters() [constructor]
-    cls.add_constructor([])
-    ## lte-spectrum-signal-parameters.h (module 'lte'): ns3::LteSpectrumSignalParameters::LteSpectrumSignalParameters(ns3::LteSpectrumSignalParameters const & p) [constructor]
-    cls.add_constructor([param('ns3::LteSpectrumSignalParameters const &', 'p')])
     ## lte-spectrum-signal-parameters.h (module 'lte'): ns3::LteSpectrumSignalParameters::packetBurst [variable]
     cls.add_instance_attribute('packetBurst', 'ns3::Ptr< ns3::PacketBurst >', is_const=False)
     return
 
 def register_Ns3LteSpectrumSignalParametersDataFrame_methods(root_module, cls):
+    ## lte-spectrum-signal-parameters.h (module 'lte'): ns3::LteSpectrumSignalParametersDataFrame::LteSpectrumSignalParametersDataFrame() [constructor]
+    cls.add_constructor([])
+    ## lte-spectrum-signal-parameters.h (module 'lte'): ns3::LteSpectrumSignalParametersDataFrame::LteSpectrumSignalParametersDataFrame(ns3::LteSpectrumSignalParametersDataFrame const & p) [constructor]
+    cls.add_constructor([param('ns3::LteSpectrumSignalParametersDataFrame const &', 'p')])
     ## lte-spectrum-signal-parameters.h (module 'lte'): ns3::Ptr<ns3::SpectrumSignalParameters> ns3::LteSpectrumSignalParametersDataFrame::Copy() [member function]
     cls.add_method('Copy', 
                    'ns3::Ptr< ns3::SpectrumSignalParameters >', 
                    [], 
                    is_virtual=True)
-    ## lte-spectrum-signal-parameters.h (module 'lte'): ns3::LteSpectrumSignalParametersDataFrame::LteSpectrumSignalParametersDataFrame() [constructor]
-    cls.add_constructor([])
-    ## lte-spectrum-signal-parameters.h (module 'lte'): ns3::LteSpectrumSignalParametersDataFrame::LteSpectrumSignalParametersDataFrame(ns3::LteSpectrumSignalParametersDataFrame const & p) [constructor]
-    cls.add_constructor([param('ns3::LteSpectrumSignalParametersDataFrame const &', 'p')])
-    ## lte-spectrum-signal-parameters.h (module 'lte'): ns3::LteSpectrumSignalParametersDataFrame::packetBurst [variable]
-    cls.add_instance_attribute('packetBurst', 'ns3::Ptr< ns3::PacketBurst >', is_const=False)
-    ## lte-spectrum-signal-parameters.h (module 'lte'): ns3::LteSpectrumSignalParametersDataFrame::ctrlMsgList [variable]
-    cls.add_instance_attribute('ctrlMsgList', 'std::list< ns3::Ptr< ns3::LteControlMessage > >', is_const=False)
     ## lte-spectrum-signal-parameters.h (module 'lte'): ns3::LteSpectrumSignalParametersDataFrame::cellId [variable]
     cls.add_instance_attribute('cellId', 'uint16_t', is_const=False)
+    ## lte-spectrum-signal-parameters.h (module 'lte'): ns3::LteSpectrumSignalParametersDataFrame::ctrlMsgList [variable]
+    cls.add_instance_attribute('ctrlMsgList', 'std::list< ns3::Ptr< ns3::LteControlMessage > >', is_const=False)
+    ## lte-spectrum-signal-parameters.h (module 'lte'): ns3::LteSpectrumSignalParametersDataFrame::packetBurst [variable]
+    cls.add_instance_attribute('packetBurst', 'ns3::Ptr< ns3::PacketBurst >', is_const=False)
     return
 
 def register_Ns3LteSpectrumSignalParametersDlCtrlFrame_methods(root_module, cls):
+    ## lte-spectrum-signal-parameters.h (module 'lte'): ns3::LteSpectrumSignalParametersDlCtrlFrame::LteSpectrumSignalParametersDlCtrlFrame() [constructor]
+    cls.add_constructor([])
+    ## lte-spectrum-signal-parameters.h (module 'lte'): ns3::LteSpectrumSignalParametersDlCtrlFrame::LteSpectrumSignalParametersDlCtrlFrame(ns3::LteSpectrumSignalParametersDlCtrlFrame const & p) [constructor]
+    cls.add_constructor([param('ns3::LteSpectrumSignalParametersDlCtrlFrame const &', 'p')])
     ## lte-spectrum-signal-parameters.h (module 'lte'): ns3::Ptr<ns3::SpectrumSignalParameters> ns3::LteSpectrumSignalParametersDlCtrlFrame::Copy() [member function]
     cls.add_method('Copy', 
                    'ns3::Ptr< ns3::SpectrumSignalParameters >', 
                    [], 
                    is_virtual=True)
-    ## lte-spectrum-signal-parameters.h (module 'lte'): ns3::LteSpectrumSignalParametersDlCtrlFrame::LteSpectrumSignalParametersDlCtrlFrame() [constructor]
-    cls.add_constructor([])
-    ## lte-spectrum-signal-parameters.h (module 'lte'): ns3::LteSpectrumSignalParametersDlCtrlFrame::LteSpectrumSignalParametersDlCtrlFrame(ns3::LteSpectrumSignalParametersDlCtrlFrame const & p) [constructor]
-    cls.add_constructor([param('ns3::LteSpectrumSignalParametersDlCtrlFrame const &', 'p')])
-    ## lte-spectrum-signal-parameters.h (module 'lte'): ns3::LteSpectrumSignalParametersDlCtrlFrame::ctrlMsgList [variable]
-    cls.add_instance_attribute('ctrlMsgList', 'std::list< ns3::Ptr< ns3::LteControlMessage > >', is_const=False)
     ## lte-spectrum-signal-parameters.h (module 'lte'): ns3::LteSpectrumSignalParametersDlCtrlFrame::cellId [variable]
     cls.add_instance_attribute('cellId', 'uint16_t', is_const=False)
+    ## lte-spectrum-signal-parameters.h (module 'lte'): ns3::LteSpectrumSignalParametersDlCtrlFrame::ctrlMsgList [variable]
+    cls.add_instance_attribute('ctrlMsgList', 'std::list< ns3::Ptr< ns3::LteControlMessage > >', is_const=False)
     ## lte-spectrum-signal-parameters.h (module 'lte'): ns3::LteSpectrumSignalParametersDlCtrlFrame::pss [variable]
     cls.add_instance_attribute('pss', 'bool', is_const=False)
     return
 
 def register_Ns3LteSpectrumSignalParametersUlSrsFrame_methods(root_module, cls):
+    ## lte-spectrum-signal-parameters.h (module 'lte'): ns3::LteSpectrumSignalParametersUlSrsFrame::LteSpectrumSignalParametersUlSrsFrame() [constructor]
+    cls.add_constructor([])
+    ## lte-spectrum-signal-parameters.h (module 'lte'): ns3::LteSpectrumSignalParametersUlSrsFrame::LteSpectrumSignalParametersUlSrsFrame(ns3::LteSpectrumSignalParametersUlSrsFrame const & p) [constructor]
+    cls.add_constructor([param('ns3::LteSpectrumSignalParametersUlSrsFrame const &', 'p')])
     ## lte-spectrum-signal-parameters.h (module 'lte'): ns3::Ptr<ns3::SpectrumSignalParameters> ns3::LteSpectrumSignalParametersUlSrsFrame::Copy() [member function]
     cls.add_method('Copy', 
                    'ns3::Ptr< ns3::SpectrumSignalParameters >', 
                    [], 
                    is_virtual=True)
-    ## lte-spectrum-signal-parameters.h (module 'lte'): ns3::LteSpectrumSignalParametersUlSrsFrame::LteSpectrumSignalParametersUlSrsFrame() [constructor]
-    cls.add_constructor([])
-    ## lte-spectrum-signal-parameters.h (module 'lte'): ns3::LteSpectrumSignalParametersUlSrsFrame::LteSpectrumSignalParametersUlSrsFrame(ns3::LteSpectrumSignalParametersUlSrsFrame const & p) [constructor]
-    cls.add_constructor([param('ns3::LteSpectrumSignalParametersUlSrsFrame const &', 'p')])
     ## lte-spectrum-signal-parameters.h (module 'lte'): ns3::LteSpectrumSignalParametersUlSrsFrame::cellId [variable]
     cls.add_instance_attribute('cellId', 'uint16_t', is_const=False)
     return
@@ -21092,11 +21274,11 @@
                    'ns3::LteUePhy::State', 
                    [], 
                    is_const=True)
-    ## lte-ue-phy.h (module 'lte'): std::vector<int, std::allocator<int> > ns3::LteUePhy::GetSubChannelsForReception() [member function]
+    ## lte-ue-phy.h (module 'lte'): std::vector<int, std::allocator<int>> ns3::LteUePhy::GetSubChannelsForReception() [member function]
     cls.add_method('GetSubChannelsForReception', 
                    'std::vector< int >', 
                    [])
-    ## lte-ue-phy.h (module 'lte'): std::vector<int, std::allocator<int> > ns3::LteUePhy::GetSubChannelsForTransmission() [member function]
+    ## lte-ue-phy.h (module 'lte'): std::vector<int, std::allocator<int>> ns3::LteUePhy::GetSubChannelsForTransmission() [member function]
     cls.add_method('GetSubChannelsForTransmission', 
                    'std::vector< int >', 
                    [])
@@ -21124,7 +21306,7 @@
     cls.add_method('PhyPduReceived', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet >', 'p')])
-    ## lte-ue-phy.h (module 'lte'): void ns3::LteUePhy::ReceiveLteControlMessageList(std::list<ns3::Ptr<ns3::LteControlMessage>, std::allocator<ns3::Ptr<ns3::LteControlMessage> > > msgList) [member function]
+    ## lte-ue-phy.h (module 'lte'): void ns3::LteUePhy::ReceiveLteControlMessageList(std::list<ns3::Ptr<ns3::LteControlMessage>, std::allocator<ns3::Ptr<ns3::LteControlMessage>>> msgList) [member function]
     cls.add_method('ReceiveLteControlMessageList', 
                    'void', 
                    [param('std::list< ns3::Ptr< ns3::LteControlMessage > >', 'msgList')], 
@@ -21169,11 +21351,11 @@
     cls.add_method('SetNoiseFigure', 
                    'void', 
                    [param('double', 'nf')])
-    ## lte-ue-phy.h (module 'lte'): void ns3::LteUePhy::SetSubChannelsForReception(std::vector<int, std::allocator<int> > mask) [member function]
+    ## lte-ue-phy.h (module 'lte'): void ns3::LteUePhy::SetSubChannelsForReception(std::vector<int, std::allocator<int>> mask) [member function]
     cls.add_method('SetSubChannelsForReception', 
                    'void', 
                    [param('std::vector< int >', 'mask')])
-    ## lte-ue-phy.h (module 'lte'): void ns3::LteUePhy::SetSubChannelsForTransmission(std::vector<int, std::allocator<int> > mask) [member function]
+    ## lte-ue-phy.h (module 'lte'): void ns3::LteUePhy::SetSubChannelsForTransmission(std::vector<int, std::allocator<int>> mask) [member function]
     cls.add_method('SetSubChannelsForTransmission', 
                    'void', 
                    [param('std::vector< int >', 'mask')])
@@ -21242,15 +21424,15 @@
     cls.add_method('GetPcmax', 
                    'double', 
                    [])
-    ## lte-ue-power-control.h (module 'lte'): double ns3::LteUePowerControl::GetPucchTxPower(std::vector<int, std::allocator<int> > rb) [member function]
+    ## lte-ue-power-control.h (module 'lte'): double ns3::LteUePowerControl::GetPucchTxPower(std::vector<int, std::allocator<int>> rb) [member function]
     cls.add_method('GetPucchTxPower', 
                    'double', 
                    [param('std::vector< int >', 'rb')])
-    ## lte-ue-power-control.h (module 'lte'): double ns3::LteUePowerControl::GetPuschTxPower(std::vector<int, std::allocator<int> > rb) [member function]
+    ## lte-ue-power-control.h (module 'lte'): double ns3::LteUePowerControl::GetPuschTxPower(std::vector<int, std::allocator<int>> rb) [member function]
     cls.add_method('GetPuschTxPower', 
                    'double', 
                    [param('std::vector< int >', 'rb')])
-    ## lte-ue-power-control.h (module 'lte'): double ns3::LteUePowerControl::GetSrsTxPower(std::vector<int, std::allocator<int> > rb) [member function]
+    ## lte-ue-power-control.h (module 'lte'): double ns3::LteUePowerControl::GetSrsTxPower(std::vector<int, std::allocator<int>> rb) [member function]
     cls.add_method('GetSrsTxPower', 
                    'double', 
                    [param('std::vector< int >', 'rb')])
@@ -21388,6 +21570,11 @@
     cls.add_method('InitializeSap', 
                    'void', 
                    [])
+    ## lte-ue-rrc.h (module 'lte'): bool ns3::LteUeRrc::IsServingCell(uint16_t cellId) const [member function]
+    cls.add_method('IsServingCell', 
+                   'bool', 
+                   [param('uint16_t', 'cellId')], 
+                   is_const=True)
     ## lte-ue-rrc.h (module 'lte'): void ns3::LteUeRrc::SetAsSapUser(ns3::LteAsSapUser * s) [member function]
     cls.add_method('SetAsSapUser', 
                    'void', 
@@ -21432,6 +21619,11 @@
     cls.add_method('StorePreviousCellId', 
                    'void', 
                    [param('uint16_t', 'cellId')])
+    ## lte-ue-rrc.h (module 'lte'): static std::string const ns3::LteUeRrc::ToString(ns3::LteUeRrc::State s) [member function]
+    cls.add_method('ToString', 
+                   'std::string const', 
+                   [param('ns3::LteUeRrc::State', 's')], 
+                   is_static=True)
     ## lte-ue-rrc.h (module 'lte'): ns3::LteUeRrc::m_numberOfComponentCarriers [variable]
     cls.add_instance_attribute('m_numberOfComponentCarriers', 'uint16_t', is_const=False)
     ## lte-ue-rrc.h (module 'lte'): void ns3::LteUeRrc::DoDispose() [member function]
@@ -21585,28 +21777,17 @@
     return
 
 def register_Ns3MacStatsCalculator_methods(root_module, cls):
-    ## mac-stats-calculator.h (module 'lte'): ns3::MacStatsCalculator::MacStatsCalculator(ns3::MacStatsCalculator const & arg0) [constructor]
-    cls.add_constructor([param('ns3::MacStatsCalculator const &', 'arg0')])
     ## mac-stats-calculator.h (module 'lte'): ns3::MacStatsCalculator::MacStatsCalculator() [constructor]
     cls.add_constructor([])
-    ## mac-stats-calculator.h (module 'lte'): void ns3::MacStatsCalculator::DlScheduling(uint16_t cellId, uint64_t imsi, ns3::DlSchedulingCallbackInfo dlSchedulingCallbackInfo) [member function]
-    cls.add_method('DlScheduling', 
-                   'void', 
-                   [param('uint16_t', 'cellId'), param('uint64_t', 'imsi'), param('ns3::DlSchedulingCallbackInfo', 'dlSchedulingCallbackInfo')])
-    ## mac-stats-calculator.h (module 'lte'): static void ns3::MacStatsCalculator::DlSchedulingCallback(ns3::Ptr<ns3::MacStatsCalculator> macStats, std::string path, ns3::DlSchedulingCallbackInfo dlSchedulingCallbackInfo) [member function]
-    cls.add_method('DlSchedulingCallback', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::MacStatsCalculator >', 'macStats'), param('std::string', 'path'), param('ns3::DlSchedulingCallbackInfo', 'dlSchedulingCallbackInfo')], 
-                   is_static=True)
-    ## mac-stats-calculator.h (module 'lte'): std::string ns3::MacStatsCalculator::GetDlOutputFilename() [member function]
-    cls.add_method('GetDlOutputFilename', 
-                   'std::string', 
-                   [])
     ## mac-stats-calculator.h (module 'lte'): static ns3::TypeId ns3::MacStatsCalculator::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## mac-stats-calculator.h (module 'lte'): void ns3::MacStatsCalculator::SetUlOutputFilename(std::string outputFilename) [member function]
+    cls.add_method('SetUlOutputFilename', 
+                   'void', 
+                   [param('std::string', 'outputFilename')])
     ## mac-stats-calculator.h (module 'lte'): std::string ns3::MacStatsCalculator::GetUlOutputFilename() [member function]
     cls.add_method('GetUlOutputFilename', 
                    'std::string', 
@@ -21615,14 +21796,23 @@
     cls.add_method('SetDlOutputFilename', 
                    'void', 
                    [param('std::string', 'outputFilename')])
-    ## mac-stats-calculator.h (module 'lte'): void ns3::MacStatsCalculator::SetUlOutputFilename(std::string outputFilename) [member function]
-    cls.add_method('SetUlOutputFilename', 
+    ## mac-stats-calculator.h (module 'lte'): std::string ns3::MacStatsCalculator::GetDlOutputFilename() [member function]
+    cls.add_method('GetDlOutputFilename', 
+                   'std::string', 
+                   [])
+    ## mac-stats-calculator.h (module 'lte'): void ns3::MacStatsCalculator::DlScheduling(uint16_t cellId, uint64_t imsi, ns3::DlSchedulingCallbackInfo dlSchedulingCallbackInfo) [member function]
+    cls.add_method('DlScheduling', 
                    'void', 
-                   [param('std::string', 'outputFilename')])
+                   [param('uint16_t', 'cellId'), param('uint64_t', 'imsi'), param('ns3::DlSchedulingCallbackInfo', 'dlSchedulingCallbackInfo')])
     ## mac-stats-calculator.h (module 'lte'): void ns3::MacStatsCalculator::UlScheduling(uint16_t cellId, uint64_t imsi, uint32_t frameNo, uint32_t subframeNo, uint16_t rnti, uint8_t mcsTb, uint16_t sizeTb, uint8_t componentCarrierId) [member function]
     cls.add_method('UlScheduling', 
                    'void', 
                    [param('uint16_t', 'cellId'), param('uint64_t', 'imsi'), param('uint32_t', 'frameNo'), param('uint32_t', 'subframeNo'), param('uint16_t', 'rnti'), param('uint8_t', 'mcsTb'), param('uint16_t', 'sizeTb'), param('uint8_t', 'componentCarrierId')])
+    ## mac-stats-calculator.h (module 'lte'): static void ns3::MacStatsCalculator::DlSchedulingCallback(ns3::Ptr<ns3::MacStatsCalculator> macStats, std::string path, ns3::DlSchedulingCallbackInfo dlSchedulingCallbackInfo) [member function]
+    cls.add_method('DlSchedulingCallback', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::MacStatsCalculator >', 'macStats'), param('std::string', 'path'), param('ns3::DlSchedulingCallbackInfo', 'dlSchedulingCallbackInfo')], 
+                   is_static=True)
     ## mac-stats-calculator.h (module 'lte'): static void ns3::MacStatsCalculator::UlSchedulingCallback(ns3::Ptr<ns3::MacStatsCalculator> macStats, std::string path, uint32_t frameNo, uint32_t subframeNo, uint16_t rnti, uint8_t mcs, uint16_t size, uint8_t componentCarrierId) [member function]
     cls.add_method('UlSchedulingCallback', 
                    'void', 
@@ -22069,10 +22259,16 @@
     cls.add_method('ExtractNeighborIndex', 
                    'uint32_t', 
                    [param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetEpoch() const [member function]
+    cls.add_method('GetEpoch', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() const [member function]
     cls.add_method('GetRemainingBits', 
                    'uint32_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -22083,6 +22279,10 @@
                    'uint32_t', 
                    [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
+    ## nix-vector.h (module 'network'): void ns3::NixVector::SetEpoch(uint32_t epoch) [member function]
+    cls.add_method('SetEpoch', 
+                   'void', 
+                   [param('uint32_t', 'epoch')])
     return
 
 def register_Ns3NoBackhaulEpcHelper_methods(root_module, cls):
@@ -22095,15 +22295,15 @@
                    'uint8_t', 
                    [param('ns3::Ptr< ns3::NetDevice >', 'ueLteDevice'), param('uint64_t', 'imsi'), param('ns3::Ptr< ns3::EpcTft >', 'tft'), param('ns3::EpsBearer', 'bearer')], 
                    is_virtual=True)
-    ## no-backhaul-epc-helper.h (module 'lte'): void ns3::NoBackhaulEpcHelper::AddEnb(ns3::Ptr<ns3::Node> enbNode, ns3::Ptr<ns3::NetDevice> lteEnbNetDevice, uint16_t cellId) [member function]
+    ## no-backhaul-epc-helper.h (module 'lte'): void ns3::NoBackhaulEpcHelper::AddEnb(ns3::Ptr<ns3::Node> enbNode, ns3::Ptr<ns3::NetDevice> lteEnbNetDevice, std::vector<unsigned short, std::allocator<unsigned short>> cellIds) [member function]
     cls.add_method('AddEnb', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Node >', 'enbNode'), param('ns3::Ptr< ns3::NetDevice >', 'lteEnbNetDevice'), param('uint16_t', 'cellId')], 
+                   [param('ns3::Ptr< ns3::Node >', 'enbNode'), param('ns3::Ptr< ns3::NetDevice >', 'lteEnbNetDevice'), param('std::vector< unsigned short >', 'cellIds')], 
                    is_virtual=True)
-    ## no-backhaul-epc-helper.h (module 'lte'): void ns3::NoBackhaulEpcHelper::AddS1Interface(ns3::Ptr<ns3::Node> enb, ns3::Ipv4Address enbAddress, ns3::Ipv4Address sgwAddress, uint16_t cellId=0) [member function]
+    ## no-backhaul-epc-helper.h (module 'lte'): void ns3::NoBackhaulEpcHelper::AddS1Interface(ns3::Ptr<ns3::Node> enb, ns3::Ipv4Address enbAddress, ns3::Ipv4Address sgwAddress, std::vector<unsigned short, std::allocator<unsigned short>> cellIds) [member function]
     cls.add_method('AddS1Interface', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Node >', 'enb'), param('ns3::Ipv4Address', 'enbAddress'), param('ns3::Ipv4Address', 'sgwAddress'), param('uint16_t', 'cellId', default_value='0')], 
+                   [param('ns3::Ptr< ns3::Node >', 'enb'), param('ns3::Ipv4Address', 'enbAddress'), param('ns3::Ipv4Address', 'sgwAddress'), param('std::vector< unsigned short >', 'cellIds')], 
                    is_virtual=True)
     ## no-backhaul-epc-helper.h (module 'lte'): void ns3::NoBackhaulEpcHelper::AddUe(ns3::Ptr<ns3::NetDevice> ueLteDevice, uint64_t imsi) [member function]
     cls.add_method('AddUe', 
@@ -22227,7 +22427,7 @@
                    'void', 
                    [param('ns3::LteMacSapUser::ReceivePduParameters', 'rxPduParams')], 
                    is_virtual=True, visibility='protected')
-    ## no-op-component-carrier-manager.h (module 'lte'): std::vector<unsigned char, std::allocator<unsigned char> > ns3::NoOpComponentCarrierManager::DoReleaseDataRadioBearer(uint16_t rnti, uint8_t lcid) [member function]
+    ## no-op-component-carrier-manager.h (module 'lte'): std::vector<unsigned char, std::allocator<unsigned char>> ns3::NoOpComponentCarrierManager::DoReleaseDataRadioBearer(uint16_t rnti, uint8_t lcid) [member function]
     cls.add_method('DoReleaseDataRadioBearer', 
                    'std::vector< unsigned char >', 
                    [param('uint16_t', 'rnti'), param('uint8_t', 'lcid')], 
@@ -22247,7 +22447,7 @@
                    'void', 
                    [param('uint16_t', 'rnti'), param('ns3::LteRrcSap::MeasResults', 'measResults')], 
                    is_virtual=True, visibility='protected')
-    ## no-op-component-carrier-manager.h (module 'lte'): std::vector<ns3::LteCcmRrcSapProvider::LcsConfig, std::allocator<ns3::LteCcmRrcSapProvider::LcsConfig> > ns3::NoOpComponentCarrierManager::DoSetupDataRadioBearer(ns3::EpsBearer bearer, uint8_t bearerId, uint16_t rnti, uint8_t lcid, uint8_t lcGroup, ns3::LteMacSapUser * msu) [member function]
+    ## no-op-component-carrier-manager.h (module 'lte'): std::vector<ns3::LteCcmRrcSapProvider::LcsConfig, std::allocator<ns3::LteCcmRrcSapProvider::LcsConfig>> ns3::NoOpComponentCarrierManager::DoSetupDataRadioBearer(ns3::EpsBearer bearer, uint8_t bearerId, uint16_t rnti, uint8_t lcid, uint8_t lcGroup, ns3::LteMacSapUser * msu) [member function]
     cls.add_method('DoSetupDataRadioBearer', 
                    'std::vector< ns3::LteCcmRrcSapProvider::LcsConfig >', 
                    [param('ns3::EpsBearer', 'bearer'), param('uint8_t', 'bearerId'), param('uint16_t', 'rnti'), param('uint8_t', 'lcid'), param('uint8_t', 'lcGroup'), param('ns3::LteMacSapUser *', 'msu')], 
@@ -22667,10 +22867,11 @@
                    'uint32_t', 
                    [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) const [member function]
     cls.add_method('SetNixVector', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')], 
+                   is_const=True)
     ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
     cls.add_method('ToString', 
                    'std::string', 
@@ -22773,28 +22974,17 @@
     return
 
 def register_Ns3PhyRxStatsCalculator_methods(root_module, cls):
-    ## phy-rx-stats-calculator.h (module 'lte'): ns3::PhyRxStatsCalculator::PhyRxStatsCalculator(ns3::PhyRxStatsCalculator const & arg0) [constructor]
-    cls.add_constructor([param('ns3::PhyRxStatsCalculator const &', 'arg0')])
     ## phy-rx-stats-calculator.h (module 'lte'): ns3::PhyRxStatsCalculator::PhyRxStatsCalculator() [constructor]
     cls.add_constructor([])
-    ## phy-rx-stats-calculator.h (module 'lte'): void ns3::PhyRxStatsCalculator::DlPhyReception(ns3::PhyReceptionStatParameters params) [member function]
-    cls.add_method('DlPhyReception', 
-                   'void', 
-                   [param('ns3::PhyReceptionStatParameters', 'params')])
-    ## phy-rx-stats-calculator.h (module 'lte'): static void ns3::PhyRxStatsCalculator::DlPhyReceptionCallback(ns3::Ptr<ns3::PhyRxStatsCalculator> phyRxStats, std::string path, ns3::PhyReceptionStatParameters params) [member function]
-    cls.add_method('DlPhyReceptionCallback', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::PhyRxStatsCalculator >', 'phyRxStats'), param('std::string', 'path'), param('ns3::PhyReceptionStatParameters', 'params')], 
-                   is_static=True)
-    ## phy-rx-stats-calculator.h (module 'lte'): std::string ns3::PhyRxStatsCalculator::GetDlRxOutputFilename() [member function]
-    cls.add_method('GetDlRxOutputFilename', 
-                   'std::string', 
-                   [])
     ## phy-rx-stats-calculator.h (module 'lte'): static ns3::TypeId ns3::PhyRxStatsCalculator::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## phy-rx-stats-calculator.h (module 'lte'): void ns3::PhyRxStatsCalculator::SetUlRxOutputFilename(std::string outputFilename) [member function]
+    cls.add_method('SetUlRxOutputFilename', 
+                   'void', 
+                   [param('std::string', 'outputFilename')])
     ## phy-rx-stats-calculator.h (module 'lte'): std::string ns3::PhyRxStatsCalculator::GetUlRxOutputFilename() [member function]
     cls.add_method('GetUlRxOutputFilename', 
                    'std::string', 
@@ -22803,14 +22993,23 @@
     cls.add_method('SetDlRxOutputFilename', 
                    'void', 
                    [param('std::string', 'outputFilename')])
-    ## phy-rx-stats-calculator.h (module 'lte'): void ns3::PhyRxStatsCalculator::SetUlRxOutputFilename(std::string outputFilename) [member function]
-    cls.add_method('SetUlRxOutputFilename', 
+    ## phy-rx-stats-calculator.h (module 'lte'): std::string ns3::PhyRxStatsCalculator::GetDlRxOutputFilename() [member function]
+    cls.add_method('GetDlRxOutputFilename', 
+                   'std::string', 
+                   [])
+    ## phy-rx-stats-calculator.h (module 'lte'): void ns3::PhyRxStatsCalculator::DlPhyReception(ns3::PhyReceptionStatParameters params) [member function]
+    cls.add_method('DlPhyReception', 
                    'void', 
-                   [param('std::string', 'outputFilename')])
+                   [param('ns3::PhyReceptionStatParameters', 'params')])
     ## phy-rx-stats-calculator.h (module 'lte'): void ns3::PhyRxStatsCalculator::UlPhyReception(ns3::PhyReceptionStatParameters params) [member function]
     cls.add_method('UlPhyReception', 
                    'void', 
                    [param('ns3::PhyReceptionStatParameters', 'params')])
+    ## phy-rx-stats-calculator.h (module 'lte'): static void ns3::PhyRxStatsCalculator::DlPhyReceptionCallback(ns3::Ptr<ns3::PhyRxStatsCalculator> phyRxStats, std::string path, ns3::PhyReceptionStatParameters params) [member function]
+    cls.add_method('DlPhyReceptionCallback', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::PhyRxStatsCalculator >', 'phyRxStats'), param('std::string', 'path'), param('ns3::PhyReceptionStatParameters', 'params')], 
+                   is_static=True)
     ## phy-rx-stats-calculator.h (module 'lte'): static void ns3::PhyRxStatsCalculator::UlPhyReceptionCallback(ns3::Ptr<ns3::PhyRxStatsCalculator> phyRxStats, std::string path, ns3::PhyReceptionStatParameters params) [member function]
     cls.add_method('UlPhyReceptionCallback', 
                    'void', 
@@ -22819,91 +23018,78 @@
     return
 
 def register_Ns3PhyStatsCalculator_methods(root_module, cls):
-    ## phy-stats-calculator.h (module 'lte'): ns3::PhyStatsCalculator::PhyStatsCalculator(ns3::PhyStatsCalculator const & arg0) [constructor]
-    cls.add_constructor([param('ns3::PhyStatsCalculator const &', 'arg0')])
     ## phy-stats-calculator.h (module 'lte'): ns3::PhyStatsCalculator::PhyStatsCalculator() [constructor]
     cls.add_constructor([])
-    ## phy-stats-calculator.h (module 'lte'): std::string ns3::PhyStatsCalculator::GetCurrentCellRsrpSinrFilename() [member function]
-    cls.add_method('GetCurrentCellRsrpSinrFilename', 
-                   'std::string', 
-                   [])
-    ## phy-stats-calculator.h (module 'lte'): std::string ns3::PhyStatsCalculator::GetInterferenceFilename() [member function]
-    cls.add_method('GetInterferenceFilename', 
-                   'std::string', 
-                   [])
     ## phy-stats-calculator.h (module 'lte'): static ns3::TypeId ns3::PhyStatsCalculator::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## phy-stats-calculator.h (module 'lte'): void ns3::PhyStatsCalculator::SetCurrentCellRsrpSinrFilename(std::string filename) [member function]
+    cls.add_method('SetCurrentCellRsrpSinrFilename', 
+                   'void', 
+                   [param('std::string', 'filename')])
+    ## phy-stats-calculator.h (module 'lte'): std::string ns3::PhyStatsCalculator::GetCurrentCellRsrpSinrFilename() [member function]
+    cls.add_method('GetCurrentCellRsrpSinrFilename', 
+                   'std::string', 
+                   [])
+    ## phy-stats-calculator.h (module 'lte'): void ns3::PhyStatsCalculator::SetUeSinrFilename(std::string filename) [member function]
+    cls.add_method('SetUeSinrFilename', 
+                   'void', 
+                   [param('std::string', 'filename')])
     ## phy-stats-calculator.h (module 'lte'): std::string ns3::PhyStatsCalculator::GetUeSinrFilename() [member function]
     cls.add_method('GetUeSinrFilename', 
                    'std::string', 
                    [])
+    ## phy-stats-calculator.h (module 'lte'): void ns3::PhyStatsCalculator::SetInterferenceFilename(std::string filename) [member function]
+    cls.add_method('SetInterferenceFilename', 
+                   'void', 
+                   [param('std::string', 'filename')])
+    ## phy-stats-calculator.h (module 'lte'): std::string ns3::PhyStatsCalculator::GetInterferenceFilename() [member function]
+    cls.add_method('GetInterferenceFilename', 
+                   'std::string', 
+                   [])
     ## phy-stats-calculator.h (module 'lte'): void ns3::PhyStatsCalculator::ReportCurrentCellRsrpSinr(uint16_t cellId, uint64_t imsi, uint16_t rnti, double rsrp, double sinr, uint8_t componentCarrierId) [member function]
     cls.add_method('ReportCurrentCellRsrpSinr', 
                    'void', 
                    [param('uint16_t', 'cellId'), param('uint64_t', 'imsi'), param('uint16_t', 'rnti'), param('double', 'rsrp'), param('double', 'sinr'), param('uint8_t', 'componentCarrierId')])
-    ## phy-stats-calculator.h (module 'lte'): static void ns3::PhyStatsCalculator::ReportCurrentCellRsrpSinrCallback(ns3::Ptr<ns3::PhyStatsCalculator> phyStats, std::string path, uint16_t cellId, uint16_t rnti, double rsrp, double sinr, uint8_t componentCarrierId) [member function]
-    cls.add_method('ReportCurrentCellRsrpSinrCallback', 
+    ## phy-stats-calculator.h (module 'lte'): void ns3::PhyStatsCalculator::ReportUeSinr(uint16_t cellId, uint64_t imsi, uint16_t rnti, double sinrLinear, uint8_t componentCarrierId) [member function]
+    cls.add_method('ReportUeSinr', 
                    'void', 
-                   [param('ns3::Ptr< ns3::PhyStatsCalculator >', 'phyStats'), param('std::string', 'path'), param('uint16_t', 'cellId'), param('uint16_t', 'rnti'), param('double', 'rsrp'), param('double', 'sinr'), param('uint8_t', 'componentCarrierId')], 
-                   is_static=True)
+                   [param('uint16_t', 'cellId'), param('uint64_t', 'imsi'), param('uint16_t', 'rnti'), param('double', 'sinrLinear'), param('uint8_t', 'componentCarrierId')])
     ## phy-stats-calculator.h (module 'lte'): void ns3::PhyStatsCalculator::ReportInterference(uint16_t cellId, ns3::Ptr<ns3::SpectrumValue> interference) [member function]
     cls.add_method('ReportInterference', 
                    'void', 
                    [param('uint16_t', 'cellId'), param('ns3::Ptr< ns3::SpectrumValue >', 'interference')])
-    ## phy-stats-calculator.h (module 'lte'): static void ns3::PhyStatsCalculator::ReportInterference(ns3::Ptr<ns3::PhyStatsCalculator> phyStats, std::string path, uint16_t cellId, ns3::Ptr<ns3::SpectrumValue> interference) [member function]
-    cls.add_method('ReportInterference', 
+    ## phy-stats-calculator.h (module 'lte'): static void ns3::PhyStatsCalculator::ReportCurrentCellRsrpSinrCallback(ns3::Ptr<ns3::PhyStatsCalculator> phyStats, std::string path, uint16_t cellId, uint16_t rnti, double rsrp, double sinr, uint8_t componentCarrierId) [member function]
+    cls.add_method('ReportCurrentCellRsrpSinrCallback', 
                    'void', 
-                   [param('ns3::Ptr< ns3::PhyStatsCalculator >', 'phyStats'), param('std::string', 'path'), param('uint16_t', 'cellId'), param('ns3::Ptr< ns3::SpectrumValue >', 'interference')], 
+                   [param('ns3::Ptr< ns3::PhyStatsCalculator >', 'phyStats'), param('std::string', 'path'), param('uint16_t', 'cellId'), param('uint16_t', 'rnti'), param('double', 'rsrp'), param('double', 'sinr'), param('uint8_t', 'componentCarrierId')], 
                    is_static=True)
-    ## phy-stats-calculator.h (module 'lte'): void ns3::PhyStatsCalculator::ReportUeSinr(uint16_t cellId, uint64_t imsi, uint16_t rnti, double sinrLinear, uint8_t componentCarrierId) [member function]
-    cls.add_method('ReportUeSinr', 
-                   'void', 
-                   [param('uint16_t', 'cellId'), param('uint64_t', 'imsi'), param('uint16_t', 'rnti'), param('double', 'sinrLinear'), param('uint8_t', 'componentCarrierId')])
     ## phy-stats-calculator.h (module 'lte'): static void ns3::PhyStatsCalculator::ReportUeSinr(ns3::Ptr<ns3::PhyStatsCalculator> phyStats, std::string path, uint16_t cellId, uint16_t rnti, double sinrLinear, uint8_t componentCarrierId) [member function]
     cls.add_method('ReportUeSinr', 
                    'void', 
                    [param('ns3::Ptr< ns3::PhyStatsCalculator >', 'phyStats'), param('std::string', 'path'), param('uint16_t', 'cellId'), param('uint16_t', 'rnti'), param('double', 'sinrLinear'), param('uint8_t', 'componentCarrierId')], 
                    is_static=True)
-    ## phy-stats-calculator.h (module 'lte'): void ns3::PhyStatsCalculator::SetCurrentCellRsrpSinrFilename(std::string filename) [member function]
-    cls.add_method('SetCurrentCellRsrpSinrFilename', 
-                   'void', 
-                   [param('std::string', 'filename')])
-    ## phy-stats-calculator.h (module 'lte'): void ns3::PhyStatsCalculator::SetInterferenceFilename(std::string filename) [member function]
-    cls.add_method('SetInterferenceFilename', 
-                   'void', 
-                   [param('std::string', 'filename')])
-    ## phy-stats-calculator.h (module 'lte'): void ns3::PhyStatsCalculator::SetUeSinrFilename(std::string filename) [member function]
-    cls.add_method('SetUeSinrFilename', 
+    ## phy-stats-calculator.h (module 'lte'): static void ns3::PhyStatsCalculator::ReportInterference(ns3::Ptr<ns3::PhyStatsCalculator> phyStats, std::string path, uint16_t cellId, ns3::Ptr<ns3::SpectrumValue> interference) [member function]
+    cls.add_method('ReportInterference', 
                    'void', 
-                   [param('std::string', 'filename')])
+                   [param('ns3::Ptr< ns3::PhyStatsCalculator >', 'phyStats'), param('std::string', 'path'), param('uint16_t', 'cellId'), param('ns3::Ptr< ns3::SpectrumValue >', 'interference')], 
+                   is_static=True)
     return
 
 def register_Ns3PhyTxStatsCalculator_methods(root_module, cls):
-    ## phy-tx-stats-calculator.h (module 'lte'): ns3::PhyTxStatsCalculator::PhyTxStatsCalculator(ns3::PhyTxStatsCalculator const & arg0) [constructor]
-    cls.add_constructor([param('ns3::PhyTxStatsCalculator const &', 'arg0')])
     ## phy-tx-stats-calculator.h (module 'lte'): ns3::PhyTxStatsCalculator::PhyTxStatsCalculator() [constructor]
     cls.add_constructor([])
-    ## phy-tx-stats-calculator.h (module 'lte'): void ns3::PhyTxStatsCalculator::DlPhyTransmission(ns3::PhyTransmissionStatParameters params) [member function]
-    cls.add_method('DlPhyTransmission', 
-                   'void', 
-                   [param('ns3::PhyTransmissionStatParameters', 'params')])
-    ## phy-tx-stats-calculator.h (module 'lte'): static void ns3::PhyTxStatsCalculator::DlPhyTransmissionCallback(ns3::Ptr<ns3::PhyTxStatsCalculator> phyTxStats, std::string path, ns3::PhyTransmissionStatParameters params) [member function]
-    cls.add_method('DlPhyTransmissionCallback', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::PhyTxStatsCalculator >', 'phyTxStats'), param('std::string', 'path'), param('ns3::PhyTransmissionStatParameters', 'params')], 
-                   is_static=True)
-    ## phy-tx-stats-calculator.h (module 'lte'): std::string ns3::PhyTxStatsCalculator::GetDlTxOutputFilename() [member function]
-    cls.add_method('GetDlTxOutputFilename', 
-                   'std::string', 
-                   [])
     ## phy-tx-stats-calculator.h (module 'lte'): static ns3::TypeId ns3::PhyTxStatsCalculator::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## phy-tx-stats-calculator.h (module 'lte'): void ns3::PhyTxStatsCalculator::SetUlTxOutputFilename(std::string outputFilename) [member function]
+    cls.add_method('SetUlTxOutputFilename', 
+                   'void', 
+                   [param('std::string', 'outputFilename')])
     ## phy-tx-stats-calculator.h (module 'lte'): std::string ns3::PhyTxStatsCalculator::GetUlTxOutputFilename() [member function]
     cls.add_method('GetUlTxOutputFilename', 
                    'std::string', 
@@ -22912,14 +23098,23 @@
     cls.add_method('SetDlTxOutputFilename', 
                    'void', 
                    [param('std::string', 'outputFilename')])
-    ## phy-tx-stats-calculator.h (module 'lte'): void ns3::PhyTxStatsCalculator::SetUlTxOutputFilename(std::string outputFilename) [member function]
-    cls.add_method('SetUlTxOutputFilename', 
+    ## phy-tx-stats-calculator.h (module 'lte'): std::string ns3::PhyTxStatsCalculator::GetDlTxOutputFilename() [member function]
+    cls.add_method('GetDlTxOutputFilename', 
+                   'std::string', 
+                   [])
+    ## phy-tx-stats-calculator.h (module 'lte'): void ns3::PhyTxStatsCalculator::DlPhyTransmission(ns3::PhyTransmissionStatParameters params) [member function]
+    cls.add_method('DlPhyTransmission', 
                    'void', 
-                   [param('std::string', 'outputFilename')])
+                   [param('ns3::PhyTransmissionStatParameters', 'params')])
     ## phy-tx-stats-calculator.h (module 'lte'): void ns3::PhyTxStatsCalculator::UlPhyTransmission(ns3::PhyTransmissionStatParameters params) [member function]
     cls.add_method('UlPhyTransmission', 
                    'void', 
                    [param('ns3::PhyTransmissionStatParameters', 'params')])
+    ## phy-tx-stats-calculator.h (module 'lte'): static void ns3::PhyTxStatsCalculator::DlPhyTransmissionCallback(ns3::Ptr<ns3::PhyTxStatsCalculator> phyTxStats, std::string path, ns3::PhyTransmissionStatParameters params) [member function]
+    cls.add_method('DlPhyTransmissionCallback', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::PhyTxStatsCalculator >', 'phyTxStats'), param('std::string', 'path'), param('ns3::PhyTransmissionStatParameters', 'params')], 
+                   is_static=True)
     ## phy-tx-stats-calculator.h (module 'lte'): static void ns3::PhyTxStatsCalculator::UlPhyTransmissionCallback(ns3::Ptr<ns3::PhyTxStatsCalculator> phyTxStats, std::string path, ns3::PhyTransmissionStatParameters params) [member function]
     cls.add_method('UlPhyTransmissionCallback', 
                    'void', 
@@ -22932,10 +23127,10 @@
     cls.add_constructor([param('ns3::PointToPointEpcHelper const &', 'arg0')])
     ## point-to-point-epc-helper.h (module 'lte'): ns3::PointToPointEpcHelper::PointToPointEpcHelper() [constructor]
     cls.add_constructor([])
-    ## point-to-point-epc-helper.h (module 'lte'): void ns3::PointToPointEpcHelper::AddEnb(ns3::Ptr<ns3::Node> enbNode, ns3::Ptr<ns3::NetDevice> lteEnbNetDevice, uint16_t cellId) [member function]
+    ## point-to-point-epc-helper.h (module 'lte'): void ns3::PointToPointEpcHelper::AddEnb(ns3::Ptr<ns3::Node> enbNode, ns3::Ptr<ns3::NetDevice> lteEnbNetDevice, std::vector<unsigned short, std::allocator<unsigned short>> cellIds) [member function]
     cls.add_method('AddEnb', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Node >', 'enbNode'), param('ns3::Ptr< ns3::NetDevice >', 'lteEnbNetDevice'), param('uint16_t', 'cellId')], 
+                   [param('ns3::Ptr< ns3::Node >', 'enbNode'), param('ns3::Ptr< ns3::NetDevice >', 'lteEnbNetDevice'), param('std::vector< unsigned short >', 'cellIds')], 
                    is_virtual=True)
     ## point-to-point-epc-helper.h (module 'lte'): void ns3::PointToPointEpcHelper::DoDispose() [member function]
     cls.add_method('DoDispose', 
@@ -23094,7 +23289,7 @@
     cls.add_method('GetDlDelay', 
                    'double', 
                    [param('uint64_t', 'imsi'), param('uint8_t', 'lcid')])
-    ## radio-bearer-stats-calculator.h (module 'lte'): std::vector<double, std::allocator<double> > ns3::RadioBearerStatsCalculator::GetDlDelayStats(uint64_t imsi, uint8_t lcid) [member function]
+    ## radio-bearer-stats-calculator.h (module 'lte'): std::vector<double, std::allocator<double>> ns3::RadioBearerStatsCalculator::GetDlDelayStats(uint64_t imsi, uint8_t lcid) [member function]
     cls.add_method('GetDlDelayStats', 
                    'std::vector< double >', 
                    [param('uint64_t', 'imsi'), param('uint8_t', 'lcid')])
@@ -23106,7 +23301,7 @@
     cls.add_method('GetDlPdcpOutputFilename', 
                    'std::string', 
                    [])
-    ## radio-bearer-stats-calculator.h (module 'lte'): std::vector<double, std::allocator<double> > ns3::RadioBearerStatsCalculator::GetDlPduSizeStats(uint64_t imsi, uint8_t lcid) [member function]
+    ## radio-bearer-stats-calculator.h (module 'lte'): std::vector<double, std::allocator<double>> ns3::RadioBearerStatsCalculator::GetDlPduSizeStats(uint64_t imsi, uint8_t lcid) [member function]
     cls.add_method('GetDlPduSizeStats', 
                    'std::vector< double >', 
                    [param('uint64_t', 'imsi'), param('uint8_t', 'lcid')])
@@ -23149,7 +23344,7 @@
     cls.add_method('GetUlDelay', 
                    'double', 
                    [param('uint64_t', 'imsi'), param('uint8_t', 'lcid')])
-    ## radio-bearer-stats-calculator.h (module 'lte'): std::vector<double, std::allocator<double> > ns3::RadioBearerStatsCalculator::GetUlDelayStats(uint64_t imsi, uint8_t lcid) [member function]
+    ## radio-bearer-stats-calculator.h (module 'lte'): std::vector<double, std::allocator<double>> ns3::RadioBearerStatsCalculator::GetUlDelayStats(uint64_t imsi, uint8_t lcid) [member function]
     cls.add_method('GetUlDelayStats', 
                    'std::vector< double >', 
                    [param('uint64_t', 'imsi'), param('uint8_t', 'lcid')])
@@ -23161,7 +23356,7 @@
     cls.add_method('GetUlPdcpOutputFilename', 
                    'std::string', 
                    [])
-    ## radio-bearer-stats-calculator.h (module 'lte'): std::vector<double, std::allocator<double> > ns3::RadioBearerStatsCalculator::GetUlPduSizeStats(uint64_t imsi, uint8_t lcid) [member function]
+    ## radio-bearer-stats-calculator.h (module 'lte'): std::vector<double, std::allocator<double>> ns3::RadioBearerStatsCalculator::GetUlPduSizeStats(uint64_t imsi, uint8_t lcid) [member function]
     cls.add_method('GetUlPduSizeStats', 
                    'std::vector< double >', 
                    [param('uint64_t', 'imsi'), param('uint8_t', 'lcid')])
@@ -23221,12 +23416,12 @@
                    'uint16_t', 
                    [], 
                    is_const=True)
-    ## lte-control-messages.h (module 'lte'): std::list<ns3::RarLteControlMessage::Rar, std::allocator<ns3::RarLteControlMessage::Rar> >::const_iterator ns3::RarLteControlMessage::RarListBegin() const [member function]
+    ## lte-control-messages.h (module 'lte'): std::list<ns3::RarLteControlMessage::Rar, std::allocator<ns3::RarLteControlMessage::Rar>>::const_iterator ns3::RarLteControlMessage::RarListBegin() const [member function]
     cls.add_method('RarListBegin', 
                    'std::list< ns3::RarLteControlMessage::Rar > const_iterator', 
                    [], 
                    is_const=True)
-    ## lte-control-messages.h (module 'lte'): std::list<ns3::RarLteControlMessage::Rar, std::allocator<ns3::RarLteControlMessage::Rar> >::const_iterator ns3::RarLteControlMessage::RarListEnd() const [member function]
+    ## lte-control-messages.h (module 'lte'): std::list<ns3::RarLteControlMessage::Rar, std::allocator<ns3::RarLteControlMessage::Rar>>::const_iterator ns3::RarLteControlMessage::RarListEnd() const [member function]
     cls.add_method('RarListEnd', 
                    'std::list< ns3::RarLteControlMessage::Rar > const_iterator', 
                    [], 
@@ -23291,9 +23486,9 @@
                    'ns3::Ptr< ns3::SpectrumModel const >', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## rem-spectrum-phy.h (module 'lte'): ns3::Ptr<ns3::AntennaModel> ns3::RemSpectrumPhy::GetRxAntenna() const [member function]
-    cls.add_method('GetRxAntenna', 
-                   'ns3::Ptr< ns3::AntennaModel >', 
+    ## rem-spectrum-phy.h (module 'lte'): ns3::Ptr<ns3::Object> ns3::RemSpectrumPhy::GetAntenna() const [member function]
+    cls.add_method('GetAntenna', 
+                   'ns3::Ptr< ns3::Object >', 
                    [], 
                    is_const=True, is_virtual=True)
     ## rem-spectrum-phy.h (module 'lte'): void ns3::RemSpectrumPhy::StartRx(ns3::Ptr<ns3::SpectrumSignalParameters> params) [member function]
@@ -23433,7 +23628,7 @@
                    'ns3::Buffer::Iterator', 
                    [param('ns3::LteRrcSap::CellIdentification *', 'ci'), param('ns3::Buffer::Iterator', 'bIterator')], 
                    visibility='protected')
-    ## lte-rrc-header.h (module 'lte'): ns3::Buffer::Iterator ns3::RrcAsn1Header::DeserializeDrbToAddModList(std::list<ns3::LteRrcSap::DrbToAddMod, std::allocator<ns3::LteRrcSap::DrbToAddMod> > * drbToAddModLis, ns3::Buffer::Iterator bIterator) [member function]
+    ## lte-rrc-header.h (module 'lte'): ns3::Buffer::Iterator ns3::RrcAsn1Header::DeserializeDrbToAddModList(std::list<ns3::LteRrcSap::DrbToAddMod, std::allocator<ns3::LteRrcSap::DrbToAddMod>> * drbToAddModLis, ns3::Buffer::Iterator bIterator) [member function]
     cls.add_method('DeserializeDrbToAddModList', 
                    'ns3::Buffer::Iterator', 
                    [param('std::list< ns3::LteRrcSap::DrbToAddMod > *', 'drbToAddModLis'), param('ns3::Buffer::Iterator', 'bIterator')], 
@@ -23508,7 +23703,7 @@
                    'ns3::Buffer::Iterator', 
                    [param('ns3::LteRrcSap::RadioResourceConfigDedicatedSCell *', 'rrcdsc'), param('ns3::Buffer::Iterator', 'bIterator')], 
                    visibility='protected')
-    ## lte-rrc-header.h (module 'lte'): ns3::Buffer::Iterator ns3::RrcAsn1Header::DeserializeSrbToAddModList(std::list<ns3::LteRrcSap::SrbToAddMod, std::allocator<ns3::LteRrcSap::SrbToAddMod> > * srbToAddModList, ns3::Buffer::Iterator bIterator) [member function]
+    ## lte-rrc-header.h (module 'lte'): ns3::Buffer::Iterator ns3::RrcAsn1Header::DeserializeSrbToAddModList(std::list<ns3::LteRrcSap::SrbToAddMod, std::allocator<ns3::LteRrcSap::SrbToAddMod>> * srbToAddModList, ns3::Buffer::Iterator bIterator) [member function]
     cls.add_method('DeserializeSrbToAddModList', 
                    'ns3::Buffer::Iterator', 
                    [param('std::list< ns3::LteRrcSap::SrbToAddMod > *', 'srbToAddModList'), param('ns3::Buffer::Iterator', 'bIterator')], 
@@ -23558,7 +23753,7 @@
                    'void', 
                    [param('std::ostream &', 'os'), param('ns3::LteRrcSap::RadioResourceConfigDedicated', 'radioResourceConfigDedicated')], 
                    is_const=True, visibility='protected')
-    ## lte-rrc-header.h (module 'lte'): void ns3::RrcAsn1Header::SerializeDrbToAddModList(std::list<ns3::LteRrcSap::DrbToAddMod, std::allocator<ns3::LteRrcSap::DrbToAddMod> > drbToAddModList) const [member function]
+    ## lte-rrc-header.h (module 'lte'): void ns3::RrcAsn1Header::SerializeDrbToAddModList(std::list<ns3::LteRrcSap::DrbToAddMod, std::allocator<ns3::LteRrcSap::DrbToAddMod>> drbToAddModList) const [member function]
     cls.add_method('SerializeDrbToAddModList', 
                    'void', 
                    [param('std::list< ns3::LteRrcSap::DrbToAddMod >', 'drbToAddModList')], 
@@ -23633,7 +23828,7 @@
                    'void', 
                    [param('ns3::LteRrcSap::RadioResourceConfigDedicatedSCell', 'rrcdsc')], 
                    is_const=True, visibility='protected')
-    ## lte-rrc-header.h (module 'lte'): void ns3::RrcAsn1Header::SerializeSrbToAddModList(std::list<ns3::LteRrcSap::SrbToAddMod, std::allocator<ns3::LteRrcSap::SrbToAddMod> > srbToAddModList) const [member function]
+    ## lte-rrc-header.h (module 'lte'): void ns3::RrcAsn1Header::SerializeSrbToAddModList(std::list<ns3::LteRrcSap::SrbToAddMod, std::allocator<ns3::LteRrcSap::SrbToAddMod>> srbToAddModList) const [member function]
     cls.add_method('SerializeSrbToAddModList', 
                    'void', 
                    [param('std::list< ns3::LteRrcSap::SrbToAddMod >', 'srbToAddModList')], 
@@ -23814,7 +24009,7 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## simple-ue-component-carrier-manager.h (module 'lte'): std::vector<ns3::LteUeCcmRrcSapProvider::LcsConfig, std::allocator<ns3::LteUeCcmRrcSapProvider::LcsConfig> > ns3::SimpleUeComponentCarrierManager::DoAddLc(uint8_t lcId, ns3::LteUeCmacSapProvider::LogicalChannelConfig lcConfig, ns3::LteMacSapUser * msu) [member function]
+    ## simple-ue-component-carrier-manager.h (module 'lte'): std::vector<ns3::LteUeCcmRrcSapProvider::LcsConfig, std::allocator<ns3::LteUeCcmRrcSapProvider::LcsConfig>> ns3::SimpleUeComponentCarrierManager::DoAddLc(uint8_t lcId, ns3::LteUeCmacSapProvider::LogicalChannelConfig lcConfig, ns3::LteMacSapUser * msu) [member function]
     cls.add_method('DoAddLc', 
                    'std::vector< ns3::LteUeCcmRrcSapProvider::LcsConfig >', 
                    [param('uint8_t', 'lcId'), param('ns3::LteUeCmacSapProvider::LogicalChannelConfig', 'lcConfig'), param('ns3::LteMacSapUser *', 'msu')], 
@@ -23849,7 +24044,7 @@
                    'void', 
                    [param('ns3::LteMacSapUser::ReceivePduParameters', 'rxPduParams')], 
                    visibility='protected')
-    ## simple-ue-component-carrier-manager.h (module 'lte'): std::vector<unsigned short, std::allocator<unsigned short> > ns3::SimpleUeComponentCarrierManager::DoRemoveLc(uint8_t lcid) [member function]
+    ## simple-ue-component-carrier-manager.h (module 'lte'): std::vector<unsigned short, std::allocator<unsigned short>> ns3::SimpleUeComponentCarrierManager::DoRemoveLc(uint8_t lcid) [member function]
     cls.add_method('DoRemoveLc', 
                    'std::vector< unsigned short >', 
                    [param('uint8_t', 'lcid')], 
@@ -23881,6 +24076,10 @@
     cls.add_constructor([param('ns3::SpectrumChannel const &', 'arg0')])
     ## spectrum-channel.h (module 'spectrum'): ns3::SpectrumChannel::SpectrumChannel() [constructor]
     cls.add_constructor([])
+    ## spectrum-channel.h (module 'spectrum'): void ns3::SpectrumChannel::AddPhasedArraySpectrumPropagationLossModel(ns3::Ptr<ns3::PhasedArraySpectrumPropagationLossModel> loss) [member function]
+    cls.add_method('AddPhasedArraySpectrumPropagationLossModel', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::PhasedArraySpectrumPropagationLossModel >', 'loss')])
     ## spectrum-channel.h (module 'spectrum'): void ns3::SpectrumChannel::AddPropagationLossModel(ns3::Ptr<ns3::PropagationLossModel> loss) [member function]
     cls.add_method('AddPropagationLossModel', 
                    'void', 
@@ -23899,6 +24098,10 @@
                    'void', 
                    [], 
                    is_virtual=True)
+    ## spectrum-channel.h (module 'spectrum'): ns3::Ptr<ns3::PhasedArraySpectrumPropagationLossModel> ns3::SpectrumChannel::GetPhasedArraySpectrumPropagationLossModel() [member function]
+    cls.add_method('GetPhasedArraySpectrumPropagationLossModel', 
+                   'ns3::Ptr< ns3::PhasedArraySpectrumPropagationLossModel >', 
+                   [])
     ## spectrum-channel.h (module 'spectrum'): ns3::Ptr<ns3::PropagationLossModel> ns3::SpectrumChannel::GetPropagationLossModel() [member function]
     cls.add_method('GetPropagationLossModel', 
                    'ns3::Ptr< ns3::PropagationLossModel >', 
@@ -23912,6 +24115,11 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## spectrum-channel.h (module 'spectrum'): void ns3::SpectrumChannel::RemoveRx(ns3::Ptr<ns3::SpectrumPhy> phy) [member function]
+    cls.add_method('RemoveRx', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::SpectrumPhy >', 'phy')], 
+                   is_pure_virtual=True, is_virtual=True)
     ## spectrum-channel.h (module 'spectrum'): void ns3::SpectrumChannel::SetPropagationDelayModel(ns3::Ptr<ns3::PropagationDelayModel> delay) [member function]
     cls.add_method('SetPropagationDelayModel', 
                    'void', 
@@ -24995,22 +25203,22 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3LteUeRrc__gt___StdList__lt__ns3LteRrcSapSCellToAddMod__stdAllocator__lt__ns3LteRrcSapSCellToAddMod__gt_____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::LteUeRrc>, std::list<ns3::LteRrcSap::SCellToAddMod, std::allocator<ns3::LteRrcSap::SCellToAddMod> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3LteUeRrc__gt___StdList__lt__ns3LteRrcSapSCellToAddMod__stdAllocator__lt__ns3LteRrcSapSCellToAddMod__gt____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::LteUeRrc>, std::list<ns3::LteRrcSap::SCellToAddMod, std::allocator<ns3::LteRrcSap::SCellToAddMod>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::LteUeRrc>, std::list<ns3::LteRrcSap::SCellToAddMod, std::allocator<ns3::LteRrcSap::SCellToAddMod> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<ns3::LteUeRrc>, std::list<ns3::LteRrcSap::SCellToAddMod, std::allocator<ns3::LteRrcSap::SCellToAddMod> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::LteUeRrc>, std::list<ns3::LteRrcSap::SCellToAddMod, std::allocator<ns3::LteRrcSap::SCellToAddMod>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<ns3::LteUeRrc>, std::list<ns3::LteRrcSap::SCellToAddMod, std::allocator<ns3::LteRrcSap::SCellToAddMod>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
     cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::LteUeRrc >, std::list< ns3::LteRrcSap::SCellToAddMod >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::LteUeRrc>, std::list<ns3::LteRrcSap::SCellToAddMod, std::allocator<ns3::LteRrcSap::SCellToAddMod> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::LteUeRrc>, std::list<ns3::LteRrcSap::SCellToAddMod, std::allocator<ns3::LteRrcSap::SCellToAddMod>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
     cls.add_method('DoGetTypeid', 
                    'std::string', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::LteUeRrc>, std::list<ns3::LteRrcSap::SCellToAddMod, std::allocator<ns3::LteRrcSap::SCellToAddMod> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::LteUeRrc>, std::list<ns3::LteRrcSap::SCellToAddMod, std::allocator<ns3::LteRrcSap::SCellToAddMod>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
     cls.add_method('GetTypeid', 
                    'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<ns3::LteUeRrc>, std::list<ns3::LteRrcSap::SCellToAddMod, std::allocator<ns3::LteRrcSap::SCellToAddMod> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<ns3::LteUeRrc> arg0, std::list<ns3::LteRrcSap::SCellToAddMod, std::allocator<ns3::LteRrcSap::SCellToAddMod> > arg1) [member operator]
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<ns3::LteUeRrc>, std::list<ns3::LteRrcSap::SCellToAddMod, std::allocator<ns3::LteRrcSap::SCellToAddMod>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<ns3::LteUeRrc> arg0, std::list<ns3::LteRrcSap::SCellToAddMod, std::allocator<ns3::LteRrcSap::SCellToAddMod>> arg1) [member operator]
     cls.add_method('operator()', 
                    'void', 
                    [param('ns3::Ptr< ns3::LteUeRrc >', 'arg0'), param('std::list< ns3::LteRrcSap::SCellToAddMod >', 'arg1')], 
@@ -25363,10 +25571,10 @@
                    'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned long, unsigned short, unsigned short, std::basic_string<char>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(long unsigned int arg0, short unsigned int arg1, short unsigned int arg2, std::basic_string<char, std::char_traits<char>, std::allocator<char> > arg3) [member operator]
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned long, unsigned short, unsigned short, std::basic_string<char>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(long unsigned int arg0, short unsigned int arg1, short unsigned int arg2, std::basic_string<char, std::char_traits<char>, std::allocator<char>> arg3) [member operator]
     cls.add_method('operator()', 
                    'void', 
-                   [param('long unsigned int', 'arg0'), param('short unsigned int', 'arg1'), param('short unsigned int', 'arg2'), param('std::string', 'arg3')], 
+                   [param('long unsigned int', 'arg0'), param('short unsigned int', 'arg1'), param('short unsigned int', 'arg2'), param('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'arg3')], 
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
@@ -25385,10 +25593,10 @@
                    'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned long, unsigned short, unsigned short, std::basic_string<char>, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(long unsigned int arg0, short unsigned int arg1, short unsigned int arg2, std::basic_string<char, std::char_traits<char>, std::allocator<char> > arg3, unsigned char arg4) [member operator]
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned long, unsigned short, unsigned short, std::basic_string<char>, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(long unsigned int arg0, short unsigned int arg1, short unsigned int arg2, std::basic_string<char, std::char_traits<char>, std::allocator<char>> arg3, unsigned char arg4) [member operator]
     cls.add_method('operator()', 
                    'void', 
-                   [param('long unsigned int', 'arg0'), param('short unsigned int', 'arg1'), param('short unsigned int', 'arg2'), param('std::string', 'arg3'), param('unsigned char', 'arg4')], 
+                   [param('long unsigned int', 'arg0'), param('short unsigned int', 'arg1'), param('short unsigned int', 'arg2'), param('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'arg3'), param('unsigned char', 'arg4')], 
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
@@ -25436,22 +25644,22 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3CallbackImpl__Void_Unsigned_short_Const_stdVector__lt__int__stdAllocator__lt__int__gt_____gt_____amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned short, const std::vector<int, std::allocator<int> > &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+def register_Ns3CallbackImpl__Void_Unsigned_short_Const_stdVector__lt__int__stdAllocator__lt__int__gt____gt_____amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned short, const std::vector<int, std::allocator<int>> &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned short, const std::vector<int, std::allocator<int> > &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, unsigned short, const std::vector<int, std::allocator<int> > &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned short, const std::vector<int, std::allocator<int>> &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, unsigned short, const std::vector<int, std::allocator<int>> &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
     cls.add_constructor([param('ns3::CallbackImpl< void, unsigned short, std::vector< int, std::allocator< int > > const, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, unsigned short, const std::vector<int, std::allocator<int> > &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, unsigned short, const std::vector<int, std::allocator<int>> &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
     cls.add_method('DoGetTypeid', 
                    'std::string', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, unsigned short, const std::vector<int, std::allocator<int> > &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, unsigned short, const std::vector<int, std::allocator<int>> &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
     cls.add_method('GetTypeid', 
                    'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned short, const std::vector<int, std::allocator<int> > &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(short unsigned int arg0, std::vector<int, std::allocator<int> > const & arg1) [member operator]
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned short, const std::vector<int, std::allocator<int>> &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(short unsigned int arg0, std::vector<int, std::allocator<int>> const & arg1) [member operator]
     cls.add_method('operator()', 
                    'void', 
                    [param('short unsigned int', 'arg0'), param('std::vector< int > const &', 'arg1')], 
@@ -25758,10 +25966,10 @@
     cls.add_constructor([param('ns3::EmuEpcHelper const &', 'arg0')])
     ## emu-epc-helper.h (module 'lte'): ns3::EmuEpcHelper::EmuEpcHelper() [constructor]
     cls.add_constructor([])
-    ## emu-epc-helper.h (module 'lte'): void ns3::EmuEpcHelper::AddEnb(ns3::Ptr<ns3::Node> enbNode, ns3::Ptr<ns3::NetDevice> lteEnbNetDevice, uint16_t cellId) [member function]
+    ## emu-epc-helper.h (module 'lte'): void ns3::EmuEpcHelper::AddEnb(ns3::Ptr<ns3::Node> enbNode, ns3::Ptr<ns3::NetDevice> lteEnbNetDevice, std::vector<unsigned short, std::allocator<unsigned short>> cellIds) [member function]
     cls.add_method('AddEnb', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Node >', 'enbNode'), param('ns3::Ptr< ns3::NetDevice >', 'lteEnbNetDevice'), param('uint16_t', 'cellId')], 
+                   [param('ns3::Ptr< ns3::Node >', 'enbNode'), param('ns3::Ptr< ns3::NetDevice >', 'lteEnbNetDevice'), param('std::vector< unsigned short >', 'cellIds')], 
                    is_virtual=True)
     ## emu-epc-helper.h (module 'lte'): void ns3::EmuEpcHelper::AddX2Interface(ns3::Ptr<ns3::Node> enbNode1, ns3::Ptr<ns3::Node> enbNode2) [member function]
     cls.add_method('AddX2Interface', 
@@ -25948,7 +26156,7 @@
                    'uint32_t', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_virtual=True)
-    ## epc-gtpc-header.h (module 'lte'): std::list<ns3::GtpcCreateSessionRequestMessage::BearerContextToBeCreated, std::allocator<ns3::GtpcCreateSessionRequestMessage::BearerContextToBeCreated> > ns3::GtpcCreateSessionRequestMessage::GetBearerContextsToBeCreated() const [member function]
+    ## epc-gtpc-header.h (module 'lte'): std::list<ns3::GtpcCreateSessionRequestMessage::BearerContextToBeCreated, std::allocator<ns3::GtpcCreateSessionRequestMessage::BearerContextToBeCreated>> ns3::GtpcCreateSessionRequestMessage::GetBearerContextsToBeCreated() const [member function]
     cls.add_method('GetBearerContextsToBeCreated', 
                    'std::list< ns3::GtpcCreateSessionRequestMessage::BearerContextToBeCreated >', 
                    [], 
@@ -25998,7 +26206,7 @@
                    'void', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_const=True, is_virtual=True)
-    ## epc-gtpc-header.h (module 'lte'): void ns3::GtpcCreateSessionRequestMessage::SetBearerContextsToBeCreated(std::list<ns3::GtpcCreateSessionRequestMessage::BearerContextToBeCreated, std::allocator<ns3::GtpcCreateSessionRequestMessage::BearerContextToBeCreated> > bearerContexts) [member function]
+    ## epc-gtpc-header.h (module 'lte'): void ns3::GtpcCreateSessionRequestMessage::SetBearerContextsToBeCreated(std::list<ns3::GtpcCreateSessionRequestMessage::BearerContextToBeCreated, std::allocator<ns3::GtpcCreateSessionRequestMessage::BearerContextToBeCreated>> bearerContexts) [member function]
     cls.add_method('SetBearerContextsToBeCreated', 
                    'void', 
                    [param('std::list< ns3::GtpcCreateSessionRequestMessage::BearerContextToBeCreated >', 'bearerContexts')])
@@ -26041,7 +26249,7 @@
                    'uint32_t', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_virtual=True)
-    ## epc-gtpc-header.h (module 'lte'): std::list<ns3::GtpcCreateSessionResponseMessage::BearerContextCreated, std::allocator<ns3::GtpcCreateSessionResponseMessage::BearerContextCreated> > ns3::GtpcCreateSessionResponseMessage::GetBearerContextsCreated() const [member function]
+    ## epc-gtpc-header.h (module 'lte'): std::list<ns3::GtpcCreateSessionResponseMessage::BearerContextCreated, std::allocator<ns3::GtpcCreateSessionResponseMessage::BearerContextCreated>> ns3::GtpcCreateSessionResponseMessage::GetBearerContextsCreated() const [member function]
     cls.add_method('GetBearerContextsCreated', 
                    'std::list< ns3::GtpcCreateSessionResponseMessage::BearerContextCreated >', 
                    [], 
@@ -26086,7 +26294,7 @@
                    'void', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_const=True, is_virtual=True)
-    ## epc-gtpc-header.h (module 'lte'): void ns3::GtpcCreateSessionResponseMessage::SetBearerContextsCreated(std::list<ns3::GtpcCreateSessionResponseMessage::BearerContextCreated, std::allocator<ns3::GtpcCreateSessionResponseMessage::BearerContextCreated> > bearerContexts) [member function]
+    ## epc-gtpc-header.h (module 'lte'): void ns3::GtpcCreateSessionResponseMessage::SetBearerContextsCreated(std::list<ns3::GtpcCreateSessionResponseMessage::BearerContextCreated, std::allocator<ns3::GtpcCreateSessionResponseMessage::BearerContextCreated>> bearerContexts) [member function]
     cls.add_method('SetBearerContextsCreated', 
                    'void', 
                    [param('std::list< ns3::GtpcCreateSessionResponseMessage::BearerContextCreated >', 'bearerContexts')])
@@ -26127,7 +26335,7 @@
                    'uint32_t', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_virtual=True)
-    ## epc-gtpc-header.h (module 'lte'): std::list<ns3::GtpcDeleteBearerCommandMessage::BearerContext, std::allocator<ns3::GtpcDeleteBearerCommandMessage::BearerContext> > ns3::GtpcDeleteBearerCommandMessage::GetBearerContexts() const [member function]
+    ## epc-gtpc-header.h (module 'lte'): std::list<ns3::GtpcDeleteBearerCommandMessage::BearerContext, std::allocator<ns3::GtpcDeleteBearerCommandMessage::BearerContext>> ns3::GtpcDeleteBearerCommandMessage::GetBearerContexts() const [member function]
     cls.add_method('GetBearerContexts', 
                    'std::list< ns3::GtpcDeleteBearerCommandMessage::BearerContext >', 
                    [], 
@@ -26162,7 +26370,7 @@
                    'void', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_const=True, is_virtual=True)
-    ## epc-gtpc-header.h (module 'lte'): void ns3::GtpcDeleteBearerCommandMessage::SetBearerContexts(std::list<ns3::GtpcDeleteBearerCommandMessage::BearerContext, std::allocator<ns3::GtpcDeleteBearerCommandMessage::BearerContext> > bearerContexts) [member function]
+    ## epc-gtpc-header.h (module 'lte'): void ns3::GtpcDeleteBearerCommandMessage::SetBearerContexts(std::list<ns3::GtpcDeleteBearerCommandMessage::BearerContext, std::allocator<ns3::GtpcDeleteBearerCommandMessage::BearerContext>> bearerContexts) [member function]
     cls.add_method('SetBearerContexts', 
                    'void', 
                    [param('std::list< ns3::GtpcDeleteBearerCommandMessage::BearerContext >', 'bearerContexts')])
@@ -26215,12 +26423,12 @@
                    'uint32_t', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## epc-gtpc-header.h (module 'lte'): std::list<unsigned char, std::allocator<unsigned char> > ns3::GtpcDeleteBearerRequestMessage::GetEpsBearerIds() const [member function]
+    ## epc-gtpc-header.h (module 'lte'): std::list<unsigned char, std::allocator<unsigned char>> ns3::GtpcDeleteBearerRequestMessage::GetEpsBearerIds() const [member function]
     cls.add_method('GetEpsBearerIds', 
                    'std::list< unsigned char >', 
                    [], 
                    is_const=True)
-    ## epc-gtpc-header.h (module 'lte'): void ns3::GtpcDeleteBearerRequestMessage::SetEpsBearerIds(std::list<unsigned char, std::allocator<unsigned char> > epsBearerIds) [member function]
+    ## epc-gtpc-header.h (module 'lte'): void ns3::GtpcDeleteBearerRequestMessage::SetEpsBearerIds(std::list<unsigned char, std::allocator<unsigned char>> epsBearerIds) [member function]
     cls.add_method('SetEpsBearerIds', 
                    'void', 
                    [param('std::list< unsigned char >', 'epsBearerIds')])
@@ -26275,12 +26483,12 @@
     cls.add_method('SetCause', 
                    'void', 
                    [param('ns3::GtpcIes::Cause_t', 'cause')])
-    ## epc-gtpc-header.h (module 'lte'): std::list<unsigned char, std::allocator<unsigned char> > ns3::GtpcDeleteBearerResponseMessage::GetEpsBearerIds() const [member function]
+    ## epc-gtpc-header.h (module 'lte'): std::list<unsigned char, std::allocator<unsigned char>> ns3::GtpcDeleteBearerResponseMessage::GetEpsBearerIds() const [member function]
     cls.add_method('GetEpsBearerIds', 
                    'std::list< unsigned char >', 
                    [], 
                    is_const=True)
-    ## epc-gtpc-header.h (module 'lte'): void ns3::GtpcDeleteBearerResponseMessage::SetEpsBearerIds(std::list<unsigned char, std::allocator<unsigned char> > epsBearerIds) [member function]
+    ## epc-gtpc-header.h (module 'lte'): void ns3::GtpcDeleteBearerResponseMessage::SetEpsBearerIds(std::list<unsigned char, std::allocator<unsigned char>> epsBearerIds) [member function]
     cls.add_method('SetEpsBearerIds', 
                    'void', 
                    [param('std::list< unsigned char >', 'epsBearerIds')])
@@ -26359,7 +26567,7 @@
     cls.add_constructor([])
     ## lte-enb-phy.h (module 'lte'): ns3::LteEnbPhy::LteEnbPhy(ns3::Ptr<ns3::LteSpectrumPhy> dlPhy, ns3::Ptr<ns3::LteSpectrumPhy> ulPhy) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::LteSpectrumPhy >', 'dlPhy'), param('ns3::Ptr< ns3::LteSpectrumPhy >', 'ulPhy')])
-    ## lte-enb-phy.h (module 'lte'): void ns3::LteEnbPhy::CalcChannelQualityForUe(std::vector<double, std::allocator<double> > sinr, ns3::Ptr<ns3::LteSpectrumPhy> ue) [member function]
+    ## lte-enb-phy.h (module 'lte'): void ns3::LteEnbPhy::CalcChannelQualityForUe(std::vector<double, std::allocator<double>> sinr, ns3::Ptr<ns3::LteSpectrumPhy> ue) [member function]
     cls.add_method('CalcChannelQualityForUe', 
                    'void', 
                    [param('std::vector< double >', 'sinr'), param('ns3::Ptr< ns3::LteSpectrumPhy >', 'ue')])
@@ -26381,7 +26589,7 @@
                    'ns3::Ptr< ns3::SpectrumValue >', 
                    [], 
                    is_virtual=True)
-    ## lte-enb-phy.h (module 'lte'): std::list<ns3::UlDciLteControlMessage, std::allocator<ns3::UlDciLteControlMessage> > ns3::LteEnbPhy::DequeueUlDci() [member function]
+    ## lte-enb-phy.h (module 'lte'): std::list<ns3::UlDciLteControlMessage, std::allocator<ns3::UlDciLteControlMessage>> ns3::LteEnbPhy::DequeueUlDci() [member function]
     cls.add_method('DequeueUlDci', 
                    'std::list< ns3::UlDciLteControlMessage >', 
                    [])
@@ -26427,7 +26635,7 @@
                    'ns3::Ptr< ns3::LteSpectrumPhy >', 
                    [], 
                    is_const=True)
-    ## lte-enb-phy.h (module 'lte'): std::vector<int, std::allocator<int> > ns3::LteEnbPhy::GetDownlinkSubChannels() [member function]
+    ## lte-enb-phy.h (module 'lte'): std::vector<int, std::allocator<int>> ns3::LteEnbPhy::GetDownlinkSubChannels() [member function]
     cls.add_method('GetDownlinkSubChannels', 
                    'std::vector< int >', 
                    [])
@@ -26477,10 +26685,10 @@
                    'void', 
                    [param('ns3::Ptr< ns3::LteControlMessage >', 'msg')], 
                    is_virtual=True)
-    ## lte-enb-phy.h (module 'lte'): void ns3::LteEnbPhy::ReceiveLteControlMessageList(std::list<ns3::Ptr<ns3::LteControlMessage>, std::allocator<ns3::Ptr<ns3::LteControlMessage> > > arg0) [member function]
+    ## lte-enb-phy.h (module 'lte'): void ns3::LteEnbPhy::ReceiveLteControlMessageList(std::list<ns3::Ptr<ns3::LteControlMessage>, std::allocator<ns3::Ptr<ns3::LteControlMessage>>> msgList) [member function]
     cls.add_method('ReceiveLteControlMessageList', 
                    'void', 
-                   [param('std::list< ns3::Ptr< ns3::LteControlMessage > >', 'arg0')], 
+                   [param('std::list< ns3::Ptr< ns3::LteControlMessage > >', 'msgList')], 
                    is_virtual=True)
     ## lte-enb-phy.h (module 'lte'): void ns3::LteEnbPhy::ReportInterference(ns3::SpectrumValue const & interf) [member function]
     cls.add_method('ReportInterference', 
@@ -26497,7 +26705,7 @@
                    'void', 
                    [param('ns3::UlInfoListElement_s', 'mes')], 
                    is_virtual=True)
-    ## lte-enb-phy.h (module 'lte'): void ns3::LteEnbPhy::SendControlChannels(std::list<ns3::Ptr<ns3::LteControlMessage>, std::allocator<ns3::Ptr<ns3::LteControlMessage> > > ctrlMsgList) [member function]
+    ## lte-enb-phy.h (module 'lte'): void ns3::LteEnbPhy::SendControlChannels(std::list<ns3::Ptr<ns3::LteControlMessage>, std::allocator<ns3::Ptr<ns3::LteControlMessage>>> ctrlMsgList) [member function]
     cls.add_method('SendControlChannels', 
                    'void', 
                    [param('std::list< ns3::Ptr< ns3::LteControlMessage > >', 'ctrlMsgList')])
@@ -26505,11 +26713,11 @@
     cls.add_method('SendDataChannels', 
                    'void', 
                    [param('ns3::Ptr< ns3::PacketBurst >', 'pb')])
-    ## lte-enb-phy.h (module 'lte'): void ns3::LteEnbPhy::SetDownlinkSubChannels(std::vector<int, std::allocator<int> > mask) [member function]
+    ## lte-enb-phy.h (module 'lte'): void ns3::LteEnbPhy::SetDownlinkSubChannels(std::vector<int, std::allocator<int>> mask) [member function]
     cls.add_method('SetDownlinkSubChannels', 
                    'void', 
                    [param('std::vector< int >', 'mask')])
-    ## lte-enb-phy.h (module 'lte'): void ns3::LteEnbPhy::SetDownlinkSubChannelsWithPowerAllocation(std::vector<int, std::allocator<int> > mask) [member function]
+    ## lte-enb-phy.h (module 'lte'): void ns3::LteEnbPhy::SetDownlinkSubChannelsWithPowerAllocation(std::vector<int, std::allocator<int>> mask) [member function]
     cls.add_method('SetDownlinkSubChannelsWithPowerAllocation', 
                    'void', 
                    [param('std::vector< int >', 'mask')])
@@ -26760,11 +26968,11 @@
     cls.add_method('GetTargetEnb', 
                    'ns3::Ptr< ns3::LteEnbNetDevice >', 
                    [])
-    ## lte-ue-net-device.h (module 'lte'): void ns3::LteUeNetDevice::SetCcMap(std::map<unsigned char, ns3::Ptr<ns3::ComponentCarrierUe>, std::less<unsigned char>, std::allocator<std::pair<const unsigned char, ns3::Ptr<ns3::ComponentCarrierUe> > > > ccm) [member function]
+    ## lte-ue-net-device.h (module 'lte'): void ns3::LteUeNetDevice::SetCcMap(std::map<unsigned char, ns3::Ptr<ns3::ComponentCarrierUe>, std::less<unsigned char>, std::allocator<std::pair<const unsigned char, ns3::Ptr<ns3::ComponentCarrierUe>>>> ccm) [member function]
     cls.add_method('SetCcMap', 
                    'void', 
                    [param('std::map< unsigned char, ns3::Ptr< ns3::ComponentCarrierUe > >', 'ccm')])
-    ## lte-ue-net-device.h (module 'lte'): std::map<unsigned char, ns3::Ptr<ns3::ComponentCarrierUe>, std::less<unsigned char>, std::allocator<std::pair<const unsigned char, ns3::Ptr<ns3::ComponentCarrierUe> > > > ns3::LteUeNetDevice::GetCcMap() [member function]
+    ## lte-ue-net-device.h (module 'lte'): std::map<unsigned char, ns3::Ptr<ns3::ComponentCarrierUe>, std::less<unsigned char>, std::allocator<std::pair<const unsigned char, ns3::Ptr<ns3::ComponentCarrierUe>>>> ns3::LteUeNetDevice::GetCcMap() [member function]
     cls.add_method('GetCcMap', 
                    'std::map< unsigned char, ns3::Ptr< ns3::ComponentCarrierUe > >', 
                    [])
@@ -26852,12 +27060,12 @@
                    'uint32_t', 
                    [param('ns3::Buffer::Iterator', 'bIterator')], 
                    is_virtual=True)
-    ## lte-rrc-header.h (module 'lte'): std::list<ns3::LteRrcSap::DrbToAddMod, std::allocator<ns3::LteRrcSap::DrbToAddMod> > ns3::RrcConnectionReconfigurationHeader::GetDrbToAddModList() const [member function]
+    ## lte-rrc-header.h (module 'lte'): std::list<ns3::LteRrcSap::DrbToAddMod, std::allocator<ns3::LteRrcSap::DrbToAddMod>> ns3::RrcConnectionReconfigurationHeader::GetDrbToAddModList() const [member function]
     cls.add_method('GetDrbToAddModList', 
                    'std::list< ns3::LteRrcSap::DrbToAddMod >', 
                    [], 
                    is_const=True)
-    ## lte-rrc-header.h (module 'lte'): std::list<unsigned char, std::allocator<unsigned char> > ns3::RrcConnectionReconfigurationHeader::GetDrbToReleaseList() const [member function]
+    ## lte-rrc-header.h (module 'lte'): std::list<unsigned char, std::allocator<unsigned char>> ns3::RrcConnectionReconfigurationHeader::GetDrbToReleaseList() const [member function]
     cls.add_method('GetDrbToReleaseList', 
                    'std::list< unsigned char >', 
                    [], 
@@ -26914,7 +27122,7 @@
                    'uint8_t', 
                    [], 
                    is_const=True)
-    ## lte-rrc-header.h (module 'lte'): std::list<ns3::LteRrcSap::SrbToAddMod, std::allocator<ns3::LteRrcSap::SrbToAddMod> > ns3::RrcConnectionReconfigurationHeader::GetSrbToAddModList() const [member function]
+    ## lte-rrc-header.h (module 'lte'): std::list<ns3::LteRrcSap::SrbToAddMod, std::allocator<ns3::LteRrcSap::SrbToAddMod>> ns3::RrcConnectionReconfigurationHeader::GetSrbToAddModList() const [member function]
     cls.add_method('GetSrbToAddModList', 
                    'std::list< ns3::LteRrcSap::SrbToAddMod >', 
                    [], 
@@ -27243,12 +27451,12 @@
                    'uint32_t', 
                    [param('ns3::Buffer::Iterator', 'bIterator')], 
                    is_virtual=True)
-    ## lte-rrc-header.h (module 'lte'): std::list<ns3::LteRrcSap::DrbToAddMod, std::allocator<ns3::LteRrcSap::DrbToAddMod> > ns3::RrcConnectionSetupHeader::GetDrbToAddModList() const [member function]
+    ## lte-rrc-header.h (module 'lte'): std::list<ns3::LteRrcSap::DrbToAddMod, std::allocator<ns3::LteRrcSap::DrbToAddMod>> ns3::RrcConnectionSetupHeader::GetDrbToAddModList() const [member function]
     cls.add_method('GetDrbToAddModList', 
                    'std::list< ns3::LteRrcSap::DrbToAddMod >', 
                    [], 
                    is_const=True)
-    ## lte-rrc-header.h (module 'lte'): std::list<unsigned char, std::allocator<unsigned char> > ns3::RrcConnectionSetupHeader::GetDrbToReleaseList() const [member function]
+    ## lte-rrc-header.h (module 'lte'): std::list<unsigned char, std::allocator<unsigned char>> ns3::RrcConnectionSetupHeader::GetDrbToReleaseList() const [member function]
     cls.add_method('GetDrbToReleaseList', 
                    'std::list< unsigned char >', 
                    [], 
@@ -27273,7 +27481,7 @@
                    'uint8_t', 
                    [], 
                    is_const=True)
-    ## lte-rrc-header.h (module 'lte'): std::list<ns3::LteRrcSap::SrbToAddMod, std::allocator<ns3::LteRrcSap::SrbToAddMod> > ns3::RrcConnectionSetupHeader::GetSrbToAddModList() const [member function]
+    ## lte-rrc-header.h (module 'lte'): std::list<ns3::LteRrcSap::SrbToAddMod, std::allocator<ns3::LteRrcSap::SrbToAddMod>> ns3::RrcConnectionSetupHeader::GetSrbToAddModList() const [member function]
     cls.add_method('GetSrbToAddModList', 
                    'std::list< ns3::LteRrcSap::SrbToAddMod >', 
                    [], 
@@ -27352,6 +27560,11 @@
                    'uint16_t', 
                    [], 
                    is_const=True)
+    ## lte-enb-net-device.h (module 'lte'): std::vector<unsigned short, std::allocator<unsigned short>> ns3::LteEnbNetDevice::GetCellIds() const [member function]
+    cls.add_method('GetCellIds', 
+                   'std::vector< unsigned short >', 
+                   [], 
+                   is_const=True)
     ## lte-enb-net-device.h (module 'lte'): bool ns3::LteEnbNetDevice::HasCellId(uint16_t cellId) const [member function]
     cls.add_method('HasCellId', 
                    'bool', 
@@ -27411,11 +27624,11 @@
     cls.add_method('SetCsgIndication', 
                    'void', 
                    [param('bool', 'csgIndication')])
-    ## lte-enb-net-device.h (module 'lte'): void ns3::LteEnbNetDevice::SetCcMap(std::map<unsigned char, ns3::Ptr<ns3::ComponentCarrierBaseStation>, std::less<unsigned char>, std::allocator<std::pair<const unsigned char, ns3::Ptr<ns3::ComponentCarrierBaseStation> > > > ccm) [member function]
+    ## lte-enb-net-device.h (module 'lte'): void ns3::LteEnbNetDevice::SetCcMap(std::map<unsigned char, ns3::Ptr<ns3::ComponentCarrierBaseStation>, std::less<unsigned char>, std::allocator<std::pair<const unsigned char, ns3::Ptr<ns3::ComponentCarrierBaseStation>>>> ccm) [member function]
     cls.add_method('SetCcMap', 
                    'void', 
                    [param('std::map< unsigned char, ns3::Ptr< ns3::ComponentCarrierBaseStation > >', 'ccm')])
-    ## lte-enb-net-device.h (module 'lte'): std::map<unsigned char, ns3::Ptr<ns3::ComponentCarrierBaseStation>, std::less<unsigned char>, std::allocator<std::pair<const unsigned char, ns3::Ptr<ns3::ComponentCarrierBaseStation> > > > ns3::LteEnbNetDevice::GetCcMap() const [member function]
+    ## lte-enb-net-device.h (module 'lte'): std::map<unsigned char, ns3::Ptr<ns3::ComponentCarrierBaseStation>, std::less<unsigned char>, std::allocator<std::pair<const unsigned char, ns3::Ptr<ns3::ComponentCarrierBaseStation>>>> ns3::LteEnbNetDevice::GetCcMap() const [member function]
     cls.add_method('GetCcMap', 
                    'std::map< unsigned char, ns3::Ptr< ns3::ComponentCarrierBaseStation > >', 
                    [], 
@@ -27432,7 +27645,7 @@
     cls.add_constructor([param('ns3::Config::MatchContainer const &', 'arg0')])
     ## config.h (module 'core'): ns3::Config::MatchContainer::MatchContainer() [constructor]
     cls.add_constructor([])
-    ## config.h (module 'core'): ns3::Config::MatchContainer::MatchContainer(std::vector<ns3::Ptr<ns3::Object>, std::allocator<ns3::Ptr<ns3::Object> > > const & objects, std::vector<std::basic_string<char>, std::allocator<std::basic_string<char> > > const & contexts, std::string path) [constructor]
+    ## config.h (module 'core'): ns3::Config::MatchContainer::MatchContainer(std::vector<ns3::Ptr<ns3::Object>, std::allocator<ns3::Ptr<ns3::Object>>> const & objects, std::vector<std::basic_string<char>, std::allocator<std::basic_string<char>>> const & contexts, std::string path) [constructor]
     cls.add_constructor([param('std::vector< ns3::Ptr< ns3::Object > > const &', 'objects'), param('std::vector< std::string > const &', 'contexts'), param('std::string', 'path')])
     ## config.h (module 'core'): ns3::Config::MatchContainer::Iterator ns3::Config::MatchContainer::Begin() const [member function]
     cls.add_method('Begin', 
@@ -27496,6 +27709,21 @@
     cls.add_method('SetFailSafe', 
                    'bool', 
                    [param('std::string', 'name'), param('ns3::AttributeValue const &', 'value')])
+    ## config.h (module 'core'): ns3::Config::MatchContainer::Iterator ns3::Config::MatchContainer::begin() const [member function]
+    cls.add_method('begin', 
+                   'ns3::Config::MatchContainer::Iterator', 
+                   [], 
+                   is_const=True)
+    ## config.h (module 'core'): ns3::Config::MatchContainer::Iterator ns3::Config::MatchContainer::end() const [member function]
+    cls.add_method('end', 
+                   'ns3::Config::MatchContainer::Iterator', 
+                   [], 
+                   is_const=True)
+    ## config.h (module 'core'): std::size_t ns3::Config::MatchContainer::size() const [member function]
+    cls.add_method('size', 
+                   'std::size_t', 
+                   [], 
+                   is_const=True)
     return
 
 def register_Ns3HashImplementation_methods(root_module, cls):
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/CMakeLists.txt ns-3.36/src/lte/CMakeLists.txt
--- ns-3.35/src/lte/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/lte/CMakeLists.txt	2022-04-30 18:23:57.890733700 -0700
@@ -0,0 +1,363 @@
+set(emu_sources)
+set(emu_headers)
+set(emu_features)
+set(emu_libraries)
+if(${ENABLE_EMU})
+  set(emu_sources
+      helper/emu-epc-helper.cc
+  )
+  set(emu_headers
+      helper/emu-epc-helper.h
+  )
+  set(emu_features
+      EmuFdNetDevice
+  )
+  set(emu_libraries
+      ${libfd-net-device}
+  )
+endif()
+
+set(source_files
+    ${emu_sources}
+    helper/cc-helper.cc
+    helper/epc-helper.cc
+    helper/lte-global-pathloss-database.cc
+    helper/lte-helper.cc
+    helper/lte-hex-grid-enb-topology-helper.cc
+    helper/lte-stats-calculator.cc
+    helper/mac-stats-calculator.cc
+    helper/no-backhaul-epc-helper.cc
+    helper/phy-rx-stats-calculator.cc
+    helper/phy-stats-calculator.cc
+    helper/phy-tx-stats-calculator.cc
+    helper/point-to-point-epc-helper.cc
+    helper/radio-bearer-stats-calculator.cc
+    helper/radio-bearer-stats-connector.cc
+    helper/radio-environment-map-helper.cc
+    model/a2-a4-rsrq-handover-algorithm.cc
+    model/a3-rsrp-handover-algorithm.cc
+    model/component-carrier-enb.cc
+    model/component-carrier-ue.cc
+    model/component-carrier.cc
+    model/cqa-ff-mac-scheduler.cc
+    model/epc-enb-application.cc
+    model/epc-enb-s1-sap.cc
+    model/epc-gtpc-header.cc
+    model/epc-gtpu-header.cc
+    model/epc-mme-application.cc
+    model/epc-pgw-application.cc
+    model/epc-s11-sap.cc
+    model/epc-s1ap-sap.cc
+    model/epc-sgw-application.cc
+    model/epc-tft-classifier.cc
+    model/epc-tft.cc
+    model/epc-ue-nas.cc
+    model/epc-x2-header.cc
+    model/epc-x2-sap.cc
+    model/epc-x2.cc
+    model/eps-bearer-tag.cc
+    model/eps-bearer.cc
+    model/fdbet-ff-mac-scheduler.cc
+    model/fdmt-ff-mac-scheduler.cc
+    model/fdtbfq-ff-mac-scheduler.cc
+    model/ff-mac-common.cc
+    model/ff-mac-csched-sap.cc
+    model/ff-mac-sched-sap.cc
+    model/ff-mac-scheduler.cc
+    model/lte-amc.cc
+    model/lte-anr-sap.cc
+    model/lte-anr.cc
+    model/lte-as-sap.cc
+    model/lte-asn1-header.cc
+    model/lte-ccm-mac-sap.cc
+    model/lte-ccm-rrc-sap.cc
+    model/lte-chunk-processor.cc
+    model/lte-common.cc
+    model/lte-control-messages.cc
+    model/lte-enb-cmac-sap.cc
+    model/lte-enb-component-carrier-manager.cc
+    model/lte-enb-cphy-sap.cc
+    model/lte-enb-mac.cc
+    model/lte-enb-net-device.cc
+    model/lte-enb-phy-sap.cc
+    model/lte-enb-phy.cc
+    model/lte-enb-rrc.cc
+    model/lte-ffr-algorithm.cc
+    model/lte-ffr-distributed-algorithm.cc
+    model/lte-ffr-enhanced-algorithm.cc
+    model/lte-ffr-rrc-sap.cc
+    model/lte-ffr-sap.cc
+    model/lte-ffr-soft-algorithm.cc
+    model/lte-fr-hard-algorithm.cc
+    model/lte-fr-no-op-algorithm.cc
+    model/lte-fr-soft-algorithm.cc
+    model/lte-fr-strict-algorithm.cc
+    model/lte-handover-algorithm.cc
+    model/lte-handover-management-sap.cc
+    model/lte-harq-phy.cc
+    model/lte-interference.cc
+    model/lte-mac-sap.cc
+    model/lte-mi-error-model.cc
+    model/lte-net-device.cc
+    model/lte-pdcp-header.cc
+    model/lte-pdcp-sap.cc
+    model/lte-pdcp-tag.cc
+    model/lte-pdcp.cc
+    model/lte-phy-tag.cc
+    model/lte-phy.cc
+    model/lte-radio-bearer-info.cc
+    model/lte-radio-bearer-tag.cc
+    model/lte-rlc-am-header.cc
+    model/lte-rlc-am.cc
+    model/lte-rlc-header.cc
+    model/lte-rlc-sap.cc
+    model/lte-rlc-sdu-status-tag.cc
+    model/lte-rlc-sequence-number.cc
+    model/lte-rlc-tag.cc
+    model/lte-rlc-tm.cc
+    model/lte-rlc-um.cc
+    model/lte-rlc.cc
+    model/lte-rrc-header.cc
+    model/lte-rrc-protocol-ideal.cc
+    model/lte-rrc-protocol-real.cc
+    model/lte-rrc-sap.cc
+    model/lte-spectrum-phy.cc
+    model/lte-spectrum-signal-parameters.cc
+    model/lte-spectrum-value-helper.cc
+    model/lte-ue-ccm-rrc-sap.cc
+    model/lte-ue-cmac-sap.cc
+    model/lte-ue-component-carrier-manager.cc
+    model/lte-ue-cphy-sap.cc
+    model/lte-ue-mac.cc
+    model/lte-ue-net-device.cc
+    model/lte-ue-phy-sap.cc
+    model/lte-ue-phy.cc
+    model/lte-ue-power-control.cc
+    model/lte-ue-rrc.cc
+    model/lte-vendor-specific-parameters.cc
+    model/no-op-component-carrier-manager.cc
+    model/no-op-handover-algorithm.cc
+    model/pf-ff-mac-scheduler.cc
+    model/pss-ff-mac-scheduler.cc
+    model/rem-spectrum-phy.cc
+    model/rr-ff-mac-scheduler.cc
+    model/simple-ue-component-carrier-manager.cc
+    model/tdbet-ff-mac-scheduler.cc
+    model/tdmt-ff-mac-scheduler.cc
+    model/tdtbfq-ff-mac-scheduler.cc
+    model/tta-ff-mac-scheduler.cc
+)
+
+set(header_files
+    ${emu_headers}
+    helper/cc-helper.h
+    helper/epc-helper.h
+    helper/lte-global-pathloss-database.h
+    helper/lte-helper.h
+    helper/lte-hex-grid-enb-topology-helper.h
+    helper/lte-stats-calculator.h
+    helper/mac-stats-calculator.h
+    helper/no-backhaul-epc-helper.h
+    helper/phy-rx-stats-calculator.h
+    helper/phy-stats-calculator.h
+    helper/phy-tx-stats-calculator.h
+    helper/point-to-point-epc-helper.h
+    helper/radio-bearer-stats-calculator.h
+    helper/radio-bearer-stats-connector.h
+    helper/radio-environment-map-helper.h
+    model/a2-a4-rsrq-handover-algorithm.h
+    model/a3-rsrp-handover-algorithm.h
+    model/component-carrier-enb.h
+    model/component-carrier-ue.h
+    model/component-carrier.h
+    model/cqa-ff-mac-scheduler.h
+    model/epc-enb-application.h
+    model/epc-enb-s1-sap.h
+    model/epc-gtpc-header.h
+    model/epc-gtpu-header.h
+    model/epc-mme-application.h
+    model/epc-pgw-application.h
+    model/epc-s11-sap.h
+    model/epc-s1ap-sap.h
+    model/epc-sgw-application.h
+    model/epc-tft-classifier.h
+    model/epc-tft.h
+    model/epc-ue-nas.h
+    model/epc-x2-header.h
+    model/epc-x2-sap.h
+    model/epc-x2.h
+    model/eps-bearer-tag.h
+    model/eps-bearer.h
+    model/fdbet-ff-mac-scheduler.h
+    model/fdmt-ff-mac-scheduler.h
+    model/fdtbfq-ff-mac-scheduler.h
+    model/ff-mac-common.h
+    model/ff-mac-csched-sap.h
+    model/ff-mac-sched-sap.h
+    model/ff-mac-scheduler.h
+    model/lte-amc.h
+    model/lte-anr-sap.h
+    model/lte-anr.h
+    model/lte-as-sap.h
+    model/lte-asn1-header.h
+    model/lte-ccm-mac-sap.h
+    model/lte-ccm-rrc-sap.h
+    model/lte-chunk-processor.h
+    model/lte-common.h
+    model/lte-control-messages.h
+    model/lte-enb-cmac-sap.h
+    model/lte-enb-component-carrier-manager.h
+    model/lte-enb-cphy-sap.h
+    model/lte-enb-mac.h
+    model/lte-enb-net-device.h
+    model/lte-enb-phy-sap.h
+    model/lte-enb-phy.h
+    model/lte-enb-rrc.h
+    model/lte-ffr-algorithm.h
+    model/lte-ffr-distributed-algorithm.h
+    model/lte-ffr-enhanced-algorithm.h
+    model/lte-ffr-rrc-sap.h
+    model/lte-ffr-sap.h
+    model/lte-ffr-soft-algorithm.h
+    model/lte-fr-hard-algorithm.h
+    model/lte-fr-no-op-algorithm.h
+    model/lte-fr-soft-algorithm.h
+    model/lte-fr-strict-algorithm.h
+    model/lte-handover-algorithm.h
+    model/lte-handover-management-sap.h
+    model/lte-harq-phy.h
+    model/lte-interference.h
+    model/lte-mac-sap.h
+    model/lte-mi-error-model.h
+    model/lte-net-device.h
+    model/lte-pdcp-header.h
+    model/lte-pdcp-sap.h
+    model/lte-pdcp-tag.h
+    model/lte-pdcp.h
+    model/lte-phy-tag.h
+    model/lte-phy.h
+    model/lte-radio-bearer-info.h
+    model/lte-radio-bearer-tag.h
+    model/lte-rlc-am-header.h
+    model/lte-rlc-am.h
+    model/lte-rlc-header.h
+    model/lte-rlc-sap.h
+    model/lte-rlc-sdu-status-tag.h
+    model/lte-rlc-sequence-number.h
+    model/lte-rlc-tag.h
+    model/lte-rlc-tm.h
+    model/lte-rlc-um.h
+    model/lte-rlc.h
+    model/lte-rrc-header.h
+    model/lte-rrc-protocol-ideal.h
+    model/lte-rrc-protocol-real.h
+    model/lte-rrc-sap.h
+    model/lte-spectrum-phy.h
+    model/lte-spectrum-signal-parameters.h
+    model/lte-spectrum-value-helper.h
+    model/lte-ue-ccm-rrc-sap.h
+    model/lte-ue-cmac-sap.h
+    model/lte-ue-component-carrier-manager.h
+    model/lte-ue-cphy-sap.h
+    model/lte-ue-mac.h
+    model/lte-ue-net-device.h
+    model/lte-ue-phy-sap.h
+    model/lte-ue-phy.h
+    model/lte-ue-power-control.h
+    model/lte-ue-rrc.h
+    model/lte-vendor-specific-parameters.h
+    model/no-op-component-carrier-manager.h
+    model/no-op-handover-algorithm.h
+    model/pf-ff-mac-scheduler.h
+    model/pss-ff-mac-scheduler.h
+    model/rem-spectrum-phy.h
+    model/rr-ff-mac-scheduler.h
+    model/simple-ue-component-carrier-manager.h
+    model/tdbet-ff-mac-scheduler.h
+    model/tdmt-ff-mac-scheduler.h
+    model/tdtbfq-ff-mac-scheduler.h
+    model/tta-ff-mac-scheduler.h
+)
+
+set(test_sources
+    test/epc-test-gtpu.cc
+    test/epc-test-s1u-downlink.cc
+    test/epc-test-s1u-uplink.cc
+    test/lte-ffr-simple.cc
+    test/lte-simple-helper.cc
+    test/lte-simple-net-device.cc
+    test/lte-simple-spectrum-phy.cc
+    test/lte-test-aggregation-throughput-scale.cc
+    test/lte-test-carrier-aggregation-configuration.cc
+    test/lte-test-carrier-aggregation.cc
+    test/lte-test-cell-selection.cc
+    test/lte-test-cqa-ff-mac-scheduler.cc
+    test/lte-test-cqi-generation.cc
+    test/lte-test-deactivate-bearer.cc
+    test/lte-test-downlink-power-control.cc
+    test/lte-test-downlink-sinr.cc
+    test/lte-test-earfcn.cc
+    test/lte-test-entities.cc
+    test/lte-test-fdbet-ff-mac-scheduler.cc
+    test/lte-test-fdmt-ff-mac-scheduler.cc
+    test/lte-test-fdtbfq-ff-mac-scheduler.cc
+    test/lte-test-frequency-reuse.cc
+    test/lte-test-harq.cc
+    test/lte-test-interference-fr.cc
+    test/lte-test-interference.cc
+    test/lte-test-ipv6-routing.cc
+    test/lte-test-link-adaptation.cc
+    test/lte-test-mimo.cc
+    test/lte-test-pathloss-model.cc
+    test/lte-test-pf-ff-mac-scheduler.cc
+    test/lte-test-phy-error-model.cc
+    test/lte-test-primary-cell-change.cc
+    test/lte-test-pss-ff-mac-scheduler.cc
+    test/lte-test-radio-link-failure.cc
+    test/lte-test-rlc-am-e2e.cc
+    test/lte-test-rlc-am-transmitter.cc
+    test/lte-test-rlc-um-e2e.cc
+    test/lte-test-rlc-um-transmitter.cc
+    test/lte-test-rr-ff-mac-scheduler.cc
+    test/lte-test-secondary-cell-handover.cc
+    test/lte-test-secondary-cell-selection.cc
+    test/lte-test-spectrum-value-helper.cc
+    test/lte-test-tdbet-ff-mac-scheduler.cc
+    test/lte-test-tdmt-ff-mac-scheduler.cc
+    test/lte-test-tdtbfq-ff-mac-scheduler.cc
+    test/lte-test-tta-ff-mac-scheduler.cc
+    test/lte-test-ue-measurements.cc
+    test/lte-test-ue-phy.cc
+    test/lte-test-uplink-power-control.cc
+    test/lte-test-uplink-sinr.cc
+    test/test-asn1-encoding.cc
+    test/test-epc-tft-classifier.cc
+    test/test-lte-antenna.cc
+    test/test-lte-epc-e2e-data.cc
+    test/test-lte-handover-delay.cc
+    test/test-lte-handover-target.cc
+    test/test-lte-rlc-header.cc
+    test/test-lte-rrc.cc
+    test/test-lte-x2-handover-measures.cc
+    test/test-lte-x2-handover.cc
+)
+
+build_lib(
+  LIBNAME lte
+  SOURCE_FILES ${source_files}
+  HEADER_FILES ${header_files}
+  LIBRARIES_TO_LINK
+    ${emu_libraries}
+    ${libcore}
+    ${libnetwork}
+    ${libspectrum}
+    ${libstats}
+    ${libbuildings}
+    ${libvirtual-net-device}
+    ${libpoint-to-point}
+    ${libapplications}
+    ${libinternet}
+    ${libcsma}
+  TEST_SOURCES ${test_sources}
+  MODULE_ENABLED_FEATURES ${emu_features}
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/doc/source/conf.py ns-3.36/src/lte/doc/source/conf.py
--- ns-3.35/src/lte/doc/source/conf.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/doc/source/conf.py	2022-04-30 18:23:57.894733700 -0700
@@ -25,7 +25,7 @@
 
 # Add any Sphinx extension module names here, as strings. They can be extensions
 # coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
-extensions = ['sphinx.ext.pngmath']
+extensions = ['sphinx.ext.imgmath']
 
 # Add any paths that contain templates here, relative to this directory.
 templates_path = ['_templates']
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/doc/source/lte-design.rst ns-3.36/src/lte/doc/source/lte-design.rst
--- ns-3.35/src/lte/doc/source/lte-design.rst	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/doc/source/lte-design.rst	2022-04-30 18:23:57.918733800 -0700
@@ -4362,7 +4362,7 @@
    CA impact on different layers of LTE protocol stack (from 3gpp.org)
 
 Impact on RRC layer
--------------------------------
+-------------------
 
 The main impacts on the RRC layer are related to secondary carrier configuration and 
 measurements reporting. To enable these features we have enhanced the already existing 
@@ -4414,12 +4414,17 @@
 
    A schematic overview of the secondary carrier enabling procedure
 
-Impact on PCDCP layer
--------------------------------
+Handover is possible between different component carriers on the same
+eNB (i.e., intra-eNB handover from one frequency to another) and between
+carriers on different eNB (i.e., inter-eNB).  One constraint for inter-eNB
+handovers is that both eNB must have the same number of component carriers.
+
+Impact on PDCP layer
+--------------------
 There is no impact on PDCP layer.
 
 Impact on RLC layer
--------------------------------
+-------------------
 The impact on the RLC layer is relatively small. There is some impact on configuration of 
 the buffer and the usage of SAP interfaces between RLC and MAC. Since the capacity of the 
 lower layers increases with the carrier aggregation it is necessary to accordingly adjust 
@@ -4434,7 +4439,7 @@
 its own functionalities.
 
 Impact on MAC layer
--------------------------------
+-------------------
 
 The impact on the MAC layer depends on the CA scheduling scheme in use. Two different 
 scheduling schemes are proposed in R10 and are shown in 
@@ -4463,7 +4468,7 @@
 addition of component carrier information in message exchange between layers. 
 
 Impact on PHY layer
--------------------------------
+-------------------
 
 The impact on PHY layer is minor. There is an instance of PHY layer per each component 
 carrier and the SAP interface functions remain unchanged. As shown 
@@ -4480,7 +4485,7 @@
 
 
 Code Structure Design
-+++++++++++++++++++++++++++++++
++++++++++++++++++++++
 
 This section briefly introduces the software design and implementation of the 
 carrier aggregation functionality.
@@ -4600,7 +4605,7 @@
    Sequence Diagram of Data Radio Bearer Setup
  
 CA impact on data plane of UE
-------------------------------
+-----------------------------
 Figure :ref:`fig-ca-ue-data-plane` shows the relation between the different classes 
 related to the UE data plane. The UE data plane architecture is similar to the eNB data 
 plane implementation. The ``LteUeComponentCarrierManager`` is responsible to (re)map 
@@ -4636,7 +4641,7 @@
    
 
 CA impact on control plane of UE
----------------------------------
+--------------------------------
 Figure :ref:`fig-ca-ue-ctrl-plane` shows the relation between the different classes 
 associated to the UE control plane. The control plane implementation at the UE is basically 
 the same as the eNB control plane implementation. Each component carrier control SAP 
@@ -4657,7 +4662,7 @@
 layer parameters, such as uplink and downlink,bandwidth and EARFCN of each carrier.
 
 CCM RRC MAC interfaces
------------------------
+----------------------
 
 The Component carrier manager (CCM) is also developed by using the SAP interface design. 
 The following SAP interfaces are implemented for CCM and MAC: 
@@ -4674,7 +4679,7 @@
  to split the traffic and whether to use the secondary carriers.
 
 CCM RRC SAP interfaces
-----------------------------------
+----------------------
 
 The following SAP interfaces are implemented for CCM and RRC: 
 
@@ -4690,7 +4695,7 @@
 signalling bearer, etc.
 
 Component carrier managers
------------------------------------------
+--------------------------
 Currently, there are two component carrier manager implementations available. The first one 
 is the ``NoOpComponentCarrierManager``, which  is the default CCM choice. When this CCM is 
 used the carrier aggregation feature is disabled. This CCM forwards all traffic, the uplink 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/doc/source/lte-profiling.rst ns-3.36/src/lte/doc/source/lte-profiling.rst
--- ns-3.35/src/lte/doc/source/lte-profiling.rst	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/doc/source/lte-profiling.rst	2022-04-30 18:23:57.918733800 -0700
@@ -88,9 +88,9 @@
 
 All timing tests had been run in a Intel Pentium IV 3.00 GHz machine with 512 Mb of RAM memory running Fedora Core 10 with a 2.6.27.41-170.2.117 kernel, storing the traces directly to the hard disk.
 
-Also, as a reference configuration, the build has been configured static and optimized. The exact ``waf`` command issued is:
+Also, as a reference configuration, the build has been configured static and optimized. The exact ``ns3`` command issued is:
 
-``CXXFLAGS="-O3 -w" ./waf -d optimized configure --enable-static --enable-examples --enable-modules=lte``
+``CXXFLAGS="-O3 -w" ./ns3 configure -d optimized --enable-static --enable-examples --enable-modules=lte``
 
 
 Results
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/doc/source/lte-testing.rst ns-3.36/src/lte/doc/source/lte-testing.rst
--- ns-3.35/src/lte/doc/source/lte-testing.rst	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/doc/source/lte-testing.rst	2022-04-30 18:23:57.918733800 -0700
@@ -13,7 +13,7 @@
 To test and validate the ns-3 LTE module, several test suites are provided which are integrated with the ns-3 test framework.
 To run them, you need to have configured the build of the simulator in this way::
 
-    $ ./waf configure --enable-tests --enable-modules=lte --enable-examples
+    $ ./ns3 configure --enable-tests --enable-modules=lte --enable-examples
     $ ./test.py
 
 The above will run not only the test suites belonging to the LTE module, but also those belonging to all the other ns-3 modules on which the LTE module depends. See the ns-3 manual for generic information on the testing framework.
@@ -1181,6 +1181,23 @@
 The test uses the default Friis path loss model and without any channel fading
 model.
 
+Secondary cell selection
+------------------------
+
+The unit test ``lte-secondary-cell-selection``` tests that a UE can attach to
+any component carrier (not just the 0-th one) during initial cell selection.
+
+Handover with multiple component carriers
+-----------------------------------------
+The unit test suite ``lte-primary-cell-change`` tests a number of handover
+cases between different component carriers, for both the Ideal RRC and the
+Real RRC.  The following handover cases are tested:
+
+* (inter-eNB) eNB to eNB with one component carrier
+* (inter-eNB) handover between the first carrier of two eNBs
+* (inter-eNB) handover between the second carrier of one eNB to the first carrier of another eNB
+* (inter-eNB) handover between the second carrier of one eNB to the second carrier of another eNB
+* (intra-eNB) three handover cases between component carriers of the same eNB
 
 GTP-U protocol
 --------------
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/doc/source/lte-user.rst ns-3.36/src/lte/doc/source/lte-user.rst
--- ns-3.35/src/lte/doc/source/lte-user.rst	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/doc/source/lte-user.rst	2022-04-30 18:23:57.918733800 -0700
@@ -178,17 +178,17 @@
 ``src/lte/examples/lte-sim-with-input``, you can now pass these
 settings to the simulation program in the following way::
 
-   ./waf --command-template="%s --ns3::ConfigStore::Filename=input-defaults.txt
+   ./ns3 run src/lte/examples/lte-sim-with-input
+   --command-template="%s --ns3::ConfigStore::Filename=input-defaults.txt
    --ns3::ConfigStore::Mode=Load --ns3::ConfigStore::FileFormat=RawText"
-   --run src/lte/examples/lte-sim-with-input
 
 
 Furthermore, you can generate a template input file with the following
 command::
 
-   ./waf --command-template="%s --ns3::ConfigStore::Filename=input-defaults.txt
+   ./ns3 run src/lte/examples/lte-sim-with-input
+   --command-template="%s --ns3::ConfigStore::Filename=input-defaults.txt
    --ns3::ConfigStore::Mode=Save --ns3::ConfigStore::FileFormat=RawText"
-   --run src/lte/examples/lte-sim-with-input
 
 note that the above will put in the file ``input-defaults.txt`` *all*
 the default values that are registered in your particular build of the
@@ -258,16 +258,16 @@
 description and default value passing ``--PrintAttributes=`` to a simulation
 program, like this::
 
-     ./waf --run lena-simple --command-template="%s --PrintAttributes=ns3::LteHelper"
+     ./ns3 run lena-simple --command-template="%s --PrintAttributes=ns3::LteHelper"
 
 
 You can try also with other LTE and EPC objects, like this::
    
-     ./waf --run lena-simple --command-template="%s --PrintAttributes=ns3::LteEnbNetDevice"
-     ./waf --run lena-simple --command-template="%s --PrintAttributes=ns3::LteEnbMac"
-     ./waf --run lena-simple --command-template="%s --PrintAttributes=ns3::LteEnbPhy"
-     ./waf --run lena-simple --command-template="%s --PrintAttributes=ns3::LteUePhy"
-     ./waf --run lena-simple --command-template="%s --PrintAttributes=ns3::PointToPointEpcHelper"
+     ./ns3 run lena-simple --command-template="%s --PrintAttributes=ns3::LteEnbNetDevice"
+     ./ns3 run lena-simple --command-template="%s --PrintAttributes=ns3::LteEnbMac"
+     ./ns3 run lena-simple --command-template="%s --PrintAttributes=ns3::LteEnbPhy"
+     ./ns3 run lena-simple --command-template="%s --PrintAttributes=ns3::LteUePhy"
+     ./ns3 run lena-simple --command-template="%s --PrintAttributes=ns3::PointToPointEpcHelper"
  
 
 
@@ -961,10 +961,10 @@
 First of all we build ns-3 appropriately::
 
   # configure
-  ./waf configure --enable-sudo --enable-modules=lte,fd-net-device --enable-examples 
+  ./ns3 configure --enable-sudo --enable-modules=lte,fd-net-device --enable-examples
 
   # build
-  ./waf
+  ./ns3
 
 
 Then we setup two virtual ethernet interfaces, and start wireshark to look at the traffic going through::
@@ -990,7 +990,7 @@
 
 We can now run the example program with the simulated clock::
 
-  ./waf --run lena-simple-epc-emu --command="%s --ns3::EmuEpcHelper::sgwDeviceName=veth0
+  ./ns3 run lena-simple-epc-emu --command="%s --ns3::EmuEpcHelper::sgwDeviceName=veth0
   --ns3::EmuEpcHelper::enbDeviceName=veth1"
 
 
@@ -999,13 +999,13 @@
 
 The default setting of the example program is 1 eNB and 1UE. You can change this via command line parameters, e.g.::
 
-  ./waf --run lena-simple-epc-emu --command="%s --ns3::EmuEpcHelper::sgwDeviceName=veth0
+  ./ns3 run lena-simple-epc-emu --command="%s --ns3::EmuEpcHelper::sgwDeviceName=veth0
   --ns3::EmuEpcHelper::enbDeviceName=veth1 --nEnbs=2 --nUesPerEnb=2"
 
 
 To get a list of the available parameters::
 
-  ./waf --run lena-simple-epc-emu --command="%s --PrintHelp"
+  ./ns3 run lena-simple-epc-emu --command="%s --PrintHelp"
 
 
 
@@ -1016,13 +1016,13 @@
 So you need a decent hardware and the optimized build with statically  
 linked modules::
 
-  ./waf configure -d optimized --enable-static --enable-modules=lte --enable-examples
+  ./ns3 configure -d optimized --enable-static --enable-modules=lte --enable-examples
   --enable-sudo
 
 
 Then run the example program like this::
 
-  ./waf --run lena-simple-epc-emu --command="%s --ns3::EmuEpcHelper::sgwDeviceName=veth0
+  ./ns3 run lena-simple-epc-emu --command="%s --ns3::EmuEpcHelper::sgwDeviceName=veth0
   --ns3::EmuEpcHelper::enbDeviceName=veth1
   --SimulatorImplementationType=ns3::RealtimeSimulatorImpl
   --ns3::RealtimeSimulatorImpl::SynchronizationMode=HardLimit"
@@ -1384,7 +1384,7 @@
 attribute ``LteEnbRrc::AdmitHandoverRequest`` to `false`. As an example, you can
 run the ``lena-x2-handover`` program and setting the attribute in this way::
 
-   NS_LOG=EpcX2:LteEnbRrc ./waf --run lena-x2-handover --command="%s --ns3::LteEnbRrc::AdmitHandoverRequest=false"
+   NS_LOG=EpcX2:LteEnbRrc ./ns3 run lena-x2-handover --command="%s --ns3::LteEnbRrc::AdmitHandoverRequest=false"
 
 After the above three requirements are fulfilled, the handover procedure can be
 triggered manually or automatically. Each will be presented in the following
@@ -1621,13 +1621,13 @@
 illustrates how the all above instructions can be integrated in a
 simulation program. You can run the program like this::
 
-   ./waf --run lena-x2-handover
+   ./ns3 run lena-x2-handover
 
 and it will output the messages printed by the custom handover trace
 hooks. In order additionally visualize some meaningful logging
 information, you can run the program like this::
 
-    NS_LOG=LteEnbRrc:LteUeRrc:EpcX2 ./waf --run lena-x2-handover
+    NS_LOG=LteEnbRrc:LteUeRrc:EpcX2 ./ns3 run lena-x2-handover
 
 
 Frequency Reuse Algorithms
@@ -2051,7 +2051,7 @@
    changing the corresponding global variables. To get a list of all these
    global variables, you can run this command::
 
-     ./waf --run lena-dual-stripe --command-template="%s --PrintGlobals"
+     ./ns3 run lena-dual-stripe --command-template="%s --PrintGlobals"
      
    The following subsection presents an example of running a simulation
    campaign using this example program.
@@ -2184,11 +2184,11 @@
 
 |ns3| provides many ways for passing configuration values into a simulation. In
 this example, we will use the command line arguments. It is basically done by
-appending the parameters and their values to the ``waf`` call when starting each
-individual simulation. So the ``waf`` calls for invoking our 3 simulations would
+appending the parameters and their values to the ``ns3`` call when starting each
+individual simulation. So the ``ns3`` calls for invoking our 3 simulations would
 look as below::
 
-   $ ./waf --run="lena-dual-stripe
+   $ ./ns3 run="lena-dual-stripe
      --simTime=50 --nBlocks=0 --nMacroEnbSites=7 --nMacroEnbSitesX=2
      --epc=1 --useUdp=0 --outdoorUeMinSpeed=16.6667 --outdoorUeMaxSpeed=16.6667
      --ns3::LteHelper::HandoverAlgorithm=ns3::NoOpHandoverAlgorithm
@@ -2198,7 +2198,7 @@
      --ns3::PhyStatsCalculator::UlSinrFilename=no-op-UlSinrStats.txt
      --RngRun=1" > no-op.txt
 
-   $ ./waf --run="lena-dual-stripe
+   $ ./ns3 run="lena-dual-stripe
      --simTime=50 --nBlocks=0 --nMacroEnbSites=7 --nMacroEnbSitesX=2
      --epc=1 --useUdp=0 --outdoorUeMinSpeed=16.6667 --outdoorUeMaxSpeed=16.6667
      --ns3::LteHelper::HandoverAlgorithm=ns3::A3RsrpHandoverAlgorithm
@@ -2208,7 +2208,7 @@
      --ns3::PhyStatsCalculator::UlSinrFilename=a3-rsrp-UlSinrStats.txt
      --RngRun=1" > a3-rsrp.txt
 
-   $ ./waf --run="lena-dual-stripe
+   $ ./ns3 run="lena-dual-stripe
      --simTime=50 --nBlocks=0 --nMacroEnbSites=7 --nMacroEnbSitesX=2
      --epc=1 --useUdp=0 --outdoorUeMinSpeed=16.6667 --outdoorUeMaxSpeed=16.6667
      --ns3::LteHelper::HandoverAlgorithm=ns3::A2A4RsrqHandoverAlgorithm
@@ -2365,7 +2365,7 @@
 FR algorithm by overriding the default attribute ``ns3::LteHelper::FfrAlgorithm``.
 Example command to run ``lena-frequency-reuse`` with Soft FR algorithm is presented below::
 
-   $ ./waf --run "lena-frequency-reuse --ns3::LteHelper::FfrAlgorithm=ns3::LteFrSoftAlgorithm"
+   $ ./ns3 run "lena-frequency-reuse --ns3::LteHelper::FfrAlgorithm=ns3::LteFrSoftAlgorithm"
 
 In these examples functionality to generate REM and spectrum analyzer trace was added. 
 User can enable generation of it by setting ``generateRem`` and ``generateSpectrumTrace``
@@ -2374,7 +2374,7 @@
 Command to generate REM for RB 1 in data channel from ``lena-frequency-reuse`` scenario 
 with Soft FR algorithm is presented below::
 
-   $ ./waf --run "lena-frequency-reuse --ns3::LteHelper::FfrAlgorithm=ns3::LteFrSoftAlgorithm
+   $ ./ns3 run "lena-frequency-reuse --ns3::LteHelper::FfrAlgorithm=ns3::LteFrSoftAlgorithm
      --generateRem=true --remRbId=1"
 
 Radio Environment Map for Soft FR is presented in Figure :ref:`fig-lte-soft-fr-1-rem`.
@@ -2392,7 +2392,7 @@
 with Soft FFR algorithm is presented below (Spectrum Analyzer position needs to be configured 
 inside script)::
 
-   $ ./waf --run "lena-frequency-reuse --ns3::LteHelper::FfrAlgorithm=ns3::LteFfrSoftAlgorithm
+   $ ./ns3 run "lena-frequency-reuse --ns3::LteHelper::FfrAlgorithm=ns3::LteFfrSoftAlgorithm
      --generateSpectrumTrace=true"
 
 Example spectrum analyzer trace is presented in figure :ref:`fig-lte-soft-ffr-2-spectrum-trace`.
@@ -2415,7 +2415,7 @@
 User needs to specify FR algorithm by overriding the default attribute ``ns3::LteHelper::FfrAlgorithm``.
 Example command to run ``lena-dual-stripe`` with Hard FR algorithm is presented below::
 
-   $ ./waf --run="lena-dual-stripe
+   $ ./ns3 run="lena-dual-stripe
      --simTime=50 --nBlocks=0 --nMacroEnbSites=7 --nMacroEnbSitesX=2
      --epc=1 --useUdp=0 --outdoorUeMinSpeed=16.6667 --outdoorUeMaxSpeed=16.6667
      --ns3::LteHelper::HandoverAlgorithm=ns3::NoOpHandoverAlgorithm
@@ -2429,7 +2429,7 @@
 Example command to generate REM for RB 1 in data channel from ``lena-dual-stripe`` scenario 
 with Hard FR algorithm is presented below::
 
-   $ ./waf --run="lena-dual-stripe
+   $ ./ns3 run="lena-dual-stripe
      --simTime=50 --nBlocks=0 --nMacroEnbSites=7 --nMacroEnbSitesX=2
      --epc=0 --useUdp=0 --outdoorUeMinSpeed=16.6667 --outdoorUeMaxSpeed=16.6667
      --ns3::LteHelper::HandoverAlgorithm=ns3::NoOpHandoverAlgorithm
@@ -2488,7 +2488,7 @@
 The test suite ``lte-carrier-aggregation`` is also a test program that can be used as an example as it can be run in a mode to write results 
 to output files by setting the ``s_writeResults`` boolean static variable to true. The test can be run by using a `test-runner`:
 
-   ./waf --run 'test-runner --suite=lte-carrier-aggregation'
+   ./ns3 run 'test-runner --suite=lte-carrier-aggregation'
 
 To plot the test results, a file has to be created in the root folder of the ns-3 repository, and added to it with the following content :
 
@@ -2563,14 +2563,14 @@
 A" with *Ideal* and *Real* RRC protocol a user can use the following commands::
 
   Ideal RRC:
-  ./waf --run "lena-radio-link-failure
+  ./ns3 run "lena-radio-link-failure
   --numberOfEnbs=1 --useIdealRrc=1
   --interSiteDistance=1200 --n310=1 --n311=1
   --t310=1 --enableCtrlErrorModel=1
   --enableDataErrorModel=1 --simTime=25"
 
   Real RRC:
-  ./waf --run "lena-radio-link-failure
+  ./ns3 run "lena-radio-link-failure
   --numberOfEnbs=1 --useIdealRrc=0
   --interSiteDistance=1200 --n310=1 --n311=1
   --t310=1 --enableCtrlErrorModel=1
@@ -2632,14 +2632,14 @@
 following commands can be used::
 
   Ideal RRC:
-  ./waf --run "lena-radio-link-failure
+  ./ns3 run "lena-radio-link-failure
   --numberOfEnbs=2 --useIdealRrc=1
   --interSiteDistance=1200 --n310=1 --n311=1
   --t310=1 --enableCtrlErrorModel=1
   --enableDataErrorModel=1 --simTime=25"
 
   Real RRC:
-  ./waf --run "lena-radio-link-failure
+  ./ns3 run "lena-radio-link-failure
   --numberOfEnbs=2 --useIdealRrc=0
   --interSiteDistance=1200 --n310=1 --n311=1
   --t310=1 --enableCtrlErrorModel=1
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/examples/CMakeLists.txt ns-3.36/src/lte/examples/CMakeLists.txt
--- ns-3.35/src/lte/examples/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/lte/examples/CMakeLists.txt	2022-04-30 18:23:57.918733800 -0700
@@ -0,0 +1,45 @@
+set(base_examples
+    lena-cc-helper
+    lena-cqi-threshold
+    lena-deactivate-bearer
+    lena-distributed-ffr
+    lena-dual-stripe
+    lena-fading
+    lena-frequency-reuse
+    lena-intercell-interference
+    lena-ipv6-addr-conf
+    lena-ipv6-ue-rh
+    lena-ipv6-ue-ue
+    lena-pathloss-traces
+    lena-profiling
+    lena-radio-link-failure
+    lena-rem
+    lena-rem-sector-antenna
+    lena-rlc-traces
+    lena-simple
+    lena-simple-epc
+    lena-simple-epc-backhaul
+    lena-uplink-power-control
+    lena-x2-handover
+    lena-x2-handover-measures
+)
+
+foreach(
+  example
+  ${base_examples}
+)
+  build_lib_example(
+    NAME ${example}
+    SOURCE_FILES ${example}.cc
+    LIBRARIES_TO_LINK ${liblte}
+  )
+endforeach()
+
+if(${ENABLE_EMU})
+  build_lib_example(
+    NAME lena-simple-epc-emu
+    SOURCE_FILES lena-simple-epc-emu.cc
+    LIBRARIES_TO_LINK ${liblte}
+                      ${fd-net-device}
+  )
+endif()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/examples/lena-cqi-threshold.cc ns-3.36/src/lte/examples/lena-cqi-threshold.cc
--- ns-3.35/src/lte/examples/lena-cqi-threshold.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/examples/lena-cqi-threshold.cc	2022-04-30 18:23:57.918733800 -0700
@@ -67,10 +67,10 @@
   cmd.Parse (argc, argv);
 	
   // to save a template default attribute file run it like this:
-  // ./waf --command-template="%s --ns3::ConfigStore::Filename=input-defaults.txt --ns3::ConfigStore::Mode=Save --ns3::ConfigStore::FileFormat=RawText" --run src/lte/examples/lena-first-sim
+  // ./ns3 run src/lte/examples/lena-first-sim --command-template="%s --ns3::ConfigStore::Filename=input-defaults.txt --ns3::ConfigStore::Mode=Save --ns3::ConfigStore::FileFormat=RawText"
   //
   // to load a previously created default attribute file
-  // ./waf --command-template="%s --ns3::ConfigStore::Filename=input-defaults.txt --ns3::ConfigStore::Mode=Load --ns3::ConfigStore::FileFormat=RawText" --run src/lte/examples/lena-first-sim
+  // ./ns3 run src/lte/examples/lena-first-sim --command-template="%s --ns3::ConfigStore::Filename=input-defaults.txt --ns3::ConfigStore::Mode=Load --ns3::ConfigStore::FileFormat=RawText"
 
   ConfigStore inputConfig;
   inputConfig.ConfigureDefaults ();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/examples/lena-fading.cc ns-3.36/src/lte/examples/lena-fading.cc
--- ns-3.35/src/lte/examples/lena-fading.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/examples/lena-fading.cc	2022-04-30 18:23:57.922733800 -0700
@@ -37,10 +37,10 @@
   cmd.Parse (argc, argv);
 	
   // to save a template default attribute file run it like this:
-  // ./waf --command-template="%s --ns3::ConfigStore::Filename=input-defaults.txt --ns3::ConfigStore::Mode=Save --ns3::ConfigStore::FileFormat=RawText" --run src/lte/examples/lena-first-sim
+  // ./ns3 run src/lte/examples/lena-first-sim --command-template="%s --ns3::ConfigStore::Filename=input-defaults.txt --ns3::ConfigStore::Mode=Save --ns3::ConfigStore::FileFormat=RawText"
   //
   // to load a previously created default attribute file
-  // ./waf --command-template="%s --ns3::ConfigStore::Filename=input-defaults.txt --ns3::ConfigStore::Mode=Load --ns3::ConfigStore::FileFormat=RawText" --run src/lte/examples/lena-first-sim
+  // ./ns3 run src/lte/examples/lena-first-sim --command-template="%s --ns3::ConfigStore::Filename=input-defaults.txt --ns3::ConfigStore::Mode=Load --ns3::ConfigStore::FileFormat=RawText"
 
   //ConfigStore inputConfig;
   //inputConfig.ConfigureDefaults ();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/examples/lena-radio-link-failure.cc ns-3.36/src/lte/examples/lena-radio-link-failure.cc
--- ns-3.35/src/lte/examples/lena-radio-link-failure.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/examples/lena-radio-link-failure.cc	2022-04-30 18:23:57.922733800 -0700
@@ -266,7 +266,7 @@
  *
  * The example can be run as follows:
  *
- * ./waf --run "lena-radio-link-failure --numberOfEnbs=1 --simTime=25"
+ * ./ns3 run "lena-radio-link-failure --numberOfEnbs=1 --simTime=25"
  */
 int
 main (int argc, char *argv[])
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/examples/lena-rem.cc ns-3.36/src/lte/examples/lena-rem.cc
--- ns-3.35/src/lte/examples/lena-rem.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/examples/lena-rem.cc	2022-04-30 18:23:57.922733800 -0700
@@ -37,10 +37,10 @@
   cmd.Parse (argc, argv);
 	
   // to save a template default attribute file run it like this:
-  // ./waf --command-template="%s --ns3::ConfigStore::Filename=input-defaults.txt --ns3::ConfigStore::Mode=Save --ns3::ConfigStore::FileFormat=RawText" --run src/lte/examples/lena-first-sim
+  // ./ns3 run src/lte/examples/lena-first-sim --command-template="%s --ns3::ConfigStore::Filename=input-defaults.txt --ns3::ConfigStore::Mode=Save --ns3::ConfigStore::FileFormat=RawText"
   //
   // to load a previously created default attribute file
-  // ./waf --command-template="%s --ns3::ConfigStore::Filename=input-defaults.txt --ns3::ConfigStore::Mode=Load --ns3::ConfigStore::FileFormat=RawText" --run src/lte/examples/lena-first-sim
+  // ./ns3 run src/lte/examples/lena-first-sim --command-template="%s --ns3::ConfigStore::Filename=input-defaults.txt --ns3::ConfigStore::Mode=Load --ns3::ConfigStore::FileFormat=RawText"
 
   ConfigStore inputConfig;
   inputConfig.ConfigureDefaults ();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/examples/lena-rem-sector-antenna.cc ns-3.36/src/lte/examples/lena-rem-sector-antenna.cc
--- ns-3.35/src/lte/examples/lena-rem-sector-antenna.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/examples/lena-rem-sector-antenna.cc	2022-04-30 18:23:57.922733800 -0700
@@ -37,7 +37,7 @@
 int
 main (int argc, char *argv[])
 {
-  CommandLine cmd;
+  CommandLine cmd (__FILE__);
   cmd.Parse (argc, argv);
 
   ConfigStore inputConfig;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/examples/lena-simple.cc ns-3.36/src/lte/examples/lena-simple.cc
--- ns-3.35/src/lte/examples/lena-simple.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/examples/lena-simple.cc	2022-04-30 18:23:57.922733800 -0700
@@ -39,10 +39,10 @@
   cmd.Parse (argc, argv);
 
   // to save a template default attribute file run it like this:
-  // ./waf --command-template="%s --ns3::ConfigStore::Filename=input-defaults.txt --ns3::ConfigStore::Mode=Save --ns3::ConfigStore::FileFormat=RawText" --run src/lte/examples/lena-simple
+  // ./ns3 run src/lte/examples/lena-first-sim --command-template="%s --ns3::ConfigStore::Filename=input-defaults.txt --ns3::ConfigStore::Mode=Save --ns3::ConfigStore::FileFormat=RawText"
   //
   // to load a previously created default attribute file
-  // ./waf --command-template="%s --ns3::ConfigStore::Filename=input-defaults.txt --ns3::ConfigStore::Mode=Load --ns3::ConfigStore::FileFormat=RawText" --run src/lte/examples/lena-simple
+  // ./ns3 run src/lte/examples/lena-first-sim --command-template="%s --ns3::ConfigStore::Filename=input-defaults.txt --ns3::ConfigStore::Mode=Load --ns3::ConfigStore::FileFormat=RawText"
 
   ConfigStore inputConfig;
   inputConfig.ConfigureDefaults ();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/examples/lena-simple-epc-backhaul.cc ns-3.36/src/lte/examples/lena-simple-epc-backhaul.cc
--- ns-3.35/src/lte/examples/lena-simple-epc-backhaul.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/examples/lena-simple-epc-backhaul.cc	2022-04-30 18:23:57.922733800 -0700
@@ -156,6 +156,7 @@
       for (uint16_t i = 0; i < numNodePairs; ++i)
         {
           Ptr<Node> enb = enbNodes.Get (i);
+          std::vector<uint16_t> cellIds (1, i);
 
           // Create a point to point link between the eNB and the SGW with
           // the corresponding new NetDevices on each side
@@ -175,7 +176,7 @@
           Ipv4Address enbS1uAddress = sgwEnbIpIfaces.GetAddress (1);
 
           // Create S1 interface between the SGW and the eNB
-          epcHelper->AddS1Interface (enb, enbS1uAddress, sgwS1uAddress);
+          epcHelper->AddS1Interface (enb, enbS1uAddress, sgwS1uAddress, cellIds);
         }
     }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/examples/wscript ns-3.36/src/lte/examples/wscript
--- ns-3.35/src/lte/examples/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/examples/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,75 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    obj = bld.create_ns3_program('lena-cqi-threshold',
-                                 ['lte'])
-    obj.source = 'lena-cqi-threshold.cc'
-    obj = bld.create_ns3_program('lena-dual-stripe',
-                                 ['lte'])
-    obj.source = 'lena-dual-stripe.cc'
-    obj = bld.create_ns3_program('lena-fading',
-                                 ['lte'])
-    obj.source = 'lena-fading.cc'
-    obj = bld.create_ns3_program('lena-intercell-interference',
-                                 ['lte'])
-    obj.source = 'lena-intercell-interference.cc'
-    obj = bld.create_ns3_program('lena-ipv6-addr-conf',
-                                 ['lte'])
-    obj.source = 'lena-ipv6-addr-conf.cc'
-    obj = bld.create_ns3_program('lena-ipv6-ue-rh',
-                                 ['lte'])
-    obj.source = 'lena-ipv6-ue-rh.cc'
-    obj = bld.create_ns3_program('lena-ipv6-ue-ue',
-                                 ['lte'])
-    obj.source = 'lena-ipv6-ue-ue.cc'
-    obj = bld.create_ns3_program('lena-pathloss-traces',
-                                 ['lte'])
-    obj.source = 'lena-pathloss-traces.cc'
-    obj = bld.create_ns3_program('lena-profiling',
-                                 ['lte'])
-    obj.source = 'lena-profiling.cc'
-    obj = bld.create_ns3_program('lena-rem',
-                                 ['lte'])
-    obj.source = 'lena-rem.cc'
-    obj = bld.create_ns3_program('lena-rem-sector-antenna',
-                                 ['lte'])
-    obj.source = 'lena-rem-sector-antenna.cc'
-    obj = bld.create_ns3_program('lena-rlc-traces',
-                                 ['lte'])
-    obj.source = 'lena-rlc-traces.cc'
-    obj = bld.create_ns3_program('lena-simple',
-                                 ['lte'])
-    obj.source = 'lena-simple.cc'
-    obj = bld.create_ns3_program('lena-simple-epc',
-                                 ['lte'])
-    obj.source = 'lena-simple-epc.cc'
-    obj = bld.create_ns3_program('lena-simple-epc-backhaul',
-                                 ['lte'])
-    obj.source = 'lena-simple-epc-backhaul.cc'
-    obj = bld.create_ns3_program('lena-deactivate-bearer',
-                                 ['lte'])
-    obj.source = 'lena-deactivate-bearer.cc'
-    obj = bld.create_ns3_program('lena-x2-handover',
-                                 ['lte'])
-    obj.source = 'lena-x2-handover.cc'
-    obj = bld.create_ns3_program('lena-x2-handover-measures',
-                                 ['lte'])
-    obj.source = 'lena-x2-handover-measures.cc'
-    obj = bld.create_ns3_program('lena-frequency-reuse',
-                                 ['lte'])
-    obj.source = 'lena-frequency-reuse.cc'
-    obj = bld.create_ns3_program('lena-distributed-ffr',
-                                 ['lte'])
-    obj.source = 'lena-distributed-ffr.cc'
-    obj = bld.create_ns3_program('lena-uplink-power-control',
-                                 ['lte'])
-    obj.source = 'lena-uplink-power-control.cc'
-
-    obj = bld.create_ns3_program('lena-radio-link-failure',
-                                 ['lte'])
-    obj.source = 'lena-radio-link-failure.cc'
-    
-    if bld.env['ENABLE_EMU']:
-        obj = bld.create_ns3_program('lena-simple-epc-emu',
-                                     ['lte', 'fd-net-device'])
-        obj.source = 'lena-simple-epc-emu.cc'
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/helper/emu-epc-helper.cc ns-3.36/src/lte/helper/emu-epc-helper.cc
--- ns-3.35/src/lte/helper/emu-epc-helper.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/helper/emu-epc-helper.cc	2022-04-30 18:23:57.922733800 -0700
@@ -114,22 +114,21 @@
 
 
 void
-EmuEpcHelper::AddEnb (Ptr<Node> enb, Ptr<NetDevice> lteEnbNetDevice, uint16_t cellId)
+EmuEpcHelper::AddEnb (Ptr<Node> enb, Ptr<NetDevice> lteEnbNetDevice, std::vector<uint16_t> cellIds)
 {
-  NS_LOG_FUNCTION (this << enb << lteEnbNetDevice << cellId);
+  NS_LOG_FUNCTION (this << enb << lteEnbNetDevice << cellIds.size ());
 
-  NoBackhaulEpcHelper::AddEnb (enb, lteEnbNetDevice, cellId);
+  NoBackhaulEpcHelper::AddEnb (enb, lteEnbNetDevice, cellIds);
 
   // Create an EmuFdNetDevice for the eNB to connect with the SGW and other eNBs
   EmuFdNetDeviceHelper emu;
-  NS_LOG_LOGIC ("eNB cellId: " << cellId);
+  NS_LOG_LOGIC ("eNB cellId: " << cellIds.at (0));
   NS_LOG_LOGIC ("eNB device: " << m_enbDeviceName);
   emu.SetDeviceName (m_enbDeviceName);
   NetDeviceContainer enbDevices = emu.Install (enb);
 
-  NS_ABORT_IF ((cellId == 0) || (cellId > 255));
   std::ostringstream enbMacAddress;
-  enbMacAddress << m_enbMacAddressBase << ":" << std::hex << std::setfill ('0') << std::setw (2) << cellId;
+  enbMacAddress << m_enbMacAddressBase << ":" << std::hex << std::setfill ('0') << std::setw (2) << cellIds.at (0);
   NS_LOG_LOGIC ("eNB MAC address: " << enbMacAddress.str ());
   Ptr<NetDevice> enbDev = enbDevices.Get (0);
   enbDev->SetAttribute ("Address", Mac48AddressValue (enbMacAddress.str ().c_str ()));
@@ -143,7 +142,7 @@
   Ipv4Address enbAddress = enbIpIfaces.GetAddress (0);
   Ipv4Address sgwAddress = m_sgwIpIfaces.GetAddress (0);
 
-  NoBackhaulEpcHelper::AddS1Interface (enb, enbAddress, sgwAddress, cellId);
+  NoBackhaulEpcHelper::AddS1Interface (enb, enbAddress, sgwAddress, cellIds);
 }
 
 
@@ -181,16 +180,18 @@
   // Add X2 interface to both eNBs' X2 entities
   Ptr<EpcX2> enb1X2 = enb1->GetObject<EpcX2> ();
   Ptr<LteEnbNetDevice> enb1LteDev = enb1->GetDevice (0)->GetObject<LteEnbNetDevice> ();
-  uint16_t enb1CellId = enb1LteDev->GetCellId ();
+  std::vector<uint16_t> enb1CellIds = enb1LteDev->GetCellIds ();
+  uint16_t enb1CellId = enb1CellIds.at (0);
   NS_LOG_LOGIC ("LteEnbNetDevice #1 = " << enb1LteDev << " - CellId = " << enb1CellId);
 
   Ptr<EpcX2> enb2X2 = enb2->GetObject<EpcX2> ();
   Ptr<LteEnbNetDevice> enb2LteDev = enb2->GetDevice (0)->GetObject<LteEnbNetDevice> ();
-  uint16_t enb2CellId = enb2LteDev->GetCellId ();
+  std::vector<uint16_t> enb2CellIds = enb2LteDev->GetCellIds ();
+  uint16_t enb2CellId = enb2CellIds.at (0);
   NS_LOG_LOGIC ("LteEnbNetDevice #2 = " << enb2LteDev << " - CellId = " << enb2CellId);
 
-  enb1X2->AddX2Interface (enb1CellId, enb1Addr, enb2CellId, enb2Addr);
-  enb2X2->AddX2Interface (enb2CellId, enb2Addr, enb1CellId, enb1Addr);
+  enb1X2->AddX2Interface (enb1CellId, enb1Addr, enb2CellIds, enb2Addr);
+  enb2X2->AddX2Interface (enb2CellId, enb2Addr, enb1CellIds, enb1Addr);
 
   enb1LteDev->GetRrc ()->AddX2Neighbour (enb2LteDev->GetCellId ());
   enb2LteDev->GetRrc ()->AddX2Neighbour (enb1LteDev->GetCellId ());
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/helper/emu-epc-helper.h ns-3.36/src/lte/helper/emu-epc-helper.h
--- ns-3.35/src/lte/helper/emu-epc-helper.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/helper/emu-epc-helper.h	2022-04-30 18:23:57.922733800 -0700
@@ -61,7 +61,7 @@
   virtual void DoDispose ();
 
   // inherited from EpcHelper
-  virtual void AddEnb (Ptr<Node> enbNode, Ptr<NetDevice> lteEnbNetDevice, uint16_t cellId);
+  virtual void AddEnb (Ptr<Node> enbNode, Ptr<NetDevice> lteEnbNetDevice, std::vector<uint16_t> cellIds);
   virtual void AddX2Interface (Ptr<Node> enbNode1, Ptr<Node> enbNode2);
 
 private:
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/helper/epc-helper.h ns-3.36/src/lte/helper/epc-helper.h
--- ns-3.35/src/lte/helper/epc-helper.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/helper/epc-helper.h	2022-04-30 18:23:57.922733800 -0700
@@ -75,9 +75,9 @@
    * \param enbNode the previously created eNB node which is to be
    * added to the EPC
    * \param lteEnbNetDevice the LteEnbNetDevice of the eNB node
-   * \param cellId ID of the eNB
+   * \param cellIds IDs of cells served by this eNB
    */
-  virtual void AddEnb (Ptr<Node> enbNode, Ptr<NetDevice> lteEnbNetDevice, uint16_t cellId) = 0;
+  virtual void AddEnb (Ptr<Node> enbNode, Ptr<NetDevice> lteEnbNetDevice, std::vector<uint16_t> cellIds) = 0;
 
   /** 
    * Notify the EPC of the existence of a new UE which might attach at a later time
@@ -101,9 +101,9 @@
    * \param enb eNB peer of the S1 interface
    * \param enbAddress eNB IPv4 address of the S1 interface
    * \param sgwAddress SGW IPv4 address of the S1 interface
-   * \param cellId cellId of the eNB
+   * \param cellIds cellIds of the eNB
    */
-  virtual void AddS1Interface (Ptr<Node> enb, Ipv4Address enbAddress, Ipv4Address sgwAddress, uint16_t cellId = 0) = 0;
+  virtual void AddS1Interface (Ptr<Node> enb, Ipv4Address enbAddress, Ipv4Address sgwAddress, std::vector<uint16_t> cellIds) = 0;
 
 
   /** 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/helper/lte-helper.cc ns-3.36/src/lte/helper/lte-helper.cc
--- ns-3.35/src/lte/helper/lte-helper.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/helper/lte-helper.cc	2022-04-30 18:23:57.922733800 -0700
@@ -516,7 +516,6 @@
                    "CC map size (" << m_componentCarrierPhyParams.size () <<
                    ") must be equal to number of carriers (" <<
                    m_noOfCcs << ")");
-
   // create component carrier map for this eNb device
   std::map<uint8_t,Ptr<ComponentCarrierBaseStation> > ccMap;
   for (std::map<uint8_t, ComponentCarrier >::iterator it = m_componentCarrierPhyParams.begin ();
@@ -740,7 +739,7 @@
   if (m_epcHelper != 0)
     {
       NS_LOG_INFO ("adding this eNB to the EPC");
-      m_epcHelper->AddEnb (n, dev, dev->GetCellId ());
+      m_epcHelper->AddEnb (n, dev, dev->GetCellIds ());
       Ptr<EpcEnbApplication> enbApp = n->GetApplication (0)->GetObject<EpcEnbApplication> ();
       NS_ASSERT_MSG (enbApp != 0, "cannot retrieve EpcEnbApplication");
 
@@ -774,7 +773,6 @@
                    "CC map size (" << m_componentCarrierPhyParams.size () <<
                    ") must be equal to number of carriers (" <<
                    m_noOfCcs << ")");
-
   std::map<uint8_t, Ptr<ComponentCarrierUe> > ueCcMap;
 
   for (std::map< uint8_t, ComponentCarrier >::iterator it = m_componentCarrierPhyParams.begin();
@@ -1009,7 +1007,7 @@
 }
 
 void
-LteHelper::Attach (Ptr<NetDevice> ueDevice, Ptr<NetDevice> enbDevice)
+LteHelper::Attach (Ptr<NetDevice> ueDevice, Ptr<NetDevice> enbDevice, uint8_t componentCarrierId)
 {
   NS_LOG_FUNCTION (this);
   //enbRrc->SetCellId (enbDevice->GetObject<LteEnbNetDevice> ()->GetCellId ());
@@ -1018,7 +1016,8 @@
   Ptr<LteEnbNetDevice> enbLteDevice = enbDevice->GetObject<LteEnbNetDevice> ();
 
   Ptr<EpcUeNas> ueNas = ueLteDevice->GetNas ();
-  ueNas->Connect (enbLteDevice->GetCellId (), enbLteDevice->GetDlEarfcn ());
+  Ptr<ComponentCarrierEnb> componentCarrier = DynamicCast<ComponentCarrierEnb> (enbLteDevice->GetCcMap ().at (componentCarrierId));
+  ueNas->Connect (componentCarrier->GetCellId (), componentCarrier->GetDlEarfcn ());
 
   if (m_epcHelper != 0)
     {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/helper/lte-helper.h ns-3.36/src/lte/helper/lte-helper.h
--- ns-3.35/src/lte/helper/lte-helper.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/helper/lte-helper.h	2022-04-30 18:23:57.922733800 -0700
@@ -404,6 +404,7 @@
    * \brief Manual attachment of a UE device to the network via a given eNodeB.
    * \param ueDevice the UE device to be attached
    * \param enbDevice the destination eNodeB device
+   * \param componentCarrierId the destination eNodeB component carrier
    *
    * In addition, the function also instructs the UE to immediately enter
    * CONNECTED mode and activates the default EPS bearer.
@@ -412,7 +413,7 @@
    * Note that this function will disable Idle mode initial cell selection
    * procedure.
    */
-  void Attach (Ptr<NetDevice> ueDevice, Ptr<NetDevice> enbDevice);
+  void Attach (Ptr<NetDevice> ueDevice, Ptr<NetDevice> enbDevice, uint8_t componentCarrierId = 0);
 
   /** 
    * \brief Manual attachment of a set of UE devices to the network via the
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/helper/mac-stats-calculator.cc ns-3.36/src/lte/helper/mac-stats-calculator.cc
--- ns-3.35/src/lte/helper/mac-stats-calculator.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/helper/mac-stats-calculator.cc	2022-04-30 18:23:57.922733800 -0700
@@ -42,6 +42,15 @@
 MacStatsCalculator::~MacStatsCalculator ()
 {
   NS_LOG_FUNCTION (this);
+  if (m_dlOutFile.is_open())
+    {
+      m_dlOutFile.close();
+    }
+
+  if (m_ulOutFile.is_open())
+    {
+      m_ulOutFile.close();
+    }
 }
 
 TypeId
@@ -96,41 +105,30 @@
                    dlSchedulingCallbackInfo.rnti << (uint32_t) dlSchedulingCallbackInfo.mcsTb1 << dlSchedulingCallbackInfo.sizeTb1 << (uint32_t) dlSchedulingCallbackInfo.mcsTb2 << dlSchedulingCallbackInfo.sizeTb2);
   NS_LOG_INFO ("Write DL Mac Stats in " << GetDlOutputFilename ().c_str ());
 
-  std::ofstream outFile;
   if ( m_dlFirstWrite == true )
     {
-      outFile.open (GetDlOutputFilename ().c_str ());
-      if (!outFile.is_open ())
+      m_dlOutFile.open (GetDlOutputFilename ().c_str ());
+      if (!m_dlOutFile.is_open ())
         {
           NS_LOG_ERROR ("Can't open file " << GetDlOutputFilename ().c_str ());
           return;
         }
       m_dlFirstWrite = false;
-      outFile << "% time\tcellId\tIMSI\tframe\tsframe\tRNTI\tmcsTb1\tsizeTb1\tmcsTb2\tsizeTb2\tccId";
-      outFile << std::endl;
-    }
-  else
-    {
-      outFile.open (GetDlOutputFilename ().c_str (),  std::ios_base::app);
-      if (!outFile.is_open ())
-        {
-          NS_LOG_ERROR ("Can't open file " << GetDlOutputFilename ().c_str ());
-          return;
-        }
+      m_dlOutFile << "% time\tcellId\tIMSI\tframe\tsframe\tRNTI\tmcsTb1\tsizeTb1\tmcsTb2\tsizeTb2\tccId";
+      m_dlOutFile << "\n";
     }
 
-  outFile << Simulator::Now ().GetSeconds () << "\t";
-  outFile << (uint32_t) cellId << "\t";
-  outFile << imsi << "\t";
-  outFile << dlSchedulingCallbackInfo.frameNo << "\t";
-  outFile << dlSchedulingCallbackInfo.subframeNo << "\t";
-  outFile << dlSchedulingCallbackInfo.rnti << "\t";
-  outFile << (uint32_t) dlSchedulingCallbackInfo.mcsTb1 << "\t";
-  outFile << dlSchedulingCallbackInfo.sizeTb1 << "\t";
-  outFile << (uint32_t) dlSchedulingCallbackInfo.mcsTb2 << "\t";
-  outFile << dlSchedulingCallbackInfo.sizeTb2 << "\t";
-  outFile << (uint32_t) dlSchedulingCallbackInfo.componentCarrierId << std::endl;
-  outFile.close ();
+  m_dlOutFile << Simulator::Now ().GetSeconds () << "\t";
+  m_dlOutFile << (uint32_t) cellId << "\t";
+  m_dlOutFile << imsi << "\t";
+  m_dlOutFile << dlSchedulingCallbackInfo.frameNo << "\t";
+  m_dlOutFile << dlSchedulingCallbackInfo.subframeNo << "\t";
+  m_dlOutFile << dlSchedulingCallbackInfo.rnti << "\t";
+  m_dlOutFile << (uint32_t) dlSchedulingCallbackInfo.mcsTb1 << "\t";
+  m_dlOutFile << dlSchedulingCallbackInfo.sizeTb1 << "\t";
+  m_dlOutFile << (uint32_t) dlSchedulingCallbackInfo.mcsTb2 << "\t";
+  m_dlOutFile << dlSchedulingCallbackInfo.sizeTb2 << "\t";
+  m_dlOutFile << (uint32_t) dlSchedulingCallbackInfo.componentCarrierId << std::endl;
 }
 
 void
@@ -140,39 +138,28 @@
   NS_LOG_FUNCTION (this << cellId << imsi << frameNo << subframeNo << rnti << (uint32_t) mcsTb << size);
   NS_LOG_INFO ("Write UL Mac Stats in " << GetUlOutputFilename ().c_str ());
 
-  std::ofstream outFile;
   if ( m_ulFirstWrite == true )
     {
-      outFile.open (GetUlOutputFilename ().c_str ());
-      if (!outFile.is_open ())
+      m_ulOutFile.open (GetUlOutputFilename ().c_str ());
+      if (!m_ulOutFile.is_open ())
         {
           NS_LOG_ERROR ("Can't open file " << GetUlOutputFilename ().c_str ());
           return;
         }
       m_ulFirstWrite = false;
-      outFile << "% time\tcellId\tIMSI\tframe\tsframe\tRNTI\tmcs\tsize\tccId";
-      outFile << std::endl;
-    }
-  else
-    {
-      outFile.open (GetUlOutputFilename ().c_str (),  std::ios_base::app);
-      if (!outFile.is_open ())
-        {
-          NS_LOG_ERROR ("Can't open file " << GetUlOutputFilename ().c_str ());
-          return;
-        }
+      m_ulOutFile << "% time\tcellId\tIMSI\tframe\tsframe\tRNTI\tmcs\tsize\tccId";
+      m_ulOutFile << "\n";
     }
 
-  outFile << Simulator::Now ().GetSeconds () << "\t";
-  outFile << (uint32_t) cellId << "\t";
-  outFile << imsi << "\t";
-  outFile << frameNo << "\t";
-  outFile << subframeNo << "\t";
-  outFile << rnti << "\t";
-  outFile << (uint32_t) mcsTb << "\t";
-  outFile << size << "\t";
-  outFile << (uint32_t) componentCarrierId << std::endl;
-  outFile.close ();
+  m_ulOutFile << Simulator::Now ().GetSeconds () << "\t";
+  m_ulOutFile << (uint32_t) cellId << "\t";
+  m_ulOutFile << imsi << "\t";
+  m_ulOutFile << frameNo << "\t";
+  m_ulOutFile << subframeNo << "\t";
+  m_ulOutFile << rnti << "\t";
+  m_ulOutFile << (uint32_t) mcsTb << "\t";
+  m_ulOutFile << size << "\t";
+  m_ulOutFile << (uint32_t) componentCarrierId << std::endl;
 }
 
 void
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/helper/mac-stats-calculator.h ns-3.36/src/lte/helper/mac-stats-calculator.h
--- ns-3.35/src/lte/helper/mac-stats-calculator.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/helper/mac-stats-calculator.h	2022-04-30 18:23:57.922733800 -0700
@@ -166,6 +166,15 @@
    */
   bool m_ulFirstWrite;
 
+  /**
+   * Downlink output trace file
+   */
+  std::ofstream m_dlOutFile;
+
+  /**
+   * Uplink output trace file
+   */
+  std::ofstream m_ulOutFile;
 };
 
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/helper/no-backhaul-epc-helper.cc ns-3.36/src/lte/helper/no-backhaul-epc-helper.cc
--- ns-3.35/src/lte/helper/no-backhaul-epc-helper.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/helper/no-backhaul-epc-helper.cc	2022-04-30 18:23:57.922733800 -0700
@@ -307,9 +307,9 @@
 
 
 void
-NoBackhaulEpcHelper::AddEnb (Ptr<Node> enb, Ptr<NetDevice> lteEnbNetDevice, uint16_t cellId)
+NoBackhaulEpcHelper::AddEnb (Ptr<Node> enb, Ptr<NetDevice> lteEnbNetDevice, std::vector<uint16_t> cellIds)
 {
-  NS_LOG_FUNCTION (this << enb << lteEnbNetDevice << cellId);
+  NS_LOG_FUNCTION (this << enb << lteEnbNetDevice << cellIds.size ());
   NS_ASSERT (enb == lteEnbNetDevice->GetNode ());
 
   int retval;
@@ -347,8 +347,8 @@
   retval = enbLteSocket6->Connect (enbLteSocketConnectAddress6);
   NS_ASSERT (retval == 0);  
 
-  NS_LOG_INFO ("Create EpcEnbApplication");
-  Ptr<EpcEnbApplication> enbApp = CreateObject<EpcEnbApplication> (enbLteSocket, enbLteSocket6, cellId);
+  NS_LOG_INFO ("Create EpcEnbApplication for cell ID " << cellIds.at (0));
+  Ptr<EpcEnbApplication> enbApp = CreateObject<EpcEnbApplication> (enbLteSocket, enbLteSocket6, cellIds.at (0));
   enb->AddApplication (enbApp);
   NS_ASSERT (enb->GetNApplications () == 1);
   NS_ASSERT_MSG (enb->GetApplication (0)->GetObject<EpcEnbApplication> () != 0, "cannot retrieve EpcEnbApplication");
@@ -412,14 +412,17 @@
   NS_ABORT_MSG_IF (enb1LteDevice == nullptr , "Unable to find LteEnbNetDevice for the first eNB");
   NS_ABORT_MSG_IF (enb2LteDevice == nullptr , "Unable to find LteEnbNetDevice for the second eNB");
 
-  uint16_t enb1CellId = enb1LteDevice->GetCellId ();
-  uint16_t enb2CellId = enb2LteDevice->GetCellId ();
+  std::vector<uint16_t> enb1CellIds = enb1LteDevice->GetCellIds ();
+  std::vector<uint16_t> enb2CellIds = enb2LteDevice->GetCellIds ();
+
+  uint16_t enb1CellId = enb1CellIds.at (0);
+  uint16_t enb2CellId = enb2CellIds.at (0);
 
   NS_LOG_LOGIC ("LteEnbNetDevice #1 = " << enb1LteDev << " - CellId = " << enb1CellId);
   NS_LOG_LOGIC ("LteEnbNetDevice #2 = " << enb2LteDev << " - CellId = " << enb2CellId);
 
-  enb1X2->AddX2Interface (enb1CellId, enb1X2Address, enb2CellId, enb2X2Address);
-  enb2X2->AddX2Interface (enb2CellId, enb2X2Address, enb1CellId, enb1X2Address);
+  enb1X2->AddX2Interface (enb1CellId, enb1X2Address, enb2CellIds, enb2X2Address);
+  enb2X2->AddX2Interface (enb2CellId, enb2X2Address, enb1CellIds, enb1X2Address);
 
   enb1LteDevice->GetRrc ()->AddX2Neighbour (enb2CellId);
   enb2LteDevice->GetRrc ()->AddX2Neighbour (enb1CellId);
@@ -542,9 +545,9 @@
 
 
 void
-NoBackhaulEpcHelper::AddS1Interface (Ptr<Node> enb, Ipv4Address enbAddress, Ipv4Address sgwAddress, uint16_t cellId)
+NoBackhaulEpcHelper::AddS1Interface (Ptr<Node> enb, Ipv4Address enbAddress, Ipv4Address sgwAddress, std::vector<uint16_t> cellIds)
 {
-  NS_LOG_FUNCTION (this << enb << enbAddress << sgwAddress << cellId);
+  NS_LOG_FUNCTION (this << enb << enbAddress << sgwAddress << cellIds.size ());
 
   // create S1-U socket for the ENB
   Ptr<Socket> enbS1uSocket = Socket::CreateSocket (enb, TypeId::LookupByName ("ns3::UdpSocketFactory"));
@@ -556,14 +559,12 @@
   enbApp->AddS1Interface (enbS1uSocket, enbAddress, sgwAddress);
 
   NS_LOG_INFO ("Connect S1-AP interface");
-  if (cellId == 0)
+  for (uint16_t cellId : cellIds)
     {
-      Ptr<LteEnbNetDevice> enbLteDev = enb->GetDevice (0)->GetObject<LteEnbNetDevice> ();
-      NS_ASSERT_MSG (enbLteDev, "LteEnbNetDevice is missing");
-      cellId = enbLteDev->GetCellId ();
+      NS_LOG_DEBUG ("Adding MME and SGW for cell ID " << cellId);
+      m_mmeApp->AddEnb (cellId, enbAddress, enbApp->GetS1apSapEnb ());
+      m_sgwApp->AddEnb (cellId, enbAddress, sgwAddress);
     }
-  m_mmeApp->AddEnb (cellId, enbAddress, enbApp->GetS1apSapEnb ());
-  m_sgwApp->AddEnb (cellId, enbAddress, sgwAddress);
   enbApp->SetS1apSapMme (m_mmeApp->GetS1apSapMme ());
 }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/helper/no-backhaul-epc-helper.h ns-3.36/src/lte/helper/no-backhaul-epc-helper.h
--- ns-3.35/src/lte/helper/no-backhaul-epc-helper.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/helper/no-backhaul-epc-helper.h	2022-04-30 18:23:57.922733800 -0700
@@ -66,10 +66,10 @@
   virtual void DoDispose ();
 
   // inherited from EpcHelper
-  virtual void AddEnb (Ptr<Node> enbNode, Ptr<NetDevice> lteEnbNetDevice, uint16_t cellId);
+  virtual void AddEnb (Ptr<Node> enbNode, Ptr<NetDevice> lteEnbNetDevice, std::vector<uint16_t> cellIds);
   virtual void AddUe (Ptr<NetDevice> ueLteDevice, uint64_t imsi);
   virtual void AddX2Interface (Ptr<Node> enbNode1, Ptr<Node> enbNode2);
-  virtual void AddS1Interface (Ptr<Node> enb, Ipv4Address enbAddress, Ipv4Address sgwAddress, uint16_t cellId = 0);
+  virtual void AddS1Interface (Ptr<Node> enb, Ipv4Address enbAddress, Ipv4Address sgwAddress, std::vector<uint16_t> cellIds);
   virtual uint8_t ActivateEpsBearer (Ptr<NetDevice> ueLteDevice, uint64_t imsi, Ptr<EpcTft> tft, EpsBearer bearer);
   virtual Ptr<Node> GetSgwNode () const;
   virtual Ptr<Node> GetPgwNode () const;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/helper/phy-rx-stats-calculator.cc ns-3.36/src/lte/helper/phy-rx-stats-calculator.cc
--- ns-3.35/src/lte/helper/phy-rx-stats-calculator.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/helper/phy-rx-stats-calculator.cc	2022-04-30 18:23:57.922733800 -0700
@@ -42,6 +42,15 @@
 PhyRxStatsCalculator::~PhyRxStatsCalculator ()
 {
   NS_LOG_FUNCTION (this);
+  if (m_dlRxOutFile.is_open())
+    {
+      m_dlRxOutFile.close();
+    }
+
+  if (m_ulRxOutFile.is_open())
+    {
+      m_ulRxOutFile.close();
+    }
 }
 
 TypeId
@@ -95,42 +104,31 @@
   NS_LOG_FUNCTION (this << params.m_cellId << params.m_imsi << params.m_timestamp << params.m_rnti << params.m_layer << params.m_mcs << params.m_size << params.m_rv << params.m_ndi << params.m_correctness);
   NS_LOG_INFO ("Write DL Rx Phy Stats in " << GetDlRxOutputFilename ().c_str ());
 
-  std::ofstream outFile;
   if ( m_dlRxFirstWrite == true )
     {
-      outFile.open (GetDlRxOutputFilename ().c_str ());
-      if (!outFile.is_open ())
+      m_dlRxOutFile.open (GetDlRxOutputFilename ().c_str ());
+      if (!m_dlRxOutFile.is_open ())
         {
           NS_LOG_ERROR ("Can't open file " << GetDlRxOutputFilename ().c_str ());
           return;
         }
       m_dlRxFirstWrite = false;
-      outFile << "% time\tcellId\tIMSI\tRNTI\ttxMode\tlayer\tmcs\tsize\trv\tndi\tcorrect\tccId";
-      outFile << std::endl;
-    }
-  else
-    {
-      outFile.open (GetDlRxOutputFilename ().c_str (),  std::ios_base::app);
-      if (!outFile.is_open ())
-        {
-          NS_LOG_ERROR ("Can't open file " << GetDlRxOutputFilename ().c_str ());
-          return;
-        }
+      m_dlRxOutFile << "% time\tcellId\tIMSI\tRNTI\ttxMode\tlayer\tmcs\tsize\trv\tndi\tcorrect\tccId";
+      m_dlRxOutFile << "\n";
     }
 
-  outFile << params.m_timestamp << "\t";
-  outFile << (uint32_t) params.m_cellId << "\t";
-  outFile << params.m_imsi << "\t";
-  outFile << params.m_rnti << "\t";
-  outFile << (uint32_t) params.m_txMode << "\t";
-  outFile << (uint32_t) params.m_layer << "\t";
-  outFile << (uint32_t) params.m_mcs << "\t";
-  outFile << params.m_size << "\t";
-  outFile << (uint32_t) params.m_rv << "\t";
-  outFile << (uint32_t) params.m_ndi << "\t";
-  outFile << (uint32_t) params.m_correctness << "\t";
-  outFile << (uint32_t) params.m_ccId << std::endl;
-  outFile.close ();
+  m_dlRxOutFile << params.m_timestamp << "\t";
+  m_dlRxOutFile << (uint32_t) params.m_cellId << "\t";
+  m_dlRxOutFile << params.m_imsi << "\t";
+  m_dlRxOutFile << params.m_rnti << "\t";
+  m_dlRxOutFile << (uint32_t) params.m_txMode << "\t";
+  m_dlRxOutFile << (uint32_t) params.m_layer << "\t";
+  m_dlRxOutFile << (uint32_t) params.m_mcs << "\t";
+  m_dlRxOutFile << params.m_size << "\t";
+  m_dlRxOutFile << (uint32_t) params.m_rv << "\t";
+  m_dlRxOutFile << (uint32_t) params.m_ndi << "\t";
+  m_dlRxOutFile << (uint32_t) params.m_correctness << "\t";
+  m_dlRxOutFile << (uint32_t) params.m_ccId << std::endl;
 }
 
 void
@@ -139,41 +137,30 @@
   NS_LOG_FUNCTION (this << params.m_cellId << params.m_imsi << params.m_timestamp << params.m_rnti << params.m_layer << params.m_mcs << params.m_size << params.m_rv << params.m_ndi << params.m_correctness);
   NS_LOG_INFO ("Write UL Rx Phy Stats in " << GetUlRxOutputFilename ().c_str ());
 
-  std::ofstream outFile;
   if ( m_ulRxFirstWrite == true )
     {
-      outFile.open (GetUlRxOutputFilename ().c_str ());
-      if (!outFile.is_open ())
+      m_ulRxOutFile.open (GetUlRxOutputFilename ().c_str ());
+      if (!m_ulRxOutFile.is_open ())
         {
           NS_LOG_ERROR ("Can't open file " << GetUlRxOutputFilename ().c_str ());
           return;
         }
       m_ulRxFirstWrite = false;
-      outFile << "% time\tcellId\tIMSI\tRNTI\tlayer\tmcs\tsize\trv\tndi\tcorrect\tccId";
-      outFile << std::endl;
-    }
-  else
-    {
-      outFile.open (GetUlRxOutputFilename ().c_str (),  std::ios_base::app);
-      if (!outFile.is_open ())
-        {
-          NS_LOG_ERROR ("Can't open file " << GetUlRxOutputFilename ().c_str ());
-          return;
-        }
+      m_ulRxOutFile << "% time\tcellId\tIMSI\tRNTI\tlayer\tmcs\tsize\trv\tndi\tcorrect\tccId";
+      m_ulRxOutFile << "\n";
     }
 
-  outFile << params.m_timestamp << "\t";
-  outFile << (uint32_t) params.m_cellId << "\t";
-  outFile << params.m_imsi << "\t";
-  outFile << params.m_rnti << "\t";
-  outFile << (uint32_t) params.m_layer << "\t";
-  outFile << (uint32_t) params.m_mcs << "\t";
-  outFile << params.m_size << "\t";
-  outFile << (uint32_t) params.m_rv << "\t";
-  outFile << (uint32_t) params.m_ndi << "\t";
-  outFile << (uint32_t) params.m_correctness << "\t";
-  outFile << (uint32_t) params.m_ccId << std::endl;
-  outFile.close ();
+  m_ulRxOutFile << params.m_timestamp << "\t";
+  m_ulRxOutFile << (uint32_t) params.m_cellId << "\t";
+  m_ulRxOutFile << params.m_imsi << "\t";
+  m_ulRxOutFile << params.m_rnti << "\t";
+  m_ulRxOutFile << (uint32_t) params.m_layer << "\t";
+  m_ulRxOutFile << (uint32_t) params.m_mcs << "\t";
+  m_ulRxOutFile << params.m_size << "\t";
+  m_ulRxOutFile << (uint32_t) params.m_rv << "\t";
+  m_ulRxOutFile << (uint32_t) params.m_ndi << "\t";
+  m_ulRxOutFile << (uint32_t) params.m_correctness << "\t";
+  m_ulRxOutFile << (uint32_t) params.m_ccId << std::endl;
 }
 
 void
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/helper/phy-rx-stats-calculator.h ns-3.36/src/lte/helper/phy-rx-stats-calculator.h
--- ns-3.35/src/lte/helper/phy-rx-stats-calculator.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/helper/phy-rx-stats-calculator.h	2022-04-30 18:23:57.922733800 -0700
@@ -142,6 +142,15 @@
    */
   bool m_ulRxFirstWrite;
 
+  /**
+   * DL RX PHY output trace file
+   */
+  std::ofstream m_dlRxOutFile;
+
+  /**
+   * UL RX PHY output trace file
+   */
+  std::ofstream m_ulRxOutFile;
 };
 
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/helper/phy-stats-calculator.cc ns-3.36/src/lte/helper/phy-stats-calculator.cc
--- ns-3.35/src/lte/helper/phy-stats-calculator.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/helper/phy-stats-calculator.cc	2022-04-30 18:23:57.922733800 -0700
@@ -42,6 +42,20 @@
 PhyStatsCalculator::~PhyStatsCalculator ()
 {
   NS_LOG_FUNCTION (this);
+  if (m_interferenceOutFile.is_open())
+    {
+      m_interferenceOutFile.close();
+    }
+
+  if (m_rsrpOutFile.is_open())
+    {
+      m_rsrpOutFile.close();
+    }
+
+  if (m_ueSinrOutFile.is_open())
+    {
+      m_ueSinrOutFile.close();
+    }
 }
 
 TypeId
@@ -115,37 +129,26 @@
   NS_LOG_FUNCTION (this << cellId <<  imsi << rnti  << rsrp << sinr);
   NS_LOG_INFO ("Write RSRP/SINR Phy Stats in " << GetCurrentCellRsrpSinrFilename ().c_str ());
 
-  std::ofstream outFile;
   if ( m_RsrpSinrFirstWrite == true )
     {
-      outFile.open (GetCurrentCellRsrpSinrFilename ().c_str ());
-      if (!outFile.is_open ())
+      m_rsrpOutFile.open (GetCurrentCellRsrpSinrFilename ().c_str ());
+      if (!m_rsrpOutFile.is_open ())
         {
           NS_LOG_ERROR ("Can't open file " << GetCurrentCellRsrpSinrFilename ().c_str ());
           return;
         }
       m_RsrpSinrFirstWrite = false;
-      outFile << "% time\tcellId\tIMSI\tRNTI\trsrp\tsinr\tComponentCarrierId";
-      outFile << std::endl;
-    }
-  else
-    {
-      outFile.open (GetCurrentCellRsrpSinrFilename ().c_str (),  std::ios_base::app);
-      if (!outFile.is_open ())
-        {
-          NS_LOG_ERROR ("Can't open file " << GetCurrentCellRsrpSinrFilename ().c_str ());
-          return;
-        }
+      m_rsrpOutFile << "% time\tcellId\tIMSI\tRNTI\trsrp\tsinr\tComponentCarrierId";
+      m_rsrpOutFile << "\n";
     }
 
-  outFile << Simulator::Now ().GetSeconds () << "\t";
-  outFile << cellId << "\t";
-  outFile << imsi << "\t";
-  outFile << rnti << "\t";
-  outFile << rsrp << "\t";
-  outFile << sinr << "\t";
-  outFile << (uint32_t)componentCarrierId << std::endl;
-  outFile.close ();
+  m_rsrpOutFile << Simulator::Now ().GetSeconds () << "\t";
+  m_rsrpOutFile << cellId << "\t";
+  m_rsrpOutFile << imsi << "\t";
+  m_rsrpOutFile << rnti << "\t";
+  m_rsrpOutFile << rsrp << "\t";
+  m_rsrpOutFile << sinr << "\t";
+  m_rsrpOutFile << (uint32_t)componentCarrierId << std::endl;
 }
 
 void
@@ -154,36 +157,24 @@
   NS_LOG_FUNCTION (this << cellId <<  imsi << rnti  << sinrLinear);
   NS_LOG_INFO ("Write SINR Linear Phy Stats in " << GetUeSinrFilename ().c_str ());
 
-  std::ofstream outFile;
   if ( m_UeSinrFirstWrite == true )
     {
-      outFile.open (GetUeSinrFilename ().c_str ());
-      if (!outFile.is_open ())
+      m_ueSinrOutFile.open (GetUeSinrFilename ().c_str ());
+      if (!m_ueSinrOutFile.is_open ())
         {
           NS_LOG_ERROR ("Can't open file " << GetUeSinrFilename ().c_str ());
           return;
         }
       m_UeSinrFirstWrite = false;
-      outFile << "% time\tcellId\tIMSI\tRNTI\tsinrLinear\tcomponentCarrierId";
-      outFile << std::endl;
+      m_ueSinrOutFile << "% time\tcellId\tIMSI\tRNTI\tsinrLinear\tcomponentCarrierId";
+      m_ueSinrOutFile << "\n";
     }
-  else
-    {
-      outFile.open (GetUeSinrFilename ().c_str (),  std::ios_base::app);
-      if (!outFile.is_open ())
-        {
-          NS_LOG_ERROR ("Can't open file " << GetUeSinrFilename ().c_str ());
-          return;
-        }
-    }
-
-  outFile << Simulator::Now ().GetSeconds () << "\t";
-  outFile << cellId << "\t";
-  outFile << imsi << "\t";
-  outFile << rnti << "\t";
-  outFile << sinrLinear << "\t";
-  outFile << (uint32_t)componentCarrierId << std::endl;
-  outFile.close ();
+  m_ueSinrOutFile << Simulator::Now ().GetSeconds () << "\t";
+  m_ueSinrOutFile << cellId << "\t";
+  m_ueSinrOutFile << imsi << "\t";
+  m_ueSinrOutFile << rnti << "\t";
+  m_ueSinrOutFile << sinrLinear << "\t";
+  m_ueSinrOutFile << (uint32_t)componentCarrierId << std::endl;
 }
 
 void
@@ -192,33 +183,22 @@
   NS_LOG_FUNCTION (this << cellId <<  interference);
   NS_LOG_INFO ("Write Interference Phy Stats in " << GetInterferenceFilename ().c_str ());
 
-  std::ofstream outFile;
   if ( m_InterferenceFirstWrite == true )
     {
-      outFile.open (GetInterferenceFilename ().c_str ());
-      if (!outFile.is_open ())
+      m_interferenceOutFile.open (GetInterferenceFilename ().c_str ());
+      if (!m_interferenceOutFile.is_open ())
         {
           NS_LOG_ERROR ("Can't open file " << GetInterferenceFilename ().c_str ());
           return;
         }
       m_InterferenceFirstWrite = false;
-      outFile << "% time\tcellId\tInterference";
-      outFile << std::endl;
-    }
-  else
-    {
-      outFile.open (GetInterferenceFilename ().c_str (),  std::ios_base::app);
-      if (!outFile.is_open ())
-        {
-          NS_LOG_ERROR ("Can't open file " << GetInterferenceFilename ().c_str ());
-          return;
-        }
+      m_interferenceOutFile << "% time\tcellId\tInterference";
+      m_interferenceOutFile << "\n";
     }
 
-  outFile << Simulator::Now ().GetSeconds () << "\t";
-  outFile << cellId << "\t";
-  outFile << *interference;
-  outFile.close ();
+  m_interferenceOutFile << Simulator::Now ().GetSeconds () << "\t";
+  m_interferenceOutFile << cellId << "\t";
+  m_interferenceOutFile << *interference;
 }
 
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/helper/phy-stats-calculator.h ns-3.36/src/lte/helper/phy-stats-calculator.h
--- ns-3.35/src/lte/helper/phy-stats-calculator.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/helper/phy-stats-calculator.h	2022-04-30 18:23:57.922733800 -0700
@@ -221,6 +221,20 @@
    */
   std::string m_interferenceFilename;
 
+  /**
+   * RSRP statistics output trace file
+   */
+  std::ofstream m_rsrpOutFile;
+
+  /**
+   * UE SINR statistics output trace file
+   */
+  std::ofstream m_ueSinrOutFile;
+
+  /**
+   * Interference statistics output trace file
+   */
+  std::ofstream m_interferenceOutFile;
 };
 
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/helper/phy-tx-stats-calculator.cc ns-3.36/src/lte/helper/phy-tx-stats-calculator.cc
--- ns-3.35/src/lte/helper/phy-tx-stats-calculator.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/helper/phy-tx-stats-calculator.cc	2022-04-30 18:23:57.922733800 -0700
@@ -42,8 +42,16 @@
 PhyTxStatsCalculator::~PhyTxStatsCalculator ()
 {
   NS_LOG_FUNCTION (this);
-}
+  if (m_dlTxOutFile.is_open())
+    {
+      m_dlTxOutFile.close();
+    }
 
+  if (m_ulTxOutFile.is_open())
+    {
+      m_ulTxOutFile.close();
+    }
+}
 TypeId
 PhyTxStatsCalculator::GetTypeId (void)
 {
@@ -95,41 +103,30 @@
   NS_LOG_FUNCTION (this << params.m_cellId << params.m_imsi << params.m_timestamp << params.m_rnti << params.m_layer << params.m_mcs << params.m_size << params.m_rv << params.m_ndi);
   NS_LOG_INFO ("Write DL Tx Phy Stats in " << GetDlTxOutputFilename ().c_str ());
 
-  std::ofstream outFile;
   if ( m_dlTxFirstWrite == true )
     {
-      outFile.open (GetDlOutputFilename ().c_str ());
-      if (!outFile.is_open ())
+      m_dlTxOutFile.open (GetDlOutputFilename ().c_str ());
+      if (!m_dlTxOutFile.is_open ())
         {
           NS_LOG_ERROR ("Can't open file " << GetDlTxOutputFilename ().c_str ());
           return;
         }
       m_dlTxFirstWrite = false;
-      outFile << "% time\tcellId\tIMSI\tRNTI\tlayer\tmcs\tsize\trv\tndi\tccId";
-      outFile << std::endl;
-    }
-  else
-    {
-      outFile.open (GetDlTxOutputFilename ().c_str (),  std::ios_base::app);
-      if (!outFile.is_open ())
-        {
-          NS_LOG_ERROR ("Can't open file " << GetDlTxOutputFilename ().c_str ());
-          return;
-        }
+      m_dlTxOutFile << "% time\tcellId\tIMSI\tRNTI\tlayer\tmcs\tsize\trv\tndi\tccId";
+      m_dlTxOutFile << "\n";
     }
 
-  outFile << params.m_timestamp << "\t";
-  outFile << (uint32_t) params.m_cellId << "\t";
-  outFile << params.m_imsi << "\t";
-  outFile << params.m_rnti << "\t";
-  //outFile << (uint32_t) params.m_txMode << "\t"; // txMode is not available at dl tx side
-  outFile << (uint32_t) params.m_layer << "\t";
-  outFile << (uint32_t) params.m_mcs << "\t";
-  outFile << params.m_size << "\t";
-  outFile << (uint32_t) params.m_rv << "\t";
-  outFile << (uint32_t) params.m_ndi << "\t";
-  outFile << (uint32_t) params.m_ccId << std::endl;
-  outFile.close ();
+  m_dlTxOutFile << params.m_timestamp << "\t";
+  m_dlTxOutFile << (uint32_t) params.m_cellId << "\t";
+  m_dlTxOutFile << params.m_imsi << "\t";
+  m_dlTxOutFile << params.m_rnti << "\t";
+  //m_dlTxOutFile << (uint32_t) params.m_txMode << "\t"; // txMode is not available at dl tx side
+  m_dlTxOutFile << (uint32_t) params.m_layer << "\t";
+  m_dlTxOutFile << (uint32_t) params.m_mcs << "\t";
+  m_dlTxOutFile << params.m_size << "\t";
+  m_dlTxOutFile << (uint32_t) params.m_rv << "\t";
+  m_dlTxOutFile << (uint32_t) params.m_ndi << "\t";
+  m_dlTxOutFile << (uint32_t) params.m_ccId << std::endl;
 }
 
 void
@@ -138,42 +135,31 @@
   NS_LOG_FUNCTION (this << params.m_cellId << params.m_imsi << params.m_timestamp << params.m_rnti << params.m_layer << params.m_mcs << params.m_size << params.m_rv << params.m_ndi);
   NS_LOG_INFO ("Write UL Tx Phy Stats in " << GetUlTxOutputFilename ().c_str ());
 
-  std::ofstream outFile;
   if ( m_ulTxFirstWrite == true )
     {
-      outFile.open (GetUlTxOutputFilename ().c_str ());
-      if (!outFile.is_open ())
+      m_ulTxOutFile.open (GetUlTxOutputFilename ().c_str ());
+      if (!m_ulTxOutFile.is_open ())
         {
           NS_LOG_ERROR ("Can't open file " << GetUlTxOutputFilename ().c_str ());
           return;
         }
       m_ulTxFirstWrite = false;
-//       outFile << "% time\tcellId\tIMSI\tRNTI\ttxMode\tlayer\tmcs\tsize\trv\tndi";
-      outFile << "% time\tcellId\tIMSI\tRNTI\tlayer\tmcs\tsize\trv\tndi\tccId";
-      outFile << std::endl;
-    }
-  else
-    {
-      outFile.open (GetUlTxOutputFilename ().c_str (),  std::ios_base::app);
-      if (!outFile.is_open ())
-        {
-          NS_LOG_ERROR ("Can't open file " << GetUlTxOutputFilename ().c_str ());
-          return;
-        }
+      //m_ulTxOutFile << "% time\tcellId\tIMSI\tRNTI\ttxMode\tlayer\tmcs\tsize\trv\tndi";
+      m_ulTxOutFile << "% time\tcellId\tIMSI\tRNTI\tlayer\tmcs\tsize\trv\tndi\tccId";
+      m_ulTxOutFile << "\n";
     }
 
-  outFile << params.m_timestamp << "\t";
-  outFile << (uint32_t) params.m_cellId << "\t";
-  outFile << params.m_imsi << "\t";
-  outFile << params.m_rnti << "\t";
-  //outFile << (uint32_t) params.m_txMode << "\t";
-  outFile << (uint32_t) params.m_layer << "\t";
-  outFile << (uint32_t) params.m_mcs << "\t";
-  outFile << params.m_size << "\t";
-  outFile << (uint32_t) params.m_rv << "\t";
-  outFile << (uint32_t) params.m_ndi << "\t";
-  outFile << (uint32_t) params.m_ccId << std::endl;
-  outFile.close ();
+  m_ulTxOutFile << params.m_timestamp << "\t";
+  m_ulTxOutFile << (uint32_t) params.m_cellId << "\t";
+  m_ulTxOutFile << params.m_imsi << "\t";
+  m_ulTxOutFile << params.m_rnti << "\t";
+  //m_ulTxOutFile << (uint32_t) params.m_txMode << "\t";
+  m_ulTxOutFile << (uint32_t) params.m_layer << "\t";
+  m_ulTxOutFile << (uint32_t) params.m_mcs << "\t";
+  m_ulTxOutFile << params.m_size << "\t";
+  m_ulTxOutFile << (uint32_t) params.m_rv << "\t";
+  m_ulTxOutFile << (uint32_t) params.m_ndi << "\t";
+  m_ulTxOutFile << (uint32_t) params.m_ccId << std::endl;
 }
 
 void
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/helper/phy-tx-stats-calculator.h ns-3.36/src/lte/helper/phy-tx-stats-calculator.h
--- ns-3.35/src/lte/helper/phy-tx-stats-calculator.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/helper/phy-tx-stats-calculator.h	2022-04-30 18:23:57.922733800 -0700
@@ -143,6 +143,15 @@
    */
   bool m_ulTxFirstWrite;
 
+  /**
+   * DL TX PHY statistics output trace file
+   */
+  std::ofstream m_dlTxOutFile;
+
+  /**
+   * UL TX PHY statistics output trace file
+   */
+  std::ofstream m_ulTxOutFile;
 };
 
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/helper/point-to-point-epc-helper.cc ns-3.36/src/lte/helper/point-to-point-epc-helper.cc
--- ns-3.35/src/lte/helper/point-to-point-epc-helper.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/helper/point-to-point-epc-helper.cc	2022-04-30 18:23:57.922733800 -0700
@@ -106,11 +106,11 @@
 
 
 void
-PointToPointEpcHelper::AddEnb (Ptr<Node> enb, Ptr<NetDevice> lteEnbNetDevice, uint16_t cellId)
+PointToPointEpcHelper::AddEnb (Ptr<Node> enb, Ptr<NetDevice> lteEnbNetDevice, std::vector<uint16_t> cellIds)
 {
-  NS_LOG_FUNCTION (this << enb << lteEnbNetDevice << cellId);
+  NS_LOG_FUNCTION (this << enb << lteEnbNetDevice << cellIds.size ());
 
-  NoBackhaulEpcHelper::AddEnb (enb, lteEnbNetDevice, cellId);
+  NoBackhaulEpcHelper::AddEnb (enb, lteEnbNetDevice, cellIds);
 
   // create a point to point link between the eNB and the SGW with
   // the corresponding new NetDevices on each side
@@ -135,7 +135,7 @@
   Ipv4Address enbS1uAddress = enbSgwIpIfaces.GetAddress (0);
   Ipv4Address sgwS1uAddress = enbSgwIpIfaces.GetAddress (1);
 
-  NoBackhaulEpcHelper::AddS1Interface (enb, enbS1uAddress, sgwS1uAddress, cellId);
+  NoBackhaulEpcHelper::AddS1Interface (enb, enbS1uAddress, sgwS1uAddress, cellIds);
 }
 
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/helper/point-to-point-epc-helper.h ns-3.36/src/lte/helper/point-to-point-epc-helper.h
--- ns-3.35/src/lte/helper/point-to-point-epc-helper.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/helper/point-to-point-epc-helper.h	2022-04-30 18:23:57.922733800 -0700
@@ -58,8 +58,7 @@
   virtual void DoDispose ();
 
   // inherited from EpcHelper
-  virtual void AddEnb (Ptr<Node> enbNode, Ptr<NetDevice> lteEnbNetDevice, uint16_t cellId);
-
+  virtual void AddEnb (Ptr<Node> enbNode, Ptr<NetDevice> lteEnbNetDevice, std::vector<uint16_t> cellIds);
 
 private:
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/model/a2-a4-rsrq-handover-algorithm.cc ns-3.36/src/lte/model/a2-a4-rsrq-handover-algorithm.cc
--- ns-3.35/src/lte/model/a2-a4-rsrq-handover-algorithm.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/model/a2-a4-rsrq-handover-algorithm.cc	2022-04-30 18:23:57.926733700 -0700
@@ -28,6 +28,7 @@
 #include "a2-a4-rsrq-handover-algorithm.h"
 #include <ns3/log.h>
 #include <ns3/uinteger.h>
+#include <algorithm>
 
 namespace ns3 {
 
@@ -42,9 +43,7 @@
 
 
 A2A4RsrqHandoverAlgorithm::A2A4RsrqHandoverAlgorithm ()
-  : m_a2MeasId (0),
-    m_a4MeasId (0),
-    m_servingCellThreshold (30),
+  : m_servingCellThreshold (30),
     m_neighbourCellOffset (1),
     m_handoverManagementSapUser (0)
 {
@@ -115,7 +114,7 @@
   reportConfigA2.threshold1.range = m_servingCellThreshold;
   reportConfigA2.triggerQuantity = LteRrcSap::ReportConfigEutra::RSRQ;
   reportConfigA2.reportInterval = LteRrcSap::ReportConfigEutra::MS240;
-  m_a2MeasId = m_handoverManagementSapUser->AddUeMeasReportConfigForHandover (reportConfigA2);
+  m_a2MeasIds = m_handoverManagementSapUser->AddUeMeasReportConfigForHandover (reportConfigA2);
 
   NS_LOG_LOGIC (this << " requesting Event A4 measurements"
                      << " (threshold=0)");
@@ -125,7 +124,7 @@
   reportConfigA4.threshold1.range = 0; // intentionally very low threshold
   reportConfigA4.triggerQuantity = LteRrcSap::ReportConfigEutra::RSRQ;
   reportConfigA4.reportInterval = LteRrcSap::ReportConfigEutra::MS480;
-  m_a4MeasId = m_handoverManagementSapUser->AddUeMeasReportConfigForHandover (reportConfigA4);
+  m_a4MeasIds = m_handoverManagementSapUser->AddUeMeasReportConfigForHandover (reportConfigA4);
 
   LteHandoverAlgorithm::DoInitialize ();
 }
@@ -145,13 +144,13 @@
 {
   NS_LOG_FUNCTION (this << rnti << (uint16_t) measResults.measId);
 
-  if (measResults.measId == m_a2MeasId)
+  if (std::find (begin (m_a2MeasIds), end (m_a2MeasIds), measResults.measId) != std::end (m_a2MeasIds))
     {
-      NS_ASSERT_MSG (measResults.rsrqResult <= m_servingCellThreshold,
+      NS_ASSERT_MSG (measResults.measResultPCell.rsrqResult <= m_servingCellThreshold,
                      "Invalid UE measurement report");
-      EvaluateHandover (rnti, measResults.rsrqResult);
+      EvaluateHandover (rnti, measResults.measResultPCell.rsrqResult);
     }
-  else if (measResults.measId == m_a4MeasId)
+  else if (std::find (begin (m_a4MeasIds), end (m_a4MeasIds), measResults.measId) != std::end (m_a4MeasIds))
     {
       if (measResults.haveMeasResultNeighCells
           && !measResults.measResultListEutra.empty ())
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/model/a2-a4-rsrq-handover-algorithm.h ns-3.36/src/lte/model/a2-a4-rsrq-handover-algorithm.h
--- ns-3.35/src/lte/model/a2-a4-rsrq-handover-algorithm.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/model/a2-a4-rsrq-handover-algorithm.h	2022-04-30 18:23:57.926733700 -0700
@@ -137,10 +137,10 @@
   void UpdateNeighbourMeasurements (uint16_t rnti, uint16_t cellId,
                                     uint8_t rsrq);
 
-  /// The expected measurement identity for A2 measurements.
-  uint8_t m_a2MeasId;
-  /// The expected measurement identity for A4 measurements.
-  uint8_t m_a4MeasId;
+  /// The expected measurement identities for A2 measurements.
+  std::vector<uint8_t> m_a2MeasIds;
+  /// The expected measurement identities for A4 measurements.
+  std::vector<uint8_t> m_a4MeasIds;
 
   /**
    * Measurements reported by a UE for a cell ID. The values are quantized
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/model/a3-rsrp-handover-algorithm.cc ns-3.36/src/lte/model/a3-rsrp-handover-algorithm.cc
--- ns-3.35/src/lte/model/a3-rsrp-handover-algorithm.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/model/a3-rsrp-handover-algorithm.cc	2022-04-30 18:23:57.926733700 -0700
@@ -23,6 +23,7 @@
 #include <ns3/log.h>
 #include <ns3/double.h>
 #include <ns3/lte-common.h>
+#include <algorithm>
 #include <list>
 
 namespace ns3 {
@@ -105,7 +106,7 @@
   reportConfig.reportOnLeave = false;
   reportConfig.triggerQuantity = LteRrcSap::ReportConfigEutra::RSRP;
   reportConfig.reportInterval = LteRrcSap::ReportConfigEutra::MS1024;
-  m_measId = m_handoverManagementSapUser->AddUeMeasReportConfigForHandover (reportConfig);
+  m_measIds = m_handoverManagementSapUser->AddUeMeasReportConfigForHandover (reportConfig);
 
   LteHandoverAlgorithm::DoInitialize ();
 }
@@ -125,53 +126,52 @@
 {
   NS_LOG_FUNCTION (this << rnti << (uint16_t) measResults.measId);
 
-  if (measResults.measId != m_measId)
+  if (std::find (begin (m_measIds), end (m_measIds), measResults.measId) == std::end (m_measIds))
     {
       NS_LOG_WARN ("Ignoring measId " << (uint16_t) measResults.measId);
+      return;
     }
-  else
+
+  if (measResults.haveMeasResultNeighCells
+      && !measResults.measResultListEutra.empty ())
     {
-      if (measResults.haveMeasResultNeighCells
-          && !measResults.measResultListEutra.empty ())
-        {
-          uint16_t bestNeighbourCellId = 0;
-          uint8_t bestNeighbourRsrp = 0;
+      uint16_t bestNeighbourCellId = 0;
+      uint8_t bestNeighbourRsrp = 0;
 
-          for (std::list <LteRrcSap::MeasResultEutra>::iterator it = measResults.measResultListEutra.begin ();
-               it != measResults.measResultListEutra.end ();
-               ++it)
+      for (std::list <LteRrcSap::MeasResultEutra>::iterator it = measResults.measResultListEutra.begin ();
+           it != measResults.measResultListEutra.end ();
+           ++it)
+        {
+          if (it->haveRsrpResult)
             {
-              if (it->haveRsrpResult)
-                {
-                  if ((bestNeighbourRsrp < it->rsrpResult)
-                      && IsValidNeighbour (it->physCellId))
-                    {
-                      bestNeighbourCellId = it->physCellId;
-                      bestNeighbourRsrp = it->rsrpResult;
-                    }
-                }
-              else
+              if ((bestNeighbourRsrp < it->rsrpResult)
+                  && IsValidNeighbour (it->physCellId))
                 {
-                  NS_LOG_WARN ("RSRP measurement is missing from cell ID " << it->physCellId);
+                  bestNeighbourCellId = it->physCellId;
+                  bestNeighbourRsrp = it->rsrpResult;
                 }
             }
-
-          if (bestNeighbourCellId > 0)
+          else
             {
-              NS_LOG_LOGIC ("Trigger Handover to cellId " << bestNeighbourCellId);
-              NS_LOG_LOGIC ("target cell RSRP " << (uint16_t) bestNeighbourRsrp);
-              NS_LOG_LOGIC ("serving cell RSRP " << (uint16_t) measResults.rsrpResult);
-
-              // Inform eNodeB RRC about handover
-              m_handoverManagementSapUser->TriggerHandover (rnti,
-                                                            bestNeighbourCellId);
+              NS_LOG_WARN ("RSRP measurement is missing from cell ID " << it->physCellId);
             }
         }
-      else
+
+      if (bestNeighbourCellId > 0)
         {
-          NS_LOG_WARN (this << " Event A3 received without measurement results from neighbouring cells");
+          NS_LOG_LOGIC ("Trigger Handover to cellId " << bestNeighbourCellId);
+          NS_LOG_LOGIC ("target cell RSRP " << (uint16_t) bestNeighbourRsrp);
+          NS_LOG_LOGIC ("serving cell RSRP " << (uint16_t) measResults.measResultPCell.rsrpResult);
+
+          // Inform eNodeB RRC about handover
+          m_handoverManagementSapUser->TriggerHandover (rnti,
+                                                        bestNeighbourCellId);
         }
-    } // end of else of if (measResults.measId != m_measId)
+    }
+  else
+    {
+      NS_LOG_WARN (this << " Event A3 received without measurement results from neighbouring cells");
+    }
 
 } // end of DoReportUeMeas
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/model/a3-rsrp-handover-algorithm.h ns-3.36/src/lte/model/a3-rsrp-handover-algorithm.h
--- ns-3.35/src/lte/model/a3-rsrp-handover-algorithm.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/model/a3-rsrp-handover-algorithm.h	2022-04-30 18:23:57.926733700 -0700
@@ -102,7 +102,7 @@
   bool IsValidNeighbour (uint16_t cellId);
 
   /// The expected measurement identity for A3 measurements.
-  uint8_t m_measId;
+  std::vector<uint8_t> m_measIds;
 
   /**
    * The `Hysteresis` attribute. Handover margin (hysteresis) in dB (rounded to
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/model/epc-enb-application.h ns-3.36/src/lte/model/epc-enb-application.h
--- ns-3.35/src/lte/model/epc-enb-application.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/model/epc-enb-application.h	2022-04-30 18:23:57.926733700 -0700
@@ -84,7 +84,7 @@
    * \param enbS1uAddress the IPv4 address of the S1-U interface of this eNB
    * \param sgwS1uAddress the IPv4 address at which this eNB will be able to reach its SGW for S1-U communications
    */
-  void AddS1Interface (Ptr<Socket> s1uSocket, Ipv4Address enbAddress, Ipv4Address sgwAddress);
+  void AddS1Interface (Ptr<Socket> s1uSocket, Ipv4Address enbS1uAddress, Ipv4Address sgwS1uAddress);
 
 
   /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/model/epc-gtpc-header.h ns-3.36/src/lte/model/epc-gtpc-header.h
--- ns-3.35/src/lte/model/epc-gtpc-header.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/model/epc-gtpc-header.h	2022-04-30 18:23:57.926733700 -0700
@@ -51,6 +51,13 @@
   virtual uint32_t Deserialize (Buffer::Iterator start);
   virtual void Print (std::ostream &os) const;
 
+  /**
+   * Get the message size.
+   * 
+   * Subclasses are supposed to have a message size greater than zero.
+   * 
+   * \returns the message size
+   */
   virtual uint32_t GetMessageSize (void) const;
 
   /**
@@ -100,6 +107,9 @@
    */
   void SetIesLength (uint16_t iesLength);
 
+  /**
+   * Compute the message length according to the message type
+   */
   void ComputeMessageLength (void);
 
   /// Interface Type enumeration
@@ -116,9 +126,9 @@
   /// FTEID structure
   struct Fteid_t
   {
-    InterfaceType_t interfaceType;
-    Ipv4Address addr;
-    uint32_t teid;
+    InterfaceType_t interfaceType; //!< Interface type
+    Ipv4Address addr; //!< IPv4 address
+    uint32_t teid; //!< TEID
   };
 
   /// Message Type enumeration
@@ -173,61 +183,178 @@
   /**
    * Deserialize the GTP-C header in the GTP-C messages
    * \param i the buffer iterator
+   * \return number of bytes deserialized
    */
   uint32_t PreDeserialize (Buffer::Iterator &i);
 
 };
 
-
+/**
+ * \ingroup lte
+ * GTP-C Information Elemements
+ */
 class GtpcIes
 {
 public:
+  /**
+   * Cause
+   */
   enum Cause_t
   {
     RESERVED          = 0,
     REQUEST_ACCEPTED  = 16,
   };
 
-  const uint32_t serializedSizeImsi = 12;
-  const uint32_t serializedSizeCause = 6;
-  const uint32_t serializedSizeEbi = 5;
-  const uint32_t serializedSizeBearerQos = 26;
-  const uint32_t serializedSizePacketFilter = 3 + 9 + 9 + 5 + 5 + 3;
+  const uint32_t serializedSizeImsi = 12; //!< IMSI serialized size
+  const uint32_t serializedSizeCause = 6; //!< Cause serialized size
+  const uint32_t serializedSizeEbi = 5;   //!< EBI serialized size
+  const uint32_t serializedSizeBearerQos = 26;  //!< Bearer QoS serialized size
+  const uint32_t serializedSizePacketFilter = 3 + 9 + 9 + 5 + 5 + 3; //!< Packet filter serialized size
+  /**
+   * \return the BearerTft serialized size
+   * \param packetFilters The packet filter
+   */
   uint32_t GetSerializedSizeBearerTft (std::list<EpcTft::PacketFilter> packetFilters) const;
-  const uint32_t serializedSizeUliEcgi = 12;
-  const uint32_t serializedSizeFteid = 13;
-  const uint32_t serializedSizeBearerContextHeader = 4;
-
+  const uint32_t serializedSizeUliEcgi = 12; //!< UliEcgi serialized size
+  const uint32_t serializedSizeFteid = 13;   //!< Fteid serialized size
+  const uint32_t serializedSizeBearerContextHeader = 4;  //!< Fteid serialized size
 
+  /**
+   * Serialize the IMSI
+   * \param i Buffer iterator 
+   * \param imsi The IMSI
+   */
   void SerializeImsi (Buffer::Iterator &i, uint64_t imsi) const;
+  /**
+   * Deserialize the IMSI
+   * \param i Buffer iterator 
+   * \param [out] imsi The IMSI
+   * \return the number of deserialized bytes
+   */
   uint32_t DeserializeImsi (Buffer::Iterator &i, uint64_t &imsi);
 
+  /**
+   * Serialize the Cause
+   * \param i Buffer iterator 
+   * \param cause The Cause
+   */
   void SerializeCause (Buffer::Iterator &i, Cause_t cause) const;
-  uint32_t DeserializeCause (Buffer::Iterator &i, Cause_t &cause);
+  /**
+   * Deserialize the Cause
+   * \param i Buffer iterator 
+   * \param [out] cause The cause
+   * \return the number of deserialized bytes
+   */
+   uint32_t DeserializeCause (Buffer::Iterator &i, Cause_t &cause);
 
+  /**
+   * Serialize the eps Bearer Id
+   * \param i Buffer iterator 
+   * \param  epsBearerId The eps Bearer Id
+   */
   void SerializeEbi (Buffer::Iterator &i, uint8_t epsBearerId) const;
+  /**
+   * Deserialize the eps Bearer Id
+   * \param i Buffer iterator 
+   * \param [out] epsBearerId The eps Bearer Id
+   * \return the number of deserialized bytes
+   */
   uint32_t DeserializeEbi (Buffer::Iterator &i, uint8_t &epsBearerId);
 
+  /**
+   * \param i Buffer iterator 
+   * \param data data to write in buffer
+   *
+   * Write the data in buffer and advance the iterator position
+   * by five bytes. The data is written in network order and the
+   * input data is expected to be in host order.
+   */
   void WriteHtonU40 (Buffer::Iterator &i, uint64_t data) const;
+  /**
+   * \param i Buffer iterator 
+   * \return the five bytes read in the buffer.
+   *
+   * Read data and advance the Iterator by the number of bytes
+   * read.
+   * The data is read in network format and returned in host format.
+   */
   uint64_t ReadNtohU40 (Buffer::Iterator &i);
 
+  /**
+   * Serialize the eps Bearer QoS
+   * \param i Buffer iterator 
+   * \param bearerQos The Bearer QoS
+   */
   void SerializeBearerQos (Buffer::Iterator &i, EpsBearer bearerQos) const;
+  /**
+   * Deserialize the eps Bearer QoS
+   * \param i Buffer iterator 
+   * \param [out] bearerQos The Bearer QoS
+   * \return the number of deserialized bytes
+   */
   uint32_t DeserializeBearerQos (Buffer::Iterator &i, EpsBearer &bearerQos);
 
+  /**
+   * Serialize the Bearer TFT
+   * \param i Buffer iterator 
+   * \param packetFilters The Packet filters
+   */
   void SerializeBearerTft (Buffer::Iterator &i, std::list<EpcTft::PacketFilter> packetFilters) const;
+  /**
+   * Deserialize the Bearer TFT
+   * \param i Buffer iterator 
+   * \param [out] epcTft The Bearer TFT
+   * \return the number of deserialized bytes
+   */
   uint32_t DeserializeBearerTft (Buffer::Iterator &i, Ptr<EpcTft> epcTft);
 
+  /**
+   * Serialize the UliEcgi
+   * \param i Buffer iterator 
+   * \param uliEcgi The UliEcgi
+   */
   void SerializeUliEcgi (Buffer::Iterator &i, uint32_t uliEcgi) const;
+  /**
+   * Deserialize the UliEcgi
+   * \param i Buffer iterator 
+   * \param [out] uliEcgi UliEcgi
+   * \return the number of deserialized bytes
+   */
   uint32_t DeserializeUliEcgi (Buffer::Iterator &i, uint32_t &uliEcgi);
 
+  /**
+   * Serialize the Fteid_t
+   * \param i Buffer iterator 
+   * \param fteid The Fteid_t
+   */
   void SerializeFteid (Buffer::Iterator &i, GtpcHeader::Fteid_t fteid) const;
+  /**
+   * Deserialize the Fteid
+   * \param i Buffer iterator 
+   * \param [out] fteid Fteid
+   * \return the number of deserialized bytes
+   */
   uint32_t DeserializeFteid (Buffer::Iterator &i, GtpcHeader::Fteid_t &fteid);
 
+  /**
+   * Serialize the Bearer Context Header
+   * \param i Buffer iterator 
+   * \param length The length
+   */
   void SerializeBearerContextHeader (Buffer::Iterator &i, uint16_t length) const;
+  /**
+   * Deserialize the Bearer Context Header
+   * \param i Buffer iterator 
+   * \param [out] length length
+   * \return the number of deserialized bytes
+   */
   uint32_t DeserializeBearerContextHeader (Buffer::Iterator &i, uint16_t &length);
 };
 
-
+/**
+ * \ingroup lte
+ * GTP-C Create Session Request Message
+ */
 class GtpcCreateSessionRequestMessage : public GtpcHeader, public GtpcIes
 {
 public:
@@ -245,15 +372,42 @@
   virtual void Print (std::ostream &os) const;
   virtual uint32_t GetMessageSize (void) const;
 
+  /**
+   * Get the IMSI
+   * \return IMSI
+   */
   uint64_t GetImsi () const;
+  /**
+   * Set the IMSI
+   * \param imsi IMSI
+   */
   void SetImsi (uint64_t imsi);
 
+  /**
+   * Get the UliEcgi
+   * \return UliEcgi
+   */
   uint32_t GetUliEcgi () const;
+  /**
+   * Set the UliEcgi
+   * \param uliEcgi UliEcgi
+   */
   void SetUliEcgi (uint32_t uliEcgi);
 
+  /**
+   * Get the Sender CpFteid
+   * \return Sender CpFteid
+   */
   GtpcHeader::Fteid_t GetSenderCpFteid () const;
+  /**
+   * Set the Sender CpFteid
+   * \param fteid Sender CpFteid
+   */
   void SetSenderCpFteid (GtpcHeader::Fteid_t fteid);
 
+  /**
+   * Bearer Context structure
+   */
   struct BearerContextToBeCreated
   {
     GtpcHeader::Fteid_t sgwS5uFteid; ///< FTEID
@@ -262,18 +416,30 @@
     EpsBearer bearerLevelQos; ///< bearer QOS level
   };
 
+  /**
+   * Get the Bearer Contexts
+   * \return the Bearer Context list
+   */
   std::list<BearerContextToBeCreated> GetBearerContextsToBeCreated () const;
+  /**
+   * Set the Bearer Contexts
+   * \param bearerContexts the Bearer Context list
+   */
   void SetBearerContextsToBeCreated (std::list<BearerContextToBeCreated> bearerContexts);
 
 private:
-  uint64_t m_imsi;
-  uint32_t m_uliEcgi;
-  GtpcHeader::Fteid_t m_senderCpFteid;
+  uint64_t m_imsi; //!< IMSI
+  uint32_t m_uliEcgi; //!< UliEcgi
+  GtpcHeader::Fteid_t m_senderCpFteid; //!< Sender CpFteid
 
+  /// Bearer Context list
   std::list<BearerContextToBeCreated> m_bearerContextsToBeCreated;
 };
 
-
+/**
+ * \ingroup lte
+ * GTP-C Create Session Response Message
+ */
 class GtpcCreateSessionResponseMessage : public GtpcHeader, public GtpcIes
 {
 public:
@@ -291,12 +457,31 @@
   virtual void Print (std::ostream &os) const;
   virtual uint32_t GetMessageSize (void) const;
 
+  /**
+   * Get the Cause
+   * \return the Cause
+   */
   Cause_t GetCause () const;
+  /**
+   * Set the Cause
+   * \param cause The cause
+   */
   void SetCause (Cause_t cause);
 
+  /**
+   * Get the Sender CpFteid
+   * \return the Sender CpFteid
+   */
   GtpcHeader::Fteid_t GetSenderCpFteid () const;
+  /**
+   * Set the Sender CpFteid
+   * \param fteid the Sender CpFteid
+   */
   void SetSenderCpFteid (GtpcHeader::Fteid_t fteid);
 
+  /**
+   * Bearer Context structure
+   */
   struct BearerContextCreated
   {
     uint8_t epsBearerId; ///< EPS bearer ID
@@ -306,17 +491,29 @@
     EpsBearer bearerLevelQos; ///< Bearer QOS level
   };
 
+  /**
+   * Get the Container of Bearer Contexts
+   * \return a list of Bearer Contexts
+   */
   std::list<BearerContextCreated> GetBearerContextsCreated () const;
+  /**
+   * Set the Bearer Contexts
+   * \param bearerContexts a list of Bearer Contexts
+   */
   void SetBearerContextsCreated (std::list<BearerContextCreated> bearerContexts);
 
 private:
-  Cause_t m_cause;
-  GtpcHeader::Fteid_t m_senderCpFteid;
-
+  Cause_t m_cause; //!< Cause
+  GtpcHeader::Fteid_t m_senderCpFteid; //!< Sender CpFteid
+  /// Container of Bearer Contexts
   std::list<BearerContextCreated> m_bearerContextsCreated;
 };
 
 
+/**
+ * \ingroup lte
+ * GTP-C Modify Bearer Request Message
+ */
 class GtpcModifyBearerRequestMessage : public GtpcHeader, public GtpcIes
 {
 public:
@@ -334,29 +531,60 @@
   virtual void Print (std::ostream &os) const;
   virtual uint32_t GetMessageSize (void) const;
 
+  /**
+   * Get the IMSI
+   * \return IMSI
+   */
   uint64_t GetImsi () const;
+  /**
+   * Set the IMSI
+   * \param imsi IMSI
+   */
   void SetImsi (uint64_t imsi);
 
+  /**
+   * Get the UliEcgi
+   * \return UliEcgi
+   */
   uint32_t GetUliEcgi () const;
+  /**
+   * Set the UliEcgi
+   * \param uliEcgi UliEcgi
+   */
   void SetUliEcgi (uint32_t uliEcgi);
 
+  /**
+   * Bearer Context structure
+   */
   struct BearerContextToBeModified
   {
     uint8_t epsBearerId; ///< EPS bearer ID
     GtpcHeader::Fteid_t fteid; ///< FTEID
   };
 
+  /**
+   * Get the Bearer Contexts
+   * \return the Bearer Context list
+   */
   std::list<BearerContextToBeModified> GetBearerContextsToBeModified () const;
+  /**
+   * Set the Bearer Contexts
+   * \param bearerContexts the Bearer Context list
+   */
   void SetBearerContextsToBeModified (std::list<BearerContextToBeModified> bearerContexts);
 
 private:
-  uint64_t m_imsi;
-  uint32_t m_uliEcgi;
+  uint64_t m_imsi;     //!< IMSI
+  uint32_t m_uliEcgi;  //!< UliEcgi
 
+  /// Bearer Context list
   std::list<BearerContextToBeModified> m_bearerContextsToBeModified;
 };
 
-
+/**
+ * \ingroup lte
+ * GTP-C Modify Bearer Response Message
+ */
 class GtpcModifyBearerResponseMessage : public GtpcHeader, public GtpcIes
 {
 public:
@@ -374,14 +602,25 @@
   virtual void Print (std::ostream &os) const;
   virtual uint32_t GetMessageSize (void) const;
 
+  /**
+   * Get the Cause
+   * \return the Cause
+   */
   Cause_t GetCause () const;
+  /**
+   * Set the Cause
+   * \param cause The cause
+   */
   void SetCause (Cause_t cause);
 
 private:
-  Cause_t m_cause;
+  Cause_t m_cause; //!< Cause
 };
 
-
+/**
+ * \ingroup lte
+ * GTP-C Delete Bearer Command Message
+ */
 class GtpcDeleteBearerCommandMessage : public GtpcHeader, public GtpcIes
 {
 public:
@@ -399,19 +638,31 @@
   virtual void Print (std::ostream &os) const;
   virtual uint32_t GetMessageSize (void) const;
 
+  /// Bearer context
   struct BearerContext
   {
     uint8_t m_epsBearerId; ///< EPS bearer ID
   };
 
+  /**
+   * Get the Bearer contexts
+   * \return container of beraer contexts
+   */
   std::list<BearerContext> GetBearerContexts () const;
+  /**
+   * Set the Bearer contexts
+   * \param bearerContexts container of beraer contexts
+   */
   void SetBearerContexts (std::list<BearerContext> bearerContexts);
 
 private:
-  std::list<BearerContext> m_bearerContexts;
+  std::list<BearerContext> m_bearerContexts; //!< Container of Bearer Contexts
 };
 
-
+/**
+ * \ingroup lte
+ * GTP-C Delete Bearer Request Message
+ */
 class GtpcDeleteBearerRequestMessage : public GtpcHeader, public GtpcIes
 {
 public:
@@ -429,14 +680,25 @@
   virtual void Print (std::ostream &os) const;
   virtual uint32_t GetMessageSize (void) const;
 
+  /**
+   * Get the Bearers IDs
+   * \return a container of Bearers IDs
+   */
   std::list<uint8_t> GetEpsBearerIds () const;
+  /**
+   * Set the Bearers IDs
+   * \param epsBearerIds The container of Bearers IDs
+   */
   void SetEpsBearerIds (std::list<uint8_t> epsBearerIds);
 
 private:
-  std::list<uint8_t> m_epsBearerIds;
+  std::list<uint8_t> m_epsBearerIds; //!< Container of Bearers IDs
 };
 
-
+/**
+ * \ingroup lte
+ * GTP-C Delete Bearer Response Message
+ */
 class GtpcDeleteBearerResponseMessage : public GtpcHeader, public GtpcIes
 {
 public:
@@ -454,15 +716,31 @@
   virtual void Print (std::ostream &os) const;
   virtual uint32_t GetMessageSize (void) const;
 
+  /**
+   * Get the Cause
+   * \return the Cause
+   */
   Cause_t GetCause () const;
+  /**
+   * Set the Cause
+   * \param cause The cause
+   */
   void SetCause (Cause_t cause);
 
+  /**
+   * Get the Bearers IDs
+   * \return a container of Bearers IDs
+   */
   std::list<uint8_t> GetEpsBearerIds () const;
+  /**
+   * Set the Bearers IDs
+   * \param epsBearerIds The container of Bearers IDs
+   */
   void SetEpsBearerIds (std::list<uint8_t> epsBearerIds);
 
 private:
-  Cause_t m_cause;
-  std::list<uint8_t> m_epsBearerIds;
+  Cause_t m_cause; //!< Cause
+  std::list<uint8_t> m_epsBearerIds; //!< Container of Bearers IDs
 };
 
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/model/epc-s1ap-sap.h ns-3.36/src/lte/model/epc-s1ap-sap.h
--- ns-3.35/src/lte/model/epc-s1ap-sap.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/model/epc-s1ap-sap.h	2022-04-30 18:23:57.926733700 -0700
@@ -75,11 +75,13 @@
   };
 
   /**
-    * \brief As per 3GPP TS 23.401 Release 9 V9.5.0 Figure 5.4.4.2-1  eNB sends indication of Bearer Release to MME
-    * \brief As per 3GPP TS version 9.8.0 section 8.2.3.2.2, the eNB initiates the procedure by sending an E-RAB RELEASE INDICATION message towards MME
+    * \brief As per 3GPP TS 36.413 version 9.8.0 section 8.2.3.2.2, the eNB
+    * indicates bearer release by sending an E-RAB RELEASE INDICATION message
+    * towards MME
+    *
     * \param mmeUeS1Id in practice, we use the IMSI
     * \param enbUeS1Id in practice, we use the RNTI
-    * \param erabToBeReleaseIndication, List of bearers to be deactivated
+    * \param erabToBeReleaseIndication List of bearers to be deactivated
     *
     */
   virtual void ErabReleaseIndication (uint64_t mmeUeS1Id, uint16_t enbUeS1Id, std::list<ErabToBeReleasedIndication> erabToBeReleaseIndication ) = 0;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/model/epc-tft.h ns-3.36/src/lte/model/epc-tft.h
--- ns-3.35/src/lte/model/epc-tft.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/model/epc-tft.h	2022-04-30 18:23:57.926733700 -0700
@@ -194,7 +194,10 @@
 		  uint16_t localPort,
 		  uint8_t typeOfService);
 
-
+  /**
+   * Get the packet filters
+   * \return a containter of packet filters
+   */
   std::list<PacketFilter> GetPacketFilters () const;
 
 private:
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/model/epc-x2.cc ns-3.36/src/lte/model/epc-x2.cc
--- ns-3.35/src/lte/model/epc-x2.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/model/epc-x2.cc	2022-04-30 18:23:57.926733700 -0700
@@ -56,24 +56,22 @@
 
 ///////////////////////////////////////////
 
-X2CellInfo::X2CellInfo (uint16_t localCellId, uint16_t remoteCellId)
+X2CellInfo::X2CellInfo (std::vector<uint16_t> localCellIds, std::vector<uint16_t> remoteCellIds) :
+  m_localCellIds {localCellIds},
+  m_remoteCellIds {remoteCellIds}
 {
-  m_localCellId = localCellId;
-  m_remoteCellId = remoteCellId;
 }
 
 X2CellInfo::~X2CellInfo (void)
 {
-  m_localCellId = 0;
-  m_remoteCellId = 0;
 }
 
 X2CellInfo& 
 X2CellInfo::operator= (const X2CellInfo& value)
 {
   NS_LOG_FUNCTION (this);
-  m_localCellId = value.m_localCellId;
-  m_remoteCellId = value.m_remoteCellId;
+  m_localCellIds = value.m_localCellIds;
+  m_remoteCellIds = value.m_remoteCellIds;
   return *this;
 }
 
@@ -130,8 +128,9 @@
 
 
 void
-EpcX2::AddX2Interface (uint16_t localCellId, Ipv4Address localX2Address, uint16_t remoteCellId, Ipv4Address remoteX2Address)
+EpcX2::AddX2Interface (uint16_t localCellId, Ipv4Address localX2Address, std::vector<uint16_t> remoteCellIds, Ipv4Address remoteX2Address)
 {
+  uint16_t remoteCellId = remoteCellIds.at (0);
   NS_LOG_FUNCTION (this << localCellId << localX2Address << remoteCellId << remoteX2Address);
 
   int retval;
@@ -151,18 +150,23 @@
   NS_ASSERT (retval == 0);
   localX2uSocket->SetRecvCallback (MakeCallback (&EpcX2::RecvFromX2uSocket, this));
 
+  std::vector<uint16_t> localCellIds;
+  localCellIds.push_back (localCellId);
 
   NS_ASSERT_MSG (m_x2InterfaceSockets.find (remoteCellId) == m_x2InterfaceSockets.end (),
                  "Mapping for remoteCellId = " << remoteCellId << " is already known");
-  m_x2InterfaceSockets [remoteCellId] = Create<X2IfaceInfo> (remoteX2Address, localX2cSocket, localX2uSocket);
+  for (uint16_t remoteCellId: remoteCellIds)
+    {
+      m_x2InterfaceSockets [remoteCellId] = Create<X2IfaceInfo> (remoteX2Address, localX2cSocket, localX2uSocket);
+    }
 
   NS_ASSERT_MSG (m_x2InterfaceCellIds.find (localX2cSocket) == m_x2InterfaceCellIds.end (),
                  "Mapping for control plane localSocket = " << localX2cSocket << " is already known");
-  m_x2InterfaceCellIds [localX2cSocket] = Create<X2CellInfo> (localCellId, remoteCellId);
+  m_x2InterfaceCellIds [localX2cSocket] = Create<X2CellInfo> (localCellIds, remoteCellIds);
 
   NS_ASSERT_MSG (m_x2InterfaceCellIds.find (localX2uSocket) == m_x2InterfaceCellIds.end (),
                  "Mapping for data plane localSocket = " << localX2uSocket << " is already known");
-  m_x2InterfaceCellIds [localX2uSocket] = Create<X2CellInfo> (localCellId, remoteCellId);
+  m_x2InterfaceCellIds [localX2uSocket] = Create<X2CellInfo> (localCellIds, remoteCellIds);
 }
 
 
@@ -201,7 +205,7 @@
           EpcX2SapUser::HandoverRequestParams params;
           params.oldEnbUeX2apId = x2HoReqHeader.GetOldEnbUeX2apId ();
           params.cause          = x2HoReqHeader.GetCause ();
-          params.sourceCellId   = cellsInfo->m_remoteCellId;
+          params.sourceCellId   = cellsInfo->m_remoteCellIds.at (0);
           params.targetCellId   = x2HoReqHeader.GetTargetCellId ();
           params.mmeUeS1apId    = x2HoReqHeader.GetMmeUeS1apId ();
           params.ueAggregateMaxBitRateDownlink = x2HoReqHeader.GetUeAggregateMaxBitRateDownlink ();
@@ -213,9 +217,7 @@
           NS_LOG_LOGIC ("sourceCellId = " << params.sourceCellId);
           NS_LOG_LOGIC ("targetCellId = " << params.targetCellId);
           NS_LOG_LOGIC ("mmeUeS1apId = " << params.mmeUeS1apId);
-          NS_LOG_LOGIC ("cellsInfo->m_localCellId = " << cellsInfo->m_localCellId);
-          NS_ASSERT_MSG (params.targetCellId == cellsInfo->m_localCellId,
-                         "TargetCellId mismatches with localCellId");
+          NS_LOG_LOGIC ("cellsInfo->m_localCellId = " << cellsInfo->m_localCellIds.at (0));
 
           m_x2SapUser->RecvHandoverRequest (params);
         }
@@ -231,8 +233,8 @@
           EpcX2SapUser::HandoverRequestAckParams params;          
           params.oldEnbUeX2apId = x2HoReqAckHeader.GetOldEnbUeX2apId ();
           params.newEnbUeX2apId = x2HoReqAckHeader.GetNewEnbUeX2apId ();
-          params.sourceCellId   = cellsInfo->m_localCellId;
-          params.targetCellId   = cellsInfo->m_remoteCellId;
+          params.sourceCellId   = cellsInfo->m_localCellIds.at (0);
+          params.targetCellId   = cellsInfo->m_remoteCellIds.at (0);
           params.admittedBearers = x2HoReqAckHeader.GetAdmittedBearers ();
           params.notAdmittedBearers = x2HoReqAckHeader.GetNotAdmittedBearers ();
           params.rrcContext     = packet;
@@ -255,8 +257,8 @@
 
           EpcX2SapUser::HandoverPreparationFailureParams params;          
           params.oldEnbUeX2apId = x2HoPrepFailHeader.GetOldEnbUeX2apId ();
-          params.sourceCellId   = cellsInfo->m_localCellId;
-          params.targetCellId   = cellsInfo->m_remoteCellId;
+          params.sourceCellId   = cellsInfo->m_localCellIds.at (0);
+          params.targetCellId   = cellsInfo->m_remoteCellIds.at (0);
           params.cause          = x2HoPrepFailHeader.GetCause ();
           params.criticalityDiagnostics = x2HoPrepFailHeader.GetCriticalityDiagnostics ();
 
@@ -302,8 +304,8 @@
             EpcX2SapUser::SnStatusTransferParams params;
             params.oldEnbUeX2apId = x2SnStatusXferHeader.GetOldEnbUeX2apId ();
             params.newEnbUeX2apId = x2SnStatusXferHeader.GetNewEnbUeX2apId ();
-            params.sourceCellId   = cellsInfo->m_remoteCellId;
-            params.targetCellId   = cellsInfo->m_localCellId;
+            params.sourceCellId   = cellsInfo->m_remoteCellIds.at (0);
+            params.targetCellId   = cellsInfo->m_localCellIds.at (0);
             params.erabsSubjectToStatusTransferList = x2SnStatusXferHeader.GetErabsSubjectToStatusTransferList ();
 
             NS_LOG_LOGIC ("oldEnbUeX2apId = " << params.oldEnbUeX2apId);
@@ -386,8 +388,8 @@
   NS_LOG_LOGIC ("GTP-U header: " << gtpu);
 
   EpcX2SapUser::UeDataParams params;
-  params.sourceCellId = cellsInfo->m_remoteCellId;
-  params.targetCellId = cellsInfo->m_localCellId;
+  params.sourceCellId = cellsInfo->m_remoteCellIds.at (0);
+  params.targetCellId = cellsInfo->m_localCellIds.at (0);
   params.gtpTeid = gtpu.GetTeid ();
   params.ueData = packet;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/model/epc-x2.h ns-3.36/src/lte/model/epc-x2.h
--- ns-3.35/src/lte/model/epc-x2.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/model/epc-x2.h	2022-04-30 18:23:57.926733700 -0700
@@ -51,10 +51,10 @@
 
   /**
    * Assignment operator
-   *
+   * \param value value to assign
    * \returns X2IfaceInfo& 
    */
-  X2IfaceInfo& operator= (const X2IfaceInfo &);
+  X2IfaceInfo& operator= (const X2IfaceInfo &value);
 
 public:
   Ipv4Address   m_remoteIpAddr; ///< remote IP address
@@ -72,22 +72,22 @@
   /**
    * Constructor
    *
-   * \param localCellId local cell ID
-   * \param remoteCellId remote cell ID
+   * \param localCellIds local cell IDs
+   * \param remoteCellIds remote cell IDs
    */
-  X2CellInfo (uint16_t localCellId, uint16_t remoteCellId);
+  X2CellInfo (std::vector<uint16_t> localCellIds, std::vector<uint16_t> remoteCellIds);
   virtual ~X2CellInfo (void);
 
   /**
    * Assignment operator
-   *
+   * \param value value to assign
    * \returns X2CellInfo&  
    */
-  X2CellInfo& operator= (const X2CellInfo &);
+  X2CellInfo& operator= (const X2CellInfo &value);
 
 public:
-  uint16_t m_localCellId; ///< local cell ID
-  uint16_t m_remoteCellId; ///< remote cell ID
+  std::vector<uint16_t> m_localCellIds; ///< local cell IDs
+  std::vector<uint16_t> m_remoteCellIds; ///< remote cell IDs
 };
 
 
@@ -135,11 +135,11 @@
    * Add an X2 interface to this EPC X2 entity
    * \param enb1CellId the cell ID of the current eNodeB
    * \param enb1X2Address the address of the current eNodeB
-   * \param enb2CellId the cell ID of the neighbouring eNodeB
+   * \param enb2CellIds the cell IDs of the neighbouring eNodeB
    * \param enb2X2Address the address of the neighbouring eNodeB
    */
   void AddX2Interface (uint16_t enb1CellId, Ipv4Address enb1X2Address,
-                       uint16_t enb2CellId, Ipv4Address enb2X2Address);
+                       std::vector<uint16_t> enb2CellIds, Ipv4Address enb2X2Address);
 
 
   /** 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/model/fdmt-ff-mac-scheduler.cc ns-3.36/src/lte/model/fdmt-ff-mac-scheduler.cc
--- ns-3.35/src/lte/model/fdmt-ff-mac-scheduler.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/model/fdmt-ff-mac-scheduler.cc	2022-04-30 18:23:58.030734300 -0700
@@ -1041,14 +1041,12 @@
         {
           NS_LOG_INFO (this << " Layer " << (uint16_t)j << " CQI selected " << (uint16_t)worstCqi.at (j));
         }
-      uint32_t bytesTxed = 0;
       for (uint8_t j = 0; j < nLayer; j++)
         {
           newDci.m_mcs.push_back (m_amc->GetMcsFromCqi (worstCqi.at (j)));
           int tbSize = (m_amc->GetDlTbSizeFromMcs (newDci.m_mcs.at (j), RgbPerRnti * rbgSize) / 8); // (size of TB in bytes according to table 7.1.7.2.1-1 of 36.213)
           newDci.m_tbsSize.push_back (tbSize);
           NS_LOG_INFO (this << " Layer " << (uint16_t)j << " MCS selected" << m_amc->GetMcsFromCqi (worstCqi.at (j)));
-          bytesTxed += tbSize;
         }
 
       newDci.m_resAlloc = 0;  // only allocation type 0 at this stage
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/model/fdtbfq-ff-mac-scheduler.cc ns-3.36/src/lte/model/fdtbfq-ff-mac-scheduler.cc
--- ns-3.35/src/lte/model/fdtbfq-ff-mac-scheduler.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/model/fdtbfq-ff-mac-scheduler.cc	2022-04-30 18:23:58.030734300 -0700
@@ -1414,14 +1414,12 @@
         {
           NS_LOG_INFO (this << " Layer " << (uint16_t)j << " CQI selected " << (uint16_t)worstCqi.at (j));
         }
-      uint32_t bytesTxed = 0;
       for (uint8_t j = 0; j < nLayer; j++)
         {
           newDci.m_mcs.push_back (m_amc->GetMcsFromCqi (worstCqi.at (j)));
           int tbSize = (m_amc->GetDlTbSizeFromMcs (newDci.m_mcs.at (j), RgbPerRnti * rbgSize) / 8); // (size of TB in bytes according to table 7.1.7.2.1-1 of 36.213)
           newDci.m_tbsSize.push_back (tbSize);
           NS_LOG_INFO (this << " Layer " << (uint16_t)j << " MCS selected" << (uint16_t) m_amc->GetMcsFromCqi (worstCqi.at (j)));
-          bytesTxed += tbSize;
         }
 
       newDci.m_resAlloc = 0;  // only allocation type 0 at this stage
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/model/lte-asn1-header.cc ns-3.36/src/lte/model/lte-asn1-header.cc
--- ns-3.35/src/lte/model/lte-asn1-header.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/model/lte-asn1-header.cc	2022-04-30 18:23:58.034734200 -0700
@@ -309,7 +309,7 @@
     // Never extended attributes
     SerializeBoolean(false);
   }
-  
+
   // Clause 23.4 ITU-T X.691
   if (numOptions < 2)
     {
@@ -534,7 +534,7 @@
 {
   std::bitset<1> readBit;
   bIterator = DeserializeBitset<1> (&readBit,bIterator);
-  *value = (readBit[0] == 1) ? true : false;
+  *value = (readBit[0] == 1);
   return bIterator;
 }
 
@@ -584,15 +584,15 @@
       bIterator = DeserializeBitset<1> (&bitsRead1,bIterator);
       *n = (int)bitsRead1.to_ulong ();
       break;
-    case 2: 
+    case 2:
       bIterator = DeserializeBitset<2> (&bitsRead2,bIterator);
       *n = (int)bitsRead2.to_ulong ();
       break;
-    case 3: 
+    case 3:
       bIterator = DeserializeBitset<3> (&bitsRead3,bIterator);
       *n = (int)bitsRead3.to_ulong ();
       break;
-    case 4: 
+    case 4:
       bIterator = DeserializeBitset<4> (&bitsRead4,bIterator);
       *n = (int)bitsRead4.to_ulong ();
       break;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/model/lte-asn1-header.h ns-3.36/src/lte/model/lte-asn1-header.h
--- ns-3.35/src/lte/model/lte-asn1-header.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/model/lte-asn1-header.h	2022-04-30 18:23:58.034734200 -0700
@@ -329,13 +329,6 @@
    * \returns the modified buffer iterator
    */
   template <int N>
-  /**
-   * Deserialize a sequence
-   * \param optionalOrDefaultMask buffer to store the result
-   * \param isExtensionMarkerPresent true if Extension Marker is present
-   * \param bIterator buffer iterator
-   * \returns the modified buffer iterator
-   */
   Buffer::Iterator DeserializeSequence (std::bitset<N> *optionalOrDefaultMask,
                                         bool isExtensionMarkerPresent,
                                         Buffer::Iterator bIterator);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/model/lte-enb-component-carrier-manager.h ns-3.36/src/lte/model/lte-enb-component-carrier-manager.h
--- ns-3.35/src/lte/model/lte-enb-component-carrier-manager.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/model/lte-enb-component-carrier-manager.h	2022-04-30 18:23:58.038734400 -0700
@@ -165,10 +165,17 @@
    */
   virtual void DoReportUeMeas (uint16_t rnti, LteRrcSap::MeasResults measResults) = 0;
 
-  std::map <uint16_t, std::map<uint8_t, LteMacSapUser*> > m_ueAttached;//!< The map that contains the rnti, lcid, SAP of the RLC instance
-  std::map <uint16_t, std::map<uint8_t, LteEnbCmacSapProvider::LcInfo> > m_rlcLcInstantiated; //!< This map contains logical channel configuration per flow Id (rnti, lcid).
-  std::map <uint16_t, uint8_t> m_enabledComponentCarrier; //!< This map tells for each RNTI the number of enabled component carriers.
-  std::map <uint16_t, uint8_t> m_ueState; //!< Map of RRC states per UE (rnti, state), e.g. CONNECTED_NORMALLY
+  /**
+   * \brief Structure to represent UE info
+   */
+  struct UeInfo {
+    std::map<uint8_t, LteMacSapUser*> m_ueAttached; //!< Map from LCID to SAP of the RLC instance.
+    std::map<uint8_t, LteEnbCmacSapProvider::LcInfo> m_rlcLcInstantiated; //!< Logical channel configuration per flow Id (rnti, lcid).
+    uint8_t m_enabledComponentCarrier; //!< The number of enabled component carriers.
+    uint8_t m_ueState; //!< RRC states of UE, e.g. CONNECTED_NORMALLY
+  };
+
+  std::map <uint16_t, UeInfo> m_ueInfo; //!< The map from RNTI to UE information.
   uint16_t m_noOfComponentCarriers; //!< The number component of carriers that are supported by this eNb.
   // pointer to RRC object for direct function calls, e.g. when CCM needs to obtain
   // a pointer to RLC object of a specific flow
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/model/lte-enb-mac.h ns-3.36/src/lte/model/lte-enb-mac.h
--- ns-3.35/src/lte/model/lte-enb-mac.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/model/lte-enb-mac.h	2022-04-30 18:23:58.038734400 -0700
@@ -350,9 +350,8 @@
    *
    * Since SR is not implemented in LTE, this method does nothing.
    */
-  void DoReportSrToScheduler (uint16_t rnti)
+  void DoReportSrToScheduler ([[maybe_unused]] uint16_t rnti)
   {
-    NS_UNUSED (rnti);
   }
   
 public:
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/model/lte-enb-net-device.cc ns-3.36/src/lte/model/lte-enb-net-device.cc
--- ns-3.35/src/lte/model/lte-enb-net-device.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/model/lte-enb-net-device.cc	2022-04-30 18:23:58.038734400 -0700
@@ -226,17 +226,22 @@
   return m_cellId;
 }
 
-bool
-LteEnbNetDevice::HasCellId (uint16_t cellId) const
+std::vector<uint16_t>
+LteEnbNetDevice::GetCellIds () const
 {
+  std::vector<uint16_t> cellIds;
+
   for (auto &it: m_ccMap)
     {
-      if (it.second->GetCellId () == cellId)
-        {
-          return true;
-        }
+      cellIds.push_back (it.second->GetCellId ());
     }
-  return false;
+  return cellIds;
+}
+
+bool
+LteEnbNetDevice::HasCellId (uint16_t cellId) const
+{
+  return m_rrc->HasCellId (cellId);
 }
 
 uint16_t
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/model/lte-enb-net-device.h ns-3.36/src/lte/model/lte-enb-net-device.h
--- ns-3.35/src/lte/model/lte-enb-net-device.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/model/lte-enb-net-device.h	2022-04-30 18:23:58.038734400 -0700
@@ -108,6 +108,11 @@
   uint16_t GetCellId () const;
 
   /**
+   * \return the identifiers of cells served by this eNB
+   */
+  std::vector<uint16_t> GetCellIds () const;
+
+  /**
    * \param cellId cell ID
    * \return true if cellId is served by this eNB
    */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/model/lte-enb-phy.h ns-3.36/src/lte/model/lte-enb-phy.h
--- ns-3.35/src/lte/model/lte-enb-phy.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/model/lte-enb-phy.h	2022-04-30 18:23:58.038734400 -0700
@@ -274,8 +274,9 @@
 
   /**
    * \brief PhySpectrum received a new list of LteControlMessage
+   * \param msgList List of control messages
    */
-  virtual void ReceiveLteControlMessageList (std::list<Ptr<LteControlMessage> >);
+  virtual void ReceiveLteControlMessageList (std::list<Ptr<LteControlMessage> > msgList);
 
   // inherited from LtePhy
   virtual void GenerateCtrlCqiReport (const SpectrumValue& sinr);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/model/lte-enb-phy-sap.h ns-3.36/src/lte/model/lte-enb-phy-sap.h
--- ns-3.35/src/lte/model/lte-enb-phy-sap.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/model/lte-enb-phy-sap.h	2022-04-30 18:23:58.038734400 -0700
@@ -45,7 +45,6 @@
   /**
    * \brief Send the MAC PDU to the channel
    * \param p the MAC PDU to send
-   * \return true if
    */
   virtual void SendMacPdu (Ptr<Packet> p) = 0;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/model/lte-enb-rrc.cc ns-3.36/src/lte/model/lte-enb-rrc.cc
--- ns-3.35/src/lte/model/lte-enb-rrc.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/model/lte-enb-rrc.cc	2022-04-30 18:23:58.038734400 -0700
@@ -148,7 +148,7 @@
 
 UeManager::UeManager ()
 {
-  NS_FATAL_ERROR ("this constructor is not expected to be used");
+  NS_FATAL_ERROR ("this constructor is not espected to be used");
 }
 
 
@@ -640,44 +640,102 @@
     case CONNECTED_NORMALLY:
       {
         m_targetCellId = cellId;
-        EpcX2SapProvider::HandoverRequestParams params;
-        params.oldEnbUeX2apId = m_rnti;
-        params.cause          = EpcX2SapProvider::HandoverDesirableForRadioReason;
-        params.sourceCellId   = m_rrc->ComponentCarrierToCellId (m_componentCarrierId);
-        params.targetCellId   = cellId;
-        params.mmeUeS1apId    = m_imsi;
-        params.ueAggregateMaxBitRateDownlink = 200 * 1000;
-        params.ueAggregateMaxBitRateUplink = 100 * 1000;
-        params.bearers = GetErabList ();
-
-        LteRrcSap::HandoverPreparationInfo hpi;
-        hpi.asConfig.sourceUeIdentity = m_rnti;
-        hpi.asConfig.sourceDlCarrierFreq = m_rrc->m_dlEarfcn;
-        hpi.asConfig.sourceMeasConfig = m_rrc->m_ueMeasConfig;
-        hpi.asConfig.sourceRadioResourceConfig = GetRadioResourceConfigForHandoverPreparationInfo ();
-        hpi.asConfig.sourceMasterInformationBlock.dlBandwidth = m_rrc->m_dlBandwidth;
-        hpi.asConfig.sourceMasterInformationBlock.systemFrameNumber = 0;
-        hpi.asConfig.sourceSystemInformationBlockType1.cellAccessRelatedInfo.plmnIdentityInfo.plmnIdentity = m_rrc->m_sib1.at (m_componentCarrierId).cellAccessRelatedInfo.plmnIdentityInfo.plmnIdentity;
-        hpi.asConfig.sourceSystemInformationBlockType1.cellAccessRelatedInfo.cellIdentity = m_rrc->ComponentCarrierToCellId (m_componentCarrierId);
-        hpi.asConfig.sourceSystemInformationBlockType1.cellAccessRelatedInfo.csgIndication = m_rrc->m_sib1.at (m_componentCarrierId).cellAccessRelatedInfo.csgIndication;
-        hpi.asConfig.sourceSystemInformationBlockType1.cellAccessRelatedInfo.csgIdentity = m_rrc->m_sib1.at (m_componentCarrierId).cellAccessRelatedInfo.csgIdentity;
-        LteEnbCmacSapProvider::RachConfig rc = m_rrc->m_cmacSapProvider.at (m_componentCarrierId)->GetRachConfig ();
-        hpi.asConfig.sourceSystemInformationBlockType2.radioResourceConfigCommon.rachConfigCommon.preambleInfo.numberOfRaPreambles = rc.numberOfRaPreambles;
-        hpi.asConfig.sourceSystemInformationBlockType2.radioResourceConfigCommon.rachConfigCommon.raSupervisionInfo.preambleTransMax = rc.preambleTransMax;
-        hpi.asConfig.sourceSystemInformationBlockType2.radioResourceConfigCommon.rachConfigCommon.raSupervisionInfo.raResponseWindowSize = rc.raResponseWindowSize;
-        hpi.asConfig.sourceSystemInformationBlockType2.radioResourceConfigCommon.rachConfigCommon.txFailParam.connEstFailCount = rc.connEstFailCount;
-        hpi.asConfig.sourceSystemInformationBlockType2.freqInfo.ulCarrierFreq = m_rrc->m_ulEarfcn;
-        hpi.asConfig.sourceSystemInformationBlockType2.freqInfo.ulBandwidth = m_rrc->m_ulBandwidth;
-        params.rrcContext = m_rrc->m_rrcSapUser->EncodeHandoverPreparationInformation (hpi);
-
-        NS_LOG_LOGIC ("oldEnbUeX2apId = " << params.oldEnbUeX2apId);
-        NS_LOG_LOGIC ("sourceCellId = " << params.sourceCellId);
-        NS_LOG_LOGIC ("targetCellId = " << params.targetCellId);
-        NS_LOG_LOGIC ("mmeUeS1apId = " << params.mmeUeS1apId);
-        NS_LOG_LOGIC ("rrcContext   = " << params.rrcContext);
 
-        m_rrc->m_x2SapProvider->SendHandoverRequest (params);
-        SwitchToState (HANDOVER_PREPARATION);
+        auto sourceComponentCarrier = DynamicCast<ComponentCarrierEnb> (m_rrc->m_componentCarrierPhyConf.at (m_componentCarrierId));
+        NS_ASSERT (m_targetCellId != sourceComponentCarrier->GetCellId ());
+
+        if (m_rrc->HasCellId (cellId))
+          {
+            // Intra-eNB handover
+            NS_LOG_DEBUG ("Intra-eNB handover for cellId " << cellId);
+            uint8_t componentCarrierId = m_rrc->CellToComponentCarrierId (cellId);
+            uint16_t rnti = m_rrc->AddUe (UeManager::HANDOVER_JOINING, componentCarrierId);
+            LteEnbCmacSapProvider::AllocateNcRaPreambleReturnValue anrcrv = m_rrc->m_cmacSapProvider.at (componentCarrierId)->AllocateNcRaPreamble (rnti);
+            if (anrcrv.valid == false)
+              {
+                NS_LOG_INFO (this << " failed to allocate a preamble for non-contention based RA => cannot perform HO");
+                NS_FATAL_ERROR ("should trigger HO Preparation Failure, but it is not implemented");
+                return;
+              }
+
+            Ptr<UeManager> ueManager = m_rrc->GetUeManager (rnti);
+            ueManager->SetSource (sourceComponentCarrier->GetCellId (), m_rnti);
+            ueManager->SetImsi (m_imsi);
+
+            // Setup data radio bearers
+            for (auto &it: m_drbMap)
+              {
+                ueManager->SetupDataRadioBearer (it.second->m_epsBearer,
+                                                 it.second->m_epsBearerIdentity,
+                                                 it.second->m_gtpTeid,
+                                                 it.second->m_transportLayerAddress);
+
+              }
+
+            LteRrcSap::RrcConnectionReconfiguration handoverCommand = GetRrcConnectionReconfigurationForHandover (componentCarrierId);
+
+            handoverCommand.mobilityControlInfo.newUeIdentity = rnti;
+            handoverCommand.mobilityControlInfo.haveRachConfigDedicated = true;
+            handoverCommand.mobilityControlInfo.rachConfigDedicated.raPreambleIndex = anrcrv.raPreambleId;
+            handoverCommand.mobilityControlInfo.rachConfigDedicated.raPrachMaskIndex = anrcrv.raPrachMaskIndex;
+
+            LteEnbCmacSapProvider::RachConfig rc = m_rrc->m_cmacSapProvider.at (componentCarrierId)->GetRachConfig ();
+            handoverCommand.mobilityControlInfo.radioResourceConfigCommon.rachConfigCommon.preambleInfo.numberOfRaPreambles = rc.numberOfRaPreambles;
+            handoverCommand.mobilityControlInfo.radioResourceConfigCommon.rachConfigCommon.raSupervisionInfo.preambleTransMax = rc.preambleTransMax;
+            handoverCommand.mobilityControlInfo.radioResourceConfigCommon.rachConfigCommon.raSupervisionInfo.raResponseWindowSize = rc.raResponseWindowSize;
+
+            m_rrc->m_rrcSapUser->SendRrcConnectionReconfiguration (m_rnti, handoverCommand);
+
+            // We skip handover preparation
+            SwitchToState (HANDOVER_LEAVING);
+            m_handoverLeavingTimeout = Simulator::Schedule (m_rrc->m_handoverLeavingTimeoutDuration,
+                                                            &LteEnbRrc::HandoverLeavingTimeout,
+                                                            m_rrc, m_rnti);
+            m_rrc->m_handoverStartTrace (m_imsi, sourceComponentCarrier->GetCellId (), m_rnti, handoverCommand.mobilityControlInfo.targetPhysCellId);
+          }
+        else
+          {
+            // Inter-eNB aka X2 handover
+            NS_LOG_DEBUG ("Inter-eNB handover (i.e., X2) for cellId " << cellId);
+            EpcX2SapProvider::HandoverRequestParams params;
+            params.oldEnbUeX2apId = m_rnti;
+            params.cause          = EpcX2SapProvider::HandoverDesirableForRadioReason;
+            params.sourceCellId   = m_rrc->ComponentCarrierToCellId (m_componentCarrierId);
+            params.targetCellId   = cellId;
+            params.mmeUeS1apId    = m_imsi;
+            params.ueAggregateMaxBitRateDownlink = 200 * 1000;
+            params.ueAggregateMaxBitRateUplink = 100 * 1000;
+            params.bearers = GetErabList ();
+
+            LteRrcSap::HandoverPreparationInfo hpi;
+            hpi.asConfig.sourceUeIdentity = m_rnti;
+            hpi.asConfig.sourceDlCarrierFreq = sourceComponentCarrier->GetDlEarfcn ();
+            hpi.asConfig.sourceMeasConfig = m_rrc->m_ueMeasConfig;
+            hpi.asConfig.sourceRadioResourceConfig = GetRadioResourceConfigForHandoverPreparationInfo ();
+            hpi.asConfig.sourceMasterInformationBlock.dlBandwidth = sourceComponentCarrier->GetDlBandwidth ();
+            hpi.asConfig.sourceMasterInformationBlock.systemFrameNumber = 0;
+            hpi.asConfig.sourceSystemInformationBlockType1.cellAccessRelatedInfo.plmnIdentityInfo.plmnIdentity = m_rrc->m_sib1.at (m_componentCarrierId).cellAccessRelatedInfo.plmnIdentityInfo.plmnIdentity;
+            hpi.asConfig.sourceSystemInformationBlockType1.cellAccessRelatedInfo.cellIdentity = m_rrc->ComponentCarrierToCellId (m_componentCarrierId);
+            hpi.asConfig.sourceSystemInformationBlockType1.cellAccessRelatedInfo.csgIndication = m_rrc->m_sib1.at (m_componentCarrierId).cellAccessRelatedInfo.csgIndication;
+            hpi.asConfig.sourceSystemInformationBlockType1.cellAccessRelatedInfo.csgIdentity = m_rrc->m_sib1.at (m_componentCarrierId).cellAccessRelatedInfo.csgIdentity;
+            LteEnbCmacSapProvider::RachConfig rc = m_rrc->m_cmacSapProvider.at (m_componentCarrierId)->GetRachConfig ();
+            hpi.asConfig.sourceSystemInformationBlockType2.radioResourceConfigCommon.rachConfigCommon.preambleInfo.numberOfRaPreambles = rc.numberOfRaPreambles;
+            hpi.asConfig.sourceSystemInformationBlockType2.radioResourceConfigCommon.rachConfigCommon.raSupervisionInfo.preambleTransMax = rc.preambleTransMax;
+            hpi.asConfig.sourceSystemInformationBlockType2.radioResourceConfigCommon.rachConfigCommon.raSupervisionInfo.raResponseWindowSize = rc.raResponseWindowSize;
+            hpi.asConfig.sourceSystemInformationBlockType2.radioResourceConfigCommon.rachConfigCommon.txFailParam.connEstFailCount = rc.connEstFailCount;
+            hpi.asConfig.sourceSystemInformationBlockType2.freqInfo.ulCarrierFreq = sourceComponentCarrier->GetUlEarfcn ();
+            hpi.asConfig.sourceSystemInformationBlockType2.freqInfo.ulBandwidth = sourceComponentCarrier->GetUlBandwidth ();
+            params.rrcContext = m_rrc->m_rrcSapUser->EncodeHandoverPreparationInformation (hpi);
+
+            NS_LOG_LOGIC ("oldEnbUeX2apId = " << params.oldEnbUeX2apId);
+            NS_LOG_LOGIC ("sourceCellId = " << params.sourceCellId);
+            NS_LOG_LOGIC ("targetCellId = " << params.targetCellId);
+            NS_LOG_LOGIC ("mmeUeS1apId = " << params.mmeUeS1apId);
+            NS_LOG_LOGIC ("rrcContext   = " << params.rrcContext);
+
+            m_rrc->m_x2SapProvider->SendHandoverRequest (params);
+            SwitchToState (HANDOVER_PREPARATION);
+          }
       }
       break;
 
@@ -706,12 +764,12 @@
   LteRrcSap::RrcConnectionReconfiguration handoverCommand = m_rrc->m_rrcSapUser->DecodeHandoverCommand (encodedHandoverCommand);
   if (handoverCommand.haveNonCriticalExtension)
     {
-      //Total number of component carriers = handoverCommand.nonCriticalExtension.sCellsToAddModList.size() + 1 (Primary carrier)
-      if (handoverCommand.nonCriticalExtension.sCellsToAddModList.size() + 1 != m_rrc->m_numberOfComponentCarriers)
+      //Total number of component carriers = handoverCommand.nonCriticalExtension.sCellToAddModList.size() + 1 (Primary carrier)
+      if (handoverCommand.nonCriticalExtension.sCellToAddModList.size() + 1 != m_rrc->m_numberOfComponentCarriers)
         {
           //Currently handover is only possible if source and target eNBs have equal number of component carriers
           NS_FATAL_ERROR ("The source and target eNBs have unequal number of component carriers. Target eNB CCs = "
-                           << handoverCommand.nonCriticalExtension.sCellsToAddModList.size() + 1
+                           << handoverCommand.nonCriticalExtension.sCellToAddModList.size() + 1
                            << " Source eNB CCs = " << m_rrc->m_numberOfComponentCarriers);
         }
     }
@@ -758,10 +816,49 @@
 }
 
 LteRrcSap::RrcConnectionReconfiguration 
-UeManager::GetRrcConnectionReconfigurationForHandover ()
+UeManager::GetRrcConnectionReconfigurationForHandover (uint8_t componentCarrierId)
 {
   NS_LOG_FUNCTION (this);
-  return BuildRrcConnectionReconfiguration ();
+
+  LteRrcSap::RrcConnectionReconfiguration result = BuildRrcConnectionReconfiguration ();
+
+  auto targetComponentCarrier = DynamicCast<ComponentCarrierEnb> (m_rrc->m_componentCarrierPhyConf.at (componentCarrierId));
+  result.haveMobilityControlInfo = true;
+  result.mobilityControlInfo.targetPhysCellId = targetComponentCarrier->GetCellId ();
+  result.mobilityControlInfo.haveCarrierFreq = true;
+  result.mobilityControlInfo.carrierFreq.dlCarrierFreq = targetComponentCarrier->GetDlEarfcn ();
+  result.mobilityControlInfo.carrierFreq.ulCarrierFreq = targetComponentCarrier->GetUlEarfcn ();
+  result.mobilityControlInfo.haveCarrierBandwidth = true;
+  result.mobilityControlInfo.carrierBandwidth.dlBandwidth = targetComponentCarrier->GetDlBandwidth ();
+  result.mobilityControlInfo.carrierBandwidth.ulBandwidth = targetComponentCarrier->GetUlBandwidth ();
+
+  if (m_caSupportConfigured && m_rrc->m_numberOfComponentCarriers > 1)
+    {
+      // Release sCells
+      result.haveNonCriticalExtension = true;
+
+      for (auto &it: m_rrc->m_componentCarrierPhyConf)
+        {
+          uint8_t ccId = it.first;
+
+          if (ccId == m_componentCarrierId)
+            {
+              // Skip primary CC.
+              continue;
+            }
+          else if (ccId < m_componentCarrierId)
+            {
+              // Shift all IDs below PCC forward so PCC can use CC ID 1.
+              result.nonCriticalExtension.sCellToReleaseList.push_back (ccId + 1);
+            }
+        }
+    }
+  else
+    {
+      result.haveNonCriticalExtension = false;
+    }
+
+  return result;
 }
 
 void
@@ -869,7 +966,15 @@
       ueCtxReleaseParams.newEnbUeX2apId = m_rnti;
       ueCtxReleaseParams.sourceCellId = m_sourceCellId;
       ueCtxReleaseParams.targetCellId = m_targetCellId;
-      m_rrc->m_x2SapProvider->SendUeContextRelease (ueCtxReleaseParams);
+      if (!m_rrc->HasCellId (m_sourceCellId))
+        {
+          m_rrc->m_x2SapProvider->SendUeContextRelease (ueCtxReleaseParams);
+        }
+      else
+        {
+          NS_LOG_INFO ("Not sending UE CONTEXT RELEASE because handover is internal");
+          m_rrc->DoRecvUeContextRelease (ueCtxReleaseParams);
+        }
       SwitchToState (CONNECTED_NORMALLY);
       m_rrc->m_handoverEndOkTrace (m_imsi, m_rrc->ComponentCarrierToCellId (m_componentCarrierId), m_rnti);
       break;
@@ -1138,11 +1243,11 @@
   NS_LOG_LOGIC ("measId " << (uint16_t) measId
                           << " haveMeasResultNeighCells " << msg.measResults.haveMeasResultNeighCells
                           << " measResultListEutra " << msg.measResults.measResultListEutra.size ()
-                          << " haveScellsMeas " << msg.measResults.haveScellsMeas
-                          << " measScellResultList " << msg.measResults.measScellResultList.measResultScell.size ());
+                          << " haveMeasResultServFreqList " << msg.measResults.haveMeasResultServFreqList
+                          << " measResultServFreqList " << msg.measResults.measResultServFreqList.size ());
   NS_LOG_LOGIC ("serving cellId " << m_rrc->ComponentCarrierToCellId (m_componentCarrierId)
-                                  << " RSRP " << (uint16_t) msg.measResults.rsrpResult
-                                  << " RSRQ " << (uint16_t) msg.measResults.rsrqResult);
+                                  << " RSRP " << (uint16_t) msg.measResults.measResultPCell.rsrpResult
+                                  << " RSRQ " << (uint16_t) msg.measResults.measResultPCell.rsrqResult);
 
   for (std::list <LteRrcSap::MeasResultEutra>::iterator it = msg.measResults.measResultListEutra.begin ();
        it != msg.measResults.measResultListEutra.end ();
@@ -1182,15 +1287,13 @@
       // this measurement was requested by the FFR function
       m_rrc->m_ffrRrcSapProvider.at (0)->ReportUeMeas (m_rnti, msg.measResults);
     }
-  if (msg.measResults.haveScellsMeas == true)
+  if (msg.measResults.haveMeasResultServFreqList)
     {
-      for (std::list <LteRrcSap::MeasResultScell>::iterator it = msg.measResults.measScellResultList.measResultScell.begin ();
-           it != msg.measResults.measScellResultList.measResultScell.end ();
-           ++it)
+      for (const auto &it: msg.measResults.measResultServFreqList)
         {
-          m_rrc->m_ffrRrcSapProvider.at (it->servFreqId)->ReportUeMeas (m_rnti, msg.measResults);
           /// ToDo: implement on Ffr algorithm the code to properly parsing the new measResults message format
-          /// alternatively it is needed to 'repack' properly the measResults message before sending to Ffr 
+          /// alternatively it is needed to 'repack' properly the measResults message before sending to Ffr
+          m_rrc->m_ffrRrcSapProvider.at (it.servFreqId)->ReportUeMeas (m_rnti, msg.measResults);
         }
     }
 
@@ -1373,7 +1476,7 @@
       m_caSupportConfigured = true;
       NS_LOG_FUNCTION ( this << "CA not configured. Configure now!" );
       msg.haveNonCriticalExtension = true;
-      msg.nonCriticalExtension = BuildNonCriticalExtentionConfigurationCa ();
+      msg.nonCriticalExtension = BuildNonCriticalExtensionConfigurationCa ();
       NS_LOG_FUNCTION ( this << " haveNonCriticalExtension " << msg.haveNonCriticalExtension );
     }
   else
@@ -1514,16 +1617,11 @@
 }
 
 LteRrcSap::NonCriticalExtensionConfiguration
-UeManager::BuildNonCriticalExtentionConfigurationCa ()
+UeManager::BuildNonCriticalExtensionConfigurationCa ()
 {
   NS_LOG_FUNCTION ( this );
   LteRrcSap::NonCriticalExtensionConfiguration ncec;
   
-  //  LteRrcSap::SCellToAddMod scell;
-  std::list<LteRrcSap::SCellToAddMod> SccCon;
-
-  // sCellToReleaseList is always empty since no Scc is released
-
   for (auto &it: m_rrc->m_componentCarrierPhyConf)
     {
       uint8_t ccId = it.first;
@@ -1557,33 +1655,26 @@
       component.radioResourceConfigCommonSCell.ulConfiguration.soundingRsUlConfigCommon.srsBandwidthConfig = 0;
       component.radioResourceConfigCommonSCell.ulConfiguration.soundingRsUlConfigCommon.srsSubframeConfig = 0;
       component.radioResourceConfigCommonSCell.ulConfiguration.prachConfigSCell.index = 0;
-    
-      if (true)
-        {
-          component.haveRadioResourceConfigDedicatedSCell = true;
-          component.radioResourceConfigDedicateSCell.physicalConfigDedicatedSCell.haveNonUlConfiguration = true;
-          component.radioResourceConfigDedicateSCell.physicalConfigDedicatedSCell.haveAntennaInfoDedicated = true;
-          component.radioResourceConfigDedicateSCell.physicalConfigDedicatedSCell.antennaInfo.transmissionMode = m_rrc->m_defaultTransmissionMode;
-          component.radioResourceConfigDedicateSCell.physicalConfigDedicatedSCell.crossCarrierSchedulingConfig = false;
-          component.radioResourceConfigDedicateSCell.physicalConfigDedicatedSCell.havePdschConfigDedicated = true;
-          component.radioResourceConfigDedicateSCell.physicalConfigDedicatedSCell.pdschConfigDedicated.pa = LteRrcSap::PdschConfigDedicated::dB0;
-          component.radioResourceConfigDedicateSCell.physicalConfigDedicatedSCell.haveUlConfiguration = true;
-          component.radioResourceConfigDedicateSCell.physicalConfigDedicatedSCell.haveAntennaInfoUlDedicated = true;
-          component.radioResourceConfigDedicateSCell.physicalConfigDedicatedSCell.antennaInfoUl.transmissionMode = m_rrc->m_defaultTransmissionMode;
-          component.radioResourceConfigDedicateSCell.physicalConfigDedicatedSCell.pushConfigDedicatedSCell.nPuschIdentity = 0;
-          component.radioResourceConfigDedicateSCell.physicalConfigDedicatedSCell.ulPowerControlDedicatedSCell.pSrsOffset = 0;
-          component.radioResourceConfigDedicateSCell.physicalConfigDedicatedSCell.haveSoundingRsUlConfigDedicated = true;
-          component.radioResourceConfigDedicateSCell.physicalConfigDedicatedSCell.soundingRsUlConfigDedicated.srsConfigIndex = GetSrsConfigurationIndex();
-          component.radioResourceConfigDedicateSCell.physicalConfigDedicatedSCell.soundingRsUlConfigDedicated.type = LteRrcSap::SoundingRsUlConfigDedicated::SETUP;
-          component.radioResourceConfigDedicateSCell.physicalConfigDedicatedSCell.soundingRsUlConfigDedicated.srsBandwidth = 0;
-        }
-      else 
-        {
-          component.haveRadioResourceConfigDedicatedSCell = false;
-        }
-      SccCon.push_back (component);
+
+      component.haveRadioResourceConfigDedicatedSCell = true;
+      component.radioResourceConfigDedicatedSCell.physicalConfigDedicatedSCell.haveNonUlConfiguration = true;
+      component.radioResourceConfigDedicatedSCell.physicalConfigDedicatedSCell.haveAntennaInfoDedicated = true;
+      component.radioResourceConfigDedicatedSCell.physicalConfigDedicatedSCell.antennaInfo.transmissionMode = m_rrc->m_defaultTransmissionMode;
+      component.radioResourceConfigDedicatedSCell.physicalConfigDedicatedSCell.crossCarrierSchedulingConfig = false;
+      component.radioResourceConfigDedicatedSCell.physicalConfigDedicatedSCell.havePdschConfigDedicated = true;
+      component.radioResourceConfigDedicatedSCell.physicalConfigDedicatedSCell.pdschConfigDedicated.pa = LteRrcSap::PdschConfigDedicated::dB0;
+      component.radioResourceConfigDedicatedSCell.physicalConfigDedicatedSCell.haveUlConfiguration = true;
+      component.radioResourceConfigDedicatedSCell.physicalConfigDedicatedSCell.haveAntennaInfoUlDedicated = true;
+      component.radioResourceConfigDedicatedSCell.physicalConfigDedicatedSCell.antennaInfoUl.transmissionMode = m_rrc->m_defaultTransmissionMode;
+      component.radioResourceConfigDedicatedSCell.physicalConfigDedicatedSCell.pushConfigDedicatedSCell.nPuschIdentity = 0;
+      component.radioResourceConfigDedicatedSCell.physicalConfigDedicatedSCell.ulPowerControlDedicatedSCell.pSrsOffset = 0;
+      component.radioResourceConfigDedicatedSCell.physicalConfigDedicatedSCell.haveSoundingRsUlConfigDedicated = true;
+      component.radioResourceConfigDedicatedSCell.physicalConfigDedicatedSCell.soundingRsUlConfigDedicated.srsConfigIndex = GetSrsConfigurationIndex();
+      component.radioResourceConfigDedicatedSCell.physicalConfigDedicatedSCell.soundingRsUlConfigDedicated.type = LteRrcSap::SoundingRsUlConfigDedicated::SETUP;
+      component.radioResourceConfigDedicatedSCell.physicalConfigDedicatedSCell.soundingRsUlConfigDedicated.srsBandwidth = 0;
+
+      ncec.sCellToAddModList.push_back (component);
     }
-  ncec.sCellsToAddModList = SccCon;
 
   return ncec;
 }
@@ -2082,14 +2173,14 @@
   return it->second;
 }
 
-uint8_t
+std::vector<uint8_t>
 LteEnbRrc::AddUeMeasReportConfig (LteRrcSap::ReportConfigEutra config)
 {
   NS_LOG_FUNCTION (this);
 
   // SANITY CHECK
 
-  NS_ASSERT_MSG (m_ueMeasConfig.measIdToAddModList.size () == m_ueMeasConfig.reportConfigToAddModList.size (),
+  NS_ASSERT_MSG (m_ueMeasConfig.measIdToAddModList.size () == m_ueMeasConfig.reportConfigToAddModList.size () * m_numberOfComponentCarriers,
                  "Measurement identities and reporting configuration should not have different quantity");
 
   if (Simulator::Now () != Seconds (0))
@@ -2157,17 +2248,27 @@
   reportConfig.reportConfigId = nextId;
   reportConfig.reportConfigEutra = config;
 
-  // create the measurement identity
-  LteRrcSap::MeasIdToAddMod measId;
-  measId.measId = nextId;
-  measId.measObjectId = 1;
-  measId.reportConfigId = nextId;
-
-  // add both to the list of UE measurement configuration
+  // add reporting configuration to UE measurement configuration
   m_ueMeasConfig.reportConfigToAddModList.push_back (reportConfig);
-  m_ueMeasConfig.measIdToAddModList.push_back (measId);
 
-  return nextId;
+  std::vector<uint8_t> measIds;
+
+  // create measurement identities, linking reporting configuration to all objects
+  for (uint8_t componentCarrier = 0; componentCarrier < m_numberOfComponentCarriers; componentCarrier++)
+    {
+      LteRrcSap::MeasIdToAddMod measIdToAddMod;
+
+      uint8_t measId = m_ueMeasConfig.measIdToAddModList.size () + 1;
+
+      measIdToAddMod.measId = measId;
+      measIdToAddMod.measObjectId = componentCarrier + 1;
+      measIdToAddMod.reportConfigId = nextId;
+
+      m_ueMeasConfig.measIdToAddModList.push_back (measIdToAddMod);
+      measIds.push_back (measId);
+    }
+
+  return measIds;
 }
 
 void
@@ -2202,21 +2303,24 @@
   m_ulBandwidth = ulBandwidth;
 
   /*
-   * Initializing the list of UE measurement configuration (m_ueMeasConfig).
-   * Only intra-frequency measurements are supported, so only one measurement
-   * object is created.
+   * Initializing the list of measurement objects.
+   * Only intra-frequency measurements are supported,
+   * so one measurement object is created for each carrier frequency.
    */
+  for (const auto &it: ccPhyConf)
+    {
+      LteRrcSap::MeasObjectToAddMod measObject;
+      measObject.measObjectId = it.first + 1;
+      measObject.measObjectEutra.carrierFreq = it.second->GetDlEarfcn ();
+      measObject.measObjectEutra.allowedMeasBandwidth = it.second->GetDlBandwidth ();
+      measObject.measObjectEutra.presenceAntennaPort1 = false;
+      measObject.measObjectEutra.neighCellConfig = 0;
+      measObject.measObjectEutra.offsetFreq = 0;
+      measObject.measObjectEutra.haveCellForWhichToReportCGI = false;
 
-  LteRrcSap::MeasObjectToAddMod measObject;
-  measObject.measObjectId = 1;
-  measObject.measObjectEutra.carrierFreq = m_dlEarfcn;
-  measObject.measObjectEutra.allowedMeasBandwidth = m_dlBandwidth;
-  measObject.measObjectEutra.presenceAntennaPort1 = false;
-  measObject.measObjectEutra.neighCellConfig = 0;
-  measObject.measObjectEutra.offsetFreq = 0;
-  measObject.measObjectEutra.haveCellForWhichToReportCGI = false;
+      m_ueMeasConfig.measObjectToAddModList.push_back (measObject);
+    }
 
-  m_ueMeasConfig.measObjectToAddModList.push_back (measObject);
   m_ueMeasConfig.haveQuantityConfig = true;
   m_ueMeasConfig.quantityConfig.filterCoefficientRSRP = m_rsrpFilterCoefficient;
   m_ueMeasConfig.quantityConfig.filterCoefficientRSRQ = m_rsrqFilterCoefficient;
@@ -2296,6 +2400,19 @@
 }
 
 bool
+LteEnbRrc::HasCellId (uint16_t cellId) const
+{
+  for (auto &it: m_componentCarrierPhyConf)
+    {
+      if (it.second->GetCellId () == cellId)
+        {
+          return true;
+        }
+    }
+  return false;
+}
+
+bool
 LteEnbRrc::SendData (Ptr<Packet> packet)
 {
   NS_LOG_FUNCTION (this << packet);
@@ -2494,8 +2611,9 @@
       return;
     }
 
-  uint16_t rnti = AddUe (UeManager::HANDOVER_JOINING, CellToComponentCarrierId (req.targetCellId));
-  LteEnbCmacSapProvider::AllocateNcRaPreambleReturnValue anrcrv = m_cmacSapProvider.at (0)->AllocateNcRaPreamble (rnti);
+  uint8_t componentCarrierId = CellToComponentCarrierId (req.targetCellId);
+  uint16_t rnti = AddUe (UeManager::HANDOVER_JOINING, componentCarrierId);
+  LteEnbCmacSapProvider::AllocateNcRaPreambleReturnValue anrcrv = m_cmacSapProvider.at (componentCarrierId)->AllocateNcRaPreamble (rnti);
   if (anrcrv.valid == false)
     {
       NS_LOG_INFO (this << " failed to allocate a preamble for non-contention based RA => cannot accept HO");
@@ -2524,21 +2642,14 @@
       ackParams.admittedBearers.push_back (i);
     }
 
-  LteRrcSap::RrcConnectionReconfiguration handoverCommand = ueManager->GetRrcConnectionReconfigurationForHandover ();
-  handoverCommand.haveMobilityControlInfo = true;
-  handoverCommand.mobilityControlInfo.targetPhysCellId = req.targetCellId;
-  handoverCommand.mobilityControlInfo.haveCarrierFreq = true;
-  handoverCommand.mobilityControlInfo.carrierFreq.dlCarrierFreq = m_dlEarfcn;
-  handoverCommand.mobilityControlInfo.carrierFreq.ulCarrierFreq = m_ulEarfcn;
-  handoverCommand.mobilityControlInfo.haveCarrierBandwidth = true;
-  handoverCommand.mobilityControlInfo.carrierBandwidth.dlBandwidth = m_dlBandwidth;
-  handoverCommand.mobilityControlInfo.carrierBandwidth.ulBandwidth = m_ulBandwidth;
+  LteRrcSap::RrcConnectionReconfiguration handoverCommand = ueManager->GetRrcConnectionReconfigurationForHandover (componentCarrierId);
+
   handoverCommand.mobilityControlInfo.newUeIdentity = rnti;
   handoverCommand.mobilityControlInfo.haveRachConfigDedicated = true;
   handoverCommand.mobilityControlInfo.rachConfigDedicated.raPreambleIndex = anrcrv.raPreambleId;
   handoverCommand.mobilityControlInfo.rachConfigDedicated.raPrachMaskIndex = anrcrv.raPrachMaskIndex;
 
-  LteEnbCmacSapProvider::RachConfig rc = m_cmacSapProvider.at (0)->GetRachConfig ();
+  LteEnbCmacSapProvider::RachConfig rc = m_cmacSapProvider.at (componentCarrierId)->GetRachConfig ();
   handoverCommand.mobilityControlInfo.radioResourceConfigCommon.rachConfigCommon.preambleInfo.numberOfRaPreambles = rc.numberOfRaPreambles;
   handoverCommand.mobilityControlInfo.radioResourceConfigCommon.rachConfigCommon.raSupervisionInfo.preambleTransMax = rc.preambleTransMax;
   handoverCommand.mobilityControlInfo.radioResourceConfigCommon.rachConfigCommon.raSupervisionInfo.raResponseWindowSize = rc.raResponseWindowSize;
@@ -2696,20 +2807,20 @@
 }
 
 
-uint8_t
+std::vector<uint8_t>
 LteEnbRrc::DoAddUeMeasReportConfigForHandover (LteRrcSap::ReportConfigEutra reportConfig)
 {
   NS_LOG_FUNCTION (this);
-  uint8_t measId = AddUeMeasReportConfig (reportConfig);
-  m_handoverMeasIds.insert (measId);
-  return measId;
+  std::vector<uint8_t> measIds = AddUeMeasReportConfig (reportConfig);
+  m_handoverMeasIds.insert (measIds.begin (), measIds.end());
+  return measIds;
 }
 
 uint8_t
 LteEnbRrc::DoAddUeMeasReportConfigForComponentCarrier (LteRrcSap::ReportConfigEutra reportConfig)
 {
   NS_LOG_FUNCTION (this);
-  uint8_t measId = AddUeMeasReportConfig (reportConfig);
+  uint8_t measId = AddUeMeasReportConfig (reportConfig).at (0);
   m_componentCarrierMeasIds.insert (measId);
   return measId;
 }
@@ -2730,7 +2841,7 @@
   Ptr<UeManager> ueManager = GetUeManager (rnti);
   NS_ASSERT_MSG (ueManager != 0, "Cannot find UE context with RNTI " << rnti);
 
-  if (m_anrSapProvider != 0)
+  if (m_anrSapProvider != 0 && !HasCellId (targetCellId))
     {
       // ensure that proper neighbour relationship exists between source and target cells
       bool noHo = m_anrSapProvider->GetNoHo (targetCellId);
@@ -2766,7 +2877,7 @@
 LteEnbRrc::DoAddUeMeasReportConfigForAnr (LteRrcSap::ReportConfigEutra reportConfig)
 {
   NS_LOG_FUNCTION (this);
-  uint8_t measId = AddUeMeasReportConfig (reportConfig);
+  uint8_t measId = AddUeMeasReportConfig (reportConfig).at (0);
   m_anrMeasIds.insert (measId);
   return measId;
 }
@@ -2775,7 +2886,7 @@
 LteEnbRrc::DoAddUeMeasReportConfigForFfr (LteRrcSap::ReportConfigEutra reportConfig)
 {
   NS_LOG_FUNCTION (this);
-  uint8_t measId = AddUeMeasReportConfig (reportConfig);
+  uint8_t measId = AddUeMeasReportConfig (reportConfig).at (0);
   m_ffrMeasIds.insert (measId);
   return measId;
 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/model/lte-enb-rrc.h ns-3.36/src/lte/model/lte-enb-rrc.h
--- ns-3.35/src/lte/model/lte-enb-rrc.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/model/lte-enb-rrc.h	2022-04-30 18:23:58.042734400 -0700
@@ -108,8 +108,6 @@
    * \param rnti RNTI of the UE
    * \param s initial state of the UeManager
    * \param componentCarrierId primary component carrier ID
-   * 
-   * \return 
    */
   UeManager (Ptr<LteEnbRrc> rrc, uint16_t rnti, State s, uint8_t componentCarrierId);
 
@@ -210,6 +208,7 @@
   LteRrcSap::RadioResourceConfigDedicated GetRadioResourceConfigForHandoverPreparationInfo ();
 
   /** 
+   * \param componentCarrierId target component carrier ID
    * 
    * \return retrieve the data that the target eNB needs to send to the source
    * eNB as the Handover Command in the X2-based handover
@@ -218,7 +217,7 @@
    * \note mobility control info is not expected to be filled in
    * (shall be filled in by the caller). 
    */
-  LteRrcSap::RrcConnectionReconfiguration GetRrcConnectionReconfigurationForHandover ();
+  LteRrcSap::RrcConnectionReconfiguration GetRrcConnectionReconfigurationForHandover (uint8_t componentCarrierId);
 
   /**
    * Send a data packet over the appropriate Data Radio Bearer.
@@ -431,7 +430,7 @@
    * \return an NonCriticalExtensionConfiguration struct built based on the
    * current configuration
    */
-  LteRrcSap::NonCriticalExtensionConfiguration BuildNonCriticalExtentionConfigurationCa ();
+  LteRrcSap::NonCriticalExtensionConfiguration BuildNonCriticalExtensionConfigurationCa ();
 
   /** 
    * 
@@ -880,16 +879,16 @@
   /**
    * \brief Add a new UE measurement reporting configuration
    * \param config the new reporting configuration
-   * \return the measurement ID (measId) referring to the newly added
+   * \return the measurement IDs (measId) referring to the newly added
    *         reporting configuration
    *
    * Assuming intra-frequency environment, the new measurement reporting
-   * configuration will be automatically associated to the only measurement
-   * object (i.e., a new measurement identity will be automatically created).
+   * configuration will be automatically associated to measurement
+   * objects corresponding to serving cell frequencies.
    *
    * Can only be called before the start of simulation.
    */
-  uint8_t AddUeMeasReportConfig (LteRrcSap::ReportConfigEutra config);
+  std::vector<uint8_t> AddUeMeasReportConfig (LteRrcSap::ReportConfigEutra config);
 
   /**
    * \brief Configure cell-specific parameters.
@@ -954,6 +953,12 @@
    */
   uint16_t ComponentCarrierToCellId (uint8_t componentCarrierId);
 
+  /**
+   * \param cellId cell ID
+   * \return true if cellId is served by this eNB
+   */
+  bool HasCellId (uint16_t cellId) const;
+
   /** 
    * Enqueue an IP data packet on the proper bearer for downlink
    * transmission. Normally expected to be called by the NetDevice
@@ -1269,7 +1274,7 @@
    * \param reportConfig LteRrcSap::ReportConfigEutra
    * \returns measure ID
    */
-  uint8_t DoAddUeMeasReportConfigForHandover (LteRrcSap::ReportConfigEutra reportConfig);
+  std::vector<uint8_t> DoAddUeMeasReportConfigForHandover (LteRrcSap::ReportConfigEutra reportConfig);
   /**
    * Add UE measure report config for component carrier function
    *
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/model/lte-ffr-distributed-algorithm.cc ns-3.36/src/lte/model/lte-ffr-distributed-algorithm.cc
--- ns-3.35/src/lte/model/lte-ffr-distributed-algorithm.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/model/lte-ffr-distributed-algorithm.cc	2022-04-30 18:23:58.042734400 -0700
@@ -389,8 +389,8 @@
 {
   NS_LOG_FUNCTION (this << rnti << (uint16_t) measResults.measId);
   NS_LOG_INFO ("CellId: " << m_cellId << " RNTI :" << rnti << " MeasId: " << (uint16_t) measResults.measId
-                          << " RSRP: " << (uint16_t)measResults.rsrpResult
-                          << " RSRQ: " << (uint16_t)measResults.rsrqResult);
+                          << " RSRP: " << (uint16_t)measResults.measResultPCell.rsrpResult
+                          << " RSRQ: " << (uint16_t)measResults.measResultPCell.rsrqResult);
 
   if (measResults.measId == m_rsrqMeasId)
     {
@@ -402,7 +402,7 @@
         }
 
       it = m_ues.find (rnti);
-      if (measResults.rsrqResult >= m_edgeSubBandRsrqThreshold)
+      if (measResults.measResultPCell.rsrqResult >= m_edgeSubBandRsrqThreshold)
         {
           if (it->second != CenterArea)
             {
@@ -435,7 +435,7 @@
           m_ues.insert (std::pair< uint16_t, uint8_t > (rnti, AreaUnset));
         }
 
-      UpdateNeighbourMeasurements (rnti, m_cellId, measResults.rsrpResult, measResults.rsrqResult);
+      UpdateNeighbourMeasurements (rnti, m_cellId, measResults.measResultPCell.rsrpResult, measResults.measResultPCell.rsrqResult);
 
       if (measResults.haveMeasResultNeighCells
           && !measResults.measResultListEutra.empty ())
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/model/lte-ffr-enhanced-algorithm.cc ns-3.36/src/lte/model/lte-ffr-enhanced-algorithm.cc
--- ns-3.35/src/lte/model/lte-ffr-enhanced-algorithm.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/model/lte-ffr-enhanced-algorithm.cc	2022-04-30 18:23:58.042734400 -0700
@@ -48,7 +48,7 @@
   uint8_t cellId; ///< cell ID
   uint8_t dlBandwidth; ///< DL bandwidth
   uint8_t dlSubBandOffset; ///< DL subband offset
-  uint8_t dlReuse3SubBandwidth; ///< reuse 3 subbandwidth 
+  uint8_t dlReuse3SubBandwidth; ///< reuse 3 subbandwidth
   uint8_t dlReuse1SubBandwidth; ///< reuse 1 subbandwidth
 } g_ffrEnhancedDownlinkDefaultConfiguration[] = {
   { 1, 25, 0, 4, 4},
@@ -695,7 +695,7 @@
             }
           NS_LOG_INFO (this << " RNTI " << rnti << " RBG  " << i << " DL-CQI: " << (int)rbgCqi);
 
-          bool rbgAvailable = (rbgCqi > m_dlCqiThreshold) ? true : false;
+          bool rbgAvailable = (rbgCqi > m_dlCqiThreshold);
 
           bool isSecondarySegmentRbg = false;
           if (i < m_dlSecondarySegmentRbgMap.size ())
@@ -861,8 +861,8 @@
 {
   NS_LOG_FUNCTION (this << rnti << (uint16_t) measResults.measId);
   NS_LOG_INFO ("RNTI :" << rnti << " MeasId: " << (uint16_t) measResults.measId
-                        << " RSRP: " << (uint16_t)measResults.rsrpResult
-                        << " RSRQ: " << (uint16_t)measResults.rsrqResult);
+                        << " RSRP: " << (uint16_t)measResults.measResultPCell.rsrpResult
+                        << " RSRQ: " << (uint16_t)measResults.measResultPCell.rsrqResult);
 
   if (measResults.measId != m_measId)
     {
@@ -877,7 +877,7 @@
         }
 
       it = m_ues.find (rnti);
-      if (measResults.rsrqResult < m_rsrqThreshold)
+      if (measResults.measResultPCell.rsrqResult < m_rsrqThreshold)
         {
           if (it->second != EdgeArea)
             {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/model/lte-ffr-soft-algorithm.cc ns-3.36/src/lte/model/lte-ffr-soft-algorithm.cc
--- ns-3.35/src/lte/model/lte-ffr-soft-algorithm.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/model/lte-ffr-soft-algorithm.cc	2022-04-30 18:23:58.042734400 -0700
@@ -629,8 +629,8 @@
 {
   NS_LOG_FUNCTION (this << rnti << (uint16_t) measResults.measId);
   NS_LOG_INFO ("RNTI :" << rnti << " MeasId: " << (uint16_t) measResults.measId
-                        << " RSRP: " << (uint16_t)measResults.rsrpResult
-                        << " RSRQ: " << (uint16_t)measResults.rsrqResult);
+                        << " RSRP: " << (uint16_t)measResults.measResultPCell.rsrpResult
+                        << " RSRQ: " << (uint16_t)measResults.measResultPCell.rsrqResult);
 
   NS_ASSERT_MSG (m_centerSubBandThreshold >= m_edgeSubBandThreshold,
                  "CenterSubBandThreshold must be higher than EdgeSubBandThreshold");
@@ -649,7 +649,7 @@
         }
 
       it = m_ues.find (rnti);
-      if (measResults.rsrqResult >= m_centerSubBandThreshold)
+      if (measResults.measResultPCell.rsrqResult >= m_centerSubBandThreshold)
         {
           if (it->second != CenterArea)
             {
@@ -661,7 +661,7 @@
               m_ffrRrcSapUser->SetPdschConfigDedicated (rnti, pdschConfigDedicated);
             }
         }
-      else if (measResults.rsrqResult < m_edgeSubBandThreshold)
+      else if (measResults.measResultPCell.rsrqResult < m_edgeSubBandThreshold)
         {
           if (it->second != EdgeArea )
             {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/model/lte-fr-soft-algorithm.cc ns-3.36/src/lte/model/lte-fr-soft-algorithm.cc
--- ns-3.35/src/lte/model/lte-fr-soft-algorithm.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/model/lte-fr-soft-algorithm.cc	2022-04-30 18:23:58.042734400 -0700
@@ -511,8 +511,8 @@
 {
   NS_LOG_FUNCTION (this << rnti << (uint16_t) measResults.measId);
   NS_LOG_INFO ("RNTI :" << rnti << " MeasId: " << (uint16_t) measResults.measId
-                        << " RSRP: " << (uint16_t)measResults.rsrpResult
-                        << " RSRQ: " << (uint16_t)measResults.rsrqResult);
+                        << " RSRP: " << (uint16_t)measResults.measResultPCell.rsrpResult
+                        << " RSRQ: " << (uint16_t)measResults.measResultPCell.rsrqResult);
 
   if (measResults.measId != m_measId)
     {
@@ -527,7 +527,7 @@
         }
       it = m_ues.find (rnti);
 
-      if (measResults.rsrqResult < m_edgeSubBandThreshold)
+      if (measResults.measResultPCell.rsrqResult < m_edgeSubBandThreshold)
         {
           if (it->second != CellEdge)
             {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/model/lte-fr-strict-algorithm.cc ns-3.36/src/lte/model/lte-fr-strict-algorithm.cc
--- ns-3.35/src/lte/model/lte-fr-strict-algorithm.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/model/lte-fr-strict-algorithm.cc	2022-04-30 18:23:58.042734400 -0700
@@ -522,8 +522,8 @@
 {
   NS_LOG_FUNCTION (this << rnti << (uint16_t) measResults.measId);
   NS_LOG_INFO ("RNTI :" << rnti << " MeasId: " << (uint16_t) measResults.measId
-                        << " RSRP: " << (uint16_t)measResults.rsrpResult
-                        << " RSRQ: " << (uint16_t)measResults.rsrqResult);
+                        << " RSRP: " << (uint16_t)measResults.measResultPCell.rsrpResult
+                        << " RSRQ: " << (uint16_t)measResults.measResultPCell.rsrqResult);
 
   if (measResults.measId != m_measId)
     {
@@ -538,7 +538,7 @@
         }
       it = m_ues.find (rnti);
 
-      if (measResults.rsrqResult < m_edgeSubBandThreshold)
+      if (measResults.measResultPCell.rsrqResult < m_edgeSubBandThreshold)
         {
           if (it->second != CellEdge )
             {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/model/lte-handover-management-sap.h ns-3.36/src/lte/model/lte-handover-management-sap.h
--- ns-3.35/src/lte/model/lte-handover-management-sap.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/model/lte-handover-management-sap.h	2022-04-30 18:23:58.042734400 -0700
@@ -73,7 +73,7 @@
    * \brief Request a certain reporting configuration to be fulfilled by the UEs
    *        attached to the eNodeB entity.
    * \param reportConfig the UE measurement reporting configuration
-   * \return the measurement identity associated with this newly added
+   * \return the measurement identities associated with this newly added
    *         reporting configuration
    *
    * The eNodeB RRC entity is expected to configure the same reporting
@@ -85,7 +85,7 @@
    *
    * \note This function is only valid before the simulation begins.
    */
-  virtual uint8_t AddUeMeasReportConfigForHandover (LteRrcSap::ReportConfigEutra reportConfig) = 0;
+  virtual std::vector<uint8_t> AddUeMeasReportConfigForHandover (LteRrcSap::ReportConfigEutra reportConfig) = 0;
 
   /**
    * \brief Instruct the eNodeB RRC entity to prepare a handover.
@@ -165,7 +165,7 @@
   MemberLteHandoverManagementSapUser (C* owner);
 
   // inherited from LteHandoverManagementSapUser
-  virtual uint8_t AddUeMeasReportConfigForHandover (LteRrcSap::ReportConfigEutra reportConfig);
+  virtual std::vector<uint8_t> AddUeMeasReportConfigForHandover (LteRrcSap::ReportConfigEutra reportConfig);
   virtual void TriggerHandover (uint16_t rnti, uint16_t targetCellId);
 
 private:
@@ -183,7 +183,7 @@
 
 
 template <class C>
-uint8_t
+std::vector<uint8_t>
 MemberLteHandoverManagementSapUser<C>::AddUeMeasReportConfigForHandover (LteRrcSap::ReportConfigEutra reportConfig)
 {
   return m_owner->DoAddUeMeasReportConfigForHandover (reportConfig);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/model/lte-rlc-am.cc ns-3.36/src/lte/model/lte-rlc-am.cc
--- ns-3.35/src/lte/model/lte-rlc-am.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/model/lte-rlc-am.cc	2022-04-30 18:23:58.042734400 -0700
@@ -442,7 +442,6 @@
   // Build Data field
   uint32_t nextSegmentSize = txOpParams.bytes - 4;
   uint32_t nextSegmentId = 1;
-  uint32_t dataFieldTotalSize = 0;
   uint32_t dataFieldAddedSize = 0;
   std::vector < Ptr<Packet> > dataField;
 
@@ -540,7 +539,6 @@
 
           // Add Segment to Data field
           dataFieldAddedSize = newSegment->GetSize ();
-          dataFieldTotalSize += dataFieldAddedSize;
           dataField.push_back (newSegment);
           newSegment = 0;
 
@@ -563,7 +561,6 @@
 
           // Add txBuffer.FirstBuffer to DataField
           dataFieldAddedSize = firstSegment->GetSize ();
-          dataFieldTotalSize += dataFieldAddedSize;
           dataField.push_back (firstSegment);
           firstSegment = 0;
 
@@ -593,7 +590,6 @@
           NS_LOG_LOGIC ("    IF firstSegment < NextSegmentSize && txonBuffer.size > 0");
           // Add txBuffer.FirstBuffer to DataField
           dataFieldAddedSize = firstSegment->GetSize ();
-          dataFieldTotalSize += dataFieldAddedSize;
           dataField.push_back (firstSegment);
 
           // ExtensionBit (Next_Segment - 1) = 1
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/model/lte-rlc-am.h ns-3.36/src/lte/model/lte-rlc-am.h
--- ns-3.35/src/lte/model/lte-rlc-am.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/model/lte-rlc-am.h	2022-04-30 18:23:58.042734400 -0700
@@ -135,7 +135,7 @@
   {
     Ptr<Packet> m_pdu; ///< PDU
     uint16_t    m_retxCount; ///< retransmit count
-    Time        m_waitingSince; ///!< Layer arrival time
+    Time        m_waitingSince; ///< Layer arrival time
   };
 
   std::vector <RetxPdu> m_txedBuffer;  ///< Buffer for transmitted and retransmitted PDUs 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/model/lte-rlc-am-header.cc ns-3.36/src/lte/model/lte-rlc-am-header.cc
--- ns-3.35/src/lte/model/lte-rlc-am-header.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/model/lte-rlc-am-header.cc	2022-04-30 18:23:58.042734400 -0700
@@ -72,12 +72,12 @@
 bool
 LteRlcAmHeader::IsDataPdu (void) const
 {
-  return (m_dataControlBit == DATA_PDU) ? true : false;
+  return m_dataControlBit == DATA_PDU;
 }
 bool
 LteRlcAmHeader::IsControlPdu (void) const
 {
-  return (m_dataControlBit == CONTROL_PDU) ? true : false;
+  return m_dataControlBit == CONTROL_PDU;
 }
 
 void
@@ -261,7 +261,7 @@
           return true;
         }
     }
-  return false;  
+  return false;
 }
 
 int
@@ -357,7 +357,7 @@
           it3++;
         }
 
- 
+
     }
 }
 
@@ -428,7 +428,7 @@
       // note: second part of ackSn will be written later
 
       // serialize the NACKs
-      if ( it3 == m_nackSnList.end () ) 
+      if ( it3 == m_nackSnList.end () )
         {
           NS_LOG_LOGIC (this << " no NACKs");
            // If there are no NACKs then this line adds the rest of the ACK
@@ -569,7 +569,7 @@
 
       if (m_resegmentationFlag == SEGMENT)
         {
-          m_lastOffset = m_segmentOffset + start.GetSize () - m_headerLength; 
+          m_lastOffset = m_segmentOffset + start.GetSize () - m_headerLength;
         }
     }
   else // if ( m_dataControlBit == CONTROL_PDU )
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/model/lte-rlc-um.cc ns-3.36/src/lte/model/lte-rlc-um.cc
--- ns-3.35/src/lte/model/lte-rlc-um.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/model/lte-rlc-um.cc	2022-04-30 18:23:58.042734400 -0700
@@ -142,7 +142,6 @@
   // Build Data field
   uint32_t nextSegmentSize = txOpParams.bytes - 2;
   uint32_t nextSegmentId = 1;
-  uint32_t dataFieldTotalSize = 0;
   uint32_t dataFieldAddedSize = 0;
   std::vector < Ptr<Packet> > dataField;
 
@@ -241,7 +240,6 @@
 
           // Add Segment to Data field
           dataFieldAddedSize = newSegment->GetSize ();
-          dataFieldTotalSize += dataFieldAddedSize;
           dataField.push_back (newSegment);
           newSegment = 0;
 
@@ -263,7 +261,6 @@
           NS_LOG_LOGIC ("    IF nextSegmentSize - firstSegment->GetSize () <= 2 || txBuffer.size == 0");
           // Add txBuffer.FirstBuffer to DataField
           dataFieldAddedSize = firstSegment->GetSize ();
-          dataFieldTotalSize += dataFieldAddedSize;
           dataField.push_back (firstSegment);
           firstSegment = 0;
 
@@ -293,7 +290,6 @@
           NS_LOG_LOGIC ("    IF firstSegment < NextSegmentSize && txBuffer.size > 0");
           // Add txBuffer.FirstBuffer to DataField
           dataFieldAddedSize = firstSegment->GetSize ();
-          dataFieldTotalSize += dataFieldAddedSize;
           dataField.push_back (firstSegment);
 
           // ExtensionBit (Next_Segment - 1) = 1
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/model/lte-rrc-header.cc ns-3.36/src/lte/model/lte-rrc-header.cc
--- ns-3.35/src/lte/model/lte-rrc-header.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/model/lte-rrc-header.cc	2022-04-30 18:23:58.046734300 -0700
@@ -651,23 +651,23 @@
     }
 
     std::bitset<4> measResultOptional;
-    measResultOptional.set (3,  measResults.haveScellsMeas);
+    measResultOptional.set (3,  measResults.haveMeasResultServFreqList);
     measResultOptional.set (2, false); //LocationInfo-r10
     measResultOptional.set (1, false); // MeasResultForECID-r9
     measResultOptional.set (0, measResults.haveMeasResultNeighCells);
-    SerializeSequence(measResultOptional,true);
+    SerializeSequence (measResultOptional, true);
 
   // Serialize measId
   SerializeInteger (measResults.measId,1,MAX_MEAS_ID);
 
-  // Serialize measResultServCell sequence
-  SerializeSequence (std::bitset<0> (0),false);
+  // Serialize measResultPCell sequence
+  SerializeSequence (std::bitset<0> (0), false);
 
   // Serialize rsrpResult
-  SerializeInteger (measResults.rsrpResult,0,97);
+  SerializeInteger (measResults.measResultPCell.rsrpResult,0,97);
 
   // Serialize rsrqResult
-  SerializeInteger (measResults.rsrqResult,0,34);
+  SerializeInteger (measResults.measResultPCell.rsrqResult,0,34);
 
   if (measResults.haveMeasResultNeighCells)
     {
@@ -728,40 +728,48 @@
             }
         }
     }
-    if (measResults.haveScellsMeas)
-      {
-        // Serialize measResultNeighCells
-        SerializeSequenceOf (measResults.measScellResultList.measResultScell.size (),MAX_SCELL_REPORT,1);
-        // serialize MeasResultServFreqList-r10 elements in the list
-        std::list<LteRrcSap::MeasResultScell>::iterator it;
-        for (it = measResults.measScellResultList.measResultScell.begin (); it != measResults.measScellResultList.measResultScell.end (); it++)
-          {
-            // Serialize measId
-            SerializeInteger (it->servFreqId,0,MAX_MEAS_ID); // ToDo: change with FreqId, currently is the componentCarrierId
-             // Serialize MeasResultServFreqList
-            std::bitset<2> measResultScellPresent;
-            measResultScellPresent[0] = measResults.measScellResultList.haveMeasurementResultsServingSCells;
-            measResultScellPresent[1] = measResults.measScellResultList.haveMeasurementResultsNeighCell; // Not implemented
-            SerializeSequence (measResultScellPresent,true);
-
-            // Serialize measResult
-            std::bitset<2> measResultScellFieldsPresent;
-            measResultScellFieldsPresent[1] = it->haveRsrpResult;
-            measResultScellFieldsPresent[0] = it->haveRsrqResult;
-            SerializeSequence (measResultScellFieldsPresent,true);
 
-            if (it->haveRsrpResult)
-              {
-                SerializeInteger (it->rsrpResult,0,97);
-              }
+  // measResultServFreqList-r10 serialization
+  if (measResults.haveMeasResultServFreqList)
+    {
+      // Serialize measResultServFreqList-r10
+      SerializeSequenceOf (measResults.measResultServFreqList.size (), MAX_SCELL_REPORT, 1);
+      // serialize MeasResultServFreqList-r10 elements in the list
+      for (const auto &it: measResults.measResultServFreqList)
+        {
+          // Serialize MeasResultServFreq-r10
+          std::bitset<2> measResultServFreqPresent;
+          measResultServFreqPresent[0] = it.haveMeasResultSCell;
+          measResultServFreqPresent[1] = it.haveMeasResultBestNeighCell;
+          SerializeSequence (measResultServFreqPresent, true);
 
-            if (it->haveRsrqResult)
-              {
-                SerializeInteger (it->rsrqResult,0,34);
-              }
-            
-          }
-      }
+          // Serialize servFreqId-r10
+          SerializeInteger (it.servFreqId, 0, 7);
+
+          if (it.haveMeasResultSCell)
+            {
+              // Serialize rsrpResultSCell-r10
+              SerializeInteger (it.measResultSCell.rsrpResult, 0, 97);
+
+              // Serialize rsrqResultSCell-r10
+              SerializeInteger (it.measResultSCell.rsrqResult, 0, 34);
+            }
+
+          if (it.haveMeasResultBestNeighCell)
+            {
+              // Serialize physCellId-r10
+              SerializeInteger (it.measResultBestNeighCell.physCellId, 0, 503);
+
+              // Serialize rsrpResultNCell-r10
+              SerializeInteger (it.measResultBestNeighCell.rsrpResult, 0, 97);
+
+              // Serialize rsrqResultNCell-r10
+              SerializeInteger (it.measResultBestNeighCell.rsrqResult, 0, 34);
+            }
+
+          NS_ASSERT (!it.haveMeasResultBestNeighCell); // Not implemented
+        }
+    }
 }
 
 void
@@ -1729,22 +1737,32 @@
   {
     // 3 optional fields. Extension marker not present.
     std::bitset<3> noncriticalExtension_v1020;
-    noncriticalExtension_v1020.set (2,0); // No sCellToRealeaseList-r10
-    noncriticalExtension_v1020.set (1,1); // sCellToAddModList-r10
-    noncriticalExtension_v1020.set (0,0); // No nonCriticalExtension RRCConnectionReconfiguration-v1130-IEs
+    noncriticalExtension_v1020.set (2, !nonCriticalExtension.sCellToReleaseList.empty ()); // sCellToReleaseList-r10
+    noncriticalExtension_v1020.set (1, !nonCriticalExtension.sCellToAddModList.empty ()); // sCellToAddModList-r10
+    noncriticalExtension_v1020.set (0, 0); // No nonCriticalExtension RRCConnectionReconfiguration-v1130-IEs
     SerializeSequence (noncriticalExtension_v1020,false);
-    if (!nonCriticalExtension.sCellsToAddModList.empty ())
+
+    if (!nonCriticalExtension.sCellToReleaseList.empty ())
+      {
+        SerializeSequenceOf (nonCriticalExtension.sCellToReleaseList.size (), MAX_OBJECT_ID, 1);
+        for (uint8_t sCellIndex: nonCriticalExtension.sCellToReleaseList)
+          {
+            SerializeInteger (sCellIndex, 1, 7); // sCellIndex-r10
+          }
+      }
+
+    if (!nonCriticalExtension.sCellToAddModList.empty ())
       {
-        SerializeSequenceOf (nonCriticalExtension.sCellsToAddModList.size (),MAX_OBJECT_ID,1);
-        for (std::list<LteRrcSap::SCellToAddMod>::iterator it = nonCriticalExtension.sCellsToAddModList.begin (); it != nonCriticalExtension.sCellsToAddModList.end (); it++)
+        SerializeSequenceOf (nonCriticalExtension.sCellToAddModList.size (), MAX_OBJECT_ID, 1);
+        for (auto &it: nonCriticalExtension.sCellToAddModList)
           {
             std::bitset<4> sCellToAddMod_r10;
             sCellToAddMod_r10.set (3,1); // sCellIndex
             sCellToAddMod_r10.set (2,1); // CellIdentification
             sCellToAddMod_r10.set (1,1); // RadioResourceConfigCommonSCell
-            sCellToAddMod_r10.set (0,it->haveRadioResourceConfigDedicatedSCell); // No nonCriticalExtension RRC
+            sCellToAddMod_r10.set (0, it.haveRadioResourceConfigDedicatedSCell); // No nonCriticalExtension RRC
             SerializeSequence (sCellToAddMod_r10, false);
-            SerializeInteger (it->sCellIndex,1,MAX_OBJECT_ID); //sCellIndex
+            SerializeInteger (it.sCellIndex, 1, 7); // sCellIndex-r10
 
             // Serialize CellIdentification
             std::bitset<2> cellIdentification_r10;
@@ -1752,25 +1770,20 @@
             cellIdentification_r10.set(0,1); // dl-CarrierFreq-r10
             SerializeSequence (cellIdentification_r10, false);
 
-            SerializeInteger (it->cellIdentification.physCellId,1,65536);
-            SerializeInteger (it->cellIdentification.dlCarrierFreq,1,MAX_EARFCN);
+            SerializeInteger (it.cellIdentification.physCellId, 1, 65536);
+            SerializeInteger (it.cellIdentification.dlCarrierFreq, 1, MAX_EARFCN);
             
             //Serialize RadioResourceConfigCommonSCell
-            SerializeRadioResourceConfigCommonSCell (it->radioResourceConfigCommonSCell);
+            SerializeRadioResourceConfigCommonSCell (it.radioResourceConfigCommonSCell);
             
-            if (it->haveRadioResourceConfigDedicatedSCell)
+            if (it.haveRadioResourceConfigDedicatedSCell)
               {
                 //Serialize RadioResourceConfigDedicatedSCell
-                SerializeRadioResourceDedicatedSCell (it->radioResourceConfigDedicateSCell);
+                SerializeRadioResourceDedicatedSCell (it.radioResourceConfigDedicatedSCell);
               }
             
           }
       }
-    else
-      {
-        //        NS_ASSERT_MSG ( this << "NonCriticalExtension.sCellsToAddModList cannot be empty ", false);
-      }
-  
   }
   void
   RrcAsn1Header::SerializeRadioResourceConfigCommonSCell (LteRrcSap::RadioResourceConfigCommonSCell rrccsc) const
@@ -2600,44 +2613,69 @@
         bIterator = DeserializeSequence (&nonCriticalExtension_v920, false, bIterator);
         if (nonCriticalExtension_v920[0])
           {
-            // Continue to deserialize futere Release optional fields
+            // Continue to deserialize future Release optional fields
             std::bitset<3> nonCriticalExtension_v1020;
             bIterator = DeserializeSequence (&nonCriticalExtension_v1020, false, bIterator);
-            NS_ASSERT (!nonCriticalExtension_v1020[2]); // No sCellToRealeaseList-r10
-            NS_ASSERT (nonCriticalExtension_v1020[1]); // sCellToAddModList-r10
-            NS_ASSERT (!nonCriticalExtension_v1020[0]); // No nonCriticalExtension RRCConnectionReconfiguration-v1130-IEs
 
-            int numElems;
-            bIterator = DeserializeSequenceOf (&numElems,MAX_OBJECT_ID,1,bIterator);
-            nonCriticalExtension->sCellsToAddModList.clear ();
-            // Deserialize SCellToAddMod
-            for (int i = 0; i < numElems; i++)
+            if (nonCriticalExtension_v1020[2])
               {
-                std::bitset<4> sCellToAddMod_r10;
-                bIterator = DeserializeSequence (&sCellToAddMod_r10, false, bIterator); 
-                
-                LteRrcSap::SCellToAddMod sctam;
-                // Deserialize sCellIndex
-                NS_ASSERT (sCellToAddMod_r10[3]); // sCellIndex
-                int n;
-                bIterator = DeserializeInteger (&n,1,MAX_OBJECT_ID,bIterator);
-                sctam.sCellIndex = n;
-                // Deserialize CellIdentification
-                NS_ASSERT (sCellToAddMod_r10[2]); // CellIdentification
-                bIterator = DeserializeCellIdentification (&sctam.cellIdentification, bIterator);
-
-                // Deserialize RadioResourceConfigCommonSCell
-                NS_ASSERT (sCellToAddMod_r10[1]);
-                bIterator = DeserializeRadioResourceConfigCommonSCell (&sctam.radioResourceConfigCommonSCell, bIterator);
-                sctam.haveRadioResourceConfigDedicatedSCell = sCellToAddMod_r10[0];
-                if (sCellToAddMod_r10[0])
+                // sCellToReleaseList-r10
+                int numElems;
+
+                bIterator = DeserializeSequenceOf (&numElems, MAX_OBJECT_ID, 1, bIterator);
+                nonCriticalExtension->sCellToReleaseList.clear ();
+
+                for (int i = 0; i < numElems; i++)
                   {
-                    //Deserialize RadioResourceConfigDedicatedSCell
-                    bIterator = DeserializeRadioResourceConfigDedicatedSCell (&sctam.radioResourceConfigDedicateSCell, bIterator);
+                    // Deserialize SCellIndex-r10
+                    int sCellIndex;
+                    bIterator = DeserializeInteger (&sCellIndex, 1, 7, bIterator);
+                    nonCriticalExtension->sCellToReleaseList.push_back (sCellIndex);
                   }
+              }
+
+            if (nonCriticalExtension_v1020[1])
+              {
+                // sCellToAddModList-r10
+
+                int numElems;
+                bIterator = DeserializeSequenceOf (&numElems, MAX_OBJECT_ID, 1, bIterator);
+                nonCriticalExtension->sCellToAddModList.clear ();
+                // Deserialize SCellToAddMod
+                for (int i = 0; i < numElems; i++)
+                  {
+                    std::bitset<4> sCellToAddMod_r10;
+                    bIterator = DeserializeSequence (&sCellToAddMod_r10, false, bIterator);
 
-                nonCriticalExtension->sCellsToAddModList.insert (nonCriticalExtension->sCellsToAddModList.end (), sctam);
+                    LteRrcSap::SCellToAddMod sctam;
+                    // Deserialize sCellIndex
+                    NS_ASSERT (sCellToAddMod_r10[3]); // sCellIndex
+                    int n;
+                    bIterator = DeserializeInteger (&n, 1, 7, bIterator);
+                    sctam.sCellIndex = n;
+                    // Deserialize CellIdentification
+                    NS_ASSERT (sCellToAddMod_r10[2]); // CellIdentification
+                    bIterator = DeserializeCellIdentification (&sctam.cellIdentification, bIterator);
+
+                    // Deserialize RadioResourceConfigCommonSCell
+                    NS_ASSERT (sCellToAddMod_r10[1]);
+                    bIterator = DeserializeRadioResourceConfigCommonSCell (&sctam.radioResourceConfigCommonSCell, bIterator);
+                    if (sCellToAddMod_r10[0])
+                      {
+                        sctam.haveRadioResourceConfigDedicatedSCell = true;
+                        //Deserialize RadioResourceConfigDedicatedSCell
+                        bIterator = DeserializeRadioResourceConfigDedicatedSCell (&sctam.radioResourceConfigDedicatedSCell, bIterator);
+                      }
+                    else
+                      {
+                        sctam.haveRadioResourceConfigDedicatedSCell = false; 
+                      }
+
+                    nonCriticalExtension->sCellToAddModList.push_back (sctam);
+                  }
               }
+
+            NS_ASSERT (!nonCriticalExtension_v1020[0]); // No nonCriticalExtension RRCConnectionReconfiguration-v1130-IEs
           }
       }
 
@@ -3553,14 +3591,14 @@
 
   // Deserialize rsrpResult
   bIterator = DeserializeInteger (&n, 0, 97, bIterator);
-  measResults->rsrpResult = n;
+  measResults->measResultPCell.rsrpResult = n;
 
   // Deserialize rsrqResult
   bIterator = DeserializeInteger (&n, 0, 34, bIterator);
-  measResults->rsrqResult = n;
+  measResults->measResultPCell.rsrqResult = n;
 
   measResults->haveMeasResultNeighCells = measResultOptionalPresent[0];
-  measResults->haveScellsMeas = measResultOptionalPresent[3];
+  measResults->haveMeasResultServFreqList = measResultOptionalPresent[3];
   if ( measResults->haveMeasResultNeighCells)
     {
       int measResultNeighCellsChoice;
@@ -3663,51 +3701,53 @@
           // ...
         }
     }
-    if (measResults->haveScellsMeas)
+    if (measResults->haveMeasResultServFreqList)
       {
-
+      
         int numElems;
-        bIterator = DeserializeSequenceOf (&numElems,MAX_SCELL_REPORT,1,bIterator);
+        bIterator = DeserializeSequenceOf (&numElems, MAX_SCELL_REPORT, 1, bIterator);
         for (int i = 0; i < numElems; i++)
           {
-            LteRrcSap::MeasResultScell measResultScell;
-            int measScellId;
-            // Deserialize measId
-            bIterator = DeserializeInteger (&measScellId, 1,MAX_SCELL_REPORT,bIterator);
-            measResultScell.servFreqId = measScellId;
+            LteRrcSap::MeasResultServFreq measResultServFreq;
+
+            // Deserialize MeasResultServFreq-r10
             std::bitset<2> measResultScellPresent;
-            bIterator = DeserializeSequence (&measResultScellPresent,true,bIterator);
-            measResults->measScellResultList.haveMeasurementResultsServingSCells = measResultScellPresent[0];
-           measResults->measScellResultList.haveMeasurementResultsNeighCell = measResultScellPresent[1];
-           if (measResults->measScellResultList.haveMeasurementResultsServingSCells)
-             {
-               // Deserialize measResult
-               std::bitset<2> measResultOpts;
-               bIterator = DeserializeSequence (&measResultOpts, true, bIterator);
-
-               measResultScell.haveRsrpResult = measResultOpts[1];
-               if (measResultOpts[1])
-                 {
-                   // Deserialize rsrpResult
-                   bIterator = DeserializeInteger (&n,0,97,bIterator);
-                   measResultScell.rsrpResult = n;
-                 }
-
-               measResultScell.haveRsrqResult = measResultOpts[0];
-               if (measResultOpts[0])
-                 {
-                   // Deserialize rsrqResult
-                   bIterator = DeserializeInteger (&n,0,34,bIterator);
-                   measResultScell.rsrqResult = n;
-                 }
-             }
-           if (measResults->measScellResultList.haveMeasurementResultsNeighCell)
-             {
-               // Deserialize measResultBestNeighCell
-             }
-           measResults->measScellResultList.measResultScell.push_back (measResultScell);
+            bIterator = DeserializeSequence (&measResultScellPresent, true, bIterator);
+            measResultServFreq.haveMeasResultSCell = measResultScellPresent[0];
+            measResultServFreq.haveMeasResultBestNeighCell = measResultScellPresent[1];
+
+            // Deserialize servFreqId-r10
+            int servFreqId;
+            bIterator = DeserializeInteger (&servFreqId, 0, 7, bIterator);
+            measResultServFreq.servFreqId = servFreqId;
+
+            if (measResultServFreq.haveMeasResultSCell)
+              {
+                // Deserialize rsrpResult
+                bIterator = DeserializeInteger (&n, 0, 97, bIterator);
+                measResultServFreq.measResultSCell.rsrpResult = n;
+
+                // Deserialize rsrqResult
+                bIterator = DeserializeInteger (&n, 0, 34, bIterator);
+                measResultServFreq.measResultSCell.rsrqResult = n;
+              }
+
+            if (measResultServFreq.haveMeasResultBestNeighCell)
+              {
+                // Deserialize physCellId-r10
+                bIterator = DeserializeInteger (&n, 0, 503, bIterator);
+                measResultServFreq.measResultBestNeighCell.physCellId = n;
+
+                // Deserialize rsrpResultNCell-r10
+                bIterator = DeserializeInteger (&n, 0, 97, bIterator);
+                measResultServFreq.measResultBestNeighCell.rsrpResult = n;
+
+                // Deserialize rsrqResultNCell-r10
+                bIterator = DeserializeInteger (&n, 0, 34, bIterator);
+                measResultServFreq.measResultBestNeighCell.rsrqResult = n;
+              }
+            measResults->measResultServFreqList.push_back (measResultServFreq);
           }
-        
       }
   return bIterator;
 }
@@ -5197,7 +5237,7 @@
         // Serialize NonCriticalExtension RRCConnectionReconfiguration-v920-IEs sequence:
         // 3 optional fields. Extension marker not present.
         std::bitset<3> noncriticalExtension_v920;
-        noncriticalExtension_v920.set (1,0); // No otehrConfig-r9
+        noncriticalExtension_v920.set (1,0); // No otherConfig-r9
         noncriticalExtension_v920.set (1,0); // No fullConfig-r9
         //Enable RRCCoonectionReconfiguration-v1020-IEs
         noncriticalExtension_v920.set (0,m_haveNonCriticalExtension); // Implemented nonCriticalExtension because compatibility with R10 - CA
@@ -6754,8 +6794,8 @@
 MeasurementReportHeader::Print (std::ostream &os) const
 {
   os << "measId = " << (int)m_measurementReport.measResults.measId << std::endl;
-  os << "rsrpResult = " << (int)m_measurementReport.measResults.rsrpResult << std::endl;
-  os << "rsrqResult = " << (int)m_measurementReport.measResults.rsrqResult << std::endl;
+  os << "rsrpResult = " << (int)m_measurementReport.measResults.measResultPCell.rsrpResult << std::endl;
+  os << "rsrqResult = " << (int)m_measurementReport.measResults.measResultPCell.rsrqResult << std::endl;
   os << "haveMeasResultNeighCells = " << (int)m_measurementReport.measResults.haveMeasResultNeighCells << std::endl;
 
   if (m_measurementReport.measResults.haveMeasResultNeighCells)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/model/lte-rrc-header.h ns-3.36/src/lte/model/lte-rrc-header.h
--- ns-3.35/src/lte/model/lte-rrc-header.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/model/lte-rrc-header.h	2022-04-30 18:23:58.046734300 -0700
@@ -827,8 +827,8 @@
   LteRrcSap::MobilityControlInfo m_mobilityControlInfo; ///< the modility control info
   bool m_haveRadioResourceConfigDedicated; ///< have radio resource config dedicated?
   LteRrcSap::RadioResourceConfigDedicated m_radioResourceConfigDedicated; ///< the radio resource config dedicated
-  bool m_haveNonCriticalExtension; ///< Have critical extension
-  LteRrcSap::NonCriticalExtensionConfiguration m_nonCriticalExtension; ///< the critical extension
+  bool m_haveNonCriticalExtension; ///< Have non-critical extension
+  LteRrcSap::NonCriticalExtensionConfiguration m_nonCriticalExtension; ///< the non-critical extension
 };
 
 /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/model/lte-rrc-protocol-ideal.cc ns-3.36/src/lte/model/lte-rrc-protocol-ideal.cc
--- ns-3.35/src/lte/model/lte-rrc-protocol-ideal.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/model/lte-rrc-protocol-ideal.cc	2022-04-30 18:23:58.046734300 -0700
@@ -373,7 +373,7 @@
               if (ueRrc->GetCellId () == cellId)
                 {       
                   NS_LOG_LOGIC ("sending SI to IMSI " << ueDev->GetImsi ());
-                  ueRrc->GetLteUeRrcSapProvider ()->RecvSystemInformation (msg);
+                  
                   Simulator::Schedule (RRC_IDEAL_MSG_DELAY, 
                                        &LteUeRrcSapProvider::RecvSystemInformation,
                                        ueRrc->GetLteUeRrcSapProvider (), 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/model/lte-rrc-sap.h ns-3.36/src/lte/model/lte-rrc-sap.h
--- ns-3.35/src/lte/model/lte-rrc-sap.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/model/lte-rrc-sap.h	2022-04-30 18:23:58.046734300 -0700
@@ -632,6 +632,13 @@
     std::list<uint32_t> plmnIdentityList; ///< PLMN identity list
   };
 
+  /// MeasResultPCell structure
+  struct MeasResultPCell
+  {
+    uint8_t rsrpResult; ///< the RSRP result
+    uint8_t rsrqResult; ///< the RSRQ result
+  };
+
   /// MeasResultEutra structure
   struct MeasResultEutra
   {
@@ -644,46 +651,39 @@
     uint8_t rsrqResult; ///< RSRQ result
   };
 
-  /// MeasResultScell structure
-  struct MeasResultScell
+  /// MeasResultSCell structure
+  struct MeasResultSCell
   {
-    uint16_t servFreqId; ///< service frequency ID
-    bool haveRsrpResult; ///< have RSRP result?
     uint8_t rsrpResult; ///< the RSRP result
-    bool haveRsrqResult; ///< have RSRQ result?
     uint8_t rsrqResult; ///< the RSRQ result
   };
 
   /// MeasResultBestNeighCell structure
   struct MeasResultBestNeighCell
   {
-    uint16_t servFreqId; ///< service frequency ID
     uint16_t physCellId; ///< physical cell ID
-    bool haveRsrpResult; ///< have RSRP result?
     uint8_t rsrpResult; ///< the RSRP result
-    bool haveRsrqResult; ///< have RSRQ result?
     uint8_t rsrqResult; ///< the RSRQ result
   };
 
-  /// MeasResultServFreqList
-  struct MeasResultServFreqList
-  {
-    bool haveMeasurementResultsServingSCells; ///< have measure results serving Scells
-    std::list<MeasResultScell> measResultScell; ///< measure results Scells
-    bool haveMeasurementResultsNeighCell; ///< always false since not implemented
-    std::list<MeasResultBestNeighCell> measResultBestNeighCell; ///< measure result best neighbor cell
+  /// MeasResultServFreq structure
+  struct MeasResultServFreq {
+    uint16_t servFreqId; ///< serving cell index
+    bool haveMeasResultSCell; ///< have measResultSCell?
+    MeasResultSCell measResultSCell; ///< SCell measurement results
+    bool haveMeasResultBestNeighCell; ///< have measResultBestNeighCell?
+    MeasResultBestNeighCell measResultBestNeighCell; ///< best neighbor cell measurement results
   };
 
   /// MeasResults structure
   struct MeasResults
   {
     uint8_t measId; ///< measure ID
-    uint8_t rsrpResult; ///< RSRP result
-    uint8_t rsrqResult; ///< RSRQ result
+    MeasResultPCell measResultPCell; ///< measurement result primary cell
     bool haveMeasResultNeighCells; ///< have measure result neighbor cells
     std::list<MeasResultEutra> measResultListEutra; ///< measure result list eutra
-    bool haveScellsMeas; ///< has SCells measure
-    MeasResultServFreqList measScellResultList; ///< measure SCell result list
+    bool haveMeasResultServFreqList; ///< has measResultServFreqList-r10
+    std::list<MeasResultServFreq> measResultServFreqList; ///< MeasResultServFreqList-r10
   };
 
   // Messages
@@ -822,14 +822,14 @@
     CellIdentification cellIdentification; ///< cell identification
     RadioResourceConfigCommonSCell radioResourceConfigCommonSCell; ///< radio resource config common SCell
     bool haveRadioResourceConfigDedicatedSCell; ///< have radio resource config dedicated SCell?
-    RadioResourceConfigDedicatedSCell radioResourceConfigDedicateSCell; ///< radio resource config dedicated SCell
+    RadioResourceConfigDedicatedSCell radioResourceConfigDedicatedSCell; ///< radio resource config dedicated SCell
   };
 
   /// NonCriticalExtensionConfiguration structure
   struct NonCriticalExtensionConfiguration
   {
-    std::list<SCellToAddMod> sCellsToAddModList; ///< SCell to add mod list
-    std::list<uint32_t> sCellToReleaseList; ///< SCell to release list
+    std::list<SCellToAddMod> sCellToAddModList; ///< SCell to add mod list
+    std::list<uint8_t> sCellToReleaseList; ///< SCell to release list
   };
 
   /// RrcConnectionReconfiguration structure
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/model/lte-spectrum-phy.cc ns-3.36/src/lte/model/lte-spectrum-phy.cc
--- ns-3.35/src/lte/model/lte-spectrum-phy.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/model/lte-spectrum-phy.cc	2022-04-30 18:23:58.046734300 -0700
@@ -348,6 +348,13 @@
   m_rxPacketBurstList.clear ();
   m_txPacketBurst = 0;
   m_rxSpectrumModel = 0;
+
+  // Detach from the channel, because receiving any signal without
+  // spectrum model is an error.
+  if (m_channel)
+    {
+      m_channel->RemoveRx (this);
+    }
 }
 
 
@@ -403,8 +410,8 @@
 }
 
 
-Ptr<AntennaModel>
-LteSpectrumPhy::GetRxAntenna () const
+Ptr<Object>
+LteSpectrumPhy::GetAntenna () const
 {
   return m_antenna;
 }
@@ -1011,7 +1018,7 @@
             }
           TbStats_t tbStats = LteMiErrorModel::GetTbDecodificationStats (m_sinrPerceived, (*itTb).second.rbBitmap, (*itTb).second.size, (*itTb).second.mcs, harqInfoList);
           (*itTb).second.mi = tbStats.mi;
-          (*itTb).second.corrupt = m_random->GetValue () > tbStats.tbler ? false : true;
+          (*itTb).second.corrupt = !(m_random->GetValue () > tbStats.tbler);
           NS_LOG_DEBUG (this << "RNTI " << (*itTb).first.m_rnti << " size " << (*itTb).second.size << " mcs " << (uint32_t)(*itTb).second.mcs << " bitmap " << (*itTb).second.rbBitmap.size () << " layer " << (uint16_t)(*itTb).first.m_layer << " TBLER " << tbStats.tbler << " corrupted " << (*itTb).second.corrupt);
           // fire traces on DL/UL reception PHY stats
           PhyReceptionStatParameters params;
@@ -1193,7 +1200,7 @@
   if (m_ctrlErrorModelEnabled)
     {
       double  errorRate = LteMiErrorModel::GetPcfichPdcchError (m_sinrPerceived);
-      error = m_random->GetValue () > errorRate ? false : true;
+      error = !(m_random->GetValue () > errorRate);
       NS_LOG_DEBUG (this << " PCFICH-PDCCH Decodification, errorRate " << errorRate << " error " << error);
     }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/model/lte-spectrum-phy.h ns-3.36/src/lte/model/lte-spectrum-phy.h
--- ns-3.35/src/lte/model/lte-spectrum-phy.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/model/lte-spectrum-phy.h	2022-04-30 18:23:58.046734300 -0700
@@ -180,7 +180,7 @@
   Ptr<MobilityModel> GetMobility () const;
   Ptr<NetDevice> GetDevice () const;
   Ptr<const SpectrumModel> GetRxSpectrumModel () const;
-  Ptr<AntennaModel> GetRxAntenna () const;
+  Ptr<Object> GetAntenna () const;
   void StartRx (Ptr<SpectrumSignalParameters> params);
   /**
    * \brief Start receive data function
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/model/lte-spectrum-value-helper.cc ns-3.36/src/lte/model/lte-spectrum-value-helper.cc
--- ns-3.35/src/lte/model/lte-spectrum-value-helper.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/model/lte-spectrum-value-helper.cc	2022-04-30 18:23:58.046734300 -0700
@@ -30,6 +30,16 @@
 // just needed to log a std::vector<int> properly...
 namespace std {
 
+/**
+ * \brief Stream insertion operator.
+ * 
+ * \note This function scope is stricly local, and can not be 
+ * used in other source files.
+ *
+ * \param [in] os The reference to the output stream.
+ * \param [in] v The std::vector<int>.
+ * \returns The reference to the output stream.
+ */
 ostream&
 operator << (ostream& os, const vector<int>& v)
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/model/lte-ue-component-carrier-manager.h ns-3.36/src/lte/model/lte-ue-component-carrier-manager.h
--- ns-3.35/src/lte/model/lte-ue-component-carrier-manager.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/model/lte-ue-component-carrier-manager.h	2022-04-30 18:23:58.046734300 -0700
@@ -106,7 +106,7 @@
 
   std::map<uint8_t, LteMacSapUser*> m_lcAttached; //!< Map of pointers to SAP interfaces of the RLC instance of the flows of this UE.
   std::map<uint8_t, std::map<uint8_t, LteMacSapProvider*> > m_componentCarrierLcMap; //!< Flow configuration per flow Id of this UE.
-  uint16_t m_noOfComponentCarriers; //!<// The number of component carriers that this UE can support.
+  uint8_t m_noOfComponentCarriers; //!< The number of component carriers that this UE can support.
   std::map <uint8_t, LteMacSapProvider*> m_macSapProvidersMap; //!< Map of pointers to SAP to interfaces of the MAC instance if the flows of this UE.
 
 }; // end of class LteUeComponentCarrierManager
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/model/lte-ue-cphy-sap.h ns-3.36/src/lte/model/lte-ue-cphy-sap.h
--- ns-3.35/src/lte/model/lte-ue-cphy-sap.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/model/lte-ue-cphy-sap.h	2022-04-30 18:23:58.046734300 -0700
@@ -104,6 +104,18 @@
   virtual void SynchronizeWithEnb (uint16_t cellId, uint32_t dlEarfcn) = 0;
 
   /**
+   * \brief Get PHY cell ID
+   * \return cell ID this PHY is synchronized to
+   */
+  virtual uint16_t GetCellId () = 0;
+
+  /**
+   * \brief Get PHY DL EARFCN
+   * \return DL EARFCN this PHY is synchronized to
+   */
+  virtual uint32_t GetDlEarfcn () = 0;
+
+  /**
    * \param dlBandwidth the DL bandwidth in number of PRBs
    */
   virtual void SetDlBandwidth (uint16_t dlBandwidth) = 0;
@@ -316,6 +328,8 @@
   virtual void StartCellSearch (uint32_t dlEarfcn);
   virtual void SynchronizeWithEnb (uint16_t cellId);
   virtual void SynchronizeWithEnb (uint16_t cellId, uint32_t dlEarfcn);
+  virtual uint16_t GetCellId ();
+  virtual uint32_t GetDlEarfcn ();
   virtual void SetDlBandwidth (uint16_t dlBandwidth);
   virtual void ConfigureUplink (uint32_t ulEarfcn, uint16_t ulBandwidth);
   virtual void ConfigureReferenceSignalPower (int8_t referenceSignalPower);
@@ -374,6 +388,20 @@
 }
 
 template <class C>
+uint16_t
+MemberLteUeCphySapProvider<C>::GetCellId ()
+{
+  return m_owner->DoGetCellId ();
+}
+
+template <class C>
+uint32_t
+MemberLteUeCphySapProvider<C>::GetDlEarfcn ()
+{
+  return m_owner->DoGetDlEarfcn ();
+}
+
+template <class C>
 void
 MemberLteUeCphySapProvider<C>::SetDlBandwidth (uint16_t dlBandwidth)
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/model/lte-ue-phy.cc ns-3.36/src/lte/model/lte-ue-phy.cc
--- ns-3.35/src/lte/model/lte-ue-phy.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/model/lte-ue-phy.cc	2022-04-30 18:23:58.050734500 -0700
@@ -1375,6 +1375,10 @@
   m_a30CqiLast = Simulator::Now ();
   m_paLinear = 1;
 
+  m_rsReceivedPowerUpdated = false;
+  m_rsInterferencePowerUpdated = false;
+  m_dataInterferencePowerUpdated = false;
+
   m_packetBurstQueue.clear ();
   m_controlMessagesQueue.clear ();
   m_subChannelsForTransmissionQueue.clear ();
@@ -1441,6 +1445,18 @@
   SwitchToState (SYNCHRONIZED);
 }
 
+uint16_t
+LteUePhy::DoGetCellId ()
+{
+  return m_cellId;
+}
+
+uint32_t
+LteUePhy::DoGetDlEarfcn ()
+{
+  return m_dlEarfcn;
+}
+
 void
 LteUePhy::DoSetDlBandwidth (uint16_t dlBandwidth)
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/model/lte-ue-phy.h ns-3.36/src/lte/model/lte-ue-phy.h
--- ns-3.35/src/lte/model/lte-ue-phy.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/model/lte-ue-phy.h	2022-04-30 18:23:58.050734500 -0700
@@ -507,7 +507,18 @@
    */
   void DoSynchronizeWithEnb (uint16_t cellId, uint32_t dlEarfcn);
   /**
-   * \brief Set DL bandwidth function
+   *
+   * Get cell ID
+   * \returns cell ID
+   */
+  uint16_t DoGetCellId ();
+  /**
+   * Get DL EARFCN
+   * \returns DL EARFCN
+   */
+  uint32_t DoGetDlEarfcn ();
+  /**
+   * Set DL bandwidth function
    *
    * \param dlBandwidth the DL bandwidth
    */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/model/lte-ue-phy-sap.h ns-3.36/src/lte/model/lte-ue-phy-sap.h
--- ns-3.35/src/lte/model/lte-ue-phy-sap.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/model/lte-ue-phy-sap.h	2022-04-30 18:23:58.050734500 -0700
@@ -44,7 +44,6 @@
    * \brief Send the MAC PDU to the channel
    *
    * \param p the MAC PDU to send
-   * \return true if
    */
   virtual void SendMacPdu (Ptr<Packet> p) = 0;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/model/lte-ue-rrc.cc ns-3.36/src/lte/model/lte-ue-rrc.cc
--- ns-3.35/src/lte/model/lte-ue-rrc.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/model/lte-ue-rrc.cc	2022-04-30 18:23:58.050734500 -0700
@@ -114,15 +114,6 @@
   "CONNECTED_REESTABLISHING"
 };
 
-/**
- * \param s The UE RRC state.
- * \return The string representation of the given state.
- */
-static const std::string & ToString (LteUeRrc::State s)
-{
-  return g_ueRrcStateName[s];
-}
-
 
 /////////////////////////////
 // ue RRC methods
@@ -472,6 +463,20 @@
   return m_cellId;
 }
 
+bool
+LteUeRrc::IsServingCell (uint16_t cellId) const
+{
+  NS_LOG_FUNCTION (this);
+  for (auto &cphySap: m_cphySapProvider)
+    {
+      if (cellId == cphySap->GetCellId ())
+        {
+          return true;
+        }
+    }
+  return false;
+}
+
 
 uint8_t
 LteUeRrc::GetUlBandwidth () const
@@ -924,16 +929,10 @@
         {
           triggering = false; // report is triggered only when an event is on the primary carrier
           // in this case the measurement received is related to secondary carriers
-          // measurements related to secondary carriers are saved on a different portion of memory
-          SaveScellUeMeasurements (newMeasIt->m_cellId, newMeasIt->m_rsrp,
-                                   newMeasIt->m_rsrq, useLayer3Filtering,
-                                   params.m_componentCarrierId );
-        }
-      else
-        {
-          SaveUeMeasurements (newMeasIt->m_cellId, newMeasIt->m_rsrp,
-                              newMeasIt->m_rsrq, useLayer3Filtering);
         }
+      SaveUeMeasurements (newMeasIt->m_cellId, newMeasIt->m_rsrp,
+                          newMeasIt->m_rsrq, useLayer3Filtering,
+                          params.m_componentCarrierId);
     }
 
   if (m_state == IDLE_CELL_SEARCH)
@@ -1063,13 +1062,20 @@
           {
             NS_LOG_INFO ("haveMobilityControlInfo == true");
             SwitchToState (CONNECTED_HANDOVER);
+            if (m_radioLinkFailureDetected.IsRunning ())
+              {
+                ResetRlfParams ();
+              }
             const LteRrcSap::MobilityControlInfo& mci = msg.mobilityControlInfo;
             m_handoverStartTrace (m_imsi, m_cellId, m_rnti, mci.targetPhysCellId);
             //We should reset the MACs and PHYs for all the component carriers
-            for (uint16_t i = 0; i < m_numberOfComponentCarriers; i++)
+            for (auto cmacSapProvider: m_cmacSapProvider)
               {
-                m_cmacSapProvider.at (i)->Reset ();
-                m_cphySapProvider.at (i)->Reset ();
+                cmacSapProvider->Reset ();
+              }
+            for (auto cphySapProvider: m_cphySapProvider)
+              {
+                cphySapProvider->Reset ();
               }
             m_ccmRrcSapProvider->Reset ();
             StorePreviousCellId (m_cellId);
@@ -1345,11 +1351,16 @@
 {
   NS_LOG_FUNCTION (this);
 
-  m_sCellToAddModList = nonCec.sCellsToAddModList;
+  m_sCellToAddModList = nonCec.sCellToAddModList;
+
+  for (uint32_t sCellIndex: nonCec.sCellToReleaseList)
+    {
+      m_cphySapProvider.at (sCellIndex)->Reset ();
+      m_cmacSapProvider.at (sCellIndex)->Reset ();
+    }
 
-  for (std::list<LteRrcSap::SCellToAddMod>::iterator it = nonCec.sCellsToAddModList.begin (); it != nonCec.sCellsToAddModList.end (); it++)
+  for(auto &scell: nonCec.sCellToAddModList)
     {
-      LteRrcSap::SCellToAddMod scell = *it;
       uint8_t ccId = scell.sCellIndex;
 
 
@@ -1358,8 +1369,8 @@
       uint32_t ulEarfcn = scell.radioResourceConfigCommonSCell.ulConfiguration.ulFreqInfo.ulCarrierFreq;
       uint16_t dlBand = scell.radioResourceConfigCommonSCell.nonUlConfiguration.dlBandwidth;
       uint32_t dlEarfcn = scell.cellIdentification.dlCarrierFreq;
-      uint8_t txMode = scell.radioResourceConfigDedicateSCell.physicalConfigDedicatedSCell.antennaInfo.transmissionMode;
-      uint16_t srsIndex = scell.radioResourceConfigDedicateSCell.physicalConfigDedicatedSCell.soundingRsUlConfigDedicated.srsConfigIndex;
+      uint8_t txMode = scell.radioResourceConfigDedicatedSCell.physicalConfigDedicatedSCell.antennaInfo.transmissionMode;
+      uint16_t srsIndex = scell.radioResourceConfigDedicatedSCell.physicalConfigDedicatedSCell.soundingRsUlConfigDedicated.srsConfigIndex;
 
       m_cphySapProvider.at (ccId)->SynchronizeWithEnb (physCellId, dlEarfcn);
       m_cphySapProvider.at (ccId)->SetDlBandwidth (dlBand);
@@ -1369,7 +1380,7 @@
       m_cphySapProvider.at (ccId)->SetRnti (m_rnti);
       m_cmacSapProvider.at (ccId)->SetRnti (m_rnti);
       // update PdschConfigDedicated (i.e. P_A value)
-      LteRrcSap::PdschConfigDedicated pdschConfigDedicated = scell.radioResourceConfigDedicateSCell.physicalConfigDedicatedSCell.pdschConfigDedicated;
+      LteRrcSap::PdschConfigDedicated pdschConfigDedicated = scell.radioResourceConfigDedicatedSCell.physicalConfigDedicatedSCell.pdschConfigDedicated;
       double paDouble = LteRrcSap::ConvertPdschConfigDedicated2Double (pdschConfigDedicated);
       m_cphySapProvider.at (ccId)->SetPa (paDouble);
       m_cphySapProvider.at (ccId)->SetSrsConfigurationIndex (srsIndex);
@@ -1807,9 +1818,9 @@
 
 void
 LteUeRrc::SaveUeMeasurements (uint16_t cellId, double rsrp, double rsrq,
-                              bool useLayer3Filtering)
+                              bool useLayer3Filtering, uint8_t componentCarrierId)
 {
-  NS_LOG_FUNCTION (this << cellId << rsrp << rsrq << useLayer3Filtering);
+  NS_LOG_FUNCTION (this << cellId << +componentCarrierId << rsrp << rsrq << useLayer3Filtering);
 
   std::map<uint16_t, MeasValues>::iterator storedMeasIt = m_storedMeasValues.find (cellId);
 
@@ -1844,6 +1855,8 @@
       MeasValues v;
       v.rsrp = rsrp;
       v.rsrq = rsrq;
+      v.carrierFreq = m_cphySapProvider.at (componentCarrierId)->GetDlEarfcn ();
+
       std::pair<uint16_t, MeasValues> val (cellId, v);
       std::pair<std::map<uint16_t, MeasValues>::iterator, bool>
       ret = m_storedMeasValues.insert (val);
@@ -1852,10 +1865,10 @@
     }
 
   NS_LOG_DEBUG (this << " IMSI " << m_imsi << " state " << ToString (m_state)
-                     << ", measured cell " << m_cellId
+                     << ", measured cell " << cellId
+                     << ", carrier component Id " << componentCarrierId
                      << ", new RSRP " << rsrp << " stored " << storedMeasIt->second.rsrp
                      << ", new RSRQ " << rsrq << " stored " << storedMeasIt->second.rsrq);
-  storedMeasIt->second.timestamp = Simulator::Now ();
 
 } // end of void SaveUeMeasurements
 
@@ -1896,330 +1909,475 @@
   ConcernedCells_t concernedCellsEntry;
   ConcernedCells_t concernedCellsLeaving;
 
-  switch (reportConfigEutra.eventId)
+  /*
+   * Find which serving cell corresponds to measObjectEutra.carrierFreq
+   * It is used, for example, by A1 event:
+   * See TS 36.331 5.5.4.2: "for this measurement, consider the primary or
+   * secondary cell that is configured on the frequency indicated in the
+   * associated measObjectEUTRA to be the serving cell"
+   */
+  uint16_t servingCellId = 0;
+  for (auto cphySapProvider: m_cphySapProvider)
     {
-      case LteRrcSap::ReportConfigEutra::EVENT_A1:
+      if (cphySapProvider->GetDlEarfcn () == measObjectEutra.carrierFreq)
         {
-          /*
-           * Event A1 (Serving becomes better than threshold)
-           * Please refer to 3GPP TS 36.331 Section 5.5.4.2
-           */
+          servingCellId = cphySapProvider->GetCellId ();
+        }
+    }
 
-          double ms; // Ms, the measurement result of the serving cell
-          double thresh; // Thresh, the threshold parameter for this event
-          // Hys, the hysteresis parameter for this event.
-          double hys = EutranMeasurementMapping::IeValue2ActualHysteresis (reportConfigEutra.hysteresis);
+  if (servingCellId == 0)
+    {
+      return;
+    }
 
-          switch (reportConfigEutra.triggerQuantity)
-            {
-              case LteRrcSap::ReportConfigEutra::RSRP:
-                ms = m_storedMeasValues[m_cellId].rsrp;
-                NS_ASSERT (reportConfigEutra.threshold1.choice
-                           == LteRrcSap::ThresholdEutra::THRESHOLD_RSRP);
-                thresh = EutranMeasurementMapping::RsrpRange2Dbm (reportConfigEutra.threshold1.range);
-                break;
-              case LteRrcSap::ReportConfigEutra::RSRQ:
-                ms = m_storedMeasValues[m_cellId].rsrq;
-                NS_ASSERT (reportConfigEutra.threshold1.choice
-                           == LteRrcSap::ThresholdEutra::THRESHOLD_RSRQ);
-                thresh = EutranMeasurementMapping::RsrqRange2Db (reportConfigEutra.threshold1.range);
-                break;
-              default:
-                NS_FATAL_ERROR ("unsupported triggerQuantity");
-                break;
-            }
+  switch (reportConfigEutra.eventId)
+    {
+    case LteRrcSap::ReportConfigEutra::EVENT_A1:
+      {
+        /*
+         * Event A1 (Serving becomes better than threshold)
+         * Please refer to 3GPP TS 36.331 Section 5.5.4.2
+         */
+
+        double ms; // Ms, the measurement result of the serving cell
+        double thresh; // Thresh, the threshold parameter for this event
+        // Hys, the hysteresis parameter for this event.
+        double hys = EutranMeasurementMapping::IeValue2ActualHysteresis (reportConfigEutra.hysteresis);
 
-          // Inequality A1-1 (Entering condition): Ms - Hys > Thresh
-          bool entryCond = ms - hys > thresh;
+        switch (reportConfigEutra.triggerQuantity)
+          {
+          case LteRrcSap::ReportConfigEutra::RSRP:
+            ms = m_storedMeasValues[servingCellId].rsrp;
 
-          if (entryCond)
-            {
-              if (!isMeasIdInReportList)
-                {
-                  concernedCellsEntry.push_back (m_cellId);
-                  eventEntryCondApplicable = true;
-                }
-              else
-                {
-                  /*
-                   * This is to check that the triggered cell recorded in the
-                   * VarMeasReportList is the serving cell.
-                   */
-                  NS_ASSERT (measReportIt->second.cellsTriggeredList.find (m_cellId)
-                             != measReportIt->second.cellsTriggeredList.end ());
-                }
-            }
-          else if (reportConfigEutra.timeToTrigger > 0)
-            {
-              CancelEnteringTrigger (measId);
-            }
+            NS_ASSERT (reportConfigEutra.threshold1.choice
+                       == LteRrcSap::ThresholdEutra::THRESHOLD_RSRP);
+            thresh = EutranMeasurementMapping::RsrpRange2Dbm (reportConfigEutra.threshold1.range);
+            break;
+          case LteRrcSap::ReportConfigEutra::RSRQ:
+            ms = m_storedMeasValues[servingCellId].rsrq;
+            NS_ASSERT (reportConfigEutra.threshold1.choice
+                       == LteRrcSap::ThresholdEutra::THRESHOLD_RSRQ);
+            thresh = EutranMeasurementMapping::RsrqRange2Db (reportConfigEutra.threshold1.range);
+            break;
+          default:
+            NS_FATAL_ERROR ("unsupported triggerQuantity");
+            break;
+          }
 
-          // Inequality A1-2 (Leaving condition): Ms + Hys < Thresh
-          bool leavingCond = ms + hys < thresh;
+        // Inequality A1-1 (Entering condition): Ms - Hys > Thresh
+        bool entryCond = ms - hys > thresh;
 
-          if (leavingCond)
-            {
-              if (isMeasIdInReportList)
-                {
-                  /*
-                   * This is to check that the triggered cell recorded in the
-                   * VarMeasReportList is the serving cell.
-                   */
-                  NS_ASSERT (measReportIt->second.cellsTriggeredList.find (m_cellId)
-                             != measReportIt->second.cellsTriggeredList.end ());
-                  concernedCellsLeaving.push_back (m_cellId);
-                  eventLeavingCondApplicable = true;
-                }
-            }
-          else if (reportConfigEutra.timeToTrigger > 0)
-            {
-              CancelLeavingTrigger (measId);
-            }
+        if (entryCond)
+          {
+            if (!isMeasIdInReportList)
+              {
+                concernedCellsEntry.push_back (servingCellId);
+                eventEntryCondApplicable = true;
+              }
+            else
+              {
+                /*
+                 * This is to check that the triggered cell recorded in the
+                 * VarMeasReportList is the serving cell.
+                 */
+                NS_ASSERT (measReportIt->second.cellsTriggeredList.find (servingCellId)
+                           != measReportIt->second.cellsTriggeredList.end ());
+              }
+          }
+        else if (reportConfigEutra.timeToTrigger > 0)
+          {
+            CancelEnteringTrigger (measId);
+          }
 
-          NS_LOG_LOGIC (this << " event A1: serving cell " << m_cellId
-                             << " ms=" << ms << " thresh=" << thresh
-                             << " entryCond=" << entryCond
-                             << " leavingCond=" << leavingCond);
+        // Inequality A1-2 (Leaving condition): Ms + Hys < Thresh
+        bool leavingCond = ms + hys < thresh;
 
-        } // end of case LteRrcSap::ReportConfigEutra::EVENT_A1
+        if (leavingCond)
+          {
+            if (isMeasIdInReportList)
+              {
+                /*
+                 * This is to check that the triggered cell recorded in the
+                 * VarMeasReportList is the serving cell.
+                 */
+                NS_ASSERT (measReportIt->second.cellsTriggeredList.find (m_cellId)
+                           != measReportIt->second.cellsTriggeredList.end ());
+                concernedCellsLeaving.push_back (m_cellId);
+                eventLeavingCondApplicable = true;
+              }
+          }
+        else if (reportConfigEutra.timeToTrigger > 0)
+          {
+            CancelLeavingTrigger (measId);
+          }
 
-        break;
+        NS_LOG_LOGIC (this << " event A1: serving cell " << servingCellId
+                           << " ms=" << ms << " thresh=" << thresh
+                           << " entryCond=" << entryCond
+                           << " leavingCond=" << leavingCond);
+
+      } // end of case LteRrcSap::ReportConfigEutra::EVENT_A1
+
+      break;
+
+    case LteRrcSap::ReportConfigEutra::EVENT_A2:
+      {
+        /*
+         * Event A2 (Serving becomes worse than threshold)
+         * Please refer to 3GPP TS 36.331 Section 5.5.4.3
+         */
+
+        double ms; // Ms, the measurement result of the serving cell
+        double thresh; // Thresh, the threshold parameter for this event
+        // Hys, the hysteresis parameter for this event.
+        double hys = EutranMeasurementMapping::IeValue2ActualHysteresis (reportConfigEutra.hysteresis);
 
-      case LteRrcSap::ReportConfigEutra::EVENT_A2:
-        {
-          /*
-           * Event A2 (Serving becomes worse than threshold)
-           * Please refer to 3GPP TS 36.331 Section 5.5.4.3
-           */
+        switch (reportConfigEutra.triggerQuantity)
+          {
+          case LteRrcSap::ReportConfigEutra::RSRP:
+            ms = m_storedMeasValues[servingCellId].rsrp;
+            NS_ASSERT (reportConfigEutra.threshold1.choice
+                       == LteRrcSap::ThresholdEutra::THRESHOLD_RSRP);
+            thresh = EutranMeasurementMapping::RsrpRange2Dbm (reportConfigEutra.threshold1.range);
+            break;
+          case LteRrcSap::ReportConfigEutra::RSRQ:
+            ms = m_storedMeasValues[servingCellId].rsrq;
+            NS_ASSERT (reportConfigEutra.threshold1.choice
+                       == LteRrcSap::ThresholdEutra::THRESHOLD_RSRQ);
+            thresh = EutranMeasurementMapping::RsrqRange2Db (reportConfigEutra.threshold1.range);
+            break;
+          default:
+            NS_FATAL_ERROR ("unsupported triggerQuantity");
+            break;
+          }
 
-          double ms; // Ms, the measurement result of the serving cell
-          double thresh; // Thresh, the threshold parameter for this event
-          // Hys, the hysteresis parameter for this event.
-          double hys = EutranMeasurementMapping::IeValue2ActualHysteresis (reportConfigEutra.hysteresis);
+        // Inequality A2-1 (Entering condition): Ms + Hys < Thresh
+        bool entryCond = ms + hys < thresh;
 
-          switch (reportConfigEutra.triggerQuantity)
-            {
+        if (entryCond)
+          {
+            if (!isMeasIdInReportList)
+              {
+                concernedCellsEntry.push_back (servingCellId);
+                eventEntryCondApplicable = true;
+              }
+            else
+              {
+                /*
+                 * This is to check that the triggered cell recorded in the
+                 * VarMeasReportList is the serving cell.
+                 */
+                NS_ASSERT (measReportIt->second.cellsTriggeredList.find (servingCellId)
+                           != measReportIt->second.cellsTriggeredList.end ());
+              }
+          }
+        else if (reportConfigEutra.timeToTrigger > 0)
+          {
+            CancelEnteringTrigger (measId);
+          }
+
+        // Inequality A2-2 (Leaving condition): Ms - Hys > Thresh
+        bool leavingCond = ms - hys > thresh;
+
+        if (leavingCond)
+          {
+            if (isMeasIdInReportList)
+              {
+                /*
+                 * This is to check that the triggered cell recorded in the
+                 * VarMeasReportList is the serving cell.
+                 */
+                NS_ASSERT (measReportIt->second.cellsTriggeredList.find (servingCellId)
+                           != measReportIt->second.cellsTriggeredList.end ());
+                concernedCellsLeaving.push_back (servingCellId);
+                eventLeavingCondApplicable = true;
+              }
+          }
+        else if (reportConfigEutra.timeToTrigger > 0)
+          {
+            CancelLeavingTrigger (measId);
+          }
+
+        NS_LOG_LOGIC (this << " event A2: serving cell " << servingCellId
+                           << " ms=" << ms << " thresh=" << thresh
+                           << " entryCond=" << entryCond
+                           << " leavingCond=" << leavingCond);
+
+      } // end of case LteRrcSap::ReportConfigEutra::EVENT_A2
+
+      break;
+
+    case LteRrcSap::ReportConfigEutra::EVENT_A3:
+      {
+        /*
+         * Event A3 (Neighbour becomes offset better than PCell)
+         * Please refer to 3GPP TS 36.331 Section 5.5.4.4
+         */
+
+        double mn; // Mn, the measurement result of the neighbouring cell
+        double ofn = measObjectEutra.offsetFreq; // Ofn, the frequency specific offset of the frequency of the
+        double ocn = 0.0; // Ocn, the cell specific offset of the neighbour cell
+        double mp; // Mp, the measurement result of the PCell
+        double ofp = measObjectEutra.offsetFreq; // Ofp, the frequency specific offset of the primary frequency
+        double ocp = 0.0; // Ocp, the cell specific offset of the PCell
+        // Off, the offset parameter for this event.
+        double off = EutranMeasurementMapping::IeValue2ActualA3Offset (reportConfigEutra.a3Offset);
+        // Hys, the hysteresis parameter for this event.
+        double hys = EutranMeasurementMapping::IeValue2ActualHysteresis (reportConfigEutra.hysteresis);
+
+        switch (reportConfigEutra.triggerQuantity)
+          {
+          case LteRrcSap::ReportConfigEutra::RSRP:
+            mp = m_storedMeasValues[m_cellId].rsrp;
+            NS_ASSERT (reportConfigEutra.threshold1.choice
+                       == LteRrcSap::ThresholdEutra::THRESHOLD_RSRP);
+            break;
+          case LteRrcSap::ReportConfigEutra::RSRQ:
+            mp = m_storedMeasValues[m_cellId].rsrq;
+            NS_ASSERT (reportConfigEutra.threshold1.choice
+                       == LteRrcSap::ThresholdEutra::THRESHOLD_RSRQ);
+            break;
+          default:
+            NS_FATAL_ERROR ("unsupported triggerQuantity");
+            break;
+          }
+
+        for (std::map<uint16_t, MeasValues>::iterator storedMeasIt = m_storedMeasValues.begin ();
+             storedMeasIt != m_storedMeasValues.end ();
+             ++storedMeasIt)
+          {
+            uint16_t cellId = storedMeasIt->first;
+            if (cellId == m_cellId)
+              {
+                continue;
+              }
+
+            // Only cell(s) on the frequency indicated in the associated measObject can trigger event.
+            if (m_storedMeasValues.at (cellId).carrierFreq != measObjectEutra.carrierFreq)
+              {
+                continue;
+              }
+
+            switch (reportConfigEutra.triggerQuantity)
+              {
               case LteRrcSap::ReportConfigEutra::RSRP:
-                ms = m_storedMeasValues[m_cellId].rsrp;
-                NS_ASSERT (reportConfigEutra.threshold1.choice
-                           == LteRrcSap::ThresholdEutra::THRESHOLD_RSRP);
-                thresh = EutranMeasurementMapping::RsrpRange2Dbm (reportConfigEutra.threshold1.range);
+                mn = storedMeasIt->second.rsrp;
                 break;
               case LteRrcSap::ReportConfigEutra::RSRQ:
-                ms = m_storedMeasValues[m_cellId].rsrq;
-                NS_ASSERT (reportConfigEutra.threshold1.choice
-                           == LteRrcSap::ThresholdEutra::THRESHOLD_RSRQ);
-                thresh = EutranMeasurementMapping::RsrqRange2Db (reportConfigEutra.threshold1.range);
+                mn = storedMeasIt->second.rsrq;
                 break;
               default:
                 NS_FATAL_ERROR ("unsupported triggerQuantity");
                 break;
-            }
-
-          // Inequality A2-1 (Entering condition): Ms + Hys < Thresh
-          bool entryCond = ms + hys < thresh;
+              }
 
-          if (entryCond)
-            {
-              if (!isMeasIdInReportList)
-                {
-                  concernedCellsEntry.push_back (m_cellId);
-                  eventEntryCondApplicable = true;
-                }
-              else
-                {
-                  /*
-                   * This is to check that the triggered cell recorded in the
-                   * VarMeasReportList is the serving cell.
-                   */
-                  NS_ASSERT (measReportIt->second.cellsTriggeredList.find (m_cellId)
-                             != measReportIt->second.cellsTriggeredList.end ());
-                }
-            }
-          else if (reportConfigEutra.timeToTrigger > 0)
-            {
-              CancelEnteringTrigger (measId);
-            }
+            bool hasTriggered = isMeasIdInReportList
+              && (measReportIt->second.cellsTriggeredList.find (cellId)
+                  != measReportIt->second.cellsTriggeredList.end ());
 
-          // Inequality A2-2 (Leaving condition): Ms - Hys > Thresh
-          bool leavingCond = ms - hys > thresh;
+            // Inequality A3-1 (Entering condition): Mn + Ofn + Ocn - Hys > Mp + Ofp + Ocp + Off
+            bool entryCond = mn + ofn + ocn - hys > mp + ofp + ocp + off;
 
-          if (leavingCond)
-            {
-              if (isMeasIdInReportList)
-                {
-                  /*
-                   * This is to check that the triggered cell recorded in the
-                   * VarMeasReportList is the serving cell.
-                   */
-                  NS_ASSERT (measReportIt->second.cellsTriggeredList.find (m_cellId)
-                             != measReportIt->second.cellsTriggeredList.end ());
-                  concernedCellsLeaving.push_back (m_cellId);
-                  eventLeavingCondApplicable = true;
-                }
-            }
-          else if (reportConfigEutra.timeToTrigger > 0)
-            {
-              CancelLeavingTrigger (measId);
-            }
+            if (entryCond)
+              {
+                if (!hasTriggered)
+                  {
+                    concernedCellsEntry.push_back (cellId);
+                    eventEntryCondApplicable = true;
+                  }
+              }
+            else if (reportConfigEutra.timeToTrigger > 0)
+              {
+                CancelEnteringTrigger (measId, cellId);
+              }
 
-          NS_LOG_LOGIC (this << " event A2: serving cell " << m_cellId
-                             << " ms=" << ms << " thresh=" << thresh
-                             << " entryCond=" << entryCond
-                             << " leavingCond=" << leavingCond);
+            // Inequality A3-2 (Leaving condition): Mn + Ofn + Ocn + Hys < Mp + Ofp + Ocp + Off
+            bool leavingCond = mn + ofn + ocn + hys < mp + ofp + ocp + off;
 
-        } // end of case LteRrcSap::ReportConfigEutra::EVENT_A2
+            if (leavingCond)
+              {
+                if (hasTriggered)
+                  {
+                    concernedCellsLeaving.push_back (cellId);
+                    eventLeavingCondApplicable = true;
+                  }
+              }
+            else if (reportConfigEutra.timeToTrigger > 0)
+              {
+                CancelLeavingTrigger (measId, cellId);
+              }
 
-        break;
+            NS_LOG_LOGIC (this << " event A3: neighbor cell " << cellId
+                               << " mn=" << mn << " mp=" << mp << " offset=" << off
+                               << " entryCond=" << entryCond
+                               << " leavingCond=" << leavingCond);
+
+          } // end of for (storedMeasIt)
+
+      } // end of case LteRrcSap::ReportConfigEutra::EVENT_A3
+
+      break;
+
+    case LteRrcSap::ReportConfigEutra::EVENT_A4:
+      {
+        /*
+         * Event A4 (Neighbour becomes better than threshold)
+         * Please refer to 3GPP TS 36.331 Section 5.5.4.5
+         */
+
+        double mn; // Mn, the measurement result of the neighbouring cell
+        double ofn = measObjectEutra.offsetFreq; // Ofn, the frequency specific offset of the frequency of the
+        double ocn = 0.0; // Ocn, the cell specific offset of the neighbour cell
+        double thresh; // Thresh, the threshold parameter for this event
+        // Hys, the hysteresis parameter for this event.
+        double hys = EutranMeasurementMapping::IeValue2ActualHysteresis (reportConfigEutra.hysteresis);
 
-      case LteRrcSap::ReportConfigEutra::EVENT_A3:
-        {
-          /*
-           * Event A3 (Neighbour becomes offset better than PCell)
-           * Please refer to 3GPP TS 36.331 Section 5.5.4.4
-           */
+        switch (reportConfigEutra.triggerQuantity)
+          {
+          case LteRrcSap::ReportConfigEutra::RSRP:
+            NS_ASSERT (reportConfigEutra.threshold1.choice
+                       == LteRrcSap::ThresholdEutra::THRESHOLD_RSRP);
+            thresh = EutranMeasurementMapping::RsrpRange2Dbm (reportConfigEutra.threshold1.range);
+            break;
+          case LteRrcSap::ReportConfigEutra::RSRQ:
+            NS_ASSERT (reportConfigEutra.threshold1.choice
+                       == LteRrcSap::ThresholdEutra::THRESHOLD_RSRQ);
+            thresh = EutranMeasurementMapping::RsrqRange2Db (reportConfigEutra.threshold1.range);
+            break;
+          default:
+            NS_FATAL_ERROR ("unsupported triggerQuantity");
+            break;
+          }
 
-          double mn; // Mn, the measurement result of the neighbouring cell
-          double ofn = measObjectEutra.offsetFreq; // Ofn, the frequency specific offset of the frequency of the
-          double ocn = 0.0; // Ocn, the cell specific offset of the neighbour cell
-          double mp; // Mp, the measurement result of the PCell
-          double ofp = measObjectEutra.offsetFreq; // Ofp, the frequency specific offset of the primary frequency
-          double ocp = 0.0; // Ocp, the cell specific offset of the PCell
-          // Off, the offset parameter for this event.
-          double off = EutranMeasurementMapping::IeValue2ActualA3Offset (reportConfigEutra.a3Offset);
-          // Hys, the hysteresis parameter for this event.
-          double hys = EutranMeasurementMapping::IeValue2ActualHysteresis (reportConfigEutra.hysteresis);
+        for (std::map<uint16_t, MeasValues>::iterator storedMeasIt = m_storedMeasValues.begin ();
+             storedMeasIt != m_storedMeasValues.end ();
+             ++storedMeasIt)
+          {
+            uint16_t cellId = storedMeasIt->first;
+            if (cellId == m_cellId)
+              {
+                continue;
+              }
 
-          switch (reportConfigEutra.triggerQuantity)
-            {
+            switch (reportConfigEutra.triggerQuantity)
+              {
               case LteRrcSap::ReportConfigEutra::RSRP:
-                mp = m_storedMeasValues[m_cellId].rsrp;
-                NS_ASSERT (reportConfigEutra.threshold1.choice
-                           == LteRrcSap::ThresholdEutra::THRESHOLD_RSRP);
+                mn = storedMeasIt->second.rsrp;
                 break;
               case LteRrcSap::ReportConfigEutra::RSRQ:
-                mp = m_storedMeasValues[m_cellId].rsrq;
-                NS_ASSERT (reportConfigEutra.threshold1.choice
-                           == LteRrcSap::ThresholdEutra::THRESHOLD_RSRQ);
+                mn = storedMeasIt->second.rsrq;
                 break;
               default:
                 NS_FATAL_ERROR ("unsupported triggerQuantity");
                 break;
-            }
-
-          for (std::map<uint16_t, MeasValues>::iterator storedMeasIt = m_storedMeasValues.begin ();
-               storedMeasIt != m_storedMeasValues.end ();
-               ++storedMeasIt)
-            {
-              uint16_t cellId = storedMeasIt->first;
-              if (cellId == m_cellId)
-                {
-                  continue;
-                }
-
-              switch (reportConfigEutra.triggerQuantity)
-                {
-                  case LteRrcSap::ReportConfigEutra::RSRP:
-                    mn = storedMeasIt->second.rsrp;
-                    break;
-                  case LteRrcSap::ReportConfigEutra::RSRQ:
-                    mn = storedMeasIt->second.rsrq;
-                    break;
-                  default:
-                    NS_FATAL_ERROR ("unsupported triggerQuantity");
-                    break;
-                }
-
-              bool hasTriggered = isMeasIdInReportList
-                && (measReportIt->second.cellsTriggeredList.find (cellId)
-                    != measReportIt->second.cellsTriggeredList.end ());
-
-              // Inequality A3-1 (Entering condition): Mn + Ofn + Ocn - Hys > Mp + Ofp + Ocp + Off
-              bool entryCond = mn + ofn + ocn - hys > mp + ofp + ocp + off;
-
-              if (entryCond)
-                {
-                  if (!hasTriggered)
-                    {
-                      concernedCellsEntry.push_back (cellId);
-                      eventEntryCondApplicable = true;
-                    }
-                }
-              else if (reportConfigEutra.timeToTrigger > 0)
-                {
-                  CancelEnteringTrigger (measId, cellId);
-                }
-
-              // Inequality A3-2 (Leaving condition): Mn + Ofn + Ocn + Hys < Mp + Ofp + Ocp + Off
-              bool leavingCond = mn + ofn + ocn + hys < mp + ofp + ocp + off;
+              }
 
-              if (leavingCond)
-                {
-                  if (hasTriggered)
-                    {
-                      concernedCellsLeaving.push_back (cellId);
-                      eventLeavingCondApplicable = true;
-                    }
-                }
-              else if (reportConfigEutra.timeToTrigger > 0)
-                {
-                  CancelLeavingTrigger (measId, cellId);
-                }
+            bool hasTriggered = isMeasIdInReportList
+              && (measReportIt->second.cellsTriggeredList.find (cellId)
+                  != measReportIt->second.cellsTriggeredList.end ());
 
-              NS_LOG_LOGIC (this << " event A3: neighbor cell " << cellId
-                                 << " mn=" << mn << " mp=" << mp << " offset=" << off
-                                 << " entryCond=" << entryCond
-                                 << " leavingCond=" << leavingCond);
+            // Inequality A4-1 (Entering condition): Mn + Ofn + Ocn - Hys > Thresh
+            bool entryCond = mn + ofn + ocn - hys > thresh;
 
-            } // end of for (storedMeasIt)
+            if (entryCond)
+              {
+                if (!hasTriggered)
+                  {
+                    concernedCellsEntry.push_back (cellId);
+                    eventEntryCondApplicable = true;
+                  }
+              }
+            else if (reportConfigEutra.timeToTrigger > 0)
+              {
+                CancelEnteringTrigger (measId, cellId);
+              }
 
-        } // end of case LteRrcSap::ReportConfigEutra::EVENT_A3
+            // Inequality A4-2 (Leaving condition): Mn + Ofn + Ocn + Hys < Thresh
+            bool leavingCond = mn + ofn + ocn + hys < thresh;
 
-        break;
+            if (leavingCond)
+              {
+                if (hasTriggered)
+                  {
+                    concernedCellsLeaving.push_back (cellId);
+                    eventLeavingCondApplicable = true;
+                  }
+              }
+            else if (reportConfigEutra.timeToTrigger > 0)
+              {
+                CancelLeavingTrigger (measId, cellId);
+              }
 
-      case LteRrcSap::ReportConfigEutra::EVENT_A4:
-        {
-          /*
-           * Event A4 (Neighbour becomes better than threshold)
-           * Please refer to 3GPP TS 36.331 Section 5.5.4.5
-           */
+            NS_LOG_LOGIC (this << " event A4: neighbor cell " << cellId
+                               << " mn=" << mn << " thresh=" << thresh
+                               << " entryCond=" << entryCond
+                               << " leavingCond=" << leavingCond);
+
+          } // end of for (storedMeasIt)
+
+      } // end of case LteRrcSap::ReportConfigEutra::EVENT_A4
+
+      break;
+
+    case LteRrcSap::ReportConfigEutra::EVENT_A5:
+      {
+        /*
+         * Event A5 (PCell becomes worse than threshold1 and neighbour
+         * becomes better than threshold2)
+         * Please refer to 3GPP TS 36.331 Section 5.5.4.6
+         */
+
+        double mp; // Mp, the measurement result of the PCell
+        double mn; // Mn, the measurement result of the neighbouring cell
+        double ofn = measObjectEutra.offsetFreq; // Ofn, the frequency specific offset of the frequency of the
+        double ocn = 0.0; // Ocn, the cell specific offset of the neighbour cell
+        double thresh1; // Thresh1, the threshold parameter for this event
+        double thresh2; // Thresh2, the threshold parameter for this event
+        // Hys, the hysteresis parameter for this event.
+        double hys = EutranMeasurementMapping::IeValue2ActualHysteresis (reportConfigEutra.hysteresis);
 
-          double mn; // Mn, the measurement result of the neighbouring cell
-          double ofn = measObjectEutra.offsetFreq; // Ofn, the frequency specific offset of the frequency of the
-          double ocn = 0.0; // Ocn, the cell specific offset of the neighbour cell
-          double thresh; // Thresh, the threshold parameter for this event
-          // Hys, the hysteresis parameter for this event.
-          double hys = EutranMeasurementMapping::IeValue2ActualHysteresis (reportConfigEutra.hysteresis);
+        switch (reportConfigEutra.triggerQuantity)
+          {
+          case LteRrcSap::ReportConfigEutra::RSRP:
+            mp = m_storedMeasValues[m_cellId].rsrp;
+            NS_ASSERT (reportConfigEutra.threshold1.choice
+                       == LteRrcSap::ThresholdEutra::THRESHOLD_RSRP);
+            NS_ASSERT (reportConfigEutra.threshold2.choice
+                       == LteRrcSap::ThresholdEutra::THRESHOLD_RSRP);
+            thresh1 = EutranMeasurementMapping::RsrpRange2Dbm (reportConfigEutra.threshold1.range);
+            thresh2 = EutranMeasurementMapping::RsrpRange2Dbm (reportConfigEutra.threshold2.range);
+            break;
+          case LteRrcSap::ReportConfigEutra::RSRQ:
+            mp = m_storedMeasValues[m_cellId].rsrq;
+            NS_ASSERT (reportConfigEutra.threshold1.choice
+                       == LteRrcSap::ThresholdEutra::THRESHOLD_RSRQ);
+            NS_ASSERT (reportConfigEutra.threshold2.choice
+                       == LteRrcSap::ThresholdEutra::THRESHOLD_RSRQ);
+            thresh1 = EutranMeasurementMapping::RsrqRange2Db (reportConfigEutra.threshold1.range);
+            thresh2 = EutranMeasurementMapping::RsrqRange2Db (reportConfigEutra.threshold2.range);
+            break;
+          default:
+            NS_FATAL_ERROR ("unsupported triggerQuantity");
+            break;
+          }
 
-          switch (reportConfigEutra.triggerQuantity)
-            {
-              case LteRrcSap::ReportConfigEutra::RSRP:
-                NS_ASSERT (reportConfigEutra.threshold1.choice
-                           == LteRrcSap::ThresholdEutra::THRESHOLD_RSRP);
-                thresh = EutranMeasurementMapping::RsrpRange2Dbm (reportConfigEutra.threshold1.range);
-                break;
-              case LteRrcSap::ReportConfigEutra::RSRQ:
-                NS_ASSERT (reportConfigEutra.threshold1.choice
-                           == LteRrcSap::ThresholdEutra::THRESHOLD_RSRQ);
-                thresh = EutranMeasurementMapping::RsrqRange2Db (reportConfigEutra.threshold1.range);
-                break;
-              default:
-                NS_FATAL_ERROR ("unsupported triggerQuantity");
-                break;
-            }
+        // Inequality A5-1 (Entering condition 1): Mp + Hys < Thresh1
+        bool entryCond = mp + hys < thresh1;
 
-          for (std::map<uint16_t, MeasValues>::iterator storedMeasIt = m_storedMeasValues.begin ();
-               storedMeasIt != m_storedMeasValues.end ();
-               ++storedMeasIt)
-            {
-              uint16_t cellId = storedMeasIt->first;
-              if (cellId == m_cellId)
-                {
-                  continue;
-                }
+        if (entryCond)
+          {
+            for (std::map<uint16_t, MeasValues>::iterator storedMeasIt = m_storedMeasValues.begin ();
+                 storedMeasIt != m_storedMeasValues.end ();
+                 ++storedMeasIt)
+              {
+                uint16_t cellId = storedMeasIt->first;
+                if (cellId == m_cellId)
+                  {
+                    continue;
+                  }
 
-              switch (reportConfigEutra.triggerQuantity)
-                {
+                switch (reportConfigEutra.triggerQuantity)
+                  {
                   case LteRrcSap::ReportConfigEutra::RSRP:
                     mn = storedMeasIt->second.rsrp;
                     break;
@@ -2229,285 +2387,98 @@
                   default:
                     NS_FATAL_ERROR ("unsupported triggerQuantity");
                     break;
-                }
-
-              bool hasTriggered = isMeasIdInReportList
-                && (measReportIt->second.cellsTriggeredList.find (cellId)
-                    != measReportIt->second.cellsTriggeredList.end ());
-
-              // Inequality A4-1 (Entering condition): Mn + Ofn + Ocn - Hys > Thresh
-              bool entryCond = mn + ofn + ocn - hys > thresh;
-
-              if (entryCond)
-                {
-                  if (!hasTriggered)
-                    {
-                      concernedCellsEntry.push_back (cellId);
-                      eventEntryCondApplicable = true;
-                    }
-                }
-              else if (reportConfigEutra.timeToTrigger > 0)
-                {
-                  CancelEnteringTrigger (measId, cellId);
-                }
-
-              // Inequality A4-2 (Leaving condition): Mn + Ofn + Ocn + Hys < Thresh
-              bool leavingCond = mn + ofn + ocn + hys < thresh;
-
-              if (leavingCond)
-                {
-                  if (hasTriggered)
-                    {
-                      concernedCellsLeaving.push_back (cellId);
-                      eventLeavingCondApplicable = true;
-                    }
-                }
-              else if (reportConfigEutra.timeToTrigger > 0)
-                {
-                  CancelLeavingTrigger (measId, cellId);
-                }
-
-              NS_LOG_LOGIC (this << " event A4: neighbor cell " << cellId
-                                 << " mn=" << mn << " thresh=" << thresh
-                                 << " entryCond=" << entryCond
-                                 << " leavingCond=" << leavingCond);
-
-            } // end of for (storedMeasIt)
-
-        } // end of case LteRrcSap::ReportConfigEutra::EVENT_A4
-
-        break;
-
-      case LteRrcSap::ReportConfigEutra::EVENT_A5:
-        {
-          /*
-           * Event A5 (PCell becomes worse than threshold1 and neighbour
-           * becomes better than threshold2)
-           * Please refer to 3GPP TS 36.331 Section 5.5.4.6
-           */
-
-          double mp; // Mp, the measurement result of the PCell
-          double mn; // Mn, the measurement result of the neighbouring cell
-          double ofn = measObjectEutra.offsetFreq; // Ofn, the frequency specific offset of the frequency of the
-          double ocn = 0.0; // Ocn, the cell specific offset of the neighbour cell
-          double thresh1; // Thresh1, the threshold parameter for this event
-          double thresh2; // Thresh2, the threshold parameter for this event
-          // Hys, the hysteresis parameter for this event.
-          double hys = EutranMeasurementMapping::IeValue2ActualHysteresis (reportConfigEutra.hysteresis);
-
-          switch (reportConfigEutra.triggerQuantity)
-            {
-              case LteRrcSap::ReportConfigEutra::RSRP:
-                mp = m_storedMeasValues[m_cellId].rsrp;
-                NS_ASSERT (reportConfigEutra.threshold1.choice
-                           == LteRrcSap::ThresholdEutra::THRESHOLD_RSRP);
-                NS_ASSERT (reportConfigEutra.threshold2.choice
-                           == LteRrcSap::ThresholdEutra::THRESHOLD_RSRP);
-                thresh1 = EutranMeasurementMapping::RsrpRange2Dbm (reportConfigEutra.threshold1.range);
-                thresh2 = EutranMeasurementMapping::RsrpRange2Dbm (reportConfigEutra.threshold2.range);
-                break;
-              case LteRrcSap::ReportConfigEutra::RSRQ:
-                mp = m_storedMeasValues[m_cellId].rsrq;
-                NS_ASSERT (reportConfigEutra.threshold1.choice
-                           == LteRrcSap::ThresholdEutra::THRESHOLD_RSRQ);
-                NS_ASSERT (reportConfigEutra.threshold2.choice
-                           == LteRrcSap::ThresholdEutra::THRESHOLD_RSRQ);
-                thresh1 = EutranMeasurementMapping::RsrqRange2Db (reportConfigEutra.threshold1.range);
-                thresh2 = EutranMeasurementMapping::RsrqRange2Db (reportConfigEutra.threshold2.range);
-                break;
-              default:
-                NS_FATAL_ERROR ("unsupported triggerQuantity");
-                break;
-            }
+                  }
 
-          // Inequality A5-1 (Entering condition 1): Mp + Hys < Thresh1
-          bool entryCond = mp + hys < thresh1;
+                bool hasTriggered = isMeasIdInReportList
+                  && (measReportIt->second.cellsTriggeredList.find (cellId)
+                      != measReportIt->second.cellsTriggeredList.end ());
+
+                // Inequality A5-2 (Entering condition 2): Mn + Ofn + Ocn - Hys > Thresh2
+
+                entryCond = mn + ofn + ocn - hys > thresh2;
+
+                if (entryCond)
+                  {
+                    if (!hasTriggered)
+                      {
+                        concernedCellsEntry.push_back (cellId);
+                        eventEntryCondApplicable = true;
+                      }
+                  }
+                else if (reportConfigEutra.timeToTrigger > 0)
+                  {
+                    CancelEnteringTrigger (measId, cellId);
+                  }
+
+                NS_LOG_LOGIC (this << " event A5: neighbor cell " << cellId
+                                   << " mn=" << mn << " mp=" << mp
+                                   << " thresh2=" << thresh2
+                                   << " thresh1=" << thresh1
+                                   << " entryCond=" << entryCond);
 
-          if (entryCond)
-            {
-              for (std::map<uint16_t, MeasValues>::iterator storedMeasIt = m_storedMeasValues.begin ();
-                   storedMeasIt != m_storedMeasValues.end ();
-                   ++storedMeasIt)
-                {
-                  uint16_t cellId = storedMeasIt->first;
-                  if (cellId == m_cellId)
-                    {
-                      continue;
-                    }
-
-                  switch (reportConfigEutra.triggerQuantity)
-                    {
-                      case LteRrcSap::ReportConfigEutra::RSRP:
-                        mn = storedMeasIt->second.rsrp;
-                        break;
-                      case LteRrcSap::ReportConfigEutra::RSRQ:
-                        mn = storedMeasIt->second.rsrq;
-                        break;
-                      default:
-                        NS_FATAL_ERROR ("unsupported triggerQuantity");
-                        break;
-                    }
-
-                  bool hasTriggered = isMeasIdInReportList
-                    && (measReportIt->second.cellsTriggeredList.find (cellId)
-                        != measReportIt->second.cellsTriggeredList.end ());
-
-                  // Inequality A5-2 (Entering condition 2): Mn + Ofn + Ocn - Hys > Thresh2
-
-                  entryCond = mn + ofn + ocn - hys > thresh2;
-
-                  if (entryCond)
-                    {
-                      if (!hasTriggered)
-                        {
-                          concernedCellsEntry.push_back (cellId);
-                          eventEntryCondApplicable = true;
-                        }
-                    }
-                  else if (reportConfigEutra.timeToTrigger > 0)
-                    {
-                      CancelEnteringTrigger (measId, cellId);
-                    }
-
-                  NS_LOG_LOGIC (this << " event A5: neighbor cell " << cellId
-                                     << " mn=" << mn << " mp=" << mp
-                                     << " thresh2=" << thresh2
-                                     << " thresh1=" << thresh1
-                                     << " entryCond=" << entryCond);
-
-                } // end of for (storedMeasIt)
-
-            } // end of if (entryCond)
-          else
-            {
-              NS_LOG_LOGIC (this << " event A5: serving cell " << m_cellId
-                                 << " mp=" << mp << " thresh1=" << thresh1
-                                 << " entryCond=" << entryCond);
-
-              if (reportConfigEutra.timeToTrigger > 0)
-                {
-                  CancelEnteringTrigger (measId);
-                }
-            }
-
-          if (isMeasIdInReportList)
-            {
-              // Inequality A5-3 (Leaving condition 1): Mp - Hys > Thresh1
-              bool leavingCond = mp - hys > thresh1;
-
-              if (leavingCond)
-                {
-                  if (reportConfigEutra.timeToTrigger == 0)
-                    {
-                      // leaving condition #2 does not have to be checked
-
-                      for (std::map<uint16_t, MeasValues>::iterator storedMeasIt = m_storedMeasValues.begin ();
-                           storedMeasIt != m_storedMeasValues.end ();
-                           ++storedMeasIt)
-                        {
-                          uint16_t cellId = storedMeasIt->first;
-                          if (cellId == m_cellId)
-                            {
-                              continue;
-                            }
-
-                          if (measReportIt->second.cellsTriggeredList.find (cellId)
-                              != measReportIt->second.cellsTriggeredList.end ())
-                            {
-                              concernedCellsLeaving.push_back (cellId);
-                              eventLeavingCondApplicable = true;
-                            }
-                        }
-                    } // end of if (reportConfigEutra.timeToTrigger == 0)
-                  else
-                    {
-                      // leaving condition #2 has to be checked to cancel time-to-trigger
+              } // end of for (storedMeasIt)
 
-                      for (std::map<uint16_t, MeasValues>::iterator storedMeasIt = m_storedMeasValues.begin ();
-                           storedMeasIt != m_storedMeasValues.end ();
-                           ++storedMeasIt)
-                        {
-                          uint16_t cellId = storedMeasIt->first;
-                          if (cellId == m_cellId)
-                            {
-                              continue;
-                            }
-
-                          if (measReportIt->second.cellsTriggeredList.find (cellId)
-                              != measReportIt->second.cellsTriggeredList.end ())
-                            {
-                              switch (reportConfigEutra.triggerQuantity)
-                                {
-                                  case LteRrcSap::ReportConfigEutra::RSRP:
-                                    mn = storedMeasIt->second.rsrp;
-                                    break;
-                                  case LteRrcSap::ReportConfigEutra::RSRQ:
-                                    mn = storedMeasIt->second.rsrq;
-                                    break;
-                                  default:
-                                    NS_FATAL_ERROR ("unsupported triggerQuantity");
-                                    break;
-                                }
-
-                              // Inequality A5-4 (Leaving condition 2): Mn + Ofn + Ocn + Hys < Thresh2
-
-                              leavingCond = mn + ofn + ocn + hys < thresh2;
-
-                              if (!leavingCond)
-                                {
-                                  CancelLeavingTrigger (measId, cellId);
-                                }
-
-                              /*
-                               * Whatever the result of leaving condition #2, this
-                               * cell is still "in", because leaving condition #1
-                               * is already true.
-                               */
-                              concernedCellsLeaving.push_back (cellId);
-                              eventLeavingCondApplicable = true;
-
-                              NS_LOG_LOGIC (this << " event A5: neighbor cell " << cellId
-                                                 << " mn=" << mn << " mp=" << mp
-                                                 << " thresh2=" << thresh2
-                                                 << " thresh1=" << thresh1
-                                                 << " leavingCond=" << leavingCond);
-
-                            } // end of if (measReportIt->second.cellsTriggeredList.find (cellId)
-                              //            != measReportIt->second.cellsTriggeredList.end ())
-
-                        } // end of for (storedMeasIt)
-
-                    } // end of else of if (reportConfigEutra.timeToTrigger == 0)
-
-                  NS_LOG_LOGIC (this << " event A5: serving cell " << m_cellId
-                                     << " mp=" << mp << " thresh1=" << thresh1
-                                     << " leavingCond=" << leavingCond);
+          } // end of if (entryCond)
+        else
+          {
+            NS_LOG_LOGIC (this << " event A5: serving cell " << m_cellId
+                               << " mp=" << mp << " thresh1=" << thresh1
+                               << " entryCond=" << entryCond);
 
-                } // end of if (leavingCond)
-              else
-                {
-                  if (reportConfigEutra.timeToTrigger > 0)
-                    {
-                      CancelLeavingTrigger (measId);
-                    }
+            if (reportConfigEutra.timeToTrigger > 0)
+              {
+                CancelEnteringTrigger (measId);
+              }
+          }
 
-                  // check leaving condition #2
+        if (isMeasIdInReportList)
+          {
+            // Inequality A5-3 (Leaving condition 1): Mp - Hys > Thresh1
+            bool leavingCond = mp - hys > thresh1;
 
-                  for (std::map<uint16_t, MeasValues>::iterator storedMeasIt = m_storedMeasValues.begin ();
-                       storedMeasIt != m_storedMeasValues.end ();
-                       ++storedMeasIt)
-                    {
-                      uint16_t cellId = storedMeasIt->first;
-                      if (cellId == m_cellId)
-                        {
-                          continue;
-                        }
-
-                      if (measReportIt->second.cellsTriggeredList.find (cellId)
-                          != measReportIt->second.cellsTriggeredList.end ())
-                        {
-                          switch (reportConfigEutra.triggerQuantity)
-                            {
+            if (leavingCond)
+              {
+                if (reportConfigEutra.timeToTrigger == 0)
+                  {
+                    // leaving condition #2 does not have to be checked
+
+                    for (std::map<uint16_t, MeasValues>::iterator storedMeasIt = m_storedMeasValues.begin ();
+                         storedMeasIt != m_storedMeasValues.end ();
+                         ++storedMeasIt)
+                      {
+                        uint16_t cellId = storedMeasIt->first;
+                        if (cellId == m_cellId)
+                          {
+                            continue;
+                          }
+
+                        if (measReportIt->second.cellsTriggeredList.find (cellId)
+                            != measReportIt->second.cellsTriggeredList.end ())
+                          {
+                            concernedCellsLeaving.push_back (cellId);
+                            eventLeavingCondApplicable = true;
+                          }
+                      }
+                  } // end of if (reportConfigEutra.timeToTrigger == 0)
+                else
+                  {
+                    // leaving condition #2 has to be checked to cancel time-to-trigger
+
+                    for (std::map<uint16_t, MeasValues>::iterator storedMeasIt = m_storedMeasValues.begin ();
+                         storedMeasIt != m_storedMeasValues.end ();
+                         ++storedMeasIt)
+                      {
+                        uint16_t cellId = storedMeasIt->first;
+                        if (cellId == m_cellId)
+                          {
+                            continue;
+                          }
+
+                        if (measReportIt->second.cellsTriggeredList.find (cellId)
+                            != measReportIt->second.cellsTriggeredList.end ())
+                          {
+                            switch (reportConfigEutra.triggerQuantity)
+                              {
                               case LteRrcSap::ReportConfigEutra::RSRP:
                                 mn = storedMeasIt->second.rsrp;
                                 break;
@@ -2517,39 +2488,109 @@
                               default:
                                 NS_FATAL_ERROR ("unsupported triggerQuantity");
                                 break;
-                            }
+                              }
 
-                          // Inequality A5-4 (Leaving condition 2): Mn + Ofn + Ocn + Hys < Thresh2
-                          leavingCond = mn + ofn + ocn + hys < thresh2;
+                            // Inequality A5-4 (Leaving condition 2): Mn + Ofn + Ocn + Hys < Thresh2
 
-                          if (leavingCond)
-                            {
-                              concernedCellsLeaving.push_back (cellId);
-                              eventLeavingCondApplicable = true;
-                            }
+                            leavingCond = mn + ofn + ocn + hys < thresh2;
 
-                          NS_LOG_LOGIC (this << " event A5: neighbor cell " << cellId
-                                             << " mn=" << mn << " mp=" << mp
-                                             << " thresh2=" << thresh2
-                                             << " thresh1=" << thresh1
-                                             << " leavingCond=" << leavingCond);
+                            if (!leavingCond)
+                              {
+                                CancelLeavingTrigger (measId, cellId);
+                              }
 
-                        } // end of if (measReportIt->second.cellsTriggeredList.find (cellId)
-                          //            != measReportIt->second.cellsTriggeredList.end ())
+                            /*
+                             * Whatever the result of leaving condition #2, this
+                             * cell is still "in", because leaving condition #1
+                             * is already true.
+                             */
+                            concernedCellsLeaving.push_back (cellId);
+                            eventLeavingCondApplicable = true;
 
-                    } // end of for (storedMeasIt)
+                            NS_LOG_LOGIC (this << " event A5: neighbor cell " << cellId
+                                               << " mn=" << mn << " mp=" << mp
+                                               << " thresh2=" << thresh2
+                                               << " thresh1=" << thresh1
+                                               << " leavingCond=" << leavingCond);
 
-                } // end of else of if (leavingCond)
+                          } // end of if (measReportIt->second.cellsTriggeredList.find (cellId)
+                            //            != measReportIt->second.cellsTriggeredList.end ())
 
-            } // end of if (isMeasIdInReportList)
+                      } // end of for (storedMeasIt)
 
-        } // end of case LteRrcSap::ReportConfigEutra::EVENT_A5
+                  } // end of else of if (reportConfigEutra.timeToTrigger == 0)
 
-        break;
+                NS_LOG_LOGIC (this << " event A5: serving cell " << m_cellId
+                                   << " mp=" << mp << " thresh1=" << thresh1
+                                   << " leavingCond=" << leavingCond);
 
-      default:
-        NS_FATAL_ERROR ("unsupported eventId " << reportConfigEutra.eventId);
-        break;
+              } // end of if (leavingCond)
+            else
+              {
+                if (reportConfigEutra.timeToTrigger > 0)
+                  {
+                    CancelLeavingTrigger (measId);
+                  }
+
+                // check leaving condition #2
+
+                for (std::map<uint16_t, MeasValues>::iterator storedMeasIt = m_storedMeasValues.begin ();
+                     storedMeasIt != m_storedMeasValues.end ();
+                     ++storedMeasIt)
+                  {
+                    uint16_t cellId = storedMeasIt->first;
+                    if (cellId == m_cellId)
+                      {
+                        continue;
+                      }
+
+                    if (measReportIt->second.cellsTriggeredList.find (cellId)
+                        != measReportIt->second.cellsTriggeredList.end ())
+                      {
+                        switch (reportConfigEutra.triggerQuantity)
+                          {
+                          case LteRrcSap::ReportConfigEutra::RSRP:
+                            mn = storedMeasIt->second.rsrp;
+                            break;
+                          case LteRrcSap::ReportConfigEutra::RSRQ:
+                            mn = storedMeasIt->second.rsrq;
+                            break;
+                          default:
+                            NS_FATAL_ERROR ("unsupported triggerQuantity");
+                            break;
+                          }
+
+                        // Inequality A5-4 (Leaving condition 2): Mn + Ofn + Ocn + Hys < Thresh2
+                        leavingCond = mn + ofn + ocn + hys < thresh2;
+
+                        if (leavingCond)
+                          {
+                            concernedCellsLeaving.push_back (cellId);
+                            eventLeavingCondApplicable = true;
+                          }
+
+                        NS_LOG_LOGIC (this << " event A5: neighbor cell " << cellId
+                                           << " mn=" << mn << " mp=" << mp
+                                           << " thresh2=" << thresh2
+                                           << " thresh1=" << thresh1
+                                           << " leavingCond=" << leavingCond);
+
+                      } // end of if (measReportIt->second.cellsTriggeredList.find (cellId)
+                        //            != measReportIt->second.cellsTriggeredList.end ())
+
+                  } // end of for (storedMeasIt)
+
+              } // end of else of if (leavingCond)
+
+          } // end of if (isMeasIdInReportList)
+
+      } // end of case LteRrcSap::ReportConfigEutra::EVENT_A5
+
+      break;
+
+    default:
+      NS_FATAL_ERROR ("unsupported eventId " << reportConfigEutra.eventId);
+      break;
 
     } // switch (event type)
 
@@ -2899,14 +2940,6 @@
   LteRrcSap::MeasResults& measResults = measurementReport.measResults;
   measResults.measId = measId;
 
-  std::map<uint16_t, MeasValues>::iterator servingMeasIt = m_storedMeasValues.find (m_cellId);
-  NS_ASSERT (servingMeasIt != m_storedMeasValues.end ());
-  measResults.rsrpResult = EutranMeasurementMapping::Dbm2RsrpRange (servingMeasIt->second.rsrp);
-  measResults.rsrqResult = EutranMeasurementMapping::Db2RsrqRange (servingMeasIt->second.rsrq);
-  NS_LOG_INFO (this << " reporting serving cell "
-               "RSRP " << (uint32_t) measResults.rsrpResult << " (" << servingMeasIt->second.rsrp << " dBm) "
-               "RSRQ " << (uint32_t) measResults.rsrqResult << " (" << servingMeasIt->second.rsrq << " dB)");
-  measResults.haveMeasResultNeighCells = false;
   std::map<uint8_t, VarMeasReport>::iterator measReportIt = m_varMeasReportList.find (measId);
   if (measReportIt == m_varMeasReportList.end ())
     {
@@ -2914,6 +2947,34 @@
     }
   else
     {
+      std::map<uint16_t, MeasValues>::iterator servingMeasIt = m_storedMeasValues.find (m_cellId);
+      NS_ASSERT (servingMeasIt != m_storedMeasValues.end ());
+      measResults.measResultPCell.rsrpResult = EutranMeasurementMapping::Dbm2RsrpRange (servingMeasIt->second.rsrp);
+      measResults.measResultPCell.rsrqResult = EutranMeasurementMapping::Db2RsrqRange (servingMeasIt->second.rsrq);
+      NS_LOG_INFO (this << " reporting serving cell "
+                   "RSRP " << +measResults.measResultPCell.rsrpResult << " (" << servingMeasIt->second.rsrp << " dBm) "
+                   "RSRQ " << +measResults.measResultPCell.rsrqResult << " (" << servingMeasIt->second.rsrq << " dB)");
+
+      measResults.haveMeasResultServFreqList = false;
+      for (uint8_t componentCarrierId = 1; componentCarrierId < m_numberOfComponentCarriers; componentCarrierId++)
+        {
+          const uint16_t cellId = m_cphySapProvider.at (componentCarrierId)->GetCellId ();
+          auto measValuesIt = m_storedMeasValues.find (cellId);
+          if (measValuesIt != m_storedMeasValues.end ())
+            {
+              measResults.haveMeasResultServFreqList = true;
+              LteRrcSap::MeasResultServFreq measResultServFreq;
+              measResultServFreq.servFreqId = componentCarrierId;
+              measResultServFreq.haveMeasResultSCell = true;
+              measResultServFreq.measResultSCell.rsrpResult = EutranMeasurementMapping::Dbm2RsrpRange (measValuesIt->second.rsrp);
+              measResultServFreq.measResultSCell.rsrqResult = EutranMeasurementMapping::Db2RsrqRange (measValuesIt->second.rsrq);
+              measResultServFreq.haveMeasResultBestNeighCell = false;
+              measResults.measResultServFreqList.push_back (measResultServFreq);
+            }
+        }
+
+      measResults.haveMeasResultNeighCells = false;
+
       if (!(measReportIt->second.cellsTriggeredList.empty ()))
         {
           std::multimap<double, uint16_t> sortedNeighCells;
@@ -2972,28 +3033,6 @@
           NS_LOG_WARN (this << " cellsTriggeredList is empty");
         }
 
-      measResults.haveScellsMeas = false;
-      std::map<uint16_t, MeasValues>::iterator sCellsMeasIt =  m_storedScellMeasValues.begin ();
-      if (sCellsMeasIt != m_storedScellMeasValues.end ())
-        {
-          measResults.haveScellsMeas = true;
-          measResults.measScellResultList.haveMeasurementResultsServingSCells = true;
-          measResults.measScellResultList.haveMeasurementResultsNeighCell = false;
-
-
-          for ( sCellsMeasIt = m_storedScellMeasValues.begin ();
-                sCellsMeasIt != m_storedScellMeasValues.end (); ++sCellsMeasIt)
-            {
-              LteRrcSap::MeasResultScell measResultScell;
-              measResultScell.servFreqId = sCellsMeasIt->first;
-              measResultScell.haveRsrpResult =  true;
-              measResultScell.haveRsrqResult =  true;
-              measResultScell.rsrpResult = EutranMeasurementMapping::Dbm2RsrpRange (sCellsMeasIt->second.rsrp);
-              measResultScell.rsrqResult = EutranMeasurementMapping::Db2RsrqRange (sCellsMeasIt->second.rsrq);
-              measResults.measScellResultList.measResultScell.push_back (measResultScell);
-            }
-        }
-
       /*
        * The current LteRrcSap implementation is broken in that it does not
        * allow for infinite values of reportAmount, which is probably the most
@@ -3225,67 +3264,6 @@
 }
 
 
-void
-LteUeRrc::SaveScellUeMeasurements (uint16_t sCellId, double rsrp, double rsrq,
-                                   bool useLayer3Filtering, uint16_t componentCarrierId)
-{
-  NS_LOG_FUNCTION (this << sCellId << componentCarrierId << rsrp << rsrq << useLayer3Filtering);
-  if (sCellId == m_cellId)
-    {
-
-      std::map<uint16_t, MeasValues>::iterator storedMeasIt = m_storedScellMeasValues.find (componentCarrierId);
-
-      if (storedMeasIt != m_storedScellMeasValues.end ())
-        {
-          if (useLayer3Filtering)
-            {
-              // F_n = (1-a) F_{n-1} + a M_n
-              storedMeasIt->second.rsrp = (1 - m_varMeasConfig.aRsrp) * storedMeasIt->second.rsrp
-                + m_varMeasConfig.aRsrp * rsrp;
-
-              if (std::isnan (storedMeasIt->second.rsrq))
-                {
-                  // the previous RSRQ measurements provided UE PHY are invalid
-                  storedMeasIt->second.rsrq = rsrq;   // replace it with unfiltered value
-                }
-              else
-                {
-                  storedMeasIt->second.rsrq = (1 - m_varMeasConfig.aRsrq) * storedMeasIt->second.rsrq
-                    + m_varMeasConfig.aRsrq * rsrq;
-                }
-            }
-          else
-            {
-              storedMeasIt->second.rsrp = rsrp;
-              storedMeasIt->second.rsrq = rsrq;
-            }
-        }
-      else
-        {
-          // first value is always unfiltered
-          MeasValues v;
-          v.rsrp = rsrp;
-          v.rsrq = rsrq;
-          std::pair<uint16_t, MeasValues> val (componentCarrierId, v);
-          std::pair<std::map<uint16_t, MeasValues>::iterator, bool>
-          ret = m_storedScellMeasValues.insert (val);
-          NS_ASSERT_MSG (ret.second == true, "element already existed");
-          storedMeasIt = ret.first;
-        }
-
-      NS_LOG_DEBUG (this << " IMSI " << m_imsi << " state " << ToString (m_state)
-                         << ", measured cell " << sCellId
-                         << ", carrier component Id " << componentCarrierId
-                         << ", new RSRP " << rsrp << " stored " << storedMeasIt->second.rsrp
-                         << ", new RSRQ " << rsrq << " stored " << storedMeasIt->second.rsrq);
-      storedMeasIt->second.timestamp = Simulator::Now ();
-    }
-  else
-    {
-      NS_LOG_DEBUG (this << " IMSI " << m_imsi << "measurement on SCC from not serving cell ");
-    }
-
-}   // end of void SaveUeMeasurements
 
 void
 LteUeRrc::RadioLinkFailureDetected ()
@@ -3348,6 +3326,11 @@
   m_cphySapProvider.at (0)->ResetRlfParams ();
 }
 
+const std::string
+LteUeRrc::ToString (LteUeRrc::State s)
+{
+  return g_ueRrcStateName[s];
+}
 
 
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/model/lte-ue-rrc.h ns-3.36/src/lte/model/lte-ue-rrc.h
--- ns-3.35/src/lte/model/lte-ue-rrc.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/model/lte-ue-rrc.h	2022-04-30 18:23:58.050734500 -0700
@@ -100,7 +100,7 @@
 
   /**
    * The states of the UE RRC entity
-   * 
+   *
    */
   enum State
   {
@@ -177,26 +177,26 @@
 
   /**
    * set the CMAC SAP this RRC should interact with
-   * \brief This function is overloaded to maintain backward compatibility 
+   * \brief This function is overloaded to maintain backward compatibility
    * \param s the CMAC SAP Provider to be used by this RRC
    */
   void SetLteUeCmacSapProvider (LteUeCmacSapProvider * s);
   /**
    * set the CMAC SAP this RRC should interact with
-   * \brief This function is overloaded to maintain backward compatibility 
+   * \brief This function is overloaded to maintain backward compatibility
    * \param s the CMAC SAP Provider to be used by this RRC
    * \param index the index
    */
   void SetLteUeCmacSapProvider (LteUeCmacSapProvider * s, uint8_t index);
 
   /**
-   * \brief This function is overloaded to maintain backward compatibility 
+   * \brief This function is overloaded to maintain backward compatibility
    * \return s the CMAC SAP User interface offered to the MAC by this RRC
    */
   LteUeCmacSapUser* GetLteUeCmacSapUser ();
   /**
    * \brief This function is overloaded to maintain backward compatibility
-   * \param index the index  
+   * \param index the index
    * \return s the CMAC SAP User interface offered to the MAC by this RRC
    */
   LteUeCmacSapUser* GetLteUeCmacSapUser (uint8_t index);
@@ -225,16 +225,16 @@
    */
   void SetLteMacSapProvider (LteMacSapProvider* s);
 
-  /** 
+  /**
    * Set the AS SAP user to interact with the NAS entity
-   * 
+   *
    * \param s the AS SAP user
    */
   void SetAsSapUser (LteAsSapUser* s);
 
-  /** 
-   * 
-   * 
+  /**
+   *
+   *
    * \return the AS SAP provider exported by this RRC
    */
   LteAsSapProvider* GetAsSapProvider ();
@@ -253,8 +253,8 @@
    */
   LteUeCcmRrcSapUser* GetLteCcmRrcSapUser ();
 
-  /** 
-   * 
+  /**
+   *
    * \param imsi the unique UE identifier
    */
   void SetImsi (uint64_t imsi);
@@ -284,12 +284,18 @@
    */
   uint16_t GetCellId () const;
 
-  /** 
+  /**
+   * \param cellId cell identifier
+   * \return true if cellId is the serving cell for this UE
+   */
+  bool IsServingCell (uint16_t cellId) const;
+
+  /**
    * \return the uplink bandwidth in RBs
    */
   uint8_t GetUlBandwidth () const;
 
-  /** 
+  /**
    * \return the downlink bandwidth in RBs
    */
   uint8_t GetDlBandwidth () const;
@@ -299,7 +305,7 @@
    */
   uint32_t GetDlEarfcn () const;
 
-  /** 
+  /**
    * \return the uplink carrier frequency (EARFCN)
    */
   uint32_t GetUlEarfcn () const;
@@ -317,14 +323,20 @@
    */
   uint16_t GetPreviousCellId () const;
 
-  /** 
-   * 
-   * 
+  /**
+   *
+   *
    * \param val true if RLC SM is to be used, false if RLC UM/AM are to be used
    */
   void SetUseRlcSm (bool val);
 
   /**
+   * \param s The UE RRC state.
+   * \return The string representation of the given state.
+   */
+  static const std::string ToString (LteUeRrc::State s);
+
+  /**
    * TracedCallback signature for imsi, cellId and rnti events.
    *
    * \param [in] imsi
@@ -425,7 +437,7 @@
   void DoNotifyRandomAccessSuccessful ();
   /// Notify random access failed function
   void DoNotifyRandomAccessFailed ();
- 
+
   // LTE AS SAP methods
   /**
    * Set CSG white list function
@@ -531,7 +543,7 @@
    */
   void DoSetNumberOfComponentCarriers (uint16_t noOfComponentCarriers);
 
- 
+
   // INTERNAL METHODS
 
   /**
@@ -624,6 +636,7 @@
    * \param rsrp measured RSRP value to be saved (in dBm)
    * \param rsrq measured RSRQ value to be saved (in dB)
    * \param useLayer3Filtering
+   * \param componentCarrierId
    * \todo Remove the useLayer3Filtering argument
    *
    * Implements Section 5.5.3.2 "Layer 3 filtering" of 3GPP TS 36.331. *Layer-3
@@ -640,27 +653,9 @@
    * \sa LteUeRrc::m_storedMeasValues
    */
   void SaveUeMeasurements (uint16_t cellId, double rsrp, double rsrq,
-                           bool useLayer3Filtering);
+                           bool useLayer3Filtering, uint8_t componentCarrierId);
 
   /**
-   * \brief keep the given measurement result as the latest measurement figures,
-   *        to be utilised by UE RRC functions.
-   * \param cellId the cell ID of the measured cell
-   * \param rsrp measured RSRP value to be saved (in dBm)
-   * \param rsrq measured RSRQ value to be saved (in dB)
-   * \param useLayer3Filtering
-   * \param componentCarrierId
-   * \todo Remove the useLayer3Filtering argument
-   *
-   * As for SaveUeMeasurements, this function aims to store the latest measurements
-   * related to the secondary component carriers.
-   * in the current implementation it saves only measurements related on the serving 
-   * secondary carriers while, measurements related to the Neighbor Cell are filtered
-   */
-
-  void SaveScellUeMeasurements (uint16_t cellId, double rsrp, double rsrq,
-                                bool useLayer3Filtering, uint16_t componentCarrierId);
-  /**
    * \brief Evaluate the reporting criteria of a measurement identity and
    *        invoke some reporting actions based on the result.
    * \param measId the measurement identity to be evaluated
@@ -1065,7 +1060,7 @@
   {
     double rsrp; ///< Measured RSRP in dBm.
     double rsrq; ///< Measured RSRQ in dB.
-    Time timestamp; ///< Not used. \todo Should be removed.
+    uint32_t carrierFreq; ///< Measurement object frequency
   };
 
   /**
@@ -1090,7 +1085,7 @@
 
   /**
    * \brief Internal storage of the latest measurement results from all detected
-   *        detected Secondary carrier component, indexed by the carrier component ID 
+   *        detected Secondary carrier component, indexed by the carrier component ID
    *        where the measurement was taken from.
    *
    * Each *measurement result* comprises of RSRP (in dBm) and RSRQ (in dB).
@@ -1337,7 +1332,7 @@
   void ResetRlfParams ();
 
 public:
-  /** 
+  /**
    * The number of component carriers.
    */
   uint16_t m_numberOfComponentCarriers;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/model/no-op-component-carrier-manager.cc ns-3.36/src/lte/model/no-op-component-carrier-manager.cc
--- ns-3.35/src/lte/model/no-op-component-carrier-manager.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/model/no-op-component-carrier-manager.cc	2022-04-30 18:23:58.050734500 -0700
@@ -102,25 +102,18 @@
 NoOpComponentCarrierManager::DoNotifyTxOpportunity (LteMacSapUser::TxOpportunityParameters txOpParams)
 {
   NS_LOG_FUNCTION (this);
-  std::map <uint16_t, std::map<uint8_t, LteMacSapUser*> >::iterator rntiIt = m_ueAttached.find (txOpParams.rnti);
-  NS_ASSERT_MSG (rntiIt != m_ueAttached.end (), "could not find RNTI" << txOpParams.rnti);
-  std::map<uint8_t, LteMacSapUser*>::iterator lcidIt = rntiIt->second.find (txOpParams.lcid);
-  NS_ASSERT_MSG (lcidIt != rntiIt->second.end (), "could not find LCID " << (uint16_t) txOpParams.lcid);
-  NS_LOG_DEBUG (this << " rnti= " << txOpParams.rnti << " lcid= " << (uint32_t) txOpParams.lcid << " layer= " << (uint32_t)txOpParams.layer<<" ccId="<< (uint32_t)txOpParams.componentCarrierId);
-  (*lcidIt).second->NotifyTxOpportunity (txOpParams);
-
+  NS_LOG_DEBUG (this << " rnti= " << txOpParams.rnti << " lcid= " << +txOpParams.lcid << " layer= " << +txOpParams.layer << " ccId=" << +txOpParams.componentCarrierId);
+  m_ueInfo.at (txOpParams.rnti).m_ueAttached.at (txOpParams.lcid)->NotifyTxOpportunity (txOpParams);
 }
 
 void
 NoOpComponentCarrierManager::DoReceivePdu (LteMacSapUser::ReceivePduParameters rxPduParams)
 {
   NS_LOG_FUNCTION (this);
-  std::map <uint16_t, std::map<uint8_t, LteMacSapUser*> >::iterator rntiIt = m_ueAttached.find (rxPduParams.rnti);
-  NS_ASSERT_MSG (rntiIt != m_ueAttached.end (), "could not find RNTI" << rxPduParams.rnti);
-  std::map<uint8_t, LteMacSapUser*>::iterator lcidIt = rntiIt->second.find (rxPduParams.lcid);
-  if (lcidIt != rntiIt->second.end ())
+  auto lcidIt = m_ueInfo.at (rxPduParams.rnti).m_ueAttached.find (rxPduParams.lcid);
+  if (lcidIt != m_ueInfo.at (rxPduParams.rnti).m_ueAttached.end ())
     {
-      (*lcidIt).second->ReceivePdu (rxPduParams);
+      lcidIt->second->ReceivePdu (rxPduParams);
     }
 }
 
@@ -141,61 +134,34 @@
 NoOpComponentCarrierManager::DoAddUe (uint16_t rnti, uint8_t state)
 {
   NS_LOG_FUNCTION (this << rnti << (uint16_t) state);
-  std::map<uint16_t, uint8_t>::iterator stateIt;
   std::map<uint16_t, uint8_t>::iterator eccIt; // m_enabledComponentCarrier iterator
-  stateIt = m_ueState.find (rnti);
-  if (stateIt == m_ueState.end ())
+  auto ueInfoIt = m_ueInfo.find (rnti);
+  if (ueInfoIt == m_ueInfo.end ())
     {
-      //      NS_ASSERT_MSG ((stateIt == m_ueState.end () && state == 3), " ERROR: Ue was not indexed and current state is CONNECTED_NORMALLY" << (uint16_t) state);
       NS_LOG_DEBUG (this << " UE " << rnti << " was not found, now it is added in the map");
-      m_ueState.insert (std::pair<uint16_t, uint8_t> (rnti, state));
-      eccIt = m_enabledComponentCarrier.find (rnti);
-      //if ((state == 7 || state == 0) && eccIt == m_enabledComponentCarrier.end ())
-      if (eccIt == m_enabledComponentCarrier.end ())
-        {
-          // the Primary carrier (PC) is enabled by default
-          // on the PC the SRB0 and SRB1 are enabled when the Ue is connected
-          // these are hard-coded and the configuration not pass through the
-          // Component Carrier Manager which is responsible of configure
-          // only DataRadioBearer on the different Component Carrier
-          m_enabledComponentCarrier.insert (std::pair<uint16_t, uint8_t> (rnti, 1));
-        }
-      else
-        {
-          NS_FATAL_ERROR (this << " Ue " << rnti << " had Component Carrier enabled before join the network" << (uint16_t) state);
-        }
-      // preparing the rnti,lcid,LteMacSapUser map
-      std::map<uint8_t, LteMacSapUser*> empty;
-      std::pair <std::map <uint16_t, std::map<uint8_t, LteMacSapUser*> >::iterator, bool>
-      ret = m_ueAttached.insert (std::pair <uint16_t,  std::map<uint8_t, LteMacSapUser*> >
-      (rnti, empty));
-      NS_LOG_DEBUG (this << "AddUe: UE Pointer LteMacSapUser Map " << rnti << " added " << (uint16_t) ret.second);
-      NS_ASSERT_MSG (ret.second, "element already present, RNTI already existed");
-
-      //add new rnti in the map
-      std::map<uint8_t, LteEnbCmacSapProvider::LcInfo> emptyA;
-      std::pair <std::map <uint16_t, std::map<uint8_t, LteEnbCmacSapProvider::LcInfo> >::iterator, bool>
-      retA = m_rlcLcInstantiated.insert (std::pair <uint16_t,  std::map<uint8_t, LteEnbCmacSapProvider::LcInfo> >
-      (rnti, emptyA));
-      NS_ASSERT_MSG (retA.second, "element already present, RNTI already existed");
-      NS_LOG_DEBUG (this << "AddUe: UE " << rnti << " added " << (uint16_t) retA.second);
+      UeInfo info;
+      info.m_ueState = state;
 
+      // the Primary carrier (PC) is enabled by default
+      // on the PC the SRB0 and SRB1 are enabled when the Ue is connected
+      // these are hard-coded and the configuration not pass through the
+      // Component Carrier Manager which is responsible of configure
+      // only DataRadioBearer on the different Component Carrier
+      info.m_enabledComponentCarrier = 1;
+      m_ueInfo.emplace (rnti, info);
     }
   else
     {
-      NS_LOG_DEBUG (this << " UE " << rnti << "found, updating the state from " << (uint16_t) stateIt->second << " to " << (uint16_t) state);
-      stateIt->second = state;
+      NS_LOG_DEBUG (this << " UE " << rnti << "found, updating the state from " << +ueInfoIt->second.m_ueState << " to " << +state);
+      ueInfoIt->second.m_ueState = state;
     }
-
-
 }
 
 void
 NoOpComponentCarrierManager::DoAddLc (LteEnbCmacSapProvider::LcInfo lcInfo, LteMacSapUser* msu)
 {
   NS_LOG_FUNCTION (this);
-  NS_ASSERT_MSG( m_rlcLcInstantiated.find(lcInfo.rnti) != m_rlcLcInstantiated.end(), "Adding lc for a user that was not yet added to component carrier manager list.");
-  m_rlcLcInstantiated.find(lcInfo.rnti)->second.insert(std::pair <uint8_t, LteEnbCmacSapProvider::LcInfo> (lcInfo.lcId, lcInfo));
+  m_ueInfo.at (lcInfo.rnti).m_rlcLcInstantiated.emplace (lcInfo.lcId, lcInfo);
 }
 
 
@@ -203,37 +169,20 @@
 NoOpComponentCarrierManager::DoRemoveUe (uint16_t rnti)
 {
   NS_LOG_FUNCTION (this);
-  std::map<uint16_t, uint8_t>::iterator stateIt;
-  std::map<uint16_t, uint8_t>::iterator eccIt; // m_enabledComponentCarrier iterator
-  stateIt = m_ueState.find (rnti);
-  eccIt = m_enabledComponentCarrier.find (rnti);
-  NS_ASSERT_MSG (stateIt != m_ueState.end (), "request to remove UE info with unknown rnti ");
-  NS_ASSERT_MSG (eccIt != m_enabledComponentCarrier.end (), "request to remove UE info with unknown rnti ");
-
-  //std::map <uint16_t, std::map<uint8_t, LteEnbCmacSapProvider::LcInfo> >::iterator lcsIt;
-  auto rlcLcIt = m_rlcLcInstantiated.find (rnti);
-  NS_ASSERT_MSG (rlcLcIt != m_rlcLcInstantiated.end (), "request to Release Data Radio Bearer on UE without Logical Channels enabled");
-
-  auto rntiIt = m_ueAttached.find (rnti);
-
-  NS_ASSERT_MSG (rntiIt != m_ueAttached.end (), "request to Release Data Radio Bearer on unattached UE");
-
-  m_ueState.erase (rnti);
-  m_enabledComponentCarrier.erase (rnti);
-  m_rlcLcInstantiated.erase (rnti);
-  m_ueAttached.erase (rnti);
+  auto rntiIt = m_ueInfo.find (rnti);
+  NS_ASSERT_MSG (rntiIt != m_ueInfo.end (), "request to remove UE info with unknown RNTI " << rnti);
+  m_ueInfo.erase (rntiIt);
 }
 
 std::vector<LteCcmRrcSapProvider::LcsConfig>
 NoOpComponentCarrierManager::DoSetupDataRadioBearer (EpsBearer bearer, uint8_t bearerId, uint16_t rnti, uint8_t lcid, uint8_t lcGroup, LteMacSapUser *msu)
 {
   NS_LOG_FUNCTION (this << rnti);
-  std::map<uint16_t, uint8_t>::iterator eccIt; // m_enabledComponentCarrier iterator
-  eccIt = m_enabledComponentCarrier.find (rnti);
-  NS_ASSERT_MSG (eccIt != m_enabledComponentCarrier.end (), "SetupDataRadioBearer on unknown rnti ");
+  auto rntiIt = m_ueInfo.find (rnti);
+  NS_ASSERT_MSG (rntiIt != m_ueInfo.end (), "SetupDataRadioBearer on unknown RNTI " << rnti);
 
   // enable by default all carriers
-  eccIt->second = m_noOfComponentCarriers;
+  rntiIt->second.m_enabledComponentCarrier = m_noOfComponentCarriers;
 
   std::vector<LteCcmRrcSapProvider::LcsConfig> res;
   LteCcmRrcSapProvider::LcsConfig entry;
@@ -270,31 +219,8 @@
       res.push_back (entry);
     } // end for
 
-
-  // preparing the rnti,lcid,LcInfo map
-  std::map <uint16_t, std::map<uint8_t, LteEnbCmacSapProvider::LcInfo> >::iterator rntiIter = m_rlcLcInstantiated.find (rnti);
-  rntiIter = m_rlcLcInstantiated.begin ();
-  // while (rntiIter != m_rlcLcInstantiated.end ())
-  //   {
-  //     ++rntiIter;
-  //   }
-  // if (rntiIt == m_rlcLcInstantiated.end ())
-  //   {
-  //     //add new rnti in the map
-  //     std::map<uint8_t, LteEnbCmacSapProvider::LcInfo> empty;
-  //     std::pair <std::map <uint16_t, std::map<uint8_t, LteEnbCmacSapProvider::LcInfo> >::iterator, bool>
-  //       ret = m_rlcLcInstantiated.insert (std::pair <uint16_t,  std::map<uint8_t, LteEnbCmacSapProvider::LcInfo> >
-  //                                         (rnti, empty));
-  //     NS_LOG_DEBUG (this << " UE " << rnti << " added " << (uint16_t) ret.second);
-  //   }
-
-  std::map <uint16_t, std::map<uint8_t, LteMacSapUser*> >::iterator sapIt =  m_ueAttached.find (rnti);
-  NS_ASSERT_MSG (sapIt != m_ueAttached.end (), "RNTI not found");
-  rntiIter = m_rlcLcInstantiated.find (rnti);
-  std::map<uint8_t, LteEnbCmacSapProvider::LcInfo>::iterator lcidIt = rntiIter->second.find (lcid);
-  //std::map<uint8_t, LteMacSapUser*>::iterator lcidIt = sapIt->second.find (lcinfo.lcId);
-  NS_ASSERT_MSG (rntiIter != m_rlcLcInstantiated.end (), "RNTI not found");
-  if (lcidIt == rntiIter->second.end ())
+  auto lcidIt = rntiIt->second.m_rlcLcInstantiated.find (lcid);
+  if (lcidIt == rntiIt->second.m_rlcLcInstantiated.end ())
     {
       lcinfo.rnti = rnti;
       lcinfo.lcId = lcid;
@@ -305,8 +231,8 @@
       lcinfo.mbrDl = bearer.gbrQosInfo.mbrDl;
       lcinfo.gbrUl = bearer.gbrQosInfo.gbrUl;
       lcinfo.gbrDl = bearer.gbrQosInfo.gbrDl;
-      rntiIter->second.insert (std::pair<uint8_t, LteEnbCmacSapProvider::LcInfo> (lcinfo.lcId, lcinfo));
-      sapIt->second.insert (std::pair<uint8_t, LteMacSapUser*> (lcinfo.lcId, msu));
+      rntiIt->second.m_rlcLcInstantiated.emplace (lcinfo.lcId, lcinfo);
+      rntiIt->second.m_ueAttached.emplace (lcinfo.lcId, msu);
     }
   else
     {
@@ -319,48 +245,43 @@
 std::vector<uint8_t>
 NoOpComponentCarrierManager::DoReleaseDataRadioBearer (uint16_t rnti, uint8_t lcid)
 {
-  NS_LOG_FUNCTION (this);
-  // here we receive directly the rnti and the lcid, instead of only drbid
-  // drbid are mapped as drbid = lcid + 2
-  std::map<uint16_t, uint8_t>::iterator eccIt; // m_enabledComponentCarrier iterator
-  eccIt= m_enabledComponentCarrier.find (rnti);
-  NS_ASSERT_MSG (eccIt != m_enabledComponentCarrier.end (), "request to Release Data Radio Bearer on Ue without Component Carrier Enabled");
-  std::map <uint16_t, std::map<uint8_t, LteEnbCmacSapProvider::LcInfo> >::iterator lcsIt;
-  lcsIt = m_rlcLcInstantiated.find (rnti);
-  NS_ASSERT_MSG (lcsIt != m_rlcLcInstantiated.end (), "request to Release Data Radio Bearer on Ue without Logical Channels enabled");
-  std::map<uint8_t, LteEnbCmacSapProvider::LcInfo>::iterator lcIt;
-  NS_LOG_DEBUG (this << " remove lcid " << (uint16_t) lcid << " for rnti " << rnti);
-  lcIt = lcsIt->second.find (lcid);
-  NS_ASSERT_MSG (lcIt != lcsIt->second.end (), " Logical Channel not found");
+  NS_LOG_FUNCTION (this << rnti << +lcid);
+  
+  // Here we receive directly the RNTI and the LCID, instead of only DRB ID
+  // DRB ID are mapped as DRBID = LCID + 2
+  auto rntiIt = m_ueInfo.find (rnti);
+  NS_ASSERT_MSG (rntiIt != m_ueInfo.end (), "request to Release Data Radio Bearer on UE with unknown RNTI " << rnti);
+
+  NS_LOG_DEBUG (this << " remove LCID " << +lcid << " for RNTI " << rnti);
   std::vector<uint8_t> res;
-  for (uint16_t i = 0; i < eccIt->second; i++)
+  for (uint16_t i = 0; i < rntiIt->second.m_enabledComponentCarrier; i++)
     {
       res.insert (res.end (), i);
     }
-  //Find user based on rnti and then erase lcid stored against the same
-  std::map <uint16_t, std::map<uint8_t, LteMacSapUser*> >::iterator rntiIt = m_ueAttached.find (rnti);
-  rntiIt->second.erase (lcid);
-  std::map <uint16_t, std::map<uint8_t, LteEnbCmacSapProvider::LcInfo> >::iterator rlcInstancesIt = m_rlcLcInstantiated.find (rnti);
-  std::map<uint8_t, LteEnbCmacSapProvider::LcInfo>::iterator rclLcIt;
-  lcIt = rlcInstancesIt->second.find (lcid);
-  NS_ASSERT_MSG (lcIt != lcsIt->second.end (), " Erasing: Logical Channel not found");
-  lcsIt->second.erase (lcid);
+
+  auto lcIt = rntiIt->second.m_ueAttached.find (lcid);
+  NS_ASSERT_MSG (lcIt != rntiIt->second.m_ueAttached.end (), "Logical Channel not found");
+  rntiIt->second.m_ueAttached.erase (lcIt);
+
+  auto rlcInstancesIt = rntiIt->second.m_rlcLcInstantiated.find (rnti);
+  NS_ASSERT_MSG (rlcInstancesIt != rntiIt->second.m_rlcLcInstantiated.end (), "Logical Channel not found");
+  rntiIt->second.m_rlcLcInstantiated.erase (rlcInstancesIt);
+
   return res;
 }
 
 LteMacSapUser*
-NoOpComponentCarrierManager::DoConfigureSignalBearer(LteEnbCmacSapProvider::LcInfo lcinfo,  LteMacSapUser* msu)
+NoOpComponentCarrierManager::DoConfigureSignalBearer(LteEnbCmacSapProvider::LcInfo lcinfo, LteMacSapUser* msu)
 {
   NS_LOG_FUNCTION (this);
-  std::map <uint16_t, std::map<uint8_t, LteMacSapUser*> >::iterator itSapUserAtCcm;
-  itSapUserAtCcm = m_ueAttached.find (lcinfo.rnti);
-  NS_ASSERT_MSG (itSapUserAtCcm != m_ueAttached.end (), "request to Add a SignalBearer to unknown rnti");
-  std::map <uint16_t, std::map<uint8_t, LteMacSapUser*> >::iterator rntiIt = m_ueAttached.find (lcinfo.rnti);
-  NS_ASSERT_MSG (rntiIt != m_ueAttached.end (), "RNTI not found");
-  std::map<uint8_t, LteMacSapUser*>::iterator lcidIt = rntiIt->second.find (lcinfo.lcId);
-  if (lcidIt == rntiIt->second.end ())
+
+  auto rntiIt = m_ueInfo.find (lcinfo.rnti);
+  NS_ASSERT_MSG (rntiIt != m_ueInfo.end (), "request to add a signal bearer to unknown RNTI " << lcinfo.rnti);
+
+  auto lcidIt = rntiIt->second.m_ueAttached.find (lcinfo.lcId);
+  if (lcidIt == rntiIt->second.m_ueAttached.end ())
     {
-      rntiIt->second.insert (std::pair<uint8_t, LteMacSapUser*> (lcinfo.lcId, msu));
+      rntiIt->second.m_ueAttached.emplace (lcinfo.lcId, msu);
     }
   else
     {
@@ -468,9 +389,7 @@
 {
   NS_LOG_FUNCTION (this);
 
-  NS_ASSERT_MSG( m_enabledComponentCarrier.find(params.rnti)!=m_enabledComponentCarrier.end(), " UE with provided RNTI not found. RNTI:"<<params.rnti);
-
-  uint32_t numberOfCarriersForUe = m_enabledComponentCarrier.find (params.rnti)->second;
+  uint32_t numberOfCarriersForUe = m_ueInfo.at (params.rnti).m_enabledComponentCarrier;
   if (params.lcid == 0 || params.lcid == 1 || numberOfCarriersForUe == 1)
     {
       NS_LOG_INFO("Buffer status forwarded to the primary carrier.");
@@ -484,7 +403,7 @@
       for ( uint16_t i = 0;  i < numberOfCarriersForUe ; i++)
         {
           NS_ASSERT_MSG (m_macSapProvidersMap.find(i)!=m_macSapProvidersMap.end(), "Mac sap provider does not exist.");
-          m_macSapProvidersMap.find(i)->second->ReportBufferStatus(params);
+          m_macSapProvidersMap.at (i)->ReportBufferStatus(params);
         }
     }
 }
@@ -498,7 +417,7 @@
   NS_ASSERT_MSG (bsr.m_macCeType == MacCeListElement_s::BSR, "Received a Control Message not allowed " << bsr.m_macCeType);
 
   // split traffic in uplink equally among carriers
-  uint32_t numberOfCarriersForUe = m_enabledComponentCarrier.find(bsr.m_rnti)->second;
+  uint32_t numberOfCarriersForUe = m_ueInfo.at (bsr.m_rnti).m_enabledComponentCarrier;
 
   if ( bsr.m_macCeType == MacCeListElement_s::BSR)
     {
@@ -540,12 +459,11 @@
 }
 
 void
-RrComponentCarrierManager::DoUlReceiveSr(uint16_t rnti, uint8_t componentCarrierId)
+RrComponentCarrierManager::DoUlReceiveSr(uint16_t rnti, [[maybe_unused]] uint8_t componentCarrierId)
 {
   NS_LOG_FUNCTION (this);
-  NS_UNUSED (componentCarrierId);
   // split traffic in uplink equally among carriers
-  uint32_t numberOfCarriersForUe = m_enabledComponentCarrier.find (rnti)->second;
+  uint32_t numberOfCarriersForUe = m_ueInfo.at (rnti).m_enabledComponentCarrier;
 
   m_ccmMacSapProviderMap.find (m_lastCcIdForSr)->second->ReportSrToScheduler (rnti);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/model/rem-spectrum-phy.cc ns-3.36/src/lte/model/rem-spectrum-phy.cc
--- ns-3.35/src/lte/model/rem-spectrum-phy.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/model/rem-spectrum-phy.cc	2022-04-30 18:23:58.050734500 -0700
@@ -114,8 +114,8 @@
   return m_rxSpectrumModel;
 }
 
-Ptr<AntennaModel>
-RemSpectrumPhy::GetRxAntenna () const
+Ptr<Object>
+RemSpectrumPhy::GetAntenna () const
 {
   return 0;
 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/model/rem-spectrum-phy.h ns-3.36/src/lte/model/rem-spectrum-phy.h
--- ns-3.35/src/lte/model/rem-spectrum-phy.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/model/rem-spectrum-phy.h	2022-04-30 18:23:58.050734500 -0700
@@ -70,7 +70,7 @@
   Ptr<MobilityModel> GetMobility () const;
   Ptr<NetDevice> GetDevice () const;
   Ptr<const SpectrumModel> GetRxSpectrumModel () const;
-  Ptr<AntennaModel> GetRxAntenna () const;
+  Ptr<Object> GetAntenna () const;
   void StartRx (Ptr<SpectrumSignalParameters> params);
 
   /** 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/model/tta-ff-mac-scheduler.cc ns-3.36/src/lte/model/tta-ff-mac-scheduler.cc
--- ns-3.35/src/lte/model/tta-ff-mac-scheduler.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/model/tta-ff-mac-scheduler.cc	2022-04-30 18:23:58.050734500 -0700
@@ -1059,15 +1059,12 @@
         {
           NS_LOG_INFO (this << " Layer " << (uint16_t)j << " CQI selected " << (uint16_t)worstCqi.at (j));
         }
-      uint32_t bytesTxed = 0;
       for (uint8_t j = 0; j < nLayer; j++)
         {
           newDci.m_mcs.push_back (m_amc->GetMcsFromCqi (worstCqi.at (j)));
           int tbSize = (m_amc->GetDlTbSizeFromMcs (newDci.m_mcs.at (j), RgbPerRnti * rbgSize) / 8); // (size of TB in bytes according to table 7.1.7.2.1-1 of 36.213)
           newDci.m_tbsSize.push_back (tbSize);
           NS_LOG_INFO (this << " Layer " << (uint16_t)j << " MCS selected" << m_amc->GetMcsFromCqi (worstCqi.at (j)));
-
-          bytesTxed += tbSize;
         }
 
       newDci.m_resAlloc = 0;  // only allocation type 0 at this stage
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/test/epc-test-run-time.pl ns-3.36/src/lte/test/epc-test-run-time.pl
--- ns-3.35/src/lte/test/epc-test-run-time.pl	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/test/epc-test-run-time.pl	2022-04-30 18:23:58.050734500 -0700
@@ -14,10 +14,10 @@
 
 
 # Configure and complite first the program to avoid counting compilation time as running time
-my $launch = "CXXFLAGS=\"-O3 -w\" ./waf -d optimized configure --enable-static --enable-examples --enable-modules=lte";
+my $launch = "CXXFLAGS=\"-O3 -w\" ./ns3 configure -d optimized --enable-static --enable-examples --enable-modules=lte";
 my $out, my $err;
 capture { system($launch ) } \$out, \$err;
-$launch = "./waf --run \'lena-profiling --simTime=0.1 --nUe=1 --nEnb=1 --nFloors=0\'";
+$launch = "./ns3 run \'lena-profiling --simTime=0.1 --nUe=1 --nEnb=1 --nFloors=0\'";
 
 foreach my $time (@simTime)
 {
@@ -26,7 +26,7 @@
             my $timeStats = Statistics::Descriptive::Full->new();
             for ( my $iteration = 0 ; $iteration < $nIterations ; $iteration++ )
             {
-               $launch = "time -f \"real%E\" ./waf --run 'lena-simple-epc --simTime=$time --numberOfNodes=$node'";
+               $launch = "time -f \"real%E\" ./ns3 run 'lena-simple-epc --simTime=$time --numberOfNodes=$node'";
                print "$launch\n";
                capture { system($launch ) } \$out, \$err;
                $err =~ /real(.+):(.+)/;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/test/epc-test-s1u-downlink.cc ns-3.36/src/lte/test/epc-test-s1u-downlink.cc
--- ns-3.35/src/lte/test/epc-test-s1u-downlink.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/test/epc-test-s1u-downlink.cc	2022-04-30 18:23:58.054734500 -0700
@@ -189,7 +189,9 @@
       Ptr<NetDevice> enbDevice = cellDevices.Get (cellDevices.GetN () - 1);
 
       // Note that the EpcEnbApplication won't care of the actual NetDevice type
-      epcHelper->AddEnb (enb, enbDevice, cellId);      
+      std::vector<uint16_t> cellIds;
+      cellIds.push_back (cellId);
+      epcHelper->AddEnb (enb, enbDevice, cellIds);
 
       // Plug test RRC entity
       Ptr<EpcEnbApplication> enbApp = enb->GetApplication (0)->GetObject<EpcEnbApplication> ();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/test/epc-test-s1u-uplink.cc ns-3.36/src/lte/test/epc-test-s1u-uplink.cc
--- ns-3.35/src/lte/test/epc-test-s1u-uplink.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/test/epc-test-s1u-uplink.cc	2022-04-30 18:23:58.054734500 -0700
@@ -402,7 +402,9 @@
       Ptr<NetDevice> enbDevice = cellDevices.Get (cellDevices.GetN () - 1);
 
       // Note that the EpcEnbApplication won't care of the actual NetDevice type
-      epcHelper->AddEnb (enb, enbDevice, cellId);
+      std::vector<uint16_t> cellIds;
+      cellIds.push_back (cellId);
+      epcHelper->AddEnb (enb, enbDevice, cellIds);
 
       // Plug test RRC entity
       Ptr<EpcEnbApplication> enbApp = enb->GetApplication (0)->GetObject<EpcEnbApplication> ();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/test/lte-simple-spectrum-phy.cc ns-3.36/src/lte/test/lte-simple-spectrum-phy.cc
--- ns-3.35/src/lte/test/lte-simple-spectrum-phy.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/test/lte-simple-spectrum-phy.cc	2022-04-30 18:23:58.054734500 -0700
@@ -118,8 +118,8 @@
 }
 
 
-Ptr<AntennaModel>
-LteSimpleSpectrumPhy::GetRxAntenna () const
+Ptr<Object>
+LteSimpleSpectrumPhy::GetAntenna () const
 {
   return m_antenna;
 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/test/lte-simple-spectrum-phy.h ns-3.36/src/lte/test/lte-simple-spectrum-phy.h
--- ns-3.35/src/lte/test/lte-simple-spectrum-phy.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/test/lte-simple-spectrum-phy.h	2022-04-30 18:23:58.054734500 -0700
@@ -66,7 +66,7 @@
   Ptr<MobilityModel> GetMobility () const;
   Ptr<NetDevice> GetDevice () const;
   Ptr<const SpectrumModel> GetRxSpectrumModel () const;
-  Ptr<AntennaModel> GetRxAntenna () const;
+  Ptr<Object> GetAntenna () const;
   void StartRx (Ptr<SpectrumSignalParameters> params);
 
   /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/test/lte-test-harq.cc ns-3.36/src/lte/test/lte-test-harq.cc
--- ns-3.35/src/lte/test/lte-test-harq.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/test/lte-test-harq.cc	2022-04-30 18:23:58.058734400 -0700
@@ -46,7 +46,6 @@
 #include <ns3/config.h>
 #include <ns3/boolean.h>
 #include <ns3/enum.h>
-#include <ns3/unused.h>
 #include <ns3/ff-mac-scheduler.h>
 #include <ns3/buildings-helper.h>
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/test/lte-test-phy-error-model.cc ns-3.36/src/lte/test/lte-test-phy-error-model.cc
--- ns-3.35/src/lte/test/lte-test-phy-error-model.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/test/lte-test-phy-error-model.cc	2022-04-30 18:23:58.062734600 -0700
@@ -47,7 +47,6 @@
 #include <ns3/boolean.h>
 #include <ns3/enum.h>
 #include <ns3/integer.h>
-#include <ns3/unused.h>
 #include <ns3/ff-mac-scheduler.h>
 #include <ns3/buildings-helper.h>
 
@@ -258,7 +257,7 @@
 
       double dlRxPackets = rlcStats->GetDlRxPackets (imsi, lcId);
       double dlTxPackets = rlcStats->GetDlTxPackets (imsi, lcId);
-      double dlBler =  1.0 - (dlRxPackets/dlTxPackets);
+      [[maybe_unused]] double dlBler =  1.0 - (dlRxPackets/dlTxPackets);
       double expectedDlRxPackets = dlTxPackets -dlTxPackets*m_blerRef;
       NS_LOG_INFO ("\tUser " << i << " imsi " << imsi << " DOWNLINK"
                    << " pkts rx " << dlRxPackets << " tx " << dlTxPackets
@@ -266,7 +265,6 @@
                    << " expected rx " << expectedDlRxPackets
                    << " difference " << std::abs (expectedDlRxPackets - dlRxPackets)
                    << " tolerance " << m_toleranceRxPackets);
-      NS_UNUSED (dlBler);
 
       // sanity check for whether the tx packets reported by the stats are correct
       // we expect one packet per TTI
@@ -417,7 +415,7 @@
       uint8_t lcId = 3;
       double dlRxPackets = rlcStats->GetDlRxPackets (imsi, lcId);
       double dlTxPackets = rlcStats->GetDlTxPackets (imsi, lcId);
-      double dlBler = 1.0 - (dlRxPackets/dlTxPackets);
+      [[maybe_unused]] double dlBler = 1.0 - (dlRxPackets/dlTxPackets);
       double expectedDlRxPackets = dlTxPackets -dlTxPackets*m_blerRef;
       NS_LOG_INFO ("\tUser " << i << " imsi " << imsi << " DOWNLINK"
                    << " pkts rx " << dlRxPackets << " tx " << dlTxPackets
@@ -425,7 +423,6 @@
                    << " expected rx " << expectedDlRxPackets
                    << " difference " << std::abs (expectedDlRxPackets - dlRxPackets)
                    << " tolerance " << m_toleranceRxPackets);
-      NS_UNUSED (dlBler);
 
       // sanity check for whether the tx packets reported by the stats are correct
       // we expect one packet per TTI
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/test/lte-test-primary-cell-change.cc ns-3.36/src/lte/test/lte-test-primary-cell-change.cc
--- ns-3.35/src/lte/test/lte-test-primary-cell-change.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/lte/test/lte-test-primary-cell-change.cc	2022-04-30 18:23:58.062734600 -0700
@@ -0,0 +1,205 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2017 Alexander Krotov
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Krotov <krotov@iitp.ru>
+ *
+ */
+
+#include "lte-test-primary-cell-change.h"
+
+#include <ns3/boolean.h>
+#include <ns3/double.h>
+#include <ns3/integer.h>
+#include <ns3/log.h>
+#include <ns3/simulator.h>
+
+#include <ns3/internet-stack-helper.h>
+#include <ns3/ipv4-address-helper.h>
+#include <ns3/ipv4-interface-container.h>
+#include <ns3/friis-spectrum-propagation-loss.h>
+#include <ns3/ipv4-static-routing-helper.h>
+#include <ns3/lte-enb-net-device.h>
+#include <ns3/lte-helper.h>
+#include <ns3/lte-ue-net-device.h>
+#include <ns3/lte-ue-rrc.h>
+#include <ns3/mobility-helper.h>
+#include <ns3/net-device-container.h>
+#include <ns3/node-container.h>
+#include <ns3/point-to-point-epc-helper.h>
+#include <ns3/point-to-point-helper.h>
+
+using namespace ns3;
+
+NS_LOG_COMPONENT_DEFINE ("LtePrimaryCellChangeTest");
+
+/*
+ * Test Suite
+ */
+
+LtePrimaryCellChangeTestSuite::LtePrimaryCellChangeTestSuite ()
+  : TestSuite ("lte-primary-cell-change", SYSTEM)
+{
+  // Test that handover from eNB to eNB with one carrier works within this framework.
+  AddTestCase (new LtePrimaryCellChangeTestCase ("ideal RRC, RngRun=1", true, 1, 1, 0, 1), TestCase::QUICK);
+  AddTestCase (new LtePrimaryCellChangeTestCase ("real RRC, RngRun=1", false, 1, 1, 0, 1), TestCase::QUICK);
+
+  // Test that handover between first carriers of eNBs works.
+  AddTestCase (new LtePrimaryCellChangeTestCase ("ideal RRC, RngRun=1", true, 1, 2, 0, 2), TestCase::QUICK);
+  AddTestCase (new LtePrimaryCellChangeTestCase ("real RRC, RngRun=1", false, 1, 2, 0, 2), TestCase::QUICK);
+
+  // Test that handover from second carrier of first eNB to first carrier of second eNB works.
+  AddTestCase (new LtePrimaryCellChangeTestCase ("ideal RRC, RngRun=1", true, 1, 2, 1, 2), TestCase::QUICK);
+  AddTestCase (new LtePrimaryCellChangeTestCase ("real RRC, RngRun=1", false, 1, 2, 1, 2), TestCase::QUICK);
+
+  // Test that handover from first carrier of first eNB to first carrier of second eNB works.
+  AddTestCase (new LtePrimaryCellChangeTestCase ("ideal RRC, RngRun=1", true, 1, 2, 0, 3), TestCase::QUICK);
+  AddTestCase (new LtePrimaryCellChangeTestCase ("real RRC, RngRun=1", false, 1, 2, 0, 3), TestCase::QUICK);
+
+  // Test that handover from second carrier of first eNB to second carrier of second eNB works.
+  AddTestCase (new LtePrimaryCellChangeTestCase ("ideal RRC, RngRun=1", true, 1, 2, 1, 3), TestCase::QUICK);
+  AddTestCase (new LtePrimaryCellChangeTestCase ("real RRC, RngRun=1", false, 1, 2, 1, 3), TestCase::QUICK);
+
+  // Test intra-eNB inter-frequency handover.
+  AddTestCase (new LtePrimaryCellChangeTestCase ("ideal RRC, RngRun=1", true, 1, 2, 0, 1), TestCase::QUICK);
+  AddTestCase (new LtePrimaryCellChangeTestCase ("real RRC, RngRun=1", false, 1, 2, 0, 1), TestCase::QUICK);
+  AddTestCase (new LtePrimaryCellChangeTestCase ("ideal RRC, RngRun=1", true, 1, 2, 1, 0), TestCase::QUICK);
+  AddTestCase (new LtePrimaryCellChangeTestCase ("real RRC, RngRun=1", false, 1, 2, 1, 0), TestCase::QUICK);
+  AddTestCase (new LtePrimaryCellChangeTestCase ("ideal RRC, RngRun=1", true, 1, 4, 3, 1), TestCase::QUICK);
+  AddTestCase (new LtePrimaryCellChangeTestCase ("real RRC, RngRun=1", false, 1, 4, 3, 1), TestCase::QUICK);
+} // end of LtePrimaryCellChangeTestSuite::LtePrimaryCellChangeTestSuite ()
+
+static LtePrimaryCellChangeTestSuite g_ltePrimaryCellChangeTestSuite;
+
+/*
+ * Test Case
+ */
+
+LtePrimaryCellChangeTestCase::LtePrimaryCellChangeTestCase (
+  std::string name, bool isIdealRrc, int64_t rngRun,
+  uint8_t numberOfComponentCarriers, uint8_t sourceComponentCarrier, uint8_t targetComponentCarrier)
+  : TestCase (name),
+    m_isIdealRrc {isIdealRrc},
+    m_rngRun {rngRun},
+    m_numberOfComponentCarriers {numberOfComponentCarriers},
+    m_sourceComponentCarrier {sourceComponentCarrier},
+    m_targetComponentCarrier {targetComponentCarrier}
+{
+  NS_LOG_FUNCTION (this << GetName ());
+}
+
+
+LtePrimaryCellChangeTestCase::~LtePrimaryCellChangeTestCase ()
+{
+  NS_LOG_FUNCTION (this << GetName ());
+}
+
+void
+LtePrimaryCellChangeTestCase::DoRun ()
+{
+  NS_LOG_FUNCTION (this << GetName ());
+
+  Config::SetGlobal ("RngRun", UintegerValue (m_rngRun));
+
+  Config::SetDefault ("ns3::LteEnbNetDevice::DlEarfcn", UintegerValue (100));
+  Config::SetDefault ("ns3::LteEnbNetDevice::UlEarfcn", UintegerValue (100 + 18000));
+  Config::SetDefault ("ns3::LteEnbNetDevice::DlBandwidth", UintegerValue (25));
+  Config::SetDefault ("ns3::LteEnbNetDevice::UlBandwidth", UintegerValue (25));
+  Config::SetDefault ("ns3::LteUeNetDevice::DlEarfcn", UintegerValue (100));
+
+  // Create helpers.
+  auto lteHelper = CreateObject<LteHelper> ();
+  lteHelper->SetAttribute ("PathlossModel", TypeIdValue (ns3::FriisSpectrumPropagationLossModel::GetTypeId ()));
+  lteHelper->SetAttribute ("UseIdealRrc", BooleanValue (m_isIdealRrc));
+  lteHelper->SetAttribute ("NumberOfComponentCarriers", UintegerValue (m_numberOfComponentCarriers));
+
+  auto epcHelper = CreateObject<PointToPointEpcHelper> ();
+  lteHelper->SetEpcHelper (epcHelper);
+
+  // Create nodes.
+  NodeContainer enbNodes;
+  enbNodes.Create (2);
+  auto ueNode = CreateObject<Node> ();
+
+  MobilityHelper mobility;
+  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
+  mobility.Install (enbNodes);
+  mobility.Install (ueNode);
+
+  // Physical layer.
+  auto enbDevs = lteHelper->InstallEnbDevice (enbNodes);
+  auto ueDev = DynamicCast<LteUeNetDevice> (lteHelper->InstallUeDevice (ueNode).Get (0));
+
+  auto sourceEnbDev = DynamicCast<LteEnbNetDevice> (enbDevs.Get (m_sourceComponentCarrier / m_numberOfComponentCarriers));
+  auto targetEnbDev = DynamicCast<LteEnbNetDevice> (enbDevs.Get (m_targetComponentCarrier / m_numberOfComponentCarriers));
+
+  // Network layer.
+  InternetStackHelper internet;
+  internet.Install (ueNode);
+  epcHelper->AssignUeIpv4Address (NetDeviceContainer (ueDev));
+
+  std::map<uint8_t, Ptr<ComponentCarrierUe>> ueCcMap = ueDev->GetCcMap ();
+  ueDev->SetDlEarfcn (ueCcMap.at (m_sourceComponentCarrier)->GetDlEarfcn ());
+
+  // Attach UE to specified component carrier
+  lteHelper->Attach (ueDev, sourceEnbDev, m_sourceComponentCarrier % m_numberOfComponentCarriers);
+
+  // Connect to trace sources in UEs
+  Config::Connect ("/NodeList/*/DeviceList/*/LteUeRrc/StateTransition",
+                   MakeCallback (&LtePrimaryCellChangeTestCase::StateTransitionCallback,
+                                 this));
+  Config::Connect ("/NodeList/*/DeviceList/*/LteUeRrc/ConnectionEstablished",
+                   MakeCallback (&LtePrimaryCellChangeTestCase::ConnectionEstablishedCallback,
+                                 this));
+
+  uint16_t targetCellId = targetEnbDev->GetCcMap ().at (m_targetComponentCarrier % m_numberOfComponentCarriers)->GetCellId ();
+
+  lteHelper->AddX2Interface (enbNodes);
+  lteHelper->HandoverRequest (Seconds (1.0), ueDev, sourceEnbDev, targetCellId);
+
+  // Run simulation.
+  Simulator::Stop (Seconds (2.0));
+  Simulator::Run ();
+
+  uint16_t expectedCellId = targetCellId;
+  uint16_t actualCellId = ueDev->GetRrc ()->GetCellId ();
+  NS_TEST_ASSERT_MSG_EQ (expectedCellId, actualCellId, "IMSI " << ueDev->GetImsi () << " has attached to an unexpected cell");
+
+  NS_TEST_ASSERT_MSG_EQ (m_lastState.at (ueDev->GetImsi ()),
+                         LteUeRrc::CONNECTED_NORMALLY,
+                         "UE " << ueDev->GetImsi ()
+                               << " is not at CONNECTED_NORMALLY state");
+
+  // Destroy simulator.
+  Simulator::Destroy ();
+} // end of void LtePrimaryCellChangeTestCase::DoRun ()
+
+
+void
+LtePrimaryCellChangeTestCase::StateTransitionCallback (
+  std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti,
+  LteUeRrc::State oldState, LteUeRrc::State newState)
+{
+  NS_LOG_FUNCTION (this << imsi << cellId << rnti << oldState << newState);
+  m_lastState[imsi] = newState;
+}
+
+void
+LtePrimaryCellChangeTestCase::ConnectionEstablishedCallback (
+  std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti)
+{
+  NS_LOG_FUNCTION (this << imsi << cellId << rnti);
+}
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/test/lte-test-primary-cell-change.h ns-3.36/src/lte/test/lte-test-primary-cell-change.h
--- ns-3.35/src/lte/test/lte-test-primary-cell-change.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/lte/test/lte-test-primary-cell-change.h	2022-04-30 18:23:58.062734600 -0700
@@ -0,0 +1,124 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2017 Alexander Krotov
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Krotov <krotov@iitp.ru>
+ *
+ */
+
+#ifndef LTE_TEST_PRIMARY_CELL_CHANGE_H
+#define LTE_TEST_PRIMARY_CELL_CHANGE_H
+
+#include <ns3/test.h>
+#include <ns3/nstime.h>
+#include <ns3/node-container.h>
+#include <ns3/vector.h>
+#include <ns3/lte-ue-rrc.h>
+#include <vector>
+
+using namespace ns3;
+
+/**
+ * \brief Test suite for executing the primary cell change test cases.
+ *
+ * \sa ns3::LtePrimaryCellChangeTestCase
+ */
+class LtePrimaryCellChangeTestSuite : public TestSuite
+{
+public:
+  LtePrimaryCellChangeTestSuite ();
+};
+
+
+
+
+/**
+ * \ingroup lte
+ *
+ * \brief Testing the handover procedure with multiple component carriers.
+ */
+class LtePrimaryCellChangeTestCase : public TestCase
+{
+public:
+  /**
+   * \brief Creates an instance of the initial cell selection test case.
+   * \param name name of this test
+   * \param isIdealRrc if true, simulation uses Ideal RRC protocol, otherwise
+   *                   simulation uses Real RRC protocol
+   * \param rngRun the number of run to be used by the random number generator
+   * \param numberOfComponentCarriers number of component carriers
+   * \param sourceComponentCarrier source component carrier
+   * \param targetComponentCarrier target component carrier
+   *
+   * If sourceComponentCarrier or targetComponentCarrier is greater than
+   * number of component carriers, it identifies component carrier on second eNB.
+   */
+  LtePrimaryCellChangeTestCase (std::string name, bool isIdealRrc, int64_t rngRun,
+                                uint8_t numberOfComponentCarriers,
+                                uint8_t sourceComponentCarrier,
+                                uint8_t targetComponentCarrier);
+
+  virtual ~LtePrimaryCellChangeTestCase ();
+
+private:
+  /**
+   * \brief Setup the simulation according to the configuration set by the
+   *        class constructor, run it, and verify the result.
+   */
+  virtual void DoRun ();
+
+  /**
+   * \brief State transition callback function
+   * \param context the context string
+   * \param imsi the IMSI
+   * \param cellId the cell ID
+   * \param rnti the RNTI
+   * \param oldState the old state
+   * \param newState the new state
+   */
+  void StateTransitionCallback (std::string context, uint64_t imsi,
+                                uint16_t cellId, uint16_t rnti,
+                                LteUeRrc::State oldState, LteUeRrc::State newState);
+  /**
+   * \brief Initial cell selection end ok callback function
+   * \param context the context string
+   * \param imsi the IMSI
+   * \param cellId the cell ID
+   */
+  void InitialPrimaryCellChangeEndOkCallback (std::string context, uint64_t imsi,
+                                          uint16_t cellId);
+  /**
+   * \brief Connection established callback function
+   * \param context the context string
+   * \param imsi the IMSI
+   * \param cellId the cell ID
+   * \param rnti the RNTI
+   */
+  void ConnectionEstablishedCallback (std::string context, uint64_t imsi,
+                                      uint16_t cellId, uint16_t rnti);
+
+  bool m_isIdealRrc; ///< whether the LTE is configured to use ideal RRC
+  int64_t m_rngRun; ///< rng run
+  uint8_t m_numberOfComponentCarriers; ///< number of component carriers
+  uint8_t m_sourceComponentCarrier; ///< source primary component carrier
+  uint8_t m_targetComponentCarrier; ///< target primary component carrier
+
+  /// The current UE RRC state.
+  std::map<uint64_t, LteUeRrc::State> m_lastState;
+
+}; // end of class LtePrimaryCellChangeTestCase
+
+#endif /* LTE_TEST_PRIMARY_CELL_CHANGE_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/test/lte-test-run-time.pl ns-3.36/src/lte/test/lte-test-run-time.pl
--- ns-3.35/src/lte/test/lte-test-run-time.pl	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/test/lte-test-run-time.pl	2022-04-30 18:23:58.062734600 -0700
@@ -14,11 +14,11 @@
 my @simTime = (5, 10);
 
 # Configure and complite first the program to avoid counting compilation time as running time
-my $launch = "CXXFLAGS=\"-O3 -w\" ./waf -d optimized configure --enable-static --enable-examples --enable-modules=lte";
+my $launch = "CXXFLAGS=\"-O3 -w\" ./ns3 configure -d optimized --enable-static --enable-examples --enable-modules=lte";
 my $out;
 my $err;
 capture { system($launch ) } \$out, \$err;
-$launch = "./waf --run \'lena-profiling --simTime=0.1 --nUe=1 --nEnb=1 --nFloors=0\'";
+$launch = "./ns3 run \'lena-profiling --simTime=0.1 --nUe=1 --nEnb=1 --nFloors=0\'";
 capture { system($launch ) } \$out, \$err;
 
 foreach my $time (@simTime)
@@ -32,7 +32,7 @@
             my $timeStats = Statistics::Descriptive::Full->new();
             for ( my $iteration = 0 ; $iteration < $nIterations ; $iteration++ )
             {
-               $launch = "time -f \"real%E\" ./waf --run \'lena-profiling --simTime=$time --nUe=$ue --nEnb=$enb --nFloors=$floor\'";
+               $launch = "time -f \"real%E\" ./ns3 run \'lena-profiling --simTime=$time --nUe=$ue --nEnb=$enb --nFloors=$floor\'";
                print "$launch\n";
                capture { system($launch ) } \$out, \$err;
                $err =~ /real(.+):(.+)/;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/test/lte-test-secondary-cell-handover.cc ns-3.36/src/lte/test/lte-test-secondary-cell-handover.cc
--- ns-3.35/src/lte/test/lte-test-secondary-cell-handover.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/lte/test/lte-test-secondary-cell-handover.cc	2022-04-30 18:23:58.062734600 -0700
@@ -0,0 +1,208 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2017 Alexander Krotov
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Krotov <krotov@iitp.ru>
+ *
+ */
+
+#include <ns3/friis-spectrum-propagation-loss.h>
+#include <ns3/log.h>
+#include <ns3/lte-enb-net-device.h>
+#include <ns3/lte-helper.h>
+#include <ns3/test.h>
+#include <ns3/point-to-point-epc-helper.h>
+#include <ns3/mobility-helper.h>
+#include <ns3/boolean.h>
+#include <ns3/double.h>
+#include <ns3/integer.h>
+#include <ns3/log.h>
+#include <ns3/simulator.h>
+#include <ns3/lte-ue-net-device.h>
+#include <ns3/internet-stack-helper.h>
+#include <ns3/lte-ue-rrc.h>
+
+using namespace ns3;
+
+NS_LOG_COMPONENT_DEFINE ("LteSecondaryCellHandoverTest");
+
+/**
+ * \ingroup lte-test
+ * \ingroup tests
+ *
+ * \brief Test measurement-based handover to secondary cell.
+ */
+
+class LteSecondaryCellHandoverTestCase : public TestCase {
+public:
+  /**
+   * \brief Creates an instance of the measurement-based secondary cell handover test case.
+   * \param name name of the test case
+   * \param useIdealRrc if true, simulation uses Ideal RRC protocol, otherwise
+   *                    simulation uses Real RRC protocol
+   */
+
+  LteSecondaryCellHandoverTestCase (std::string name, bool useIdealRrc);
+
+  /**
+   * \brief Shutdown cellId by reducing its power to 1 dBm.
+   * \param cellId ID of the cell to shutdown
+   */
+  void ShutdownCell (uint32_t cellId);
+
+  /**
+   * \brief Callback method indicating start of UE handover
+   * \param imsi The IMSI
+   * \param sourceCellId The source cell ID
+   * \param rnti The RNTI
+   * \param targetCellId The target cell ID
+   */
+  void UeHandoverStartCallback (uint64_t imsi,
+                                uint16_t sourceCellId, uint16_t rnti,
+                                uint16_t targetCellId);
+
+
+
+private:
+  /**
+   * \brief Run a simulation.
+   */
+  virtual void DoRun ();
+
+  /**
+   * \brief Verify that handover has occurred during the simulation.
+   */
+  virtual void DoTeardown ();
+
+  bool m_useIdealRrc; ///< whether LTE is configured to use ideal RRC
+  uint8_t m_numberOfComponentCarriers; ///< Number of component carriers
+
+  Ptr<LteEnbNetDevice> m_sourceEnbDev; ///< Source eNB device
+
+  bool m_hasUeHandoverStarted; ///< true if UE started handover
+};
+
+LteSecondaryCellHandoverTestCase::LteSecondaryCellHandoverTestCase (std::string name, bool useIdealRrc)
+    : TestCase {name},
+      m_useIdealRrc {useIdealRrc},
+      m_numberOfComponentCarriers {2},
+      m_hasUeHandoverStarted {false}
+{
+}
+
+void
+LteSecondaryCellHandoverTestCase::ShutdownCell (uint32_t cellId)
+{
+  Ptr<LteEnbPhy> phy = m_sourceEnbDev->GetPhy (cellId - 1);
+  phy->SetTxPower (1);
+}
+
+void
+LteSecondaryCellHandoverTestCase::UeHandoverStartCallback (uint64_t imsi,
+                            uint16_t sourceCellId, uint16_t rnti,
+                            uint16_t targetCellId)
+{
+  NS_LOG_FUNCTION (this << imsi << sourceCellId << rnti << targetCellId);
+  m_hasUeHandoverStarted = true;
+}
+
+void
+LteSecondaryCellHandoverTestCase::DoRun ()
+{
+  NS_LOG_FUNCTION (this << GetName ());
+
+  Config::SetDefault ("ns3::LteEnbNetDevice::DlEarfcn", UintegerValue (100));
+  Config::SetDefault ("ns3::LteEnbNetDevice::UlEarfcn", UintegerValue (100 + 18000));
+  Config::SetDefault ("ns3::LteEnbNetDevice::DlBandwidth", UintegerValue (25));
+  Config::SetDefault ("ns3::LteEnbNetDevice::UlBandwidth", UintegerValue (25));
+  Config::SetDefault ("ns3::LteUeNetDevice::DlEarfcn", UintegerValue (100));
+
+  // Create helpers.
+  auto lteHelper = CreateObject<LteHelper> ();
+  lteHelper->SetAttribute ("PathlossModel", TypeIdValue (ns3::FriisSpectrumPropagationLossModel::GetTypeId ()));
+  lteHelper->SetAttribute ("UseIdealRrc", BooleanValue (m_useIdealRrc));
+  lteHelper->SetAttribute ("NumberOfComponentCarriers", UintegerValue (m_numberOfComponentCarriers));
+
+  // Configure handover algorithm.
+  lteHelper->SetHandoverAlgorithmType ("ns3::A3RsrpHandoverAlgorithm");
+  lteHelper->SetHandoverAlgorithmAttribute ("Hysteresis", DoubleValue (1.5));
+  lteHelper->SetHandoverAlgorithmAttribute ("TimeToTrigger", TimeValue (MilliSeconds (128)));
+
+  auto epcHelper = CreateObject<PointToPointEpcHelper> ();
+  lteHelper->SetEpcHelper (epcHelper);
+
+  // Create nodes.
+  auto enbNode = CreateObject<Node> ();
+  auto ueNode = CreateObject<Node> ();
+
+  // Setup node mobility.
+  MobilityHelper mobility;
+  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
+  mobility.Install (enbNode);
+  mobility.Install (ueNode);
+
+  // Physical layer.
+  m_sourceEnbDev = DynamicCast<LteEnbNetDevice> (lteHelper->InstallEnbDevice (enbNode).Get (0));
+  auto ueDevs = lteHelper->InstallUeDevice (ueNode);
+  auto ueDev = DynamicCast<LteUeNetDevice> (ueDevs.Get (0));
+
+  // Network layer.
+  InternetStackHelper internet;
+  internet.Install (ueNode);
+  epcHelper->AssignUeIpv4Address (NetDeviceContainer (ueDev));
+
+  uint16_t sourceCellId = m_sourceEnbDev->GetCellId ();
+  Simulator::Schedule (Seconds (0.5), &LteSecondaryCellHandoverTestCase::ShutdownCell, this, sourceCellId);
+
+  // Setup traces.
+  ueDev->GetRrc ()->TraceConnectWithoutContext ("HandoverStart", MakeCallback (&LteSecondaryCellHandoverTestCase::UeHandoverStartCallback, this));
+
+  std::map<uint8_t, Ptr<ComponentCarrierUe>> ueCcMap = ueDev->GetCcMap ();
+  ueDev->SetDlEarfcn (ueCcMap.at (0)->GetDlEarfcn ());
+  lteHelper->Attach (ueDev, m_sourceEnbDev, 0);
+
+  // Run simulation.
+  Simulator::Stop (Seconds (1));
+  Simulator::Run ();
+  Simulator::Destroy ();
+}
+
+void
+LteSecondaryCellHandoverTestCase::DoTeardown ()
+{
+  NS_LOG_FUNCTION (this);
+  NS_TEST_ASSERT_MSG_EQ (m_hasUeHandoverStarted, true, "Handover did not occur");
+}
+
+/**
+ * \ingroup lte-test
+ * \ingroup tests
+ *
+ * \brief LTE measurement-based handover to secondary cell test suite.
+ */
+class LteSecondaryCellHandoverTestSuite : public TestSuite {
+public:
+    LteSecondaryCellHandoverTestSuite ();
+};
+
+LteSecondaryCellHandoverTestSuite::LteSecondaryCellHandoverTestSuite ()
+    : TestSuite {"lte-secondary-cell-handover", SYSTEM}
+{
+  AddTestCase (new LteSecondaryCellHandoverTestCase ("Ideal RRC", true), TestCase::QUICK);
+  AddTestCase (new LteSecondaryCellHandoverTestCase ("Real RRC", false), TestCase::QUICK);
+}
+
+static LteSecondaryCellHandoverTestSuite g_lteSecondaryCellHandoverTestSuiteInstance;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/test/lte-test-secondary-cell-selection.cc ns-3.36/src/lte/test/lte-test-secondary-cell-selection.cc
--- ns-3.35/src/lte/test/lte-test-secondary-cell-selection.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/lte/test/lte-test-secondary-cell-selection.cc	2022-04-30 18:23:58.062734600 -0700
@@ -0,0 +1,182 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2017 Alexander Krotov
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Krotov <krotov@iitp.ru>
+ *
+ */
+
+#include "lte-test-secondary-cell-selection.h"
+
+#include <ns3/boolean.h>
+#include <ns3/double.h>
+#include <ns3/integer.h>
+#include <ns3/log.h>
+#include <ns3/simulator.h>
+
+#include <ns3/internet-stack-helper.h>
+#include <ns3/ipv4-address-helper.h>
+#include <ns3/ipv4-interface-container.h>
+#include <ns3/friis-spectrum-propagation-loss.h>
+#include <ns3/ipv4-static-routing-helper.h>
+#include <ns3/lte-enb-net-device.h>
+#include <ns3/lte-helper.h>
+#include <ns3/lte-ue-net-device.h>
+#include <ns3/lte-ue-rrc.h>
+#include <ns3/mobility-helper.h>
+#include <ns3/net-device-container.h>
+#include <ns3/node-container.h>
+#include <ns3/point-to-point-epc-helper.h>
+#include <ns3/point-to-point-helper.h>
+
+using namespace ns3;
+
+NS_LOG_COMPONENT_DEFINE ("LteSecondaryCellSelectionTest");
+
+/*
+ * Test Suite
+ */
+
+LteSecondaryCellSelectionTestSuite::LteSecondaryCellSelectionTestSuite ()
+  : TestSuite ("lte-secondary-cell-selection", SYSTEM)
+{
+  // REAL RRC PROTOCOL, either 2 or 4 UEs connecting to 2 or 4 component carriers
+
+  AddTestCase (new LteSecondaryCellSelectionTestCase ("EPC, real RRC, RngRun=1", false, 1U, 2), TestCase::QUICK);
+  AddTestCase (new LteSecondaryCellSelectionTestCase ("EPC, real RRC, RngRun=1", false, 1U, 4), TestCase::QUICK);
+
+  // IDEAL RRC PROTOCOL, either 2 or 4 UEs connecting to 2 or 4 component carriers
+
+  AddTestCase (new LteSecondaryCellSelectionTestCase ("EPC, ideal RRC, RngRun=1", true, 1U, 2), TestCase::QUICK);
+  AddTestCase (new LteSecondaryCellSelectionTestCase ("EPC, ideal RRC, RngRun=1", true, 1U, 4), TestCase::QUICK);
+
+} // end of LteSecondaryCellSelectionTestSuite::LteSecondaryCellSelectionTestSuite ()
+
+static LteSecondaryCellSelectionTestSuite g_lteSecondaryCellSelectionTestSuite;
+
+/*
+ * Test Case
+ */
+
+LteSecondaryCellSelectionTestCase::LteSecondaryCellSelectionTestCase (
+  std::string name, bool isIdealRrc, uint64_t rngRun, uint8_t numberOfComponentCarriers)
+  : TestCase (name),
+    m_isIdealRrc (isIdealRrc),
+    m_rngRun (rngRun),
+    m_numberOfComponentCarriers (numberOfComponentCarriers)
+{
+  NS_LOG_FUNCTION (this << GetName ());
+}
+
+
+LteSecondaryCellSelectionTestCase::~LteSecondaryCellSelectionTestCase ()
+{
+  NS_LOG_FUNCTION (this << GetName ());
+}
+
+void
+LteSecondaryCellSelectionTestCase::DoRun ()
+{
+  NS_LOG_FUNCTION (this << GetName ());
+
+  Config::SetGlobal ("RngRun", UintegerValue (m_rngRun));
+
+  // Create helpers.
+  auto lteHelper = CreateObject<LteHelper> ();
+  lteHelper->SetAttribute ("PathlossModel", TypeIdValue (ns3::FriisSpectrumPropagationLossModel::GetTypeId ()));
+  lteHelper->SetAttribute ("UseIdealRrc", BooleanValue (m_isIdealRrc));
+  lteHelper->SetAttribute ("NumberOfComponentCarriers", UintegerValue (m_numberOfComponentCarriers));
+
+  auto epcHelper = CreateObject<PointToPointEpcHelper> ();
+  lteHelper->SetEpcHelper (epcHelper);
+
+  // Create nodes.
+  auto enbNode = CreateObject<Node> ();
+  NodeContainer ueNodes;
+  ueNodes.Create (m_numberOfComponentCarriers);
+
+  MobilityHelper mobility;
+  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
+  mobility.Install (enbNode);
+  mobility.Install (ueNodes);
+
+  // Physical layer.
+  auto enbDev = DynamicCast<LteEnbNetDevice> (lteHelper->InstallEnbDevice (enbNode).Get (0));
+  auto ueDevs = lteHelper->InstallUeDevice (ueNodes);
+
+  // Network layer.
+  InternetStackHelper internet;
+  internet.Install (ueNodes);
+  epcHelper->AssignUeIpv4Address (ueDevs);
+
+  auto ueDev = DynamicCast<LteUeNetDevice> (ueDevs.Get (0));
+  std::map< uint8_t, Ptr<ComponentCarrierUe> > ueCcMap = ueDev->GetCcMap ();
+  for (auto it: ueCcMap)
+    {
+      NS_LOG_DEBUG ("Assign DL EARFCN " << it.second->GetDlEarfcn() << " to UE " << ueDevs.Get (it.first)->GetNode ()->GetId ());
+      DynamicCast<LteUeNetDevice> (ueDevs.Get (it.first))->SetDlEarfcn (it.second->GetDlEarfcn());
+    }
+
+  // Enable Idle mode cell selection.
+  lteHelper->Attach (ueDevs);
+
+  // Connect to trace sources in UEs
+  Config::Connect ("/NodeList/*/DeviceList/*/LteUeRrc/StateTransition",
+                   MakeCallback (&LteSecondaryCellSelectionTestCase::StateTransitionCallback,
+                                 this));
+  Config::Connect ("/NodeList/*/DeviceList/*/LteUeRrc/ConnectionEstablished",
+                   MakeCallback (&LteSecondaryCellSelectionTestCase::ConnectionEstablishedCallback,
+                                 this));
+
+  // Run simulation.
+  Simulator::Stop (Seconds (2.0));
+  Simulator::Run ();
+
+  for (auto &it: enbDev->GetCcMap ())
+    {
+      ueDev = DynamicCast<LteUeNetDevice> (ueDevs.Get (it.first));
+      uint16_t expectedCellId = it.second->GetCellId ();
+      uint16_t actualCellId = ueDev->GetRrc ()->GetCellId ();
+      NS_LOG_DEBUG ("RNTI " << ueDev->GetRrc ()->GetRnti () << " attached to cell ID: " << actualCellId);
+      NS_TEST_ASSERT_MSG_EQ (expectedCellId, actualCellId, "IMSI " << ueDev->GetImsi () << " has attached to an unexpected cell");
+
+      NS_TEST_ASSERT_MSG_EQ (m_lastState.at (ueDev->GetImsi ()),
+                             LteUeRrc::CONNECTED_NORMALLY,
+                             "UE " << ueDev->GetImsi ()
+                                   << " is not at CONNECTED_NORMALLY state");
+    }
+
+  // Destroy simulator.
+  Simulator::Destroy ();
+} // end of void LteSecondaryCellSelectionTestCase::DoRun ()
+
+
+void
+LteSecondaryCellSelectionTestCase::StateTransitionCallback (
+  std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti,
+  LteUeRrc::State oldState, LteUeRrc::State newState)
+{
+  NS_LOG_FUNCTION (this << imsi << cellId << rnti << LteUeRrc::ToString (oldState) << LteUeRrc::ToString (newState));
+  m_lastState[imsi] = newState;
+}
+
+
+void
+LteSecondaryCellSelectionTestCase::ConnectionEstablishedCallback (
+  std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti)
+{
+  NS_LOG_FUNCTION (this << imsi << cellId << rnti);
+}
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/test/lte-test-secondary-cell-selection.h ns-3.36/src/lte/test/lte-test-secondary-cell-selection.h
--- ns-3.35/src/lte/test/lte-test-secondary-cell-selection.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/lte/test/lte-test-secondary-cell-selection.h	2022-04-30 18:23:58.062734600 -0700
@@ -0,0 +1,118 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2017 Alexander Krotov
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Krotov <krotov@iitp.ru>
+ *
+ */
+
+#ifndef LTE_TEST_SECONDARY_CELL_SELECTION_H
+#define LTE_TEST_SECONDARY_CELL_SELECTION_H
+
+#include <ns3/test.h>
+#include <ns3/nstime.h>
+#include <ns3/node-container.h>
+#include <ns3/vector.h>
+#include <ns3/lte-ue-rrc.h>
+#include <vector>
+
+using namespace ns3;
+
+/**
+ * \ingroup lte-test
+ *
+ * \brief Test suite for executing the secondary cell selection test cases.
+ *
+ * Checks that if multiple component carriers are defined for an eNB, that
+ * UEs can connect to each of these component carriers, not just the primary
+ *
+ * \sa ns3::LteSecondaryCellSelectionTestCase
+ */
+class LteSecondaryCellSelectionTestSuite : public TestSuite
+{
+public:
+  LteSecondaryCellSelectionTestSuite ();
+};
+
+
+/**
+ * \ingroup lte-test
+ *
+ * \brief Testing the initial cell selection procedure by UE at IDLE state in
+ *        the beginning of simulation with multiple component carriers.
+ */
+class LteSecondaryCellSelectionTestCase : public TestCase
+{
+public:
+  /**
+   * \brief Creates an instance of the initial cell selection test case.
+   * \param name name of this test
+   * \param isIdealRrc if true, simulation uses Ideal RRC protocol, otherwise
+   *                   simulation uses Real RRC protocol
+   * \param rngRun the number of run to be used by the random number generator
+   * \param numberOfComponentCarriers number of component carriers
+   */
+  LteSecondaryCellSelectionTestCase (std::string name, bool isIdealRrc, uint64_t rngRun, uint8_t numberOfComponentCarriers);
+
+  virtual ~LteSecondaryCellSelectionTestCase ();
+
+private:
+  /**
+   * \brief Setup the simulation according to the configuration set by the
+   *        class constructor, run it, and verify the result.
+   */
+  virtual void DoRun ();
+
+  /**
+   * \brief State transition callback function
+   * \param context the context string
+   * \param imsi the IMSI
+   * \param cellId the cell ID
+   * \param rnti the RNTI
+   * \param oldState the old state
+   * \param newState the new state
+   */
+  void StateTransitionCallback (std::string context, uint64_t imsi,
+                                uint16_t cellId, uint16_t rnti,
+                                LteUeRrc::State oldState, LteUeRrc::State newState);
+  /**
+   * \brief Initial cell selection end ok callback function
+   * \param context the context string
+   * \param imsi the IMSI
+   * \param cellId the cell ID
+   */
+  void InitialSecondaryCellSelectionEndOkCallback (std::string context, uint64_t imsi,
+                                          uint16_t cellId);
+  /**
+   * \brief Connection established callback function
+   * \param context the context string
+   * \param imsi the IMSI
+   * \param cellId the cell ID
+   * \param rnti the RNTI
+   */
+  void ConnectionEstablishedCallback (std::string context, uint64_t imsi,
+                                      uint16_t cellId, uint16_t rnti);
+
+  bool m_isIdealRrc; ///< whether the LTE is configured to use ideal RRC
+  uint64_t m_rngRun; ///< rng run
+  uint8_t m_numberOfComponentCarriers; ///< number of component carriers
+
+  /// The current UE RRC state.
+  std::map<uint64_t, LteUeRrc::State> m_lastState;
+
+}; // end of class LteSecondaryCellSelectionTestCase
+
+#endif /* LTE_TEST_SECONDARY_CELL_SELECTION_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/test/lte-test-ue-measurements.cc ns-3.36/src/lte/test/lte-test-ue-measurements.cc
--- ns-3.35/src/lte/test/lte-test-ue-measurements.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/test/lte-test-ue-measurements.cc	2022-04-30 18:23:58.062734600 -0700
@@ -249,13 +249,13 @@
         {
           NS_LOG_DEBUG (this << "Serving Cell: received IMSI " << imsi << " CellId " << cellId << " RNTI " << rnti
                              << " thr " << (uint16_t) EutranMeasurementMapping::Dbm2RsrpRange (m_rsrpDbmUeServingCell)
-                             << " RSRP " << (uint16_t) meas.measResults.rsrpResult
-                             << " RSRQ " << (uint16_t)meas.measResults.rsrqResult
+                             << " RSRP " << (uint16_t) meas.measResults.measResultPCell.rsrpResult
+                             << " RSRQ " << (uint16_t)meas.measResults.measResultPCell.rsrqResult
                              << " thr " << (uint16_t) EutranMeasurementMapping::Db2RsrqRange (m_rsrqDbUeServingCell));
-          NS_TEST_ASSERT_MSG_EQ (meas.measResults.rsrpResult,
+          NS_TEST_ASSERT_MSG_EQ (meas.measResults.measResultPCell.rsrpResult,
                                  EutranMeasurementMapping::Dbm2RsrpRange (m_rsrpDbmUeServingCell),
                                  "Wrong RSRP ");
-          NS_TEST_ASSERT_MSG_EQ (meas.measResults.rsrqResult,
+          NS_TEST_ASSERT_MSG_EQ (meas.measResults.measResultPCell.rsrqResult,
                                  EutranMeasurementMapping::Db2RsrqRange (m_rsrqDbUeServingCell),
                                  "Wrong RSRQ ");
         }
@@ -263,13 +263,13 @@
         {
           NS_LOG_DEBUG (this << "Neighbor cell: received IMSI " << imsi << " CellId " << cellId << " RNTI " << rnti
                              << " thr " << (uint16_t) EutranMeasurementMapping::Dbm2RsrpRange (m_rsrpDbmUeNeighborCell)
-                             << " RSRP " << (uint16_t) meas.measResults.rsrpResult
-                             << " RSRQ " << (uint16_t)meas.measResults.rsrqResult
+                             << " RSRP " << (uint16_t) meas.measResults.measResultPCell.rsrpResult
+                             << " RSRQ " << (uint16_t)meas.measResults.measResultPCell.rsrqResult
                              << " thr " << (uint16_t) EutranMeasurementMapping::Db2RsrqRange (m_rsrqDbUeNeighborCell));
-          NS_TEST_ASSERT_MSG_EQ (meas.measResults.rsrpResult,
+          NS_TEST_ASSERT_MSG_EQ (meas.measResults.measResultPCell.rsrpResult,
                                  EutranMeasurementMapping::Dbm2RsrpRange (m_rsrpDbmUeNeighborCell),
                                  "Wrong RSRP ");
-          NS_TEST_ASSERT_MSG_EQ (meas.measResults.rsrqResult,
+          NS_TEST_ASSERT_MSG_EQ (meas.measResults.measResultPCell.rsrqResult,
                                  EutranMeasurementMapping::Db2RsrqRange (m_rsrqDbUeNeighborCell),
                                  "Wrong RSRQ ");
         }
@@ -598,7 +598,7 @@
 
   // Setup UE measurement configuration
   Ptr<LteEnbRrc> enbRrc = enbDevs.Get (0)->GetObject<LteEnbNetDevice> ()->GetRrc ();
-  m_expectedMeasId = enbRrc->AddUeMeasReportConfig (m_config);
+  m_expectedMeasId = enbRrc->AddUeMeasReportConfig (m_config).at (0);
 
   // Attach UE to eNodeB
   lteHelper->Attach (ueDevs.Get (0), enbDevs.Get (0));
@@ -674,10 +674,10 @@
     {
       // verifying the report completeness
       LteRrcSap::MeasResults measResults = report.measResults;
-      NS_LOG_DEBUG (this << " rsrp=" << (uint16_t) measResults.rsrpResult
-                         << " (" << EutranMeasurementMapping::RsrpRange2Dbm (measResults.rsrpResult) << " dBm)"
-                         << " rsrq=" << (uint16_t) measResults.rsrqResult
-                         << " (" << EutranMeasurementMapping::RsrqRange2Db (measResults.rsrqResult) << " dB)");
+      NS_LOG_DEBUG (this << " rsrp=" << (uint16_t) measResults.measResultPCell.rsrpResult
+                         << " (" << EutranMeasurementMapping::RsrpRange2Dbm (measResults.measResultPCell.rsrpResult) << " dBm)"
+                         << " rsrq=" << (uint16_t) measResults.measResultPCell.rsrqResult
+                         << " (" << EutranMeasurementMapping::RsrqRange2Db (measResults.measResultPCell.rsrqResult) << " dB)");
       NS_TEST_ASSERT_MSG_EQ (measResults.haveMeasResultNeighCells, false,
                              "Report should not have neighboring cells information");
       NS_TEST_ASSERT_MSG_EQ (measResults.measResultListEutra.size (), 0,
@@ -697,7 +697,7 @@
           uint64_t timeExpectedMs = m_itExpectedTime->GetMilliSeconds ();
           m_itExpectedTime++;
 
-          uint16_t observedRsrp = measResults.rsrpResult;
+          uint16_t observedRsrp = measResults.measResultPCell.rsrpResult;
           uint16_t referenceRsrp = *m_itExpectedRsrp;
           m_itExpectedRsrp++;
 
@@ -1184,7 +1184,7 @@
 
   // Setup UE measurement configuration in serving cell
   Ptr<LteEnbRrc> enbRrc1 = enbDevs.Get (0)->GetObject<LteEnbNetDevice> ()->GetRrc ();
-  m_expectedMeasId = enbRrc1->AddUeMeasReportConfig (m_config);
+  m_expectedMeasId = enbRrc1->AddUeMeasReportConfig (m_config).at (0);
 
   // Disable handover in neighbour cell
   Ptr<LteEnbRrc> enbRrc2 = enbDevs.Get (1)->GetObject<LteEnbNetDevice> ()->GetRrc ();
@@ -1265,10 +1265,10 @@
       // verifying the report completeness
       LteRrcSap::MeasResults measResults = report.measResults;
       NS_LOG_DEBUG (this << " Serving cellId=" << cellId
-                         << " rsrp=" << (uint16_t) measResults.rsrpResult
-                         << " (" << EutranMeasurementMapping::RsrpRange2Dbm (measResults.rsrpResult) << " dBm)"
-                         << " rsrq=" << (uint16_t) measResults.rsrqResult
-                         << " (" << EutranMeasurementMapping::RsrqRange2Db (measResults.rsrqResult) << " dB)");
+                         << " rsrp=" << (uint16_t) measResults.measResultPCell.rsrpResult
+                         << " (" << EutranMeasurementMapping::RsrpRange2Dbm (measResults.measResultPCell.rsrpResult) << " dBm)"
+                         << " rsrq=" << (uint16_t) measResults.measResultPCell.rsrqResult
+                         << " (" << EutranMeasurementMapping::RsrqRange2Db (measResults.measResultPCell.rsrqResult) << " dB)");
 
       // verifying reported best cells
       if (measResults.measResultListEutra.size () == 0)
@@ -1312,7 +1312,7 @@
           uint64_t timeExpectedMs = m_itExpectedTime->GetMilliSeconds ();
           m_itExpectedTime++;
 
-          uint16_t observedRsrp = measResults.rsrpResult;
+          uint16_t observedRsrp = measResults.measResultPCell.rsrpResult;
           uint16_t referenceRsrp = *m_itExpectedRsrp;
           m_itExpectedRsrp++;
 
@@ -1478,7 +1478,7 @@
 
   // Setup UE measurement configuration in serving cell
   Ptr<LteEnbRrc> enbRrc1 = enbDevs.Get (0)->GetObject<LteEnbNetDevice> ()->GetRrc ();
-  m_expectedMeasId = enbRrc1->AddUeMeasReportConfig (m_config);
+  m_expectedMeasId = enbRrc1->AddUeMeasReportConfig (m_config).at (0);
 
   // Disable handover in neighbour cells
   Ptr<LteEnbRrc> enbRrc2 = enbDevs.Get (1)->GetObject<LteEnbNetDevice> ()->GetRrc ();
@@ -1538,10 +1538,10 @@
       // verifying the report completeness
       LteRrcSap::MeasResults measResults = report.measResults;
       NS_LOG_DEBUG (this << " Serving cellId=" << cellId
-                         << " rsrp=" << (uint16_t) measResults.rsrpResult
-                         << " (" << EutranMeasurementMapping::RsrpRange2Dbm (measResults.rsrpResult) << " dBm)"
-                         << " rsrq=" << (uint16_t) measResults.rsrqResult
-                         << " (" << EutranMeasurementMapping::RsrqRange2Db (measResults.rsrqResult) << " dB)");
+                         << " rsrp=" << (uint16_t) measResults.measResultPCell.rsrpResult
+                         << " (" << EutranMeasurementMapping::RsrpRange2Dbm (measResults.measResultPCell.rsrpResult) << " dBm)"
+                         << " rsrq=" << (uint16_t) measResults.measResultPCell.rsrqResult
+                         << " (" << EutranMeasurementMapping::RsrqRange2Db (measResults.measResultPCell.rsrqResult) << " dB)");
 
       // verifying reported best cells
       if (measResults.measResultListEutra.size () == 0)
@@ -2015,14 +2015,14 @@
   for (itReportConfig = m_sourceConfigList.begin ();
        itReportConfig != m_sourceConfigList.end (); itReportConfig++)
     {
-      measId = enbRrc1->AddUeMeasReportConfig (*itReportConfig);
+      measId = enbRrc1->AddUeMeasReportConfig (*itReportConfig).at (0);
       m_expectedSourceCellMeasId.insert (measId);
     }
 
   for (itReportConfig = m_targetConfigList.begin ();
        itReportConfig != m_targetConfigList.end (); itReportConfig++)
     {
-      measId = enbRrc2->AddUeMeasReportConfig (*itReportConfig);
+      measId = enbRrc2->AddUeMeasReportConfig (*itReportConfig).at (0);
       m_expectedTargetCellMeasId.insert (measId);
     }
 
@@ -2107,10 +2107,10 @@
       // verifying the report completeness
       LteRrcSap::MeasResults measResults = report.measResults;
       NS_LOG_DEBUG (this << " Serving cellId=" << cellId
-                         << " rsrp=" << (uint16_t) measResults.rsrpResult
-                         << " (" << EutranMeasurementMapping::RsrpRange2Dbm (measResults.rsrpResult) << " dBm)"
-                         << " rsrq=" << (uint16_t) measResults.rsrqResult
-                         << " (" << EutranMeasurementMapping::RsrqRange2Db (measResults.rsrqResult) << " dB)");
+                         << " rsrp=" << (uint16_t) measResults.measResultPCell.rsrpResult
+                         << " (" << EutranMeasurementMapping::RsrpRange2Dbm (measResults.measResultPCell.rsrpResult) << " dBm)"
+                         << " rsrq=" << (uint16_t) measResults.measResultPCell.rsrqResult
+                         << " (" << EutranMeasurementMapping::RsrqRange2Db (measResults.measResultPCell.rsrqResult) << " dB)");
 
       // verifying reported best cells
       if (measResults.measResultListEutra.size () == 0)
@@ -2155,7 +2155,7 @@
           uint64_t timeExpectedMs = m_itExpectedTime->GetMilliSeconds ();
           m_itExpectedTime++;
 
-          uint16_t observedRsrp = measResults.rsrpResult;
+          uint16_t observedRsrp = measResults.measResultPCell.rsrpResult;
           uint16_t referenceRsrp = *m_itExpectedRsrp;
           m_itExpectedRsrp++;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/test/test-asn1-encoding.cc ns-3.36/src/lte/test/test-asn1-encoding.cc
--- ns-3.35/src/lte/test/test-asn1-encoding.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/test/test-asn1-encoding.cc	2022-04-30 18:23:58.062734600 -0700
@@ -1024,8 +1024,8 @@
 
   LteRrcSap::MeasurementReport msg;
   msg.measResults.measId = 5;
-  msg.measResults.rsrpResult = 18;
-  msg.measResults.rsrqResult = 21;
+  msg.measResults.measResultPCell.rsrpResult = 18;
+  msg.measResults.measResultPCell.rsrqResult = 21;
   msg.measResults.haveMeasResultNeighCells = true;
 
   LteRrcSap::MeasResultEutra mResEutra;
@@ -1040,7 +1040,7 @@
   mResEutra.cgiInfo.trackingAreaCode = 5;
   msg.measResults.measResultListEutra.push_back (mResEutra);
 
-  msg.measResults.haveScellsMeas = false;
+  msg.measResults.haveMeasResultServFreqList = false;
 
   MeasurementReportHeader source;
   source.SetMessage (msg);
@@ -1066,8 +1066,8 @@
   LteRrcSap::MeasResults dstMeas = destination.GetMessage ().measResults;
 
   NS_TEST_ASSERT_MSG_EQ (srcMeas.measId, dstMeas.measId, "Different measId!");
-  NS_TEST_ASSERT_MSG_EQ (srcMeas.rsrpResult, dstMeas.rsrpResult, "Different rsrpResult!");
-  NS_TEST_ASSERT_MSG_EQ (srcMeas.rsrqResult, dstMeas.rsrqResult, "Different rsrqResult!");
+  NS_TEST_ASSERT_MSG_EQ (srcMeas.measResultPCell.rsrpResult, dstMeas.measResultPCell.rsrpResult, "Different rsrpResult!");
+  NS_TEST_ASSERT_MSG_EQ (srcMeas.measResultPCell.rsrqResult, dstMeas.measResultPCell.rsrqResult, "Different rsrqResult!");
   NS_TEST_ASSERT_MSG_EQ (srcMeas.haveMeasResultNeighCells, dstMeas.haveMeasResultNeighCells, "Different haveMeasResultNeighCells!");
 
   if (srcMeas.haveMeasResultNeighCells)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/test/test-lte-epc-e2e-data.cc ns-3.36/src/lte/test/test-lte-epc-e2e-data.cc
--- ns-3.35/src/lte/test/test-lte-epc-e2e-data.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/test/test-lte-epc-e2e-data.cc	2022-04-30 18:23:58.062734600 -0700
@@ -373,8 +373,7 @@
 
 
 /**
- * \ingroup lte-test
- * \ingroup tests
+ * \ingroup tests lte-test
  *
  * \brief Test that the S1-U interface implementation works correctly
  */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/test/test-lte-handover-delay.cc ns-3.36/src/lte/test/test-lte-handover-delay.cc
--- ns-3.35/src/lte/test/test-lte-handover-delay.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/test/test-lte-handover-delay.cc	2022-04-30 18:23:58.062734600 -0700
@@ -50,8 +50,7 @@
 NS_LOG_COMPONENT_DEFINE ("LteHandoverDelayTest");
 
 /**
- * \ingroup lte-test
- * \ingroup tests
+ * \ingroup tests lte-test
  *
  * \brief Verifying that the time needed for handover is under a
  * specified threshold.
@@ -295,6 +294,12 @@
         AddTestCase (
           new LteHandoverDelayTestCase (1, true, handoverTime, Seconds (0.005),
                                         Seconds (0.200)), TestCase::QUICK);
+        AddTestCase (
+          new LteHandoverDelayTestCase (2, true, handoverTime, Seconds (0.005),
+                                        Seconds (0.200)), TestCase::QUICK);
+        AddTestCase (
+          new LteHandoverDelayTestCase (4, true, handoverTime, Seconds (0.005),
+                                        Seconds (0.200)), TestCase::QUICK);
       }
 
     // HANDOVER DELAY TEST CASES WITH REAL RRC (THRESHOLD = 0.020 sec)
@@ -306,6 +311,12 @@
         AddTestCase (
           new LteHandoverDelayTestCase (1, false, handoverTime, Seconds (0.020),
                                         Seconds (0.200)), TestCase::QUICK);
+        AddTestCase (
+          new LteHandoverDelayTestCase (2, false, handoverTime, Seconds (0.020),
+                                        Seconds (0.200)), TestCase::QUICK);
+        AddTestCase (
+          new LteHandoverDelayTestCase (4, false, handoverTime, Seconds (0.020),
+                                        Seconds (0.200)), TestCase::QUICK);
       }
   }
 } g_lteHandoverDelayTestSuite; ///< the test suite
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/test/test-lte-x2-handover.cc ns-3.36/src/lte/test/test-lte-x2-handover.cc
--- ns-3.35/src/lte/test/test-lte-x2-handover.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/test/test-lte-x2-handover.cc	2022-04-30 18:23:58.062734600 -0700
@@ -332,7 +332,7 @@
 
               ApplicationContainer clientApps;
               ApplicationContainer serverApps;
-              BearerData bearerData;
+              BearerData bearerData = BearerData ();
 
               // always true: if (epcDl)
               {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/test/test-lte-x2-handover-measures.cc ns-3.36/src/lte/test/test-lte-x2-handover-measures.cc
--- ns-3.35/src/lte/test/test-lte-x2-handover-measures.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/test/test-lte-x2-handover-measures.cc	2022-04-30 18:23:58.062734600 -0700
@@ -412,7 +412,7 @@
 
               ApplicationContainer clientApps;
               ApplicationContainer serverApps;
-              BearerData bearerData;
+              BearerData bearerData = BearerData ();
 
               if (m_useUdp)
                 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/lte/wscript ns-3.36/src/lte/wscript
--- ns-3.35/src/lte/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/lte/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,345 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-
-    lte_module_dependencies = ['core', 'network', 'spectrum', 'stats', 'buildings', 'virtual-net-device','point-to-point','applications','internet','csma']
-    if (bld.env['ENABLE_EMU']):
-        lte_module_dependencies.append('fd-net-device')
-    module = bld.create_ns3_module('lte', lte_module_dependencies)
-    module.source = [
-        'model/lte-common.cc',
-        'model/lte-spectrum-phy.cc',
-        'model/lte-spectrum-signal-parameters.cc',
-        'model/lte-phy.cc',
-        'model/lte-enb-phy.cc',
-        'model/lte-ue-phy.cc',
-        'model/lte-spectrum-value-helper.cc',
-        'model/lte-amc.cc',
-        'model/lte-enb-rrc.cc',
-        'model/lte-ue-rrc.cc',
-        'model/lte-rrc-sap.cc',
-        'model/lte-rrc-protocol-ideal.cc',
-        'model/lte-rrc-protocol-real.cc',
-        'model/lte-rlc-sap.cc',
-        'model/lte-rlc.cc',
-        'model/lte-rlc-sequence-number.cc',
-        'model/lte-rlc-header.cc',
-        'model/lte-rlc-am-header.cc',
-        'model/lte-rlc-tm.cc',
-        'model/lte-rlc-um.cc',
-        'model/lte-rlc-am.cc',
-        'model/lte-rlc-tag.cc',
-        'model/lte-rlc-sdu-status-tag.cc',
-        'model/lte-pdcp-sap.cc',
-        'model/lte-pdcp.cc',
-        'model/lte-pdcp-header.cc',
-        'model/lte-pdcp-tag.cc',
-        'model/eps-bearer.cc',
-        'model/lte-radio-bearer-info.cc',
-        'model/lte-net-device.cc',
-        'model/lte-enb-net-device.cc',
-        'model/lte-ue-net-device.cc',
-        'model/lte-control-messages.cc',
-        'helper/lte-helper.cc',
-        'helper/lte-stats-calculator.cc',
-        'helper/epc-helper.cc',
-        'helper/no-backhaul-epc-helper.cc',
-        'helper/point-to-point-epc-helper.cc',
-        'helper/radio-bearer-stats-calculator.cc',
-        'helper/radio-bearer-stats-connector.cc',
-        'helper/phy-stats-calculator.cc',
-        'helper/mac-stats-calculator.cc',
-        'helper/phy-tx-stats-calculator.cc',
-        'helper/phy-rx-stats-calculator.cc',
-        'helper/radio-environment-map-helper.cc',
-        'helper/lte-hex-grid-enb-topology-helper.cc',
-        'helper/lte-global-pathloss-database.cc',
-        'model/rem-spectrum-phy.cc',
-        'model/ff-mac-common.cc',
-        'model/ff-mac-csched-sap.cc',
-        'model/ff-mac-sched-sap.cc',
-        'model/lte-mac-sap.cc',
-        'model/ff-mac-scheduler.cc',
-        'model/lte-enb-cmac-sap.cc',
-        'model/lte-ue-cmac-sap.cc',
-        'model/rr-ff-mac-scheduler.cc',
-        'model/lte-enb-mac.cc',
-        'model/lte-ue-mac.cc',
-        'model/lte-radio-bearer-tag.cc',
-        'model/eps-bearer-tag.cc',
-        'model/lte-phy-tag.cc',
-        'model/lte-enb-phy-sap.cc',
-        'model/lte-enb-cphy-sap.cc',
-        'model/lte-ue-phy-sap.cc',
-        'model/lte-ue-cphy-sap.cc',
-        'model/lte-interference.cc',
-        'model/lte-chunk-processor.cc',
-        'model/pf-ff-mac-scheduler.cc',
-        'model/fdmt-ff-mac-scheduler.cc',
-        'model/tdmt-ff-mac-scheduler.cc',
-        'model/tta-ff-mac-scheduler.cc',
-        'model/fdbet-ff-mac-scheduler.cc',
-        'model/tdbet-ff-mac-scheduler.cc',
-        'model/fdtbfq-ff-mac-scheduler.cc',
-        'model/tdtbfq-ff-mac-scheduler.cc',
-        'model/pss-ff-mac-scheduler.cc',
-        'model/cqa-ff-mac-scheduler.cc',
-        'model/epc-gtpu-header.cc',
-        'model/epc-gtpc-header.cc',
-        'model/epc-enb-application.cc',
-        'model/epc-sgw-application.cc',
-        'model/epc-pgw-application.cc',
-        'model/epc-mme-application.cc',
-        'model/epc-x2-sap.cc',
-        'model/epc-x2-header.cc',
-        'model/epc-x2.cc',
-        'model/epc-tft.cc',
-        'model/epc-tft-classifier.cc',
-        'model/lte-mi-error-model.cc',
-        'model/lte-vendor-specific-parameters.cc',
-        'model/epc-enb-s1-sap.cc',
-        'model/epc-s1ap-sap.cc',
-        'model/epc-s11-sap.cc',
-        'model/lte-as-sap.cc',
-        'model/epc-ue-nas.cc',
-        'model/lte-harq-phy.cc',
-        'model/lte-asn1-header.cc',
-        'model/lte-rrc-header.cc',
-        'model/lte-handover-management-sap.cc',
-        'model/lte-handover-algorithm.cc',
-        'model/a2-a4-rsrq-handover-algorithm.cc',
-        'model/a3-rsrp-handover-algorithm.cc',
-        'model/no-op-handover-algorithm.cc',
-        'model/lte-anr-sap.cc',
-        'model/lte-anr.cc',
-        'model/lte-ffr-algorithm.cc',
-        'model/lte-ffr-sap.cc',
-        'model/lte-ffr-rrc-sap.cc',
-        'model/lte-fr-no-op-algorithm.cc',
-        'model/lte-fr-hard-algorithm.cc',
-        'model/lte-fr-strict-algorithm.cc',
-        'model/lte-fr-soft-algorithm.cc',
-        'model/lte-ffr-soft-algorithm.cc',
-        'model/lte-ffr-enhanced-algorithm.cc',
-        'model/lte-ffr-distributed-algorithm.cc',
-        'model/lte-ue-power-control.cc',
-        'model/lte-ccm-rrc-sap.cc',
-        'model/lte-ue-ccm-rrc-sap.cc', 
-        'model/lte-ccm-mac-sap.cc', 
-        'model/lte-enb-component-carrier-manager.cc',
-        'model/lte-ue-component-carrier-manager.cc',
-        'model/no-op-component-carrier-manager.cc',
-        'model/simple-ue-component-carrier-manager.cc',
-        'model/component-carrier.cc',
-        'helper/cc-helper.cc',
-        'model/component-carrier-ue.cc',
-        'model/component-carrier-enb.cc'
-        ]
-
-    module_test = bld.create_ns3_module_test_library('lte')
-    module_test.source = [
-        'test/lte-test-downlink-sinr.cc',
-        'test/lte-test-uplink-sinr.cc',
-        'test/lte-test-link-adaptation.cc',
-        'test/lte-test-interference.cc',
-        'test/lte-test-ue-phy.cc',
-        'test/lte-test-rr-ff-mac-scheduler.cc',
-        'test/lte-test-pf-ff-mac-scheduler.cc',
-        'test/lte-test-fdmt-ff-mac-scheduler.cc',
-        'test/lte-test-tdmt-ff-mac-scheduler.cc',
-        'test/lte-test-tta-ff-mac-scheduler.cc',
-        'test/lte-test-fdbet-ff-mac-scheduler.cc',
-        'test/lte-test-tdbet-ff-mac-scheduler.cc',
-        'test/lte-test-fdtbfq-ff-mac-scheduler.cc',
-        'test/lte-test-tdtbfq-ff-mac-scheduler.cc',
-        'test/lte-test-pss-ff-mac-scheduler.cc',
-        'test/lte-test-cqa-ff-mac-scheduler.cc',
-        'test/lte-test-earfcn.cc',
-        'test/lte-test-spectrum-value-helper.cc',
-        'test/lte-test-pathloss-model.cc',
-        'test/lte-test-entities.cc',
-        'test/lte-simple-helper.cc',
-        'test/lte-simple-net-device.cc',
-        'test/test-lte-rlc-header.cc',
-        'test/lte-test-rlc-um-transmitter.cc',
-        'test/lte-test-rlc-am-transmitter.cc',
-        'test/lte-test-rlc-um-e2e.cc',
-        'test/lte-test-rlc-am-e2e.cc',
-        'test/epc-test-gtpu.cc',
-        'test/test-epc-tft-classifier.cc',
-        'test/epc-test-s1u-downlink.cc',
-        'test/epc-test-s1u-uplink.cc',
-        'test/test-lte-epc-e2e-data.cc',
-        'test/test-lte-antenna.cc',
-        'test/lte-test-phy-error-model.cc',
-        'test/lte-test-mimo.cc',
-        'test/lte-test-harq.cc',
-        'test/test-lte-rrc.cc',
-        'test/test-lte-x2-handover.cc',
-        'test/test-lte-x2-handover-measures.cc',
-        'test/test-asn1-encoding.cc',
-        'test/lte-test-ue-measurements.cc',
-        'test/lte-test-cell-selection.cc',
-        'test/test-lte-handover-delay.cc',
-        'test/test-lte-handover-target.cc',
-        'test/lte-test-deactivate-bearer.cc',
-        'test/lte-ffr-simple.cc',
-        'test/lte-test-downlink-power-control.cc',
-        'test/lte-test-uplink-power-control.cc',
-        'test/lte-test-frequency-reuse.cc',
-        'test/lte-test-interference-fr.cc',
-        'test/lte-test-cqi-generation.cc',
-        'test/lte-simple-spectrum-phy.cc',
-        'test/lte-test-carrier-aggregation.cc',
-        'test/lte-test-aggregation-throughput-scale.cc',
-        'test/lte-test-ipv6-routing.cc',
-        'test/lte-test-carrier-aggregation-configuration.cc',
-        'test/lte-test-radio-link-failure.cc',
-        ]
-
-    # Tests encapsulating example programs should be listed here
-    if (bld.env['ENABLE_EXAMPLES']):
-        module_test.source.extend([
-        #   'test/lte-examples-test-suite.cc',
-            ])
-        
-    headers = bld(features='ns3header')
-    headers.module = 'lte'
-    headers.source = [
-        'model/lte-common.h',
-        'model/lte-spectrum-phy.h',
-        'model/lte-spectrum-signal-parameters.h',
-        'model/lte-phy.h',
-        'model/lte-enb-phy.h',
-        'model/lte-ue-phy.h',
-        'model/lte-spectrum-value-helper.h',
-        'model/lte-amc.h',
-        'model/lte-enb-rrc.h',
-        'model/lte-ue-rrc.h',
-        'model/lte-rrc-sap.h',
-        'model/lte-rrc-protocol-ideal.h',
-        'model/lte-rrc-protocol-real.h',
-        'model/lte-rlc-sap.h',
-        'model/lte-rlc.h',
-        'model/lte-rlc-header.h',
-        'model/lte-rlc-sequence-number.h',
-        'model/lte-rlc-am-header.h',
-        'model/lte-rlc-tm.h',
-        'model/lte-rlc-um.h',
-        'model/lte-rlc-am.h',
-        'model/lte-rlc-tag.h',
-        'model/lte-rlc-sdu-status-tag.h',
-        'model/lte-pdcp-sap.h',
-        'model/lte-pdcp.h',
-        'model/lte-pdcp-header.h',
-        'model/lte-pdcp-tag.h',
-        'model/eps-bearer.h',
-        'model/lte-radio-bearer-info.h',
-        'model/lte-net-device.h',
-        'model/lte-enb-net-device.h',
-        'model/lte-ue-net-device.h',
-        'model/lte-control-messages.h',
-        'helper/lte-helper.h',
-        'helper/lte-stats-calculator.h',
-        'helper/epc-helper.h',
-        'helper/no-backhaul-epc-helper.h',
-        'helper/point-to-point-epc-helper.h',
-        'helper/phy-stats-calculator.h',
-        'helper/mac-stats-calculator.h',
-        'helper/phy-tx-stats-calculator.h',
-        'helper/phy-rx-stats-calculator.h',
-        'helper/radio-bearer-stats-calculator.h',
-        'helper/radio-bearer-stats-connector.h',
-        'helper/radio-environment-map-helper.h',
-        'helper/lte-hex-grid-enb-topology-helper.h',
-        'helper/lte-global-pathloss-database.h',
-        'model/rem-spectrum-phy.h',
-        'model/ff-mac-common.h',
-        'model/ff-mac-csched-sap.h',
-        'model/ff-mac-sched-sap.h',
-        'model/lte-enb-cmac-sap.h',
-        'model/lte-ue-cmac-sap.h',
-        'model/lte-mac-sap.h',
-        'model/ff-mac-scheduler.h',
-        'model/rr-ff-mac-scheduler.h',
-        'model/lte-enb-mac.h',
-        'model/lte-ue-mac.h',
-        'model/lte-radio-bearer-tag.h',
-        'model/eps-bearer-tag.h',
-        'model/lte-phy-tag.h',
-        'model/lte-enb-phy-sap.h',
-        'model/lte-enb-cphy-sap.h',
-        'model/lte-ue-phy-sap.h',
-        'model/lte-ue-cphy-sap.h',
-        'model/lte-interference.h',
-        'model/lte-chunk-processor.h',
-        'model/pf-ff-mac-scheduler.h',
-        'model/fdmt-ff-mac-scheduler.h',
-        'model/tdmt-ff-mac-scheduler.h',
-        'model/tta-ff-mac-scheduler.h',
-        'model/fdbet-ff-mac-scheduler.h',
-        'model/tdbet-ff-mac-scheduler.h',
-        'model/fdtbfq-ff-mac-scheduler.h',
-        'model/tdtbfq-ff-mac-scheduler.h',
-        'model/pss-ff-mac-scheduler.h',
-        'model/cqa-ff-mac-scheduler.h',
-        'model/epc-gtpu-header.h',
-        'model/epc-gtpc-header.h',
-        'model/epc-enb-application.h',
-        'model/epc-sgw-application.h',
-        'model/epc-pgw-application.h',
-        'model/epc-mme-application.h',
-        'model/lte-vendor-specific-parameters.h',
-        'model/epc-x2-sap.h',
-        'model/epc-x2-header.h',
-        'model/epc-x2.h',
-        'model/epc-tft.h',
-        'model/epc-tft-classifier.h',
-        'model/lte-mi-error-model.h',
-        'model/epc-enb-s1-sap.h',
-        'model/epc-s1ap-sap.h',
-        'model/epc-s11-sap.h',
-        'model/lte-as-sap.h',
-        'model/epc-ue-nas.h',
-        'model/lte-harq-phy.h',
-        'model/lte-asn1-header.h',
-        'model/lte-rrc-header.h',
-        'model/lte-handover-management-sap.h',
-        'model/lte-handover-algorithm.h',
-        'model/a2-a4-rsrq-handover-algorithm.h',
-        'model/a3-rsrp-handover-algorithm.h',
-        'model/no-op-handover-algorithm.h',
-        'model/lte-anr-sap.h',
-        'model/lte-anr.h',
-        'model/lte-ffr-algorithm.h',
-        'model/lte-ffr-sap.h',
-        'model/lte-ffr-rrc-sap.h',
-        'model/lte-fr-no-op-algorithm.h',
-        'model/lte-fr-hard-algorithm.h',
-        'model/lte-fr-strict-algorithm.h',
-        'model/lte-fr-soft-algorithm.h',
-        'model/lte-ffr-soft-algorithm.h',
-        'model/lte-ffr-enhanced-algorithm.h',
-        'model/lte-ffr-distributed-algorithm.h',
-        'model/lte-ue-power-control.h',
-        'model/lte-ccm-rrc-sap.h',
-        'model/lte-ue-ccm-rrc-sap.h', 
-        'model/lte-ccm-mac-sap.h', 
-        'model/lte-enb-component-carrier-manager.h',
-        'model/lte-ue-component-carrier-manager.h',
-        'model/no-op-component-carrier-manager.h',
-        'model/simple-ue-component-carrier-manager.h',
-        'helper/cc-helper.h',
-        'model/component-carrier.h',
-        'model/component-carrier-ue.h',
-        'model/component-carrier-enb.h'
-        ]
-
-    if (bld.env['ENABLE_EMU']):
-        module.source.append ('helper/emu-epc-helper.cc')
-        headers.source.append ('helper/emu-epc-helper.h')
-
-    if (bld.env['ENABLE_EXAMPLES']):
-      bld.recurse('examples')
-
-    bld.ns3_python_bindings()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/mesh/bindings/callbacks_list.py ns-3.36/src/mesh/bindings/callbacks_list.py
--- ns-3.35/src/mesh/bindings/callbacks_list.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/mesh/bindings/callbacks_list.py	2022-04-30 18:23:58.062734600 -0700
@@ -6,31 +6,24 @@
     ['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'const ns3::Address &', 'const ns3::Address &', 'ns3::NetDevice::PacketType', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'bool', 'ns3::Ptr<ns3::Packet>', 'ns3::Mac48Address', 'ns3::Mac48Address', 'unsigned short', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['std::vector<ns3::Mac48Address, std::allocator<ns3::Mac48Address>>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Time', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::dot11s::RouteChange', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'unsigned int', 'ns3::Mac48Address', 'ns3::Mac48Address', 'ns3::dot11s::PeerLink::PeerState', 'ns3::dot11s::PeerLink::PeerState', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Mac48Address', 'ns3::Mac48Address', 'unsigned int', 'bool', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Mac48Address', 'ns3::Mac48Address', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['unsigned long', 'unsigned short', 'unsigned short', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['unsigned long', 'const ns3::WifiTxVector &', 'unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['unsigned long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['bool', 'unsigned short', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['bool', 'const ns3::WifiTxVector &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Mac48Address', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::Mac48Address', 'ns3::Mac48Address', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Mac48Address', 'unsigned char', 'bool', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Mac48Address', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Ptr<const ns3::WifiMacQueueItem>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Time', 'ns3::Mac48Address', 'unsigned char', 'ns3::OriginatorBlockAckAgreement::State', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::WifiMacDropReason', 'ns3::Ptr<const ns3::WifiMacQueueItem>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'unsigned int', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Time', 'ns3::Time', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Mac48Address', 'ns3::Mac48Address', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'const ns3::WifiMacHeader &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::WifiMacDropReason', 'ns3::Ptr<const ns3::WifiMacQueueItem>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Ptr<const ns3::WifiMacQueueItem>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'unsigned char', 'ns3::Ptr<const ns3::WifiMacQueueItem>', 'const ns3::WifiTxVector &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'unsigned char', 'ns3::Ptr<const ns3::WifiPsdu>', 'const ns3::WifiTxVector &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'unsigned char', 'std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *', 'const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *', 'unsigned long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'unsigned char', 'std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *', 'const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *', 'unsigned long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['unsigned int', 'ns3::Mac48Address', 'ns3::Ptr<ns3::MeshWifiInterfaceMac>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['std::vector<ns3::Mac48Address, std::allocator<ns3::Mac48Address> >', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Time', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::dot11s::RouteChange', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'unsigned int', 'ns3::Mac48Address', 'ns3::Mac48Address', 'ns3::dot11s::PeerLink::PeerState', 'ns3::dot11s::PeerLink::PeerState', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Mac48Address', 'ns3::Mac48Address', 'unsigned int', 'bool', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
 ]
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/mesh/bindings/modulegen__gcc_ILP32.py ns-3.36/src/mesh/bindings/modulegen__gcc_ILP32.py
--- ns-3.35/src/mesh/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/mesh/bindings/modulegen__gcc_ILP32.py	2022-04-30 18:23:58.062734600 -0700
@@ -20,16 +20,10 @@
 def register_types(module):
     root_module = module.get_root()
     
-    ## regular-wifi-mac.h (module 'wifi'): ns3::WifiTxTimerReason [enumeration]
-    module.add_enum('WifiTxTimerReason', [], import_from_module='ns.wifi')
-    ## wifi-mac.h (module 'wifi'): ns3::WifiMacDropReason [enumeration]
-    module.add_enum('WifiMacDropReason', ['WIFI_MAC_DROP_FAILED_ENQUEUE', 'WIFI_MAC_DROP_EXPIRED_LIFETIME', 'WIFI_MAC_DROP_REACHED_RETRY_LIMIT', 'WIFI_MAC_DROP_QOS_OLD_PACKET'], import_from_module='ns.wifi')
-    ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacType [enumeration]
-    module.add_enum('WifiMacType', ['WIFI_MAC_CTL_TRIGGER', 'WIFI_MAC_CTL_CTLWRAPPER', 'WIFI_MAC_CTL_RTS', 'WIFI_MAC_CTL_CTS', 'WIFI_MAC_CTL_ACK', 'WIFI_MAC_CTL_BACKREQ', 'WIFI_MAC_CTL_BACKRESP', 'WIFI_MAC_CTL_END', 'WIFI_MAC_CTL_END_ACK', 'WIFI_MAC_MGT_BEACON', 'WIFI_MAC_MGT_ASSOCIATION_REQUEST', 'WIFI_MAC_MGT_ASSOCIATION_RESPONSE', 'WIFI_MAC_MGT_DISASSOCIATION', 'WIFI_MAC_MGT_REASSOCIATION_REQUEST', 'WIFI_MAC_MGT_REASSOCIATION_RESPONSE', 'WIFI_MAC_MGT_PROBE_REQUEST', 'WIFI_MAC_MGT_PROBE_RESPONSE', 'WIFI_MAC_MGT_AUTHENTICATION', 'WIFI_MAC_MGT_DEAUTHENTICATION', 'WIFI_MAC_MGT_ACTION', 'WIFI_MAC_MGT_ACTION_NO_ACK', 'WIFI_MAC_MGT_MULTIHOP_ACTION', 'WIFI_MAC_DATA', 'WIFI_MAC_DATA_CFACK', 'WIFI_MAC_DATA_CFPOLL', 'WIFI_MAC_DATA_CFACK_CFPOLL', 'WIFI_MAC_DATA_NULL', 'WIFI_MAC_DATA_NULL_CFACK', 'WIFI_MAC_DATA_NULL_CFPOLL', 'WIFI_MAC_DATA_NULL_CFACK_CFPOLL', 'WIFI_MAC_QOSDATA', 'WIFI_MAC_QOSDATA_CFACK', 'WIFI_MAC_QOSDATA_CFPOLL', 'WIFI_MAC_QOSDATA_CFACK_CFPOLL', 'WIFI_MAC_QOSDATA_NULL', 'WIFI_MAC_QOSDATA_NULL_CFPOLL', 'WIFI_MAC_QOSDATA_NULL_CFACK_CFPOLL'], import_from_module='ns.wifi')
     ## wifi-mac.h (module 'wifi'): ns3::TypeOfStation [enumeration]
     module.add_enum('TypeOfStation', ['STA', 'AP', 'ADHOC_STA', 'MESH', 'OCB'], import_from_module='ns.wifi')
-    ## qos-utils.h (module 'wifi'): ns3::AcIndex [enumeration]
-    module.add_enum('AcIndex', ['AC_BE', 'AC_BK', 'AC_VI', 'AC_VO', 'AC_BE_NQOS', 'AC_BEACON', 'AC_UNDEF'], import_from_module='ns.wifi')
+    ## wifi-mac.h (module 'wifi'): ns3::WifiMacDropReason [enumeration]
+    module.add_enum('WifiMacDropReason', ['WIFI_MAC_DROP_FAILED_ENQUEUE', 'WIFI_MAC_DROP_EXPIRED_LIFETIME', 'WIFI_MAC_DROP_REACHED_RETRY_LIMIT', 'WIFI_MAC_DROP_QOS_OLD_PACKET'], import_from_module='ns.wifi')
     ## wifi-phy-common.h (module 'wifi'): ns3::WifiPreamble [enumeration]
     module.add_enum('WifiPreamble', ['WIFI_PREAMBLE_LONG', 'WIFI_PREAMBLE_SHORT', 'WIFI_PREAMBLE_HT_MF', 'WIFI_PREAMBLE_VHT_SU', 'WIFI_PREAMBLE_VHT_MU', 'WIFI_PREAMBLE_HE_SU', 'WIFI_PREAMBLE_HE_ER_SU', 'WIFI_PREAMBLE_HE_MU', 'WIFI_PREAMBLE_HE_TB'], import_from_module='ns.wifi')
     ## wifi-phy-common.h (module 'wifi'): ns3::WifiModulationClass [enumeration]
@@ -39,19 +33,17 @@
     ## wifi-phy-common.h (module 'wifi'): ns3::WifiPpduType [enumeration]
     module.add_enum('WifiPpduType', ['WIFI_PPDU_TYPE_SU', 'WIFI_PPDU_TYPE_DL_MU', 'WIFI_PPDU_TYPE_UL_MU'], import_from_module='ns.wifi')
     ## wifi-phy-common.h (module 'wifi'): ns3::WifiPhyRxfailureReason [enumeration]
-    module.add_enum('WifiPhyRxfailureReason', ['UNKNOWN', 'UNSUPPORTED_SETTINGS', 'CHANNEL_SWITCHING', 'RXING', 'TXING', 'SLEEPING', 'BUSY_DECODING_PREAMBLE', 'PREAMBLE_DETECT_FAILURE', 'RECEPTION_ABORTED_BY_TX', 'L_SIG_FAILURE', 'HT_SIG_FAILURE', 'SIG_A_FAILURE', 'SIG_B_FAILURE', 'PREAMBLE_DETECTION_PACKET_SWITCH', 'FRAME_CAPTURE_PACKET_SWITCH', 'OBSS_PD_CCA_RESET', 'HE_TB_PPDU_TOO_LATE', 'FILTERED'], import_from_module='ns.wifi')
-    ## wifi-standards.h (module 'wifi'): ns3::WifiPhyStandard [enumeration]
-    module.add_enum('WifiPhyStandard', ['WIFI_PHY_STANDARD_80211a', 'WIFI_PHY_STANDARD_80211b', 'WIFI_PHY_STANDARD_80211g', 'WIFI_PHY_STANDARD_80211p', 'WIFI_PHY_STANDARD_80211n', 'WIFI_PHY_STANDARD_80211ac', 'WIFI_PHY_STANDARD_80211ax', 'WIFI_PHY_STANDARD_UNSPECIFIED'], import_from_module='ns.wifi')
-    ## wifi-standards.h (module 'wifi'): ns3::WifiMacStandard [enumeration]
-    module.add_enum('WifiMacStandard', ['WIFI_MAC_STANDARD_80211', 'WIFI_MAC_STANDARD_80211n', 'WIFI_MAC_STANDARD_80211ac', 'WIFI_MAC_STANDARD_80211ax'], import_from_module='ns.wifi')
+    module.add_enum('WifiPhyRxfailureReason', ['UNKNOWN', 'UNSUPPORTED_SETTINGS', 'CHANNEL_SWITCHING', 'RXING', 'TXING', 'SLEEPING', 'POWERED_OFF', 'TRUNCATED_TX', 'BUSY_DECODING_PREAMBLE', 'PREAMBLE_DETECT_FAILURE', 'RECEPTION_ABORTED_BY_TX', 'L_SIG_FAILURE', 'HT_SIG_FAILURE', 'SIG_A_FAILURE', 'SIG_B_FAILURE', 'PREAMBLE_DETECTION_PACKET_SWITCH', 'FRAME_CAPTURE_PACKET_SWITCH', 'OBSS_PD_CCA_RESET', 'HE_TB_PPDU_TOO_LATE', 'FILTERED'], import_from_module='ns.wifi')
+    ## ht-operation.h (module 'wifi'): ns3::HtProtectionType [enumeration]
+    module.add_enum('HtProtectionType', ['NO_PROTECTION', 'NON_MEMBER_PROTECTION', 'TWENTY_MHZ_PROTECTION', 'MIXED_MODE_PROTECTION'], import_from_module='ns.wifi')
+    ## qos-utils.h (module 'wifi'): ns3::AcIndex [enumeration]
+    module.add_enum('AcIndex', ['AC_BE', 'AC_BK', 'AC_VI', 'AC_VO', 'AC_BE_NQOS', 'AC_BEACON', 'AC_UNDEF'], import_from_module='ns.wifi')
     ## wifi-standards.h (module 'wifi'): ns3::WifiStandard [enumeration]
-    module.add_enum('WifiStandard', ['WIFI_STANDARD_80211a', 'WIFI_STANDARD_80211b', 'WIFI_STANDARD_80211g', 'WIFI_STANDARD_80211p', 'WIFI_STANDARD_80211n_2_4GHZ', 'WIFI_STANDARD_80211n_5GHZ', 'WIFI_STANDARD_80211ac', 'WIFI_STANDARD_80211ax_2_4GHZ', 'WIFI_STANDARD_80211ax_5GHZ', 'WIFI_STANDARD_80211ax_6GHZ'], import_from_module='ns.wifi')
+    module.add_enum('WifiStandard', ['WIFI_STANDARD_UNSPECIFIED', 'WIFI_STANDARD_80211a', 'WIFI_STANDARD_80211b', 'WIFI_STANDARD_80211g', 'WIFI_STANDARD_80211p', 'WIFI_STANDARD_80211n', 'WIFI_STANDARD_80211ac', 'WIFI_STANDARD_80211ax'], import_from_module='ns.wifi')
     ## wifi-standards.h (module 'wifi'): ns3::FrequencyChannelType [enumeration]
     module.add_enum('FrequencyChannelType', ['WIFI_PHY_DSSS_CHANNEL', 'WIFI_PHY_OFDM_CHANNEL', 'WIFI_PHY_80211p_CHANNEL'], import_from_module='ns.wifi')
     ## wifi-phy-band.h (module 'wifi'): ns3::WifiPhyBand [enumeration]
     module.add_enum('WifiPhyBand', ['WIFI_PHY_BAND_2_4GHZ', 'WIFI_PHY_BAND_5GHZ', 'WIFI_PHY_BAND_6GHZ', 'WIFI_PHY_BAND_UNSPECIFIED'], import_from_module='ns.wifi')
-    ## ht-operation.h (module 'wifi'): ns3::HtProtectionType [enumeration]
-    module.add_enum('HtProtectionType', ['NO_PROTECTION', 'NON_MEMBER_PROTECTION', 'TWENTY_MHZ_PROTECTION', 'MIXED_MODE_PROTECTION'], import_from_module='ns.wifi')
     ## log.h (module 'core'): ns3::LogLevel [enumeration]
     module.add_enum('LogLevel', ['LOG_NONE', 'LOG_ERROR', 'LOG_LEVEL_ERROR', 'LOG_WARN', 'LOG_LEVEL_WARN', 'LOG_DEBUG', 'LOG_LEVEL_DEBUG', 'LOG_INFO', 'LOG_LEVEL_INFO', 'LOG_FUNCTION', 'LOG_LEVEL_FUNCTION', 'LOG_LOGIC', 'LOG_LEVEL_LOGIC', 'LOG_ALL', 'LOG_LEVEL_ALL', 'LOG_PREFIX_FUNC', 'LOG_PREFIX_TIME', 'LOG_PREFIX_NODE', 'LOG_PREFIX_LEVEL', 'LOG_PREFIX_ALL'], import_from_module='ns.core')
     ## address.h (module 'network'): ns3::Address [class]
@@ -65,10 +57,6 @@
     typehandlers.add_type_alias('std::list< ns3::AttributeConstructionList::Item > const_iterator', 'ns3::AttributeConstructionList::CIterator')
     typehandlers.add_type_alias('std::list< ns3::AttributeConstructionList::Item > const_iterator*', 'ns3::AttributeConstructionList::CIterator*')
     typehandlers.add_type_alias('std::list< ns3::AttributeConstructionList::Item > const_iterator&', 'ns3::AttributeConstructionList::CIterator&')
-    ## block-ack-manager.h (module 'wifi'): ns3::Bar [struct]
-    module.add_class('Bar', import_from_module='ns.wifi')
-    ## block-ack-agreement.h (module 'wifi'): ns3::BlockAckAgreement [class]
-    module.add_class('BlockAckAgreement', allow_subclassing=True, import_from_module='ns.wifi')
     ## block-ack-type.h (module 'wifi'): ns3::BlockAckReqType [struct]
     module.add_class('BlockAckReqType', import_from_module='ns.wifi')
     ## block-ack-type.h (module 'wifi'): ns3::BlockAckReqType::Variant [enumeration]
@@ -77,8 +65,6 @@
     module.add_class('BlockAckType', import_from_module='ns.wifi')
     ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::Variant [enumeration]
     module.add_enum('Variant', ['BASIC', 'COMPRESSED', 'EXTENDED_COMPRESSED', 'MULTI_TID', 'MULTI_STA'], outer_class=root_module['ns3::BlockAckType'], import_from_module='ns.wifi')
-    ## block-ack-window.h (module 'wifi'): ns3::BlockAckWindow [class]
-    module.add_class('BlockAckWindow', import_from_module='ns.wifi')
     ## buffer.h (module 'network'): ns3::Buffer [class]
     module.add_class('Buffer', import_from_module='ns.network')
     ## buffer.h (module 'network'): ns3::Buffer::Iterator [class]
@@ -121,36 +107,16 @@
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::TraceSourceAccessor'])
     ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::WifiInformationElement> [struct]
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::WifiInformationElement'])
-    ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::WifiMacQueueItem> [struct]
-    module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::WifiMacQueueItem'])
     ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::dot11s::DestinationAddressUnit> [struct]
     module.add_class('DefaultDeleter', template_parameters=['ns3::dot11s::DestinationAddressUnit'])
     ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::dot11s::IeBeaconTimingUnit> [struct]
     module.add_class('DefaultDeleter', template_parameters=['ns3::dot11s::IeBeaconTimingUnit'])
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'], import_from_module='ns.core')
     ## hash.h (module 'core'): ns3::Hasher [class]
     module.add_class('Hasher', import_from_module='ns.core')
-    ## wifi-tx-vector.h (module 'wifi'): ns3::HeMuUserInfo [struct]
-    module.add_class('HeMuUserInfo', import_from_module='ns.wifi')
-    ## he-ru.h (module 'wifi'): ns3::HeRu [class]
-    module.add_class('HeRu', import_from_module='ns.wifi')
-    ## he-ru.h (module 'wifi'): ns3::HeRu::RuType [enumeration]
-    module.add_enum('RuType', ['RU_26_TONE', 'RU_52_TONE', 'RU_106_TONE', 'RU_242_TONE', 'RU_484_TONE', 'RU_996_TONE', 'RU_2x996_TONE'], outer_class=root_module['ns3::HeRu'], import_from_module='ns.wifi')
-    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec [class]
-    module.add_class('RuSpec', import_from_module='ns.wifi', outer_class=root_module['ns3::HeRu'])
-    typehandlers.add_type_alias('std::pair< short, short >', 'ns3::HeRu::SubcarrierRange')
-    typehandlers.add_type_alias('std::pair< short, short >*', 'ns3::HeRu::SubcarrierRange*')
-    typehandlers.add_type_alias('std::pair< short, short >&', 'ns3::HeRu::SubcarrierRange&')
-    typehandlers.add_type_alias('std::vector< std::pair< short, short > >', 'ns3::HeRu::SubcarrierGroup')
-    typehandlers.add_type_alias('std::vector< std::pair< short, short > >*', 'ns3::HeRu::SubcarrierGroup*')
-    typehandlers.add_type_alias('std::vector< std::pair< short, short > >&', 'ns3::HeRu::SubcarrierGroup&')
-    typehandlers.add_type_alias('std::pair< unsigned char, ns3::HeRu::RuType >', 'ns3::HeRu::BwTonesPair')
-    typehandlers.add_type_alias('std::pair< unsigned char, ns3::HeRu::RuType >*', 'ns3::HeRu::BwTonesPair*')
-    typehandlers.add_type_alias('std::pair< unsigned char, ns3::HeRu::RuType >&', 'ns3::HeRu::BwTonesPair&')
-    typehandlers.add_type_alias('std::map< std::pair< unsigned char, ns3::HeRu::RuType >, std::vector< std::vector< std::pair< short, short > > > >', 'ns3::HeRu::SubcarrierGroups')
-    typehandlers.add_type_alias('std::map< std::pair< unsigned char, ns3::HeRu::RuType >, std::vector< std::vector< std::pair< short, short > > > >*', 'ns3::HeRu::SubcarrierGroups*')
-    typehandlers.add_type_alias('std::map< std::pair< unsigned char, ns3::HeRu::RuType >, std::vector< std::vector< std::pair< short, short > > > >&', 'ns3::HeRu::SubcarrierGroups&')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     module.add_class('Ipv4Address', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
@@ -195,10 +161,6 @@
     module.add_class('ObjectDeleter', import_from_module='ns.core')
     ## object-factory.h (module 'core'): ns3::ObjectFactory [class]
     module.add_class('ObjectFactory', import_from_module='ns.core')
-    ## originator-block-ack-agreement.h (module 'wifi'): ns3::OriginatorBlockAckAgreement [class]
-    module.add_class('OriginatorBlockAckAgreement', import_from_module='ns.wifi', parent=root_module['ns3::BlockAckAgreement'])
-    ## originator-block-ack-agreement.h (module 'wifi'): ns3::OriginatorBlockAckAgreement::State [enumeration]
-    module.add_enum('State', ['PENDING', 'ESTABLISHED', 'NO_REPLY', 'RESET', 'REJECTED'], outer_class=root_module['ns3::OriginatorBlockAckAgreement'], import_from_module='ns.wifi')
     ## packet-metadata.h (module 'network'): ns3::PacketMetadata [class]
     module.add_class('PacketMetadata', import_from_module='ns.network')
     ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item [struct]
@@ -234,8 +196,6 @@
     typehandlers.add_type_alias('void ( * ) ( ns3::Time )&', 'ns3::Time::TracedCallback&')
     ## nstime.h (module 'core'): ns3::TimeWithUnit [class]
     module.add_class('TimeWithUnit', import_from_module='ns.core')
-    ## traced-value.h (module 'core'): ns3::TracedValue<unsigned int> [class]
-    module.add_class('TracedValue', import_from_module='ns.core', template_parameters=['unsigned int'])
     ## type-id.h (module 'core'): ns3::TypeId [class]
     module.add_class('TypeId', import_from_module='ns.core')
     ## type-id.h (module 'core'): ns3::TypeId::AttributeFlag [enumeration]
@@ -265,24 +225,18 @@
     typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::ConstellationSizeCallback')
     typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::ConstellationSizeCallback*')
     typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::ConstellationSizeCallback&')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::PhyRateCallback')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::PhyRateCallback*')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::PhyRateCallback&')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::PhyRateFromTxVectorCallback')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::PhyRateFromTxVectorCallback*')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::PhyRateFromTxVectorCallback&')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::DataRateCallback')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::DataRateCallback*')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::DataRateCallback&')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::DataRateFromTxVectorCallback')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::DataRateFromTxVectorCallback*')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::DataRateFromTxVectorCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::PhyRateCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::PhyRateCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::PhyRateCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::DataRateCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::DataRateCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::DataRateCallback&')
     typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::NonHtReferenceRateCallback')
     typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::NonHtReferenceRateCallback*')
     typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::NonHtReferenceRateCallback&')
-    typehandlers.add_type_alias('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::ModeAllowedCallback')
-    typehandlers.add_type_alias('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::ModeAllowedCallback*')
-    typehandlers.add_type_alias('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::ModeAllowedCallback&')
+    typehandlers.add_type_alias('ns3::Callback< bool, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::AllowedCallback')
+    typehandlers.add_type_alias('ns3::Callback< bool, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::AllowedCallback*')
+    typehandlers.add_type_alias('ns3::Callback< bool, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::AllowedCallback&')
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStation [struct]
     module.add_class('WifiRemoteStation', import_from_module='ns.wifi')
     ## wifi-remote-station-info.h (module 'wifi'): ns3::WifiRemoteStationInfo [class]
@@ -291,13 +245,6 @@
     module.add_class('WifiRemoteStationState', import_from_module='ns.wifi')
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState [enumeration]
     module.add_enum('', ['BRAND_NEW', 'DISASSOC', 'WAIT_ASSOC_TX_OK', 'GOT_ASSOC_TX_OK'], outer_class=root_module['ns3::WifiRemoteStationState'], import_from_module='ns.wifi')
-    ## wifi-standards.h (module 'wifi'): ns3::WifiStandardInfo [struct]
-    module.add_class('WifiStandardInfo', import_from_module='ns.wifi')
-    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector [class]
-    module.add_class('WifiTxVector', import_from_module='ns.wifi')
-    typehandlers.add_type_alias('std::map< unsigned short, ns3::HeMuUserInfo >', 'ns3::WifiTxVector::HeMuUserInfoMap')
-    typehandlers.add_type_alias('std::map< unsigned short, ns3::HeMuUserInfo >*', 'ns3::WifiTxVector::HeMuUserInfoMap*')
-    typehandlers.add_type_alias('std::map< unsigned short, ns3::HeMuUserInfo >&', 'ns3::WifiTxVector::HeMuUserInfoMap&')
     ## empty.h (module 'core'): ns3::empty [class]
     module.add_class('empty', import_from_module='ns.core')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t [class]
@@ -328,45 +275,46 @@
     module.add_class('Object', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter >'])
     ## object.h (module 'core'): ns3::Object::AggregateIterator [class]
     module.add_class('AggregateIterator', import_from_module='ns.core', outer_class=root_module['ns3::Object'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## random-variable-stream.h (module 'core'): ns3::RandomVariableStream [class]
+    module.add_class('RandomVariableStream', import_from_module='ns.core', parent=root_module['ns3::Object'])
+    ## random-variable-stream.h (module 'core'): ns3::SequentialRandomVariable [class]
+    module.add_class('SequentialRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MeshWifiInterfaceMacPlugin, ns3::empty, ns3::DefaultDeleter<ns3::MeshWifiInterfaceMacPlugin> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MeshWifiInterfaceMacPlugin, ns3::empty, ns3::DefaultDeleter<ns3::MeshWifiInterfaceMacPlugin>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::MeshWifiInterfaceMacPlugin', 'ns3::empty', 'ns3::DefaultDeleter<ns3::MeshWifiInterfaceMacPlugin>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::WifiInformationElement', 'ns3::empty', 'ns3::DefaultDeleter<ns3::WifiInformationElement>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiMacQueueItem, ns3::empty, ns3::DefaultDeleter<ns3::WifiMacQueueItem> > [class]
-    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::WifiMacQueueItem', 'ns3::empty', 'ns3::DefaultDeleter<ns3::WifiMacQueueItem>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::dot11s::DestinationAddressUnit, ns3::empty, ns3::DefaultDeleter<ns3::dot11s::DestinationAddressUnit> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::dot11s::DestinationAddressUnit, ns3::empty, ns3::DefaultDeleter<ns3::dot11s::DestinationAddressUnit>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::dot11s::DestinationAddressUnit', 'ns3::empty', 'ns3::DefaultDeleter<ns3::dot11s::DestinationAddressUnit>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::dot11s::IeBeaconTimingUnit, ns3::empty, ns3::DefaultDeleter<ns3::dot11s::IeBeaconTimingUnit> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::dot11s::IeBeaconTimingUnit, ns3::empty, ns3::DefaultDeleter<ns3::dot11s::IeBeaconTimingUnit>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::dot11s::IeBeaconTimingUnit', 'ns3::empty', 'ns3::DefaultDeleter<ns3::dot11s::IeBeaconTimingUnit>'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
     module.add_class('TraceSourceAccessor', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >'])
     ## trailer.h (module 'network'): ns3::Trailer [class]
     module.add_class('Trailer', import_from_module='ns.network', parent=root_module['ns3::Chunk'])
-    ## txop.h (module 'wifi'): ns3::Txop [class]
-    module.add_class('Txop', import_from_module='ns.wifi', parent=root_module['ns3::Object'])
-    ## txop.h (module 'wifi'): ns3::Txop::ChannelAccessStatus [enumeration]
-    module.add_enum('ChannelAccessStatus', ['NOT_REQUESTED', 'REQUESTED', 'GRANTED'], outer_class=root_module['ns3::Txop'], import_from_module='ns.wifi')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacDropReason, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::Txop::DroppedMpdu')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacDropReason, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::Txop::DroppedMpdu*')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacDropReason, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::Txop::DroppedMpdu&')
+    ## random-variable-stream.h (module 'core'): ns3::TriangularRandomVariable [class]
+    module.add_class('TriangularRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
+    ## random-variable-stream.h (module 'core'): ns3::UniformRandomVariable [class]
+    module.add_class('UniformRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
+    ## random-variable-stream.h (module 'core'): ns3::WeibullRandomVariable [class]
+    module.add_class('WeibullRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
     ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader [class]
     module.add_class('WifiActionHeader', import_from_module='ns.wifi', parent=root_module['ns3::Header'])
     ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::CategoryValue [enumeration]
@@ -397,26 +345,6 @@
     typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiMac::ForwardUpCallback')
     typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiMac::ForwardUpCallback*')
     typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiMac::ForwardUpCallback&')
-    ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacHeader [class]
-    module.add_class('WifiMacHeader', import_from_module='ns.wifi', parent=root_module['ns3::Header'])
-    ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacHeader::QosAckPolicy [enumeration]
-    module.add_enum('QosAckPolicy', ['NORMAL_ACK', 'NO_ACK', 'NO_EXPLICIT_ACK', 'BLOCK_ACK'], outer_class=root_module['ns3::WifiMacHeader'], import_from_module='ns.wifi')
-    ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacHeader::AddressType [enumeration]
-    module.add_enum('AddressType', ['ADDR1', 'ADDR2', 'ADDR3', 'ADDR4'], outer_class=root_module['ns3::WifiMacHeader'], import_from_module='ns.wifi')
-    typehandlers.add_type_alias('void ( * ) ( ns3::WifiMacHeader const & )', 'ns3::WifiMacHeader::TracedCallback')
-    typehandlers.add_type_alias('void ( * ) ( ns3::WifiMacHeader const & )*', 'ns3::WifiMacHeader::TracedCallback*')
-    typehandlers.add_type_alias('void ( * ) ( ns3::WifiMacHeader const & )&', 'ns3::WifiMacHeader::TracedCallback&')
-    ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem [class]
-    module.add_class('WifiMacQueueItem', import_from_module='ns.wifi', parent=root_module['ns3::SimpleRefCount< ns3::WifiMacQueueItem, ns3::empty, ns3::DefaultDeleter<ns3::WifiMacQueueItem> >'])
-    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > >', 'ns3::WifiMacQueueItem::DeaggregatedMsdus')
-    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > >*', 'ns3::WifiMacQueueItem::DeaggregatedMsdus*')
-    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > >&', 'ns3::WifiMacQueueItem::DeaggregatedMsdus&')
-    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > > const_iterator', 'ns3::WifiMacQueueItem::DeaggregatedMsdusCI')
-    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > > const_iterator*', 'ns3::WifiMacQueueItem::DeaggregatedMsdusCI*')
-    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > > const_iterator&', 'ns3::WifiMacQueueItem::DeaggregatedMsdusCI&')
-    typehandlers.add_type_alias('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'ns3::WifiMacQueueItem::ConstIterator')
-    typehandlers.add_type_alias('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator*', 'ns3::WifiMacQueueItem::ConstIterator*')
-    typehandlers.add_type_alias('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator&', 'ns3::WifiMacQueueItem::ConstIterator&')
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationManager [class]
     module.add_class('WifiRemoteStationManager', import_from_module='ns.wifi', parent=root_module['ns3::Object'])
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationManager::ProtectionMode [enumeration]
@@ -433,28 +361,16 @@
     typehandlers.add_type_alias('void ( * ) ( ns3::DataRate, ns3::DataRate, ns3::Mac48Address )', 'ns3::WifiRemoteStationManager::RateChangeTracedCallback')
     typehandlers.add_type_alias('void ( * ) ( ns3::DataRate, ns3::DataRate, ns3::Mac48Address )*', 'ns3::WifiRemoteStationManager::RateChangeTracedCallback*')
     typehandlers.add_type_alias('void ( * ) ( ns3::DataRate, ns3::DataRate, ns3::Mac48Address )&', 'ns3::WifiRemoteStationManager::RateChangeTracedCallback&')
-    ## amsdu-subframe-header.h (module 'wifi'): ns3::AmsduSubframeHeader [class]
-    module.add_class('AmsduSubframeHeader', import_from_module='ns.wifi', parent=root_module['ns3::Header'])
+    ## random-variable-stream.h (module 'core'): ns3::ZetaRandomVariable [class]
+    module.add_class('ZetaRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
+    ## random-variable-stream.h (module 'core'): ns3::ZipfRandomVariable [class]
+    module.add_class('ZipfRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
     ## attribute.h (module 'core'): ns3::AttributeAccessor [class]
     module.add_class('AttributeAccessor', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >'])
     ## attribute.h (module 'core'): ns3::AttributeChecker [class]
     module.add_class('AttributeChecker', allow_subclassing=False, automatic_type_narrowing=True, import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >'])
     ## attribute.h (module 'core'): ns3::AttributeValue [class]
     module.add_class('AttributeValue', allow_subclassing=False, automatic_type_narrowing=True, import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >'])
-    ## block-ack-manager.h (module 'wifi'): ns3::BlockAckManager [class]
-    module.add_class('BlockAckManager', import_from_module='ns.wifi', parent=root_module['ns3::Object'])
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::BlockAckManager::TxOk')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::BlockAckManager::TxOk*')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::BlockAckManager::TxOk&')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::BlockAckManager::TxFailed')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::BlockAckManager::TxFailed*')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::BlockAckManager::TxFailed&')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::BlockAckManager::DroppedOldMpdu')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::BlockAckManager::DroppedOldMpdu*')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::BlockAckManager::DroppedOldMpdu&')
-    typehandlers.add_type_alias('void ( * ) ( ns3::Time, ns3::Mac48Address, uint8_t, ns3::OriginatorBlockAckAgreement::State )', 'ns3::BlockAckManager::AgreementStateTracedCallback')
-    typehandlers.add_type_alias('void ( * ) ( ns3::Time, ns3::Mac48Address, uint8_t, ns3::OriginatorBlockAckAgreement::State )*', 'ns3::BlockAckManager::AgreementStateTracedCallback*')
-    typehandlers.add_type_alias('void ( * ) ( ns3::Time, ns3::Mac48Address, uint8_t, ns3::OriginatorBlockAckAgreement::State )&', 'ns3::BlockAckManager::AgreementStateTracedCallback&')
     ## boolean.h (module 'core'): ns3::BooleanChecker [class]
     module.add_class('BooleanChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
     ## boolean.h (module 'core'): ns3::BooleanValue [class]
@@ -467,16 +383,22 @@
     module.add_class('CallbackValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
     ## channel.h (module 'network'): ns3::Channel [class]
     module.add_class('Channel', import_from_module='ns.network', parent=root_module['ns3::Object'])
+    ## random-variable-stream.h (module 'core'): ns3::ConstantRandomVariable [class]
+    module.add_class('ConstantRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
     ## data-rate.h (module 'network'): ns3::DataRateChecker [class]
     module.add_class('DataRateChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
     ## data-rate.h (module 'network'): ns3::DataRateValue [class]
     module.add_class('DataRateValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
+    ## random-variable-stream.h (module 'core'): ns3::DeterministicRandomVariable [class]
+    module.add_class('DeterministicRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
     ## double.h (module 'core'): ns3::DoubleValue [class]
     module.add_class('DoubleValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
     ## dsss-parameter-set.h (module 'wifi'): ns3::DsssParameterSet [class]
     module.add_class('DsssParameterSet', import_from_module='ns.wifi', parent=root_module['ns3::WifiInformationElement'])
     ## edca-parameter-set.h (module 'wifi'): ns3::EdcaParameterSet [class]
     module.add_class('EdcaParameterSet', import_from_module='ns.wifi', parent=root_module['ns3::WifiInformationElement'])
+    ## random-variable-stream.h (module 'core'): ns3::EmpiricalRandomVariable [class]
+    module.add_class('EmpiricalRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
     ## attribute.h (module 'core'): ns3::EmptyAttributeAccessor [class]
     module.add_class('EmptyAttributeAccessor', import_from_module='ns.core', parent=root_module['ns3::AttributeAccessor'])
     ## attribute.h (module 'core'): ns3::EmptyAttributeChecker [class]
@@ -487,14 +409,20 @@
     module.add_class('EnumChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
     ## enum.h (module 'core'): ns3::EnumValue [class]
     module.add_class('EnumValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## random-variable-stream.h (module 'core'): ns3::ErlangRandomVariable [class]
+    module.add_class('ErlangRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
     ## erp-information.h (module 'wifi'): ns3::ErpInformation [class]
     module.add_class('ErpInformation', import_from_module='ns.wifi', parent=root_module['ns3::WifiInformationElement'])
     ## event-impl.h (module 'core'): ns3::EventImpl [class]
     module.add_class('EventImpl', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >'])
+    ## random-variable-stream.h (module 'core'): ns3::ExponentialRandomVariable [class]
+    module.add_class('ExponentialRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
     ## extended-capabilities.h (module 'wifi'): ns3::ExtendedCapabilities [class]
     module.add_class('ExtendedCapabilities', import_from_module='ns.wifi', parent=root_module['ns3::WifiInformationElement'])
     ## supported-rates.h (module 'wifi'): ns3::ExtendedSupportedRatesIE [class]
     module.add_class('ExtendedSupportedRatesIE', import_from_module='ns.wifi', parent=root_module['ns3::WifiInformationElement'])
+    ## random-variable-stream.h (module 'core'): ns3::GammaRandomVariable [class]
+    module.add_class('GammaRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
     ## he-capabilities.h (module 'wifi'): ns3::HeCapabilities [class]
     module.add_class('HeCapabilities', import_from_module='ns.wifi', parent=root_module['ns3::WifiInformationElement'])
     ## he-operation.h (module 'wifi'): ns3::HeOperation [class]
@@ -521,6 +449,8 @@
     module.add_class('Ipv6PrefixChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
     ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixValue [class]
     module.add_class('Ipv6PrefixValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
+    ## random-variable-stream.h (module 'core'): ns3::LogNormalRandomVariable [class]
+    module.add_class('LogNormalRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
     ## mac48-address.h (module 'network'): ns3::Mac48AddressChecker [class]
     module.add_class('Mac48AddressChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
     ## mac48-address.h (module 'network'): ns3::Mac48AddressValue [class]
@@ -534,6 +464,8 @@
     typehandlers.add_type_alias('ns3::Callback< void, bool, ns3::Ptr< ns3::Packet >, ns3::Mac48Address, ns3::Mac48Address, unsigned short, unsigned int, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::MeshL2RoutingProtocol::RouteReplyCallback&')
     ## mesh-stack-installer.h (module 'mesh'): ns3::MeshStack [class]
     module.add_class('MeshStack', parent=root_module['ns3::Object'])
+    ## mesh-wifi-interface-mac.h (module 'mesh'): ns3::MeshWifiInterfaceMac [class]
+    module.add_class('MeshWifiInterfaceMac', parent=root_module['ns3::WifiMac'])
     ## mesh-wifi-interface-mac-plugin.h (module 'mesh'): ns3::MeshWifiInterfaceMacPlugin [class]
     module.add_class('MeshWifiInterfaceMacPlugin', parent=root_module['ns3::SimpleRefCount< ns3::MeshWifiInterfaceMacPlugin, ns3::empty, ns3::DefaultDeleter<ns3::MeshWifiInterfaceMacPlugin> >'])
     ## mgt-headers.h (module 'wifi'): ns3::MgtBeaconHeader [class]
@@ -563,6 +495,8 @@
     typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::NetDevice >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::Node::DeviceAdditionListener')
     typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::NetDevice >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::Node::DeviceAdditionListener*')
     typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::NetDevice >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::Node::DeviceAdditionListener&')
+    ## random-variable-stream.h (module 'core'): ns3::NormalRandomVariable [class]
+    module.add_class('NormalRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
     ## object-factory.h (module 'core'): ns3::ObjectFactoryChecker [class]
     module.add_class('ObjectFactoryChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
     ## object-factory.h (module 'core'): ns3::ObjectFactoryValue [class]
@@ -587,10 +521,8 @@
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, double )', 'ns3::Packet::SinrTracedCallback')
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, double )*', 'ns3::Packet::SinrTracedCallback*')
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, double )&', 'ns3::Packet::SinrTracedCallback&')
-    ## qos-txop.h (module 'wifi'): ns3::QosTxop [class]
-    module.add_class('QosTxop', import_from_module='ns.wifi', parent=root_module['ns3::Txop'])
-    ## regular-wifi-mac.h (module 'wifi'): ns3::RegularWifiMac [class]
-    module.add_class('RegularWifiMac', import_from_module='ns.wifi', parent=root_module['ns3::WifiMac'])
+    ## random-variable-stream.h (module 'core'): ns3::ParetoRandomVariable [class]
+    module.add_class('ParetoRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
     ## ssid.h (module 'wifi'): ns3::Ssid [class]
     module.add_class('Ssid', import_from_module='ns.wifi', parent=root_module['ns3::WifiInformationElement'])
     ## ssid.h (module 'wifi'): ns3::SsidChecker [class]
@@ -621,20 +553,18 @@
     module.add_class('AddressValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
     ## bridge-channel.h (module 'bridge'): ns3::BridgeChannel [class]
     module.add_class('BridgeChannel', import_from_module='ns.bridge', parent=root_module['ns3::Channel'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['bool', 'const ns3::WifiTxVector &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<bool, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<const ns3::Packet>, unsigned short, const ns3::Address &, const ns3::Address &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['bool', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'const ns3::Address &', 'const ns3::Address &', 'ns3::NetDevice::PacketType', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<bool, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<const ns3::Packet>, unsigned short, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['bool', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'const ns3::Address &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['bool', 'unsigned short', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['ns3::ObjectBase *', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned long long', 'const ns3::WifiTxVector &', 'unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned long long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned long long', 'unsigned short', 'unsigned short', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, bool, ns3::Ptr<ns3::Packet>, ns3::Mac48Address, ns3::Mac48Address, unsigned short, unsigned int, ns3::empty, ns3::empty, ns3::empty> [class]
@@ -653,10 +583,6 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'const ns3::Address &', 'const ns3::Address &', 'ns3::NetDevice::PacketType', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::Mac48Address, unsigned char, ns3::OriginatorBlockAckAgreement::State, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Time', 'ns3::Mac48Address', 'unsigned char', 'ns3::OriginatorBlockAckAgreement::State', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Time', 'ns3::Time', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Time', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
@@ -667,42 +593,26 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned char', 'ns3::Ptr<const ns3::WifiMacQueueItem>', 'const ns3::WifiTxVector &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned char', 'ns3::Ptr<const ns3::WifiPsdu>', 'const ns3::WifiTxVector &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned char', 'std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *', 'const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *', 'unsigned long long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned int', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned char', 'std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *', 'const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *', 'unsigned long long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## dot11s-installer.h (module 'mesh'): ns3::Dot11sStack [class]
     module.add_class('Dot11sStack', parent=root_module['ns3::MeshStack'])
     ## flame-installer.h (module 'mesh'): ns3::FlameStack [class]
     module.add_class('FlameStack', parent=root_module['ns3::MeshStack'])
     ## mesh-point-device.h (module 'mesh'): ns3::MeshPointDevice [class]
     module.add_class('MeshPointDevice', parent=root_module['ns3::NetDevice'])
-    ## mesh-wifi-interface-mac.h (module 'mesh'): ns3::MeshWifiInterfaceMac [class]
-    module.add_class('MeshWifiInterfaceMac', parent=root_module['ns3::RegularWifiMac'])
     module.add_container('std::list< ns3::BlockAckReqType >', 'ns3::BlockAckReqType', container_type='list')
     module.add_container('std::vector< unsigned char >', 'unsigned char', container_type='vector')
-    module.add_container('std::vector< std::pair< short, short > >', 'std::pair< short, short >', container_type='vector')
-    module.add_container('std::vector< ns3::HeRu::RuSpec >', 'ns3::HeRu::RuSpec', container_type='vector')
-    module.add_container('ns3::HeRu::SubcarrierGroup', 'std::pair< short, short >', container_type='vector')
-    module.add_container('std::map< std::pair< unsigned char, ns3::HeRu::RuType >, std::vector< std::vector< std::pair< short, short > > > >', ('std::pair< unsigned char, ns3::HeRu::RuType >', 'std::vector< std::vector< std::pair< short, short > > >'), container_type='map')
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     module.add_container('ns3::WifiModeList', 'ns3::WifiMode', container_type='vector')
-    module.add_container('std::map< unsigned short, ns3::HeMuUserInfo >', ('short unsigned int', 'ns3::HeMuUserInfo'), container_type='map')
-    module.add_container('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > >', 'std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader >', container_type='list')
     module.add_container('std::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStation *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStation * > > >', ('ns3::Mac48Address', 'ns3::WifiRemoteStation *'), container_type='map')
     module.add_container('std::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStationState *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStationState * > > >', ('ns3::Mac48Address', 'ns3::WifiRemoteStationState *'), container_type='map')
-    module.add_container('std::set< unsigned char >', 'unsigned char', container_type='set')
     module.add_container('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > >', ('short unsigned int', 'ns3::Ptr< ns3::WifiPsdu >'), container_type='map')
     module.add_container('std::set< ns3::Mac48Address >', 'ns3::Mac48Address', container_type='set')
     module.add_container('std::vector< ns3::Ptr< ns3::NetDevice > >', 'ns3::Ptr< ns3::NetDevice >', container_type='vector')
     typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > >', 'ns3::WifiPsduMap')
     typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > >*', 'ns3::WifiPsduMap*')
     typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > >&', 'ns3::WifiPsduMap&')
-    typehandlers.add_type_alias('std::pair< ns3::Mac48Address, unsigned char >', 'ns3::WifiAddressTidPair')
-    typehandlers.add_type_alias('std::pair< ns3::Mac48Address, unsigned char >*', 'ns3::WifiAddressTidPair*')
-    typehandlers.add_type_alias('std::pair< ns3::Mac48Address, unsigned char >&', 'ns3::WifiAddressTidPair&')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode >', 'ns3::WifiModeList')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode >*', 'ns3::WifiModeList*')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode >&', 'ns3::WifiModeList&')
@@ -715,6 +625,9 @@
     typehandlers.add_type_alias('uint8_t', 'ns3::WifiInformationElementId')
     typehandlers.add_type_alias('uint8_t*', 'ns3::WifiInformationElementId*')
     typehandlers.add_type_alias('uint8_t&', 'ns3::WifiInformationElementId&')
+    typehandlers.add_type_alias('std::pair< ns3::Mac48Address, unsigned char >', 'ns3::WifiAddressTidPair')
+    typehandlers.add_type_alias('std::pair< ns3::Mac48Address, unsigned char >*', 'ns3::WifiAddressTidPair*')
+    typehandlers.add_type_alias('std::pair< ns3::Mac48Address, unsigned char >&', 'ns3::WifiAddressTidPair&')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )', 'ns3::TimePrinter')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )*', 'ns3::TimePrinter*')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )&', 'ns3::TimePrinter&')
@@ -798,6 +711,9 @@
     typehandlers.add_type_alias('void ( * ) ( ns3::Time, ns3::Time )', 'ns3::TracedValueCallback::Time')
     typehandlers.add_type_alias('void ( * ) ( ns3::Time, ns3::Time )*', 'ns3::TracedValueCallback::Time*')
     typehandlers.add_type_alias('void ( * ) ( ns3::Time, ns3::Time )&', 'ns3::TracedValueCallback::Time&')
+    typehandlers.add_type_alias('void ( * ) ( ns3::DataRate, ns3::DataRate )', 'ns3::TracedValueCallback::DataRate')
+    typehandlers.add_type_alias('void ( * ) ( ns3::DataRate, ns3::DataRate )*', 'ns3::TracedValueCallback::DataRate*')
+    typehandlers.add_type_alias('void ( * ) ( ns3::DataRate, ns3::DataRate )&', 'ns3::TracedValueCallback::DataRate&')
     typehandlers.add_type_alias('void ( * ) ( bool, bool )', 'ns3::TracedValueCallback::Bool')
     typehandlers.add_type_alias('void ( * ) ( bool, bool )*', 'ns3::TracedValueCallback::Bool*')
     typehandlers.add_type_alias('void ( * ) ( bool, bool )&', 'ns3::TracedValueCallback::Bool&')
@@ -831,9 +747,6 @@
     typehandlers.add_type_alias('void ( * ) (  )', 'ns3::TracedValueCallback::Void')
     typehandlers.add_type_alias('void ( * ) (  )*', 'ns3::TracedValueCallback::Void*')
     typehandlers.add_type_alias('void ( * ) (  )&', 'ns3::TracedValueCallback::Void&')
-    typehandlers.add_type_alias('void ( * ) ( ns3::DataRate, ns3::DataRate )', 'ns3::TracedValueCallback::DataRate')
-    typehandlers.add_type_alias('void ( * ) ( ns3::DataRate, ns3::DataRate )*', 'ns3::TracedValueCallback::DataRate*')
-    typehandlers.add_type_alias('void ( * ) ( ns3::DataRate, ns3::DataRate )&', 'ns3::TracedValueCallback::DataRate&')
 
 def register_types_ns3_dot11s(module):
     root_module = module.get_root()
@@ -953,11 +866,8 @@
     register_Ns3Address_methods(root_module, root_module['ns3::Address'])
     register_Ns3AttributeConstructionList_methods(root_module, root_module['ns3::AttributeConstructionList'])
     register_Ns3AttributeConstructionListItem_methods(root_module, root_module['ns3::AttributeConstructionList::Item'])
-    register_Ns3Bar_methods(root_module, root_module['ns3::Bar'])
-    register_Ns3BlockAckAgreement_methods(root_module, root_module['ns3::BlockAckAgreement'])
     register_Ns3BlockAckReqType_methods(root_module, root_module['ns3::BlockAckReqType'])
     register_Ns3BlockAckType_methods(root_module, root_module['ns3::BlockAckType'])
-    register_Ns3BlockAckWindow_methods(root_module, root_module['ns3::BlockAckWindow'])
     register_Ns3Buffer_methods(root_module, root_module['ns3::Buffer'])
     register_Ns3BufferIterator_methods(root_module, root_module['ns3::Buffer::Iterator'])
     register_Ns3ByteTagIterator_methods(root_module, root_module['ns3::ByteTagIterator'])
@@ -979,14 +889,10 @@
     register_Ns3DefaultDeleter__Ns3Packet_methods(root_module, root_module['ns3::DefaultDeleter< ns3::Packet >'])
     register_Ns3DefaultDeleter__Ns3TraceSourceAccessor_methods(root_module, root_module['ns3::DefaultDeleter< ns3::TraceSourceAccessor >'])
     register_Ns3DefaultDeleter__Ns3WifiInformationElement_methods(root_module, root_module['ns3::DefaultDeleter< ns3::WifiInformationElement >'])
-    register_Ns3DefaultDeleter__Ns3WifiMacQueueItem_methods(root_module, root_module['ns3::DefaultDeleter< ns3::WifiMacQueueItem >'])
     register_Ns3DefaultDeleter__Ns3Dot11sDestinationAddressUnit_methods(root_module, root_module['ns3::DefaultDeleter< ns3::dot11s::DestinationAddressUnit >'])
     register_Ns3DefaultDeleter__Ns3Dot11sIeBeaconTimingUnit_methods(root_module, root_module['ns3::DefaultDeleter< ns3::dot11s::IeBeaconTimingUnit >'])
     register_Ns3EventId_methods(root_module, root_module['ns3::EventId'])
     register_Ns3Hasher_methods(root_module, root_module['ns3::Hasher'])
-    register_Ns3HeMuUserInfo_methods(root_module, root_module['ns3::HeMuUserInfo'])
-    register_Ns3HeRu_methods(root_module, root_module['ns3::HeRu'])
-    register_Ns3HeRuRuSpec_methods(root_module, root_module['ns3::HeRu::RuSpec'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
     register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
@@ -1001,7 +907,6 @@
     register_Ns3ObjectBase_methods(root_module, root_module['ns3::ObjectBase'])
     register_Ns3ObjectDeleter_methods(root_module, root_module['ns3::ObjectDeleter'])
     register_Ns3ObjectFactory_methods(root_module, root_module['ns3::ObjectFactory'])
-    register_Ns3OriginatorBlockAckAgreement_methods(root_module, root_module['ns3::OriginatorBlockAckAgreement'])
     register_Ns3PacketMetadata_methods(root_module, root_module['ns3::PacketMetadata'])
     register_Ns3PacketMetadataItem_methods(root_module, root_module['ns3::PacketMetadata::Item'])
     register_Ns3PacketMetadataItemIterator_methods(root_module, root_module['ns3::PacketMetadata::ItemIterator'])
@@ -1016,7 +921,6 @@
     register_Ns3TagBuffer_methods(root_module, root_module['ns3::TagBuffer'])
     register_Ns3Time_methods(root_module, root_module['ns3::Time'])
     register_Ns3TimeWithUnit_methods(root_module, root_module['ns3::TimeWithUnit'])
-    register_Ns3TracedValue__Unsigned_int_methods(root_module, root_module['ns3::TracedValue< unsigned int >'])
     register_Ns3TypeId_methods(root_module, root_module['ns3::TypeId'])
     register_Ns3TypeIdAttributeInformation_methods(root_module, root_module['ns3::TypeId::AttributeInformation'])
     register_Ns3TypeIdTraceSourceInformation_methods(root_module, root_module['ns3::TypeId::TraceSourceInformation'])
@@ -1028,8 +932,6 @@
     register_Ns3WifiRemoteStation_methods(root_module, root_module['ns3::WifiRemoteStation'])
     register_Ns3WifiRemoteStationInfo_methods(root_module, root_module['ns3::WifiRemoteStationInfo'])
     register_Ns3WifiRemoteStationState_methods(root_module, root_module['ns3::WifiRemoteStationState'])
-    register_Ns3WifiStandardInfo_methods(root_module, root_module['ns3::WifiStandardInfo'])
-    register_Ns3WifiTxVector_methods(root_module, root_module['ns3::WifiTxVector'])
     register_Ns3Empty_methods(root_module, root_module['ns3::empty'])
     register_Ns3Int64x64_t_methods(root_module, root_module['ns3::int64x64_t'])
     register_Ns3Chunk_methods(root_module, root_module['ns3::Chunk'])
@@ -1044,6 +946,8 @@
     register_Ns3MgtReassocRequestHeader_methods(root_module, root_module['ns3::MgtReassocRequestHeader'])
     register_Ns3Object_methods(root_module, root_module['ns3::Object'])
     register_Ns3ObjectAggregateIterator_methods(root_module, root_module['ns3::Object::AggregateIterator'])
+    register_Ns3RandomVariableStream_methods(root_module, root_module['ns3::RandomVariableStream'])
+    register_Ns3SequentialRandomVariable_methods(root_module, root_module['ns3::SequentialRandomVariable'])
     register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >'])
     register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >'])
     register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >'])
@@ -1055,45 +959,50 @@
     register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >'])
     register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >'])
     register_Ns3SimpleRefCount__Ns3WifiInformationElement_Ns3Empty_Ns3DefaultDeleter__lt__ns3WifiInformationElement__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement> >'])
-    register_Ns3SimpleRefCount__Ns3WifiMacQueueItem_Ns3Empty_Ns3DefaultDeleter__lt__ns3WifiMacQueueItem__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::WifiMacQueueItem, ns3::empty, ns3::DefaultDeleter<ns3::WifiMacQueueItem> >'])
     register_Ns3SimpleRefCount__Ns3Dot11sDestinationAddressUnit_Ns3Empty_Ns3DefaultDeleter__lt__ns3Dot11sDestinationAddressUnit__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::dot11s::DestinationAddressUnit, ns3::empty, ns3::DefaultDeleter<ns3::dot11s::DestinationAddressUnit> >'])
     register_Ns3SimpleRefCount__Ns3Dot11sIeBeaconTimingUnit_Ns3Empty_Ns3DefaultDeleter__lt__ns3Dot11sIeBeaconTimingUnit__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::dot11s::IeBeaconTimingUnit, ns3::empty, ns3::DefaultDeleter<ns3::dot11s::IeBeaconTimingUnit> >'])
     register_Ns3TraceSourceAccessor_methods(root_module, root_module['ns3::TraceSourceAccessor'])
     register_Ns3Trailer_methods(root_module, root_module['ns3::Trailer'])
-    register_Ns3Txop_methods(root_module, root_module['ns3::Txop'])
+    register_Ns3TriangularRandomVariable_methods(root_module, root_module['ns3::TriangularRandomVariable'])
+    register_Ns3UniformRandomVariable_methods(root_module, root_module['ns3::UniformRandomVariable'])
+    register_Ns3WeibullRandomVariable_methods(root_module, root_module['ns3::WeibullRandomVariable'])
     register_Ns3WifiActionHeader_methods(root_module, root_module['ns3::WifiActionHeader'])
     register_Ns3WifiActionHeaderActionValue_methods(root_module, root_module['ns3::WifiActionHeader::ActionValue'])
     register_Ns3WifiInformationElement_methods(root_module, root_module['ns3::WifiInformationElement'])
     register_Ns3WifiInformationElementVector_methods(root_module, root_module['ns3::WifiInformationElementVector'])
     register_Ns3WifiMac_methods(root_module, root_module['ns3::WifiMac'])
-    register_Ns3WifiMacHeader_methods(root_module, root_module['ns3::WifiMacHeader'])
-    register_Ns3WifiMacQueueItem_methods(root_module, root_module['ns3::WifiMacQueueItem'])
     register_Ns3WifiRemoteStationManager_methods(root_module, root_module['ns3::WifiRemoteStationManager'])
-    register_Ns3AmsduSubframeHeader_methods(root_module, root_module['ns3::AmsduSubframeHeader'])
+    register_Ns3ZetaRandomVariable_methods(root_module, root_module['ns3::ZetaRandomVariable'])
+    register_Ns3ZipfRandomVariable_methods(root_module, root_module['ns3::ZipfRandomVariable'])
     register_Ns3AttributeAccessor_methods(root_module, root_module['ns3::AttributeAccessor'])
     register_Ns3AttributeChecker_methods(root_module, root_module['ns3::AttributeChecker'])
     register_Ns3AttributeValue_methods(root_module, root_module['ns3::AttributeValue'])
-    register_Ns3BlockAckManager_methods(root_module, root_module['ns3::BlockAckManager'])
     register_Ns3BooleanChecker_methods(root_module, root_module['ns3::BooleanChecker'])
     register_Ns3BooleanValue_methods(root_module, root_module['ns3::BooleanValue'])
     register_Ns3CallbackChecker_methods(root_module, root_module['ns3::CallbackChecker'])
     register_Ns3CallbackImplBase_methods(root_module, root_module['ns3::CallbackImplBase'])
     register_Ns3CallbackValue_methods(root_module, root_module['ns3::CallbackValue'])
     register_Ns3Channel_methods(root_module, root_module['ns3::Channel'])
+    register_Ns3ConstantRandomVariable_methods(root_module, root_module['ns3::ConstantRandomVariable'])
     register_Ns3DataRateChecker_methods(root_module, root_module['ns3::DataRateChecker'])
     register_Ns3DataRateValue_methods(root_module, root_module['ns3::DataRateValue'])
+    register_Ns3DeterministicRandomVariable_methods(root_module, root_module['ns3::DeterministicRandomVariable'])
     register_Ns3DoubleValue_methods(root_module, root_module['ns3::DoubleValue'])
     register_Ns3DsssParameterSet_methods(root_module, root_module['ns3::DsssParameterSet'])
     register_Ns3EdcaParameterSet_methods(root_module, root_module['ns3::EdcaParameterSet'])
+    register_Ns3EmpiricalRandomVariable_methods(root_module, root_module['ns3::EmpiricalRandomVariable'])
     register_Ns3EmptyAttributeAccessor_methods(root_module, root_module['ns3::EmptyAttributeAccessor'])
     register_Ns3EmptyAttributeChecker_methods(root_module, root_module['ns3::EmptyAttributeChecker'])
     register_Ns3EmptyAttributeValue_methods(root_module, root_module['ns3::EmptyAttributeValue'])
     register_Ns3EnumChecker_methods(root_module, root_module['ns3::EnumChecker'])
     register_Ns3EnumValue_methods(root_module, root_module['ns3::EnumValue'])
+    register_Ns3ErlangRandomVariable_methods(root_module, root_module['ns3::ErlangRandomVariable'])
     register_Ns3ErpInformation_methods(root_module, root_module['ns3::ErpInformation'])
     register_Ns3EventImpl_methods(root_module, root_module['ns3::EventImpl'])
+    register_Ns3ExponentialRandomVariable_methods(root_module, root_module['ns3::ExponentialRandomVariable'])
     register_Ns3ExtendedCapabilities_methods(root_module, root_module['ns3::ExtendedCapabilities'])
     register_Ns3ExtendedSupportedRatesIE_methods(root_module, root_module['ns3::ExtendedSupportedRatesIE'])
+    register_Ns3GammaRandomVariable_methods(root_module, root_module['ns3::GammaRandomVariable'])
     register_Ns3HeCapabilities_methods(root_module, root_module['ns3::HeCapabilities'])
     register_Ns3HeOperation_methods(root_module, root_module['ns3::HeOperation'])
     register_Ns3HtCapabilities_methods(root_module, root_module['ns3::HtCapabilities'])
@@ -1107,22 +1016,24 @@
     register_Ns3Ipv6AddressValue_methods(root_module, root_module['ns3::Ipv6AddressValue'])
     register_Ns3Ipv6PrefixChecker_methods(root_module, root_module['ns3::Ipv6PrefixChecker'])
     register_Ns3Ipv6PrefixValue_methods(root_module, root_module['ns3::Ipv6PrefixValue'])
+    register_Ns3LogNormalRandomVariable_methods(root_module, root_module['ns3::LogNormalRandomVariable'])
     register_Ns3Mac48AddressChecker_methods(root_module, root_module['ns3::Mac48AddressChecker'])
     register_Ns3Mac48AddressValue_methods(root_module, root_module['ns3::Mac48AddressValue'])
     register_Ns3MeshInformationElementVector_methods(root_module, root_module['ns3::MeshInformationElementVector'])
     register_Ns3MeshL2RoutingProtocol_methods(root_module, root_module['ns3::MeshL2RoutingProtocol'])
     register_Ns3MeshStack_methods(root_module, root_module['ns3::MeshStack'])
+    register_Ns3MeshWifiInterfaceMac_methods(root_module, root_module['ns3::MeshWifiInterfaceMac'])
     register_Ns3MeshWifiInterfaceMacPlugin_methods(root_module, root_module['ns3::MeshWifiInterfaceMacPlugin'])
     register_Ns3MgtBeaconHeader_methods(root_module, root_module['ns3::MgtBeaconHeader'])
     register_Ns3MuEdcaParameterSet_methods(root_module, root_module['ns3::MuEdcaParameterSet'])
     register_Ns3NetDevice_methods(root_module, root_module['ns3::NetDevice'])
     register_Ns3NixVector_methods(root_module, root_module['ns3::NixVector'])
     register_Ns3Node_methods(root_module, root_module['ns3::Node'])
+    register_Ns3NormalRandomVariable_methods(root_module, root_module['ns3::NormalRandomVariable'])
     register_Ns3ObjectFactoryChecker_methods(root_module, root_module['ns3::ObjectFactoryChecker'])
     register_Ns3ObjectFactoryValue_methods(root_module, root_module['ns3::ObjectFactoryValue'])
     register_Ns3Packet_methods(root_module, root_module['ns3::Packet'])
-    register_Ns3QosTxop_methods(root_module, root_module['ns3::QosTxop'])
-    register_Ns3RegularWifiMac_methods(root_module, root_module['ns3::RegularWifiMac'])
+    register_Ns3ParetoRandomVariable_methods(root_module, root_module['ns3::ParetoRandomVariable'])
     register_Ns3Ssid_methods(root_module, root_module['ns3::Ssid'])
     register_Ns3SsidChecker_methods(root_module, root_module['ns3::SsidChecker'])
     register_Ns3SsidValue_methods(root_module, root_module['ns3::SsidValue'])
@@ -1138,13 +1049,12 @@
     register_Ns3AddressChecker_methods(root_module, root_module['ns3::AddressChecker'])
     register_Ns3AddressValue_methods(root_module, root_module['ns3::AddressValue'])
     register_Ns3BridgeChannel_methods(root_module, root_module['ns3::BridgeChannel'])
+    register_Ns3CallbackImpl__Bool_Const_ns3WifiTxVector___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Bool_Ns3Ptr__lt__ns3NetDevice__gt___Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_short_Const_ns3Address___amp___Const_ns3Address___amp___Ns3NetDevicePacketType_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< bool, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<const ns3::Packet>, unsigned short, const ns3::Address &, const ns3::Address &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Bool_Ns3Ptr__lt__ns3NetDevice__gt___Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_short_Const_ns3Address___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< bool, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<const ns3::Packet>, unsigned short, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3CallbackImpl__Bool_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Ns3ObjectBase___star___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Unsigned_long_Const_ns3WifiTxVector___amp___Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned long long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3CallbackImpl__Unsigned_long_Unsigned_short_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Bool_Ns3Ptr__lt__ns3Packet__gt___Ns3Mac48Address_Ns3Mac48Address_Unsigned_short_Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, bool, ns3::Ptr<ns3::Packet>, ns3::Mac48Address, ns3::Mac48Address, unsigned short, unsigned int, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Const_ns3WifiMacHeader___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, const ns3::WifiMacHeader &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
@@ -1154,20 +1064,15 @@
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3WifiMacQueueItem__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3NetDevice__gt___Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_short_Const_ns3Address___amp___Const_ns3Address___amp___Ns3NetDevicePacketType_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<const ns3::Packet>, unsigned short, const ns3::Address &, const ns3::Address &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3NetDevice__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::NetDevice>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3CallbackImpl__Void_Ns3Time_Ns3Mac48Address_Unsigned_char_Ns3OriginatorBlockAckAgreementState_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Time, ns3::Mac48Address, unsigned char, ns3::OriginatorBlockAckAgreement::State, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3CallbackImpl__Void_Ns3Time_Ns3Time_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Time, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Time_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3WifiMacDropReason_Ns3Ptr__lt__const_ns3WifiMacQueueItem__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Dot11sRouteChange_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::dot11s::RouteChange, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Unsigned_char_Ns3Ptr__lt__const_ns3WifiMacQueueItem__gt___Const_ns3WifiTxVector___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Unsigned_char_Ns3Ptr__lt__const_ns3WifiPsdu__gt___Const_ns3WifiTxVector___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3CallbackImpl__Void_Unsigned_char_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt_____gt_____gt_____gt_____star___Const_stdSet__lt__ns3Mac48Address__stdLess__lt__ns3Mac48Address__gt____stdAllocator__lt__ns3Mac48Address__gt_____gt_____star___Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3CallbackImpl__Void_Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3CallbackImpl__Void_Unsigned_int_Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Unsigned_char_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt____gt____gt____gt_____star___Const_stdSet__lt__ns3Mac48Address__stdLess__lt__ns3Mac48Address__gt____stdAllocator__lt__ns3Mac48Address__gt____gt_____star___Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3Dot11sStack_methods(root_module, root_module['ns3::Dot11sStack'])
     register_Ns3FlameStack_methods(root_module, root_module['ns3::FlameStack'])
     register_Ns3MeshPointDevice_methods(root_module, root_module['ns3::MeshPointDevice'])
-    register_Ns3MeshWifiInterfaceMac_methods(root_module, root_module['ns3::MeshWifiInterfaceMac'])
     register_Ns3HashImplementation_methods(root_module, root_module['ns3::Hash::Implementation'])
     register_Ns3HashFunctionFnv1a_methods(root_module, root_module['ns3::Hash::Function::Fnv1a'])
     register_Ns3HashFunctionHash32_methods(root_module, root_module['ns3::Hash::Function::Hash32'])
@@ -1317,125 +1222,6 @@
     cls.add_instance_attribute('value', 'ns3::Ptr< ns3::AttributeValue >', is_const=False)
     return
 
-def register_Ns3Bar_methods(root_module, cls):
-    ## block-ack-manager.h (module 'wifi'): ns3::Bar::Bar(ns3::Bar const & arg0) [constructor]
-    cls.add_constructor([param('ns3::Bar const &', 'arg0')])
-    ## block-ack-manager.h (module 'wifi'): ns3::Bar::Bar() [constructor]
-    cls.add_constructor([])
-    ## block-ack-manager.h (module 'wifi'): ns3::Bar::Bar(ns3::Ptr<const ns3::WifiMacQueueItem> bar, uint8_t tid, bool skipIfNoDataQueued=false) [constructor]
-    cls.add_constructor([param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'bar'), param('uint8_t', 'tid'), param('bool', 'skipIfNoDataQueued', default_value='false')])
-    ## block-ack-manager.h (module 'wifi'): ns3::Bar::bar [variable]
-    cls.add_instance_attribute('bar', 'ns3::Ptr< ns3::WifiMacQueueItem const >', is_const=False)
-    ## block-ack-manager.h (module 'wifi'): ns3::Bar::skipIfNoDataQueued [variable]
-    cls.add_instance_attribute('skipIfNoDataQueued', 'bool', is_const=False)
-    ## block-ack-manager.h (module 'wifi'): ns3::Bar::tid [variable]
-    cls.add_instance_attribute('tid', 'uint8_t', is_const=False)
-    return
-
-def register_Ns3BlockAckAgreement_methods(root_module, cls):
-    ## block-ack-agreement.h (module 'wifi'): ns3::BlockAckAgreement::BlockAckAgreement(ns3::BlockAckAgreement const & arg0) [constructor]
-    cls.add_constructor([param('ns3::BlockAckAgreement const &', 'arg0')])
-    ## block-ack-agreement.h (module 'wifi'): ns3::BlockAckAgreement::BlockAckAgreement(ns3::Mac48Address peer, uint8_t tid) [constructor]
-    cls.add_constructor([param('ns3::Mac48Address', 'peer'), param('uint8_t', 'tid')])
-    ## block-ack-agreement.h (module 'wifi'): ns3::BlockAckReqType ns3::BlockAckAgreement::GetBlockAckReqType() const [member function]
-    cls.add_method('GetBlockAckReqType', 
-                   'ns3::BlockAckReqType', 
-                   [], 
-                   is_const=True)
-    ## block-ack-agreement.h (module 'wifi'): ns3::BlockAckType ns3::BlockAckAgreement::GetBlockAckType() const [member function]
-    cls.add_method('GetBlockAckType', 
-                   'ns3::BlockAckType', 
-                   [], 
-                   is_const=True)
-    ## block-ack-agreement.h (module 'wifi'): uint16_t ns3::BlockAckAgreement::GetBufferSize() const [member function]
-    cls.add_method('GetBufferSize', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## block-ack-agreement.h (module 'wifi'): static std::size_t ns3::BlockAckAgreement::GetDistance(uint16_t seqNumber, uint16_t startingSeqNumber) [member function]
-    cls.add_method('GetDistance', 
-                   'std::size_t', 
-                   [param('uint16_t', 'seqNumber'), param('uint16_t', 'startingSeqNumber')], 
-                   is_static=True)
-    ## block-ack-agreement.h (module 'wifi'): ns3::Mac48Address ns3::BlockAckAgreement::GetPeer() const [member function]
-    cls.add_method('GetPeer', 
-                   'ns3::Mac48Address', 
-                   [], 
-                   is_const=True)
-    ## block-ack-agreement.h (module 'wifi'): uint16_t ns3::BlockAckAgreement::GetStartingSequence() const [member function]
-    cls.add_method('GetStartingSequence', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## block-ack-agreement.h (module 'wifi'): uint16_t ns3::BlockAckAgreement::GetStartingSequenceControl() const [member function]
-    cls.add_method('GetStartingSequenceControl', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## block-ack-agreement.h (module 'wifi'): uint8_t ns3::BlockAckAgreement::GetTid() const [member function]
-    cls.add_method('GetTid', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## block-ack-agreement.h (module 'wifi'): uint16_t ns3::BlockAckAgreement::GetTimeout() const [member function]
-    cls.add_method('GetTimeout', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## block-ack-agreement.h (module 'wifi'): uint16_t ns3::BlockAckAgreement::GetWinEnd() const [member function]
-    cls.add_method('GetWinEnd', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## block-ack-agreement.h (module 'wifi'): bool ns3::BlockAckAgreement::IsAmsduSupported() const [member function]
-    cls.add_method('IsAmsduSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## block-ack-agreement.h (module 'wifi'): bool ns3::BlockAckAgreement::IsHtSupported() const [member function]
-    cls.add_method('IsHtSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## block-ack-agreement.h (module 'wifi'): bool ns3::BlockAckAgreement::IsImmediateBlockAck() const [member function]
-    cls.add_method('IsImmediateBlockAck', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## block-ack-agreement.h (module 'wifi'): void ns3::BlockAckAgreement::SetAmsduSupport(bool supported) [member function]
-    cls.add_method('SetAmsduSupport', 
-                   'void', 
-                   [param('bool', 'supported')])
-    ## block-ack-agreement.h (module 'wifi'): void ns3::BlockAckAgreement::SetBufferSize(uint16_t bufferSize) [member function]
-    cls.add_method('SetBufferSize', 
-                   'void', 
-                   [param('uint16_t', 'bufferSize')])
-    ## block-ack-agreement.h (module 'wifi'): void ns3::BlockAckAgreement::SetDelayedBlockAck() [member function]
-    cls.add_method('SetDelayedBlockAck', 
-                   'void', 
-                   [])
-    ## block-ack-agreement.h (module 'wifi'): void ns3::BlockAckAgreement::SetHtSupported(bool htSupported) [member function]
-    cls.add_method('SetHtSupported', 
-                   'void', 
-                   [param('bool', 'htSupported')])
-    ## block-ack-agreement.h (module 'wifi'): void ns3::BlockAckAgreement::SetImmediateBlockAck() [member function]
-    cls.add_method('SetImmediateBlockAck', 
-                   'void', 
-                   [])
-    ## block-ack-agreement.h (module 'wifi'): void ns3::BlockAckAgreement::SetStartingSequence(uint16_t seq) [member function]
-    cls.add_method('SetStartingSequence', 
-                   'void', 
-                   [param('uint16_t', 'seq')])
-    ## block-ack-agreement.h (module 'wifi'): void ns3::BlockAckAgreement::SetStartingSequenceControl(uint16_t seq) [member function]
-    cls.add_method('SetStartingSequenceControl', 
-                   'void', 
-                   [param('uint16_t', 'seq')])
-    ## block-ack-agreement.h (module 'wifi'): void ns3::BlockAckAgreement::SetTimeout(uint16_t timeout) [member function]
-    cls.add_method('SetTimeout', 
-                   'void', 
-                   [param('uint16_t', 'timeout')])
-    return
-
 def register_Ns3BlockAckReqType_methods(root_module, cls):
     cls.add_output_stream_operator()
     ## block-ack-type.h (module 'wifi'): ns3::BlockAckReqType::BlockAckReqType(ns3::BlockAckReqType const & arg0) [constructor]
@@ -1460,7 +1246,7 @@
     cls.add_constructor([])
     ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::BlockAckType(ns3::BlockAckType::Variant v) [constructor]
     cls.add_constructor([param('ns3::BlockAckType::Variant', 'v')])
-    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::BlockAckType(ns3::BlockAckType::Variant v, std::vector<unsigned char, std::allocator<unsigned char> > l) [constructor]
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::BlockAckType(ns3::BlockAckType::Variant v, std::vector<unsigned char, std::allocator<unsigned char>> l) [constructor]
     cls.add_constructor([param('ns3::BlockAckType::Variant', 'v'), param('std::vector< unsigned char >', 'l')])
     ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::m_bitmapLen [variable]
     cls.add_instance_attribute('m_bitmapLen', 'std::vector< unsigned char >', is_const=False)
@@ -1468,49 +1254,6 @@
     cls.add_instance_attribute('m_variant', 'ns3::BlockAckType::Variant', is_const=False)
     return
 
-def register_Ns3BlockAckWindow_methods(root_module, cls):
-    ## block-ack-window.h (module 'wifi'): ns3::BlockAckWindow::BlockAckWindow(ns3::BlockAckWindow const & arg0) [constructor]
-    cls.add_constructor([param('ns3::BlockAckWindow const &', 'arg0')])
-    ## block-ack-window.h (module 'wifi'): ns3::BlockAckWindow::BlockAckWindow() [constructor]
-    cls.add_constructor([])
-    ## block-ack-window.h (module 'wifi'): void ns3::BlockAckWindow::Advance(std::size_t count) [member function]
-    cls.add_method('Advance', 
-                   'void', 
-                   [param('std::size_t', 'count')])
-    ## block-ack-window.h (module 'wifi'): std::vector<bool, std::allocator<bool> >::reference ns3::BlockAckWindow::At(std::size_t distance) [member function]
-    cls.add_method('At', 
-                   'std::vector< bool > reference', 
-                   [param('std::size_t', 'distance')])
-    ## block-ack-window.h (module 'wifi'): std::vector<bool, std::allocator<bool> >::const_reference ns3::BlockAckWindow::At(std::size_t distance) const [member function]
-    cls.add_method('At', 
-                   'std::vector< bool > const_reference', 
-                   [param('std::size_t', 'distance')], 
-                   is_const=True)
-    ## block-ack-window.h (module 'wifi'): uint16_t ns3::BlockAckWindow::GetWinEnd() const [member function]
-    cls.add_method('GetWinEnd', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## block-ack-window.h (module 'wifi'): std::size_t ns3::BlockAckWindow::GetWinSize() const [member function]
-    cls.add_method('GetWinSize', 
-                   'std::size_t', 
-                   [], 
-                   is_const=True)
-    ## block-ack-window.h (module 'wifi'): uint16_t ns3::BlockAckWindow::GetWinStart() const [member function]
-    cls.add_method('GetWinStart', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## block-ack-window.h (module 'wifi'): void ns3::BlockAckWindow::Init(uint16_t winStart, uint16_t winSize) [member function]
-    cls.add_method('Init', 
-                   'void', 
-                   [param('uint16_t', 'winStart'), param('uint16_t', 'winSize')])
-    ## block-ack-window.h (module 'wifi'): void ns3::BlockAckWindow::Reset(uint16_t winStart) [member function]
-    cls.add_method('Reset', 
-                   'void', 
-                   [param('uint16_t', 'winStart')])
-    return
-
 def register_Ns3Buffer_methods(root_module, cls):
     ## buffer.h (module 'network'): ns3::Buffer::Buffer(ns3::Buffer const & o) [constructor]
     cls.add_constructor([param('ns3::Buffer const &', 'o')])
@@ -2130,18 +1873,6 @@
                    is_static=True)
     return
 
-def register_Ns3DefaultDeleter__Ns3WifiMacQueueItem_methods(root_module, cls):
-    ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::WifiMacQueueItem>::DefaultDeleter() [constructor]
-    cls.add_constructor([])
-    ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::WifiMacQueueItem>::DefaultDeleter(ns3::DefaultDeleter<ns3::WifiMacQueueItem> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::DefaultDeleter< ns3::WifiMacQueueItem > const &', 'arg0')])
-    ## default-deleter.h (module 'core'): static void ns3::DefaultDeleter<ns3::WifiMacQueueItem>::Delete(ns3::WifiMacQueueItem * object) [member function]
-    cls.add_method('Delete', 
-                   'void', 
-                   [param('ns3::WifiMacQueueItem *', 'object')], 
-                   is_static=True)
-    return
-
 def register_Ns3DefaultDeleter__Ns3Dot11sDestinationAddressUnit_methods(root_module, cls):
     ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::dot11s::DestinationAddressUnit>::DefaultDeleter() [constructor]
     cls.add_constructor([])
@@ -2245,117 +1976,6 @@
                    [])
     return
 
-def register_Ns3HeMuUserInfo_methods(root_module, cls):
-    ## wifi-tx-vector.h (module 'wifi'): ns3::HeMuUserInfo::HeMuUserInfo() [constructor]
-    cls.add_constructor([])
-    ## wifi-tx-vector.h (module 'wifi'): ns3::HeMuUserInfo::HeMuUserInfo(ns3::HeMuUserInfo const & arg0) [constructor]
-    cls.add_constructor([param('ns3::HeMuUserInfo const &', 'arg0')])
-    ## wifi-tx-vector.h (module 'wifi'): ns3::HeMuUserInfo::mcs [variable]
-    cls.add_instance_attribute('mcs', 'ns3::WifiMode', is_const=False)
-    ## wifi-tx-vector.h (module 'wifi'): ns3::HeMuUserInfo::nss [variable]
-    cls.add_instance_attribute('nss', 'uint8_t', is_const=False)
-    ## wifi-tx-vector.h (module 'wifi'): ns3::HeMuUserInfo::ru [variable]
-    cls.add_instance_attribute('ru', 'ns3::HeRu::RuSpec', is_const=False)
-    return
-
-def register_Ns3HeRu_methods(root_module, cls):
-    ## he-ru.h (module 'wifi'): ns3::HeRu::HeRu() [constructor]
-    cls.add_constructor([])
-    ## he-ru.h (module 'wifi'): ns3::HeRu::HeRu(ns3::HeRu const & arg0) [constructor]
-    cls.add_constructor([param('ns3::HeRu const &', 'arg0')])
-    ## he-ru.h (module 'wifi'): static bool ns3::HeRu::DoesOverlap(uint16_t bw, ns3::HeRu::RuSpec ru, std::vector<ns3::HeRu::RuSpec, std::allocator<ns3::HeRu::RuSpec> > const & v) [member function]
-    cls.add_method('DoesOverlap', 
-                   'bool', 
-                   [param('uint16_t', 'bw'), param('ns3::HeRu::RuSpec', 'ru'), param('std::vector< ns3::HeRu::RuSpec > const &', 'v')], 
-                   is_static=True)
-    ## he-ru.h (module 'wifi'): static bool ns3::HeRu::DoesOverlap(uint16_t bw, ns3::HeRu::RuSpec ru, ns3::HeRu::SubcarrierGroup const & toneRanges) [member function]
-    cls.add_method('DoesOverlap', 
-                   'bool', 
-                   [param('uint16_t', 'bw'), param('ns3::HeRu::RuSpec', 'ru'), param('ns3::HeRu::SubcarrierGroup const &', 'toneRanges')], 
-                   is_static=True)
-    ## he-ru.h (module 'wifi'): static ns3::HeRu::RuSpec ns3::HeRu::FindOverlappingRu(uint16_t bw, ns3::HeRu::RuSpec referenceRu, ns3::HeRu::RuType searchedRuType) [member function]
-    cls.add_method('FindOverlappingRu', 
-                   'ns3::HeRu::RuSpec', 
-                   [param('uint16_t', 'bw'), param('ns3::HeRu::RuSpec', 'referenceRu'), param('ns3::HeRu::RuType', 'searchedRuType')], 
-                   is_static=True)
-    ## he-ru.h (module 'wifi'): static uint16_t ns3::HeRu::GetBandwidth(ns3::HeRu::RuType ruType) [member function]
-    cls.add_method('GetBandwidth', 
-                   'uint16_t', 
-                   [param('ns3::HeRu::RuType', 'ruType')], 
-                   is_static=True)
-    ## he-ru.h (module 'wifi'): static std::vector<ns3::HeRu::RuSpec, std::allocator<ns3::HeRu::RuSpec> > ns3::HeRu::GetCentral26TonesRus(uint16_t bw, ns3::HeRu::RuType ruType) [member function]
-    cls.add_method('GetCentral26TonesRus', 
-                   'std::vector< ns3::HeRu::RuSpec >', 
-                   [param('uint16_t', 'bw'), param('ns3::HeRu::RuType', 'ruType')], 
-                   is_static=True)
-    ## he-ru.h (module 'wifi'): static ns3::HeRu::RuType ns3::HeRu::GetEqualSizedRusForStations(uint16_t bandwidth, std::size_t & nStations, std::size_t & nCentral26TonesRus) [member function]
-    cls.add_method('GetEqualSizedRusForStations', 
-                   'ns3::HeRu::RuType', 
-                   [param('uint16_t', 'bandwidth'), param('std::size_t &', 'nStations'), param('std::size_t &', 'nCentral26TonesRus')], 
-                   is_static=True)
-    ## he-ru.h (module 'wifi'): static std::size_t ns3::HeRu::GetNRus(uint16_t bw, ns3::HeRu::RuType ruType) [member function]
-    cls.add_method('GetNRus', 
-                   'std::size_t', 
-                   [param('uint16_t', 'bw'), param('ns3::HeRu::RuType', 'ruType')], 
-                   is_static=True)
-    ## he-ru.h (module 'wifi'): static ns3::HeRu::RuType ns3::HeRu::GetRuType(uint16_t bandwidth) [member function]
-    cls.add_method('GetRuType', 
-                   'ns3::HeRu::RuType', 
-                   [param('uint16_t', 'bandwidth')], 
-                   is_static=True)
-    ## he-ru.h (module 'wifi'): static std::vector<ns3::HeRu::RuSpec, std::allocator<ns3::HeRu::RuSpec> > ns3::HeRu::GetRusOfType(uint16_t bw, ns3::HeRu::RuType ruType) [member function]
-    cls.add_method('GetRusOfType', 
-                   'std::vector< ns3::HeRu::RuSpec >', 
-                   [param('uint16_t', 'bw'), param('ns3::HeRu::RuType', 'ruType')], 
-                   is_static=True)
-    ## he-ru.h (module 'wifi'): static ns3::HeRu::SubcarrierGroup ns3::HeRu::GetSubcarrierGroup(uint16_t bw, ns3::HeRu::RuType ruType, std::size_t phyIndex) [member function]
-    cls.add_method('GetSubcarrierGroup', 
-                   'ns3::HeRu::SubcarrierGroup', 
-                   [param('uint16_t', 'bw'), param('ns3::HeRu::RuType', 'ruType'), param('std::size_t', 'phyIndex')], 
-                   is_static=True)
-    ## he-ru.h (module 'wifi'): ns3::HeRu::m_heRuSubcarrierGroups [variable]
-    cls.add_static_attribute('m_heRuSubcarrierGroups', 'ns3::HeRu::SubcarrierGroups const', is_const=True)
-    return
-
-def register_Ns3HeRuRuSpec_methods(root_module, cls):
-    cls.add_output_stream_operator()
-    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec::RuSpec(ns3::HeRu::RuSpec const & arg0) [constructor]
-    cls.add_constructor([param('ns3::HeRu::RuSpec const &', 'arg0')])
-    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec::RuSpec() [constructor]
-    cls.add_constructor([])
-    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec::RuSpec(ns3::HeRu::RuType ruType, std::size_t index, bool primary80MHz) [constructor]
-    cls.add_constructor([param('ns3::HeRu::RuType', 'ruType'), param('std::size_t', 'index'), param('bool', 'primary80MHz')])
-    ## he-ru.h (module 'wifi'): std::size_t ns3::HeRu::RuSpec::GetIndex() const [member function]
-    cls.add_method('GetIndex', 
-                   'std::size_t', 
-                   [], 
-                   is_const=True)
-    ## he-ru.h (module 'wifi'): std::size_t ns3::HeRu::RuSpec::GetPhyIndex() const [member function]
-    cls.add_method('GetPhyIndex', 
-                   'std::size_t', 
-                   [], 
-                   is_const=True)
-    ## he-ru.h (module 'wifi'): bool ns3::HeRu::RuSpec::GetPrimary80MHz() const [member function]
-    cls.add_method('GetPrimary80MHz', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## he-ru.h (module 'wifi'): ns3::HeRu::RuType ns3::HeRu::RuSpec::GetRuType() const [member function]
-    cls.add_method('GetRuType', 
-                   'ns3::HeRu::RuType', 
-                   [], 
-                   is_const=True)
-    ## he-ru.h (module 'wifi'): bool ns3::HeRu::RuSpec::IsPhyIndexSet() const [member function]
-    cls.add_method('IsPhyIndexSet', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## he-ru.h (module 'wifi'): void ns3::HeRu::RuSpec::SetPhyIndex(uint16_t bw, uint8_t p20Index) [member function]
-    cls.add_method('SetPhyIndex', 
-                   'void', 
-                   [param('uint16_t', 'bw'), param('uint8_t', 'p20Index')])
-    return
-
 def register_Ns3Ipv4Address_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -3029,6 +2649,11 @@
                    'ns3::MeshHelper', 
                    [], 
                    is_static=True)
+    ## mesh-helper.h (module 'mesh'): static void ns3::MeshHelper::EnableLogComponents() [member function]
+    cls.add_method('EnableLogComponents', 
+                   'void', 
+                   [], 
+                   is_static=True)
     ## mesh-helper.h (module 'mesh'): ns3::NetDeviceContainer ns3::MeshHelper::Install(ns3::WifiPhyHelper const & phyHelper, ns3::NodeContainer c) const [member function]
     cls.add_method('Install', 
                    'ns3::NetDeviceContainer', 
@@ -3176,6 +2801,8 @@
     cls.add_constructor([param('ns3::ObjectFactory const &', 'arg0')])
     ## object-factory.h (module 'core'): ns3::ObjectFactory::ObjectFactory() [constructor]
     cls.add_constructor([])
+    ## object-factory.h (module 'core'): ns3::ObjectFactory::ObjectFactory(std::string const & typeId) [constructor]
+    cls.add_constructor([param('std::string const &', 'typeId')])
     ## object-factory.h (module 'core'): ns3::Ptr<ns3::Object> ns3::ObjectFactory::Create() const [member function]
     cls.add_method('Create', 
                    'ns3::Ptr< ns3::Object >', 
@@ -3209,68 +2836,6 @@
                    [param('std::string', 'tid')])
     return
 
-def register_Ns3OriginatorBlockAckAgreement_methods(root_module, cls):
-    ## originator-block-ack-agreement.h (module 'wifi'): ns3::OriginatorBlockAckAgreement::OriginatorBlockAckAgreement(ns3::OriginatorBlockAckAgreement const & arg0) [constructor]
-    cls.add_constructor([param('ns3::OriginatorBlockAckAgreement const &', 'arg0')])
-    ## originator-block-ack-agreement.h (module 'wifi'): ns3::OriginatorBlockAckAgreement::OriginatorBlockAckAgreement(ns3::Mac48Address recipient, uint8_t tid) [constructor]
-    cls.add_constructor([param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')])
-    ## originator-block-ack-agreement.h (module 'wifi'): std::size_t ns3::OriginatorBlockAckAgreement::GetDistance(uint16_t seqNumber) const [member function]
-    cls.add_method('GetDistance', 
-                   'std::size_t', 
-                   [param('uint16_t', 'seqNumber')], 
-                   is_const=True)
-    ## originator-block-ack-agreement.h (module 'wifi'): uint16_t ns3::OriginatorBlockAckAgreement::GetStartingSequence() const [member function]
-    cls.add_method('GetStartingSequence', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## originator-block-ack-agreement.h (module 'wifi'): void ns3::OriginatorBlockAckAgreement::InitTxWindow() [member function]
-    cls.add_method('InitTxWindow', 
-                   'void', 
-                   [])
-    ## originator-block-ack-agreement.h (module 'wifi'): bool ns3::OriginatorBlockAckAgreement::IsEstablished() const [member function]
-    cls.add_method('IsEstablished', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## originator-block-ack-agreement.h (module 'wifi'): bool ns3::OriginatorBlockAckAgreement::IsNoReply() const [member function]
-    cls.add_method('IsNoReply', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## originator-block-ack-agreement.h (module 'wifi'): bool ns3::OriginatorBlockAckAgreement::IsPending() const [member function]
-    cls.add_method('IsPending', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## originator-block-ack-agreement.h (module 'wifi'): bool ns3::OriginatorBlockAckAgreement::IsRejected() const [member function]
-    cls.add_method('IsRejected', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## originator-block-ack-agreement.h (module 'wifi'): bool ns3::OriginatorBlockAckAgreement::IsReset() const [member function]
-    cls.add_method('IsReset', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## originator-block-ack-agreement.h (module 'wifi'): void ns3::OriginatorBlockAckAgreement::NotifyAckedMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('NotifyAckedMpdu', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')])
-    ## originator-block-ack-agreement.h (module 'wifi'): void ns3::OriginatorBlockAckAgreement::NotifyDiscardedMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('NotifyDiscardedMpdu', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')])
-    ## originator-block-ack-agreement.h (module 'wifi'): void ns3::OriginatorBlockAckAgreement::NotifyTransmittedMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('NotifyTransmittedMpdu', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')])
-    ## originator-block-ack-agreement.h (module 'wifi'): void ns3::OriginatorBlockAckAgreement::SetState(ns3::OriginatorBlockAckAgreement::State state) [member function]
-    cls.add_method('SetState', 
-                   'void', 
-                   [param('ns3::OriginatorBlockAckAgreement::State', 'state')])
-    return
-
 def register_Ns3PacketMetadata_methods(root_module, cls):
     ## packet-metadata.h (module 'network'): ns3::PacketMetadata::PacketMetadata(uint64_t uid, uint32_t size) [constructor]
     cls.add_constructor([param('uint64_t', 'uid'), param('uint32_t', 'size')])
@@ -3836,51 +3401,13 @@
     cls.add_constructor([param('ns3::Time const', 'time'), param('ns3::Time::Unit const', 'unit')])
     return
 
-def register_Ns3TracedValue__Unsigned_int_methods(root_module, cls):
-    ## traced-value.h (module 'core'): ns3::TracedValue<unsigned int>::TracedValue() [constructor]
-    cls.add_constructor([])
-    ## traced-value.h (module 'core'): ns3::TracedValue<unsigned int>::TracedValue(ns3::TracedValue<unsigned int> const & o) [constructor]
-    cls.add_constructor([param('ns3::TracedValue< unsigned int > const &', 'o')])
-    ## traced-value.h (module 'core'): ns3::TracedValue<unsigned int>::TracedValue(unsigned int const & v) [constructor]
-    cls.add_constructor([param('unsigned int const &', 'v')])
-    ## traced-value.h (module 'core'): ns3::TracedValue<unsigned int>::TracedValue(ns3::TracedValue<unsigned int> const & other) [constructor]
-    cls.add_constructor([param('ns3::TracedValue< unsigned int > const &', 'other')])
-    ## traced-value.h (module 'core'): ns3::TracedValue<unsigned int>::TracedValue(ns3::TracedValue<unsigned int> const & other) [constructor]
-    cls.add_constructor([param('ns3::TracedValue< unsigned int > const &', 'other')])
-    ## traced-value.h (module 'core'): void ns3::TracedValue<unsigned int>::Connect(ns3::CallbackBase const & cb, std::string path) [member function]
-    cls.add_method('Connect', 
-                   'void', 
-                   [param('ns3::CallbackBase const &', 'cb'), param('std::string', 'path')])
-    ## traced-value.h (module 'core'): void ns3::TracedValue<unsigned int>::ConnectWithoutContext(ns3::CallbackBase const & cb) [member function]
-    cls.add_method('ConnectWithoutContext', 
-                   'void', 
-                   [param('ns3::CallbackBase const &', 'cb')])
-    ## traced-value.h (module 'core'): void ns3::TracedValue<unsigned int>::Disconnect(ns3::CallbackBase const & cb, std::string path) [member function]
-    cls.add_method('Disconnect', 
-                   'void', 
-                   [param('ns3::CallbackBase const &', 'cb'), param('std::string', 'path')])
-    ## traced-value.h (module 'core'): void ns3::TracedValue<unsigned int>::DisconnectWithoutContext(ns3::CallbackBase const & cb) [member function]
-    cls.add_method('DisconnectWithoutContext', 
-                   'void', 
-                   [param('ns3::CallbackBase const &', 'cb')])
-    ## traced-value.h (module 'core'): unsigned int ns3::TracedValue<unsigned int>::Get() const [member function]
-    cls.add_method('Get', 
-                   'unsigned int', 
-                   [], 
-                   is_const=True)
-    ## traced-value.h (module 'core'): void ns3::TracedValue<unsigned int>::Set(unsigned int const & v) [member function]
-    cls.add_method('Set', 
-                   'void', 
-                   [param('unsigned int const &', 'v')])
-    return
-
 def register_Ns3TypeId_methods(root_module, cls):
     cls.add_binary_comparison_operator('==')
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -4213,6 +3740,11 @@
                    'bool', 
                    [param('uint16_t', 'channelWidth'), param('uint8_t', 'nss')], 
                    is_const=True)
+    ## wifi-mode.h (module 'wifi'): bool ns3::WifiMode::IsAllowed(ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('IsAllowed', 
+                   'bool', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True)
     ## wifi-mode.h (module 'wifi'): bool ns3::WifiMode::IsHigherCodeRate(ns3::WifiMode mode) const [member function]
     cls.add_method('IsHigherCodeRate', 
                    'bool', 
@@ -4233,15 +3765,15 @@
 def register_Ns3WifiModeFactory_methods(root_module, cls):
     ## wifi-mode.h (module 'wifi'): ns3::WifiModeFactory::WifiModeFactory(ns3::WifiModeFactory const & arg0) [constructor]
     cls.add_constructor([param('ns3::WifiModeFactory const &', 'arg0')])
-    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMcs(std::string uniqueName, uint8_t mcsValue, ns3::WifiModulationClass modClass, ns3::WifiModeFactory::CodeRateCallback codeRateCallback, ns3::WifiModeFactory::ConstellationSizeCallback constellationSizeCallback, ns3::WifiModeFactory::PhyRateCallback phyRateCallback, ns3::WifiModeFactory::PhyRateFromTxVectorCallback phyRateFromTxVectorCallback, ns3::WifiModeFactory::DataRateCallback dataRateCallback, ns3::WifiModeFactory::DataRateFromTxVectorCallback dataRateFromTxVectorCallback, ns3::WifiModeFactory::NonHtReferenceRateCallback nonHtReferenceRateCallback, ns3::WifiModeFactory::ModeAllowedCallback isModeAllowedCallback) [member function]
+    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMcs(std::string uniqueName, uint8_t mcsValue, ns3::WifiModulationClass modClass, bool isMandatory, ns3::WifiModeFactory::CodeRateCallback codeRateCallback, ns3::WifiModeFactory::ConstellationSizeCallback constellationSizeCallback, ns3::WifiModeFactory::PhyRateCallback phyRateCallback, ns3::WifiModeFactory::DataRateCallback dataRateCallback, ns3::WifiModeFactory::NonHtReferenceRateCallback nonHtReferenceRateCallback, ns3::WifiModeFactory::AllowedCallback isAllowedCallback) [member function]
     cls.add_method('CreateWifiMcs', 
                    'ns3::WifiMode', 
-                   [param('std::string', 'uniqueName'), param('uint8_t', 'mcsValue'), param('ns3::WifiModulationClass', 'modClass'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'codeRateCallback'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'constellationSizeCallback'), param('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateCallback'), param('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateFromTxVectorCallback'), param('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateCallback'), param('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateFromTxVectorCallback'), param('ns3::Callback< unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'nonHtReferenceRateCallback'), param('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'isModeAllowedCallback')], 
+                   [param('std::string', 'uniqueName'), param('uint8_t', 'mcsValue'), param('ns3::WifiModulationClass', 'modClass'), param('bool', 'isMandatory'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'codeRateCallback'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'constellationSizeCallback'), param('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateCallback'), param('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateCallback'), param('ns3::Callback< unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'nonHtReferenceRateCallback'), param('ns3::Callback< bool, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'isAllowedCallback')], 
                    is_static=True)
-    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMode(std::string uniqueName, ns3::WifiModulationClass modClass, bool isMandatory, ns3::WifiModeFactory::CodeRateCallback codeRateCallback, ns3::WifiModeFactory::ConstellationSizeCallback constellationSizeCallback, ns3::WifiModeFactory::PhyRateCallback phyRateCallback, ns3::WifiModeFactory::PhyRateFromTxVectorCallback phyRateFromTxVectorCallback, ns3::WifiModeFactory::DataRateCallback dataRateCallback, ns3::WifiModeFactory::DataRateFromTxVectorCallback dataRateFromTxVectorCallback, ns3::WifiModeFactory::ModeAllowedCallback isModeAllowedCallback) [member function]
+    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMode(std::string uniqueName, ns3::WifiModulationClass modClass, bool isMandatory, ns3::WifiModeFactory::CodeRateCallback codeRateCallback, ns3::WifiModeFactory::ConstellationSizeCallback constellationSizeCallback, ns3::WifiModeFactory::PhyRateCallback phyRateCallback, ns3::WifiModeFactory::DataRateCallback dataRateCallback, ns3::WifiModeFactory::AllowedCallback isAllowedCallback) [member function]
     cls.add_method('CreateWifiMode', 
                    'ns3::WifiMode', 
-                   [param('std::string', 'uniqueName'), param('ns3::WifiModulationClass', 'modClass'), param('bool', 'isMandatory'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'codeRateCallback'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'constellationSizeCallback'), param('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateCallback'), param('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateFromTxVectorCallback'), param('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateCallback'), param('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateFromTxVectorCallback'), param('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'isModeAllowedCallback')], 
+                   [param('std::string', 'uniqueName'), param('ns3::WifiModulationClass', 'modClass'), param('bool', 'isMandatory'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'codeRateCallback'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'constellationSizeCallback'), param('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateCallback'), param('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateCallback'), param('ns3::Callback< bool, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'isAllowedCallback')], 
                    is_static=True)
     return
 
@@ -4319,221 +3851,6 @@
     cls.add_instance_attribute('m_vhtCapabilities', 'ns3::Ptr< ns3::VhtCapabilities const >', is_const=False)
     return
 
-def register_Ns3WifiStandardInfo_methods(root_module, cls):
-    ## wifi-standards.h (module 'wifi'): ns3::WifiStandardInfo::WifiStandardInfo() [constructor]
-    cls.add_constructor([])
-    ## wifi-standards.h (module 'wifi'): ns3::WifiStandardInfo::WifiStandardInfo(ns3::WifiStandardInfo const & arg0) [constructor]
-    cls.add_constructor([param('ns3::WifiStandardInfo const &', 'arg0')])
-    ## wifi-standards.h (module 'wifi'): ns3::WifiStandardInfo::macStandard [variable]
-    cls.add_instance_attribute('macStandard', 'ns3::WifiMacStandard', is_const=False)
-    ## wifi-standards.h (module 'wifi'): ns3::WifiStandardInfo::phyBand [variable]
-    cls.add_instance_attribute('phyBand', 'ns3::WifiPhyBand', is_const=False)
-    ## wifi-standards.h (module 'wifi'): ns3::WifiStandardInfo::phyStandard [variable]
-    cls.add_instance_attribute('phyStandard', 'ns3::WifiPhyStandard', is_const=False)
-    return
-
-def register_Ns3WifiTxVector_methods(root_module, cls):
-    cls.add_output_stream_operator()
-    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector() [constructor]
-    cls.add_constructor([])
-    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector(ns3::WifiMode mode, uint8_t powerLevel, ns3::WifiPreamble preamble, uint16_t guardInterval, uint8_t nTx, uint8_t nss, uint8_t ness, uint16_t channelWidth, bool aggregation, bool stbc=false, bool ldpc=false, uint8_t bssColor=0, uint16_t length=0) [constructor]
-    cls.add_constructor([param('ns3::WifiMode', 'mode'), param('uint8_t', 'powerLevel'), param('ns3::WifiPreamble', 'preamble'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nTx'), param('uint8_t', 'nss'), param('uint8_t', 'ness'), param('uint16_t', 'channelWidth'), param('bool', 'aggregation'), param('bool', 'stbc', default_value='false'), param('bool', 'ldpc', default_value='false'), param('uint8_t', 'bssColor', default_value='0'), param('uint16_t', 'length', default_value='0')])
-    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector(ns3::WifiTxVector const & txVector) [constructor]
-    cls.add_constructor([param('ns3::WifiTxVector const &', 'txVector')])
-    ## wifi-tx-vector.h (module 'wifi'): uint8_t ns3::WifiTxVector::GetBssColor() const [member function]
-    cls.add_method('GetBssColor', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-tx-vector.h (module 'wifi'): uint16_t ns3::WifiTxVector::GetChannelWidth() const [member function]
-    cls.add_method('GetChannelWidth', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-tx-vector.h (module 'wifi'): uint16_t ns3::WifiTxVector::GetGuardInterval() const [member function]
-    cls.add_method('GetGuardInterval', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-tx-vector.h (module 'wifi'): ns3::HeMuUserInfo ns3::WifiTxVector::GetHeMuUserInfo(uint16_t staId) const [member function]
-    cls.add_method('GetHeMuUserInfo', 
-                   'ns3::HeMuUserInfo', 
-                   [param('uint16_t', 'staId')], 
-                   is_const=True)
-    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::HeMuUserInfoMap const & ns3::WifiTxVector::GetHeMuUserInfoMap() const [member function]
-    cls.add_method('GetHeMuUserInfoMap', 
-                   'ns3::WifiTxVector::HeMuUserInfoMap const &', 
-                   [], 
-                   is_const=True)
-    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::HeMuUserInfoMap & ns3::WifiTxVector::GetHeMuUserInfoMap() [member function]
-    cls.add_method('GetHeMuUserInfoMap', 
-                   'ns3::WifiTxVector::HeMuUserInfoMap &', 
-                   [])
-    ## wifi-tx-vector.h (module 'wifi'): uint16_t ns3::WifiTxVector::GetLength() const [member function]
-    cls.add_method('GetLength', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiMode ns3::WifiTxVector::GetMode(uint16_t staId=65535) const [member function]
-    cls.add_method('GetMode', 
-                   'ns3::WifiMode', 
-                   [param('uint16_t', 'staId', default_value='65535')], 
-                   is_const=True)
-    ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::GetModeInitialized() const [member function]
-    cls.add_method('GetModeInitialized', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiModulationClass ns3::WifiTxVector::GetModulationClass() const [member function]
-    cls.add_method('GetModulationClass', 
-                   'ns3::WifiModulationClass', 
-                   [], 
-                   is_const=True)
-    ## wifi-tx-vector.h (module 'wifi'): uint8_t ns3::WifiTxVector::GetNTx() const [member function]
-    cls.add_method('GetNTx', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-tx-vector.h (module 'wifi'): uint8_t ns3::WifiTxVector::GetNess() const [member function]
-    cls.add_method('GetNess', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-tx-vector.h (module 'wifi'): uint8_t ns3::WifiTxVector::GetNss(uint16_t staId=65535) const [member function]
-    cls.add_method('GetNss', 
-                   'uint8_t', 
-                   [param('uint16_t', 'staId', default_value='65535')], 
-                   is_const=True)
-    ## wifi-tx-vector.h (module 'wifi'): uint8_t ns3::WifiTxVector::GetNssMax() const [member function]
-    cls.add_method('GetNssMax', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-tx-vector.h (module 'wifi'): std::pair<unsigned long long, unsigned long long> ns3::WifiTxVector::GetNumRusPerHeSigBContentChannel() const [member function]
-    cls.add_method('GetNumRusPerHeSigBContentChannel', 
-                   'std::pair< unsigned long long, unsigned long long >', 
-                   [], 
-                   is_const=True)
-    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiPreamble ns3::WifiTxVector::GetPreambleType() const [member function]
-    cls.add_method('GetPreambleType', 
-                   'ns3::WifiPreamble', 
-                   [], 
-                   is_const=True)
-    ## wifi-tx-vector.h (module 'wifi'): ns3::HeRu::RuSpec ns3::WifiTxVector::GetRu(uint16_t staId) const [member function]
-    cls.add_method('GetRu', 
-                   'ns3::HeRu::RuSpec', 
-                   [param('uint16_t', 'staId')], 
-                   is_const=True)
-    ## wifi-tx-vector.h (module 'wifi'): uint8_t ns3::WifiTxVector::GetTxPowerLevel() const [member function]
-    cls.add_method('GetTxPowerLevel', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::IsAggregation() const [member function]
-    cls.add_method('IsAggregation', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::IsDlMu() const [member function]
-    cls.add_method('IsDlMu', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::IsLdpc() const [member function]
-    cls.add_method('IsLdpc', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::IsMu() const [member function]
-    cls.add_method('IsMu', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::IsStbc() const [member function]
-    cls.add_method('IsStbc', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::IsUlMu() const [member function]
-    cls.add_method('IsUlMu', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::IsValid() const [member function]
-    cls.add_method('IsValid', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetAggregation(bool aggregation) [member function]
-    cls.add_method('SetAggregation', 
-                   'void', 
-                   [param('bool', 'aggregation')])
-    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetBssColor(uint8_t color) [member function]
-    cls.add_method('SetBssColor', 
-                   'void', 
-                   [param('uint8_t', 'color')])
-    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetChannelWidth(uint16_t channelWidth) [member function]
-    cls.add_method('SetChannelWidth', 
-                   'void', 
-                   [param('uint16_t', 'channelWidth')])
-    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetGuardInterval(uint16_t guardInterval) [member function]
-    cls.add_method('SetGuardInterval', 
-                   'void', 
-                   [param('uint16_t', 'guardInterval')])
-    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetHeMuUserInfo(uint16_t staId, ns3::HeMuUserInfo userInfo) [member function]
-    cls.add_method('SetHeMuUserInfo', 
-                   'void', 
-                   [param('uint16_t', 'staId'), param('ns3::HeMuUserInfo', 'userInfo')])
-    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetLdpc(bool ldpc) [member function]
-    cls.add_method('SetLdpc', 
-                   'void', 
-                   [param('bool', 'ldpc')])
-    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetLength(uint16_t length) [member function]
-    cls.add_method('SetLength', 
-                   'void', 
-                   [param('uint16_t', 'length')])
-    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetMode(ns3::WifiMode mode) [member function]
-    cls.add_method('SetMode', 
-                   'void', 
-                   [param('ns3::WifiMode', 'mode')])
-    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetMode(ns3::WifiMode mode, uint16_t staId) [member function]
-    cls.add_method('SetMode', 
-                   'void', 
-                   [param('ns3::WifiMode', 'mode'), param('uint16_t', 'staId')])
-    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetNTx(uint8_t nTx) [member function]
-    cls.add_method('SetNTx', 
-                   'void', 
-                   [param('uint8_t', 'nTx')])
-    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetNess(uint8_t ness) [member function]
-    cls.add_method('SetNess', 
-                   'void', 
-                   [param('uint8_t', 'ness')])
-    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetNss(uint8_t nss) [member function]
-    cls.add_method('SetNss', 
-                   'void', 
-                   [param('uint8_t', 'nss')])
-    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetNss(uint8_t nss, uint16_t staId) [member function]
-    cls.add_method('SetNss', 
-                   'void', 
-                   [param('uint8_t', 'nss'), param('uint16_t', 'staId')])
-    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetPreambleType(ns3::WifiPreamble preamble) [member function]
-    cls.add_method('SetPreambleType', 
-                   'void', 
-                   [param('ns3::WifiPreamble', 'preamble')])
-    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetRu(ns3::HeRu::RuSpec ru, uint16_t staId) [member function]
-    cls.add_method('SetRu', 
-                   'void', 
-                   [param('ns3::HeRu::RuSpec', 'ru'), param('uint16_t', 'staId')])
-    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetStbc(bool stbc) [member function]
-    cls.add_method('SetStbc', 
-                   'void', 
-                   [param('bool', 'stbc')])
-    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetTxPowerLevel(uint8_t powerlevel) [member function]
-    cls.add_method('SetTxPowerLevel', 
-                   'void', 
-                   [param('uint8_t', 'powerlevel')])
-    return
-
 def register_Ns3Empty_methods(root_module, cls):
     ## empty.h (module 'core'): ns3::empty::empty() [constructor]
     cls.add_constructor([])
@@ -4551,14 +3868,14 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('>=')
     cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_unary_numeric_operator('-')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
     cls.add_constructor([])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(double const value) [constructor]
@@ -4577,6 +3894,8 @@
     cls.add_constructor([param('long unsigned int const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int const v) [constructor]
     cls.add_constructor([param('long long unsigned int const', 'v')])
+    ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int128_t const v) [constructor]
+    cls.add_constructor([param('int128_t const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t const hi, uint64_t const lo) [constructor]
     cls.add_constructor([param('int64_t const', 'hi'), param('uint64_t const', 'lo')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [constructor]
@@ -5659,101 +4978,177 @@
                    [])
     return
 
+def register_Ns3RandomVariableStream_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::RandomVariableStream::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::RandomVariableStream::RandomVariableStream() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): void ns3::RandomVariableStream::SetStream(int64_t stream) [member function]
+    cls.add_method('SetStream', 
+                   'void', 
+                   [param('int64_t', 'stream')])
+    ## random-variable-stream.h (module 'core'): int64_t ns3::RandomVariableStream::GetStream() const [member function]
+    cls.add_method('GetStream', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): void ns3::RandomVariableStream::SetAntithetic(bool isAntithetic) [member function]
+    cls.add_method('SetAntithetic', 
+                   'void', 
+                   [param('bool', 'isAntithetic')])
+    ## random-variable-stream.h (module 'core'): bool ns3::RandomVariableStream::IsAntithetic() const [member function]
+    cls.add_method('IsAntithetic', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::RandomVariableStream::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::RandomVariableStream::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## random-variable-stream.h (module 'core'): ns3::RngStream * ns3::RandomVariableStream::Peek() const [member function]
+    cls.add_method('Peek', 
+                   'ns3::RngStream *', 
+                   [], 
+                   is_const=True, visibility='protected')
+    return
+
+def register_Ns3SequentialRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::SequentialRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::SequentialRandomVariable::SequentialRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): double ns3::SequentialRandomVariable::GetMin() const [member function]
+    cls.add_method('GetMin', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::SequentialRandomVariable::GetMax() const [member function]
+    cls.add_method('GetMax', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): ns3::Ptr<ns3::RandomVariableStream> ns3::SequentialRandomVariable::GetIncrement() const [member function]
+    cls.add_method('GetIncrement', 
+                   'ns3::Ptr< ns3::RandomVariableStream >', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::SequentialRandomVariable::GetConsecutive() const [member function]
+    cls.add_method('GetConsecutive', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::SequentialRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::SequentialRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_virtual=True)
+    return
+
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3MeshWifiInterfaceMacPlugin_Ns3Empty_Ns3DefaultDeleter__lt__ns3MeshWifiInterfaceMacPlugin__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MeshWifiInterfaceMacPlugin, ns3::empty, ns3::DefaultDeleter<ns3::MeshWifiInterfaceMacPlugin> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MeshWifiInterfaceMacPlugin, ns3::empty, ns3::DefaultDeleter<ns3::MeshWifiInterfaceMacPlugin>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MeshWifiInterfaceMacPlugin, ns3::empty, ns3::DefaultDeleter<ns3::MeshWifiInterfaceMacPlugin> >::SimpleRefCount(ns3::SimpleRefCount<ns3::MeshWifiInterfaceMacPlugin, ns3::empty, ns3::DefaultDeleter<ns3::MeshWifiInterfaceMacPlugin> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MeshWifiInterfaceMacPlugin, ns3::empty, ns3::DefaultDeleter<ns3::MeshWifiInterfaceMacPlugin>>::SimpleRefCount(ns3::SimpleRefCount<ns3::MeshWifiInterfaceMacPlugin, ns3::empty, ns3::DefaultDeleter<ns3::MeshWifiInterfaceMacPlugin>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::MeshWifiInterfaceMacPlugin, ns3::empty, ns3::DefaultDeleter< ns3::MeshWifiInterfaceMacPlugin > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3WifiInformationElement_Ns3Empty_Ns3DefaultDeleter__lt__ns3WifiInformationElement__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement> >::SimpleRefCount(ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement>>::SimpleRefCount(ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter< ns3::WifiInformationElement > > const &', 'o')])
     return
 
-def register_Ns3SimpleRefCount__Ns3WifiMacQueueItem_Ns3Empty_Ns3DefaultDeleter__lt__ns3WifiMacQueueItem__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiMacQueueItem, ns3::empty, ns3::DefaultDeleter<ns3::WifiMacQueueItem> >::SimpleRefCount() [constructor]
-    cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiMacQueueItem, ns3::empty, ns3::DefaultDeleter<ns3::WifiMacQueueItem> >::SimpleRefCount(ns3::SimpleRefCount<ns3::WifiMacQueueItem, ns3::empty, ns3::DefaultDeleter<ns3::WifiMacQueueItem> > const & o) [constructor]
-    cls.add_constructor([param('ns3::SimpleRefCount< ns3::WifiMacQueueItem, ns3::empty, ns3::DefaultDeleter< ns3::WifiMacQueueItem > > const &', 'o')])
-    return
-
 def register_Ns3SimpleRefCount__Ns3Dot11sDestinationAddressUnit_Ns3Empty_Ns3DefaultDeleter__lt__ns3Dot11sDestinationAddressUnit__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::dot11s::DestinationAddressUnit, ns3::empty, ns3::DefaultDeleter<ns3::dot11s::DestinationAddressUnit> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::dot11s::DestinationAddressUnit, ns3::empty, ns3::DefaultDeleter<ns3::dot11s::DestinationAddressUnit>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::dot11s::DestinationAddressUnit, ns3::empty, ns3::DefaultDeleter<ns3::dot11s::DestinationAddressUnit> >::SimpleRefCount(ns3::SimpleRefCount<ns3::dot11s::DestinationAddressUnit, ns3::empty, ns3::DefaultDeleter<ns3::dot11s::DestinationAddressUnit> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::dot11s::DestinationAddressUnit, ns3::empty, ns3::DefaultDeleter<ns3::dot11s::DestinationAddressUnit>>::SimpleRefCount(ns3::SimpleRefCount<ns3::dot11s::DestinationAddressUnit, ns3::empty, ns3::DefaultDeleter<ns3::dot11s::DestinationAddressUnit>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::dot11s::DestinationAddressUnit, ns3::empty, ns3::DefaultDeleter< ns3::dot11s::DestinationAddressUnit > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Dot11sIeBeaconTimingUnit_Ns3Empty_Ns3DefaultDeleter__lt__ns3Dot11sIeBeaconTimingUnit__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::dot11s::IeBeaconTimingUnit, ns3::empty, ns3::DefaultDeleter<ns3::dot11s::IeBeaconTimingUnit> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::dot11s::IeBeaconTimingUnit, ns3::empty, ns3::DefaultDeleter<ns3::dot11s::IeBeaconTimingUnit>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::dot11s::IeBeaconTimingUnit, ns3::empty, ns3::DefaultDeleter<ns3::dot11s::IeBeaconTimingUnit> >::SimpleRefCount(ns3::SimpleRefCount<ns3::dot11s::IeBeaconTimingUnit, ns3::empty, ns3::DefaultDeleter<ns3::dot11s::IeBeaconTimingUnit> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::dot11s::IeBeaconTimingUnit, ns3::empty, ns3::DefaultDeleter<ns3::dot11s::IeBeaconTimingUnit>>::SimpleRefCount(ns3::SimpleRefCount<ns3::dot11s::IeBeaconTimingUnit, ns3::empty, ns3::DefaultDeleter<ns3::dot11s::IeBeaconTimingUnit>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::dot11s::IeBeaconTimingUnit, ns3::empty, ns3::DefaultDeleter< ns3::dot11s::IeBeaconTimingUnit > > const &', 'o')])
     return
 
@@ -5822,198 +5217,128 @@
                    is_const=True, is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3Txop_methods(root_module, cls):
-    ## txop.h (module 'wifi'): ns3::Txop::Txop() [constructor]
-    cls.add_constructor([])
-    ## txop.h (module 'wifi'): ns3::Txop::Txop(ns3::Ptr<ns3::WifiMacQueue> queue) [constructor]
-    cls.add_constructor([param('ns3::Ptr< ns3::WifiMacQueue >', 'queue')])
-    ## txop.h (module 'wifi'): static ns3::TypeId ns3::Txop::GetTypeId() [member function]
+def register_Ns3TriangularRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::TriangularRandomVariable::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## txop.h (module 'wifi'): bool ns3::Txop::IsQosTxop() const [member function]
-    cls.add_method('IsQosTxop', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::SetChannelAccessManager(ns3::Ptr<ns3::ChannelAccessManager> const manager) [member function]
-    cls.add_method('SetChannelAccessManager', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::ChannelAccessManager > const', 'manager')])
-    ## txop.h (module 'wifi'): void ns3::Txop::SetWifiMac(ns3::Ptr<ns3::RegularWifiMac> const mac) [member function]
-    cls.add_method('SetWifiMac', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::RegularWifiMac > const', 'mac')], 
-                   is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::SetTxMiddle(ns3::Ptr<ns3::MacTxMiddle> const txMiddle) [member function]
-    cls.add_method('SetTxMiddle', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::MacTxMiddle > const', 'txMiddle')])
-    ## txop.h (module 'wifi'): void ns3::Txop::SetDroppedMpduCallback(ns3::Txop::DroppedMpdu callback) [member function]
-    cls.add_method('SetDroppedMpduCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::WifiMacDropReason, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
-                   is_virtual=True)
-    ## txop.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueue> ns3::Txop::GetWifiMacQueue() const [member function]
-    cls.add_method('GetWifiMacQueue', 
-                   'ns3::Ptr< ns3::WifiMacQueue >', 
+    ## random-variable-stream.h (module 'core'): ns3::TriangularRandomVariable::TriangularRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): double ns3::TriangularRandomVariable::GetMean() const [member function]
+    cls.add_method('GetMean', 
+                   'double', 
                    [], 
                    is_const=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::SetMinCw(uint32_t minCw) [member function]
-    cls.add_method('SetMinCw', 
-                   'void', 
-                   [param('uint32_t', 'minCw')])
-    ## txop.h (module 'wifi'): void ns3::Txop::SetMaxCw(uint32_t maxCw) [member function]
-    cls.add_method('SetMaxCw', 
-                   'void', 
-                   [param('uint32_t', 'maxCw')])
-    ## txop.h (module 'wifi'): void ns3::Txop::SetAifsn(uint8_t aifsn) [member function]
-    cls.add_method('SetAifsn', 
-                   'void', 
-                   [param('uint8_t', 'aifsn')])
-    ## txop.h (module 'wifi'): void ns3::Txop::SetTxopLimit(ns3::Time txopLimit) [member function]
-    cls.add_method('SetTxopLimit', 
-                   'void', 
-                   [param('ns3::Time', 'txopLimit')])
-    ## txop.h (module 'wifi'): uint32_t ns3::Txop::GetMinCw() const [member function]
-    cls.add_method('GetMinCw', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## txop.h (module 'wifi'): uint32_t ns3::Txop::GetMaxCw() const [member function]
-    cls.add_method('GetMaxCw', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## txop.h (module 'wifi'): uint8_t ns3::Txop::GetAifsn() const [member function]
-    cls.add_method('GetAifsn', 
-                   'uint8_t', 
+    ## random-variable-stream.h (module 'core'): double ns3::TriangularRandomVariable::GetMin() const [member function]
+    cls.add_method('GetMin', 
+                   'double', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## txop.h (module 'wifi'): ns3::Time ns3::Txop::GetTxopLimit() const [member function]
-    cls.add_method('GetTxopLimit', 
-                   'ns3::Time', 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::TriangularRandomVariable::GetMax() const [member function]
+    cls.add_method('GetMax', 
+                   'double', 
                    [], 
                    is_const=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::ResetCw() [member function]
-    cls.add_method('ResetCw', 
-                   'void', 
-                   [])
-    ## txop.h (module 'wifi'): void ns3::Txop::UpdateFailedCw() [member function]
-    cls.add_method('UpdateFailedCw', 
-                   'void', 
-                   [])
-    ## txop.h (module 'wifi'): void ns3::Txop::NotifyChannelSwitching() [member function]
-    cls.add_method('NotifyChannelSwitching', 
-                   'void', 
+    ## random-variable-stream.h (module 'core'): double ns3::TriangularRandomVariable::GetValue(double mean, double min, double max) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('double', 'mean'), param('double', 'min'), param('double', 'max')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::TriangularRandomVariable::GetInteger(uint32_t mean, uint32_t min, uint32_t max) [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [param('uint32_t', 'mean'), param('uint32_t', 'min'), param('uint32_t', 'max')])
+    ## random-variable-stream.h (module 'core'): double ns3::TriangularRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
                    [], 
                    is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::NotifySleep() [member function]
-    cls.add_method('NotifySleep', 
-                   'void', 
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::TriangularRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
                    [], 
                    is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::NotifyOff() [member function]
-    cls.add_method('NotifyOff', 
-                   'void', 
+    return
+
+def register_Ns3UniformRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::UniformRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::NotifyWakeUp() [member function]
-    cls.add_method('NotifyWakeUp', 
-                   'void', 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::UniformRandomVariable::UniformRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): double ns3::UniformRandomVariable::GetMin() const [member function]
+    cls.add_method('GetMin', 
+                   'double', 
                    [], 
-                   is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::NotifyOn() [member function]
-    cls.add_method('NotifyOn', 
-                   'void', 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::UniformRandomVariable::GetMax() const [member function]
+    cls.add_method('GetMax', 
+                   'double', 
                    [], 
-                   is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::Queue(ns3::Ptr<ns3::Packet> packet, ns3::WifiMacHeader const & hdr) [member function]
-    cls.add_method('Queue', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::WifiMacHeader const &', 'hdr')], 
-                   is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::NotifyChannelAccessed(ns3::Time txopDuration=ns3::Seconds(0)) [member function]
-    cls.add_method('NotifyChannelAccessed', 
-                   'void', 
-                   [param('ns3::Time', 'txopDuration', default_value='ns3::Seconds(0)')], 
-                   is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::NotifyChannelReleased() [member function]
-    cls.add_method('NotifyChannelReleased', 
-                   'void', 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::UniformRandomVariable::GetValue(double min, double max) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('double', 'min'), param('double', 'max')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::UniformRandomVariable::GetInteger(uint32_t min, uint32_t max) [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [param('uint32_t', 'min'), param('uint32_t', 'max')])
+    ## random-variable-stream.h (module 'core'): double ns3::UniformRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
                    [], 
                    is_virtual=True)
-    ## txop.h (module 'wifi'): int64_t ns3::Txop::AssignStreams(int64_t stream) [member function]
-    cls.add_method('AssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'stream')])
-    ## txop.h (module 'wifi'): ns3::Txop::ChannelAccessStatus ns3::Txop::GetAccessStatus() const [member function]
-    cls.add_method('GetAccessStatus', 
-                   'ns3::Txop::ChannelAccessStatus', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::StartBackoffNow(uint32_t nSlots) [member function]
-    cls.add_method('StartBackoffNow', 
-                   'void', 
-                   [param('uint32_t', 'nSlots')])
-    ## txop.h (module 'wifi'): ns3::Txop::Txop(ns3::Txop const & arg0) [constructor]
-    cls.add_constructor([param('ns3::Txop const &', 'arg0')])
-    ## txop.h (module 'wifi'): void ns3::Txop::DoDispose() [member function]
-    cls.add_method('DoDispose', 
-                   'void', 
-                   [], 
-                   is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): void ns3::Txop::DoInitialize() [member function]
-    cls.add_method('DoInitialize', 
-                   'void', 
-                   [], 
-                   is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): void ns3::Txop::NotifyAccessRequested() [member function]
-    cls.add_method('NotifyAccessRequested', 
-                   'void', 
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::UniformRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
                    [], 
-                   is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): bool ns3::Txop::HasFramesToTransmit() [member function]
-    cls.add_method('HasFramesToTransmit', 
-                   'bool', 
+                   is_virtual=True)
+    return
+
+def register_Ns3WeibullRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::WeibullRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): void ns3::Txop::GenerateBackoff() [member function]
-    cls.add_method('GenerateBackoff', 
-                   'void', 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::WeibullRandomVariable::WeibullRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): double ns3::WeibullRandomVariable::GetScale() const [member function]
+    cls.add_method('GetScale', 
+                   'double', 
                    [], 
-                   is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): void ns3::Txop::StartAccessIfNeeded() [member function]
-    cls.add_method('StartAccessIfNeeded', 
-                   'void', 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::WeibullRandomVariable::GetShape() const [member function]
+    cls.add_method('GetShape', 
+                   'double', 
                    [], 
-                   is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): void ns3::Txop::RequestAccess() [member function]
-    cls.add_method('RequestAccess', 
-                   'void', 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::WeibullRandomVariable::GetBound() const [member function]
+    cls.add_method('GetBound', 
+                   'double', 
                    [], 
-                   visibility='protected')
-    ## txop.h (module 'wifi'): uint32_t ns3::Txop::GetCw() const [member function]
-    cls.add_method('GetCw', 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::WeibullRandomVariable::GetValue(double scale, double shape, double bound) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('double', 'scale'), param('double', 'shape'), param('double', 'bound')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::WeibullRandomVariable::GetInteger(uint32_t scale, uint32_t shape, uint32_t bound) [member function]
+    cls.add_method('GetInteger', 
                    'uint32_t', 
+                   [param('uint32_t', 'scale'), param('uint32_t', 'shape'), param('uint32_t', 'bound')])
+    ## random-variable-stream.h (module 'core'): double ns3::WeibullRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
                    [], 
-                   is_const=True, visibility='protected')
-    ## txop.h (module 'wifi'): uint32_t ns3::Txop::GetBackoffSlots() const [member function]
-    cls.add_method('GetBackoffSlots', 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::WeibullRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
                    'uint32_t', 
                    [], 
-                   is_const=True, visibility='protected')
-    ## txop.h (module 'wifi'): ns3::Time ns3::Txop::GetBackoffStart() const [member function]
-    cls.add_method('GetBackoffStart', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True, visibility='protected')
-    ## txop.h (module 'wifi'): void ns3::Txop::UpdateBackoffSlotsNow(uint32_t nSlots, ns3::Time backoffUpdateBound) [member function]
-    cls.add_method('UpdateBackoffSlotsNow', 
-                   'void', 
-                   [param('uint32_t', 'nSlots'), param('ns3::Time', 'backoffUpdateBound')], 
-                   visibility='protected')
+                   is_virtual=True)
     return
 
 def register_Ns3WifiActionHeader_methods(root_module, cls):
@@ -6207,687 +5532,318 @@
     return
 
 def register_Ns3WifiMac_methods(root_module, cls):
+    ## wifi-mac.h (module 'wifi'): static ns3::TypeId ns3::WifiMac::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## wifi-mac.h (module 'wifi'): ns3::WifiMac::WifiMac() [constructor]
     cls.add_constructor([])
-    ## wifi-mac.h (module 'wifi'): ns3::WifiMac::WifiMac(ns3::WifiMac const & arg0) [constructor]
-    cls.add_constructor([param('ns3::WifiMac const &', 'arg0')])
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::ConfigureStandard(ns3::WifiStandard standard) [member function]
-    cls.add_method('ConfigureStandard', 
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetDevice(ns3::Ptr<ns3::WifiNetDevice> const device) [member function]
+    cls.add_method('SetDevice', 
                    'void', 
-                   [param('ns3::WifiStandard', 'standard')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::DoDispose() [member function]
-    cls.add_method('DoDispose', 
+                   [param('ns3::Ptr< ns3::WifiNetDevice > const', 'device')])
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiNetDevice> ns3::WifiMac::GetDevice() const [member function]
+    cls.add_method('GetDevice', 
+                   'ns3::Ptr< ns3::WifiNetDevice >', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::FrameExchangeManager> ns3::WifiMac::GetFrameExchangeManager() const [member function]
+    cls.add_method('GetFrameExchangeManager', 
+                   'ns3::Ptr< ns3::FrameExchangeManager >', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::Txop> ns3::WifiMac::GetTxop() const [member function]
+    cls.add_method('GetTxop', 
+                   'ns3::Ptr< ns3::Txop >', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::WifiMac::GetQosTxop(ns3::AcIndex ac) const [member function]
+    cls.add_method('GetQosTxop', 
+                   'ns3::Ptr< ns3::QosTxop >', 
+                   [param('ns3::AcIndex', 'ac')], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::WifiMac::GetQosTxop(uint8_t tid) const [member function]
+    cls.add_method('GetQosTxop', 
+                   'ns3::Ptr< ns3::QosTxop >', 
+                   [param('uint8_t', 'tid')], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueue> ns3::WifiMac::GetTxopQueue(ns3::AcIndex ac) const [member function]
+    cls.add_method('GetTxopQueue', 
+                   'ns3::Ptr< ns3::WifiMacQueue >', 
+                   [param('ns3::AcIndex', 'ac')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetTypeOfStation(ns3::TypeOfStation type) [member function]
+    cls.add_method('SetTypeOfStation', 
                    'void', 
+                   [param('ns3::TypeOfStation', 'type')])
+    ## wifi-mac.h (module 'wifi'): ns3::TypeOfStation ns3::WifiMac::GetTypeOfStation() const [member function]
+    cls.add_method('GetTypeOfStation', 
+                   'ns3::TypeOfStation', 
                    [], 
-                   is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to, ns3::Mac48Address from) [member function]
-    cls.add_method('Enqueue', 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetSsid(ns3::Ssid ssid) [member function]
+    cls.add_method('SetSsid', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to'), param('ns3::Mac48Address', 'from')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to) [member function]
-    cls.add_method('Enqueue', 
+                   [param('ns3::Ssid', 'ssid')])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetPromisc() [member function]
+    cls.add_method('SetPromisc', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to')], 
-                   is_pure_virtual=True, is_virtual=True)
+                   [])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetCtsToSelfSupported(bool enable) [member function]
+    cls.add_method('SetCtsToSelfSupported', 
+                   'void', 
+                   [param('bool', 'enable')])
     ## wifi-mac.h (module 'wifi'): ns3::Mac48Address ns3::WifiMac::GetAddress() const [member function]
     cls.add_method('GetAddress', 
                    'ns3::Mac48Address', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): ns3::Mac48Address ns3::WifiMac::GetBssid() const [member function]
-    cls.add_method('GetBssid', 
-                   'ns3::Mac48Address', 
-                   [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::NetDevice> ns3::WifiMac::GetDevice() const [member function]
-    cls.add_method('GetDevice', 
-                   'ns3::Ptr< ns3::NetDevice >', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::HeConfiguration> ns3::WifiMac::GetHeConfiguration() const [member function]
-    cls.add_method('GetHeConfiguration', 
-                   'ns3::Ptr< ns3::HeConfiguration >', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::HtConfiguration> ns3::WifiMac::GetHtConfiguration() const [member function]
-    cls.add_method('GetHtConfiguration', 
-                   'ns3::Ptr< ns3::HtConfiguration >', 
-                   [], 
                    is_const=True)
-    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::GetShortSlotTimeSupported() const [member function]
-    cls.add_method('GetShortSlotTimeSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## wifi-mac.h (module 'wifi'): ns3::Ssid ns3::WifiMac::GetSsid() const [member function]
     cls.add_method('GetSsid', 
                    'ns3::Ssid', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): static ns3::TypeId ns3::WifiMac::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## wifi-mac.h (module 'wifi'): ns3::TypeOfStation ns3::WifiMac::GetTypeOfStation() const [member function]
-    cls.add_method('GetTypeOfStation', 
-                   'ns3::TypeOfStation', 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetAddress(ns3::Mac48Address address) [member function]
+    cls.add_method('SetAddress', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Mac48Address ns3::WifiMac::GetBssid() const [member function]
+    cls.add_method('GetBssid', 
+                   'ns3::Mac48Address', 
                    [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetBssid(ns3::Mac48Address bssid) [member function]
+    cls.add_method('SetBssid', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'bssid')])
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::CanForwardPacketsTo(ns3::Mac48Address to) const [member function]
+    cls.add_method('CanForwardPacketsTo', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'to')], 
                    is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::VhtConfiguration> ns3::WifiMac::GetVhtConfiguration() const [member function]
-    cls.add_method('GetVhtConfiguration', 
-                   'ns3::Ptr< ns3::VhtConfiguration >', 
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to, ns3::Mac48Address from) [member function]
+    cls.add_method('Enqueue', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to'), param('ns3::Mac48Address', 'from')], 
+                   is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to) [member function]
+    cls.add_method('Enqueue', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::SupportsSendFrom() const [member function]
+    cls.add_method('SupportsSendFrom', 
+                   'bool', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetWifiPhy(ns3::Ptr<ns3::WifiPhy> phy) [member function]
+    cls.add_method('SetWifiPhy', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPhy >', 'phy')], 
+                   is_virtual=True)
     ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiPhy> ns3::WifiMac::GetWifiPhy() const [member function]
     cls.add_method('GetWifiPhy', 
                    'ns3::Ptr< ns3::WifiPhy >', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiRemoteStationManager> ns3::WifiMac::GetWifiRemoteStationManager() const [member function]
-    cls.add_method('GetWifiRemoteStationManager', 
-                   'ns3::Ptr< ns3::WifiRemoteStationManager >', 
-                   [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyPromiscRx(ns3::Ptr<const ns3::Packet> packet) [member function]
-    cls.add_method('NotifyPromiscRx', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyRx(ns3::Ptr<const ns3::Packet> packet) [member function]
-    cls.add_method('NotifyRx', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyRxDrop(ns3::Ptr<const ns3::Packet> packet) [member function]
-    cls.add_method('NotifyRxDrop', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyTx(ns3::Ptr<const ns3::Packet> packet) [member function]
-    cls.add_method('NotifyTx', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyTxDrop(ns3::Ptr<const ns3::Packet> packet) [member function]
-    cls.add_method('NotifyTxDrop', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+                   is_const=True)
     ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::ResetWifiPhy() [member function]
     cls.add_method('ResetWifiPhy', 
                    'void', 
-                   [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetAddress(ns3::Mac48Address address) [member function]
-    cls.add_method('SetAddress', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetDevice(ns3::Ptr<ns3::NetDevice> const device) [member function]
-    cls.add_method('SetDevice', 
+                   [])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetWifiRemoteStationManager(ns3::Ptr<ns3::WifiRemoteStationManager> stationManager) [member function]
+    cls.add_method('SetWifiRemoteStationManager', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NetDevice > const', 'device')])
+                   [param('ns3::Ptr< ns3::WifiRemoteStationManager >', 'stationManager')])
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiRemoteStationManager> ns3::WifiMac::GetWifiRemoteStationManager() const [member function]
+    cls.add_method('GetWifiRemoteStationManager', 
+                   'ns3::Ptr< ns3::WifiRemoteStationManager >', 
+                   [], 
+                   is_const=True)
     ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetForwardUpCallback(ns3::WifiMac::ForwardUpCallback upCallback) [member function]
     cls.add_method('SetForwardUpCallback', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'upCallback')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetLinkDownCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkDown) [member function]
-    cls.add_method('SetLinkDownCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkDown')], 
-                   is_pure_virtual=True, is_virtual=True)
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'upCallback')])
     ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetLinkUpCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkUp) [member function]
     cls.add_method('SetLinkUpCallback', 
                    'void', 
                    [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkUp')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetPromisc() [member function]
-    cls.add_method('SetPromisc', 
+                   is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetLinkDownCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkDown) [member function]
+    cls.add_method('SetLinkDownCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkDown')])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyChannelSwitching() [member function]
+    cls.add_method('NotifyChannelSwitching', 
                    'void', 
                    [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetShortSlotTimeSupported(bool enable) [member function]
-    cls.add_method('SetShortSlotTimeSupported', 
+                   is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyTx(ns3::Ptr<const ns3::Packet> packet) [member function]
+    cls.add_method('NotifyTx', 
                    'void', 
-                   [param('bool', 'enable')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetSsid(ns3::Ssid ssid) [member function]
-    cls.add_method('SetSsid', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyTxDrop(ns3::Ptr<const ns3::Packet> packet) [member function]
+    cls.add_method('NotifyTxDrop', 
                    'void', 
-                   [param('ns3::Ssid', 'ssid')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetTypeOfStation(ns3::TypeOfStation type) [member function]
-    cls.add_method('SetTypeOfStation', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyRx(ns3::Ptr<const ns3::Packet> packet) [member function]
+    cls.add_method('NotifyRx', 
                    'void', 
-                   [param('ns3::TypeOfStation', 'type')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetWifiPhy(ns3::Ptr<ns3::WifiPhy> phy) [member function]
-    cls.add_method('SetWifiPhy', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyPromiscRx(ns3::Ptr<const ns3::Packet> packet) [member function]
+    cls.add_method('NotifyPromiscRx', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiPhy >', 'phy')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetWifiRemoteStationManager(ns3::Ptr<ns3::WifiRemoteStationManager> stationManager) [member function]
-    cls.add_method('SetWifiRemoteStationManager', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyRxDrop(ns3::Ptr<const ns3::Packet> packet) [member function]
+    cls.add_method('NotifyRxDrop', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiRemoteStationManager >', 'stationManager')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::SupportsSendFrom() const [member function]
-    cls.add_method('SupportsSendFrom', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::ConfigureDcf(ns3::Ptr<ns3::Txop> dcf, uint32_t cwmin, uint32_t cwmax, bool isDsss, ns3::AcIndex ac) [member function]
-    cls.add_method('ConfigureDcf', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::ConfigureStandard(ns3::WifiStandard standard) [member function]
+    cls.add_method('ConfigureStandard', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Txop >', 'dcf'), param('uint32_t', 'cwmin'), param('uint32_t', 'cwmax'), param('bool', 'isDsss'), param('ns3::AcIndex', 'ac')], 
-                   visibility='protected')
-    return
-
-def register_Ns3WifiMacHeader_methods(root_module, cls):
-    ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacHeader::WifiMacHeader(ns3::WifiMacHeader const & arg0) [constructor]
-    cls.add_constructor([param('ns3::WifiMacHeader const &', 'arg0')])
-    ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacHeader::WifiMacHeader() [constructor]
-    cls.add_constructor([])
-    ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacHeader::WifiMacHeader(ns3::WifiMacType type) [constructor]
-    cls.add_constructor([param('ns3::WifiMacType', 'type')])
-    ## wifi-mac-header.h (module 'wifi'): uint32_t ns3::WifiMacHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
-    cls.add_method('Deserialize', 
-                   'uint32_t', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
+                   [param('ns3::WifiStandard', 'standard')], 
                    is_virtual=True)
-    ## wifi-mac-header.h (module 'wifi'): ns3::Mac48Address ns3::WifiMacHeader::GetAddr1() const [member function]
-    cls.add_method('GetAddr1', 
-                   'ns3::Mac48Address', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): ns3::Mac48Address ns3::WifiMacHeader::GetAddr2() const [member function]
-    cls.add_method('GetAddr2', 
-                   'ns3::Mac48Address', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): ns3::Mac48Address ns3::WifiMacHeader::GetAddr3() const [member function]
-    cls.add_method('GetAddr3', 
-                   'ns3::Mac48Address', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): ns3::Mac48Address ns3::WifiMacHeader::GetAddr4() const [member function]
-    cls.add_method('GetAddr4', 
-                   'ns3::Mac48Address', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): ns3::Time ns3::WifiMacHeader::GetDuration() const [member function]
-    cls.add_method('GetDuration', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): uint8_t ns3::WifiMacHeader::GetFragmentNumber() const [member function]
-    cls.add_method('GetFragmentNumber', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): ns3::TypeId ns3::WifiMacHeader::GetInstanceTypeId() const [member function]
-    cls.add_method('GetInstanceTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacHeader::QosAckPolicy ns3::WifiMacHeader::GetQosAckPolicy() const [member function]
-    cls.add_method('GetQosAckPolicy', 
-                   'ns3::WifiMacHeader::QosAckPolicy', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): uint8_t ns3::WifiMacHeader::GetQosQueueSize() const [member function]
-    cls.add_method('GetQosQueueSize', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): uint8_t ns3::WifiMacHeader::GetQosTid() const [member function]
-    cls.add_method('GetQosTid', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): uint16_t ns3::WifiMacHeader::GetRawDuration() const [member function]
-    cls.add_method('GetRawDuration', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): uint16_t ns3::WifiMacHeader::GetSequenceControl() const [member function]
-    cls.add_method('GetSequenceControl', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): uint16_t ns3::WifiMacHeader::GetSequenceNumber() const [member function]
-    cls.add_method('GetSequenceNumber', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): uint32_t ns3::WifiMacHeader::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-mac-header.h (module 'wifi'): uint32_t ns3::WifiMacHeader::GetSize() const [member function]
-    cls.add_method('GetSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacType ns3::WifiMacHeader::GetType() const [member function]
-    cls.add_method('GetType', 
-                   'ns3::WifiMacType', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): static ns3::TypeId ns3::WifiMacHeader::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## wifi-mac-header.h (module 'wifi'): char const * ns3::WifiMacHeader::GetTypeString() const [member function]
-    cls.add_method('GetTypeString', 
-                   'char const *', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::HasData() const [member function]
-    cls.add_method('HasData', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsAck() const [member function]
-    cls.add_method('IsAck', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsAction() const [member function]
-    cls.add_method('IsAction', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsAssocReq() const [member function]
-    cls.add_method('IsAssocReq', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsAssocResp() const [member function]
-    cls.add_method('IsAssocResp', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsAuthentication() const [member function]
-    cls.add_method('IsAuthentication', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsBeacon() const [member function]
-    cls.add_method('IsBeacon', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsBlockAck() const [member function]
-    cls.add_method('IsBlockAck', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsBlockAckReq() const [member function]
-    cls.add_method('IsBlockAckReq', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsCfAck() const [member function]
-    cls.add_method('IsCfAck', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsCfEnd() const [member function]
-    cls.add_method('IsCfEnd', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsCfPoll() const [member function]
-    cls.add_method('IsCfPoll', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsCtl() const [member function]
-    cls.add_method('IsCtl', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsCts() const [member function]
-    cls.add_method('IsCts', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsData() const [member function]
-    cls.add_method('IsData', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsDeauthentication() const [member function]
-    cls.add_method('IsDeauthentication', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsDisassociation() const [member function]
-    cls.add_method('IsDisassociation', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsFromDs() const [member function]
-    cls.add_method('IsFromDs', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsMgt() const [member function]
-    cls.add_method('IsMgt', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsMoreFragments() const [member function]
-    cls.add_method('IsMoreFragments', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsMultihopAction() const [member function]
-    cls.add_method('IsMultihopAction', 
-                   'bool', 
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::HtConfiguration> ns3::WifiMac::GetHtConfiguration() const [member function]
+    cls.add_method('GetHtConfiguration', 
+                   'ns3::Ptr< ns3::HtConfiguration >', 
                    [], 
                    is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsProbeReq() const [member function]
-    cls.add_method('IsProbeReq', 
-                   'bool', 
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::VhtConfiguration> ns3::WifiMac::GetVhtConfiguration() const [member function]
+    cls.add_method('GetVhtConfiguration', 
+                   'ns3::Ptr< ns3::VhtConfiguration >', 
                    [], 
                    is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsProbeResp() const [member function]
-    cls.add_method('IsProbeResp', 
-                   'bool', 
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::HeConfiguration> ns3::WifiMac::GetHeConfiguration() const [member function]
+    cls.add_method('GetHeConfiguration', 
+                   'ns3::Ptr< ns3::HeConfiguration >', 
                    [], 
                    is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsQosAck() const [member function]
-    cls.add_method('IsQosAck', 
-                   'bool', 
+    ## wifi-mac.h (module 'wifi'): ns3::ExtendedCapabilities ns3::WifiMac::GetExtendedCapabilities() const [member function]
+    cls.add_method('GetExtendedCapabilities', 
+                   'ns3::ExtendedCapabilities', 
                    [], 
                    is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsQosAmsdu() const [member function]
-    cls.add_method('IsQosAmsdu', 
-                   'bool', 
+    ## wifi-mac.h (module 'wifi'): ns3::HtCapabilities ns3::WifiMac::GetHtCapabilities() const [member function]
+    cls.add_method('GetHtCapabilities', 
+                   'ns3::HtCapabilities', 
                    [], 
                    is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsQosBlockAck() const [member function]
-    cls.add_method('IsQosBlockAck', 
-                   'bool', 
+    ## wifi-mac.h (module 'wifi'): ns3::VhtCapabilities ns3::WifiMac::GetVhtCapabilities() const [member function]
+    cls.add_method('GetVhtCapabilities', 
+                   'ns3::VhtCapabilities', 
                    [], 
                    is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsQosData() const [member function]
-    cls.add_method('IsQosData', 
-                   'bool', 
+    ## wifi-mac.h (module 'wifi'): ns3::HeCapabilities ns3::WifiMac::GetHeCapabilities() const [member function]
+    cls.add_method('GetHeCapabilities', 
+                   'ns3::HeCapabilities', 
                    [], 
                    is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsQosEosp() const [member function]
-    cls.add_method('IsQosEosp', 
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::GetQosSupported() const [member function]
+    cls.add_method('GetQosSupported', 
                    'bool', 
                    [], 
                    is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsQosNoAck() const [member function]
-    cls.add_method('IsQosNoAck', 
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::GetErpSupported() const [member function]
+    cls.add_method('GetErpSupported', 
                    'bool', 
                    [], 
                    is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsReassocReq() const [member function]
-    cls.add_method('IsReassocReq', 
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::GetDsssSupported() const [member function]
+    cls.add_method('GetDsssSupported', 
                    'bool', 
                    [], 
                    is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsReassocResp() const [member function]
-    cls.add_method('IsReassocResp', 
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::GetHtSupported() const [member function]
+    cls.add_method('GetHtSupported', 
                    'bool', 
                    [], 
                    is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsRetry() const [member function]
-    cls.add_method('IsRetry', 
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::GetVhtSupported() const [member function]
+    cls.add_method('GetVhtSupported', 
                    'bool', 
                    [], 
                    is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsRts() const [member function]
-    cls.add_method('IsRts', 
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::GetHeSupported() const [member function]
+    cls.add_method('GetHeSupported', 
                    'bool', 
                    [], 
                    is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsToDs() const [member function]
-    cls.add_method('IsToDs', 
-                   'bool', 
-                   [], 
+    ## wifi-mac.h (module 'wifi'): uint32_t ns3::WifiMac::GetMaxAmpduSize(ns3::AcIndex ac) const [member function]
+    cls.add_method('GetMaxAmpduSize', 
+                   'uint32_t', 
+                   [param('ns3::AcIndex', 'ac')], 
                    is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsTrigger() const [member function]
-    cls.add_method('IsTrigger', 
-                   'bool', 
-                   [], 
+    ## wifi-mac.h (module 'wifi'): uint16_t ns3::WifiMac::GetMaxAmsduSize(ns3::AcIndex ac) const [member function]
+    cls.add_method('GetMaxAmsduSize', 
+                   'uint16_t', 
+                   [param('ns3::AcIndex', 'ac')], 
                    is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::Print(std::ostream & os) const [member function]
-    cls.add_method('Print', 
-                   'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('Serialize', 
-                   'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetAddr1(ns3::Mac48Address address) [member function]
-    cls.add_method('SetAddr1', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'address')])
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetAddr2(ns3::Mac48Address address) [member function]
-    cls.add_method('SetAddr2', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'address')])
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetAddr3(ns3::Mac48Address address) [member function]
-    cls.add_method('SetAddr3', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'address')])
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetAddr4(ns3::Mac48Address address) [member function]
-    cls.add_method('SetAddr4', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'address')])
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetDsFrom() [member function]
-    cls.add_method('SetDsFrom', 
-                   'void', 
-                   [])
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetDsNotFrom() [member function]
-    cls.add_method('SetDsNotFrom', 
-                   'void', 
-                   [])
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetDsNotTo() [member function]
-    cls.add_method('SetDsNotTo', 
-                   'void', 
-                   [])
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetDsTo() [member function]
-    cls.add_method('SetDsTo', 
-                   'void', 
-                   [])
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetDuration(ns3::Time duration) [member function]
-    cls.add_method('SetDuration', 
-                   'void', 
-                   [param('ns3::Time', 'duration')])
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetFragmentNumber(uint8_t frag) [member function]
-    cls.add_method('SetFragmentNumber', 
-                   'void', 
-                   [param('uint8_t', 'frag')])
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetId(uint16_t id) [member function]
-    cls.add_method('SetId', 
-                   'void', 
-                   [param('uint16_t', 'id')])
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetMoreFragments() [member function]
-    cls.add_method('SetMoreFragments', 
-                   'void', 
-                   [])
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetNoMoreFragments() [member function]
-    cls.add_method('SetNoMoreFragments', 
-                   'void', 
-                   [])
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetNoOrder() [member function]
-    cls.add_method('SetNoOrder', 
-                   'void', 
-                   [])
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetNoRetry() [member function]
-    cls.add_method('SetNoRetry', 
-                   'void', 
-                   [])
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetOrder() [member function]
-    cls.add_method('SetOrder', 
-                   'void', 
-                   [])
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosAckPolicy(ns3::WifiMacHeader::QosAckPolicy policy) [member function]
-    cls.add_method('SetQosAckPolicy', 
-                   'void', 
-                   [param('ns3::WifiMacHeader::QosAckPolicy', 'policy')])
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosAmsdu() [member function]
-    cls.add_method('SetQosAmsdu', 
-                   'void', 
-                   [])
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosEosp() [member function]
-    cls.add_method('SetQosEosp', 
-                   'void', 
-                   [])
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosMeshControlPresent() [member function]
-    cls.add_method('SetQosMeshControlPresent', 
-                   'void', 
-                   [])
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosNoAmsdu() [member function]
-    cls.add_method('SetQosNoAmsdu', 
-                   'void', 
-                   [])
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosNoEosp() [member function]
-    cls.add_method('SetQosNoEosp', 
-                   'void', 
-                   [])
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosNoMeshControlPresent() [member function]
-    cls.add_method('SetQosNoMeshControlPresent', 
-                   'void', 
-                   [])
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosQueueSize(uint8_t size) [member function]
-    cls.add_method('SetQosQueueSize', 
-                   'void', 
-                   [param('uint8_t', 'size')])
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosTid(uint8_t tid) [member function]
-    cls.add_method('SetQosTid', 
-                   'void', 
-                   [param('uint8_t', 'tid')])
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosTxopLimit(uint8_t txop) [member function]
-    cls.add_method('SetQosTxopLimit', 
-                   'void', 
-                   [param('uint8_t', 'txop')])
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetRawDuration(uint16_t duration) [member function]
-    cls.add_method('SetRawDuration', 
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
                    'void', 
-                   [param('uint16_t', 'duration')])
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetRetry() [member function]
-    cls.add_method('SetRetry', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::DoDispose() [member function]
+    cls.add_method('DoDispose', 
                    'void', 
-                   [])
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetSequenceNumber(uint16_t seq) [member function]
-    cls.add_method('SetSequenceNumber', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::ConfigureContentionWindow(uint32_t cwMin, uint32_t cwMax) [member function]
+    cls.add_method('ConfigureContentionWindow', 
                    'void', 
-                   [param('uint16_t', 'seq')])
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetType(ns3::WifiMacType type, bool resetToDsFromDs=true) [member function]
-    cls.add_method('SetType', 
+                   [param('uint32_t', 'cwMin'), param('uint32_t', 'cwMax')], 
+                   is_virtual=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetQosSupported(bool enable) [member function]
+    cls.add_method('SetQosSupported', 
                    'void', 
-                   [param('ns3::WifiMacType', 'type'), param('bool', 'resetToDsFromDs', default_value='true')])
-    return
-
-def register_Ns3WifiMacQueueItem_methods(root_module, cls):
-    cls.add_output_stream_operator()
-    ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem::WifiMacQueueItem(ns3::WifiMacQueueItem const & arg0) [constructor]
-    cls.add_constructor([param('ns3::WifiMacQueueItem const &', 'arg0')])
-    ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem::WifiMacQueueItem(ns3::Ptr<const ns3::Packet> p, ns3::WifiMacHeader const & header) [constructor]
-    cls.add_constructor([param('ns3::Ptr< ns3::Packet const >', 'p'), param('ns3::WifiMacHeader const &', 'header')])
-    ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem::WifiMacQueueItem(ns3::Ptr<const ns3::Packet> p, ns3::WifiMacHeader const & header, ns3::Time tstamp) [constructor]
-    cls.add_constructor([param('ns3::Ptr< ns3::Packet const >', 'p'), param('ns3::WifiMacHeader const &', 'header'), param('ns3::Time', 'tstamp')])
-    ## wifi-mac-queue-item.h (module 'wifi'): void ns3::WifiMacQueueItem::Aggregate(ns3::Ptr<const ns3::WifiMacQueueItem> msdu) [member function]
-    cls.add_method('Aggregate', 
+                   [param('bool', 'enable')], 
+                   visibility='protected')
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetShortSlotTimeSupported(bool enable) [member function]
+    cls.add_method('SetShortSlotTimeSupported', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'msdu')])
-    ## wifi-mac-queue-item.h (module 'wifi'): ns3::Mac48Address ns3::WifiMacQueueItem::GetDestinationAddress() const [member function]
-    cls.add_method('GetDestinationAddress', 
-                   'ns3::Mac48Address', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacHeader const & ns3::WifiMacQueueItem::GetHeader() const [member function]
-    cls.add_method('GetHeader', 
-                   'ns3::WifiMacHeader const &', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacHeader & ns3::WifiMacQueueItem::GetHeader() [member function]
-    cls.add_method('GetHeader', 
-                   'ns3::WifiMacHeader &', 
-                   [])
-    ## wifi-mac-queue-item.h (module 'wifi'): ns3::Ptr<const ns3::Packet> ns3::WifiMacQueueItem::GetPacket() const [member function]
-    cls.add_method('GetPacket', 
-                   'ns3::Ptr< ns3::Packet const >', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-queue-item.h (module 'wifi'): uint32_t ns3::WifiMacQueueItem::GetPacketSize() const [member function]
-    cls.add_method('GetPacketSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-queue-item.h (module 'wifi'): ns3::Ptr<ns3::Packet> ns3::WifiMacQueueItem::GetProtocolDataUnit() const [member function]
-    cls.add_method('GetProtocolDataUnit', 
-                   'ns3::Ptr< ns3::Packet >', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-queue-item.h (module 'wifi'): ns3::AcIndex ns3::WifiMacQueueItem::GetQueueAc() const [member function]
-    cls.add_method('GetQueueAc', 
-                   'ns3::AcIndex', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem::ConstIterator ns3::WifiMacQueueItem::GetQueueIterator() const [member function]
-    cls.add_method('GetQueueIterator', 
-                   'ns3::WifiMacQueueItem::ConstIterator', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-queue-item.h (module 'wifi'): uint32_t ns3::WifiMacQueueItem::GetSize() const [member function]
-    cls.add_method('GetSize', 
-                   'uint32_t', 
+                   [param('bool', 'enable')], 
+                   visibility='protected')
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::GetShortSlotTimeSupported() const [member function]
+    cls.add_method('GetShortSlotTimeSupported', 
+                   'bool', 
                    [], 
-                   is_const=True)
-    ## wifi-mac-queue-item.h (module 'wifi'): ns3::Time ns3::WifiMacQueueItem::GetTimeStamp() const [member function]
-    cls.add_method('GetTimeStamp', 
-                   'ns3::Time', 
+                   is_const=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::WifiMac::GetVOQueue() const [member function]
+    cls.add_method('GetVOQueue', 
+                   'ns3::Ptr< ns3::QosTxop >', 
                    [], 
-                   is_const=True)
-    ## wifi-mac-queue-item.h (module 'wifi'): bool ns3::WifiMacQueueItem::IsFragment() const [member function]
-    cls.add_method('IsFragment', 
-                   'bool', 
+                   is_const=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::WifiMac::GetVIQueue() const [member function]
+    cls.add_method('GetVIQueue', 
+                   'ns3::Ptr< ns3::QosTxop >', 
                    [], 
-                   is_const=True)
-    ## wifi-mac-queue-item.h (module 'wifi'): bool ns3::WifiMacQueueItem::IsInFlight() const [member function]
-    cls.add_method('IsInFlight', 
-                   'bool', 
+                   is_const=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::WifiMac::GetBEQueue() const [member function]
+    cls.add_method('GetBEQueue', 
+                   'ns3::Ptr< ns3::QosTxop >', 
                    [], 
-                   is_const=True)
-    ## wifi-mac-queue-item.h (module 'wifi'): bool ns3::WifiMacQueueItem::IsQueued() const [member function]
-    cls.add_method('IsQueued', 
-                   'bool', 
+                   is_const=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::WifiMac::GetBKQueue() const [member function]
+    cls.add_method('GetBKQueue', 
+                   'ns3::Ptr< ns3::QosTxop >', 
                    [], 
-                   is_const=True)
-    ## wifi-mac-queue-item.h (module 'wifi'): void ns3::WifiMacQueueItem::Print(std::ostream & os) const [member function]
-    cls.add_method('Print', 
+                   is_const=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::Receive(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('Receive', 
                    'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-mac-queue-item.h (module 'wifi'): void ns3::WifiMacQueueItem::ResetInFlight() [member function]
-    cls.add_method('ResetInFlight', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
+                   is_virtual=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::ForwardUp(ns3::Ptr<const ns3::Packet> packet, ns3::Mac48Address from, ns3::Mac48Address to) [member function]
+    cls.add_method('ForwardUp', 
                    'void', 
-                   [])
-    ## wifi-mac-queue-item.h (module 'wifi'): void ns3::WifiMacQueueItem::SetInFlight() [member function]
-    cls.add_method('SetInFlight', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::Mac48Address', 'from'), param('ns3::Mac48Address', 'to')], 
+                   visibility='protected')
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::DeaggregateAmsduAndForward(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('DeaggregateAmsduAndForward', 
                    'void', 
-                   [])
-    ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem::DeaggregatedMsdusCI ns3::WifiMacQueueItem::begin() [member function]
-    cls.add_method('begin', 
-                   'ns3::WifiMacQueueItem::DeaggregatedMsdusCI', 
-                   [])
-    ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem::DeaggregatedMsdusCI ns3::WifiMacQueueItem::end() [member function]
-    cls.add_method('end', 
-                   'ns3::WifiMacQueueItem::DeaggregatedMsdusCI', 
-                   [])
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
+                   is_virtual=True, visibility='protected')
     return
 
 def register_Ns3WifiRemoteStationManager_methods(root_module, cls):
@@ -7522,68 +6478,75 @@
                    is_virtual=True, visibility='private')
     return
 
-def register_Ns3AmsduSubframeHeader_methods(root_module, cls):
-    ## amsdu-subframe-header.h (module 'wifi'): ns3::AmsduSubframeHeader::AmsduSubframeHeader(ns3::AmsduSubframeHeader const & arg0) [constructor]
-    cls.add_constructor([param('ns3::AmsduSubframeHeader const &', 'arg0')])
-    ## amsdu-subframe-header.h (module 'wifi'): ns3::AmsduSubframeHeader::AmsduSubframeHeader() [constructor]
-    cls.add_constructor([])
-    ## amsdu-subframe-header.h (module 'wifi'): uint32_t ns3::AmsduSubframeHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
-    cls.add_method('Deserialize', 
-                   'uint32_t', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_virtual=True)
-    ## amsdu-subframe-header.h (module 'wifi'): ns3::Mac48Address ns3::AmsduSubframeHeader::GetDestinationAddr() const [member function]
-    cls.add_method('GetDestinationAddr', 
-                   'ns3::Mac48Address', 
-                   [], 
-                   is_const=True)
-    ## amsdu-subframe-header.h (module 'wifi'): ns3::TypeId ns3::AmsduSubframeHeader::GetInstanceTypeId() const [member function]
-    cls.add_method('GetInstanceTypeId', 
+def register_Ns3ZetaRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::ZetaRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## amsdu-subframe-header.h (module 'wifi'): uint16_t ns3::AmsduSubframeHeader::GetLength() const [member function]
-    cls.add_method('GetLength', 
-                   'uint16_t', 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::ZetaRandomVariable::ZetaRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): double ns3::ZetaRandomVariable::GetAlpha() const [member function]
+    cls.add_method('GetAlpha', 
+                   'double', 
                    [], 
                    is_const=True)
-    ## amsdu-subframe-header.h (module 'wifi'): uint32_t ns3::AmsduSubframeHeader::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
+    ## random-variable-stream.h (module 'core'): double ns3::ZetaRandomVariable::GetValue(double alpha) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('double', 'alpha')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ZetaRandomVariable::GetInteger(uint32_t alpha) [member function]
+    cls.add_method('GetInteger', 
                    'uint32_t', 
+                   [param('uint32_t', 'alpha')])
+    ## random-variable-stream.h (module 'core'): double ns3::ZetaRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## amsdu-subframe-header.h (module 'wifi'): ns3::Mac48Address ns3::AmsduSubframeHeader::GetSourceAddr() const [member function]
-    cls.add_method('GetSourceAddr', 
-                   'ns3::Mac48Address', 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ZetaRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
                    [], 
-                   is_const=True)
-    ## amsdu-subframe-header.h (module 'wifi'): static ns3::TypeId ns3::AmsduSubframeHeader::GetTypeId() [member function]
+                   is_virtual=True)
+    return
+
+def register_Ns3ZipfRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::ZipfRandomVariable::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## amsdu-subframe-header.h (module 'wifi'): void ns3::AmsduSubframeHeader::Print(std::ostream & os) const [member function]
-    cls.add_method('Print', 
-                   'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_const=True, is_virtual=True)
-    ## amsdu-subframe-header.h (module 'wifi'): void ns3::AmsduSubframeHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('Serialize', 
-                   'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True, is_virtual=True)
-    ## amsdu-subframe-header.h (module 'wifi'): void ns3::AmsduSubframeHeader::SetDestinationAddr(ns3::Mac48Address to) [member function]
-    cls.add_method('SetDestinationAddr', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'to')])
-    ## amsdu-subframe-header.h (module 'wifi'): void ns3::AmsduSubframeHeader::SetLength(uint16_t length) [member function]
-    cls.add_method('SetLength', 
-                   'void', 
-                   [param('uint16_t', 'length')])
-    ## amsdu-subframe-header.h (module 'wifi'): void ns3::AmsduSubframeHeader::SetSourceAddr(ns3::Mac48Address to) [member function]
-    cls.add_method('SetSourceAddr', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'to')])
+    ## random-variable-stream.h (module 'core'): ns3::ZipfRandomVariable::ZipfRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ZipfRandomVariable::GetN() const [member function]
+    cls.add_method('GetN', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::ZipfRandomVariable::GetAlpha() const [member function]
+    cls.add_method('GetAlpha', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::ZipfRandomVariable::GetValue(uint32_t n, double alpha) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('uint32_t', 'n'), param('double', 'alpha')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ZipfRandomVariable::GetInteger(uint32_t n, uint32_t alpha) [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [param('uint32_t', 'n'), param('uint32_t', 'alpha')])
+    ## random-variable-stream.h (module 'core'): double ns3::ZipfRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ZipfRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_virtual=True)
     return
 
 def register_Ns3AttributeAccessor_methods(root_module, cls):
@@ -7677,161 +6640,6 @@
                    is_const=True, is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3BlockAckManager_methods(root_module, cls):
-    ## block-ack-manager.h (module 'wifi'): static ns3::TypeId ns3::BlockAckManager::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## block-ack-manager.h (module 'wifi'): ns3::BlockAckManager::BlockAckManager() [constructor]
-    cls.add_constructor([])
-    ## block-ack-manager.h (module 'wifi'): bool ns3::BlockAckManager::ExistsAgreement(ns3::Mac48Address recipient, uint8_t tid) const [member function]
-    cls.add_method('ExistsAgreement', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
-                   is_const=True)
-    ## block-ack-manager.h (module 'wifi'): bool ns3::BlockAckManager::ExistsAgreementInState(ns3::Mac48Address recipient, uint8_t tid, ns3::OriginatorBlockAckAgreement::State state) const [member function]
-    cls.add_method('ExistsAgreementInState', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid'), param('ns3::OriginatorBlockAckAgreement::State', 'state')], 
-                   is_const=True)
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::CreateAgreement(ns3::MgtAddBaRequestHeader const * reqHdr, ns3::Mac48Address recipient, bool htSupported=true) [member function]
-    cls.add_method('CreateAgreement', 
-                   'void', 
-                   [param('ns3::MgtAddBaRequestHeader const *', 'reqHdr'), param('ns3::Mac48Address', 'recipient'), param('bool', 'htSupported', default_value='true')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::DestroyAgreement(ns3::Mac48Address recipient, uint8_t tid) [member function]
-    cls.add_method('DestroyAgreement', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::UpdateAgreement(ns3::MgtAddBaResponseHeader const * respHdr, ns3::Mac48Address recipient, uint16_t startingSeq) [member function]
-    cls.add_method('UpdateAgreement', 
-                   'void', 
-                   [param('ns3::MgtAddBaResponseHeader const *', 'respHdr'), param('ns3::Mac48Address', 'recipient'), param('uint16_t', 'startingSeq')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::StorePacket(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('StorePacket', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')])
-    ## block-ack-manager.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::BlockAckManager::GetBar(bool remove=true, uint8_t tid=8, ns3::Mac48Address recipient=ns3::Mac48Address::GetBroadcast()) [member function]
-    cls.add_method('GetBar', 
-                   'ns3::Ptr< ns3::WifiMacQueueItem const >', 
-                   [param('bool', 'remove', default_value='true'), param('uint8_t', 'tid', default_value='8'), param('ns3::Mac48Address', 'recipient', default_value='ns3::Mac48Address::GetBroadcast()')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyGotAck(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('NotifyGotAck', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyMissedAck(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('NotifyMissedAck', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')])
-    ## block-ack-manager.h (module 'wifi'): std::pair<unsigned short, unsigned short> ns3::BlockAckManager::NotifyGotBlockAck(ns3::CtrlBAckResponseHeader const & blockAck, ns3::Mac48Address recipient, std::set<unsigned char, std::less<unsigned char>, std::allocator<unsigned char> > const & tids, size_t index=0) [member function]
-    cls.add_method('NotifyGotBlockAck', 
-                   'std::pair< unsigned short, unsigned short >', 
-                   [param('ns3::CtrlBAckResponseHeader const &', 'blockAck'), param('ns3::Mac48Address', 'recipient'), param('std::set< unsigned char > const &', 'tids'), param('size_t', 'index', default_value='0')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyMissedBlockAck(ns3::Mac48Address recipient, uint8_t tid) [member function]
-    cls.add_method('NotifyMissedBlockAck', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')])
-    ## block-ack-manager.h (module 'wifi'): uint32_t ns3::BlockAckManager::GetNBufferedPackets(ns3::Mac48Address recipient, uint8_t tid) const [member function]
-    cls.add_method('GetNBufferedPackets', 
-                   'uint32_t', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
-                   is_const=True)
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyAgreementEstablished(ns3::Mac48Address recipient, uint8_t tid, uint16_t startingSeq) [member function]
-    cls.add_method('NotifyAgreementEstablished', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid'), param('uint16_t', 'startingSeq')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyAgreementRejected(ns3::Mac48Address recipient, uint8_t tid) [member function]
-    cls.add_method('NotifyAgreementRejected', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyAgreementNoReply(ns3::Mac48Address recipient, uint8_t tid) [member function]
-    cls.add_method('NotifyAgreementNoReply', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyAgreementReset(ns3::Mac48Address recipient, uint8_t tid) [member function]
-    cls.add_method('NotifyAgreementReset', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetBlockAckThreshold(uint8_t nPackets) [member function]
-    cls.add_method('SetBlockAckThreshold', 
-                   'void', 
-                   [param('uint8_t', 'nPackets')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetQueue(ns3::Ptr<ns3::WifiMacQueue> const queue) [member function]
-    cls.add_method('SetQueue', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueue > const', 'queue')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetBlockAckInactivityCallback(ns3::Callback<void, ns3::Mac48Address, unsigned char, bool, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
-    cls.add_method('SetBlockAckInactivityCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::Mac48Address, unsigned char, bool, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetBlockDestinationCallback(ns3::Callback<void, ns3::Mac48Address, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
-    cls.add_method('SetBlockDestinationCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::Mac48Address, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetUnblockDestinationCallback(ns3::Callback<void, ns3::Mac48Address, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
-    cls.add_method('SetUnblockDestinationCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::Mac48Address, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## block-ack-manager.h (module 'wifi'): bool ns3::BlockAckManager::SwitchToBlockAckIfNeeded(ns3::Mac48Address recipient, uint8_t tid, uint16_t startingSeq) [member function]
-    cls.add_method('SwitchToBlockAckIfNeeded', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid'), param('uint16_t', 'startingSeq')])
-    ## block-ack-manager.h (module 'wifi'): bool ns3::BlockAckManager::NeedBarRetransmission(uint8_t tid, ns3::Mac48Address recipient) [member function]
-    cls.add_method('NeedBarRetransmission', 
-                   'bool', 
-                   [param('uint8_t', 'tid'), param('ns3::Mac48Address', 'recipient')])
-    ## block-ack-manager.h (module 'wifi'): uint16_t ns3::BlockAckManager::GetRecipientBufferSize(ns3::Mac48Address recipient, uint8_t tid) const [member function]
-    cls.add_method('GetRecipientBufferSize', 
-                   'uint16_t', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
-                   is_const=True)
-    ## block-ack-manager.h (module 'wifi'): ns3::BlockAckReqType ns3::BlockAckManager::GetBlockAckReqType(ns3::Mac48Address recipient, uint8_t tid) const [member function]
-    cls.add_method('GetBlockAckReqType', 
-                   'ns3::BlockAckReqType', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
-                   is_const=True)
-    ## block-ack-manager.h (module 'wifi'): ns3::BlockAckType ns3::BlockAckManager::GetBlockAckType(ns3::Mac48Address recipient, uint8_t tid) const [member function]
-    cls.add_method('GetBlockAckType', 
-                   'ns3::BlockAckType', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
-                   is_const=True)
-    ## block-ack-manager.h (module 'wifi'): uint16_t ns3::BlockAckManager::GetOriginatorStartingSequence(ns3::Mac48Address recipient, uint8_t tid) const [member function]
-    cls.add_method('GetOriginatorStartingSequence', 
-                   'uint16_t', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
-                   is_const=True)
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetTxOkCallback(ns3::BlockAckManager::TxOk callback) [member function]
-    cls.add_method('SetTxOkCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetTxFailedCallback(ns3::BlockAckManager::TxFailed callback) [member function]
-    cls.add_method('SetTxFailedCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetDroppedOldMpduCallback(ns3::BlockAckManager::DroppedOldMpdu callback) [member function]
-    cls.add_method('SetDroppedOldMpduCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyDiscardedMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('NotifyDiscardedMpdu', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')])
-    ## block-ack-manager.h (module 'wifi'): ns3::CtrlBAckRequestHeader ns3::BlockAckManager::GetBlockAckReqHeader(ns3::Mac48Address recipient, uint8_t tid) const [member function]
-    cls.add_method('GetBlockAckReqHeader', 
-                   'ns3::CtrlBAckRequestHeader', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
-                   is_const=True)
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::ScheduleBar(ns3::Ptr<const ns3::WifiMacQueueItem> bar, bool skipIfNoDataQueued=false) [member function]
-    cls.add_method('ScheduleBar', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'bar'), param('bool', 'skipIfNoDataQueued', default_value='false')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::DoDispose() [member function]
-    cls.add_method('DoDispose', 
-                   'void', 
-                   [], 
-                   is_virtual=True, visibility='protected')
-    return
-
 def register_Ns3BooleanChecker_methods(root_module, cls):
     ## boolean.h (module 'core'): ns3::BooleanChecker::BooleanChecker() [constructor]
     cls.add_constructor([])
@@ -7914,11 +6722,6 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['unsigned int'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
                    is_static=True, template_parameters=['ns3::Ptr<ns3::NetDevice> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
@@ -7949,32 +6752,32 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['unsigned long long'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::Packet> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['unsigned char'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Mac48Address'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::WifiTxVector const&'], visibility='protected')
+                   is_static=True, template_parameters=['unsigned int'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Mac48Address'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Time'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Time'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::dot11s::RouteChange'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::OriginatorBlockAckAgreement::State'], visibility='protected')
+                   is_static=True, template_parameters=['unsigned long long'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
@@ -7989,7 +6792,7 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::WifiMacHeader const&'], visibility='protected')
+                   is_static=True, template_parameters=['unsigned char'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
@@ -8005,16 +6808,6 @@
                    'std::string', 
                    [], 
                    is_static=True, template_parameters=['std::set<ns3::Mac48Address', ' std::less<ns3::Mac48Address>', ' std::allocator<ns3::Mac48Address> > const*'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::Packet> '], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True, template_parameters=['ns3::dot11s::RouteChange'], visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -8072,6 +6865,39 @@
                    is_static=True)
     return
 
+def register_Ns3ConstantRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::ConstantRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::ConstantRandomVariable::ConstantRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): double ns3::ConstantRandomVariable::GetConstant() const [member function]
+    cls.add_method('GetConstant', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::ConstantRandomVariable::GetValue(double constant) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('double', 'constant')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ConstantRandomVariable::GetInteger(uint32_t constant) [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [param('uint32_t', 'constant')])
+    ## random-variable-stream.h (module 'core'): double ns3::ConstantRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ConstantRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_virtual=True)
+    return
+
 def register_Ns3DataRateChecker_methods(root_module, cls):
     ## data-rate.h (module 'network'): ns3::DataRateChecker::DataRateChecker() [constructor]
     cls.add_constructor([])
@@ -8112,6 +6938,30 @@
                    [param('ns3::DataRate const &', 'value')])
     return
 
+def register_Ns3DeterministicRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::DeterministicRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::DeterministicRandomVariable::DeterministicRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): void ns3::DeterministicRandomVariable::SetValueArray(double * values, std::size_t length) [member function]
+    cls.add_method('SetValueArray', 
+                   'void', 
+                   [param('double *', 'values'), param('std::size_t', 'length')])
+    ## random-variable-stream.h (module 'core'): double ns3::DeterministicRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::DeterministicRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_virtual=True)
+    return
+
 def register_Ns3DoubleValue_methods(root_module, cls):
     ## double.h (module 'core'): ns3::DoubleValue::DoubleValue() [constructor]
     cls.add_constructor([])
@@ -8405,6 +7255,39 @@
                    [param('uint16_t', 'txop')])
     return
 
+def register_Ns3EmpiricalRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): ns3::EmpiricalRandomVariable::EmpiricalRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): void ns3::EmpiricalRandomVariable::CDF(double v, double c) [member function]
+    cls.add_method('CDF', 
+                   'void', 
+                   [param('double', 'v'), param('double', 'c')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::EmpiricalRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::EmpiricalRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate() [member function]
+    cls.add_method('Interpolate', 
+                   'double', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): bool ns3::EmpiricalRandomVariable::SetInterpolate(bool interpolate) [member function]
+    cls.add_method('SetInterpolate', 
+                   'bool', 
+                   [param('bool', 'interpolate')])
+    return
+
 def register_Ns3EmptyAttributeAccessor_methods(root_module, cls):
     ## attribute.h (module 'core'): ns3::EmptyAttributeAccessor::EmptyAttributeAccessor(ns3::EmptyAttributeAccessor const & arg0) [constructor]
     cls.add_constructor([param('ns3::EmptyAttributeAccessor const &', 'arg0')])
@@ -8579,6 +7462,44 @@
                    [param('int', 'value')])
     return
 
+def register_Ns3ErlangRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::ErlangRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::ErlangRandomVariable::ErlangRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ErlangRandomVariable::GetK() const [member function]
+    cls.add_method('GetK', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::ErlangRandomVariable::GetLambda() const [member function]
+    cls.add_method('GetLambda', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::ErlangRandomVariable::GetValue(uint32_t k, double lambda) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('uint32_t', 'k'), param('double', 'lambda')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ErlangRandomVariable::GetInteger(uint32_t k, uint32_t lambda) [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [param('uint32_t', 'k'), param('uint32_t', 'lambda')])
+    ## random-variable-stream.h (module 'core'): double ns3::ErlangRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ErlangRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_virtual=True)
+    return
+
 def register_Ns3ErpInformation_methods(root_module, cls):
     cls.add_output_stream_operator()
     ## erp-information.h (module 'wifi'): ns3::ErpInformation::ErpInformation(ns3::ErpInformation const & arg0) [constructor]
@@ -8672,6 +7593,44 @@
                    is_pure_virtual=True, is_virtual=True, visibility='protected')
     return
 
+def register_Ns3ExponentialRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::ExponentialRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::ExponentialRandomVariable::ExponentialRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): double ns3::ExponentialRandomVariable::GetMean() const [member function]
+    cls.add_method('GetMean', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::ExponentialRandomVariable::GetBound() const [member function]
+    cls.add_method('GetBound', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::ExponentialRandomVariable::GetValue(double mean, double bound) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('double', 'mean'), param('double', 'bound')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ExponentialRandomVariable::GetInteger(uint32_t mean, uint32_t bound) [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [param('uint32_t', 'mean'), param('uint32_t', 'bound')])
+    ## random-variable-stream.h (module 'core'): double ns3::ExponentialRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ExponentialRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_virtual=True)
+    return
+
 def register_Ns3ExtendedCapabilities_methods(root_module, cls):
     cls.add_output_stream_operator()
     ## extended-capabilities.h (module 'wifi'): ns3::ExtendedCapabilities::ExtendedCapabilities(ns3::ExtendedCapabilities const & arg0) [constructor]
@@ -8833,6 +7792,44 @@
                    [param('ns3::SupportedRates *', 'rates')])
     return
 
+def register_Ns3GammaRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::GammaRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::GammaRandomVariable::GammaRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): double ns3::GammaRandomVariable::GetAlpha() const [member function]
+    cls.add_method('GetAlpha', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::GammaRandomVariable::GetBeta() const [member function]
+    cls.add_method('GetBeta', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::GammaRandomVariable::GetValue(double alpha, double beta) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('double', 'alpha'), param('double', 'beta')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::GammaRandomVariable::GetInteger(uint32_t alpha, uint32_t beta) [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [param('uint32_t', 'alpha'), param('uint32_t', 'beta')])
+    ## random-variable-stream.h (module 'core'): double ns3::GammaRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::GammaRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_virtual=True)
+    return
+
 def register_Ns3HeCapabilities_methods(root_module, cls):
     cls.add_output_stream_operator()
     ## he-capabilities.h (module 'wifi'): ns3::HeCapabilities::HeCapabilities(ns3::HeCapabilities const & arg0) [constructor]
@@ -8859,19 +7856,14 @@
                    'uint8_t', 
                    [], 
                    is_const=True)
-    ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetHeLtfAndGiForHePpdus() const [member function]
-    cls.add_method('GetHeLtfAndGiForHePpdus', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
     ## he-capabilities.h (module 'wifi'): uint32_t ns3::HeCapabilities::GetHeMacCapabilitiesInfo1() const [member function]
     cls.add_method('GetHeMacCapabilitiesInfo1', 
                    'uint32_t', 
                    [], 
                    is_const=True)
-    ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetHeMacCapabilitiesInfo2() const [member function]
+    ## he-capabilities.h (module 'wifi'): uint16_t ns3::HeCapabilities::GetHeMacCapabilitiesInfo2() const [member function]
     cls.add_method('GetHeMacCapabilitiesInfo2', 
-                   'uint8_t', 
+                   'uint16_t', 
                    [], 
                    is_const=True)
     ## he-capabilities.h (module 'wifi'): uint64_t ns3::HeCapabilities::GetHePhyCapabilitiesInfo1() const [member function]
@@ -8879,11 +7871,26 @@
                    'uint64_t', 
                    [], 
                    is_const=True)
-    ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetHePhyCapabilitiesInfo2() const [member function]
+    ## he-capabilities.h (module 'wifi'): uint16_t ns3::HeCapabilities::GetHePhyCapabilitiesInfo2() const [member function]
     cls.add_method('GetHePhyCapabilitiesInfo2', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetHePhyCapabilitiesInfo3() const [member function]
+    cls.add_method('GetHePhyCapabilitiesInfo3', 
                    'uint8_t', 
                    [], 
                    is_const=True)
+    ## he-capabilities.h (module 'wifi'): bool ns3::HeCapabilities::GetHePpdu4xHeLtf800nsGi() const [member function]
+    cls.add_method('GetHePpdu4xHeLtf800nsGi', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## he-capabilities.h (module 'wifi'): bool ns3::HeCapabilities::GetHeSuPpdu1xHeLtf800nsGi() const [member function]
+    cls.add_method('GetHeSuPpdu1xHeLtf800nsGi', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetHighestMcsSupported() const [member function]
     cls.add_method('GetHighestMcsSupported', 
                    'uint8_t', 
@@ -8943,18 +7950,22 @@
     cls.add_method('SetChannelWidthSet', 
                    'void', 
                    [param('uint8_t', 'channelWidthSet')])
-    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHeLtfAndGiForHePpdus(uint8_t heLtfAndGiForHePpdus) [member function]
-    cls.add_method('SetHeLtfAndGiForHePpdus', 
-                   'void', 
-                   [param('uint8_t', 'heLtfAndGiForHePpdus')])
-    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHeMacCapabilitiesInfo(uint32_t ctrl1, uint8_t ctrl2) [member function]
+    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHeMacCapabilitiesInfo(uint32_t ctrl1, uint16_t ctrl2) [member function]
     cls.add_method('SetHeMacCapabilitiesInfo', 
                    'void', 
-                   [param('uint32_t', 'ctrl1'), param('uint8_t', 'ctrl2')])
-    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHePhyCapabilitiesInfo(uint64_t ctrl1, uint8_t ctrl2) [member function]
+                   [param('uint32_t', 'ctrl1'), param('uint16_t', 'ctrl2')])
+    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHePhyCapabilitiesInfo(uint64_t ctrl1, uint16_t ctrl2, uint8_t ctrl3) [member function]
     cls.add_method('SetHePhyCapabilitiesInfo', 
                    'void', 
-                   [param('uint64_t', 'ctrl1'), param('uint8_t', 'ctrl2')])
+                   [param('uint64_t', 'ctrl1'), param('uint16_t', 'ctrl2'), param('uint8_t', 'ctrl3')])
+    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHePpdu4xHeLtf800nsGi(bool heSuPpdu4xHeLtf800nsGi) [member function]
+    cls.add_method('SetHePpdu4xHeLtf800nsGi', 
+                   'void', 
+                   [param('bool', 'heSuPpdu4xHeLtf800nsGi')])
+    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHeSuPpdu1xHeLtf800nsGi(bool heSuPpdu1xHeLtf800nsGi) [member function]
+    cls.add_method('SetHeSuPpdu1xHeLtf800nsGi', 
+                   'void', 
+                   [param('bool', 'heSuPpdu1xHeLtf800nsGi')])
     ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHeSupported(uint8_t heSupported) [member function]
     cls.add_method('SetHeSupported', 
                    'void', 
@@ -9690,6 +8701,44 @@
                    [param('ns3::Ipv6Prefix const &', 'value')])
     return
 
+def register_Ns3LogNormalRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::LogNormalRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::LogNormalRandomVariable::LogNormalRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): double ns3::LogNormalRandomVariable::GetMu() const [member function]
+    cls.add_method('GetMu', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::LogNormalRandomVariable::GetSigma() const [member function]
+    cls.add_method('GetSigma', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::LogNormalRandomVariable::GetValue(double mu, double sigma) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('double', 'mu'), param('double', 'sigma')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::LogNormalRandomVariable::GetInteger(uint32_t mu, uint32_t sigma) [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [param('uint32_t', 'mu'), param('uint32_t', 'sigma')])
+    ## random-variable-stream.h (module 'core'): double ns3::LogNormalRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::LogNormalRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_virtual=True)
+    return
+
 def register_Ns3Mac48AddressChecker_methods(root_module, cls):
     ## mac48-address.h (module 'network'): ns3::Mac48AddressChecker::Mac48AddressChecker() [constructor]
     cls.add_constructor([])
@@ -9810,6 +8859,149 @@
                    is_pure_virtual=True, is_virtual=True)
     return
 
+def register_Ns3MeshWifiInterfaceMac_methods(root_module, cls):
+    ## mesh-wifi-interface-mac.h (module 'mesh'): ns3::MeshWifiInterfaceMac::MeshWifiInterfaceMac() [constructor]
+    cls.add_constructor([])
+    ## mesh-wifi-interface-mac.h (module 'mesh'): int64_t ns3::MeshWifiInterfaceMac::AssignStreams(int64_t stream) [member function]
+    cls.add_method('AssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')])
+    ## mesh-wifi-interface-mac.h (module 'mesh'): bool ns3::MeshWifiInterfaceMac::CanForwardPacketsTo(ns3::Mac48Address to) const [member function]
+    cls.add_method('CanForwardPacketsTo', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'to')], 
+                   is_const=True, is_virtual=True)
+    ## mesh-wifi-interface-mac.h (module 'mesh'): bool ns3::MeshWifiInterfaceMac::CheckSupportedRates(ns3::SupportedRates rates) const [member function]
+    cls.add_method('CheckSupportedRates', 
+                   'bool', 
+                   [param('ns3::SupportedRates', 'rates')], 
+                   is_const=True)
+    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::ConfigureContentionWindow(uint32_t cwMin, uint32_t cwMax) [member function]
+    cls.add_method('ConfigureContentionWindow', 
+                   'void', 
+                   [param('uint32_t', 'cwMin'), param('uint32_t', 'cwMax')], 
+                   is_virtual=True)
+    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::ConfigureStandard(ns3::WifiStandard standard) [member function]
+    cls.add_method('ConfigureStandard', 
+                   'void', 
+                   [param('ns3::WifiStandard', 'standard')], 
+                   is_virtual=True)
+    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to, ns3::Mac48Address from) [member function]
+    cls.add_method('Enqueue', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to'), param('ns3::Mac48Address', 'from')], 
+                   is_virtual=True)
+    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to) [member function]
+    cls.add_method('Enqueue', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to')], 
+                   is_virtual=True)
+    ## mesh-wifi-interface-mac.h (module 'mesh'): ns3::Time ns3::MeshWifiInterfaceMac::GetBeaconInterval() const [member function]
+    cls.add_method('GetBeaconInterval', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## mesh-wifi-interface-mac.h (module 'mesh'): uint16_t ns3::MeshWifiInterfaceMac::GetFrequencyChannel() const [member function]
+    cls.add_method('GetFrequencyChannel', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## mesh-wifi-interface-mac.h (module 'mesh'): uint32_t ns3::MeshWifiInterfaceMac::GetLinkMetric(ns3::Mac48Address peerAddress) [member function]
+    cls.add_method('GetLinkMetric', 
+                   'uint32_t', 
+                   [param('ns3::Mac48Address', 'peerAddress')])
+    ## mesh-wifi-interface-mac.h (module 'mesh'): ns3::Mac48Address ns3::MeshWifiInterfaceMac::GetMeshPointAddress() const [member function]
+    cls.add_method('GetMeshPointAddress', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_const=True)
+    ## mesh-wifi-interface-mac.h (module 'mesh'): ns3::SupportedRates ns3::MeshWifiInterfaceMac::GetSupportedRates() const [member function]
+    cls.add_method('GetSupportedRates', 
+                   'ns3::SupportedRates', 
+                   [], 
+                   is_const=True)
+    ## mesh-wifi-interface-mac.h (module 'mesh'): ns3::Time ns3::MeshWifiInterfaceMac::GetTbtt() const [member function]
+    cls.add_method('GetTbtt', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## mesh-wifi-interface-mac.h (module 'mesh'): static ns3::TypeId ns3::MeshWifiInterfaceMac::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::InstallPlugin(ns3::Ptr<ns3::MeshWifiInterfaceMacPlugin> plugin) [member function]
+    cls.add_method('InstallPlugin', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::MeshWifiInterfaceMacPlugin >', 'plugin')])
+    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::Report(std::ostream & os) const [member function]
+    cls.add_method('Report', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::ResetStats() [member function]
+    cls.add_method('ResetStats', 
+                   'void', 
+                   [])
+    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::SendManagementFrame(ns3::Ptr<ns3::Packet> frame, ns3::WifiMacHeader const & hdr) [member function]
+    cls.add_method('SendManagementFrame', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'frame'), param('ns3::WifiMacHeader const &', 'hdr')])
+    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::SetBeaconGeneration(bool enable) [member function]
+    cls.add_method('SetBeaconGeneration', 
+                   'void', 
+                   [param('bool', 'enable')])
+    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::SetBeaconInterval(ns3::Time interval) [member function]
+    cls.add_method('SetBeaconInterval', 
+                   'void', 
+                   [param('ns3::Time', 'interval')])
+    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::SetLinkMetricCallback(ns3::Callback<unsigned int, ns3::Mac48Address, ns3::Ptr<ns3::MeshWifiInterfaceMac>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> cb) [member function]
+    cls.add_method('SetLinkMetricCallback', 
+                   'void', 
+                   [param('ns3::Callback< unsigned int, ns3::Mac48Address, ns3::Ptr< ns3::MeshWifiInterfaceMac >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'cb')])
+    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::SetLinkUpCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkUp) [member function]
+    cls.add_method('SetLinkUpCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkUp')], 
+                   is_virtual=True)
+    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::SetMeshPointAddress(ns3::Mac48Address addr) [member function]
+    cls.add_method('SetMeshPointAddress', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'addr')])
+    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::SetRandomStartDelay(ns3::Time interval) [member function]
+    cls.add_method('SetRandomStartDelay', 
+                   'void', 
+                   [param('ns3::Time', 'interval')])
+    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::ShiftTbtt(ns3::Time shift) [member function]
+    cls.add_method('ShiftTbtt', 
+                   'void', 
+                   [param('ns3::Time', 'shift')])
+    ## mesh-wifi-interface-mac.h (module 'mesh'): bool ns3::MeshWifiInterfaceMac::SupportsSendFrom() const [member function]
+    cls.add_method('SupportsSendFrom', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::SwitchFrequencyChannel(uint16_t new_id) [member function]
+    cls.add_method('SwitchFrequencyChannel', 
+                   'void', 
+                   [param('uint16_t', 'new_id')])
+    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='private')
+    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='private')
+    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::Receive(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('Receive', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
+                   is_virtual=True, visibility='private')
+    return
+
 def register_Ns3MeshWifiInterfaceMacPlugin_methods(root_module, cls):
     ## mesh-wifi-interface-mac-plugin.h (module 'mesh'): ns3::MeshWifiInterfaceMacPlugin::MeshWifiInterfaceMacPlugin() [constructor]
     cls.add_constructor([])
@@ -10106,10 +9298,16 @@
     cls.add_method('ExtractNeighborIndex', 
                    'uint32_t', 
                    [param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetEpoch() const [member function]
+    cls.add_method('GetEpoch', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() const [member function]
     cls.add_method('GetRemainingBits', 
                    'uint32_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -10120,6 +9318,10 @@
                    'uint32_t', 
                    [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
+    ## nix-vector.h (module 'network'): void ns3::NixVector::SetEpoch(uint32_t epoch) [member function]
+    cls.add_method('SetEpoch', 
+                   'void', 
+                   [param('uint32_t', 'epoch')])
     return
 
 def register_Ns3Node_methods(root_module, cls):
@@ -10210,6 +9412,51 @@
                    is_virtual=True, visibility='protected')
     return
 
+def register_Ns3NormalRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): ns3::NormalRandomVariable::INFINITE_VALUE [variable]
+    cls.add_static_attribute('INFINITE_VALUE', 'double const', is_const=True)
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::NormalRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::NormalRandomVariable::NormalRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): double ns3::NormalRandomVariable::GetMean() const [member function]
+    cls.add_method('GetMean', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::NormalRandomVariable::GetVariance() const [member function]
+    cls.add_method('GetVariance', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::NormalRandomVariable::GetBound() const [member function]
+    cls.add_method('GetBound', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::NormalRandomVariable::GetValue(double mean, double variance, double bound=ns3::NormalRandomVariable::INFINITE_VALUE) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('double', 'mean'), param('double', 'variance'), param('double', 'bound', default_value='ns3::NormalRandomVariable::INFINITE_VALUE')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::NormalRandomVariable::GetInteger(uint32_t mean, uint32_t variance, uint32_t bound) [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [param('uint32_t', 'mean'), param('uint32_t', 'variance'), param('uint32_t', 'bound')])
+    ## random-variable-stream.h (module 'core'): double ns3::NormalRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::NormalRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_virtual=True)
+    return
+
 def register_Ns3ObjectFactoryChecker_methods(root_module, cls):
     ## object-factory.h (module 'core'): ns3::ObjectFactoryChecker::ObjectFactoryChecker() [constructor]
     cls.add_constructor([])
@@ -10438,10 +9685,11 @@
                    'uint32_t', 
                    [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) const [member function]
     cls.add_method('SetNixVector', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')], 
+                   is_const=True)
     ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
     cls.add_method('ToString', 
                    'std::string', 
@@ -10449,531 +9697,47 @@
                    is_const=True)
     return
 
-def register_Ns3QosTxop_methods(root_module, cls):
-    ## qos-txop.h (module 'wifi'): static ns3::TypeId ns3::QosTxop::GetTypeId() [member function]
+def register_Ns3ParetoRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::ParetoRandomVariable::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## qos-txop.h (module 'wifi'): ns3::QosTxop::QosTxop(ns3::AcIndex ac=::ns3::AcIndex::AC_UNDEF) [constructor]
-    cls.add_constructor([param('ns3::AcIndex', 'ac', default_value='::ns3::AcIndex::AC_UNDEF')])
-    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::IsQosTxop() const [member function]
-    cls.add_method('IsQosTxop', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::HasFramesToTransmit() [member function]
-    cls.add_method('HasFramesToTransmit', 
-                   'bool', 
-                   [], 
-                   is_virtual=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::NotifyChannelAccessed(ns3::Time txopDuration) [member function]
-    cls.add_method('NotifyChannelAccessed', 
-                   'void', 
-                   [param('ns3::Time', 'txopDuration')], 
-                   is_virtual=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::NotifyChannelReleased() [member function]
-    cls.add_method('NotifyChannelReleased', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetDroppedMpduCallback(ns3::Txop::DroppedMpdu callback) [member function]
-    cls.add_method('SetDroppedMpduCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::WifiMacDropReason, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
-                   is_virtual=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetQosFrameExchangeManager(ns3::Ptr<ns3::QosFrameExchangeManager> const qosFem) [member function]
-    cls.add_method('SetQosFrameExchangeManager', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::QosFrameExchangeManager > const', 'qosFem')])
-    ## qos-txop.h (module 'wifi'): ns3::AcIndex ns3::QosTxop::GetAccessCategory() const [member function]
-    cls.add_method('GetAccessCategory', 
-                   'ns3::AcIndex', 
-                   [], 
-                   is_const=True)
-    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::UseExplicitBarAfterMissedBlockAck() const [member function]
-    cls.add_method('UseExplicitBarAfterMissedBlockAck', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## qos-txop.h (module 'wifi'): ns3::Ptr<ns3::BlockAckManager> ns3::QosTxop::GetBaManager() [member function]
-    cls.add_method('GetBaManager', 
-                   'ns3::Ptr< ns3::BlockAckManager >', 
-                   [])
-    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::GetBaAgreementEstablished(ns3::Mac48Address address, uint8_t tid) const [member function]
-    cls.add_method('GetBaAgreementEstablished', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'address'), param('uint8_t', 'tid')], 
-                   is_const=True)
-    ## qos-txop.h (module 'wifi'): uint16_t ns3::QosTxop::GetBaBufferSize(ns3::Mac48Address address, uint8_t tid) const [member function]
-    cls.add_method('GetBaBufferSize', 
-                   'uint16_t', 
-                   [param('ns3::Mac48Address', 'address'), param('uint8_t', 'tid')], 
-                   is_const=True)
-    ## qos-txop.h (module 'wifi'): uint16_t ns3::QosTxop::GetBaStartingSequence(ns3::Mac48Address address, uint8_t tid) const [member function]
-    cls.add_method('GetBaStartingSequence', 
-                   'uint16_t', 
-                   [param('ns3::Mac48Address', 'address'), param('uint8_t', 'tid')], 
-                   is_const=True)
-    ## qos-txop.h (module 'wifi'): ns3::BlockAckReqType ns3::QosTxop::GetBlockAckReqType(ns3::Mac48Address recipient, uint8_t tid) const [member function]
-    cls.add_method('GetBlockAckReqType', 
-                   'ns3::BlockAckReqType', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
-                   is_const=True)
-    ## qos-txop.h (module 'wifi'): ns3::BlockAckType ns3::QosTxop::GetBlockAckType(ns3::Mac48Address recipient, uint8_t tid) const [member function]
-    cls.add_method('GetBlockAckType', 
-                   'ns3::BlockAckType', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
-                   is_const=True)
-    ## qos-txop.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::QosTxop::PrepareBlockAckRequest(ns3::Mac48Address recipient, uint8_t tid) const [member function]
-    cls.add_method('PrepareBlockAckRequest', 
-                   'ns3::Ptr< ns3::WifiMacQueueItem const >', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
-                   is_const=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::ScheduleBar(ns3::Ptr<const ns3::WifiMacQueueItem> bar, bool skipIfNoDataQueued=false) [member function]
-    cls.add_method('ScheduleBar', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'bar'), param('bool', 'skipIfNoDataQueued', default_value='false')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::GotAddBaResponse(ns3::MgtAddBaResponseHeader const * respHdr, ns3::Mac48Address recipient) [member function]
-    cls.add_method('GotAddBaResponse', 
-                   'void', 
-                   [param('ns3::MgtAddBaResponseHeader const *', 'respHdr'), param('ns3::Mac48Address', 'recipient')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::GotDelBaFrame(ns3::MgtDelBaHeader const * delBaHdr, ns3::Mac48Address recipient) [member function]
-    cls.add_method('GotDelBaFrame', 
-                   'void', 
-                   [param('ns3::MgtDelBaHeader const *', 'delBaHdr'), param('ns3::Mac48Address', 'recipient')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::AddBaResponseTimeout(ns3::Mac48Address recipient, uint8_t tid) [member function]
-    cls.add_method('AddBaResponseTimeout', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::ResetBa(ns3::Mac48Address recipient, uint8_t tid) [member function]
-    cls.add_method('ResetBa', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::PushFront(ns3::Ptr<const ns3::Packet> packet, ns3::WifiMacHeader const & hdr) [member function]
-    cls.add_method('PushFront', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMacHeader const &', 'hdr')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetBlockAckThreshold(uint8_t threshold) [member function]
-    cls.add_method('SetBlockAckThreshold', 
-                   'void', 
-                   [param('uint8_t', 'threshold')])
-    ## qos-txop.h (module 'wifi'): uint8_t ns3::QosTxop::GetBlockAckThreshold() const [member function]
-    cls.add_method('GetBlockAckThreshold', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetBlockAckInactivityTimeout(uint16_t timeout) [member function]
-    cls.add_method('SetBlockAckInactivityTimeout', 
-                   'void', 
-                   [param('uint16_t', 'timeout')])
-    ## qos-txop.h (module 'wifi'): uint16_t ns3::QosTxop::GetBlockAckInactivityTimeout() const [member function]
-    cls.add_method('GetBlockAckInactivityTimeout', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::CompleteMpduTx(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('CompleteMpduTx', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetAddBaResponseTimeout(ns3::Time addBaResponseTimeout) [member function]
-    cls.add_method('SetAddBaResponseTimeout', 
-                   'void', 
-                   [param('ns3::Time', 'addBaResponseTimeout')])
-    ## qos-txop.h (module 'wifi'): ns3::Time ns3::QosTxop::GetAddBaResponseTimeout() const [member function]
-    cls.add_method('GetAddBaResponseTimeout', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetFailedAddBaTimeout(ns3::Time failedAddBaTimeout) [member function]
-    cls.add_method('SetFailedAddBaTimeout', 
-                   'void', 
-                   [param('ns3::Time', 'failedAddBaTimeout')])
-    ## qos-txop.h (module 'wifi'): ns3::Time ns3::QosTxop::GetFailedAddBaTimeout() const [member function]
-    cls.add_method('GetFailedAddBaTimeout', 
-                   'ns3::Time', 
+    ## random-variable-stream.h (module 'core'): ns3::ParetoRandomVariable::ParetoRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): double ns3::ParetoRandomVariable::GetScale() const [member function]
+    cls.add_method('GetScale', 
+                   'double', 
                    [], 
                    is_const=True)
-    ## qos-txop.h (module 'wifi'): uint16_t ns3::QosTxop::GetNextSequenceNumberFor(ns3::WifiMacHeader const * hdr) [member function]
-    cls.add_method('GetNextSequenceNumberFor', 
-                   'uint16_t', 
-                   [param('ns3::WifiMacHeader const *', 'hdr')])
-    ## qos-txop.h (module 'wifi'): uint16_t ns3::QosTxop::PeekNextSequenceNumberFor(ns3::WifiMacHeader const * hdr) [member function]
-    cls.add_method('PeekNextSequenceNumberFor', 
-                   'uint16_t', 
-                   [param('ns3::WifiMacHeader const *', 'hdr')])
-    ## qos-txop.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::QosTxop::PeekNextMpdu(uint8_t tid=8, ns3::Mac48Address recipient=ns3::Mac48Address::GetBroadcast()) [member function]
-    cls.add_method('PeekNextMpdu', 
-                   'ns3::Ptr< ns3::WifiMacQueueItem const >', 
-                   [param('uint8_t', 'tid', default_value='8'), param('ns3::Mac48Address', 'recipient', default_value='ns3::Mac48Address::GetBroadcast()')])
-    ## qos-txop.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::QosTxop::PeekNextMpdu(ns3::WifiMacQueueItem::ConstIterator queueIt, uint8_t tid=8, ns3::Mac48Address recipient=ns3::Mac48Address::GetBroadcast()) [member function]
-    cls.add_method('PeekNextMpdu', 
-                   'ns3::Ptr< ns3::WifiMacQueueItem const >', 
-                   [param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'queueIt'), param('uint8_t', 'tid', default_value='8'), param('ns3::Mac48Address', 'recipient', default_value='ns3::Mac48Address::GetBroadcast()')])
-    ## qos-txop.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::QosTxop::GetNextMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> peekedItem, ns3::WifiTxParameters & txParams, ns3::Time availableTime, bool initialFrame, ns3::WifiMacQueueItem::ConstIterator & queueIt) [member function]
-    cls.add_method('GetNextMpdu', 
-                   'ns3::Ptr< ns3::WifiMacQueueItem >', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'peekedItem'), param('ns3::WifiTxParameters &', 'txParams'), param('ns3::Time', 'availableTime'), param('bool', 'initialFrame'), param('ns3::WifiMacQueueItem::ConstIterator &', 'queueIt')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::AssignSequenceNumber(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) const [member function]
-    cls.add_method('AssignSequenceNumber', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
-                   is_const=True)
-    ## qos-txop.h (module 'wifi'): uint8_t ns3::QosTxop::GetQosQueueSize(uint8_t tid, ns3::Mac48Address receiver) const [member function]
-    cls.add_method('GetQosQueueSize', 
-                   'uint8_t', 
-                   [param('uint8_t', 'tid'), param('ns3::Mac48Address', 'receiver')], 
-                   is_const=True)
-    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::IsTxopStarted() const [member function]
-    cls.add_method('IsTxopStarted', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## qos-txop.h (module 'wifi'): ns3::Time ns3::QosTxop::GetRemainingTxop() const [member function]
-    cls.add_method('GetRemainingTxop', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetMuCwMin(uint16_t cwMin) [member function]
-    cls.add_method('SetMuCwMin', 
-                   'void', 
-                   [param('uint16_t', 'cwMin')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetMuCwMax(uint16_t cwMax) [member function]
-    cls.add_method('SetMuCwMax', 
-                   'void', 
-                   [param('uint16_t', 'cwMax')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetMuAifsn(uint8_t aifsn) [member function]
-    cls.add_method('SetMuAifsn', 
-                   'void', 
-                   [param('uint8_t', 'aifsn')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetMuEdcaTimer(ns3::Time timer) [member function]
-    cls.add_method('SetMuEdcaTimer', 
-                   'void', 
-                   [param('ns3::Time', 'timer')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::StartMuEdcaTimerNow() [member function]
-    cls.add_method('StartMuEdcaTimerNow', 
-                   'void', 
-                   [])
-    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::MuEdcaTimerRunning() const [member function]
-    cls.add_method('MuEdcaTimerRunning', 
-                   'bool', 
+    ## random-variable-stream.h (module 'core'): double ns3::ParetoRandomVariable::GetShape() const [member function]
+    cls.add_method('GetShape', 
+                   'double', 
                    [], 
                    is_const=True)
-    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::EdcaDisabled() const [member function]
-    cls.add_method('EdcaDisabled', 
-                   'bool', 
+    ## random-variable-stream.h (module 'core'): double ns3::ParetoRandomVariable::GetBound() const [member function]
+    cls.add_method('GetBound', 
+                   'double', 
                    [], 
                    is_const=True)
-    ## qos-txop.h (module 'wifi'): uint32_t ns3::QosTxop::GetMinCw() const [member function]
-    cls.add_method('GetMinCw', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## qos-txop.h (module 'wifi'): uint32_t ns3::QosTxop::GetMaxCw() const [member function]
-    cls.add_method('GetMaxCw', 
+    ## random-variable-stream.h (module 'core'): double ns3::ParetoRandomVariable::GetValue(double scale, double shape, double bound) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('double', 'scale'), param('double', 'shape'), param('double', 'bound')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ParetoRandomVariable::GetInteger(uint32_t scale, uint32_t shape, uint32_t bound) [member function]
+    cls.add_method('GetInteger', 
                    'uint32_t', 
+                   [param('uint32_t', 'scale'), param('uint32_t', 'shape'), param('uint32_t', 'bound')])
+    ## random-variable-stream.h (module 'core'): double ns3::ParetoRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## qos-txop.h (module 'wifi'): uint8_t ns3::QosTxop::GetAifsn() const [member function]
-    cls.add_method('GetAifsn', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## qos-txop.h (module 'wifi'): ns3::QosTxop::QosTxop(ns3::QosTxop const & arg0) [constructor]
-    cls.add_constructor([param('ns3::QosTxop const &', 'arg0')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::DoDispose() [member function]
-    cls.add_method('DoDispose', 
-                   'void', 
-                   [], 
-                   is_virtual=True, visibility='protected')
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::DoInitialize() [member function]
-    cls.add_method('DoInitialize', 
-                   'void', 
-                   [], 
-                   is_virtual=True, visibility='private')
-    return
-
-def register_Ns3RegularWifiMac_methods(root_module, cls):
-    ## regular-wifi-mac.h (module 'wifi'): static ns3::TypeId ns3::RegularWifiMac::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::RegularWifiMac::RegularWifiMac() [constructor]
-    cls.add_constructor([])
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetShortSlotTimeSupported(bool enable) [member function]
-    cls.add_method('SetShortSlotTimeSupported', 
-                   'void', 
-                   [param('bool', 'enable')], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetSsid(ns3::Ssid ssid) [member function]
-    cls.add_method('SetSsid', 
-                   'void', 
-                   [param('ns3::Ssid', 'ssid')], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetAddress(ns3::Mac48Address address) [member function]
-    cls.add_method('SetAddress', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetPromisc() [member function]
-    cls.add_method('SetPromisc', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetShortSlotTimeSupported() const [member function]
-    cls.add_method('GetShortSlotTimeSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ssid ns3::RegularWifiMac::GetSsid() const [member function]
-    cls.add_method('GetSsid', 
-                   'ns3::Ssid', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Mac48Address ns3::RegularWifiMac::GetAddress() const [member function]
-    cls.add_method('GetAddress', 
-                   'ns3::Mac48Address', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Mac48Address ns3::RegularWifiMac::GetBssid() const [member function]
-    cls.add_method('GetBssid', 
-                   'ns3::Mac48Address', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to, ns3::Mac48Address from) [member function]
-    cls.add_method('Enqueue', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to'), param('ns3::Mac48Address', 'from')], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::SupportsSendFrom() const [member function]
-    cls.add_method('SupportsSendFrom', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetWifiPhy(ns3::Ptr<ns3::WifiPhy> const phy) [member function]
-    cls.add_method('SetWifiPhy', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiPhy > const', 'phy')], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiPhy> ns3::RegularWifiMac::GetWifiPhy() const [member function]
-    cls.add_method('GetWifiPhy', 
-                   'ns3::Ptr< ns3::WifiPhy >', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::ResetWifiPhy() [member function]
-    cls.add_method('ResetWifiPhy', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetWifiRemoteStationManager(ns3::Ptr<ns3::WifiRemoteStationManager> const stationManager) [member function]
-    cls.add_method('SetWifiRemoteStationManager', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiRemoteStationManager > const', 'stationManager')], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::ConfigureStandard(ns3::WifiStandard standard) [member function]
-    cls.add_method('ConfigureStandard', 
-                   'void', 
-                   [param('ns3::WifiStandard', 'standard')], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::TypeOfStation ns3::RegularWifiMac::GetTypeOfStation() const [member function]
-    cls.add_method('GetTypeOfStation', 
-                   'ns3::TypeOfStation', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetForwardUpCallback(ns3::WifiMac::ForwardUpCallback upCallback) [member function]
-    cls.add_method('SetForwardUpCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'upCallback')], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetLinkUpCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkUp) [member function]
-    cls.add_method('SetLinkUpCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkUp')], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetLinkDownCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkDown) [member function]
-    cls.add_method('SetLinkDownCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkDown')], 
                    is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiRemoteStationManager> ns3::RegularWifiMac::GetWifiRemoteStationManager() const [member function]
-    cls.add_method('GetWifiRemoteStationManager', 
-                   'ns3::Ptr< ns3::WifiRemoteStationManager >', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to) [member function]
-    cls.add_method('Enqueue', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::FrameExchangeManager> ns3::RegularWifiMac::GetFrameExchangeManager() const [member function]
-    cls.add_method('GetFrameExchangeManager', 
-                   'ns3::Ptr< ns3::FrameExchangeManager >', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetCtsToSelfSupported(bool enable) [member function]
-    cls.add_method('SetCtsToSelfSupported', 
-                   'void', 
-                   [param('bool', 'enable')])
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetBssid(ns3::Mac48Address bssid) [member function]
-    cls.add_method('SetBssid', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'bssid')])
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::Txop> ns3::RegularWifiMac::GetTxop() const [member function]
-    cls.add_method('GetTxop', 
-                   'ns3::Ptr< ns3::Txop >', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::RegularWifiMac::GetQosTxop(ns3::AcIndex ac) const [member function]
-    cls.add_method('GetQosTxop', 
-                   'ns3::Ptr< ns3::QosTxop >', 
-                   [param('ns3::AcIndex', 'ac')], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::RegularWifiMac::GetQosTxop(uint8_t tid) const [member function]
-    cls.add_method('GetQosTxop', 
-                   'ns3::Ptr< ns3::QosTxop >', 
-                   [param('uint8_t', 'tid')], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueue> ns3::RegularWifiMac::GetTxopQueue(ns3::AcIndex ac) const [member function]
-    cls.add_method('GetTxopQueue', 
-                   'ns3::Ptr< ns3::WifiMacQueue >', 
-                   [param('ns3::AcIndex', 'ac')], 
-                   is_const=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetQosSupported() const [member function]
-    cls.add_method('GetQosSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetErpSupported() const [member function]
-    cls.add_method('GetErpSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetDsssSupported() const [member function]
-    cls.add_method('GetDsssSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetHtSupported() const [member function]
-    cls.add_method('GetHtSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetVhtSupported() const [member function]
-    cls.add_method('GetVhtSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetHeSupported() const [member function]
-    cls.add_method('GetHeSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::ExtendedCapabilities ns3::RegularWifiMac::GetExtendedCapabilities() const [member function]
-    cls.add_method('GetExtendedCapabilities', 
-                   'ns3::ExtendedCapabilities', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::HtCapabilities ns3::RegularWifiMac::GetHtCapabilities() const [member function]
-    cls.add_method('GetHtCapabilities', 
-                   'ns3::HtCapabilities', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::VhtCapabilities ns3::RegularWifiMac::GetVhtCapabilities() const [member function]
-    cls.add_method('GetVhtCapabilities', 
-                   'ns3::VhtCapabilities', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::HeCapabilities ns3::RegularWifiMac::GetHeCapabilities() const [member function]
-    cls.add_method('GetHeCapabilities', 
-                   'ns3::HeCapabilities', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): uint32_t ns3::RegularWifiMac::GetMaxAmpduSize(ns3::AcIndex ac) const [member function]
-    cls.add_method('GetMaxAmpduSize', 
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ParetoRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
                    'uint32_t', 
-                   [param('ns3::AcIndex', 'ac')], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): uint16_t ns3::RegularWifiMac::GetMaxAmsduSize(ns3::AcIndex ac) const [member function]
-    cls.add_method('GetMaxAmsduSize', 
-                   'uint16_t', 
-                   [param('ns3::AcIndex', 'ac')], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::DoInitialize() [member function]
-    cls.add_method('DoInitialize', 
-                   'void', 
-                   [], 
-                   is_virtual=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::DoDispose() [member function]
-    cls.add_method('DoDispose', 
-                   'void', 
                    [], 
-                   is_virtual=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetTypeOfStation(ns3::TypeOfStation type) [member function]
-    cls.add_method('SetTypeOfStation', 
-                   'void', 
-                   [param('ns3::TypeOfStation', 'type')], 
-                   is_virtual=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::RegularWifiMac::GetVOQueue() const [member function]
-    cls.add_method('GetVOQueue', 
-                   'ns3::Ptr< ns3::QosTxop >', 
-                   [], 
-                   is_const=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::RegularWifiMac::GetVIQueue() const [member function]
-    cls.add_method('GetVIQueue', 
-                   'ns3::Ptr< ns3::QosTxop >', 
-                   [], 
-                   is_const=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::RegularWifiMac::GetBEQueue() const [member function]
-    cls.add_method('GetBEQueue', 
-                   'ns3::Ptr< ns3::QosTxop >', 
-                   [], 
-                   is_const=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::RegularWifiMac::GetBKQueue() const [member function]
-    cls.add_method('GetBKQueue', 
-                   'ns3::Ptr< ns3::QosTxop >', 
-                   [], 
-                   is_const=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::ConfigureContentionWindow(uint32_t cwMin, uint32_t cwMax) [member function]
-    cls.add_method('ConfigureContentionWindow', 
-                   'void', 
-                   [param('uint32_t', 'cwMin'), param('uint32_t', 'cwMax')], 
-                   visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::Receive(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('Receive', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
-                   is_virtual=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::ForwardUp(ns3::Ptr<const ns3::Packet> packet, ns3::Mac48Address from, ns3::Mac48Address to) [member function]
-    cls.add_method('ForwardUp', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::Mac48Address', 'from'), param('ns3::Mac48Address', 'to')], 
-                   visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::DeaggregateAmsduAndForward(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('DeaggregateAmsduAndForward', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
-                   is_virtual=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetQosSupported(bool enable) [member function]
-    cls.add_method('SetQosSupported', 
-                   'void', 
-                   [param('bool', 'enable')], 
-                   is_virtual=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetupFrameExchangeManager() [member function]
-    cls.add_method('SetupFrameExchangeManager', 
-                   'void', 
-                   [], 
-                   visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetErpSupported(bool enable) [member function]
-    cls.add_method('SetErpSupported', 
-                   'void', 
-                   [param('bool', 'enable')], 
-                   visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetDsssSupported(bool enable) [member function]
-    cls.add_method('SetDsssSupported', 
-                   'void', 
-                   [param('bool', 'enable')], 
-                   visibility='protected')
+                   is_virtual=True)
     return
 
 def register_Ns3Ssid_methods(root_module, cls):
@@ -11580,6 +10344,28 @@
                    is_const=True, is_virtual=True)
     return
 
+def register_Ns3CallbackImpl__Bool_Const_ns3WifiTxVector___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< bool, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): bool ns3::CallbackImpl<bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::WifiTxVector const & arg0) [member operator]
+    cls.add_method('operator()', 
+                   'bool', 
+                   [param('ns3::WifiTxVector const &', 'arg0')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
 def register_Ns3CallbackImpl__Bool_Ns3Ptr__lt__ns3NetDevice__gt___Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_short_Const_ns3Address___amp___Const_ns3Address___amp___Ns3NetDevicePacketType_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
     ## callback.h (module 'core'): ns3::CallbackImpl<bool, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<const ns3::Packet>, unsigned short, const ns3::Address &, const ns3::Address &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
@@ -11624,28 +10410,6 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3CallbackImpl__Bool_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): bool ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(short unsigned int arg0, unsigned char arg1) [member operator]
-    cls.add_method('operator()', 
-                   'bool', 
-                   [param('short unsigned int', 'arg0'), param('unsigned char', 'arg1')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
 def register_Ns3CallbackImpl__Ns3ObjectBase___star___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
     ## callback.h (module 'core'): ns3::CallbackImpl<ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
@@ -11712,28 +10476,6 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3CallbackImpl__Unsigned_long_Unsigned_short_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): long unsigned int ns3::CallbackImpl<unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(short unsigned int arg0, short unsigned int arg1, unsigned char arg2) [member operator]
-    cls.add_method('operator()', 
-                   'long unsigned int', 
-                   [param('short unsigned int', 'arg0'), param('short unsigned int', 'arg1'), param('unsigned char', 'arg2')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
 def register_Ns3CallbackImpl__Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
     ## callback.h (module 'core'): ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
@@ -11932,50 +10674,6 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3CallbackImpl__Void_Ns3Time_Ns3Mac48Address_Unsigned_char_Ns3OriginatorBlockAckAgreementState_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::Mac48Address, unsigned char, ns3::OriginatorBlockAckAgreement::State, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::Mac48Address, unsigned char, ns3::OriginatorBlockAckAgreement::State, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Time, ns3::Mac48Address, unsigned char, ns3::OriginatorBlockAckAgreement::State, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Time, ns3::Mac48Address, unsigned char, ns3::OriginatorBlockAckAgreement::State, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Time, ns3::Mac48Address, unsigned char, ns3::OriginatorBlockAckAgreement::State, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Time, ns3::Mac48Address, unsigned char, ns3::OriginatorBlockAckAgreement::State, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Time, ns3::Mac48Address, unsigned char, ns3::OriginatorBlockAckAgreement::State, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Time arg0, ns3::Mac48Address arg1, unsigned char arg2, ns3::OriginatorBlockAckAgreement::State arg3) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('ns3::Time', 'arg0'), param('ns3::Mac48Address', 'arg1'), param('unsigned char', 'arg2'), param('ns3::OriginatorBlockAckAgreement::State', 'arg3')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3CallbackImpl__Void_Ns3Time_Ns3Time_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Time, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Time, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Time, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Time, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Time, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Time arg0, ns3::Time arg1) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('ns3::Time', 'arg0'), param('ns3::Time', 'arg1')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
 def register_Ns3CallbackImpl__Void_Ns3Time_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
@@ -12086,22 +10784,22 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3CallbackImpl__Void_Unsigned_char_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt_____gt_____gt_____gt_____star___Const_stdSet__lt__ns3Mac48Address__stdLess__lt__ns3Mac48Address__gt____stdAllocator__lt__ns3Mac48Address__gt_____gt_____star___Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+def register_Ns3CallbackImpl__Void_Unsigned_char_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt____gt____gt____gt_____star___Const_stdSet__lt__ns3Mac48Address__stdLess__lt__ns3Mac48Address__gt____stdAllocator__lt__ns3Mac48Address__gt____gt_____star___Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
     cls.add_constructor([param('ns3::CallbackImpl< void, unsigned char, std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu >, std::hash< unsigned short >, std::equal_to< unsigned short >, std::allocator< std::pair< unsigned short const, ns3::Ptr< ns3::WifiPsdu > > > > *, std::set< ns3::Mac48Address, std::less< ns3::Mac48Address >, std::allocator< ns3::Mac48Address > > const, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
     cls.add_method('DoGetTypeid', 
                    'std::string', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
     cls.add_method('GetTypeid', 
                    'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(unsigned char arg0, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > * arg1, std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > const * arg2, long unsigned int arg3) [member operator]
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(unsigned char arg0, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> * arg1, std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> const * arg2, long unsigned int arg3) [member operator]
     cls.add_method('operator()', 
                    'void', 
                    [param('unsigned char', 'arg0'), param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > > *', 'arg1'), param('std::set< ns3::Mac48Address > const *', 'arg2'), param('long unsigned int', 'arg3')], 
@@ -12109,50 +10807,6 @@
     cls.add_copy_constructor()
     return
 
-def register_Ns3CallbackImpl__Void_Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(unsigned int arg0) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('unsigned int', 'arg0')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3CallbackImpl__Void_Unsigned_int_Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(unsigned int arg0, unsigned int arg1) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('unsigned int', 'arg0'), param('unsigned int', 'arg1')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
 def register_Ns3Dot11sStack_methods(root_module, cls):
     ## dot11s-installer.h (module 'mesh'): ns3::Dot11sStack::Dot11sStack(ns3::Dot11sStack const & arg0) [constructor]
     cls.add_constructor([param('ns3::Dot11sStack const &', 'arg0')])
@@ -12231,6 +10885,10 @@
                    'void', 
                    [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
                    is_virtual=True)
+    ## mesh-point-device.h (module 'mesh'): int64_t ns3::MeshPointDevice::AssignStreams(int64_t stream) [member function]
+    cls.add_method('AssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')])
     ## mesh-point-device.h (module 'mesh'): void ns3::MeshPointDevice::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
@@ -12251,6 +10909,11 @@
                    'ns3::Ptr< ns3::Channel >', 
                    [], 
                    is_const=True, is_virtual=True)
+    ## mesh-point-device.h (module 'mesh'): ns3::Time ns3::MeshPointDevice::GetForwardingDelay() const [member function]
+    cls.add_method('GetForwardingDelay', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
     ## mesh-point-device.h (module 'mesh'): uint32_t ns3::MeshPointDevice::GetIfIndex() const [member function]
     cls.add_method('GetIfIndex', 
                    'uint32_t', 
@@ -12261,7 +10924,7 @@
                    'ns3::Ptr< ns3::NetDevice >', 
                    [param('uint32_t', 'id')], 
                    is_const=True)
-    ## mesh-point-device.h (module 'mesh'): std::vector<ns3::Ptr<ns3::NetDevice>, std::allocator<ns3::Ptr<ns3::NetDevice> > > ns3::MeshPointDevice::GetInterfaces() const [member function]
+    ## mesh-point-device.h (module 'mesh'): std::vector<ns3::Ptr<ns3::NetDevice>, std::allocator<ns3::Ptr<ns3::NetDevice>>> ns3::MeshPointDevice::GetInterfaces() const [member function]
     cls.add_method('GetInterfaces', 
                    'std::vector< ns3::Ptr< ns3::NetDevice > >', 
                    [], 
@@ -12391,139 +11054,6 @@
                    is_const=True, is_virtual=True)
     return
 
-def register_Ns3MeshWifiInterfaceMac_methods(root_module, cls):
-    ## mesh-wifi-interface-mac.h (module 'mesh'): ns3::MeshWifiInterfaceMac::MeshWifiInterfaceMac() [constructor]
-    cls.add_constructor([])
-    ## mesh-wifi-interface-mac.h (module 'mesh'): int64_t ns3::MeshWifiInterfaceMac::AssignStreams(int64_t stream) [member function]
-    cls.add_method('AssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'stream')])
-    ## mesh-wifi-interface-mac.h (module 'mesh'): bool ns3::MeshWifiInterfaceMac::CheckSupportedRates(ns3::SupportedRates rates) const [member function]
-    cls.add_method('CheckSupportedRates', 
-                   'bool', 
-                   [param('ns3::SupportedRates', 'rates')], 
-                   is_const=True)
-    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::ConfigureStandard(ns3::WifiStandard standard) [member function]
-    cls.add_method('ConfigureStandard', 
-                   'void', 
-                   [param('ns3::WifiStandard', 'standard')], 
-                   is_virtual=True)
-    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to, ns3::Mac48Address from) [member function]
-    cls.add_method('Enqueue', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to'), param('ns3::Mac48Address', 'from')], 
-                   is_virtual=True)
-    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to) [member function]
-    cls.add_method('Enqueue', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to')], 
-                   is_virtual=True)
-    ## mesh-wifi-interface-mac.h (module 'mesh'): ns3::Time ns3::MeshWifiInterfaceMac::GetBeaconInterval() const [member function]
-    cls.add_method('GetBeaconInterval', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True)
-    ## mesh-wifi-interface-mac.h (module 'mesh'): uint16_t ns3::MeshWifiInterfaceMac::GetFrequencyChannel() const [member function]
-    cls.add_method('GetFrequencyChannel', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## mesh-wifi-interface-mac.h (module 'mesh'): uint32_t ns3::MeshWifiInterfaceMac::GetLinkMetric(ns3::Mac48Address peerAddress) [member function]
-    cls.add_method('GetLinkMetric', 
-                   'uint32_t', 
-                   [param('ns3::Mac48Address', 'peerAddress')])
-    ## mesh-wifi-interface-mac.h (module 'mesh'): ns3::Mac48Address ns3::MeshWifiInterfaceMac::GetMeshPointAddress() const [member function]
-    cls.add_method('GetMeshPointAddress', 
-                   'ns3::Mac48Address', 
-                   [], 
-                   is_const=True)
-    ## mesh-wifi-interface-mac.h (module 'mesh'): ns3::SupportedRates ns3::MeshWifiInterfaceMac::GetSupportedRates() const [member function]
-    cls.add_method('GetSupportedRates', 
-                   'ns3::SupportedRates', 
-                   [], 
-                   is_const=True)
-    ## mesh-wifi-interface-mac.h (module 'mesh'): ns3::Time ns3::MeshWifiInterfaceMac::GetTbtt() const [member function]
-    cls.add_method('GetTbtt', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True)
-    ## mesh-wifi-interface-mac.h (module 'mesh'): static ns3::TypeId ns3::MeshWifiInterfaceMac::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::InstallPlugin(ns3::Ptr<ns3::MeshWifiInterfaceMacPlugin> plugin) [member function]
-    cls.add_method('InstallPlugin', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::MeshWifiInterfaceMacPlugin >', 'plugin')])
-    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::Report(std::ostream & os) const [member function]
-    cls.add_method('Report', 
-                   'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_const=True)
-    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::ResetStats() [member function]
-    cls.add_method('ResetStats', 
-                   'void', 
-                   [])
-    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::SendManagementFrame(ns3::Ptr<ns3::Packet> frame, ns3::WifiMacHeader const & hdr) [member function]
-    cls.add_method('SendManagementFrame', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'frame'), param('ns3::WifiMacHeader const &', 'hdr')])
-    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::SetBeaconGeneration(bool enable) [member function]
-    cls.add_method('SetBeaconGeneration', 
-                   'void', 
-                   [param('bool', 'enable')])
-    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::SetBeaconInterval(ns3::Time interval) [member function]
-    cls.add_method('SetBeaconInterval', 
-                   'void', 
-                   [param('ns3::Time', 'interval')])
-    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::SetLinkMetricCallback(ns3::Callback<unsigned int, ns3::Mac48Address, ns3::Ptr<ns3::MeshWifiInterfaceMac>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> cb) [member function]
-    cls.add_method('SetLinkMetricCallback', 
-                   'void', 
-                   [param('ns3::Callback< unsigned int, ns3::Mac48Address, ns3::Ptr< ns3::MeshWifiInterfaceMac >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'cb')])
-    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::SetLinkUpCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkUp) [member function]
-    cls.add_method('SetLinkUpCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkUp')], 
-                   is_virtual=True)
-    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::SetMeshPointAddress(ns3::Mac48Address addr) [member function]
-    cls.add_method('SetMeshPointAddress', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'addr')])
-    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::SetRandomStartDelay(ns3::Time interval) [member function]
-    cls.add_method('SetRandomStartDelay', 
-                   'void', 
-                   [param('ns3::Time', 'interval')])
-    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::ShiftTbtt(ns3::Time shift) [member function]
-    cls.add_method('ShiftTbtt', 
-                   'void', 
-                   [param('ns3::Time', 'shift')])
-    ## mesh-wifi-interface-mac.h (module 'mesh'): bool ns3::MeshWifiInterfaceMac::SupportsSendFrom() const [member function]
-    cls.add_method('SupportsSendFrom', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::SwitchFrequencyChannel(uint16_t new_id) [member function]
-    cls.add_method('SwitchFrequencyChannel', 
-                   'void', 
-                   [param('uint16_t', 'new_id')])
-    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::DoDispose() [member function]
-    cls.add_method('DoDispose', 
-                   'void', 
-                   [], 
-                   is_virtual=True, visibility='private')
-    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::DoInitialize() [member function]
-    cls.add_method('DoInitialize', 
-                   'void', 
-                   [], 
-                   is_virtual=True, visibility='private')
-    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::Receive(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('Receive', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
-                   is_virtual=True, visibility='private')
-    return
-
 def register_Ns3HashImplementation_methods(root_module, cls):
     ## hash-function.h (module 'core'): ns3::Hash::Implementation::Implementation(ns3::Hash::Implementation const & arg0) [constructor]
     cls.add_constructor([param('ns3::Hash::Implementation const &', 'arg0')])
@@ -12766,7 +11296,7 @@
     cls.add_method('ResetStats', 
                    'void', 
                    [])
-    ## hwmp-protocol.h (module 'mesh'): void ns3::dot11s::HwmpProtocol::SetNeighboursCallback(ns3::Callback<std::vector<ns3::Mac48Address, std::allocator<ns3::Mac48Address> >, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> cb) [member function]
+    ## hwmp-protocol.h (module 'mesh'): void ns3::dot11s::HwmpProtocol::SetNeighboursCallback(ns3::Callback<std::vector<ns3::Mac48Address, std::allocator<ns3::Mac48Address>>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> cb) [member function]
     cls.add_method('SetNeighboursCallback', 
                    'void', 
                    [param('ns3::Callback< std::vector< ns3::Mac48Address >, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'cb')])
@@ -12839,7 +11369,7 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## hwmp-rtable.h (module 'mesh'): std::vector<ns3::dot11s::HwmpProtocol::FailedDestination, std::allocator<ns3::dot11s::HwmpProtocol::FailedDestination> > ns3::dot11s::HwmpRtable::GetUnreachableDestinations(ns3::Mac48Address peerAddress) [member function]
+    ## hwmp-rtable.h (module 'mesh'): std::vector<ns3::dot11s::HwmpProtocol::FailedDestination, std::allocator<ns3::dot11s::HwmpProtocol::FailedDestination>> ns3::dot11s::HwmpRtable::GetUnreachableDestinations(ns3::Mac48Address peerAddress) [member function]
     cls.add_method('GetUnreachableDestinations', 
                    'std::vector< ns3::dot11s::HwmpProtocol::FailedDestination >', 
                    [param('ns3::Mac48Address', 'peerAddress')])
@@ -13269,7 +11799,7 @@
                    'ns3::WifiInformationElementId', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## ie-dot11s-perr.h (module 'mesh'): std::vector<ns3::dot11s::HwmpProtocol::FailedDestination, std::allocator<ns3::dot11s::HwmpProtocol::FailedDestination> > ns3::dot11s::IePerr::GetAddressUnitVector() const [member function]
+    ## ie-dot11s-perr.h (module 'mesh'): std::vector<ns3::dot11s::HwmpProtocol::FailedDestination, std::allocator<ns3::dot11s::HwmpProtocol::FailedDestination>> ns3::dot11s::IePerr::GetAddressUnitVector() const [member function]
     cls.add_method('GetAddressUnitVector', 
                    'std::vector< ns3::dot11s::HwmpProtocol::FailedDestination >', 
                    [], 
@@ -13466,7 +11996,7 @@
                    'uint8_t', 
                    [], 
                    is_const=True)
-    ## ie-dot11s-preq.h (module 'mesh'): std::vector<ns3::Ptr<ns3::dot11s::DestinationAddressUnit>, std::allocator<ns3::Ptr<ns3::dot11s::DestinationAddressUnit> > > ns3::dot11s::IePreq::GetDestinationList() [member function]
+    ## ie-dot11s-preq.h (module 'mesh'): std::vector<ns3::Ptr<ns3::dot11s::DestinationAddressUnit>, std::allocator<ns3::Ptr<ns3::dot11s::DestinationAddressUnit>>> ns3::dot11s::IePreq::GetDestinationList() [member function]
     cls.add_method('GetDestinationList', 
                    'std::vector< ns3::Ptr< ns3::dot11s::DestinationAddressUnit > >', 
                    [])
@@ -14097,12 +12627,12 @@
     cls.add_method('GetNumberOfLinks', 
                    'uint8_t', 
                    [])
-    ## peer-management-protocol.h (module 'mesh'): std::vector<ns3::Ptr<ns3::dot11s::PeerLink>, std::allocator<ns3::Ptr<ns3::dot11s::PeerLink> > > ns3::dot11s::PeerManagementProtocol::GetPeerLinks() const [member function]
+    ## peer-management-protocol.h (module 'mesh'): std::vector<ns3::Ptr<ns3::dot11s::PeerLink>, std::allocator<ns3::Ptr<ns3::dot11s::PeerLink>>> ns3::dot11s::PeerManagementProtocol::GetPeerLinks() const [member function]
     cls.add_method('GetPeerLinks', 
                    'std::vector< ns3::Ptr< ns3::dot11s::PeerLink > >', 
                    [], 
                    is_const=True)
-    ## peer-management-protocol.h (module 'mesh'): std::vector<ns3::Mac48Address, std::allocator<ns3::Mac48Address> > ns3::dot11s::PeerManagementProtocol::GetPeers(uint32_t interface) const [member function]
+    ## peer-management-protocol.h (module 'mesh'): std::vector<ns3::Mac48Address, std::allocator<ns3::Mac48Address>> ns3::dot11s::PeerManagementProtocol::GetPeers(uint32_t interface) const [member function]
     cls.add_method('GetPeers', 
                    'std::vector< ns3::Mac48Address >', 
                    [param('uint32_t', 'interface')], 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/mesh/bindings/modulegen__gcc_LP64.py ns-3.36/src/mesh/bindings/modulegen__gcc_LP64.py
--- ns-3.35/src/mesh/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/mesh/bindings/modulegen__gcc_LP64.py	2022-04-30 18:23:58.066734600 -0700
@@ -20,16 +20,10 @@
 def register_types(module):
     root_module = module.get_root()
     
-    ## regular-wifi-mac.h (module 'wifi'): ns3::WifiTxTimerReason [enumeration]
-    module.add_enum('WifiTxTimerReason', [], import_from_module='ns.wifi')
-    ## wifi-mac.h (module 'wifi'): ns3::WifiMacDropReason [enumeration]
-    module.add_enum('WifiMacDropReason', ['WIFI_MAC_DROP_FAILED_ENQUEUE', 'WIFI_MAC_DROP_EXPIRED_LIFETIME', 'WIFI_MAC_DROP_REACHED_RETRY_LIMIT', 'WIFI_MAC_DROP_QOS_OLD_PACKET'], import_from_module='ns.wifi')
-    ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacType [enumeration]
-    module.add_enum('WifiMacType', ['WIFI_MAC_CTL_TRIGGER', 'WIFI_MAC_CTL_CTLWRAPPER', 'WIFI_MAC_CTL_RTS', 'WIFI_MAC_CTL_CTS', 'WIFI_MAC_CTL_ACK', 'WIFI_MAC_CTL_BACKREQ', 'WIFI_MAC_CTL_BACKRESP', 'WIFI_MAC_CTL_END', 'WIFI_MAC_CTL_END_ACK', 'WIFI_MAC_MGT_BEACON', 'WIFI_MAC_MGT_ASSOCIATION_REQUEST', 'WIFI_MAC_MGT_ASSOCIATION_RESPONSE', 'WIFI_MAC_MGT_DISASSOCIATION', 'WIFI_MAC_MGT_REASSOCIATION_REQUEST', 'WIFI_MAC_MGT_REASSOCIATION_RESPONSE', 'WIFI_MAC_MGT_PROBE_REQUEST', 'WIFI_MAC_MGT_PROBE_RESPONSE', 'WIFI_MAC_MGT_AUTHENTICATION', 'WIFI_MAC_MGT_DEAUTHENTICATION', 'WIFI_MAC_MGT_ACTION', 'WIFI_MAC_MGT_ACTION_NO_ACK', 'WIFI_MAC_MGT_MULTIHOP_ACTION', 'WIFI_MAC_DATA', 'WIFI_MAC_DATA_CFACK', 'WIFI_MAC_DATA_CFPOLL', 'WIFI_MAC_DATA_CFACK_CFPOLL', 'WIFI_MAC_DATA_NULL', 'WIFI_MAC_DATA_NULL_CFACK', 'WIFI_MAC_DATA_NULL_CFPOLL', 'WIFI_MAC_DATA_NULL_CFACK_CFPOLL', 'WIFI_MAC_QOSDATA', 'WIFI_MAC_QOSDATA_CFACK', 'WIFI_MAC_QOSDATA_CFPOLL', 'WIFI_MAC_QOSDATA_CFACK_CFPOLL', 'WIFI_MAC_QOSDATA_NULL', 'WIFI_MAC_QOSDATA_NULL_CFPOLL', 'WIFI_MAC_QOSDATA_NULL_CFACK_CFPOLL'], import_from_module='ns.wifi')
     ## wifi-mac.h (module 'wifi'): ns3::TypeOfStation [enumeration]
     module.add_enum('TypeOfStation', ['STA', 'AP', 'ADHOC_STA', 'MESH', 'OCB'], import_from_module='ns.wifi')
-    ## qos-utils.h (module 'wifi'): ns3::AcIndex [enumeration]
-    module.add_enum('AcIndex', ['AC_BE', 'AC_BK', 'AC_VI', 'AC_VO', 'AC_BE_NQOS', 'AC_BEACON', 'AC_UNDEF'], import_from_module='ns.wifi')
+    ## wifi-mac.h (module 'wifi'): ns3::WifiMacDropReason [enumeration]
+    module.add_enum('WifiMacDropReason', ['WIFI_MAC_DROP_FAILED_ENQUEUE', 'WIFI_MAC_DROP_EXPIRED_LIFETIME', 'WIFI_MAC_DROP_REACHED_RETRY_LIMIT', 'WIFI_MAC_DROP_QOS_OLD_PACKET'], import_from_module='ns.wifi')
     ## wifi-phy-common.h (module 'wifi'): ns3::WifiPreamble [enumeration]
     module.add_enum('WifiPreamble', ['WIFI_PREAMBLE_LONG', 'WIFI_PREAMBLE_SHORT', 'WIFI_PREAMBLE_HT_MF', 'WIFI_PREAMBLE_VHT_SU', 'WIFI_PREAMBLE_VHT_MU', 'WIFI_PREAMBLE_HE_SU', 'WIFI_PREAMBLE_HE_ER_SU', 'WIFI_PREAMBLE_HE_MU', 'WIFI_PREAMBLE_HE_TB'], import_from_module='ns.wifi')
     ## wifi-phy-common.h (module 'wifi'): ns3::WifiModulationClass [enumeration]
@@ -39,19 +33,17 @@
     ## wifi-phy-common.h (module 'wifi'): ns3::WifiPpduType [enumeration]
     module.add_enum('WifiPpduType', ['WIFI_PPDU_TYPE_SU', 'WIFI_PPDU_TYPE_DL_MU', 'WIFI_PPDU_TYPE_UL_MU'], import_from_module='ns.wifi')
     ## wifi-phy-common.h (module 'wifi'): ns3::WifiPhyRxfailureReason [enumeration]
-    module.add_enum('WifiPhyRxfailureReason', ['UNKNOWN', 'UNSUPPORTED_SETTINGS', 'CHANNEL_SWITCHING', 'RXING', 'TXING', 'SLEEPING', 'BUSY_DECODING_PREAMBLE', 'PREAMBLE_DETECT_FAILURE', 'RECEPTION_ABORTED_BY_TX', 'L_SIG_FAILURE', 'HT_SIG_FAILURE', 'SIG_A_FAILURE', 'SIG_B_FAILURE', 'PREAMBLE_DETECTION_PACKET_SWITCH', 'FRAME_CAPTURE_PACKET_SWITCH', 'OBSS_PD_CCA_RESET', 'HE_TB_PPDU_TOO_LATE', 'FILTERED'], import_from_module='ns.wifi')
-    ## wifi-standards.h (module 'wifi'): ns3::WifiPhyStandard [enumeration]
-    module.add_enum('WifiPhyStandard', ['WIFI_PHY_STANDARD_80211a', 'WIFI_PHY_STANDARD_80211b', 'WIFI_PHY_STANDARD_80211g', 'WIFI_PHY_STANDARD_80211p', 'WIFI_PHY_STANDARD_80211n', 'WIFI_PHY_STANDARD_80211ac', 'WIFI_PHY_STANDARD_80211ax', 'WIFI_PHY_STANDARD_UNSPECIFIED'], import_from_module='ns.wifi')
-    ## wifi-standards.h (module 'wifi'): ns3::WifiMacStandard [enumeration]
-    module.add_enum('WifiMacStandard', ['WIFI_MAC_STANDARD_80211', 'WIFI_MAC_STANDARD_80211n', 'WIFI_MAC_STANDARD_80211ac', 'WIFI_MAC_STANDARD_80211ax'], import_from_module='ns.wifi')
+    module.add_enum('WifiPhyRxfailureReason', ['UNKNOWN', 'UNSUPPORTED_SETTINGS', 'CHANNEL_SWITCHING', 'RXING', 'TXING', 'SLEEPING', 'POWERED_OFF', 'TRUNCATED_TX', 'BUSY_DECODING_PREAMBLE', 'PREAMBLE_DETECT_FAILURE', 'RECEPTION_ABORTED_BY_TX', 'L_SIG_FAILURE', 'HT_SIG_FAILURE', 'SIG_A_FAILURE', 'SIG_B_FAILURE', 'PREAMBLE_DETECTION_PACKET_SWITCH', 'FRAME_CAPTURE_PACKET_SWITCH', 'OBSS_PD_CCA_RESET', 'HE_TB_PPDU_TOO_LATE', 'FILTERED'], import_from_module='ns.wifi')
+    ## ht-operation.h (module 'wifi'): ns3::HtProtectionType [enumeration]
+    module.add_enum('HtProtectionType', ['NO_PROTECTION', 'NON_MEMBER_PROTECTION', 'TWENTY_MHZ_PROTECTION', 'MIXED_MODE_PROTECTION'], import_from_module='ns.wifi')
+    ## qos-utils.h (module 'wifi'): ns3::AcIndex [enumeration]
+    module.add_enum('AcIndex', ['AC_BE', 'AC_BK', 'AC_VI', 'AC_VO', 'AC_BE_NQOS', 'AC_BEACON', 'AC_UNDEF'], import_from_module='ns.wifi')
     ## wifi-standards.h (module 'wifi'): ns3::WifiStandard [enumeration]
-    module.add_enum('WifiStandard', ['WIFI_STANDARD_80211a', 'WIFI_STANDARD_80211b', 'WIFI_STANDARD_80211g', 'WIFI_STANDARD_80211p', 'WIFI_STANDARD_80211n_2_4GHZ', 'WIFI_STANDARD_80211n_5GHZ', 'WIFI_STANDARD_80211ac', 'WIFI_STANDARD_80211ax_2_4GHZ', 'WIFI_STANDARD_80211ax_5GHZ', 'WIFI_STANDARD_80211ax_6GHZ'], import_from_module='ns.wifi')
+    module.add_enum('WifiStandard', ['WIFI_STANDARD_UNSPECIFIED', 'WIFI_STANDARD_80211a', 'WIFI_STANDARD_80211b', 'WIFI_STANDARD_80211g', 'WIFI_STANDARD_80211p', 'WIFI_STANDARD_80211n', 'WIFI_STANDARD_80211ac', 'WIFI_STANDARD_80211ax'], import_from_module='ns.wifi')
     ## wifi-standards.h (module 'wifi'): ns3::FrequencyChannelType [enumeration]
     module.add_enum('FrequencyChannelType', ['WIFI_PHY_DSSS_CHANNEL', 'WIFI_PHY_OFDM_CHANNEL', 'WIFI_PHY_80211p_CHANNEL'], import_from_module='ns.wifi')
     ## wifi-phy-band.h (module 'wifi'): ns3::WifiPhyBand [enumeration]
     module.add_enum('WifiPhyBand', ['WIFI_PHY_BAND_2_4GHZ', 'WIFI_PHY_BAND_5GHZ', 'WIFI_PHY_BAND_6GHZ', 'WIFI_PHY_BAND_UNSPECIFIED'], import_from_module='ns.wifi')
-    ## ht-operation.h (module 'wifi'): ns3::HtProtectionType [enumeration]
-    module.add_enum('HtProtectionType', ['NO_PROTECTION', 'NON_MEMBER_PROTECTION', 'TWENTY_MHZ_PROTECTION', 'MIXED_MODE_PROTECTION'], import_from_module='ns.wifi')
     ## log.h (module 'core'): ns3::LogLevel [enumeration]
     module.add_enum('LogLevel', ['LOG_NONE', 'LOG_ERROR', 'LOG_LEVEL_ERROR', 'LOG_WARN', 'LOG_LEVEL_WARN', 'LOG_DEBUG', 'LOG_LEVEL_DEBUG', 'LOG_INFO', 'LOG_LEVEL_INFO', 'LOG_FUNCTION', 'LOG_LEVEL_FUNCTION', 'LOG_LOGIC', 'LOG_LEVEL_LOGIC', 'LOG_ALL', 'LOG_LEVEL_ALL', 'LOG_PREFIX_FUNC', 'LOG_PREFIX_TIME', 'LOG_PREFIX_NODE', 'LOG_PREFIX_LEVEL', 'LOG_PREFIX_ALL'], import_from_module='ns.core')
     ## address.h (module 'network'): ns3::Address [class]
@@ -65,10 +57,6 @@
     typehandlers.add_type_alias('std::list< ns3::AttributeConstructionList::Item > const_iterator', 'ns3::AttributeConstructionList::CIterator')
     typehandlers.add_type_alias('std::list< ns3::AttributeConstructionList::Item > const_iterator*', 'ns3::AttributeConstructionList::CIterator*')
     typehandlers.add_type_alias('std::list< ns3::AttributeConstructionList::Item > const_iterator&', 'ns3::AttributeConstructionList::CIterator&')
-    ## block-ack-manager.h (module 'wifi'): ns3::Bar [struct]
-    module.add_class('Bar', import_from_module='ns.wifi')
-    ## block-ack-agreement.h (module 'wifi'): ns3::BlockAckAgreement [class]
-    module.add_class('BlockAckAgreement', allow_subclassing=True, import_from_module='ns.wifi')
     ## block-ack-type.h (module 'wifi'): ns3::BlockAckReqType [struct]
     module.add_class('BlockAckReqType', import_from_module='ns.wifi')
     ## block-ack-type.h (module 'wifi'): ns3::BlockAckReqType::Variant [enumeration]
@@ -77,8 +65,6 @@
     module.add_class('BlockAckType', import_from_module='ns.wifi')
     ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::Variant [enumeration]
     module.add_enum('Variant', ['BASIC', 'COMPRESSED', 'EXTENDED_COMPRESSED', 'MULTI_TID', 'MULTI_STA'], outer_class=root_module['ns3::BlockAckType'], import_from_module='ns.wifi')
-    ## block-ack-window.h (module 'wifi'): ns3::BlockAckWindow [class]
-    module.add_class('BlockAckWindow', import_from_module='ns.wifi')
     ## buffer.h (module 'network'): ns3::Buffer [class]
     module.add_class('Buffer', import_from_module='ns.network')
     ## buffer.h (module 'network'): ns3::Buffer::Iterator [class]
@@ -121,36 +107,16 @@
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::TraceSourceAccessor'])
     ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::WifiInformationElement> [struct]
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::WifiInformationElement'])
-    ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::WifiMacQueueItem> [struct]
-    module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::WifiMacQueueItem'])
     ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::dot11s::DestinationAddressUnit> [struct]
     module.add_class('DefaultDeleter', template_parameters=['ns3::dot11s::DestinationAddressUnit'])
     ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::dot11s::IeBeaconTimingUnit> [struct]
     module.add_class('DefaultDeleter', template_parameters=['ns3::dot11s::IeBeaconTimingUnit'])
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'], import_from_module='ns.core')
     ## hash.h (module 'core'): ns3::Hasher [class]
     module.add_class('Hasher', import_from_module='ns.core')
-    ## wifi-tx-vector.h (module 'wifi'): ns3::HeMuUserInfo [struct]
-    module.add_class('HeMuUserInfo', import_from_module='ns.wifi')
-    ## he-ru.h (module 'wifi'): ns3::HeRu [class]
-    module.add_class('HeRu', import_from_module='ns.wifi')
-    ## he-ru.h (module 'wifi'): ns3::HeRu::RuType [enumeration]
-    module.add_enum('RuType', ['RU_26_TONE', 'RU_52_TONE', 'RU_106_TONE', 'RU_242_TONE', 'RU_484_TONE', 'RU_996_TONE', 'RU_2x996_TONE'], outer_class=root_module['ns3::HeRu'], import_from_module='ns.wifi')
-    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec [class]
-    module.add_class('RuSpec', import_from_module='ns.wifi', outer_class=root_module['ns3::HeRu'])
-    typehandlers.add_type_alias('std::pair< short, short >', 'ns3::HeRu::SubcarrierRange')
-    typehandlers.add_type_alias('std::pair< short, short >*', 'ns3::HeRu::SubcarrierRange*')
-    typehandlers.add_type_alias('std::pair< short, short >&', 'ns3::HeRu::SubcarrierRange&')
-    typehandlers.add_type_alias('std::vector< std::pair< short, short > >', 'ns3::HeRu::SubcarrierGroup')
-    typehandlers.add_type_alias('std::vector< std::pair< short, short > >*', 'ns3::HeRu::SubcarrierGroup*')
-    typehandlers.add_type_alias('std::vector< std::pair< short, short > >&', 'ns3::HeRu::SubcarrierGroup&')
-    typehandlers.add_type_alias('std::pair< unsigned char, ns3::HeRu::RuType >', 'ns3::HeRu::BwTonesPair')
-    typehandlers.add_type_alias('std::pair< unsigned char, ns3::HeRu::RuType >*', 'ns3::HeRu::BwTonesPair*')
-    typehandlers.add_type_alias('std::pair< unsigned char, ns3::HeRu::RuType >&', 'ns3::HeRu::BwTonesPair&')
-    typehandlers.add_type_alias('std::map< std::pair< unsigned char, ns3::HeRu::RuType >, std::vector< std::vector< std::pair< short, short > > > >', 'ns3::HeRu::SubcarrierGroups')
-    typehandlers.add_type_alias('std::map< std::pair< unsigned char, ns3::HeRu::RuType >, std::vector< std::vector< std::pair< short, short > > > >*', 'ns3::HeRu::SubcarrierGroups*')
-    typehandlers.add_type_alias('std::map< std::pair< unsigned char, ns3::HeRu::RuType >, std::vector< std::vector< std::pair< short, short > > > >&', 'ns3::HeRu::SubcarrierGroups&')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     module.add_class('Ipv4Address', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
@@ -195,10 +161,6 @@
     module.add_class('ObjectDeleter', import_from_module='ns.core')
     ## object-factory.h (module 'core'): ns3::ObjectFactory [class]
     module.add_class('ObjectFactory', import_from_module='ns.core')
-    ## originator-block-ack-agreement.h (module 'wifi'): ns3::OriginatorBlockAckAgreement [class]
-    module.add_class('OriginatorBlockAckAgreement', import_from_module='ns.wifi', parent=root_module['ns3::BlockAckAgreement'])
-    ## originator-block-ack-agreement.h (module 'wifi'): ns3::OriginatorBlockAckAgreement::State [enumeration]
-    module.add_enum('State', ['PENDING', 'ESTABLISHED', 'NO_REPLY', 'RESET', 'REJECTED'], outer_class=root_module['ns3::OriginatorBlockAckAgreement'], import_from_module='ns.wifi')
     ## packet-metadata.h (module 'network'): ns3::PacketMetadata [class]
     module.add_class('PacketMetadata', import_from_module='ns.network')
     ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item [struct]
@@ -234,8 +196,6 @@
     typehandlers.add_type_alias('void ( * ) ( ns3::Time )&', 'ns3::Time::TracedCallback&')
     ## nstime.h (module 'core'): ns3::TimeWithUnit [class]
     module.add_class('TimeWithUnit', import_from_module='ns.core')
-    ## traced-value.h (module 'core'): ns3::TracedValue<unsigned int> [class]
-    module.add_class('TracedValue', import_from_module='ns.core', template_parameters=['unsigned int'])
     ## type-id.h (module 'core'): ns3::TypeId [class]
     module.add_class('TypeId', import_from_module='ns.core')
     ## type-id.h (module 'core'): ns3::TypeId::AttributeFlag [enumeration]
@@ -265,24 +225,18 @@
     typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::ConstellationSizeCallback')
     typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::ConstellationSizeCallback*')
     typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::ConstellationSizeCallback&')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::PhyRateCallback')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::PhyRateCallback*')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::PhyRateCallback&')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::PhyRateFromTxVectorCallback')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::PhyRateFromTxVectorCallback*')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::PhyRateFromTxVectorCallback&')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::DataRateCallback')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::DataRateCallback*')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::DataRateCallback&')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::DataRateFromTxVectorCallback')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::DataRateFromTxVectorCallback*')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::DataRateFromTxVectorCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::PhyRateCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::PhyRateCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::PhyRateCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::DataRateCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::DataRateCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::DataRateCallback&')
     typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::NonHtReferenceRateCallback')
     typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::NonHtReferenceRateCallback*')
     typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::NonHtReferenceRateCallback&')
-    typehandlers.add_type_alias('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::ModeAllowedCallback')
-    typehandlers.add_type_alias('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::ModeAllowedCallback*')
-    typehandlers.add_type_alias('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::ModeAllowedCallback&')
+    typehandlers.add_type_alias('ns3::Callback< bool, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::AllowedCallback')
+    typehandlers.add_type_alias('ns3::Callback< bool, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::AllowedCallback*')
+    typehandlers.add_type_alias('ns3::Callback< bool, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::AllowedCallback&')
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStation [struct]
     module.add_class('WifiRemoteStation', import_from_module='ns.wifi')
     ## wifi-remote-station-info.h (module 'wifi'): ns3::WifiRemoteStationInfo [class]
@@ -291,13 +245,6 @@
     module.add_class('WifiRemoteStationState', import_from_module='ns.wifi')
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState [enumeration]
     module.add_enum('', ['BRAND_NEW', 'DISASSOC', 'WAIT_ASSOC_TX_OK', 'GOT_ASSOC_TX_OK'], outer_class=root_module['ns3::WifiRemoteStationState'], import_from_module='ns.wifi')
-    ## wifi-standards.h (module 'wifi'): ns3::WifiStandardInfo [struct]
-    module.add_class('WifiStandardInfo', import_from_module='ns.wifi')
-    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector [class]
-    module.add_class('WifiTxVector', import_from_module='ns.wifi')
-    typehandlers.add_type_alias('std::map< unsigned short, ns3::HeMuUserInfo >', 'ns3::WifiTxVector::HeMuUserInfoMap')
-    typehandlers.add_type_alias('std::map< unsigned short, ns3::HeMuUserInfo >*', 'ns3::WifiTxVector::HeMuUserInfoMap*')
-    typehandlers.add_type_alias('std::map< unsigned short, ns3::HeMuUserInfo >&', 'ns3::WifiTxVector::HeMuUserInfoMap&')
     ## empty.h (module 'core'): ns3::empty [class]
     module.add_class('empty', import_from_module='ns.core')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t [class]
@@ -328,45 +275,46 @@
     module.add_class('Object', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter >'])
     ## object.h (module 'core'): ns3::Object::AggregateIterator [class]
     module.add_class('AggregateIterator', import_from_module='ns.core', outer_class=root_module['ns3::Object'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## random-variable-stream.h (module 'core'): ns3::RandomVariableStream [class]
+    module.add_class('RandomVariableStream', import_from_module='ns.core', parent=root_module['ns3::Object'])
+    ## random-variable-stream.h (module 'core'): ns3::SequentialRandomVariable [class]
+    module.add_class('SequentialRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MeshWifiInterfaceMacPlugin, ns3::empty, ns3::DefaultDeleter<ns3::MeshWifiInterfaceMacPlugin> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MeshWifiInterfaceMacPlugin, ns3::empty, ns3::DefaultDeleter<ns3::MeshWifiInterfaceMacPlugin>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::MeshWifiInterfaceMacPlugin', 'ns3::empty', 'ns3::DefaultDeleter<ns3::MeshWifiInterfaceMacPlugin>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::WifiInformationElement', 'ns3::empty', 'ns3::DefaultDeleter<ns3::WifiInformationElement>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiMacQueueItem, ns3::empty, ns3::DefaultDeleter<ns3::WifiMacQueueItem> > [class]
-    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::WifiMacQueueItem', 'ns3::empty', 'ns3::DefaultDeleter<ns3::WifiMacQueueItem>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::dot11s::DestinationAddressUnit, ns3::empty, ns3::DefaultDeleter<ns3::dot11s::DestinationAddressUnit> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::dot11s::DestinationAddressUnit, ns3::empty, ns3::DefaultDeleter<ns3::dot11s::DestinationAddressUnit>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::dot11s::DestinationAddressUnit', 'ns3::empty', 'ns3::DefaultDeleter<ns3::dot11s::DestinationAddressUnit>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::dot11s::IeBeaconTimingUnit, ns3::empty, ns3::DefaultDeleter<ns3::dot11s::IeBeaconTimingUnit> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::dot11s::IeBeaconTimingUnit, ns3::empty, ns3::DefaultDeleter<ns3::dot11s::IeBeaconTimingUnit>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::dot11s::IeBeaconTimingUnit', 'ns3::empty', 'ns3::DefaultDeleter<ns3::dot11s::IeBeaconTimingUnit>'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
     module.add_class('TraceSourceAccessor', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >'])
     ## trailer.h (module 'network'): ns3::Trailer [class]
     module.add_class('Trailer', import_from_module='ns.network', parent=root_module['ns3::Chunk'])
-    ## txop.h (module 'wifi'): ns3::Txop [class]
-    module.add_class('Txop', import_from_module='ns.wifi', parent=root_module['ns3::Object'])
-    ## txop.h (module 'wifi'): ns3::Txop::ChannelAccessStatus [enumeration]
-    module.add_enum('ChannelAccessStatus', ['NOT_REQUESTED', 'REQUESTED', 'GRANTED'], outer_class=root_module['ns3::Txop'], import_from_module='ns.wifi')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacDropReason, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::Txop::DroppedMpdu')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacDropReason, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::Txop::DroppedMpdu*')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacDropReason, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::Txop::DroppedMpdu&')
+    ## random-variable-stream.h (module 'core'): ns3::TriangularRandomVariable [class]
+    module.add_class('TriangularRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
+    ## random-variable-stream.h (module 'core'): ns3::UniformRandomVariable [class]
+    module.add_class('UniformRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
+    ## random-variable-stream.h (module 'core'): ns3::WeibullRandomVariable [class]
+    module.add_class('WeibullRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
     ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader [class]
     module.add_class('WifiActionHeader', import_from_module='ns.wifi', parent=root_module['ns3::Header'])
     ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::CategoryValue [enumeration]
@@ -397,26 +345,6 @@
     typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiMac::ForwardUpCallback')
     typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiMac::ForwardUpCallback*')
     typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiMac::ForwardUpCallback&')
-    ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacHeader [class]
-    module.add_class('WifiMacHeader', import_from_module='ns.wifi', parent=root_module['ns3::Header'])
-    ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacHeader::QosAckPolicy [enumeration]
-    module.add_enum('QosAckPolicy', ['NORMAL_ACK', 'NO_ACK', 'NO_EXPLICIT_ACK', 'BLOCK_ACK'], outer_class=root_module['ns3::WifiMacHeader'], import_from_module='ns.wifi')
-    ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacHeader::AddressType [enumeration]
-    module.add_enum('AddressType', ['ADDR1', 'ADDR2', 'ADDR3', 'ADDR4'], outer_class=root_module['ns3::WifiMacHeader'], import_from_module='ns.wifi')
-    typehandlers.add_type_alias('void ( * ) ( ns3::WifiMacHeader const & )', 'ns3::WifiMacHeader::TracedCallback')
-    typehandlers.add_type_alias('void ( * ) ( ns3::WifiMacHeader const & )*', 'ns3::WifiMacHeader::TracedCallback*')
-    typehandlers.add_type_alias('void ( * ) ( ns3::WifiMacHeader const & )&', 'ns3::WifiMacHeader::TracedCallback&')
-    ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem [class]
-    module.add_class('WifiMacQueueItem', import_from_module='ns.wifi', parent=root_module['ns3::SimpleRefCount< ns3::WifiMacQueueItem, ns3::empty, ns3::DefaultDeleter<ns3::WifiMacQueueItem> >'])
-    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > >', 'ns3::WifiMacQueueItem::DeaggregatedMsdus')
-    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > >*', 'ns3::WifiMacQueueItem::DeaggregatedMsdus*')
-    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > >&', 'ns3::WifiMacQueueItem::DeaggregatedMsdus&')
-    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > > const_iterator', 'ns3::WifiMacQueueItem::DeaggregatedMsdusCI')
-    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > > const_iterator*', 'ns3::WifiMacQueueItem::DeaggregatedMsdusCI*')
-    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > > const_iterator&', 'ns3::WifiMacQueueItem::DeaggregatedMsdusCI&')
-    typehandlers.add_type_alias('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'ns3::WifiMacQueueItem::ConstIterator')
-    typehandlers.add_type_alias('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator*', 'ns3::WifiMacQueueItem::ConstIterator*')
-    typehandlers.add_type_alias('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator&', 'ns3::WifiMacQueueItem::ConstIterator&')
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationManager [class]
     module.add_class('WifiRemoteStationManager', import_from_module='ns.wifi', parent=root_module['ns3::Object'])
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationManager::ProtectionMode [enumeration]
@@ -433,28 +361,16 @@
     typehandlers.add_type_alias('void ( * ) ( ns3::DataRate, ns3::DataRate, ns3::Mac48Address )', 'ns3::WifiRemoteStationManager::RateChangeTracedCallback')
     typehandlers.add_type_alias('void ( * ) ( ns3::DataRate, ns3::DataRate, ns3::Mac48Address )*', 'ns3::WifiRemoteStationManager::RateChangeTracedCallback*')
     typehandlers.add_type_alias('void ( * ) ( ns3::DataRate, ns3::DataRate, ns3::Mac48Address )&', 'ns3::WifiRemoteStationManager::RateChangeTracedCallback&')
-    ## amsdu-subframe-header.h (module 'wifi'): ns3::AmsduSubframeHeader [class]
-    module.add_class('AmsduSubframeHeader', import_from_module='ns.wifi', parent=root_module['ns3::Header'])
+    ## random-variable-stream.h (module 'core'): ns3::ZetaRandomVariable [class]
+    module.add_class('ZetaRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
+    ## random-variable-stream.h (module 'core'): ns3::ZipfRandomVariable [class]
+    module.add_class('ZipfRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
     ## attribute.h (module 'core'): ns3::AttributeAccessor [class]
     module.add_class('AttributeAccessor', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >'])
     ## attribute.h (module 'core'): ns3::AttributeChecker [class]
     module.add_class('AttributeChecker', allow_subclassing=False, automatic_type_narrowing=True, import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >'])
     ## attribute.h (module 'core'): ns3::AttributeValue [class]
     module.add_class('AttributeValue', allow_subclassing=False, automatic_type_narrowing=True, import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >'])
-    ## block-ack-manager.h (module 'wifi'): ns3::BlockAckManager [class]
-    module.add_class('BlockAckManager', import_from_module='ns.wifi', parent=root_module['ns3::Object'])
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::BlockAckManager::TxOk')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::BlockAckManager::TxOk*')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::BlockAckManager::TxOk&')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::BlockAckManager::TxFailed')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::BlockAckManager::TxFailed*')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::BlockAckManager::TxFailed&')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::BlockAckManager::DroppedOldMpdu')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::BlockAckManager::DroppedOldMpdu*')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::BlockAckManager::DroppedOldMpdu&')
-    typehandlers.add_type_alias('void ( * ) ( ns3::Time, ns3::Mac48Address, uint8_t, ns3::OriginatorBlockAckAgreement::State )', 'ns3::BlockAckManager::AgreementStateTracedCallback')
-    typehandlers.add_type_alias('void ( * ) ( ns3::Time, ns3::Mac48Address, uint8_t, ns3::OriginatorBlockAckAgreement::State )*', 'ns3::BlockAckManager::AgreementStateTracedCallback*')
-    typehandlers.add_type_alias('void ( * ) ( ns3::Time, ns3::Mac48Address, uint8_t, ns3::OriginatorBlockAckAgreement::State )&', 'ns3::BlockAckManager::AgreementStateTracedCallback&')
     ## boolean.h (module 'core'): ns3::BooleanChecker [class]
     module.add_class('BooleanChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
     ## boolean.h (module 'core'): ns3::BooleanValue [class]
@@ -467,16 +383,22 @@
     module.add_class('CallbackValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
     ## channel.h (module 'network'): ns3::Channel [class]
     module.add_class('Channel', import_from_module='ns.network', parent=root_module['ns3::Object'])
+    ## random-variable-stream.h (module 'core'): ns3::ConstantRandomVariable [class]
+    module.add_class('ConstantRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
     ## data-rate.h (module 'network'): ns3::DataRateChecker [class]
     module.add_class('DataRateChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
     ## data-rate.h (module 'network'): ns3::DataRateValue [class]
     module.add_class('DataRateValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
+    ## random-variable-stream.h (module 'core'): ns3::DeterministicRandomVariable [class]
+    module.add_class('DeterministicRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
     ## double.h (module 'core'): ns3::DoubleValue [class]
     module.add_class('DoubleValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
     ## dsss-parameter-set.h (module 'wifi'): ns3::DsssParameterSet [class]
     module.add_class('DsssParameterSet', import_from_module='ns.wifi', parent=root_module['ns3::WifiInformationElement'])
     ## edca-parameter-set.h (module 'wifi'): ns3::EdcaParameterSet [class]
     module.add_class('EdcaParameterSet', import_from_module='ns.wifi', parent=root_module['ns3::WifiInformationElement'])
+    ## random-variable-stream.h (module 'core'): ns3::EmpiricalRandomVariable [class]
+    module.add_class('EmpiricalRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
     ## attribute.h (module 'core'): ns3::EmptyAttributeAccessor [class]
     module.add_class('EmptyAttributeAccessor', import_from_module='ns.core', parent=root_module['ns3::AttributeAccessor'])
     ## attribute.h (module 'core'): ns3::EmptyAttributeChecker [class]
@@ -487,14 +409,20 @@
     module.add_class('EnumChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
     ## enum.h (module 'core'): ns3::EnumValue [class]
     module.add_class('EnumValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## random-variable-stream.h (module 'core'): ns3::ErlangRandomVariable [class]
+    module.add_class('ErlangRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
     ## erp-information.h (module 'wifi'): ns3::ErpInformation [class]
     module.add_class('ErpInformation', import_from_module='ns.wifi', parent=root_module['ns3::WifiInformationElement'])
     ## event-impl.h (module 'core'): ns3::EventImpl [class]
     module.add_class('EventImpl', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >'])
+    ## random-variable-stream.h (module 'core'): ns3::ExponentialRandomVariable [class]
+    module.add_class('ExponentialRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
     ## extended-capabilities.h (module 'wifi'): ns3::ExtendedCapabilities [class]
     module.add_class('ExtendedCapabilities', import_from_module='ns.wifi', parent=root_module['ns3::WifiInformationElement'])
     ## supported-rates.h (module 'wifi'): ns3::ExtendedSupportedRatesIE [class]
     module.add_class('ExtendedSupportedRatesIE', import_from_module='ns.wifi', parent=root_module['ns3::WifiInformationElement'])
+    ## random-variable-stream.h (module 'core'): ns3::GammaRandomVariable [class]
+    module.add_class('GammaRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
     ## he-capabilities.h (module 'wifi'): ns3::HeCapabilities [class]
     module.add_class('HeCapabilities', import_from_module='ns.wifi', parent=root_module['ns3::WifiInformationElement'])
     ## he-operation.h (module 'wifi'): ns3::HeOperation [class]
@@ -521,6 +449,8 @@
     module.add_class('Ipv6PrefixChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
     ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixValue [class]
     module.add_class('Ipv6PrefixValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
+    ## random-variable-stream.h (module 'core'): ns3::LogNormalRandomVariable [class]
+    module.add_class('LogNormalRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
     ## mac48-address.h (module 'network'): ns3::Mac48AddressChecker [class]
     module.add_class('Mac48AddressChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
     ## mac48-address.h (module 'network'): ns3::Mac48AddressValue [class]
@@ -534,6 +464,8 @@
     typehandlers.add_type_alias('ns3::Callback< void, bool, ns3::Ptr< ns3::Packet >, ns3::Mac48Address, ns3::Mac48Address, unsigned short, unsigned int, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::MeshL2RoutingProtocol::RouteReplyCallback&')
     ## mesh-stack-installer.h (module 'mesh'): ns3::MeshStack [class]
     module.add_class('MeshStack', parent=root_module['ns3::Object'])
+    ## mesh-wifi-interface-mac.h (module 'mesh'): ns3::MeshWifiInterfaceMac [class]
+    module.add_class('MeshWifiInterfaceMac', parent=root_module['ns3::WifiMac'])
     ## mesh-wifi-interface-mac-plugin.h (module 'mesh'): ns3::MeshWifiInterfaceMacPlugin [class]
     module.add_class('MeshWifiInterfaceMacPlugin', parent=root_module['ns3::SimpleRefCount< ns3::MeshWifiInterfaceMacPlugin, ns3::empty, ns3::DefaultDeleter<ns3::MeshWifiInterfaceMacPlugin> >'])
     ## mgt-headers.h (module 'wifi'): ns3::MgtBeaconHeader [class]
@@ -563,6 +495,8 @@
     typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::NetDevice >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::Node::DeviceAdditionListener')
     typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::NetDevice >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::Node::DeviceAdditionListener*')
     typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::NetDevice >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::Node::DeviceAdditionListener&')
+    ## random-variable-stream.h (module 'core'): ns3::NormalRandomVariable [class]
+    module.add_class('NormalRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
     ## object-factory.h (module 'core'): ns3::ObjectFactoryChecker [class]
     module.add_class('ObjectFactoryChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
     ## object-factory.h (module 'core'): ns3::ObjectFactoryValue [class]
@@ -587,10 +521,8 @@
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, double )', 'ns3::Packet::SinrTracedCallback')
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, double )*', 'ns3::Packet::SinrTracedCallback*')
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, double )&', 'ns3::Packet::SinrTracedCallback&')
-    ## qos-txop.h (module 'wifi'): ns3::QosTxop [class]
-    module.add_class('QosTxop', import_from_module='ns.wifi', parent=root_module['ns3::Txop'])
-    ## regular-wifi-mac.h (module 'wifi'): ns3::RegularWifiMac [class]
-    module.add_class('RegularWifiMac', import_from_module='ns.wifi', parent=root_module['ns3::WifiMac'])
+    ## random-variable-stream.h (module 'core'): ns3::ParetoRandomVariable [class]
+    module.add_class('ParetoRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
     ## ssid.h (module 'wifi'): ns3::Ssid [class]
     module.add_class('Ssid', import_from_module='ns.wifi', parent=root_module['ns3::WifiInformationElement'])
     ## ssid.h (module 'wifi'): ns3::SsidChecker [class]
@@ -621,20 +553,18 @@
     module.add_class('AddressValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
     ## bridge-channel.h (module 'bridge'): ns3::BridgeChannel [class]
     module.add_class('BridgeChannel', import_from_module='ns.bridge', parent=root_module['ns3::Channel'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['bool', 'const ns3::WifiTxVector &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<bool, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<const ns3::Packet>, unsigned short, const ns3::Address &, const ns3::Address &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['bool', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'const ns3::Address &', 'const ns3::Address &', 'ns3::NetDevice::PacketType', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<bool, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<const ns3::Packet>, unsigned short, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['bool', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'const ns3::Address &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['bool', 'unsigned short', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['ns3::ObjectBase *', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned long', 'const ns3::WifiTxVector &', 'unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned long', 'unsigned short', 'unsigned short', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, bool, ns3::Ptr<ns3::Packet>, ns3::Mac48Address, ns3::Mac48Address, unsigned short, unsigned int, ns3::empty, ns3::empty, ns3::empty> [class]
@@ -653,10 +583,6 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'const ns3::Address &', 'const ns3::Address &', 'ns3::NetDevice::PacketType', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::Mac48Address, unsigned char, ns3::OriginatorBlockAckAgreement::State, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Time', 'ns3::Mac48Address', 'unsigned char', 'ns3::OriginatorBlockAckAgreement::State', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Time', 'ns3::Time', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Time', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
@@ -667,42 +593,26 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned char', 'ns3::Ptr<const ns3::WifiMacQueueItem>', 'const ns3::WifiTxVector &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned char', 'ns3::Ptr<const ns3::WifiPsdu>', 'const ns3::WifiTxVector &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned char', 'std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *', 'const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *', 'unsigned long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned int', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned char', 'std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *', 'const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *', 'unsigned long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## dot11s-installer.h (module 'mesh'): ns3::Dot11sStack [class]
     module.add_class('Dot11sStack', parent=root_module['ns3::MeshStack'])
     ## flame-installer.h (module 'mesh'): ns3::FlameStack [class]
     module.add_class('FlameStack', parent=root_module['ns3::MeshStack'])
     ## mesh-point-device.h (module 'mesh'): ns3::MeshPointDevice [class]
     module.add_class('MeshPointDevice', parent=root_module['ns3::NetDevice'])
-    ## mesh-wifi-interface-mac.h (module 'mesh'): ns3::MeshWifiInterfaceMac [class]
-    module.add_class('MeshWifiInterfaceMac', parent=root_module['ns3::RegularWifiMac'])
     module.add_container('std::list< ns3::BlockAckReqType >', 'ns3::BlockAckReqType', container_type='list')
     module.add_container('std::vector< unsigned char >', 'unsigned char', container_type='vector')
-    module.add_container('std::vector< std::pair< short, short > >', 'std::pair< short, short >', container_type='vector')
-    module.add_container('std::vector< ns3::HeRu::RuSpec >', 'ns3::HeRu::RuSpec', container_type='vector')
-    module.add_container('ns3::HeRu::SubcarrierGroup', 'std::pair< short, short >', container_type='vector')
-    module.add_container('std::map< std::pair< unsigned char, ns3::HeRu::RuType >, std::vector< std::vector< std::pair< short, short > > > >', ('std::pair< unsigned char, ns3::HeRu::RuType >', 'std::vector< std::vector< std::pair< short, short > > >'), container_type='map')
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     module.add_container('ns3::WifiModeList', 'ns3::WifiMode', container_type='vector')
-    module.add_container('std::map< unsigned short, ns3::HeMuUserInfo >', ('short unsigned int', 'ns3::HeMuUserInfo'), container_type='map')
-    module.add_container('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > >', 'std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader >', container_type='list')
     module.add_container('std::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStation *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStation * > > >', ('ns3::Mac48Address', 'ns3::WifiRemoteStation *'), container_type='map')
     module.add_container('std::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStationState *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStationState * > > >', ('ns3::Mac48Address', 'ns3::WifiRemoteStationState *'), container_type='map')
-    module.add_container('std::set< unsigned char >', 'unsigned char', container_type='set')
     module.add_container('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > >', ('short unsigned int', 'ns3::Ptr< ns3::WifiPsdu >'), container_type='map')
     module.add_container('std::set< ns3::Mac48Address >', 'ns3::Mac48Address', container_type='set')
     module.add_container('std::vector< ns3::Ptr< ns3::NetDevice > >', 'ns3::Ptr< ns3::NetDevice >', container_type='vector')
     typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > >', 'ns3::WifiPsduMap')
     typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > >*', 'ns3::WifiPsduMap*')
     typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > >&', 'ns3::WifiPsduMap&')
-    typehandlers.add_type_alias('std::pair< ns3::Mac48Address, unsigned char >', 'ns3::WifiAddressTidPair')
-    typehandlers.add_type_alias('std::pair< ns3::Mac48Address, unsigned char >*', 'ns3::WifiAddressTidPair*')
-    typehandlers.add_type_alias('std::pair< ns3::Mac48Address, unsigned char >&', 'ns3::WifiAddressTidPair&')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode >', 'ns3::WifiModeList')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode >*', 'ns3::WifiModeList*')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode >&', 'ns3::WifiModeList&')
@@ -715,6 +625,9 @@
     typehandlers.add_type_alias('uint8_t', 'ns3::WifiInformationElementId')
     typehandlers.add_type_alias('uint8_t*', 'ns3::WifiInformationElementId*')
     typehandlers.add_type_alias('uint8_t&', 'ns3::WifiInformationElementId&')
+    typehandlers.add_type_alias('std::pair< ns3::Mac48Address, unsigned char >', 'ns3::WifiAddressTidPair')
+    typehandlers.add_type_alias('std::pair< ns3::Mac48Address, unsigned char >*', 'ns3::WifiAddressTidPair*')
+    typehandlers.add_type_alias('std::pair< ns3::Mac48Address, unsigned char >&', 'ns3::WifiAddressTidPair&')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )', 'ns3::TimePrinter')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )*', 'ns3::TimePrinter*')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )&', 'ns3::TimePrinter&')
@@ -798,6 +711,9 @@
     typehandlers.add_type_alias('void ( * ) ( ns3::Time, ns3::Time )', 'ns3::TracedValueCallback::Time')
     typehandlers.add_type_alias('void ( * ) ( ns3::Time, ns3::Time )*', 'ns3::TracedValueCallback::Time*')
     typehandlers.add_type_alias('void ( * ) ( ns3::Time, ns3::Time )&', 'ns3::TracedValueCallback::Time&')
+    typehandlers.add_type_alias('void ( * ) ( ns3::DataRate, ns3::DataRate )', 'ns3::TracedValueCallback::DataRate')
+    typehandlers.add_type_alias('void ( * ) ( ns3::DataRate, ns3::DataRate )*', 'ns3::TracedValueCallback::DataRate*')
+    typehandlers.add_type_alias('void ( * ) ( ns3::DataRate, ns3::DataRate )&', 'ns3::TracedValueCallback::DataRate&')
     typehandlers.add_type_alias('void ( * ) ( bool, bool )', 'ns3::TracedValueCallback::Bool')
     typehandlers.add_type_alias('void ( * ) ( bool, bool )*', 'ns3::TracedValueCallback::Bool*')
     typehandlers.add_type_alias('void ( * ) ( bool, bool )&', 'ns3::TracedValueCallback::Bool&')
@@ -831,9 +747,6 @@
     typehandlers.add_type_alias('void ( * ) (  )', 'ns3::TracedValueCallback::Void')
     typehandlers.add_type_alias('void ( * ) (  )*', 'ns3::TracedValueCallback::Void*')
     typehandlers.add_type_alias('void ( * ) (  )&', 'ns3::TracedValueCallback::Void&')
-    typehandlers.add_type_alias('void ( * ) ( ns3::DataRate, ns3::DataRate )', 'ns3::TracedValueCallback::DataRate')
-    typehandlers.add_type_alias('void ( * ) ( ns3::DataRate, ns3::DataRate )*', 'ns3::TracedValueCallback::DataRate*')
-    typehandlers.add_type_alias('void ( * ) ( ns3::DataRate, ns3::DataRate )&', 'ns3::TracedValueCallback::DataRate&')
 
 def register_types_ns3_dot11s(module):
     root_module = module.get_root()
@@ -953,11 +866,8 @@
     register_Ns3Address_methods(root_module, root_module['ns3::Address'])
     register_Ns3AttributeConstructionList_methods(root_module, root_module['ns3::AttributeConstructionList'])
     register_Ns3AttributeConstructionListItem_methods(root_module, root_module['ns3::AttributeConstructionList::Item'])
-    register_Ns3Bar_methods(root_module, root_module['ns3::Bar'])
-    register_Ns3BlockAckAgreement_methods(root_module, root_module['ns3::BlockAckAgreement'])
     register_Ns3BlockAckReqType_methods(root_module, root_module['ns3::BlockAckReqType'])
     register_Ns3BlockAckType_methods(root_module, root_module['ns3::BlockAckType'])
-    register_Ns3BlockAckWindow_methods(root_module, root_module['ns3::BlockAckWindow'])
     register_Ns3Buffer_methods(root_module, root_module['ns3::Buffer'])
     register_Ns3BufferIterator_methods(root_module, root_module['ns3::Buffer::Iterator'])
     register_Ns3ByteTagIterator_methods(root_module, root_module['ns3::ByteTagIterator'])
@@ -979,14 +889,10 @@
     register_Ns3DefaultDeleter__Ns3Packet_methods(root_module, root_module['ns3::DefaultDeleter< ns3::Packet >'])
     register_Ns3DefaultDeleter__Ns3TraceSourceAccessor_methods(root_module, root_module['ns3::DefaultDeleter< ns3::TraceSourceAccessor >'])
     register_Ns3DefaultDeleter__Ns3WifiInformationElement_methods(root_module, root_module['ns3::DefaultDeleter< ns3::WifiInformationElement >'])
-    register_Ns3DefaultDeleter__Ns3WifiMacQueueItem_methods(root_module, root_module['ns3::DefaultDeleter< ns3::WifiMacQueueItem >'])
     register_Ns3DefaultDeleter__Ns3Dot11sDestinationAddressUnit_methods(root_module, root_module['ns3::DefaultDeleter< ns3::dot11s::DestinationAddressUnit >'])
     register_Ns3DefaultDeleter__Ns3Dot11sIeBeaconTimingUnit_methods(root_module, root_module['ns3::DefaultDeleter< ns3::dot11s::IeBeaconTimingUnit >'])
     register_Ns3EventId_methods(root_module, root_module['ns3::EventId'])
     register_Ns3Hasher_methods(root_module, root_module['ns3::Hasher'])
-    register_Ns3HeMuUserInfo_methods(root_module, root_module['ns3::HeMuUserInfo'])
-    register_Ns3HeRu_methods(root_module, root_module['ns3::HeRu'])
-    register_Ns3HeRuRuSpec_methods(root_module, root_module['ns3::HeRu::RuSpec'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
     register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
@@ -1001,7 +907,6 @@
     register_Ns3ObjectBase_methods(root_module, root_module['ns3::ObjectBase'])
     register_Ns3ObjectDeleter_methods(root_module, root_module['ns3::ObjectDeleter'])
     register_Ns3ObjectFactory_methods(root_module, root_module['ns3::ObjectFactory'])
-    register_Ns3OriginatorBlockAckAgreement_methods(root_module, root_module['ns3::OriginatorBlockAckAgreement'])
     register_Ns3PacketMetadata_methods(root_module, root_module['ns3::PacketMetadata'])
     register_Ns3PacketMetadataItem_methods(root_module, root_module['ns3::PacketMetadata::Item'])
     register_Ns3PacketMetadataItemIterator_methods(root_module, root_module['ns3::PacketMetadata::ItemIterator'])
@@ -1016,7 +921,6 @@
     register_Ns3TagBuffer_methods(root_module, root_module['ns3::TagBuffer'])
     register_Ns3Time_methods(root_module, root_module['ns3::Time'])
     register_Ns3TimeWithUnit_methods(root_module, root_module['ns3::TimeWithUnit'])
-    register_Ns3TracedValue__Unsigned_int_methods(root_module, root_module['ns3::TracedValue< unsigned int >'])
     register_Ns3TypeId_methods(root_module, root_module['ns3::TypeId'])
     register_Ns3TypeIdAttributeInformation_methods(root_module, root_module['ns3::TypeId::AttributeInformation'])
     register_Ns3TypeIdTraceSourceInformation_methods(root_module, root_module['ns3::TypeId::TraceSourceInformation'])
@@ -1028,8 +932,6 @@
     register_Ns3WifiRemoteStation_methods(root_module, root_module['ns3::WifiRemoteStation'])
     register_Ns3WifiRemoteStationInfo_methods(root_module, root_module['ns3::WifiRemoteStationInfo'])
     register_Ns3WifiRemoteStationState_methods(root_module, root_module['ns3::WifiRemoteStationState'])
-    register_Ns3WifiStandardInfo_methods(root_module, root_module['ns3::WifiStandardInfo'])
-    register_Ns3WifiTxVector_methods(root_module, root_module['ns3::WifiTxVector'])
     register_Ns3Empty_methods(root_module, root_module['ns3::empty'])
     register_Ns3Int64x64_t_methods(root_module, root_module['ns3::int64x64_t'])
     register_Ns3Chunk_methods(root_module, root_module['ns3::Chunk'])
@@ -1044,6 +946,8 @@
     register_Ns3MgtReassocRequestHeader_methods(root_module, root_module['ns3::MgtReassocRequestHeader'])
     register_Ns3Object_methods(root_module, root_module['ns3::Object'])
     register_Ns3ObjectAggregateIterator_methods(root_module, root_module['ns3::Object::AggregateIterator'])
+    register_Ns3RandomVariableStream_methods(root_module, root_module['ns3::RandomVariableStream'])
+    register_Ns3SequentialRandomVariable_methods(root_module, root_module['ns3::SequentialRandomVariable'])
     register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >'])
     register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >'])
     register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >'])
@@ -1055,45 +959,50 @@
     register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >'])
     register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >'])
     register_Ns3SimpleRefCount__Ns3WifiInformationElement_Ns3Empty_Ns3DefaultDeleter__lt__ns3WifiInformationElement__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement> >'])
-    register_Ns3SimpleRefCount__Ns3WifiMacQueueItem_Ns3Empty_Ns3DefaultDeleter__lt__ns3WifiMacQueueItem__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::WifiMacQueueItem, ns3::empty, ns3::DefaultDeleter<ns3::WifiMacQueueItem> >'])
     register_Ns3SimpleRefCount__Ns3Dot11sDestinationAddressUnit_Ns3Empty_Ns3DefaultDeleter__lt__ns3Dot11sDestinationAddressUnit__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::dot11s::DestinationAddressUnit, ns3::empty, ns3::DefaultDeleter<ns3::dot11s::DestinationAddressUnit> >'])
     register_Ns3SimpleRefCount__Ns3Dot11sIeBeaconTimingUnit_Ns3Empty_Ns3DefaultDeleter__lt__ns3Dot11sIeBeaconTimingUnit__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::dot11s::IeBeaconTimingUnit, ns3::empty, ns3::DefaultDeleter<ns3::dot11s::IeBeaconTimingUnit> >'])
     register_Ns3TraceSourceAccessor_methods(root_module, root_module['ns3::TraceSourceAccessor'])
     register_Ns3Trailer_methods(root_module, root_module['ns3::Trailer'])
-    register_Ns3Txop_methods(root_module, root_module['ns3::Txop'])
+    register_Ns3TriangularRandomVariable_methods(root_module, root_module['ns3::TriangularRandomVariable'])
+    register_Ns3UniformRandomVariable_methods(root_module, root_module['ns3::UniformRandomVariable'])
+    register_Ns3WeibullRandomVariable_methods(root_module, root_module['ns3::WeibullRandomVariable'])
     register_Ns3WifiActionHeader_methods(root_module, root_module['ns3::WifiActionHeader'])
     register_Ns3WifiActionHeaderActionValue_methods(root_module, root_module['ns3::WifiActionHeader::ActionValue'])
     register_Ns3WifiInformationElement_methods(root_module, root_module['ns3::WifiInformationElement'])
     register_Ns3WifiInformationElementVector_methods(root_module, root_module['ns3::WifiInformationElementVector'])
     register_Ns3WifiMac_methods(root_module, root_module['ns3::WifiMac'])
-    register_Ns3WifiMacHeader_methods(root_module, root_module['ns3::WifiMacHeader'])
-    register_Ns3WifiMacQueueItem_methods(root_module, root_module['ns3::WifiMacQueueItem'])
     register_Ns3WifiRemoteStationManager_methods(root_module, root_module['ns3::WifiRemoteStationManager'])
-    register_Ns3AmsduSubframeHeader_methods(root_module, root_module['ns3::AmsduSubframeHeader'])
+    register_Ns3ZetaRandomVariable_methods(root_module, root_module['ns3::ZetaRandomVariable'])
+    register_Ns3ZipfRandomVariable_methods(root_module, root_module['ns3::ZipfRandomVariable'])
     register_Ns3AttributeAccessor_methods(root_module, root_module['ns3::AttributeAccessor'])
     register_Ns3AttributeChecker_methods(root_module, root_module['ns3::AttributeChecker'])
     register_Ns3AttributeValue_methods(root_module, root_module['ns3::AttributeValue'])
-    register_Ns3BlockAckManager_methods(root_module, root_module['ns3::BlockAckManager'])
     register_Ns3BooleanChecker_methods(root_module, root_module['ns3::BooleanChecker'])
     register_Ns3BooleanValue_methods(root_module, root_module['ns3::BooleanValue'])
     register_Ns3CallbackChecker_methods(root_module, root_module['ns3::CallbackChecker'])
     register_Ns3CallbackImplBase_methods(root_module, root_module['ns3::CallbackImplBase'])
     register_Ns3CallbackValue_methods(root_module, root_module['ns3::CallbackValue'])
     register_Ns3Channel_methods(root_module, root_module['ns3::Channel'])
+    register_Ns3ConstantRandomVariable_methods(root_module, root_module['ns3::ConstantRandomVariable'])
     register_Ns3DataRateChecker_methods(root_module, root_module['ns3::DataRateChecker'])
     register_Ns3DataRateValue_methods(root_module, root_module['ns3::DataRateValue'])
+    register_Ns3DeterministicRandomVariable_methods(root_module, root_module['ns3::DeterministicRandomVariable'])
     register_Ns3DoubleValue_methods(root_module, root_module['ns3::DoubleValue'])
     register_Ns3DsssParameterSet_methods(root_module, root_module['ns3::DsssParameterSet'])
     register_Ns3EdcaParameterSet_methods(root_module, root_module['ns3::EdcaParameterSet'])
+    register_Ns3EmpiricalRandomVariable_methods(root_module, root_module['ns3::EmpiricalRandomVariable'])
     register_Ns3EmptyAttributeAccessor_methods(root_module, root_module['ns3::EmptyAttributeAccessor'])
     register_Ns3EmptyAttributeChecker_methods(root_module, root_module['ns3::EmptyAttributeChecker'])
     register_Ns3EmptyAttributeValue_methods(root_module, root_module['ns3::EmptyAttributeValue'])
     register_Ns3EnumChecker_methods(root_module, root_module['ns3::EnumChecker'])
     register_Ns3EnumValue_methods(root_module, root_module['ns3::EnumValue'])
+    register_Ns3ErlangRandomVariable_methods(root_module, root_module['ns3::ErlangRandomVariable'])
     register_Ns3ErpInformation_methods(root_module, root_module['ns3::ErpInformation'])
     register_Ns3EventImpl_methods(root_module, root_module['ns3::EventImpl'])
+    register_Ns3ExponentialRandomVariable_methods(root_module, root_module['ns3::ExponentialRandomVariable'])
     register_Ns3ExtendedCapabilities_methods(root_module, root_module['ns3::ExtendedCapabilities'])
     register_Ns3ExtendedSupportedRatesIE_methods(root_module, root_module['ns3::ExtendedSupportedRatesIE'])
+    register_Ns3GammaRandomVariable_methods(root_module, root_module['ns3::GammaRandomVariable'])
     register_Ns3HeCapabilities_methods(root_module, root_module['ns3::HeCapabilities'])
     register_Ns3HeOperation_methods(root_module, root_module['ns3::HeOperation'])
     register_Ns3HtCapabilities_methods(root_module, root_module['ns3::HtCapabilities'])
@@ -1107,22 +1016,24 @@
     register_Ns3Ipv6AddressValue_methods(root_module, root_module['ns3::Ipv6AddressValue'])
     register_Ns3Ipv6PrefixChecker_methods(root_module, root_module['ns3::Ipv6PrefixChecker'])
     register_Ns3Ipv6PrefixValue_methods(root_module, root_module['ns3::Ipv6PrefixValue'])
+    register_Ns3LogNormalRandomVariable_methods(root_module, root_module['ns3::LogNormalRandomVariable'])
     register_Ns3Mac48AddressChecker_methods(root_module, root_module['ns3::Mac48AddressChecker'])
     register_Ns3Mac48AddressValue_methods(root_module, root_module['ns3::Mac48AddressValue'])
     register_Ns3MeshInformationElementVector_methods(root_module, root_module['ns3::MeshInformationElementVector'])
     register_Ns3MeshL2RoutingProtocol_methods(root_module, root_module['ns3::MeshL2RoutingProtocol'])
     register_Ns3MeshStack_methods(root_module, root_module['ns3::MeshStack'])
+    register_Ns3MeshWifiInterfaceMac_methods(root_module, root_module['ns3::MeshWifiInterfaceMac'])
     register_Ns3MeshWifiInterfaceMacPlugin_methods(root_module, root_module['ns3::MeshWifiInterfaceMacPlugin'])
     register_Ns3MgtBeaconHeader_methods(root_module, root_module['ns3::MgtBeaconHeader'])
     register_Ns3MuEdcaParameterSet_methods(root_module, root_module['ns3::MuEdcaParameterSet'])
     register_Ns3NetDevice_methods(root_module, root_module['ns3::NetDevice'])
     register_Ns3NixVector_methods(root_module, root_module['ns3::NixVector'])
     register_Ns3Node_methods(root_module, root_module['ns3::Node'])
+    register_Ns3NormalRandomVariable_methods(root_module, root_module['ns3::NormalRandomVariable'])
     register_Ns3ObjectFactoryChecker_methods(root_module, root_module['ns3::ObjectFactoryChecker'])
     register_Ns3ObjectFactoryValue_methods(root_module, root_module['ns3::ObjectFactoryValue'])
     register_Ns3Packet_methods(root_module, root_module['ns3::Packet'])
-    register_Ns3QosTxop_methods(root_module, root_module['ns3::QosTxop'])
-    register_Ns3RegularWifiMac_methods(root_module, root_module['ns3::RegularWifiMac'])
+    register_Ns3ParetoRandomVariable_methods(root_module, root_module['ns3::ParetoRandomVariable'])
     register_Ns3Ssid_methods(root_module, root_module['ns3::Ssid'])
     register_Ns3SsidChecker_methods(root_module, root_module['ns3::SsidChecker'])
     register_Ns3SsidValue_methods(root_module, root_module['ns3::SsidValue'])
@@ -1138,13 +1049,12 @@
     register_Ns3AddressChecker_methods(root_module, root_module['ns3::AddressChecker'])
     register_Ns3AddressValue_methods(root_module, root_module['ns3::AddressValue'])
     register_Ns3BridgeChannel_methods(root_module, root_module['ns3::BridgeChannel'])
+    register_Ns3CallbackImpl__Bool_Const_ns3WifiTxVector___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Bool_Ns3Ptr__lt__ns3NetDevice__gt___Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_short_Const_ns3Address___amp___Const_ns3Address___amp___Ns3NetDevicePacketType_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< bool, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<const ns3::Packet>, unsigned short, const ns3::Address &, const ns3::Address &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Bool_Ns3Ptr__lt__ns3NetDevice__gt___Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_short_Const_ns3Address___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< bool, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<const ns3::Packet>, unsigned short, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3CallbackImpl__Bool_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Ns3ObjectBase___star___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Unsigned_long_Const_ns3WifiTxVector___amp___Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3CallbackImpl__Unsigned_long_Unsigned_short_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Bool_Ns3Ptr__lt__ns3Packet__gt___Ns3Mac48Address_Ns3Mac48Address_Unsigned_short_Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, bool, ns3::Ptr<ns3::Packet>, ns3::Mac48Address, ns3::Mac48Address, unsigned short, unsigned int, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Const_ns3WifiMacHeader___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, const ns3::WifiMacHeader &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
@@ -1154,20 +1064,15 @@
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3WifiMacQueueItem__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3NetDevice__gt___Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_short_Const_ns3Address___amp___Const_ns3Address___amp___Ns3NetDevicePacketType_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<const ns3::Packet>, unsigned short, const ns3::Address &, const ns3::Address &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3NetDevice__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::NetDevice>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3CallbackImpl__Void_Ns3Time_Ns3Mac48Address_Unsigned_char_Ns3OriginatorBlockAckAgreementState_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Time, ns3::Mac48Address, unsigned char, ns3::OriginatorBlockAckAgreement::State, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3CallbackImpl__Void_Ns3Time_Ns3Time_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Time, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Time_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3WifiMacDropReason_Ns3Ptr__lt__const_ns3WifiMacQueueItem__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Dot11sRouteChange_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::dot11s::RouteChange, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Unsigned_char_Ns3Ptr__lt__const_ns3WifiMacQueueItem__gt___Const_ns3WifiTxVector___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Unsigned_char_Ns3Ptr__lt__const_ns3WifiPsdu__gt___Const_ns3WifiTxVector___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3CallbackImpl__Void_Unsigned_char_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt_____gt_____gt_____gt_____star___Const_stdSet__lt__ns3Mac48Address__stdLess__lt__ns3Mac48Address__gt____stdAllocator__lt__ns3Mac48Address__gt_____gt_____star___Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3CallbackImpl__Void_Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3CallbackImpl__Void_Unsigned_int_Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Unsigned_char_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt____gt____gt____gt_____star___Const_stdSet__lt__ns3Mac48Address__stdLess__lt__ns3Mac48Address__gt____stdAllocator__lt__ns3Mac48Address__gt____gt_____star___Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3Dot11sStack_methods(root_module, root_module['ns3::Dot11sStack'])
     register_Ns3FlameStack_methods(root_module, root_module['ns3::FlameStack'])
     register_Ns3MeshPointDevice_methods(root_module, root_module['ns3::MeshPointDevice'])
-    register_Ns3MeshWifiInterfaceMac_methods(root_module, root_module['ns3::MeshWifiInterfaceMac'])
     register_Ns3HashImplementation_methods(root_module, root_module['ns3::Hash::Implementation'])
     register_Ns3HashFunctionFnv1a_methods(root_module, root_module['ns3::Hash::Function::Fnv1a'])
     register_Ns3HashFunctionHash32_methods(root_module, root_module['ns3::Hash::Function::Hash32'])
@@ -1317,125 +1222,6 @@
     cls.add_instance_attribute('value', 'ns3::Ptr< ns3::AttributeValue >', is_const=False)
     return
 
-def register_Ns3Bar_methods(root_module, cls):
-    ## block-ack-manager.h (module 'wifi'): ns3::Bar::Bar(ns3::Bar const & arg0) [constructor]
-    cls.add_constructor([param('ns3::Bar const &', 'arg0')])
-    ## block-ack-manager.h (module 'wifi'): ns3::Bar::Bar() [constructor]
-    cls.add_constructor([])
-    ## block-ack-manager.h (module 'wifi'): ns3::Bar::Bar(ns3::Ptr<const ns3::WifiMacQueueItem> bar, uint8_t tid, bool skipIfNoDataQueued=false) [constructor]
-    cls.add_constructor([param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'bar'), param('uint8_t', 'tid'), param('bool', 'skipIfNoDataQueued', default_value='false')])
-    ## block-ack-manager.h (module 'wifi'): ns3::Bar::bar [variable]
-    cls.add_instance_attribute('bar', 'ns3::Ptr< ns3::WifiMacQueueItem const >', is_const=False)
-    ## block-ack-manager.h (module 'wifi'): ns3::Bar::skipIfNoDataQueued [variable]
-    cls.add_instance_attribute('skipIfNoDataQueued', 'bool', is_const=False)
-    ## block-ack-manager.h (module 'wifi'): ns3::Bar::tid [variable]
-    cls.add_instance_attribute('tid', 'uint8_t', is_const=False)
-    return
-
-def register_Ns3BlockAckAgreement_methods(root_module, cls):
-    ## block-ack-agreement.h (module 'wifi'): ns3::BlockAckAgreement::BlockAckAgreement(ns3::BlockAckAgreement const & arg0) [constructor]
-    cls.add_constructor([param('ns3::BlockAckAgreement const &', 'arg0')])
-    ## block-ack-agreement.h (module 'wifi'): ns3::BlockAckAgreement::BlockAckAgreement(ns3::Mac48Address peer, uint8_t tid) [constructor]
-    cls.add_constructor([param('ns3::Mac48Address', 'peer'), param('uint8_t', 'tid')])
-    ## block-ack-agreement.h (module 'wifi'): ns3::BlockAckReqType ns3::BlockAckAgreement::GetBlockAckReqType() const [member function]
-    cls.add_method('GetBlockAckReqType', 
-                   'ns3::BlockAckReqType', 
-                   [], 
-                   is_const=True)
-    ## block-ack-agreement.h (module 'wifi'): ns3::BlockAckType ns3::BlockAckAgreement::GetBlockAckType() const [member function]
-    cls.add_method('GetBlockAckType', 
-                   'ns3::BlockAckType', 
-                   [], 
-                   is_const=True)
-    ## block-ack-agreement.h (module 'wifi'): uint16_t ns3::BlockAckAgreement::GetBufferSize() const [member function]
-    cls.add_method('GetBufferSize', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## block-ack-agreement.h (module 'wifi'): static std::size_t ns3::BlockAckAgreement::GetDistance(uint16_t seqNumber, uint16_t startingSeqNumber) [member function]
-    cls.add_method('GetDistance', 
-                   'std::size_t', 
-                   [param('uint16_t', 'seqNumber'), param('uint16_t', 'startingSeqNumber')], 
-                   is_static=True)
-    ## block-ack-agreement.h (module 'wifi'): ns3::Mac48Address ns3::BlockAckAgreement::GetPeer() const [member function]
-    cls.add_method('GetPeer', 
-                   'ns3::Mac48Address', 
-                   [], 
-                   is_const=True)
-    ## block-ack-agreement.h (module 'wifi'): uint16_t ns3::BlockAckAgreement::GetStartingSequence() const [member function]
-    cls.add_method('GetStartingSequence', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## block-ack-agreement.h (module 'wifi'): uint16_t ns3::BlockAckAgreement::GetStartingSequenceControl() const [member function]
-    cls.add_method('GetStartingSequenceControl', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## block-ack-agreement.h (module 'wifi'): uint8_t ns3::BlockAckAgreement::GetTid() const [member function]
-    cls.add_method('GetTid', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## block-ack-agreement.h (module 'wifi'): uint16_t ns3::BlockAckAgreement::GetTimeout() const [member function]
-    cls.add_method('GetTimeout', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## block-ack-agreement.h (module 'wifi'): uint16_t ns3::BlockAckAgreement::GetWinEnd() const [member function]
-    cls.add_method('GetWinEnd', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## block-ack-agreement.h (module 'wifi'): bool ns3::BlockAckAgreement::IsAmsduSupported() const [member function]
-    cls.add_method('IsAmsduSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## block-ack-agreement.h (module 'wifi'): bool ns3::BlockAckAgreement::IsHtSupported() const [member function]
-    cls.add_method('IsHtSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## block-ack-agreement.h (module 'wifi'): bool ns3::BlockAckAgreement::IsImmediateBlockAck() const [member function]
-    cls.add_method('IsImmediateBlockAck', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## block-ack-agreement.h (module 'wifi'): void ns3::BlockAckAgreement::SetAmsduSupport(bool supported) [member function]
-    cls.add_method('SetAmsduSupport', 
-                   'void', 
-                   [param('bool', 'supported')])
-    ## block-ack-agreement.h (module 'wifi'): void ns3::BlockAckAgreement::SetBufferSize(uint16_t bufferSize) [member function]
-    cls.add_method('SetBufferSize', 
-                   'void', 
-                   [param('uint16_t', 'bufferSize')])
-    ## block-ack-agreement.h (module 'wifi'): void ns3::BlockAckAgreement::SetDelayedBlockAck() [member function]
-    cls.add_method('SetDelayedBlockAck', 
-                   'void', 
-                   [])
-    ## block-ack-agreement.h (module 'wifi'): void ns3::BlockAckAgreement::SetHtSupported(bool htSupported) [member function]
-    cls.add_method('SetHtSupported', 
-                   'void', 
-                   [param('bool', 'htSupported')])
-    ## block-ack-agreement.h (module 'wifi'): void ns3::BlockAckAgreement::SetImmediateBlockAck() [member function]
-    cls.add_method('SetImmediateBlockAck', 
-                   'void', 
-                   [])
-    ## block-ack-agreement.h (module 'wifi'): void ns3::BlockAckAgreement::SetStartingSequence(uint16_t seq) [member function]
-    cls.add_method('SetStartingSequence', 
-                   'void', 
-                   [param('uint16_t', 'seq')])
-    ## block-ack-agreement.h (module 'wifi'): void ns3::BlockAckAgreement::SetStartingSequenceControl(uint16_t seq) [member function]
-    cls.add_method('SetStartingSequenceControl', 
-                   'void', 
-                   [param('uint16_t', 'seq')])
-    ## block-ack-agreement.h (module 'wifi'): void ns3::BlockAckAgreement::SetTimeout(uint16_t timeout) [member function]
-    cls.add_method('SetTimeout', 
-                   'void', 
-                   [param('uint16_t', 'timeout')])
-    return
-
 def register_Ns3BlockAckReqType_methods(root_module, cls):
     cls.add_output_stream_operator()
     ## block-ack-type.h (module 'wifi'): ns3::BlockAckReqType::BlockAckReqType(ns3::BlockAckReqType const & arg0) [constructor]
@@ -1460,7 +1246,7 @@
     cls.add_constructor([])
     ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::BlockAckType(ns3::BlockAckType::Variant v) [constructor]
     cls.add_constructor([param('ns3::BlockAckType::Variant', 'v')])
-    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::BlockAckType(ns3::BlockAckType::Variant v, std::vector<unsigned char, std::allocator<unsigned char> > l) [constructor]
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::BlockAckType(ns3::BlockAckType::Variant v, std::vector<unsigned char, std::allocator<unsigned char>> l) [constructor]
     cls.add_constructor([param('ns3::BlockAckType::Variant', 'v'), param('std::vector< unsigned char >', 'l')])
     ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::m_bitmapLen [variable]
     cls.add_instance_attribute('m_bitmapLen', 'std::vector< unsigned char >', is_const=False)
@@ -1468,49 +1254,6 @@
     cls.add_instance_attribute('m_variant', 'ns3::BlockAckType::Variant', is_const=False)
     return
 
-def register_Ns3BlockAckWindow_methods(root_module, cls):
-    ## block-ack-window.h (module 'wifi'): ns3::BlockAckWindow::BlockAckWindow(ns3::BlockAckWindow const & arg0) [constructor]
-    cls.add_constructor([param('ns3::BlockAckWindow const &', 'arg0')])
-    ## block-ack-window.h (module 'wifi'): ns3::BlockAckWindow::BlockAckWindow() [constructor]
-    cls.add_constructor([])
-    ## block-ack-window.h (module 'wifi'): void ns3::BlockAckWindow::Advance(std::size_t count) [member function]
-    cls.add_method('Advance', 
-                   'void', 
-                   [param('std::size_t', 'count')])
-    ## block-ack-window.h (module 'wifi'): std::vector<bool, std::allocator<bool> >::reference ns3::BlockAckWindow::At(std::size_t distance) [member function]
-    cls.add_method('At', 
-                   'std::vector< bool > reference', 
-                   [param('std::size_t', 'distance')])
-    ## block-ack-window.h (module 'wifi'): std::vector<bool, std::allocator<bool> >::const_reference ns3::BlockAckWindow::At(std::size_t distance) const [member function]
-    cls.add_method('At', 
-                   'std::vector< bool > const_reference', 
-                   [param('std::size_t', 'distance')], 
-                   is_const=True)
-    ## block-ack-window.h (module 'wifi'): uint16_t ns3::BlockAckWindow::GetWinEnd() const [member function]
-    cls.add_method('GetWinEnd', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## block-ack-window.h (module 'wifi'): std::size_t ns3::BlockAckWindow::GetWinSize() const [member function]
-    cls.add_method('GetWinSize', 
-                   'std::size_t', 
-                   [], 
-                   is_const=True)
-    ## block-ack-window.h (module 'wifi'): uint16_t ns3::BlockAckWindow::GetWinStart() const [member function]
-    cls.add_method('GetWinStart', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## block-ack-window.h (module 'wifi'): void ns3::BlockAckWindow::Init(uint16_t winStart, uint16_t winSize) [member function]
-    cls.add_method('Init', 
-                   'void', 
-                   [param('uint16_t', 'winStart'), param('uint16_t', 'winSize')])
-    ## block-ack-window.h (module 'wifi'): void ns3::BlockAckWindow::Reset(uint16_t winStart) [member function]
-    cls.add_method('Reset', 
-                   'void', 
-                   [param('uint16_t', 'winStart')])
-    return
-
 def register_Ns3Buffer_methods(root_module, cls):
     ## buffer.h (module 'network'): ns3::Buffer::Buffer(ns3::Buffer const & o) [constructor]
     cls.add_constructor([param('ns3::Buffer const &', 'o')])
@@ -2130,18 +1873,6 @@
                    is_static=True)
     return
 
-def register_Ns3DefaultDeleter__Ns3WifiMacQueueItem_methods(root_module, cls):
-    ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::WifiMacQueueItem>::DefaultDeleter() [constructor]
-    cls.add_constructor([])
-    ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::WifiMacQueueItem>::DefaultDeleter(ns3::DefaultDeleter<ns3::WifiMacQueueItem> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::DefaultDeleter< ns3::WifiMacQueueItem > const &', 'arg0')])
-    ## default-deleter.h (module 'core'): static void ns3::DefaultDeleter<ns3::WifiMacQueueItem>::Delete(ns3::WifiMacQueueItem * object) [member function]
-    cls.add_method('Delete', 
-                   'void', 
-                   [param('ns3::WifiMacQueueItem *', 'object')], 
-                   is_static=True)
-    return
-
 def register_Ns3DefaultDeleter__Ns3Dot11sDestinationAddressUnit_methods(root_module, cls):
     ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::dot11s::DestinationAddressUnit>::DefaultDeleter() [constructor]
     cls.add_constructor([])
@@ -2245,117 +1976,6 @@
                    [])
     return
 
-def register_Ns3HeMuUserInfo_methods(root_module, cls):
-    ## wifi-tx-vector.h (module 'wifi'): ns3::HeMuUserInfo::HeMuUserInfo() [constructor]
-    cls.add_constructor([])
-    ## wifi-tx-vector.h (module 'wifi'): ns3::HeMuUserInfo::HeMuUserInfo(ns3::HeMuUserInfo const & arg0) [constructor]
-    cls.add_constructor([param('ns3::HeMuUserInfo const &', 'arg0')])
-    ## wifi-tx-vector.h (module 'wifi'): ns3::HeMuUserInfo::mcs [variable]
-    cls.add_instance_attribute('mcs', 'ns3::WifiMode', is_const=False)
-    ## wifi-tx-vector.h (module 'wifi'): ns3::HeMuUserInfo::nss [variable]
-    cls.add_instance_attribute('nss', 'uint8_t', is_const=False)
-    ## wifi-tx-vector.h (module 'wifi'): ns3::HeMuUserInfo::ru [variable]
-    cls.add_instance_attribute('ru', 'ns3::HeRu::RuSpec', is_const=False)
-    return
-
-def register_Ns3HeRu_methods(root_module, cls):
-    ## he-ru.h (module 'wifi'): ns3::HeRu::HeRu() [constructor]
-    cls.add_constructor([])
-    ## he-ru.h (module 'wifi'): ns3::HeRu::HeRu(ns3::HeRu const & arg0) [constructor]
-    cls.add_constructor([param('ns3::HeRu const &', 'arg0')])
-    ## he-ru.h (module 'wifi'): static bool ns3::HeRu::DoesOverlap(uint16_t bw, ns3::HeRu::RuSpec ru, std::vector<ns3::HeRu::RuSpec, std::allocator<ns3::HeRu::RuSpec> > const & v) [member function]
-    cls.add_method('DoesOverlap', 
-                   'bool', 
-                   [param('uint16_t', 'bw'), param('ns3::HeRu::RuSpec', 'ru'), param('std::vector< ns3::HeRu::RuSpec > const &', 'v')], 
-                   is_static=True)
-    ## he-ru.h (module 'wifi'): static bool ns3::HeRu::DoesOverlap(uint16_t bw, ns3::HeRu::RuSpec ru, ns3::HeRu::SubcarrierGroup const & toneRanges) [member function]
-    cls.add_method('DoesOverlap', 
-                   'bool', 
-                   [param('uint16_t', 'bw'), param('ns3::HeRu::RuSpec', 'ru'), param('ns3::HeRu::SubcarrierGroup const &', 'toneRanges')], 
-                   is_static=True)
-    ## he-ru.h (module 'wifi'): static ns3::HeRu::RuSpec ns3::HeRu::FindOverlappingRu(uint16_t bw, ns3::HeRu::RuSpec referenceRu, ns3::HeRu::RuType searchedRuType) [member function]
-    cls.add_method('FindOverlappingRu', 
-                   'ns3::HeRu::RuSpec', 
-                   [param('uint16_t', 'bw'), param('ns3::HeRu::RuSpec', 'referenceRu'), param('ns3::HeRu::RuType', 'searchedRuType')], 
-                   is_static=True)
-    ## he-ru.h (module 'wifi'): static uint16_t ns3::HeRu::GetBandwidth(ns3::HeRu::RuType ruType) [member function]
-    cls.add_method('GetBandwidth', 
-                   'uint16_t', 
-                   [param('ns3::HeRu::RuType', 'ruType')], 
-                   is_static=True)
-    ## he-ru.h (module 'wifi'): static std::vector<ns3::HeRu::RuSpec, std::allocator<ns3::HeRu::RuSpec> > ns3::HeRu::GetCentral26TonesRus(uint16_t bw, ns3::HeRu::RuType ruType) [member function]
-    cls.add_method('GetCentral26TonesRus', 
-                   'std::vector< ns3::HeRu::RuSpec >', 
-                   [param('uint16_t', 'bw'), param('ns3::HeRu::RuType', 'ruType')], 
-                   is_static=True)
-    ## he-ru.h (module 'wifi'): static ns3::HeRu::RuType ns3::HeRu::GetEqualSizedRusForStations(uint16_t bandwidth, std::size_t & nStations, std::size_t & nCentral26TonesRus) [member function]
-    cls.add_method('GetEqualSizedRusForStations', 
-                   'ns3::HeRu::RuType', 
-                   [param('uint16_t', 'bandwidth'), param('std::size_t &', 'nStations'), param('std::size_t &', 'nCentral26TonesRus')], 
-                   is_static=True)
-    ## he-ru.h (module 'wifi'): static std::size_t ns3::HeRu::GetNRus(uint16_t bw, ns3::HeRu::RuType ruType) [member function]
-    cls.add_method('GetNRus', 
-                   'std::size_t', 
-                   [param('uint16_t', 'bw'), param('ns3::HeRu::RuType', 'ruType')], 
-                   is_static=True)
-    ## he-ru.h (module 'wifi'): static ns3::HeRu::RuType ns3::HeRu::GetRuType(uint16_t bandwidth) [member function]
-    cls.add_method('GetRuType', 
-                   'ns3::HeRu::RuType', 
-                   [param('uint16_t', 'bandwidth')], 
-                   is_static=True)
-    ## he-ru.h (module 'wifi'): static std::vector<ns3::HeRu::RuSpec, std::allocator<ns3::HeRu::RuSpec> > ns3::HeRu::GetRusOfType(uint16_t bw, ns3::HeRu::RuType ruType) [member function]
-    cls.add_method('GetRusOfType', 
-                   'std::vector< ns3::HeRu::RuSpec >', 
-                   [param('uint16_t', 'bw'), param('ns3::HeRu::RuType', 'ruType')], 
-                   is_static=True)
-    ## he-ru.h (module 'wifi'): static ns3::HeRu::SubcarrierGroup ns3::HeRu::GetSubcarrierGroup(uint16_t bw, ns3::HeRu::RuType ruType, std::size_t phyIndex) [member function]
-    cls.add_method('GetSubcarrierGroup', 
-                   'ns3::HeRu::SubcarrierGroup', 
-                   [param('uint16_t', 'bw'), param('ns3::HeRu::RuType', 'ruType'), param('std::size_t', 'phyIndex')], 
-                   is_static=True)
-    ## he-ru.h (module 'wifi'): ns3::HeRu::m_heRuSubcarrierGroups [variable]
-    cls.add_static_attribute('m_heRuSubcarrierGroups', 'ns3::HeRu::SubcarrierGroups const', is_const=True)
-    return
-
-def register_Ns3HeRuRuSpec_methods(root_module, cls):
-    cls.add_output_stream_operator()
-    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec::RuSpec(ns3::HeRu::RuSpec const & arg0) [constructor]
-    cls.add_constructor([param('ns3::HeRu::RuSpec const &', 'arg0')])
-    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec::RuSpec() [constructor]
-    cls.add_constructor([])
-    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec::RuSpec(ns3::HeRu::RuType ruType, std::size_t index, bool primary80MHz) [constructor]
-    cls.add_constructor([param('ns3::HeRu::RuType', 'ruType'), param('std::size_t', 'index'), param('bool', 'primary80MHz')])
-    ## he-ru.h (module 'wifi'): std::size_t ns3::HeRu::RuSpec::GetIndex() const [member function]
-    cls.add_method('GetIndex', 
-                   'std::size_t', 
-                   [], 
-                   is_const=True)
-    ## he-ru.h (module 'wifi'): std::size_t ns3::HeRu::RuSpec::GetPhyIndex() const [member function]
-    cls.add_method('GetPhyIndex', 
-                   'std::size_t', 
-                   [], 
-                   is_const=True)
-    ## he-ru.h (module 'wifi'): bool ns3::HeRu::RuSpec::GetPrimary80MHz() const [member function]
-    cls.add_method('GetPrimary80MHz', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## he-ru.h (module 'wifi'): ns3::HeRu::RuType ns3::HeRu::RuSpec::GetRuType() const [member function]
-    cls.add_method('GetRuType', 
-                   'ns3::HeRu::RuType', 
-                   [], 
-                   is_const=True)
-    ## he-ru.h (module 'wifi'): bool ns3::HeRu::RuSpec::IsPhyIndexSet() const [member function]
-    cls.add_method('IsPhyIndexSet', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## he-ru.h (module 'wifi'): void ns3::HeRu::RuSpec::SetPhyIndex(uint16_t bw, uint8_t p20Index) [member function]
-    cls.add_method('SetPhyIndex', 
-                   'void', 
-                   [param('uint16_t', 'bw'), param('uint8_t', 'p20Index')])
-    return
-
 def register_Ns3Ipv4Address_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -3029,6 +2649,11 @@
                    'ns3::MeshHelper', 
                    [], 
                    is_static=True)
+    ## mesh-helper.h (module 'mesh'): static void ns3::MeshHelper::EnableLogComponents() [member function]
+    cls.add_method('EnableLogComponents', 
+                   'void', 
+                   [], 
+                   is_static=True)
     ## mesh-helper.h (module 'mesh'): ns3::NetDeviceContainer ns3::MeshHelper::Install(ns3::WifiPhyHelper const & phyHelper, ns3::NodeContainer c) const [member function]
     cls.add_method('Install', 
                    'ns3::NetDeviceContainer', 
@@ -3176,6 +2801,8 @@
     cls.add_constructor([param('ns3::ObjectFactory const &', 'arg0')])
     ## object-factory.h (module 'core'): ns3::ObjectFactory::ObjectFactory() [constructor]
     cls.add_constructor([])
+    ## object-factory.h (module 'core'): ns3::ObjectFactory::ObjectFactory(std::string const & typeId) [constructor]
+    cls.add_constructor([param('std::string const &', 'typeId')])
     ## object-factory.h (module 'core'): ns3::Ptr<ns3::Object> ns3::ObjectFactory::Create() const [member function]
     cls.add_method('Create', 
                    'ns3::Ptr< ns3::Object >', 
@@ -3209,68 +2836,6 @@
                    [param('std::string', 'tid')])
     return
 
-def register_Ns3OriginatorBlockAckAgreement_methods(root_module, cls):
-    ## originator-block-ack-agreement.h (module 'wifi'): ns3::OriginatorBlockAckAgreement::OriginatorBlockAckAgreement(ns3::OriginatorBlockAckAgreement const & arg0) [constructor]
-    cls.add_constructor([param('ns3::OriginatorBlockAckAgreement const &', 'arg0')])
-    ## originator-block-ack-agreement.h (module 'wifi'): ns3::OriginatorBlockAckAgreement::OriginatorBlockAckAgreement(ns3::Mac48Address recipient, uint8_t tid) [constructor]
-    cls.add_constructor([param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')])
-    ## originator-block-ack-agreement.h (module 'wifi'): std::size_t ns3::OriginatorBlockAckAgreement::GetDistance(uint16_t seqNumber) const [member function]
-    cls.add_method('GetDistance', 
-                   'std::size_t', 
-                   [param('uint16_t', 'seqNumber')], 
-                   is_const=True)
-    ## originator-block-ack-agreement.h (module 'wifi'): uint16_t ns3::OriginatorBlockAckAgreement::GetStartingSequence() const [member function]
-    cls.add_method('GetStartingSequence', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## originator-block-ack-agreement.h (module 'wifi'): void ns3::OriginatorBlockAckAgreement::InitTxWindow() [member function]
-    cls.add_method('InitTxWindow', 
-                   'void', 
-                   [])
-    ## originator-block-ack-agreement.h (module 'wifi'): bool ns3::OriginatorBlockAckAgreement::IsEstablished() const [member function]
-    cls.add_method('IsEstablished', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## originator-block-ack-agreement.h (module 'wifi'): bool ns3::OriginatorBlockAckAgreement::IsNoReply() const [member function]
-    cls.add_method('IsNoReply', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## originator-block-ack-agreement.h (module 'wifi'): bool ns3::OriginatorBlockAckAgreement::IsPending() const [member function]
-    cls.add_method('IsPending', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## originator-block-ack-agreement.h (module 'wifi'): bool ns3::OriginatorBlockAckAgreement::IsRejected() const [member function]
-    cls.add_method('IsRejected', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## originator-block-ack-agreement.h (module 'wifi'): bool ns3::OriginatorBlockAckAgreement::IsReset() const [member function]
-    cls.add_method('IsReset', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## originator-block-ack-agreement.h (module 'wifi'): void ns3::OriginatorBlockAckAgreement::NotifyAckedMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('NotifyAckedMpdu', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')])
-    ## originator-block-ack-agreement.h (module 'wifi'): void ns3::OriginatorBlockAckAgreement::NotifyDiscardedMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('NotifyDiscardedMpdu', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')])
-    ## originator-block-ack-agreement.h (module 'wifi'): void ns3::OriginatorBlockAckAgreement::NotifyTransmittedMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('NotifyTransmittedMpdu', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')])
-    ## originator-block-ack-agreement.h (module 'wifi'): void ns3::OriginatorBlockAckAgreement::SetState(ns3::OriginatorBlockAckAgreement::State state) [member function]
-    cls.add_method('SetState', 
-                   'void', 
-                   [param('ns3::OriginatorBlockAckAgreement::State', 'state')])
-    return
-
 def register_Ns3PacketMetadata_methods(root_module, cls):
     ## packet-metadata.h (module 'network'): ns3::PacketMetadata::PacketMetadata(uint64_t uid, uint32_t size) [constructor]
     cls.add_constructor([param('uint64_t', 'uid'), param('uint32_t', 'size')])
@@ -3836,51 +3401,13 @@
     cls.add_constructor([param('ns3::Time const', 'time'), param('ns3::Time::Unit const', 'unit')])
     return
 
-def register_Ns3TracedValue__Unsigned_int_methods(root_module, cls):
-    ## traced-value.h (module 'core'): ns3::TracedValue<unsigned int>::TracedValue() [constructor]
-    cls.add_constructor([])
-    ## traced-value.h (module 'core'): ns3::TracedValue<unsigned int>::TracedValue(ns3::TracedValue<unsigned int> const & o) [constructor]
-    cls.add_constructor([param('ns3::TracedValue< unsigned int > const &', 'o')])
-    ## traced-value.h (module 'core'): ns3::TracedValue<unsigned int>::TracedValue(unsigned int const & v) [constructor]
-    cls.add_constructor([param('unsigned int const &', 'v')])
-    ## traced-value.h (module 'core'): ns3::TracedValue<unsigned int>::TracedValue(ns3::TracedValue<unsigned int> const & other) [constructor]
-    cls.add_constructor([param('ns3::TracedValue< unsigned int > const &', 'other')])
-    ## traced-value.h (module 'core'): ns3::TracedValue<unsigned int>::TracedValue(ns3::TracedValue<unsigned int> const & other) [constructor]
-    cls.add_constructor([param('ns3::TracedValue< unsigned int > const &', 'other')])
-    ## traced-value.h (module 'core'): void ns3::TracedValue<unsigned int>::Connect(ns3::CallbackBase const & cb, std::string path) [member function]
-    cls.add_method('Connect', 
-                   'void', 
-                   [param('ns3::CallbackBase const &', 'cb'), param('std::string', 'path')])
-    ## traced-value.h (module 'core'): void ns3::TracedValue<unsigned int>::ConnectWithoutContext(ns3::CallbackBase const & cb) [member function]
-    cls.add_method('ConnectWithoutContext', 
-                   'void', 
-                   [param('ns3::CallbackBase const &', 'cb')])
-    ## traced-value.h (module 'core'): void ns3::TracedValue<unsigned int>::Disconnect(ns3::CallbackBase const & cb, std::string path) [member function]
-    cls.add_method('Disconnect', 
-                   'void', 
-                   [param('ns3::CallbackBase const &', 'cb'), param('std::string', 'path')])
-    ## traced-value.h (module 'core'): void ns3::TracedValue<unsigned int>::DisconnectWithoutContext(ns3::CallbackBase const & cb) [member function]
-    cls.add_method('DisconnectWithoutContext', 
-                   'void', 
-                   [param('ns3::CallbackBase const &', 'cb')])
-    ## traced-value.h (module 'core'): unsigned int ns3::TracedValue<unsigned int>::Get() const [member function]
-    cls.add_method('Get', 
-                   'unsigned int', 
-                   [], 
-                   is_const=True)
-    ## traced-value.h (module 'core'): void ns3::TracedValue<unsigned int>::Set(unsigned int const & v) [member function]
-    cls.add_method('Set', 
-                   'void', 
-                   [param('unsigned int const &', 'v')])
-    return
-
 def register_Ns3TypeId_methods(root_module, cls):
     cls.add_binary_comparison_operator('==')
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -4213,6 +3740,11 @@
                    'bool', 
                    [param('uint16_t', 'channelWidth'), param('uint8_t', 'nss')], 
                    is_const=True)
+    ## wifi-mode.h (module 'wifi'): bool ns3::WifiMode::IsAllowed(ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('IsAllowed', 
+                   'bool', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True)
     ## wifi-mode.h (module 'wifi'): bool ns3::WifiMode::IsHigherCodeRate(ns3::WifiMode mode) const [member function]
     cls.add_method('IsHigherCodeRate', 
                    'bool', 
@@ -4233,15 +3765,15 @@
 def register_Ns3WifiModeFactory_methods(root_module, cls):
     ## wifi-mode.h (module 'wifi'): ns3::WifiModeFactory::WifiModeFactory(ns3::WifiModeFactory const & arg0) [constructor]
     cls.add_constructor([param('ns3::WifiModeFactory const &', 'arg0')])
-    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMcs(std::string uniqueName, uint8_t mcsValue, ns3::WifiModulationClass modClass, ns3::WifiModeFactory::CodeRateCallback codeRateCallback, ns3::WifiModeFactory::ConstellationSizeCallback constellationSizeCallback, ns3::WifiModeFactory::PhyRateCallback phyRateCallback, ns3::WifiModeFactory::PhyRateFromTxVectorCallback phyRateFromTxVectorCallback, ns3::WifiModeFactory::DataRateCallback dataRateCallback, ns3::WifiModeFactory::DataRateFromTxVectorCallback dataRateFromTxVectorCallback, ns3::WifiModeFactory::NonHtReferenceRateCallback nonHtReferenceRateCallback, ns3::WifiModeFactory::ModeAllowedCallback isModeAllowedCallback) [member function]
+    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMcs(std::string uniqueName, uint8_t mcsValue, ns3::WifiModulationClass modClass, bool isMandatory, ns3::WifiModeFactory::CodeRateCallback codeRateCallback, ns3::WifiModeFactory::ConstellationSizeCallback constellationSizeCallback, ns3::WifiModeFactory::PhyRateCallback phyRateCallback, ns3::WifiModeFactory::DataRateCallback dataRateCallback, ns3::WifiModeFactory::NonHtReferenceRateCallback nonHtReferenceRateCallback, ns3::WifiModeFactory::AllowedCallback isAllowedCallback) [member function]
     cls.add_method('CreateWifiMcs', 
                    'ns3::WifiMode', 
-                   [param('std::string', 'uniqueName'), param('uint8_t', 'mcsValue'), param('ns3::WifiModulationClass', 'modClass'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'codeRateCallback'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'constellationSizeCallback'), param('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateCallback'), param('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateFromTxVectorCallback'), param('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateCallback'), param('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateFromTxVectorCallback'), param('ns3::Callback< unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'nonHtReferenceRateCallback'), param('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'isModeAllowedCallback')], 
+                   [param('std::string', 'uniqueName'), param('uint8_t', 'mcsValue'), param('ns3::WifiModulationClass', 'modClass'), param('bool', 'isMandatory'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'codeRateCallback'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'constellationSizeCallback'), param('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateCallback'), param('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateCallback'), param('ns3::Callback< unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'nonHtReferenceRateCallback'), param('ns3::Callback< bool, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'isAllowedCallback')], 
                    is_static=True)
-    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMode(std::string uniqueName, ns3::WifiModulationClass modClass, bool isMandatory, ns3::WifiModeFactory::CodeRateCallback codeRateCallback, ns3::WifiModeFactory::ConstellationSizeCallback constellationSizeCallback, ns3::WifiModeFactory::PhyRateCallback phyRateCallback, ns3::WifiModeFactory::PhyRateFromTxVectorCallback phyRateFromTxVectorCallback, ns3::WifiModeFactory::DataRateCallback dataRateCallback, ns3::WifiModeFactory::DataRateFromTxVectorCallback dataRateFromTxVectorCallback, ns3::WifiModeFactory::ModeAllowedCallback isModeAllowedCallback) [member function]
+    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMode(std::string uniqueName, ns3::WifiModulationClass modClass, bool isMandatory, ns3::WifiModeFactory::CodeRateCallback codeRateCallback, ns3::WifiModeFactory::ConstellationSizeCallback constellationSizeCallback, ns3::WifiModeFactory::PhyRateCallback phyRateCallback, ns3::WifiModeFactory::DataRateCallback dataRateCallback, ns3::WifiModeFactory::AllowedCallback isAllowedCallback) [member function]
     cls.add_method('CreateWifiMode', 
                    'ns3::WifiMode', 
-                   [param('std::string', 'uniqueName'), param('ns3::WifiModulationClass', 'modClass'), param('bool', 'isMandatory'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'codeRateCallback'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'constellationSizeCallback'), param('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateCallback'), param('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateFromTxVectorCallback'), param('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateCallback'), param('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateFromTxVectorCallback'), param('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'isModeAllowedCallback')], 
+                   [param('std::string', 'uniqueName'), param('ns3::WifiModulationClass', 'modClass'), param('bool', 'isMandatory'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'codeRateCallback'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'constellationSizeCallback'), param('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateCallback'), param('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateCallback'), param('ns3::Callback< bool, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'isAllowedCallback')], 
                    is_static=True)
     return
 
@@ -4319,221 +3851,6 @@
     cls.add_instance_attribute('m_vhtCapabilities', 'ns3::Ptr< ns3::VhtCapabilities const >', is_const=False)
     return
 
-def register_Ns3WifiStandardInfo_methods(root_module, cls):
-    ## wifi-standards.h (module 'wifi'): ns3::WifiStandardInfo::WifiStandardInfo() [constructor]
-    cls.add_constructor([])
-    ## wifi-standards.h (module 'wifi'): ns3::WifiStandardInfo::WifiStandardInfo(ns3::WifiStandardInfo const & arg0) [constructor]
-    cls.add_constructor([param('ns3::WifiStandardInfo const &', 'arg0')])
-    ## wifi-standards.h (module 'wifi'): ns3::WifiStandardInfo::macStandard [variable]
-    cls.add_instance_attribute('macStandard', 'ns3::WifiMacStandard', is_const=False)
-    ## wifi-standards.h (module 'wifi'): ns3::WifiStandardInfo::phyBand [variable]
-    cls.add_instance_attribute('phyBand', 'ns3::WifiPhyBand', is_const=False)
-    ## wifi-standards.h (module 'wifi'): ns3::WifiStandardInfo::phyStandard [variable]
-    cls.add_instance_attribute('phyStandard', 'ns3::WifiPhyStandard', is_const=False)
-    return
-
-def register_Ns3WifiTxVector_methods(root_module, cls):
-    cls.add_output_stream_operator()
-    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector() [constructor]
-    cls.add_constructor([])
-    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector(ns3::WifiMode mode, uint8_t powerLevel, ns3::WifiPreamble preamble, uint16_t guardInterval, uint8_t nTx, uint8_t nss, uint8_t ness, uint16_t channelWidth, bool aggregation, bool stbc=false, bool ldpc=false, uint8_t bssColor=0, uint16_t length=0) [constructor]
-    cls.add_constructor([param('ns3::WifiMode', 'mode'), param('uint8_t', 'powerLevel'), param('ns3::WifiPreamble', 'preamble'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nTx'), param('uint8_t', 'nss'), param('uint8_t', 'ness'), param('uint16_t', 'channelWidth'), param('bool', 'aggregation'), param('bool', 'stbc', default_value='false'), param('bool', 'ldpc', default_value='false'), param('uint8_t', 'bssColor', default_value='0'), param('uint16_t', 'length', default_value='0')])
-    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector(ns3::WifiTxVector const & txVector) [constructor]
-    cls.add_constructor([param('ns3::WifiTxVector const &', 'txVector')])
-    ## wifi-tx-vector.h (module 'wifi'): uint8_t ns3::WifiTxVector::GetBssColor() const [member function]
-    cls.add_method('GetBssColor', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-tx-vector.h (module 'wifi'): uint16_t ns3::WifiTxVector::GetChannelWidth() const [member function]
-    cls.add_method('GetChannelWidth', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-tx-vector.h (module 'wifi'): uint16_t ns3::WifiTxVector::GetGuardInterval() const [member function]
-    cls.add_method('GetGuardInterval', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-tx-vector.h (module 'wifi'): ns3::HeMuUserInfo ns3::WifiTxVector::GetHeMuUserInfo(uint16_t staId) const [member function]
-    cls.add_method('GetHeMuUserInfo', 
-                   'ns3::HeMuUserInfo', 
-                   [param('uint16_t', 'staId')], 
-                   is_const=True)
-    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::HeMuUserInfoMap const & ns3::WifiTxVector::GetHeMuUserInfoMap() const [member function]
-    cls.add_method('GetHeMuUserInfoMap', 
-                   'ns3::WifiTxVector::HeMuUserInfoMap const &', 
-                   [], 
-                   is_const=True)
-    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::HeMuUserInfoMap & ns3::WifiTxVector::GetHeMuUserInfoMap() [member function]
-    cls.add_method('GetHeMuUserInfoMap', 
-                   'ns3::WifiTxVector::HeMuUserInfoMap &', 
-                   [])
-    ## wifi-tx-vector.h (module 'wifi'): uint16_t ns3::WifiTxVector::GetLength() const [member function]
-    cls.add_method('GetLength', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiMode ns3::WifiTxVector::GetMode(uint16_t staId=65535) const [member function]
-    cls.add_method('GetMode', 
-                   'ns3::WifiMode', 
-                   [param('uint16_t', 'staId', default_value='65535')], 
-                   is_const=True)
-    ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::GetModeInitialized() const [member function]
-    cls.add_method('GetModeInitialized', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiModulationClass ns3::WifiTxVector::GetModulationClass() const [member function]
-    cls.add_method('GetModulationClass', 
-                   'ns3::WifiModulationClass', 
-                   [], 
-                   is_const=True)
-    ## wifi-tx-vector.h (module 'wifi'): uint8_t ns3::WifiTxVector::GetNTx() const [member function]
-    cls.add_method('GetNTx', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-tx-vector.h (module 'wifi'): uint8_t ns3::WifiTxVector::GetNess() const [member function]
-    cls.add_method('GetNess', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-tx-vector.h (module 'wifi'): uint8_t ns3::WifiTxVector::GetNss(uint16_t staId=65535) const [member function]
-    cls.add_method('GetNss', 
-                   'uint8_t', 
-                   [param('uint16_t', 'staId', default_value='65535')], 
-                   is_const=True)
-    ## wifi-tx-vector.h (module 'wifi'): uint8_t ns3::WifiTxVector::GetNssMax() const [member function]
-    cls.add_method('GetNssMax', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-tx-vector.h (module 'wifi'): std::pair<unsigned long, unsigned long> ns3::WifiTxVector::GetNumRusPerHeSigBContentChannel() const [member function]
-    cls.add_method('GetNumRusPerHeSigBContentChannel', 
-                   'std::pair< unsigned long, unsigned long >', 
-                   [], 
-                   is_const=True)
-    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiPreamble ns3::WifiTxVector::GetPreambleType() const [member function]
-    cls.add_method('GetPreambleType', 
-                   'ns3::WifiPreamble', 
-                   [], 
-                   is_const=True)
-    ## wifi-tx-vector.h (module 'wifi'): ns3::HeRu::RuSpec ns3::WifiTxVector::GetRu(uint16_t staId) const [member function]
-    cls.add_method('GetRu', 
-                   'ns3::HeRu::RuSpec', 
-                   [param('uint16_t', 'staId')], 
-                   is_const=True)
-    ## wifi-tx-vector.h (module 'wifi'): uint8_t ns3::WifiTxVector::GetTxPowerLevel() const [member function]
-    cls.add_method('GetTxPowerLevel', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::IsAggregation() const [member function]
-    cls.add_method('IsAggregation', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::IsDlMu() const [member function]
-    cls.add_method('IsDlMu', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::IsLdpc() const [member function]
-    cls.add_method('IsLdpc', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::IsMu() const [member function]
-    cls.add_method('IsMu', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::IsStbc() const [member function]
-    cls.add_method('IsStbc', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::IsUlMu() const [member function]
-    cls.add_method('IsUlMu', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::IsValid() const [member function]
-    cls.add_method('IsValid', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetAggregation(bool aggregation) [member function]
-    cls.add_method('SetAggregation', 
-                   'void', 
-                   [param('bool', 'aggregation')])
-    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetBssColor(uint8_t color) [member function]
-    cls.add_method('SetBssColor', 
-                   'void', 
-                   [param('uint8_t', 'color')])
-    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetChannelWidth(uint16_t channelWidth) [member function]
-    cls.add_method('SetChannelWidth', 
-                   'void', 
-                   [param('uint16_t', 'channelWidth')])
-    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetGuardInterval(uint16_t guardInterval) [member function]
-    cls.add_method('SetGuardInterval', 
-                   'void', 
-                   [param('uint16_t', 'guardInterval')])
-    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetHeMuUserInfo(uint16_t staId, ns3::HeMuUserInfo userInfo) [member function]
-    cls.add_method('SetHeMuUserInfo', 
-                   'void', 
-                   [param('uint16_t', 'staId'), param('ns3::HeMuUserInfo', 'userInfo')])
-    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetLdpc(bool ldpc) [member function]
-    cls.add_method('SetLdpc', 
-                   'void', 
-                   [param('bool', 'ldpc')])
-    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetLength(uint16_t length) [member function]
-    cls.add_method('SetLength', 
-                   'void', 
-                   [param('uint16_t', 'length')])
-    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetMode(ns3::WifiMode mode) [member function]
-    cls.add_method('SetMode', 
-                   'void', 
-                   [param('ns3::WifiMode', 'mode')])
-    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetMode(ns3::WifiMode mode, uint16_t staId) [member function]
-    cls.add_method('SetMode', 
-                   'void', 
-                   [param('ns3::WifiMode', 'mode'), param('uint16_t', 'staId')])
-    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetNTx(uint8_t nTx) [member function]
-    cls.add_method('SetNTx', 
-                   'void', 
-                   [param('uint8_t', 'nTx')])
-    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetNess(uint8_t ness) [member function]
-    cls.add_method('SetNess', 
-                   'void', 
-                   [param('uint8_t', 'ness')])
-    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetNss(uint8_t nss) [member function]
-    cls.add_method('SetNss', 
-                   'void', 
-                   [param('uint8_t', 'nss')])
-    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetNss(uint8_t nss, uint16_t staId) [member function]
-    cls.add_method('SetNss', 
-                   'void', 
-                   [param('uint8_t', 'nss'), param('uint16_t', 'staId')])
-    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetPreambleType(ns3::WifiPreamble preamble) [member function]
-    cls.add_method('SetPreambleType', 
-                   'void', 
-                   [param('ns3::WifiPreamble', 'preamble')])
-    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetRu(ns3::HeRu::RuSpec ru, uint16_t staId) [member function]
-    cls.add_method('SetRu', 
-                   'void', 
-                   [param('ns3::HeRu::RuSpec', 'ru'), param('uint16_t', 'staId')])
-    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetStbc(bool stbc) [member function]
-    cls.add_method('SetStbc', 
-                   'void', 
-                   [param('bool', 'stbc')])
-    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetTxPowerLevel(uint8_t powerlevel) [member function]
-    cls.add_method('SetTxPowerLevel', 
-                   'void', 
-                   [param('uint8_t', 'powerlevel')])
-    return
-
 def register_Ns3Empty_methods(root_module, cls):
     ## empty.h (module 'core'): ns3::empty::empty() [constructor]
     cls.add_constructor([])
@@ -4551,14 +3868,14 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('>=')
     cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_unary_numeric_operator('-')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
     cls.add_constructor([])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(double const value) [constructor]
@@ -4577,6 +3894,8 @@
     cls.add_constructor([param('long unsigned int const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int const v) [constructor]
     cls.add_constructor([param('long long unsigned int const', 'v')])
+    ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int128_t const v) [constructor]
+    cls.add_constructor([param('int128_t const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t const hi, uint64_t const lo) [constructor]
     cls.add_constructor([param('int64_t const', 'hi'), param('uint64_t const', 'lo')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [constructor]
@@ -5659,101 +4978,177 @@
                    [])
     return
 
+def register_Ns3RandomVariableStream_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::RandomVariableStream::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::RandomVariableStream::RandomVariableStream() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): void ns3::RandomVariableStream::SetStream(int64_t stream) [member function]
+    cls.add_method('SetStream', 
+                   'void', 
+                   [param('int64_t', 'stream')])
+    ## random-variable-stream.h (module 'core'): int64_t ns3::RandomVariableStream::GetStream() const [member function]
+    cls.add_method('GetStream', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): void ns3::RandomVariableStream::SetAntithetic(bool isAntithetic) [member function]
+    cls.add_method('SetAntithetic', 
+                   'void', 
+                   [param('bool', 'isAntithetic')])
+    ## random-variable-stream.h (module 'core'): bool ns3::RandomVariableStream::IsAntithetic() const [member function]
+    cls.add_method('IsAntithetic', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::RandomVariableStream::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::RandomVariableStream::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## random-variable-stream.h (module 'core'): ns3::RngStream * ns3::RandomVariableStream::Peek() const [member function]
+    cls.add_method('Peek', 
+                   'ns3::RngStream *', 
+                   [], 
+                   is_const=True, visibility='protected')
+    return
+
+def register_Ns3SequentialRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::SequentialRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::SequentialRandomVariable::SequentialRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): double ns3::SequentialRandomVariable::GetMin() const [member function]
+    cls.add_method('GetMin', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::SequentialRandomVariable::GetMax() const [member function]
+    cls.add_method('GetMax', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): ns3::Ptr<ns3::RandomVariableStream> ns3::SequentialRandomVariable::GetIncrement() const [member function]
+    cls.add_method('GetIncrement', 
+                   'ns3::Ptr< ns3::RandomVariableStream >', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::SequentialRandomVariable::GetConsecutive() const [member function]
+    cls.add_method('GetConsecutive', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::SequentialRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::SequentialRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_virtual=True)
+    return
+
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3MeshWifiInterfaceMacPlugin_Ns3Empty_Ns3DefaultDeleter__lt__ns3MeshWifiInterfaceMacPlugin__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MeshWifiInterfaceMacPlugin, ns3::empty, ns3::DefaultDeleter<ns3::MeshWifiInterfaceMacPlugin> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MeshWifiInterfaceMacPlugin, ns3::empty, ns3::DefaultDeleter<ns3::MeshWifiInterfaceMacPlugin>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MeshWifiInterfaceMacPlugin, ns3::empty, ns3::DefaultDeleter<ns3::MeshWifiInterfaceMacPlugin> >::SimpleRefCount(ns3::SimpleRefCount<ns3::MeshWifiInterfaceMacPlugin, ns3::empty, ns3::DefaultDeleter<ns3::MeshWifiInterfaceMacPlugin> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MeshWifiInterfaceMacPlugin, ns3::empty, ns3::DefaultDeleter<ns3::MeshWifiInterfaceMacPlugin>>::SimpleRefCount(ns3::SimpleRefCount<ns3::MeshWifiInterfaceMacPlugin, ns3::empty, ns3::DefaultDeleter<ns3::MeshWifiInterfaceMacPlugin>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::MeshWifiInterfaceMacPlugin, ns3::empty, ns3::DefaultDeleter< ns3::MeshWifiInterfaceMacPlugin > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3WifiInformationElement_Ns3Empty_Ns3DefaultDeleter__lt__ns3WifiInformationElement__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement> >::SimpleRefCount(ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement>>::SimpleRefCount(ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter< ns3::WifiInformationElement > > const &', 'o')])
     return
 
-def register_Ns3SimpleRefCount__Ns3WifiMacQueueItem_Ns3Empty_Ns3DefaultDeleter__lt__ns3WifiMacQueueItem__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiMacQueueItem, ns3::empty, ns3::DefaultDeleter<ns3::WifiMacQueueItem> >::SimpleRefCount() [constructor]
-    cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiMacQueueItem, ns3::empty, ns3::DefaultDeleter<ns3::WifiMacQueueItem> >::SimpleRefCount(ns3::SimpleRefCount<ns3::WifiMacQueueItem, ns3::empty, ns3::DefaultDeleter<ns3::WifiMacQueueItem> > const & o) [constructor]
-    cls.add_constructor([param('ns3::SimpleRefCount< ns3::WifiMacQueueItem, ns3::empty, ns3::DefaultDeleter< ns3::WifiMacQueueItem > > const &', 'o')])
-    return
-
 def register_Ns3SimpleRefCount__Ns3Dot11sDestinationAddressUnit_Ns3Empty_Ns3DefaultDeleter__lt__ns3Dot11sDestinationAddressUnit__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::dot11s::DestinationAddressUnit, ns3::empty, ns3::DefaultDeleter<ns3::dot11s::DestinationAddressUnit> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::dot11s::DestinationAddressUnit, ns3::empty, ns3::DefaultDeleter<ns3::dot11s::DestinationAddressUnit>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::dot11s::DestinationAddressUnit, ns3::empty, ns3::DefaultDeleter<ns3::dot11s::DestinationAddressUnit> >::SimpleRefCount(ns3::SimpleRefCount<ns3::dot11s::DestinationAddressUnit, ns3::empty, ns3::DefaultDeleter<ns3::dot11s::DestinationAddressUnit> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::dot11s::DestinationAddressUnit, ns3::empty, ns3::DefaultDeleter<ns3::dot11s::DestinationAddressUnit>>::SimpleRefCount(ns3::SimpleRefCount<ns3::dot11s::DestinationAddressUnit, ns3::empty, ns3::DefaultDeleter<ns3::dot11s::DestinationAddressUnit>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::dot11s::DestinationAddressUnit, ns3::empty, ns3::DefaultDeleter< ns3::dot11s::DestinationAddressUnit > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Dot11sIeBeaconTimingUnit_Ns3Empty_Ns3DefaultDeleter__lt__ns3Dot11sIeBeaconTimingUnit__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::dot11s::IeBeaconTimingUnit, ns3::empty, ns3::DefaultDeleter<ns3::dot11s::IeBeaconTimingUnit> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::dot11s::IeBeaconTimingUnit, ns3::empty, ns3::DefaultDeleter<ns3::dot11s::IeBeaconTimingUnit>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::dot11s::IeBeaconTimingUnit, ns3::empty, ns3::DefaultDeleter<ns3::dot11s::IeBeaconTimingUnit> >::SimpleRefCount(ns3::SimpleRefCount<ns3::dot11s::IeBeaconTimingUnit, ns3::empty, ns3::DefaultDeleter<ns3::dot11s::IeBeaconTimingUnit> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::dot11s::IeBeaconTimingUnit, ns3::empty, ns3::DefaultDeleter<ns3::dot11s::IeBeaconTimingUnit>>::SimpleRefCount(ns3::SimpleRefCount<ns3::dot11s::IeBeaconTimingUnit, ns3::empty, ns3::DefaultDeleter<ns3::dot11s::IeBeaconTimingUnit>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::dot11s::IeBeaconTimingUnit, ns3::empty, ns3::DefaultDeleter< ns3::dot11s::IeBeaconTimingUnit > > const &', 'o')])
     return
 
@@ -5822,198 +5217,128 @@
                    is_const=True, is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3Txop_methods(root_module, cls):
-    ## txop.h (module 'wifi'): ns3::Txop::Txop() [constructor]
-    cls.add_constructor([])
-    ## txop.h (module 'wifi'): ns3::Txop::Txop(ns3::Ptr<ns3::WifiMacQueue> queue) [constructor]
-    cls.add_constructor([param('ns3::Ptr< ns3::WifiMacQueue >', 'queue')])
-    ## txop.h (module 'wifi'): static ns3::TypeId ns3::Txop::GetTypeId() [member function]
+def register_Ns3TriangularRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::TriangularRandomVariable::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## txop.h (module 'wifi'): bool ns3::Txop::IsQosTxop() const [member function]
-    cls.add_method('IsQosTxop', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::SetChannelAccessManager(ns3::Ptr<ns3::ChannelAccessManager> const manager) [member function]
-    cls.add_method('SetChannelAccessManager', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::ChannelAccessManager > const', 'manager')])
-    ## txop.h (module 'wifi'): void ns3::Txop::SetWifiMac(ns3::Ptr<ns3::RegularWifiMac> const mac) [member function]
-    cls.add_method('SetWifiMac', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::RegularWifiMac > const', 'mac')], 
-                   is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::SetTxMiddle(ns3::Ptr<ns3::MacTxMiddle> const txMiddle) [member function]
-    cls.add_method('SetTxMiddle', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::MacTxMiddle > const', 'txMiddle')])
-    ## txop.h (module 'wifi'): void ns3::Txop::SetDroppedMpduCallback(ns3::Txop::DroppedMpdu callback) [member function]
-    cls.add_method('SetDroppedMpduCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::WifiMacDropReason, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
-                   is_virtual=True)
-    ## txop.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueue> ns3::Txop::GetWifiMacQueue() const [member function]
-    cls.add_method('GetWifiMacQueue', 
-                   'ns3::Ptr< ns3::WifiMacQueue >', 
+    ## random-variable-stream.h (module 'core'): ns3::TriangularRandomVariable::TriangularRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): double ns3::TriangularRandomVariable::GetMean() const [member function]
+    cls.add_method('GetMean', 
+                   'double', 
                    [], 
                    is_const=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::SetMinCw(uint32_t minCw) [member function]
-    cls.add_method('SetMinCw', 
-                   'void', 
-                   [param('uint32_t', 'minCw')])
-    ## txop.h (module 'wifi'): void ns3::Txop::SetMaxCw(uint32_t maxCw) [member function]
-    cls.add_method('SetMaxCw', 
-                   'void', 
-                   [param('uint32_t', 'maxCw')])
-    ## txop.h (module 'wifi'): void ns3::Txop::SetAifsn(uint8_t aifsn) [member function]
-    cls.add_method('SetAifsn', 
-                   'void', 
-                   [param('uint8_t', 'aifsn')])
-    ## txop.h (module 'wifi'): void ns3::Txop::SetTxopLimit(ns3::Time txopLimit) [member function]
-    cls.add_method('SetTxopLimit', 
-                   'void', 
-                   [param('ns3::Time', 'txopLimit')])
-    ## txop.h (module 'wifi'): uint32_t ns3::Txop::GetMinCw() const [member function]
-    cls.add_method('GetMinCw', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## txop.h (module 'wifi'): uint32_t ns3::Txop::GetMaxCw() const [member function]
-    cls.add_method('GetMaxCw', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## txop.h (module 'wifi'): uint8_t ns3::Txop::GetAifsn() const [member function]
-    cls.add_method('GetAifsn', 
-                   'uint8_t', 
+    ## random-variable-stream.h (module 'core'): double ns3::TriangularRandomVariable::GetMin() const [member function]
+    cls.add_method('GetMin', 
+                   'double', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## txop.h (module 'wifi'): ns3::Time ns3::Txop::GetTxopLimit() const [member function]
-    cls.add_method('GetTxopLimit', 
-                   'ns3::Time', 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::TriangularRandomVariable::GetMax() const [member function]
+    cls.add_method('GetMax', 
+                   'double', 
                    [], 
                    is_const=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::ResetCw() [member function]
-    cls.add_method('ResetCw', 
-                   'void', 
-                   [])
-    ## txop.h (module 'wifi'): void ns3::Txop::UpdateFailedCw() [member function]
-    cls.add_method('UpdateFailedCw', 
-                   'void', 
-                   [])
-    ## txop.h (module 'wifi'): void ns3::Txop::NotifyChannelSwitching() [member function]
-    cls.add_method('NotifyChannelSwitching', 
-                   'void', 
+    ## random-variable-stream.h (module 'core'): double ns3::TriangularRandomVariable::GetValue(double mean, double min, double max) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('double', 'mean'), param('double', 'min'), param('double', 'max')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::TriangularRandomVariable::GetInteger(uint32_t mean, uint32_t min, uint32_t max) [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [param('uint32_t', 'mean'), param('uint32_t', 'min'), param('uint32_t', 'max')])
+    ## random-variable-stream.h (module 'core'): double ns3::TriangularRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
                    [], 
                    is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::NotifySleep() [member function]
-    cls.add_method('NotifySleep', 
-                   'void', 
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::TriangularRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
                    [], 
                    is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::NotifyOff() [member function]
-    cls.add_method('NotifyOff', 
-                   'void', 
+    return
+
+def register_Ns3UniformRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::UniformRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::NotifyWakeUp() [member function]
-    cls.add_method('NotifyWakeUp', 
-                   'void', 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::UniformRandomVariable::UniformRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): double ns3::UniformRandomVariable::GetMin() const [member function]
+    cls.add_method('GetMin', 
+                   'double', 
                    [], 
-                   is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::NotifyOn() [member function]
-    cls.add_method('NotifyOn', 
-                   'void', 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::UniformRandomVariable::GetMax() const [member function]
+    cls.add_method('GetMax', 
+                   'double', 
                    [], 
-                   is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::Queue(ns3::Ptr<ns3::Packet> packet, ns3::WifiMacHeader const & hdr) [member function]
-    cls.add_method('Queue', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::WifiMacHeader const &', 'hdr')], 
-                   is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::NotifyChannelAccessed(ns3::Time txopDuration=ns3::Seconds(0)) [member function]
-    cls.add_method('NotifyChannelAccessed', 
-                   'void', 
-                   [param('ns3::Time', 'txopDuration', default_value='ns3::Seconds(0)')], 
-                   is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::NotifyChannelReleased() [member function]
-    cls.add_method('NotifyChannelReleased', 
-                   'void', 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::UniformRandomVariable::GetValue(double min, double max) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('double', 'min'), param('double', 'max')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::UniformRandomVariable::GetInteger(uint32_t min, uint32_t max) [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [param('uint32_t', 'min'), param('uint32_t', 'max')])
+    ## random-variable-stream.h (module 'core'): double ns3::UniformRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
                    [], 
                    is_virtual=True)
-    ## txop.h (module 'wifi'): int64_t ns3::Txop::AssignStreams(int64_t stream) [member function]
-    cls.add_method('AssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'stream')])
-    ## txop.h (module 'wifi'): ns3::Txop::ChannelAccessStatus ns3::Txop::GetAccessStatus() const [member function]
-    cls.add_method('GetAccessStatus', 
-                   'ns3::Txop::ChannelAccessStatus', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::StartBackoffNow(uint32_t nSlots) [member function]
-    cls.add_method('StartBackoffNow', 
-                   'void', 
-                   [param('uint32_t', 'nSlots')])
-    ## txop.h (module 'wifi'): ns3::Txop::Txop(ns3::Txop const & arg0) [constructor]
-    cls.add_constructor([param('ns3::Txop const &', 'arg0')])
-    ## txop.h (module 'wifi'): void ns3::Txop::DoDispose() [member function]
-    cls.add_method('DoDispose', 
-                   'void', 
-                   [], 
-                   is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): void ns3::Txop::DoInitialize() [member function]
-    cls.add_method('DoInitialize', 
-                   'void', 
-                   [], 
-                   is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): void ns3::Txop::NotifyAccessRequested() [member function]
-    cls.add_method('NotifyAccessRequested', 
-                   'void', 
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::UniformRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
                    [], 
-                   is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): bool ns3::Txop::HasFramesToTransmit() [member function]
-    cls.add_method('HasFramesToTransmit', 
-                   'bool', 
+                   is_virtual=True)
+    return
+
+def register_Ns3WeibullRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::WeibullRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): void ns3::Txop::GenerateBackoff() [member function]
-    cls.add_method('GenerateBackoff', 
-                   'void', 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::WeibullRandomVariable::WeibullRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): double ns3::WeibullRandomVariable::GetScale() const [member function]
+    cls.add_method('GetScale', 
+                   'double', 
                    [], 
-                   is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): void ns3::Txop::StartAccessIfNeeded() [member function]
-    cls.add_method('StartAccessIfNeeded', 
-                   'void', 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::WeibullRandomVariable::GetShape() const [member function]
+    cls.add_method('GetShape', 
+                   'double', 
                    [], 
-                   is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): void ns3::Txop::RequestAccess() [member function]
-    cls.add_method('RequestAccess', 
-                   'void', 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::WeibullRandomVariable::GetBound() const [member function]
+    cls.add_method('GetBound', 
+                   'double', 
                    [], 
-                   visibility='protected')
-    ## txop.h (module 'wifi'): uint32_t ns3::Txop::GetCw() const [member function]
-    cls.add_method('GetCw', 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::WeibullRandomVariable::GetValue(double scale, double shape, double bound) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('double', 'scale'), param('double', 'shape'), param('double', 'bound')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::WeibullRandomVariable::GetInteger(uint32_t scale, uint32_t shape, uint32_t bound) [member function]
+    cls.add_method('GetInteger', 
                    'uint32_t', 
+                   [param('uint32_t', 'scale'), param('uint32_t', 'shape'), param('uint32_t', 'bound')])
+    ## random-variable-stream.h (module 'core'): double ns3::WeibullRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
                    [], 
-                   is_const=True, visibility='protected')
-    ## txop.h (module 'wifi'): uint32_t ns3::Txop::GetBackoffSlots() const [member function]
-    cls.add_method('GetBackoffSlots', 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::WeibullRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
                    'uint32_t', 
                    [], 
-                   is_const=True, visibility='protected')
-    ## txop.h (module 'wifi'): ns3::Time ns3::Txop::GetBackoffStart() const [member function]
-    cls.add_method('GetBackoffStart', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True, visibility='protected')
-    ## txop.h (module 'wifi'): void ns3::Txop::UpdateBackoffSlotsNow(uint32_t nSlots, ns3::Time backoffUpdateBound) [member function]
-    cls.add_method('UpdateBackoffSlotsNow', 
-                   'void', 
-                   [param('uint32_t', 'nSlots'), param('ns3::Time', 'backoffUpdateBound')], 
-                   visibility='protected')
+                   is_virtual=True)
     return
 
 def register_Ns3WifiActionHeader_methods(root_module, cls):
@@ -6207,687 +5532,318 @@
     return
 
 def register_Ns3WifiMac_methods(root_module, cls):
+    ## wifi-mac.h (module 'wifi'): static ns3::TypeId ns3::WifiMac::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## wifi-mac.h (module 'wifi'): ns3::WifiMac::WifiMac() [constructor]
     cls.add_constructor([])
-    ## wifi-mac.h (module 'wifi'): ns3::WifiMac::WifiMac(ns3::WifiMac const & arg0) [constructor]
-    cls.add_constructor([param('ns3::WifiMac const &', 'arg0')])
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::ConfigureStandard(ns3::WifiStandard standard) [member function]
-    cls.add_method('ConfigureStandard', 
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetDevice(ns3::Ptr<ns3::WifiNetDevice> const device) [member function]
+    cls.add_method('SetDevice', 
                    'void', 
-                   [param('ns3::WifiStandard', 'standard')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::DoDispose() [member function]
-    cls.add_method('DoDispose', 
+                   [param('ns3::Ptr< ns3::WifiNetDevice > const', 'device')])
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiNetDevice> ns3::WifiMac::GetDevice() const [member function]
+    cls.add_method('GetDevice', 
+                   'ns3::Ptr< ns3::WifiNetDevice >', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::FrameExchangeManager> ns3::WifiMac::GetFrameExchangeManager() const [member function]
+    cls.add_method('GetFrameExchangeManager', 
+                   'ns3::Ptr< ns3::FrameExchangeManager >', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::Txop> ns3::WifiMac::GetTxop() const [member function]
+    cls.add_method('GetTxop', 
+                   'ns3::Ptr< ns3::Txop >', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::WifiMac::GetQosTxop(ns3::AcIndex ac) const [member function]
+    cls.add_method('GetQosTxop', 
+                   'ns3::Ptr< ns3::QosTxop >', 
+                   [param('ns3::AcIndex', 'ac')], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::WifiMac::GetQosTxop(uint8_t tid) const [member function]
+    cls.add_method('GetQosTxop', 
+                   'ns3::Ptr< ns3::QosTxop >', 
+                   [param('uint8_t', 'tid')], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueue> ns3::WifiMac::GetTxopQueue(ns3::AcIndex ac) const [member function]
+    cls.add_method('GetTxopQueue', 
+                   'ns3::Ptr< ns3::WifiMacQueue >', 
+                   [param('ns3::AcIndex', 'ac')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetTypeOfStation(ns3::TypeOfStation type) [member function]
+    cls.add_method('SetTypeOfStation', 
                    'void', 
+                   [param('ns3::TypeOfStation', 'type')])
+    ## wifi-mac.h (module 'wifi'): ns3::TypeOfStation ns3::WifiMac::GetTypeOfStation() const [member function]
+    cls.add_method('GetTypeOfStation', 
+                   'ns3::TypeOfStation', 
                    [], 
-                   is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to, ns3::Mac48Address from) [member function]
-    cls.add_method('Enqueue', 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetSsid(ns3::Ssid ssid) [member function]
+    cls.add_method('SetSsid', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to'), param('ns3::Mac48Address', 'from')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to) [member function]
-    cls.add_method('Enqueue', 
+                   [param('ns3::Ssid', 'ssid')])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetPromisc() [member function]
+    cls.add_method('SetPromisc', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to')], 
-                   is_pure_virtual=True, is_virtual=True)
+                   [])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetCtsToSelfSupported(bool enable) [member function]
+    cls.add_method('SetCtsToSelfSupported', 
+                   'void', 
+                   [param('bool', 'enable')])
     ## wifi-mac.h (module 'wifi'): ns3::Mac48Address ns3::WifiMac::GetAddress() const [member function]
     cls.add_method('GetAddress', 
                    'ns3::Mac48Address', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): ns3::Mac48Address ns3::WifiMac::GetBssid() const [member function]
-    cls.add_method('GetBssid', 
-                   'ns3::Mac48Address', 
-                   [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::NetDevice> ns3::WifiMac::GetDevice() const [member function]
-    cls.add_method('GetDevice', 
-                   'ns3::Ptr< ns3::NetDevice >', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::HeConfiguration> ns3::WifiMac::GetHeConfiguration() const [member function]
-    cls.add_method('GetHeConfiguration', 
-                   'ns3::Ptr< ns3::HeConfiguration >', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::HtConfiguration> ns3::WifiMac::GetHtConfiguration() const [member function]
-    cls.add_method('GetHtConfiguration', 
-                   'ns3::Ptr< ns3::HtConfiguration >', 
-                   [], 
                    is_const=True)
-    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::GetShortSlotTimeSupported() const [member function]
-    cls.add_method('GetShortSlotTimeSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## wifi-mac.h (module 'wifi'): ns3::Ssid ns3::WifiMac::GetSsid() const [member function]
     cls.add_method('GetSsid', 
                    'ns3::Ssid', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): static ns3::TypeId ns3::WifiMac::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## wifi-mac.h (module 'wifi'): ns3::TypeOfStation ns3::WifiMac::GetTypeOfStation() const [member function]
-    cls.add_method('GetTypeOfStation', 
-                   'ns3::TypeOfStation', 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetAddress(ns3::Mac48Address address) [member function]
+    cls.add_method('SetAddress', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Mac48Address ns3::WifiMac::GetBssid() const [member function]
+    cls.add_method('GetBssid', 
+                   'ns3::Mac48Address', 
                    [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetBssid(ns3::Mac48Address bssid) [member function]
+    cls.add_method('SetBssid', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'bssid')])
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::CanForwardPacketsTo(ns3::Mac48Address to) const [member function]
+    cls.add_method('CanForwardPacketsTo', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'to')], 
                    is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::VhtConfiguration> ns3::WifiMac::GetVhtConfiguration() const [member function]
-    cls.add_method('GetVhtConfiguration', 
-                   'ns3::Ptr< ns3::VhtConfiguration >', 
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to, ns3::Mac48Address from) [member function]
+    cls.add_method('Enqueue', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to'), param('ns3::Mac48Address', 'from')], 
+                   is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to) [member function]
+    cls.add_method('Enqueue', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::SupportsSendFrom() const [member function]
+    cls.add_method('SupportsSendFrom', 
+                   'bool', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetWifiPhy(ns3::Ptr<ns3::WifiPhy> phy) [member function]
+    cls.add_method('SetWifiPhy', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPhy >', 'phy')], 
+                   is_virtual=True)
     ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiPhy> ns3::WifiMac::GetWifiPhy() const [member function]
     cls.add_method('GetWifiPhy', 
                    'ns3::Ptr< ns3::WifiPhy >', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiRemoteStationManager> ns3::WifiMac::GetWifiRemoteStationManager() const [member function]
-    cls.add_method('GetWifiRemoteStationManager', 
-                   'ns3::Ptr< ns3::WifiRemoteStationManager >', 
-                   [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyPromiscRx(ns3::Ptr<const ns3::Packet> packet) [member function]
-    cls.add_method('NotifyPromiscRx', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyRx(ns3::Ptr<const ns3::Packet> packet) [member function]
-    cls.add_method('NotifyRx', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyRxDrop(ns3::Ptr<const ns3::Packet> packet) [member function]
-    cls.add_method('NotifyRxDrop', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyTx(ns3::Ptr<const ns3::Packet> packet) [member function]
-    cls.add_method('NotifyTx', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyTxDrop(ns3::Ptr<const ns3::Packet> packet) [member function]
-    cls.add_method('NotifyTxDrop', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+                   is_const=True)
     ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::ResetWifiPhy() [member function]
     cls.add_method('ResetWifiPhy', 
                    'void', 
-                   [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetAddress(ns3::Mac48Address address) [member function]
-    cls.add_method('SetAddress', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetDevice(ns3::Ptr<ns3::NetDevice> const device) [member function]
-    cls.add_method('SetDevice', 
+                   [])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetWifiRemoteStationManager(ns3::Ptr<ns3::WifiRemoteStationManager> stationManager) [member function]
+    cls.add_method('SetWifiRemoteStationManager', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NetDevice > const', 'device')])
+                   [param('ns3::Ptr< ns3::WifiRemoteStationManager >', 'stationManager')])
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiRemoteStationManager> ns3::WifiMac::GetWifiRemoteStationManager() const [member function]
+    cls.add_method('GetWifiRemoteStationManager', 
+                   'ns3::Ptr< ns3::WifiRemoteStationManager >', 
+                   [], 
+                   is_const=True)
     ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetForwardUpCallback(ns3::WifiMac::ForwardUpCallback upCallback) [member function]
     cls.add_method('SetForwardUpCallback', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'upCallback')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetLinkDownCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkDown) [member function]
-    cls.add_method('SetLinkDownCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkDown')], 
-                   is_pure_virtual=True, is_virtual=True)
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'upCallback')])
     ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetLinkUpCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkUp) [member function]
     cls.add_method('SetLinkUpCallback', 
                    'void', 
                    [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkUp')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetPromisc() [member function]
-    cls.add_method('SetPromisc', 
+                   is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetLinkDownCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkDown) [member function]
+    cls.add_method('SetLinkDownCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkDown')])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyChannelSwitching() [member function]
+    cls.add_method('NotifyChannelSwitching', 
                    'void', 
                    [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetShortSlotTimeSupported(bool enable) [member function]
-    cls.add_method('SetShortSlotTimeSupported', 
+                   is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyTx(ns3::Ptr<const ns3::Packet> packet) [member function]
+    cls.add_method('NotifyTx', 
                    'void', 
-                   [param('bool', 'enable')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetSsid(ns3::Ssid ssid) [member function]
-    cls.add_method('SetSsid', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyTxDrop(ns3::Ptr<const ns3::Packet> packet) [member function]
+    cls.add_method('NotifyTxDrop', 
                    'void', 
-                   [param('ns3::Ssid', 'ssid')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetTypeOfStation(ns3::TypeOfStation type) [member function]
-    cls.add_method('SetTypeOfStation', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyRx(ns3::Ptr<const ns3::Packet> packet) [member function]
+    cls.add_method('NotifyRx', 
                    'void', 
-                   [param('ns3::TypeOfStation', 'type')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetWifiPhy(ns3::Ptr<ns3::WifiPhy> phy) [member function]
-    cls.add_method('SetWifiPhy', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyPromiscRx(ns3::Ptr<const ns3::Packet> packet) [member function]
+    cls.add_method('NotifyPromiscRx', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiPhy >', 'phy')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetWifiRemoteStationManager(ns3::Ptr<ns3::WifiRemoteStationManager> stationManager) [member function]
-    cls.add_method('SetWifiRemoteStationManager', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyRxDrop(ns3::Ptr<const ns3::Packet> packet) [member function]
+    cls.add_method('NotifyRxDrop', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiRemoteStationManager >', 'stationManager')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::SupportsSendFrom() const [member function]
-    cls.add_method('SupportsSendFrom', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::ConfigureDcf(ns3::Ptr<ns3::Txop> dcf, uint32_t cwmin, uint32_t cwmax, bool isDsss, ns3::AcIndex ac) [member function]
-    cls.add_method('ConfigureDcf', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::ConfigureStandard(ns3::WifiStandard standard) [member function]
+    cls.add_method('ConfigureStandard', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Txop >', 'dcf'), param('uint32_t', 'cwmin'), param('uint32_t', 'cwmax'), param('bool', 'isDsss'), param('ns3::AcIndex', 'ac')], 
-                   visibility='protected')
-    return
-
-def register_Ns3WifiMacHeader_methods(root_module, cls):
-    ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacHeader::WifiMacHeader(ns3::WifiMacHeader const & arg0) [constructor]
-    cls.add_constructor([param('ns3::WifiMacHeader const &', 'arg0')])
-    ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacHeader::WifiMacHeader() [constructor]
-    cls.add_constructor([])
-    ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacHeader::WifiMacHeader(ns3::WifiMacType type) [constructor]
-    cls.add_constructor([param('ns3::WifiMacType', 'type')])
-    ## wifi-mac-header.h (module 'wifi'): uint32_t ns3::WifiMacHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
-    cls.add_method('Deserialize', 
-                   'uint32_t', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
+                   [param('ns3::WifiStandard', 'standard')], 
                    is_virtual=True)
-    ## wifi-mac-header.h (module 'wifi'): ns3::Mac48Address ns3::WifiMacHeader::GetAddr1() const [member function]
-    cls.add_method('GetAddr1', 
-                   'ns3::Mac48Address', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): ns3::Mac48Address ns3::WifiMacHeader::GetAddr2() const [member function]
-    cls.add_method('GetAddr2', 
-                   'ns3::Mac48Address', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): ns3::Mac48Address ns3::WifiMacHeader::GetAddr3() const [member function]
-    cls.add_method('GetAddr3', 
-                   'ns3::Mac48Address', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): ns3::Mac48Address ns3::WifiMacHeader::GetAddr4() const [member function]
-    cls.add_method('GetAddr4', 
-                   'ns3::Mac48Address', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): ns3::Time ns3::WifiMacHeader::GetDuration() const [member function]
-    cls.add_method('GetDuration', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): uint8_t ns3::WifiMacHeader::GetFragmentNumber() const [member function]
-    cls.add_method('GetFragmentNumber', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): ns3::TypeId ns3::WifiMacHeader::GetInstanceTypeId() const [member function]
-    cls.add_method('GetInstanceTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacHeader::QosAckPolicy ns3::WifiMacHeader::GetQosAckPolicy() const [member function]
-    cls.add_method('GetQosAckPolicy', 
-                   'ns3::WifiMacHeader::QosAckPolicy', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): uint8_t ns3::WifiMacHeader::GetQosQueueSize() const [member function]
-    cls.add_method('GetQosQueueSize', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): uint8_t ns3::WifiMacHeader::GetQosTid() const [member function]
-    cls.add_method('GetQosTid', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): uint16_t ns3::WifiMacHeader::GetRawDuration() const [member function]
-    cls.add_method('GetRawDuration', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): uint16_t ns3::WifiMacHeader::GetSequenceControl() const [member function]
-    cls.add_method('GetSequenceControl', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): uint16_t ns3::WifiMacHeader::GetSequenceNumber() const [member function]
-    cls.add_method('GetSequenceNumber', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): uint32_t ns3::WifiMacHeader::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-mac-header.h (module 'wifi'): uint32_t ns3::WifiMacHeader::GetSize() const [member function]
-    cls.add_method('GetSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacType ns3::WifiMacHeader::GetType() const [member function]
-    cls.add_method('GetType', 
-                   'ns3::WifiMacType', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): static ns3::TypeId ns3::WifiMacHeader::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## wifi-mac-header.h (module 'wifi'): char const * ns3::WifiMacHeader::GetTypeString() const [member function]
-    cls.add_method('GetTypeString', 
-                   'char const *', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::HasData() const [member function]
-    cls.add_method('HasData', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsAck() const [member function]
-    cls.add_method('IsAck', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsAction() const [member function]
-    cls.add_method('IsAction', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsAssocReq() const [member function]
-    cls.add_method('IsAssocReq', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsAssocResp() const [member function]
-    cls.add_method('IsAssocResp', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsAuthentication() const [member function]
-    cls.add_method('IsAuthentication', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsBeacon() const [member function]
-    cls.add_method('IsBeacon', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsBlockAck() const [member function]
-    cls.add_method('IsBlockAck', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsBlockAckReq() const [member function]
-    cls.add_method('IsBlockAckReq', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsCfAck() const [member function]
-    cls.add_method('IsCfAck', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsCfEnd() const [member function]
-    cls.add_method('IsCfEnd', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsCfPoll() const [member function]
-    cls.add_method('IsCfPoll', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsCtl() const [member function]
-    cls.add_method('IsCtl', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsCts() const [member function]
-    cls.add_method('IsCts', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsData() const [member function]
-    cls.add_method('IsData', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsDeauthentication() const [member function]
-    cls.add_method('IsDeauthentication', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsDisassociation() const [member function]
-    cls.add_method('IsDisassociation', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsFromDs() const [member function]
-    cls.add_method('IsFromDs', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsMgt() const [member function]
-    cls.add_method('IsMgt', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsMoreFragments() const [member function]
-    cls.add_method('IsMoreFragments', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsMultihopAction() const [member function]
-    cls.add_method('IsMultihopAction', 
-                   'bool', 
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::HtConfiguration> ns3::WifiMac::GetHtConfiguration() const [member function]
+    cls.add_method('GetHtConfiguration', 
+                   'ns3::Ptr< ns3::HtConfiguration >', 
                    [], 
                    is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsProbeReq() const [member function]
-    cls.add_method('IsProbeReq', 
-                   'bool', 
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::VhtConfiguration> ns3::WifiMac::GetVhtConfiguration() const [member function]
+    cls.add_method('GetVhtConfiguration', 
+                   'ns3::Ptr< ns3::VhtConfiguration >', 
                    [], 
                    is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsProbeResp() const [member function]
-    cls.add_method('IsProbeResp', 
-                   'bool', 
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::HeConfiguration> ns3::WifiMac::GetHeConfiguration() const [member function]
+    cls.add_method('GetHeConfiguration', 
+                   'ns3::Ptr< ns3::HeConfiguration >', 
                    [], 
                    is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsQosAck() const [member function]
-    cls.add_method('IsQosAck', 
-                   'bool', 
+    ## wifi-mac.h (module 'wifi'): ns3::ExtendedCapabilities ns3::WifiMac::GetExtendedCapabilities() const [member function]
+    cls.add_method('GetExtendedCapabilities', 
+                   'ns3::ExtendedCapabilities', 
                    [], 
                    is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsQosAmsdu() const [member function]
-    cls.add_method('IsQosAmsdu', 
-                   'bool', 
+    ## wifi-mac.h (module 'wifi'): ns3::HtCapabilities ns3::WifiMac::GetHtCapabilities() const [member function]
+    cls.add_method('GetHtCapabilities', 
+                   'ns3::HtCapabilities', 
                    [], 
                    is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsQosBlockAck() const [member function]
-    cls.add_method('IsQosBlockAck', 
-                   'bool', 
+    ## wifi-mac.h (module 'wifi'): ns3::VhtCapabilities ns3::WifiMac::GetVhtCapabilities() const [member function]
+    cls.add_method('GetVhtCapabilities', 
+                   'ns3::VhtCapabilities', 
                    [], 
                    is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsQosData() const [member function]
-    cls.add_method('IsQosData', 
-                   'bool', 
+    ## wifi-mac.h (module 'wifi'): ns3::HeCapabilities ns3::WifiMac::GetHeCapabilities() const [member function]
+    cls.add_method('GetHeCapabilities', 
+                   'ns3::HeCapabilities', 
                    [], 
                    is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsQosEosp() const [member function]
-    cls.add_method('IsQosEosp', 
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::GetQosSupported() const [member function]
+    cls.add_method('GetQosSupported', 
                    'bool', 
                    [], 
                    is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsQosNoAck() const [member function]
-    cls.add_method('IsQosNoAck', 
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::GetErpSupported() const [member function]
+    cls.add_method('GetErpSupported', 
                    'bool', 
                    [], 
                    is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsReassocReq() const [member function]
-    cls.add_method('IsReassocReq', 
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::GetDsssSupported() const [member function]
+    cls.add_method('GetDsssSupported', 
                    'bool', 
                    [], 
                    is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsReassocResp() const [member function]
-    cls.add_method('IsReassocResp', 
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::GetHtSupported() const [member function]
+    cls.add_method('GetHtSupported', 
                    'bool', 
                    [], 
                    is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsRetry() const [member function]
-    cls.add_method('IsRetry', 
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::GetVhtSupported() const [member function]
+    cls.add_method('GetVhtSupported', 
                    'bool', 
                    [], 
                    is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsRts() const [member function]
-    cls.add_method('IsRts', 
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::GetHeSupported() const [member function]
+    cls.add_method('GetHeSupported', 
                    'bool', 
                    [], 
                    is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsToDs() const [member function]
-    cls.add_method('IsToDs', 
-                   'bool', 
-                   [], 
+    ## wifi-mac.h (module 'wifi'): uint32_t ns3::WifiMac::GetMaxAmpduSize(ns3::AcIndex ac) const [member function]
+    cls.add_method('GetMaxAmpduSize', 
+                   'uint32_t', 
+                   [param('ns3::AcIndex', 'ac')], 
                    is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsTrigger() const [member function]
-    cls.add_method('IsTrigger', 
-                   'bool', 
-                   [], 
+    ## wifi-mac.h (module 'wifi'): uint16_t ns3::WifiMac::GetMaxAmsduSize(ns3::AcIndex ac) const [member function]
+    cls.add_method('GetMaxAmsduSize', 
+                   'uint16_t', 
+                   [param('ns3::AcIndex', 'ac')], 
                    is_const=True)
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::Print(std::ostream & os) const [member function]
-    cls.add_method('Print', 
-                   'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('Serialize', 
-                   'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetAddr1(ns3::Mac48Address address) [member function]
-    cls.add_method('SetAddr1', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'address')])
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetAddr2(ns3::Mac48Address address) [member function]
-    cls.add_method('SetAddr2', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'address')])
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetAddr3(ns3::Mac48Address address) [member function]
-    cls.add_method('SetAddr3', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'address')])
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetAddr4(ns3::Mac48Address address) [member function]
-    cls.add_method('SetAddr4', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'address')])
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetDsFrom() [member function]
-    cls.add_method('SetDsFrom', 
-                   'void', 
-                   [])
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetDsNotFrom() [member function]
-    cls.add_method('SetDsNotFrom', 
-                   'void', 
-                   [])
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetDsNotTo() [member function]
-    cls.add_method('SetDsNotTo', 
-                   'void', 
-                   [])
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetDsTo() [member function]
-    cls.add_method('SetDsTo', 
-                   'void', 
-                   [])
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetDuration(ns3::Time duration) [member function]
-    cls.add_method('SetDuration', 
-                   'void', 
-                   [param('ns3::Time', 'duration')])
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetFragmentNumber(uint8_t frag) [member function]
-    cls.add_method('SetFragmentNumber', 
-                   'void', 
-                   [param('uint8_t', 'frag')])
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetId(uint16_t id) [member function]
-    cls.add_method('SetId', 
-                   'void', 
-                   [param('uint16_t', 'id')])
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetMoreFragments() [member function]
-    cls.add_method('SetMoreFragments', 
-                   'void', 
-                   [])
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetNoMoreFragments() [member function]
-    cls.add_method('SetNoMoreFragments', 
-                   'void', 
-                   [])
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetNoOrder() [member function]
-    cls.add_method('SetNoOrder', 
-                   'void', 
-                   [])
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetNoRetry() [member function]
-    cls.add_method('SetNoRetry', 
-                   'void', 
-                   [])
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetOrder() [member function]
-    cls.add_method('SetOrder', 
-                   'void', 
-                   [])
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosAckPolicy(ns3::WifiMacHeader::QosAckPolicy policy) [member function]
-    cls.add_method('SetQosAckPolicy', 
-                   'void', 
-                   [param('ns3::WifiMacHeader::QosAckPolicy', 'policy')])
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosAmsdu() [member function]
-    cls.add_method('SetQosAmsdu', 
-                   'void', 
-                   [])
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosEosp() [member function]
-    cls.add_method('SetQosEosp', 
-                   'void', 
-                   [])
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosMeshControlPresent() [member function]
-    cls.add_method('SetQosMeshControlPresent', 
-                   'void', 
-                   [])
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosNoAmsdu() [member function]
-    cls.add_method('SetQosNoAmsdu', 
-                   'void', 
-                   [])
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosNoEosp() [member function]
-    cls.add_method('SetQosNoEosp', 
-                   'void', 
-                   [])
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosNoMeshControlPresent() [member function]
-    cls.add_method('SetQosNoMeshControlPresent', 
-                   'void', 
-                   [])
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosQueueSize(uint8_t size) [member function]
-    cls.add_method('SetQosQueueSize', 
-                   'void', 
-                   [param('uint8_t', 'size')])
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosTid(uint8_t tid) [member function]
-    cls.add_method('SetQosTid', 
-                   'void', 
-                   [param('uint8_t', 'tid')])
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosTxopLimit(uint8_t txop) [member function]
-    cls.add_method('SetQosTxopLimit', 
-                   'void', 
-                   [param('uint8_t', 'txop')])
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetRawDuration(uint16_t duration) [member function]
-    cls.add_method('SetRawDuration', 
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
                    'void', 
-                   [param('uint16_t', 'duration')])
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetRetry() [member function]
-    cls.add_method('SetRetry', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::DoDispose() [member function]
+    cls.add_method('DoDispose', 
                    'void', 
-                   [])
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetSequenceNumber(uint16_t seq) [member function]
-    cls.add_method('SetSequenceNumber', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::ConfigureContentionWindow(uint32_t cwMin, uint32_t cwMax) [member function]
+    cls.add_method('ConfigureContentionWindow', 
                    'void', 
-                   [param('uint16_t', 'seq')])
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetType(ns3::WifiMacType type, bool resetToDsFromDs=true) [member function]
-    cls.add_method('SetType', 
+                   [param('uint32_t', 'cwMin'), param('uint32_t', 'cwMax')], 
+                   is_virtual=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetQosSupported(bool enable) [member function]
+    cls.add_method('SetQosSupported', 
                    'void', 
-                   [param('ns3::WifiMacType', 'type'), param('bool', 'resetToDsFromDs', default_value='true')])
-    return
-
-def register_Ns3WifiMacQueueItem_methods(root_module, cls):
-    cls.add_output_stream_operator()
-    ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem::WifiMacQueueItem(ns3::WifiMacQueueItem const & arg0) [constructor]
-    cls.add_constructor([param('ns3::WifiMacQueueItem const &', 'arg0')])
-    ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem::WifiMacQueueItem(ns3::Ptr<const ns3::Packet> p, ns3::WifiMacHeader const & header) [constructor]
-    cls.add_constructor([param('ns3::Ptr< ns3::Packet const >', 'p'), param('ns3::WifiMacHeader const &', 'header')])
-    ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem::WifiMacQueueItem(ns3::Ptr<const ns3::Packet> p, ns3::WifiMacHeader const & header, ns3::Time tstamp) [constructor]
-    cls.add_constructor([param('ns3::Ptr< ns3::Packet const >', 'p'), param('ns3::WifiMacHeader const &', 'header'), param('ns3::Time', 'tstamp')])
-    ## wifi-mac-queue-item.h (module 'wifi'): void ns3::WifiMacQueueItem::Aggregate(ns3::Ptr<const ns3::WifiMacQueueItem> msdu) [member function]
-    cls.add_method('Aggregate', 
+                   [param('bool', 'enable')], 
+                   visibility='protected')
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetShortSlotTimeSupported(bool enable) [member function]
+    cls.add_method('SetShortSlotTimeSupported', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'msdu')])
-    ## wifi-mac-queue-item.h (module 'wifi'): ns3::Mac48Address ns3::WifiMacQueueItem::GetDestinationAddress() const [member function]
-    cls.add_method('GetDestinationAddress', 
-                   'ns3::Mac48Address', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacHeader const & ns3::WifiMacQueueItem::GetHeader() const [member function]
-    cls.add_method('GetHeader', 
-                   'ns3::WifiMacHeader const &', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacHeader & ns3::WifiMacQueueItem::GetHeader() [member function]
-    cls.add_method('GetHeader', 
-                   'ns3::WifiMacHeader &', 
-                   [])
-    ## wifi-mac-queue-item.h (module 'wifi'): ns3::Ptr<const ns3::Packet> ns3::WifiMacQueueItem::GetPacket() const [member function]
-    cls.add_method('GetPacket', 
-                   'ns3::Ptr< ns3::Packet const >', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-queue-item.h (module 'wifi'): uint32_t ns3::WifiMacQueueItem::GetPacketSize() const [member function]
-    cls.add_method('GetPacketSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-queue-item.h (module 'wifi'): ns3::Ptr<ns3::Packet> ns3::WifiMacQueueItem::GetProtocolDataUnit() const [member function]
-    cls.add_method('GetProtocolDataUnit', 
-                   'ns3::Ptr< ns3::Packet >', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-queue-item.h (module 'wifi'): ns3::AcIndex ns3::WifiMacQueueItem::GetQueueAc() const [member function]
-    cls.add_method('GetQueueAc', 
-                   'ns3::AcIndex', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem::ConstIterator ns3::WifiMacQueueItem::GetQueueIterator() const [member function]
-    cls.add_method('GetQueueIterator', 
-                   'ns3::WifiMacQueueItem::ConstIterator', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-queue-item.h (module 'wifi'): uint32_t ns3::WifiMacQueueItem::GetSize() const [member function]
-    cls.add_method('GetSize', 
-                   'uint32_t', 
+                   [param('bool', 'enable')], 
+                   visibility='protected')
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::GetShortSlotTimeSupported() const [member function]
+    cls.add_method('GetShortSlotTimeSupported', 
+                   'bool', 
                    [], 
-                   is_const=True)
-    ## wifi-mac-queue-item.h (module 'wifi'): ns3::Time ns3::WifiMacQueueItem::GetTimeStamp() const [member function]
-    cls.add_method('GetTimeStamp', 
-                   'ns3::Time', 
+                   is_const=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::WifiMac::GetVOQueue() const [member function]
+    cls.add_method('GetVOQueue', 
+                   'ns3::Ptr< ns3::QosTxop >', 
                    [], 
-                   is_const=True)
-    ## wifi-mac-queue-item.h (module 'wifi'): bool ns3::WifiMacQueueItem::IsFragment() const [member function]
-    cls.add_method('IsFragment', 
-                   'bool', 
+                   is_const=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::WifiMac::GetVIQueue() const [member function]
+    cls.add_method('GetVIQueue', 
+                   'ns3::Ptr< ns3::QosTxop >', 
                    [], 
-                   is_const=True)
-    ## wifi-mac-queue-item.h (module 'wifi'): bool ns3::WifiMacQueueItem::IsInFlight() const [member function]
-    cls.add_method('IsInFlight', 
-                   'bool', 
+                   is_const=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::WifiMac::GetBEQueue() const [member function]
+    cls.add_method('GetBEQueue', 
+                   'ns3::Ptr< ns3::QosTxop >', 
                    [], 
-                   is_const=True)
-    ## wifi-mac-queue-item.h (module 'wifi'): bool ns3::WifiMacQueueItem::IsQueued() const [member function]
-    cls.add_method('IsQueued', 
-                   'bool', 
+                   is_const=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::WifiMac::GetBKQueue() const [member function]
+    cls.add_method('GetBKQueue', 
+                   'ns3::Ptr< ns3::QosTxop >', 
                    [], 
-                   is_const=True)
-    ## wifi-mac-queue-item.h (module 'wifi'): void ns3::WifiMacQueueItem::Print(std::ostream & os) const [member function]
-    cls.add_method('Print', 
+                   is_const=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::Receive(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('Receive', 
                    'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-mac-queue-item.h (module 'wifi'): void ns3::WifiMacQueueItem::ResetInFlight() [member function]
-    cls.add_method('ResetInFlight', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
+                   is_virtual=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::ForwardUp(ns3::Ptr<const ns3::Packet> packet, ns3::Mac48Address from, ns3::Mac48Address to) [member function]
+    cls.add_method('ForwardUp', 
                    'void', 
-                   [])
-    ## wifi-mac-queue-item.h (module 'wifi'): void ns3::WifiMacQueueItem::SetInFlight() [member function]
-    cls.add_method('SetInFlight', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::Mac48Address', 'from'), param('ns3::Mac48Address', 'to')], 
+                   visibility='protected')
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::DeaggregateAmsduAndForward(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('DeaggregateAmsduAndForward', 
                    'void', 
-                   [])
-    ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem::DeaggregatedMsdusCI ns3::WifiMacQueueItem::begin() [member function]
-    cls.add_method('begin', 
-                   'ns3::WifiMacQueueItem::DeaggregatedMsdusCI', 
-                   [])
-    ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem::DeaggregatedMsdusCI ns3::WifiMacQueueItem::end() [member function]
-    cls.add_method('end', 
-                   'ns3::WifiMacQueueItem::DeaggregatedMsdusCI', 
-                   [])
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
+                   is_virtual=True, visibility='protected')
     return
 
 def register_Ns3WifiRemoteStationManager_methods(root_module, cls):
@@ -7522,68 +6478,75 @@
                    is_virtual=True, visibility='private')
     return
 
-def register_Ns3AmsduSubframeHeader_methods(root_module, cls):
-    ## amsdu-subframe-header.h (module 'wifi'): ns3::AmsduSubframeHeader::AmsduSubframeHeader(ns3::AmsduSubframeHeader const & arg0) [constructor]
-    cls.add_constructor([param('ns3::AmsduSubframeHeader const &', 'arg0')])
-    ## amsdu-subframe-header.h (module 'wifi'): ns3::AmsduSubframeHeader::AmsduSubframeHeader() [constructor]
-    cls.add_constructor([])
-    ## amsdu-subframe-header.h (module 'wifi'): uint32_t ns3::AmsduSubframeHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
-    cls.add_method('Deserialize', 
-                   'uint32_t', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_virtual=True)
-    ## amsdu-subframe-header.h (module 'wifi'): ns3::Mac48Address ns3::AmsduSubframeHeader::GetDestinationAddr() const [member function]
-    cls.add_method('GetDestinationAddr', 
-                   'ns3::Mac48Address', 
-                   [], 
-                   is_const=True)
-    ## amsdu-subframe-header.h (module 'wifi'): ns3::TypeId ns3::AmsduSubframeHeader::GetInstanceTypeId() const [member function]
-    cls.add_method('GetInstanceTypeId', 
+def register_Ns3ZetaRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::ZetaRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## amsdu-subframe-header.h (module 'wifi'): uint16_t ns3::AmsduSubframeHeader::GetLength() const [member function]
-    cls.add_method('GetLength', 
-                   'uint16_t', 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::ZetaRandomVariable::ZetaRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): double ns3::ZetaRandomVariable::GetAlpha() const [member function]
+    cls.add_method('GetAlpha', 
+                   'double', 
                    [], 
                    is_const=True)
-    ## amsdu-subframe-header.h (module 'wifi'): uint32_t ns3::AmsduSubframeHeader::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
+    ## random-variable-stream.h (module 'core'): double ns3::ZetaRandomVariable::GetValue(double alpha) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('double', 'alpha')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ZetaRandomVariable::GetInteger(uint32_t alpha) [member function]
+    cls.add_method('GetInteger', 
                    'uint32_t', 
+                   [param('uint32_t', 'alpha')])
+    ## random-variable-stream.h (module 'core'): double ns3::ZetaRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## amsdu-subframe-header.h (module 'wifi'): ns3::Mac48Address ns3::AmsduSubframeHeader::GetSourceAddr() const [member function]
-    cls.add_method('GetSourceAddr', 
-                   'ns3::Mac48Address', 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ZetaRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
                    [], 
-                   is_const=True)
-    ## amsdu-subframe-header.h (module 'wifi'): static ns3::TypeId ns3::AmsduSubframeHeader::GetTypeId() [member function]
+                   is_virtual=True)
+    return
+
+def register_Ns3ZipfRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::ZipfRandomVariable::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## amsdu-subframe-header.h (module 'wifi'): void ns3::AmsduSubframeHeader::Print(std::ostream & os) const [member function]
-    cls.add_method('Print', 
-                   'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_const=True, is_virtual=True)
-    ## amsdu-subframe-header.h (module 'wifi'): void ns3::AmsduSubframeHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('Serialize', 
-                   'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True, is_virtual=True)
-    ## amsdu-subframe-header.h (module 'wifi'): void ns3::AmsduSubframeHeader::SetDestinationAddr(ns3::Mac48Address to) [member function]
-    cls.add_method('SetDestinationAddr', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'to')])
-    ## amsdu-subframe-header.h (module 'wifi'): void ns3::AmsduSubframeHeader::SetLength(uint16_t length) [member function]
-    cls.add_method('SetLength', 
-                   'void', 
-                   [param('uint16_t', 'length')])
-    ## amsdu-subframe-header.h (module 'wifi'): void ns3::AmsduSubframeHeader::SetSourceAddr(ns3::Mac48Address to) [member function]
-    cls.add_method('SetSourceAddr', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'to')])
+    ## random-variable-stream.h (module 'core'): ns3::ZipfRandomVariable::ZipfRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ZipfRandomVariable::GetN() const [member function]
+    cls.add_method('GetN', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::ZipfRandomVariable::GetAlpha() const [member function]
+    cls.add_method('GetAlpha', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::ZipfRandomVariable::GetValue(uint32_t n, double alpha) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('uint32_t', 'n'), param('double', 'alpha')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ZipfRandomVariable::GetInteger(uint32_t n, uint32_t alpha) [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [param('uint32_t', 'n'), param('uint32_t', 'alpha')])
+    ## random-variable-stream.h (module 'core'): double ns3::ZipfRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ZipfRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_virtual=True)
     return
 
 def register_Ns3AttributeAccessor_methods(root_module, cls):
@@ -7677,161 +6640,6 @@
                    is_const=True, is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3BlockAckManager_methods(root_module, cls):
-    ## block-ack-manager.h (module 'wifi'): static ns3::TypeId ns3::BlockAckManager::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## block-ack-manager.h (module 'wifi'): ns3::BlockAckManager::BlockAckManager() [constructor]
-    cls.add_constructor([])
-    ## block-ack-manager.h (module 'wifi'): bool ns3::BlockAckManager::ExistsAgreement(ns3::Mac48Address recipient, uint8_t tid) const [member function]
-    cls.add_method('ExistsAgreement', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
-                   is_const=True)
-    ## block-ack-manager.h (module 'wifi'): bool ns3::BlockAckManager::ExistsAgreementInState(ns3::Mac48Address recipient, uint8_t tid, ns3::OriginatorBlockAckAgreement::State state) const [member function]
-    cls.add_method('ExistsAgreementInState', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid'), param('ns3::OriginatorBlockAckAgreement::State', 'state')], 
-                   is_const=True)
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::CreateAgreement(ns3::MgtAddBaRequestHeader const * reqHdr, ns3::Mac48Address recipient, bool htSupported=true) [member function]
-    cls.add_method('CreateAgreement', 
-                   'void', 
-                   [param('ns3::MgtAddBaRequestHeader const *', 'reqHdr'), param('ns3::Mac48Address', 'recipient'), param('bool', 'htSupported', default_value='true')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::DestroyAgreement(ns3::Mac48Address recipient, uint8_t tid) [member function]
-    cls.add_method('DestroyAgreement', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::UpdateAgreement(ns3::MgtAddBaResponseHeader const * respHdr, ns3::Mac48Address recipient, uint16_t startingSeq) [member function]
-    cls.add_method('UpdateAgreement', 
-                   'void', 
-                   [param('ns3::MgtAddBaResponseHeader const *', 'respHdr'), param('ns3::Mac48Address', 'recipient'), param('uint16_t', 'startingSeq')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::StorePacket(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('StorePacket', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')])
-    ## block-ack-manager.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::BlockAckManager::GetBar(bool remove=true, uint8_t tid=8, ns3::Mac48Address recipient=ns3::Mac48Address::GetBroadcast()) [member function]
-    cls.add_method('GetBar', 
-                   'ns3::Ptr< ns3::WifiMacQueueItem const >', 
-                   [param('bool', 'remove', default_value='true'), param('uint8_t', 'tid', default_value='8'), param('ns3::Mac48Address', 'recipient', default_value='ns3::Mac48Address::GetBroadcast()')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyGotAck(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('NotifyGotAck', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyMissedAck(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('NotifyMissedAck', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')])
-    ## block-ack-manager.h (module 'wifi'): std::pair<unsigned short, unsigned short> ns3::BlockAckManager::NotifyGotBlockAck(ns3::CtrlBAckResponseHeader const & blockAck, ns3::Mac48Address recipient, std::set<unsigned char, std::less<unsigned char>, std::allocator<unsigned char> > const & tids, size_t index=0) [member function]
-    cls.add_method('NotifyGotBlockAck', 
-                   'std::pair< unsigned short, unsigned short >', 
-                   [param('ns3::CtrlBAckResponseHeader const &', 'blockAck'), param('ns3::Mac48Address', 'recipient'), param('std::set< unsigned char > const &', 'tids'), param('size_t', 'index', default_value='0')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyMissedBlockAck(ns3::Mac48Address recipient, uint8_t tid) [member function]
-    cls.add_method('NotifyMissedBlockAck', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')])
-    ## block-ack-manager.h (module 'wifi'): uint32_t ns3::BlockAckManager::GetNBufferedPackets(ns3::Mac48Address recipient, uint8_t tid) const [member function]
-    cls.add_method('GetNBufferedPackets', 
-                   'uint32_t', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
-                   is_const=True)
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyAgreementEstablished(ns3::Mac48Address recipient, uint8_t tid, uint16_t startingSeq) [member function]
-    cls.add_method('NotifyAgreementEstablished', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid'), param('uint16_t', 'startingSeq')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyAgreementRejected(ns3::Mac48Address recipient, uint8_t tid) [member function]
-    cls.add_method('NotifyAgreementRejected', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyAgreementNoReply(ns3::Mac48Address recipient, uint8_t tid) [member function]
-    cls.add_method('NotifyAgreementNoReply', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyAgreementReset(ns3::Mac48Address recipient, uint8_t tid) [member function]
-    cls.add_method('NotifyAgreementReset', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetBlockAckThreshold(uint8_t nPackets) [member function]
-    cls.add_method('SetBlockAckThreshold', 
-                   'void', 
-                   [param('uint8_t', 'nPackets')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetQueue(ns3::Ptr<ns3::WifiMacQueue> const queue) [member function]
-    cls.add_method('SetQueue', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueue > const', 'queue')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetBlockAckInactivityCallback(ns3::Callback<void, ns3::Mac48Address, unsigned char, bool, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
-    cls.add_method('SetBlockAckInactivityCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::Mac48Address, unsigned char, bool, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetBlockDestinationCallback(ns3::Callback<void, ns3::Mac48Address, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
-    cls.add_method('SetBlockDestinationCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::Mac48Address, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetUnblockDestinationCallback(ns3::Callback<void, ns3::Mac48Address, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
-    cls.add_method('SetUnblockDestinationCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::Mac48Address, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## block-ack-manager.h (module 'wifi'): bool ns3::BlockAckManager::SwitchToBlockAckIfNeeded(ns3::Mac48Address recipient, uint8_t tid, uint16_t startingSeq) [member function]
-    cls.add_method('SwitchToBlockAckIfNeeded', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid'), param('uint16_t', 'startingSeq')])
-    ## block-ack-manager.h (module 'wifi'): bool ns3::BlockAckManager::NeedBarRetransmission(uint8_t tid, ns3::Mac48Address recipient) [member function]
-    cls.add_method('NeedBarRetransmission', 
-                   'bool', 
-                   [param('uint8_t', 'tid'), param('ns3::Mac48Address', 'recipient')])
-    ## block-ack-manager.h (module 'wifi'): uint16_t ns3::BlockAckManager::GetRecipientBufferSize(ns3::Mac48Address recipient, uint8_t tid) const [member function]
-    cls.add_method('GetRecipientBufferSize', 
-                   'uint16_t', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
-                   is_const=True)
-    ## block-ack-manager.h (module 'wifi'): ns3::BlockAckReqType ns3::BlockAckManager::GetBlockAckReqType(ns3::Mac48Address recipient, uint8_t tid) const [member function]
-    cls.add_method('GetBlockAckReqType', 
-                   'ns3::BlockAckReqType', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
-                   is_const=True)
-    ## block-ack-manager.h (module 'wifi'): ns3::BlockAckType ns3::BlockAckManager::GetBlockAckType(ns3::Mac48Address recipient, uint8_t tid) const [member function]
-    cls.add_method('GetBlockAckType', 
-                   'ns3::BlockAckType', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
-                   is_const=True)
-    ## block-ack-manager.h (module 'wifi'): uint16_t ns3::BlockAckManager::GetOriginatorStartingSequence(ns3::Mac48Address recipient, uint8_t tid) const [member function]
-    cls.add_method('GetOriginatorStartingSequence', 
-                   'uint16_t', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
-                   is_const=True)
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetTxOkCallback(ns3::BlockAckManager::TxOk callback) [member function]
-    cls.add_method('SetTxOkCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetTxFailedCallback(ns3::BlockAckManager::TxFailed callback) [member function]
-    cls.add_method('SetTxFailedCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetDroppedOldMpduCallback(ns3::BlockAckManager::DroppedOldMpdu callback) [member function]
-    cls.add_method('SetDroppedOldMpduCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyDiscardedMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('NotifyDiscardedMpdu', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')])
-    ## block-ack-manager.h (module 'wifi'): ns3::CtrlBAckRequestHeader ns3::BlockAckManager::GetBlockAckReqHeader(ns3::Mac48Address recipient, uint8_t tid) const [member function]
-    cls.add_method('GetBlockAckReqHeader', 
-                   'ns3::CtrlBAckRequestHeader', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
-                   is_const=True)
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::ScheduleBar(ns3::Ptr<const ns3::WifiMacQueueItem> bar, bool skipIfNoDataQueued=false) [member function]
-    cls.add_method('ScheduleBar', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'bar'), param('bool', 'skipIfNoDataQueued', default_value='false')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::DoDispose() [member function]
-    cls.add_method('DoDispose', 
-                   'void', 
-                   [], 
-                   is_virtual=True, visibility='protected')
-    return
-
 def register_Ns3BooleanChecker_methods(root_module, cls):
     ## boolean.h (module 'core'): ns3::BooleanChecker::BooleanChecker() [constructor]
     cls.add_constructor([])
@@ -7914,11 +6722,6 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['unsigned int'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
                    is_static=True, template_parameters=['ns3::Ptr<ns3::NetDevice> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
@@ -7949,32 +6752,32 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['unsigned long'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::Packet> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['unsigned char'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Mac48Address'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::WifiTxVector const&'], visibility='protected')
+                   is_static=True, template_parameters=['unsigned int'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Mac48Address'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Time'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Time'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::dot11s::RouteChange'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::OriginatorBlockAckAgreement::State'], visibility='protected')
+                   is_static=True, template_parameters=['unsigned long'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
@@ -7989,7 +6792,7 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::WifiMacHeader const&'], visibility='protected')
+                   is_static=True, template_parameters=['unsigned char'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
@@ -8005,16 +6808,6 @@
                    'std::string', 
                    [], 
                    is_static=True, template_parameters=['std::set<ns3::Mac48Address', ' std::less<ns3::Mac48Address>', ' std::allocator<ns3::Mac48Address> > const*'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::Packet> '], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True, template_parameters=['ns3::dot11s::RouteChange'], visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -8072,6 +6865,39 @@
                    is_static=True)
     return
 
+def register_Ns3ConstantRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::ConstantRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::ConstantRandomVariable::ConstantRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): double ns3::ConstantRandomVariable::GetConstant() const [member function]
+    cls.add_method('GetConstant', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::ConstantRandomVariable::GetValue(double constant) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('double', 'constant')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ConstantRandomVariable::GetInteger(uint32_t constant) [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [param('uint32_t', 'constant')])
+    ## random-variable-stream.h (module 'core'): double ns3::ConstantRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ConstantRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_virtual=True)
+    return
+
 def register_Ns3DataRateChecker_methods(root_module, cls):
     ## data-rate.h (module 'network'): ns3::DataRateChecker::DataRateChecker() [constructor]
     cls.add_constructor([])
@@ -8112,6 +6938,30 @@
                    [param('ns3::DataRate const &', 'value')])
     return
 
+def register_Ns3DeterministicRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::DeterministicRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::DeterministicRandomVariable::DeterministicRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): void ns3::DeterministicRandomVariable::SetValueArray(double * values, std::size_t length) [member function]
+    cls.add_method('SetValueArray', 
+                   'void', 
+                   [param('double *', 'values'), param('std::size_t', 'length')])
+    ## random-variable-stream.h (module 'core'): double ns3::DeterministicRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::DeterministicRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_virtual=True)
+    return
+
 def register_Ns3DoubleValue_methods(root_module, cls):
     ## double.h (module 'core'): ns3::DoubleValue::DoubleValue() [constructor]
     cls.add_constructor([])
@@ -8405,6 +7255,39 @@
                    [param('uint16_t', 'txop')])
     return
 
+def register_Ns3EmpiricalRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): ns3::EmpiricalRandomVariable::EmpiricalRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): void ns3::EmpiricalRandomVariable::CDF(double v, double c) [member function]
+    cls.add_method('CDF', 
+                   'void', 
+                   [param('double', 'v'), param('double', 'c')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::EmpiricalRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::EmpiricalRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate() [member function]
+    cls.add_method('Interpolate', 
+                   'double', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): bool ns3::EmpiricalRandomVariable::SetInterpolate(bool interpolate) [member function]
+    cls.add_method('SetInterpolate', 
+                   'bool', 
+                   [param('bool', 'interpolate')])
+    return
+
 def register_Ns3EmptyAttributeAccessor_methods(root_module, cls):
     ## attribute.h (module 'core'): ns3::EmptyAttributeAccessor::EmptyAttributeAccessor(ns3::EmptyAttributeAccessor const & arg0) [constructor]
     cls.add_constructor([param('ns3::EmptyAttributeAccessor const &', 'arg0')])
@@ -8579,6 +7462,44 @@
                    [param('int', 'value')])
     return
 
+def register_Ns3ErlangRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::ErlangRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::ErlangRandomVariable::ErlangRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ErlangRandomVariable::GetK() const [member function]
+    cls.add_method('GetK', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::ErlangRandomVariable::GetLambda() const [member function]
+    cls.add_method('GetLambda', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::ErlangRandomVariable::GetValue(uint32_t k, double lambda) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('uint32_t', 'k'), param('double', 'lambda')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ErlangRandomVariable::GetInteger(uint32_t k, uint32_t lambda) [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [param('uint32_t', 'k'), param('uint32_t', 'lambda')])
+    ## random-variable-stream.h (module 'core'): double ns3::ErlangRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ErlangRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_virtual=True)
+    return
+
 def register_Ns3ErpInformation_methods(root_module, cls):
     cls.add_output_stream_operator()
     ## erp-information.h (module 'wifi'): ns3::ErpInformation::ErpInformation(ns3::ErpInformation const & arg0) [constructor]
@@ -8672,6 +7593,44 @@
                    is_pure_virtual=True, is_virtual=True, visibility='protected')
     return
 
+def register_Ns3ExponentialRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::ExponentialRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::ExponentialRandomVariable::ExponentialRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): double ns3::ExponentialRandomVariable::GetMean() const [member function]
+    cls.add_method('GetMean', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::ExponentialRandomVariable::GetBound() const [member function]
+    cls.add_method('GetBound', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::ExponentialRandomVariable::GetValue(double mean, double bound) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('double', 'mean'), param('double', 'bound')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ExponentialRandomVariable::GetInteger(uint32_t mean, uint32_t bound) [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [param('uint32_t', 'mean'), param('uint32_t', 'bound')])
+    ## random-variable-stream.h (module 'core'): double ns3::ExponentialRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ExponentialRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_virtual=True)
+    return
+
 def register_Ns3ExtendedCapabilities_methods(root_module, cls):
     cls.add_output_stream_operator()
     ## extended-capabilities.h (module 'wifi'): ns3::ExtendedCapabilities::ExtendedCapabilities(ns3::ExtendedCapabilities const & arg0) [constructor]
@@ -8833,6 +7792,44 @@
                    [param('ns3::SupportedRates *', 'rates')])
     return
 
+def register_Ns3GammaRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::GammaRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::GammaRandomVariable::GammaRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): double ns3::GammaRandomVariable::GetAlpha() const [member function]
+    cls.add_method('GetAlpha', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::GammaRandomVariable::GetBeta() const [member function]
+    cls.add_method('GetBeta', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::GammaRandomVariable::GetValue(double alpha, double beta) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('double', 'alpha'), param('double', 'beta')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::GammaRandomVariable::GetInteger(uint32_t alpha, uint32_t beta) [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [param('uint32_t', 'alpha'), param('uint32_t', 'beta')])
+    ## random-variable-stream.h (module 'core'): double ns3::GammaRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::GammaRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_virtual=True)
+    return
+
 def register_Ns3HeCapabilities_methods(root_module, cls):
     cls.add_output_stream_operator()
     ## he-capabilities.h (module 'wifi'): ns3::HeCapabilities::HeCapabilities(ns3::HeCapabilities const & arg0) [constructor]
@@ -8859,19 +7856,14 @@
                    'uint8_t', 
                    [], 
                    is_const=True)
-    ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetHeLtfAndGiForHePpdus() const [member function]
-    cls.add_method('GetHeLtfAndGiForHePpdus', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
     ## he-capabilities.h (module 'wifi'): uint32_t ns3::HeCapabilities::GetHeMacCapabilitiesInfo1() const [member function]
     cls.add_method('GetHeMacCapabilitiesInfo1', 
                    'uint32_t', 
                    [], 
                    is_const=True)
-    ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetHeMacCapabilitiesInfo2() const [member function]
+    ## he-capabilities.h (module 'wifi'): uint16_t ns3::HeCapabilities::GetHeMacCapabilitiesInfo2() const [member function]
     cls.add_method('GetHeMacCapabilitiesInfo2', 
-                   'uint8_t', 
+                   'uint16_t', 
                    [], 
                    is_const=True)
     ## he-capabilities.h (module 'wifi'): uint64_t ns3::HeCapabilities::GetHePhyCapabilitiesInfo1() const [member function]
@@ -8879,11 +7871,26 @@
                    'uint64_t', 
                    [], 
                    is_const=True)
-    ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetHePhyCapabilitiesInfo2() const [member function]
+    ## he-capabilities.h (module 'wifi'): uint16_t ns3::HeCapabilities::GetHePhyCapabilitiesInfo2() const [member function]
     cls.add_method('GetHePhyCapabilitiesInfo2', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetHePhyCapabilitiesInfo3() const [member function]
+    cls.add_method('GetHePhyCapabilitiesInfo3', 
                    'uint8_t', 
                    [], 
                    is_const=True)
+    ## he-capabilities.h (module 'wifi'): bool ns3::HeCapabilities::GetHePpdu4xHeLtf800nsGi() const [member function]
+    cls.add_method('GetHePpdu4xHeLtf800nsGi', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## he-capabilities.h (module 'wifi'): bool ns3::HeCapabilities::GetHeSuPpdu1xHeLtf800nsGi() const [member function]
+    cls.add_method('GetHeSuPpdu1xHeLtf800nsGi', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetHighestMcsSupported() const [member function]
     cls.add_method('GetHighestMcsSupported', 
                    'uint8_t', 
@@ -8943,18 +7950,22 @@
     cls.add_method('SetChannelWidthSet', 
                    'void', 
                    [param('uint8_t', 'channelWidthSet')])
-    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHeLtfAndGiForHePpdus(uint8_t heLtfAndGiForHePpdus) [member function]
-    cls.add_method('SetHeLtfAndGiForHePpdus', 
-                   'void', 
-                   [param('uint8_t', 'heLtfAndGiForHePpdus')])
-    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHeMacCapabilitiesInfo(uint32_t ctrl1, uint8_t ctrl2) [member function]
+    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHeMacCapabilitiesInfo(uint32_t ctrl1, uint16_t ctrl2) [member function]
     cls.add_method('SetHeMacCapabilitiesInfo', 
                    'void', 
-                   [param('uint32_t', 'ctrl1'), param('uint8_t', 'ctrl2')])
-    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHePhyCapabilitiesInfo(uint64_t ctrl1, uint8_t ctrl2) [member function]
+                   [param('uint32_t', 'ctrl1'), param('uint16_t', 'ctrl2')])
+    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHePhyCapabilitiesInfo(uint64_t ctrl1, uint16_t ctrl2, uint8_t ctrl3) [member function]
     cls.add_method('SetHePhyCapabilitiesInfo', 
                    'void', 
-                   [param('uint64_t', 'ctrl1'), param('uint8_t', 'ctrl2')])
+                   [param('uint64_t', 'ctrl1'), param('uint16_t', 'ctrl2'), param('uint8_t', 'ctrl3')])
+    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHePpdu4xHeLtf800nsGi(bool heSuPpdu4xHeLtf800nsGi) [member function]
+    cls.add_method('SetHePpdu4xHeLtf800nsGi', 
+                   'void', 
+                   [param('bool', 'heSuPpdu4xHeLtf800nsGi')])
+    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHeSuPpdu1xHeLtf800nsGi(bool heSuPpdu1xHeLtf800nsGi) [member function]
+    cls.add_method('SetHeSuPpdu1xHeLtf800nsGi', 
+                   'void', 
+                   [param('bool', 'heSuPpdu1xHeLtf800nsGi')])
     ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHeSupported(uint8_t heSupported) [member function]
     cls.add_method('SetHeSupported', 
                    'void', 
@@ -9690,6 +8701,44 @@
                    [param('ns3::Ipv6Prefix const &', 'value')])
     return
 
+def register_Ns3LogNormalRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::LogNormalRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::LogNormalRandomVariable::LogNormalRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): double ns3::LogNormalRandomVariable::GetMu() const [member function]
+    cls.add_method('GetMu', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::LogNormalRandomVariable::GetSigma() const [member function]
+    cls.add_method('GetSigma', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::LogNormalRandomVariable::GetValue(double mu, double sigma) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('double', 'mu'), param('double', 'sigma')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::LogNormalRandomVariable::GetInteger(uint32_t mu, uint32_t sigma) [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [param('uint32_t', 'mu'), param('uint32_t', 'sigma')])
+    ## random-variable-stream.h (module 'core'): double ns3::LogNormalRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::LogNormalRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_virtual=True)
+    return
+
 def register_Ns3Mac48AddressChecker_methods(root_module, cls):
     ## mac48-address.h (module 'network'): ns3::Mac48AddressChecker::Mac48AddressChecker() [constructor]
     cls.add_constructor([])
@@ -9810,6 +8859,149 @@
                    is_pure_virtual=True, is_virtual=True)
     return
 
+def register_Ns3MeshWifiInterfaceMac_methods(root_module, cls):
+    ## mesh-wifi-interface-mac.h (module 'mesh'): ns3::MeshWifiInterfaceMac::MeshWifiInterfaceMac() [constructor]
+    cls.add_constructor([])
+    ## mesh-wifi-interface-mac.h (module 'mesh'): int64_t ns3::MeshWifiInterfaceMac::AssignStreams(int64_t stream) [member function]
+    cls.add_method('AssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')])
+    ## mesh-wifi-interface-mac.h (module 'mesh'): bool ns3::MeshWifiInterfaceMac::CanForwardPacketsTo(ns3::Mac48Address to) const [member function]
+    cls.add_method('CanForwardPacketsTo', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'to')], 
+                   is_const=True, is_virtual=True)
+    ## mesh-wifi-interface-mac.h (module 'mesh'): bool ns3::MeshWifiInterfaceMac::CheckSupportedRates(ns3::SupportedRates rates) const [member function]
+    cls.add_method('CheckSupportedRates', 
+                   'bool', 
+                   [param('ns3::SupportedRates', 'rates')], 
+                   is_const=True)
+    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::ConfigureContentionWindow(uint32_t cwMin, uint32_t cwMax) [member function]
+    cls.add_method('ConfigureContentionWindow', 
+                   'void', 
+                   [param('uint32_t', 'cwMin'), param('uint32_t', 'cwMax')], 
+                   is_virtual=True)
+    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::ConfigureStandard(ns3::WifiStandard standard) [member function]
+    cls.add_method('ConfigureStandard', 
+                   'void', 
+                   [param('ns3::WifiStandard', 'standard')], 
+                   is_virtual=True)
+    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to, ns3::Mac48Address from) [member function]
+    cls.add_method('Enqueue', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to'), param('ns3::Mac48Address', 'from')], 
+                   is_virtual=True)
+    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to) [member function]
+    cls.add_method('Enqueue', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to')], 
+                   is_virtual=True)
+    ## mesh-wifi-interface-mac.h (module 'mesh'): ns3::Time ns3::MeshWifiInterfaceMac::GetBeaconInterval() const [member function]
+    cls.add_method('GetBeaconInterval', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## mesh-wifi-interface-mac.h (module 'mesh'): uint16_t ns3::MeshWifiInterfaceMac::GetFrequencyChannel() const [member function]
+    cls.add_method('GetFrequencyChannel', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## mesh-wifi-interface-mac.h (module 'mesh'): uint32_t ns3::MeshWifiInterfaceMac::GetLinkMetric(ns3::Mac48Address peerAddress) [member function]
+    cls.add_method('GetLinkMetric', 
+                   'uint32_t', 
+                   [param('ns3::Mac48Address', 'peerAddress')])
+    ## mesh-wifi-interface-mac.h (module 'mesh'): ns3::Mac48Address ns3::MeshWifiInterfaceMac::GetMeshPointAddress() const [member function]
+    cls.add_method('GetMeshPointAddress', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_const=True)
+    ## mesh-wifi-interface-mac.h (module 'mesh'): ns3::SupportedRates ns3::MeshWifiInterfaceMac::GetSupportedRates() const [member function]
+    cls.add_method('GetSupportedRates', 
+                   'ns3::SupportedRates', 
+                   [], 
+                   is_const=True)
+    ## mesh-wifi-interface-mac.h (module 'mesh'): ns3::Time ns3::MeshWifiInterfaceMac::GetTbtt() const [member function]
+    cls.add_method('GetTbtt', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## mesh-wifi-interface-mac.h (module 'mesh'): static ns3::TypeId ns3::MeshWifiInterfaceMac::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::InstallPlugin(ns3::Ptr<ns3::MeshWifiInterfaceMacPlugin> plugin) [member function]
+    cls.add_method('InstallPlugin', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::MeshWifiInterfaceMacPlugin >', 'plugin')])
+    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::Report(std::ostream & os) const [member function]
+    cls.add_method('Report', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::ResetStats() [member function]
+    cls.add_method('ResetStats', 
+                   'void', 
+                   [])
+    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::SendManagementFrame(ns3::Ptr<ns3::Packet> frame, ns3::WifiMacHeader const & hdr) [member function]
+    cls.add_method('SendManagementFrame', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'frame'), param('ns3::WifiMacHeader const &', 'hdr')])
+    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::SetBeaconGeneration(bool enable) [member function]
+    cls.add_method('SetBeaconGeneration', 
+                   'void', 
+                   [param('bool', 'enable')])
+    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::SetBeaconInterval(ns3::Time interval) [member function]
+    cls.add_method('SetBeaconInterval', 
+                   'void', 
+                   [param('ns3::Time', 'interval')])
+    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::SetLinkMetricCallback(ns3::Callback<unsigned int, ns3::Mac48Address, ns3::Ptr<ns3::MeshWifiInterfaceMac>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> cb) [member function]
+    cls.add_method('SetLinkMetricCallback', 
+                   'void', 
+                   [param('ns3::Callback< unsigned int, ns3::Mac48Address, ns3::Ptr< ns3::MeshWifiInterfaceMac >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'cb')])
+    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::SetLinkUpCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkUp) [member function]
+    cls.add_method('SetLinkUpCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkUp')], 
+                   is_virtual=True)
+    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::SetMeshPointAddress(ns3::Mac48Address addr) [member function]
+    cls.add_method('SetMeshPointAddress', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'addr')])
+    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::SetRandomStartDelay(ns3::Time interval) [member function]
+    cls.add_method('SetRandomStartDelay', 
+                   'void', 
+                   [param('ns3::Time', 'interval')])
+    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::ShiftTbtt(ns3::Time shift) [member function]
+    cls.add_method('ShiftTbtt', 
+                   'void', 
+                   [param('ns3::Time', 'shift')])
+    ## mesh-wifi-interface-mac.h (module 'mesh'): bool ns3::MeshWifiInterfaceMac::SupportsSendFrom() const [member function]
+    cls.add_method('SupportsSendFrom', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::SwitchFrequencyChannel(uint16_t new_id) [member function]
+    cls.add_method('SwitchFrequencyChannel', 
+                   'void', 
+                   [param('uint16_t', 'new_id')])
+    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='private')
+    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='private')
+    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::Receive(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('Receive', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
+                   is_virtual=True, visibility='private')
+    return
+
 def register_Ns3MeshWifiInterfaceMacPlugin_methods(root_module, cls):
     ## mesh-wifi-interface-mac-plugin.h (module 'mesh'): ns3::MeshWifiInterfaceMacPlugin::MeshWifiInterfaceMacPlugin() [constructor]
     cls.add_constructor([])
@@ -10106,10 +9298,16 @@
     cls.add_method('ExtractNeighborIndex', 
                    'uint32_t', 
                    [param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetEpoch() const [member function]
+    cls.add_method('GetEpoch', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() const [member function]
     cls.add_method('GetRemainingBits', 
                    'uint32_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -10120,6 +9318,10 @@
                    'uint32_t', 
                    [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
+    ## nix-vector.h (module 'network'): void ns3::NixVector::SetEpoch(uint32_t epoch) [member function]
+    cls.add_method('SetEpoch', 
+                   'void', 
+                   [param('uint32_t', 'epoch')])
     return
 
 def register_Ns3Node_methods(root_module, cls):
@@ -10210,6 +9412,51 @@
                    is_virtual=True, visibility='protected')
     return
 
+def register_Ns3NormalRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): ns3::NormalRandomVariable::INFINITE_VALUE [variable]
+    cls.add_static_attribute('INFINITE_VALUE', 'double const', is_const=True)
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::NormalRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::NormalRandomVariable::NormalRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): double ns3::NormalRandomVariable::GetMean() const [member function]
+    cls.add_method('GetMean', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::NormalRandomVariable::GetVariance() const [member function]
+    cls.add_method('GetVariance', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::NormalRandomVariable::GetBound() const [member function]
+    cls.add_method('GetBound', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::NormalRandomVariable::GetValue(double mean, double variance, double bound=ns3::NormalRandomVariable::INFINITE_VALUE) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('double', 'mean'), param('double', 'variance'), param('double', 'bound', default_value='ns3::NormalRandomVariable::INFINITE_VALUE')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::NormalRandomVariable::GetInteger(uint32_t mean, uint32_t variance, uint32_t bound) [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [param('uint32_t', 'mean'), param('uint32_t', 'variance'), param('uint32_t', 'bound')])
+    ## random-variable-stream.h (module 'core'): double ns3::NormalRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::NormalRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_virtual=True)
+    return
+
 def register_Ns3ObjectFactoryChecker_methods(root_module, cls):
     ## object-factory.h (module 'core'): ns3::ObjectFactoryChecker::ObjectFactoryChecker() [constructor]
     cls.add_constructor([])
@@ -10438,10 +9685,11 @@
                    'uint32_t', 
                    [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) const [member function]
     cls.add_method('SetNixVector', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')], 
+                   is_const=True)
     ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
     cls.add_method('ToString', 
                    'std::string', 
@@ -10449,531 +9697,47 @@
                    is_const=True)
     return
 
-def register_Ns3QosTxop_methods(root_module, cls):
-    ## qos-txop.h (module 'wifi'): static ns3::TypeId ns3::QosTxop::GetTypeId() [member function]
+def register_Ns3ParetoRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::ParetoRandomVariable::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## qos-txop.h (module 'wifi'): ns3::QosTxop::QosTxop(ns3::AcIndex ac=::ns3::AcIndex::AC_UNDEF) [constructor]
-    cls.add_constructor([param('ns3::AcIndex', 'ac', default_value='::ns3::AcIndex::AC_UNDEF')])
-    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::IsQosTxop() const [member function]
-    cls.add_method('IsQosTxop', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::HasFramesToTransmit() [member function]
-    cls.add_method('HasFramesToTransmit', 
-                   'bool', 
-                   [], 
-                   is_virtual=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::NotifyChannelAccessed(ns3::Time txopDuration) [member function]
-    cls.add_method('NotifyChannelAccessed', 
-                   'void', 
-                   [param('ns3::Time', 'txopDuration')], 
-                   is_virtual=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::NotifyChannelReleased() [member function]
-    cls.add_method('NotifyChannelReleased', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetDroppedMpduCallback(ns3::Txop::DroppedMpdu callback) [member function]
-    cls.add_method('SetDroppedMpduCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::WifiMacDropReason, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
-                   is_virtual=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetQosFrameExchangeManager(ns3::Ptr<ns3::QosFrameExchangeManager> const qosFem) [member function]
-    cls.add_method('SetQosFrameExchangeManager', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::QosFrameExchangeManager > const', 'qosFem')])
-    ## qos-txop.h (module 'wifi'): ns3::AcIndex ns3::QosTxop::GetAccessCategory() const [member function]
-    cls.add_method('GetAccessCategory', 
-                   'ns3::AcIndex', 
-                   [], 
-                   is_const=True)
-    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::UseExplicitBarAfterMissedBlockAck() const [member function]
-    cls.add_method('UseExplicitBarAfterMissedBlockAck', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## qos-txop.h (module 'wifi'): ns3::Ptr<ns3::BlockAckManager> ns3::QosTxop::GetBaManager() [member function]
-    cls.add_method('GetBaManager', 
-                   'ns3::Ptr< ns3::BlockAckManager >', 
-                   [])
-    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::GetBaAgreementEstablished(ns3::Mac48Address address, uint8_t tid) const [member function]
-    cls.add_method('GetBaAgreementEstablished', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'address'), param('uint8_t', 'tid')], 
-                   is_const=True)
-    ## qos-txop.h (module 'wifi'): uint16_t ns3::QosTxop::GetBaBufferSize(ns3::Mac48Address address, uint8_t tid) const [member function]
-    cls.add_method('GetBaBufferSize', 
-                   'uint16_t', 
-                   [param('ns3::Mac48Address', 'address'), param('uint8_t', 'tid')], 
-                   is_const=True)
-    ## qos-txop.h (module 'wifi'): uint16_t ns3::QosTxop::GetBaStartingSequence(ns3::Mac48Address address, uint8_t tid) const [member function]
-    cls.add_method('GetBaStartingSequence', 
-                   'uint16_t', 
-                   [param('ns3::Mac48Address', 'address'), param('uint8_t', 'tid')], 
-                   is_const=True)
-    ## qos-txop.h (module 'wifi'): ns3::BlockAckReqType ns3::QosTxop::GetBlockAckReqType(ns3::Mac48Address recipient, uint8_t tid) const [member function]
-    cls.add_method('GetBlockAckReqType', 
-                   'ns3::BlockAckReqType', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
-                   is_const=True)
-    ## qos-txop.h (module 'wifi'): ns3::BlockAckType ns3::QosTxop::GetBlockAckType(ns3::Mac48Address recipient, uint8_t tid) const [member function]
-    cls.add_method('GetBlockAckType', 
-                   'ns3::BlockAckType', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
-                   is_const=True)
-    ## qos-txop.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::QosTxop::PrepareBlockAckRequest(ns3::Mac48Address recipient, uint8_t tid) const [member function]
-    cls.add_method('PrepareBlockAckRequest', 
-                   'ns3::Ptr< ns3::WifiMacQueueItem const >', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
-                   is_const=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::ScheduleBar(ns3::Ptr<const ns3::WifiMacQueueItem> bar, bool skipIfNoDataQueued=false) [member function]
-    cls.add_method('ScheduleBar', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'bar'), param('bool', 'skipIfNoDataQueued', default_value='false')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::GotAddBaResponse(ns3::MgtAddBaResponseHeader const * respHdr, ns3::Mac48Address recipient) [member function]
-    cls.add_method('GotAddBaResponse', 
-                   'void', 
-                   [param('ns3::MgtAddBaResponseHeader const *', 'respHdr'), param('ns3::Mac48Address', 'recipient')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::GotDelBaFrame(ns3::MgtDelBaHeader const * delBaHdr, ns3::Mac48Address recipient) [member function]
-    cls.add_method('GotDelBaFrame', 
-                   'void', 
-                   [param('ns3::MgtDelBaHeader const *', 'delBaHdr'), param('ns3::Mac48Address', 'recipient')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::AddBaResponseTimeout(ns3::Mac48Address recipient, uint8_t tid) [member function]
-    cls.add_method('AddBaResponseTimeout', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::ResetBa(ns3::Mac48Address recipient, uint8_t tid) [member function]
-    cls.add_method('ResetBa', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::PushFront(ns3::Ptr<const ns3::Packet> packet, ns3::WifiMacHeader const & hdr) [member function]
-    cls.add_method('PushFront', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMacHeader const &', 'hdr')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetBlockAckThreshold(uint8_t threshold) [member function]
-    cls.add_method('SetBlockAckThreshold', 
-                   'void', 
-                   [param('uint8_t', 'threshold')])
-    ## qos-txop.h (module 'wifi'): uint8_t ns3::QosTxop::GetBlockAckThreshold() const [member function]
-    cls.add_method('GetBlockAckThreshold', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetBlockAckInactivityTimeout(uint16_t timeout) [member function]
-    cls.add_method('SetBlockAckInactivityTimeout', 
-                   'void', 
-                   [param('uint16_t', 'timeout')])
-    ## qos-txop.h (module 'wifi'): uint16_t ns3::QosTxop::GetBlockAckInactivityTimeout() const [member function]
-    cls.add_method('GetBlockAckInactivityTimeout', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::CompleteMpduTx(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('CompleteMpduTx', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetAddBaResponseTimeout(ns3::Time addBaResponseTimeout) [member function]
-    cls.add_method('SetAddBaResponseTimeout', 
-                   'void', 
-                   [param('ns3::Time', 'addBaResponseTimeout')])
-    ## qos-txop.h (module 'wifi'): ns3::Time ns3::QosTxop::GetAddBaResponseTimeout() const [member function]
-    cls.add_method('GetAddBaResponseTimeout', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetFailedAddBaTimeout(ns3::Time failedAddBaTimeout) [member function]
-    cls.add_method('SetFailedAddBaTimeout', 
-                   'void', 
-                   [param('ns3::Time', 'failedAddBaTimeout')])
-    ## qos-txop.h (module 'wifi'): ns3::Time ns3::QosTxop::GetFailedAddBaTimeout() const [member function]
-    cls.add_method('GetFailedAddBaTimeout', 
-                   'ns3::Time', 
+    ## random-variable-stream.h (module 'core'): ns3::ParetoRandomVariable::ParetoRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): double ns3::ParetoRandomVariable::GetScale() const [member function]
+    cls.add_method('GetScale', 
+                   'double', 
                    [], 
                    is_const=True)
-    ## qos-txop.h (module 'wifi'): uint16_t ns3::QosTxop::GetNextSequenceNumberFor(ns3::WifiMacHeader const * hdr) [member function]
-    cls.add_method('GetNextSequenceNumberFor', 
-                   'uint16_t', 
-                   [param('ns3::WifiMacHeader const *', 'hdr')])
-    ## qos-txop.h (module 'wifi'): uint16_t ns3::QosTxop::PeekNextSequenceNumberFor(ns3::WifiMacHeader const * hdr) [member function]
-    cls.add_method('PeekNextSequenceNumberFor', 
-                   'uint16_t', 
-                   [param('ns3::WifiMacHeader const *', 'hdr')])
-    ## qos-txop.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::QosTxop::PeekNextMpdu(uint8_t tid=8, ns3::Mac48Address recipient=ns3::Mac48Address::GetBroadcast()) [member function]
-    cls.add_method('PeekNextMpdu', 
-                   'ns3::Ptr< ns3::WifiMacQueueItem const >', 
-                   [param('uint8_t', 'tid', default_value='8'), param('ns3::Mac48Address', 'recipient', default_value='ns3::Mac48Address::GetBroadcast()')])
-    ## qos-txop.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::QosTxop::PeekNextMpdu(ns3::WifiMacQueueItem::ConstIterator queueIt, uint8_t tid=8, ns3::Mac48Address recipient=ns3::Mac48Address::GetBroadcast()) [member function]
-    cls.add_method('PeekNextMpdu', 
-                   'ns3::Ptr< ns3::WifiMacQueueItem const >', 
-                   [param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'queueIt'), param('uint8_t', 'tid', default_value='8'), param('ns3::Mac48Address', 'recipient', default_value='ns3::Mac48Address::GetBroadcast()')])
-    ## qos-txop.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::QosTxop::GetNextMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> peekedItem, ns3::WifiTxParameters & txParams, ns3::Time availableTime, bool initialFrame, ns3::WifiMacQueueItem::ConstIterator & queueIt) [member function]
-    cls.add_method('GetNextMpdu', 
-                   'ns3::Ptr< ns3::WifiMacQueueItem >', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'peekedItem'), param('ns3::WifiTxParameters &', 'txParams'), param('ns3::Time', 'availableTime'), param('bool', 'initialFrame'), param('ns3::WifiMacQueueItem::ConstIterator &', 'queueIt')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::AssignSequenceNumber(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) const [member function]
-    cls.add_method('AssignSequenceNumber', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
-                   is_const=True)
-    ## qos-txop.h (module 'wifi'): uint8_t ns3::QosTxop::GetQosQueueSize(uint8_t tid, ns3::Mac48Address receiver) const [member function]
-    cls.add_method('GetQosQueueSize', 
-                   'uint8_t', 
-                   [param('uint8_t', 'tid'), param('ns3::Mac48Address', 'receiver')], 
-                   is_const=True)
-    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::IsTxopStarted() const [member function]
-    cls.add_method('IsTxopStarted', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## qos-txop.h (module 'wifi'): ns3::Time ns3::QosTxop::GetRemainingTxop() const [member function]
-    cls.add_method('GetRemainingTxop', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetMuCwMin(uint16_t cwMin) [member function]
-    cls.add_method('SetMuCwMin', 
-                   'void', 
-                   [param('uint16_t', 'cwMin')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetMuCwMax(uint16_t cwMax) [member function]
-    cls.add_method('SetMuCwMax', 
-                   'void', 
-                   [param('uint16_t', 'cwMax')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetMuAifsn(uint8_t aifsn) [member function]
-    cls.add_method('SetMuAifsn', 
-                   'void', 
-                   [param('uint8_t', 'aifsn')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetMuEdcaTimer(ns3::Time timer) [member function]
-    cls.add_method('SetMuEdcaTimer', 
-                   'void', 
-                   [param('ns3::Time', 'timer')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::StartMuEdcaTimerNow() [member function]
-    cls.add_method('StartMuEdcaTimerNow', 
-                   'void', 
-                   [])
-    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::MuEdcaTimerRunning() const [member function]
-    cls.add_method('MuEdcaTimerRunning', 
-                   'bool', 
+    ## random-variable-stream.h (module 'core'): double ns3::ParetoRandomVariable::GetShape() const [member function]
+    cls.add_method('GetShape', 
+                   'double', 
                    [], 
                    is_const=True)
-    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::EdcaDisabled() const [member function]
-    cls.add_method('EdcaDisabled', 
-                   'bool', 
+    ## random-variable-stream.h (module 'core'): double ns3::ParetoRandomVariable::GetBound() const [member function]
+    cls.add_method('GetBound', 
+                   'double', 
                    [], 
                    is_const=True)
-    ## qos-txop.h (module 'wifi'): uint32_t ns3::QosTxop::GetMinCw() const [member function]
-    cls.add_method('GetMinCw', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## qos-txop.h (module 'wifi'): uint32_t ns3::QosTxop::GetMaxCw() const [member function]
-    cls.add_method('GetMaxCw', 
+    ## random-variable-stream.h (module 'core'): double ns3::ParetoRandomVariable::GetValue(double scale, double shape, double bound) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('double', 'scale'), param('double', 'shape'), param('double', 'bound')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ParetoRandomVariable::GetInteger(uint32_t scale, uint32_t shape, uint32_t bound) [member function]
+    cls.add_method('GetInteger', 
                    'uint32_t', 
+                   [param('uint32_t', 'scale'), param('uint32_t', 'shape'), param('uint32_t', 'bound')])
+    ## random-variable-stream.h (module 'core'): double ns3::ParetoRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## qos-txop.h (module 'wifi'): uint8_t ns3::QosTxop::GetAifsn() const [member function]
-    cls.add_method('GetAifsn', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## qos-txop.h (module 'wifi'): ns3::QosTxop::QosTxop(ns3::QosTxop const & arg0) [constructor]
-    cls.add_constructor([param('ns3::QosTxop const &', 'arg0')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::DoDispose() [member function]
-    cls.add_method('DoDispose', 
-                   'void', 
-                   [], 
-                   is_virtual=True, visibility='protected')
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::DoInitialize() [member function]
-    cls.add_method('DoInitialize', 
-                   'void', 
-                   [], 
-                   is_virtual=True, visibility='private')
-    return
-
-def register_Ns3RegularWifiMac_methods(root_module, cls):
-    ## regular-wifi-mac.h (module 'wifi'): static ns3::TypeId ns3::RegularWifiMac::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::RegularWifiMac::RegularWifiMac() [constructor]
-    cls.add_constructor([])
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetShortSlotTimeSupported(bool enable) [member function]
-    cls.add_method('SetShortSlotTimeSupported', 
-                   'void', 
-                   [param('bool', 'enable')], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetSsid(ns3::Ssid ssid) [member function]
-    cls.add_method('SetSsid', 
-                   'void', 
-                   [param('ns3::Ssid', 'ssid')], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetAddress(ns3::Mac48Address address) [member function]
-    cls.add_method('SetAddress', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetPromisc() [member function]
-    cls.add_method('SetPromisc', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetShortSlotTimeSupported() const [member function]
-    cls.add_method('GetShortSlotTimeSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ssid ns3::RegularWifiMac::GetSsid() const [member function]
-    cls.add_method('GetSsid', 
-                   'ns3::Ssid', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Mac48Address ns3::RegularWifiMac::GetAddress() const [member function]
-    cls.add_method('GetAddress', 
-                   'ns3::Mac48Address', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Mac48Address ns3::RegularWifiMac::GetBssid() const [member function]
-    cls.add_method('GetBssid', 
-                   'ns3::Mac48Address', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to, ns3::Mac48Address from) [member function]
-    cls.add_method('Enqueue', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to'), param('ns3::Mac48Address', 'from')], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::SupportsSendFrom() const [member function]
-    cls.add_method('SupportsSendFrom', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetWifiPhy(ns3::Ptr<ns3::WifiPhy> const phy) [member function]
-    cls.add_method('SetWifiPhy', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiPhy > const', 'phy')], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiPhy> ns3::RegularWifiMac::GetWifiPhy() const [member function]
-    cls.add_method('GetWifiPhy', 
-                   'ns3::Ptr< ns3::WifiPhy >', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::ResetWifiPhy() [member function]
-    cls.add_method('ResetWifiPhy', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetWifiRemoteStationManager(ns3::Ptr<ns3::WifiRemoteStationManager> const stationManager) [member function]
-    cls.add_method('SetWifiRemoteStationManager', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiRemoteStationManager > const', 'stationManager')], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::ConfigureStandard(ns3::WifiStandard standard) [member function]
-    cls.add_method('ConfigureStandard', 
-                   'void', 
-                   [param('ns3::WifiStandard', 'standard')], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::TypeOfStation ns3::RegularWifiMac::GetTypeOfStation() const [member function]
-    cls.add_method('GetTypeOfStation', 
-                   'ns3::TypeOfStation', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetForwardUpCallback(ns3::WifiMac::ForwardUpCallback upCallback) [member function]
-    cls.add_method('SetForwardUpCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'upCallback')], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetLinkUpCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkUp) [member function]
-    cls.add_method('SetLinkUpCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkUp')], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetLinkDownCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkDown) [member function]
-    cls.add_method('SetLinkDownCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkDown')], 
                    is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiRemoteStationManager> ns3::RegularWifiMac::GetWifiRemoteStationManager() const [member function]
-    cls.add_method('GetWifiRemoteStationManager', 
-                   'ns3::Ptr< ns3::WifiRemoteStationManager >', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to) [member function]
-    cls.add_method('Enqueue', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::FrameExchangeManager> ns3::RegularWifiMac::GetFrameExchangeManager() const [member function]
-    cls.add_method('GetFrameExchangeManager', 
-                   'ns3::Ptr< ns3::FrameExchangeManager >', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetCtsToSelfSupported(bool enable) [member function]
-    cls.add_method('SetCtsToSelfSupported', 
-                   'void', 
-                   [param('bool', 'enable')])
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetBssid(ns3::Mac48Address bssid) [member function]
-    cls.add_method('SetBssid', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'bssid')])
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::Txop> ns3::RegularWifiMac::GetTxop() const [member function]
-    cls.add_method('GetTxop', 
-                   'ns3::Ptr< ns3::Txop >', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::RegularWifiMac::GetQosTxop(ns3::AcIndex ac) const [member function]
-    cls.add_method('GetQosTxop', 
-                   'ns3::Ptr< ns3::QosTxop >', 
-                   [param('ns3::AcIndex', 'ac')], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::RegularWifiMac::GetQosTxop(uint8_t tid) const [member function]
-    cls.add_method('GetQosTxop', 
-                   'ns3::Ptr< ns3::QosTxop >', 
-                   [param('uint8_t', 'tid')], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueue> ns3::RegularWifiMac::GetTxopQueue(ns3::AcIndex ac) const [member function]
-    cls.add_method('GetTxopQueue', 
-                   'ns3::Ptr< ns3::WifiMacQueue >', 
-                   [param('ns3::AcIndex', 'ac')], 
-                   is_const=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetQosSupported() const [member function]
-    cls.add_method('GetQosSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetErpSupported() const [member function]
-    cls.add_method('GetErpSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetDsssSupported() const [member function]
-    cls.add_method('GetDsssSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetHtSupported() const [member function]
-    cls.add_method('GetHtSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetVhtSupported() const [member function]
-    cls.add_method('GetVhtSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetHeSupported() const [member function]
-    cls.add_method('GetHeSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::ExtendedCapabilities ns3::RegularWifiMac::GetExtendedCapabilities() const [member function]
-    cls.add_method('GetExtendedCapabilities', 
-                   'ns3::ExtendedCapabilities', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::HtCapabilities ns3::RegularWifiMac::GetHtCapabilities() const [member function]
-    cls.add_method('GetHtCapabilities', 
-                   'ns3::HtCapabilities', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::VhtCapabilities ns3::RegularWifiMac::GetVhtCapabilities() const [member function]
-    cls.add_method('GetVhtCapabilities', 
-                   'ns3::VhtCapabilities', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::HeCapabilities ns3::RegularWifiMac::GetHeCapabilities() const [member function]
-    cls.add_method('GetHeCapabilities', 
-                   'ns3::HeCapabilities', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): uint32_t ns3::RegularWifiMac::GetMaxAmpduSize(ns3::AcIndex ac) const [member function]
-    cls.add_method('GetMaxAmpduSize', 
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ParetoRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
                    'uint32_t', 
-                   [param('ns3::AcIndex', 'ac')], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): uint16_t ns3::RegularWifiMac::GetMaxAmsduSize(ns3::AcIndex ac) const [member function]
-    cls.add_method('GetMaxAmsduSize', 
-                   'uint16_t', 
-                   [param('ns3::AcIndex', 'ac')], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::DoInitialize() [member function]
-    cls.add_method('DoInitialize', 
-                   'void', 
-                   [], 
-                   is_virtual=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::DoDispose() [member function]
-    cls.add_method('DoDispose', 
-                   'void', 
                    [], 
-                   is_virtual=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetTypeOfStation(ns3::TypeOfStation type) [member function]
-    cls.add_method('SetTypeOfStation', 
-                   'void', 
-                   [param('ns3::TypeOfStation', 'type')], 
-                   is_virtual=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::RegularWifiMac::GetVOQueue() const [member function]
-    cls.add_method('GetVOQueue', 
-                   'ns3::Ptr< ns3::QosTxop >', 
-                   [], 
-                   is_const=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::RegularWifiMac::GetVIQueue() const [member function]
-    cls.add_method('GetVIQueue', 
-                   'ns3::Ptr< ns3::QosTxop >', 
-                   [], 
-                   is_const=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::RegularWifiMac::GetBEQueue() const [member function]
-    cls.add_method('GetBEQueue', 
-                   'ns3::Ptr< ns3::QosTxop >', 
-                   [], 
-                   is_const=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::RegularWifiMac::GetBKQueue() const [member function]
-    cls.add_method('GetBKQueue', 
-                   'ns3::Ptr< ns3::QosTxop >', 
-                   [], 
-                   is_const=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::ConfigureContentionWindow(uint32_t cwMin, uint32_t cwMax) [member function]
-    cls.add_method('ConfigureContentionWindow', 
-                   'void', 
-                   [param('uint32_t', 'cwMin'), param('uint32_t', 'cwMax')], 
-                   visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::Receive(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('Receive', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
-                   is_virtual=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::ForwardUp(ns3::Ptr<const ns3::Packet> packet, ns3::Mac48Address from, ns3::Mac48Address to) [member function]
-    cls.add_method('ForwardUp', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::Mac48Address', 'from'), param('ns3::Mac48Address', 'to')], 
-                   visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::DeaggregateAmsduAndForward(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('DeaggregateAmsduAndForward', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
-                   is_virtual=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetQosSupported(bool enable) [member function]
-    cls.add_method('SetQosSupported', 
-                   'void', 
-                   [param('bool', 'enable')], 
-                   is_virtual=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetupFrameExchangeManager() [member function]
-    cls.add_method('SetupFrameExchangeManager', 
-                   'void', 
-                   [], 
-                   visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetErpSupported(bool enable) [member function]
-    cls.add_method('SetErpSupported', 
-                   'void', 
-                   [param('bool', 'enable')], 
-                   visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetDsssSupported(bool enable) [member function]
-    cls.add_method('SetDsssSupported', 
-                   'void', 
-                   [param('bool', 'enable')], 
-                   visibility='protected')
+                   is_virtual=True)
     return
 
 def register_Ns3Ssid_methods(root_module, cls):
@@ -11580,6 +10344,28 @@
                    is_const=True, is_virtual=True)
     return
 
+def register_Ns3CallbackImpl__Bool_Const_ns3WifiTxVector___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< bool, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): bool ns3::CallbackImpl<bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::WifiTxVector const & arg0) [member operator]
+    cls.add_method('operator()', 
+                   'bool', 
+                   [param('ns3::WifiTxVector const &', 'arg0')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
 def register_Ns3CallbackImpl__Bool_Ns3Ptr__lt__ns3NetDevice__gt___Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_short_Const_ns3Address___amp___Const_ns3Address___amp___Ns3NetDevicePacketType_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
     ## callback.h (module 'core'): ns3::CallbackImpl<bool, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<const ns3::Packet>, unsigned short, const ns3::Address &, const ns3::Address &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
@@ -11624,28 +10410,6 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3CallbackImpl__Bool_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): bool ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(short unsigned int arg0, unsigned char arg1) [member operator]
-    cls.add_method('operator()', 
-                   'bool', 
-                   [param('short unsigned int', 'arg0'), param('unsigned char', 'arg1')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
 def register_Ns3CallbackImpl__Ns3ObjectBase___star___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
     ## callback.h (module 'core'): ns3::CallbackImpl<ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
@@ -11712,28 +10476,6 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3CallbackImpl__Unsigned_long_Unsigned_short_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): long unsigned int ns3::CallbackImpl<unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(short unsigned int arg0, short unsigned int arg1, unsigned char arg2) [member operator]
-    cls.add_method('operator()', 
-                   'long unsigned int', 
-                   [param('short unsigned int', 'arg0'), param('short unsigned int', 'arg1'), param('unsigned char', 'arg2')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
 def register_Ns3CallbackImpl__Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
     ## callback.h (module 'core'): ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
@@ -11932,50 +10674,6 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3CallbackImpl__Void_Ns3Time_Ns3Mac48Address_Unsigned_char_Ns3OriginatorBlockAckAgreementState_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::Mac48Address, unsigned char, ns3::OriginatorBlockAckAgreement::State, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::Mac48Address, unsigned char, ns3::OriginatorBlockAckAgreement::State, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Time, ns3::Mac48Address, unsigned char, ns3::OriginatorBlockAckAgreement::State, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Time, ns3::Mac48Address, unsigned char, ns3::OriginatorBlockAckAgreement::State, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Time, ns3::Mac48Address, unsigned char, ns3::OriginatorBlockAckAgreement::State, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Time, ns3::Mac48Address, unsigned char, ns3::OriginatorBlockAckAgreement::State, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Time, ns3::Mac48Address, unsigned char, ns3::OriginatorBlockAckAgreement::State, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Time arg0, ns3::Mac48Address arg1, unsigned char arg2, ns3::OriginatorBlockAckAgreement::State arg3) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('ns3::Time', 'arg0'), param('ns3::Mac48Address', 'arg1'), param('unsigned char', 'arg2'), param('ns3::OriginatorBlockAckAgreement::State', 'arg3')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3CallbackImpl__Void_Ns3Time_Ns3Time_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Time, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Time, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Time, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Time, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Time, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Time arg0, ns3::Time arg1) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('ns3::Time', 'arg0'), param('ns3::Time', 'arg1')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
 def register_Ns3CallbackImpl__Void_Ns3Time_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
@@ -12086,22 +10784,22 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3CallbackImpl__Void_Unsigned_char_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt_____gt_____gt_____gt_____star___Const_stdSet__lt__ns3Mac48Address__stdLess__lt__ns3Mac48Address__gt____stdAllocator__lt__ns3Mac48Address__gt_____gt_____star___Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+def register_Ns3CallbackImpl__Void_Unsigned_char_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt____gt____gt____gt_____star___Const_stdSet__lt__ns3Mac48Address__stdLess__lt__ns3Mac48Address__gt____stdAllocator__lt__ns3Mac48Address__gt____gt_____star___Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
     cls.add_constructor([param('ns3::CallbackImpl< void, unsigned char, std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu >, std::hash< unsigned short >, std::equal_to< unsigned short >, std::allocator< std::pair< unsigned short const, ns3::Ptr< ns3::WifiPsdu > > > > *, std::set< ns3::Mac48Address, std::less< ns3::Mac48Address >, std::allocator< ns3::Mac48Address > > const, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
     cls.add_method('DoGetTypeid', 
                    'std::string', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
     cls.add_method('GetTypeid', 
                    'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(unsigned char arg0, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > * arg1, std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > const * arg2, long unsigned int arg3) [member operator]
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(unsigned char arg0, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> * arg1, std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> const * arg2, long unsigned int arg3) [member operator]
     cls.add_method('operator()', 
                    'void', 
                    [param('unsigned char', 'arg0'), param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > > *', 'arg1'), param('std::set< ns3::Mac48Address > const *', 'arg2'), param('long unsigned int', 'arg3')], 
@@ -12109,50 +10807,6 @@
     cls.add_copy_constructor()
     return
 
-def register_Ns3CallbackImpl__Void_Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(unsigned int arg0) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('unsigned int', 'arg0')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3CallbackImpl__Void_Unsigned_int_Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(unsigned int arg0, unsigned int arg1) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('unsigned int', 'arg0'), param('unsigned int', 'arg1')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
 def register_Ns3Dot11sStack_methods(root_module, cls):
     ## dot11s-installer.h (module 'mesh'): ns3::Dot11sStack::Dot11sStack(ns3::Dot11sStack const & arg0) [constructor]
     cls.add_constructor([param('ns3::Dot11sStack const &', 'arg0')])
@@ -12231,6 +10885,10 @@
                    'void', 
                    [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
                    is_virtual=True)
+    ## mesh-point-device.h (module 'mesh'): int64_t ns3::MeshPointDevice::AssignStreams(int64_t stream) [member function]
+    cls.add_method('AssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')])
     ## mesh-point-device.h (module 'mesh'): void ns3::MeshPointDevice::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
@@ -12251,6 +10909,11 @@
                    'ns3::Ptr< ns3::Channel >', 
                    [], 
                    is_const=True, is_virtual=True)
+    ## mesh-point-device.h (module 'mesh'): ns3::Time ns3::MeshPointDevice::GetForwardingDelay() const [member function]
+    cls.add_method('GetForwardingDelay', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
     ## mesh-point-device.h (module 'mesh'): uint32_t ns3::MeshPointDevice::GetIfIndex() const [member function]
     cls.add_method('GetIfIndex', 
                    'uint32_t', 
@@ -12261,7 +10924,7 @@
                    'ns3::Ptr< ns3::NetDevice >', 
                    [param('uint32_t', 'id')], 
                    is_const=True)
-    ## mesh-point-device.h (module 'mesh'): std::vector<ns3::Ptr<ns3::NetDevice>, std::allocator<ns3::Ptr<ns3::NetDevice> > > ns3::MeshPointDevice::GetInterfaces() const [member function]
+    ## mesh-point-device.h (module 'mesh'): std::vector<ns3::Ptr<ns3::NetDevice>, std::allocator<ns3::Ptr<ns3::NetDevice>>> ns3::MeshPointDevice::GetInterfaces() const [member function]
     cls.add_method('GetInterfaces', 
                    'std::vector< ns3::Ptr< ns3::NetDevice > >', 
                    [], 
@@ -12391,139 +11054,6 @@
                    is_const=True, is_virtual=True)
     return
 
-def register_Ns3MeshWifiInterfaceMac_methods(root_module, cls):
-    ## mesh-wifi-interface-mac.h (module 'mesh'): ns3::MeshWifiInterfaceMac::MeshWifiInterfaceMac() [constructor]
-    cls.add_constructor([])
-    ## mesh-wifi-interface-mac.h (module 'mesh'): int64_t ns3::MeshWifiInterfaceMac::AssignStreams(int64_t stream) [member function]
-    cls.add_method('AssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'stream')])
-    ## mesh-wifi-interface-mac.h (module 'mesh'): bool ns3::MeshWifiInterfaceMac::CheckSupportedRates(ns3::SupportedRates rates) const [member function]
-    cls.add_method('CheckSupportedRates', 
-                   'bool', 
-                   [param('ns3::SupportedRates', 'rates')], 
-                   is_const=True)
-    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::ConfigureStandard(ns3::WifiStandard standard) [member function]
-    cls.add_method('ConfigureStandard', 
-                   'void', 
-                   [param('ns3::WifiStandard', 'standard')], 
-                   is_virtual=True)
-    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to, ns3::Mac48Address from) [member function]
-    cls.add_method('Enqueue', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to'), param('ns3::Mac48Address', 'from')], 
-                   is_virtual=True)
-    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to) [member function]
-    cls.add_method('Enqueue', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to')], 
-                   is_virtual=True)
-    ## mesh-wifi-interface-mac.h (module 'mesh'): ns3::Time ns3::MeshWifiInterfaceMac::GetBeaconInterval() const [member function]
-    cls.add_method('GetBeaconInterval', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True)
-    ## mesh-wifi-interface-mac.h (module 'mesh'): uint16_t ns3::MeshWifiInterfaceMac::GetFrequencyChannel() const [member function]
-    cls.add_method('GetFrequencyChannel', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## mesh-wifi-interface-mac.h (module 'mesh'): uint32_t ns3::MeshWifiInterfaceMac::GetLinkMetric(ns3::Mac48Address peerAddress) [member function]
-    cls.add_method('GetLinkMetric', 
-                   'uint32_t', 
-                   [param('ns3::Mac48Address', 'peerAddress')])
-    ## mesh-wifi-interface-mac.h (module 'mesh'): ns3::Mac48Address ns3::MeshWifiInterfaceMac::GetMeshPointAddress() const [member function]
-    cls.add_method('GetMeshPointAddress', 
-                   'ns3::Mac48Address', 
-                   [], 
-                   is_const=True)
-    ## mesh-wifi-interface-mac.h (module 'mesh'): ns3::SupportedRates ns3::MeshWifiInterfaceMac::GetSupportedRates() const [member function]
-    cls.add_method('GetSupportedRates', 
-                   'ns3::SupportedRates', 
-                   [], 
-                   is_const=True)
-    ## mesh-wifi-interface-mac.h (module 'mesh'): ns3::Time ns3::MeshWifiInterfaceMac::GetTbtt() const [member function]
-    cls.add_method('GetTbtt', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True)
-    ## mesh-wifi-interface-mac.h (module 'mesh'): static ns3::TypeId ns3::MeshWifiInterfaceMac::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::InstallPlugin(ns3::Ptr<ns3::MeshWifiInterfaceMacPlugin> plugin) [member function]
-    cls.add_method('InstallPlugin', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::MeshWifiInterfaceMacPlugin >', 'plugin')])
-    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::Report(std::ostream & os) const [member function]
-    cls.add_method('Report', 
-                   'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_const=True)
-    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::ResetStats() [member function]
-    cls.add_method('ResetStats', 
-                   'void', 
-                   [])
-    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::SendManagementFrame(ns3::Ptr<ns3::Packet> frame, ns3::WifiMacHeader const & hdr) [member function]
-    cls.add_method('SendManagementFrame', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'frame'), param('ns3::WifiMacHeader const &', 'hdr')])
-    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::SetBeaconGeneration(bool enable) [member function]
-    cls.add_method('SetBeaconGeneration', 
-                   'void', 
-                   [param('bool', 'enable')])
-    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::SetBeaconInterval(ns3::Time interval) [member function]
-    cls.add_method('SetBeaconInterval', 
-                   'void', 
-                   [param('ns3::Time', 'interval')])
-    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::SetLinkMetricCallback(ns3::Callback<unsigned int, ns3::Mac48Address, ns3::Ptr<ns3::MeshWifiInterfaceMac>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> cb) [member function]
-    cls.add_method('SetLinkMetricCallback', 
-                   'void', 
-                   [param('ns3::Callback< unsigned int, ns3::Mac48Address, ns3::Ptr< ns3::MeshWifiInterfaceMac >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'cb')])
-    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::SetLinkUpCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkUp) [member function]
-    cls.add_method('SetLinkUpCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkUp')], 
-                   is_virtual=True)
-    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::SetMeshPointAddress(ns3::Mac48Address addr) [member function]
-    cls.add_method('SetMeshPointAddress', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'addr')])
-    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::SetRandomStartDelay(ns3::Time interval) [member function]
-    cls.add_method('SetRandomStartDelay', 
-                   'void', 
-                   [param('ns3::Time', 'interval')])
-    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::ShiftTbtt(ns3::Time shift) [member function]
-    cls.add_method('ShiftTbtt', 
-                   'void', 
-                   [param('ns3::Time', 'shift')])
-    ## mesh-wifi-interface-mac.h (module 'mesh'): bool ns3::MeshWifiInterfaceMac::SupportsSendFrom() const [member function]
-    cls.add_method('SupportsSendFrom', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::SwitchFrequencyChannel(uint16_t new_id) [member function]
-    cls.add_method('SwitchFrequencyChannel', 
-                   'void', 
-                   [param('uint16_t', 'new_id')])
-    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::DoDispose() [member function]
-    cls.add_method('DoDispose', 
-                   'void', 
-                   [], 
-                   is_virtual=True, visibility='private')
-    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::DoInitialize() [member function]
-    cls.add_method('DoInitialize', 
-                   'void', 
-                   [], 
-                   is_virtual=True, visibility='private')
-    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::Receive(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('Receive', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
-                   is_virtual=True, visibility='private')
-    return
-
 def register_Ns3HashImplementation_methods(root_module, cls):
     ## hash-function.h (module 'core'): ns3::Hash::Implementation::Implementation(ns3::Hash::Implementation const & arg0) [constructor]
     cls.add_constructor([param('ns3::Hash::Implementation const &', 'arg0')])
@@ -12766,7 +11296,7 @@
     cls.add_method('ResetStats', 
                    'void', 
                    [])
-    ## hwmp-protocol.h (module 'mesh'): void ns3::dot11s::HwmpProtocol::SetNeighboursCallback(ns3::Callback<std::vector<ns3::Mac48Address, std::allocator<ns3::Mac48Address> >, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> cb) [member function]
+    ## hwmp-protocol.h (module 'mesh'): void ns3::dot11s::HwmpProtocol::SetNeighboursCallback(ns3::Callback<std::vector<ns3::Mac48Address, std::allocator<ns3::Mac48Address>>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> cb) [member function]
     cls.add_method('SetNeighboursCallback', 
                    'void', 
                    [param('ns3::Callback< std::vector< ns3::Mac48Address >, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'cb')])
@@ -12839,7 +11369,7 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## hwmp-rtable.h (module 'mesh'): std::vector<ns3::dot11s::HwmpProtocol::FailedDestination, std::allocator<ns3::dot11s::HwmpProtocol::FailedDestination> > ns3::dot11s::HwmpRtable::GetUnreachableDestinations(ns3::Mac48Address peerAddress) [member function]
+    ## hwmp-rtable.h (module 'mesh'): std::vector<ns3::dot11s::HwmpProtocol::FailedDestination, std::allocator<ns3::dot11s::HwmpProtocol::FailedDestination>> ns3::dot11s::HwmpRtable::GetUnreachableDestinations(ns3::Mac48Address peerAddress) [member function]
     cls.add_method('GetUnreachableDestinations', 
                    'std::vector< ns3::dot11s::HwmpProtocol::FailedDestination >', 
                    [param('ns3::Mac48Address', 'peerAddress')])
@@ -13269,7 +11799,7 @@
                    'ns3::WifiInformationElementId', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## ie-dot11s-perr.h (module 'mesh'): std::vector<ns3::dot11s::HwmpProtocol::FailedDestination, std::allocator<ns3::dot11s::HwmpProtocol::FailedDestination> > ns3::dot11s::IePerr::GetAddressUnitVector() const [member function]
+    ## ie-dot11s-perr.h (module 'mesh'): std::vector<ns3::dot11s::HwmpProtocol::FailedDestination, std::allocator<ns3::dot11s::HwmpProtocol::FailedDestination>> ns3::dot11s::IePerr::GetAddressUnitVector() const [member function]
     cls.add_method('GetAddressUnitVector', 
                    'std::vector< ns3::dot11s::HwmpProtocol::FailedDestination >', 
                    [], 
@@ -13466,7 +11996,7 @@
                    'uint8_t', 
                    [], 
                    is_const=True)
-    ## ie-dot11s-preq.h (module 'mesh'): std::vector<ns3::Ptr<ns3::dot11s::DestinationAddressUnit>, std::allocator<ns3::Ptr<ns3::dot11s::DestinationAddressUnit> > > ns3::dot11s::IePreq::GetDestinationList() [member function]
+    ## ie-dot11s-preq.h (module 'mesh'): std::vector<ns3::Ptr<ns3::dot11s::DestinationAddressUnit>, std::allocator<ns3::Ptr<ns3::dot11s::DestinationAddressUnit>>> ns3::dot11s::IePreq::GetDestinationList() [member function]
     cls.add_method('GetDestinationList', 
                    'std::vector< ns3::Ptr< ns3::dot11s::DestinationAddressUnit > >', 
                    [])
@@ -14097,12 +12627,12 @@
     cls.add_method('GetNumberOfLinks', 
                    'uint8_t', 
                    [])
-    ## peer-management-protocol.h (module 'mesh'): std::vector<ns3::Ptr<ns3::dot11s::PeerLink>, std::allocator<ns3::Ptr<ns3::dot11s::PeerLink> > > ns3::dot11s::PeerManagementProtocol::GetPeerLinks() const [member function]
+    ## peer-management-protocol.h (module 'mesh'): std::vector<ns3::Ptr<ns3::dot11s::PeerLink>, std::allocator<ns3::Ptr<ns3::dot11s::PeerLink>>> ns3::dot11s::PeerManagementProtocol::GetPeerLinks() const [member function]
     cls.add_method('GetPeerLinks', 
                    'std::vector< ns3::Ptr< ns3::dot11s::PeerLink > >', 
                    [], 
                    is_const=True)
-    ## peer-management-protocol.h (module 'mesh'): std::vector<ns3::Mac48Address, std::allocator<ns3::Mac48Address> > ns3::dot11s::PeerManagementProtocol::GetPeers(uint32_t interface) const [member function]
+    ## peer-management-protocol.h (module 'mesh'): std::vector<ns3::Mac48Address, std::allocator<ns3::Mac48Address>> ns3::dot11s::PeerManagementProtocol::GetPeers(uint32_t interface) const [member function]
     cls.add_method('GetPeers', 
                    'std::vector< ns3::Mac48Address >', 
                    [param('uint32_t', 'interface')], 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/mesh/CMakeLists.txt ns-3.36/src/mesh/CMakeLists.txt
--- ns-3.35/src/mesh/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/mesh/CMakeLists.txt	2022-04-30 18:23:58.062734600 -0700
@@ -0,0 +1,84 @@
+build_lib(
+  LIBNAME mesh
+  SOURCE_FILES
+    helper/dot11s/dot11s-installer.cc
+    helper/flame/flame-installer.cc
+    helper/mesh-helper.cc
+    helper/mesh-stack-installer.cc
+    model/dot11s/airtime-metric.cc
+    model/dot11s/dot11s-mac-header.cc
+    model/dot11s/hwmp-protocol-mac.cc
+    model/dot11s/hwmp-protocol.cc
+    model/dot11s/hwmp-rtable.cc
+    model/dot11s/hwmp-tag.cc
+    model/dot11s/ie-dot11s-beacon-timing.cc
+    model/dot11s/ie-dot11s-configuration.cc
+    model/dot11s/ie-dot11s-id.cc
+    model/dot11s/ie-dot11s-metric-report.cc
+    model/dot11s/ie-dot11s-peer-management.cc
+    model/dot11s/ie-dot11s-peering-protocol.cc
+    model/dot11s/ie-dot11s-perr.cc
+    model/dot11s/ie-dot11s-prep.cc
+    model/dot11s/ie-dot11s-preq.cc
+    model/dot11s/ie-dot11s-rann.cc
+    model/dot11s/peer-link-frame.cc
+    model/dot11s/peer-link.cc
+    model/dot11s/peer-management-protocol-mac.cc
+    model/dot11s/peer-management-protocol.cc
+    model/flame/flame-header.cc
+    model/flame/flame-protocol-mac.cc
+    model/flame/flame-protocol.cc
+    model/flame/flame-rtable.cc
+    model/mesh-information-element-vector.cc
+    model/mesh-l2-routing-protocol.cc
+    model/mesh-point-device.cc
+    model/mesh-wifi-beacon.cc
+    model/mesh-wifi-interface-mac.cc
+  HEADER_FILES
+    helper/dot11s/dot11s-installer.h
+    helper/flame/flame-installer.h
+    helper/mesh-helper.h
+    helper/mesh-stack-installer.h
+    model/dot11s/dot11s-mac-header.h
+    model/dot11s/hwmp-protocol.h
+    model/dot11s/hwmp-rtable.h
+    model/dot11s/ie-dot11s-beacon-timing.h
+    model/dot11s/ie-dot11s-configuration.h
+    model/dot11s/ie-dot11s-id.h
+    model/dot11s/ie-dot11s-metric-report.h
+    model/dot11s/ie-dot11s-peer-management.h
+    model/dot11s/ie-dot11s-peering-protocol.h
+    model/dot11s/ie-dot11s-perr.h
+    model/dot11s/ie-dot11s-prep.h
+    model/dot11s/ie-dot11s-preq.h
+    model/dot11s/ie-dot11s-rann.h
+    model/dot11s/peer-link-frame.h
+    model/dot11s/peer-link.h
+    model/dot11s/peer-management-protocol.h
+    model/flame/flame-header.h
+    model/flame/flame-protocol-mac.h
+    model/flame/flame-protocol.h
+    model/flame/flame-rtable.h
+    model/mesh-information-element-vector.h
+    model/mesh-l2-routing-protocol.h
+    model/mesh-point-device.h
+    model/mesh-wifi-beacon.h
+    model/mesh-wifi-interface-mac-plugin.h
+    model/mesh-wifi-interface-mac.h
+  LIBRARIES_TO_LINK
+    ${libinternet}
+    ${libwifi}
+    ${libapplications}
+  TEST_SOURCES
+    test/dot11s/dot11s-test-suite.cc
+    test/dot11s/hwmp-proactive-regression.cc
+    test/dot11s/hwmp-reactive-regression.cc
+    test/dot11s/hwmp-simplest-regression.cc
+    test/dot11s/hwmp-target-flags-regression.cc
+    test/dot11s/pmp-regression.cc
+    test/dot11s/regression.cc
+    test/flame/flame-regression.cc
+    test/flame/flame-test-suite.cc
+    test/flame/regression.cc
+    test/mesh-information-element-vector-test-suite.cc
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/mesh/doc/source/conf.py ns-3.36/src/mesh/doc/source/conf.py
--- ns-3.35/src/mesh/doc/source/conf.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/mesh/doc/source/conf.py	2022-04-30 18:23:58.066734600 -0700
@@ -25,7 +25,7 @@
 
 # Add any Sphinx extension module names here, as strings. They can be extensions
 # coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
-extensions = ['sphinx.ext.pngmath']
+extensions = ['sphinx.ext.imgmath']
 
 # Add any paths that contain templates here, relative to this directory.
 templates_path = ['_templates']
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/mesh/doc/source/mesh-design.rst ns-3.36/src/mesh/doc/source/mesh-design.rst
--- ns-3.35/src/mesh/doc/source/mesh-design.rst	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/mesh/doc/source/mesh-design.rst	2022-04-30 18:23:58.066734600 -0700
@@ -104,6 +104,45 @@
 
 HWMP is implemented in both modes, reactive and proactive, although path maintenance is not implemented (so active routes may time out and need to be rebuilt, causing packet loss). Also the model implements an ability to transmit broadcast data and management frames as unicasts (see appropriate attributes). This feature is disabled at a station when the number of neighbors of the station is more than a threshold value.
 
+Forwarding delay
+~~~~~~~~~~~~~~~~
+
+Previous versions of this model have had issues with collisions due to
+the lack of a model for forwarding delay, and lack of clarity about whether
+backoff should be invoked when forwarding a broadcast frame.  These issues
+become problematic for mesh, because in a topology in which multiple nodes
+within radio range of the next hop node decide to forward a received
+frame at the same time, they will repeatedly collide (if no backoff is
+triggered).  Past contributors have argued for the triggering of backoff
+when forwarding a frame (e.g., [Hep16]_), but current wifi module maintainers
+concluded that the standard does not call for backoff in this case.  
+This was also privately confirmed with a Wi-Fi vendor.
+`Issue 478 <https://gitlab.com/nsnam/ns-3-dev/-/issues/478>`_ in the GitLab.com
+tracker has more discussion on this point.
+
+In practice, it is assumed that collisions can be avoided due to the fact
+that each mesh node will take slightly different times to process and
+forward the frame, and one will go first and trigger a channel busy detection
+on the other nodes.  To accomplish this in ns-3, we
+must include a model for forwarding delay that includes some randomness.
+
+The class :cpp:class:`ns3::MeshPointDevice` is responsible for forwarding
+unicast frames, and the class :cpp:class:`ns3::dot11s::HwmpProtocol` is
+responsible for forwarding management frames when HWMP is used.
+:cpp:class:`ns3::MeshPointDevice` has an attribute
+called `ForwardingDelay` that configures a random variable (units of
+microseconds) from which a forwarding delay value is drawn for each frame
+forwarding event.  The default configuration of this attribute
+is a uniform random variable between 300 and 400 microseconds.  The mean
+value was chosen based on the measurement results reported in [Hep16]_ which
+measured and derived an average 350 microsecond delay in forwarding frames
+on real mesh devices.  The range of this variable is somewhat arbitrary and
+determined by some simulation testing to provide a generally low
+probability of collision; the 100 microsecond range is roughly 11 slot times.
+The HWMP protocol can also access this random variable to create forwarding
+delay for the forwarding of management frames.
+Users may substitute other random variable configurations as desired.
+
 Scope and Limitations
 =====================
 
@@ -139,16 +178,28 @@
 Open issues
 ###########
 
-A bug exists in the Wi-Fi module that manifests itself as performance
+Users should be aware that the mesh module has not been actively maintained
+for several years and that there may be some performance and
+standards-alignment issues with the current code.  Below is a listing of
+possible (confirmed and unconfirmed) issues.
+
+A bug was previously reported in the Wi-Fi module that manifests itself as performance
 degradation in large mesh networks, due to incorrect duplicate frame
-detection for QoS data frames (bug 2326).
+detection for QoS data frames (https://www.nsnam.org/bugzilla/show_bug.cgi?id=2326).
+
+Mesh does not work for 802.11n/ac/ax stations (https://gitlab.com/nsnam/ns-3-dev/-/issues/176).
 
-Mesh does not work for 802.11n/ac stations (bug 2276).
+Mesh PCAP is not decoded properly by Wireshark (https://www.nsnam.org/bugzilla/show_bug.cgi?id=2880).
 
-Energy module can not be used on mesh devices (bug 2265).
+Energy module can not be used on mesh devices (https://www.nsnam.org/bugzilla/show_bug.cgi?id=2265).
 
 IE11S_MESH_PEERING_PROTOCOL_VERSION should be removed as per standard. 
-Protocol ID should actually be part of the Mesh Peering Management IE (bug 2600).
+Protocol ID should actually be part of the Mesh Peering Management IE (https://www.nsnam.org/bugzilla/show_bug.cgi?id=2600).
+
+MeshInformationElementVector printing error (https://www.nsnam.org/bugzilla/show_bug.cgi?id=2728).
+
+Mesh is not compatible with IPv6 (https://www.nsnam.org/bugzilla/show_bug.cgi?id=2881).
+
+Mesh is forwarding multicast frames as unicast rather than as group-addressed frames (https://gitlab.com/nsnam/ns-3-dev/-/issues/485).
 
-Node packet processing times are not modeled; some evaluation of the impact
-of packet processing delays is discussed in [Hep16]_.
+Mesh group addresses are not being set correctly for multicast frames (https://gitlab.com/nsnam/ns-3-dev/-/issues/476).
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/mesh/examples/CMakeLists.txt ns-3.36/src/mesh/examples/CMakeLists.txt
--- ns-3.35/src/mesh/examples/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/mesh/examples/CMakeLists.txt	2022-04-30 18:23:58.066734600 -0700
@@ -0,0 +1,10 @@
+build_lib_example(
+  NAME mesh
+  SOURCE_FILES mesh.cc
+  LIBRARIES_TO_LINK
+    ${libinternet}
+    ${libmobility}
+    ${libwifi}
+    ${libmesh}
+    ${libapplications}
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/mesh/examples/mesh.cc ns-3.36/src/mesh/examples/mesh.cc
--- ns-3.35/src/mesh/examples/mesh.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/mesh/examples/mesh.cc	2022-04-30 18:23:58.066734600 -0700
@@ -39,6 +39,33 @@
  *  * --- * --- *                _
  *  ^ Ping source
  *
+ * By varying m_xSize and m_ySize, one can configure the route that is used.
+ * When the inter-nodal distance is small, the source can reach the sink
+ * directly.  When the inter-nodal distance is intermediate, the route
+ * selected is diagonal (two hop).  When the inter-nodal distance is a bit
+ * larger, the diagonals cannot be used and a four-hop route is selected.
+ * When the distance is a bit larger, the packets will fail to reach even the
+ * adjacent nodes.
+ *
+ * As of ns-3.36 release, with default configuration (mesh uses Wi-Fi 802.11a
+ * standard and the ArfWifiManager rate control by default), the maximum
+ * range is roughly 50m.  The default step size in this program is set to 50m,
+ * so any mesh packets in the above diagram depiction will not be received
+ * successfully on the diagonal hops between two nodes but only on the
+ * horizontal and vertical hops.  If the step size is reduced to 35m, then
+ * the shortest path will be on the diagonal hops.  If the step size is reduced
+ * to 17m or less, then the source will be able to reach the sink directly
+ * without any mesh hops (for the default 3x3 mesh depicted above). 
+ *
+ * The position allocator will lay out the nodes in the following order
+ * (corresponding to Node ID and to the diagram above):
+ *
+ * 6 - 7 - 8
+ * |   |   | 
+ * 3 - 4 - 5
+ * |   |   | 
+ * 0 - 1 - 2
+ *
  *  See also MeshTest::Configure to read more about configurable
  *  parameters.
  */
@@ -57,7 +84,26 @@
 
 using namespace ns3;
 
-NS_LOG_COMPONENT_DEFINE ("TestMeshScript");
+NS_LOG_COMPONENT_DEFINE ("MeshExample");
+
+// Declaring these variables outside of main() for use in trace sinks
+uint32_t g_udpTxCount = 0;
+uint32_t g_udpRxCount = 0;
+
+void
+TxTrace (Ptr<const Packet> p)
+{
+  NS_LOG_DEBUG ("Sent " << p->GetSize () << " bytes");  
+  g_udpTxCount++;
+}
+
+void
+RxTrace (Ptr<const Packet> p)
+{
+  NS_LOG_DEBUG ("Received " << p->GetSize () << " bytes");  
+  g_udpRxCount++;
+}
+
 
 /**
  * \ingroup mesh
@@ -115,10 +161,10 @@
 MeshTest::MeshTest () :
   m_xSize (3),
   m_ySize (3),
-  m_step (100.0),
+  m_step (50.0),
   m_randomStart (0.1),
   m_totalTime (100.0),
-  m_packetInterval (0.1),
+  m_packetInterval (1),
   m_packetSize (1024),
   m_nIfaces (1),
   m_chan (true),
@@ -195,6 +241,8 @@
   mesh.SetNumberOfInterfaces (m_nIfaces);
   // Install protocols and return container if MeshPointDevices
   meshDevices = mesh.Install (wifiPhy, nodes);
+  // AssignStreams can optionally be used to control random variable streams
+  mesh.AssignStreams (meshDevices, 0);
   // Setup mobility - static grid topology
   MobilityHelper mobility;
   mobility.SetPositionAllocator ("ns3::GridPositionAllocator",
@@ -207,7 +255,7 @@
   mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
   mobility.Install (nodes);
   if (m_pcap)
-    wifiPhy.EnablePcapAll (std::string ("mp-"));
+    wifiPhy.EnablePcapAll (std::string ("mp"));
   if (m_ascii)
     {
       AsciiTraceHelper ascii;
@@ -226,17 +274,22 @@
 void
 MeshTest::InstallApplication ()
 {
-  UdpEchoServerHelper echoServer (9);
-  ApplicationContainer serverApps = echoServer.Install (nodes.Get (0));
-  serverApps.Start (Seconds (0.0));
-  serverApps.Stop (Seconds (m_totalTime));
-  UdpEchoClientHelper echoClient (interfaces.GetAddress (0), 9);
+  uint16_t portNumber = 9;
+  UdpEchoServerHelper echoServer (portNumber);
+  uint16_t sinkNodeId = m_xSize * m_ySize - 1;
+  ApplicationContainer serverApps = echoServer.Install (nodes.Get (sinkNodeId));
+  serverApps.Start (Seconds (1.0));
+  serverApps.Stop (Seconds (m_totalTime + 1));
+  UdpEchoClientHelper echoClient (interfaces.GetAddress (sinkNodeId), portNumber);
   echoClient.SetAttribute ("MaxPackets", UintegerValue ((uint32_t)(m_totalTime*(1/m_packetInterval))));
   echoClient.SetAttribute ("Interval", TimeValue (Seconds (m_packetInterval)));
   echoClient.SetAttribute ("PacketSize", UintegerValue (m_packetSize));
-  ApplicationContainer clientApps = echoClient.Install (nodes.Get (m_xSize*m_ySize-1));
-  clientApps.Start (Seconds (0.0));
-  clientApps.Stop (Seconds (m_totalTime));
+  ApplicationContainer clientApps = echoClient.Install (nodes.Get (0));
+  Ptr<UdpEchoClient> app = clientApps.Get (0)->GetObject<UdpEchoClient> ();
+  app->TraceConnectWithoutContext ("Tx", MakeCallback (&TxTrace));
+  app->TraceConnectWithoutContext ("Rx", MakeCallback (&RxTrace));
+  clientApps.Start (Seconds (1.0));
+  clientApps.Stop (Seconds (m_totalTime + 1.5));
 }
 int
 MeshTest::Run ()
@@ -245,9 +298,10 @@
   InstallInternetStack ();
   InstallApplication ();
   Simulator::Schedule (Seconds (m_totalTime), &MeshTest::Report, this);
-  Simulator::Stop (Seconds (m_totalTime));
+  Simulator::Stop (Seconds (m_totalTime + 2));
   Simulator::Run ();
   Simulator::Destroy ();
+  std::cout << "UDP echo packets sent: " << g_udpTxCount << " received: " << g_udpRxCount << std::endl;
   return 0;
 }
 void
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/mesh/examples/wscript ns-3.36/src/mesh/examples/wscript
--- ns-3.35/src/mesh/examples/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/mesh/examples/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,5 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    obj = bld.create_ns3_program('mesh', ['internet', 'mobility', 'wifi', 'mesh', 'applications'])
-    obj.source = 'mesh.cc'
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/mesh/helper/mesh-helper.cc ns-3.36/src/mesh/helper/mesh-helper.cc
--- ns-3.35/src/mesh/helper/mesh-helper.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/mesh/helper/mesh-helper.cc	2022-04-30 18:23:58.070734500 -0700
@@ -179,14 +179,10 @@
 {
   Ptr<WifiNetDevice> device = CreateObject<WifiNetDevice> ();
 
-  auto it = wifiStandards.find (m_standard);
-  if (it == wifiStandards.end ())
-    {
-      NS_FATAL_ERROR ("Selected standard is not defined!");
-      return device;
-    }
-
-  Ptr<MeshWifiInterfaceMac> mac = m_mac.Create<MeshWifiInterfaceMac> ();
+  // this is a const method, but we need to force the correct QoS setting
+  ObjectFactory macObjectFactory = m_mac;
+  macObjectFactory.Set ("QosSupported", BooleanValue (true));  // a mesh station is a QoS station
+  Ptr<MeshWifiInterfaceMac> mac = macObjectFactory.Create<MeshWifiInterfaceMac> ();
   NS_ASSERT (mac != 0);
   mac->SetSsid (Ssid ());
   mac->SetDevice (device);
@@ -195,19 +191,18 @@
   Ptr<WifiPhy> phy = phyHelper.Create (node, device);
   mac->SetAddress (Mac48Address::Allocate ());
   mac->ConfigureStandard (m_standard);
-  Ptr<RegularWifiMac> wifiMac = DynamicCast<RegularWifiMac> (mac);
-  Ptr<FrameExchangeManager> fem;
-  if (wifiMac != 0 && (fem = wifiMac->GetFrameExchangeManager ()) != 0)
+  Ptr<FrameExchangeManager> fem = mac->GetFrameExchangeManager ();
+  if (fem != nullptr)
     {
       Ptr<WifiProtectionManager> protectionManager = CreateObject<WifiDefaultProtectionManager> ();
-      protectionManager->SetWifiMac (wifiMac);
+      protectionManager->SetWifiMac (mac);
       fem->SetProtectionManager (protectionManager);
 
       Ptr<WifiAckManager> ackManager = CreateObject<WifiDefaultAckManager> ();
-      ackManager->SetWifiMac (wifiMac);
+      ackManager->SetWifiMac (mac);
       fem->SetAckManager (ackManager);
     }
-  phy->ConfigureStandardAndBand (it->second.phyStandard, it->second.phyBand);
+  phy->ConfigureStandard (m_standard);
   device->SetMac (mac);
   device->SetPhy (phy);
   device->SetRemoteStationManager (manager);
@@ -249,6 +244,7 @@
       Ptr<MeshWifiInterfaceMac> mac;
       if (mpd)
         {
+          currentStream += mpd->AssignStreams (currentStream);
           // To access, we need the underlying WifiNetDevices
           std::vector<Ptr<NetDevice> > ifaces = mpd->GetInterfaces ();
           for (std::vector<Ptr<NetDevice> >::iterator i = ifaces.begin (); i != ifaces.end (); i++)
@@ -267,39 +263,54 @@
                 }
               // Handle any random numbers in the mesh mac and plugins
               mac = DynamicCast<MeshWifiInterfaceMac> (wifi->GetMac ());
-              if (mac)
-                {
-                  currentStream += mac->AssignStreams (currentStream);
-                }
-              Ptr<RegularWifiMac> rmac = DynamicCast<RegularWifiMac> (mac);
-              if (rmac)
-                {
-                  PointerValue ptr;
-                  rmac->GetAttribute ("Txop", ptr);
-                  Ptr<Txop> txop = ptr.Get<Txop> ();
-                  currentStream += txop->AssignStreams (currentStream);
-
-                  rmac->GetAttribute ("VO_Txop", ptr);
-                  Ptr<QosTxop> vo_txop = ptr.Get<QosTxop> ();
-                  currentStream += vo_txop->AssignStreams (currentStream);
-
-                  rmac->GetAttribute ("VI_Txop", ptr);
-                  Ptr<QosTxop> vi_txop = ptr.Get<QosTxop> ();
-                  currentStream += vi_txop->AssignStreams (currentStream);
-
-                  rmac->GetAttribute ("BE_Txop", ptr);
-                  Ptr<QosTxop> be_txop = ptr.Get<QosTxop> ();
-                  currentStream += be_txop->AssignStreams (currentStream);
-
-                  rmac->GetAttribute ("BK_Txop", ptr);
-                  Ptr<QosTxop> bk_txop = ptr.Get<QosTxop> ();
-                  currentStream += bk_txop->AssignStreams (currentStream);
-               }
+              currentStream += mac->AssignStreams (currentStream);
+
+              PointerValue ptr;
+              mac->GetAttribute ("Txop", ptr);
+              Ptr<Txop> txop = ptr.Get<Txop> ();
+              currentStream += txop->AssignStreams (currentStream);
+
+              mac->GetAttribute ("VO_Txop", ptr);
+              Ptr<QosTxop> vo_txop = ptr.Get<QosTxop> ();
+              currentStream += vo_txop->AssignStreams (currentStream);
+
+              mac->GetAttribute ("VI_Txop", ptr);
+              Ptr<QosTxop> vi_txop = ptr.Get<QosTxop> ();
+              currentStream += vi_txop->AssignStreams (currentStream);
+
+              mac->GetAttribute ("BE_Txop", ptr);
+              Ptr<QosTxop> be_txop = ptr.Get<QosTxop> ();
+              currentStream += be_txop->AssignStreams (currentStream);
+
+              mac->GetAttribute ("BK_Txop", ptr);
+              Ptr<QosTxop> bk_txop = ptr.Get<QosTxop> ();
+              currentStream += bk_txop->AssignStreams (currentStream);
             }
         }
     }
   return (currentStream - stream);
 }
 
+void
+MeshHelper::EnableLogComponents (void)
+{
+  WifiHelper::EnableLogComponents ();
+
+  LogComponentEnable ("MeshL2RoutingProtocol", LOG_LEVEL_ALL);
+  LogComponentEnable ("MeshPointDevice", LOG_LEVEL_ALL);
+  LogComponentEnable ("MeshWifiInterfaceMac", LOG_LEVEL_ALL);
+
+  LogComponentEnable ("Dot11sPeerManagementProtocol", LOG_LEVEL_ALL);
+  LogComponentEnable ("HwmpProtocol", LOG_LEVEL_ALL);
+  LogComponentEnable ("HwmpProtocolMac", LOG_LEVEL_ALL);
+  LogComponentEnable ("HwmpRtable", LOG_LEVEL_ALL);
+  LogComponentEnable ("PeerManagementProtocol", LOG_LEVEL_ALL);
+  LogComponentEnable ("PeerManagementProtocolMac", LOG_LEVEL_ALL);
+
+  LogComponentEnable ("FlameProtocol", LOG_LEVEL_ALL);
+  LogComponentEnable ("FlameProtocolMac", LOG_LEVEL_ALL);
+  LogComponentEnable ("FlameRtable", LOG_LEVEL_ALL);
+}
+
 } // namespace ns3
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/mesh/helper/mesh-helper.h ns-3.36/src/mesh/helper/mesh-helper.h
--- ns-3.35/src/mesh/helper/mesh-helper.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/mesh/helper/mesh-helper.h	2022-04-30 18:23:58.070734500 -0700
@@ -216,6 +216,11 @@
    */
   int64_t AssignStreams (NetDeviceContainer c, int64_t stream);
 
+  /**
+   * Helper to enable all MeshPointDevice log components with one statement
+   */
+  static void EnableLogComponents (void);
+
 private:
   /**
    * \param phyHelper
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/mesh/model/dot11s/airtime-metric.h ns-3.36/src/mesh/model/dot11s/airtime-metric.h
--- ns-3.35/src/mesh/model/dot11s/airtime-metric.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/mesh/model/dot11s/airtime-metric.h	2022-04-30 18:23:58.070734500 -0700
@@ -20,7 +20,10 @@
 
 #ifndef AIRTIME_METRIC_H
 #define AIRTIME_METRIC_H
+
 #include "ns3/mesh-wifi-interface-mac.h"
+#include "ns3/wifi-mac-header.h"
+
 namespace ns3 {
 namespace dot11s {
 /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/mesh/model/dot11s/hwmp-protocol.cc ns-3.36/src/mesh/model/dot11s/hwmp-protocol.cc
--- ns-3.35/src/mesh/model/dot11s/hwmp-protocol.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/mesh/model/dot11s/hwmp-protocol.cc	2022-04-30 18:23:58.070734500 -0700
@@ -25,6 +25,9 @@
 #include "ns3/log.h"
 #include "ns3/simulator.h"
 #include "ns3/packet.h"
+#include "ns3/random-variable-stream.h"
+#include "ns3/string.h"
+#include "ns3/pointer.h"
 #include "ns3/mesh-point-device.h"
 #include "ns3/wifi-net-device.h"
 #include "ns3/mesh-wifi-interface-mac.h"
@@ -274,6 +277,7 @@
       tag.DecrementTtl ();
       if (tag.GetTtl () == 0)
         {
+          NS_LOG_DEBUG ("Dropping frame due to TTL expiry");
           m_stats.droppedTtl++;
           return false;
         }
@@ -310,6 +314,7 @@
               Mac48Address address = *i;
               tag.SetAddress (address);
               packetCopy->AddPacketTag (tag);
+              NS_LOG_DEBUG ("Sending route reply for broadcast; address " << address);
               routeReply (true, packetCopy, source, destination, protocolType, plugin->first);
             }
         }
@@ -607,7 +612,9 @@
   NS_LOG_DEBUG ("I am " << GetAddress () << "retransmitting PREQ:" << preq);
   for (HwmpProtocolMacMap::const_iterator i = m_interfaces.begin (); i != m_interfaces.end (); i++)
     {
-      i->second->SendPreq (preq);
+      Time forwardingDelay = GetMeshPoint ()->GetForwardingDelay ();
+      NS_LOG_DEBUG ("Forwarding PREQ from " << from << " with delay " << forwardingDelay.As (Time::US));
+      Simulator::Schedule (forwardingDelay, &HwmpProtocolMac::SendPreq, i->second, preq);
     }
 }
 void
@@ -708,7 +715,9 @@
   //Forward PREP
   HwmpProtocolMacMap::const_iterator prep_sender = m_interfaces.find (result.ifIndex);
   NS_ASSERT (prep_sender != m_interfaces.end ());
-  prep_sender->second->SendPrep (prep, result.retransmitter);
+  Time forwardingDelay = GetMeshPoint ()->GetForwardingDelay ();
+  NS_LOG_DEBUG ("Forwarding PREP from " << from << " with delay " << forwardingDelay.As (Time::US));
+  Simulator::Schedule (forwardingDelay, &HwmpProtocolMac::SendPrep, prep_sender->second, prep, result.retransmitter);
 }
 void
 HwmpProtocol::ReceivePerr (std::vector<FailedDestination> destinations, Mac48Address from, uint32_t interface, Mac48Address fromMp)
@@ -817,6 +826,7 @@
   NS_LOG_FUNCTION (this << seqno << source);
   if (source == GetAddress ())
     {
+      NS_LOG_DEBUG ("Dropping seqno " << seqno << "; from self"); 
       return true;
     }
   std::map<Mac48Address, uint32_t,std::less<Mac48Address> >::const_iterator i = m_lastDataSeqno.find (source);
@@ -828,6 +838,7 @@
     {
       if ((int32_t)(i->second - seqno)  >= 0)
         {
+          NS_LOG_DEBUG ("Dropping seqno " << seqno << "; stale frame");
           return true;
         }
       m_lastDataSeqno[source] = seqno;
@@ -890,6 +901,9 @@
               receivers_for_interface.push_back (perr.receivers[j].second);
             }
         }
+      Time forwardingDelay = GetMeshPoint ()->GetForwardingDelay ();
+      NS_LOG_DEBUG ("Forwarding PERR with delay " << forwardingDelay.As (Time::US));
+      Simulator::Schedule (forwardingDelay, &HwmpProtocolMac::ForwardPerr, i->second, perr.destinations, receivers_for_interface);
       i->second->ForwardPerr (perr.destinations, receivers_for_interface);
     }
 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/mesh/model/dot11s/hwmp-protocol.h ns-3.36/src/mesh/model/dot11s/hwmp-protocol.h
--- ns-3.35/src/mesh/model/dot11s/hwmp-protocol.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/mesh/model/dot11s/hwmp-protocol.h	2022-04-30 18:23:58.070734500 -0700
@@ -33,6 +33,7 @@
 class Packet;
 class Mac48Address;
 class UniformRandomVariable;
+class RandomVariableStream;
 namespace dot11s {
 class HwmpProtocolMac;
 class HwmpRtable;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/mesh/model/dot11s/hwmp-protocol-mac.cc ns-3.36/src/mesh/model/dot11s/hwmp-protocol-mac.cc
--- ns-3.35/src/mesh/model/dot11s/hwmp-protocol-mac.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/mesh/model/dot11s/hwmp-protocol-mac.cc	2022-04-30 18:23:58.070734500 -0700
@@ -23,6 +23,7 @@
 #include "ns3/simulator.h"
 #include "ns3/nstime.h"
 #include "ns3/log.h"
+#include "ns3/wifi-mac-header.h"
 #include "dot11s-mac-header.h"
 #include "hwmp-protocol-mac.h"
 #include "hwmp-tag.h"
@@ -89,6 +90,7 @@
   if ((destination == Mac48Address::GetBroadcast ()) && (m_protocol->DropDataFrame (meshHdr.GetMeshSeqno (),
                                                                                     source)))
     {
+      NS_LOG_DEBUG ("Dropping frame; source " << source << " dest " << destination << " seqno " << meshHdr.GetMeshSeqno ()); 
       return false;
     }
   return true;
@@ -228,10 +230,10 @@
   NS_LOG_FUNCTION (this);
   std::vector<IePreq> preq_vector;
   preq_vector.push_back (preq);
-  SendPreq (preq_vector);
+  SendPreqVector (preq_vector);
 }
 void
-HwmpProtocolMac::SendPreq (std::vector<IePreq> preq)
+HwmpProtocolMac::SendPreqVector (std::vector<IePreq> preq)
 {
   NS_LOG_FUNCTION (this);
   Ptr<Packet> packet = Create<Packet> ();
@@ -299,7 +301,7 @@
   //reschedule sending PREQ
   NS_ASSERT (!m_preqTimer.IsRunning ());
   m_preqTimer = Simulator::Schedule (m_protocol->GetPreqMinInterval (), &HwmpProtocolMac::SendMyPreq, this);
-  SendPreq (m_myPreq);
+  SendPreqVector (m_myPreq);
   m_myPreq.clear ();
 }
 void
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/mesh/model/dot11s/hwmp-protocol-mac.h ns-3.36/src/mesh/model/dot11s/hwmp-protocol-mac.h
--- ns-3.35/src/mesh/model/dot11s/hwmp-protocol-mac.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/mesh/model/dot11s/hwmp-protocol-mac.h	2022-04-30 18:23:58.070734500 -0700
@@ -75,10 +75,10 @@
    */
   void SendPreq (IePreq preq);
   /**
-   * Send PREQ function
+   * Send PREQ function for vector of PREQ
    * \param preq vector of PREQ information elements
    */
-  void SendPreq (std::vector<IePreq> preq);
+  void SendPreqVector (std::vector<IePreq> preq);
   /**
    * Send PREP function
    * \param prep the PREP information element
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/mesh/model/dot11s/ie-dot11s-prep.cc ns-3.36/src/mesh/model/dot11s/ie-dot11s-prep.cc
--- ns-3.35/src/mesh/model/dot11s/ie-dot11s-prep.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/mesh/model/dot11s/ie-dot11s-prep.cc	2022-04-30 18:23:58.070734500 -0700
@@ -189,7 +189,7 @@
 void
 IePrep::Print (std::ostream& os) const
 {
-  os << "PREP=(Flags=" << m_flags << ", Hopcount=" << m_hopcount << ", TTL=" << m_ttl
+  os << "PREP=(Flags=" << +m_flags << ", Hopcount=" << +m_hopcount << ", TTL=" << m_ttl
      << ",Destination=" << m_destinationAddress << ", Dest. seqnum=" << m_destSeqNumber
      << ", Lifetime=" << m_lifetime << ", Metric=" << m_metric << ", Originator="
      << m_originatorAddress << ", Orig. seqnum=" << m_originatorSeqNumber << ")";
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/mesh/model/dot11s/peer-management-protocol-mac.cc ns-3.36/src/mesh/model/dot11s/peer-management-protocol-mac.cc
--- ns-3.35/src/mesh/model/dot11s/peer-management-protocol-mac.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/mesh/model/dot11s/peer-management-protocol-mac.cc	2022-04-30 18:23:58.070734500 -0700
@@ -24,6 +24,7 @@
 #include "peer-management-protocol-mac.h"
 #include "peer-management-protocol.h"
 #include "peer-link-frame.h"
+#include "ns3/wifi-mac-queue-item.h"
 #include "ns3/mesh-wifi-interface-mac.h"
 #include "ns3/simulator.h"
 #include "ns3/mesh-information-element-vector.h"
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/mesh/model/flame/flame-protocol-mac.cc ns-3.36/src/mesh/model/flame/flame-protocol-mac.cc
--- ns-3.35/src/mesh/model/flame/flame-protocol-mac.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/mesh/model/flame/flame-protocol-mac.cc	2022-04-30 18:23:58.070734500 -0700
@@ -21,6 +21,7 @@
 #include "flame-protocol-mac.h"
 #include "flame-protocol.h"
 #include "flame-header.h"
+#include "ns3/wifi-mac-header.h"
 #include "ns3/log.h"
 
 namespace ns3 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/mesh/model/mesh-point-device.cc ns-3.36/src/mesh/model/mesh-point-device.cc
--- ns-3.35/src/mesh/model/mesh-point-device.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/mesh/model/mesh-point-device.cc	2022-04-30 18:23:58.078734600 -0700
@@ -21,6 +21,8 @@
 
 #include "ns3/packet.h"
 #include "ns3/log.h"
+#include "ns3/simulator.h"
+#include "ns3/string.h"
 #include "ns3/pointer.h"
 #include "ns3/mesh-point-device.h"
 #include "ns3/wifi-net-device.h"
@@ -50,7 +52,12 @@
                     MakePointerAccessor (
                       &MeshPointDevice::GetRoutingProtocol, &MeshPointDevice::SetRoutingProtocol),
                     MakePointerChecker<
-                      MeshL2RoutingProtocol> ());
+                      MeshL2RoutingProtocol> ())
+    .AddAttribute ("ForwardingDelay",
+                   "A random variable to account for processing time (microseconds) to forward a frame.",
+                   StringValue ("ns3::UniformRandomVariable[Min=300.0|Max=400.0]"),
+                   MakePointerAccessor (&MeshPointDevice::m_forwardingRandomVariable),
+                   MakePointerChecker<RandomVariableStream> ());
   return tid;
 }
 
@@ -109,11 +116,12 @@
       if (m_routingProtocol->RemoveRoutingStuff (incomingPort->GetIfIndex (), src48, dst48, packet_copy, realProtocol))
         {
           m_rxCallback (this, packet_copy, realProtocol, src);
-          NS_LOG_DEBUG ("Forwarding from " << src48 << " to " << dst48 << " at " << m_address);
-          Forward (incomingPort, packet, protocol, src48, dst48);
-
           m_rxStats.broadcastData++;
           m_rxStats.broadcastDataBytes += packet->GetSize ();
+          Time forwardingDelay = GetForwardingDelay ();
+          NS_LOG_DEBUG ("Forwarding broadcast from " << src48 << " to " << dst48
+            << " with delay " << forwardingDelay.As (Time::US));
+          Simulator::Schedule (forwardingDelay, &MeshPointDevice::Forward, this, incomingPort, packet, protocol, src48, dst48); 
         }
       return;
     }
@@ -129,7 +137,12 @@
       return;
     }
   else
-    Forward (incomingPort, packet->Copy (), protocol, src48, dst48);
+    {
+      Time forwardingDelay = GetForwardingDelay ();
+      Simulator::Schedule (forwardingDelay, &MeshPointDevice::Forward, this, incomingPort, packet->Copy (), protocol, src48, dst48); 
+      NS_LOG_DEBUG ("Forwarding unicast from " << src48 << " to " << dst48 
+        << " with delay " << forwardingDelay.As (Time::US));
+    }
 }
 
 void
@@ -487,4 +500,18 @@
   m_fwdStats = Statistics ();
 }
 
+int64_t
+MeshPointDevice::AssignStreams (int64_t stream)
+{
+  NS_LOG_FUNCTION (this << stream);
+  m_forwardingRandomVariable->SetStream (stream);
+  return 1;
+}
+
+Time
+MeshPointDevice::GetForwardingDelay () const
+{
+    return MicroSeconds (m_forwardingRandomVariable->GetInteger ());
+}
+
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/mesh/model/mesh-point-device.h ns-3.36/src/mesh/model/mesh-point-device.h
--- ns-3.35/src/mesh/model/mesh-point-device.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/mesh/model/mesh-point-device.h	2022-04-30 18:23:58.078734600 -0700
@@ -27,6 +27,7 @@
 #include "ns3/mac48-address.h"
 #include "ns3/bridge-channel.h"
 #include "ns3/mesh-l2-routing-protocol.h"
+#include "ns3/random-variable-stream.h"
 
 namespace ns3 {
 
@@ -138,6 +139,24 @@
   void ResetStats ();
   ///@}
 
+  /**
+   * Assign a fixed random variable stream number to the random variables
+   * used by this model.  Return the number of streams (possibly zero) that
+   * have been assigned.
+   *
+   * \param stream first stream index to use
+   * \return the number of stream indices assigned by this model
+   */
+  int64_t AssignStreams (int64_t stream);
+
+  /**
+   * Return a (random) forwarding delay value from the random variable
+   * ForwardingDelay attribute.
+   * 
+   * \return A Time value from the ForwardingDelay random variable
+   */
+  Time GetForwardingDelay () const;
+
 private:
   /**
    * Receive packet from interface
@@ -197,6 +216,8 @@
   Ptr<BridgeChannel> m_channel;
   /// Current routing protocol, used mainly by GetRoutingProtocol
   Ptr<MeshL2RoutingProtocol> m_routingProtocol;
+  /// Random variable used for forwarding delay and jitter
+  Ptr<RandomVariableStream> m_forwardingRandomVariable;
 
   /// statistics counters
   struct Statistics
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/mesh/model/mesh-wifi-interface-mac.cc ns-3.36/src/mesh/model/mesh-wifi-interface-mac.cc
--- ns-3.35/src/mesh/model/mesh-wifi-interface-mac.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/mesh/model/mesh-wifi-interface-mac.cc	2022-04-30 18:23:58.078734600 -0700
@@ -33,6 +33,8 @@
 #include "ns3/socket.h"
 #include "ns3/wifi-net-device.h"
 #include "ns3/channel-access-manager.h"
+#include "ns3/mac-tx-middle.h"
+#include "ns3/qos-txop.h"
 
 namespace ns3 {
 
@@ -44,7 +46,7 @@
 MeshWifiInterfaceMac::GetTypeId ()
 {
   static TypeId tid = TypeId ("ns3::MeshWifiInterfaceMac")
-    .SetParent<RegularWifiMac> ()
+    .SetParent<WifiMac> ()
     .SetGroupName ("Mesh")
     .AddConstructor<MeshWifiInterfaceMac> ()
     .AddAttribute ( "BeaconInterval",
@@ -88,6 +90,11 @@
 //-----------------------------------------------------------------------------
 // WifiMac inherited
 //-----------------------------------------------------------------------------
+bool
+MeshWifiInterfaceMac::CanForwardPacketsTo (Mac48Address to) const
+{
+  return true;
+}
 void
 MeshWifiInterfaceMac::Enqueue (Ptr<Packet> packet, Mac48Address to, Mac48Address from)
 {
@@ -109,7 +116,7 @@
 MeshWifiInterfaceMac::SetLinkUpCallback (Callback<void> linkUp)
 {
   NS_LOG_FUNCTION (this);
-  RegularWifiMac::SetLinkUpCallback (linkUp);
+  WifiMac::SetLinkUpCallback (linkUp);
 
   // The approach taken here is that, from the point of view of a mesh
   // node, the link is always up, so we immediately invoke the
@@ -123,7 +130,7 @@
   m_plugins.clear ();
   m_beaconSendEvent.Cancel ();
 
-  RegularWifiMac::DoDispose ();
+  WifiMac::DoDispose ();
 }
 void
 MeshWifiInterfaceMac::DoInitialize ()
@@ -176,15 +183,15 @@
 MeshWifiInterfaceMac::GetFrequencyChannel () const
 {
   NS_LOG_FUNCTION (this);
-  NS_ASSERT (m_phy != 0); // need PHY to set/get channel
-  return m_phy->GetChannelNumber ();
+  NS_ASSERT (GetWifiPhy () != 0); // need PHY to set/get channel
+  return GetWifiPhy ()->GetChannelNumber ();
 }
 
 void
 MeshWifiInterfaceMac::SwitchFrequencyChannel (uint16_t new_id)
 {
   NS_LOG_FUNCTION (this);
-  NS_ASSERT (m_phy != 0); // need PHY to set/get channel
+  NS_ASSERT (GetWifiPhy () != 0); // need PHY to set/get channel
   /**
    * \todo
    * Correct channel switching is:
@@ -196,7 +203,7 @@
    *
    * Now we use dirty channel switch -- just change frequency
    */
-  m_phy->SetChannelNumber (new_id);
+  GetWifiPhy ()->SetOperatingChannel (WifiPhy::ChannelTuple {new_id, 0, GetWifiPhy ()->GetPhyBand (), 0});
   // Don't know NAV on new channel
   m_channelAccessManager->NotifyNavResetNow (Seconds (0));
 }
@@ -232,15 +239,15 @@
   // Assert that address1 is set. Assert will fail e.g. if there is no installed routing plugin.
   NS_ASSERT (hdr.GetAddr1 () != Mac48Address ());
   // Queue frame
-  if (m_stationManager->IsBrandNew (hdr.GetAddr1 ()))
+  if (GetWifiRemoteStationManager ()->IsBrandNew (hdr.GetAddr1 ()))
     {
       // in adhoc mode, we assume that every destination
       // supports all the rates we support.
-      for (const auto & mode : m_phy->GetModeList ())
+      for (const auto & mode : GetWifiPhy ()->GetModeList ())
         {
-          m_stationManager->AddSupportedMode (hdr.GetAddr1 (), mode);
+          GetWifiRemoteStationManager ()->AddSupportedMode (hdr.GetAddr1 (), mode);
         }
-      m_stationManager->RecordDisassociated (hdr.GetAddr1 ());
+      GetWifiRemoteStationManager ()->RecordDisassociated (hdr.GetAddr1 ());
     }
   // Classify: application may have set a tag, which is removed here
   AcIndex ac;
@@ -258,8 +265,8 @@
     }
   m_stats.sentFrames++;
   m_stats.sentBytes += packet->GetSize ();
-  NS_ASSERT (m_edca.find (ac) != m_edca.end ());
-  m_edca[ac]->Queue (packet, hdr);
+  NS_ASSERT (GetQosTxop (ac) != nullptr);
+  GetQosTxop (ac)->Queue (packet, hdr);
 }
 void
 MeshWifiInterfaceMac::SendManagementFrame (Ptr<Packet> packet, const WifiMacHeader& hdr)
@@ -276,7 +283,7 @@
     }
   m_stats.sentFrames++;
   m_stats.sentBytes += packet->GetSize ();
-  if ((m_edca.find (AC_VO) == m_edca.end ()) || (m_edca.find (AC_BK) == m_edca.end ()))
+  if ((GetQosTxop (AC_VO) == nullptr) || (GetQosTxop (AC_BK) == nullptr))
     {
       NS_FATAL_ERROR ("Voice or Background queue is not set up!");
     }
@@ -290,11 +297,11 @@
    */
   if (hdr.GetAddr1 () != Mac48Address::GetBroadcast ())
     {
-      m_edca[AC_VO]->Queue (packet, header);
+      GetQosTxop (AC_VO)->Queue (packet, header);
     }
   else
     {
-      m_edca[AC_BK]->Queue (packet, header);
+      GetQosTxop (AC_BK)->Queue (packet, header);
     }
 }
 SupportedRates
@@ -303,28 +310,28 @@
   // set the set of supported rates and make sure that we indicate
   // the Basic Rate set in this set of supported rates.
   SupportedRates rates;
-  for (const auto & mode : m_phy->GetModeList ())
+  for (const auto & mode : GetWifiPhy ()->GetModeList ())
     {
-      uint16_t gi = ConvertGuardIntervalToNanoSeconds (mode, DynamicCast<WifiNetDevice> (m_phy->GetDevice ()));
-      rates.AddSupportedRate (mode.GetDataRate (m_phy->GetChannelWidth (), gi, 1));
+      uint16_t gi = ConvertGuardIntervalToNanoSeconds (mode, GetWifiPhy ()->GetDevice ());
+      rates.AddSupportedRate (mode.GetDataRate (GetWifiPhy ()->GetChannelWidth (), gi, 1));
     }
   // set the basic rates
-  for (uint32_t j = 0; j < m_stationManager->GetNBasicModes (); j++)
+  for (uint32_t j = 0; j < GetWifiRemoteStationManager ()->GetNBasicModes (); j++)
     {
-      WifiMode mode = m_stationManager->GetBasicMode (j);
-      uint16_t gi = ConvertGuardIntervalToNanoSeconds (mode, DynamicCast<WifiNetDevice> (m_phy->GetDevice ()));
-      rates.SetBasicRate (mode.GetDataRate (m_phy->GetChannelWidth (), gi, 1));
+      WifiMode mode = GetWifiRemoteStationManager ()->GetBasicMode (j);
+      uint16_t gi = ConvertGuardIntervalToNanoSeconds (mode, GetWifiPhy ()->GetDevice ());
+      rates.SetBasicRate (mode.GetDataRate (GetWifiPhy ()->GetChannelWidth (), gi, 1));
     }
   return rates;
 }
 bool
 MeshWifiInterfaceMac::CheckSupportedRates (SupportedRates rates) const
 {
-  for (uint32_t i = 0; i < m_stationManager->GetNBasicModes (); i++)
+  for (uint32_t i = 0; i < GetWifiRemoteStationManager ()->GetNBasicModes (); i++)
     {
-      WifiMode mode = m_stationManager->GetBasicMode (i);
-      uint16_t gi = ConvertGuardIntervalToNanoSeconds (mode, DynamicCast<WifiNetDevice> (m_phy->GetDevice ()));
-      if (!rates.IsSupportedRate (mode.GetDataRate (m_phy->GetChannelWidth (), gi, 1)))
+      WifiMode mode = GetWifiRemoteStationManager ()->GetBasicMode (i);
+      uint16_t gi = ConvertGuardIntervalToNanoSeconds (mode, GetWifiPhy ()->GetDevice ());
+      if (!rates.IsSupportedRate (mode.GetDataRate (GetWifiPhy ()->GetChannelWidth (), gi, 1)))
         {
           return false;
         }
@@ -430,16 +437,16 @@
         {
           SupportedRates rates = beacon_hdr.GetSupportedRates ();
 
-          for (const auto & mode : m_phy->GetModeList ())
+          for (const auto & mode : GetWifiPhy ()->GetModeList ())
             {
-              uint16_t gi = ConvertGuardIntervalToNanoSeconds (mode, DynamicCast<WifiNetDevice> (m_phy->GetDevice ()));
-              uint64_t rate = mode.GetDataRate (m_phy->GetChannelWidth (), gi, 1);
+              uint16_t gi = ConvertGuardIntervalToNanoSeconds (mode, GetWifiPhy ()->GetDevice ());
+              uint64_t rate = mode.GetDataRate (GetWifiPhy ()->GetChannelWidth (), gi, 1);
               if (rates.IsSupportedRate (rate))
                 {
-                  m_stationManager->AddSupportedMode (hdr->GetAddr2 (), mode);
+                  GetWifiRemoteStationManager ()->AddSupportedMode (hdr->GetAddr2 (), mode);
                   if (rates.IsBasicRate (rate))
                     {
-                      m_stationManager->AddBasicMode (mode);
+                      GetWifiRemoteStationManager ()->AddBasicMode (mode);
                     }
                 }
             }
@@ -472,9 +479,9 @@
       ForwardUp (packet, hdr->GetAddr4 (), hdr->GetAddr3 ());
     }
 
-  // We don't bother invoking RegularWifiMac::Receive() here, because
+  // We don't bother invoking WifiMac::Receive() here, because
   // we've explicitly handled all the frames we care about. This is in
-  // contrast to most classes which derive from RegularWifiMac.
+  // contrast to most classes which derive from WifiMac.
 }
 uint32_t
 MeshWifiInterfaceMac::GetLinkMetric (Mac48Address peerAddress)
@@ -540,13 +547,22 @@
 void
 MeshWifiInterfaceMac::ConfigureStandard (enum WifiStandard standard)
 {
-  SetQosSupported (true);  // a mesh station is a QoS station
-  RegularWifiMac::ConfigureStandard (standard);
+  NS_ABORT_IF (!GetQosSupported ());
+  WifiMac::ConfigureStandard (standard);
   m_standard = standard;
+}
 
+void
+MeshWifiInterfaceMac::ConfigureContentionWindow (uint32_t cwMin, uint32_t cwMax)
+{
+  WifiMac::ConfigureContentionWindow (cwMin, cwMax);
   // We use the single DCF provided by WifiMac for the purpose of
   // Beacon transmission. For this we need to reconfigure the channel
   // access parameters slightly, and do so here.
+  m_txop = CreateObject<Txop> ();
+  m_txop->SetChannelAccessManager (m_channelAccessManager);
+  m_txop->SetWifiMac (this);
+  m_txop->SetTxMiddle (m_txMiddle);
   m_txop->SetMinCw (0);
   m_txop->SetMaxCw (0);
   m_txop->SetAifsn (1);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/mesh/model/mesh-wifi-interface-mac.h ns-3.36/src/mesh/model/mesh-wifi-interface-mac.h
--- ns-3.35/src/mesh/model/mesh-wifi-interface-mac.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/mesh/model/mesh-wifi-interface-mac.h	2022-04-30 18:23:58.078734600 -0700
@@ -29,7 +29,7 @@
 #include "ns3/callback.h"
 #include "ns3/packet.h"
 #include "ns3/nstime.h"
-#include "ns3/regular-wifi-mac.h"
+#include "ns3/wifi-mac.h"
 #include "ns3/mesh-wifi-interface-mac-plugin.h"
 #include "ns3/event-id.h"
 
@@ -47,7 +47,7 @@
  *  - management and priority traffic.
  *
  */
-class MeshWifiInterfaceMac : public RegularWifiMac
+class MeshWifiInterfaceMac : public WifiMac
 {
 public:
   /**
@@ -65,6 +65,7 @@
   virtual void  Enqueue (Ptr<Packet> packet, Mac48Address to);
   virtual bool  SupportsSendFrom () const;
   virtual void  SetLinkUpCallback (Callback<void> linkUp);
+  virtual bool CanForwardPacketsTo (Mac48Address to) const;
 
   /// \name Each mesh point interface must know the mesh point address
   ///@{
@@ -193,6 +194,15 @@
    */
   virtual void ConfigureStandard (enum WifiStandard standard);
   /**
+   * \param cwMin the minimum contention window size
+   * \param cwMax the maximum contention window size
+   *
+   * This method is called to set the minimum and the maximum
+   * contention window size.
+   */
+  virtual void ConfigureContentionWindow (uint32_t cwMin, uint32_t cwMax);
+
+  /**
    * Assign a fixed random variable stream number to the random variables
    * used by this model.  Return the number of streams (possibly zero) that
    * have been assigned.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/mesh/test/dot11s/hwmp-proactive-regression.cc ns-3.36/src/mesh/test/dot11s/hwmp-proactive-regression.cc
--- ns-3.35/src/mesh/test/dot11s/hwmp-proactive-regression.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/mesh/test/dot11s/hwmp-proactive-regression.cc	2022-04-30 18:23:58.078734600 -0700
@@ -56,8 +56,8 @@
 void
 HwmpProactiveRegressionTest::DoRun ()
 {
-  RngSeedManager::SetSeed (12345);
-  RngSeedManager::SetRun (7);
+  RngSeedManager::SetSeed (1);
+  RngSeedManager::SetRun (1);
   CreateNodes ();
   CreateDevices ();
   InstallApplications ();
@@ -113,19 +113,27 @@
   YansWifiChannelHelper wifiChannel = YansWifiChannelHelper::Default ();
   Ptr<YansWifiChannel> chan = wifiChannel.Create ();
   wifiPhy.SetChannel (chan);
+  // This test was written prior to the preamble detection model
+  wifiPhy.DisablePreambleDetectionModel ();
 
   // 2. setup mesh
   MeshHelper mesh = MeshHelper::Default ();
+  // Due to the fact that MAC addresses are set by a local static variable
+  // that already allocates addresses to the previous tests in regression.cc,
+  // the first allocated address in this test will be 00:00:00:00:00:0b.
+  // (pmp allocates 2, simplest allocates 2, and reactive allocates 6)
+  // Therefore, the middle node will have address 00:00:00:00:00:0d,
+  // so we set this to the root as per the comment in the header file.
   mesh.SetStackInstaller ("ns3::Dot11sStack", "Root", Mac48AddressValue (Mac48Address ("00:00:00:00:00:0d")));
   mesh.SetMacType ("RandomStart", TimeValue (Seconds (0.1)));
   mesh.SetNumberOfInterfaces (1);
   NetDeviceContainer meshDevices = mesh.Install (wifiPhy, *m_nodes);
-  // Five devices, 9 streams per device 
+  // Five devices, 10 streams per device 
   streamsUsed += mesh.AssignStreams (meshDevices, streamsUsed);
-  NS_TEST_ASSERT_MSG_EQ (streamsUsed, (meshDevices.GetN () * 9), "Stream mismatch");
-  // No streams used here, by default
+  NS_TEST_ASSERT_MSG_EQ (streamsUsed, (meshDevices.GetN () * 10), "Stream mismatch");
+  // No streams used here, by default, so streamsUsed should not change
   streamsUsed += wifiChannel.AssignStreams (chan, streamsUsed);
-  NS_TEST_ASSERT_MSG_EQ (streamsUsed, (meshDevices.GetN () * 9), "Stream mismatch");
+  NS_TEST_ASSERT_MSG_EQ (streamsUsed, (meshDevices.GetN () * 10), "Stream mismatch");
 
   // 3. setup TCP/IP
   InternetStackHelper internetStack;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/mesh/test/dot11s/hwmp-proactive-regression.h ns-3.36/src/mesh/test/dot11s/hwmp-proactive-regression.h
--- ns-3.35/src/mesh/test/dot11s/hwmp-proactive-regression.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/mesh/test/dot11s/hwmp-proactive-regression.h	2022-04-30 18:23:58.078734600 -0700
@@ -30,11 +30,13 @@
  * \ingroup dot11s-test
  * \ingroup tests
  *
- * \brief There are 5 stations set into a column, the center station is root.
- * Regression test indicates, that traffic goes from the first to the
+ * \brief There are 5 stations set into a row, the center station is root.
+ * Regression test indicates that traffic goes from the first to the
  * last stations without reactive route discovery procedure
  * \verbatim
- * Src                Root                 Dst
+ *          Src                Root                 Dst
+ * (node ID) 0         1         2         3         4
+ * (MAC)   00:0b     00:0c     00:0d     00:0e     00:0f
  *           |         |<--------|-------->|         |          Proactive PREQ
  *           |         |-------->|         |         |          PREP
  *           |         |         |<--------|         |          PREP
@@ -45,14 +47,15 @@
  *  <--------|-------->|         |         |<--------|--------> Proactive PREQ
  *  Note, that at this moment all routes are known, and no reactive
  *  path discovery procedure shall be initiated
- *  <--------|-------->|         |         |         |          ARP request
- *           |.........|.........|.........|.........|
  *           |         |         |<--------|-------->|          ARP request
- *           |         |         |         |<--------|          ARP reply
  *           |.........|.........|.........|.........|
- *           |<--------|         |         |         |          ARP reply
- *           |-------->|         |         |         |          DATA
- *             ^ Further data is forwarded by proactive path
+ *  <--------|-------->|         |         |         |          ARP request
+ *           |-------->|         |         |         |          ARP reply
+ *           |.........|.........|.........|.........|
+ *           |         |         |         |-------->|          ARP reply
+ *           |         |         |         |<--------|          DATA
+ *                                             ^
+ *               Further data is forwarded by proactive path
  * \endverbatim
  *
  */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/mesh/test/dot11s/hwmp-reactive-regression.cc ns-3.36/src/mesh/test/dot11s/hwmp-reactive-regression.cc
--- ns-3.35/src/mesh/test/dot11s/hwmp-reactive-regression.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/mesh/test/dot11s/hwmp-reactive-regression.cc	2022-04-30 18:23:58.078734600 -0700
@@ -52,11 +52,7 @@
 void
 HwmpReactiveRegressionTest::DoRun ()
 {
-  RngSeedManager::SetSeed (12345);
-  // This test is somewhat sensitive to seed selection, since the nodes
-  // are on the fringe of reception range from one another (to create 
-  // a multi-hop topology).  Some seeds may yield no data transfer because
-  // ARP resolution across the mesh may fail too many times
+  RngSeedManager::SetSeed (1);
   RngSeedManager::SetRun (1);
   CreateNodes ();
   CreateDevices ();
@@ -77,11 +73,11 @@
   MobilityHelper mobility;
   Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator>();
   positionAlloc->Add (Vector (  0,   0, 0));
-  positionAlloc->Add (Vector (  0, 150, 0));
-  positionAlloc->Add (Vector (  0, 300, 0));
-  positionAlloc->Add (Vector (  0, 450, 0));
+  positionAlloc->Add (Vector (  0, 120, 0));
+  positionAlloc->Add (Vector (  0, 240, 0));
+  positionAlloc->Add (Vector (  0, 360, 0));
+  positionAlloc->Add (Vector (  0, 480, 0));
   positionAlloc->Add (Vector (  0, 600, 0));
-  positionAlloc->Add (Vector (  0, 750, 0));
   mobility.SetPositionAllocator (positionAlloc);
   mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
   mobility.Install (*m_nodes);
@@ -114,6 +110,8 @@
   YansWifiChannelHelper wifiChannel = YansWifiChannelHelper::Default ();
   Ptr<YansWifiChannel> chan = wifiChannel.Create ();
   wifiPhy.SetChannel (chan);
+  // This test was written prior to the preamble detection model
+  wifiPhy.DisablePreambleDetectionModel ();
 
   // 2. setup mesh
   MeshHelper mesh = MeshHelper::Default ();
@@ -121,11 +119,11 @@
   mesh.SetMacType ("RandomStart", TimeValue (Seconds (0.1)));
   mesh.SetNumberOfInterfaces (1);
   NetDeviceContainer meshDevices = mesh.Install (wifiPhy, *m_nodes);
-  // Six devices, 4 streams per device
+  // Six devices, 10 streams per device
   streamsUsed += mesh.AssignStreams (meshDevices, streamsUsed);
-  NS_TEST_EXPECT_MSG_EQ (streamsUsed, (meshDevices.GetN () * 9), "Stream assignment mismatch");
+  NS_TEST_EXPECT_MSG_EQ (streamsUsed, (meshDevices.GetN () * 10), "Stream assignment mismatch");
   streamsUsed += wifiChannel.AssignStreams (chan, streamsUsed);
-  NS_TEST_EXPECT_MSG_EQ (streamsUsed, (meshDevices.GetN () * 9), "Stream assignment mismatch");
+  NS_TEST_EXPECT_MSG_EQ (streamsUsed, (meshDevices.GetN () * 10), "Stream assignment mismatch");
 
   // 3. setup TCP/IP
   InternetStackHelper internetStack;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/mesh/test/dot11s/hwmp-reactive-regression.h ns-3.36/src/mesh/test/dot11s/hwmp-reactive-regression.h
--- ns-3.35/src/mesh/test/dot11s/hwmp-reactive-regression.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/mesh/test/dot11s/hwmp-reactive-regression.h	2022-04-30 18:23:58.078734600 -0700
@@ -34,33 +34,33 @@
  * Initiate scenario with 6 stations. Procedure of opening peer link
  * is the following: (PMP routines are not shown)
  * \verbatim
- *      1    2    3    4    5    6
- *      |    |    |    |    |<---|--->  ARP request (first attempt has failed!)
- *      |....|....|....|....|....|      ARP request
+ *      0    1    2    3    4    5 
+ *      |    |    |    |    |<---|--->  ARP request (2.002s)
+ *      |....|....|....|....|....|      ARP requests (continued)
  *      |<---|--->|    |    |    |      ARP request
  *  <---|--->|    |    |    |    |      PREQ       } This order is broken
  *  <---|--->|    |    |    |    |      ARP request} due to BroadcastDca 
- *      |<---|--->|    |    |    |      PREQ
+ *      |<---|--->|    |    |    |      PREQ 2.00468s)
  *      |....|....|....|....|....|      ARP request
- *      |    |    |    |<---|--->|      PREQ
+ *      |    |    |    |<---|--->|      PREQ (2.00621s)
  *      |    |    |    |    |<---|      PREP
- *      |....|....|....|....|....|      PREP 
- *      |<---|    |    |    |    |      PREP
- *      |--->|    |    |    |    |      ARP response
- *      |....|....|....|....|....|      ARP response
- *      |    |    |    |    |--->|      ARP response
- *      |    |    |    |    |<---|      Data
- *      |....|....|....|....|....|      Data
+ *      |....|....|....|....|....|      PREP (continued)
+ *      |<---|    |    |    |    |      PREP (2.00808s)
+ *      |--->|    |    |    |    |      ARP reply (2.0084s)
+ *      |....|....|....|....|....|      ARP replies
+ *      |    |    |    |    |--->|      ARP reply (2.01049s)
+ *      |    |    |    |    |<---|      Data (2.01059s)
+ *      |....|....|....|....|....|      Data (continued)
  *      |<---|    |    |    |    |      Data
- *  <---|--->|    |    |    |    |      ARP request
- *      |....|....|....|....|....|      ARP request
+ *  <---|--->|    |    |    |    |      ARP request (2.02076s)
+ *      |....|....|....|....|....|      ARP requests (continued)
  *      |    |    |    |    |<---|--->  ARP request
- *      |    |    |    |    |<---|      ARP response
- *      |....|....|....|....|....|      ARP response
- *      |<---|    |    |    |    |      ARP response
+ *      |    |    |    |    |<---|      ARP reply (2.02281s)
+ *      |....|....|....|....|....|      ARP replies (continued)
+ *      |<---|    |    |    |    |      ARP reply
  *      |--->|    |    |    |    |      Data
- * At 5 station number 4 disappears, and PERR is forwarded from 3 to 1
- * and from 5 to 6, and station 6 starts path discovery procedure
+ * At 5s, station number 3 disappears, and PERR is forwarded from 2 to 0
+ * and from 4 to 5, and station 5 starts path discovery procedure
  * again:
  *      |    |<---|         |--->|      PERR (one due to beacon loss and one due to TX error)
  *      |<---|    |         |    |      PERR
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/mesh/test/dot11s/hwmp-simplest-regression.cc ns-3.36/src/mesh/test/dot11s/hwmp-simplest-regression.cc
--- ns-3.35/src/mesh/test/dot11s/hwmp-simplest-regression.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/mesh/test/dot11s/hwmp-simplest-regression.cc	2022-04-30 18:23:58.078734600 -0700
@@ -55,8 +55,8 @@
 void
 HwmpSimplestRegressionTest::DoRun ()
 {
-  RngSeedManager::SetSeed (12345);
-  RngSeedManager::SetRun (7);
+  RngSeedManager::SetSeed (1);
+  RngSeedManager::SetRun (1);
   CreateNodes ();
   CreateDevices ();
   InstallApplications ();
@@ -129,11 +129,11 @@
   mesh.SetMacType ("RandomStart", TimeValue (Seconds (0.1)));
   mesh.SetNumberOfInterfaces (1);
   NetDeviceContainer meshDevices = mesh.Install (wifiPhy, *m_nodes);
-  // Two devices, nine streams per mesh device
+  // Two devices, ten streams per mesh device
   streamsUsed += mesh.AssignStreams (meshDevices, streamsUsed);
-  NS_TEST_ASSERT_MSG_EQ (streamsUsed, (meshDevices.GetN () * 9), "Stream assignment mismatch");
+  NS_TEST_ASSERT_MSG_EQ (streamsUsed, (meshDevices.GetN () * 10), "Stream assignment mismatch");
   streamsUsed += wifiChannel.AssignStreams (chan, streamsUsed);
-  NS_TEST_ASSERT_MSG_EQ (streamsUsed, (meshDevices.GetN () * 9), "Stream assignment mismatch");
+  NS_TEST_ASSERT_MSG_EQ (streamsUsed, (meshDevices.GetN () * 10), "Stream assignment mismatch");
 
   // 3. setup TCP/IP
   InternetStackHelper internetStack;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/mesh/test/dot11s/hwmp-simplest-regression.h ns-3.36/src/mesh/test/dot11s/hwmp-simplest-regression.h
--- ns-3.35/src/mesh/test/dot11s/hwmp-simplest-regression.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/mesh/test/dot11s/hwmp-simplest-regression.h	2022-04-30 18:23:58.078734600 -0700
@@ -34,27 +34,32 @@
  * Initiate scenario with 2 stations. Procedure of opening peer link
  * is the following:
  * \verbatim
+ *           server       client
  * <-----------|----------->   Broadcast frame
  *             |----------->|  Unicast frame
  *
  *                                        !!! PMP routines:
  * <-----------|----------->|             Beacon
- *             |<-----------|             Peer Link Open frame 
  *             |----------->|             Peer Link Open frame
- *             |----------->|             Peer Link Confirm frame
  *             |<-----------|             Peer Link Confirm frame
+ *             |<-----------|             Peer Link Open frame 
+ *             |----------->|             Peer Link Confirm frame
  *             |............|             !!! Data started:
- *             |<-----------|-----------> Arp Request
- * <-----------|----------->|             Arp Request (fwd)
+ *             |<-----------|-----------> ARP Request (time 2)
  * <-----------|----------->|             PREQ
  *             |<-----------|             PREP
  *             |----------->|             ARP reply
- *             |<-----------|             Data
+ * <-----------|----------->|             ARP Request (reflooded after delay)
+ *             |<-----------|             Data (first UDP datagram)
+ * <-----------|----------->|             ARP Request
+ *             |<-----------|             ARP reply
  *             |----------->|             Data
+ *             |<-----------|-----------> ARP Request (reflooded after delay)
  *             |............|             Some other beacons
  *             |<-----------|             Data
  *             |----------->|             Data
  *             |............|             !!! Route expiration routines:
+ *             |............|             !!! (after time 7)
  *             |<-----------|-----------> PREQ (route expired)
  *             |----------->|             PREP
  *             |<-----------|             Data
@@ -62,10 +67,8 @@
  *             |............|
  * \endverbatim
  * At 10 seconds stations become unreachable, so UDP client tries to
- * close peer link due to TX-fail, and UDP-srver tries to close link
+ * close peer link due to TX-fail, and UDP server tries to close peer link
  * due to beacon loss
-
-
  */
 class HwmpSimplestRegressionTest : public TestCase
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/mesh/test/dot11s/hwmp-target-flags-regression.cc ns-3.36/src/mesh/test/dot11s/hwmp-target-flags-regression.cc
--- ns-3.35/src/mesh/test/dot11s/hwmp-target-flags-regression.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/mesh/test/dot11s/hwmp-target-flags-regression.cc	2022-04-30 18:23:58.078734600 -0700
@@ -59,8 +59,8 @@
 void
 HwmpDoRfRegressionTest::DoRun ()
 {
-  RngSeedManager::SetSeed (12345);
-  RngSeedManager::SetRun (7);
+  RngSeedManager::SetSeed (1);
+  RngSeedManager::SetRun (1);
   CreateNodes ();
   CreateDevices ();
   InstallApplications ();
@@ -140,6 +140,8 @@
   YansWifiChannelHelper wifiChannel = YansWifiChannelHelper::Default ();
   Ptr<YansWifiChannel> chan = wifiChannel.Create ();
   wifiPhy.SetChannel (chan);
+  // This scenario setup predates the preamble detection model
+  wifiPhy.DisablePreambleDetectionModel ();
 
   // 2. setup mesh
   MeshHelper mesh = MeshHelper::Default ();
@@ -147,11 +149,11 @@
   mesh.SetMacType ("RandomStart", TimeValue (Seconds (0.1)));
   mesh.SetNumberOfInterfaces (1);
   NetDeviceContainer meshDevices = mesh.Install (wifiPhy, *m_nodes);
-  // Four devices, nine streams per mac
+  // Four devices, ten streams per mac
   streamsUsed += mesh.AssignStreams (meshDevices, streamsUsed);
-  NS_TEST_ASSERT_MSG_EQ (streamsUsed, (meshDevices.GetN () * 9), "Stream assignment mismatch");
+  NS_TEST_ASSERT_MSG_EQ (streamsUsed, (meshDevices.GetN () * 10), "Stream assignment mismatch");
   streamsUsed += wifiChannel.AssignStreams (chan, streamsUsed);
-  NS_TEST_ASSERT_MSG_EQ (streamsUsed, (meshDevices.GetN () * 9), "Stream assignment mismatch");
+  NS_TEST_ASSERT_MSG_EQ (streamsUsed, (meshDevices.GetN () * 10), "Stream assignment mismatch");
 
   // 3. setup TCP/IP
   InternetStackHelper internetStack;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/mesh/test/dot11s/hwmp-target-flags-regression.h ns-3.36/src/mesh/test/dot11s/hwmp-target-flags-regression.h
--- ns-3.35/src/mesh/test/dot11s/hwmp-target-flags-regression.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/mesh/test/dot11s/hwmp-target-flags-regression.h	2022-04-30 18:23:58.078734600 -0700
@@ -35,7 +35,8 @@
  * \verbatim
  *  <-----------|----------->   Broadcast frame
  *              |----------->|  Unicast frame
- *            10          11            12           13
+ * (Node ID)   0           1             2            3
+ * (MAC addr) 10           11           12           13
  *             |            |<-----------|----------->|             ARP request (12 asks who has 10)
  *             |            |            |<-----------|-----------> ARP request
  *             |<-----------|----------->|            |             ARP request
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/mesh/test/dot11s/pmp-regression.cc ns-3.36/src/mesh/test/dot11s/pmp-regression.cc
--- ns-3.35/src/mesh/test/dot11s/pmp-regression.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/mesh/test/dot11s/pmp-regression.cc	2022-04-30 18:23:58.078734600 -0700
@@ -53,8 +53,8 @@
 void
 PeerManagementProtocolRegressionTest::DoRun ()
 {
-  RngSeedManager::SetSeed (12345);
-  RngSeedManager::SetRun (7);
+  RngSeedManager::SetSeed (1);
+  RngSeedManager::SetRun (1);
   CreateNodes ();
   CreateDevices ();
 
@@ -99,10 +99,10 @@
   mesh.SetMacType ("RandomStart", TimeValue (Seconds (0.1)));
   mesh.SetNumberOfInterfaces (1);
   NetDeviceContainer meshDevices = mesh.Install (wifiPhy, *m_nodes);
-  // Two devices, nine streams per device (one for mac, one for phy, 
-  // two for plugins, five for regular mac wifi DCF)
+  // Two devices, 10 streams per device (one for mac, one for phy, 
+  // two for plugins, five for regular mac wifi DCF, and one for MeshPointDevice)
   streamsUsed += mesh.AssignStreams (meshDevices, 0);
-  NS_TEST_ASSERT_MSG_EQ (streamsUsed, (meshDevices.GetN () * 9), "Stream assignment mismatch");
+  NS_TEST_ASSERT_MSG_EQ (streamsUsed, (meshDevices.GetN () * 10), "Stream assignment mismatch");
   streamsUsed += wifiChannel.AssignStreams (chan, streamsUsed);
   // 3. write PCAP if needed
   wifiPhy.EnablePcapAll (CreateTempDirFilename (PREFIX));
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/mesh/test/dot11s/pmp-regression.h ns-3.36/src/mesh/test/dot11s/pmp-regression.h
--- ns-3.35/src/mesh/test/dot11s/pmp-regression.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/mesh/test/dot11s/pmp-regression.h	2022-04-30 18:23:58.078734600 -0700
@@ -35,10 +35,10 @@
  * is the following:
  * \verbatim
  * |----------->|  Beacon
- * |<-----------|  Peer Link Open frame 
  * |----------->|  Peer Link Open frame
- * |----------->|  Peer Link Confirm frame
  * |<-----------|  Peer Link Confirm frame
+ * |<-----------|  Peer Link Open frame 
+ * |----------->|  Peer Link Confirm frame
  * |............|
  * |<---------->|  Other beacons
  * \endverbatim
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/mesh/test/flame/flame-regression.cc ns-3.36/src/mesh/test/flame/flame-regression.cc
--- ns-3.35/src/mesh/test/flame/flame-regression.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/mesh/test/flame/flame-regression.cc	2022-04-30 18:23:58.078734600 -0700
@@ -56,8 +56,8 @@
 void
 FlameRegressionTest::DoRun ()
 {
-  RngSeedManager::SetSeed (12345);
-  RngSeedManager::SetRun (7);
+  RngSeedManager::SetSeed (1);
+  RngSeedManager::SetRun (1);
   CreateNodes ();
   CreateDevices ();
   InstallApplications ();
@@ -80,7 +80,7 @@
   mobility.SetPositionAllocator ("ns3::GridPositionAllocator",
                                  "MinX", DoubleValue (0.0),
                                  "MinY", DoubleValue (0.0),
-                                 "DeltaX", DoubleValue (150),
+                                 "DeltaX", DoubleValue (120),
                                  "DeltaY", DoubleValue (0),
                                  "GridWidth", UintegerValue (3),
                                  "LayoutType", StringValue ("RowFirst"));
@@ -99,6 +99,8 @@
   YansWifiChannelHelper wifiChannel = YansWifiChannelHelper::Default ();
   Ptr<YansWifiChannel> chan = wifiChannel.Create ();
   wifiPhy.SetChannel (chan);
+  // This test predates the preamble detection model
+  wifiPhy.DisablePreambleDetectionModel ();
 
   // 2. setup mesh
   MeshHelper mesh = MeshHelper::Default ();
@@ -106,12 +108,12 @@
   mesh.SetMacType ("RandomStart", TimeValue (Seconds (0.1)));
   mesh.SetNumberOfInterfaces (1);
   NetDeviceContainer meshDevices = mesh.Install (wifiPhy, *m_nodes);
-  // Three devices, seven streams per device
+  // Three devices, eight streams per device
   streamsUsed += mesh.AssignStreams (meshDevices, streamsUsed);
-  NS_TEST_ASSERT_MSG_EQ (streamsUsed, (meshDevices.GetN () * 7), "Stream assignment unexpected value");
+  NS_TEST_ASSERT_MSG_EQ (streamsUsed, (meshDevices.GetN () * 8), "Stream assignment unexpected value");
   // No further streams used in the default wifi channel configuration
   streamsUsed += wifiChannel.AssignStreams (chan, streamsUsed);
-  NS_TEST_ASSERT_MSG_EQ (streamsUsed, (meshDevices.GetN () * 7), "Stream assignment unexpected value");
+  NS_TEST_ASSERT_MSG_EQ (streamsUsed, (meshDevices.GetN () * 8), "Stream assignment unexpected value");
   // 3. setup TCP/IP
   InternetStackHelper internetStack;
   internetStack.Install (*m_nodes);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/mesh/test/flame/flame-regression.h ns-3.36/src/mesh/test/flame/flame-regression.h
--- ns-3.35/src/mesh/test/flame/flame-regression.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/mesh/test/flame/flame-regression.h	2022-04-30 18:23:58.078734600 -0700
@@ -40,6 +40,7 @@
  * <-----------|----------->   Broadcast frame
  *             |----------->|  Unicast frame
  *           Source                   Destination
+ * (node ID)   2            1            0
  * <-----------|----------->|            |             ARP request
  *             |<-----------|----------->|             ARP request
  *             |            |<-----------|             ARP reply
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/mesh/wscript ns-3.36/src/mesh/wscript
--- ns-3.35/src/mesh/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/mesh/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,101 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    obj = bld.create_ns3_module('mesh', ['internet', 'wifi'])
-
-    obj.source = [
-        'model/mesh-information-element-vector.cc',
-        'model/mesh-point-device.cc',
-        'model/mesh-l2-routing-protocol.cc',
-        'model/mesh-wifi-beacon.cc',
-        'model/mesh-wifi-interface-mac.cc',
-        'model/dot11s/ie-dot11s-beacon-timing.cc',
-        'model/dot11s/ie-dot11s-configuration.cc',
-        'model/dot11s/ie-dot11s-id.cc',
-        'model/dot11s/ie-dot11s-peer-management.cc',
-        'model/dot11s/ie-dot11s-preq.cc',
-        'model/dot11s/ie-dot11s-prep.cc',
-        'model/dot11s/ie-dot11s-perr.cc',
-        'model/dot11s/ie-dot11s-rann.cc',
-        'model/dot11s/ie-dot11s-peering-protocol.cc',
-        'model/dot11s/ie-dot11s-metric-report.cc',
-        'model/dot11s/dot11s-mac-header.cc',
-        'model/dot11s/peer-link-frame.cc',
-        'model/dot11s/peer-link.cc',
-        'model/dot11s/peer-management-protocol-mac.cc',
-        'model/dot11s/peer-management-protocol.cc',
-        'model/dot11s/hwmp-tag.cc',
-        'model/dot11s/hwmp-rtable.cc',
-        'model/dot11s/hwmp-protocol-mac.cc',
-        'model/dot11s/hwmp-protocol.cc',
-        'model/dot11s/airtime-metric.cc',
-        'model/flame/flame-header.cc',
-        'model/flame/flame-rtable.cc',
-        'model/flame/flame-protocol-mac.cc',
-        'model/flame/flame-protocol.cc',
-        'helper/mesh-helper.cc',
-        'helper/mesh-stack-installer.cc',
-        'helper/dot11s/dot11s-installer.cc',
-        'helper/flame/flame-installer.cc',
-        ]
-
-    obj_test = bld.create_ns3_module_test_library('mesh')
-    obj_test.source = [
-        'test/mesh-information-element-vector-test-suite.cc',
-        'test/dot11s/dot11s-test-suite.cc',
-        'test/dot11s/pmp-regression.cc',
-        'test/dot11s/hwmp-reactive-regression.cc',
-        'test/dot11s/hwmp-proactive-regression.cc',
-        'test/dot11s/hwmp-simplest-regression.cc',
-        'test/dot11s/hwmp-target-flags-regression.cc',
-        'test/dot11s/regression.cc',
-        'test/flame/flame-test-suite.cc',
-        'test/flame/flame-regression.cc',
-        'test/flame/regression.cc',
-        ]
-
-    # Tests encapsulating example programs should be listed here
-    if (bld.env['ENABLE_EXAMPLES']):
-        obj_test.source.extend([
-        #   'test/mesh-examples-test-suite.cc',
-            ])
-        
-    headers = bld(features='ns3header')
-    headers.module = 'mesh'
-    headers.source = [
-        'model/mesh-information-element-vector.h',
-        'model/mesh-point-device.h',
-        'model/mesh-l2-routing-protocol.h',
-        'model/mesh-wifi-beacon.h',
-        'model/mesh-wifi-interface-mac.h',
-        'model/mesh-wifi-interface-mac-plugin.h',
-        'model/dot11s/hwmp-protocol.h',
-        'model/dot11s/peer-management-protocol.h',
-        'model/dot11s/ie-dot11s-beacon-timing.h',
-        'model/dot11s/ie-dot11s-configuration.h',
-        'model/dot11s/ie-dot11s-peer-management.h',
-        'model/dot11s/ie-dot11s-id.h',
-        'model/dot11s/peer-link.h',
-        'model/dot11s/dot11s-mac-header.h',
-        'model/dot11s/peer-link-frame.h',
-        'model/dot11s/hwmp-rtable.h',
-        'model/dot11s/ie-dot11s-peering-protocol.h',
-        'model/dot11s/ie-dot11s-metric-report.h',
-        'model/dot11s/ie-dot11s-perr.h',
-        'model/dot11s/ie-dot11s-prep.h',
-        'model/dot11s/ie-dot11s-preq.h',
-        'model/dot11s/ie-dot11s-rann.h',
-        'model/flame/flame-protocol.h',
-        'model/flame/flame-header.h',
-        'model/flame/flame-rtable.h',
-        'model/flame/flame-protocol-mac.h',
-        'helper/mesh-helper.h',
-        'helper/mesh-stack-installer.h',
-        'helper/dot11s/dot11s-installer.h',
-        'helper/flame/flame-installer.h',
-        ]
-
-    if bld.env['ENABLE_EXAMPLES']:
-        bld.recurse('examples')
-
-    bld.ns3_python_bindings()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/mobility/bindings/callbacks_list.py ns-3.36/src/mobility/bindings/callbacks_list.py
--- ns-3.35/src/mobility/bindings/callbacks_list.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/mobility/bindings/callbacks_list.py	2022-04-30 18:23:58.078734600 -0700
@@ -1,6 +1,6 @@
 callback_classes = [
     ['ns3::ObjectBase *', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Ptr<const ns3::MobilityModel>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'const ns3::Address &', 'const ns3::Address &', 'ns3::NetDevice::PacketType', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Ptr<const ns3::MobilityModel>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
 ]
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/mobility/bindings/modulegen__gcc_ILP32.py ns-3.36/src/mobility/bindings/modulegen__gcc_ILP32.py
--- ns-3.35/src/mobility/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/mobility/bindings/modulegen__gcc_ILP32.py	2022-04-30 18:23:58.082734600 -0700
@@ -75,6 +75,8 @@
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::TraceSourceAccessor'])
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'], import_from_module='ns.core')
     ## geographic-positions.h (module 'mobility'): ns3::GeographicPositions [class]
     module.add_class('GeographicPositions')
     ## geographic-positions.h (module 'mobility'): ns3::GeographicPositions::EarthSpheroidType [enumeration]
@@ -212,25 +214,25 @@
     module.add_class('RandomVariableStream', import_from_module='ns.core', parent=root_module['ns3::Object'])
     ## random-variable-stream.h (module 'core'): ns3::SequentialRandomVariable [class]
     module.add_class('SequentialRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::OutputStreamWrapper', 'ns3::empty', 'ns3::DefaultDeleter<ns3::OutputStreamWrapper>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
     module.add_class('TraceSourceAccessor', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >'])
@@ -427,7 +429,7 @@
     ## hierarchical-mobility-model.h (module 'mobility'): ns3::HierarchicalMobilityModel [class]
     module.add_class('HierarchicalMobilityModel', parent=root_module['ns3::MobilityModel'])
     module.add_container('std::list< ns3::Vector3D >', 'ns3::Vector3D', container_type='list')
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     typehandlers.add_type_alias('ns3::Vector3D', 'ns3::Vector')
     typehandlers.add_type_alias('ns3::Vector3D*', 'ns3::Vector*')
     typehandlers.add_type_alias('ns3::Vector3D&', 'ns3::Vector&')
@@ -1429,7 +1431,7 @@
                    'ns3::Vector', 
                    [param('double', 'latitude'), param('double', 'longitude'), param('double', 'altitude'), param('ns3::GeographicPositions::EarthSpheroidType', 'sphType')], 
                    is_static=True)
-    ## geographic-positions.h (module 'mobility'): static std::list<ns3::Vector3D, std::allocator<ns3::Vector3D> > ns3::GeographicPositions::RandCartesianPointsAroundGeographicPoint(double originLatitude, double originLongitude, double maxAltitude, int numPoints, double maxDistFromOrigin, ns3::Ptr<ns3::UniformRandomVariable> uniRand) [member function]
+    ## geographic-positions.h (module 'mobility'): static std::list<ns3::Vector3D, std::allocator<ns3::Vector3D>> ns3::GeographicPositions::RandCartesianPointsAroundGeographicPoint(double originLatitude, double originLongitude, double maxAltitude, int numPoints, double maxDistFromOrigin, ns3::Ptr<ns3::UniformRandomVariable> uniRand) [member function]
     cls.add_method('RandCartesianPointsAroundGeographicPoint', 
                    'std::list< ns3::Vector3D >', 
                    [param('double', 'originLatitude'), param('double', 'originLongitude'), param('double', 'maxAltitude'), param('int', 'numPoints'), param('double', 'maxDistFromOrigin'), param('ns3::Ptr< ns3::UniformRandomVariable >', 'uniRand')], 
@@ -2416,6 +2418,8 @@
     cls.add_constructor([param('ns3::ObjectFactory const &', 'arg0')])
     ## object-factory.h (module 'core'): ns3::ObjectFactory::ObjectFactory() [constructor]
     cls.add_constructor([])
+    ## object-factory.h (module 'core'): ns3::ObjectFactory::ObjectFactory(std::string const & typeId) [constructor]
+    cls.add_constructor([param('std::string const &', 'typeId')])
     ## object-factory.h (module 'core'): ns3::Ptr<ns3::Object> ns3::ObjectFactory::Create() const [member function]
     cls.add_method('Create', 
                    'ns3::Ptr< ns3::Object >', 
@@ -3017,8 +3021,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -3321,14 +3325,14 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('>=')
     cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_unary_numeric_operator('-')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
     cls.add_constructor([])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(double const value) [constructor]
@@ -3347,6 +3351,8 @@
     cls.add_constructor([param('long unsigned int const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int const v) [constructor]
     cls.add_constructor([param('long long unsigned int const', 'v')])
+    ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int128_t const v) [constructor]
+    cls.add_constructor([param('int128_t const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t const hi, uint64_t const lo) [constructor]
     cls.add_constructor([param('int64_t const', 'hi'), param('uint64_t const', 'lo')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [constructor]
@@ -3746,72 +3752,72 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3OutputStreamWrapper_Ns3Empty_Ns3DefaultDeleter__lt__ns3OutputStreamWrapper__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter< ns3::OutputStreamWrapper > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
@@ -4285,11 +4291,6 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::MobilityModel const> '], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
                    is_static=True, template_parameters=['ns3::Ptr<ns3::NetDevice> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
@@ -4311,6 +4312,11 @@
                    'std::string', 
                    [], 
                    is_static=True, template_parameters=['ns3::NetDevice::PacketType'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::MobilityModel const> '], visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -5243,10 +5249,16 @@
     cls.add_method('ExtractNeighborIndex', 
                    'uint32_t', 
                    [param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetEpoch() const [member function]
+    cls.add_method('GetEpoch', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() const [member function]
     cls.add_method('GetRemainingBits', 
                    'uint32_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -5257,6 +5269,10 @@
                    'uint32_t', 
                    [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
+    ## nix-vector.h (module 'network'): void ns3::NixVector::SetEpoch(uint32_t epoch) [member function]
+    cls.add_method('SetEpoch', 
+                   'void', 
+                   [param('uint32_t', 'epoch')])
     return
 
 def register_Ns3Node_methods(root_module, cls):
@@ -5633,10 +5649,11 @@
                    'uint32_t', 
                    [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) const [member function]
     cls.add_method('SetNixVector', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')], 
+                   is_const=True)
     ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
     cls.add_method('ToString', 
                    'std::string', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/mobility/bindings/modulegen__gcc_LP64.py ns-3.36/src/mobility/bindings/modulegen__gcc_LP64.py
--- ns-3.35/src/mobility/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/mobility/bindings/modulegen__gcc_LP64.py	2022-04-30 18:23:58.082734600 -0700
@@ -75,6 +75,8 @@
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::TraceSourceAccessor'])
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'], import_from_module='ns.core')
     ## geographic-positions.h (module 'mobility'): ns3::GeographicPositions [class]
     module.add_class('GeographicPositions')
     ## geographic-positions.h (module 'mobility'): ns3::GeographicPositions::EarthSpheroidType [enumeration]
@@ -212,25 +214,25 @@
     module.add_class('RandomVariableStream', import_from_module='ns.core', parent=root_module['ns3::Object'])
     ## random-variable-stream.h (module 'core'): ns3::SequentialRandomVariable [class]
     module.add_class('SequentialRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::OutputStreamWrapper', 'ns3::empty', 'ns3::DefaultDeleter<ns3::OutputStreamWrapper>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
     module.add_class('TraceSourceAccessor', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >'])
@@ -427,7 +429,7 @@
     ## hierarchical-mobility-model.h (module 'mobility'): ns3::HierarchicalMobilityModel [class]
     module.add_class('HierarchicalMobilityModel', parent=root_module['ns3::MobilityModel'])
     module.add_container('std::list< ns3::Vector3D >', 'ns3::Vector3D', container_type='list')
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     typehandlers.add_type_alias('ns3::Vector3D', 'ns3::Vector')
     typehandlers.add_type_alias('ns3::Vector3D*', 'ns3::Vector*')
     typehandlers.add_type_alias('ns3::Vector3D&', 'ns3::Vector&')
@@ -1429,7 +1431,7 @@
                    'ns3::Vector', 
                    [param('double', 'latitude'), param('double', 'longitude'), param('double', 'altitude'), param('ns3::GeographicPositions::EarthSpheroidType', 'sphType')], 
                    is_static=True)
-    ## geographic-positions.h (module 'mobility'): static std::list<ns3::Vector3D, std::allocator<ns3::Vector3D> > ns3::GeographicPositions::RandCartesianPointsAroundGeographicPoint(double originLatitude, double originLongitude, double maxAltitude, int numPoints, double maxDistFromOrigin, ns3::Ptr<ns3::UniformRandomVariable> uniRand) [member function]
+    ## geographic-positions.h (module 'mobility'): static std::list<ns3::Vector3D, std::allocator<ns3::Vector3D>> ns3::GeographicPositions::RandCartesianPointsAroundGeographicPoint(double originLatitude, double originLongitude, double maxAltitude, int numPoints, double maxDistFromOrigin, ns3::Ptr<ns3::UniformRandomVariable> uniRand) [member function]
     cls.add_method('RandCartesianPointsAroundGeographicPoint', 
                    'std::list< ns3::Vector3D >', 
                    [param('double', 'originLatitude'), param('double', 'originLongitude'), param('double', 'maxAltitude'), param('int', 'numPoints'), param('double', 'maxDistFromOrigin'), param('ns3::Ptr< ns3::UniformRandomVariable >', 'uniRand')], 
@@ -2416,6 +2418,8 @@
     cls.add_constructor([param('ns3::ObjectFactory const &', 'arg0')])
     ## object-factory.h (module 'core'): ns3::ObjectFactory::ObjectFactory() [constructor]
     cls.add_constructor([])
+    ## object-factory.h (module 'core'): ns3::ObjectFactory::ObjectFactory(std::string const & typeId) [constructor]
+    cls.add_constructor([param('std::string const &', 'typeId')])
     ## object-factory.h (module 'core'): ns3::Ptr<ns3::Object> ns3::ObjectFactory::Create() const [member function]
     cls.add_method('Create', 
                    'ns3::Ptr< ns3::Object >', 
@@ -3017,8 +3021,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -3321,14 +3325,14 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('>=')
     cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_unary_numeric_operator('-')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
     cls.add_constructor([])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(double const value) [constructor]
@@ -3347,6 +3351,8 @@
     cls.add_constructor([param('long unsigned int const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int const v) [constructor]
     cls.add_constructor([param('long long unsigned int const', 'v')])
+    ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int128_t const v) [constructor]
+    cls.add_constructor([param('int128_t const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t const hi, uint64_t const lo) [constructor]
     cls.add_constructor([param('int64_t const', 'hi'), param('uint64_t const', 'lo')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [constructor]
@@ -3746,72 +3752,72 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3OutputStreamWrapper_Ns3Empty_Ns3DefaultDeleter__lt__ns3OutputStreamWrapper__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter< ns3::OutputStreamWrapper > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
@@ -4285,11 +4291,6 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::MobilityModel const> '], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
                    is_static=True, template_parameters=['ns3::Ptr<ns3::NetDevice> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
@@ -4311,6 +4312,11 @@
                    'std::string', 
                    [], 
                    is_static=True, template_parameters=['ns3::NetDevice::PacketType'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::MobilityModel const> '], visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -5243,10 +5249,16 @@
     cls.add_method('ExtractNeighborIndex', 
                    'uint32_t', 
                    [param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetEpoch() const [member function]
+    cls.add_method('GetEpoch', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() const [member function]
     cls.add_method('GetRemainingBits', 
                    'uint32_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -5257,6 +5269,10 @@
                    'uint32_t', 
                    [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
+    ## nix-vector.h (module 'network'): void ns3::NixVector::SetEpoch(uint32_t epoch) [member function]
+    cls.add_method('SetEpoch', 
+                   'void', 
+                   [param('uint32_t', 'epoch')])
     return
 
 def register_Ns3Node_methods(root_module, cls):
@@ -5633,10 +5649,11 @@
                    'uint32_t', 
                    [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) const [member function]
     cls.add_method('SetNixVector', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')], 
+                   is_const=True)
     ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
     cls.add_method('ToString', 
                    'std::string', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/mobility/CMakeLists.txt ns-3.36/src/mobility/CMakeLists.txt
--- ns-3.35/src/mobility/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/mobility/CMakeLists.txt	2022-04-30 18:23:58.078734600 -0700
@@ -0,0 +1,55 @@
+build_lib(
+  LIBNAME mobility
+  SOURCE_FILES
+    helper/group-mobility-helper.cc
+    helper/mobility-helper.cc
+    helper/ns2-mobility-helper.cc
+    model/box.cc
+    model/constant-acceleration-mobility-model.cc
+    model/constant-position-mobility-model.cc
+    model/constant-velocity-helper.cc
+    model/constant-velocity-mobility-model.cc
+    model/gauss-markov-mobility-model.cc
+    model/geographic-positions.cc
+    model/hierarchical-mobility-model.cc
+    model/mobility-model.cc
+    model/position-allocator.cc
+    model/random-direction-2d-mobility-model.cc
+    model/random-walk-2d-mobility-model.cc
+    model/random-waypoint-mobility-model.cc
+    model/rectangle.cc
+    model/steady-state-random-waypoint-mobility-model.cc
+    model/waypoint-mobility-model.cc
+    model/waypoint.cc
+  HEADER_FILES
+    helper/group-mobility-helper.h
+    helper/mobility-helper.h
+    helper/ns2-mobility-helper.h
+    model/box.h
+    model/constant-acceleration-mobility-model.h
+    model/constant-position-mobility-model.h
+    model/constant-velocity-helper.h
+    model/constant-velocity-mobility-model.h
+    model/gauss-markov-mobility-model.h
+    model/geographic-positions.h
+    model/hierarchical-mobility-model.h
+    model/mobility-model.h
+    model/position-allocator.h
+    model/random-direction-2d-mobility-model.h
+    model/random-walk-2d-mobility-model.h
+    model/random-waypoint-mobility-model.h
+    model/rectangle.h
+    model/steady-state-random-waypoint-mobility-model.h
+    model/waypoint-mobility-model.h
+    model/waypoint.h
+  LIBRARIES_TO_LINK ${libnetwork}
+  TEST_SOURCES
+    test/box-line-intersection-test.cc
+    test/geo-to-cartesian-test.cc
+    test/mobility-test-suite.cc
+    test/mobility-trace-test-suite.cc
+    test/ns2-mobility-helper-test-suite.cc
+    test/rand-cart-around-geo-test.cc
+    test/steady-state-random-waypoint-mobility-model-test.cc
+    test/waypoint-mobility-model-test.cc
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/mobility/doc/mobility.rst ns-3.36/src/mobility/doc/mobility.rst
--- ns-3.35/src/mobility/doc/mobility.rst	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/mobility/doc/mobility.rst	2022-04-30 18:23:58.082734600 -0700
@@ -287,7 +287,7 @@
 
 .. sourcecode:: bash
 
-  $ ./waf --run "ns2-mobility-trace \
+  $ ./ns3 run "ns2-mobility-trace \
   --traceFile=src/mobility/examples/default.ns_movements \
   --nodeNum=2 \
   --duration=100.0 \
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/mobility/examples/bonnmotion-ns2-example.cc ns-3.36/src/mobility/examples/bonnmotion-ns2-example.cc
--- ns-3.35/src/mobility/examples/bonnmotion-ns2-example.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/mobility/examples/bonnmotion-ns2-example.cc	2022-04-30 18:23:58.082734600 -0700
@@ -37,7 +37,7 @@
  *
  * Finally, note that you can visualize this program using the pyviz
  * visualizer:
- *  ./waf --run bonnmotion-ns2-example --vis
+ *  ./ns3 run bonnmotion-ns2-example --vis
  */
 
 #include "ns3/core-module.h"
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/mobility/examples/CMakeLists.txt ns-3.36/src/mobility/examples/CMakeLists.txt
--- ns-3.35/src/mobility/examples/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/mobility/examples/CMakeLists.txt	2022-04-30 18:23:58.082734600 -0700
@@ -0,0 +1,42 @@
+set(base_examples
+    bonnmotion-ns2-example
+    main-random-topology
+    main-random-walk
+    ns2-mobility-trace
+)
+foreach(
+  example
+  ${base_examples}
+)
+  build_lib_example(
+    NAME ${example}
+    SOURCE_FILES ${example}.cc
+    LIBRARIES_TO_LINK ${libcore}
+                      ${libmobility}
+  )
+endforeach()
+
+build_lib_example(
+  NAME main-grid-topology
+  SOURCE_FILES main-grid-topology.cc
+  LIBRARIES_TO_LINK
+    ${libcore}
+    ${libmobility}
+    ${libnetwork}
+)
+
+build_lib_example(
+  NAME mobility-trace-example
+  SOURCE_FILES mobility-trace-example.cc
+  LIBRARIES_TO_LINK
+    ${libcore}
+    ${libmobility}
+    ${libnetwork}
+)
+
+build_lib_example(
+  NAME reference-point-group-mobility-example
+  SOURCE_FILES reference-point-group-mobility-example.cc
+  LIBRARIES_TO_LINK ${libnetwork}
+                    ${libmobility}
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/mobility/examples/ns2-mobility-trace.cc ns-3.36/src/mobility/examples/ns2-mobility-trace.cc
--- ns-3.35/src/mobility/examples/ns2-mobility-trace.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/mobility/examples/ns2-mobility-trace.cc	2022-04-30 18:23:58.082734600 -0700
@@ -36,7 +36,7 @@
  *
  * Usage of ns2-mobility-trace:
  *
- *  ./waf --run "ns2-mobility-trace \
+ *  ./ns3 run "ns2-mobility-trace \
  *        --traceFile=src/mobility/examples/default.ns_movements
  *        --nodeNum=2  --duration=100.0 --logFile=ns2-mobility-trace.log"
  *
@@ -94,7 +94,7 @@
   if (traceFile.empty () || nodeNum <= 0 || duration <= 0 || logFile.empty ())
     {
       std::cout << "Usage of " << argv[0] << " :\n\n"
-      "./waf --run \"ns2-mobility-trace"
+      "./ns3 run \"ns2-mobility-trace"
       " --traceFile=src/mobility/examples/default.ns_movements"
       " --nodeNum=2 --duration=100.0 --logFile=ns2-mob.log\" \n\n"
       "NOTE: ns2-traces-file could be an absolute or relative path. You could use the file default.ns_movements\n"
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/mobility/examples/wscript ns-3.36/src/mobility/examples/wscript
--- ns-3.35/src/mobility/examples/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/mobility/examples/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,33 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    if not bld.env['ENABLE_EXAMPLES']:
-        return;
-
-    obj = bld.create_ns3_program('main-grid-topology',
-                                 ['core', 'mobility', 'network'])
-    obj.source = 'main-grid-topology.cc'
-
-    obj = bld.create_ns3_program('main-random-topology',
-                                 ['core', 'mobility'])
-    obj.source = 'main-random-topology.cc'
-    
-    obj = bld.create_ns3_program('main-random-walk',
-                                 ['core', 'mobility'])
-    obj.source = 'main-random-walk.cc'
-
-    obj = bld.create_ns3_program('mobility-trace-example',
-                                 ['core', 'mobility', 'network'])
-    obj.source = 'mobility-trace-example.cc'
-
-    obj = bld.create_ns3_program('ns2-mobility-trace', 
-                                 ['core', 'mobility'])
-    obj.source = 'ns2-mobility-trace.cc'
-
-    obj = bld.create_ns3_program('bonnmotion-ns2-example', 
-                                 ['core', 'mobility'])
-    obj.source = 'bonnmotion-ns2-example.cc'
-
-    obj = bld.create_ns3_program('reference-point-group-mobility-example',
-                                 ['core', 'network', 'mobility'])
-    obj.source = 'reference-point-group-mobility-example.cc'
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/mobility/helper/mobility-helper.h ns-3.36/src/mobility/helper/mobility-helper.h
--- ns-3.35/src/mobility/helper/mobility-helper.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/mobility/helper/mobility-helper.h	2022-04-30 18:23:58.082734600 -0700
@@ -26,7 +26,7 @@
 #include "ns3/attribute.h"
 #include "ns3/output-stream-wrapper.h"
 #include "ns3/position-allocator.h"
-#include "node-container.h"
+#include "ns3/node-container.h"
 
 namespace ns3 {
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/mobility/helper/ns2-mobility-helper.cc ns-3.36/src/mobility/helper/ns2-mobility-helper.cc
--- ns-3.35/src/mobility/helper/ns2-mobility-helper.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/mobility/helper/ns2-mobility-helper.cc	2022-04-30 18:23:58.082734600 -0700
@@ -42,7 +42,6 @@
 #include <sstream>
 #include <map>
 #include "ns3/log.h"
-#include "ns3/unused.h"
 #include "ns3/simulator.h"
 #include "ns3/node-list.h"
 #include "ns3/node.h"
@@ -595,8 +594,7 @@
 IsNumber (const std::string& s)
 {
   char *endp;
-  double v = strtod (s.c_str (), &endp); // declared with warn_unused_result
-  NS_UNUSED (v); // suppress "set but not used" compiler warning
+  [[maybe_unused]] double v = strtod (s.c_str (), &endp);
   return endp == s.c_str () + s.size ();
 }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/mobility/model/steady-state-random-waypoint-mobility-model.cc ns-3.36/src/mobility/model/steady-state-random-waypoint-mobility-model.cc
--- ns-3.35/src/mobility/model/steady-state-random-waypoint-mobility-model.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/mobility/model/steady-state-random-waypoint-mobility-model.cc	2022-04-30 18:23:58.082734600 -0700
@@ -184,6 +184,7 @@
   else // node initially moving
     {
       double x1, x2, y1, y2;
+      x1 = x2 = y1 = y2 = 0;
       double r = 0;
       double u1 = 1;
       while (u1 >= r)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/mobility/test/mobility-test-suite.cc ns-3.36/src/mobility/test/mobility-test-suite.cc
--- ns-3.35/src/mobility/test/mobility-test-suite.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/mobility/test/mobility-test-suite.cc	2022-04-30 18:23:58.082734600 -0700
@@ -79,14 +79,14 @@
 WaypointLazyNotifyFalse::TestXPosition (double expectedXPos)
 {
   Vector pos = m_mob->GetPosition ();
-  NS_TEST_EXPECT_MSG_EQ_TOL_INTERNAL (pos.x, expectedXPos, 0.001, "Position not equal", __FILE__, __LINE__);
+  NS_TEST_EXPECT_MSG_EQ_TOL (pos.x, expectedXPos, 0.001, "Position not equal");
 }
 
 void
 WaypointLazyNotifyFalse::CourseChangeCallback (std::string path, Ptr<const MobilityModel> model)
 {
   // All waypoints (at 10 second intervals) should trigger a course change
-  NS_TEST_EXPECT_MSG_EQ_TOL_INTERNAL (m_courseChanges * 10.0, Simulator::Now ().GetSeconds (), 0.001, "Course change not notified correctly", __FILE__, __LINE__);
+  NS_TEST_EXPECT_MSG_EQ_TOL (m_courseChanges * 10.0, Simulator::Now ().GetSeconds (), 0.001, "Course change not notified correctly");
   m_courseChanges++;
 }
 
@@ -151,7 +151,7 @@
 WaypointLazyNotifyTrue::TestXPosition (double expectedXPos)
 {
   Vector pos = m_mob->GetPosition ();
-  NS_TEST_EXPECT_MSG_EQ_TOL_INTERNAL (pos.x, expectedXPos, 0.001, "Position not equal", __FILE__, __LINE__);
+  NS_TEST_EXPECT_MSG_EQ_TOL (pos.x, expectedXPos, 0.001, "Position not equal");
 }
 
 void
@@ -159,7 +159,7 @@
 {
   // This should trigger at time 15 only, since that is the first time that
   // position is updated due to LazyNotify
-  NS_TEST_EXPECT_MSG_EQ_TOL_INTERNAL (15, Simulator::Now ().GetSeconds (), 0.001, "Course change not notified correctly", __FILE__, __LINE__);
+  NS_TEST_EXPECT_MSG_EQ_TOL (15, Simulator::Now ().GetSeconds (), 0.001, "Course change not notified correctly");
 }
 
 void
@@ -227,7 +227,7 @@
 WaypointInitialPositionIsWaypoint::TestXPosition (Ptr<const WaypointMobilityModel> model, double expectedXPos)
 {
   Vector pos = model->GetPosition ();
-  NS_TEST_EXPECT_MSG_EQ_TOL_INTERNAL (pos.x, expectedXPos, 0.001, "Position not equal", __FILE__, __LINE__);
+  NS_TEST_EXPECT_MSG_EQ_TOL (pos.x, expectedXPos, 0.001, "Position not equal");
 }
 
 void
@@ -356,7 +356,7 @@
 WaypointMobilityModelViaHelper::TestXPosition (Ptr<const WaypointMobilityModel> mob, double expectedXPos)
 {
   Vector pos = mob->GetPosition ();
-  NS_TEST_EXPECT_MSG_EQ_TOL_INTERNAL (pos.x, expectedXPos, 0.001, "Position not equal", __FILE__, __LINE__);
+  NS_TEST_EXPECT_MSG_EQ_TOL (pos.x, expectedXPos, 0.001, "Position not equal");
 }
 
 // WaypointMobilityModel tests using the helper
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/mobility/wscript ns-3.36/src/mobility/wscript
--- ns-3.35/src/mobility/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/mobility/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,74 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    mobility = bld.create_ns3_module('mobility', ['network'])
-    mobility.source = [
-        'model/box.cc',
-        'model/constant-acceleration-mobility-model.cc',
-        'model/constant-position-mobility-model.cc',
-        'model/constant-velocity-helper.cc',
-        'model/constant-velocity-mobility-model.cc',
-        'model/gauss-markov-mobility-model.cc',
-        'model/geographic-positions.cc',
-        'model/hierarchical-mobility-model.cc',
-        'model/mobility-model.cc',
-        'model/position-allocator.cc',
-        'model/random-direction-2d-mobility-model.cc',
-        'model/random-walk-2d-mobility-model.cc',
-        'model/random-waypoint-mobility-model.cc',
-        'model/rectangle.cc',
-        'model/steady-state-random-waypoint-mobility-model.cc',
-        'model/waypoint.cc',
-        'model/waypoint-mobility-model.cc',
-        'helper/mobility-helper.cc',
-        'helper/ns2-mobility-helper.cc',
-        'helper/group-mobility-helper.cc',
-        ]
-
-    mobility_test = bld.create_ns3_module_test_library('mobility')
-    mobility_test.source = [
-        'test/mobility-test-suite.cc',
-        'test/mobility-trace-test-suite.cc',
-        'test/ns2-mobility-helper-test-suite.cc',
-        'test/steady-state-random-waypoint-mobility-model-test.cc',
-        'test/waypoint-mobility-model-test.cc',
-        'test/geo-to-cartesian-test.cc',
-        'test/rand-cart-around-geo-test.cc',
-        'test/box-line-intersection-test.cc',
-        ]
-
-    # Tests encapsulating example programs should be listed here
-    if (bld.env['ENABLE_EXAMPLES']):
-        mobility_test.source.extend([
-        #   'test/mobility-examples-test-suite.cc',
-            ])
-    
-    headers = bld(features='ns3header')
-    headers.module = 'mobility'
-    headers.source = [
-        'model/box.h',
-        'model/constant-acceleration-mobility-model.h',
-        'model/constant-position-mobility-model.h',
-        'model/constant-velocity-helper.h',
-        'model/constant-velocity-mobility-model.h',
-        'model/gauss-markov-mobility-model.h',
-        'model/geographic-positions.h',
-        'model/hierarchical-mobility-model.h',
-        'model/mobility-model.h',
-        'model/position-allocator.h',
-        'model/rectangle.h',
-        'model/random-direction-2d-mobility-model.h',
-        'model/random-walk-2d-mobility-model.h',
-        'model/random-waypoint-mobility-model.h',
-        'model/steady-state-random-waypoint-mobility-model.h',
-        'model/waypoint.h',
-        'model/waypoint-mobility-model.h',
-        'helper/mobility-helper.h',
-        'helper/ns2-mobility-helper.h',
-        'helper/group-mobility-helper.h',
-        ]
-
-    if (bld.env['ENABLE_EXAMPLES']):
-        bld.recurse('examples')
-
-    bld.ns3_python_bindings()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/mpi/CMakeLists.txt ns-3.36/src/mpi/CMakeLists.txt
--- ns-3.35/src/mpi/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/mpi/CMakeLists.txt	2022-04-30 18:23:58.086734500 -0700
@@ -0,0 +1,31 @@
+include_directories(${MPI_CXX_INCLUDE_DIRS})
+
+set(example_as_test_suite)
+if(${ENABLE_EXAMPLES})
+  set(example_as_test_suite
+      test/mpi-test-suite.cc
+  )
+endif()
+
+build_lib(
+  LIBNAME mpi
+  SOURCE_FILES
+    model/distributed-simulator-impl.cc
+    model/granted-time-window-mpi-interface.cc
+    model/mpi-interface.cc
+    model/mpi-receiver.cc
+    model/null-message-mpi-interface.cc
+    model/null-message-simulator-impl.cc
+    model/parallel-communication-interface.h
+    model/remote-channel-bundle-manager.cc
+    model/remote-channel-bundle.cc
+  HEADER_FILES
+    model/mpi-interface.h
+    model/mpi-receiver.h
+    model/parallel-communication-interface.h
+  LIBRARIES_TO_LINK
+    ${libcore}
+    ${libnetwork}
+    ${MPI_CXX_LIBRARIES}
+  TEST_SOURCES ${example_as_test_suite}
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/mpi/doc/distributed.rst ns-3.36/src/mpi/doc/distributed.rst
--- ns-3.35/src/mpi/doc/distributed.rst	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/mpi/doc/distributed.rst	2022-04-30 18:23:58.090734700 -0700
@@ -184,32 +184,32 @@
 
 If you already built |ns3| without MPI enabled, you must re-build::
 
-    $ ./waf distclean
+    $ ./ns3 distclean
 
 Configure |ns3| with the --enable-mpi option::
 
-    $ ./waf -d debug configure --enable-examples --enable-tests --enable-mpi
+    $ ./ns3 configure -d debug --enable-examples --enable-tests --enable-mpi
 
 Ensure that MPI is enabled by checking the optional features shown from the
 output of configure.
 
 Next, build |ns3|::
 
-    $ ./waf
+    $ ./ns3
 
 After building |ns3| with mpi enabled, the example programs are now
-ready to run with `mpiexec`.  It is advised to avoid running Waf directly
+ready to run with `mpiexec`.  It is advised to avoid running ns3 directly
 with `mpiexec`; two options that should be more robust are to either use
 the `--command-template` way of running the mpiexec program, or to use
-`./waf shell` and run the executables directly on the command line.
+`./ns3 shell` and run the executables directly on the command line.
 Here are a few examples (from the root |ns3| directory)::
 
-    $ ./waf --command-template="mpiexec -np 2 %s" --run simple-distributed
-    $ ./waf --command-template="mpiexec -np 2 -machinefile mpihosts %s --nix=0" --run nms-p2p-nix-distributed
+    $ ./ns3 run simple-distributed --command-template="mpiexec -np 2 %s"
+    $ ./ns3 run nms-p2p-nix-distributed --command-template="mpiexec -np 2 -machinefile mpihosts %s --nix=0"
             
 An example using the null message synchronization algorithm::
 
-    $ ./waf --command-template="mpiexec -np 2 %s --nullmsg" --run simple-distributed
+    $ ./ns3 run simple-distributed --command-template="mpiexec -np 2 %s --nullmsg"
 
 The np switch is the number of logical processors to use. The machinefile switch
 is which machines to use. In order to use machinefile, the target file must
@@ -224,10 +224,10 @@
 
 Or if you have a cluster of machines, you can name them.
 
-The other alternative to `command-template` is to use `./waf shell`.  Here
+The other alternative to `command-template` is to use `./ns3 shell`.  Here
 are the equivalent examples to the above (assuming optimized build profile)::
 
-    $ ./waf shell
+    $ ./ns3 shell
     $ cd build/src/mpi/examples
     $ mpiexec -np 2 ns3-dev-simple-distributed-optimized
     $ mpiexec -np 2 -machinefile mpihosts ns3-dev-nms-p2p-nix-distributed-optimized --nix=0
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/mpi/examples/CMakeLists.txt ns-3.36/src/mpi/examples/CMakeLists.txt
--- ns-3.35/src/mpi/examples/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/mpi/examples/CMakeLists.txt	2022-04-30 18:23:58.090734700 -0700
@@ -0,0 +1,40 @@
+include_directories(${MPI_CXX_INCLUDE_DIRS})
+link_libraries(${MPI_CXX_LIBRARIES})
+
+set(base_examples
+    simple-distributed
+    simple-distributed-mpi-comm
+    nms-p2p-nix-distributed
+    simple-distributed-empty-node
+)
+
+foreach(
+  example
+  ${base_examples}
+)
+  build_lib_example(
+    NAME ${example}
+    SOURCE_FILES ${example}.cc
+                 mpi-test-fixtures.cc
+    LIBRARIES_TO_LINK
+      ${libmpi}
+      ${libpoint-to-point}
+      ${libinternet}
+      ${libnix-vector-routing}
+      ${libapplications}
+  )
+endforeach()
+
+build_lib_example(
+  NAME third-distributed
+  SOURCE_FILES third-distributed.cc
+               mpi-test-fixtures.cc
+  LIBRARIES_TO_LINK
+    ${libmpi}
+    ${libpoint-to-point}
+    ${libinternet}
+    ${libmobility}
+    ${libwifi}
+    ${libcsma}
+    ${libapplications}
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/mpi/examples/mpi-test-fixtures.h ns-3.36/src/mpi/examples/mpi-test-fixtures.h
--- ns-3.35/src/mpi/examples/mpi-test-fixtures.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/mpi/examples/mpi-test-fixtures.h	2022-04-30 18:23:58.090734700 -0700
@@ -47,6 +47,8 @@
 
   
 /**
+ * \ingroup mpi
+ * 
  * Write to std::cout only from rank 0.
  * Number line for sorting output of parallel runs.
  *
@@ -64,6 +66,14 @@
       }                                                                                \
   while (false)
   
+/**
+ * \ingroup mpi
+ * 
+ * Append to std::cout only from rank 0.
+ * Number line for sorting output of parallel runs.
+ *
+ * \param x The output operators.
+ */
 #define RANK0COUTAPPEND(x)                      \
   do                                            \
     if (SinkTracer::GetWorldRank () == 0)       \
@@ -72,13 +82,17 @@
       }                                         \
   while (false)
 
+/**
+ * \ingroup mpi
+ * 
+ * Collects data about incoming packets.
+ */
 class SinkTracer
 {
 
 public:
   /**
-   * PacketSink receive trace callback.
-   * \copydetails ns3::Packet::TwoAddressTracedCallback
+   * PacketSink Init.
    */
   static void Init (void);
 
@@ -93,6 +107,8 @@
   /**
    * Verify the sink trace count observed matches the expected count.
    * Prints message to std::cout indicating success or fail.
+   * 
+   * \param expectedCount Expected number of packet received.
    */
   static void Verify (unsigned long expectedCount);
   
@@ -125,8 +141,8 @@
   }
 
   /**
-   * Get current line count and increment.
-   *
+   * Get current line count and increment it.
+   * \return the line count.
    */
   static int GetLineCount (void)
   {
@@ -134,10 +150,10 @@
   }
 
 private:
-  static unsigned long m_sinkCount; /*< Running sum of number of SinkTrace calls observed */
-  static unsigned long m_line; /*< Current output line number for ordering output */
-  static int m_worldRank; /*< MPI CommWorld rank */
-  static int m_worldSize; /*< MPI CommWorld size */
+  static unsigned long m_sinkCount; //!< Running sum of number of SinkTrace calls observed
+  static unsigned long m_line; //!< Current output line number for ordering output
+  static int m_worldRank; //!< MPI CommWorld rank
+  static int m_worldSize; //!< MPI CommWorld size
 };
 
 }  // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/mpi/examples/nms-p2p-nix-distributed.cc ns-3.36/src/mpi/examples/nms-p2p-nix-distributed.cc
--- ns-3.35/src/mpi/examples/nms-p2p-nix-distributed.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/mpi/examples/nms-p2p-nix-distributed.cc	2022-04-30 18:23:58.090734700 -0700
@@ -70,25 +70,12 @@
   typedef std::vector<NetDeviceContainer> vectorOfNetDeviceContainer;
   typedef std::vector<vectorOfNetDeviceContainer> vectorOfVectorOfNetDeviceContainer;
 
-  // Enable parallel simulator with the command line arguments
-  MpiInterface::Enable (&argc, &argv);
-
-  SinkTracer::Init ();
-
   SystemWallClockMs t0;  // Total time
   SystemWallClockMs t1;  // Setup time
   SystemWallClockMs t2;  // Run time/
   t0.Start ();
   t1.Start ();
 
-  uint32_t systemId = MpiInterface::GetSystemId ();
-  uint32_t systemCount = MpiInterface::GetSize ();
-
-  RANK0COUT (" ==== DARPA NMS CAMPUS NETWORK SIMULATION ====" << std::endl);
-
-  GlobalValue::Bind ("SimulatorImplementationType",
-                     StringValue ("ns3::DistributedSimulatorImpl"));
-
   uint32_t nCN = 2;
   uint32_t nLANClients = 10;
   bool single = 0;
@@ -110,6 +97,20 @@
   
   cmd.Parse (argc,argv);
 
+  // Enable parallel simulator with the command line arguments
+  MpiInterface::Enable (&argc, &argv);
+
+  SinkTracer::Init ();
+
+  uint32_t systemId = MpiInterface::GetSystemId ();
+  uint32_t systemCount = MpiInterface::GetSize ();
+
+  RANK0COUT (" ==== DARPA NMS CAMPUS NETWORK SIMULATION ====" << std::endl);
+
+  GlobalValue::Bind ("SimulatorImplementationType",
+                     StringValue ("ns3::DistributedSimulatorImpl"));
+
+
   if (nCN < 2)
     {
       RANK0COUT ("Number of total CNs (" << nCN << ") lower than minimum of 2"
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/mpi/examples/simple-distributed-mpi-comm.cc ns-3.36/src/mpi/examples/simple-distributed-mpi-comm.cc
--- ns-3.35/src/mpi/examples/simple-distributed-mpi-comm.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/mpi/examples/simple-distributed-mpi-comm.cc	2022-04-30 18:23:58.090734700 -0700
@@ -77,16 +77,20 @@
 
 NS_LOG_COMPONENT_DEFINE ("SimpleDistributedMpiComm");
 
-// Tag for whether this rank should go into a new communicator
-// ns-3 ranks will have color == 1.
+/**
+ * Tag for whether this rank should go into a new communicator
+ * ns-3 ranks will have color == 1.
+ * @{
+ */
 const int NS_COLOR = 1;
 const int NOT_NS_COLOR = NS_COLOR + 1;
+/** @} */
 
 /**
  * Report my rank, in both MPI_COMM_WORLD and the split communicator.
  *
  * \param [in] color My role, either ns-3 rank or other rank.
- * \param [in] spitComm The split communicator.
+ * \param [in] splitComm The split communicator.
  */
 void
 ReportRank (int color, MPI_Comm splitComm)
@@ -123,7 +127,7 @@
   bool testing = false;
 
   // Parse command line
-  CommandLine cmd;
+  CommandLine cmd(__FILE__);
   cmd.AddValue ("nix", "Enable the use of nix-vector or global routing", nix);
   cmd.AddValue ("nullmsg", "Enable the use of null-message synchronization (instead of granted time window)", nullmsg);
   cmd.AddValue ("tracing", "Enable pcap tracing", tracing);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/mpi/examples/third-distributed.cc ns-3.36/src/mpi/examples/third-distributed.cc
--- ns-3.35/src/mpi/examples/third-distributed.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/mpi/examples/third-distributed.cc	2022-04-30 18:23:58.090734700 -0700
@@ -163,22 +163,20 @@
   YansWifiPhyHelper phy;
   phy.SetChannel (channel.Create ());
 
-  WifiHelper wifi;
-  wifi.SetRemoteStationManager ("ns3::AarfWifiManager");
-
   WifiMacHelper mac;
   Ssid ssid = Ssid ("ns-3-ssid");
+
+  WifiHelper wifi;
+
+  NetDeviceContainer staDevices;
   mac.SetType ("ns3::StaWifiMac",
                "Ssid", SsidValue (ssid),
                "ActiveProbing", BooleanValue (false));
-
-  NetDeviceContainer staDevices;
   staDevices = wifi.Install (phy, mac, wifiStaNodes);
 
+  NetDeviceContainer apDevices;
   mac.SetType ("ns3::ApWifiMac",
                "Ssid", SsidValue (ssid));
-
-  NetDeviceContainer apDevices;
   apDevices = wifi.Install (phy, mac, wifiApNode);
 
   MobilityHelper mobility;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/mpi/examples/wscript ns-3.36/src/mpi/examples/wscript
--- ns-3.35/src/mpi/examples/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/mpi/examples/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,25 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    obj = bld.create_ns3_program('simple-distributed',
-                                 ['mpi', 'point-to-point', 'internet', 'nix-vector-routing', 'applications'])
-    obj.source = ['simple-distributed.cc', 'mpi-test-fixtures.cc']
-    
-    obj = bld.create_ns3_program('simple-distributed-empty-node',
-                                 ['mpi', 'point-to-point', 'internet', 'nix-vector-routing', 'applications'])
-    obj.source = ['simple-distributed-empty-node.cc', 'mpi-test-fixtures.cc']
-
-    obj = bld.create_ns3_program('simple-distributed-mpi-comm',
-                                 ['point-to-point', 'internet', 'nix-vector-routing', 'applications'])
-    obj.source = ['simple-distributed-mpi-comm.cc', 'mpi-test-fixtures.cc']
-
-    obj = bld.create_ns3_program('third-distributed',
-                                 ['mpi', 'point-to-point', 'internet', 'mobility', 'wifi', 'csma', 'applications'])
-    obj.source = ['third-distributed.cc', 'mpi-test-fixtures.cc']
-
-    obj = bld.create_ns3_program('nms-p2p-nix-distributed',
-                                 ['mpi', 'point-to-point', 'internet', 'nix-vector-routing', 'applications'])
-    obj.source = ['nms-p2p-nix-distributed.cc', 'mpi-test-fixtures.cc']
-
-
-
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/mpi/model/distributed-simulator-impl.cc ns-3.36/src/mpi/model/distributed-simulator-impl.cc
--- ns-3.35/src/mpi/model/distributed-simulator-impl.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/mpi/model/distributed-simulator-impl.cc	2022-04-30 18:23:58.090734700 -0700
@@ -110,13 +110,8 @@
 
   m_stop = false;
   m_globalFinished = false;
-  // uids are allocated from 4.
-  // uid 0 is "invalid" events
-  // uid 1 is "now" events
-  // uid 2 is "destroy" events
-  m_uid = 4;
-  // before ::Run is entered, the m_currentUid will be zero
-  m_currentUid = 0;
+  m_uid = EventId::UID::VALID;
+  m_currentUid = EventId::UID::INVALID;
   m_currentTs = 0;
   m_currentContext = Simulator::NO_CONTEXT;
   m_unscheduledEvents = 0;
@@ -314,6 +309,9 @@
 
   Scheduler::Event next = m_events->RemoveNext ();
 
+  PreEventHook (EventId (next.impl, next.key.m_ts, 
+                         next.key.m_context, next.key.m_uid));
+
   NS_ASSERT (next.key.m_ts >= m_currentTs);
   m_unscheduledEvents--;
   m_eventCount++;
@@ -508,16 +506,7 @@
 DistributedSimulatorImpl::ScheduleNow (EventImpl *event)
 {
   NS_LOG_FUNCTION (this << event);
-
-  Scheduler::Event ev;
-  ev.impl = event;
-  ev.key.m_ts = m_currentTs;
-  ev.key.m_context = GetContext ();
-  ev.key.m_uid = m_uid;
-  m_uid++;
-  m_unscheduledEvents++;
-  m_events->Insert (ev);
-  return EventId (event, ev.key.m_ts, ev.key.m_context, ev.key.m_uid);
+  return Schedule (Time (0), event);
 }
 
 EventId
@@ -553,7 +542,7 @@
 void
 DistributedSimulatorImpl::Remove (const EventId &id)
 {
-  if (id.GetUid () == 2)
+  if (id.GetUid () == EventId::UID::DESTROY)
     {
       // destroy events.
       for (DestroyEvents::iterator i = m_destroyEvents.begin (); i != m_destroyEvents.end (); i++)
@@ -595,7 +584,7 @@
 bool
 DistributedSimulatorImpl::IsExpired (const EventId &id) const
 {
-  if (id.GetUid () == 2)
+  if (id.GetUid () == EventId::UID::DESTROY)
     {
       if (id.PeekEventImpl () == 0
           || id.PeekEventImpl ()->IsCancelled ())
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/mpi/model/mpi-interface.h ns-3.36/src/mpi/model/mpi-interface.h
--- ns-3.35/src/mpi/model/mpi-interface.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/mpi/model/mpi-interface.h	2022-04-30 18:23:58.090734700 -0700
@@ -35,7 +35,12 @@
 namespace ns3 {
 /**
  * \defgroup mpi MPI Distributed Simulation
- *
+ */
+
+/**
+ * \ingroup mpi
+ * \ingroup tests
+ * \defgroup mpi-tests MPI Distributed Simulation tests
  */
 
 class ParallelCommunicationInterface;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/mpi/model/null-message-simulator-impl.cc ns-3.36/src/mpi/model/null-message-simulator-impl.cc
--- ns-3.35/src/mpi/model/null-message-simulator-impl.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/mpi/model/null-message-simulator-impl.cc	2022-04-30 18:23:58.090734700 -0700
@@ -79,13 +79,8 @@
   m_systemCount = MpiInterface::GetSize ();
 
   m_stop = false;
-  // uids are allocated from 4.
-  // uid 0 is "invalid" events
-  // uid 1 is "now" events
-  // uid 2 is "destroy" events
-  m_uid = 4;
-  // before ::Run is entered, the m_currentUid will be zero
-  m_currentUid = 0;
+  m_uid = EventId::UID::VALID;
+  m_currentUid = EventId::UID::INVALID;
   m_currentTs = 0;
   m_currentContext = Simulator::NO_CONTEXT;
   m_unscheduledEvents = 0;
@@ -235,6 +230,9 @@
 
   Scheduler::Event next = m_events->RemoveNext ();
 
+  PreEventHook (EventId (next.impl, next.key.m_ts, 
+                         next.key.m_context, next.key.m_uid));
+
   NS_ASSERT (next.key.m_ts >= m_currentTs);
   m_unscheduledEvents--;
   m_eventCount++;
@@ -438,16 +436,7 @@
 NullMessageSimulatorImpl::ScheduleNow (EventImpl *event)
 {
   NS_LOG_FUNCTION (this << event);
-
-  Scheduler::Event ev;
-  ev.impl = event;
-  ev.key.m_ts = m_currentTs;
-  ev.key.m_context = GetContext ();
-  ev.key.m_uid = m_uid;
-  m_uid++;
-  m_unscheduledEvents++;
-  m_events->Insert (ev);
-  return EventId (event, ev.key.m_ts, ev.key.m_context, ev.key.m_uid);
+  return Schedule (Time (0), event);
 }
 
 EventId
@@ -483,7 +472,7 @@
 void
 NullMessageSimulatorImpl::Remove (const EventId &id)
 {
-  if (id.GetUid () == 2)
+  if (id.GetUid () == EventId::UID::DESTROY)
     {
       // destroy events.
       for (DestroyEvents::iterator i = m_destroyEvents.begin (); i != m_destroyEvents.end (); i++)
@@ -525,7 +514,7 @@
 bool
 NullMessageSimulatorImpl::IsExpired (const EventId &id) const
 {
-  if (id.GetUid () == 2)
+  if (id.GetUid () == EventId::UID::DESTROY)
     {
       if (id.PeekEventImpl () == 0
           || id.PeekEventImpl ()->IsCancelled ())
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/mpi/model/null-message-simulator-impl.h ns-3.36/src/mpi/model/null-message-simulator-impl.h
--- ns-3.35/src/mpi/model/null-message-simulator-impl.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/mpi/model/null-message-simulator-impl.h	2022-04-30 18:23:58.090734700 -0700
@@ -21,7 +21,7 @@
 /**
  * \file
  * \ingroup mpi
- * Declaration of class ns3::NullMessageSimulatorImpl. 
+ * Declaration of class ns3::NullMessageSimulatorImpl.
  */
 
 
@@ -98,7 +98,7 @@
   friend class RemoteChannelBundleManager;
 
   /**
-   * Non blocking receive of pending messages.  
+   * Non blocking receive of pending messages.
    */
   void HandleArrivingMessagesNonBlocking (void);
 
@@ -134,6 +134,7 @@
    * Get the current SafeTime; the maximum time that events can
    * be processed based on information received from neighboring
    * MPI tasks.
+   * \return the current SafeTime
    */
   Time GetSafeTime (void);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/mpi/test/mpi-example-comm-2-init.reflog ns-3.36/src/mpi/test/mpi-example-comm-2-init.reflog
--- ns-3.35/src/mpi/test/mpi-example-comm-2-init.reflog	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/mpi/test/mpi-example-comm-2-init.reflog	2022-04-30 18:23:58.090734700 -0700
@@ -1,4 +1,4 @@
-TEST : 00000 : 
+TEST : 00000 : simple-distributed-mpi-comm
 TEST : 00001 : 
 TEST : 00002 : Configuration:
 TEST : 00003 : Routing:           nix-vector
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/mpi/test/mpi-example-comm-2.reflog ns-3.36/src/mpi/test/mpi-example-comm-2.reflog
--- ns-3.35/src/mpi/test/mpi-example-comm-2.reflog	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/mpi/test/mpi-example-comm-2.reflog	2022-04-30 18:23:58.090734700 -0700
@@ -1,4 +1,4 @@
-TEST : 00000 : 
+TEST : 00000 : simple-distributed-mpi-comm
 TEST : 00001 : 
 TEST : 00002 : Configuration:
 TEST : 00003 : Routing:           nix-vector
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/mpi/test/mpi-example-comm-3-init.reflog ns-3.36/src/mpi/test/mpi-example-comm-3-init.reflog
--- ns-3.35/src/mpi/test/mpi-example-comm-3-init.reflog	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/mpi/test/mpi-example-comm-3-init.reflog	2022-04-30 18:23:58.090734700 -0700
@@ -1,4 +1,4 @@
-TEST : 00000 : 
+TEST : 00000 : simple-distributed-mpi-comm
 TEST : 00001 : 
 TEST : 00002 : Configuration:
 TEST : 00003 : Routing:           nix-vector
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/mpi/test/mpi-test-suite.cc ns-3.36/src/mpi/test/mpi-test-suite.cc
--- ns-3.35/src/mpi/test/mpi-test-suite.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/mpi/test/mpi-test-suite.cc	2022-04-30 18:23:58.090734700 -0700
@@ -25,6 +25,8 @@
 using namespace ns3;
 
 /**
+ * \ingroup mpi-tests
+ * 
  * This version of ns3::ExampleTestCase is specialized for MPI
  * by accepting the number of ranks as a parameter,
  * then building a `--command-template` string which
@@ -94,7 +96,10 @@
   return command;
 }
 
-/** MPI specialization of ns3::ExampleTestSuite. */
+/**
+ * \ingroup mpi-tests
+ * MPI specialization of ns3::ExampleTestSuite.
+ */
 class MpiTestSuite : public TestSuite
 {
 public:
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/mpi/wscript ns-3.36/src/mpi/wscript
--- ns-3.35/src/mpi/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/mpi/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,78 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-import sys
-import subprocess
-
-from waflib import Options
-from waflib.Errors import WafError
-
-def configure(conf):
-    if Options.options.enable_mpi:
-        # try to detect openmpi installation
-        mpi = conf.check_cfg(path='mpic++', args='-showme',
-                             package='', uselib_store='MPI', mandatory=False)
-        if mpi:
-            conf.env.append_value('DEFINES_MPI', 'NS3_OPENMPI')
-        else:
-            # try the MPICH2 flags
-            mpi = conf.check_cfg(path='mpic++', args='-compile-info -link-info',
-                                 package='', uselib_store='MPI', mandatory=False)
-            if mpi:
-                conf.env.append_value('DEFINES_MPI', 'NS3_MPICH')
-        if mpi:
-            conf.env.append_value('DEFINES_MPI', 'NS3_MPI')
-            conf.env['ENABLE_MPI'] = True
-            for libpath in conf.env.LIBPATH_MPI:
-                if 'mpi' in libpath:
-                    conf.env.append_value('LINKFLAGS_MPI', '-Wl,-rpath,'+libpath)
-                    # Bug #2437, using OpenMPI 1.6.5 (possibly later versions)
-                    # if upstream OpenMPI bug clears at some point, this
-                    # can be removed 
-                    # conf.env.append_value('CXXFLAGS', '-Wno-literal-suffix')
-            conf.report_optional_feature("mpi", "MPI Support", True, '')            
-        else:
-            conf.report_optional_feature("mpi", "MPI Support", False, 'mpic++ not found')
-            conf.env['MODULES_NOT_BUILT'].append('mpi')
-    else:
-        conf.report_optional_feature("mpi", "MPI Support", False, 'option --enable-mpi not selected')
-        conf.env['MODULES_NOT_BUILT'].append('mpi')
-
-
-def build(bld):
-    # Don't do anything for this module if mpi's not enabled.
-    if 'mpi' in bld.env['MODULES_NOT_BUILT']:
-        return
-
-    sim = bld.create_ns3_module('mpi', ['core', 'network'])
-    sim.source = [
-        'model/distributed-simulator-impl.cc',
-        'model/granted-time-window-mpi-interface.cc',
-        'model/mpi-receiver.cc',
-        'model/null-message-simulator-impl.cc',
-        'model/null-message-mpi-interface.cc',
-        'model/remote-channel-bundle.cc',
-        'model/remote-channel-bundle-manager.cc',
-        'model/mpi-interface.cc', 
-        ]
-
-    # MPI tests are based on examples that are run as tests, only test when examples are built.
-    if bld.env['ENABLE_EXAMPLES']:
-        module_test = bld.create_ns3_module_test_library('mpi')
-        module_test.source = [
-            'test/mpi-test-suite.cc',
-        ]
-
-    headers = bld(features='ns3header')
-    headers.module = 'mpi'
-    headers.source = [
-        'model/mpi-receiver.h',
-        'model/mpi-interface.h',
-        'model/parallel-communication-interface.h',
-        ]
-
-    if bld.env['ENABLE_MPI']:
-        sim.use.append('MPI')
-
-    if bld.env['ENABLE_EXAMPLES']:
-        bld.recurse('examples')
-      
-    bld.ns3_python_bindings()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/netanim/bindings/callbacks_list.py ns-3.36/src/netanim/bindings/callbacks_list.py
--- ns-3.35/src/netanim/bindings/callbacks_list.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/netanim/bindings/callbacks_list.py	2022-04-30 18:23:58.090734700 -0700
@@ -10,7 +10,7 @@
     ['void', 'ns3::Ptr<ns3::SpectrumSignalParameters>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<ns3::Packet>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'std::list<ns3::Ptr<ns3::LteControlMessage>, std::allocator<ns3::Ptr<ns3::LteControlMessage> > >', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'std::list<ns3::Ptr<ns3::LteControlMessage>, std::allocator<ns3::Ptr<ns3::LteControlMessage>>>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'unsigned short', 'ns3::Ptr<ns3::SpectrumValue>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::DlInfoListElement_s', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::UlInfoListElement_s', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
@@ -21,25 +21,24 @@
     ['void', 'unsigned short', 'unsigned short', 'double', 'double', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'unsigned short', 'unsigned short', 'double', 'double', 'bool', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::PhyTransmissionStatParameters', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'unsigned short', 'const std::vector<int, std::allocator<int> > &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'unsigned short', 'const std::vector<int, std::allocator<int>> &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'unsigned short', 'unsigned short', 'double', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<ns3::Packet>', 'double', 'ns3::UanTxMode', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<ns3::Packet>', 'double', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::Packet>', 'double', 'ns3::UanTxMode', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['unsigned long', 'unsigned short', 'unsigned short', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['unsigned long', 'const ns3::WifiTxVector &', 'unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['unsigned long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['bool', 'unsigned short', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Ptr<ns3::WifiPsdu>', 'ns3::RxSignalInfo', 'ns3::WifiTxVector', 'std::vector<bool, std::allocator<bool> >', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['bool', 'const ns3::WifiTxVector &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Ptr<ns3::WifiPsdu>', 'ns3::RxSignalInfo', 'ns3::WifiTxVector', 'std::vector<bool, std::allocator<bool>>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<ns3::WifiPsdu>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Time', 'ns3::Time', 'WifiPhyState', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::Packet>', 'double', 'ns3::WifiMode', 'ns3::WifiPreamble', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::Packet>', 'double', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::WifiMode', 'ns3::WifiPreamble', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >', 'ns3::WifiTxVector', 'double', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Ptr<const ns3::Packet>', 'std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu>>>>', 'ns3::WifiTxVector', 'double', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Ptr<const ns3::Packet>', 'std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int>>, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double>>>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::WifiTxVector', 'ns3::Time', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::WifiPhyRxfailureReason', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'ns3::WifiTxVector', 'ns3::MpduInfo', 'ns3::SignalNoiseDbm', 'unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/netanim/bindings/modulegen__gcc_ILP32.py ns-3.36/src/netanim/bindings/modulegen__gcc_ILP32.py
--- ns-3.35/src/netanim/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/netanim/bindings/modulegen__gcc_ILP32.py	2022-04-30 18:23:58.094734700 -0700
@@ -29,15 +29,11 @@
     ## wifi-phy-common.h (module 'wifi'): ns3::WifiPpduType [enumeration]
     module.add_enum('WifiPpduType', ['WIFI_PPDU_TYPE_SU', 'WIFI_PPDU_TYPE_DL_MU', 'WIFI_PPDU_TYPE_UL_MU'], import_from_module='ns.wifi')
     ## wifi-phy-common.h (module 'wifi'): ns3::WifiPhyRxfailureReason [enumeration]
-    module.add_enum('WifiPhyRxfailureReason', ['UNKNOWN', 'UNSUPPORTED_SETTINGS', 'CHANNEL_SWITCHING', 'RXING', 'TXING', 'SLEEPING', 'BUSY_DECODING_PREAMBLE', 'PREAMBLE_DETECT_FAILURE', 'RECEPTION_ABORTED_BY_TX', 'L_SIG_FAILURE', 'HT_SIG_FAILURE', 'SIG_A_FAILURE', 'SIG_B_FAILURE', 'PREAMBLE_DETECTION_PACKET_SWITCH', 'FRAME_CAPTURE_PACKET_SWITCH', 'OBSS_PD_CCA_RESET', 'HE_TB_PPDU_TOO_LATE', 'FILTERED'], import_from_module='ns.wifi')
+    module.add_enum('WifiPhyRxfailureReason', ['UNKNOWN', 'UNSUPPORTED_SETTINGS', 'CHANNEL_SWITCHING', 'RXING', 'TXING', 'SLEEPING', 'POWERED_OFF', 'TRUNCATED_TX', 'BUSY_DECODING_PREAMBLE', 'PREAMBLE_DETECT_FAILURE', 'RECEPTION_ABORTED_BY_TX', 'L_SIG_FAILURE', 'HT_SIG_FAILURE', 'SIG_A_FAILURE', 'SIG_B_FAILURE', 'PREAMBLE_DETECTION_PACKET_SWITCH', 'FRAME_CAPTURE_PACKET_SWITCH', 'OBSS_PD_CCA_RESET', 'HE_TB_PPDU_TOO_LATE', 'FILTERED'], import_from_module='ns.wifi')
     ## wifi-mpdu-type.h (module 'wifi'): ns3::MpduType [enumeration]
     module.add_enum('MpduType', ['NORMAL_MPDU', 'SINGLE_MPDU', 'FIRST_MPDU_IN_AGGREGATE', 'MIDDLE_MPDU_IN_AGGREGATE', 'LAST_MPDU_IN_AGGREGATE'], import_from_module='ns.wifi')
-    ## wifi-standards.h (module 'wifi'): ns3::WifiPhyStandard [enumeration]
-    module.add_enum('WifiPhyStandard', ['WIFI_PHY_STANDARD_80211a', 'WIFI_PHY_STANDARD_80211b', 'WIFI_PHY_STANDARD_80211g', 'WIFI_PHY_STANDARD_80211p', 'WIFI_PHY_STANDARD_80211n', 'WIFI_PHY_STANDARD_80211ac', 'WIFI_PHY_STANDARD_80211ax', 'WIFI_PHY_STANDARD_UNSPECIFIED'], import_from_module='ns.wifi')
-    ## wifi-standards.h (module 'wifi'): ns3::WifiMacStandard [enumeration]
-    module.add_enum('WifiMacStandard', ['WIFI_MAC_STANDARD_80211', 'WIFI_MAC_STANDARD_80211n', 'WIFI_MAC_STANDARD_80211ac', 'WIFI_MAC_STANDARD_80211ax'], import_from_module='ns.wifi')
     ## wifi-standards.h (module 'wifi'): ns3::WifiStandard [enumeration]
-    module.add_enum('WifiStandard', ['WIFI_STANDARD_80211a', 'WIFI_STANDARD_80211b', 'WIFI_STANDARD_80211g', 'WIFI_STANDARD_80211p', 'WIFI_STANDARD_80211n_2_4GHZ', 'WIFI_STANDARD_80211n_5GHZ', 'WIFI_STANDARD_80211ac', 'WIFI_STANDARD_80211ax_2_4GHZ', 'WIFI_STANDARD_80211ax_5GHZ', 'WIFI_STANDARD_80211ax_6GHZ'], import_from_module='ns.wifi')
+    module.add_enum('WifiStandard', ['WIFI_STANDARD_UNSPECIFIED', 'WIFI_STANDARD_80211a', 'WIFI_STANDARD_80211b', 'WIFI_STANDARD_80211g', 'WIFI_STANDARD_80211p', 'WIFI_STANDARD_80211n', 'WIFI_STANDARD_80211ac', 'WIFI_STANDARD_80211ax'], import_from_module='ns.wifi')
     ## wifi-standards.h (module 'wifi'): ns3::FrequencyChannelType [enumeration]
     module.add_enum('FrequencyChannelType', ['WIFI_PHY_DSSS_CHANNEL', 'WIFI_PHY_OFDM_CHANNEL', 'WIFI_PHY_80211p_CHANNEL'], import_from_module='ns.wifi')
     ## wifi-phy-band.h (module 'wifi'): ns3::WifiPhyBand [enumeration]
@@ -58,6 +54,8 @@
     module.add_enum('MaxSize_e', ['MAX_SIZE'], outer_class=root_module['ns3::Address'], import_from_module='ns.network')
     ## eps-bearer.h (module 'lte'): ns3::AllocationRetentionPriority [struct]
     module.add_class('AllocationRetentionPriority', import_from_module='ns.lte')
+    ## angles.h (module 'antenna'): ns3::Angles [class]
+    module.add_class('Angles', import_from_module='ns.antenna')
     ## animation-interface.h (module 'netanim'): ns3::AnimationInterface [class]
     module.add_class('AnimationInterface')
     ## animation-interface.h (module 'netanim'): ns3::AnimationInterface::CounterType [enumeration]
@@ -169,6 +167,8 @@
     module.add_class('EutranMeasurementMapping', import_from_module='ns.lte')
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'], import_from_module='ns.core')
     ## ff-mac-sched-sap.h (module 'lte'): ns3::FfMacSchedSapProvider [class]
     module.add_class('FfMacSchedSapProvider', allow_subclassing=True, import_from_module='ns.lte')
     ## ff-mac-sched-sap.h (module 'lte'): ns3::FfMacSchedSapProvider::SchedDlCqiInfoReqParameters [struct]
@@ -338,10 +338,12 @@
     module.add_class('MeasResultBestNeighCell', import_from_module='ns.lte', outer_class=root_module['ns3::LteRrcSap'])
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultEutra [struct]
     module.add_class('MeasResultEutra', import_from_module='ns.lte', outer_class=root_module['ns3::LteRrcSap'])
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultScell [struct]
-    module.add_class('MeasResultScell', import_from_module='ns.lte', outer_class=root_module['ns3::LteRrcSap'])
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultServFreqList [struct]
-    module.add_class('MeasResultServFreqList', import_from_module='ns.lte', outer_class=root_module['ns3::LteRrcSap'])
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultPCell [struct]
+    module.add_class('MeasResultPCell', import_from_module='ns.lte', outer_class=root_module['ns3::LteRrcSap'])
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultSCell [struct]
+    module.add_class('MeasResultSCell', import_from_module='ns.lte', outer_class=root_module['ns3::LteRrcSap'])
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultServFreq [struct]
+    module.add_class('MeasResultServFreq', import_from_module='ns.lte', outer_class=root_module['ns3::LteRrcSap'])
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResults [struct]
     module.add_class('MeasResults', import_from_module='ns.lte', outer_class=root_module['ns3::LteRrcSap'])
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasurementReport [struct]
@@ -681,32 +683,27 @@
     typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::ConstellationSizeCallback')
     typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::ConstellationSizeCallback*')
     typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::ConstellationSizeCallback&')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::PhyRateCallback')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::PhyRateCallback*')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::PhyRateCallback&')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::PhyRateFromTxVectorCallback')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::PhyRateFromTxVectorCallback*')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::PhyRateFromTxVectorCallback&')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::DataRateCallback')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::DataRateCallback*')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::DataRateCallback&')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::DataRateFromTxVectorCallback')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::DataRateFromTxVectorCallback*')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::DataRateFromTxVectorCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::PhyRateCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::PhyRateCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::PhyRateCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::DataRateCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::DataRateCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::DataRateCallback&')
     typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::NonHtReferenceRateCallback')
     typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::NonHtReferenceRateCallback*')
     typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::NonHtReferenceRateCallback&')
-    typehandlers.add_type_alias('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::ModeAllowedCallback')
-    typehandlers.add_type_alias('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::ModeAllowedCallback*')
-    typehandlers.add_type_alias('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::ModeAllowedCallback&')
+    typehandlers.add_type_alias('ns3::Callback< bool, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::AllowedCallback')
+    typehandlers.add_type_alias('ns3::Callback< bool, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::AllowedCallback*')
+    typehandlers.add_type_alias('ns3::Callback< bool, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::AllowedCallback&')
     ## wifi-phy-operating-channel.h (module 'wifi'): ns3::WifiPhyOperatingChannel [class]
     module.add_class('WifiPhyOperatingChannel', import_from_module='ns.wifi')
+    typehandlers.add_type_alias('std::set< std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand > > const_iterator', 'ns3::WifiPhyOperatingChannel::ConstIterator')
+    typehandlers.add_type_alias('std::set< std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand > > const_iterator*', 'ns3::WifiPhyOperatingChannel::ConstIterator*')
+    typehandlers.add_type_alias('std::set< std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand > > const_iterator&', 'ns3::WifiPhyOperatingChannel::ConstIterator&')
     ## wifi-spectrum-value-helper.h (module 'spectrum'): ns3::WifiSpectrumValue5MhzFactory [class]
     module.add_class('WifiSpectrumValue5MhzFactory', allow_subclassing=True, import_from_module='ns.spectrum')
     ## wifi-spectrum-value-helper.h (module 'spectrum'): ns3::WifiSpectrumValueHelper [class]
     module.add_class('WifiSpectrumValueHelper', import_from_module='ns.spectrum')
-    ## wifi-standards.h (module 'wifi'): ns3::WifiStandardInfo [struct]
-    module.add_class('WifiStandardInfo', import_from_module='ns.wifi')
     ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector [class]
     module.add_class('WifiTxVector', import_from_module='ns.wifi')
     typehandlers.add_type_alias('std::map< unsigned short, ns3::HeMuUserInfo >', 'ns3::WifiTxVector::HeMuUserInfoMap')
@@ -753,6 +750,13 @@
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::PacketBurst const > )', 'ns3::PacketBurst::TracedCallback')
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::PacketBurst const > )*', 'ns3::PacketBurst::TracedCallback*')
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::PacketBurst const > )&', 'ns3::PacketBurst::TracedCallback&')
+    ## phased-array-model.h (module 'antenna'): ns3::PhasedArrayModel [class]
+    module.add_class('PhasedArrayModel', import_from_module='ns.antenna', parent=root_module['ns3::Object'])
+    typehandlers.add_type_alias('std::vector< std::complex< double > >', 'ns3::PhasedArrayModel::ComplexVector')
+    typehandlers.add_type_alias('std::vector< std::complex< double > >*', 'ns3::PhasedArrayModel::ComplexVector*')
+    typehandlers.add_type_alias('std::vector< std::complex< double > >&', 'ns3::PhasedArrayModel::ComplexVector&')
+    ## phased-array-spectrum-propagation-loss-model.h (module 'spectrum'): ns3::PhasedArraySpectrumPropagationLossModel [class]
+    module.add_class('PhasedArraySpectrumPropagationLossModel', import_from_module='ns.spectrum', parent=root_module['ns3::Object'])
     ## propagation-delay-model.h (module 'propagation'): ns3::PropagationDelayModel [class]
     module.add_class('PropagationDelayModel', import_from_module='ns.propagation', parent=root_module['ns3::Object'])
     ## propagation-loss-model.h (module 'propagation'): ns3::PropagationLossModel [class]
@@ -767,47 +771,47 @@
     module.add_class('RangePropagationLossModel', import_from_module='ns.propagation', parent=root_module['ns3::PropagationLossModel'])
     ## random-variable-stream.h (module 'core'): ns3::SequentialRandomVariable [class]
     module.add_class('SequentialRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Event, ns3::empty, ns3::DefaultDeleter<ns3::Event> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Event, ns3::empty, ns3::DefaultDeleter<ns3::Event>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Event', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Event>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv4MulticastRoute', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv4Route', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv4Route>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LteControlMessage, ns3::empty, ns3::DefaultDeleter<ns3::LteControlMessage> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LteControlMessage, ns3::empty, ns3::DefaultDeleter<ns3::LteControlMessage>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::LteControlMessage', 'ns3::empty', 'ns3::DefaultDeleter<ns3::LteControlMessage>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LteHarqPhy, ns3::empty, ns3::DefaultDeleter<ns3::LteHarqPhy> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LteHarqPhy, ns3::empty, ns3::DefaultDeleter<ns3::LteHarqPhy>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::LteHarqPhy', 'ns3::empty', 'ns3::DefaultDeleter<ns3::LteHarqPhy>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::OutputStreamWrapper', 'ns3::empty', 'ns3::DefaultDeleter<ns3::OutputStreamWrapper>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::PhyEntity', 'ns3::empty', 'ns3::DefaultDeleter<ns3::PhyEntity>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::SpectrumModel', 'ns3::empty', 'ns3::DefaultDeleter<ns3::SpectrumModel>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::SpectrumSignalParameters', 'ns3::empty', 'ns3::DefaultDeleter<ns3::SpectrumSignalParameters>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::SpectrumValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::SpectrumValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::VendorSpecificValue, ns3::empty, ns3::DefaultDeleter<ns3::VendorSpecificValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::VendorSpecificValue, ns3::empty, ns3::DefaultDeleter<ns3::VendorSpecificValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::VendorSpecificValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::VendorSpecificValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiPpdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPpdu> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiPpdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPpdu>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::WifiPpdu', 'ns3::empty', 'ns3::DefaultDeleter<ns3::WifiPpdu>'])
     ## socket.h (module 'network'): ns3::Socket [class]
     module.add_class('Socket', import_from_module='ns.network', parent=root_module['ns3::Object'])
@@ -928,6 +932,9 @@
     typehandlers.add_type_alias('void ( * ) ( ns3::WifiTxVector, ns3::Time )', 'ns3::WifiPhy::PhyRxPayloadBeginTracedCallback')
     typehandlers.add_type_alias('void ( * ) ( ns3::WifiTxVector, ns3::Time )*', 'ns3::WifiPhy::PhyRxPayloadBeginTracedCallback*')
     typehandlers.add_type_alias('void ( * ) ( ns3::WifiTxVector, ns3::Time )&', 'ns3::WifiPhy::PhyRxPayloadBeginTracedCallback&')
+    typehandlers.add_type_alias('std::tuple< unsigned char, unsigned short, int, unsigned char >', 'ns3::WifiPhy::ChannelTuple')
+    typehandlers.add_type_alias('std::tuple< unsigned char, unsigned short, int, unsigned char >*', 'ns3::WifiPhy::ChannelTuple*')
+    typehandlers.add_type_alias('std::tuple< unsigned char, unsigned short, int, unsigned char >&', 'ns3::WifiPhy::ChannelTuple&')
     ## wifi-phy-state-helper.h (module 'wifi'): ns3::WifiPhyStateHelper [class]
     module.add_class('WifiPhyStateHelper', import_from_module='ns.wifi', parent=root_module['ns3::Object'])
     typehandlers.add_type_alias('void ( * ) ( ns3::Time, ns3::Time, WifiPhyState )', 'ns3::WifiPhyStateHelper::StateTracedCallback')
@@ -948,6 +955,8 @@
     module.add_class('ZetaRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
     ## random-variable-stream.h (module 'core'): ns3::ZipfRandomVariable [class]
     module.add_class('ZipfRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
+    ## antenna-model.h (module 'antenna'): ns3::AntennaModel [class]
+    module.add_class('AntennaModel', import_from_module='ns.antenna', parent=root_module['ns3::Object'])
     ## attribute.h (module 'core'): ns3::AttributeAccessor [class]
     module.add_class('AttributeAccessor', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >'])
     ## attribute.h (module 'core'): ns3::AttributeChecker [class]
@@ -1261,18 +1270,16 @@
     module.add_class('BsrLteControlMessage', import_from_module='ns.lte', parent=root_module['ns3::LteControlMessage'])
     ## error-model.h (module 'network'): ns3::BurstErrorModel [class]
     module.add_class('BurstErrorModel', import_from_module='ns.network', parent=root_module['ns3::ErrorModel'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['bool', 'const ns3::WifiTxVector &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['bool', 'ns3::Ptr<ns3::Socket>', 'const ns3::Address &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['bool', 'unsigned short', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['ns3::ObjectBase *', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned long long', 'const ns3::WifiTxVector &', 'unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned long long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned long long', 'unsigned short', 'unsigned short', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, const ns3::Ipv4Header &, ns3::Ptr<const ns3::Packet>, ns3::Ipv4L3Protocol::DropReason, ns3::Ptr<ns3::Ipv4>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
@@ -1303,8 +1310,8 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::WifiPhyRxfailureReason', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<const ns3::Packet>', 'std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int>>, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double>>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<const ns3::Packet>', 'std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int>>, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double>>>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, ns3::SignalNoiseDbm, unsigned short, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'ns3::WifiTxVector', 'ns3::MpduInfo', 'ns3::SignalNoiseDbm', 'unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
@@ -1329,8 +1336,8 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::Socket>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::SpectrumSignalParameters>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::SpectrumSignalParameters>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::WifiPsdu>', 'ns3::RxSignalInfo', 'ns3::WifiTxVector', 'std::vector<bool, std::allocator<bool> >', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::WifiPsdu>', 'ns3::RxSignalInfo', 'ns3::WifiTxVector', 'std::vector<bool, std::allocator<bool>>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::WifiPsdu>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::Time, WifiPhyState, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
@@ -1339,10 +1346,10 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::WifiTxVector', 'ns3::Time', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >', 'ns3::WifiTxVector', 'double', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned short, const std::vector<int, std::allocator<int> > &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned short', 'const std::vector<int, std::allocator<int> > &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu>>>>, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu>>>>', 'ns3::WifiTxVector', 'double', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned short, const std::vector<int, std::allocator<int>> &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned short', 'const std::vector<int, std::allocator<int>> &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned short, ns3::Ptr<ns3::SpectrumValue>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned short', 'ns3::Ptr<ns3::SpectrumValue>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned short, unsigned short, double, double, bool, unsigned char, ns3::empty, ns3::empty, ns3::empty> [class]
@@ -1375,6 +1382,7 @@
     module.add_class('LteUeNetDevice', import_from_module='ns.lte', parent=root_module['ns3::LteNetDevice'])
     ## lte-enb-net-device.h (module 'lte'): ns3::LteEnbNetDevice [class]
     module.add_class('LteEnbNetDevice', import_from_module='ns.lte', parent=root_module['ns3::LteNetDevice'])
+    module.add_container('std::vector< double >', 'double', container_type='vector')
     module.add_container('std::vector< ns3::CeBitmap_e >', 'ns3::CeBitmap_e', container_type='vector')
     module.add_container('std::vector< std::vector< ns3::RlcPduListElement_s > >', 'std::vector< ns3::RlcPduListElement_s >', container_type='vector')
     module.add_container('std::vector< unsigned char >', 'unsigned char', container_type='vector')
@@ -1398,7 +1406,7 @@
     module.add_container('ns3::HeRu::SubcarrierGroup', 'std::pair< short, short >', container_type='vector')
     module.add_container('std::map< std::pair< unsigned char, ns3::HeRu::RuType >, std::vector< std::vector< std::pair< short, short > > > >', ('std::pair< unsigned char, ns3::HeRu::RuType >', 'std::vector< std::vector< std::pair< short, short > > >'), container_type='map')
     module.add_container('std::map< std::pair< unsigned int, unsigned int >, double >', ('std::pair< unsigned int, unsigned int >', 'double'), container_type='map')
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     module.add_container('std::list< ns3::LteRrcSap::SrbToAddMod >', 'ns3::LteRrcSap::SrbToAddMod', container_type='list')
     module.add_container('std::list< ns3::LteRrcSap::DrbToAddMod >', 'ns3::LteRrcSap::DrbToAddMod', container_type='list')
     module.add_container('std::list< unsigned char >', 'unsigned char', container_type='list')
@@ -1408,25 +1416,24 @@
     module.add_container('std::list< ns3::LteRrcSap::ReportConfigToAddMod >', 'ns3::LteRrcSap::ReportConfigToAddMod', container_type='list')
     module.add_container('std::list< ns3::LteRrcSap::MeasIdToAddMod >', 'ns3::LteRrcSap::MeasIdToAddMod', container_type='list')
     module.add_container('std::list< unsigned int >', 'unsigned int', container_type='list')
-    module.add_container('std::list< ns3::LteRrcSap::MeasResultScell >', 'ns3::LteRrcSap::MeasResultScell', container_type='list')
-    module.add_container('std::list< ns3::LteRrcSap::MeasResultBestNeighCell >', 'ns3::LteRrcSap::MeasResultBestNeighCell', container_type='list')
     module.add_container('std::list< ns3::LteRrcSap::MeasResultEutra >', 'ns3::LteRrcSap::MeasResultEutra', container_type='list')
+    module.add_container('std::list< ns3::LteRrcSap::MeasResultServFreq >', 'ns3::LteRrcSap::MeasResultServFreq', container_type='list')
     module.add_container('std::list< ns3::LteRrcSap::SCellToAddMod >', 'ns3::LteRrcSap::SCellToAddMod', container_type='list')
     module.add_container('std::vector< ns3::LteUeCphySapUser::UeMeasurementsElement >', 'ns3::LteUeCphySapUser::UeMeasurementsElement', container_type='vector')
     module.add_container('std::vector< ns3::HigherLayerSelected_s >', 'ns3::HigherLayerSelected_s', container_type='vector')
     module.add_container('std::vector< ns3::SiMessageListElement_s >', 'ns3::SiMessageListElement_s', container_type='vector')
     module.add_container('std::vector< ns3::Tap >', 'ns3::Tap', container_type='vector')
     module.add_container('std::vector< std::complex< double > >', 'std::complex< double >', container_type='vector')
-    module.add_container('std::vector< double >', 'double', container_type='vector')
+    module.add_container('std::set< std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand > >', 'std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand >', container_type='set')
     module.add_container('std::vector< std::pair< unsigned int, unsigned int > >', 'std::pair< unsigned int, unsigned int >', container_type='vector')
     module.add_container('std::map< unsigned short, ns3::HeMuUserInfo >', ('short unsigned int', 'ns3::HeMuUserInfo'), container_type='map')
     module.add_container('std::vector< int >', 'int', container_type='vector')
     module.add_container('std::list< ns3::Ptr< ns3::Packet > >', 'ns3::Ptr< ns3::Packet >', container_type='list')
+    module.add_container('ns3::PhasedArrayModel::ComplexVector', 'std::complex< double >', container_type='vector')
     module.add_container('std::vector< ns3::Ipv6Address >', 'ns3::Ipv6Address', container_type='vector')
     module.add_container('std::vector< ns3::BandInfo >', 'ns3::BandInfo', container_type='vector')
     module.add_container('std::list< ns3::UanPacketArrival >', 'ns3::UanPacketArrival', container_type='list')
     module.add_container('std::list< ns3::Ptr< ns3::UanPhy > >', 'ns3::Ptr< ns3::UanPhy >', container_type='list')
-    module.add_container('std::set< std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand > >', 'std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand >', container_type='set')
     module.add_container('ns3::WifiConstPsduMap', ('short unsigned int', 'ns3::Ptr< ns3::WifiPsdu const >'), container_type='map')
     module.add_container('std::list< ns3::WifiMode >', 'ns3::WifiMode', container_type='list')
     module.add_container('std::vector< bool >', 'bool', container_type='vector')
@@ -1575,7 +1582,7 @@
     typehandlers.add_type_alias('std::vector< ns3::Ptr< ns3::Object > > const_iterator*', 'ns3::Config::MatchContainer::Iterator*')
     typehandlers.add_type_alias('std::vector< ns3::Ptr< ns3::Object > > const_iterator&', 'ns3::Config::MatchContainer::Iterator&')
     module.add_container('std::vector< ns3::Ptr< ns3::Object > >', 'ns3::Ptr< ns3::Object >', container_type='vector')
-    module.add_container('std::vector< std::string >', 'std::string', container_type='vector')
+    module.add_container('std::vector< std::string >', 'std::basic_string< char, std::char_traits< char >, std::allocator< char > >', container_type='vector')
 
 def register_types_ns3_FatalImpl(module):
     root_module = module.get_root()
@@ -1628,6 +1635,7 @@
 def register_methods(root_module):
     register_Ns3Address_methods(root_module, root_module['ns3::Address'])
     register_Ns3AllocationRetentionPriority_methods(root_module, root_module['ns3::AllocationRetentionPriority'])
+    register_Ns3Angles_methods(root_module, root_module['ns3::Angles'])
     register_Ns3AnimationInterface_methods(root_module, root_module['ns3::AnimationInterface'])
     register_Ns3AttributeConstructionList_methods(root_module, root_module['ns3::AttributeConstructionList'])
     register_Ns3AttributeConstructionListItem_methods(root_module, root_module['ns3::AttributeConstructionList::Item'])
@@ -1738,8 +1746,9 @@
     register_Ns3LteRrcSapMeasObjectToAddMod_methods(root_module, root_module['ns3::LteRrcSap::MeasObjectToAddMod'])
     register_Ns3LteRrcSapMeasResultBestNeighCell_methods(root_module, root_module['ns3::LteRrcSap::MeasResultBestNeighCell'])
     register_Ns3LteRrcSapMeasResultEutra_methods(root_module, root_module['ns3::LteRrcSap::MeasResultEutra'])
-    register_Ns3LteRrcSapMeasResultScell_methods(root_module, root_module['ns3::LteRrcSap::MeasResultScell'])
-    register_Ns3LteRrcSapMeasResultServFreqList_methods(root_module, root_module['ns3::LteRrcSap::MeasResultServFreqList'])
+    register_Ns3LteRrcSapMeasResultPCell_methods(root_module, root_module['ns3::LteRrcSap::MeasResultPCell'])
+    register_Ns3LteRrcSapMeasResultSCell_methods(root_module, root_module['ns3::LteRrcSap::MeasResultSCell'])
+    register_Ns3LteRrcSapMeasResultServFreq_methods(root_module, root_module['ns3::LteRrcSap::MeasResultServFreq'])
     register_Ns3LteRrcSapMeasResults_methods(root_module, root_module['ns3::LteRrcSap::MeasResults'])
     register_Ns3LteRrcSapMeasurementReport_methods(root_module, root_module['ns3::LteRrcSap::MeasurementReport'])
     register_Ns3LteRrcSapMobilityControlInfo_methods(root_module, root_module['ns3::LteRrcSap::MobilityControlInfo'])
@@ -1870,7 +1879,6 @@
     register_Ns3WifiPhyOperatingChannel_methods(root_module, root_module['ns3::WifiPhyOperatingChannel'])
     register_Ns3WifiSpectrumValue5MhzFactory_methods(root_module, root_module['ns3::WifiSpectrumValue5MhzFactory'])
     register_Ns3WifiSpectrumValueHelper_methods(root_module, root_module['ns3::WifiSpectrumValueHelper'])
-    register_Ns3WifiStandardInfo_methods(root_module, root_module['ns3::WifiStandardInfo'])
     register_Ns3WifiTxVector_methods(root_module, root_module['ns3::WifiTxVector'])
     register_Ns3Empty_methods(root_module, root_module['ns3::empty'])
     register_Ns3Int64x64_t_methods(root_module, root_module['ns3::int64x64_t'])
@@ -1887,6 +1895,8 @@
     register_Ns3Object_methods(root_module, root_module['ns3::Object'])
     register_Ns3ObjectAggregateIterator_methods(root_module, root_module['ns3::Object::AggregateIterator'])
     register_Ns3PacketBurst_methods(root_module, root_module['ns3::PacketBurst'])
+    register_Ns3PhasedArrayModel_methods(root_module, root_module['ns3::PhasedArrayModel'])
+    register_Ns3PhasedArraySpectrumPropagationLossModel_methods(root_module, root_module['ns3::PhasedArraySpectrumPropagationLossModel'])
     register_Ns3PropagationDelayModel_methods(root_module, root_module['ns3::PropagationDelayModel'])
     register_Ns3PropagationLossModel_methods(root_module, root_module['ns3::PropagationLossModel'])
     register_Ns3RandomPropagationDelayModel_methods(root_module, root_module['ns3::RandomPropagationDelayModel'])
@@ -1953,6 +1963,7 @@
     register_Ns3WifiPpdu_methods(root_module, root_module['ns3::WifiPpdu'])
     register_Ns3ZetaRandomVariable_methods(root_module, root_module['ns3::ZetaRandomVariable'])
     register_Ns3ZipfRandomVariable_methods(root_module, root_module['ns3::ZipfRandomVariable'])
+    register_Ns3AntennaModel_methods(root_module, root_module['ns3::AntennaModel'])
     register_Ns3AttributeAccessor_methods(root_module, root_module['ns3::AttributeAccessor'])
     register_Ns3AttributeChecker_methods(root_module, root_module['ns3::AttributeChecker'])
     register_Ns3AttributeValue_methods(root_module, root_module['ns3::AttributeValue'])
@@ -2055,12 +2066,11 @@
     register_Ns3BinaryErrorModel_methods(root_module, root_module['ns3::BinaryErrorModel'])
     register_Ns3BsrLteControlMessage_methods(root_module, root_module['ns3::BsrLteControlMessage'])
     register_Ns3BurstErrorModel_methods(root_module, root_module['ns3::BurstErrorModel'])
+    register_Ns3CallbackImpl__Bool_Const_ns3WifiTxVector___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Bool_Ns3Ptr__lt__ns3Socket__gt___Const_ns3Address___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3CallbackImpl__Bool_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Ns3ObjectBase___star___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Unsigned_long_Const_ns3WifiTxVector___amp___Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned long long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3CallbackImpl__Unsigned_long_Unsigned_short_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Const_ns3Ipv4Header___amp___Ns3Ptr__lt__const_ns3Packet__gt___Ns3Ipv4L3ProtocolDropReason_Ns3Ptr__lt__ns3Ipv4__gt___Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, const ns3::Ipv4Header &, ns3::Ptr<const ns3::Packet>, ns3::Ipv4L3Protocol::DropReason, ns3::Ptr<ns3::Ipv4>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Const_ns3Ipv4Header___amp___Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, const ns3::Ipv4Header &, ns3::Ptr<const ns3::Packet>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
@@ -2076,7 +2086,7 @@
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Ns3WifiMode_Ns3WifiPreamble_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::Packet>, ns3::WifiMode, ns3::WifiPreamble, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Ns3WifiPhyRxfailureReason_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::Packet>, ns3::WifiPhyRxfailureReason, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::Packet>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___StdMap__lt__stdPair__lt__unsigned_int__unsigned_int__gt____double__stdLess__lt__stdPair__lt__unsigned_int__unsigned_int__gt_____gt____stdAllocator__lt__stdPair__lt__const_stdPair__lt__unsigned_int__unsigned_int__gt____double__gt_____gt_____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___StdMap__lt__stdPair__lt__unsigned_int__unsigned_int__gt____double__stdLess__lt__stdPair__lt__unsigned_int__unsigned_int__gt____gt____stdAllocator__lt__stdPair__lt__const_stdPair__lt__unsigned_int__unsigned_int__gt____double__gt____gt____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int>>, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double>>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_short_Ns3WifiTxVector_Ns3MpduInfo_Ns3SignalNoiseDbm_Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, ns3::SignalNoiseDbm, unsigned short, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_short_Ns3WifiTxVector_Ns3MpduInfo_Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3PacketBurst__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::PacketBurst>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
@@ -2089,13 +2099,13 @@
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3Socket__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3Socket__gt___Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::Socket>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3SpectrumSignalParameters__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::SpectrumSignalParameters>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiPsdu__gt___Ns3RxSignalInfo_Ns3WifiTxVector_StdVector__lt__bool__stdAllocator__lt__bool__gt_____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiPsdu__gt___Ns3RxSignalInfo_Ns3WifiTxVector_StdVector__lt__bool__stdAllocator__lt__bool__gt____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiPsdu__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::WifiPsdu>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Time_Ns3Time_WifiPhyState_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Time, ns3::Time, WifiPhyState, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3WifiTxVector_Ns3Time_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::WifiTxVector, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3CallbackImpl__Void_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__const_ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__const_ns3WifiPsdu__gt_____gt_____gt_____gt___Ns3WifiTxVector_Double_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3CallbackImpl__Void_Unsigned_short_Const_stdVector__lt__int__stdAllocator__lt__int__gt_____gt_____amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned short, const std::vector<int, std::allocator<int> > &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__const_ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__const_ns3WifiPsdu__gt____gt____gt____gt___Ns3WifiTxVector_Double_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu>>>>, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Unsigned_short_Const_stdVector__lt__int__stdAllocator__lt__int__gt____gt_____amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned short, const std::vector<int, std::allocator<int>> &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Unsigned_short_Ns3Ptr__lt__ns3SpectrumValue__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned short, ns3::Ptr<ns3::SpectrumValue>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Unsigned_short_Unsigned_short_Double_Double_Bool_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned short, unsigned short, double, double, bool, unsigned char, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Unsigned_short_Unsigned_short_Double_Double_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned short, unsigned short, double, double, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
@@ -2200,6 +2210,38 @@
     cls.add_instance_attribute('priorityLevel', 'uint8_t', is_const=False)
     return
 
+def register_Ns3Angles_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## angles.h (module 'antenna'): ns3::Angles::Angles(ns3::Angles const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Angles const &', 'arg0')])
+    ## angles.h (module 'antenna'): ns3::Angles::Angles(double azimuth, double inclination) [constructor]
+    cls.add_constructor([param('double', 'azimuth'), param('double', 'inclination')])
+    ## angles.h (module 'antenna'): ns3::Angles::Angles(ns3::Vector v) [constructor]
+    cls.add_constructor([param('ns3::Vector', 'v')])
+    ## angles.h (module 'antenna'): ns3::Angles::Angles(ns3::Vector v, ns3::Vector o) [constructor]
+    cls.add_constructor([param('ns3::Vector', 'v'), param('ns3::Vector', 'o')])
+    ## angles.h (module 'antenna'): double ns3::Angles::GetAzimuth() const [member function]
+    cls.add_method('GetAzimuth', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## angles.h (module 'antenna'): double ns3::Angles::GetInclination() const [member function]
+    cls.add_method('GetInclination', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## angles.h (module 'antenna'): void ns3::Angles::SetAzimuth(double azimuth) [member function]
+    cls.add_method('SetAzimuth', 
+                   'void', 
+                   [param('double', 'azimuth')])
+    ## angles.h (module 'antenna'): void ns3::Angles::SetInclination(double inclination) [member function]
+    cls.add_method('SetInclination', 
+                   'void', 
+                   [param('double', 'inclination')])
+    ## angles.h (module 'antenna'): ns3::Angles::m_printDeg [variable]
+    cls.add_static_attribute('m_printDeg', 'bool', is_const=False)
+    return
+
 def register_Ns3AnimationInterface_methods(root_module, cls):
     ## animation-interface.h (module 'netanim'): ns3::AnimationInterface::AnimationInterface(ns3::AnimationInterface const & arg0) [constructor]
     cls.add_constructor([param('ns3::AnimationInterface const &', 'arg0')])
@@ -3687,6 +3729,8 @@
     return
 
 def register_Ns3HeMuUserInfo_methods(root_module, cls):
+    cls.add_binary_comparison_operator('==')
+    cls.add_binary_comparison_operator('!=')
     ## wifi-tx-vector.h (module 'wifi'): ns3::HeMuUserInfo::HeMuUserInfo() [constructor]
     cls.add_constructor([])
     ## wifi-tx-vector.h (module 'wifi'): ns3::HeMuUserInfo::HeMuUserInfo(ns3::HeMuUserInfo const & arg0) [constructor]
@@ -3704,7 +3748,7 @@
     cls.add_constructor([])
     ## he-ru.h (module 'wifi'): ns3::HeRu::HeRu(ns3::HeRu const & arg0) [constructor]
     cls.add_constructor([param('ns3::HeRu const &', 'arg0')])
-    ## he-ru.h (module 'wifi'): static bool ns3::HeRu::DoesOverlap(uint16_t bw, ns3::HeRu::RuSpec ru, std::vector<ns3::HeRu::RuSpec, std::allocator<ns3::HeRu::RuSpec> > const & v) [member function]
+    ## he-ru.h (module 'wifi'): static bool ns3::HeRu::DoesOverlap(uint16_t bw, ns3::HeRu::RuSpec ru, std::vector<ns3::HeRu::RuSpec, std::allocator<ns3::HeRu::RuSpec>> const & v) [member function]
     cls.add_method('DoesOverlap', 
                    'bool', 
                    [param('uint16_t', 'bw'), param('ns3::HeRu::RuSpec', 'ru'), param('std::vector< ns3::HeRu::RuSpec > const &', 'v')], 
@@ -3724,7 +3768,7 @@
                    'uint16_t', 
                    [param('ns3::HeRu::RuType', 'ruType')], 
                    is_static=True)
-    ## he-ru.h (module 'wifi'): static std::vector<ns3::HeRu::RuSpec, std::allocator<ns3::HeRu::RuSpec> > ns3::HeRu::GetCentral26TonesRus(uint16_t bw, ns3::HeRu::RuType ruType) [member function]
+    ## he-ru.h (module 'wifi'): static std::vector<ns3::HeRu::RuSpec, std::allocator<ns3::HeRu::RuSpec>> ns3::HeRu::GetCentral26TonesRus(uint16_t bw, ns3::HeRu::RuType ruType) [member function]
     cls.add_method('GetCentral26TonesRus', 
                    'std::vector< ns3::HeRu::RuSpec >', 
                    [param('uint16_t', 'bw'), param('ns3::HeRu::RuType', 'ruType')], 
@@ -3744,7 +3788,7 @@
                    'ns3::HeRu::RuType', 
                    [param('uint16_t', 'bandwidth')], 
                    is_static=True)
-    ## he-ru.h (module 'wifi'): static std::vector<ns3::HeRu::RuSpec, std::allocator<ns3::HeRu::RuSpec> > ns3::HeRu::GetRusOfType(uint16_t bw, ns3::HeRu::RuType ruType) [member function]
+    ## he-ru.h (module 'wifi'): static std::vector<ns3::HeRu::RuSpec, std::allocator<ns3::HeRu::RuSpec>> ns3::HeRu::GetRusOfType(uint16_t bw, ns3::HeRu::RuType ruType) [member function]
     cls.add_method('GetRusOfType', 
                    'std::vector< ns3::HeRu::RuSpec >', 
                    [param('uint16_t', 'bw'), param('ns3::HeRu::RuType', 'ruType')], 
@@ -3760,6 +3804,8 @@
 
 def register_Ns3HeRuRuSpec_methods(root_module, cls):
     cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('!=')
+    cls.add_binary_comparison_operator('==')
     ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec::RuSpec(ns3::HeRu::RuSpec const & arg0) [constructor]
     cls.add_constructor([param('ns3::HeRu::RuSpec const &', 'arg0')])
     ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec::RuSpec() [constructor]
@@ -5152,18 +5198,12 @@
     cls.add_constructor([])
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultBestNeighCell::MeasResultBestNeighCell(ns3::LteRrcSap::MeasResultBestNeighCell const & arg0) [constructor]
     cls.add_constructor([param('ns3::LteRrcSap::MeasResultBestNeighCell const &', 'arg0')])
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultBestNeighCell::haveRsrpResult [variable]
-    cls.add_instance_attribute('haveRsrpResult', 'bool', is_const=False)
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultBestNeighCell::haveRsrqResult [variable]
-    cls.add_instance_attribute('haveRsrqResult', 'bool', is_const=False)
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultBestNeighCell::physCellId [variable]
     cls.add_instance_attribute('physCellId', 'uint16_t', is_const=False)
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultBestNeighCell::rsrpResult [variable]
     cls.add_instance_attribute('rsrpResult', 'uint8_t', is_const=False)
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultBestNeighCell::rsrqResult [variable]
     cls.add_instance_attribute('rsrqResult', 'uint8_t', is_const=False)
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultBestNeighCell::servFreqId [variable]
-    cls.add_instance_attribute('servFreqId', 'uint16_t', is_const=False)
     return
 
 def register_Ns3LteRrcSapMeasResultEutra_methods(root_module, cls):
@@ -5187,36 +5227,43 @@
     cls.add_instance_attribute('rsrqResult', 'uint8_t', is_const=False)
     return
 
-def register_Ns3LteRrcSapMeasResultScell_methods(root_module, cls):
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultScell::MeasResultScell() [constructor]
+def register_Ns3LteRrcSapMeasResultPCell_methods(root_module, cls):
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultPCell::MeasResultPCell() [constructor]
     cls.add_constructor([])
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultScell::MeasResultScell(ns3::LteRrcSap::MeasResultScell const & arg0) [constructor]
-    cls.add_constructor([param('ns3::LteRrcSap::MeasResultScell const &', 'arg0')])
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultScell::haveRsrpResult [variable]
-    cls.add_instance_attribute('haveRsrpResult', 'bool', is_const=False)
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultScell::haveRsrqResult [variable]
-    cls.add_instance_attribute('haveRsrqResult', 'bool', is_const=False)
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultScell::rsrpResult [variable]
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultPCell::MeasResultPCell(ns3::LteRrcSap::MeasResultPCell const & arg0) [constructor]
+    cls.add_constructor([param('ns3::LteRrcSap::MeasResultPCell const &', 'arg0')])
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultPCell::rsrpResult [variable]
     cls.add_instance_attribute('rsrpResult', 'uint8_t', is_const=False)
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultScell::rsrqResult [variable]
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultPCell::rsrqResult [variable]
+    cls.add_instance_attribute('rsrqResult', 'uint8_t', is_const=False)
+    return
+
+def register_Ns3LteRrcSapMeasResultSCell_methods(root_module, cls):
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultSCell::MeasResultSCell() [constructor]
+    cls.add_constructor([])
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultSCell::MeasResultSCell(ns3::LteRrcSap::MeasResultSCell const & arg0) [constructor]
+    cls.add_constructor([param('ns3::LteRrcSap::MeasResultSCell const &', 'arg0')])
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultSCell::rsrpResult [variable]
+    cls.add_instance_attribute('rsrpResult', 'uint8_t', is_const=False)
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultSCell::rsrqResult [variable]
     cls.add_instance_attribute('rsrqResult', 'uint8_t', is_const=False)
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultScell::servFreqId [variable]
-    cls.add_instance_attribute('servFreqId', 'uint16_t', is_const=False)
     return
 
-def register_Ns3LteRrcSapMeasResultServFreqList_methods(root_module, cls):
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultServFreqList::MeasResultServFreqList() [constructor]
+def register_Ns3LteRrcSapMeasResultServFreq_methods(root_module, cls):
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultServFreq::MeasResultServFreq() [constructor]
     cls.add_constructor([])
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultServFreqList::MeasResultServFreqList(ns3::LteRrcSap::MeasResultServFreqList const & arg0) [constructor]
-    cls.add_constructor([param('ns3::LteRrcSap::MeasResultServFreqList const &', 'arg0')])
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultServFreqList::haveMeasurementResultsNeighCell [variable]
-    cls.add_instance_attribute('haveMeasurementResultsNeighCell', 'bool', is_const=False)
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultServFreqList::haveMeasurementResultsServingSCells [variable]
-    cls.add_instance_attribute('haveMeasurementResultsServingSCells', 'bool', is_const=False)
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultServFreqList::measResultBestNeighCell [variable]
-    cls.add_instance_attribute('measResultBestNeighCell', 'std::list< ns3::LteRrcSap::MeasResultBestNeighCell >', is_const=False)
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultServFreqList::measResultScell [variable]
-    cls.add_instance_attribute('measResultScell', 'std::list< ns3::LteRrcSap::MeasResultScell >', is_const=False)
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultServFreq::MeasResultServFreq(ns3::LteRrcSap::MeasResultServFreq const & arg0) [constructor]
+    cls.add_constructor([param('ns3::LteRrcSap::MeasResultServFreq const &', 'arg0')])
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultServFreq::haveMeasResultBestNeighCell [variable]
+    cls.add_instance_attribute('haveMeasResultBestNeighCell', 'bool', is_const=False)
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultServFreq::haveMeasResultSCell [variable]
+    cls.add_instance_attribute('haveMeasResultSCell', 'bool', is_const=False)
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultServFreq::measResultBestNeighCell [variable]
+    cls.add_instance_attribute('measResultBestNeighCell', 'ns3::LteRrcSap::MeasResultBestNeighCell', is_const=False)
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultServFreq::measResultSCell [variable]
+    cls.add_instance_attribute('measResultSCell', 'ns3::LteRrcSap::MeasResultSCell', is_const=False)
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultServFreq::servFreqId [variable]
+    cls.add_instance_attribute('servFreqId', 'uint16_t', is_const=False)
     return
 
 def register_Ns3LteRrcSapMeasResults_methods(root_module, cls):
@@ -5226,18 +5273,16 @@
     cls.add_constructor([param('ns3::LteRrcSap::MeasResults const &', 'arg0')])
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResults::haveMeasResultNeighCells [variable]
     cls.add_instance_attribute('haveMeasResultNeighCells', 'bool', is_const=False)
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResults::haveScellsMeas [variable]
-    cls.add_instance_attribute('haveScellsMeas', 'bool', is_const=False)
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResults::haveMeasResultServFreqList [variable]
+    cls.add_instance_attribute('haveMeasResultServFreqList', 'bool', is_const=False)
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResults::measId [variable]
     cls.add_instance_attribute('measId', 'uint8_t', is_const=False)
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResults::measResultListEutra [variable]
     cls.add_instance_attribute('measResultListEutra', 'std::list< ns3::LteRrcSap::MeasResultEutra >', is_const=False)
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResults::measScellResultList [variable]
-    cls.add_instance_attribute('measScellResultList', 'ns3::LteRrcSap::MeasResultServFreqList', is_const=False)
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResults::rsrpResult [variable]
-    cls.add_instance_attribute('rsrpResult', 'uint8_t', is_const=False)
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResults::rsrqResult [variable]
-    cls.add_instance_attribute('rsrqResult', 'uint8_t', is_const=False)
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResults::measResultPCell [variable]
+    cls.add_instance_attribute('measResultPCell', 'ns3::LteRrcSap::MeasResultPCell', is_const=False)
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResults::measResultServFreqList [variable]
+    cls.add_instance_attribute('measResultServFreqList', 'std::list< ns3::LteRrcSap::MeasResultServFreq >', is_const=False)
     return
 
 def register_Ns3LteRrcSapMeasurementReport_methods(root_module, cls):
@@ -5294,10 +5339,10 @@
     cls.add_constructor([])
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::NonCriticalExtensionConfiguration::NonCriticalExtensionConfiguration(ns3::LteRrcSap::NonCriticalExtensionConfiguration const & arg0) [constructor]
     cls.add_constructor([param('ns3::LteRrcSap::NonCriticalExtensionConfiguration const &', 'arg0')])
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::NonCriticalExtensionConfiguration::sCellToAddModList [variable]
+    cls.add_instance_attribute('sCellToAddModList', 'std::list< ns3::LteRrcSap::SCellToAddMod >', is_const=False)
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::NonCriticalExtensionConfiguration::sCellToReleaseList [variable]
-    cls.add_instance_attribute('sCellToReleaseList', 'std::list< unsigned int >', is_const=False)
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::NonCriticalExtensionConfiguration::sCellsToAddModList [variable]
-    cls.add_instance_attribute('sCellsToAddModList', 'std::list< ns3::LteRrcSap::SCellToAddMod >', is_const=False)
+    cls.add_instance_attribute('sCellToReleaseList', 'std::list< unsigned char >', is_const=False)
     return
 
 def register_Ns3LteRrcSapNonUlConfiguration_methods(root_module, cls):
@@ -5727,8 +5772,8 @@
     cls.add_instance_attribute('haveRadioResourceConfigDedicatedSCell', 'bool', is_const=False)
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::SCellToAddMod::radioResourceConfigCommonSCell [variable]
     cls.add_instance_attribute('radioResourceConfigCommonSCell', 'ns3::LteRrcSap::RadioResourceConfigCommonSCell', is_const=False)
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::SCellToAddMod::radioResourceConfigDedicateSCell [variable]
-    cls.add_instance_attribute('radioResourceConfigDedicateSCell', 'ns3::LteRrcSap::RadioResourceConfigDedicatedSCell', is_const=False)
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::SCellToAddMod::radioResourceConfigDedicatedSCell [variable]
+    cls.add_instance_attribute('radioResourceConfigDedicatedSCell', 'ns3::LteRrcSap::RadioResourceConfigDedicatedSCell', is_const=False)
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::SCellToAddMod::sCellIndex [variable]
     cls.add_instance_attribute('sCellIndex', 'uint32_t', is_const=False)
     return
@@ -5910,6 +5955,16 @@
                    'void', 
                    [param('uint32_t', 'ulEarfcn'), param('uint16_t', 'ulBandwidth')], 
                    is_pure_virtual=True, is_virtual=True)
+    ## lte-ue-cphy-sap.h (module 'lte'): uint16_t ns3::LteUeCphySapProvider::GetCellId() [member function]
+    cls.add_method('GetCellId', 
+                   'uint16_t', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## lte-ue-cphy-sap.h (module 'lte'): uint32_t ns3::LteUeCphySapProvider::GetDlEarfcn() [member function]
+    cls.add_method('GetDlEarfcn', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
     ## lte-ue-cphy-sap.h (module 'lte'): void ns3::LteUeCphySapProvider::Reset() [member function]
     cls.add_method('Reset', 
                    'void', 
@@ -7521,8 +7576,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -7789,11 +7844,11 @@
     cls.add_constructor([param('ns3::UanPdp const &', 'arg0')])
     ## uan-prop-model.h (module 'uan'): ns3::UanPdp::UanPdp() [constructor]
     cls.add_constructor([])
-    ## uan-prop-model.h (module 'uan'): ns3::UanPdp::UanPdp(std::vector<ns3::Tap, std::allocator<ns3::Tap> > taps, ns3::Time resolution) [constructor]
+    ## uan-prop-model.h (module 'uan'): ns3::UanPdp::UanPdp(std::vector<ns3::Tap, std::allocator<ns3::Tap>> taps, ns3::Time resolution) [constructor]
     cls.add_constructor([param('std::vector< ns3::Tap >', 'taps'), param('ns3::Time', 'resolution')])
-    ## uan-prop-model.h (module 'uan'): ns3::UanPdp::UanPdp(std::vector<std::complex<double>, std::allocator<std::complex<double> > > arrivals, ns3::Time resolution) [constructor]
+    ## uan-prop-model.h (module 'uan'): ns3::UanPdp::UanPdp(std::vector<std::complex<double>, std::allocator<std::complex<double>>> arrivals, ns3::Time resolution) [constructor]
     cls.add_constructor([param('std::vector< std::complex< double > >', 'arrivals'), param('ns3::Time', 'resolution')])
-    ## uan-prop-model.h (module 'uan'): ns3::UanPdp::UanPdp(std::vector<double, std::allocator<double> > arrivals, ns3::Time resolution) [constructor]
+    ## uan-prop-model.h (module 'uan'): ns3::UanPdp::UanPdp(std::vector<double, std::allocator<double>> arrivals, ns3::Time resolution) [constructor]
     cls.add_constructor([param('std::vector< double >', 'arrivals'), param('ns3::Time', 'resolution')])
     ## uan-prop-model.h (module 'uan'): static ns3::UanPdp ns3::UanPdp::CreateImpulsePdp() [member function]
     cls.add_method('CreateImpulsePdp', 
@@ -8258,6 +8313,11 @@
                    'bool', 
                    [param('uint16_t', 'channelWidth'), param('uint8_t', 'nss')], 
                    is_const=True)
+    ## wifi-mode.h (module 'wifi'): bool ns3::WifiMode::IsAllowed(ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('IsAllowed', 
+                   'bool', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True)
     ## wifi-mode.h (module 'wifi'): bool ns3::WifiMode::IsHigherCodeRate(ns3::WifiMode mode) const [member function]
     cls.add_method('IsHigherCodeRate', 
                    'bool', 
@@ -8278,15 +8338,15 @@
 def register_Ns3WifiModeFactory_methods(root_module, cls):
     ## wifi-mode.h (module 'wifi'): ns3::WifiModeFactory::WifiModeFactory(ns3::WifiModeFactory const & arg0) [constructor]
     cls.add_constructor([param('ns3::WifiModeFactory const &', 'arg0')])
-    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMcs(std::string uniqueName, uint8_t mcsValue, ns3::WifiModulationClass modClass, ns3::WifiModeFactory::CodeRateCallback codeRateCallback, ns3::WifiModeFactory::ConstellationSizeCallback constellationSizeCallback, ns3::WifiModeFactory::PhyRateCallback phyRateCallback, ns3::WifiModeFactory::PhyRateFromTxVectorCallback phyRateFromTxVectorCallback, ns3::WifiModeFactory::DataRateCallback dataRateCallback, ns3::WifiModeFactory::DataRateFromTxVectorCallback dataRateFromTxVectorCallback, ns3::WifiModeFactory::NonHtReferenceRateCallback nonHtReferenceRateCallback, ns3::WifiModeFactory::ModeAllowedCallback isModeAllowedCallback) [member function]
+    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMcs(std::string uniqueName, uint8_t mcsValue, ns3::WifiModulationClass modClass, bool isMandatory, ns3::WifiModeFactory::CodeRateCallback codeRateCallback, ns3::WifiModeFactory::ConstellationSizeCallback constellationSizeCallback, ns3::WifiModeFactory::PhyRateCallback phyRateCallback, ns3::WifiModeFactory::DataRateCallback dataRateCallback, ns3::WifiModeFactory::NonHtReferenceRateCallback nonHtReferenceRateCallback, ns3::WifiModeFactory::AllowedCallback isAllowedCallback) [member function]
     cls.add_method('CreateWifiMcs', 
                    'ns3::WifiMode', 
-                   [param('std::string', 'uniqueName'), param('uint8_t', 'mcsValue'), param('ns3::WifiModulationClass', 'modClass'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'codeRateCallback'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'constellationSizeCallback'), param('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateCallback'), param('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateFromTxVectorCallback'), param('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateCallback'), param('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateFromTxVectorCallback'), param('ns3::Callback< unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'nonHtReferenceRateCallback'), param('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'isModeAllowedCallback')], 
+                   [param('std::string', 'uniqueName'), param('uint8_t', 'mcsValue'), param('ns3::WifiModulationClass', 'modClass'), param('bool', 'isMandatory'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'codeRateCallback'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'constellationSizeCallback'), param('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateCallback'), param('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateCallback'), param('ns3::Callback< unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'nonHtReferenceRateCallback'), param('ns3::Callback< bool, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'isAllowedCallback')], 
                    is_static=True)
-    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMode(std::string uniqueName, ns3::WifiModulationClass modClass, bool isMandatory, ns3::WifiModeFactory::CodeRateCallback codeRateCallback, ns3::WifiModeFactory::ConstellationSizeCallback constellationSizeCallback, ns3::WifiModeFactory::PhyRateCallback phyRateCallback, ns3::WifiModeFactory::PhyRateFromTxVectorCallback phyRateFromTxVectorCallback, ns3::WifiModeFactory::DataRateCallback dataRateCallback, ns3::WifiModeFactory::DataRateFromTxVectorCallback dataRateFromTxVectorCallback, ns3::WifiModeFactory::ModeAllowedCallback isModeAllowedCallback) [member function]
+    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMode(std::string uniqueName, ns3::WifiModulationClass modClass, bool isMandatory, ns3::WifiModeFactory::CodeRateCallback codeRateCallback, ns3::WifiModeFactory::ConstellationSizeCallback constellationSizeCallback, ns3::WifiModeFactory::PhyRateCallback phyRateCallback, ns3::WifiModeFactory::DataRateCallback dataRateCallback, ns3::WifiModeFactory::AllowedCallback isAllowedCallback) [member function]
     cls.add_method('CreateWifiMode', 
                    'ns3::WifiMode', 
-                   [param('std::string', 'uniqueName'), param('ns3::WifiModulationClass', 'modClass'), param('bool', 'isMandatory'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'codeRateCallback'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'constellationSizeCallback'), param('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateCallback'), param('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateFromTxVectorCallback'), param('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateCallback'), param('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateFromTxVectorCallback'), param('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'isModeAllowedCallback')], 
+                   [param('std::string', 'uniqueName'), param('ns3::WifiModulationClass', 'modClass'), param('bool', 'isMandatory'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'codeRateCallback'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'constellationSizeCallback'), param('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateCallback'), param('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateCallback'), param('ns3::Callback< bool, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'isAllowedCallback')], 
                    is_static=True)
     return
 
@@ -8295,6 +8355,16 @@
     cls.add_constructor([param('ns3::WifiPhyOperatingChannel const &', 'arg0')])
     ## wifi-phy-operating-channel.h (module 'wifi'): ns3::WifiPhyOperatingChannel::WifiPhyOperatingChannel() [constructor]
     cls.add_constructor([])
+    ## wifi-phy-operating-channel.h (module 'wifi'): static ns3::WifiPhyOperatingChannel::ConstIterator ns3::WifiPhyOperatingChannel::FindFirst(uint8_t number, uint16_t frequency, uint16_t width, ns3::WifiStandard standard, ns3::WifiPhyBand band, ns3::WifiPhyOperatingChannel::ConstIterator start=ns3::WifiPhyOperatingChannel::m_frequencyChannels.begin()) [member function]
+    cls.add_method('FindFirst', 
+                   'ns3::WifiPhyOperatingChannel::ConstIterator', 
+                   [param('uint8_t', 'number'), param('uint16_t', 'frequency'), param('uint16_t', 'width'), param('ns3::WifiStandard', 'standard'), param('ns3::WifiPhyBand', 'band'), param('std::set< std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand > > const_iterator', 'start', default_value='ns3::WifiPhyOperatingChannel::m_frequencyChannels.begin()')], 
+                   is_static=True)
+    ## wifi-phy-operating-channel.h (module 'wifi'): static uint8_t ns3::WifiPhyOperatingChannel::GetDefaultChannelNumber(uint16_t width, ns3::WifiStandard standard, ns3::WifiPhyBand band) [member function]
+    cls.add_method('GetDefaultChannelNumber', 
+                   'uint8_t', 
+                   [param('uint16_t', 'width'), param('ns3::WifiStandard', 'standard'), param('ns3::WifiPhyBand', 'band')], 
+                   is_static=True)
     ## wifi-phy-operating-channel.h (module 'wifi'): uint16_t ns3::WifiPhyOperatingChannel::GetFrequency() const [member function]
     cls.add_method('GetFrequency', 
                    'uint16_t', 
@@ -8315,6 +8385,11 @@
                    'uint8_t', 
                    [param('uint16_t', 'primaryChannelWidth')], 
                    is_const=True)
+    ## wifi-phy-operating-channel.h (module 'wifi'): uint8_t ns3::WifiPhyOperatingChannel::GetPrimaryChannelNumber(uint16_t primaryChannelWidth, ns3::WifiStandard standard) const [member function]
+    cls.add_method('GetPrimaryChannelNumber', 
+                   'uint8_t', 
+                   [param('uint16_t', 'primaryChannelWidth'), param('ns3::WifiStandard', 'standard')], 
+                   is_const=True)
     ## wifi-phy-operating-channel.h (module 'wifi'): uint16_t ns3::WifiPhyOperatingChannel::GetWidth() const [member function]
     cls.add_method('GetWidth', 
                    'uint16_t', 
@@ -8325,18 +8400,20 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## wifi-phy-operating-channel.h (module 'wifi'): void ns3::WifiPhyOperatingChannel::Set(uint8_t number, uint16_t frequency, uint16_t width, ns3::WifiPhyStandard standard, ns3::WifiPhyBand band) [member function]
+    ## wifi-phy-operating-channel.h (module 'wifi'): void ns3::WifiPhyOperatingChannel::Set(uint8_t number, uint16_t frequency, uint16_t width, ns3::WifiStandard standard, ns3::WifiPhyBand band) [member function]
     cls.add_method('Set', 
                    'void', 
-                   [param('uint8_t', 'number'), param('uint16_t', 'frequency'), param('uint16_t', 'width'), param('ns3::WifiPhyStandard', 'standard'), param('ns3::WifiPhyBand', 'band')])
-    ## wifi-phy-operating-channel.h (module 'wifi'): void ns3::WifiPhyOperatingChannel::SetDefault(uint16_t width, ns3::WifiPhyStandard standard, ns3::WifiPhyBand band) [member function]
+                   [param('uint8_t', 'number'), param('uint16_t', 'frequency'), param('uint16_t', 'width'), param('ns3::WifiStandard', 'standard'), param('ns3::WifiPhyBand', 'band')])
+    ## wifi-phy-operating-channel.h (module 'wifi'): void ns3::WifiPhyOperatingChannel::SetDefault(uint16_t width, ns3::WifiStandard standard, ns3::WifiPhyBand band) [member function]
     cls.add_method('SetDefault', 
                    'void', 
-                   [param('uint16_t', 'width'), param('ns3::WifiPhyStandard', 'standard'), param('ns3::WifiPhyBand', 'band')])
+                   [param('uint16_t', 'width'), param('ns3::WifiStandard', 'standard'), param('ns3::WifiPhyBand', 'band')])
     ## wifi-phy-operating-channel.h (module 'wifi'): void ns3::WifiPhyOperatingChannel::SetPrimary20Index(uint8_t index) [member function]
     cls.add_method('SetPrimary20Index', 
                    'void', 
                    [param('uint8_t', 'index')])
+    ## wifi-phy-operating-channel.h (module 'wifi'): ns3::WifiPhyOperatingChannel::m_frequencyChannels [variable]
+    cls.add_static_attribute('m_frequencyChannels', 'std::set< std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand > > const', is_const=True)
     return
 
 def register_Ns3WifiSpectrumValue5MhzFactory_methods(root_module, cls):
@@ -8406,7 +8483,7 @@
                    'ns3::Ptr< ns3::SpectrumValue >', 
                    [param('uint32_t', 'centerFrequency'), param('uint16_t', 'totalChannelWidth'), param('uint32_t', 'bandBandwidth'), param('uint16_t', 'guardBandwidth'), param('std::pair< unsigned int, unsigned int >', 'band')], 
                    is_static=True)
-    ## wifi-spectrum-value-helper.h (module 'spectrum'): static void ns3::WifiSpectrumValueHelper::CreateSpectrumMaskForOfdm(ns3::Ptr<ns3::SpectrumValue> c, std::vector<std::pair<unsigned int, unsigned int>, std::allocator<std::pair<unsigned int, unsigned int> > > allocatedSubBands, ns3::WifiSpectrumBand maskBand, double txPowerPerBandW, uint32_t nGuardBands, uint32_t innerSlopeWidth, double minInnerBandDbr, double minOuterbandDbr, double lowestPointDbr) [member function]
+    ## wifi-spectrum-value-helper.h (module 'spectrum'): static void ns3::WifiSpectrumValueHelper::CreateSpectrumMaskForOfdm(ns3::Ptr<ns3::SpectrumValue> c, std::vector<std::pair<unsigned int, unsigned int>, std::allocator<std::pair<unsigned int, unsigned int>>> allocatedSubBands, ns3::WifiSpectrumBand maskBand, double txPowerPerBandW, uint32_t nGuardBands, uint32_t innerSlopeWidth, double minInnerBandDbr, double minOuterbandDbr, double lowestPointDbr) [member function]
     cls.add_method('CreateSpectrumMaskForOfdm', 
                    'void', 
                    [param('ns3::Ptr< ns3::SpectrumValue >', 'c'), param('std::vector< std::pair< unsigned int, unsigned int > >', 'allocatedSubBands'), param('std::pair< unsigned int, unsigned int >', 'maskBand'), param('double', 'txPowerPerBandW'), param('uint32_t', 'nGuardBands'), param('uint32_t', 'innerSlopeWidth'), param('double', 'minInnerBandDbr'), param('double', 'minOuterbandDbr'), param('double', 'lowestPointDbr')], 
@@ -8433,19 +8510,6 @@
                    is_static=True)
     return
 
-def register_Ns3WifiStandardInfo_methods(root_module, cls):
-    ## wifi-standards.h (module 'wifi'): ns3::WifiStandardInfo::WifiStandardInfo() [constructor]
-    cls.add_constructor([])
-    ## wifi-standards.h (module 'wifi'): ns3::WifiStandardInfo::WifiStandardInfo(ns3::WifiStandardInfo const & arg0) [constructor]
-    cls.add_constructor([param('ns3::WifiStandardInfo const &', 'arg0')])
-    ## wifi-standards.h (module 'wifi'): ns3::WifiStandardInfo::macStandard [variable]
-    cls.add_instance_attribute('macStandard', 'ns3::WifiMacStandard', is_const=False)
-    ## wifi-standards.h (module 'wifi'): ns3::WifiStandardInfo::phyBand [variable]
-    cls.add_instance_attribute('phyBand', 'ns3::WifiPhyBand', is_const=False)
-    ## wifi-standards.h (module 'wifi'): ns3::WifiStandardInfo::phyStandard [variable]
-    cls.add_instance_attribute('phyStandard', 'ns3::WifiPhyStandard', is_const=False)
-    return
-
 def register_Ns3WifiTxVector_methods(root_module, cls):
     cls.add_output_stream_operator()
     ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector() [constructor]
@@ -8665,14 +8729,14 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('>=')
     cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_unary_numeric_operator('-')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
     cls.add_constructor([])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(double const value) [constructor]
@@ -8691,6 +8755,8 @@
     cls.add_constructor([param('long unsigned int const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int const v) [constructor]
     cls.add_constructor([param('long long unsigned int const', 'v')])
+    ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int128_t const v) [constructor]
+    cls.add_constructor([param('int128_t const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t const hi, uint64_t const lo) [constructor]
     cls.add_constructor([param('int64_t const', 'hi'), param('uint64_t const', 'lo')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [constructor]
@@ -9325,7 +9391,7 @@
     cls.add_method('AddPacket', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet >', 'packet')])
-    ## packet-burst.h (module 'network'): std::list<ns3::Ptr<ns3::Packet>, std::allocator<ns3::Ptr<ns3::Packet> > >::const_iterator ns3::PacketBurst::Begin() const [member function]
+    ## packet-burst.h (module 'network'): std::list<ns3::Ptr<ns3::Packet>, std::allocator<ns3::Ptr<ns3::Packet>>>::const_iterator ns3::PacketBurst::Begin() const [member function]
     cls.add_method('Begin', 
                    'std::list< ns3::Ptr< ns3::Packet > > const_iterator', 
                    [], 
@@ -9335,7 +9401,7 @@
                    'ns3::Ptr< ns3::PacketBurst >', 
                    [], 
                    is_const=True)
-    ## packet-burst.h (module 'network'): std::list<ns3::Ptr<ns3::Packet>, std::allocator<ns3::Ptr<ns3::Packet> > >::const_iterator ns3::PacketBurst::End() const [member function]
+    ## packet-burst.h (module 'network'): std::list<ns3::Ptr<ns3::Packet>, std::allocator<ns3::Ptr<ns3::Packet>>>::const_iterator ns3::PacketBurst::End() const [member function]
     cls.add_method('End', 
                    'std::list< ns3::Ptr< ns3::Packet > > const_iterator', 
                    [], 
@@ -9345,7 +9411,7 @@
                    'uint32_t', 
                    [], 
                    is_const=True)
-    ## packet-burst.h (module 'network'): std::list<ns3::Ptr<ns3::Packet>, std::allocator<ns3::Ptr<ns3::Packet> > > ns3::PacketBurst::GetPackets() const [member function]
+    ## packet-burst.h (module 'network'): std::list<ns3::Ptr<ns3::Packet>, std::allocator<ns3::Ptr<ns3::Packet>>> ns3::PacketBurst::GetPackets() const [member function]
     cls.add_method('GetPackets', 
                    'std::list< ns3::Ptr< ns3::Packet > >', 
                    [], 
@@ -9367,6 +9433,102 @@
                    is_virtual=True, visibility='private')
     return
 
+def register_Ns3PhasedArrayModel_methods(root_module, cls):
+    ## phased-array-model.h (module 'antenna'): ns3::PhasedArrayModel::PhasedArrayModel(ns3::PhasedArrayModel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::PhasedArrayModel const &', 'arg0')])
+    ## phased-array-model.h (module 'antenna'): ns3::PhasedArrayModel::PhasedArrayModel() [constructor]
+    cls.add_constructor([])
+    ## phased-array-model.h (module 'antenna'): ns3::Ptr<const ns3::AntennaModel> ns3::PhasedArrayModel::GetAntennaElement() const [member function]
+    cls.add_method('GetAntennaElement', 
+                   'ns3::Ptr< ns3::AntennaModel const >', 
+                   [], 
+                   is_const=True)
+    ## phased-array-model.h (module 'antenna'): ns3::PhasedArrayModel::ComplexVector ns3::PhasedArrayModel::GetBeamformingVector() const [member function]
+    cls.add_method('GetBeamformingVector', 
+                   'ns3::PhasedArrayModel::ComplexVector', 
+                   [], 
+                   is_const=True)
+    ## phased-array-model.h (module 'antenna'): ns3::PhasedArrayModel::ComplexVector ns3::PhasedArrayModel::GetBeamformingVector(ns3::Angles a) const [member function]
+    cls.add_method('GetBeamformingVector', 
+                   'ns3::PhasedArrayModel::ComplexVector', 
+                   [param('ns3::Angles', 'a')], 
+                   is_const=True)
+    ## phased-array-model.h (module 'antenna'): std::pair<double, double> ns3::PhasedArrayModel::GetElementFieldPattern(ns3::Angles a) const [member function]
+    cls.add_method('GetElementFieldPattern', 
+                   'std::pair< double, double >', 
+                   [param('ns3::Angles', 'a')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## phased-array-model.h (module 'antenna'): ns3::Vector ns3::PhasedArrayModel::GetElementLocation(uint64_t index) const [member function]
+    cls.add_method('GetElementLocation', 
+                   'ns3::Vector', 
+                   [param('uint64_t', 'index')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## phased-array-model.h (module 'antenna'): uint32_t ns3::PhasedArrayModel::GetId() const [member function]
+    cls.add_method('GetId', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## phased-array-model.h (module 'antenna'): uint64_t ns3::PhasedArrayModel::GetNumberOfElements() const [member function]
+    cls.add_method('GetNumberOfElements', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## phased-array-model.h (module 'antenna'): ns3::PhasedArrayModel::ComplexVector ns3::PhasedArrayModel::GetSteeringVector(ns3::Angles a) const [member function]
+    cls.add_method('GetSteeringVector', 
+                   'ns3::PhasedArrayModel::ComplexVector', 
+                   [param('ns3::Angles', 'a')], 
+                   is_const=True)
+    ## phased-array-model.h (module 'antenna'): static ns3::TypeId ns3::PhasedArrayModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## phased-array-model.h (module 'antenna'): void ns3::PhasedArrayModel::SetAntennaElement(ns3::Ptr<ns3::AntennaModel> antennaElement) [member function]
+    cls.add_method('SetAntennaElement', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::AntennaModel >', 'antennaElement')])
+    ## phased-array-model.h (module 'antenna'): void ns3::PhasedArrayModel::SetBeamformingVector(ns3::PhasedArrayModel::ComplexVector const & beamformingVector) [member function]
+    cls.add_method('SetBeamformingVector', 
+                   'void', 
+                   [param('ns3::PhasedArrayModel::ComplexVector const &', 'beamformingVector')])
+    ## phased-array-model.h (module 'antenna'): static double ns3::PhasedArrayModel::ComputeNorm(ns3::PhasedArrayModel::ComplexVector const & vector) [member function]
+    cls.add_method('ComputeNorm', 
+                   'double', 
+                   [param('ns3::PhasedArrayModel::ComplexVector const &', 'vector')], 
+                   is_static=True, visibility='protected')
+    return
+
+def register_Ns3PhasedArraySpectrumPropagationLossModel_methods(root_module, cls):
+    ## phased-array-spectrum-propagation-loss-model.h (module 'spectrum'): ns3::PhasedArraySpectrumPropagationLossModel::PhasedArraySpectrumPropagationLossModel(ns3::PhasedArraySpectrumPropagationLossModel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::PhasedArraySpectrumPropagationLossModel const &', 'arg0')])
+    ## phased-array-spectrum-propagation-loss-model.h (module 'spectrum'): ns3::PhasedArraySpectrumPropagationLossModel::PhasedArraySpectrumPropagationLossModel() [constructor]
+    cls.add_constructor([])
+    ## phased-array-spectrum-propagation-loss-model.h (module 'spectrum'): ns3::Ptr<ns3::SpectrumValue> ns3::PhasedArraySpectrumPropagationLossModel::CalcRxPowerSpectralDensity(ns3::Ptr<const ns3::SpectrumValue> txPsd, ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b, ns3::Ptr<const ns3::PhasedArrayModel> aPhasedArrayModel, ns3::Ptr<const ns3::PhasedArrayModel> bPhasedArrayModel) const [member function]
+    cls.add_method('CalcRxPowerSpectralDensity', 
+                   'ns3::Ptr< ns3::SpectrumValue >', 
+                   [param('ns3::Ptr< ns3::SpectrumValue const >', 'txPsd'), param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b'), param('ns3::Ptr< ns3::PhasedArrayModel const >', 'aPhasedArrayModel'), param('ns3::Ptr< ns3::PhasedArrayModel const >', 'bPhasedArrayModel')], 
+                   is_const=True)
+    ## phased-array-spectrum-propagation-loss-model.h (module 'spectrum'): static ns3::TypeId ns3::PhasedArraySpectrumPropagationLossModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## phased-array-spectrum-propagation-loss-model.h (module 'spectrum'): void ns3::PhasedArraySpectrumPropagationLossModel::SetNext(ns3::Ptr<ns3::PhasedArraySpectrumPropagationLossModel> next) [member function]
+    cls.add_method('SetNext', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::PhasedArraySpectrumPropagationLossModel >', 'next')])
+    ## phased-array-spectrum-propagation-loss-model.h (module 'spectrum'): void ns3::PhasedArraySpectrumPropagationLossModel::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## phased-array-spectrum-propagation-loss-model.h (module 'spectrum'): ns3::Ptr<ns3::SpectrumValue> ns3::PhasedArraySpectrumPropagationLossModel::DoCalcRxPowerSpectralDensity(ns3::Ptr<const ns3::SpectrumValue> txPsd, ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b, ns3::Ptr<const ns3::PhasedArrayModel> aPhasedArrayModel, ns3::Ptr<const ns3::PhasedArrayModel> bPhasedArrayModel) const [member function]
+    cls.add_method('DoCalcRxPowerSpectralDensity', 
+                   'ns3::Ptr< ns3::SpectrumValue >', 
+                   [param('ns3::Ptr< ns3::SpectrumValue const >', 'txPsd'), param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b'), param('ns3::Ptr< ns3::PhasedArrayModel const >', 'aPhasedArrayModel'), param('ns3::Ptr< ns3::PhasedArrayModel const >', 'bPhasedArrayModel')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
+    return
+
 def register_Ns3PropagationDelayModel_methods(root_module, cls):
     ## propagation-delay-model.h (module 'propagation'): ns3::PropagationDelayModel::PropagationDelayModel() [constructor]
     cls.add_constructor([])
@@ -9390,7 +9552,7 @@
     cls.add_method('DoAssignStreams', 
                    'int64_t', 
                    [param('int64_t', 'stream')], 
-                   is_pure_virtual=True, is_virtual=True, visibility='private')
+                   is_pure_virtual=True, is_virtual=True, visibility='protected')
     return
 
 def register_Ns3PropagationLossModel_methods(root_module, cls):
@@ -9418,16 +9580,16 @@
     cls.add_method('AssignStreams', 
                    'int64_t', 
                    [param('int64_t', 'stream')])
+    ## propagation-loss-model.h (module 'propagation'): int64_t ns3::PropagationLossModel::DoAssignStreams(int64_t stream) [member function]
+    cls.add_method('DoAssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')], 
+                   is_pure_virtual=True, is_virtual=True, visibility='protected')
     ## propagation-loss-model.h (module 'propagation'): double ns3::PropagationLossModel::DoCalcRxPower(double txPowerDbm, ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
     cls.add_method('DoCalcRxPower', 
                    'double', 
                    [param('double', 'txPowerDbm'), param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
                    is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
-    ## propagation-loss-model.h (module 'propagation'): int64_t ns3::PropagationLossModel::DoAssignStreams(int64_t stream) [member function]
-    cls.add_method('DoAssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'stream')], 
-                   is_pure_virtual=True, is_virtual=True, visibility='private')
     return
 
 def register_Ns3RandomPropagationDelayModel_methods(root_module, cls):
@@ -9576,149 +9738,149 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Event_Ns3Empty_Ns3DefaultDeleter__lt__ns3Event__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Event, ns3::empty, ns3::DefaultDeleter<ns3::Event> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Event, ns3::empty, ns3::DefaultDeleter<ns3::Event>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Event, ns3::empty, ns3::DefaultDeleter<ns3::Event> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Event, ns3::empty, ns3::DefaultDeleter<ns3::Event> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Event, ns3::empty, ns3::DefaultDeleter<ns3::Event>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Event, ns3::empty, ns3::DefaultDeleter<ns3::Event>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Event, ns3::empty, ns3::DefaultDeleter< ns3::Event > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Ipv4MulticastRoute_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv4MulticastRoute__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter< ns3::Ipv4MulticastRoute > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Ipv4Route_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv4Route__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter< ns3::Ipv4Route > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3LteControlMessage_Ns3Empty_Ns3DefaultDeleter__lt__ns3LteControlMessage__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LteControlMessage, ns3::empty, ns3::DefaultDeleter<ns3::LteControlMessage> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LteControlMessage, ns3::empty, ns3::DefaultDeleter<ns3::LteControlMessage>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LteControlMessage, ns3::empty, ns3::DefaultDeleter<ns3::LteControlMessage> >::SimpleRefCount(ns3::SimpleRefCount<ns3::LteControlMessage, ns3::empty, ns3::DefaultDeleter<ns3::LteControlMessage> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LteControlMessage, ns3::empty, ns3::DefaultDeleter<ns3::LteControlMessage>>::SimpleRefCount(ns3::SimpleRefCount<ns3::LteControlMessage, ns3::empty, ns3::DefaultDeleter<ns3::LteControlMessage>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::LteControlMessage, ns3::empty, ns3::DefaultDeleter< ns3::LteControlMessage > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3LteHarqPhy_Ns3Empty_Ns3DefaultDeleter__lt__ns3LteHarqPhy__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LteHarqPhy, ns3::empty, ns3::DefaultDeleter<ns3::LteHarqPhy> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LteHarqPhy, ns3::empty, ns3::DefaultDeleter<ns3::LteHarqPhy>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LteHarqPhy, ns3::empty, ns3::DefaultDeleter<ns3::LteHarqPhy> >::SimpleRefCount(ns3::SimpleRefCount<ns3::LteHarqPhy, ns3::empty, ns3::DefaultDeleter<ns3::LteHarqPhy> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LteHarqPhy, ns3::empty, ns3::DefaultDeleter<ns3::LteHarqPhy>>::SimpleRefCount(ns3::SimpleRefCount<ns3::LteHarqPhy, ns3::empty, ns3::DefaultDeleter<ns3::LteHarqPhy>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::LteHarqPhy, ns3::empty, ns3::DefaultDeleter< ns3::LteHarqPhy > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3OutputStreamWrapper_Ns3Empty_Ns3DefaultDeleter__lt__ns3OutputStreamWrapper__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter< ns3::OutputStreamWrapper > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3PhyEntity_Ns3Empty_Ns3DefaultDeleter__lt__ns3PhyEntity__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity> >::SimpleRefCount(ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity>>::SimpleRefCount(ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter< ns3::PhyEntity > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3SpectrumModel_Ns3Empty_Ns3DefaultDeleter__lt__ns3SpectrumModel__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel> >::SimpleRefCount(ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel>>::SimpleRefCount(ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter< ns3::SpectrumModel > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3SpectrumSignalParameters_Ns3Empty_Ns3DefaultDeleter__lt__ns3SpectrumSignalParameters__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters> >::SimpleRefCount(ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters>>::SimpleRefCount(ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter< ns3::SpectrumSignalParameters > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3SpectrumValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3SpectrumValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter< ns3::SpectrumValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3VendorSpecificValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3VendorSpecificValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::VendorSpecificValue, ns3::empty, ns3::DefaultDeleter<ns3::VendorSpecificValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::VendorSpecificValue, ns3::empty, ns3::DefaultDeleter<ns3::VendorSpecificValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::VendorSpecificValue, ns3::empty, ns3::DefaultDeleter<ns3::VendorSpecificValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::VendorSpecificValue, ns3::empty, ns3::DefaultDeleter<ns3::VendorSpecificValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::VendorSpecificValue, ns3::empty, ns3::DefaultDeleter<ns3::VendorSpecificValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::VendorSpecificValue, ns3::empty, ns3::DefaultDeleter<ns3::VendorSpecificValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::VendorSpecificValue, ns3::empty, ns3::DefaultDeleter< ns3::VendorSpecificValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3WifiPpdu_Ns3Empty_Ns3DefaultDeleter__lt__ns3WifiPpdu__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiPpdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPpdu> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiPpdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPpdu>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiPpdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPpdu> >::SimpleRefCount(ns3::SimpleRefCount<ns3::WifiPpdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPpdu> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiPpdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPpdu>>::SimpleRefCount(ns3::SimpleRefCount<ns3::WifiPpdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPpdu>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::WifiPpdu, ns3::empty, ns3::DefaultDeleter< ns3::WifiPpdu > > const &', 'o')])
     return
 
@@ -9841,7 +10003,7 @@
                    'uint8_t', 
                    [param('uint8_t', 'ipTos')], 
                    is_static=True)
-    ## socket.h (module 'network'): void ns3::Socket::Ipv6JoinGroup(ns3::Ipv6Address address, ns3::Socket::Ipv6MulticastFilterMode filterMode, std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address> > sourceAddresses) [member function]
+    ## socket.h (module 'network'): void ns3::Socket::Ipv6JoinGroup(ns3::Ipv6Address address, ns3::Socket::Ipv6MulticastFilterMode filterMode, std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address>> sourceAddresses) [member function]
     cls.add_method('Ipv6JoinGroup', 
                    'void', 
                    [param('ns3::Ipv6Address', 'address'), param('ns3::Socket::Ipv6MulticastFilterMode', 'filterMode'), param('std::vector< ns3::Ipv6Address >', 'sourceAddresses')], 
@@ -10407,16 +10569,16 @@
     cls.add_binary_comparison_operator('==')
     ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(ns3::SpectrumModel const & arg0) [constructor]
     cls.add_constructor([param('ns3::SpectrumModel const &', 'arg0')])
-    ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(std::vector<double, std::allocator<double> > const & centerFreqs) [constructor]
+    ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(std::vector<double, std::allocator<double>> const & centerFreqs) [constructor]
     cls.add_constructor([param('std::vector< double > const &', 'centerFreqs')])
     ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(ns3::Bands const & bands) [constructor]
     cls.add_constructor([param('ns3::Bands const &', 'bands')])
-    ## spectrum-model.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo> >::const_iterator ns3::SpectrumModel::Begin() const [member function]
+    ## spectrum-model.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo>>::const_iterator ns3::SpectrumModel::Begin() const [member function]
     cls.add_method('Begin', 
                    'std::vector< ns3::BandInfo > const_iterator', 
                    [], 
                    is_const=True)
-    ## spectrum-model.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo> >::const_iterator ns3::SpectrumModel::End() const [member function]
+    ## spectrum-model.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo>>::const_iterator ns3::SpectrumModel::End() const [member function]
     cls.add_method('End', 
                    'std::vector< ns3::BandInfo > const_iterator', 
                    [], 
@@ -10476,9 +10638,9 @@
                    'ns3::Ptr< ns3::SpectrumModel const >', 
                    [], 
                    is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::AntennaModel> ns3::SpectrumPhy::GetRxAntenna() const [member function]
-    cls.add_method('GetRxAntenna', 
-                   'ns3::Ptr< ns3::AntennaModel >', 
+    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::Object> ns3::SpectrumPhy::GetAntenna() const [member function]
+    cls.add_method('GetAntenna', 
+                   'ns3::Ptr< ns3::Object >', 
                    [], 
                    is_const=True, is_pure_virtual=True, is_virtual=True)
     ## spectrum-phy.h (module 'spectrum'): void ns3::SpectrumPhy::StartRx(ns3::Ptr<ns3::SpectrumSignalParameters> params) [member function]
@@ -10529,14 +10691,14 @@
                    'ns3::Ptr< ns3::SpectrumSignalParameters >', 
                    [], 
                    is_virtual=True)
-    ## spectrum-signal-parameters.h (module 'spectrum'): ns3::SpectrumSignalParameters::psd [variable]
-    cls.add_instance_attribute('psd', 'ns3::Ptr< ns3::SpectrumValue >', is_const=False)
     ## spectrum-signal-parameters.h (module 'spectrum'): ns3::SpectrumSignalParameters::duration [variable]
     cls.add_instance_attribute('duration', 'ns3::Time', is_const=False)
-    ## spectrum-signal-parameters.h (module 'spectrum'): ns3::SpectrumSignalParameters::txPhy [variable]
-    cls.add_instance_attribute('txPhy', 'ns3::Ptr< ns3::SpectrumPhy >', is_const=False)
+    ## spectrum-signal-parameters.h (module 'spectrum'): ns3::SpectrumSignalParameters::psd [variable]
+    cls.add_instance_attribute('psd', 'ns3::Ptr< ns3::SpectrumValue >', is_const=False)
     ## spectrum-signal-parameters.h (module 'spectrum'): ns3::SpectrumSignalParameters::txAntenna [variable]
     cls.add_instance_attribute('txAntenna', 'ns3::Ptr< ns3::AntennaModel >', is_const=False)
+    ## spectrum-signal-parameters.h (module 'spectrum'): ns3::SpectrumSignalParameters::txPhy [variable]
+    cls.add_instance_attribute('txPhy', 'ns3::Ptr< ns3::SpectrumPhy >', is_const=False)
     return
 
 def register_Ns3SpectrumValue_methods(root_module, cls):
@@ -10564,22 +10726,22 @@
     cls.add_constructor([param('ns3::Ptr< ns3::SpectrumModel const >', 'sm')])
     ## spectrum-value.h (module 'spectrum'): ns3::SpectrumValue::SpectrumValue() [constructor]
     cls.add_constructor([])
-    ## spectrum-value.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo> >::const_iterator ns3::SpectrumValue::ConstBandsBegin() const [member function]
+    ## spectrum-value.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo>>::const_iterator ns3::SpectrumValue::ConstBandsBegin() const [member function]
     cls.add_method('ConstBandsBegin', 
                    'std::vector< ns3::BandInfo > const_iterator', 
                    [], 
                    is_const=True)
-    ## spectrum-value.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo> >::const_iterator ns3::SpectrumValue::ConstBandsEnd() const [member function]
+    ## spectrum-value.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo>>::const_iterator ns3::SpectrumValue::ConstBandsEnd() const [member function]
     cls.add_method('ConstBandsEnd', 
                    'std::vector< ns3::BandInfo > const_iterator', 
                    [], 
                    is_const=True)
-    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double> >::const_iterator ns3::SpectrumValue::ConstValuesBegin() const [member function]
+    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double>>::const_iterator ns3::SpectrumValue::ConstValuesBegin() const [member function]
     cls.add_method('ConstValuesBegin', 
                    'std::vector< double > const_iterator', 
                    [], 
                    is_const=True)
-    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double> >::const_iterator ns3::SpectrumValue::ConstValuesEnd() const [member function]
+    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double>>::const_iterator ns3::SpectrumValue::ConstValuesEnd() const [member function]
     cls.add_method('ConstValuesEnd', 
                    'std::vector< double > const_iterator', 
                    [], 
@@ -10609,11 +10771,11 @@
                    'double const &', 
                    [param('uint32_t', 'pos')], 
                    is_const=True)
-    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double> >::iterator ns3::SpectrumValue::ValuesBegin() [member function]
+    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double>>::iterator ns3::SpectrumValue::ValuesBegin() [member function]
     cls.add_method('ValuesBegin', 
                    'std::vector< double > iterator', 
                    [])
-    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double> >::iterator ns3::SpectrumValue::ValuesEnd() [member function]
+    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double>>::iterator ns3::SpectrumValue::ValuesEnd() [member function]
     cls.add_method('ValuesEnd', 
                    'std::vector< double > iterator', 
                    [])
@@ -11630,8 +11792,6 @@
                    is_static=True)
     ## wifi-phy.h (module 'wifi'): ns3::WifiPhy::WifiPhy() [constructor]
     cls.add_constructor([])
-    ## wifi-phy.h (module 'wifi'): ns3::WifiPhy::m_frequencyChannels [variable]
-    cls.add_static_attribute('m_frequencyChannels', 'std::set< std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand > > const', is_const=True)
     ## wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::WifiPhyStateHelper> ns3::WifiPhy::GetState() const [member function]
     cls.add_method('GetState', 
                    'ns3::Ptr< ns3::WifiPhyStateHelper >', 
@@ -11678,10 +11838,10 @@
     cls.add_method('Send', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::Send(ns3::WifiConstPsduMap psdus, ns3::WifiTxVector txVector) [member function]
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::Send(ns3::WifiConstPsduMap psdus, ns3::WifiTxVector const & txVector) [member function]
     cls.add_method('Send', 
                    'void', 
-                   [param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'psdus'), param('ns3::WifiTxVector', 'txVector')])
+                   [param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'psdus'), param('ns3::WifiTxVector const &', 'txVector')])
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::StartTx(ns3::Ptr<ns3::WifiPpdu> ppdu) [member function]
     cls.add_method('StartTx', 
                    'void', 
@@ -11792,12 +11952,12 @@
                    'ns3::Time', 
                    [param('ns3::WifiTxVector const &', 'txVector')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> > ns3::WifiPhy::GetModeList() const [member function]
+    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode>> ns3::WifiPhy::GetModeList() const [member function]
     cls.add_method('GetModeList', 
                    'std::list< ns3::WifiMode >', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> > ns3::WifiPhy::GetModeList(ns3::WifiModulationClass modulation) const [member function]
+    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode>> ns3::WifiPhy::GetModeList(ns3::WifiModulationClass modulation) const [member function]
     cls.add_method('GetModeList', 
                    'std::list< ns3::WifiMode >', 
                    [param('ns3::WifiModulationClass', 'modulation')], 
@@ -11864,7 +12024,7 @@
                    'uint32_t', 
                    [param('ns3::WifiModulationClass', 'modulation')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): std::list<unsigned char, std::allocator<unsigned char> > ns3::WifiPhy::GetBssMembershipSelectorList() const [member function]
+    ## wifi-phy.h (module 'wifi'): std::list<unsigned char, std::allocator<unsigned char>> ns3::WifiPhy::GetBssMembershipSelectorList() const [member function]
     cls.add_method('GetBssMembershipSelectorList', 
                    'std::list< unsigned char >', 
                    [], 
@@ -11874,12 +12034,12 @@
                    'uint16_t', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> > ns3::WifiPhy::GetMcsList() const [member function]
+    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode>> ns3::WifiPhy::GetMcsList() const [member function]
     cls.add_method('GetMcsList', 
                    'std::list< ns3::WifiMode >', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> > ns3::WifiPhy::GetMcsList(ns3::WifiModulationClass modulation) const [member function]
+    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode>> ns3::WifiPhy::GetMcsList(ns3::WifiModulationClass modulation) const [member function]
     cls.add_method('GetMcsList', 
                    'std::list< ns3::WifiMode >', 
                    [param('ns3::WifiModulationClass', 'modulation')], 
@@ -11889,11 +12049,6 @@
                    'ns3::WifiMode', 
                    [param('ns3::WifiModulationClass', 'modulation'), param('uint8_t', 'mcs')], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetChannelNumber(uint8_t id) [member function]
-    cls.add_method('SetChannelNumber', 
-                   'void', 
-                   [param('uint8_t', 'id')], 
-                   is_virtual=True)
     ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetChannelNumber() const [member function]
     cls.add_method('GetChannelNumber', 
                    'uint8_t', 
@@ -11904,14 +12059,14 @@
                    'ns3::Time', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::ConfigureStandardAndBand(ns3::WifiPhyStandard standard, ns3::WifiPhyBand band) [member function]
-    cls.add_method('ConfigureStandardAndBand', 
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::ConfigureStandard(ns3::WifiStandard standard) [member function]
+    cls.add_method('ConfigureStandard', 
                    'void', 
-                   [param('ns3::WifiPhyStandard', 'standard'), param('ns3::WifiPhyBand', 'band')], 
+                   [param('ns3::WifiStandard', 'standard')], 
                    is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): ns3::WifiPhyStandard ns3::WifiPhy::GetPhyStandard() const [member function]
-    cls.add_method('GetPhyStandard', 
-                   'ns3::WifiPhyStandard', 
+    ## wifi-phy.h (module 'wifi'): ns3::WifiStandard ns3::WifiPhy::GetStandard() const [member function]
+    cls.add_method('GetStandard', 
+                   'ns3::WifiStandard', 
                    [], 
                    is_const=True)
     ## wifi-phy.h (module 'wifi'): ns3::WifiPhyBand ns3::WifiPhy::GetPhyBand() const [member function]
@@ -11953,7 +12108,7 @@
     cls.add_method('NotifyRxDrop', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiPhyRxfailureReason', 'reason')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyMonitorSniffRx(ns3::Ptr<const ns3::WifiPsdu> psdu, uint16_t channelFreqMhz, ns3::WifiTxVector txVector, ns3::SignalNoiseDbm signalNoise, std::vector<bool, std::allocator<bool> > statusPerMpdu, uint16_t staId=65535) [member function]
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyMonitorSniffRx(ns3::Ptr<const ns3::WifiPsdu> psdu, uint16_t channelFreqMhz, ns3::WifiTxVector txVector, ns3::SignalNoiseDbm signalNoise, std::vector<bool, std::allocator<bool>> statusPerMpdu, uint16_t staId=65535) [member function]
     cls.add_method('NotifyMonitorSniffRx', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('uint16_t', 'channelFreqMhz'), param('ns3::WifiTxVector', 'txVector'), param('ns3::SignalNoiseDbm', 'signalNoise'), param('std::vector< bool >', 'statusPerMpdu'), param('uint16_t', 'staId', default_value='65535')])
@@ -12033,13 +12188,13 @@
                    'double', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetDevice(ns3::Ptr<ns3::NetDevice> const device) [member function]
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetDevice(ns3::Ptr<ns3::WifiNetDevice> const device) [member function]
     cls.add_method('SetDevice', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NetDevice > const', 'device')])
-    ## wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::NetDevice> ns3::WifiPhy::GetDevice() const [member function]
+                   [param('ns3::Ptr< ns3::WifiNetDevice > const', 'device')])
+    ## wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::WifiNetDevice> ns3::WifiPhy::GetDevice() const [member function]
     cls.add_method('GetDevice', 
-                   'ns3::Ptr< ns3::NetDevice >', 
+                   'ns3::Ptr< ns3::WifiNetDevice >', 
                    [], 
                    is_const=True)
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetMobility(ns3::Ptr<ns3::MobilityModel> const mobility) [member function]
@@ -12051,24 +12206,20 @@
                    'ns3::Ptr< ns3::MobilityModel >', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetOperatingChannel(uint8_t number, uint16_t frequency, uint16_t width) [member function]
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetOperatingChannel(ns3::WifiPhy::ChannelTuple const & channelTuple) [member function]
     cls.add_method('SetOperatingChannel', 
                    'void', 
-                   [param('uint8_t', 'number'), param('uint16_t', 'frequency'), param('uint16_t', 'width')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetFrequency(uint16_t freq) [member function]
-    cls.add_method('SetFrequency', 
-                   'void', 
-                   [param('uint16_t', 'freq')], 
-                   is_virtual=True)
+                   [param('ns3::WifiPhy::ChannelTuple const &', 'channelTuple')])
     ## wifi-phy.h (module 'wifi'): uint16_t ns3::WifiPhy::GetFrequency() const [member function]
     cls.add_method('GetFrequency', 
                    'uint16_t', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetPrimary20Index(uint8_t index) [member function]
-    cls.add_method('SetPrimary20Index', 
-                   'void', 
-                   [param('uint8_t', 'index')])
+    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetPrimary20Index() const [member function]
+    cls.add_method('GetPrimary20Index', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetNumberOfAntennas(uint8_t antennas) [member function]
     cls.add_method('SetNumberOfAntennas', 
                    'void', 
@@ -12130,16 +12281,11 @@
                    'uint16_t', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetChannelWidth(uint16_t channelWidth) [member function]
-    cls.add_method('SetChannelWidth', 
-                   'void', 
-                   [param('uint16_t', 'channelWidth')], 
-                   is_virtual=True)
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::AddSupportedChannelWidth(uint16_t width) [member function]
     cls.add_method('AddSupportedChannelWidth', 
                    'void', 
                    [param('uint16_t', 'width')])
-    ## wifi-phy.h (module 'wifi'): std::vector<unsigned short, std::allocator<unsigned short> > ns3::WifiPhy::GetSupportedChannelWidthSet() const [member function]
+    ## wifi-phy.h (module 'wifi'): std::vector<unsigned short, std::allocator<unsigned short>> ns3::WifiPhy::GetSupportedChannelWidthSet() const [member function]
     cls.add_method('GetSupportedChannelWidthSet', 
                    'std::vector< unsigned short >', 
                    [], 
@@ -12197,6 +12343,11 @@
                    'std::tuple< double, double, double >', 
                    [], 
                    is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetPrimaryChannelNumber(uint16_t primaryChannelWidth) const [member function]
+    cls.add_method('GetPrimaryChannelNumber', 
+                   'uint8_t', 
+                   [param('uint16_t', 'primaryChannelWidth')], 
+                   is_const=True)
     ## wifi-phy.h (module 'wifi'): ns3::WifiPhy::WifiPhy(ns3::WifiPhy const & arg0) [constructor]
     cls.add_constructor([param('ns3::WifiPhy const &', 'arg0')])
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::DoDispose() [member function]
@@ -12209,11 +12360,16 @@
                    'void', 
                    [], 
                    visibility='protected')
-    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::DoChannelSwitch() [member function]
-    cls.add_method('DoChannelSwitch', 
+    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetDelayUntilChannelSwitch() [member function]
+    cls.add_method('GetDelayUntilChannelSwitch', 
                    'ns3::Time', 
                    [], 
                    visibility='protected')
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::DoChannelSwitch() [member function]
+    cls.add_method('DoChannelSwitch', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SwitchMaybeToCcaBusy(uint16_t channelWidth) [member function]
     cls.add_method('SwitchMaybeToCcaBusy', 
                    'void', 
@@ -12334,7 +12490,7 @@
     cls.add_method('SwitchFromRxEndError', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('double', 'snr')])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchFromRxEndOk(ns3::Ptr<ns3::WifiPsdu> psdu, ns3::RxSignalInfo rxSignalInfo, ns3::WifiTxVector txVector, uint16_t staId, std::vector<bool, std::allocator<bool> > statusPerMpdu) [member function]
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchFromRxEndOk(ns3::Ptr<ns3::WifiPsdu> psdu, ns3::RxSignalInfo rxSignalInfo, ns3::WifiTxVector txVector, uint16_t staId, std::vector<bool, std::allocator<bool>> statusPerMpdu) [member function]
     cls.add_method('SwitchFromRxEndOk', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('ns3::RxSignalInfo', 'rxSignalInfo'), param('ns3::WifiTxVector', 'txVector'), param('uint16_t', 'staId'), param('std::vector< bool >', 'statusPerMpdu')])
@@ -12531,6 +12687,23 @@
                    is_virtual=True)
     return
 
+def register_Ns3AntennaModel_methods(root_module, cls):
+    ## antenna-model.h (module 'antenna'): ns3::AntennaModel::AntennaModel(ns3::AntennaModel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::AntennaModel const &', 'arg0')])
+    ## antenna-model.h (module 'antenna'): ns3::AntennaModel::AntennaModel() [constructor]
+    cls.add_constructor([])
+    ## antenna-model.h (module 'antenna'): double ns3::AntennaModel::GetGainDb(ns3::Angles a) [member function]
+    cls.add_method('GetGainDb', 
+                   'double', 
+                   [param('ns3::Angles', 'a')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## antenna-model.h (module 'antenna'): static ns3::TypeId ns3::AntennaModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    return
+
 def register_Ns3AttributeAccessor_methods(root_module, cls):
     ## attribute.h (module 'core'): ns3::AttributeAccessor::AttributeAccessor(ns3::AttributeAccessor const & arg0) [constructor]
     cls.add_constructor([param('ns3::AttributeAccessor const &', 'arg0')])
@@ -14246,7 +14419,7 @@
                    'ns3::Ipv4Address', 
                    [], 
                    is_const=True)
-    ## ipv4-route.h (module 'internet'): std::map<unsigned int, unsigned int, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, unsigned int> > > ns3::Ipv4MulticastRoute::GetOutputTtlMap() const [member function]
+    ## ipv4-route.h (module 'internet'): std::map<unsigned int, unsigned int, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, unsigned int>>> ns3::Ipv4MulticastRoute::GetOutputTtlMap() const [member function]
     cls.add_method('GetOutputTtlMap', 
                    'std::map< unsigned int, unsigned int >', 
                    [], 
@@ -14459,7 +14632,7 @@
     cls.add_constructor([param('ns3::ListErrorModel const &', 'arg0')])
     ## error-model.h (module 'network'): ns3::ListErrorModel::ListErrorModel() [constructor]
     cls.add_constructor([])
-    ## error-model.h (module 'network'): std::list<unsigned int, std::allocator<unsigned int> > ns3::ListErrorModel::GetList() const [member function]
+    ## error-model.h (module 'network'): std::list<unsigned int, std::allocator<unsigned int>> ns3::ListErrorModel::GetList() const [member function]
     cls.add_method('GetList', 
                    'std::list< unsigned int >', 
                    [], 
@@ -14469,7 +14642,7 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## error-model.h (module 'network'): void ns3::ListErrorModel::SetList(std::list<unsigned int, std::allocator<unsigned int> > const & packetlist) [member function]
+    ## error-model.h (module 'network'): void ns3::ListErrorModel::SetList(std::list<unsigned int, std::allocator<unsigned int>> const & packetlist) [member function]
     cls.add_method('SetList', 
                    'void', 
                    [param('std::list< unsigned int > const &', 'packetlist')])
@@ -14561,7 +14734,7 @@
     cls.add_constructor([param('ns3::LteAmc const &', 'arg0')])
     ## lte-amc.h (module 'lte'): ns3::LteAmc::LteAmc() [constructor]
     cls.add_constructor([])
-    ## lte-amc.h (module 'lte'): std::vector<int, std::allocator<int> > ns3::LteAmc::CreateCqiFeedbacks(ns3::SpectrumValue const & sinr, uint8_t rbgSize=0) [member function]
+    ## lte-amc.h (module 'lte'): std::vector<int, std::allocator<int>> ns3::LteAmc::CreateCqiFeedbacks(ns3::SpectrumValue const & sinr, uint8_t rbgSize=0) [member function]
     cls.add_method('CreateCqiFeedbacks', 
                    'std::vector< int >', 
                    [param('ns3::SpectrumValue const &', 'sinr'), param('uint8_t', 'rbgSize', default_value='0')])
@@ -14761,7 +14934,7 @@
     cls.add_method('GetComponentCarrierId', 
                    'uint8_t', 
                    [])
-    ## lte-phy.h (module 'lte'): std::list<ns3::Ptr<ns3::LteControlMessage>, std::allocator<ns3::Ptr<ns3::LteControlMessage> > > ns3::LtePhy::GetControlMessages() [member function]
+    ## lte-phy.h (module 'lte'): std::list<ns3::Ptr<ns3::LteControlMessage>, std::allocator<ns3::Ptr<ns3::LteControlMessage>>> ns3::LtePhy::GetControlMessages() [member function]
     cls.add_method('GetControlMessages', 
                    'std::list< ns3::Ptr< ns3::LteControlMessage > >', 
                    [])
@@ -14890,9 +15063,9 @@
                    'ns3::Ptr< ns3::SpectrumModel const >', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## lte-spectrum-phy.h (module 'lte'): ns3::Ptr<ns3::AntennaModel> ns3::LteSpectrumPhy::GetRxAntenna() const [member function]
-    cls.add_method('GetRxAntenna', 
-                   'ns3::Ptr< ns3::AntennaModel >', 
+    ## lte-spectrum-phy.h (module 'lte'): ns3::Ptr<ns3::Object> ns3::LteSpectrumPhy::GetAntenna() const [member function]
+    cls.add_method('GetAntenna', 
+                   'ns3::Ptr< ns3::Object >', 
                    [], 
                    is_const=True, is_virtual=True)
     ## lte-spectrum-phy.h (module 'lte'): void ns3::LteSpectrumPhy::StartRx(ns3::Ptr<ns3::SpectrumSignalParameters> params) [member function]
@@ -14932,11 +15105,11 @@
     cls.add_method('SetAntenna', 
                    'void', 
                    [param('ns3::Ptr< ns3::AntennaModel >', 'a')])
-    ## lte-spectrum-phy.h (module 'lte'): bool ns3::LteSpectrumPhy::StartTxDataFrame(ns3::Ptr<ns3::PacketBurst> pb, std::list<ns3::Ptr<ns3::LteControlMessage>, std::allocator<ns3::Ptr<ns3::LteControlMessage> > > ctrlMsgList, ns3::Time duration) [member function]
+    ## lte-spectrum-phy.h (module 'lte'): bool ns3::LteSpectrumPhy::StartTxDataFrame(ns3::Ptr<ns3::PacketBurst> pb, std::list<ns3::Ptr<ns3::LteControlMessage>, std::allocator<ns3::Ptr<ns3::LteControlMessage>>> ctrlMsgList, ns3::Time duration) [member function]
     cls.add_method('StartTxDataFrame', 
                    'bool', 
                    [param('ns3::Ptr< ns3::PacketBurst >', 'pb'), param('std::list< ns3::Ptr< ns3::LteControlMessage > >', 'ctrlMsgList'), param('ns3::Time', 'duration')])
-    ## lte-spectrum-phy.h (module 'lte'): bool ns3::LteSpectrumPhy::StartTxDlCtrlFrame(std::list<ns3::Ptr<ns3::LteControlMessage>, std::allocator<ns3::Ptr<ns3::LteControlMessage> > > ctrlMsgList, bool pss) [member function]
+    ## lte-spectrum-phy.h (module 'lte'): bool ns3::LteSpectrumPhy::StartTxDlCtrlFrame(std::list<ns3::Ptr<ns3::LteControlMessage>, std::allocator<ns3::Ptr<ns3::LteControlMessage>>> ctrlMsgList, bool pss) [member function]
     cls.add_method('StartTxDlCtrlFrame', 
                    'bool', 
                    [param('std::list< ns3::Ptr< ns3::LteControlMessage > >', 'ctrlMsgList'), param('bool', 'pss')])
@@ -15008,7 +15181,7 @@
     cls.add_method('AddCtrlSinrChunkProcessor', 
                    'void', 
                    [param('ns3::Ptr< ns3::LteChunkProcessor >', 'p')])
-    ## lte-spectrum-phy.h (module 'lte'): void ns3::LteSpectrumPhy::AddExpectedTb(uint16_t rnti, uint8_t ndi, uint16_t size, uint8_t mcs, std::vector<int, std::allocator<int> > map, uint8_t layer, uint8_t harqId, uint8_t rv, bool downlink) [member function]
+    ## lte-spectrum-phy.h (module 'lte'): void ns3::LteSpectrumPhy::AddExpectedTb(uint16_t rnti, uint8_t ndi, uint16_t size, uint8_t mcs, std::vector<int, std::allocator<int>> map, uint8_t layer, uint8_t harqId, uint8_t rv, bool downlink) [member function]
     cls.add_method('AddExpectedTb', 
                    'void', 
                    [param('uint16_t', 'rnti'), param('uint8_t', 'ndi'), param('uint16_t', 'size'), param('uint8_t', 'mcs'), param('std::vector< int >', 'map'), param('uint8_t', 'layer'), param('uint8_t', 'harqId'), param('uint8_t', 'rv'), param('bool', 'downlink')])
@@ -15108,11 +15281,11 @@
                    'ns3::LteUePhy::State', 
                    [], 
                    is_const=True)
-    ## lte-ue-phy.h (module 'lte'): std::vector<int, std::allocator<int> > ns3::LteUePhy::GetSubChannelsForReception() [member function]
+    ## lte-ue-phy.h (module 'lte'): std::vector<int, std::allocator<int>> ns3::LteUePhy::GetSubChannelsForReception() [member function]
     cls.add_method('GetSubChannelsForReception', 
                    'std::vector< int >', 
                    [])
-    ## lte-ue-phy.h (module 'lte'): std::vector<int, std::allocator<int> > ns3::LteUePhy::GetSubChannelsForTransmission() [member function]
+    ## lte-ue-phy.h (module 'lte'): std::vector<int, std::allocator<int>> ns3::LteUePhy::GetSubChannelsForTransmission() [member function]
     cls.add_method('GetSubChannelsForTransmission', 
                    'std::vector< int >', 
                    [])
@@ -15140,7 +15313,7 @@
     cls.add_method('PhyPduReceived', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet >', 'p')])
-    ## lte-ue-phy.h (module 'lte'): void ns3::LteUePhy::ReceiveLteControlMessageList(std::list<ns3::Ptr<ns3::LteControlMessage>, std::allocator<ns3::Ptr<ns3::LteControlMessage> > > msgList) [member function]
+    ## lte-ue-phy.h (module 'lte'): void ns3::LteUePhy::ReceiveLteControlMessageList(std::list<ns3::Ptr<ns3::LteControlMessage>, std::allocator<ns3::Ptr<ns3::LteControlMessage>>> msgList) [member function]
     cls.add_method('ReceiveLteControlMessageList', 
                    'void', 
                    [param('std::list< ns3::Ptr< ns3::LteControlMessage > >', 'msgList')], 
@@ -15185,11 +15358,11 @@
     cls.add_method('SetNoiseFigure', 
                    'void', 
                    [param('double', 'nf')])
-    ## lte-ue-phy.h (module 'lte'): void ns3::LteUePhy::SetSubChannelsForReception(std::vector<int, std::allocator<int> > mask) [member function]
+    ## lte-ue-phy.h (module 'lte'): void ns3::LteUePhy::SetSubChannelsForReception(std::vector<int, std::allocator<int>> mask) [member function]
     cls.add_method('SetSubChannelsForReception', 
                    'void', 
                    [param('std::vector< int >', 'mask')])
-    ## lte-ue-phy.h (module 'lte'): void ns3::LteUePhy::SetSubChannelsForTransmission(std::vector<int, std::allocator<int> > mask) [member function]
+    ## lte-ue-phy.h (module 'lte'): void ns3::LteUePhy::SetSubChannelsForTransmission(std::vector<int, std::allocator<int>> mask) [member function]
     cls.add_method('SetSubChannelsForTransmission', 
                    'void', 
                    [param('std::vector< int >', 'mask')])
@@ -15258,15 +15431,15 @@
     cls.add_method('GetPcmax', 
                    'double', 
                    [])
-    ## lte-ue-power-control.h (module 'lte'): double ns3::LteUePowerControl::GetPucchTxPower(std::vector<int, std::allocator<int> > rb) [member function]
+    ## lte-ue-power-control.h (module 'lte'): double ns3::LteUePowerControl::GetPucchTxPower(std::vector<int, std::allocator<int>> rb) [member function]
     cls.add_method('GetPucchTxPower', 
                    'double', 
                    [param('std::vector< int >', 'rb')])
-    ## lte-ue-power-control.h (module 'lte'): double ns3::LteUePowerControl::GetPuschTxPower(std::vector<int, std::allocator<int> > rb) [member function]
+    ## lte-ue-power-control.h (module 'lte'): double ns3::LteUePowerControl::GetPuschTxPower(std::vector<int, std::allocator<int>> rb) [member function]
     cls.add_method('GetPuschTxPower', 
                    'double', 
                    [param('std::vector< int >', 'rb')])
-    ## lte-ue-power-control.h (module 'lte'): double ns3::LteUePowerControl::GetSrsTxPower(std::vector<int, std::allocator<int> > rb) [member function]
+    ## lte-ue-power-control.h (module 'lte'): double ns3::LteUePowerControl::GetSrsTxPower(std::vector<int, std::allocator<int>> rb) [member function]
     cls.add_method('GetSrsTxPower', 
                    'double', 
                    [param('std::vector< int >', 'rb')])
@@ -15696,10 +15869,16 @@
     cls.add_method('ExtractNeighborIndex', 
                    'uint32_t', 
                    [param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetEpoch() const [member function]
+    cls.add_method('GetEpoch', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() const [member function]
     cls.add_method('GetRemainingBits', 
                    'uint32_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -15710,6 +15889,10 @@
                    'uint32_t', 
                    [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
+    ## nix-vector.h (module 'network'): void ns3::NixVector::SetEpoch(uint32_t epoch) [member function]
+    cls.add_method('SetEpoch', 
+                   'void', 
+                   [param('uint32_t', 'epoch')])
     return
 
 def register_Ns3Node_methods(root_module, cls):
@@ -16086,10 +16269,11 @@
                    'uint32_t', 
                    [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) const [member function]
     cls.add_method('SetNixVector', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')], 
+                   is_const=True)
     ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
     cls.add_method('ToString', 
                    'std::string', 
@@ -16298,12 +16482,12 @@
     cls.add_method('Transmit', 
                    'void', 
                    [param('ns3::Time', 'txDuration'), param('ns3::Ptr< ns3::WifiPpdu >', 'ppdu'), param('std::string', 'type')])
-    ## phy-entity.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> >::const_iterator ns3::PhyEntity::begin() const [member function]
+    ## phy-entity.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode>>::const_iterator ns3::PhyEntity::begin() const [member function]
     cls.add_method('begin', 
                    'std::list< ns3::WifiMode > const_iterator', 
                    [], 
                    is_const=True)
-    ## phy-entity.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> >::const_iterator ns3::PhyEntity::end() const [member function]
+    ## phy-entity.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode>>::const_iterator ns3::PhyEntity::end() const [member function]
     cls.add_method('end', 
                    'std::list< ns3::WifiMode > const_iterator', 
                    [], 
@@ -16388,7 +16572,7 @@
                    'uint16_t', 
                    [param('ns3::WifiTxVector const &', 'txVector')], 
                    is_const=True, visibility='protected')
-    ## phy-entity.h (module 'wifi'): std::pair<unsigned short, std::pair<unsigned int, unsigned int> > ns3::PhyEntity::GetChannelWidthAndBand(ns3::WifiTxVector const & txVector, uint16_t staId) const [member function]
+    ## phy-entity.h (module 'wifi'): std::pair<unsigned short, std::pair<unsigned int, unsigned int>> ns3::PhyEntity::GetChannelWidthAndBand(ns3::WifiTxVector const & txVector, uint16_t staId) const [member function]
     cls.add_method('GetChannelWidthAndBand', 
                    'std::pair< unsigned short, std::pair< unsigned int, unsigned int > >', 
                    [param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId')], 
@@ -16398,7 +16582,7 @@
                    'ns3::Ptr< ns3::Event const >', 
                    [], 
                    is_const=True, visibility='protected')
-    ## phy-entity.h (module 'wifi'): std::map<std::pair<unsigned long long, ns3::WifiPreamble>, ns3::Ptr<ns3::Event>, std::less<std::pair<unsigned long long, ns3::WifiPreamble> >, std::allocator<std::pair<const std::pair<unsigned long long, ns3::WifiPreamble>, ns3::Ptr<ns3::Event> > > > const & ns3::PhyEntity::GetCurrentPreambleEvents() const [member function]
+    ## phy-entity.h (module 'wifi'): std::map<std::pair<unsigned long long, ns3::WifiPreamble>, ns3::Ptr<ns3::Event>, std::less<std::pair<unsigned long long, ns3::WifiPreamble>>, std::allocator<std::pair<const std::pair<unsigned long long, ns3::WifiPreamble>, ns3::Ptr<ns3::Event>>>> const & ns3::PhyEntity::GetCurrentPreambleEvents() const [member function]
     cls.add_method('GetCurrentPreambleEvents', 
                    'std::map< std::pair< unsigned long long, ns3::WifiPreamble >, ns3::Ptr< ns3::Event > > const &', 
                    [], 
@@ -16453,6 +16637,11 @@
                    'void', 
                    [param('bool', 'reset')], 
                    visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::NotifyPayloadBegin(ns3::WifiTxVector const & txVector, ns3::Time const & payloadDuration) [member function]
+    cls.add_method('NotifyPayloadBegin', 
+                   'void', 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time const &', 'payloadDuration')], 
+                   visibility='protected')
     ## phy-entity.h (module 'wifi'): uint64_t ns3::PhyEntity::ObtainNextUid(ns3::WifiTxVector const & txVector) [member function]
     cls.add_method('ObtainNextUid', 
                    'uint64_t', 
@@ -16584,12 +16773,12 @@
                    'uint16_t', 
                    [], 
                    is_const=True)
-    ## lte-control-messages.h (module 'lte'): std::list<ns3::RarLteControlMessage::Rar, std::allocator<ns3::RarLteControlMessage::Rar> >::const_iterator ns3::RarLteControlMessage::RarListBegin() const [member function]
+    ## lte-control-messages.h (module 'lte'): std::list<ns3::RarLteControlMessage::Rar, std::allocator<ns3::RarLteControlMessage::Rar>>::const_iterator ns3::RarLteControlMessage::RarListBegin() const [member function]
     cls.add_method('RarListBegin', 
                    'std::list< ns3::RarLteControlMessage::Rar > const_iterator', 
                    [], 
                    is_const=True)
-    ## lte-control-messages.h (module 'lte'): std::list<ns3::RarLteControlMessage::Rar, std::allocator<ns3::RarLteControlMessage::Rar> >::const_iterator ns3::RarLteControlMessage::RarListEnd() const [member function]
+    ## lte-control-messages.h (module 'lte'): std::list<ns3::RarLteControlMessage::Rar, std::allocator<ns3::RarLteControlMessage::Rar>>::const_iterator ns3::RarLteControlMessage::RarListEnd() const [member function]
     cls.add_method('RarListEnd', 
                    'std::list< ns3::RarLteControlMessage::Rar > const_iterator', 
                    [], 
@@ -16679,7 +16868,7 @@
     cls.add_constructor([param('ns3::ReceiveListErrorModel const &', 'arg0')])
     ## error-model.h (module 'network'): ns3::ReceiveListErrorModel::ReceiveListErrorModel() [constructor]
     cls.add_constructor([])
-    ## error-model.h (module 'network'): std::list<unsigned int, std::allocator<unsigned int> > ns3::ReceiveListErrorModel::GetList() const [member function]
+    ## error-model.h (module 'network'): std::list<unsigned int, std::allocator<unsigned int>> ns3::ReceiveListErrorModel::GetList() const [member function]
     cls.add_method('GetList', 
                    'std::list< unsigned int >', 
                    [], 
@@ -16689,7 +16878,7 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## error-model.h (module 'network'): void ns3::ReceiveListErrorModel::SetList(std::list<unsigned int, std::allocator<unsigned int> > const & packetlist) [member function]
+    ## error-model.h (module 'network'): void ns3::ReceiveListErrorModel::SetList(std::list<unsigned int, std::allocator<unsigned int>> const & packetlist) [member function]
     cls.add_method('SetList', 
                    'void', 
                    [param('std::list< unsigned int > const &', 'packetlist')])
@@ -16766,6 +16955,10 @@
     cls.add_constructor([param('ns3::SpectrumChannel const &', 'arg0')])
     ## spectrum-channel.h (module 'spectrum'): ns3::SpectrumChannel::SpectrumChannel() [constructor]
     cls.add_constructor([])
+    ## spectrum-channel.h (module 'spectrum'): void ns3::SpectrumChannel::AddPhasedArraySpectrumPropagationLossModel(ns3::Ptr<ns3::PhasedArraySpectrumPropagationLossModel> loss) [member function]
+    cls.add_method('AddPhasedArraySpectrumPropagationLossModel', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::PhasedArraySpectrumPropagationLossModel >', 'loss')])
     ## spectrum-channel.h (module 'spectrum'): void ns3::SpectrumChannel::AddPropagationLossModel(ns3::Ptr<ns3::PropagationLossModel> loss) [member function]
     cls.add_method('AddPropagationLossModel', 
                    'void', 
@@ -16784,6 +16977,10 @@
                    'void', 
                    [], 
                    is_virtual=True)
+    ## spectrum-channel.h (module 'spectrum'): ns3::Ptr<ns3::PhasedArraySpectrumPropagationLossModel> ns3::SpectrumChannel::GetPhasedArraySpectrumPropagationLossModel() [member function]
+    cls.add_method('GetPhasedArraySpectrumPropagationLossModel', 
+                   'ns3::Ptr< ns3::PhasedArraySpectrumPropagationLossModel >', 
+                   [])
     ## spectrum-channel.h (module 'spectrum'): ns3::Ptr<ns3::PropagationLossModel> ns3::SpectrumChannel::GetPropagationLossModel() [member function]
     cls.add_method('GetPropagationLossModel', 
                    'ns3::Ptr< ns3::PropagationLossModel >', 
@@ -16797,6 +16994,11 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## spectrum-channel.h (module 'spectrum'): void ns3::SpectrumChannel::RemoveRx(ns3::Ptr<ns3::SpectrumPhy> phy) [member function]
+    cls.add_method('RemoveRx', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::SpectrumPhy >', 'phy')], 
+                   is_pure_virtual=True, is_virtual=True)
     ## spectrum-channel.h (module 'spectrum'): void ns3::SpectrumChannel::SetPropagationDelayModel(ns3::Ptr<ns3::PropagationDelayModel> delay) [member function]
     cls.add_method('SetPropagationDelayModel', 
                    'void', 
@@ -17209,47 +17411,47 @@
                    is_virtual=True, visibility='private')
     return
 
-def register_Ns3CallbackImpl__Bool_Ns3Ptr__lt__ns3Socket__gt___Const_ns3Address___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+def register_Ns3CallbackImpl__Bool_Const_ns3WifiTxVector___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< bool, ns3::Ptr< ns3::Socket >, ns3::Address const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    ## callback.h (module 'core'): ns3::CallbackImpl<bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< bool, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
     cls.add_method('DoGetTypeid', 
                    'std::string', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
     cls.add_method('GetTypeid', 
                    'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): bool ns3::CallbackImpl<bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<ns3::Socket> arg0, ns3::Address const & arg1) [member operator]
+    ## callback.h (module 'core'): bool ns3::CallbackImpl<bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::WifiTxVector const & arg0) [member operator]
     cls.add_method('operator()', 
                    'bool', 
-                   [param('ns3::Ptr< ns3::Socket >', 'arg0'), param('ns3::Address const &', 'arg1')], 
+                   [param('ns3::WifiTxVector const &', 'arg0')], 
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3CallbackImpl__Bool_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+def register_Ns3CallbackImpl__Bool_Ns3Ptr__lt__ns3Socket__gt___Const_ns3Address___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    ## callback.h (module 'core'): ns3::CallbackImpl<bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< bool, ns3::Ptr< ns3::Socket >, ns3::Address const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
     cls.add_method('DoGetTypeid', 
                    'std::string', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
     cls.add_method('GetTypeid', 
                    'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): bool ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(short unsigned int arg0, unsigned char arg1) [member operator]
+    ## callback.h (module 'core'): bool ns3::CallbackImpl<bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<ns3::Socket> arg0, ns3::Address const & arg1) [member operator]
     cls.add_method('operator()', 
                    'bool', 
-                   [param('short unsigned int', 'arg0'), param('unsigned char', 'arg1')], 
+                   [param('ns3::Ptr< ns3::Socket >', 'arg0'), param('ns3::Address const &', 'arg1')], 
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
@@ -17319,28 +17521,6 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3CallbackImpl__Unsigned_long_Unsigned_short_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): long unsigned int ns3::CallbackImpl<unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(short unsigned int arg0, short unsigned int arg1, unsigned char arg2) [member operator]
-    cls.add_method('operator()', 
-                   'long unsigned int', 
-                   [param('short unsigned int', 'arg0'), param('short unsigned int', 'arg1'), param('unsigned char', 'arg2')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
 def register_Ns3CallbackImpl__Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
     ## callback.h (module 'core'): ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
@@ -17671,22 +17851,22 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___StdMap__lt__stdPair__lt__unsigned_int__unsigned_int__gt____double__stdLess__lt__stdPair__lt__unsigned_int__unsigned_int__gt_____gt____stdAllocator__lt__stdPair__lt__const_stdPair__lt__unsigned_int__unsigned_int__gt____double__gt_____gt_____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___StdMap__lt__stdPair__lt__unsigned_int__unsigned_int__gt____double__stdLess__lt__stdPair__lt__unsigned_int__unsigned_int__gt____gt____stdAllocator__lt__stdPair__lt__const_stdPair__lt__unsigned_int__unsigned_int__gt____double__gt____gt____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int>>, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double>>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int>>, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double>>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int>>, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double>>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
     cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::Packet const >, std::map< std::pair< unsigned int, unsigned int >, double >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int>>, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double>>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
     cls.add_method('DoGetTypeid', 
                    'std::string', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int>>, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double>>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
     cls.add_method('GetTypeid', 
                    'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::Packet> arg0, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > > arg1) [member operator]
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int>>, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double>>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::Packet> arg0, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int>>, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double>>> arg1) [member operator]
     cls.add_method('operator()', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet const >', 'arg0'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'arg1')], 
@@ -17958,22 +18138,22 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiPsdu__gt___Ns3RxSignalInfo_Ns3WifiTxVector_StdVector__lt__bool__stdAllocator__lt__bool__gt_____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiPsdu__gt___Ns3RxSignalInfo_Ns3WifiTxVector_StdVector__lt__bool__stdAllocator__lt__bool__gt____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
     cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::WifiPsdu >, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
     cls.add_method('DoGetTypeid', 
                    'std::string', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
     cls.add_method('GetTypeid', 
                    'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<ns3::WifiPsdu> arg0, ns3::RxSignalInfo arg1, ns3::WifiTxVector arg2, std::vector<bool, std::allocator<bool> > arg3) [member operator]
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<ns3::WifiPsdu> arg0, ns3::RxSignalInfo arg1, ns3::WifiTxVector arg2, std::vector<bool, std::allocator<bool>> arg3) [member operator]
     cls.add_method('operator()', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiPsdu >', 'arg0'), param('ns3::RxSignalInfo', 'arg1'), param('ns3::WifiTxVector', 'arg2'), param('std::vector< bool >', 'arg3')], 
@@ -18069,22 +18249,22 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3CallbackImpl__Void_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__const_ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__const_ns3WifiPsdu__gt_____gt_____gt_____gt___Ns3WifiTxVector_Double_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+def register_Ns3CallbackImpl__Void_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__const_ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__const_ns3WifiPsdu__gt____gt____gt____gt___Ns3WifiTxVector_Double_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu>>>>, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu>>>>, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu>>>>, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
     cls.add_constructor([param('ns3::CallbackImpl< void, std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu>>>>, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
     cls.add_method('DoGetTypeid', 
                    'std::string', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu>>>>, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
     cls.add_method('GetTypeid', 
                    'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > > arg0, ns3::WifiTxVector arg1, double arg2) [member operator]
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu>>>>, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu>>>> arg0, ns3::WifiTxVector arg1, double arg2) [member operator]
     cls.add_method('operator()', 
                    'void', 
                    [param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'arg0'), param('ns3::WifiTxVector', 'arg1'), param('double', 'arg2')], 
@@ -18092,22 +18272,22 @@
     cls.add_copy_constructor()
     return
 
-def register_Ns3CallbackImpl__Void_Unsigned_short_Const_stdVector__lt__int__stdAllocator__lt__int__gt_____gt_____amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned short, const std::vector<int, std::allocator<int> > &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+def register_Ns3CallbackImpl__Void_Unsigned_short_Const_stdVector__lt__int__stdAllocator__lt__int__gt____gt_____amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned short, const std::vector<int, std::allocator<int>> &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned short, const std::vector<int, std::allocator<int> > &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, unsigned short, const std::vector<int, std::allocator<int> > &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned short, const std::vector<int, std::allocator<int>> &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, unsigned short, const std::vector<int, std::allocator<int>> &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
     cls.add_constructor([param('ns3::CallbackImpl< void, unsigned short, std::vector< int, std::allocator< int > > const, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, unsigned short, const std::vector<int, std::allocator<int> > &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, unsigned short, const std::vector<int, std::allocator<int>> &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
     cls.add_method('DoGetTypeid', 
                    'std::string', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, unsigned short, const std::vector<int, std::allocator<int> > &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, unsigned short, const std::vector<int, std::allocator<int>> &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
     cls.add_method('GetTypeid', 
                    'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned short, const std::vector<int, std::allocator<int> > &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(short unsigned int arg0, std::vector<int, std::allocator<int> > const & arg1) [member operator]
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned short, const std::vector<int, std::allocator<int>> &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(short unsigned int arg0, std::vector<int, std::allocator<int>> const & arg1) [member operator]
     cls.add_method('operator()', 
                    'void', 
                    [param('short unsigned int', 'arg0'), param('std::vector< int > const &', 'arg1')], 
@@ -18299,7 +18479,7 @@
     cls.add_constructor([])
     ## lte-enb-phy.h (module 'lte'): ns3::LteEnbPhy::LteEnbPhy(ns3::Ptr<ns3::LteSpectrumPhy> dlPhy, ns3::Ptr<ns3::LteSpectrumPhy> ulPhy) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::LteSpectrumPhy >', 'dlPhy'), param('ns3::Ptr< ns3::LteSpectrumPhy >', 'ulPhy')])
-    ## lte-enb-phy.h (module 'lte'): void ns3::LteEnbPhy::CalcChannelQualityForUe(std::vector<double, std::allocator<double> > sinr, ns3::Ptr<ns3::LteSpectrumPhy> ue) [member function]
+    ## lte-enb-phy.h (module 'lte'): void ns3::LteEnbPhy::CalcChannelQualityForUe(std::vector<double, std::allocator<double>> sinr, ns3::Ptr<ns3::LteSpectrumPhy> ue) [member function]
     cls.add_method('CalcChannelQualityForUe', 
                    'void', 
                    [param('std::vector< double >', 'sinr'), param('ns3::Ptr< ns3::LteSpectrumPhy >', 'ue')])
@@ -18321,7 +18501,7 @@
                    'ns3::Ptr< ns3::SpectrumValue >', 
                    [], 
                    is_virtual=True)
-    ## lte-enb-phy.h (module 'lte'): std::list<ns3::UlDciLteControlMessage, std::allocator<ns3::UlDciLteControlMessage> > ns3::LteEnbPhy::DequeueUlDci() [member function]
+    ## lte-enb-phy.h (module 'lte'): std::list<ns3::UlDciLteControlMessage, std::allocator<ns3::UlDciLteControlMessage>> ns3::LteEnbPhy::DequeueUlDci() [member function]
     cls.add_method('DequeueUlDci', 
                    'std::list< ns3::UlDciLteControlMessage >', 
                    [])
@@ -18367,7 +18547,7 @@
                    'ns3::Ptr< ns3::LteSpectrumPhy >', 
                    [], 
                    is_const=True)
-    ## lte-enb-phy.h (module 'lte'): std::vector<int, std::allocator<int> > ns3::LteEnbPhy::GetDownlinkSubChannels() [member function]
+    ## lte-enb-phy.h (module 'lte'): std::vector<int, std::allocator<int>> ns3::LteEnbPhy::GetDownlinkSubChannels() [member function]
     cls.add_method('GetDownlinkSubChannels', 
                    'std::vector< int >', 
                    [])
@@ -18417,10 +18597,10 @@
                    'void', 
                    [param('ns3::Ptr< ns3::LteControlMessage >', 'msg')], 
                    is_virtual=True)
-    ## lte-enb-phy.h (module 'lte'): void ns3::LteEnbPhy::ReceiveLteControlMessageList(std::list<ns3::Ptr<ns3::LteControlMessage>, std::allocator<ns3::Ptr<ns3::LteControlMessage> > > arg0) [member function]
+    ## lte-enb-phy.h (module 'lte'): void ns3::LteEnbPhy::ReceiveLteControlMessageList(std::list<ns3::Ptr<ns3::LteControlMessage>, std::allocator<ns3::Ptr<ns3::LteControlMessage>>> msgList) [member function]
     cls.add_method('ReceiveLteControlMessageList', 
                    'void', 
-                   [param('std::list< ns3::Ptr< ns3::LteControlMessage > >', 'arg0')], 
+                   [param('std::list< ns3::Ptr< ns3::LteControlMessage > >', 'msgList')], 
                    is_virtual=True)
     ## lte-enb-phy.h (module 'lte'): void ns3::LteEnbPhy::ReportInterference(ns3::SpectrumValue const & interf) [member function]
     cls.add_method('ReportInterference', 
@@ -18437,7 +18617,7 @@
                    'void', 
                    [param('ns3::UlInfoListElement_s', 'mes')], 
                    is_virtual=True)
-    ## lte-enb-phy.h (module 'lte'): void ns3::LteEnbPhy::SendControlChannels(std::list<ns3::Ptr<ns3::LteControlMessage>, std::allocator<ns3::Ptr<ns3::LteControlMessage> > > ctrlMsgList) [member function]
+    ## lte-enb-phy.h (module 'lte'): void ns3::LteEnbPhy::SendControlChannels(std::list<ns3::Ptr<ns3::LteControlMessage>, std::allocator<ns3::Ptr<ns3::LteControlMessage>>> ctrlMsgList) [member function]
     cls.add_method('SendControlChannels', 
                    'void', 
                    [param('std::list< ns3::Ptr< ns3::LteControlMessage > >', 'ctrlMsgList')])
@@ -18445,11 +18625,11 @@
     cls.add_method('SendDataChannels', 
                    'void', 
                    [param('ns3::Ptr< ns3::PacketBurst >', 'pb')])
-    ## lte-enb-phy.h (module 'lte'): void ns3::LteEnbPhy::SetDownlinkSubChannels(std::vector<int, std::allocator<int> > mask) [member function]
+    ## lte-enb-phy.h (module 'lte'): void ns3::LteEnbPhy::SetDownlinkSubChannels(std::vector<int, std::allocator<int>> mask) [member function]
     cls.add_method('SetDownlinkSubChannels', 
                    'void', 
                    [param('std::vector< int >', 'mask')])
-    ## lte-enb-phy.h (module 'lte'): void ns3::LteEnbPhy::SetDownlinkSubChannelsWithPowerAllocation(std::vector<int, std::allocator<int> > mask) [member function]
+    ## lte-enb-phy.h (module 'lte'): void ns3::LteEnbPhy::SetDownlinkSubChannelsWithPowerAllocation(std::vector<int, std::allocator<int>> mask) [member function]
     cls.add_method('SetDownlinkSubChannelsWithPowerAllocation', 
                    'void', 
                    [param('std::vector< int >', 'mask')])
@@ -18700,11 +18880,11 @@
     cls.add_method('GetTargetEnb', 
                    'ns3::Ptr< ns3::LteEnbNetDevice >', 
                    [])
-    ## lte-ue-net-device.h (module 'lte'): void ns3::LteUeNetDevice::SetCcMap(std::map<unsigned char, ns3::Ptr<ns3::ComponentCarrierUe>, std::less<unsigned char>, std::allocator<std::pair<const unsigned char, ns3::Ptr<ns3::ComponentCarrierUe> > > > ccm) [member function]
+    ## lte-ue-net-device.h (module 'lte'): void ns3::LteUeNetDevice::SetCcMap(std::map<unsigned char, ns3::Ptr<ns3::ComponentCarrierUe>, std::less<unsigned char>, std::allocator<std::pair<const unsigned char, ns3::Ptr<ns3::ComponentCarrierUe>>>> ccm) [member function]
     cls.add_method('SetCcMap', 
                    'void', 
                    [param('std::map< unsigned char, ns3::Ptr< ns3::ComponentCarrierUe > >', 'ccm')])
-    ## lte-ue-net-device.h (module 'lte'): std::map<unsigned char, ns3::Ptr<ns3::ComponentCarrierUe>, std::less<unsigned char>, std::allocator<std::pair<const unsigned char, ns3::Ptr<ns3::ComponentCarrierUe> > > > ns3::LteUeNetDevice::GetCcMap() [member function]
+    ## lte-ue-net-device.h (module 'lte'): std::map<unsigned char, ns3::Ptr<ns3::ComponentCarrierUe>, std::less<unsigned char>, std::allocator<std::pair<const unsigned char, ns3::Ptr<ns3::ComponentCarrierUe>>>> ns3::LteUeNetDevice::GetCcMap() [member function]
     cls.add_method('GetCcMap', 
                    'std::map< unsigned char, ns3::Ptr< ns3::ComponentCarrierUe > >', 
                    [])
@@ -18768,6 +18948,11 @@
                    'uint16_t', 
                    [], 
                    is_const=True)
+    ## lte-enb-net-device.h (module 'lte'): std::vector<unsigned short, std::allocator<unsigned short>> ns3::LteEnbNetDevice::GetCellIds() const [member function]
+    cls.add_method('GetCellIds', 
+                   'std::vector< unsigned short >', 
+                   [], 
+                   is_const=True)
     ## lte-enb-net-device.h (module 'lte'): bool ns3::LteEnbNetDevice::HasCellId(uint16_t cellId) const [member function]
     cls.add_method('HasCellId', 
                    'bool', 
@@ -18827,11 +19012,11 @@
     cls.add_method('SetCsgIndication', 
                    'void', 
                    [param('bool', 'csgIndication')])
-    ## lte-enb-net-device.h (module 'lte'): void ns3::LteEnbNetDevice::SetCcMap(std::map<unsigned char, ns3::Ptr<ns3::ComponentCarrierBaseStation>, std::less<unsigned char>, std::allocator<std::pair<const unsigned char, ns3::Ptr<ns3::ComponentCarrierBaseStation> > > > ccm) [member function]
+    ## lte-enb-net-device.h (module 'lte'): void ns3::LteEnbNetDevice::SetCcMap(std::map<unsigned char, ns3::Ptr<ns3::ComponentCarrierBaseStation>, std::less<unsigned char>, std::allocator<std::pair<const unsigned char, ns3::Ptr<ns3::ComponentCarrierBaseStation>>>> ccm) [member function]
     cls.add_method('SetCcMap', 
                    'void', 
                    [param('std::map< unsigned char, ns3::Ptr< ns3::ComponentCarrierBaseStation > >', 'ccm')])
-    ## lte-enb-net-device.h (module 'lte'): std::map<unsigned char, ns3::Ptr<ns3::ComponentCarrierBaseStation>, std::less<unsigned char>, std::allocator<std::pair<const unsigned char, ns3::Ptr<ns3::ComponentCarrierBaseStation> > > > ns3::LteEnbNetDevice::GetCcMap() const [member function]
+    ## lte-enb-net-device.h (module 'lte'): std::map<unsigned char, ns3::Ptr<ns3::ComponentCarrierBaseStation>, std::less<unsigned char>, std::allocator<std::pair<const unsigned char, ns3::Ptr<ns3::ComponentCarrierBaseStation>>>> ns3::LteEnbNetDevice::GetCcMap() const [member function]
     cls.add_method('GetCcMap', 
                    'std::map< unsigned char, ns3::Ptr< ns3::ComponentCarrierBaseStation > >', 
                    [], 
@@ -18848,7 +19033,7 @@
     cls.add_constructor([param('ns3::Config::MatchContainer const &', 'arg0')])
     ## config.h (module 'core'): ns3::Config::MatchContainer::MatchContainer() [constructor]
     cls.add_constructor([])
-    ## config.h (module 'core'): ns3::Config::MatchContainer::MatchContainer(std::vector<ns3::Ptr<ns3::Object>, std::allocator<ns3::Ptr<ns3::Object> > > const & objects, std::vector<std::basic_string<char>, std::allocator<std::basic_string<char> > > const & contexts, std::string path) [constructor]
+    ## config.h (module 'core'): ns3::Config::MatchContainer::MatchContainer(std::vector<ns3::Ptr<ns3::Object>, std::allocator<ns3::Ptr<ns3::Object>>> const & objects, std::vector<std::basic_string<char>, std::allocator<std::basic_string<char>>> const & contexts, std::string path) [constructor]
     cls.add_constructor([param('std::vector< ns3::Ptr< ns3::Object > > const &', 'objects'), param('std::vector< std::string > const &', 'contexts'), param('std::string', 'path')])
     ## config.h (module 'core'): ns3::Config::MatchContainer::Iterator ns3::Config::MatchContainer::Begin() const [member function]
     cls.add_method('Begin', 
@@ -18912,6 +19097,21 @@
     cls.add_method('SetFailSafe', 
                    'bool', 
                    [param('std::string', 'name'), param('ns3::AttributeValue const &', 'value')])
+    ## config.h (module 'core'): ns3::Config::MatchContainer::Iterator ns3::Config::MatchContainer::begin() const [member function]
+    cls.add_method('begin', 
+                   'ns3::Config::MatchContainer::Iterator', 
+                   [], 
+                   is_const=True)
+    ## config.h (module 'core'): ns3::Config::MatchContainer::Iterator ns3::Config::MatchContainer::end() const [member function]
+    cls.add_method('end', 
+                   'ns3::Config::MatchContainer::Iterator', 
+                   [], 
+                   is_const=True)
+    ## config.h (module 'core'): std::size_t ns3::Config::MatchContainer::size() const [member function]
+    cls.add_method('size', 
+                   'std::size_t', 
+                   [], 
+                   is_const=True)
     return
 
 def register_Ns3HashImplementation_methods(root_module, cls):
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/netanim/bindings/modulegen__gcc_LP64.py ns-3.36/src/netanim/bindings/modulegen__gcc_LP64.py
--- ns-3.35/src/netanim/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/netanim/bindings/modulegen__gcc_LP64.py	2022-04-30 18:23:58.094734700 -0700
@@ -29,15 +29,11 @@
     ## wifi-phy-common.h (module 'wifi'): ns3::WifiPpduType [enumeration]
     module.add_enum('WifiPpduType', ['WIFI_PPDU_TYPE_SU', 'WIFI_PPDU_TYPE_DL_MU', 'WIFI_PPDU_TYPE_UL_MU'], import_from_module='ns.wifi')
     ## wifi-phy-common.h (module 'wifi'): ns3::WifiPhyRxfailureReason [enumeration]
-    module.add_enum('WifiPhyRxfailureReason', ['UNKNOWN', 'UNSUPPORTED_SETTINGS', 'CHANNEL_SWITCHING', 'RXING', 'TXING', 'SLEEPING', 'BUSY_DECODING_PREAMBLE', 'PREAMBLE_DETECT_FAILURE', 'RECEPTION_ABORTED_BY_TX', 'L_SIG_FAILURE', 'HT_SIG_FAILURE', 'SIG_A_FAILURE', 'SIG_B_FAILURE', 'PREAMBLE_DETECTION_PACKET_SWITCH', 'FRAME_CAPTURE_PACKET_SWITCH', 'OBSS_PD_CCA_RESET', 'HE_TB_PPDU_TOO_LATE', 'FILTERED'], import_from_module='ns.wifi')
+    module.add_enum('WifiPhyRxfailureReason', ['UNKNOWN', 'UNSUPPORTED_SETTINGS', 'CHANNEL_SWITCHING', 'RXING', 'TXING', 'SLEEPING', 'POWERED_OFF', 'TRUNCATED_TX', 'BUSY_DECODING_PREAMBLE', 'PREAMBLE_DETECT_FAILURE', 'RECEPTION_ABORTED_BY_TX', 'L_SIG_FAILURE', 'HT_SIG_FAILURE', 'SIG_A_FAILURE', 'SIG_B_FAILURE', 'PREAMBLE_DETECTION_PACKET_SWITCH', 'FRAME_CAPTURE_PACKET_SWITCH', 'OBSS_PD_CCA_RESET', 'HE_TB_PPDU_TOO_LATE', 'FILTERED'], import_from_module='ns.wifi')
     ## wifi-mpdu-type.h (module 'wifi'): ns3::MpduType [enumeration]
     module.add_enum('MpduType', ['NORMAL_MPDU', 'SINGLE_MPDU', 'FIRST_MPDU_IN_AGGREGATE', 'MIDDLE_MPDU_IN_AGGREGATE', 'LAST_MPDU_IN_AGGREGATE'], import_from_module='ns.wifi')
-    ## wifi-standards.h (module 'wifi'): ns3::WifiPhyStandard [enumeration]
-    module.add_enum('WifiPhyStandard', ['WIFI_PHY_STANDARD_80211a', 'WIFI_PHY_STANDARD_80211b', 'WIFI_PHY_STANDARD_80211g', 'WIFI_PHY_STANDARD_80211p', 'WIFI_PHY_STANDARD_80211n', 'WIFI_PHY_STANDARD_80211ac', 'WIFI_PHY_STANDARD_80211ax', 'WIFI_PHY_STANDARD_UNSPECIFIED'], import_from_module='ns.wifi')
-    ## wifi-standards.h (module 'wifi'): ns3::WifiMacStandard [enumeration]
-    module.add_enum('WifiMacStandard', ['WIFI_MAC_STANDARD_80211', 'WIFI_MAC_STANDARD_80211n', 'WIFI_MAC_STANDARD_80211ac', 'WIFI_MAC_STANDARD_80211ax'], import_from_module='ns.wifi')
     ## wifi-standards.h (module 'wifi'): ns3::WifiStandard [enumeration]
-    module.add_enum('WifiStandard', ['WIFI_STANDARD_80211a', 'WIFI_STANDARD_80211b', 'WIFI_STANDARD_80211g', 'WIFI_STANDARD_80211p', 'WIFI_STANDARD_80211n_2_4GHZ', 'WIFI_STANDARD_80211n_5GHZ', 'WIFI_STANDARD_80211ac', 'WIFI_STANDARD_80211ax_2_4GHZ', 'WIFI_STANDARD_80211ax_5GHZ', 'WIFI_STANDARD_80211ax_6GHZ'], import_from_module='ns.wifi')
+    module.add_enum('WifiStandard', ['WIFI_STANDARD_UNSPECIFIED', 'WIFI_STANDARD_80211a', 'WIFI_STANDARD_80211b', 'WIFI_STANDARD_80211g', 'WIFI_STANDARD_80211p', 'WIFI_STANDARD_80211n', 'WIFI_STANDARD_80211ac', 'WIFI_STANDARD_80211ax'], import_from_module='ns.wifi')
     ## wifi-standards.h (module 'wifi'): ns3::FrequencyChannelType [enumeration]
     module.add_enum('FrequencyChannelType', ['WIFI_PHY_DSSS_CHANNEL', 'WIFI_PHY_OFDM_CHANNEL', 'WIFI_PHY_80211p_CHANNEL'], import_from_module='ns.wifi')
     ## wifi-phy-band.h (module 'wifi'): ns3::WifiPhyBand [enumeration]
@@ -58,6 +54,8 @@
     module.add_enum('MaxSize_e', ['MAX_SIZE'], outer_class=root_module['ns3::Address'], import_from_module='ns.network')
     ## eps-bearer.h (module 'lte'): ns3::AllocationRetentionPriority [struct]
     module.add_class('AllocationRetentionPriority', import_from_module='ns.lte')
+    ## angles.h (module 'antenna'): ns3::Angles [class]
+    module.add_class('Angles', import_from_module='ns.antenna')
     ## animation-interface.h (module 'netanim'): ns3::AnimationInterface [class]
     module.add_class('AnimationInterface')
     ## animation-interface.h (module 'netanim'): ns3::AnimationInterface::CounterType [enumeration]
@@ -169,6 +167,8 @@
     module.add_class('EutranMeasurementMapping', import_from_module='ns.lte')
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'], import_from_module='ns.core')
     ## ff-mac-sched-sap.h (module 'lte'): ns3::FfMacSchedSapProvider [class]
     module.add_class('FfMacSchedSapProvider', allow_subclassing=True, import_from_module='ns.lte')
     ## ff-mac-sched-sap.h (module 'lte'): ns3::FfMacSchedSapProvider::SchedDlCqiInfoReqParameters [struct]
@@ -338,10 +338,12 @@
     module.add_class('MeasResultBestNeighCell', import_from_module='ns.lte', outer_class=root_module['ns3::LteRrcSap'])
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultEutra [struct]
     module.add_class('MeasResultEutra', import_from_module='ns.lte', outer_class=root_module['ns3::LteRrcSap'])
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultScell [struct]
-    module.add_class('MeasResultScell', import_from_module='ns.lte', outer_class=root_module['ns3::LteRrcSap'])
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultServFreqList [struct]
-    module.add_class('MeasResultServFreqList', import_from_module='ns.lte', outer_class=root_module['ns3::LteRrcSap'])
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultPCell [struct]
+    module.add_class('MeasResultPCell', import_from_module='ns.lte', outer_class=root_module['ns3::LteRrcSap'])
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultSCell [struct]
+    module.add_class('MeasResultSCell', import_from_module='ns.lte', outer_class=root_module['ns3::LteRrcSap'])
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultServFreq [struct]
+    module.add_class('MeasResultServFreq', import_from_module='ns.lte', outer_class=root_module['ns3::LteRrcSap'])
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResults [struct]
     module.add_class('MeasResults', import_from_module='ns.lte', outer_class=root_module['ns3::LteRrcSap'])
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasurementReport [struct]
@@ -681,32 +683,27 @@
     typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::ConstellationSizeCallback')
     typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::ConstellationSizeCallback*')
     typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::ConstellationSizeCallback&')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::PhyRateCallback')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::PhyRateCallback*')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::PhyRateCallback&')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::PhyRateFromTxVectorCallback')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::PhyRateFromTxVectorCallback*')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::PhyRateFromTxVectorCallback&')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::DataRateCallback')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::DataRateCallback*')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::DataRateCallback&')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::DataRateFromTxVectorCallback')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::DataRateFromTxVectorCallback*')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::DataRateFromTxVectorCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::PhyRateCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::PhyRateCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::PhyRateCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::DataRateCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::DataRateCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::DataRateCallback&')
     typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::NonHtReferenceRateCallback')
     typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::NonHtReferenceRateCallback*')
     typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::NonHtReferenceRateCallback&')
-    typehandlers.add_type_alias('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::ModeAllowedCallback')
-    typehandlers.add_type_alias('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::ModeAllowedCallback*')
-    typehandlers.add_type_alias('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::ModeAllowedCallback&')
+    typehandlers.add_type_alias('ns3::Callback< bool, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::AllowedCallback')
+    typehandlers.add_type_alias('ns3::Callback< bool, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::AllowedCallback*')
+    typehandlers.add_type_alias('ns3::Callback< bool, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::AllowedCallback&')
     ## wifi-phy-operating-channel.h (module 'wifi'): ns3::WifiPhyOperatingChannel [class]
     module.add_class('WifiPhyOperatingChannel', import_from_module='ns.wifi')
+    typehandlers.add_type_alias('std::set< std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand > > const_iterator', 'ns3::WifiPhyOperatingChannel::ConstIterator')
+    typehandlers.add_type_alias('std::set< std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand > > const_iterator*', 'ns3::WifiPhyOperatingChannel::ConstIterator*')
+    typehandlers.add_type_alias('std::set< std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand > > const_iterator&', 'ns3::WifiPhyOperatingChannel::ConstIterator&')
     ## wifi-spectrum-value-helper.h (module 'spectrum'): ns3::WifiSpectrumValue5MhzFactory [class]
     module.add_class('WifiSpectrumValue5MhzFactory', allow_subclassing=True, import_from_module='ns.spectrum')
     ## wifi-spectrum-value-helper.h (module 'spectrum'): ns3::WifiSpectrumValueHelper [class]
     module.add_class('WifiSpectrumValueHelper', import_from_module='ns.spectrum')
-    ## wifi-standards.h (module 'wifi'): ns3::WifiStandardInfo [struct]
-    module.add_class('WifiStandardInfo', import_from_module='ns.wifi')
     ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector [class]
     module.add_class('WifiTxVector', import_from_module='ns.wifi')
     typehandlers.add_type_alias('std::map< unsigned short, ns3::HeMuUserInfo >', 'ns3::WifiTxVector::HeMuUserInfoMap')
@@ -753,6 +750,13 @@
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::PacketBurst const > )', 'ns3::PacketBurst::TracedCallback')
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::PacketBurst const > )*', 'ns3::PacketBurst::TracedCallback*')
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::PacketBurst const > )&', 'ns3::PacketBurst::TracedCallback&')
+    ## phased-array-model.h (module 'antenna'): ns3::PhasedArrayModel [class]
+    module.add_class('PhasedArrayModel', import_from_module='ns.antenna', parent=root_module['ns3::Object'])
+    typehandlers.add_type_alias('std::vector< std::complex< double > >', 'ns3::PhasedArrayModel::ComplexVector')
+    typehandlers.add_type_alias('std::vector< std::complex< double > >*', 'ns3::PhasedArrayModel::ComplexVector*')
+    typehandlers.add_type_alias('std::vector< std::complex< double > >&', 'ns3::PhasedArrayModel::ComplexVector&')
+    ## phased-array-spectrum-propagation-loss-model.h (module 'spectrum'): ns3::PhasedArraySpectrumPropagationLossModel [class]
+    module.add_class('PhasedArraySpectrumPropagationLossModel', import_from_module='ns.spectrum', parent=root_module['ns3::Object'])
     ## propagation-delay-model.h (module 'propagation'): ns3::PropagationDelayModel [class]
     module.add_class('PropagationDelayModel', import_from_module='ns.propagation', parent=root_module['ns3::Object'])
     ## propagation-loss-model.h (module 'propagation'): ns3::PropagationLossModel [class]
@@ -767,47 +771,47 @@
     module.add_class('RangePropagationLossModel', import_from_module='ns.propagation', parent=root_module['ns3::PropagationLossModel'])
     ## random-variable-stream.h (module 'core'): ns3::SequentialRandomVariable [class]
     module.add_class('SequentialRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Event, ns3::empty, ns3::DefaultDeleter<ns3::Event> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Event, ns3::empty, ns3::DefaultDeleter<ns3::Event>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Event', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Event>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv4MulticastRoute', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv4Route', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv4Route>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LteControlMessage, ns3::empty, ns3::DefaultDeleter<ns3::LteControlMessage> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LteControlMessage, ns3::empty, ns3::DefaultDeleter<ns3::LteControlMessage>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::LteControlMessage', 'ns3::empty', 'ns3::DefaultDeleter<ns3::LteControlMessage>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LteHarqPhy, ns3::empty, ns3::DefaultDeleter<ns3::LteHarqPhy> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LteHarqPhy, ns3::empty, ns3::DefaultDeleter<ns3::LteHarqPhy>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::LteHarqPhy', 'ns3::empty', 'ns3::DefaultDeleter<ns3::LteHarqPhy>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::OutputStreamWrapper', 'ns3::empty', 'ns3::DefaultDeleter<ns3::OutputStreamWrapper>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::PhyEntity', 'ns3::empty', 'ns3::DefaultDeleter<ns3::PhyEntity>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::SpectrumModel', 'ns3::empty', 'ns3::DefaultDeleter<ns3::SpectrumModel>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::SpectrumSignalParameters', 'ns3::empty', 'ns3::DefaultDeleter<ns3::SpectrumSignalParameters>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::SpectrumValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::SpectrumValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::VendorSpecificValue, ns3::empty, ns3::DefaultDeleter<ns3::VendorSpecificValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::VendorSpecificValue, ns3::empty, ns3::DefaultDeleter<ns3::VendorSpecificValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::VendorSpecificValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::VendorSpecificValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiPpdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPpdu> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiPpdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPpdu>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::WifiPpdu', 'ns3::empty', 'ns3::DefaultDeleter<ns3::WifiPpdu>'])
     ## socket.h (module 'network'): ns3::Socket [class]
     module.add_class('Socket', import_from_module='ns.network', parent=root_module['ns3::Object'])
@@ -928,6 +932,9 @@
     typehandlers.add_type_alias('void ( * ) ( ns3::WifiTxVector, ns3::Time )', 'ns3::WifiPhy::PhyRxPayloadBeginTracedCallback')
     typehandlers.add_type_alias('void ( * ) ( ns3::WifiTxVector, ns3::Time )*', 'ns3::WifiPhy::PhyRxPayloadBeginTracedCallback*')
     typehandlers.add_type_alias('void ( * ) ( ns3::WifiTxVector, ns3::Time )&', 'ns3::WifiPhy::PhyRxPayloadBeginTracedCallback&')
+    typehandlers.add_type_alias('std::tuple< unsigned char, unsigned short, int, unsigned char >', 'ns3::WifiPhy::ChannelTuple')
+    typehandlers.add_type_alias('std::tuple< unsigned char, unsigned short, int, unsigned char >*', 'ns3::WifiPhy::ChannelTuple*')
+    typehandlers.add_type_alias('std::tuple< unsigned char, unsigned short, int, unsigned char >&', 'ns3::WifiPhy::ChannelTuple&')
     ## wifi-phy-state-helper.h (module 'wifi'): ns3::WifiPhyStateHelper [class]
     module.add_class('WifiPhyStateHelper', import_from_module='ns.wifi', parent=root_module['ns3::Object'])
     typehandlers.add_type_alias('void ( * ) ( ns3::Time, ns3::Time, WifiPhyState )', 'ns3::WifiPhyStateHelper::StateTracedCallback')
@@ -948,6 +955,8 @@
     module.add_class('ZetaRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
     ## random-variable-stream.h (module 'core'): ns3::ZipfRandomVariable [class]
     module.add_class('ZipfRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
+    ## antenna-model.h (module 'antenna'): ns3::AntennaModel [class]
+    module.add_class('AntennaModel', import_from_module='ns.antenna', parent=root_module['ns3::Object'])
     ## attribute.h (module 'core'): ns3::AttributeAccessor [class]
     module.add_class('AttributeAccessor', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >'])
     ## attribute.h (module 'core'): ns3::AttributeChecker [class]
@@ -1261,18 +1270,16 @@
     module.add_class('BsrLteControlMessage', import_from_module='ns.lte', parent=root_module['ns3::LteControlMessage'])
     ## error-model.h (module 'network'): ns3::BurstErrorModel [class]
     module.add_class('BurstErrorModel', import_from_module='ns.network', parent=root_module['ns3::ErrorModel'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['bool', 'const ns3::WifiTxVector &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['bool', 'ns3::Ptr<ns3::Socket>', 'const ns3::Address &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['bool', 'unsigned short', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['ns3::ObjectBase *', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned long', 'const ns3::WifiTxVector &', 'unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned long', 'unsigned short', 'unsigned short', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, const ns3::Ipv4Header &, ns3::Ptr<const ns3::Packet>, ns3::Ipv4L3Protocol::DropReason, ns3::Ptr<ns3::Ipv4>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
@@ -1303,8 +1310,8 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::WifiPhyRxfailureReason', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<const ns3::Packet>', 'std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int>>, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double>>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<const ns3::Packet>', 'std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int>>, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double>>>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, ns3::SignalNoiseDbm, unsigned short, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'ns3::WifiTxVector', 'ns3::MpduInfo', 'ns3::SignalNoiseDbm', 'unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
@@ -1329,8 +1336,8 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::Socket>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::SpectrumSignalParameters>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::SpectrumSignalParameters>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::WifiPsdu>', 'ns3::RxSignalInfo', 'ns3::WifiTxVector', 'std::vector<bool, std::allocator<bool> >', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::WifiPsdu>', 'ns3::RxSignalInfo', 'ns3::WifiTxVector', 'std::vector<bool, std::allocator<bool>>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::WifiPsdu>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::Time, WifiPhyState, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
@@ -1339,10 +1346,10 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::WifiTxVector', 'ns3::Time', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >', 'ns3::WifiTxVector', 'double', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned short, const std::vector<int, std::allocator<int> > &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned short', 'const std::vector<int, std::allocator<int> > &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu>>>>, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu>>>>', 'ns3::WifiTxVector', 'double', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned short, const std::vector<int, std::allocator<int>> &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned short', 'const std::vector<int, std::allocator<int>> &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned short, ns3::Ptr<ns3::SpectrumValue>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned short', 'ns3::Ptr<ns3::SpectrumValue>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned short, unsigned short, double, double, bool, unsigned char, ns3::empty, ns3::empty, ns3::empty> [class]
@@ -1375,6 +1382,7 @@
     module.add_class('LteUeNetDevice', import_from_module='ns.lte', parent=root_module['ns3::LteNetDevice'])
     ## lte-enb-net-device.h (module 'lte'): ns3::LteEnbNetDevice [class]
     module.add_class('LteEnbNetDevice', import_from_module='ns.lte', parent=root_module['ns3::LteNetDevice'])
+    module.add_container('std::vector< double >', 'double', container_type='vector')
     module.add_container('std::vector< ns3::CeBitmap_e >', 'ns3::CeBitmap_e', container_type='vector')
     module.add_container('std::vector< std::vector< ns3::RlcPduListElement_s > >', 'std::vector< ns3::RlcPduListElement_s >', container_type='vector')
     module.add_container('std::vector< unsigned char >', 'unsigned char', container_type='vector')
@@ -1398,7 +1406,7 @@
     module.add_container('ns3::HeRu::SubcarrierGroup', 'std::pair< short, short >', container_type='vector')
     module.add_container('std::map< std::pair< unsigned char, ns3::HeRu::RuType >, std::vector< std::vector< std::pair< short, short > > > >', ('std::pair< unsigned char, ns3::HeRu::RuType >', 'std::vector< std::vector< std::pair< short, short > > >'), container_type='map')
     module.add_container('std::map< std::pair< unsigned int, unsigned int >, double >', ('std::pair< unsigned int, unsigned int >', 'double'), container_type='map')
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     module.add_container('std::list< ns3::LteRrcSap::SrbToAddMod >', 'ns3::LteRrcSap::SrbToAddMod', container_type='list')
     module.add_container('std::list< ns3::LteRrcSap::DrbToAddMod >', 'ns3::LteRrcSap::DrbToAddMod', container_type='list')
     module.add_container('std::list< unsigned char >', 'unsigned char', container_type='list')
@@ -1408,25 +1416,24 @@
     module.add_container('std::list< ns3::LteRrcSap::ReportConfigToAddMod >', 'ns3::LteRrcSap::ReportConfigToAddMod', container_type='list')
     module.add_container('std::list< ns3::LteRrcSap::MeasIdToAddMod >', 'ns3::LteRrcSap::MeasIdToAddMod', container_type='list')
     module.add_container('std::list< unsigned int >', 'unsigned int', container_type='list')
-    module.add_container('std::list< ns3::LteRrcSap::MeasResultScell >', 'ns3::LteRrcSap::MeasResultScell', container_type='list')
-    module.add_container('std::list< ns3::LteRrcSap::MeasResultBestNeighCell >', 'ns3::LteRrcSap::MeasResultBestNeighCell', container_type='list')
     module.add_container('std::list< ns3::LteRrcSap::MeasResultEutra >', 'ns3::LteRrcSap::MeasResultEutra', container_type='list')
+    module.add_container('std::list< ns3::LteRrcSap::MeasResultServFreq >', 'ns3::LteRrcSap::MeasResultServFreq', container_type='list')
     module.add_container('std::list< ns3::LteRrcSap::SCellToAddMod >', 'ns3::LteRrcSap::SCellToAddMod', container_type='list')
     module.add_container('std::vector< ns3::LteUeCphySapUser::UeMeasurementsElement >', 'ns3::LteUeCphySapUser::UeMeasurementsElement', container_type='vector')
     module.add_container('std::vector< ns3::HigherLayerSelected_s >', 'ns3::HigherLayerSelected_s', container_type='vector')
     module.add_container('std::vector< ns3::SiMessageListElement_s >', 'ns3::SiMessageListElement_s', container_type='vector')
     module.add_container('std::vector< ns3::Tap >', 'ns3::Tap', container_type='vector')
     module.add_container('std::vector< std::complex< double > >', 'std::complex< double >', container_type='vector')
-    module.add_container('std::vector< double >', 'double', container_type='vector')
+    module.add_container('std::set< std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand > >', 'std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand >', container_type='set')
     module.add_container('std::vector< std::pair< unsigned int, unsigned int > >', 'std::pair< unsigned int, unsigned int >', container_type='vector')
     module.add_container('std::map< unsigned short, ns3::HeMuUserInfo >', ('short unsigned int', 'ns3::HeMuUserInfo'), container_type='map')
     module.add_container('std::vector< int >', 'int', container_type='vector')
     module.add_container('std::list< ns3::Ptr< ns3::Packet > >', 'ns3::Ptr< ns3::Packet >', container_type='list')
+    module.add_container('ns3::PhasedArrayModel::ComplexVector', 'std::complex< double >', container_type='vector')
     module.add_container('std::vector< ns3::Ipv6Address >', 'ns3::Ipv6Address', container_type='vector')
     module.add_container('std::vector< ns3::BandInfo >', 'ns3::BandInfo', container_type='vector')
     module.add_container('std::list< ns3::UanPacketArrival >', 'ns3::UanPacketArrival', container_type='list')
     module.add_container('std::list< ns3::Ptr< ns3::UanPhy > >', 'ns3::Ptr< ns3::UanPhy >', container_type='list')
-    module.add_container('std::set< std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand > >', 'std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand >', container_type='set')
     module.add_container('ns3::WifiConstPsduMap', ('short unsigned int', 'ns3::Ptr< ns3::WifiPsdu const >'), container_type='map')
     module.add_container('std::list< ns3::WifiMode >', 'ns3::WifiMode', container_type='list')
     module.add_container('std::vector< bool >', 'bool', container_type='vector')
@@ -1575,7 +1582,7 @@
     typehandlers.add_type_alias('std::vector< ns3::Ptr< ns3::Object > > const_iterator*', 'ns3::Config::MatchContainer::Iterator*')
     typehandlers.add_type_alias('std::vector< ns3::Ptr< ns3::Object > > const_iterator&', 'ns3::Config::MatchContainer::Iterator&')
     module.add_container('std::vector< ns3::Ptr< ns3::Object > >', 'ns3::Ptr< ns3::Object >', container_type='vector')
-    module.add_container('std::vector< std::string >', 'std::string', container_type='vector')
+    module.add_container('std::vector< std::string >', 'std::basic_string< char, std::char_traits< char >, std::allocator< char > >', container_type='vector')
 
 def register_types_ns3_FatalImpl(module):
     root_module = module.get_root()
@@ -1628,6 +1635,7 @@
 def register_methods(root_module):
     register_Ns3Address_methods(root_module, root_module['ns3::Address'])
     register_Ns3AllocationRetentionPriority_methods(root_module, root_module['ns3::AllocationRetentionPriority'])
+    register_Ns3Angles_methods(root_module, root_module['ns3::Angles'])
     register_Ns3AnimationInterface_methods(root_module, root_module['ns3::AnimationInterface'])
     register_Ns3AttributeConstructionList_methods(root_module, root_module['ns3::AttributeConstructionList'])
     register_Ns3AttributeConstructionListItem_methods(root_module, root_module['ns3::AttributeConstructionList::Item'])
@@ -1738,8 +1746,9 @@
     register_Ns3LteRrcSapMeasObjectToAddMod_methods(root_module, root_module['ns3::LteRrcSap::MeasObjectToAddMod'])
     register_Ns3LteRrcSapMeasResultBestNeighCell_methods(root_module, root_module['ns3::LteRrcSap::MeasResultBestNeighCell'])
     register_Ns3LteRrcSapMeasResultEutra_methods(root_module, root_module['ns3::LteRrcSap::MeasResultEutra'])
-    register_Ns3LteRrcSapMeasResultScell_methods(root_module, root_module['ns3::LteRrcSap::MeasResultScell'])
-    register_Ns3LteRrcSapMeasResultServFreqList_methods(root_module, root_module['ns3::LteRrcSap::MeasResultServFreqList'])
+    register_Ns3LteRrcSapMeasResultPCell_methods(root_module, root_module['ns3::LteRrcSap::MeasResultPCell'])
+    register_Ns3LteRrcSapMeasResultSCell_methods(root_module, root_module['ns3::LteRrcSap::MeasResultSCell'])
+    register_Ns3LteRrcSapMeasResultServFreq_methods(root_module, root_module['ns3::LteRrcSap::MeasResultServFreq'])
     register_Ns3LteRrcSapMeasResults_methods(root_module, root_module['ns3::LteRrcSap::MeasResults'])
     register_Ns3LteRrcSapMeasurementReport_methods(root_module, root_module['ns3::LteRrcSap::MeasurementReport'])
     register_Ns3LteRrcSapMobilityControlInfo_methods(root_module, root_module['ns3::LteRrcSap::MobilityControlInfo'])
@@ -1870,7 +1879,6 @@
     register_Ns3WifiPhyOperatingChannel_methods(root_module, root_module['ns3::WifiPhyOperatingChannel'])
     register_Ns3WifiSpectrumValue5MhzFactory_methods(root_module, root_module['ns3::WifiSpectrumValue5MhzFactory'])
     register_Ns3WifiSpectrumValueHelper_methods(root_module, root_module['ns3::WifiSpectrumValueHelper'])
-    register_Ns3WifiStandardInfo_methods(root_module, root_module['ns3::WifiStandardInfo'])
     register_Ns3WifiTxVector_methods(root_module, root_module['ns3::WifiTxVector'])
     register_Ns3Empty_methods(root_module, root_module['ns3::empty'])
     register_Ns3Int64x64_t_methods(root_module, root_module['ns3::int64x64_t'])
@@ -1887,6 +1895,8 @@
     register_Ns3Object_methods(root_module, root_module['ns3::Object'])
     register_Ns3ObjectAggregateIterator_methods(root_module, root_module['ns3::Object::AggregateIterator'])
     register_Ns3PacketBurst_methods(root_module, root_module['ns3::PacketBurst'])
+    register_Ns3PhasedArrayModel_methods(root_module, root_module['ns3::PhasedArrayModel'])
+    register_Ns3PhasedArraySpectrumPropagationLossModel_methods(root_module, root_module['ns3::PhasedArraySpectrumPropagationLossModel'])
     register_Ns3PropagationDelayModel_methods(root_module, root_module['ns3::PropagationDelayModel'])
     register_Ns3PropagationLossModel_methods(root_module, root_module['ns3::PropagationLossModel'])
     register_Ns3RandomPropagationDelayModel_methods(root_module, root_module['ns3::RandomPropagationDelayModel'])
@@ -1953,6 +1963,7 @@
     register_Ns3WifiPpdu_methods(root_module, root_module['ns3::WifiPpdu'])
     register_Ns3ZetaRandomVariable_methods(root_module, root_module['ns3::ZetaRandomVariable'])
     register_Ns3ZipfRandomVariable_methods(root_module, root_module['ns3::ZipfRandomVariable'])
+    register_Ns3AntennaModel_methods(root_module, root_module['ns3::AntennaModel'])
     register_Ns3AttributeAccessor_methods(root_module, root_module['ns3::AttributeAccessor'])
     register_Ns3AttributeChecker_methods(root_module, root_module['ns3::AttributeChecker'])
     register_Ns3AttributeValue_methods(root_module, root_module['ns3::AttributeValue'])
@@ -2055,12 +2066,11 @@
     register_Ns3BinaryErrorModel_methods(root_module, root_module['ns3::BinaryErrorModel'])
     register_Ns3BsrLteControlMessage_methods(root_module, root_module['ns3::BsrLteControlMessage'])
     register_Ns3BurstErrorModel_methods(root_module, root_module['ns3::BurstErrorModel'])
+    register_Ns3CallbackImpl__Bool_Const_ns3WifiTxVector___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Bool_Ns3Ptr__lt__ns3Socket__gt___Const_ns3Address___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3CallbackImpl__Bool_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Ns3ObjectBase___star___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Unsigned_long_Const_ns3WifiTxVector___amp___Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3CallbackImpl__Unsigned_long_Unsigned_short_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Const_ns3Ipv4Header___amp___Ns3Ptr__lt__const_ns3Packet__gt___Ns3Ipv4L3ProtocolDropReason_Ns3Ptr__lt__ns3Ipv4__gt___Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, const ns3::Ipv4Header &, ns3::Ptr<const ns3::Packet>, ns3::Ipv4L3Protocol::DropReason, ns3::Ptr<ns3::Ipv4>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Const_ns3Ipv4Header___amp___Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, const ns3::Ipv4Header &, ns3::Ptr<const ns3::Packet>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
@@ -2076,7 +2086,7 @@
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Ns3WifiMode_Ns3WifiPreamble_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::Packet>, ns3::WifiMode, ns3::WifiPreamble, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Ns3WifiPhyRxfailureReason_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::Packet>, ns3::WifiPhyRxfailureReason, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::Packet>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___StdMap__lt__stdPair__lt__unsigned_int__unsigned_int__gt____double__stdLess__lt__stdPair__lt__unsigned_int__unsigned_int__gt_____gt____stdAllocator__lt__stdPair__lt__const_stdPair__lt__unsigned_int__unsigned_int__gt____double__gt_____gt_____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___StdMap__lt__stdPair__lt__unsigned_int__unsigned_int__gt____double__stdLess__lt__stdPair__lt__unsigned_int__unsigned_int__gt____gt____stdAllocator__lt__stdPair__lt__const_stdPair__lt__unsigned_int__unsigned_int__gt____double__gt____gt____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int>>, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double>>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_short_Ns3WifiTxVector_Ns3MpduInfo_Ns3SignalNoiseDbm_Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, ns3::SignalNoiseDbm, unsigned short, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_short_Ns3WifiTxVector_Ns3MpduInfo_Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3PacketBurst__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::PacketBurst>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
@@ -2089,13 +2099,13 @@
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3Socket__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3Socket__gt___Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::Socket>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3SpectrumSignalParameters__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::SpectrumSignalParameters>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiPsdu__gt___Ns3RxSignalInfo_Ns3WifiTxVector_StdVector__lt__bool__stdAllocator__lt__bool__gt_____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiPsdu__gt___Ns3RxSignalInfo_Ns3WifiTxVector_StdVector__lt__bool__stdAllocator__lt__bool__gt____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiPsdu__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::WifiPsdu>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Time_Ns3Time_WifiPhyState_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Time, ns3::Time, WifiPhyState, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3WifiTxVector_Ns3Time_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::WifiTxVector, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3CallbackImpl__Void_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__const_ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__const_ns3WifiPsdu__gt_____gt_____gt_____gt___Ns3WifiTxVector_Double_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3CallbackImpl__Void_Unsigned_short_Const_stdVector__lt__int__stdAllocator__lt__int__gt_____gt_____amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned short, const std::vector<int, std::allocator<int> > &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__const_ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__const_ns3WifiPsdu__gt____gt____gt____gt___Ns3WifiTxVector_Double_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu>>>>, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Unsigned_short_Const_stdVector__lt__int__stdAllocator__lt__int__gt____gt_____amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned short, const std::vector<int, std::allocator<int>> &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Unsigned_short_Ns3Ptr__lt__ns3SpectrumValue__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned short, ns3::Ptr<ns3::SpectrumValue>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Unsigned_short_Unsigned_short_Double_Double_Bool_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned short, unsigned short, double, double, bool, unsigned char, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Unsigned_short_Unsigned_short_Double_Double_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned short, unsigned short, double, double, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
@@ -2200,6 +2210,38 @@
     cls.add_instance_attribute('priorityLevel', 'uint8_t', is_const=False)
     return
 
+def register_Ns3Angles_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## angles.h (module 'antenna'): ns3::Angles::Angles(ns3::Angles const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Angles const &', 'arg0')])
+    ## angles.h (module 'antenna'): ns3::Angles::Angles(double azimuth, double inclination) [constructor]
+    cls.add_constructor([param('double', 'azimuth'), param('double', 'inclination')])
+    ## angles.h (module 'antenna'): ns3::Angles::Angles(ns3::Vector v) [constructor]
+    cls.add_constructor([param('ns3::Vector', 'v')])
+    ## angles.h (module 'antenna'): ns3::Angles::Angles(ns3::Vector v, ns3::Vector o) [constructor]
+    cls.add_constructor([param('ns3::Vector', 'v'), param('ns3::Vector', 'o')])
+    ## angles.h (module 'antenna'): double ns3::Angles::GetAzimuth() const [member function]
+    cls.add_method('GetAzimuth', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## angles.h (module 'antenna'): double ns3::Angles::GetInclination() const [member function]
+    cls.add_method('GetInclination', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## angles.h (module 'antenna'): void ns3::Angles::SetAzimuth(double azimuth) [member function]
+    cls.add_method('SetAzimuth', 
+                   'void', 
+                   [param('double', 'azimuth')])
+    ## angles.h (module 'antenna'): void ns3::Angles::SetInclination(double inclination) [member function]
+    cls.add_method('SetInclination', 
+                   'void', 
+                   [param('double', 'inclination')])
+    ## angles.h (module 'antenna'): ns3::Angles::m_printDeg [variable]
+    cls.add_static_attribute('m_printDeg', 'bool', is_const=False)
+    return
+
 def register_Ns3AnimationInterface_methods(root_module, cls):
     ## animation-interface.h (module 'netanim'): ns3::AnimationInterface::AnimationInterface(ns3::AnimationInterface const & arg0) [constructor]
     cls.add_constructor([param('ns3::AnimationInterface const &', 'arg0')])
@@ -3687,6 +3729,8 @@
     return
 
 def register_Ns3HeMuUserInfo_methods(root_module, cls):
+    cls.add_binary_comparison_operator('==')
+    cls.add_binary_comparison_operator('!=')
     ## wifi-tx-vector.h (module 'wifi'): ns3::HeMuUserInfo::HeMuUserInfo() [constructor]
     cls.add_constructor([])
     ## wifi-tx-vector.h (module 'wifi'): ns3::HeMuUserInfo::HeMuUserInfo(ns3::HeMuUserInfo const & arg0) [constructor]
@@ -3704,7 +3748,7 @@
     cls.add_constructor([])
     ## he-ru.h (module 'wifi'): ns3::HeRu::HeRu(ns3::HeRu const & arg0) [constructor]
     cls.add_constructor([param('ns3::HeRu const &', 'arg0')])
-    ## he-ru.h (module 'wifi'): static bool ns3::HeRu::DoesOverlap(uint16_t bw, ns3::HeRu::RuSpec ru, std::vector<ns3::HeRu::RuSpec, std::allocator<ns3::HeRu::RuSpec> > const & v) [member function]
+    ## he-ru.h (module 'wifi'): static bool ns3::HeRu::DoesOverlap(uint16_t bw, ns3::HeRu::RuSpec ru, std::vector<ns3::HeRu::RuSpec, std::allocator<ns3::HeRu::RuSpec>> const & v) [member function]
     cls.add_method('DoesOverlap', 
                    'bool', 
                    [param('uint16_t', 'bw'), param('ns3::HeRu::RuSpec', 'ru'), param('std::vector< ns3::HeRu::RuSpec > const &', 'v')], 
@@ -3724,7 +3768,7 @@
                    'uint16_t', 
                    [param('ns3::HeRu::RuType', 'ruType')], 
                    is_static=True)
-    ## he-ru.h (module 'wifi'): static std::vector<ns3::HeRu::RuSpec, std::allocator<ns3::HeRu::RuSpec> > ns3::HeRu::GetCentral26TonesRus(uint16_t bw, ns3::HeRu::RuType ruType) [member function]
+    ## he-ru.h (module 'wifi'): static std::vector<ns3::HeRu::RuSpec, std::allocator<ns3::HeRu::RuSpec>> ns3::HeRu::GetCentral26TonesRus(uint16_t bw, ns3::HeRu::RuType ruType) [member function]
     cls.add_method('GetCentral26TonesRus', 
                    'std::vector< ns3::HeRu::RuSpec >', 
                    [param('uint16_t', 'bw'), param('ns3::HeRu::RuType', 'ruType')], 
@@ -3744,7 +3788,7 @@
                    'ns3::HeRu::RuType', 
                    [param('uint16_t', 'bandwidth')], 
                    is_static=True)
-    ## he-ru.h (module 'wifi'): static std::vector<ns3::HeRu::RuSpec, std::allocator<ns3::HeRu::RuSpec> > ns3::HeRu::GetRusOfType(uint16_t bw, ns3::HeRu::RuType ruType) [member function]
+    ## he-ru.h (module 'wifi'): static std::vector<ns3::HeRu::RuSpec, std::allocator<ns3::HeRu::RuSpec>> ns3::HeRu::GetRusOfType(uint16_t bw, ns3::HeRu::RuType ruType) [member function]
     cls.add_method('GetRusOfType', 
                    'std::vector< ns3::HeRu::RuSpec >', 
                    [param('uint16_t', 'bw'), param('ns3::HeRu::RuType', 'ruType')], 
@@ -3760,6 +3804,8 @@
 
 def register_Ns3HeRuRuSpec_methods(root_module, cls):
     cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('!=')
+    cls.add_binary_comparison_operator('==')
     ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec::RuSpec(ns3::HeRu::RuSpec const & arg0) [constructor]
     cls.add_constructor([param('ns3::HeRu::RuSpec const &', 'arg0')])
     ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec::RuSpec() [constructor]
@@ -5152,18 +5198,12 @@
     cls.add_constructor([])
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultBestNeighCell::MeasResultBestNeighCell(ns3::LteRrcSap::MeasResultBestNeighCell const & arg0) [constructor]
     cls.add_constructor([param('ns3::LteRrcSap::MeasResultBestNeighCell const &', 'arg0')])
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultBestNeighCell::haveRsrpResult [variable]
-    cls.add_instance_attribute('haveRsrpResult', 'bool', is_const=False)
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultBestNeighCell::haveRsrqResult [variable]
-    cls.add_instance_attribute('haveRsrqResult', 'bool', is_const=False)
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultBestNeighCell::physCellId [variable]
     cls.add_instance_attribute('physCellId', 'uint16_t', is_const=False)
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultBestNeighCell::rsrpResult [variable]
     cls.add_instance_attribute('rsrpResult', 'uint8_t', is_const=False)
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultBestNeighCell::rsrqResult [variable]
     cls.add_instance_attribute('rsrqResult', 'uint8_t', is_const=False)
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultBestNeighCell::servFreqId [variable]
-    cls.add_instance_attribute('servFreqId', 'uint16_t', is_const=False)
     return
 
 def register_Ns3LteRrcSapMeasResultEutra_methods(root_module, cls):
@@ -5187,36 +5227,43 @@
     cls.add_instance_attribute('rsrqResult', 'uint8_t', is_const=False)
     return
 
-def register_Ns3LteRrcSapMeasResultScell_methods(root_module, cls):
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultScell::MeasResultScell() [constructor]
+def register_Ns3LteRrcSapMeasResultPCell_methods(root_module, cls):
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultPCell::MeasResultPCell() [constructor]
     cls.add_constructor([])
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultScell::MeasResultScell(ns3::LteRrcSap::MeasResultScell const & arg0) [constructor]
-    cls.add_constructor([param('ns3::LteRrcSap::MeasResultScell const &', 'arg0')])
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultScell::haveRsrpResult [variable]
-    cls.add_instance_attribute('haveRsrpResult', 'bool', is_const=False)
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultScell::haveRsrqResult [variable]
-    cls.add_instance_attribute('haveRsrqResult', 'bool', is_const=False)
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultScell::rsrpResult [variable]
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultPCell::MeasResultPCell(ns3::LteRrcSap::MeasResultPCell const & arg0) [constructor]
+    cls.add_constructor([param('ns3::LteRrcSap::MeasResultPCell const &', 'arg0')])
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultPCell::rsrpResult [variable]
     cls.add_instance_attribute('rsrpResult', 'uint8_t', is_const=False)
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultScell::rsrqResult [variable]
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultPCell::rsrqResult [variable]
+    cls.add_instance_attribute('rsrqResult', 'uint8_t', is_const=False)
+    return
+
+def register_Ns3LteRrcSapMeasResultSCell_methods(root_module, cls):
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultSCell::MeasResultSCell() [constructor]
+    cls.add_constructor([])
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultSCell::MeasResultSCell(ns3::LteRrcSap::MeasResultSCell const & arg0) [constructor]
+    cls.add_constructor([param('ns3::LteRrcSap::MeasResultSCell const &', 'arg0')])
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultSCell::rsrpResult [variable]
+    cls.add_instance_attribute('rsrpResult', 'uint8_t', is_const=False)
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultSCell::rsrqResult [variable]
     cls.add_instance_attribute('rsrqResult', 'uint8_t', is_const=False)
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultScell::servFreqId [variable]
-    cls.add_instance_attribute('servFreqId', 'uint16_t', is_const=False)
     return
 
-def register_Ns3LteRrcSapMeasResultServFreqList_methods(root_module, cls):
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultServFreqList::MeasResultServFreqList() [constructor]
+def register_Ns3LteRrcSapMeasResultServFreq_methods(root_module, cls):
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultServFreq::MeasResultServFreq() [constructor]
     cls.add_constructor([])
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultServFreqList::MeasResultServFreqList(ns3::LteRrcSap::MeasResultServFreqList const & arg0) [constructor]
-    cls.add_constructor([param('ns3::LteRrcSap::MeasResultServFreqList const &', 'arg0')])
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultServFreqList::haveMeasurementResultsNeighCell [variable]
-    cls.add_instance_attribute('haveMeasurementResultsNeighCell', 'bool', is_const=False)
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultServFreqList::haveMeasurementResultsServingSCells [variable]
-    cls.add_instance_attribute('haveMeasurementResultsServingSCells', 'bool', is_const=False)
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultServFreqList::measResultBestNeighCell [variable]
-    cls.add_instance_attribute('measResultBestNeighCell', 'std::list< ns3::LteRrcSap::MeasResultBestNeighCell >', is_const=False)
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultServFreqList::measResultScell [variable]
-    cls.add_instance_attribute('measResultScell', 'std::list< ns3::LteRrcSap::MeasResultScell >', is_const=False)
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultServFreq::MeasResultServFreq(ns3::LteRrcSap::MeasResultServFreq const & arg0) [constructor]
+    cls.add_constructor([param('ns3::LteRrcSap::MeasResultServFreq const &', 'arg0')])
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultServFreq::haveMeasResultBestNeighCell [variable]
+    cls.add_instance_attribute('haveMeasResultBestNeighCell', 'bool', is_const=False)
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultServFreq::haveMeasResultSCell [variable]
+    cls.add_instance_attribute('haveMeasResultSCell', 'bool', is_const=False)
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultServFreq::measResultBestNeighCell [variable]
+    cls.add_instance_attribute('measResultBestNeighCell', 'ns3::LteRrcSap::MeasResultBestNeighCell', is_const=False)
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultServFreq::measResultSCell [variable]
+    cls.add_instance_attribute('measResultSCell', 'ns3::LteRrcSap::MeasResultSCell', is_const=False)
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResultServFreq::servFreqId [variable]
+    cls.add_instance_attribute('servFreqId', 'uint16_t', is_const=False)
     return
 
 def register_Ns3LteRrcSapMeasResults_methods(root_module, cls):
@@ -5226,18 +5273,16 @@
     cls.add_constructor([param('ns3::LteRrcSap::MeasResults const &', 'arg0')])
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResults::haveMeasResultNeighCells [variable]
     cls.add_instance_attribute('haveMeasResultNeighCells', 'bool', is_const=False)
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResults::haveScellsMeas [variable]
-    cls.add_instance_attribute('haveScellsMeas', 'bool', is_const=False)
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResults::haveMeasResultServFreqList [variable]
+    cls.add_instance_attribute('haveMeasResultServFreqList', 'bool', is_const=False)
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResults::measId [variable]
     cls.add_instance_attribute('measId', 'uint8_t', is_const=False)
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResults::measResultListEutra [variable]
     cls.add_instance_attribute('measResultListEutra', 'std::list< ns3::LteRrcSap::MeasResultEutra >', is_const=False)
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResults::measScellResultList [variable]
-    cls.add_instance_attribute('measScellResultList', 'ns3::LteRrcSap::MeasResultServFreqList', is_const=False)
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResults::rsrpResult [variable]
-    cls.add_instance_attribute('rsrpResult', 'uint8_t', is_const=False)
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResults::rsrqResult [variable]
-    cls.add_instance_attribute('rsrqResult', 'uint8_t', is_const=False)
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResults::measResultPCell [variable]
+    cls.add_instance_attribute('measResultPCell', 'ns3::LteRrcSap::MeasResultPCell', is_const=False)
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::MeasResults::measResultServFreqList [variable]
+    cls.add_instance_attribute('measResultServFreqList', 'std::list< ns3::LteRrcSap::MeasResultServFreq >', is_const=False)
     return
 
 def register_Ns3LteRrcSapMeasurementReport_methods(root_module, cls):
@@ -5294,10 +5339,10 @@
     cls.add_constructor([])
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::NonCriticalExtensionConfiguration::NonCriticalExtensionConfiguration(ns3::LteRrcSap::NonCriticalExtensionConfiguration const & arg0) [constructor]
     cls.add_constructor([param('ns3::LteRrcSap::NonCriticalExtensionConfiguration const &', 'arg0')])
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::NonCriticalExtensionConfiguration::sCellToAddModList [variable]
+    cls.add_instance_attribute('sCellToAddModList', 'std::list< ns3::LteRrcSap::SCellToAddMod >', is_const=False)
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::NonCriticalExtensionConfiguration::sCellToReleaseList [variable]
-    cls.add_instance_attribute('sCellToReleaseList', 'std::list< unsigned int >', is_const=False)
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::NonCriticalExtensionConfiguration::sCellsToAddModList [variable]
-    cls.add_instance_attribute('sCellsToAddModList', 'std::list< ns3::LteRrcSap::SCellToAddMod >', is_const=False)
+    cls.add_instance_attribute('sCellToReleaseList', 'std::list< unsigned char >', is_const=False)
     return
 
 def register_Ns3LteRrcSapNonUlConfiguration_methods(root_module, cls):
@@ -5727,8 +5772,8 @@
     cls.add_instance_attribute('haveRadioResourceConfigDedicatedSCell', 'bool', is_const=False)
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::SCellToAddMod::radioResourceConfigCommonSCell [variable]
     cls.add_instance_attribute('radioResourceConfigCommonSCell', 'ns3::LteRrcSap::RadioResourceConfigCommonSCell', is_const=False)
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::SCellToAddMod::radioResourceConfigDedicateSCell [variable]
-    cls.add_instance_attribute('radioResourceConfigDedicateSCell', 'ns3::LteRrcSap::RadioResourceConfigDedicatedSCell', is_const=False)
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::SCellToAddMod::radioResourceConfigDedicatedSCell [variable]
+    cls.add_instance_attribute('radioResourceConfigDedicatedSCell', 'ns3::LteRrcSap::RadioResourceConfigDedicatedSCell', is_const=False)
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::SCellToAddMod::sCellIndex [variable]
     cls.add_instance_attribute('sCellIndex', 'uint32_t', is_const=False)
     return
@@ -5910,6 +5955,16 @@
                    'void', 
                    [param('uint32_t', 'ulEarfcn'), param('uint16_t', 'ulBandwidth')], 
                    is_pure_virtual=True, is_virtual=True)
+    ## lte-ue-cphy-sap.h (module 'lte'): uint16_t ns3::LteUeCphySapProvider::GetCellId() [member function]
+    cls.add_method('GetCellId', 
+                   'uint16_t', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## lte-ue-cphy-sap.h (module 'lte'): uint32_t ns3::LteUeCphySapProvider::GetDlEarfcn() [member function]
+    cls.add_method('GetDlEarfcn', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
     ## lte-ue-cphy-sap.h (module 'lte'): void ns3::LteUeCphySapProvider::Reset() [member function]
     cls.add_method('Reset', 
                    'void', 
@@ -7521,8 +7576,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -7789,11 +7844,11 @@
     cls.add_constructor([param('ns3::UanPdp const &', 'arg0')])
     ## uan-prop-model.h (module 'uan'): ns3::UanPdp::UanPdp() [constructor]
     cls.add_constructor([])
-    ## uan-prop-model.h (module 'uan'): ns3::UanPdp::UanPdp(std::vector<ns3::Tap, std::allocator<ns3::Tap> > taps, ns3::Time resolution) [constructor]
+    ## uan-prop-model.h (module 'uan'): ns3::UanPdp::UanPdp(std::vector<ns3::Tap, std::allocator<ns3::Tap>> taps, ns3::Time resolution) [constructor]
     cls.add_constructor([param('std::vector< ns3::Tap >', 'taps'), param('ns3::Time', 'resolution')])
-    ## uan-prop-model.h (module 'uan'): ns3::UanPdp::UanPdp(std::vector<std::complex<double>, std::allocator<std::complex<double> > > arrivals, ns3::Time resolution) [constructor]
+    ## uan-prop-model.h (module 'uan'): ns3::UanPdp::UanPdp(std::vector<std::complex<double>, std::allocator<std::complex<double>>> arrivals, ns3::Time resolution) [constructor]
     cls.add_constructor([param('std::vector< std::complex< double > >', 'arrivals'), param('ns3::Time', 'resolution')])
-    ## uan-prop-model.h (module 'uan'): ns3::UanPdp::UanPdp(std::vector<double, std::allocator<double> > arrivals, ns3::Time resolution) [constructor]
+    ## uan-prop-model.h (module 'uan'): ns3::UanPdp::UanPdp(std::vector<double, std::allocator<double>> arrivals, ns3::Time resolution) [constructor]
     cls.add_constructor([param('std::vector< double >', 'arrivals'), param('ns3::Time', 'resolution')])
     ## uan-prop-model.h (module 'uan'): static ns3::UanPdp ns3::UanPdp::CreateImpulsePdp() [member function]
     cls.add_method('CreateImpulsePdp', 
@@ -8258,6 +8313,11 @@
                    'bool', 
                    [param('uint16_t', 'channelWidth'), param('uint8_t', 'nss')], 
                    is_const=True)
+    ## wifi-mode.h (module 'wifi'): bool ns3::WifiMode::IsAllowed(ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('IsAllowed', 
+                   'bool', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True)
     ## wifi-mode.h (module 'wifi'): bool ns3::WifiMode::IsHigherCodeRate(ns3::WifiMode mode) const [member function]
     cls.add_method('IsHigherCodeRate', 
                    'bool', 
@@ -8278,15 +8338,15 @@
 def register_Ns3WifiModeFactory_methods(root_module, cls):
     ## wifi-mode.h (module 'wifi'): ns3::WifiModeFactory::WifiModeFactory(ns3::WifiModeFactory const & arg0) [constructor]
     cls.add_constructor([param('ns3::WifiModeFactory const &', 'arg0')])
-    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMcs(std::string uniqueName, uint8_t mcsValue, ns3::WifiModulationClass modClass, ns3::WifiModeFactory::CodeRateCallback codeRateCallback, ns3::WifiModeFactory::ConstellationSizeCallback constellationSizeCallback, ns3::WifiModeFactory::PhyRateCallback phyRateCallback, ns3::WifiModeFactory::PhyRateFromTxVectorCallback phyRateFromTxVectorCallback, ns3::WifiModeFactory::DataRateCallback dataRateCallback, ns3::WifiModeFactory::DataRateFromTxVectorCallback dataRateFromTxVectorCallback, ns3::WifiModeFactory::NonHtReferenceRateCallback nonHtReferenceRateCallback, ns3::WifiModeFactory::ModeAllowedCallback isModeAllowedCallback) [member function]
+    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMcs(std::string uniqueName, uint8_t mcsValue, ns3::WifiModulationClass modClass, bool isMandatory, ns3::WifiModeFactory::CodeRateCallback codeRateCallback, ns3::WifiModeFactory::ConstellationSizeCallback constellationSizeCallback, ns3::WifiModeFactory::PhyRateCallback phyRateCallback, ns3::WifiModeFactory::DataRateCallback dataRateCallback, ns3::WifiModeFactory::NonHtReferenceRateCallback nonHtReferenceRateCallback, ns3::WifiModeFactory::AllowedCallback isAllowedCallback) [member function]
     cls.add_method('CreateWifiMcs', 
                    'ns3::WifiMode', 
-                   [param('std::string', 'uniqueName'), param('uint8_t', 'mcsValue'), param('ns3::WifiModulationClass', 'modClass'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'codeRateCallback'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'constellationSizeCallback'), param('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateCallback'), param('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateFromTxVectorCallback'), param('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateCallback'), param('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateFromTxVectorCallback'), param('ns3::Callback< unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'nonHtReferenceRateCallback'), param('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'isModeAllowedCallback')], 
+                   [param('std::string', 'uniqueName'), param('uint8_t', 'mcsValue'), param('ns3::WifiModulationClass', 'modClass'), param('bool', 'isMandatory'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'codeRateCallback'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'constellationSizeCallback'), param('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateCallback'), param('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateCallback'), param('ns3::Callback< unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'nonHtReferenceRateCallback'), param('ns3::Callback< bool, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'isAllowedCallback')], 
                    is_static=True)
-    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMode(std::string uniqueName, ns3::WifiModulationClass modClass, bool isMandatory, ns3::WifiModeFactory::CodeRateCallback codeRateCallback, ns3::WifiModeFactory::ConstellationSizeCallback constellationSizeCallback, ns3::WifiModeFactory::PhyRateCallback phyRateCallback, ns3::WifiModeFactory::PhyRateFromTxVectorCallback phyRateFromTxVectorCallback, ns3::WifiModeFactory::DataRateCallback dataRateCallback, ns3::WifiModeFactory::DataRateFromTxVectorCallback dataRateFromTxVectorCallback, ns3::WifiModeFactory::ModeAllowedCallback isModeAllowedCallback) [member function]
+    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMode(std::string uniqueName, ns3::WifiModulationClass modClass, bool isMandatory, ns3::WifiModeFactory::CodeRateCallback codeRateCallback, ns3::WifiModeFactory::ConstellationSizeCallback constellationSizeCallback, ns3::WifiModeFactory::PhyRateCallback phyRateCallback, ns3::WifiModeFactory::DataRateCallback dataRateCallback, ns3::WifiModeFactory::AllowedCallback isAllowedCallback) [member function]
     cls.add_method('CreateWifiMode', 
                    'ns3::WifiMode', 
-                   [param('std::string', 'uniqueName'), param('ns3::WifiModulationClass', 'modClass'), param('bool', 'isMandatory'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'codeRateCallback'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'constellationSizeCallback'), param('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateCallback'), param('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateFromTxVectorCallback'), param('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateCallback'), param('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateFromTxVectorCallback'), param('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'isModeAllowedCallback')], 
+                   [param('std::string', 'uniqueName'), param('ns3::WifiModulationClass', 'modClass'), param('bool', 'isMandatory'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'codeRateCallback'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'constellationSizeCallback'), param('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateCallback'), param('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateCallback'), param('ns3::Callback< bool, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'isAllowedCallback')], 
                    is_static=True)
     return
 
@@ -8295,6 +8355,16 @@
     cls.add_constructor([param('ns3::WifiPhyOperatingChannel const &', 'arg0')])
     ## wifi-phy-operating-channel.h (module 'wifi'): ns3::WifiPhyOperatingChannel::WifiPhyOperatingChannel() [constructor]
     cls.add_constructor([])
+    ## wifi-phy-operating-channel.h (module 'wifi'): static ns3::WifiPhyOperatingChannel::ConstIterator ns3::WifiPhyOperatingChannel::FindFirst(uint8_t number, uint16_t frequency, uint16_t width, ns3::WifiStandard standard, ns3::WifiPhyBand band, ns3::WifiPhyOperatingChannel::ConstIterator start=ns3::WifiPhyOperatingChannel::m_frequencyChannels.begin()) [member function]
+    cls.add_method('FindFirst', 
+                   'ns3::WifiPhyOperatingChannel::ConstIterator', 
+                   [param('uint8_t', 'number'), param('uint16_t', 'frequency'), param('uint16_t', 'width'), param('ns3::WifiStandard', 'standard'), param('ns3::WifiPhyBand', 'band'), param('std::set< std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand > > const_iterator', 'start', default_value='ns3::WifiPhyOperatingChannel::m_frequencyChannels.begin()')], 
+                   is_static=True)
+    ## wifi-phy-operating-channel.h (module 'wifi'): static uint8_t ns3::WifiPhyOperatingChannel::GetDefaultChannelNumber(uint16_t width, ns3::WifiStandard standard, ns3::WifiPhyBand band) [member function]
+    cls.add_method('GetDefaultChannelNumber', 
+                   'uint8_t', 
+                   [param('uint16_t', 'width'), param('ns3::WifiStandard', 'standard'), param('ns3::WifiPhyBand', 'band')], 
+                   is_static=True)
     ## wifi-phy-operating-channel.h (module 'wifi'): uint16_t ns3::WifiPhyOperatingChannel::GetFrequency() const [member function]
     cls.add_method('GetFrequency', 
                    'uint16_t', 
@@ -8315,6 +8385,11 @@
                    'uint8_t', 
                    [param('uint16_t', 'primaryChannelWidth')], 
                    is_const=True)
+    ## wifi-phy-operating-channel.h (module 'wifi'): uint8_t ns3::WifiPhyOperatingChannel::GetPrimaryChannelNumber(uint16_t primaryChannelWidth, ns3::WifiStandard standard) const [member function]
+    cls.add_method('GetPrimaryChannelNumber', 
+                   'uint8_t', 
+                   [param('uint16_t', 'primaryChannelWidth'), param('ns3::WifiStandard', 'standard')], 
+                   is_const=True)
     ## wifi-phy-operating-channel.h (module 'wifi'): uint16_t ns3::WifiPhyOperatingChannel::GetWidth() const [member function]
     cls.add_method('GetWidth', 
                    'uint16_t', 
@@ -8325,18 +8400,20 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## wifi-phy-operating-channel.h (module 'wifi'): void ns3::WifiPhyOperatingChannel::Set(uint8_t number, uint16_t frequency, uint16_t width, ns3::WifiPhyStandard standard, ns3::WifiPhyBand band) [member function]
+    ## wifi-phy-operating-channel.h (module 'wifi'): void ns3::WifiPhyOperatingChannel::Set(uint8_t number, uint16_t frequency, uint16_t width, ns3::WifiStandard standard, ns3::WifiPhyBand band) [member function]
     cls.add_method('Set', 
                    'void', 
-                   [param('uint8_t', 'number'), param('uint16_t', 'frequency'), param('uint16_t', 'width'), param('ns3::WifiPhyStandard', 'standard'), param('ns3::WifiPhyBand', 'band')])
-    ## wifi-phy-operating-channel.h (module 'wifi'): void ns3::WifiPhyOperatingChannel::SetDefault(uint16_t width, ns3::WifiPhyStandard standard, ns3::WifiPhyBand band) [member function]
+                   [param('uint8_t', 'number'), param('uint16_t', 'frequency'), param('uint16_t', 'width'), param('ns3::WifiStandard', 'standard'), param('ns3::WifiPhyBand', 'band')])
+    ## wifi-phy-operating-channel.h (module 'wifi'): void ns3::WifiPhyOperatingChannel::SetDefault(uint16_t width, ns3::WifiStandard standard, ns3::WifiPhyBand band) [member function]
     cls.add_method('SetDefault', 
                    'void', 
-                   [param('uint16_t', 'width'), param('ns3::WifiPhyStandard', 'standard'), param('ns3::WifiPhyBand', 'band')])
+                   [param('uint16_t', 'width'), param('ns3::WifiStandard', 'standard'), param('ns3::WifiPhyBand', 'band')])
     ## wifi-phy-operating-channel.h (module 'wifi'): void ns3::WifiPhyOperatingChannel::SetPrimary20Index(uint8_t index) [member function]
     cls.add_method('SetPrimary20Index', 
                    'void', 
                    [param('uint8_t', 'index')])
+    ## wifi-phy-operating-channel.h (module 'wifi'): ns3::WifiPhyOperatingChannel::m_frequencyChannels [variable]
+    cls.add_static_attribute('m_frequencyChannels', 'std::set< std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand > > const', is_const=True)
     return
 
 def register_Ns3WifiSpectrumValue5MhzFactory_methods(root_module, cls):
@@ -8406,7 +8483,7 @@
                    'ns3::Ptr< ns3::SpectrumValue >', 
                    [param('uint32_t', 'centerFrequency'), param('uint16_t', 'totalChannelWidth'), param('uint32_t', 'bandBandwidth'), param('uint16_t', 'guardBandwidth'), param('std::pair< unsigned int, unsigned int >', 'band')], 
                    is_static=True)
-    ## wifi-spectrum-value-helper.h (module 'spectrum'): static void ns3::WifiSpectrumValueHelper::CreateSpectrumMaskForOfdm(ns3::Ptr<ns3::SpectrumValue> c, std::vector<std::pair<unsigned int, unsigned int>, std::allocator<std::pair<unsigned int, unsigned int> > > allocatedSubBands, ns3::WifiSpectrumBand maskBand, double txPowerPerBandW, uint32_t nGuardBands, uint32_t innerSlopeWidth, double minInnerBandDbr, double minOuterbandDbr, double lowestPointDbr) [member function]
+    ## wifi-spectrum-value-helper.h (module 'spectrum'): static void ns3::WifiSpectrumValueHelper::CreateSpectrumMaskForOfdm(ns3::Ptr<ns3::SpectrumValue> c, std::vector<std::pair<unsigned int, unsigned int>, std::allocator<std::pair<unsigned int, unsigned int>>> allocatedSubBands, ns3::WifiSpectrumBand maskBand, double txPowerPerBandW, uint32_t nGuardBands, uint32_t innerSlopeWidth, double minInnerBandDbr, double minOuterbandDbr, double lowestPointDbr) [member function]
     cls.add_method('CreateSpectrumMaskForOfdm', 
                    'void', 
                    [param('ns3::Ptr< ns3::SpectrumValue >', 'c'), param('std::vector< std::pair< unsigned int, unsigned int > >', 'allocatedSubBands'), param('std::pair< unsigned int, unsigned int >', 'maskBand'), param('double', 'txPowerPerBandW'), param('uint32_t', 'nGuardBands'), param('uint32_t', 'innerSlopeWidth'), param('double', 'minInnerBandDbr'), param('double', 'minOuterbandDbr'), param('double', 'lowestPointDbr')], 
@@ -8433,19 +8510,6 @@
                    is_static=True)
     return
 
-def register_Ns3WifiStandardInfo_methods(root_module, cls):
-    ## wifi-standards.h (module 'wifi'): ns3::WifiStandardInfo::WifiStandardInfo() [constructor]
-    cls.add_constructor([])
-    ## wifi-standards.h (module 'wifi'): ns3::WifiStandardInfo::WifiStandardInfo(ns3::WifiStandardInfo const & arg0) [constructor]
-    cls.add_constructor([param('ns3::WifiStandardInfo const &', 'arg0')])
-    ## wifi-standards.h (module 'wifi'): ns3::WifiStandardInfo::macStandard [variable]
-    cls.add_instance_attribute('macStandard', 'ns3::WifiMacStandard', is_const=False)
-    ## wifi-standards.h (module 'wifi'): ns3::WifiStandardInfo::phyBand [variable]
-    cls.add_instance_attribute('phyBand', 'ns3::WifiPhyBand', is_const=False)
-    ## wifi-standards.h (module 'wifi'): ns3::WifiStandardInfo::phyStandard [variable]
-    cls.add_instance_attribute('phyStandard', 'ns3::WifiPhyStandard', is_const=False)
-    return
-
 def register_Ns3WifiTxVector_methods(root_module, cls):
     cls.add_output_stream_operator()
     ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector() [constructor]
@@ -8665,14 +8729,14 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('>=')
     cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_unary_numeric_operator('-')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
     cls.add_constructor([])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(double const value) [constructor]
@@ -8691,6 +8755,8 @@
     cls.add_constructor([param('long unsigned int const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int const v) [constructor]
     cls.add_constructor([param('long long unsigned int const', 'v')])
+    ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int128_t const v) [constructor]
+    cls.add_constructor([param('int128_t const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t const hi, uint64_t const lo) [constructor]
     cls.add_constructor([param('int64_t const', 'hi'), param('uint64_t const', 'lo')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [constructor]
@@ -9325,7 +9391,7 @@
     cls.add_method('AddPacket', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet >', 'packet')])
-    ## packet-burst.h (module 'network'): std::list<ns3::Ptr<ns3::Packet>, std::allocator<ns3::Ptr<ns3::Packet> > >::const_iterator ns3::PacketBurst::Begin() const [member function]
+    ## packet-burst.h (module 'network'): std::list<ns3::Ptr<ns3::Packet>, std::allocator<ns3::Ptr<ns3::Packet>>>::const_iterator ns3::PacketBurst::Begin() const [member function]
     cls.add_method('Begin', 
                    'std::list< ns3::Ptr< ns3::Packet > > const_iterator', 
                    [], 
@@ -9335,7 +9401,7 @@
                    'ns3::Ptr< ns3::PacketBurst >', 
                    [], 
                    is_const=True)
-    ## packet-burst.h (module 'network'): std::list<ns3::Ptr<ns3::Packet>, std::allocator<ns3::Ptr<ns3::Packet> > >::const_iterator ns3::PacketBurst::End() const [member function]
+    ## packet-burst.h (module 'network'): std::list<ns3::Ptr<ns3::Packet>, std::allocator<ns3::Ptr<ns3::Packet>>>::const_iterator ns3::PacketBurst::End() const [member function]
     cls.add_method('End', 
                    'std::list< ns3::Ptr< ns3::Packet > > const_iterator', 
                    [], 
@@ -9345,7 +9411,7 @@
                    'uint32_t', 
                    [], 
                    is_const=True)
-    ## packet-burst.h (module 'network'): std::list<ns3::Ptr<ns3::Packet>, std::allocator<ns3::Ptr<ns3::Packet> > > ns3::PacketBurst::GetPackets() const [member function]
+    ## packet-burst.h (module 'network'): std::list<ns3::Ptr<ns3::Packet>, std::allocator<ns3::Ptr<ns3::Packet>>> ns3::PacketBurst::GetPackets() const [member function]
     cls.add_method('GetPackets', 
                    'std::list< ns3::Ptr< ns3::Packet > >', 
                    [], 
@@ -9367,6 +9433,102 @@
                    is_virtual=True, visibility='private')
     return
 
+def register_Ns3PhasedArrayModel_methods(root_module, cls):
+    ## phased-array-model.h (module 'antenna'): ns3::PhasedArrayModel::PhasedArrayModel(ns3::PhasedArrayModel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::PhasedArrayModel const &', 'arg0')])
+    ## phased-array-model.h (module 'antenna'): ns3::PhasedArrayModel::PhasedArrayModel() [constructor]
+    cls.add_constructor([])
+    ## phased-array-model.h (module 'antenna'): ns3::Ptr<const ns3::AntennaModel> ns3::PhasedArrayModel::GetAntennaElement() const [member function]
+    cls.add_method('GetAntennaElement', 
+                   'ns3::Ptr< ns3::AntennaModel const >', 
+                   [], 
+                   is_const=True)
+    ## phased-array-model.h (module 'antenna'): ns3::PhasedArrayModel::ComplexVector ns3::PhasedArrayModel::GetBeamformingVector() const [member function]
+    cls.add_method('GetBeamformingVector', 
+                   'ns3::PhasedArrayModel::ComplexVector', 
+                   [], 
+                   is_const=True)
+    ## phased-array-model.h (module 'antenna'): ns3::PhasedArrayModel::ComplexVector ns3::PhasedArrayModel::GetBeamformingVector(ns3::Angles a) const [member function]
+    cls.add_method('GetBeamformingVector', 
+                   'ns3::PhasedArrayModel::ComplexVector', 
+                   [param('ns3::Angles', 'a')], 
+                   is_const=True)
+    ## phased-array-model.h (module 'antenna'): std::pair<double, double> ns3::PhasedArrayModel::GetElementFieldPattern(ns3::Angles a) const [member function]
+    cls.add_method('GetElementFieldPattern', 
+                   'std::pair< double, double >', 
+                   [param('ns3::Angles', 'a')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## phased-array-model.h (module 'antenna'): ns3::Vector ns3::PhasedArrayModel::GetElementLocation(uint64_t index) const [member function]
+    cls.add_method('GetElementLocation', 
+                   'ns3::Vector', 
+                   [param('uint64_t', 'index')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## phased-array-model.h (module 'antenna'): uint32_t ns3::PhasedArrayModel::GetId() const [member function]
+    cls.add_method('GetId', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## phased-array-model.h (module 'antenna'): uint64_t ns3::PhasedArrayModel::GetNumberOfElements() const [member function]
+    cls.add_method('GetNumberOfElements', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## phased-array-model.h (module 'antenna'): ns3::PhasedArrayModel::ComplexVector ns3::PhasedArrayModel::GetSteeringVector(ns3::Angles a) const [member function]
+    cls.add_method('GetSteeringVector', 
+                   'ns3::PhasedArrayModel::ComplexVector', 
+                   [param('ns3::Angles', 'a')], 
+                   is_const=True)
+    ## phased-array-model.h (module 'antenna'): static ns3::TypeId ns3::PhasedArrayModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## phased-array-model.h (module 'antenna'): void ns3::PhasedArrayModel::SetAntennaElement(ns3::Ptr<ns3::AntennaModel> antennaElement) [member function]
+    cls.add_method('SetAntennaElement', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::AntennaModel >', 'antennaElement')])
+    ## phased-array-model.h (module 'antenna'): void ns3::PhasedArrayModel::SetBeamformingVector(ns3::PhasedArrayModel::ComplexVector const & beamformingVector) [member function]
+    cls.add_method('SetBeamformingVector', 
+                   'void', 
+                   [param('ns3::PhasedArrayModel::ComplexVector const &', 'beamformingVector')])
+    ## phased-array-model.h (module 'antenna'): static double ns3::PhasedArrayModel::ComputeNorm(ns3::PhasedArrayModel::ComplexVector const & vector) [member function]
+    cls.add_method('ComputeNorm', 
+                   'double', 
+                   [param('ns3::PhasedArrayModel::ComplexVector const &', 'vector')], 
+                   is_static=True, visibility='protected')
+    return
+
+def register_Ns3PhasedArraySpectrumPropagationLossModel_methods(root_module, cls):
+    ## phased-array-spectrum-propagation-loss-model.h (module 'spectrum'): ns3::PhasedArraySpectrumPropagationLossModel::PhasedArraySpectrumPropagationLossModel(ns3::PhasedArraySpectrumPropagationLossModel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::PhasedArraySpectrumPropagationLossModel const &', 'arg0')])
+    ## phased-array-spectrum-propagation-loss-model.h (module 'spectrum'): ns3::PhasedArraySpectrumPropagationLossModel::PhasedArraySpectrumPropagationLossModel() [constructor]
+    cls.add_constructor([])
+    ## phased-array-spectrum-propagation-loss-model.h (module 'spectrum'): ns3::Ptr<ns3::SpectrumValue> ns3::PhasedArraySpectrumPropagationLossModel::CalcRxPowerSpectralDensity(ns3::Ptr<const ns3::SpectrumValue> txPsd, ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b, ns3::Ptr<const ns3::PhasedArrayModel> aPhasedArrayModel, ns3::Ptr<const ns3::PhasedArrayModel> bPhasedArrayModel) const [member function]
+    cls.add_method('CalcRxPowerSpectralDensity', 
+                   'ns3::Ptr< ns3::SpectrumValue >', 
+                   [param('ns3::Ptr< ns3::SpectrumValue const >', 'txPsd'), param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b'), param('ns3::Ptr< ns3::PhasedArrayModel const >', 'aPhasedArrayModel'), param('ns3::Ptr< ns3::PhasedArrayModel const >', 'bPhasedArrayModel')], 
+                   is_const=True)
+    ## phased-array-spectrum-propagation-loss-model.h (module 'spectrum'): static ns3::TypeId ns3::PhasedArraySpectrumPropagationLossModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## phased-array-spectrum-propagation-loss-model.h (module 'spectrum'): void ns3::PhasedArraySpectrumPropagationLossModel::SetNext(ns3::Ptr<ns3::PhasedArraySpectrumPropagationLossModel> next) [member function]
+    cls.add_method('SetNext', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::PhasedArraySpectrumPropagationLossModel >', 'next')])
+    ## phased-array-spectrum-propagation-loss-model.h (module 'spectrum'): void ns3::PhasedArraySpectrumPropagationLossModel::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## phased-array-spectrum-propagation-loss-model.h (module 'spectrum'): ns3::Ptr<ns3::SpectrumValue> ns3::PhasedArraySpectrumPropagationLossModel::DoCalcRxPowerSpectralDensity(ns3::Ptr<const ns3::SpectrumValue> txPsd, ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b, ns3::Ptr<const ns3::PhasedArrayModel> aPhasedArrayModel, ns3::Ptr<const ns3::PhasedArrayModel> bPhasedArrayModel) const [member function]
+    cls.add_method('DoCalcRxPowerSpectralDensity', 
+                   'ns3::Ptr< ns3::SpectrumValue >', 
+                   [param('ns3::Ptr< ns3::SpectrumValue const >', 'txPsd'), param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b'), param('ns3::Ptr< ns3::PhasedArrayModel const >', 'aPhasedArrayModel'), param('ns3::Ptr< ns3::PhasedArrayModel const >', 'bPhasedArrayModel')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
+    return
+
 def register_Ns3PropagationDelayModel_methods(root_module, cls):
     ## propagation-delay-model.h (module 'propagation'): ns3::PropagationDelayModel::PropagationDelayModel() [constructor]
     cls.add_constructor([])
@@ -9390,7 +9552,7 @@
     cls.add_method('DoAssignStreams', 
                    'int64_t', 
                    [param('int64_t', 'stream')], 
-                   is_pure_virtual=True, is_virtual=True, visibility='private')
+                   is_pure_virtual=True, is_virtual=True, visibility='protected')
     return
 
 def register_Ns3PropagationLossModel_methods(root_module, cls):
@@ -9418,16 +9580,16 @@
     cls.add_method('AssignStreams', 
                    'int64_t', 
                    [param('int64_t', 'stream')])
+    ## propagation-loss-model.h (module 'propagation'): int64_t ns3::PropagationLossModel::DoAssignStreams(int64_t stream) [member function]
+    cls.add_method('DoAssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')], 
+                   is_pure_virtual=True, is_virtual=True, visibility='protected')
     ## propagation-loss-model.h (module 'propagation'): double ns3::PropagationLossModel::DoCalcRxPower(double txPowerDbm, ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
     cls.add_method('DoCalcRxPower', 
                    'double', 
                    [param('double', 'txPowerDbm'), param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
                    is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
-    ## propagation-loss-model.h (module 'propagation'): int64_t ns3::PropagationLossModel::DoAssignStreams(int64_t stream) [member function]
-    cls.add_method('DoAssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'stream')], 
-                   is_pure_virtual=True, is_virtual=True, visibility='private')
     return
 
 def register_Ns3RandomPropagationDelayModel_methods(root_module, cls):
@@ -9576,149 +9738,149 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Event_Ns3Empty_Ns3DefaultDeleter__lt__ns3Event__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Event, ns3::empty, ns3::DefaultDeleter<ns3::Event> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Event, ns3::empty, ns3::DefaultDeleter<ns3::Event>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Event, ns3::empty, ns3::DefaultDeleter<ns3::Event> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Event, ns3::empty, ns3::DefaultDeleter<ns3::Event> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Event, ns3::empty, ns3::DefaultDeleter<ns3::Event>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Event, ns3::empty, ns3::DefaultDeleter<ns3::Event>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Event, ns3::empty, ns3::DefaultDeleter< ns3::Event > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Ipv4MulticastRoute_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv4MulticastRoute__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter< ns3::Ipv4MulticastRoute > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Ipv4Route_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv4Route__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter< ns3::Ipv4Route > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3LteControlMessage_Ns3Empty_Ns3DefaultDeleter__lt__ns3LteControlMessage__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LteControlMessage, ns3::empty, ns3::DefaultDeleter<ns3::LteControlMessage> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LteControlMessage, ns3::empty, ns3::DefaultDeleter<ns3::LteControlMessage>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LteControlMessage, ns3::empty, ns3::DefaultDeleter<ns3::LteControlMessage> >::SimpleRefCount(ns3::SimpleRefCount<ns3::LteControlMessage, ns3::empty, ns3::DefaultDeleter<ns3::LteControlMessage> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LteControlMessage, ns3::empty, ns3::DefaultDeleter<ns3::LteControlMessage>>::SimpleRefCount(ns3::SimpleRefCount<ns3::LteControlMessage, ns3::empty, ns3::DefaultDeleter<ns3::LteControlMessage>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::LteControlMessage, ns3::empty, ns3::DefaultDeleter< ns3::LteControlMessage > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3LteHarqPhy_Ns3Empty_Ns3DefaultDeleter__lt__ns3LteHarqPhy__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LteHarqPhy, ns3::empty, ns3::DefaultDeleter<ns3::LteHarqPhy> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LteHarqPhy, ns3::empty, ns3::DefaultDeleter<ns3::LteHarqPhy>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LteHarqPhy, ns3::empty, ns3::DefaultDeleter<ns3::LteHarqPhy> >::SimpleRefCount(ns3::SimpleRefCount<ns3::LteHarqPhy, ns3::empty, ns3::DefaultDeleter<ns3::LteHarqPhy> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::LteHarqPhy, ns3::empty, ns3::DefaultDeleter<ns3::LteHarqPhy>>::SimpleRefCount(ns3::SimpleRefCount<ns3::LteHarqPhy, ns3::empty, ns3::DefaultDeleter<ns3::LteHarqPhy>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::LteHarqPhy, ns3::empty, ns3::DefaultDeleter< ns3::LteHarqPhy > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3OutputStreamWrapper_Ns3Empty_Ns3DefaultDeleter__lt__ns3OutputStreamWrapper__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter< ns3::OutputStreamWrapper > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3PhyEntity_Ns3Empty_Ns3DefaultDeleter__lt__ns3PhyEntity__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity> >::SimpleRefCount(ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity>>::SimpleRefCount(ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter< ns3::PhyEntity > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3SpectrumModel_Ns3Empty_Ns3DefaultDeleter__lt__ns3SpectrumModel__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel> >::SimpleRefCount(ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel>>::SimpleRefCount(ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter< ns3::SpectrumModel > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3SpectrumSignalParameters_Ns3Empty_Ns3DefaultDeleter__lt__ns3SpectrumSignalParameters__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters> >::SimpleRefCount(ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters>>::SimpleRefCount(ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter< ns3::SpectrumSignalParameters > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3SpectrumValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3SpectrumValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter< ns3::SpectrumValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3VendorSpecificValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3VendorSpecificValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::VendorSpecificValue, ns3::empty, ns3::DefaultDeleter<ns3::VendorSpecificValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::VendorSpecificValue, ns3::empty, ns3::DefaultDeleter<ns3::VendorSpecificValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::VendorSpecificValue, ns3::empty, ns3::DefaultDeleter<ns3::VendorSpecificValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::VendorSpecificValue, ns3::empty, ns3::DefaultDeleter<ns3::VendorSpecificValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::VendorSpecificValue, ns3::empty, ns3::DefaultDeleter<ns3::VendorSpecificValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::VendorSpecificValue, ns3::empty, ns3::DefaultDeleter<ns3::VendorSpecificValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::VendorSpecificValue, ns3::empty, ns3::DefaultDeleter< ns3::VendorSpecificValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3WifiPpdu_Ns3Empty_Ns3DefaultDeleter__lt__ns3WifiPpdu__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiPpdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPpdu> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiPpdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPpdu>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiPpdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPpdu> >::SimpleRefCount(ns3::SimpleRefCount<ns3::WifiPpdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPpdu> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiPpdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPpdu>>::SimpleRefCount(ns3::SimpleRefCount<ns3::WifiPpdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPpdu>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::WifiPpdu, ns3::empty, ns3::DefaultDeleter< ns3::WifiPpdu > > const &', 'o')])
     return
 
@@ -9841,7 +10003,7 @@
                    'uint8_t', 
                    [param('uint8_t', 'ipTos')], 
                    is_static=True)
-    ## socket.h (module 'network'): void ns3::Socket::Ipv6JoinGroup(ns3::Ipv6Address address, ns3::Socket::Ipv6MulticastFilterMode filterMode, std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address> > sourceAddresses) [member function]
+    ## socket.h (module 'network'): void ns3::Socket::Ipv6JoinGroup(ns3::Ipv6Address address, ns3::Socket::Ipv6MulticastFilterMode filterMode, std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address>> sourceAddresses) [member function]
     cls.add_method('Ipv6JoinGroup', 
                    'void', 
                    [param('ns3::Ipv6Address', 'address'), param('ns3::Socket::Ipv6MulticastFilterMode', 'filterMode'), param('std::vector< ns3::Ipv6Address >', 'sourceAddresses')], 
@@ -10407,16 +10569,16 @@
     cls.add_binary_comparison_operator('==')
     ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(ns3::SpectrumModel const & arg0) [constructor]
     cls.add_constructor([param('ns3::SpectrumModel const &', 'arg0')])
-    ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(std::vector<double, std::allocator<double> > const & centerFreqs) [constructor]
+    ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(std::vector<double, std::allocator<double>> const & centerFreqs) [constructor]
     cls.add_constructor([param('std::vector< double > const &', 'centerFreqs')])
     ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(ns3::Bands const & bands) [constructor]
     cls.add_constructor([param('ns3::Bands const &', 'bands')])
-    ## spectrum-model.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo> >::const_iterator ns3::SpectrumModel::Begin() const [member function]
+    ## spectrum-model.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo>>::const_iterator ns3::SpectrumModel::Begin() const [member function]
     cls.add_method('Begin', 
                    'std::vector< ns3::BandInfo > const_iterator', 
                    [], 
                    is_const=True)
-    ## spectrum-model.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo> >::const_iterator ns3::SpectrumModel::End() const [member function]
+    ## spectrum-model.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo>>::const_iterator ns3::SpectrumModel::End() const [member function]
     cls.add_method('End', 
                    'std::vector< ns3::BandInfo > const_iterator', 
                    [], 
@@ -10476,9 +10638,9 @@
                    'ns3::Ptr< ns3::SpectrumModel const >', 
                    [], 
                    is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::AntennaModel> ns3::SpectrumPhy::GetRxAntenna() const [member function]
-    cls.add_method('GetRxAntenna', 
-                   'ns3::Ptr< ns3::AntennaModel >', 
+    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::Object> ns3::SpectrumPhy::GetAntenna() const [member function]
+    cls.add_method('GetAntenna', 
+                   'ns3::Ptr< ns3::Object >', 
                    [], 
                    is_const=True, is_pure_virtual=True, is_virtual=True)
     ## spectrum-phy.h (module 'spectrum'): void ns3::SpectrumPhy::StartRx(ns3::Ptr<ns3::SpectrumSignalParameters> params) [member function]
@@ -10529,14 +10691,14 @@
                    'ns3::Ptr< ns3::SpectrumSignalParameters >', 
                    [], 
                    is_virtual=True)
-    ## spectrum-signal-parameters.h (module 'spectrum'): ns3::SpectrumSignalParameters::psd [variable]
-    cls.add_instance_attribute('psd', 'ns3::Ptr< ns3::SpectrumValue >', is_const=False)
     ## spectrum-signal-parameters.h (module 'spectrum'): ns3::SpectrumSignalParameters::duration [variable]
     cls.add_instance_attribute('duration', 'ns3::Time', is_const=False)
-    ## spectrum-signal-parameters.h (module 'spectrum'): ns3::SpectrumSignalParameters::txPhy [variable]
-    cls.add_instance_attribute('txPhy', 'ns3::Ptr< ns3::SpectrumPhy >', is_const=False)
+    ## spectrum-signal-parameters.h (module 'spectrum'): ns3::SpectrumSignalParameters::psd [variable]
+    cls.add_instance_attribute('psd', 'ns3::Ptr< ns3::SpectrumValue >', is_const=False)
     ## spectrum-signal-parameters.h (module 'spectrum'): ns3::SpectrumSignalParameters::txAntenna [variable]
     cls.add_instance_attribute('txAntenna', 'ns3::Ptr< ns3::AntennaModel >', is_const=False)
+    ## spectrum-signal-parameters.h (module 'spectrum'): ns3::SpectrumSignalParameters::txPhy [variable]
+    cls.add_instance_attribute('txPhy', 'ns3::Ptr< ns3::SpectrumPhy >', is_const=False)
     return
 
 def register_Ns3SpectrumValue_methods(root_module, cls):
@@ -10564,22 +10726,22 @@
     cls.add_constructor([param('ns3::Ptr< ns3::SpectrumModel const >', 'sm')])
     ## spectrum-value.h (module 'spectrum'): ns3::SpectrumValue::SpectrumValue() [constructor]
     cls.add_constructor([])
-    ## spectrum-value.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo> >::const_iterator ns3::SpectrumValue::ConstBandsBegin() const [member function]
+    ## spectrum-value.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo>>::const_iterator ns3::SpectrumValue::ConstBandsBegin() const [member function]
     cls.add_method('ConstBandsBegin', 
                    'std::vector< ns3::BandInfo > const_iterator', 
                    [], 
                    is_const=True)
-    ## spectrum-value.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo> >::const_iterator ns3::SpectrumValue::ConstBandsEnd() const [member function]
+    ## spectrum-value.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo>>::const_iterator ns3::SpectrumValue::ConstBandsEnd() const [member function]
     cls.add_method('ConstBandsEnd', 
                    'std::vector< ns3::BandInfo > const_iterator', 
                    [], 
                    is_const=True)
-    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double> >::const_iterator ns3::SpectrumValue::ConstValuesBegin() const [member function]
+    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double>>::const_iterator ns3::SpectrumValue::ConstValuesBegin() const [member function]
     cls.add_method('ConstValuesBegin', 
                    'std::vector< double > const_iterator', 
                    [], 
                    is_const=True)
-    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double> >::const_iterator ns3::SpectrumValue::ConstValuesEnd() const [member function]
+    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double>>::const_iterator ns3::SpectrumValue::ConstValuesEnd() const [member function]
     cls.add_method('ConstValuesEnd', 
                    'std::vector< double > const_iterator', 
                    [], 
@@ -10609,11 +10771,11 @@
                    'double const &', 
                    [param('uint32_t', 'pos')], 
                    is_const=True)
-    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double> >::iterator ns3::SpectrumValue::ValuesBegin() [member function]
+    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double>>::iterator ns3::SpectrumValue::ValuesBegin() [member function]
     cls.add_method('ValuesBegin', 
                    'std::vector< double > iterator', 
                    [])
-    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double> >::iterator ns3::SpectrumValue::ValuesEnd() [member function]
+    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double>>::iterator ns3::SpectrumValue::ValuesEnd() [member function]
     cls.add_method('ValuesEnd', 
                    'std::vector< double > iterator', 
                    [])
@@ -11630,8 +11792,6 @@
                    is_static=True)
     ## wifi-phy.h (module 'wifi'): ns3::WifiPhy::WifiPhy() [constructor]
     cls.add_constructor([])
-    ## wifi-phy.h (module 'wifi'): ns3::WifiPhy::m_frequencyChannels [variable]
-    cls.add_static_attribute('m_frequencyChannels', 'std::set< std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand > > const', is_const=True)
     ## wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::WifiPhyStateHelper> ns3::WifiPhy::GetState() const [member function]
     cls.add_method('GetState', 
                    'ns3::Ptr< ns3::WifiPhyStateHelper >', 
@@ -11678,10 +11838,10 @@
     cls.add_method('Send', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::Send(ns3::WifiConstPsduMap psdus, ns3::WifiTxVector txVector) [member function]
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::Send(ns3::WifiConstPsduMap psdus, ns3::WifiTxVector const & txVector) [member function]
     cls.add_method('Send', 
                    'void', 
-                   [param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'psdus'), param('ns3::WifiTxVector', 'txVector')])
+                   [param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'psdus'), param('ns3::WifiTxVector const &', 'txVector')])
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::StartTx(ns3::Ptr<ns3::WifiPpdu> ppdu) [member function]
     cls.add_method('StartTx', 
                    'void', 
@@ -11792,12 +11952,12 @@
                    'ns3::Time', 
                    [param('ns3::WifiTxVector const &', 'txVector')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> > ns3::WifiPhy::GetModeList() const [member function]
+    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode>> ns3::WifiPhy::GetModeList() const [member function]
     cls.add_method('GetModeList', 
                    'std::list< ns3::WifiMode >', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> > ns3::WifiPhy::GetModeList(ns3::WifiModulationClass modulation) const [member function]
+    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode>> ns3::WifiPhy::GetModeList(ns3::WifiModulationClass modulation) const [member function]
     cls.add_method('GetModeList', 
                    'std::list< ns3::WifiMode >', 
                    [param('ns3::WifiModulationClass', 'modulation')], 
@@ -11864,7 +12024,7 @@
                    'uint32_t', 
                    [param('ns3::WifiModulationClass', 'modulation')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): std::list<unsigned char, std::allocator<unsigned char> > ns3::WifiPhy::GetBssMembershipSelectorList() const [member function]
+    ## wifi-phy.h (module 'wifi'): std::list<unsigned char, std::allocator<unsigned char>> ns3::WifiPhy::GetBssMembershipSelectorList() const [member function]
     cls.add_method('GetBssMembershipSelectorList', 
                    'std::list< unsigned char >', 
                    [], 
@@ -11874,12 +12034,12 @@
                    'uint16_t', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> > ns3::WifiPhy::GetMcsList() const [member function]
+    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode>> ns3::WifiPhy::GetMcsList() const [member function]
     cls.add_method('GetMcsList', 
                    'std::list< ns3::WifiMode >', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> > ns3::WifiPhy::GetMcsList(ns3::WifiModulationClass modulation) const [member function]
+    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode>> ns3::WifiPhy::GetMcsList(ns3::WifiModulationClass modulation) const [member function]
     cls.add_method('GetMcsList', 
                    'std::list< ns3::WifiMode >', 
                    [param('ns3::WifiModulationClass', 'modulation')], 
@@ -11889,11 +12049,6 @@
                    'ns3::WifiMode', 
                    [param('ns3::WifiModulationClass', 'modulation'), param('uint8_t', 'mcs')], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetChannelNumber(uint8_t id) [member function]
-    cls.add_method('SetChannelNumber', 
-                   'void', 
-                   [param('uint8_t', 'id')], 
-                   is_virtual=True)
     ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetChannelNumber() const [member function]
     cls.add_method('GetChannelNumber', 
                    'uint8_t', 
@@ -11904,14 +12059,14 @@
                    'ns3::Time', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::ConfigureStandardAndBand(ns3::WifiPhyStandard standard, ns3::WifiPhyBand band) [member function]
-    cls.add_method('ConfigureStandardAndBand', 
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::ConfigureStandard(ns3::WifiStandard standard) [member function]
+    cls.add_method('ConfigureStandard', 
                    'void', 
-                   [param('ns3::WifiPhyStandard', 'standard'), param('ns3::WifiPhyBand', 'band')], 
+                   [param('ns3::WifiStandard', 'standard')], 
                    is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): ns3::WifiPhyStandard ns3::WifiPhy::GetPhyStandard() const [member function]
-    cls.add_method('GetPhyStandard', 
-                   'ns3::WifiPhyStandard', 
+    ## wifi-phy.h (module 'wifi'): ns3::WifiStandard ns3::WifiPhy::GetStandard() const [member function]
+    cls.add_method('GetStandard', 
+                   'ns3::WifiStandard', 
                    [], 
                    is_const=True)
     ## wifi-phy.h (module 'wifi'): ns3::WifiPhyBand ns3::WifiPhy::GetPhyBand() const [member function]
@@ -11953,7 +12108,7 @@
     cls.add_method('NotifyRxDrop', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiPhyRxfailureReason', 'reason')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyMonitorSniffRx(ns3::Ptr<const ns3::WifiPsdu> psdu, uint16_t channelFreqMhz, ns3::WifiTxVector txVector, ns3::SignalNoiseDbm signalNoise, std::vector<bool, std::allocator<bool> > statusPerMpdu, uint16_t staId=65535) [member function]
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyMonitorSniffRx(ns3::Ptr<const ns3::WifiPsdu> psdu, uint16_t channelFreqMhz, ns3::WifiTxVector txVector, ns3::SignalNoiseDbm signalNoise, std::vector<bool, std::allocator<bool>> statusPerMpdu, uint16_t staId=65535) [member function]
     cls.add_method('NotifyMonitorSniffRx', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('uint16_t', 'channelFreqMhz'), param('ns3::WifiTxVector', 'txVector'), param('ns3::SignalNoiseDbm', 'signalNoise'), param('std::vector< bool >', 'statusPerMpdu'), param('uint16_t', 'staId', default_value='65535')])
@@ -12033,13 +12188,13 @@
                    'double', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetDevice(ns3::Ptr<ns3::NetDevice> const device) [member function]
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetDevice(ns3::Ptr<ns3::WifiNetDevice> const device) [member function]
     cls.add_method('SetDevice', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NetDevice > const', 'device')])
-    ## wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::NetDevice> ns3::WifiPhy::GetDevice() const [member function]
+                   [param('ns3::Ptr< ns3::WifiNetDevice > const', 'device')])
+    ## wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::WifiNetDevice> ns3::WifiPhy::GetDevice() const [member function]
     cls.add_method('GetDevice', 
-                   'ns3::Ptr< ns3::NetDevice >', 
+                   'ns3::Ptr< ns3::WifiNetDevice >', 
                    [], 
                    is_const=True)
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetMobility(ns3::Ptr<ns3::MobilityModel> const mobility) [member function]
@@ -12051,24 +12206,20 @@
                    'ns3::Ptr< ns3::MobilityModel >', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetOperatingChannel(uint8_t number, uint16_t frequency, uint16_t width) [member function]
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetOperatingChannel(ns3::WifiPhy::ChannelTuple const & channelTuple) [member function]
     cls.add_method('SetOperatingChannel', 
                    'void', 
-                   [param('uint8_t', 'number'), param('uint16_t', 'frequency'), param('uint16_t', 'width')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetFrequency(uint16_t freq) [member function]
-    cls.add_method('SetFrequency', 
-                   'void', 
-                   [param('uint16_t', 'freq')], 
-                   is_virtual=True)
+                   [param('ns3::WifiPhy::ChannelTuple const &', 'channelTuple')])
     ## wifi-phy.h (module 'wifi'): uint16_t ns3::WifiPhy::GetFrequency() const [member function]
     cls.add_method('GetFrequency', 
                    'uint16_t', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetPrimary20Index(uint8_t index) [member function]
-    cls.add_method('SetPrimary20Index', 
-                   'void', 
-                   [param('uint8_t', 'index')])
+    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetPrimary20Index() const [member function]
+    cls.add_method('GetPrimary20Index', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetNumberOfAntennas(uint8_t antennas) [member function]
     cls.add_method('SetNumberOfAntennas', 
                    'void', 
@@ -12130,16 +12281,11 @@
                    'uint16_t', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetChannelWidth(uint16_t channelWidth) [member function]
-    cls.add_method('SetChannelWidth', 
-                   'void', 
-                   [param('uint16_t', 'channelWidth')], 
-                   is_virtual=True)
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::AddSupportedChannelWidth(uint16_t width) [member function]
     cls.add_method('AddSupportedChannelWidth', 
                    'void', 
                    [param('uint16_t', 'width')])
-    ## wifi-phy.h (module 'wifi'): std::vector<unsigned short, std::allocator<unsigned short> > ns3::WifiPhy::GetSupportedChannelWidthSet() const [member function]
+    ## wifi-phy.h (module 'wifi'): std::vector<unsigned short, std::allocator<unsigned short>> ns3::WifiPhy::GetSupportedChannelWidthSet() const [member function]
     cls.add_method('GetSupportedChannelWidthSet', 
                    'std::vector< unsigned short >', 
                    [], 
@@ -12197,6 +12343,11 @@
                    'std::tuple< double, double, double >', 
                    [], 
                    is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetPrimaryChannelNumber(uint16_t primaryChannelWidth) const [member function]
+    cls.add_method('GetPrimaryChannelNumber', 
+                   'uint8_t', 
+                   [param('uint16_t', 'primaryChannelWidth')], 
+                   is_const=True)
     ## wifi-phy.h (module 'wifi'): ns3::WifiPhy::WifiPhy(ns3::WifiPhy const & arg0) [constructor]
     cls.add_constructor([param('ns3::WifiPhy const &', 'arg0')])
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::DoDispose() [member function]
@@ -12209,11 +12360,16 @@
                    'void', 
                    [], 
                    visibility='protected')
-    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::DoChannelSwitch() [member function]
-    cls.add_method('DoChannelSwitch', 
+    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetDelayUntilChannelSwitch() [member function]
+    cls.add_method('GetDelayUntilChannelSwitch', 
                    'ns3::Time', 
                    [], 
                    visibility='protected')
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::DoChannelSwitch() [member function]
+    cls.add_method('DoChannelSwitch', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SwitchMaybeToCcaBusy(uint16_t channelWidth) [member function]
     cls.add_method('SwitchMaybeToCcaBusy', 
                    'void', 
@@ -12334,7 +12490,7 @@
     cls.add_method('SwitchFromRxEndError', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('double', 'snr')])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchFromRxEndOk(ns3::Ptr<ns3::WifiPsdu> psdu, ns3::RxSignalInfo rxSignalInfo, ns3::WifiTxVector txVector, uint16_t staId, std::vector<bool, std::allocator<bool> > statusPerMpdu) [member function]
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchFromRxEndOk(ns3::Ptr<ns3::WifiPsdu> psdu, ns3::RxSignalInfo rxSignalInfo, ns3::WifiTxVector txVector, uint16_t staId, std::vector<bool, std::allocator<bool>> statusPerMpdu) [member function]
     cls.add_method('SwitchFromRxEndOk', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('ns3::RxSignalInfo', 'rxSignalInfo'), param('ns3::WifiTxVector', 'txVector'), param('uint16_t', 'staId'), param('std::vector< bool >', 'statusPerMpdu')])
@@ -12531,6 +12687,23 @@
                    is_virtual=True)
     return
 
+def register_Ns3AntennaModel_methods(root_module, cls):
+    ## antenna-model.h (module 'antenna'): ns3::AntennaModel::AntennaModel(ns3::AntennaModel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::AntennaModel const &', 'arg0')])
+    ## antenna-model.h (module 'antenna'): ns3::AntennaModel::AntennaModel() [constructor]
+    cls.add_constructor([])
+    ## antenna-model.h (module 'antenna'): double ns3::AntennaModel::GetGainDb(ns3::Angles a) [member function]
+    cls.add_method('GetGainDb', 
+                   'double', 
+                   [param('ns3::Angles', 'a')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## antenna-model.h (module 'antenna'): static ns3::TypeId ns3::AntennaModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    return
+
 def register_Ns3AttributeAccessor_methods(root_module, cls):
     ## attribute.h (module 'core'): ns3::AttributeAccessor::AttributeAccessor(ns3::AttributeAccessor const & arg0) [constructor]
     cls.add_constructor([param('ns3::AttributeAccessor const &', 'arg0')])
@@ -14246,7 +14419,7 @@
                    'ns3::Ipv4Address', 
                    [], 
                    is_const=True)
-    ## ipv4-route.h (module 'internet'): std::map<unsigned int, unsigned int, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, unsigned int> > > ns3::Ipv4MulticastRoute::GetOutputTtlMap() const [member function]
+    ## ipv4-route.h (module 'internet'): std::map<unsigned int, unsigned int, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, unsigned int>>> ns3::Ipv4MulticastRoute::GetOutputTtlMap() const [member function]
     cls.add_method('GetOutputTtlMap', 
                    'std::map< unsigned int, unsigned int >', 
                    [], 
@@ -14459,7 +14632,7 @@
     cls.add_constructor([param('ns3::ListErrorModel const &', 'arg0')])
     ## error-model.h (module 'network'): ns3::ListErrorModel::ListErrorModel() [constructor]
     cls.add_constructor([])
-    ## error-model.h (module 'network'): std::list<unsigned int, std::allocator<unsigned int> > ns3::ListErrorModel::GetList() const [member function]
+    ## error-model.h (module 'network'): std::list<unsigned int, std::allocator<unsigned int>> ns3::ListErrorModel::GetList() const [member function]
     cls.add_method('GetList', 
                    'std::list< unsigned int >', 
                    [], 
@@ -14469,7 +14642,7 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## error-model.h (module 'network'): void ns3::ListErrorModel::SetList(std::list<unsigned int, std::allocator<unsigned int> > const & packetlist) [member function]
+    ## error-model.h (module 'network'): void ns3::ListErrorModel::SetList(std::list<unsigned int, std::allocator<unsigned int>> const & packetlist) [member function]
     cls.add_method('SetList', 
                    'void', 
                    [param('std::list< unsigned int > const &', 'packetlist')])
@@ -14561,7 +14734,7 @@
     cls.add_constructor([param('ns3::LteAmc const &', 'arg0')])
     ## lte-amc.h (module 'lte'): ns3::LteAmc::LteAmc() [constructor]
     cls.add_constructor([])
-    ## lte-amc.h (module 'lte'): std::vector<int, std::allocator<int> > ns3::LteAmc::CreateCqiFeedbacks(ns3::SpectrumValue const & sinr, uint8_t rbgSize=0) [member function]
+    ## lte-amc.h (module 'lte'): std::vector<int, std::allocator<int>> ns3::LteAmc::CreateCqiFeedbacks(ns3::SpectrumValue const & sinr, uint8_t rbgSize=0) [member function]
     cls.add_method('CreateCqiFeedbacks', 
                    'std::vector< int >', 
                    [param('ns3::SpectrumValue const &', 'sinr'), param('uint8_t', 'rbgSize', default_value='0')])
@@ -14761,7 +14934,7 @@
     cls.add_method('GetComponentCarrierId', 
                    'uint8_t', 
                    [])
-    ## lte-phy.h (module 'lte'): std::list<ns3::Ptr<ns3::LteControlMessage>, std::allocator<ns3::Ptr<ns3::LteControlMessage> > > ns3::LtePhy::GetControlMessages() [member function]
+    ## lte-phy.h (module 'lte'): std::list<ns3::Ptr<ns3::LteControlMessage>, std::allocator<ns3::Ptr<ns3::LteControlMessage>>> ns3::LtePhy::GetControlMessages() [member function]
     cls.add_method('GetControlMessages', 
                    'std::list< ns3::Ptr< ns3::LteControlMessage > >', 
                    [])
@@ -14890,9 +15063,9 @@
                    'ns3::Ptr< ns3::SpectrumModel const >', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## lte-spectrum-phy.h (module 'lte'): ns3::Ptr<ns3::AntennaModel> ns3::LteSpectrumPhy::GetRxAntenna() const [member function]
-    cls.add_method('GetRxAntenna', 
-                   'ns3::Ptr< ns3::AntennaModel >', 
+    ## lte-spectrum-phy.h (module 'lte'): ns3::Ptr<ns3::Object> ns3::LteSpectrumPhy::GetAntenna() const [member function]
+    cls.add_method('GetAntenna', 
+                   'ns3::Ptr< ns3::Object >', 
                    [], 
                    is_const=True, is_virtual=True)
     ## lte-spectrum-phy.h (module 'lte'): void ns3::LteSpectrumPhy::StartRx(ns3::Ptr<ns3::SpectrumSignalParameters> params) [member function]
@@ -14932,11 +15105,11 @@
     cls.add_method('SetAntenna', 
                    'void', 
                    [param('ns3::Ptr< ns3::AntennaModel >', 'a')])
-    ## lte-spectrum-phy.h (module 'lte'): bool ns3::LteSpectrumPhy::StartTxDataFrame(ns3::Ptr<ns3::PacketBurst> pb, std::list<ns3::Ptr<ns3::LteControlMessage>, std::allocator<ns3::Ptr<ns3::LteControlMessage> > > ctrlMsgList, ns3::Time duration) [member function]
+    ## lte-spectrum-phy.h (module 'lte'): bool ns3::LteSpectrumPhy::StartTxDataFrame(ns3::Ptr<ns3::PacketBurst> pb, std::list<ns3::Ptr<ns3::LteControlMessage>, std::allocator<ns3::Ptr<ns3::LteControlMessage>>> ctrlMsgList, ns3::Time duration) [member function]
     cls.add_method('StartTxDataFrame', 
                    'bool', 
                    [param('ns3::Ptr< ns3::PacketBurst >', 'pb'), param('std::list< ns3::Ptr< ns3::LteControlMessage > >', 'ctrlMsgList'), param('ns3::Time', 'duration')])
-    ## lte-spectrum-phy.h (module 'lte'): bool ns3::LteSpectrumPhy::StartTxDlCtrlFrame(std::list<ns3::Ptr<ns3::LteControlMessage>, std::allocator<ns3::Ptr<ns3::LteControlMessage> > > ctrlMsgList, bool pss) [member function]
+    ## lte-spectrum-phy.h (module 'lte'): bool ns3::LteSpectrumPhy::StartTxDlCtrlFrame(std::list<ns3::Ptr<ns3::LteControlMessage>, std::allocator<ns3::Ptr<ns3::LteControlMessage>>> ctrlMsgList, bool pss) [member function]
     cls.add_method('StartTxDlCtrlFrame', 
                    'bool', 
                    [param('std::list< ns3::Ptr< ns3::LteControlMessage > >', 'ctrlMsgList'), param('bool', 'pss')])
@@ -15008,7 +15181,7 @@
     cls.add_method('AddCtrlSinrChunkProcessor', 
                    'void', 
                    [param('ns3::Ptr< ns3::LteChunkProcessor >', 'p')])
-    ## lte-spectrum-phy.h (module 'lte'): void ns3::LteSpectrumPhy::AddExpectedTb(uint16_t rnti, uint8_t ndi, uint16_t size, uint8_t mcs, std::vector<int, std::allocator<int> > map, uint8_t layer, uint8_t harqId, uint8_t rv, bool downlink) [member function]
+    ## lte-spectrum-phy.h (module 'lte'): void ns3::LteSpectrumPhy::AddExpectedTb(uint16_t rnti, uint8_t ndi, uint16_t size, uint8_t mcs, std::vector<int, std::allocator<int>> map, uint8_t layer, uint8_t harqId, uint8_t rv, bool downlink) [member function]
     cls.add_method('AddExpectedTb', 
                    'void', 
                    [param('uint16_t', 'rnti'), param('uint8_t', 'ndi'), param('uint16_t', 'size'), param('uint8_t', 'mcs'), param('std::vector< int >', 'map'), param('uint8_t', 'layer'), param('uint8_t', 'harqId'), param('uint8_t', 'rv'), param('bool', 'downlink')])
@@ -15108,11 +15281,11 @@
                    'ns3::LteUePhy::State', 
                    [], 
                    is_const=True)
-    ## lte-ue-phy.h (module 'lte'): std::vector<int, std::allocator<int> > ns3::LteUePhy::GetSubChannelsForReception() [member function]
+    ## lte-ue-phy.h (module 'lte'): std::vector<int, std::allocator<int>> ns3::LteUePhy::GetSubChannelsForReception() [member function]
     cls.add_method('GetSubChannelsForReception', 
                    'std::vector< int >', 
                    [])
-    ## lte-ue-phy.h (module 'lte'): std::vector<int, std::allocator<int> > ns3::LteUePhy::GetSubChannelsForTransmission() [member function]
+    ## lte-ue-phy.h (module 'lte'): std::vector<int, std::allocator<int>> ns3::LteUePhy::GetSubChannelsForTransmission() [member function]
     cls.add_method('GetSubChannelsForTransmission', 
                    'std::vector< int >', 
                    [])
@@ -15140,7 +15313,7 @@
     cls.add_method('PhyPduReceived', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet >', 'p')])
-    ## lte-ue-phy.h (module 'lte'): void ns3::LteUePhy::ReceiveLteControlMessageList(std::list<ns3::Ptr<ns3::LteControlMessage>, std::allocator<ns3::Ptr<ns3::LteControlMessage> > > msgList) [member function]
+    ## lte-ue-phy.h (module 'lte'): void ns3::LteUePhy::ReceiveLteControlMessageList(std::list<ns3::Ptr<ns3::LteControlMessage>, std::allocator<ns3::Ptr<ns3::LteControlMessage>>> msgList) [member function]
     cls.add_method('ReceiveLteControlMessageList', 
                    'void', 
                    [param('std::list< ns3::Ptr< ns3::LteControlMessage > >', 'msgList')], 
@@ -15185,11 +15358,11 @@
     cls.add_method('SetNoiseFigure', 
                    'void', 
                    [param('double', 'nf')])
-    ## lte-ue-phy.h (module 'lte'): void ns3::LteUePhy::SetSubChannelsForReception(std::vector<int, std::allocator<int> > mask) [member function]
+    ## lte-ue-phy.h (module 'lte'): void ns3::LteUePhy::SetSubChannelsForReception(std::vector<int, std::allocator<int>> mask) [member function]
     cls.add_method('SetSubChannelsForReception', 
                    'void', 
                    [param('std::vector< int >', 'mask')])
-    ## lte-ue-phy.h (module 'lte'): void ns3::LteUePhy::SetSubChannelsForTransmission(std::vector<int, std::allocator<int> > mask) [member function]
+    ## lte-ue-phy.h (module 'lte'): void ns3::LteUePhy::SetSubChannelsForTransmission(std::vector<int, std::allocator<int>> mask) [member function]
     cls.add_method('SetSubChannelsForTransmission', 
                    'void', 
                    [param('std::vector< int >', 'mask')])
@@ -15258,15 +15431,15 @@
     cls.add_method('GetPcmax', 
                    'double', 
                    [])
-    ## lte-ue-power-control.h (module 'lte'): double ns3::LteUePowerControl::GetPucchTxPower(std::vector<int, std::allocator<int> > rb) [member function]
+    ## lte-ue-power-control.h (module 'lte'): double ns3::LteUePowerControl::GetPucchTxPower(std::vector<int, std::allocator<int>> rb) [member function]
     cls.add_method('GetPucchTxPower', 
                    'double', 
                    [param('std::vector< int >', 'rb')])
-    ## lte-ue-power-control.h (module 'lte'): double ns3::LteUePowerControl::GetPuschTxPower(std::vector<int, std::allocator<int> > rb) [member function]
+    ## lte-ue-power-control.h (module 'lte'): double ns3::LteUePowerControl::GetPuschTxPower(std::vector<int, std::allocator<int>> rb) [member function]
     cls.add_method('GetPuschTxPower', 
                    'double', 
                    [param('std::vector< int >', 'rb')])
-    ## lte-ue-power-control.h (module 'lte'): double ns3::LteUePowerControl::GetSrsTxPower(std::vector<int, std::allocator<int> > rb) [member function]
+    ## lte-ue-power-control.h (module 'lte'): double ns3::LteUePowerControl::GetSrsTxPower(std::vector<int, std::allocator<int>> rb) [member function]
     cls.add_method('GetSrsTxPower', 
                    'double', 
                    [param('std::vector< int >', 'rb')])
@@ -15696,10 +15869,16 @@
     cls.add_method('ExtractNeighborIndex', 
                    'uint32_t', 
                    [param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetEpoch() const [member function]
+    cls.add_method('GetEpoch', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() const [member function]
     cls.add_method('GetRemainingBits', 
                    'uint32_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -15710,6 +15889,10 @@
                    'uint32_t', 
                    [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
+    ## nix-vector.h (module 'network'): void ns3::NixVector::SetEpoch(uint32_t epoch) [member function]
+    cls.add_method('SetEpoch', 
+                   'void', 
+                   [param('uint32_t', 'epoch')])
     return
 
 def register_Ns3Node_methods(root_module, cls):
@@ -16086,10 +16269,11 @@
                    'uint32_t', 
                    [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) const [member function]
     cls.add_method('SetNixVector', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')], 
+                   is_const=True)
     ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
     cls.add_method('ToString', 
                    'std::string', 
@@ -16298,12 +16482,12 @@
     cls.add_method('Transmit', 
                    'void', 
                    [param('ns3::Time', 'txDuration'), param('ns3::Ptr< ns3::WifiPpdu >', 'ppdu'), param('std::string', 'type')])
-    ## phy-entity.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> >::const_iterator ns3::PhyEntity::begin() const [member function]
+    ## phy-entity.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode>>::const_iterator ns3::PhyEntity::begin() const [member function]
     cls.add_method('begin', 
                    'std::list< ns3::WifiMode > const_iterator', 
                    [], 
                    is_const=True)
-    ## phy-entity.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> >::const_iterator ns3::PhyEntity::end() const [member function]
+    ## phy-entity.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode>>::const_iterator ns3::PhyEntity::end() const [member function]
     cls.add_method('end', 
                    'std::list< ns3::WifiMode > const_iterator', 
                    [], 
@@ -16388,7 +16572,7 @@
                    'uint16_t', 
                    [param('ns3::WifiTxVector const &', 'txVector')], 
                    is_const=True, visibility='protected')
-    ## phy-entity.h (module 'wifi'): std::pair<unsigned short, std::pair<unsigned int, unsigned int> > ns3::PhyEntity::GetChannelWidthAndBand(ns3::WifiTxVector const & txVector, uint16_t staId) const [member function]
+    ## phy-entity.h (module 'wifi'): std::pair<unsigned short, std::pair<unsigned int, unsigned int>> ns3::PhyEntity::GetChannelWidthAndBand(ns3::WifiTxVector const & txVector, uint16_t staId) const [member function]
     cls.add_method('GetChannelWidthAndBand', 
                    'std::pair< unsigned short, std::pair< unsigned int, unsigned int > >', 
                    [param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId')], 
@@ -16398,7 +16582,7 @@
                    'ns3::Ptr< ns3::Event const >', 
                    [], 
                    is_const=True, visibility='protected')
-    ## phy-entity.h (module 'wifi'): std::map<std::pair<unsigned long, ns3::WifiPreamble>, ns3::Ptr<ns3::Event>, std::less<std::pair<unsigned long, ns3::WifiPreamble> >, std::allocator<std::pair<const std::pair<unsigned long, ns3::WifiPreamble>, ns3::Ptr<ns3::Event> > > > const & ns3::PhyEntity::GetCurrentPreambleEvents() const [member function]
+    ## phy-entity.h (module 'wifi'): std::map<std::pair<unsigned long, ns3::WifiPreamble>, ns3::Ptr<ns3::Event>, std::less<std::pair<unsigned long, ns3::WifiPreamble>>, std::allocator<std::pair<const std::pair<unsigned long, ns3::WifiPreamble>, ns3::Ptr<ns3::Event>>>> const & ns3::PhyEntity::GetCurrentPreambleEvents() const [member function]
     cls.add_method('GetCurrentPreambleEvents', 
                    'std::map< std::pair< unsigned long, ns3::WifiPreamble >, ns3::Ptr< ns3::Event > > const &', 
                    [], 
@@ -16453,6 +16637,11 @@
                    'void', 
                    [param('bool', 'reset')], 
                    visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::NotifyPayloadBegin(ns3::WifiTxVector const & txVector, ns3::Time const & payloadDuration) [member function]
+    cls.add_method('NotifyPayloadBegin', 
+                   'void', 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time const &', 'payloadDuration')], 
+                   visibility='protected')
     ## phy-entity.h (module 'wifi'): uint64_t ns3::PhyEntity::ObtainNextUid(ns3::WifiTxVector const & txVector) [member function]
     cls.add_method('ObtainNextUid', 
                    'uint64_t', 
@@ -16584,12 +16773,12 @@
                    'uint16_t', 
                    [], 
                    is_const=True)
-    ## lte-control-messages.h (module 'lte'): std::list<ns3::RarLteControlMessage::Rar, std::allocator<ns3::RarLteControlMessage::Rar> >::const_iterator ns3::RarLteControlMessage::RarListBegin() const [member function]
+    ## lte-control-messages.h (module 'lte'): std::list<ns3::RarLteControlMessage::Rar, std::allocator<ns3::RarLteControlMessage::Rar>>::const_iterator ns3::RarLteControlMessage::RarListBegin() const [member function]
     cls.add_method('RarListBegin', 
                    'std::list< ns3::RarLteControlMessage::Rar > const_iterator', 
                    [], 
                    is_const=True)
-    ## lte-control-messages.h (module 'lte'): std::list<ns3::RarLteControlMessage::Rar, std::allocator<ns3::RarLteControlMessage::Rar> >::const_iterator ns3::RarLteControlMessage::RarListEnd() const [member function]
+    ## lte-control-messages.h (module 'lte'): std::list<ns3::RarLteControlMessage::Rar, std::allocator<ns3::RarLteControlMessage::Rar>>::const_iterator ns3::RarLteControlMessage::RarListEnd() const [member function]
     cls.add_method('RarListEnd', 
                    'std::list< ns3::RarLteControlMessage::Rar > const_iterator', 
                    [], 
@@ -16679,7 +16868,7 @@
     cls.add_constructor([param('ns3::ReceiveListErrorModel const &', 'arg0')])
     ## error-model.h (module 'network'): ns3::ReceiveListErrorModel::ReceiveListErrorModel() [constructor]
     cls.add_constructor([])
-    ## error-model.h (module 'network'): std::list<unsigned int, std::allocator<unsigned int> > ns3::ReceiveListErrorModel::GetList() const [member function]
+    ## error-model.h (module 'network'): std::list<unsigned int, std::allocator<unsigned int>> ns3::ReceiveListErrorModel::GetList() const [member function]
     cls.add_method('GetList', 
                    'std::list< unsigned int >', 
                    [], 
@@ -16689,7 +16878,7 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## error-model.h (module 'network'): void ns3::ReceiveListErrorModel::SetList(std::list<unsigned int, std::allocator<unsigned int> > const & packetlist) [member function]
+    ## error-model.h (module 'network'): void ns3::ReceiveListErrorModel::SetList(std::list<unsigned int, std::allocator<unsigned int>> const & packetlist) [member function]
     cls.add_method('SetList', 
                    'void', 
                    [param('std::list< unsigned int > const &', 'packetlist')])
@@ -16766,6 +16955,10 @@
     cls.add_constructor([param('ns3::SpectrumChannel const &', 'arg0')])
     ## spectrum-channel.h (module 'spectrum'): ns3::SpectrumChannel::SpectrumChannel() [constructor]
     cls.add_constructor([])
+    ## spectrum-channel.h (module 'spectrum'): void ns3::SpectrumChannel::AddPhasedArraySpectrumPropagationLossModel(ns3::Ptr<ns3::PhasedArraySpectrumPropagationLossModel> loss) [member function]
+    cls.add_method('AddPhasedArraySpectrumPropagationLossModel', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::PhasedArraySpectrumPropagationLossModel >', 'loss')])
     ## spectrum-channel.h (module 'spectrum'): void ns3::SpectrumChannel::AddPropagationLossModel(ns3::Ptr<ns3::PropagationLossModel> loss) [member function]
     cls.add_method('AddPropagationLossModel', 
                    'void', 
@@ -16784,6 +16977,10 @@
                    'void', 
                    [], 
                    is_virtual=True)
+    ## spectrum-channel.h (module 'spectrum'): ns3::Ptr<ns3::PhasedArraySpectrumPropagationLossModel> ns3::SpectrumChannel::GetPhasedArraySpectrumPropagationLossModel() [member function]
+    cls.add_method('GetPhasedArraySpectrumPropagationLossModel', 
+                   'ns3::Ptr< ns3::PhasedArraySpectrumPropagationLossModel >', 
+                   [])
     ## spectrum-channel.h (module 'spectrum'): ns3::Ptr<ns3::PropagationLossModel> ns3::SpectrumChannel::GetPropagationLossModel() [member function]
     cls.add_method('GetPropagationLossModel', 
                    'ns3::Ptr< ns3::PropagationLossModel >', 
@@ -16797,6 +16994,11 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## spectrum-channel.h (module 'spectrum'): void ns3::SpectrumChannel::RemoveRx(ns3::Ptr<ns3::SpectrumPhy> phy) [member function]
+    cls.add_method('RemoveRx', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::SpectrumPhy >', 'phy')], 
+                   is_pure_virtual=True, is_virtual=True)
     ## spectrum-channel.h (module 'spectrum'): void ns3::SpectrumChannel::SetPropagationDelayModel(ns3::Ptr<ns3::PropagationDelayModel> delay) [member function]
     cls.add_method('SetPropagationDelayModel', 
                    'void', 
@@ -17209,47 +17411,47 @@
                    is_virtual=True, visibility='private')
     return
 
-def register_Ns3CallbackImpl__Bool_Ns3Ptr__lt__ns3Socket__gt___Const_ns3Address___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+def register_Ns3CallbackImpl__Bool_Const_ns3WifiTxVector___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< bool, ns3::Ptr< ns3::Socket >, ns3::Address const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    ## callback.h (module 'core'): ns3::CallbackImpl<bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< bool, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
     cls.add_method('DoGetTypeid', 
                    'std::string', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
     cls.add_method('GetTypeid', 
                    'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): bool ns3::CallbackImpl<bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<ns3::Socket> arg0, ns3::Address const & arg1) [member operator]
+    ## callback.h (module 'core'): bool ns3::CallbackImpl<bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::WifiTxVector const & arg0) [member operator]
     cls.add_method('operator()', 
                    'bool', 
-                   [param('ns3::Ptr< ns3::Socket >', 'arg0'), param('ns3::Address const &', 'arg1')], 
+                   [param('ns3::WifiTxVector const &', 'arg0')], 
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3CallbackImpl__Bool_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+def register_Ns3CallbackImpl__Bool_Ns3Ptr__lt__ns3Socket__gt___Const_ns3Address___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    ## callback.h (module 'core'): ns3::CallbackImpl<bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< bool, ns3::Ptr< ns3::Socket >, ns3::Address const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
     cls.add_method('DoGetTypeid', 
                    'std::string', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
     cls.add_method('GetTypeid', 
                    'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): bool ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(short unsigned int arg0, unsigned char arg1) [member operator]
+    ## callback.h (module 'core'): bool ns3::CallbackImpl<bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<ns3::Socket> arg0, ns3::Address const & arg1) [member operator]
     cls.add_method('operator()', 
                    'bool', 
-                   [param('short unsigned int', 'arg0'), param('unsigned char', 'arg1')], 
+                   [param('ns3::Ptr< ns3::Socket >', 'arg0'), param('ns3::Address const &', 'arg1')], 
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
@@ -17319,28 +17521,6 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3CallbackImpl__Unsigned_long_Unsigned_short_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): long unsigned int ns3::CallbackImpl<unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(short unsigned int arg0, short unsigned int arg1, unsigned char arg2) [member operator]
-    cls.add_method('operator()', 
-                   'long unsigned int', 
-                   [param('short unsigned int', 'arg0'), param('short unsigned int', 'arg1'), param('unsigned char', 'arg2')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
 def register_Ns3CallbackImpl__Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
     ## callback.h (module 'core'): ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
@@ -17671,22 +17851,22 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___StdMap__lt__stdPair__lt__unsigned_int__unsigned_int__gt____double__stdLess__lt__stdPair__lt__unsigned_int__unsigned_int__gt_____gt____stdAllocator__lt__stdPair__lt__const_stdPair__lt__unsigned_int__unsigned_int__gt____double__gt_____gt_____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___StdMap__lt__stdPair__lt__unsigned_int__unsigned_int__gt____double__stdLess__lt__stdPair__lt__unsigned_int__unsigned_int__gt____gt____stdAllocator__lt__stdPair__lt__const_stdPair__lt__unsigned_int__unsigned_int__gt____double__gt____gt____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int>>, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double>>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int>>, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double>>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int>>, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double>>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
     cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::Packet const >, std::map< std::pair< unsigned int, unsigned int >, double >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int>>, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double>>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
     cls.add_method('DoGetTypeid', 
                    'std::string', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int>>, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double>>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
     cls.add_method('GetTypeid', 
                    'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::Packet> arg0, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > > arg1) [member operator]
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int>>, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double>>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::Packet> arg0, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int>>, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double>>> arg1) [member operator]
     cls.add_method('operator()', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet const >', 'arg0'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'arg1')], 
@@ -17958,22 +18138,22 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiPsdu__gt___Ns3RxSignalInfo_Ns3WifiTxVector_StdVector__lt__bool__stdAllocator__lt__bool__gt_____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiPsdu__gt___Ns3RxSignalInfo_Ns3WifiTxVector_StdVector__lt__bool__stdAllocator__lt__bool__gt____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
     cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::WifiPsdu >, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
     cls.add_method('DoGetTypeid', 
                    'std::string', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
     cls.add_method('GetTypeid', 
                    'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<ns3::WifiPsdu> arg0, ns3::RxSignalInfo arg1, ns3::WifiTxVector arg2, std::vector<bool, std::allocator<bool> > arg3) [member operator]
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<ns3::WifiPsdu> arg0, ns3::RxSignalInfo arg1, ns3::WifiTxVector arg2, std::vector<bool, std::allocator<bool>> arg3) [member operator]
     cls.add_method('operator()', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiPsdu >', 'arg0'), param('ns3::RxSignalInfo', 'arg1'), param('ns3::WifiTxVector', 'arg2'), param('std::vector< bool >', 'arg3')], 
@@ -18069,22 +18249,22 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3CallbackImpl__Void_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__const_ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__const_ns3WifiPsdu__gt_____gt_____gt_____gt___Ns3WifiTxVector_Double_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+def register_Ns3CallbackImpl__Void_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__const_ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__const_ns3WifiPsdu__gt____gt____gt____gt___Ns3WifiTxVector_Double_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu>>>>, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu>>>>, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu>>>>, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
     cls.add_constructor([param('ns3::CallbackImpl< void, std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu>>>>, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
     cls.add_method('DoGetTypeid', 
                    'std::string', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu>>>>, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
     cls.add_method('GetTypeid', 
                    'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > > arg0, ns3::WifiTxVector arg1, double arg2) [member operator]
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu>>>>, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu>>>> arg0, ns3::WifiTxVector arg1, double arg2) [member operator]
     cls.add_method('operator()', 
                    'void', 
                    [param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'arg0'), param('ns3::WifiTxVector', 'arg1'), param('double', 'arg2')], 
@@ -18092,22 +18272,22 @@
     cls.add_copy_constructor()
     return
 
-def register_Ns3CallbackImpl__Void_Unsigned_short_Const_stdVector__lt__int__stdAllocator__lt__int__gt_____gt_____amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned short, const std::vector<int, std::allocator<int> > &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+def register_Ns3CallbackImpl__Void_Unsigned_short_Const_stdVector__lt__int__stdAllocator__lt__int__gt____gt_____amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned short, const std::vector<int, std::allocator<int>> &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned short, const std::vector<int, std::allocator<int> > &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, unsigned short, const std::vector<int, std::allocator<int> > &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned short, const std::vector<int, std::allocator<int>> &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, unsigned short, const std::vector<int, std::allocator<int>> &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
     cls.add_constructor([param('ns3::CallbackImpl< void, unsigned short, std::vector< int, std::allocator< int > > const, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, unsigned short, const std::vector<int, std::allocator<int> > &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, unsigned short, const std::vector<int, std::allocator<int>> &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
     cls.add_method('DoGetTypeid', 
                    'std::string', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, unsigned short, const std::vector<int, std::allocator<int> > &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, unsigned short, const std::vector<int, std::allocator<int>> &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
     cls.add_method('GetTypeid', 
                    'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned short, const std::vector<int, std::allocator<int> > &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(short unsigned int arg0, std::vector<int, std::allocator<int> > const & arg1) [member operator]
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned short, const std::vector<int, std::allocator<int>> &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(short unsigned int arg0, std::vector<int, std::allocator<int>> const & arg1) [member operator]
     cls.add_method('operator()', 
                    'void', 
                    [param('short unsigned int', 'arg0'), param('std::vector< int > const &', 'arg1')], 
@@ -18299,7 +18479,7 @@
     cls.add_constructor([])
     ## lte-enb-phy.h (module 'lte'): ns3::LteEnbPhy::LteEnbPhy(ns3::Ptr<ns3::LteSpectrumPhy> dlPhy, ns3::Ptr<ns3::LteSpectrumPhy> ulPhy) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::LteSpectrumPhy >', 'dlPhy'), param('ns3::Ptr< ns3::LteSpectrumPhy >', 'ulPhy')])
-    ## lte-enb-phy.h (module 'lte'): void ns3::LteEnbPhy::CalcChannelQualityForUe(std::vector<double, std::allocator<double> > sinr, ns3::Ptr<ns3::LteSpectrumPhy> ue) [member function]
+    ## lte-enb-phy.h (module 'lte'): void ns3::LteEnbPhy::CalcChannelQualityForUe(std::vector<double, std::allocator<double>> sinr, ns3::Ptr<ns3::LteSpectrumPhy> ue) [member function]
     cls.add_method('CalcChannelQualityForUe', 
                    'void', 
                    [param('std::vector< double >', 'sinr'), param('ns3::Ptr< ns3::LteSpectrumPhy >', 'ue')])
@@ -18321,7 +18501,7 @@
                    'ns3::Ptr< ns3::SpectrumValue >', 
                    [], 
                    is_virtual=True)
-    ## lte-enb-phy.h (module 'lte'): std::list<ns3::UlDciLteControlMessage, std::allocator<ns3::UlDciLteControlMessage> > ns3::LteEnbPhy::DequeueUlDci() [member function]
+    ## lte-enb-phy.h (module 'lte'): std::list<ns3::UlDciLteControlMessage, std::allocator<ns3::UlDciLteControlMessage>> ns3::LteEnbPhy::DequeueUlDci() [member function]
     cls.add_method('DequeueUlDci', 
                    'std::list< ns3::UlDciLteControlMessage >', 
                    [])
@@ -18367,7 +18547,7 @@
                    'ns3::Ptr< ns3::LteSpectrumPhy >', 
                    [], 
                    is_const=True)
-    ## lte-enb-phy.h (module 'lte'): std::vector<int, std::allocator<int> > ns3::LteEnbPhy::GetDownlinkSubChannels() [member function]
+    ## lte-enb-phy.h (module 'lte'): std::vector<int, std::allocator<int>> ns3::LteEnbPhy::GetDownlinkSubChannels() [member function]
     cls.add_method('GetDownlinkSubChannels', 
                    'std::vector< int >', 
                    [])
@@ -18417,10 +18597,10 @@
                    'void', 
                    [param('ns3::Ptr< ns3::LteControlMessage >', 'msg')], 
                    is_virtual=True)
-    ## lte-enb-phy.h (module 'lte'): void ns3::LteEnbPhy::ReceiveLteControlMessageList(std::list<ns3::Ptr<ns3::LteControlMessage>, std::allocator<ns3::Ptr<ns3::LteControlMessage> > > arg0) [member function]
+    ## lte-enb-phy.h (module 'lte'): void ns3::LteEnbPhy::ReceiveLteControlMessageList(std::list<ns3::Ptr<ns3::LteControlMessage>, std::allocator<ns3::Ptr<ns3::LteControlMessage>>> msgList) [member function]
     cls.add_method('ReceiveLteControlMessageList', 
                    'void', 
-                   [param('std::list< ns3::Ptr< ns3::LteControlMessage > >', 'arg0')], 
+                   [param('std::list< ns3::Ptr< ns3::LteControlMessage > >', 'msgList')], 
                    is_virtual=True)
     ## lte-enb-phy.h (module 'lte'): void ns3::LteEnbPhy::ReportInterference(ns3::SpectrumValue const & interf) [member function]
     cls.add_method('ReportInterference', 
@@ -18437,7 +18617,7 @@
                    'void', 
                    [param('ns3::UlInfoListElement_s', 'mes')], 
                    is_virtual=True)
-    ## lte-enb-phy.h (module 'lte'): void ns3::LteEnbPhy::SendControlChannels(std::list<ns3::Ptr<ns3::LteControlMessage>, std::allocator<ns3::Ptr<ns3::LteControlMessage> > > ctrlMsgList) [member function]
+    ## lte-enb-phy.h (module 'lte'): void ns3::LteEnbPhy::SendControlChannels(std::list<ns3::Ptr<ns3::LteControlMessage>, std::allocator<ns3::Ptr<ns3::LteControlMessage>>> ctrlMsgList) [member function]
     cls.add_method('SendControlChannels', 
                    'void', 
                    [param('std::list< ns3::Ptr< ns3::LteControlMessage > >', 'ctrlMsgList')])
@@ -18445,11 +18625,11 @@
     cls.add_method('SendDataChannels', 
                    'void', 
                    [param('ns3::Ptr< ns3::PacketBurst >', 'pb')])
-    ## lte-enb-phy.h (module 'lte'): void ns3::LteEnbPhy::SetDownlinkSubChannels(std::vector<int, std::allocator<int> > mask) [member function]
+    ## lte-enb-phy.h (module 'lte'): void ns3::LteEnbPhy::SetDownlinkSubChannels(std::vector<int, std::allocator<int>> mask) [member function]
     cls.add_method('SetDownlinkSubChannels', 
                    'void', 
                    [param('std::vector< int >', 'mask')])
-    ## lte-enb-phy.h (module 'lte'): void ns3::LteEnbPhy::SetDownlinkSubChannelsWithPowerAllocation(std::vector<int, std::allocator<int> > mask) [member function]
+    ## lte-enb-phy.h (module 'lte'): void ns3::LteEnbPhy::SetDownlinkSubChannelsWithPowerAllocation(std::vector<int, std::allocator<int>> mask) [member function]
     cls.add_method('SetDownlinkSubChannelsWithPowerAllocation', 
                    'void', 
                    [param('std::vector< int >', 'mask')])
@@ -18700,11 +18880,11 @@
     cls.add_method('GetTargetEnb', 
                    'ns3::Ptr< ns3::LteEnbNetDevice >', 
                    [])
-    ## lte-ue-net-device.h (module 'lte'): void ns3::LteUeNetDevice::SetCcMap(std::map<unsigned char, ns3::Ptr<ns3::ComponentCarrierUe>, std::less<unsigned char>, std::allocator<std::pair<const unsigned char, ns3::Ptr<ns3::ComponentCarrierUe> > > > ccm) [member function]
+    ## lte-ue-net-device.h (module 'lte'): void ns3::LteUeNetDevice::SetCcMap(std::map<unsigned char, ns3::Ptr<ns3::ComponentCarrierUe>, std::less<unsigned char>, std::allocator<std::pair<const unsigned char, ns3::Ptr<ns3::ComponentCarrierUe>>>> ccm) [member function]
     cls.add_method('SetCcMap', 
                    'void', 
                    [param('std::map< unsigned char, ns3::Ptr< ns3::ComponentCarrierUe > >', 'ccm')])
-    ## lte-ue-net-device.h (module 'lte'): std::map<unsigned char, ns3::Ptr<ns3::ComponentCarrierUe>, std::less<unsigned char>, std::allocator<std::pair<const unsigned char, ns3::Ptr<ns3::ComponentCarrierUe> > > > ns3::LteUeNetDevice::GetCcMap() [member function]
+    ## lte-ue-net-device.h (module 'lte'): std::map<unsigned char, ns3::Ptr<ns3::ComponentCarrierUe>, std::less<unsigned char>, std::allocator<std::pair<const unsigned char, ns3::Ptr<ns3::ComponentCarrierUe>>>> ns3::LteUeNetDevice::GetCcMap() [member function]
     cls.add_method('GetCcMap', 
                    'std::map< unsigned char, ns3::Ptr< ns3::ComponentCarrierUe > >', 
                    [])
@@ -18768,6 +18948,11 @@
                    'uint16_t', 
                    [], 
                    is_const=True)
+    ## lte-enb-net-device.h (module 'lte'): std::vector<unsigned short, std::allocator<unsigned short>> ns3::LteEnbNetDevice::GetCellIds() const [member function]
+    cls.add_method('GetCellIds', 
+                   'std::vector< unsigned short >', 
+                   [], 
+                   is_const=True)
     ## lte-enb-net-device.h (module 'lte'): bool ns3::LteEnbNetDevice::HasCellId(uint16_t cellId) const [member function]
     cls.add_method('HasCellId', 
                    'bool', 
@@ -18827,11 +19012,11 @@
     cls.add_method('SetCsgIndication', 
                    'void', 
                    [param('bool', 'csgIndication')])
-    ## lte-enb-net-device.h (module 'lte'): void ns3::LteEnbNetDevice::SetCcMap(std::map<unsigned char, ns3::Ptr<ns3::ComponentCarrierBaseStation>, std::less<unsigned char>, std::allocator<std::pair<const unsigned char, ns3::Ptr<ns3::ComponentCarrierBaseStation> > > > ccm) [member function]
+    ## lte-enb-net-device.h (module 'lte'): void ns3::LteEnbNetDevice::SetCcMap(std::map<unsigned char, ns3::Ptr<ns3::ComponentCarrierBaseStation>, std::less<unsigned char>, std::allocator<std::pair<const unsigned char, ns3::Ptr<ns3::ComponentCarrierBaseStation>>>> ccm) [member function]
     cls.add_method('SetCcMap', 
                    'void', 
                    [param('std::map< unsigned char, ns3::Ptr< ns3::ComponentCarrierBaseStation > >', 'ccm')])
-    ## lte-enb-net-device.h (module 'lte'): std::map<unsigned char, ns3::Ptr<ns3::ComponentCarrierBaseStation>, std::less<unsigned char>, std::allocator<std::pair<const unsigned char, ns3::Ptr<ns3::ComponentCarrierBaseStation> > > > ns3::LteEnbNetDevice::GetCcMap() const [member function]
+    ## lte-enb-net-device.h (module 'lte'): std::map<unsigned char, ns3::Ptr<ns3::ComponentCarrierBaseStation>, std::less<unsigned char>, std::allocator<std::pair<const unsigned char, ns3::Ptr<ns3::ComponentCarrierBaseStation>>>> ns3::LteEnbNetDevice::GetCcMap() const [member function]
     cls.add_method('GetCcMap', 
                    'std::map< unsigned char, ns3::Ptr< ns3::ComponentCarrierBaseStation > >', 
                    [], 
@@ -18848,7 +19033,7 @@
     cls.add_constructor([param('ns3::Config::MatchContainer const &', 'arg0')])
     ## config.h (module 'core'): ns3::Config::MatchContainer::MatchContainer() [constructor]
     cls.add_constructor([])
-    ## config.h (module 'core'): ns3::Config::MatchContainer::MatchContainer(std::vector<ns3::Ptr<ns3::Object>, std::allocator<ns3::Ptr<ns3::Object> > > const & objects, std::vector<std::basic_string<char>, std::allocator<std::basic_string<char> > > const & contexts, std::string path) [constructor]
+    ## config.h (module 'core'): ns3::Config::MatchContainer::MatchContainer(std::vector<ns3::Ptr<ns3::Object>, std::allocator<ns3::Ptr<ns3::Object>>> const & objects, std::vector<std::basic_string<char>, std::allocator<std::basic_string<char>>> const & contexts, std::string path) [constructor]
     cls.add_constructor([param('std::vector< ns3::Ptr< ns3::Object > > const &', 'objects'), param('std::vector< std::string > const &', 'contexts'), param('std::string', 'path')])
     ## config.h (module 'core'): ns3::Config::MatchContainer::Iterator ns3::Config::MatchContainer::Begin() const [member function]
     cls.add_method('Begin', 
@@ -18912,6 +19097,21 @@
     cls.add_method('SetFailSafe', 
                    'bool', 
                    [param('std::string', 'name'), param('ns3::AttributeValue const &', 'value')])
+    ## config.h (module 'core'): ns3::Config::MatchContainer::Iterator ns3::Config::MatchContainer::begin() const [member function]
+    cls.add_method('begin', 
+                   'ns3::Config::MatchContainer::Iterator', 
+                   [], 
+                   is_const=True)
+    ## config.h (module 'core'): ns3::Config::MatchContainer::Iterator ns3::Config::MatchContainer::end() const [member function]
+    cls.add_method('end', 
+                   'ns3::Config::MatchContainer::Iterator', 
+                   [], 
+                   is_const=True)
+    ## config.h (module 'core'): std::size_t ns3::Config::MatchContainer::size() const [member function]
+    cls.add_method('size', 
+                   'std::size_t', 
+                   [], 
+                   is_const=True)
     return
 
 def register_Ns3HashImplementation_methods(root_module, cls):
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/netanim/CMakeLists.txt ns-3.36/src/netanim/CMakeLists.txt
--- ns-3.35/src/netanim/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/netanim/CMakeLists.txt	2022-04-30 18:23:58.090734700 -0700
@@ -0,0 +1,18 @@
+build_lib(
+  LIBNAME netanim
+  SOURCE_FILES model/animation-interface.cc
+  HEADER_FILES model/animation-interface.h
+  LIBRARIES_TO_LINK
+    ${libinternet}
+    ${libmobility}
+    ${libwimax}
+    ${libwifi}
+    ${libcsma}
+    ${liblte}
+    ${libuan}
+    ${libenergy}
+    ${liblr-wpan}
+    ${libwave}
+    ${libpoint-to-point-layout}
+  TEST_SOURCES test/netanim-test.cc
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/netanim/doc/animation.rst ns-3.36/src/netanim/doc/animation.rst
--- ns-3.35/src/netanim/doc/animation.rst	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/netanim/doc/animation.rst	2022-04-30 18:23:58.094734700 -0700
@@ -145,15 +145,15 @@
 
 .. sourcecode:: bash
 
-  $ ./waf -d debug configure --enable-examples
-  $ ./waf --run "dumbbell-animation"
+  $ ./ns3 configure -d debug --enable-examples
+  $ ./ns3 run "dumbbell-animation"
 
 The above will create an XML file dumbbell-animation.xml
 
 Mandatory
 #########
 
-1. Ensure that your program's wscript includes the "netanim" module. An example of such a wscript is at src/netanim/examples/wscript. 
+1. Ensure that your program's CMakeLists.txt includes the "netanim" module. An example of such a CMakeLists.txt is at src/netanim/examples/CMakeLists.txt.
 2. Include the header [#include "ns3/netanim-module.h"] in your test program
 3. Add the statement
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/netanim/examples/CMakeLists.txt ns-3.36/src/netanim/examples/CMakeLists.txt
--- ns-3.35/src/netanim/examples/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/netanim/examples/CMakeLists.txt	2022-04-30 18:23:58.102734600 -0700
@@ -0,0 +1,45 @@
+set(base_examples
+    dumbbell-animation
+    grid-animation
+    star-animation
+    colors-link-description
+    resources-counters
+)
+
+foreach(
+  example
+  ${base_examples}
+)
+  build_lib_example(
+    NAME ${example}
+    SOURCE_FILES ${example}.cc
+    LIBRARIES_TO_LINK
+      ${libnetanim}
+      ${libapplications}
+      ${libpoint-to-point-layout}
+  )
+endforeach()
+
+build_lib_example(
+  NAME wireless-animation
+  SOURCE_FILES wireless-animation.cc
+  LIBRARIES_TO_LINK
+    ${libnetanim}
+    ${libapplications}
+    ${libpoint-to-point}
+    ${libcsma}
+    ${libwifi}
+    ${libmobility}
+    ${libnetwork}
+)
+
+build_lib_example(
+  NAME uan-animation
+  SOURCE_FILES uan-animation.cc
+  LIBRARIES_TO_LINK
+    ${libnetanim}
+    ${libinternet}
+    ${libmobility}
+    ${libapplications}
+    ${libuan}
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/netanim/examples/wireless-animation.cc ns-3.36/src/netanim/examples/wireless-animation.cc
--- ns-3.35/src/netanim/examples/wireless-animation.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/netanim/examples/wireless-animation.cc	2022-04-30 18:23:58.102734600 -0700
@@ -55,7 +55,6 @@
   phy.SetChannel (channel.Create ());
 
   WifiHelper wifi;
-  wifi.SetRemoteStationManager ("ns3::AarfWifiManager");
 
   WifiMacHelper mac;
   Ssid ssid = Ssid ("ns-3-ssid");
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/netanim/examples/wscript ns-3.36/src/netanim/examples/wscript
--- ns-3.35/src/netanim/examples/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/netanim/examples/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,30 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    obj = bld.create_ns3_program('dumbbell-animation',
-                                 ['netanim', 'applications', 'point-to-point-layout'])
-    obj.source = 'dumbbell-animation.cc'
-
-    obj = bld.create_ns3_program('grid-animation',
-                                 ['netanim', 'applications', 'point-to-point-layout'])
-    obj.source = 'grid-animation.cc'
-
-    obj = bld.create_ns3_program('star-animation',
-                                 ['netanim', 'applications', 'point-to-point-layout'])
-    obj.source = 'star-animation.cc'
-
-    obj = bld.create_ns3_program('wireless-animation',
-                                 ['netanim', 'applications', 'point-to-point', 'csma', 'wifi', 'mobility', 'network'])
-    obj.source = 'wireless-animation.cc'
-    
-    obj = bld.create_ns3_program('uan-animation',
-                                 ['netanim', 'internet', 'mobility', 'applications', 'uan'])
-    obj.source = 'uan-animation.cc'
-
-    obj = bld.create_ns3_program('colors-link-description',
-                                 ['netanim', 'applications', 'point-to-point-layout'])
-    obj.source = 'colors-link-description.cc'
-
-    obj = bld.create_ns3_program('resources-counters',
-                                 ['netanim', 'applications', 'point-to-point-layout'])
-    obj.source = 'resources-counters.cc'
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/netanim/model/animation-interface.cc ns-3.36/src/netanim/model/animation-interface.cc
--- ns-3.35/src/netanim/model/animation-interface.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/netanim/model/animation-interface.cc	2022-04-30 18:23:58.102734600 -0700
@@ -868,10 +868,9 @@
 }
 
 void
-AnimationInterface::WifiPhyTxBeginTrace (std::string context, WifiConstPsduMap psduMap, WifiTxVector txVector, double txPowerW)
+AnimationInterface::WifiPhyTxBeginTrace (std::string context, WifiConstPsduMap psduMap, [[maybe_unused]] WifiTxVector txVector, double txPowerW)
 {
   NS_LOG_FUNCTION (this);
-  NS_UNUSED (txVector);
   CHECK_STARTED_INTIMEWINDOW_TRACKPACKETS;
   Ptr<NetDevice> ndev = GetNetDeviceFromContext (context);
   NS_ASSERT (ndev);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/netanim/model/animation-interface.h ns-3.36/src/netanim/model/animation-interface.h
--- ns-3.35/src/netanim/model/animation-interface.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/netanim/model/animation-interface.h	2022-04-30 18:23:58.102734600 -0700
@@ -111,7 +111,6 @@
    * \param stopTime Stop Time for capturing values
    * \param pollInterval The periodic interval at which the counters are written to the trace file
    *        Default: 1s
-   * \returns none
    */
   void EnableIpv4L3ProtocolCounters (Time startTime, Time stopTime, Time pollInterval = Seconds (1));
 
@@ -122,7 +121,6 @@
    * \param stopTime Stop Time for capturing values
    * \param pollInterval The periodic interval at which the counters are written to the trace file
    *        Default: 1s
-   * \returns none
    */
   void EnableQueueCounters (Time startTime, Time stopTime, Time pollInterval = Seconds (1));
 
@@ -133,7 +131,6 @@
    * \param stopTime Stop Time for capturing values
    * \param pollInterval The periodic interval at which the counters are written to the trace file
    *        Default: 1s
-   * \returns none
    */
   void EnableWifiMacCounters (Time startTime, Time stopTime, Time pollInterval = Seconds (1));
 
@@ -144,7 +141,6 @@
    * \param stopTime Stop Time for capturing values
    * \param pollInterval The periodic interval at which the counters are written to the trace file
    *        Default: 1s
-   * \returns none
    */
   void EnableWifiPhyCounters (Time startTime, Time stopTime, Time pollInterval = Seconds (1));
 
@@ -188,7 +184,6 @@
    *
    * \param t The time at which AnimationInterface should begin capture of traffic info
    *
-   * \returns none
    */
   void SetStartTime (Time t);
 
@@ -197,7 +192,6 @@
    *
    * \param t The time at which AnimationInterface should stop capture of traffic info
    *
-   * \returns none
    */
   void SetStopTime (Time t);
 
@@ -208,7 +202,6 @@
             filenames : filename, filename-1, filename-2..., filename-N
             where each file contains packet info for 'maxPktsPerFile' number of packets
    *
-   * \returns none
    */
   void SetMaxPktsPerTraceFile (uint64_t maxPktsPerFile);
 
@@ -219,7 +212,6 @@
    * \param t Time interval between fetching mobility/position information
    * Default: 0.25s
    *
-   * \returns none
    */
   void SetMobilityPollInterval (Time t);
 
@@ -228,14 +220,12 @@
    *
    * \param cb Address of callback function
    *
-   * \returns none
    */
   void SetAnimWriteCallback (AnimWriteCallback cb);
 
   /**
    * \brief Reset the write callback function
    *
-   * \returns none
    */
   void ResetAnimWriteCallback ();
 
@@ -246,7 +236,6 @@
    * \param y Y co-ordinate of the node
    * \param z Z co-ordinate of the node
    *
-   * \returns none
    */
   static void SetConstantPosition (Ptr <Node> n, double x, double y, double z = 0);
 
@@ -255,7 +244,6 @@
    * \param n Ptr to the node
    * \param descr A string to briefly describe the node
    *
-   * \returns none
    */
   void UpdateNodeDescription (Ptr <Node> n, std::string descr);
 
@@ -264,7 +252,6 @@
    * \param nodeId Id of the node
    * \param descr A string to briefly describe the node
    *
-   * \returns none
    */
   void UpdateNodeDescription (uint32_t nodeId, std::string descr);
 
@@ -273,7 +260,6 @@
    * \param nodeId Id of the node
    * \param resourceId Id of the image resource that was previously added
    *
-   * \returns none
    */
   void UpdateNodeImage (uint32_t nodeId, uint32_t resourceId);
 
@@ -283,7 +269,6 @@
    * \param width Width of the node
    * \param height Height of the node
    *
-   * \returns none
    */
   void UpdateNodeSize (uint32_t nodeId, double width, double height);
 
@@ -294,7 +279,6 @@
    * \param g Green component value (0-255)
    * \param b Blue component value (0-255)
    *
-   * \returns none
    */
   void UpdateNodeColor (Ptr <Node> n, uint8_t r, uint8_t g, uint8_t b);
 
@@ -305,7 +289,6 @@
    * \param g Green component value (0-255)
    * \param b Blue component value (0-255)
    *
-   * \returns none
    */
   void UpdateNodeColor (uint32_t nodeId, uint8_t r, uint8_t g, uint8_t b);
 
@@ -315,7 +298,6 @@
    * \param nodeId Node Id of the node
    * \param counter Current value of the counter
    *
-   * \returns none
    */
   void UpdateNodeCounter (uint32_t nodeCounterId, uint32_t nodeId, double counter);
 
@@ -329,7 +311,6 @@
    * \param opacity Opacity of the background: A value between 0.0 and 1.0. 0.0 is transparent,
    *        1.0 is opaque
    *
-   * \returns none
    */
   void SetBackgroundImage (std::string fileName, double x, double y, double scaleX, double scaleY, double opacity);
 
@@ -339,7 +320,6 @@
    * \param toNode Node Id of the "to Node" of the p2p link
    * \param linkDescription Description of the link such as link bandwidth
    *
-   * \returns none
    */
   void UpdateLinkDescription (uint32_t fromNode, uint32_t toNode,
                               std::string linkDescription);
@@ -350,7 +330,6 @@
    * \param toNode Ptr to the "to Node" of the p2p link
    * \param linkDescription Description of the link such as link bandwidth
    *
-   * \returns none
    */
   void UpdateLinkDescription (Ptr <Node> fromNode, Ptr <Node> toNode,
                               std::string linkDescription);
@@ -374,7 +353,6 @@
   /**
    * \brief Do not trace packets. This helps reduce the trace file size if AnimationInterface is solely
    *        used for tracking mobility, routing paths and counters
-   * \returns none
    */
   void SkipPacketTracing ();
 
@@ -384,7 +362,6 @@
    * \param enable if true enables writing the packet metadata to the XML trace file
    *        if false disables writing the packet metadata
    *
-   * \returns none
    */
   void EnablePacketMetadata (bool enable = true);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/netanim/_required_netanim_version.py ns-3.36/src/netanim/_required_netanim_version.py
--- ns-3.35/src/netanim/_required_netanim_version.py	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/netanim/_required_netanim_version.py	2022-04-30 18:23:58.090734700 -0700
@@ -0,0 +1,9 @@
+# Store version information for required netanim version, used by
+# ns-3-allinone/download.py.
+# If specifying a released netanim version, specify the required netanim
+# version as, e.g. 'netanim-3.108'
+# If specifying a commit on the development tree, specify it like this based
+# on 'git describe --tags' command.  Example, if the latest release was 3.108,
+# and 'git describe --tags' reports "netanim-3.108-6-g8e7c0a9", then write the
+# version string below as 'netanim-3.108.post6+ng8e7c0a9'
+__required_netanim_version__ = 'netanim-3.108'
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/netanim/test/netanim-test.cc ns-3.36/src/netanim/test/netanim-test.cc
--- ns-3.35/src/netanim/test/netanim-test.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/netanim/test/netanim-test.cc	2022-04-30 18:23:58.102734600 -0700
@@ -57,10 +57,6 @@
    */
   virtual
   ~AbstractAnimationInterfaceTestCase ();
-  /**
-   * \brief Run unit tests for this class.
-   * \return false if all tests have passed, false otherwise
-   */
   virtual void
   DoRun (void);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/netanim/wscript ns-3.36/src/netanim/wscript
--- ns-3.35/src/netanim/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/netanim/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,25 +0,0 @@
-## -*-Mode : python; py-indent-offset : 4; indent-tabs-mode : nil; coding : utf-8; -*-
-
-import wutils
-
-# Required NetAnim version
-NETANIM_RELEASE_NAME = "netanim-3.108"
-
-def build (bld) :
-    module = bld.create_ns3_module ('netanim', ['internet', 'mobility', 'wimax', 'wifi', 'csma', 'lte', 'uan', 'lr-wpan', 'energy', 'wave', 'point-to-point-layout'])
-    module.includes = '.'
-    module.source = [ 'model/animation-interface.cc', ]
-    netanim_test = bld.create_ns3_module_test_library('netanim')
-    netanim_test.source = ['test/netanim-test.cc', ]
-    # Tests encapsulating example programs should be listed here
-    if (bld.env['ENABLE_EXAMPLES']):
-        netanim_test.source.extend([
-        #   'test/netanim-examples-test-suite.cc',
-            ])
-    
-    headers = bld(features='ns3header')
-    headers.module = 'netanim'
-    headers.source = ['model/animation-interface.h', ]
-    if (bld.env['ENABLE_EXAMPLES']) :
-       bld.recurse('examples')
-    bld.ns3_python_bindings()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/network/bindings/callbacks_list.py ns-3.36/src/network/bindings/callbacks_list.py
--- ns-3.35/src/network/bindings/callbacks_list.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/network/bindings/callbacks_list.py	2022-04-30 18:23:58.102734600 -0700
@@ -5,13 +5,13 @@
     ['bool', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'const ns3::Address &', 'const ns3::Address &', 'ns3::NetDevice::PacketType', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'const ns3::Address &', 'const ns3::Address &', 'ns3::NetDevice::PacketType', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'unsigned int', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Ptr<const ns3::QueueDiscItem>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Ptr<const ns3::Packet>', 'const ns3::Address &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'std::basic_string<char>', 'ns3::Ptr<const ns3::Packet>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<ns3::Socket>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['bool', 'ns3::Ptr<ns3::Socket>', 'const ns3::Address &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<ns3::Socket>', 'const ns3::Address &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<ns3::Socket>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'std::basic_string<char>', 'ns3::Ptr<const ns3::Packet>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'unsigned int', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Ptr<const ns3::QueueDiscItem>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Ptr<const ns3::Packet>', 'const ns3::Address &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
 ]
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/network/bindings/modulegen__gcc_ILP32.py ns-3.36/src/network/bindings/modulegen__gcc_ILP32.py
--- ns-3.35/src/network/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/network/bindings/modulegen__gcc_ILP32.py	2022-04-30 18:23:58.102734600 -0700
@@ -109,6 +109,8 @@
     module.add_class('DelayJitterEstimation')
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'], import_from_module='ns.core')
     ## hash.h (module 'core'): ns3::Hasher [class]
     module.add_class('Hasher', import_from_module='ns.core')
     ## inet6-socket-address.h (module 'network'): ns3::Inet6SocketAddress [class]
@@ -174,8 +176,6 @@
     typehandlers.add_type_alias('std::vector< ns3::Ptr< ns3::Node > > const_iterator', 'ns3::NodeList::Iterator')
     typehandlers.add_type_alias('std::vector< ns3::Ptr< ns3::Node > > const_iterator*', 'ns3::NodeList::Iterator*')
     typehandlers.add_type_alias('std::vector< ns3::Ptr< ns3::Node > > const_iterator&', 'ns3::NodeList::Iterator&')
-    ## non-copyable.h (module 'core'): ns3::NonCopyable [class]
-    module.add_class('NonCopyable', destructor_visibility='protected', import_from_module='ns.core')
     ## object-base.h (module 'core'): ns3::ObjectBase [class]
     module.add_class('ObjectBase', allow_subclassing=True, import_from_module='ns.core')
     ## object.h (module 'core'): ns3::ObjectDeleter [struct]
@@ -341,35 +341,35 @@
     module.add_class('RandomVariableStream', import_from_module='ns.core', parent=root_module['ns3::Object'])
     ## random-variable-stream.h (module 'core'): ns3::SequentialRandomVariable [class]
     module.add_class('SequentialRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::OutputStreamWrapper', 'ns3::empty', 'ns3::DefaultDeleter<ns3::OutputStreamWrapper>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbAddressBlock, ns3::empty, ns3::DefaultDeleter<ns3::PbbAddressBlock> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbAddressBlock, ns3::empty, ns3::DefaultDeleter<ns3::PbbAddressBlock>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::PbbAddressBlock', 'ns3::empty', 'ns3::DefaultDeleter<ns3::PbbAddressBlock>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbMessage, ns3::empty, ns3::DefaultDeleter<ns3::PbbMessage> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbMessage, ns3::empty, ns3::DefaultDeleter<ns3::PbbMessage>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::PbbMessage', 'ns3::empty', 'ns3::DefaultDeleter<ns3::PbbMessage>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbPacket, ns3::Header, ns3::DefaultDeleter<ns3::PbbPacket> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbPacket, ns3::Header, ns3::DefaultDeleter<ns3::PbbPacket>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::Header'], template_parameters=['ns3::PbbPacket', 'ns3::Header', 'ns3::DefaultDeleter<ns3::PbbPacket>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbTlv, ns3::empty, ns3::DefaultDeleter<ns3::PbbTlv> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbTlv, ns3::empty, ns3::DefaultDeleter<ns3::PbbTlv>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::PbbTlv', 'ns3::empty', 'ns3::DefaultDeleter<ns3::PbbTlv>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::QueueItem', 'ns3::empty', 'ns3::DefaultDeleter<ns3::QueueItem>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
     ## sll-header.h (module 'network'): ns3::SllHeader [class]
     module.add_class('SllHeader', parent=root_module['ns3::Header'])
@@ -745,7 +745,7 @@
     ## queue-item.h (module 'network'): ns3::QueueDiscItem [class]
     module.add_class('QueueDiscItem', parent=root_module['ns3::QueueItem'])
     module.add_container('std::vector< unsigned char >', 'unsigned char', container_type='vector')
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     module.add_container('std::list< ns3::Ptr< ns3::Packet > >', 'ns3::Ptr< ns3::Packet >', container_type='list')
     module.add_container('std::vector< ns3::Ipv6Address >', 'ns3::Ipv6Address', container_type='vector')
     module.add_container('std::list< unsigned int >', 'unsigned int', container_type='list')
@@ -967,7 +967,6 @@
     register_Ns3NetDeviceContainer_methods(root_module, root_module['ns3::NetDeviceContainer'])
     register_Ns3NodeContainer_methods(root_module, root_module['ns3::NodeContainer'])
     register_Ns3NodeList_methods(root_module, root_module['ns3::NodeList'])
-    register_Ns3NonCopyable_methods(root_module, root_module['ns3::NonCopyable'])
     register_Ns3ObjectBase_methods(root_module, root_module['ns3::ObjectBase'])
     register_Ns3ObjectDeleter_methods(root_module, root_module['ns3::ObjectDeleter'])
     register_Ns3ObjectFactory_methods(root_module, root_module['ns3::ObjectFactory'])
@@ -1467,7 +1466,7 @@
     cls.add_method('PushByte', 
                    'void', 
                    [param('uint8_t', 'byte')])
-    ## bit-deserializer.h (module 'network'): void ns3::BitDeserializer::PushBytes(std::vector<unsigned char, std::allocator<unsigned char> > bytes) [member function]
+    ## bit-deserializer.h (module 'network'): void ns3::BitDeserializer::PushBytes(std::vector<unsigned char, std::allocator<unsigned char>> bytes) [member function]
     cls.add_method('PushBytes', 
                    'void', 
                    [param('std::vector< unsigned char >', 'bytes')])
@@ -1482,7 +1481,7 @@
     cls.add_constructor([param('ns3::BitSerializer const &', 'arg0')])
     ## bit-serializer.h (module 'network'): ns3::BitSerializer::BitSerializer() [constructor]
     cls.add_constructor([])
-    ## bit-serializer.h (module 'network'): std::vector<unsigned char, std::allocator<unsigned char> > ns3::BitSerializer::GetBytes() [member function]
+    ## bit-serializer.h (module 'network'): std::vector<unsigned char, std::allocator<unsigned char>> ns3::BitSerializer::GetBytes() [member function]
     cls.add_method('GetBytes', 
                    'std::vector< unsigned char >', 
                    [])
@@ -3259,12 +3258,6 @@
                    is_static=True)
     return
 
-def register_Ns3NonCopyable_methods(root_module, cls):
-    ## non-copyable.h (module 'core'): ns3::NonCopyable::NonCopyable() [constructor]
-    cls.add_constructor([], 
-                        visibility='protected')
-    return
-
 def register_Ns3ObjectBase_methods(root_module, cls):
     ## object-base.h (module 'core'): ns3::ObjectBase::ObjectBase() [constructor]
     cls.add_constructor([])
@@ -3344,6 +3337,8 @@
     cls.add_constructor([param('ns3::ObjectFactory const &', 'arg0')])
     ## object-factory.h (module 'core'): ns3::ObjectFactory::ObjectFactory() [constructor]
     cls.add_constructor([])
+    ## object-factory.h (module 'core'): ns3::ObjectFactory::ObjectFactory(std::string const & typeId) [constructor]
+    cls.add_constructor([param('std::string const &', 'typeId')])
     ## object-factory.h (module 'core'): ns3::Ptr<ns3::Object> ns3::ObjectFactory::Create() const [member function]
     cls.add_method('Create', 
                    'ns3::Ptr< ns3::Object >', 
@@ -4104,6 +4099,10 @@
     cls.add_constructor([param('ns3::SimpleNetDeviceHelper const &', 'arg0')])
     ## simple-net-device-helper.h (module 'network'): ns3::SimpleNetDeviceHelper::SimpleNetDeviceHelper() [constructor]
     cls.add_constructor([])
+    ## simple-net-device-helper.h (module 'network'): void ns3::SimpleNetDeviceHelper::DisableFlowControl() [member function]
+    cls.add_method('DisableFlowControl', 
+                   'void', 
+                   [])
     ## simple-net-device-helper.h (module 'network'): ns3::NetDeviceContainer ns3::SimpleNetDeviceHelper::Install(ns3::Ptr<ns3::Node> node) const [member function]
     cls.add_method('Install', 
                    'ns3::NetDeviceContainer', 
@@ -4665,8 +4664,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -4899,14 +4898,14 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('>=')
     cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_unary_numeric_operator('-')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
     cls.add_constructor([])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(double const value) [constructor]
@@ -4925,6 +4924,8 @@
     cls.add_constructor([param('long unsigned int const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int const v) [constructor]
     cls.add_constructor([param('long long unsigned int const', 'v')])
+    ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int128_t const v) [constructor]
+    cls.add_constructor([param('int128_t const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t const hi, uint64_t const lo) [constructor]
     cls.add_constructor([param('int64_t const', 'hi'), param('uint64_t const', 'lo')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [constructor]
@@ -5261,7 +5262,7 @@
     cls.add_method('AddPacket', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet >', 'packet')])
-    ## packet-burst.h (module 'network'): std::list<ns3::Ptr<ns3::Packet>, std::allocator<ns3::Ptr<ns3::Packet> > >::const_iterator ns3::PacketBurst::Begin() const [member function]
+    ## packet-burst.h (module 'network'): std::list<ns3::Ptr<ns3::Packet>, std::allocator<ns3::Ptr<ns3::Packet>>>::const_iterator ns3::PacketBurst::Begin() const [member function]
     cls.add_method('Begin', 
                    'std::list< ns3::Ptr< ns3::Packet > > const_iterator', 
                    [], 
@@ -5271,7 +5272,7 @@
                    'ns3::Ptr< ns3::PacketBurst >', 
                    [], 
                    is_const=True)
-    ## packet-burst.h (module 'network'): std::list<ns3::Ptr<ns3::Packet>, std::allocator<ns3::Ptr<ns3::Packet> > >::const_iterator ns3::PacketBurst::End() const [member function]
+    ## packet-burst.h (module 'network'): std::list<ns3::Ptr<ns3::Packet>, std::allocator<ns3::Ptr<ns3::Packet>>>::const_iterator ns3::PacketBurst::End() const [member function]
     cls.add_method('End', 
                    'std::list< ns3::Ptr< ns3::Packet > > const_iterator', 
                    [], 
@@ -5281,7 +5282,7 @@
                    'uint32_t', 
                    [], 
                    is_const=True)
-    ## packet-burst.h (module 'network'): std::list<ns3::Ptr<ns3::Packet>, std::allocator<ns3::Ptr<ns3::Packet> > > ns3::PacketBurst::GetPackets() const [member function]
+    ## packet-burst.h (module 'network'): std::list<ns3::Ptr<ns3::Packet>, std::allocator<ns3::Ptr<ns3::Packet>>> ns3::PacketBurst::GetPackets() const [member function]
     cls.add_method('GetPackets', 
                    'std::list< ns3::Ptr< ns3::Packet > >', 
                    [], 
@@ -5526,6 +5527,11 @@
     cls.add_method('SetMaxSize', 
                    'void', 
                    [param('ns3::QueueSize', 'size')])
+    ## queue.h (module 'network'): bool ns3::QueueBase::WouldOverflow(uint32_t nPackets, uint32_t nBytes) const [member function]
+    cls.add_method('WouldOverflow', 
+                   'bool', 
+                   [param('uint32_t', 'nPackets'), param('uint32_t', 'nBytes')], 
+                   is_const=True)
     return
 
 def register_Ns3QueueLimits_methods(root_module, cls):
@@ -5729,107 +5735,107 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3OutputStreamWrapper_Ns3Empty_Ns3DefaultDeleter__lt__ns3OutputStreamWrapper__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter< ns3::OutputStreamWrapper > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3PbbAddressBlock_Ns3Empty_Ns3DefaultDeleter__lt__ns3PbbAddressBlock__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbAddressBlock, ns3::empty, ns3::DefaultDeleter<ns3::PbbAddressBlock> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbAddressBlock, ns3::empty, ns3::DefaultDeleter<ns3::PbbAddressBlock>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbAddressBlock, ns3::empty, ns3::DefaultDeleter<ns3::PbbAddressBlock> >::SimpleRefCount(ns3::SimpleRefCount<ns3::PbbAddressBlock, ns3::empty, ns3::DefaultDeleter<ns3::PbbAddressBlock> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbAddressBlock, ns3::empty, ns3::DefaultDeleter<ns3::PbbAddressBlock>>::SimpleRefCount(ns3::SimpleRefCount<ns3::PbbAddressBlock, ns3::empty, ns3::DefaultDeleter<ns3::PbbAddressBlock>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::PbbAddressBlock, ns3::empty, ns3::DefaultDeleter< ns3::PbbAddressBlock > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3PbbMessage_Ns3Empty_Ns3DefaultDeleter__lt__ns3PbbMessage__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbMessage, ns3::empty, ns3::DefaultDeleter<ns3::PbbMessage> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbMessage, ns3::empty, ns3::DefaultDeleter<ns3::PbbMessage>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbMessage, ns3::empty, ns3::DefaultDeleter<ns3::PbbMessage> >::SimpleRefCount(ns3::SimpleRefCount<ns3::PbbMessage, ns3::empty, ns3::DefaultDeleter<ns3::PbbMessage> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbMessage, ns3::empty, ns3::DefaultDeleter<ns3::PbbMessage>>::SimpleRefCount(ns3::SimpleRefCount<ns3::PbbMessage, ns3::empty, ns3::DefaultDeleter<ns3::PbbMessage>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::PbbMessage, ns3::empty, ns3::DefaultDeleter< ns3::PbbMessage > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3PbbPacket_Ns3Header_Ns3DefaultDeleter__lt__ns3PbbPacket__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbPacket, ns3::Header, ns3::DefaultDeleter<ns3::PbbPacket> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbPacket, ns3::Header, ns3::DefaultDeleter<ns3::PbbPacket>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbPacket, ns3::Header, ns3::DefaultDeleter<ns3::PbbPacket> >::SimpleRefCount(ns3::SimpleRefCount<ns3::PbbPacket, ns3::Header, ns3::DefaultDeleter<ns3::PbbPacket> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbPacket, ns3::Header, ns3::DefaultDeleter<ns3::PbbPacket>>::SimpleRefCount(ns3::SimpleRefCount<ns3::PbbPacket, ns3::Header, ns3::DefaultDeleter<ns3::PbbPacket>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::PbbPacket, ns3::Header, ns3::DefaultDeleter< ns3::PbbPacket > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3PbbTlv_Ns3Empty_Ns3DefaultDeleter__lt__ns3PbbTlv__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbTlv, ns3::empty, ns3::DefaultDeleter<ns3::PbbTlv> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbTlv, ns3::empty, ns3::DefaultDeleter<ns3::PbbTlv>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbTlv, ns3::empty, ns3::DefaultDeleter<ns3::PbbTlv> >::SimpleRefCount(ns3::SimpleRefCount<ns3::PbbTlv, ns3::empty, ns3::DefaultDeleter<ns3::PbbTlv> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbTlv, ns3::empty, ns3::DefaultDeleter<ns3::PbbTlv>>::SimpleRefCount(ns3::SimpleRefCount<ns3::PbbTlv, ns3::empty, ns3::DefaultDeleter<ns3::PbbTlv>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::PbbTlv, ns3::empty, ns3::DefaultDeleter< ns3::PbbTlv > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3QueueItem_Ns3Empty_Ns3DefaultDeleter__lt__ns3QueueItem__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> >::SimpleRefCount(ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>>::SimpleRefCount(ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::QueueItem, ns3::empty, ns3::DefaultDeleter< ns3::QueueItem > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
@@ -6007,7 +6013,7 @@
                    'uint8_t', 
                    [param('uint8_t', 'ipTos')], 
                    is_static=True)
-    ## socket.h (module 'network'): void ns3::Socket::Ipv6JoinGroup(ns3::Ipv6Address address, ns3::Socket::Ipv6MulticastFilterMode filterMode, std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address> > sourceAddresses) [member function]
+    ## socket.h (module 'network'): void ns3::Socket::Ipv6JoinGroup(ns3::Ipv6Address address, ns3::Socket::Ipv6MulticastFilterMode filterMode, std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address>> sourceAddresses) [member function]
     cls.add_method('Ipv6JoinGroup', 
                    'void', 
                    [param('ns3::Ipv6Address', 'address'), param('ns3::Socket::Ipv6MulticastFilterMode', 'filterMode'), param('std::vector< ns3::Ipv6Address >', 'sourceAddresses')], 
@@ -7057,17 +7063,17 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::QueueDiscItem const> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::Socket> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::Socket> '], visibility='protected')
+                   is_static=True, template_parameters=['bool'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['bool'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::QueueDiscItem const> '], visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -8150,7 +8156,7 @@
     cls.add_constructor([param('ns3::ListErrorModel const &', 'arg0')])
     ## error-model.h (module 'network'): ns3::ListErrorModel::ListErrorModel() [constructor]
     cls.add_constructor([])
-    ## error-model.h (module 'network'): std::list<unsigned int, std::allocator<unsigned int> > ns3::ListErrorModel::GetList() const [member function]
+    ## error-model.h (module 'network'): std::list<unsigned int, std::allocator<unsigned int>> ns3::ListErrorModel::GetList() const [member function]
     cls.add_method('GetList', 
                    'std::list< unsigned int >', 
                    [], 
@@ -8160,7 +8166,7 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## error-model.h (module 'network'): void ns3::ListErrorModel::SetList(std::list<unsigned int, std::allocator<unsigned int> > const & packetlist) [member function]
+    ## error-model.h (module 'network'): void ns3::ListErrorModel::SetList(std::list<unsigned int, std::allocator<unsigned int>> const & packetlist) [member function]
     cls.add_method('SetList', 
                    'void', 
                    [param('std::list< unsigned int > const &', 'packetlist')])
@@ -8676,10 +8682,16 @@
     cls.add_method('ExtractNeighborIndex', 
                    'uint32_t', 
                    [param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetEpoch() const [member function]
+    cls.add_method('GetEpoch', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() const [member function]
     cls.add_method('GetRemainingBits', 
                    'uint32_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -8690,6 +8702,10 @@
                    'uint32_t', 
                    [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
+    ## nix-vector.h (module 'network'): void ns3::NixVector::SetEpoch(uint32_t epoch) [member function]
+    cls.add_method('SetEpoch', 
+                   'void', 
+                   [param('uint32_t', 'epoch')])
     return
 
 def register_Ns3Node_methods(root_module, cls):
@@ -9066,10 +9082,11 @@
                    'uint32_t', 
                    [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) const [member function]
     cls.add_method('SetNixVector', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')], 
+                   is_const=True)
     ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
     cls.add_method('ToString', 
                    'std::string', 
@@ -10693,7 +10710,7 @@
     cls.add_constructor([param('ns3::ReceiveListErrorModel const &', 'arg0')])
     ## error-model.h (module 'network'): ns3::ReceiveListErrorModel::ReceiveListErrorModel() [constructor]
     cls.add_constructor([])
-    ## error-model.h (module 'network'): std::list<unsigned int, std::allocator<unsigned int> > ns3::ReceiveListErrorModel::GetList() const [member function]
+    ## error-model.h (module 'network'): std::list<unsigned int, std::allocator<unsigned int>> ns3::ReceiveListErrorModel::GetList() const [member function]
     cls.add_method('GetList', 
                    'std::list< unsigned int >', 
                    [], 
@@ -10703,7 +10720,7 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## error-model.h (module 'network'): void ns3::ReceiveListErrorModel::SetList(std::list<unsigned int, std::allocator<unsigned int> > const & packetlist) [member function]
+    ## error-model.h (module 'network'): void ns3::ReceiveListErrorModel::SetList(std::list<unsigned int, std::allocator<unsigned int>> const & packetlist) [member function]
     cls.add_method('SetList', 
                    'void', 
                    [param('std::list< unsigned int > const &', 'packetlist')])
@@ -10811,7 +10828,7 @@
                    'ns3::Ptr< ns3::Node >', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## simple-net-device.h (module 'network'): ns3::Ptr<ns3::Queue<ns3::Packet> > ns3::SimpleNetDevice::GetQueue() const [member function]
+    ## simple-net-device.h (module 'network'): ns3::Ptr<ns3::Queue<ns3::Packet>> ns3::SimpleNetDevice::GetQueue() const [member function]
     cls.add_method('GetQueue', 
                    'ns3::Ptr< ns3::Queue< ns3::Packet > >', 
                    [], 
@@ -10894,7 +10911,7 @@
                    'void', 
                    [param('ns3::Callback< bool, ns3::Ptr< ns3::NetDevice >, ns3::Ptr< ns3::Packet const >, unsigned short, ns3::Address const &, ns3::Address const &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty >', 'cb')], 
                    is_virtual=True)
-    ## simple-net-device.h (module 'network'): void ns3::SimpleNetDevice::SetQueue(ns3::Ptr<ns3::Queue<ns3::Packet> > queue) [member function]
+    ## simple-net-device.h (module 'network'): void ns3::SimpleNetDevice::SetQueue(ns3::Ptr<ns3::Queue<ns3::Packet>> queue) [member function]
     cls.add_method('SetQueue', 
                    'void', 
                    [param('ns3::Ptr< ns3::Queue< ns3::Packet > >', 'queue')])
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/network/bindings/modulegen__gcc_LP64.py ns-3.36/src/network/bindings/modulegen__gcc_LP64.py
--- ns-3.35/src/network/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/network/bindings/modulegen__gcc_LP64.py	2022-04-30 18:23:58.102734600 -0700
@@ -109,6 +109,8 @@
     module.add_class('DelayJitterEstimation')
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'], import_from_module='ns.core')
     ## hash.h (module 'core'): ns3::Hasher [class]
     module.add_class('Hasher', import_from_module='ns.core')
     ## inet6-socket-address.h (module 'network'): ns3::Inet6SocketAddress [class]
@@ -174,8 +176,6 @@
     typehandlers.add_type_alias('std::vector< ns3::Ptr< ns3::Node > > const_iterator', 'ns3::NodeList::Iterator')
     typehandlers.add_type_alias('std::vector< ns3::Ptr< ns3::Node > > const_iterator*', 'ns3::NodeList::Iterator*')
     typehandlers.add_type_alias('std::vector< ns3::Ptr< ns3::Node > > const_iterator&', 'ns3::NodeList::Iterator&')
-    ## non-copyable.h (module 'core'): ns3::NonCopyable [class]
-    module.add_class('NonCopyable', destructor_visibility='protected', import_from_module='ns.core')
     ## object-base.h (module 'core'): ns3::ObjectBase [class]
     module.add_class('ObjectBase', allow_subclassing=True, import_from_module='ns.core')
     ## object.h (module 'core'): ns3::ObjectDeleter [struct]
@@ -341,35 +341,35 @@
     module.add_class('RandomVariableStream', import_from_module='ns.core', parent=root_module['ns3::Object'])
     ## random-variable-stream.h (module 'core'): ns3::SequentialRandomVariable [class]
     module.add_class('SequentialRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::OutputStreamWrapper', 'ns3::empty', 'ns3::DefaultDeleter<ns3::OutputStreamWrapper>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbAddressBlock, ns3::empty, ns3::DefaultDeleter<ns3::PbbAddressBlock> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbAddressBlock, ns3::empty, ns3::DefaultDeleter<ns3::PbbAddressBlock>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::PbbAddressBlock', 'ns3::empty', 'ns3::DefaultDeleter<ns3::PbbAddressBlock>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbMessage, ns3::empty, ns3::DefaultDeleter<ns3::PbbMessage> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbMessage, ns3::empty, ns3::DefaultDeleter<ns3::PbbMessage>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::PbbMessage', 'ns3::empty', 'ns3::DefaultDeleter<ns3::PbbMessage>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbPacket, ns3::Header, ns3::DefaultDeleter<ns3::PbbPacket> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbPacket, ns3::Header, ns3::DefaultDeleter<ns3::PbbPacket>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::Header'], template_parameters=['ns3::PbbPacket', 'ns3::Header', 'ns3::DefaultDeleter<ns3::PbbPacket>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbTlv, ns3::empty, ns3::DefaultDeleter<ns3::PbbTlv> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbTlv, ns3::empty, ns3::DefaultDeleter<ns3::PbbTlv>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::PbbTlv', 'ns3::empty', 'ns3::DefaultDeleter<ns3::PbbTlv>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::QueueItem', 'ns3::empty', 'ns3::DefaultDeleter<ns3::QueueItem>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
     ## sll-header.h (module 'network'): ns3::SllHeader [class]
     module.add_class('SllHeader', parent=root_module['ns3::Header'])
@@ -745,7 +745,7 @@
     ## queue-item.h (module 'network'): ns3::QueueDiscItem [class]
     module.add_class('QueueDiscItem', parent=root_module['ns3::QueueItem'])
     module.add_container('std::vector< unsigned char >', 'unsigned char', container_type='vector')
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     module.add_container('std::list< ns3::Ptr< ns3::Packet > >', 'ns3::Ptr< ns3::Packet >', container_type='list')
     module.add_container('std::vector< ns3::Ipv6Address >', 'ns3::Ipv6Address', container_type='vector')
     module.add_container('std::list< unsigned int >', 'unsigned int', container_type='list')
@@ -967,7 +967,6 @@
     register_Ns3NetDeviceContainer_methods(root_module, root_module['ns3::NetDeviceContainer'])
     register_Ns3NodeContainer_methods(root_module, root_module['ns3::NodeContainer'])
     register_Ns3NodeList_methods(root_module, root_module['ns3::NodeList'])
-    register_Ns3NonCopyable_methods(root_module, root_module['ns3::NonCopyable'])
     register_Ns3ObjectBase_methods(root_module, root_module['ns3::ObjectBase'])
     register_Ns3ObjectDeleter_methods(root_module, root_module['ns3::ObjectDeleter'])
     register_Ns3ObjectFactory_methods(root_module, root_module['ns3::ObjectFactory'])
@@ -1467,7 +1466,7 @@
     cls.add_method('PushByte', 
                    'void', 
                    [param('uint8_t', 'byte')])
-    ## bit-deserializer.h (module 'network'): void ns3::BitDeserializer::PushBytes(std::vector<unsigned char, std::allocator<unsigned char> > bytes) [member function]
+    ## bit-deserializer.h (module 'network'): void ns3::BitDeserializer::PushBytes(std::vector<unsigned char, std::allocator<unsigned char>> bytes) [member function]
     cls.add_method('PushBytes', 
                    'void', 
                    [param('std::vector< unsigned char >', 'bytes')])
@@ -1482,7 +1481,7 @@
     cls.add_constructor([param('ns3::BitSerializer const &', 'arg0')])
     ## bit-serializer.h (module 'network'): ns3::BitSerializer::BitSerializer() [constructor]
     cls.add_constructor([])
-    ## bit-serializer.h (module 'network'): std::vector<unsigned char, std::allocator<unsigned char> > ns3::BitSerializer::GetBytes() [member function]
+    ## bit-serializer.h (module 'network'): std::vector<unsigned char, std::allocator<unsigned char>> ns3::BitSerializer::GetBytes() [member function]
     cls.add_method('GetBytes', 
                    'std::vector< unsigned char >', 
                    [])
@@ -3259,12 +3258,6 @@
                    is_static=True)
     return
 
-def register_Ns3NonCopyable_methods(root_module, cls):
-    ## non-copyable.h (module 'core'): ns3::NonCopyable::NonCopyable() [constructor]
-    cls.add_constructor([], 
-                        visibility='protected')
-    return
-
 def register_Ns3ObjectBase_methods(root_module, cls):
     ## object-base.h (module 'core'): ns3::ObjectBase::ObjectBase() [constructor]
     cls.add_constructor([])
@@ -3344,6 +3337,8 @@
     cls.add_constructor([param('ns3::ObjectFactory const &', 'arg0')])
     ## object-factory.h (module 'core'): ns3::ObjectFactory::ObjectFactory() [constructor]
     cls.add_constructor([])
+    ## object-factory.h (module 'core'): ns3::ObjectFactory::ObjectFactory(std::string const & typeId) [constructor]
+    cls.add_constructor([param('std::string const &', 'typeId')])
     ## object-factory.h (module 'core'): ns3::Ptr<ns3::Object> ns3::ObjectFactory::Create() const [member function]
     cls.add_method('Create', 
                    'ns3::Ptr< ns3::Object >', 
@@ -4104,6 +4099,10 @@
     cls.add_constructor([param('ns3::SimpleNetDeviceHelper const &', 'arg0')])
     ## simple-net-device-helper.h (module 'network'): ns3::SimpleNetDeviceHelper::SimpleNetDeviceHelper() [constructor]
     cls.add_constructor([])
+    ## simple-net-device-helper.h (module 'network'): void ns3::SimpleNetDeviceHelper::DisableFlowControl() [member function]
+    cls.add_method('DisableFlowControl', 
+                   'void', 
+                   [])
     ## simple-net-device-helper.h (module 'network'): ns3::NetDeviceContainer ns3::SimpleNetDeviceHelper::Install(ns3::Ptr<ns3::Node> node) const [member function]
     cls.add_method('Install', 
                    'ns3::NetDeviceContainer', 
@@ -4665,8 +4664,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -4899,14 +4898,14 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('>=')
     cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_unary_numeric_operator('-')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
     cls.add_constructor([])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(double const value) [constructor]
@@ -4925,6 +4924,8 @@
     cls.add_constructor([param('long unsigned int const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int const v) [constructor]
     cls.add_constructor([param('long long unsigned int const', 'v')])
+    ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int128_t const v) [constructor]
+    cls.add_constructor([param('int128_t const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t const hi, uint64_t const lo) [constructor]
     cls.add_constructor([param('int64_t const', 'hi'), param('uint64_t const', 'lo')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [constructor]
@@ -5261,7 +5262,7 @@
     cls.add_method('AddPacket', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet >', 'packet')])
-    ## packet-burst.h (module 'network'): std::list<ns3::Ptr<ns3::Packet>, std::allocator<ns3::Ptr<ns3::Packet> > >::const_iterator ns3::PacketBurst::Begin() const [member function]
+    ## packet-burst.h (module 'network'): std::list<ns3::Ptr<ns3::Packet>, std::allocator<ns3::Ptr<ns3::Packet>>>::const_iterator ns3::PacketBurst::Begin() const [member function]
     cls.add_method('Begin', 
                    'std::list< ns3::Ptr< ns3::Packet > > const_iterator', 
                    [], 
@@ -5271,7 +5272,7 @@
                    'ns3::Ptr< ns3::PacketBurst >', 
                    [], 
                    is_const=True)
-    ## packet-burst.h (module 'network'): std::list<ns3::Ptr<ns3::Packet>, std::allocator<ns3::Ptr<ns3::Packet> > >::const_iterator ns3::PacketBurst::End() const [member function]
+    ## packet-burst.h (module 'network'): std::list<ns3::Ptr<ns3::Packet>, std::allocator<ns3::Ptr<ns3::Packet>>>::const_iterator ns3::PacketBurst::End() const [member function]
     cls.add_method('End', 
                    'std::list< ns3::Ptr< ns3::Packet > > const_iterator', 
                    [], 
@@ -5281,7 +5282,7 @@
                    'uint32_t', 
                    [], 
                    is_const=True)
-    ## packet-burst.h (module 'network'): std::list<ns3::Ptr<ns3::Packet>, std::allocator<ns3::Ptr<ns3::Packet> > > ns3::PacketBurst::GetPackets() const [member function]
+    ## packet-burst.h (module 'network'): std::list<ns3::Ptr<ns3::Packet>, std::allocator<ns3::Ptr<ns3::Packet>>> ns3::PacketBurst::GetPackets() const [member function]
     cls.add_method('GetPackets', 
                    'std::list< ns3::Ptr< ns3::Packet > >', 
                    [], 
@@ -5526,6 +5527,11 @@
     cls.add_method('SetMaxSize', 
                    'void', 
                    [param('ns3::QueueSize', 'size')])
+    ## queue.h (module 'network'): bool ns3::QueueBase::WouldOverflow(uint32_t nPackets, uint32_t nBytes) const [member function]
+    cls.add_method('WouldOverflow', 
+                   'bool', 
+                   [param('uint32_t', 'nPackets'), param('uint32_t', 'nBytes')], 
+                   is_const=True)
     return
 
 def register_Ns3QueueLimits_methods(root_module, cls):
@@ -5729,107 +5735,107 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3OutputStreamWrapper_Ns3Empty_Ns3DefaultDeleter__lt__ns3OutputStreamWrapper__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter< ns3::OutputStreamWrapper > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3PbbAddressBlock_Ns3Empty_Ns3DefaultDeleter__lt__ns3PbbAddressBlock__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbAddressBlock, ns3::empty, ns3::DefaultDeleter<ns3::PbbAddressBlock> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbAddressBlock, ns3::empty, ns3::DefaultDeleter<ns3::PbbAddressBlock>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbAddressBlock, ns3::empty, ns3::DefaultDeleter<ns3::PbbAddressBlock> >::SimpleRefCount(ns3::SimpleRefCount<ns3::PbbAddressBlock, ns3::empty, ns3::DefaultDeleter<ns3::PbbAddressBlock> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbAddressBlock, ns3::empty, ns3::DefaultDeleter<ns3::PbbAddressBlock>>::SimpleRefCount(ns3::SimpleRefCount<ns3::PbbAddressBlock, ns3::empty, ns3::DefaultDeleter<ns3::PbbAddressBlock>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::PbbAddressBlock, ns3::empty, ns3::DefaultDeleter< ns3::PbbAddressBlock > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3PbbMessage_Ns3Empty_Ns3DefaultDeleter__lt__ns3PbbMessage__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbMessage, ns3::empty, ns3::DefaultDeleter<ns3::PbbMessage> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbMessage, ns3::empty, ns3::DefaultDeleter<ns3::PbbMessage>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbMessage, ns3::empty, ns3::DefaultDeleter<ns3::PbbMessage> >::SimpleRefCount(ns3::SimpleRefCount<ns3::PbbMessage, ns3::empty, ns3::DefaultDeleter<ns3::PbbMessage> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbMessage, ns3::empty, ns3::DefaultDeleter<ns3::PbbMessage>>::SimpleRefCount(ns3::SimpleRefCount<ns3::PbbMessage, ns3::empty, ns3::DefaultDeleter<ns3::PbbMessage>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::PbbMessage, ns3::empty, ns3::DefaultDeleter< ns3::PbbMessage > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3PbbPacket_Ns3Header_Ns3DefaultDeleter__lt__ns3PbbPacket__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbPacket, ns3::Header, ns3::DefaultDeleter<ns3::PbbPacket> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbPacket, ns3::Header, ns3::DefaultDeleter<ns3::PbbPacket>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbPacket, ns3::Header, ns3::DefaultDeleter<ns3::PbbPacket> >::SimpleRefCount(ns3::SimpleRefCount<ns3::PbbPacket, ns3::Header, ns3::DefaultDeleter<ns3::PbbPacket> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbPacket, ns3::Header, ns3::DefaultDeleter<ns3::PbbPacket>>::SimpleRefCount(ns3::SimpleRefCount<ns3::PbbPacket, ns3::Header, ns3::DefaultDeleter<ns3::PbbPacket>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::PbbPacket, ns3::Header, ns3::DefaultDeleter< ns3::PbbPacket > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3PbbTlv_Ns3Empty_Ns3DefaultDeleter__lt__ns3PbbTlv__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbTlv, ns3::empty, ns3::DefaultDeleter<ns3::PbbTlv> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbTlv, ns3::empty, ns3::DefaultDeleter<ns3::PbbTlv>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbTlv, ns3::empty, ns3::DefaultDeleter<ns3::PbbTlv> >::SimpleRefCount(ns3::SimpleRefCount<ns3::PbbTlv, ns3::empty, ns3::DefaultDeleter<ns3::PbbTlv> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PbbTlv, ns3::empty, ns3::DefaultDeleter<ns3::PbbTlv>>::SimpleRefCount(ns3::SimpleRefCount<ns3::PbbTlv, ns3::empty, ns3::DefaultDeleter<ns3::PbbTlv>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::PbbTlv, ns3::empty, ns3::DefaultDeleter< ns3::PbbTlv > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3QueueItem_Ns3Empty_Ns3DefaultDeleter__lt__ns3QueueItem__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> >::SimpleRefCount(ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>>::SimpleRefCount(ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::QueueItem, ns3::empty, ns3::DefaultDeleter< ns3::QueueItem > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
@@ -6007,7 +6013,7 @@
                    'uint8_t', 
                    [param('uint8_t', 'ipTos')], 
                    is_static=True)
-    ## socket.h (module 'network'): void ns3::Socket::Ipv6JoinGroup(ns3::Ipv6Address address, ns3::Socket::Ipv6MulticastFilterMode filterMode, std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address> > sourceAddresses) [member function]
+    ## socket.h (module 'network'): void ns3::Socket::Ipv6JoinGroup(ns3::Ipv6Address address, ns3::Socket::Ipv6MulticastFilterMode filterMode, std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address>> sourceAddresses) [member function]
     cls.add_method('Ipv6JoinGroup', 
                    'void', 
                    [param('ns3::Ipv6Address', 'address'), param('ns3::Socket::Ipv6MulticastFilterMode', 'filterMode'), param('std::vector< ns3::Ipv6Address >', 'sourceAddresses')], 
@@ -7057,17 +7063,17 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::QueueDiscItem const> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::Socket> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::Socket> '], visibility='protected')
+                   is_static=True, template_parameters=['bool'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['bool'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::QueueDiscItem const> '], visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -8150,7 +8156,7 @@
     cls.add_constructor([param('ns3::ListErrorModel const &', 'arg0')])
     ## error-model.h (module 'network'): ns3::ListErrorModel::ListErrorModel() [constructor]
     cls.add_constructor([])
-    ## error-model.h (module 'network'): std::list<unsigned int, std::allocator<unsigned int> > ns3::ListErrorModel::GetList() const [member function]
+    ## error-model.h (module 'network'): std::list<unsigned int, std::allocator<unsigned int>> ns3::ListErrorModel::GetList() const [member function]
     cls.add_method('GetList', 
                    'std::list< unsigned int >', 
                    [], 
@@ -8160,7 +8166,7 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## error-model.h (module 'network'): void ns3::ListErrorModel::SetList(std::list<unsigned int, std::allocator<unsigned int> > const & packetlist) [member function]
+    ## error-model.h (module 'network'): void ns3::ListErrorModel::SetList(std::list<unsigned int, std::allocator<unsigned int>> const & packetlist) [member function]
     cls.add_method('SetList', 
                    'void', 
                    [param('std::list< unsigned int > const &', 'packetlist')])
@@ -8676,10 +8682,16 @@
     cls.add_method('ExtractNeighborIndex', 
                    'uint32_t', 
                    [param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetEpoch() const [member function]
+    cls.add_method('GetEpoch', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() const [member function]
     cls.add_method('GetRemainingBits', 
                    'uint32_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -8690,6 +8702,10 @@
                    'uint32_t', 
                    [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
+    ## nix-vector.h (module 'network'): void ns3::NixVector::SetEpoch(uint32_t epoch) [member function]
+    cls.add_method('SetEpoch', 
+                   'void', 
+                   [param('uint32_t', 'epoch')])
     return
 
 def register_Ns3Node_methods(root_module, cls):
@@ -9066,10 +9082,11 @@
                    'uint32_t', 
                    [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) const [member function]
     cls.add_method('SetNixVector', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')], 
+                   is_const=True)
     ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
     cls.add_method('ToString', 
                    'std::string', 
@@ -10693,7 +10710,7 @@
     cls.add_constructor([param('ns3::ReceiveListErrorModel const &', 'arg0')])
     ## error-model.h (module 'network'): ns3::ReceiveListErrorModel::ReceiveListErrorModel() [constructor]
     cls.add_constructor([])
-    ## error-model.h (module 'network'): std::list<unsigned int, std::allocator<unsigned int> > ns3::ReceiveListErrorModel::GetList() const [member function]
+    ## error-model.h (module 'network'): std::list<unsigned int, std::allocator<unsigned int>> ns3::ReceiveListErrorModel::GetList() const [member function]
     cls.add_method('GetList', 
                    'std::list< unsigned int >', 
                    [], 
@@ -10703,7 +10720,7 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## error-model.h (module 'network'): void ns3::ReceiveListErrorModel::SetList(std::list<unsigned int, std::allocator<unsigned int> > const & packetlist) [member function]
+    ## error-model.h (module 'network'): void ns3::ReceiveListErrorModel::SetList(std::list<unsigned int, std::allocator<unsigned int>> const & packetlist) [member function]
     cls.add_method('SetList', 
                    'void', 
                    [param('std::list< unsigned int > const &', 'packetlist')])
@@ -10811,7 +10828,7 @@
                    'ns3::Ptr< ns3::Node >', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## simple-net-device.h (module 'network'): ns3::Ptr<ns3::Queue<ns3::Packet> > ns3::SimpleNetDevice::GetQueue() const [member function]
+    ## simple-net-device.h (module 'network'): ns3::Ptr<ns3::Queue<ns3::Packet>> ns3::SimpleNetDevice::GetQueue() const [member function]
     cls.add_method('GetQueue', 
                    'ns3::Ptr< ns3::Queue< ns3::Packet > >', 
                    [], 
@@ -10894,7 +10911,7 @@
                    'void', 
                    [param('ns3::Callback< bool, ns3::Ptr< ns3::NetDevice >, ns3::Ptr< ns3::Packet const >, unsigned short, ns3::Address const &, ns3::Address const &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty >', 'cb')], 
                    is_virtual=True)
-    ## simple-net-device.h (module 'network'): void ns3::SimpleNetDevice::SetQueue(ns3::Ptr<ns3::Queue<ns3::Packet> > queue) [member function]
+    ## simple-net-device.h (module 'network'): void ns3::SimpleNetDevice::SetQueue(ns3::Ptr<ns3::Queue<ns3::Packet>> queue) [member function]
     cls.add_method('SetQueue', 
                    'void', 
                    [param('ns3::Ptr< ns3::Queue< ns3::Packet > >', 'queue')])
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/network/CMakeLists.txt ns-3.36/src/network/CMakeLists.txt
--- ns-3.35/src/network/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/network/CMakeLists.txt	2022-04-30 18:23:58.102734600 -0700
@@ -0,0 +1,169 @@
+set(source_files
+    helper/application-container.cc
+    helper/delay-jitter-estimation.cc
+    helper/net-device-container.cc
+    helper/node-container.cc
+    helper/packet-socket-helper.cc
+    helper/simple-net-device-helper.cc
+    helper/trace-helper.cc
+    model/address.cc
+    model/application.cc
+    model/buffer.cc
+    model/byte-tag-list.cc
+    model/channel-list.cc
+    model/channel.cc
+    model/chunk.cc
+    model/header.cc
+    model/net-device.cc
+    model/nix-vector.cc
+    model/node-list.cc
+    model/node.cc
+    model/packet-metadata.cc
+    model/packet-tag-list.cc
+    model/packet.cc
+    model/socket-factory.cc
+    model/socket.cc
+    model/tag-buffer.cc
+    model/tag.cc
+    model/trailer.cc
+    utils/address-utils.cc
+    utils/bit-deserializer.cc
+    utils/bit-serializer.cc
+    utils/crc32.cc
+    utils/data-rate.cc
+    utils/drop-tail-queue.cc
+    utils/dynamic-queue-limits.cc
+    utils/error-channel.cc
+    utils/error-model.cc
+    utils/ethernet-header.cc
+    utils/ethernet-trailer.cc
+    utils/flow-id-tag.cc
+    utils/inet-socket-address.cc
+    utils/inet6-socket-address.cc
+    utils/ipv4-address.cc
+    utils/ipv6-address.cc
+    utils/llc-snap-header.cc
+    utils/mac16-address.cc
+    utils/mac48-address.cc
+    utils/mac64-address.cc
+    utils/mac8-address.cc
+    utils/net-device-queue-interface.cc
+    utils/output-stream-wrapper.cc
+    utils/packet-burst.cc
+    utils/packet-data-calculators.cc
+    utils/packet-probe.cc
+    utils/packet-socket-address.cc
+    utils/packet-socket-client.cc
+    utils/packet-socket-factory.cc
+    utils/packet-socket-server.cc
+    utils/packet-socket.cc
+    utils/packetbb.cc
+    utils/pcap-file-wrapper.cc
+    utils/pcap-file.cc
+    utils/queue-item.cc
+    utils/queue-limits.cc
+    utils/queue-size.cc
+    utils/queue.cc
+    utils/radiotap-header.cc
+    utils/simple-channel.cc
+    utils/simple-net-device.cc
+    utils/sll-header.cc
+)
+
+set(header_files
+    helper/application-container.h
+    helper/delay-jitter-estimation.h
+    helper/net-device-container.h
+    helper/node-container.h
+    helper/packet-socket-helper.h
+    helper/simple-net-device-helper.h
+    helper/trace-helper.h
+    model/address.h
+    model/application.h
+    model/buffer.h
+    model/byte-tag-list.h
+    model/channel-list.h
+    model/channel.h
+    model/chunk.h
+    model/header.h
+    model/net-device.h
+    model/nix-vector.h
+    model/node-list.h
+    model/node.h
+    model/packet-metadata.h
+    model/packet-tag-list.h
+    model/packet.h
+    model/socket-factory.h
+    model/socket.h
+    model/tag-buffer.h
+    model/tag.h
+    model/trailer.h
+    utils/address-utils.h
+    utils/bit-deserializer.h
+    utils/bit-serializer.h
+    utils/crc32.h
+    utils/data-rate.h
+    utils/drop-tail-queue.h
+    utils/dynamic-queue-limits.h
+    utils/error-channel.h
+    utils/error-model.h
+    utils/ethernet-header.h
+    utils/ethernet-trailer.h
+    utils/flow-id-tag.h
+    utils/generic-phy.h
+    utils/inet-socket-address.h
+    utils/inet6-socket-address.h
+    utils/ipv4-address.h
+    utils/ipv6-address.h
+    utils/llc-snap-header.h
+    utils/lollipop-counter.h
+    utils/mac16-address.h
+    utils/mac48-address.h
+    utils/mac64-address.h
+    utils/mac8-address.h
+    utils/net-device-queue-interface.h
+    utils/output-stream-wrapper.h
+    utils/packet-burst.h
+    utils/packet-data-calculators.h
+    utils/packet-probe.h
+    utils/packet-socket-address.h
+    utils/packet-socket-client.h
+    utils/packet-socket-factory.h
+    utils/packet-socket-server.h
+    utils/packet-socket.h
+    utils/packetbb.h
+    utils/pcap-file-wrapper.h
+    utils/pcap-file.h
+    utils/pcap-test.h
+    utils/queue-item.h
+    utils/queue-limits.h
+    utils/queue-size.h
+    utils/queue.h
+    utils/radiotap-header.h
+    utils/sequence-number.h
+    utils/simple-channel.h
+    utils/simple-net-device.h
+    utils/sll-header.h
+)
+
+build_lib(
+  LIBNAME network
+  SOURCE_FILES ${source_files}
+  HEADER_FILES ${header_files}
+  LIBRARIES_TO_LINK ${libcore}
+                    ${libstats}
+  TEST_SOURCES
+    test/bit-serializer-test.cc
+    test/buffer-test.cc
+    test/drop-tail-queue-test-suite.cc
+    test/error-model-test-suite.cc
+    test/ipv6-address-test-suite.cc
+    test/lollipop-counter-test.cc
+    test/packet-metadata-test.cc
+    test/packet-socket-apps-test-suite.cc
+    test/packet-test-suite.cc
+    test/packetbb-test-suite.cc
+    test/pcap-file-test-suite.cc
+    test/sequence-number-test-suite.cc
+    test/test-data-rate.cc
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/network/examples/CMakeLists.txt ns-3.36/src/network/examples/CMakeLists.txt
--- ns-3.35/src/network/examples/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/network/examples/CMakeLists.txt	2022-04-30 18:23:58.106734800 -0700
@@ -0,0 +1,19 @@
+set(base_examples
+    bit-serializer
+    main-packet-header
+    main-packet-tag
+    packet-socket-apps
+    lollipop-comparisions
+)
+
+foreach(
+  example
+  ${base_examples}
+)
+  build_lib_example(
+    NAME ${example}
+    SOURCE_FILES ${example}.cc
+    LIBRARIES_TO_LINK ${libnetwork}
+                      ${libcore}
+  )
+endforeach()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/network/examples/main-packet-header.cc ns-3.36/src/network/examples/main-packet-header.cc
--- ns-3.35/src/network/examples/main-packet-header.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/network/examples/main-packet-header.cc	2022-04-30 18:23:58.106734800 -0700
@@ -2,6 +2,7 @@
 #include "ns3/ptr.h"
 #include "ns3/packet.h"
 #include "ns3/header.h"
+#include "ns3/simulator.h"
 #include <iostream>
 
 using namespace ns3;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/network/examples/main-packet-tag.cc ns-3.36/src/network/examples/main-packet-tag.cc
--- ns-3.35/src/network/examples/main-packet-tag.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/network/examples/main-packet-tag.cc	2022-04-30 18:23:58.106734800 -0700
@@ -20,6 +20,7 @@
 #include "ns3/tag.h"
 #include "ns3/packet.h"
 #include "ns3/uinteger.h"
+#include "ns3/simulator.h"
 #include <iostream>
 
 using namespace ns3;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/network/examples/wscript ns-3.36/src/network/examples/wscript
--- ns-3.35/src/network/examples/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/network/examples/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,20 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    if not bld.env['ENABLE_EXAMPLES']:
-        return;
-
-    obj = bld.create_ns3_program('main-packet-header', ['network'])
-    obj.source = 'main-packet-header.cc'
-
-    obj = bld.create_ns3_program('main-packet-tag', ['network'])
-    obj.source = 'main-packet-tag.cc'
-
-    obj = bld.create_ns3_program('packet-socket-apps', ['core', 'network'])
-    obj.source = 'packet-socket-apps.cc'
-
-    obj = bld.create_ns3_program('lollipop-comparisions', ['core', 'network'])
-    obj.source = 'lollipop-comparisions.cc'
-
-    obj = bld.create_ns3_program('bit-serializer', ['core', 'network'])
-    obj.source = 'bit-serializer.cc'
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/network/helper/simple-net-device-helper.cc ns-3.36/src/network/helper/simple-net-device-helper.cc
--- ns-3.35/src/network/helper/simple-net-device-helper.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/network/helper/simple-net-device-helper.cc	2022-04-30 18:23:58.106734800 -0700
@@ -46,6 +46,7 @@
   m_deviceFactory.SetTypeId ("ns3::SimpleNetDevice");
   m_channelFactory.SetTypeId ("ns3::SimpleChannel");
   m_pointToPointMode = false;
+  m_enableFlowControl = true;
 }
 
 void 
@@ -96,6 +97,12 @@
   m_pointToPointMode = pointToPointMode;
 }
 
+void
+SimpleNetDeviceHelper::DisableFlowControl (void)
+{
+  m_enableFlowControl = false;
+}
+
 NetDeviceContainer
 SimpleNetDeviceHelper::Install (Ptr<Node> node) const
 {
@@ -141,10 +148,13 @@
   Ptr<Queue<Packet> > queue = m_queueFactory.Create<Queue<Packet> > ();
   device->SetQueue (queue);
   NS_ASSERT_MSG (!m_pointToPointMode || (channel->GetNDevices () <= 2), "Device set to PointToPoint and more than 2 devices on the channel.");
-  // Aggregate a NetDeviceQueueInterface object
-  Ptr<NetDeviceQueueInterface> ndqi = CreateObject<NetDeviceQueueInterface> ();
-  ndqi->GetTxQueue (0)->ConnectQueueTraces (queue);
-  device->AggregateObject (ndqi);
+  if (m_enableFlowControl)
+    {
+      // Aggregate a NetDeviceQueueInterface object
+      Ptr<NetDeviceQueueInterface> ndqi = CreateObject<NetDeviceQueueInterface> ();
+      ndqi->GetTxQueue (0)->ConnectQueueTraces (queue);
+      device->AggregateObject (ndqi);
+    }
   return device;
 }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/network/helper/simple-net-device-helper.h ns-3.36/src/network/helper/simple-net-device-helper.h
--- ns-3.35/src/network/helper/simple-net-device-helper.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/network/helper/simple-net-device-helper.h	2022-04-30 18:23:58.106734800 -0700
@@ -121,6 +121,16 @@
   void SetNetDevicePointToPointMode (bool pointToPointMode);
 
   /**
+   * Disable flow control only if you know what you are doing. By disabling
+   * flow control, this NetDevice will be sent packets even if there is no
+   * room for them (such packets will be likely dropped by this NetDevice).
+   * Also, any queue disc installed on this NetDevice will have no effect,
+   * as every packet enqueued to the traffic control layer queue disc will
+   * be immediately dequeued.
+   */
+  void DisableFlowControl (void);
+
+  /**
    * This method creates an ns3::SimpleChannel with the attributes configured by
    * SimpleNetDeviceHelper::SetChannelAttribute, an ns3::SimpleNetDevice with the attributes
    * configured by SimpleNetDeviceHelper::SetDeviceAttribute and then adds the device
@@ -182,7 +192,7 @@
   ObjectFactory m_deviceFactory; //!< NetDevice factory
   ObjectFactory m_channelFactory; //!< Channel factory
   bool m_pointToPointMode; //!< Install PointToPoint SimpleNetDevice or Broadcast ones
-
+  bool m_enableFlowControl; //!< whether to enable flow control
 };
 
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/network/model/nix-vector.cc ns-3.36/src/network/model/nix-vector.cc
--- ns-3.35/src/network/model/nix-vector.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/network/model/nix-vector.cc	2022-04-30 18:23:58.106734800 -0700
@@ -32,12 +32,10 @@
 NixVector::NixVector ()
   : m_nixVector (0),
     m_used (0),
-    m_currentVectorBitSize (0),
-    m_totalBitSize (0)
+    m_totalBitSize (0),
+    m_epoch (0)
 {
   NS_LOG_FUNCTION (this);
-
-  m_nixVector.push_back (0);
 }
 
 NixVector::~NixVector ()
@@ -48,8 +46,8 @@
 NixVector::NixVector (const NixVector &o)
   : m_nixVector (o.m_nixVector),
     m_used (o.m_used),
-    m_currentVectorBitSize (o.m_currentVectorBitSize),
-    m_totalBitSize (o.m_totalBitSize)
+    m_totalBitSize (o.m_totalBitSize),
+    m_epoch (o.m_epoch)
 {
 }
 
@@ -62,8 +60,8 @@
     }
   m_nixVector = o.m_nixVector;
   m_used = o.m_used;
-  m_currentVectorBitSize = o.m_currentVectorBitSize;
   m_totalBitSize = o.m_totalBitSize;
+  m_epoch = o.m_epoch;
   return *this;
 }
 
@@ -80,7 +78,8 @@
 /* For printing the nix vector */
 std::ostream & operator << (std::ostream &os, const NixVector &nix)
 {
-  nix.DumpNixVector (os); 
+  nix.DumpNixVector (os);
+  os << " (" << nix.GetRemainingBits () << " bits left)";
   return os;
 }
 
@@ -94,47 +93,32 @@
       NS_FATAL_ERROR ("Can't add more than 32 bits to a nix-vector at one time");
     }
 
+  // This can be in the range [0,31]
+  uint32_t currentVectorBitSize = m_totalBitSize % 32;
+
+  if (currentVectorBitSize == 0)
+    {
+      m_nixVector.push_back (0);
+    }
+
   // Check to see if the number
-  // of new bits forces the creation of 
+  // of new bits forces the creation of
   // a new entry into the NixVector vector
   // i.e., we will overflow int o.w.
-  if (m_currentVectorBitSize + numberOfBits > 32) 
+  if (currentVectorBitSize + numberOfBits > 32)
     {
-      if (m_currentVectorBitSize == 32)
-        {
-          // can't add any more to this vector, so 
-          // start a new one
-          m_nixVector.push_back (newBits);
-
-          // also reset number of bits in
-          // m_currentVectorBitSize
-          // because we are working with a new 
-          // entry in the vector
-          m_currentVectorBitSize = numberOfBits;
-          m_totalBitSize += numberOfBits;
-        }
-      else
-        {
-          // Put what we can in the remaining portion of the 
-          // vector entry
-          uint32_t tempBits = newBits;
-          tempBits = newBits << m_currentVectorBitSize;
-          tempBits |= m_nixVector.back ();
-          m_nixVector.back () = tempBits;
-
-          // Now start a new vector entry
-          // and push the remaining bits 
-          // there
-          newBits = newBits >> (32 - m_currentVectorBitSize);
-          m_nixVector.push_back (newBits);
-
-          // also reset number of bits in
-          // m_currentVectorBitSize
-          // because we are working with a new 
-          // entry in the vector
-          m_currentVectorBitSize = (numberOfBits - (32 - m_currentVectorBitSize));
-          m_totalBitSize += numberOfBits;
-        }
+      // Put what we can in the remaining portion of the
+      // vector entry
+      uint32_t tempBits = newBits;
+      tempBits = newBits << currentVectorBitSize;
+      tempBits |= m_nixVector.back ();
+      m_nixVector.back () = tempBits;
+
+      // Now start a new vector entry
+      // and push the remaining bits
+      // there
+      newBits = newBits >> (32 - currentVectorBitSize);
+      m_nixVector.push_back (newBits);
     }
   else
     {
@@ -143,17 +127,16 @@
       // us to logically OR with the present 
       // NixVector, resulting in the new 
       // NixVector
-      newBits = newBits << m_currentVectorBitSize;
+      newBits = newBits << currentVectorBitSize;
       newBits |= m_nixVector.back ();
 
       // Now insert the new NixVector and 
       // increment number of bits for
-      // m_currentVectorBitSize and m_totalBitSize
+      // currentVectorBitSize and m_totalBitSize
       // accordingly 
       m_nixVector.back () = newBits;
-      m_currentVectorBitSize += numberOfBits;
-      m_totalBitSize += numberOfBits;
     }
+  m_totalBitSize += numberOfBits;
 }
 
 uint32_t
@@ -214,11 +197,14 @@
 NixVector::GetSerializedSize (void) const
 {
   NS_LOG_FUNCTION (this);
-  uint32_t totalSizeInBytes = 0;
-  totalSizeInBytes = sizeof (m_used) + sizeof (m_currentVectorBitSize) + 
-    sizeof (m_totalBitSize) + (4 * m_nixVector.size ());
 
-  return totalSizeInBytes;
+  if (m_totalBitSize == 0)
+    {
+      return sizeof (m_totalBitSize);
+    }
+
+  return sizeof (m_used) + sizeof (m_totalBitSize) + (sizeof (uint32_t) * m_nixVector.size ()) +
+         sizeof (m_epoch);
 }
 
 uint32_t
@@ -226,55 +212,24 @@
 {
   NS_LOG_FUNCTION (this << buffer << maxSize);
   uint32_t* p = buffer;
-  uint32_t size = 0;
 
-  if (size + 4 <= maxSize)
-    {
-      size += 4;
-      // grab number of used bits
-      *p++ = m_used;
-    }
-  else
+  if (maxSize < GetSerializedSize ())
     {
       return 0;
     }
 
-  if (size + 4 <= maxSize)
-    {
-      size += 4;
-      // grab number of current used bits
-      // for the front vector
-      *p++ = m_currentVectorBitSize;
-    }
-  else
-    {
-      return 0;
-    }
+  *p++ = m_totalBitSize;
 
-  if (size + 4 <= maxSize)
-    {
-      size += 4;
-      // grab total bit size
-      *p++ = m_totalBitSize;
-    }
-  else 
+  if (m_totalBitSize)
     {
-      return 0;
-    }
-  for (uint32_t j = 0; j < m_nixVector.size (); j++)
-    {
-      if (size + 4 <= maxSize)
+      *p++ = m_used;
+      for (uint32_t j = 0; j < m_nixVector.size (); j++)
         {
-          size += 4;
           *p++ = m_nixVector.at (j);
         }
-      else
-        {
-          return 0;
-        }
+      *p++ = m_epoch;
     }
 
-  // Serialized successfully
   return 1;
 }
 
@@ -283,78 +238,87 @@
 {
   NS_LOG_FUNCTION (this << buffer << size);
   const uint32_t* p = buffer;
-  uint32_t sizeCheck = size - 4;
-
-  NS_ASSERT (sizeCheck >= 4);
-  m_used = *p++;
-  sizeCheck -= 4;
 
-  NS_ASSERT (sizeCheck >= 4);
-  m_currentVectorBitSize = *p++;
-  sizeCheck -= 4;
+  NS_ASSERT_MSG (size >= sizeof (m_totalBitSize),
+                 "NixVector minimum serialized length is " << sizeof (m_totalBitSize) << " bytes");
+  if (size < sizeof (m_totalBitSize))
+    {
+      // return zero if an entire nix-vector was
+      // not deserialized
+      return 0;
+    }
 
-  NS_ASSERT (sizeCheck >= 4);
   m_totalBitSize = *p++;
-  sizeCheck -= 4;
 
-  // make sure the nix-vector
-  // is empty
-  m_nixVector.clear ();
-  while (sizeCheck > 0)
+  if (m_totalBitSize)
     {
-      NS_ASSERT (sizeCheck >= 4);
-      uint32_t nix = *p++;
-      m_nixVector.push_back (nix);
-      sizeCheck -= 4;
-    }
+      m_used = *p++;
 
-  NS_ASSERT (sizeCheck == 0);
+      // NixVector is packed in 32-bit unsigned ints.
+      uint32_t nixVectorLenth = m_totalBitSize / 32;
+      nixVectorLenth += (m_totalBitSize % 32) ? 1 : 0;
 
-  // return zero if an entire nix-vector was 
-  // not deserialized
-  return (sizeCheck != 0) ? 0 : 1;
+      NS_ASSERT_MSG (size >= 16 + nixVectorLenth, "NixVector serialized length should have been "
+                                                      << 16 + nixVectorLenth
+                                                      << " but buffer is shorter");
+      if (size < 16 + nixVectorLenth * 4)
+        {
+          // return zero if an entire nix-vector was
+          // not deserialized
+          return 0;
+        }
+
+      // make sure the nix-vector
+      // is empty
+      m_nixVector.clear ();
+      for (uint32_t j = 0; j < nixVectorLenth; j++)
+        {
+          uint32_t nix = *p++;
+          m_nixVector.push_back (nix);
+        }
+
+      m_epoch = *p++;
+    }
+
+  return (GetSerializedSize ());
 }
 
 void
 NixVector::DumpNixVector (std::ostream &os) const
 {
   NS_LOG_FUNCTION (this << &os);
-  uint32_t i = m_nixVector.size ();
-  std::vector<uint32_t>::const_reverse_iterator rIter;
-  for (rIter = m_nixVector.rbegin (); rIter != m_nixVector.rend (); rIter++)
+
+  if (m_nixVector.empty ())
     {
-      uint32_t numBits = BitCount (*rIter);
+      os << "0";
+      return;
+    }
 
-      // all this work just to get the nix 
-      // vector to print out neat
+  std::vector<uint32_t>::const_reverse_iterator rIter;
+  bool first = true;
 
-      // if it's not the first entry in the vector, 
-      // we may have to add some zeros and fill 
-      // out the vector
-      if (m_totalBitSize > ((sizeof (uint32_t)*8) * i))
-        {
-          PrintDec2BinNixFill (*rIter,numBits,os);
-        }
-      else if (m_totalBitSize%32 == 0)
+  for (rIter = m_nixVector.rbegin (); rIter != m_nixVector.rend (); )
+    {
+      if (m_totalBitSize % 32 != 0 && first)
         {
-          PrintDec2BinNix (*rIter,32,os);
+          PrintDec2BinNix (*rIter, m_totalBitSize % 32, os);
         }
       else
         {
-          PrintDec2BinNix (*rIter,m_totalBitSize%32,os);
+          PrintDec2BinNix (*rIter, 32, os);
         }
+      first = false;
 
-      i--;
-
-      if (i > 0)
+      rIter++;
+      if (rIter != m_nixVector.rend ())
         {
           os << "--";
         }
     }
 }
 
-uint32_t 
-NixVector::GetRemainingBits (void)
+uint32_t
+NixVector::GetRemainingBits (void) const
 {
   NS_LOG_FUNCTION (this);
 
@@ -412,33 +376,15 @@
 }
 
 void
-NixVector::PrintDec2BinNixFill (uint32_t decimalNum, uint32_t bitCount, std::ostream &os) const
+NixVector::SetEpoch (uint32_t epoch)
 {
-  NS_LOG_FUNCTION (this << decimalNum << bitCount << &os);
-  if(decimalNum == 0)
-    {
-      os << 0;
-      return;
-    }
-  if(decimalNum == 1)
-    {
-      // check to see if we need to 
-      // print out some zeros at the 
-      // beginning of the nix vector
-      if ((uint32_t)(sizeof (uint32_t)*8) > bitCount)
-        {
-          for (uint32_t i = ((sizeof (uint32_t)*8)-bitCount); i > 0; i--)
-            {
-              os << 0;
-            }
-        }
-      os << 1;
-    }
-  else
-    {
-      PrintDec2BinNixFill (decimalNum / 2, bitCount, os);
-      os << decimalNum % 2;
-    }
+  m_epoch = epoch;
+}
+
+uint32_t
+NixVector::GetEpoch () const
+{
+  return m_epoch;
 }
 
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/network/model/nix-vector.h ns-3.36/src/network/model/nix-vector.h
--- ns-3.35/src/network/model/nix-vector.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/network/model/nix-vector.h	2022-04-30 18:23:58.106734800 -0700
@@ -112,7 +112,7 @@
    * \return number of bits remaining in the
    *         nix-vector (ie m_total - m_used)
    */
-  uint32_t GetRemainingBits (void);
+  uint32_t GetRemainingBits (void) const;
   /**
    * \return the number of bytes required for serialization
    */
@@ -150,6 +150,17 @@
    */
   uint32_t BitCount (uint32_t numberOfNeighbors) const;
 
+  /**
+   * Set the NixVector Epoch
+   * \param epoch the NixVector Epoch
+   */
+  void SetEpoch (uint32_t epoch);
+
+  /**
+   * Get the NixVector Epoch
+   * \return the NixVector Epoch
+   */
+  uint32_t GetEpoch () const;
 
 private:
   /// Typedef: the NixVector bits storage.
@@ -159,8 +170,9 @@
    * \brief Print the NixVector.
    *
    * \param os the output stream
+   * 
+   * \note: this could be greatly simplified by using std::format (but it's C++20).
    */
-  /* for printing of nix-vector */
   void DumpNixVector (std::ostream &os) const;
 
   /**
@@ -176,26 +188,12 @@
   uint32_t m_used; //!< For tracking where we are in the nix-vector
 
   /**
-   * For tracking how many bits we
-   * have used in the current vector
-   * entry. need this in order to
-   * expand the vector passed 32bits
-   */
-  uint32_t m_currentVectorBitSize;
-
-  /**
    * A counter of how total bits are in
    * the nix-vector
    */
   uint32_t m_totalBitSize;
 
-  /**
-   * Internal for pretty printing of nix-vector (fill)
-   * \param decimalNum decimal divider
-   * \param bitCount bit counter
-   * \param os output stream
-   */
-  void PrintDec2BinNixFill (uint32_t decimalNum, uint32_t bitCount, std::ostream &os) const;
+  uint32_t m_epoch; //!< Epoch of the Nix-vector creation
 
   /**
    * Internal for pretty printing of nix-vector (no fill)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/network/model/packet.cc ns-3.36/src/network/model/packet.cc
--- ns-3.35/src/network/model/packet.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/network/model/packet.cc	2022-04-30 18:23:58.106734800 -0700
@@ -241,7 +241,7 @@
 }
 
 void
-Packet::SetNixVector (Ptr<NixVector> nixVector)
+Packet::SetNixVector (Ptr<NixVector> nixVector) const
 {
   m_nixVector = nixVector;
 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/network/model/packet.h ns-3.36/src/network/model/packet.h
--- ns-3.35/src/network/model/packet.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/network/model/packet.h	2022-04-30 18:23:58.106734800 -0700
@@ -687,16 +687,20 @@
   /**
    * \brief Set the packet nix-vector.
    *
-   * Note: This function supports a temporary solution
+   * \note Note: This function supports a temporary solution
    * to a specific problem in this generic class, i.e. 
    * how to associate something specific like nix-vector 
    * with a packet.  This design methodology 
    * should _not_ be followed, and is only here as an 
    * impetus to fix this general issue.
    *
+   * \warning For real this function is not const, as it is the
+   * setter for a mutable variable member. The const qualifier
+   * is needed to set a private mutable variable of const objects.
+   * 
    * \param nixVector the nix vector
    */
-  void SetNixVector (Ptr<NixVector> nixVector);
+  void SetNixVector (Ptr<NixVector> nixVector) const;
   /**
    * \brief Get the packet nix-vector.
    *
@@ -785,7 +789,7 @@
   PacketMetadata m_metadata;      //!< the packet's metadata
 
   /* Please see comments above about nix-vector */
-  Ptr<NixVector> m_nixVector; //!< the packet's Nix vector
+  mutable Ptr<NixVector> m_nixVector; //!< the packet's Nix vector
 
   static uint32_t m_globalUid; //!< Global counter of packets Uid
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/network/model/socket.cc ns-3.36/src/network/model/socket.cc
--- ns-3.35/src/network/model/socket.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/network/model/socket.cc	2022-04-30 18:23:58.106734800 -0700
@@ -67,7 +67,7 @@
   NS_LOG_FUNCTION (this);
 }
 
-Ptr<Socket> 
+Ptr<Socket>
 Socket::CreateSocket (Ptr<Node> node, TypeId tid)
 {
   NS_LOG_FUNCTION (node << tid);
@@ -80,7 +80,7 @@
   return s;
 }
 
-void 
+void
 Socket::SetConnectCallback (
   Callback<void, Ptr<Socket> > connectionSucceeded,
   Callback<void, Ptr<Socket> > connectionFailed)
@@ -90,7 +90,7 @@
   m_connectionFailed = connectionFailed;
 }
 
-void 
+void
 Socket::SetCloseCallbacks (
   Callback<void, Ptr<Socket> > normalClose,
   Callback<void, Ptr<Socket> > errorClose)
@@ -100,7 +100,7 @@
   m_errorClose = errorClose;
 }
 
-void 
+void
 Socket::SetAcceptCallback (
   Callback<bool, Ptr<Socket>, const Address &> connectionRequest,
   Callback<void, Ptr<Socket>, const Address&> newConnectionCreated)
@@ -124,21 +124,21 @@
   m_sendCb = sendCb;
 }
 
-void 
+void
 Socket::SetRecvCallback (Callback<void, Ptr<Socket> > receivedData)
 {
   NS_LOG_FUNCTION (this << &receivedData);
   m_receivedData = receivedData;
 }
 
-int 
+int
 Socket::Send (Ptr<Packet> p)
 {
   NS_LOG_FUNCTION (this << p);
   return Send (p, 0);
 }
 
-int 
+int
 Socket::Send (const uint8_t* buf, uint32_t size, uint32_t flags)
 {
   NS_LOG_FUNCTION (this << &buf << size << flags);
@@ -154,7 +154,7 @@
   return Send (p, flags);
 }
 
-int 
+int
 Socket::SendTo (const uint8_t* buf, uint32_t size, uint32_t flags,
                 const Address &toAddress)
 {
@@ -178,7 +178,7 @@
   return Recv (std::numeric_limits<uint32_t>::max (), 0);
 }
 
-int 
+int
 Socket::Recv (uint8_t* buf, uint32_t size, uint32_t flags)
 {
   NS_LOG_FUNCTION (this << &buf << size << flags);
@@ -198,12 +198,12 @@
   return RecvFrom (std::numeric_limits<uint32_t>::max (), 0, fromAddress);
 }
 
-int 
+int
 Socket::RecvFrom (uint8_t* buf, uint32_t size, uint32_t flags,
                   Address &fromAddress)
 {
   NS_LOG_FUNCTION (this << &buf << size << flags << &fromAddress);
-  Ptr<Packet> p = RecvFrom (size, flags, fromAddress); 
+  Ptr<Packet> p = RecvFrom (size, flags, fromAddress);
   if (p == 0)
     {
       return 0;
@@ -213,7 +213,7 @@
 }
 
 
-void 
+void
 Socket::NotifyConnectionSucceeded (void)
 {
   NS_LOG_FUNCTION (this);
@@ -223,7 +223,7 @@
     }
 }
 
-void 
+void
 Socket::NotifyConnectionFailed (void)
 {
   NS_LOG_FUNCTION (this);
@@ -233,7 +233,7 @@
     }
 }
 
-void 
+void
 Socket::NotifyNormalClose (void)
 {
   NS_LOG_FUNCTION (this);
@@ -243,7 +243,7 @@
     }
 }
 
-void 
+void
 Socket::NotifyErrorClose (void)
 {
   NS_LOG_FUNCTION (this);
@@ -253,7 +253,7 @@
     }
 }
 
-bool 
+bool
 Socket::NotifyConnectionRequest (const Address &from)
 {
   NS_LOG_FUNCTION (this << &from);
@@ -271,7 +271,7 @@
     }
 }
 
-void 
+void
 Socket::NotifyNewConnectionCreated (Ptr<Socket> socket, const Address &from)
 {
   NS_LOG_FUNCTION (this << socket << from);
@@ -281,7 +281,7 @@
     }
 }
 
-void 
+void
 Socket::NotifyDataSent (uint32_t size)
 {
   NS_LOG_FUNCTION (this << size);
@@ -291,7 +291,7 @@
     }
 }
 
-void 
+void
 Socket::NotifySend (uint32_t spaceAvailable)
 {
   NS_LOG_FUNCTION (this << spaceAvailable);
@@ -301,7 +301,7 @@
     }
 }
 
-void 
+void
 Socket::NotifyDataRecv (void)
 {
   NS_LOG_FUNCTION (this);
@@ -311,7 +311,7 @@
     }
 }
 
-void 
+void
 Socket::DoDispose (void)
 {
   NS_LOG_FUNCTION (this);
@@ -354,7 +354,7 @@
   return m_boundnetdevice;
 }
 
-void 
+void
 Socket::SetRecvPktInfo (bool flag)
 {
   NS_LOG_FUNCTION (this << flag);
@@ -600,14 +600,14 @@
   NS_LOG_FUNCTION (this);
 }
 
-void 
+void
 SocketIpTtlTag::SetTtl (uint8_t ttl)
 {
   NS_LOG_FUNCTION (this << static_cast<uint32_t> (ttl));
   m_ttl = ttl;
 }
 
-uint8_t 
+uint8_t
 SocketIpTtlTag::GetTtl (void) const
 {
   NS_LOG_FUNCTION (this);
@@ -632,21 +632,21 @@
   return GetTypeId ();
 }
 
-uint32_t 
+uint32_t
 SocketIpTtlTag::GetSerializedSize (void) const
-{ 
+{
   NS_LOG_FUNCTION (this);
   return 1;
 }
-void 
+void
 SocketIpTtlTag::Serialize (TagBuffer i) const
-{ 
+{
   NS_LOG_FUNCTION (this << &i);
   i.WriteU8 (m_ttl);
 }
-void 
+void
 SocketIpTtlTag::Deserialize (TagBuffer i)
-{ 
+{
   NS_LOG_FUNCTION (this << &i);
   m_ttl = i.ReadU8 ();
 }
@@ -661,13 +661,13 @@
 {
 }
 
-void 
+void
 SocketIpv6HopLimitTag::SetHopLimit (uint8_t hopLimit)
 {
   m_hopLimit = hopLimit;
 }
 
-uint8_t 
+uint8_t
 SocketIpv6HopLimitTag::GetHopLimit (void) const
 {
   return m_hopLimit;
@@ -691,19 +691,19 @@
   return GetTypeId ();
 }
 
-uint32_t 
+uint32_t
 SocketIpv6HopLimitTag::GetSerializedSize (void) const
-{ 
+{
   return 1;
 }
-void 
+void
 SocketIpv6HopLimitTag::Serialize (TagBuffer i) const
-{ 
+{
   i.WriteU8 (m_hopLimit);
 }
-void 
+void
 SocketIpv6HopLimitTag::Deserialize (TagBuffer i)
-{ 
+{
   m_hopLimit = i.ReadU8 ();
 }
 void
@@ -737,7 +737,7 @@
 
 NS_OBJECT_ENSURE_REGISTERED (SocketSetDontFragmentTag);
 
-TypeId 
+TypeId
 SocketSetDontFragmentTag::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::SocketSetDontFragmentTag")
@@ -746,30 +746,30 @@
     .AddConstructor<SocketSetDontFragmentTag> ();
   return tid;
 }
-TypeId 
+TypeId
 SocketSetDontFragmentTag::GetInstanceTypeId (void) const
 {
   return GetTypeId ();
 }
-uint32_t 
+uint32_t
 SocketSetDontFragmentTag::GetSerializedSize (void) const
 {
   NS_LOG_FUNCTION (this);
   return 1;
 }
-void 
+void
 SocketSetDontFragmentTag::Serialize (TagBuffer i) const
 {
   NS_LOG_FUNCTION (this << &i);
   i.WriteU8 (m_dontFragment ? 1 : 0);
 }
-void 
+void
 SocketSetDontFragmentTag::Deserialize (TagBuffer i)
 {
   NS_LOG_FUNCTION (this << &i);
-  m_dontFragment = (i.ReadU8 () == 1) ? true : false;
+  m_dontFragment = (i.ReadU8 () == 1);
 }
-void 
+void
 SocketSetDontFragmentTag::Print (std::ostream &os) const
 {
   NS_LOG_FUNCTION (this << &os);
@@ -804,7 +804,7 @@
   return tid;
 }
 
-TypeId 
+TypeId
 SocketIpTosTag::GetInstanceTypeId (void) const
 {
   return GetTypeId ();
@@ -913,13 +913,13 @@
 {
   static TypeId tid = TypeId ("ns3::SocketIpv6TclassTag")
     .SetParent<Tag> ()
-    .SetGroupName("Network") 
+    .SetGroupName("Network")
     .AddConstructor<SocketIpv6TclassTag> ()
     ;
   return tid;
 }
 
-TypeId 
+TypeId
 SocketIpv6TclassTag::GetInstanceTypeId (void) const
 {
   return GetTypeId ();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/network/test/buffer-test.cc ns-3.36/src/network/test/buffer-test.cc
--- ns-3.35/src/network/test/buffer-test.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/network/test/buffer-test.cc	2022-04-30 18:23:58.110734700 -0700
@@ -43,10 +43,8 @@
    * \param b The buffer to check
    * \param n The number of bytes to check
    * \param array The array of bytes that should be in the buffer
-   * \param file The file name
-   * \param line The line number
    */
-  void EnsureWrittenBytes (Buffer b, uint32_t n, uint8_t array[], const char *file, int line);
+  void EnsureWrittenBytes (Buffer b, uint32_t n, uint8_t array[]);
 public:
   virtual void DoRun (void);
   BufferTest ();
@@ -58,39 +56,39 @@
 }
 
 void
-BufferTest::EnsureWrittenBytes (Buffer b, uint32_t n, uint8_t array[], const char *file, int line)
+BufferTest::EnsureWrittenBytes (Buffer b, uint32_t n, uint8_t array[])
 {
   bool success = true;
   uint8_t *expected = array;
   uint8_t const*got;
   got = b.PeekData ();
-  for (uint32_t j = 0; j < n; j++) 
+  for (uint32_t j = 0; j < n; j++)
     {
-      if (got[j] != expected[j]) 
+      if (got[j] != expected[j])
         {
           success = false;
         }
     }
-  if (!success) 
+  if (!success)
     {
       std::ostringstream failure;
       failure << "Buffer -- ";
       failure << "expected: n=";
       failure << n << ", ";
       failure.setf (std::ios::hex, std::ios::basefield);
-      for (uint32_t j = 0; j < n; j++) 
+      for (uint32_t j = 0; j < n; j++)
         {
           failure << (uint16_t)expected[j] << " ";
         }
       failure.setf (std::ios::dec, std::ios::basefield);
       failure << "got: ";
       failure.setf (std::ios::hex, std::ios::basefield);
-      for (uint32_t j = 0; j < n; j++) 
+      for (uint32_t j = 0; j < n; j++)
         {
           failure << (uint16_t)got[j] << " ";
         }
       failure << std::endl;
-      NS_TEST_ASSERT_MSG_EQ_INTERNAL (true, false, failure.str (), file, line);
+      NS_TEST_ASSERT_MSG_EQ (true, false, failure.str ());
     }
 }
 
@@ -98,10 +96,10 @@
  * Works only when variadic macros are
  * available which is the case for gcc.
  */
-#define ENSURE_WRITTEN_BYTES(buffer, n, ...)                    \
-  {                                                             \
-    uint8_t bytes[] = { __VA_ARGS__};                            \
-    EnsureWrittenBytes (buffer, n, bytes, __FILE__, __LINE__);  \
+#define ENSURE_WRITTEN_BYTES(buffer, n, ...) \
+  {                                          \
+    uint8_t bytes[] = { __VA_ARGS__};        \
+    EnsureWrittenBytes (buffer, n, bytes);   \
   }
 
 void
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/network/test/packet-metadata-test.cc ns-3.36/src/network/test/packet-metadata-test.cc
--- ns-3.35/src/network/test/packet-metadata-test.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/network/test/packet-metadata-test.cc	2022-04-30 18:23:58.110734700 -0700
@@ -61,7 +61,7 @@
   bool m_ok; //!< True if no error is signalled.
 };
 
-TypeId 
+TypeId
 HistoryHeaderBase::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::HistoryHeaderBase")
@@ -124,7 +124,7 @@
 {
   std::ostringstream oss;
   oss << "ns3::HistoryHeader<"<<N<<">";
-  static TypeId tid = TypeId (oss.str ().c_str ())
+  static TypeId tid = TypeId (oss.str ())
     .SetParent<HistoryHeaderBase> ()
     .AddConstructor<HistoryHeader<N> > ()
   ;
@@ -132,25 +132,25 @@
 }
 
 template <int N>
-TypeId 
+TypeId
 HistoryHeader<N>::GetInstanceTypeId (void) const
 {
   return GetTypeId ();
 }
 template <int N>
-void 
+void
 HistoryHeader<N>::Print (std::ostream &os) const
 {
   NS_ASSERT (false);
 }
 template <int N>
-uint32_t 
+uint32_t
 HistoryHeader<N>::GetSerializedSize (void) const
 {
   return N;
 }
 template <int N>
-void 
+void
 HistoryHeader<N>::Serialize (Buffer::Iterator start) const
 {
   start.WriteU8 (N, N);
@@ -200,7 +200,7 @@
   bool m_ok; //!< True if no error is signalled.
 };
 
-TypeId 
+TypeId
 HistoryTrailerBase::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::HistoryTrailerBase")
@@ -261,7 +261,7 @@
 {
   std::ostringstream oss;
   oss << "ns3::HistoryTrailer<"<<N<<">";
-  static TypeId tid = TypeId (oss.str ().c_str ())
+  static TypeId tid = TypeId (oss.str ())
     .SetParent<HistoryTrailerBase> ()
     .AddConstructor<HistoryTrailer<N> > ()
   ;
@@ -269,25 +269,25 @@
 }
 
 template <int N>
-TypeId 
+TypeId
 HistoryTrailer<N>::GetInstanceTypeId (void) const
 {
   return GetTypeId ();
 }
 template <int N>
-void 
+void
 HistoryTrailer<N>::Print (std::ostream &os) const
 {
   NS_ASSERT (false);
 }
 template <int N>
-uint32_t 
+uint32_t
 HistoryTrailer<N>::GetSerializedSize (void) const
 {
   return N;
 }
 template <int N>
-void 
+void
 HistoryTrailer<N>::Serialize (Buffer::Iterator start) const
 {
   start.Prev (N);
@@ -323,12 +323,10 @@
   /**
    * Checks the packet header and trailer history
    * \param p The packet
-   * \param file The file name
-   * \param line The line number
    * \param n The number of variable arguments
    * \param ... The variable arguments
    */
-  void CheckHistory (Ptr<Packet> p, const char *file, int line, uint32_t n, ...);
+  void CheckHistory (Ptr<Packet> p, uint32_t n, ...);
   virtual void DoRun (void);
 private:
   /**
@@ -349,7 +347,7 @@
 }
 
 void
-PacketMetadataTest::CheckHistory (Ptr<Packet> p, const char *file, int line, uint32_t n, ...)
+PacketMetadataTest::CheckHistory (Ptr<Packet> p, uint32_t n, ...)
 {
   std::list<int> expected;
   va_list ap;
@@ -420,7 +418,7 @@
 error:
   std::ostringstream failure;
   failure << "PacketMetadata error. Got:\"";
-  for (std::list<int>::iterator i = got.begin (); 
+  for (std::list<int>::iterator i = got.begin ();
        i != got.end (); i++)
     {
       failure << *i << ", ";
@@ -432,7 +430,7 @@
       failure << *j << ", ";
     }
   failure << "\"";
-  NS_TEST_ASSERT_MSG_EQ_INTERNAL (false, true, failure.str (), file, line);
+  NS_TEST_ASSERT_MSG_EQ (false, true, failure.str ());
 }
 
 #define ADD_HEADER(p, n)                                           \
@@ -457,13 +455,13 @@
   }
 #define CHECK_HISTORY(p, ...)                                      \
   {                                                                \
-    CheckHistory (p, __FILE__, __LINE__, __VA_ARGS__);             \
+    CheckHistory (p, __VA_ARGS__);                                 \
     uint32_t size = p->GetSerializedSize ();                       \
     uint8_t* buffer = new uint8_t[size];                           \
     p->Serialize (buffer, size);                                   \
     Ptr<Packet> otherPacket = Create<Packet> (buffer, size, true); \
     delete [] buffer;                                              \
-    CheckHistory (otherPacket, __FILE__, __LINE__, __VA_ARGS__);   \
+    CheckHistory (otherPacket, __VA_ARGS__);                       \
   }
 
 
@@ -491,13 +489,13 @@
   ADD_HEADER (p, 1);
   ADD_HEADER (p, 2);
   ADD_HEADER (p, 3);
-  CHECK_HISTORY (p, 4, 
+  CHECK_HISTORY (p, 4,
                  3, 2, 1, 10);
   ADD_HEADER (p, 5);
-  CHECK_HISTORY (p, 5, 
+  CHECK_HISTORY (p, 5,
                  5, 3, 2, 1, 10);
   ADD_HEADER (p, 6);
-  CHECK_HISTORY (p, 6, 
+  CHECK_HISTORY (p, 6,
                  6, 5, 3, 2, 1, 10);
 
   p = Create<Packet> (10);
@@ -505,7 +503,7 @@
   ADD_HEADER (p, 2);
   ADD_HEADER (p, 3);
   REM_HEADER (p, 3);
-  CHECK_HISTORY (p, 3, 
+  CHECK_HISTORY (p, 3,
                  2, 1, 10);
 
   p = Create<Packet> (10);
@@ -514,7 +512,7 @@
   ADD_HEADER (p, 3);
   REM_HEADER (p, 3);
   REM_HEADER (p, 2);
-  CHECK_HISTORY (p, 2, 
+  CHECK_HISTORY (p, 2,
                  1, 10);
 
   p = Create<Packet> (10);
@@ -535,46 +533,46 @@
   REM_HEADER (p1, 2);
   REM_HEADER (p1, 1);
   CHECK_HISTORY (p1, 1, 10);
-  CHECK_HISTORY (p, 4, 
+  CHECK_HISTORY (p, 4,
                  3, 2, 1, 10);
   ADD_HEADER (p1, 1);
   ADD_HEADER (p1, 2);
-  CHECK_HISTORY (p1, 3, 
+  CHECK_HISTORY (p1, 3,
                  2, 1, 10);
-  CHECK_HISTORY (p, 4, 
+  CHECK_HISTORY (p, 4,
                  3, 2, 1, 10);
   ADD_HEADER (p, 3);
-  CHECK_HISTORY (p, 5, 
+  CHECK_HISTORY (p, 5,
                  3, 3, 2, 1, 10);
   ADD_TRAILER (p, 4);
-  CHECK_HISTORY (p, 6, 
+  CHECK_HISTORY (p, 6,
                  3, 3, 2, 1, 10, 4);
   ADD_TRAILER (p, 5);
-  CHECK_HISTORY (p, 7, 
+  CHECK_HISTORY (p, 7,
                  3, 3, 2, 1, 10, 4, 5);
   REM_HEADER (p, 3);
-  CHECK_HISTORY (p, 6, 
+  CHECK_HISTORY (p, 6,
                  3, 2, 1, 10, 4, 5);
   REM_TRAILER (p, 5);
-  CHECK_HISTORY (p, 5, 
+  CHECK_HISTORY (p, 5,
                  3, 2, 1, 10, 4);
   p1 = p->Copy ();
   REM_TRAILER (p, 4);
-  CHECK_HISTORY (p, 4, 
+  CHECK_HISTORY (p, 4,
                  3, 2, 1, 10);
-  CHECK_HISTORY (p1, 5, 
+  CHECK_HISTORY (p1, 5,
                  3, 2, 1, 10, 4);
   p1->RemoveAtStart (3);
-  CHECK_HISTORY (p1, 4, 
+  CHECK_HISTORY (p1, 4,
                  2, 1, 10, 4);
   p1->RemoveAtStart (1);
-  CHECK_HISTORY (p1, 4, 
+  CHECK_HISTORY (p1, 4,
                  1, 1, 10, 4);
   p1->RemoveAtStart (1);
-  CHECK_HISTORY (p1, 3, 
+  CHECK_HISTORY (p1, 3,
                  1, 10, 4);
   p1->RemoveAtEnd (4);
-  CHECK_HISTORY (p1, 2, 
+  CHECK_HISTORY (p1, 2,
                  1, 10);
   p1->RemoveAtStart (1);
   CHECK_HISTORY (p1, 1, 10);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/network/test/packet-test-suite.cc ns-3.36/src/network/test/packet-test-suite.cc
--- ns-3.35/src/network/test/packet-test-suite.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/network/test/packet-test-suite.cc	2022-04-30 18:23:58.110734700 -0700
@@ -20,7 +20,6 @@
 #include "ns3/packet.h"
 #include "ns3/packet-tag-list.h"
 #include "ns3/test.h"
-#include "ns3/unused.h"
 #include <limits>     // std:numeric_limits
 #include <string>
 #include <cstdarg>
@@ -93,7 +92,7 @@
   static TypeId GetTypeId (void) {
     std::ostringstream oss;
     oss << "anon::ATestTag<" << N << ">";
-    static TypeId tid = TypeId (oss.str ().c_str ())
+    static TypeId tid = TypeId (oss.str ())
       .SetParent<ATestTagBase> ()
       .SetGroupName ("Network")
       .HideFromDocumentation ()
@@ -251,7 +250,7 @@
   static TypeId GetTypeId (void) {
     std::ostringstream oss;
     oss << "anon::ATestHeader<" << N << ">";
-    static TypeId tid = TypeId (oss.str ().c_str ())
+    static TypeId tid = TypeId (oss.str ())
       .SetParent<ATestHeaderBase> ()
       .SetGroupName ("Network")
       .HideFromDocumentation ()
@@ -337,7 +336,7 @@
   static TypeId GetTypeId (void) {
     std::ostringstream oss;
     oss << "anon::ATestTrailer<" << N << ">";
-    static TypeId tid = TypeId (oss.str ().c_str ())
+    static TypeId tid = TypeId (oss.str ())
       .SetParent<ATestTrailerBase> ()
       .SetGroupName ("Network")
       .HideFromDocumentation ()
@@ -422,11 +421,11 @@
 
 // Check byte tags on a packet, checks name, start, end
 #define CHECK(p, n, ...)                                \
-  DoCheck (p, __FILE__, __LINE__, n, __VA_ARGS__)
+  DoCheck (p, n, __VA_ARGS__)
 
 // Check byte tags on a packet, checks name, start, end, data
 #define CHECK_DATA(p, n, ...)                           \
-  DoCheckData (p, __FILE__, __LINE__, n, __VA_ARGS__)
+  DoCheckData (p, n, __VA_ARGS__)
 
 /**
  * \ingroup network-test
@@ -443,21 +442,17 @@
   /**
    * Checks the packet
    * \param p The packet
-   * \param file The file name
-   * \param line The line number
    * \param n The number of variable arguments
    * \param ... The variable arguments
    */
-  void DoCheck (Ptr<const Packet> p, const char *file, int line, uint32_t n, ...);
+  void DoCheck (Ptr<const Packet> p, uint32_t n, ...);
   /**
    * Checks the packet and its data
    * \param p The packet
-   * \param file The file name
-   * \param line The line number
    * \param n The number of variable arguments
    * \param ... The variable arguments
    */
-  void DoCheckData (Ptr<const Packet> p, const char *file, int line, uint32_t n, ...);
+  void DoCheckData (Ptr<const Packet> p, uint32_t n, ...);
 };
 
 
@@ -466,7 +461,7 @@
 }
 
 void
-PacketTest::DoCheck (Ptr<const Packet> p, const char *file, int line, uint32_t n, ...)
+PacketTest::DoCheck (Ptr<const Packet> p, uint32_t n, ...)
 {
   std::vector<struct Expected> expected;
   va_list ap;
@@ -488,9 +483,9 @@
       struct Expected e = expected[j];
       std::ostringstream oss;
       oss << "anon::ATestTag<" << e.n << ">";
-      NS_TEST_EXPECT_MSG_EQ_INTERNAL (item.GetTypeId ().GetName (), oss.str (), "trivial", file, line);
-      NS_TEST_EXPECT_MSG_EQ_INTERNAL (item.GetStart (), e.start, "trivial", file, line);
-      NS_TEST_EXPECT_MSG_EQ_INTERNAL (item.GetEnd (), e.end, "trivial", file, line);
+      NS_TEST_EXPECT_MSG_EQ (item.GetTypeId ().GetName (), oss.str (), "trivial");
+      NS_TEST_EXPECT_MSG_EQ (item.GetStart (), e.start, "trivial");
+      NS_TEST_EXPECT_MSG_EQ (item.GetEnd (), e.end, "trivial");
       ATestTagBase *tag = dynamic_cast<ATestTagBase *> (item.GetTypeId ().GetConstructor () ());
       NS_TEST_EXPECT_MSG_NE (tag, 0, "trivial");
       item.GetTag (*tag);
@@ -503,7 +498,7 @@
 }
 
 void
-PacketTest::DoCheckData (Ptr<const Packet> p, const char *file, int line, uint32_t n, ...)
+PacketTest::DoCheckData (Ptr<const Packet> p, uint32_t n, ...)
 {
   std::vector<struct Expected> expected;
   va_list ap;
@@ -526,9 +521,9 @@
       struct Expected e = expected[j];
       std::ostringstream oss;
       oss << "anon::ATestTag<" << e.n << ">";
-      NS_TEST_EXPECT_MSG_EQ_INTERNAL (item.GetTypeId ().GetName (), oss.str (), "trivial", file, line);
-      NS_TEST_EXPECT_MSG_EQ_INTERNAL (item.GetStart (), e.start, "trivial", file, line);
-      NS_TEST_EXPECT_MSG_EQ_INTERNAL (item.GetEnd (), e.end, "trivial", file, line);
+      NS_TEST_EXPECT_MSG_EQ (item.GetTypeId ().GetName (), oss.str (), "trivial");
+      NS_TEST_EXPECT_MSG_EQ (item.GetStart (), e.start, "trivial");
+      NS_TEST_EXPECT_MSG_EQ (item.GetEnd (), e.end, "trivial");
       ATestTagBase *tag = dynamic_cast<ATestTagBase *> (item.GetTypeId ().GetConstructor () ());
       NS_TEST_EXPECT_MSG_NE (tag, 0, "trivial");
       item.GetTag (*tag);
@@ -601,7 +596,7 @@
 
   CHECK (frag0, 3, E (1, 0, 10), E (2, 0, 10), E (3, 0, 10));
   frag0->AddAtEnd (frag1);
-  CHECK (frag0, 9, 
+  CHECK (frag0, 9,
          E (1, 0, 10), E (2, 0, 10), E (3, 0, 10),
          E (1, 10, 100), E (2, 10, 100), E (4, 10, 100),
          E (1, 100, 1000), E (2, 100, 1000), E (5, 100, 1000));
@@ -724,7 +719,7 @@
     p1->Serialize (buffer, serializedSize);
 
     Ptr<Packet> p2 = Create<Packet> (buffer, serializedSize, true);
-    
+
     delete [] buffer;
 
     ATestTag<10> a2;
@@ -758,9 +753,9 @@
     p1->Serialize (buffer, serializedSize);
 
     Ptr<Packet> p2 = Create<Packet> (buffer, serializedSize, true);
-    
+
     delete [] buffer;
-    
+
     CHECK_DATA (p2, 3, E_DATA (10, 0, 1000, 65), E_DATA (11, 0, 1000, 66), E_DATA (12, 0, 1000, 67));
   }
 
@@ -858,7 +853,7 @@
   {
     Ptr<Packet> tmp = Create<Packet> (0);
     ALargeTestTag a;
-    tmp->AddPacketTag (a); 
+    tmp->AddPacketTag (a);
   }
 }
 
@@ -951,11 +946,8 @@
   ATestTag<5> t5 (1); \
   ATestTag<6> t6 (1); \
   ATestTag<7> t7 (1); \
-  const int tagLast = 7;  /* length of ref PacketTagList */ \
-  NS_UNUSED (tagLast) /* silence warnings */
- 
-  
-  
+  [[maybe_unused]] const int tagLast = 7;  /* length of ref PacketTagList */
+
 void
 PacketTagListTest::CheckRefList (const PacketTagList & ptl,
                                  const char * msg,
@@ -970,7 +962,7 @@
   CheckRef (ptl, t6, msg, miss == 6);
   CheckRef (ptl, t7, msg, miss == 7);
 }
-  
+
 int
 PacketTagListTest::RemoveTime (const PacketTagList & ref,
                                ATestTagBase & t,
@@ -1021,7 +1013,7 @@
   std::cout << GetName () << "begin" << std::endl;
 
   MAKE_TEST_TAGS ;
-  
+
   PacketTagList ref;  // empty list
   ref.Add (t1);       // last
   ref.Add (t2);       // post merge
@@ -1030,7 +1022,7 @@
   ref.Add (t5);       // merge precursor
   ref.Add (t6);       // pre-merge
   ref.Add (t7);       // first
-  
+
   { // Peek
     std::cout << GetName () << "check Peek (missing tag) returns false"
               << std::endl;
@@ -1049,7 +1041,7 @@
       CheckRefList (ptl, "assignment copy");
     }
   }
-  
+
   { // Removal
 #   define RemoveCheck(n)                               \
     { PacketTagList p ## n = ref;			\
@@ -1057,7 +1049,7 @@
       CheckRefList (ref,     "remove " #n " orig");	\
       CheckRefList (p ## n, "remove " #n " copy", n);   \
     }
-    
+
     { // Remove single tags from list
       std::cout << GetName () << "check removal of each tag" << std::endl;
       RemoveCheck (1);
@@ -1068,7 +1060,7 @@
       RemoveCheck (6);
       RemoveCheck (7);
     }
-    
+
     { // Remove in the presence of a merge
       std::cout << GetName () << "check removal doesn't disturb merge "
                 << std::endl;
@@ -1076,7 +1068,7 @@
       ptl.Remove (t7);
       ptl.Remove (t6);
       ptl.Remove (t5);
-      
+
       PacketTagList mrg = ptl;  // merged list
       ATestTag<8> m5 (1);
       mrg.Add (m5);             // ptl and mrg differ
@@ -1099,7 +1091,7 @@
   { // Replace
 
     std::cout << GetName () << "check replacing each tag" << std::endl;
-      
+
 #   define ReplaceCheck(n)					\
     t ## n .m_data = 2;						\
     { PacketTagList p ## n = ref;				\
@@ -1107,7 +1099,7 @@
       CheckRefList (ref,     "replace " #n " orig");		\
       CheckRef     (p ## n, t ## n, "replace " #n " copy");	\
     }
-    
+
     ReplaceCheck (1);
     ReplaceCheck (2);
     ReplaceCheck (3);
@@ -1116,7 +1108,7 @@
     ReplaceCheck (6);
     ReplaceCheck (7);
   }
-  
+
   { // Timing
     std::cout << GetName () << "add+remove timing" << std::endl;
     int flm = std::numeric_limits<int>::max ();
@@ -1128,7 +1120,7 @@
     std::cout << GetName () << "min add+remove time: "
               << std::setw (8) << flm        << " ticks"
               << std::endl;
-    
+
     std::cout << GetName () << "remove timing" << std::endl;
     // tags numbered from 1, so add one for (unused) entry at 0
     std::vector <int> rmn (tagLast + 1, std::numeric_limits<int>::max ());
@@ -1144,7 +1136,7 @@
         case 2:  now = RemoveTime (ref, t2);  break;
         case 1:  now = RemoveTime (ref, t1);  break;
 	}  // switch
-	
+
 	if (now < rmn[j]) rmn[j] = now;
       } // for tag j
     } // for iteration i
@@ -1155,7 +1147,7 @@
                 << std::endl;
     }
   }  // Timing
-    
+
 }
 
 /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/network/utils/bit-deserializer.h ns-3.36/src/network/utils/bit-deserializer.h
--- ns-3.35/src/network/utils/bit-deserializer.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/network/utils/bit-deserializer.h	2022-04-30 18:23:58.110734700 -0700
@@ -71,6 +71,7 @@
    * The maximum number of bits to be deserialized in one single call is 64.
    *
    * \param size The number of bits to pop.
+   * \return The popped bits value
    */
   uint64_t GetBits (uint8_t size);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/network/utils/drop-tail-queue.h ns-3.36/src/network/utils/drop-tail-queue.h
--- ns-3.35/src/network/utils/drop-tail-queue.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/network/utils/drop-tail-queue.h	2022-04-30 18:23:58.110734700 -0700
@@ -71,7 +71,7 @@
 TypeId
 DropTailQueue<Item>::GetTypeId (void)
 {
-  static TypeId tid = TypeId (("ns3::DropTailQueue<" + GetTypeParamName<DropTailQueue<Item> > () + ">").c_str ())
+  static TypeId tid = TypeId ("ns3::DropTailQueue<" + GetTypeParamName<DropTailQueue<Item> > () + ">")
     .SetParent<Queue<Item> > ()
     .SetGroupName ("Network")
     .template AddConstructor<DropTailQueue<Item> > ()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/network/utils/net-device-queue-interface.h ns-3.36/src/network/utils/net-device-queue-interface.h
--- ns-3.35/src/network/utils/net-device-queue-interface.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/network/utils/net-device-queue-interface.h	2022-04-30 18:23:58.110734700 -0700
@@ -347,12 +347,10 @@
   NotifyQueuedBytes (item->GetSize ());
 
   NS_ASSERT_MSG (m_device, "Aggregated NetDevice not set");
-  Ptr<Packet> p = Create<Packet> (m_device->GetMtu ());
-
   // After enqueuing a packet, we need to check whether the queue is able to
   // store another packet. If not, we stop the queue
 
-  if (queue->GetCurrentSize () + p > queue->GetMaxSize ())
+  if (queue->WouldOverflow (1, m_device->GetMtu ()))
     {
       NS_LOG_DEBUG ("The device queue is being stopped (" << queue->GetCurrentSize ()
                     << " inside)");
@@ -370,13 +368,11 @@
   NotifyTransmittedBytes (item->GetSize ());
 
   NS_ASSERT_MSG (m_device, "Aggregated NetDevice not set");
-  Ptr<Packet> p = Create<Packet> (m_device->GetMtu ());
-
   // After dequeuing a packet, if there is room for another packet we
   // call Wake () that ensures that the queue is not stopped and restarts
   // the queue disc if the queue was stopped
 
-  if (queue->GetCurrentSize () + p <= queue->GetMaxSize ())
+  if (!queue->WouldOverflow (1, m_device->GetMtu ()))
     {
       Wake ();
     }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/network/utils/packet-socket-address.cc ns-3.36/src/network/utils/packet-socket-address.cc
--- ns-3.35/src/network/utils/packet-socket-address.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/network/utils/packet-socket-address.cc	2022-04-30 18:23:58.114734600 -0700
@@ -42,21 +42,21 @@
   m_isSingleDevice = false;
   m_device = 0;
 }
-void 
+void
 PacketSocketAddress::SetSingleDevice (uint32_t index)
 {
   NS_LOG_FUNCTION (this << index);
   m_isSingleDevice = true;
   m_device = index;
 }
-void 
+void
 PacketSocketAddress::SetPhysicalAddress (const Address address)
 {
   NS_LOG_FUNCTION (this << address);
   m_address = address;
 }
 
-uint16_t 
+uint16_t
 PacketSocketAddress::GetProtocol (void) const
 {
   NS_LOG_FUNCTION (this);
@@ -74,7 +74,7 @@
   NS_LOG_FUNCTION (this);
   return m_device;
 }
-Address 
+Address
 PacketSocketAddress::GetPhysicalAddress (void) const
 {
   NS_LOG_FUNCTION (this);
@@ -86,7 +86,7 @@
   return ConvertTo ();
 }
 
-Address 
+Address
 PacketSocketAddress::ConvertTo (void) const
 {
   NS_LOG_FUNCTION (this);
@@ -102,7 +102,7 @@
   uint32_t copied = m_address.CopyAllTo (buffer + 7, Address::MAX_SIZE - 7);
   return Address (GetType (), buffer, 7 + copied);
 }
-PacketSocketAddress 
+PacketSocketAddress
 PacketSocketAddress::ConvertFrom (const Address &address)
 {
   NS_LOG_FUNCTION (address);
@@ -118,7 +118,7 @@
   device |= buffer[4];
   device <<= 8;
   device |= buffer[5];
-  bool isSingleDevice = (buffer[6] == 1) ? true : false;
+  bool isSingleDevice = (buffer[6] == 1);
   Address physical;
   physical.CopyAllFrom (buffer + 7, Address::MAX_SIZE - 7);
   PacketSocketAddress ad;
@@ -134,13 +134,13 @@
   ad.SetPhysicalAddress (physical);
   return ad;
 }
-bool 
+bool
 PacketSocketAddress::IsMatchingType (const Address &address)
 {
   NS_LOG_FUNCTION (address);
   return address.IsMatchingType (GetType ());
 }
-uint8_t 
+uint8_t
 PacketSocketAddress::GetType (void)
 {
   NS_LOG_FUNCTION_NOARGS ();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/network/utils/pcap-file.cc ns-3.36/src/network/utils/pcap-file.cc
--- ns-3.35/src/network/utils/pcap-file.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/network/utils/pcap-file.cc	2022-04-30 18:23:58.114734600 -0700
@@ -14,7 +14,7 @@
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- * 
+ *
  * Author:  Craig Dowell (craigdo@ee.washington.edu)
  */
 
@@ -30,7 +30,7 @@
 #include "ns3/log.h"
 #include "ns3/build-profile.h"
 //
-// This file is used as part of the ns-3 test framework, so please refrain from 
+// This file is used as part of the ns-3 test framework, so please refrain from
 // adding any ns-3 specific constructs such as Packet to this file.
 //
 
@@ -53,7 +53,7 @@
     m_nanosecMode (false)
 {
   NS_LOG_FUNCTION (this);
-  FatalImpl::RegisterStream (&m_file); 
+  FatalImpl::RegisterStream (&m_file);
 }
 
 PcapFile::~PcapFile ()
@@ -64,19 +64,19 @@
 }
 
 
-bool 
+bool
 PcapFile::Fail (void) const
 {
   NS_LOG_FUNCTION (this);
   return m_file.fail ();
 }
-bool 
+bool
 PcapFile::Eof (void) const
 {
   NS_LOG_FUNCTION (this);
   return m_file.eof ();
 }
-void 
+void
 PcapFile::Clear (void)
 {
   NS_LOG_FUNCTION (this);
@@ -168,7 +168,7 @@
   return ((val >> 8) & 0x00ff) | ((val << 8) & 0xff00);
 }
 
-uint32_t 
+uint32_t
 PcapFile::Swap (uint32_t val)
 {
   NS_LOG_FUNCTION (this << val);
@@ -207,7 +207,7 @@
   // at the start of the file.
   //
   m_file.seekp (0, std::ios::beg);
- 
+
   //
   // We have the ability to write out the pcap file header in a foreign endian
   // format, so we need a temp place to swap on the way out.
@@ -274,7 +274,7 @@
   // swapped versions of the standard magic number, and normal and byte swapped
   // versions of the magic number indicating nanosecond resolution timestamps.
   //
-  if (m_fileHeader.m_magicNumber != MAGIC && m_fileHeader.m_magicNumber != SWAPPED_MAGIC && 
+  if (m_fileHeader.m_magicNumber != MAGIC && m_fileHeader.m_magicNumber != SWAPPED_MAGIC &&
       m_fileHeader.m_magicNumber != NS_MAGIC && m_fileHeader.m_magicNumber != NS_SWAPPED_MAGIC)
     {
       m_file.setstate (std::ios::failbit);
@@ -284,8 +284,8 @@
   // If the magic number is swapped, then we can assume that everything else we read
   // is swapped.
   //
-  m_swapMode = (m_fileHeader.m_magicNumber == SWAPPED_MAGIC 
-                || m_fileHeader.m_magicNumber == NS_SWAPPED_MAGIC) ? true : false;
+  m_swapMode = (m_fileHeader.m_magicNumber == SWAPPED_MAGIC
+                || m_fileHeader.m_magicNumber == NS_SWAPPED_MAGIC);
 
   if (m_swapMode)
     {
@@ -296,7 +296,7 @@
   // Timestamps can either be microsecond or nanosecond
   //
   m_nanosecMode = ((m_fileHeader.m_magicNumber == NS_MAGIC) ||
-                   (m_fileHeader.m_magicNumber == NS_SWAPPED_MAGIC)) ? true : false;
+                   (m_fileHeader.m_magicNumber == NS_SWAPPED_MAGIC));
 
   //
   // We only deal with one version of the pcap file format.
@@ -307,7 +307,7 @@
     }
 
   //
-  // A quick test of reasonablness for the time zone offset corresponding to 
+  // A quick test of reasonablness for the time zone offset corresponding to
   // a real place on the planet.
   //
   if (m_fileHeader.m_zone < -12 || m_fileHeader.m_zone > 12)
@@ -439,7 +439,7 @@
   NS_BUILD_DEBUG(m_file.flush());
 }
 
-void 
+void
 PcapFile::Write (uint32_t tsSec, uint32_t tsUsec, Ptr<const Packet> p)
 {
   NS_LOG_FUNCTION (this << tsSec << tsUsec << p);
@@ -448,7 +448,7 @@
   NS_BUILD_DEBUG(m_file.flush());
 }
 
-void 
+void
 PcapFile::Write (uint32_t tsSec, uint32_t tsUsec, const Header &header, Ptr<const Packet> p)
 {
   NS_LOG_FUNCTION (this << tsSec << tsUsec << &header << p);
@@ -467,11 +467,11 @@
 
 void
 PcapFile::Read (
-  uint8_t * const data, 
+  uint8_t * const data,
   uint32_t maxBytes,
-  uint32_t &tsSec, 
-  uint32_t &tsUsec, 
-  uint32_t &inclLen, 
+  uint32_t &tsSec,
+  uint32_t &tsUsec,
+  uint32_t &inclLen,
   uint32_t &origLen,
   uint32_t &readLen)
 {
@@ -505,7 +505,7 @@
   origLen = header.m_origLen;
 
   //
-  // We don't always want to force the client to keep a maximum length buffer 
+  // We don't always want to force the client to keep a maximum length buffer
   // around so we allow her to specify a minimum number of bytes to read.
   // Usually 64 bytes is enough information to print all of the headers, so
   // it isn't typically necessary to read all thousand bytes of an echo packet,
@@ -525,7 +525,7 @@
 }
 
 bool
-PcapFile::Diff (std::string const & f1, std::string const & f2, 
+PcapFile::Diff (std::string const & f1, std::string const & f2,
                 uint32_t & sec, uint32_t & usec, uint32_t & packets,
                 uint32_t snapLen)
 {
@@ -570,7 +570,7 @@
         }
 
       ++packets;
-      
+
       if (tsSec1 != tsSec2 || tsUsec1 != tsUsec2)
         {
           diff = true; // Next packet timestamps do not match
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/network/utils/queue.cc ns-3.36/src/network/utils/queue.cc
--- ns-3.35/src/network/utils/queue.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/network/utils/queue.cc	2022-04-30 18:23:58.114734600 -0700
@@ -220,4 +220,17 @@
   return m_maxSize;
 }
 
+bool
+QueueBase::WouldOverflow (uint32_t nPackets, uint32_t nBytes) const
+{
+  if (m_maxSize.GetUnit () == QueueSizeUnit::PACKETS)
+    {
+      return (m_nPackets + nPackets > m_maxSize.GetValue ());
+    }
+  else
+    {
+      return (m_nBytes + nBytes > m_maxSize.GetValue ());
+    }
+}
+
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/network/utils/queue.h ns-3.36/src/network/utils/queue.h
--- ns-3.35/src/network/utils/queue.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/network/utils/queue.h	2022-04-30 18:23:58.114734600 -0700
@@ -27,7 +27,6 @@
 #include "ns3/object.h"
 #include "ns3/traced-callback.h"
 #include "ns3/traced-value.h"
-#include "ns3/unused.h"
 #include "ns3/log.h"
 #include "ns3/queue-size.h"
 #include "ns3/queue-item.h"
@@ -179,6 +178,15 @@
    */
   QueueSize GetMaxSize (void) const;
 
+  /**
+   * \brief Check if the queue would overflow with additional bytes or packets
+   * Note: the check is performed according to the queue's operating mode (bytes or packets).
+   * \param nPackets number of additional packets
+   * \param nBytes number of additional bytes
+   * \return true if the queue should overflow, false otherwise.
+   */
+  bool WouldOverflow (uint32_t nPackets, uint32_t nBytes) const;
+
 #if 0
   // average calculation requires keeping around
   // a buffer with the date of arrival of past received packets
@@ -457,7 +465,7 @@
 Queue<Item>::GetTypeId (void)
 {
   std::string name = GetTypeParamName<Queue<Item> > ();
-  static TypeId tid = TypeId (("ns3::Queue<" + name + ">").c_str ())
+  static TypeId tid = TypeId ("ns3::Queue<" + name + ">")
     .SetParent<QueueBase> ()
     .SetGroupName ("Network")
     .AddTraceSource ("Enqueue", "Enqueue a packet in the queue.",
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/network/utils/queue-item.cc ns-3.36/src/network/utils/queue-item.cc
--- ns-3.35/src/network/utils/queue-item.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/network/utils/queue-item.cc	2022-04-30 18:23:58.114734600 -0700
@@ -134,8 +134,8 @@
 {
   os << GetPacket () << " "
      << "Dst addr " << m_address << " "
-     << "proto " << (uint16_t) m_protocol << " "
-     << "txq " << (uint8_t) m_txq
+     << "proto " << m_protocol << " "
+     << "txq " << +m_txq
   ;
 }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/network/utils/queue-item.h ns-3.36/src/network/utils/queue-item.h
--- ns-3.35/src/network/utils/queue-item.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/network/utils/queue-item.h	2022-04-30 18:23:58.114734600 -0700
@@ -54,6 +54,11 @@
 
   virtual ~QueueItem ();
 
+  // Delete default constructor, copy constructor and assignment operator to avoid misuse
+  QueueItem () = delete;
+  QueueItem (const QueueItem &) = delete;
+  QueueItem & operator = (const QueueItem &) = delete;
+
   /**
    * \return the packet included in this item.
    */
@@ -102,26 +107,6 @@
 
 private:
   /**
-   * \brief Default constructor
-   *
-   * Defined and unimplemented to avoid misuse
-   */
-  QueueItem ();
-  /**
-   * \brief Copy constructor
-   *
-   * Defined and unimplemented to avoid misuse
-   */
-  QueueItem (const QueueItem &);
-  /**
-   * \brief Assignment operator
-   *
-   * Defined and unimplemented to avoid misuse
-   * \returns
-   */
-  QueueItem &operator = (const QueueItem &);
-
-  /**
    * The packet contained in the queue item.
    */
   Ptr<Packet> m_packet;
@@ -157,6 +142,11 @@
 
   virtual ~QueueDiscItem ();
 
+  // Delete default constructor, copy constructor and assignment operator to avoid misuse
+  QueueDiscItem () = delete;
+  QueueDiscItem (const QueueDiscItem &) = delete;
+  QueueDiscItem & operator = (const QueueDiscItem &) = delete;
+
   /**
    * \brief Get the MAC address included in this item
    * \return the MAC address included in this item.
@@ -227,26 +217,6 @@
   virtual uint32_t Hash (uint32_t perturbation = 0) const;
 
 private:
-  /**
-   * \brief Default constructor
-   *
-   * Defined and unimplemented to avoid misuse
-   */
-  QueueDiscItem ();
-  /**
-   * \brief Copy constructor
-   *
-   * Defined and unimplemented to avoid misuse
-   */
-  QueueDiscItem (const QueueDiscItem &);
-  /**
-   * \brief Assignment operator
-   *
-   * Defined and unimplemented to avoid misuse
-   * \returns
-   */
-  QueueDiscItem &operator = (const QueueDiscItem &);
-
   Address m_address;      //!< MAC destination address
   uint16_t m_protocol;    //!< L3 Protocol number
   uint8_t m_txq;          //!< Transmission queue index
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/network/utils/queue-size.cc ns-3.36/src/network/utils/queue-size.cc
--- ns-3.35/src/network/utils/queue-size.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/network/utils/queue-size.cc	2022-04-30 18:23:58.114734600 -0700
@@ -20,7 +20,6 @@
 
 #include "queue-size.h"
 #include "ns3/log.h"
-#include "ns3/unused.h"
 
 namespace ns3 {
 
@@ -181,9 +180,8 @@
 QueueSize::QueueSize (std::string size)
 {
   NS_LOG_FUNCTION (this << size);
-  bool ok = DoParse (size, &m_unit, &m_value);
+  [[maybe_unused]] bool ok = DoParse (size, &m_unit, &m_value);
   NS_ABORT_MSG_IF (!ok, "Could not parse queue size: " << size);
-  NS_UNUSED (ok); // suppress compiler warning
 }
 
 /* For printing of queue size */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/network/wscript ns-3.36/src/network/wscript
--- ns-3.35/src/network/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/network/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,181 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    network = bld.create_ns3_module('network', ['core', 'stats'])
-    network.source = [
-        'model/address.cc',
-        'model/application.cc',
-        'model/buffer.cc',
-        'model/byte-tag-list.cc',
-        'model/channel.cc',
-        'model/channel-list.cc',
-        'model/chunk.cc',
-        'model/header.cc',
-        'model/nix-vector.cc',
-        'model/node.cc',
-        'model/node-list.cc',
-        'model/net-device.cc',
-        'model/packet.cc',
-        'model/packet-metadata.cc',
-        'model/packet-tag-list.cc',
-        'model/socket.cc',
-        'model/socket-factory.cc',
-        'model/tag.cc',
-        'model/tag-buffer.cc',
-        'model/trailer.cc',
-        'utils/address-utils.cc',
-        'utils/bit-deserializer.cc',
-        'utils/bit-serializer.cc',
-        'utils/crc32.cc',
-        'utils/data-rate.cc',
-        'utils/drop-tail-queue.cc',
-        'utils/dynamic-queue-limits.cc',
-        'utils/error-channel.cc',
-        'utils/error-model.cc',
-        'utils/ethernet-header.cc',
-        'utils/ethernet-trailer.cc',
-        'utils/flow-id-tag.cc',
-        'utils/inet-socket-address.cc',
-        'utils/inet6-socket-address.cc',
-        'utils/ipv4-address.cc',
-        'utils/ipv6-address.cc',
-        'utils/mac16-address.cc',
-        'utils/mac48-address.cc',
-        'utils/mac64-address.cc',
-        'utils/llc-snap-header.cc',
-        'utils/output-stream-wrapper.cc',
-        'utils/packetbb.cc',
-        'utils/packet-burst.cc',
-        'utils/packet-socket.cc',
-        'utils/packet-socket-address.cc',
-        'utils/packet-socket-factory.cc',
-        'utils/pcap-file.cc',
-        'utils/pcap-file-wrapper.cc',
-        'utils/queue.cc',
-        'utils/queue-item.cc',
-        'utils/queue-limits.cc',
-        'utils/queue-size.cc',
-        'utils/net-device-queue-interface.cc',
-        'utils/radiotap-header.cc',
-        'utils/simple-channel.cc',
-        'utils/simple-net-device.cc',
-        'utils/sll-header.cc',
-        'utils/packet-socket-client.cc',
-        'utils/packet-socket-server.cc',
-        'utils/packet-data-calculators.cc',
-        'utils/packet-probe.cc',
-        'utils/mac8-address.cc',
-        'helper/application-container.cc',
-        'helper/net-device-container.cc',
-        'helper/node-container.cc',
-        'helper/packet-socket-helper.cc',
-        'helper/trace-helper.cc',
-        'helper/delay-jitter-estimation.cc',
-        'helper/simple-net-device-helper.cc',
-        ]
-
-    network_test = bld.create_ns3_module_test_library('network')
-    network_test.source = [
-        'test/bit-serializer-test.cc',
-        'test/buffer-test.cc',
-        'test/drop-tail-queue-test-suite.cc',
-        'test/error-model-test-suite.cc',
-        'test/ipv6-address-test-suite.cc',
-        'test/packetbb-test-suite.cc',
-        'test/packet-test-suite.cc',
-        'test/packet-metadata-test.cc',
-        'test/pcap-file-test-suite.cc',
-        'test/sequence-number-test-suite.cc',
-        'test/packet-socket-apps-test-suite.cc',
-        'test/lollipop-counter-test.cc',
-        'test/test-data-rate.cc',
-        ]
-
-    # Tests encapsulating example programs should be listed here
-    if (bld.env['ENABLE_EXAMPLES']):
-        network_test.source.extend([
-        #   'test/network-examples-test-suite.cc',
-            ])
-
-    headers = bld(features='ns3header')
-    headers.module = 'network'
-    headers.source = [
-        'model/address.h',
-        'model/application.h',
-        'model/buffer.h',
-        'model/byte-tag-list.h',
-        'model/channel.h',
-        'model/channel-list.h',
-        'model/chunk.h',
-        'model/header.h',
-        'model/net-device.h',
-        'model/nix-vector.h',
-        'model/node.h',
-        'model/node-list.h',
-        'model/packet.h',
-        'model/packet-metadata.h',
-        'model/packet-tag-list.h',
-        'model/socket.h',
-        'model/socket-factory.h',
-        'model/tag.h',
-        'model/tag-buffer.h',
-        'model/trailer.h',
-        'utils/address-utils.h',
-        'utils/bit-deserializer.h',
-        'utils/bit-serializer.h',
-        'utils/crc32.h',
-        'utils/data-rate.h',
-        'utils/drop-tail-queue.h',
-        'utils/dynamic-queue-limits.h',
-        'utils/error-channel.h',
-        'utils/error-model.h',
-        'utils/ethernet-header.h',
-        'utils/ethernet-trailer.h',
-        'utils/flow-id-tag.h',
-        'utils/inet-socket-address.h',
-        'utils/inet6-socket-address.h',
-        'utils/ipv4-address.h',
-        'utils/ipv6-address.h',
-        'utils/llc-snap-header.h',
-        'utils/mac16-address.h',
-        'utils/mac48-address.h',
-        'utils/mac64-address.h',
-        'utils/output-stream-wrapper.h',
-        'utils/packetbb.h',
-        'utils/packet-burst.h',
-        'utils/packet-socket.h',
-        'utils/packet-socket-address.h',
-        'utils/packet-socket-factory.h',
-        'utils/pcap-file.h',
-        'utils/pcap-file-wrapper.h',
-        'utils/generic-phy.h',
-        'utils/queue.h',
-        'utils/queue-item.h',
-        'utils/queue-limits.h',
-        'utils/queue-size.h',
-        'utils/net-device-queue-interface.h',
-        'utils/radiotap-header.h',
-        'utils/sequence-number.h',
-        'utils/simple-channel.h',
-        'utils/simple-net-device.h',
-        'utils/sll-header.h',
-        'utils/packet-socket-client.h',
-        'utils/packet-socket-server.h',
-        'utils/pcap-test.h',
-        'utils/packet-data-calculators.h',
-        'utils/packet-probe.h',
-        'utils/mac8-address.h',
-        'utils/lollipop-counter.h',
-        'helper/application-container.h',
-        'helper/net-device-container.h',
-        'helper/node-container.h',
-        'helper/packet-socket-helper.h',
-        'helper/trace-helper.h',
-        'helper/delay-jitter-estimation.h',
-        'helper/simple-net-device-helper.h',
-        ]
-
-    if (bld.env['ENABLE_EXAMPLES']):
-        bld.recurse('examples')
-
-    bld.ns3_python_bindings()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/nix-vector-routing/bindings/modulegen__gcc_ILP32.py ns-3.36/src/nix-vector-routing/bindings/modulegen__gcc_ILP32.py
--- ns-3.35/src/nix-vector-routing/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/nix-vector-routing/bindings/modulegen__gcc_ILP32.py	2022-04-30 18:23:58.114734600 -0700
@@ -69,6 +69,8 @@
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::TraceSourceAccessor'])
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'], import_from_module='ns.core')
     ## hash.h (module 'core'): ns3::Hasher [class]
     module.add_class('Hasher', import_from_module='ns.core')
     ## inet6-socket-address.h (module 'network'): ns3::Inet6SocketAddress [class]
@@ -224,33 +226,33 @@
     module.add_class('Object', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter >'])
     ## object.h (module 'core'): ns3::Object::AggregateIterator [class]
     module.add_class('AggregateIterator', import_from_module='ns.core', outer_class=root_module['ns3::Object'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv4MulticastRoute', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv4Route', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv4Route>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv6MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6MulticastRoute> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv6MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6MulticastRoute>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv6MulticastRoute', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv6MulticastRoute>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv6Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6Route> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv6Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6Route>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv6Route', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv6Route>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::OutputStreamWrapper', 'ns3::empty', 'ns3::DefaultDeleter<ns3::OutputStreamWrapper>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
     ## socket.h (module 'network'): ns3::Socket [class]
     module.add_class('Socket', import_from_module='ns.network', parent=root_module['ns3::Object'])
@@ -485,7 +487,7 @@
     module.add_class('Ipv4ListRouting', import_from_module='ns.internet', parent=root_module['ns3::Ipv4RoutingProtocol'])
     ## ipv6-list-routing.h (module 'internet'): ns3::Ipv6ListRouting [class]
     module.add_class('Ipv6ListRouting', import_from_module='ns.internet', parent=root_module['ns3::Ipv6RoutingProtocol'])
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     module.add_container('std::vector< ns3::Ipv6Address >', 'ns3::Ipv6Address', container_type='vector')
     module.add_container('std::map< unsigned int, unsigned int >', ('unsigned int', 'unsigned int'), container_type='map')
     typehandlers.add_type_alias('ns3::NixVectorRouting< ns3::Ipv4RoutingProtocol >', 'ns3::Ipv4NixVectorRouting')
@@ -3300,8 +3302,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -3524,14 +3526,14 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('>=')
     cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_unary_numeric_operator('-')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
     cls.add_constructor([])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(double const value) [constructor]
@@ -3550,6 +3552,8 @@
     cls.add_constructor([param('long unsigned int const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int const v) [constructor]
     cls.add_constructor([param('long long unsigned int const', 'v')])
+    ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int128_t const v) [constructor]
+    cls.add_constructor([param('int128_t const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t const hi, uint64_t const lo) [constructor]
     cls.add_constructor([param('int64_t const', 'hi'), param('uint64_t const', 'lo')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [constructor]
@@ -4054,100 +4058,100 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Ipv4MulticastRoute_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv4MulticastRoute__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter< ns3::Ipv4MulticastRoute > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Ipv4Route_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv4Route__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter< ns3::Ipv4Route > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Ipv6MulticastRoute_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv6MulticastRoute__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv6MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6MulticastRoute> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv6MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6MulticastRoute>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv6MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6MulticastRoute> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv6MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6MulticastRoute> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv6MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6MulticastRoute>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv6MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6MulticastRoute>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Ipv6MulticastRoute, ns3::empty, ns3::DefaultDeleter< ns3::Ipv6MulticastRoute > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Ipv6Route_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv6Route__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv6Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6Route> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv6Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6Route>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv6Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6Route> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv6Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6Route> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv6Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6Route>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv6Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6Route>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Ipv6Route, ns3::empty, ns3::DefaultDeleter< ns3::Ipv6Route > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3OutputStreamWrapper_Ns3Empty_Ns3DefaultDeleter__lt__ns3OutputStreamWrapper__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter< ns3::OutputStreamWrapper > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
@@ -4270,7 +4274,7 @@
                    'uint8_t', 
                    [param('uint8_t', 'ipTos')], 
                    is_static=True)
-    ## socket.h (module 'network'): void ns3::Socket::Ipv6JoinGroup(ns3::Ipv6Address address, ns3::Socket::Ipv6MulticastFilterMode filterMode, std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address> > sourceAddresses) [member function]
+    ## socket.h (module 'network'): void ns3::Socket::Ipv6JoinGroup(ns3::Ipv6Address address, ns3::Socket::Ipv6MulticastFilterMode filterMode, std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address>> sourceAddresses) [member function]
     cls.add_method('Ipv6JoinGroup', 
                    'void', 
                    [param('ns3::Ipv6Address', 'address'), param('ns3::Socket::Ipv6MulticastFilterMode', 'filterMode'), param('std::vector< ns3::Ipv6Address >', 'sourceAddresses')], 
@@ -5857,7 +5861,7 @@
                    'ns3::Ipv4Address', 
                    [], 
                    is_const=True)
-    ## ipv4-route.h (module 'internet'): std::map<unsigned int, unsigned int, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, unsigned int> > > ns3::Ipv4MulticastRoute::GetOutputTtlMap() const [member function]
+    ## ipv4-route.h (module 'internet'): std::map<unsigned int, unsigned int, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, unsigned int>>> ns3::Ipv4MulticastRoute::GetOutputTtlMap() const [member function]
     cls.add_method('GetOutputTtlMap', 
                    'std::map< unsigned int, unsigned int >', 
                    [], 
@@ -6681,7 +6685,7 @@
                    'ns3::Ipv6Address', 
                    [], 
                    is_const=True)
-    ## ipv6-route.h (module 'internet'): std::map<unsigned int, unsigned int, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, unsigned int> > > ns3::Ipv6MulticastRoute::GetOutputTtlMap() const [member function]
+    ## ipv6-route.h (module 'internet'): std::map<unsigned int, unsigned int, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, unsigned int>>> ns3::Ipv6MulticastRoute::GetOutputTtlMap() const [member function]
     cls.add_method('GetOutputTtlMap', 
                    'std::map< unsigned int, unsigned int >', 
                    [], 
@@ -7093,10 +7097,16 @@
     cls.add_method('ExtractNeighborIndex', 
                    'uint32_t', 
                    [param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetEpoch() const [member function]
+    cls.add_method('GetEpoch', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() const [member function]
     cls.add_method('GetRemainingBits', 
                    'uint32_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -7107,6 +7117,10 @@
                    'uint32_t', 
                    [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
+    ## nix-vector.h (module 'network'): void ns3::NixVector::SetEpoch(uint32_t epoch) [member function]
+    cls.add_method('SetEpoch', 
+                   'void', 
+                   [param('uint32_t', 'epoch')])
     return
 
 def register_Ns3Node_methods(root_module, cls):
@@ -7438,10 +7452,11 @@
                    'uint32_t', 
                    [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) const [member function]
     cls.add_method('SetNixVector', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')], 
+                   is_const=True)
     ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
     cls.add_method('ToString', 
                    'std::string', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/nix-vector-routing/bindings/modulegen__gcc_LP64.py ns-3.36/src/nix-vector-routing/bindings/modulegen__gcc_LP64.py
--- ns-3.35/src/nix-vector-routing/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/nix-vector-routing/bindings/modulegen__gcc_LP64.py	2022-04-30 18:23:58.114734600 -0700
@@ -69,6 +69,8 @@
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::TraceSourceAccessor'])
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'], import_from_module='ns.core')
     ## hash.h (module 'core'): ns3::Hasher [class]
     module.add_class('Hasher', import_from_module='ns.core')
     ## inet6-socket-address.h (module 'network'): ns3::Inet6SocketAddress [class]
@@ -224,33 +226,33 @@
     module.add_class('Object', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter >'])
     ## object.h (module 'core'): ns3::Object::AggregateIterator [class]
     module.add_class('AggregateIterator', import_from_module='ns.core', outer_class=root_module['ns3::Object'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv4MulticastRoute', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv4Route', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv4Route>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv6MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6MulticastRoute> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv6MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6MulticastRoute>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv6MulticastRoute', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv6MulticastRoute>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv6Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6Route> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv6Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6Route>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv6Route', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv6Route>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::OutputStreamWrapper', 'ns3::empty', 'ns3::DefaultDeleter<ns3::OutputStreamWrapper>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
     ## socket.h (module 'network'): ns3::Socket [class]
     module.add_class('Socket', import_from_module='ns.network', parent=root_module['ns3::Object'])
@@ -485,7 +487,7 @@
     module.add_class('Ipv4ListRouting', import_from_module='ns.internet', parent=root_module['ns3::Ipv4RoutingProtocol'])
     ## ipv6-list-routing.h (module 'internet'): ns3::Ipv6ListRouting [class]
     module.add_class('Ipv6ListRouting', import_from_module='ns.internet', parent=root_module['ns3::Ipv6RoutingProtocol'])
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     module.add_container('std::vector< ns3::Ipv6Address >', 'ns3::Ipv6Address', container_type='vector')
     module.add_container('std::map< unsigned int, unsigned int >', ('unsigned int', 'unsigned int'), container_type='map')
     typehandlers.add_type_alias('ns3::NixVectorRouting< ns3::Ipv4RoutingProtocol >', 'ns3::Ipv4NixVectorRouting')
@@ -3300,8 +3302,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -3524,14 +3526,14 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('>=')
     cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_unary_numeric_operator('-')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
     cls.add_constructor([])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(double const value) [constructor]
@@ -3550,6 +3552,8 @@
     cls.add_constructor([param('long unsigned int const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int const v) [constructor]
     cls.add_constructor([param('long long unsigned int const', 'v')])
+    ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int128_t const v) [constructor]
+    cls.add_constructor([param('int128_t const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t const hi, uint64_t const lo) [constructor]
     cls.add_constructor([param('int64_t const', 'hi'), param('uint64_t const', 'lo')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [constructor]
@@ -4054,100 +4058,100 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Ipv4MulticastRoute_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv4MulticastRoute__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter< ns3::Ipv4MulticastRoute > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Ipv4Route_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv4Route__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter< ns3::Ipv4Route > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Ipv6MulticastRoute_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv6MulticastRoute__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv6MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6MulticastRoute> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv6MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6MulticastRoute>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv6MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6MulticastRoute> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv6MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6MulticastRoute> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv6MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6MulticastRoute>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv6MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6MulticastRoute>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Ipv6MulticastRoute, ns3::empty, ns3::DefaultDeleter< ns3::Ipv6MulticastRoute > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Ipv6Route_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv6Route__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv6Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6Route> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv6Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6Route>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv6Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6Route> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv6Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6Route> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv6Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6Route>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv6Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6Route>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Ipv6Route, ns3::empty, ns3::DefaultDeleter< ns3::Ipv6Route > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3OutputStreamWrapper_Ns3Empty_Ns3DefaultDeleter__lt__ns3OutputStreamWrapper__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter< ns3::OutputStreamWrapper > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
@@ -4270,7 +4274,7 @@
                    'uint8_t', 
                    [param('uint8_t', 'ipTos')], 
                    is_static=True)
-    ## socket.h (module 'network'): void ns3::Socket::Ipv6JoinGroup(ns3::Ipv6Address address, ns3::Socket::Ipv6MulticastFilterMode filterMode, std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address> > sourceAddresses) [member function]
+    ## socket.h (module 'network'): void ns3::Socket::Ipv6JoinGroup(ns3::Ipv6Address address, ns3::Socket::Ipv6MulticastFilterMode filterMode, std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address>> sourceAddresses) [member function]
     cls.add_method('Ipv6JoinGroup', 
                    'void', 
                    [param('ns3::Ipv6Address', 'address'), param('ns3::Socket::Ipv6MulticastFilterMode', 'filterMode'), param('std::vector< ns3::Ipv6Address >', 'sourceAddresses')], 
@@ -5857,7 +5861,7 @@
                    'ns3::Ipv4Address', 
                    [], 
                    is_const=True)
-    ## ipv4-route.h (module 'internet'): std::map<unsigned int, unsigned int, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, unsigned int> > > ns3::Ipv4MulticastRoute::GetOutputTtlMap() const [member function]
+    ## ipv4-route.h (module 'internet'): std::map<unsigned int, unsigned int, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, unsigned int>>> ns3::Ipv4MulticastRoute::GetOutputTtlMap() const [member function]
     cls.add_method('GetOutputTtlMap', 
                    'std::map< unsigned int, unsigned int >', 
                    [], 
@@ -6681,7 +6685,7 @@
                    'ns3::Ipv6Address', 
                    [], 
                    is_const=True)
-    ## ipv6-route.h (module 'internet'): std::map<unsigned int, unsigned int, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, unsigned int> > > ns3::Ipv6MulticastRoute::GetOutputTtlMap() const [member function]
+    ## ipv6-route.h (module 'internet'): std::map<unsigned int, unsigned int, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, unsigned int>>> ns3::Ipv6MulticastRoute::GetOutputTtlMap() const [member function]
     cls.add_method('GetOutputTtlMap', 
                    'std::map< unsigned int, unsigned int >', 
                    [], 
@@ -7093,10 +7097,16 @@
     cls.add_method('ExtractNeighborIndex', 
                    'uint32_t', 
                    [param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetEpoch() const [member function]
+    cls.add_method('GetEpoch', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() const [member function]
     cls.add_method('GetRemainingBits', 
                    'uint32_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -7107,6 +7117,10 @@
                    'uint32_t', 
                    [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
+    ## nix-vector.h (module 'network'): void ns3::NixVector::SetEpoch(uint32_t epoch) [member function]
+    cls.add_method('SetEpoch', 
+                   'void', 
+                   [param('uint32_t', 'epoch')])
     return
 
 def register_Ns3Node_methods(root_module, cls):
@@ -7438,10 +7452,11 @@
                    'uint32_t', 
                    [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) const [member function]
     cls.add_method('SetNixVector', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')], 
+                   is_const=True)
     ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
     cls.add_method('ToString', 
                    'std::string', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/nix-vector-routing/CMakeLists.txt ns-3.36/src/nix-vector-routing/CMakeLists.txt
--- ns-3.35/src/nix-vector-routing/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/nix-vector-routing/CMakeLists.txt	2022-04-30 18:23:58.114734600 -0700
@@ -0,0 +1,11 @@
+build_lib(
+  LIBNAME nix-vector-routing
+  SOURCE_FILES helper/nix-vector-helper.cc
+               model/nix-vector-routing.cc
+  HEADER_FILES helper/nix-vector-helper.h
+               model/nix-vector-routing.h
+  DEPRECATED_HEADER_FILES helper/ipv4-nix-vector-helper.h
+                          model/ipv4-nix-vector-routing.h
+  LIBRARIES_TO_LINK ${libinternet}
+  TEST_SOURCES test/nix-test.cc
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/nix-vector-routing/doc/nix-vector-routing.rst ns-3.36/src/nix-vector-routing/doc/nix-vector-routing.rst
--- ns-3.35/src/nix-vector-routing/doc/nix-vector-routing.rst	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/nix-vector-routing/doc/nix-vector-routing.rst	2022-04-30 18:23:58.114734600 -0700
@@ -53,6 +53,17 @@
 associated with current node's net-devices. Please check the ``nix-simple.cc``
 example below to understand how nix-vectors are calculated.
 
+**How does Nix reacts to topology changes?**
+Routes in Nix are specific to a given network topology, and are cached by
+the sender node. Nix monitors the following events: Interface up/down, 
+Route add/removal, Address add/removal to understand if the cached routes 
+are valid or if they have to be purged. 
+
+If the topology changes while the packet is "in flight", the associated 
+NixVector is invalid, and have to be rebuilt by an intermediate node.
+This is possible because the NixVecor carries an "Epoch", i.e., a counter
+indicating when the NixVector has been created. If the topology changes,
+the Epoch is globally updated, and any outdated NixVector is rebuilt.
 
 |ns3| supports IPv4 as well as IPv6 Nix-Vector routing.
 
@@ -74,6 +85,8 @@
 default over the entire topology. However, if the link-local addresses are
 assigned manually, the user must ensure uniqueness of link-local addresses.
 
+NixVectorRouting supports routes to IPv4 and IPv6 loopback addresses on localhost.
+Although it is not really intended to route to these addresses, it can do so.
 
 Usage
 *****
@@ -83,13 +96,15 @@
 Internet stack, it is necessary to set it in the Internet Stack 
 helper by using ``InternetStackHelper::SetRoutingHelper``.
 
-Remember to include the header file ``ns3/nix-vector-helper.h`` to
+Remember to include the header file ``ns3/nix-vector-routing-module.h`` to
 use IPv4 or IPv6 Nix-Vector routing.
 
 .. note::
-   The previous header file ``ns3/ipv4-nix-vector-helper.h`` is
-   maintained for backward compatibility reasons. Therefore, the
-   existing IPv4 Nix-Vector routing simulations should work fine.
+   The previous header files ``ns3/ipv4-nix-vector-helper.h`` and
+   ``ns3/ipv4-nix-vector-routing.h`` are deprecated and will be removed in
+   the future. These files are replaced with more generic (having IPv6
+   capabilities) ``ns3/nix-vector-helper.h`` and ``ns3/nix-vector-routing.h``
+   respectively.
 
 *  Using IPv4 Nix-Vector Routing:
 
@@ -111,10 +126,8 @@
 
 .. note::
    The NixVectorHelper helper class helps to use NixVectorRouting functionality.
-   The NixVectorRouting model can also be used directly to use Nix-Vector routing.
-   To use it directly, the header file ``ns3/nix-vector-routing.h`` should be
-   included. The previous header file ``ns3/ipv4-nix-vector-routing.h`` is maintained
-   for backwards compatibility with any existing IPv4 Nix-Vector routing simulations.
+   The NixVectorRouting model class can also be used directly to use Nix-Vector routing.
+   ``ns3/nix-vector-routing-module.h`` contains the header files for both the classes.
 
 Examples
 ========
@@ -124,110 +137,119 @@
 
 There are examples which use both IPv4 and IPv6 networking.
 
-*  nix-simple.cc
+1.  nix-simple.cc
 
-::
+   ::
 
-  /*
-   *    ________
-   *   /        \
-   * n0 -- n1 -- n2 -- n3
-   *
-   * n0 IP: 10.1.1.1, 10.1.4.1
-   * n1 IP: 10.1.1.2, 10.1.2.1
-   * n2 IP: 10.1.2.2, 10.1.3.1, 10.1.4.2
-   * n3 IP: 10.1.3.2
-   */
-
-In this topology, we install Nix-Vector routing between source
-n0 and destination n3. The shortest possible route will be
-n0 -> n2 -> n3.
-
-Let's see how the nix-vector will be generated for this path:
-
-n0 has 2 neighbors i.e. n1 and n3. n0 is connected to both using
-separate net-devices. But the net-device for n0 -- n1 p2p link was
-created before the netdevice for n0 -- n2 p2p link. Thus, n2 has
-neighbor-index of 1 (n1 has 0) with respect to n0.
-
-n2 has 3 neighbors i.e. n1, n3 and n0. The n2 net-device for n1 -- n2
-p2p link was created before the n2 net-device for n2 -- n3 p2p link
-which was before the n2 netdevice for n0 -- n2 p2p link. This, n3
-has neighbor-index of 01 (n1 has 00 and n0 has 10) with repect to n2.
+     /*
+      *    ________
+      *   /        \
+      * n0 -- n1 -- n2 -- n3
+      *
+      * n0 IP: 10.1.1.1, 10.1.4.1
+      * n1 IP: 10.1.1.2, 10.1.2.1
+      * n2 IP: 10.1.2.2, 10.1.3.1, 10.1.4.2
+      * n3 IP: 10.1.3.2
+      */
 
-Thus, the nix-vector for the path from n0 to n3 is 101.
+   In this topology, we install Nix-Vector routing between source
+   n0 and destination n3. The shortest possible route will be
+   n0 -> n2 -> n3.
 
-.. note::
-   This neighbor-index or nix-index has total number of bits equal to
-   minimum number of bits required to represent all the neighbors in
-   their binary form.
+   Let's see how the nix-vector will be generated for this path:
 
-.. note::
-   If there are multiple netdevices connected to the current netdevice
-   on the channel then it depends on which order netdevices were added
-   to the channel.
+   n0 has 2 neighbors i.e. n1 and n3. n0 is connected to both using
+   separate net-devices. But the net-device for n0 -- n1 p2p link was
+   created before the netdevice for n0 -- n2 p2p link. Thus, n2 has
+   neighbor-index of 1 (n1 has 0) with respect to n0.
 
-   #. Using IPv4:
-   .. code-block:: bash
+   n2 has 3 neighbors i.e. n1, n3 and n0. The n2 net-device for n1 -- n2
+   p2p link was created before the n2 net-device for n2 -- n3 p2p link
+   which was before the n2 netdevice for n0 -- n2 p2p link. This, n3
+   has neighbor-index of 01 (n1 has 00 and n0 has 10) with repect to n2.
 
-      # By default IPv4 network is selected
-      ./waf --run src/nix-vector-routing/examples/nix-simple
+   Thus, the nix-vector for the path from n0 to n3 is 101.
 
-   #. Using IPv6:
-   .. code-block:: bash
+   .. note::
+      This neighbor-index or nix-index has total number of bits equal to
+      minimum number of bits required to represent all the neighbors in
+      their binary form.
 
-      # Use the --useIPv6 flag
-      ./waf --run "src/nix-vector-routing/examples/nix-simple --useIPv6"
+   .. note::
+      If there are multiple netdevices connected to the current netdevice
+      on the channel then it depends on which order netdevices were added
+      to the channel.
 
-* nms-p2p-nix.cc
 
-This example demonstrates the advantage of Nix-Vector routing as Nix
-performs source-based routing (BFS) to have faster routing.
+   a. Using IPv4:
 
-.. image:: figures/nms.png
-   :alt: NMS P2P Network Diagram
+      .. code-block:: bash
 
-   #. Using IPv4:
-   .. code-block:: bash
+         # By default IPv4 network is selected
+         ./ns3 run nix-simple
+
+   b. Using IPv6:
+
+      .. code-block:: bash
+
+         # Use the --useIPv6 flag
+         ./ns3 run "nix-simple --useIPv6"
 
-      # By default IPv4 network is selected
-      ./waf --run src/nix-vector-routing/examples/nms-p2p-nix
 
-   #. Using IPv6:
-   .. code-block:: bash
 
-      # Use the --useIPv6 flag
-      ./waf --run "src/nix-vector-routing/examples/nms-p2p-nix --useIPv6"
+2. nms-p2p-nix.cc
 
-*  nix-simple-multi-address.cc
+   This example demonstrates the advantage of Nix-Vector routing as Nix
+   performs source-based routing (BFS) to have faster routing.
 
-This is an IPv4 example demonstrating multiple interface addresses. This
-example also shows how address assignment in between the simulation causes
-the all the route caches and Nix caches to flush.
+   .. image:: figures/nms.png
+      :alt: NMS P2P Network Diagram
 
-.. code-block:: bash
+   a. Using IPv4:
 
-   # By default IPv4 network is selected
-   ./waf --run src/nix-vector-routing/examples/nix-simple-multi-address
+      .. code-block:: bash
 
-*  nix-double-wifi.cc
+         # By default IPv4 network is selected
+         ./ns3 run nms-p2p-nix
 
-This example demonstrates the working of Nix with two Wifi networks
-operating on the same Wifi channel object. The example uses ``ns3::YansWifiChannel``
-for both the wifi networks.
+   b. Using IPv6:
+
+      .. code-block:: bash
+
+         # Use the --useIPv6 flag
+         ./ns3 run "nms-p2p-nix --useIPv6"
+
+3.  nix-simple-multi-address.cc
+
+   This is an IPv4 example demonstrating multiple interface addresses. This
+   example also shows how address assignment in between the simulation causes
+   the all the route caches and Nix caches to flush.
 
-   #. Using IPv4:
    .. code-block:: bash
 
       # By default IPv4 network is selected
-      ./waf --run src/nix-vector-routing/examples/nix-double-wifi
-      # Use the --enableNixLog to enable NixVectorRouting logging.
-      ./waf --run "src/nix-vector-routing/examples/nix-double-wifi --enableNixLog"
+      ./ns3 run nix-simple-multi-address
 
-   #. Using IPv6:
-   .. code-block:: bash
+4.  nix-double-wifi.cc
+
+   This example demonstrates the working of Nix with two Wifi networks
+   operating on the same Wifi channel object. The example uses ``ns3::YansWifiChannel``
+   for both the wifi networks.
+
+   a. Using IPv4:
+
+      .. code-block:: bash
+
+         # By default IPv4 network is selected
+         ./ns3 run nix-double-wifi
+         # Use the --enableNixLog to enable NixVectorRouting logging.
+         ./ns3 run "nix-double-wifi --enableNixLog"
+
+   b. Using IPv6:
+
+      .. code-block:: bash
 
-      # Use the --useIPv6 flag
-      ./waf --run "src/nix-vector-routing/examples/nix-double-wifi --useIPv6"
-      # Use the --enableNixLog to enable NixVectorRouting logging.
-      ./waf --run "src/nix-vector-routing/examples/nix-double-wifi --useIPv6 --enableNixLog"
\ No newline at end of file
+         # Use the --useIPv6 flag
+         ./ns3 run "nix-double-wifi --useIPv6"
+         # Use the --enableNixLog to enable NixVectorRouting logging.
+         ./ns3 run "nix-double-wifi --useIPv6 --enableNixLog"
\ No newline at end of file
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/nix-vector-routing/examples/CMakeLists.txt ns-3.36/src/nix-vector-routing/examples/CMakeLists.txt
--- ns-3.35/src/nix-vector-routing/examples/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/nix-vector-routing/examples/CMakeLists.txt	2022-04-30 18:23:58.114734600 -0700
@@ -0,0 +1,31 @@
+set(base_examples
+    nix-simple
+    nix-simple-multi-address
+    nms-p2p-nix
+)
+
+foreach(
+  example
+  ${base_examples}
+)
+  build_lib_example(
+    NAME ${example}
+    SOURCE_FILES ${example}.cc
+    LIBRARIES_TO_LINK
+      ${libpoint-to-point}
+      ${libinternet}
+      ${libapplications}
+      ${libnix-vector-routing}
+  )
+endforeach()
+
+build_lib_example(
+  NAME nix-double-wifi
+  SOURCE_FILES nix-double-wifi.cc
+  LIBRARIES_TO_LINK
+    ${libpoint-to-point}
+    ${libwifi}
+    ${libapplications}
+    ${libinternet}
+    ${libnix-vector-routing}
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/nix-vector-routing/examples/nix-double-wifi.cc ns-3.36/src/nix-vector-routing/examples/nix-double-wifi.cc
--- ns-3.35/src/nix-vector-routing/examples/nix-double-wifi.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/nix-vector-routing/examples/nix-double-wifi.cc	2022-04-30 18:23:58.114734600 -0700
@@ -65,7 +65,7 @@
  * IPv4:
  * \verbatim
    Time: +7s, Nix Routing
-   Route Path: (Node 4 to Node 7, Nix Vector: 100011)
+   Route path from Node 4 to Node 7, Nix Vector: 100011 (6 bits left)
    10.1.1.3                 (Node 4)  ---->   10.1.1.4                 (Node 0)
    10.1.2.1                 (Node 0)  ---->   10.1.2.2                 (Node 1)
    10.1.3.4                 (Node 1)  ---->   10.1.3.3                 (Node 7)
@@ -74,7 +74,7 @@
  * IPv6:
  * \verbatim
    Time: +7s, Nix Routing
-   Route Path: (Node 4 to Node 7, Nix Vector: 100011)
+   Route path from Node 4 to Node 7, Nix Vector: 100011 (6 bits left)
    2001:1::200:ff:fe00:5    (Node 4)  ---->   fe80::200:ff:fe00:6      (Node 0)
    fe80::200:ff:fe00:1      (Node 0)  ---->   fe80::200:ff:fe00:2      (Node 1)
    fe80::200:ff:fe00:a      (Node 1)  ---->   2001:3::200:ff:fe00:9    (Node 7)
@@ -126,7 +126,6 @@
   phy.SetChannel (channel.Create ());
 
   WifiHelper wifi;
-  wifi.SetRemoteStationManager ("ns3::AarfWifiManager");
 
   WifiMacHelper mac;
   Ssid ssid = Ssid ("ns-3-ssid-first");
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/nix-vector-routing/examples/nix-simple.cc ns-3.36/src/nix-vector-routing/examples/nix-simple.cc
--- ns-3.35/src/nix-vector-routing/examples/nix-simple.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/nix-vector-routing/examples/nix-simple.cc	2022-04-30 18:23:58.114734600 -0700
@@ -78,114 +78,104 @@
  * - Source (n1) and Destination (n1)
  *   It goes from n1 -> n1
  * .
+ * 
+ * Expected IPv4 Routing Path output for above
+ * cases (in the output stream):
  * \verbatim
-   Expected IPv4 Routing Path output for above
-   cases (in the output stream):
-   Time: +3s, Nix Routing
-   Route Path: (Node 0 to Node 3, Nix Vector: 101)
-   10.1.4.1 (Node 0)   ---->   10.1.4.2 (Node 2)
-   10.1.3.1 (Node 2)   ---->   10.1.3.2 (Node 3)
-
-   Time: +5s, Nix Routing
-   Route Path: (Node 1 to Node 3, Nix Vector: 101)
-   10.1.2.1 (Node 1)   ---->   10.1.2.2 (Node 2)
-   10.1.3.1 (Node 2)   ---->   10.1.3.2 (Node 3)
-
-   Time: +6s, Nix Routing
-   Route Path: (Node 2 to Node 0, Nix Vector: 10)
-   10.1.4.2 (Node 2)   ---->   10.1.4.1 (Node 0)
-
-   Time: +7s, Nix Routing
-   Route Path: (Node 1 to Node 1, Nix Vector: )
-   10.1.1.2 (Node 1)   ---->   10.1.1.2 (Node 1)
-
-   Node: 0, Time: +8s, Local time: +8s, Nix Routing
-   NixCache:
-   Destination     NixVector
-   10.1.3.2        101
-   Ipv4RouteCache:
-   Destination     Gateway         Source            OutputDevice
-   10.1.3.2        10.1.4.2        10.1.4.1          2
-
-   Node: 1, Time: +8s, Local time: +8s, Nix Routing
-   NixCache:
-   Destination     NixVector
-   10.1.3.2        101
-   Ipv4RouteCache:
-   Destination     Gateway         Source            OutputDevice
-   10.1.3.2        10.1.2.2        10.1.2.1          2
-
-   Node: 2, Time: +8s, Local time: +8s, Nix Routing
-   NixCache:
-   Destination     NixVector
-   10.1.1.1        10
-   Ipv4RouteCache:
-   Destination     Gateway         Source            OutputDevice
-   10.1.1.1        10.1.4.1        10.1.4.2          3
-   10.1.3.2        10.1.3.2        10.1.3.1          2
-   10.1.4.1        10.1.4.1        10.1.4.2          3
-
-   Node: 3, Time: +8s, Local time: +8s, Nix Routing
-   NixCache:
-   Destination     NixVector
-   10.1.4.1        010
-   Ipv4RouteCache:
-   Destination     Gateway         Source            OutputDevice
-   10.1.4.1        10.1.3.1        10.1.3.2          1
+  Time: +3s, Nix Routing
+  Route path from Node 0 to Node 3, Nix Vector: 101 (3 bits left)
+  10.1.4.1                 (Node 0)  ---->   10.1.4.2                 (Node 2)
+  10.1.3.1                 (Node 2)  ---->   10.1.3.2                 (Node 3)
+
+  Time: +5s, Nix Routing
+  Route path from Node 1 to Node 3, Nix Vector: 101 (3 bits left)
+  10.1.2.1                 (Node 1)  ---->   10.1.2.2                 (Node 2)
+  10.1.3.1                 (Node 2)  ---->   10.1.3.2                 (Node 3)
+
+  Time: +6s, Nix Routing
+  Route path from Node 2 to Node 0, Nix Vector: 10 (2 bits left)
+  10.1.4.2                 (Node 2)  ---->   10.1.1.1                 (Node 0)
+
+  Time: +7s, Nix Routing
+  Route path from Node 1 to Node 1, Nix Vector: 
+  10.1.1.2                 (Node 1)  ---->   10.1.1.2                 (Node 1)
+
+  Node: 0, Time: +8s, Local time: +8s, Nix Routing
+  NixCache:
+  Destination                   NixVector
+  10.1.3.2                      101 (3 bits left)
+  IpRouteCache:
+  Destination                   Gateway                       Source                        OutputDevice
+  10.1.3.2                      10.1.4.2                      10.1.4.1                        1
+
+  Node: 1, Time: +8s, Local time: +8s, Nix Routing
+  NixCache:
+  IpRouteCache:
+
+  Node: 2, Time: +8s, Local time: +8s, Nix Routing
+  NixCache:
+  IpRouteCache:
+  Destination                   Gateway                       Source                        OutputDevice
+  10.1.3.2                      10.1.3.2                      10.1.3.1                        1
+  10.1.4.1                      10.1.4.1                      10.1.4.2                        2
+
+  Node: 3, Time: +8s, Local time: +8s, Nix Routing
+  NixCache:
+  Destination                   NixVector
+  10.1.4.1                      010 (3 bits left)
+  IpRouteCache:
+  Destination                   Gateway                       Source                        OutputDevice
+  10.1.4.1                      10.1.3.1                      10.1.3.2                        0
    \endverbatim
  *
+ * Expected IPv6 Routing Path output for above
+ * cases (in the output stream):
  * \verbatim
-   Expected IPv6 Routing Path output for above
-   cases (in the output stream):
-   Time: +3s, Nix Routing
-   Route Path: (Node 0 to Node 3, Nix Vector: 101)
-   2001:4::200:ff:fe00:7    (Node 0)  ---->   fe80::200:ff:fe00:8      (Node 2)
-   fe80::200:ff:fe00:5      (Node 2)  ---->   2001:3::200:ff:fe00:6    (Node 3)
-
-   Time: +5s, Nix Routing
-   Route Path: (Node 1 to Node 3, Nix Vector: 101)
-   2001:2::200:ff:fe00:3    (Node 1)  ---->   fe80::200:ff:fe00:4      (Node 2)
-   fe80::200:ff:fe00:5      (Node 2)  ---->   2001:3::200:ff:fe00:6    (Node 3)
-
-   Time: +6s, Nix Routing
-   Route Path: (Node 2 to Node 0, Nix Vector: 10)
-   2001:4::200:ff:fe00:8    (Node 2)  ---->   2001:1::200:ff:fe00:1    (Node 0)
-
-   Time: +7s, Nix Routing
-   Route Path: (Node 1 to Node 1, Nix Vector: )
-   2001:1::200:ff:fe00:2    (Node 1)  ---->   2001:1::200:ff:fe00:2    (Node 1)
-
-   Node: 0, Time: +8s, Local time: +8s, Nix Routing
-   NixCache:
-   Destination                   NixVector
-   2001:3::200:ff:fe00:6         101
-   IpRouteCache:
-   Destination                   Gateway                       Source                        OutputDevice
-   2001:3::200:ff:fe00:6         fe80::200:ff:fe00:8           2001:4::200:ff:fe00:7           1
-
-   Node: 1, Time: +8s, Local time: +8s, Nix Routing
-   NixCache:
-   Destination                   NixVector
-   2001:3::200:ff:fe00:6         101
-   IpRouteCache:
-
-   Node: 2, Time: +8s, Local time: +8s, Nix Routing
-   NixCache:
-   Destination                   NixVector
-   2001:1::200:ff:fe00:1         10
-   IpRouteCache:
-   Destination                   Gateway                       Source                        OutputDevice
-   2001:3::200:ff:fe00:6         fe80::200:ff:fe00:6           fe80::200:ff:fe00:5             1
-   2001:4::200:ff:fe00:7         fe80::200:ff:fe00:7           fe80::200:ff:fe00:8             2
-
-   Node: 3, Time: +8s, Local time: +8s, Nix Routing
-   NixCache:
-   Destination                   NixVector
-   2001:4::200:ff:fe00:7         010
-   IpRouteCache:
-   Destination                   Gateway                       Source                        OutputDevice
-   2001:4::200:ff:fe00:7         fe80::200:ff:fe00:5           2001:3::200:ff:fe00:6           0
-   \endverbatim
+  Time: +3s, Nix Routing
+  Route path from Node 0 to Node 3, Nix Vector: 101 (3 bits left)
+  2001:4::200:ff:fe00:7    (Node 0)  ---->   fe80::200:ff:fe00:8      (Node 2)
+  fe80::200:ff:fe00:5      (Node 2)  ---->   2001:3::200:ff:fe00:6    (Node 3)
+
+  Time: +5s, Nix Routing
+  Route path from Node 1 to Node 3, Nix Vector: 101 (3 bits left)
+  2001:2::200:ff:fe00:3    (Node 1)  ---->   fe80::200:ff:fe00:4      (Node 2)
+  fe80::200:ff:fe00:5      (Node 2)  ---->   2001:3::200:ff:fe00:6    (Node 3)
+
+  Time: +6s, Nix Routing
+  Route path from Node 2 to Node 0, Nix Vector: 10 (2 bits left)
+  2001:4::200:ff:fe00:8    (Node 2)  ---->   2001:1::200:ff:fe00:1    (Node 0)
+
+  Time: +7s, Nix Routing
+  Route path from Node 1 to Node 1, Nix Vector: 
+  2001:1::200:ff:fe00:2    (Node 1)  ---->   2001:1::200:ff:fe00:2    (Node 1)
+
+  Node: 0, Time: +8s, Local time: +8s, Nix Routing
+  NixCache:
+  Destination                   NixVector
+  2001:3::200:ff:fe00:6         101 (3 bits left)
+  IpRouteCache:
+  Destination                   Gateway                       Source                        OutputDevice
+  2001:3::200:ff:fe00:6         fe80::200:ff:fe00:8           2001:4::200:ff:fe00:7           1
+
+  Node: 1, Time: +8s, Local time: +8s, Nix Routing
+  NixCache:
+  IpRouteCache:
+
+  Node: 2, Time: +8s, Local time: +8s, Nix Routing
+  NixCache:
+  IpRouteCache:
+  Destination                   Gateway                       Source                        OutputDevice
+  2001:3::200:ff:fe00:6         fe80::200:ff:fe00:6           fe80::200:ff:fe00:5             1
+  2001:4::200:ff:fe00:7         fe80::200:ff:fe00:7           fe80::200:ff:fe00:8             2
+
+  Node: 3, Time: +8s, Local time: +8s, Nix Routing
+  NixCache:
+  Destination                   NixVector
+  2001:4::200:ff:fe00:7         010 (3 bits left)
+  IpRouteCache:
+  Destination                   Gateway                       Source                        OutputDevice
+  2001:4::200:ff:fe00:7         fe80::200:ff:fe00:5           2001:3::200:ff:fe00:6           0
+  \endverbatim
  */
 
 using namespace ns3;
@@ -204,35 +194,21 @@
   LogComponentEnable ("UdpEchoClientApplication", LOG_LEVEL_INFO);
   LogComponentEnable ("UdpEchoServerApplication", LOG_LEVEL_INFO);
 
-  NodeContainer nodes12;
-  nodes12.Create (2);
-
-  NodeContainer nodes23;
-  nodes23.Add (nodes12.Get (1));
-  nodes23.Create (1);
-
-  NodeContainer nodes34;
-  nodes34.Add (nodes23.Get (1));
-  nodes34.Create (1);
-
-  NodeContainer nodes13;
-  nodes13.Add (nodes12.Get (0));
-  nodes13.Add (nodes34.Get (0));
+  NodeContainer nodes;
+  nodes.Create (4);
 
   PointToPointHelper pointToPoint;
   pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
   pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));
 
-  NodeContainer allNodes = NodeContainer (nodes12, nodes23.Get (1), nodes34.Get (1));
-
+  NetDeviceContainer devices01;
   NetDeviceContainer devices12;
   NetDeviceContainer devices23;
-  NetDeviceContainer devices34;
-  NetDeviceContainer devices13;
-  devices12 = pointToPoint.Install (nodes12);
-  devices23 = pointToPoint.Install (nodes23);
-  devices34 = pointToPoint.Install (nodes34);
-  devices13 = pointToPoint.Install (nodes13);
+  NetDeviceContainer devices02;
+  devices01 = pointToPoint.Install (NodeContainer (nodes.Get (0), nodes.Get (1)));
+  devices12 = pointToPoint.Install (NodeContainer (nodes.Get (1), nodes.Get (2)));
+  devices23 = pointToPoint.Install (NodeContainer (nodes.Get (2), nodes.Get (3)));
+  devices02 = pointToPoint.Install (NodeContainer (nodes.Get (0), nodes.Get (2)));
 
   Address udpServerAddress;
 
@@ -243,7 +219,7 @@
       Ipv4NixVectorHelper nixRouting;
       InternetStackHelper stack;
       stack.SetRoutingHelper (nixRouting); // has effect on the next Install ()
-      stack.Install (allNodes);
+      stack.Install (nodes);
 
       Ipv4AddressHelper address1;
       address1.SetBase ("10.1.1.0", "255.255.255.0");
@@ -254,19 +230,19 @@
       Ipv4AddressHelper address4;
       address4.SetBase ("10.1.4.0", "255.255.255.0");
 
-      Ipv4InterfaceContainer interfaces12 = address1.Assign (devices12);
-      Ipv4InterfaceContainer interfaces23 = address2.Assign (devices23);
-      Ipv4InterfaceContainer interfaces34 = address3.Assign (devices34);
-      Ipv4InterfaceContainer interfaces13 = address4.Assign (devices13);
+      Ipv4InterfaceContainer interfaces01 = address1.Assign (devices01);
+      Ipv4InterfaceContainer interfaces12 = address2.Assign (devices12);
+      Ipv4InterfaceContainer interfaces23 = address3.Assign (devices23);
+      Ipv4InterfaceContainer interfaces02 = address4.Assign (devices02);
 
-      udpServerAddress = interfaces34.GetAddress (1);
+      udpServerAddress = interfaces23.GetAddress (1);
 
       // Trace routing paths for different source and destinations.
       Ptr<OutputStreamWrapper> routingStream = Create<OutputStreamWrapper> ("nix-simple-ipv4.routes", std::ios::out);
-      nixRouting.PrintRoutingPathAt (Seconds (3), nodes12.Get (0), interfaces34.GetAddress (1), routingStream);
-      nixRouting.PrintRoutingPathAt (Seconds (5), nodes12.Get (1), interfaces34.GetAddress (1), routingStream);
-      nixRouting.PrintRoutingPathAt (Seconds (6), nodes23.Get (1), interfaces12.GetAddress (0), routingStream);
-      nixRouting.PrintRoutingPathAt (Seconds (7), nodes12.Get (1), interfaces12.GetAddress (1), routingStream);
+      nixRouting.PrintRoutingPathAt (Seconds (3), nodes.Get (0), interfaces23.GetAddress (1), routingStream);
+      nixRouting.PrintRoutingPathAt (Seconds (5), nodes.Get (1), interfaces23.GetAddress (1), routingStream);
+      nixRouting.PrintRoutingPathAt (Seconds (6), nodes.Get (2), interfaces01.GetAddress (0), routingStream);
+      nixRouting.PrintRoutingPathAt (Seconds (7), nodes.Get (1), interfaces01.GetAddress (1), routingStream);
       // Trace routing tables
       nixRouting.PrintRoutingTableAllAt (Seconds (8), routingStream);
     }
@@ -277,7 +253,7 @@
       Ipv6NixVectorHelper nixRouting;
       InternetStackHelper stack;
       stack.SetRoutingHelper (nixRouting); // has effect on the next Install ()
-      stack.Install (allNodes);
+      stack.Install (nodes);
 
       Ipv6AddressHelper address1;
       address1.SetBase (Ipv6Address ("2001:1::"), Ipv6Prefix (64));
@@ -288,26 +264,26 @@
       Ipv6AddressHelper address4;
       address4.SetBase (Ipv6Address ("2001:4::"), Ipv6Prefix (64));
 
-      Ipv6InterfaceContainer interfaces12 = address1.Assign (devices12);
-      Ipv6InterfaceContainer interfaces23 = address2.Assign (devices23);
-      Ipv6InterfaceContainer interfaces34 = address3.Assign (devices34);
-      Ipv6InterfaceContainer interfaces13 = address4.Assign (devices13);
+      Ipv6InterfaceContainer interfaces01 = address1.Assign (devices01);
+      Ipv6InterfaceContainer interfaces12 = address2.Assign (devices12);
+      Ipv6InterfaceContainer interfaces23 = address3.Assign (devices23);
+      Ipv6InterfaceContainer interfaces02 = address4.Assign (devices02);
 
-      udpServerAddress = interfaces34.GetAddress (1, 1);
+      udpServerAddress = interfaces23.GetAddress (1, 1);
 
       // Trace routing paths for different source and destinations.
       Ptr<OutputStreamWrapper> routingStream = Create<OutputStreamWrapper> ("nix-simple-ipv6.routes", std::ios::out);
-      nixRouting.PrintRoutingPathAt (Seconds (3), nodes12.Get (0), interfaces34.GetAddress (1, 1), routingStream);
-      nixRouting.PrintRoutingPathAt (Seconds (5), nodes12.Get (1), interfaces34.GetAddress (1, 1), routingStream);
-      nixRouting.PrintRoutingPathAt (Seconds (6), nodes23.Get (1), interfaces12.GetAddress (0, 1), routingStream);
-      nixRouting.PrintRoutingPathAt (Seconds (7), nodes12.Get (1), interfaces12.GetAddress (1, 1), routingStream);
+      nixRouting.PrintRoutingPathAt (Seconds (3), nodes.Get (0), interfaces23.GetAddress (1, 1), routingStream);
+      nixRouting.PrintRoutingPathAt (Seconds (5), nodes.Get (1), interfaces23.GetAddress (1, 1), routingStream);
+      nixRouting.PrintRoutingPathAt (Seconds (6), nodes.Get (2), interfaces01.GetAddress (0, 1), routingStream);
+      nixRouting.PrintRoutingPathAt (Seconds (7), nodes.Get (1), interfaces01.GetAddress (1, 1), routingStream);
       // Trace routing tables
       nixRouting.PrintRoutingTableAllAt (Seconds (8), routingStream);
     }
   
   UdpEchoServerHelper echoServer (9);
 
-  ApplicationContainer serverApps = echoServer.Install (nodes34.Get (1));
+  ApplicationContainer serverApps = echoServer.Install (nodes.Get (3));
   serverApps.Start (Seconds (1.0));
   serverApps.Stop (Seconds (10.0));
 
@@ -316,7 +292,7 @@
   echoClient.SetAttribute ("Interval", TimeValue (Seconds (1.)));
   echoClient.SetAttribute ("PacketSize", UintegerValue (1024));
 
-  ApplicationContainer clientApps = echoClient.Install (nodes12.Get (0));
+  ApplicationContainer clientApps = echoClient.Install (nodes.Get (0));
   clientApps.Start (Seconds (2.0));
   clientApps.Stop (Seconds (10.0));
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/nix-vector-routing/examples/nix-simple-multi-address.cc ns-3.36/src/nix-vector-routing/examples/nix-simple-multi-address.cc
--- ns-3.35/src/nix-vector-routing/examples/nix-simple-multi-address.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/nix-vector-routing/examples/nix-simple-multi-address.cc	2022-04-30 18:23:58.114734600 -0700
@@ -53,7 +53,6 @@
     n2 (left)  IP: 10.1.2.2
     n2 (right) IP: 10.1.3.1, 10.2.3.1
     n3 (left)  IP: 10.1.3.2, 10.2.3.2
-
    \endverbatim
  *
  * Cases considered:
@@ -63,76 +62,77 @@
  *  - At t = +3s, Path from n0 to n1 (10.2.1.2).
  *  - At t = +7s, Path from n0 to n3 (10.2.3.2).
  *
+ * Logging output:
  * \verbatim
-   Logging output:
    At time +2s client sent 1024 bytes to 10.1.3.2 port 9
    At time +2.01106s server received 1024 bytes from 10.1.1.1 port 49153
    At time +2.01106s server sent 1024 bytes to 10.1.1.1 port 49153
    At time +2.02212s client received 1024 bytes from 10.1.3.2 port 9
-
-   Output in nix-simple-multi-address.routes:
-   Time: +3s, Nix Routing
-   Route Path: (Node 0 to Node 1, Nix Vector: 0)
-   10.2.1.1 (Node 0)   ---->   10.2.1.2 (Node 1)
-
-   Node: 0, Time: +4s, Local time: +4s, Nix Routing
-   NixCache:
-   Destination     NixVector
-   10.1.3.2        011
-   10.2.1.2        0
-   Ipv4RouteCache:
-   Destination     Gateway         Source            OutputDevice
-   10.1.3.2        10.1.1.2        10.1.1.1          1
-
-   Node: 1, Time: +4s, Local time: +4s, Nix Routing
-   NixCache:
-   Ipv4RouteCache:
-   Destination     Gateway         Source            OutputDevice
-   10.1.1.1        10.1.1.1        10.1.1.2          1
-   10.1.3.2        10.1.2.2        10.1.2.1          2
-
-   Node: 2, Time: +4s, Local time: +4s, Nix Routing
-   NixCache:
-   Ipv4RouteCache:
-   Destination     Gateway         Source            OutputDevice
-   10.1.1.1        10.1.2.1        10.1.2.2          1
-   10.1.3.2        10.1.3.2        10.1.3.1          2
-
-   Node: 3, Time: +4s, Local time: +4s, Nix Routing
-   NixCache:
-   Destination     NixVector
-   10.1.1.1        000
-   Ipv4RouteCache:
-   Destination     Gateway         Source            OutputDevice
-   10.1.1.1        10.1.3.1        10.1.3.2          1
-
-   Node: 0, Time: +6s, Local time: +6s, Nix Routing
-   NixCache:
-   Ipv4RouteCache:
-
-   Node: 1, Time: +6s, Local time: +6s, Nix Routing
-   NixCache:
-   Ipv4RouteCache:
-
-   Node: 2, Time: +6s, Local time: +6s, Nix Routing
-   NixCache:
-   Ipv4RouteCache:
-
-   Node: 3, Time: +6s, Local time: +6s, Nix Routing
-   NixCache:
-   Ipv4RouteCache:
-
-   Time: +7s, Nix Routing
-   Route Path: (Node 0 to Node 3, Nix Vector: 011)
-   10.1.1.1 (Node 0)   ---->   10.1.1.2 (Node 1)
-   10.1.2.1 (Node 1)   ---->   10.1.2.2 (Node 2)
-   10.1.3.1 (Node 2)   ---->   10.2.3.2 (Node 3)
- * \endverbatim
+  \endverbatim
+ *
+ * Output in nix-simple-multi-address.routes:
+ * \verbatim
+  Time: +3s, Nix Routing
+  Route path from Node 0 to Node 1, Nix Vector: 0 (1 bits left)
+  10.2.1.1                 (Node 0)  ---->   10.2.1.2                 (Node 1)
+
+  Node: 0, Time: +4s, Local time: +4s, Nix Routing
+  NixCache:
+  Destination                   NixVector
+  10.1.3.2                      011 (3 bits left)
+  IpRouteCache:
+  Destination                   Gateway                       Source                        OutputDevice
+  10.1.3.2                      10.1.1.2                      10.1.1.1                        1
+
+  Node: 1, Time: +4s, Local time: +4s, Nix Routing
+  NixCache:
+  IpRouteCache:
+  Destination                   Gateway                       Source                        OutputDevice
+  10.1.1.1                      10.1.1.1                      10.1.1.2                        1
+  10.1.3.2                      10.1.2.2                      10.1.2.1                        2
+
+  Node: 2, Time: +4s, Local time: +4s, Nix Routing
+  NixCache:
+  IpRouteCache:
+  Destination                   Gateway                       Source                        OutputDevice
+  10.1.1.1                      10.1.2.1                      10.1.2.2                        1
+  10.1.3.2                      10.1.3.2                      10.1.3.1                        2
+
+  Node: 3, Time: +4s, Local time: +4s, Nix Routing
+  NixCache:
+  Destination                   NixVector
+  10.1.1.1                      000 (3 bits left)
+  IpRouteCache:
+  Destination                   Gateway                       Source                        OutputDevice
+  10.1.1.1                      10.1.3.1                      10.1.3.2                        1
+
+  Node: 0, Time: +6s, Local time: +6s, Nix Routing
+  NixCache:
+  IpRouteCache:
+
+  Node: 1, Time: +6s, Local time: +6s, Nix Routing
+  NixCache:
+  IpRouteCache:
+
+  Node: 2, Time: +6s, Local time: +6s, Nix Routing
+  NixCache:
+  IpRouteCache:
+
+  Node: 3, Time: +6s, Local time: +6s, Nix Routing
+  NixCache:
+  IpRouteCache:
+
+  Time: +7s, Nix Routing
+  Route path from Node 0 to Node 3, Nix Vector: 011 (3 bits left)
+  10.1.1.1                 (Node 0)  ---->   10.1.1.2                 (Node 1)
+  10.1.2.1                 (Node 1)  ---->   10.1.2.2                 (Node 2)
+  10.1.3.1                 (Node 2)  ---->   10.2.3.2                 (Node 3)
+ \endverbatim
  */
 
 using namespace ns3;
 
-NS_LOG_COMPONENT_DEFINE ("NixSimpleExample");
+NS_LOG_COMPONENT_DEFINE ("NixSimpleMultiAddressExample");
 
 int
 main (int argc, char *argv[])
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/nix-vector-routing/examples/nms-p2p-nix.cc ns-3.36/src/nix-vector-routing/examples/nms-p2p-nix.cc
--- ns-3.35/src/nix-vector-routing/examples/nms-p2p-nix.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/nix-vector-routing/examples/nms-p2p-nix.cc	2022-04-30 18:23:58.114734600 -0700
@@ -38,10 +38,8 @@
  * to make very large simulations.
  */
 
-// for timing functions
-#include <cstdlib>
-#include <sys/time.h>
-#include <fstream>
+#include <chrono>
+#include <sstream>
 
 #include "ns3/core-module.h"
 #include "ns3/internet-module.h"
@@ -55,11 +53,6 @@
 
 using namespace ns3;
 
-typedef struct timeval TIMER_TYPE;
-#define TIMER_NOW(_t) gettimeofday (&_t,NULL);
-#define TIMER_SECONDS(_t) ((double)(_t).tv_sec + (_t).tv_usec*1e-6)
-#define TIMER_DIFF(_t1, _t2) (TIMER_SECONDS (_t1)-TIMER_SECONDS (_t2))
-
 NS_LOG_COMPONENT_DEFINE ("CampusNetworkModel");
 
 void Progress ()
@@ -157,8 +150,8 @@
 int
 main (int argc, char *argv[])
 {
-  TIMER_TYPE t0, t1, t2;
-  TIMER_NOW (t0);
+  auto t0 = std::chrono::steady_clock::now ();
+
   std::cout << " ==== DARPA NMS CAMPUS NETWORK SIMULATION ====" << std::endl;
   // LogComponentEnable ("OnOffApplication", LOG_LEVEL_INFO);
 
@@ -687,8 +680,7 @@
     }
 
   std::cout << "Created " << NodeList::GetNNodes () << " nodes." << std::endl;
-  TIMER_TYPE routingStart;
-  TIMER_NOW (routingStart);
+  auto routingStart = std::chrono::steady_clock::now ();
 
   if (nix)
     {
@@ -702,25 +694,28 @@
       Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
     }
 
-  TIMER_TYPE routingEnd;
-  TIMER_NOW (routingEnd);
-  std::cout << "Routing tables population took " 
-       << TIMER_DIFF (routingEnd, routingStart) << std::endl;
+  auto routingEnd = std::chrono::steady_clock::now ();
+  std::cout << "Routing tables population took "
+            << std::chrono::duration_cast<std::chrono::milliseconds> (routingEnd - routingStart).count () << "ms"
+            << std::endl;
 
   Simulator::ScheduleNow (Progress);
   std::cout << "Running simulator..." << std::endl;
-  TIMER_NOW (t1);
+  auto t1 = std::chrono::steady_clock::now ();
   Simulator::Stop (Seconds (100.0));
   Simulator::Run ();
-  TIMER_NOW (t2);
+  auto t2 = std::chrono::steady_clock::now ();
   std::cout << "Simulator finished." << std::endl;
   Simulator::Destroy ();
 
-  double d1 = TIMER_DIFF (t1, t0), d2 = TIMER_DIFF (t2, t1);
-  std::cout << "-----" << std::endl << "Runtime Stats:" << std::endl;
-  std::cout << "Simulator init time: " << d1 << std::endl;
-  std::cout << "Simulator run time: " << d2 << std::endl;
-  std::cout << "Total elapsed time: " << d1+d2 << std::endl;
+  auto d1 = std::chrono::duration_cast<std::chrono::seconds>(t1 - t0);
+  auto d2 = std::chrono::duration_cast<std::chrono::seconds>(t2 - t1);
+
+  std::cout << "-----" << std::endl
+            << "Runtime Stats:" << std::endl;
+  std::cout << "Simulator init time: " << d1.count () << "s" << std::endl;
+  std::cout << "Simulator run time: " << d2.count () << "s" << std::endl;
+  std::cout << "Total elapsed time: " << (d1 + d2).count () << "s" << std::endl;
 
   delete[] nodes_netLR;
   return 0;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/nix-vector-routing/examples/wscript ns-3.36/src/nix-vector-routing/examples/wscript
--- ns-3.35/src/nix-vector-routing/examples/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/nix-vector-routing/examples/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,18 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    obj = bld.create_ns3_program('nix-simple',
-                                 ['point-to-point', 'applications', 'internet', 'nix-vector-routing'])
-    obj.source = 'nix-simple.cc'
-
-    obj = bld.create_ns3_program('nms-p2p-nix',
-                                 ['point-to-point', 'applications', 'internet', 'nix-vector-routing'])
-    obj.source = 'nms-p2p-nix.cc'
-
-    obj = bld.create_ns3_program('nix-simple-multi-address',
-                                 ['point-to-point', 'applications', 'internet', 'nix-vector-routing'])
-    obj.source = 'nix-simple-multi-address.cc'
-
-    obj = bld.create_ns3_program('nix-double-wifi',
-                                 ['point-to-point', 'wifi', 'applications', 'internet', 'nix-vector-routing'])
-    obj.source = 'nix-double-wifi.cc'
\ No newline at end of file
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/nix-vector-routing/helper/nix-vector-helper.cc ns-3.36/src/nix-vector-routing/helper/nix-vector-helper.cc
--- ns-3.35/src/nix-vector-routing/helper/nix-vector-helper.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/nix-vector-routing/helper/nix-vector-helper.cc	2022-04-30 18:23:58.118734800 -0700
@@ -33,7 +33,7 @@
 NixVectorHelper<T>::NixVectorHelper ()
 {
   std::string name = (IsIpv4::value ? "Ipv4" : "Ipv6");
-  m_agentFactory.SetTypeId (("ns3::" + name + "NixVectorRouting").c_str ());
+  m_agentFactory.SetTypeId ("ns3::" + name + "NixVectorRouting");
 }
 
 template <typename T>
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/nix-vector-routing/model/nix-vector-routing.cc ns-3.36/src/nix-vector-routing/model/nix-vector-routing.cc
--- ns-3.35/src/nix-vector-routing/model/nix-vector-routing.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/nix-vector-routing/model/nix-vector-routing.cc	2022-04-30 18:23:58.118734800 -0700
@@ -44,6 +44,10 @@
 template <typename T>
 bool NixVectorRouting<T>::g_isCacheDirty = false;
 
+// Epoch starts from one to make it easier to spot an uninitialized NixVector during debug.
+template <typename T>
+uint32_t NixVectorRouting<T>::g_epoch = 1;
+
 template <typename T>
 typename NixVectorRouting<T>::IpAddressToNodeMap NixVectorRouting<T>::g_ipAddressToNodeMap;
 
@@ -56,7 +60,7 @@
 {
   std::string Tname = GetTypeParamName<NixVectorRouting<T> > ();
   std::string name = (Tname == "Ipv4RoutingProtocol" ? "Ipv4" : "Ipv6");
-  static TypeId tid = TypeId (("ns3::" + name + "NixVectorRouting").c_str ())
+  static TypeId tid = TypeId ("ns3::" + name + "NixVectorRouting")
     .SetParent<T> ()
     .SetGroupName ("NixVectorRouting")
     .template AddConstructor<NixVectorRouting<T> > ()
@@ -183,6 +187,7 @@
   NS_LOG_FUNCTION (this << source << dest << oif);
 
   Ptr<NixVector> nixVector = Create<NixVector> ();
+  nixVector->SetEpoch (g_epoch);
 
   // not in cache, must build the nix vector
   // First, we have to figure out the nodes 
@@ -271,35 +276,6 @@
 
 template <typename T>
 bool
-NixVectorRouting<T>::BuildNixVectorLocal (Ptr<NixVector> nixVector)
-{
-  NS_LOG_FUNCTION_NOARGS ();
-
-  uint32_t numberOfDevices = m_node->GetNDevices ();
-
-  // here we are building a nix vector to 
-  // ourself, so we need to find the loopback 
-  // interface and add that to the nix vector
-
-  for (uint32_t i = 0; i < numberOfDevices; i++)
-    {
-      uint32_t interfaceIndex = (m_ip)->GetInterfaceForDevice (m_node->GetDevice (i));
-      IpInterfaceAddress ifAddr = m_ip->GetAddress (interfaceIndex, 0);
-      IpAddress ifAddrValue = ifAddr.GetAddress ();
-      if (ifAddrValue.IsLocalhost ())
-        {
-          NS_LOG_LOGIC ("Adding loopback to nix.");
-          NS_LOG_LOGIC ("Adding Nix: " << i << " with " << nixVector->BitCount (numberOfDevices) 
-                                       << " bits, for node " << m_node->GetId ());
-          nixVector->AddNeighborIndex (i, nixVector->BitCount (numberOfDevices));
-          return true;
-        }
-    }
-  return false;
-}
-
-template <typename T>
-bool
 NixVectorRouting<T>::BuildNixVector (const std::vector< Ptr<Node> > & parentVector, uint32_t source, uint32_t dest, Ptr<NixVector> nixVector) const
 {
   NS_LOG_FUNCTION (this << parentVector << source << dest << nixVector);
@@ -710,6 +686,24 @@
 
   NS_LOG_DEBUG ("Dest IP from header: " << destAddress);
 
+  if (destAddress.IsLocalhost ())
+    {
+      rtentry = Create<IpRoute> ();
+      rtentry->SetSource (IpAddress::GetLoopback ());
+      rtentry->SetDestination (destAddress);
+      rtentry->SetGateway (IpAddress::GetZero ());
+      for (uint32_t i = 0 ; i < m_ip->GetNInterfaces (); i++)
+        {
+          Ptr<LoopbackNetDevice> loNetDevice = DynamicCast<LoopbackNetDevice> (m_ip->GetNetDevice (i));
+          if (loNetDevice)
+            {
+              rtentry->SetOutputDevice (loNetDevice);
+              break;
+            }
+        }
+      return rtentry;
+    }
+
   if constexpr (!IsIpv4::value)
     {
       /* when sending on link-local multicast, there have to be interface specified */
@@ -735,9 +729,11 @@
       // Build the nix-vector, given this node and the
       // dest IP address
       nixVectorInCache = GetNixVector (m_node, destAddress, oif);
-
-      // cache it
-      m_nixCache.insert (typename NixMap_t::value_type (destAddress, nixVectorInCache));
+      if (nixVectorInCache)
+      {
+        // cache it
+        m_nixCache.insert (typename NixMap_t::value_type (destAddress, nixVectorInCache));
+      }
     }
 
   // path exists
@@ -863,6 +859,7 @@
           if (!lcb.IsNull ())
             {
               NS_LOG_LOGIC ("Local delivery to " << destAddress);
+              p->SetNixVector (nullptr);
               lcb (p, header, iif);
               return true;
             }
@@ -905,6 +902,14 @@
   // If nixVector isn't in packet, something went wrong
   NS_ASSERT (nixVector);
 
+  if (nixVector->GetEpoch () != g_epoch)
+    {
+      NS_LOG_LOGIC ("NixVector epoch mismatch (" << nixVector->GetEpoch () << " Vs " << g_epoch
+                                                 << ") - rebuilding it");
+      nixVector = GetNixVector (m_node, destAddress, 0);
+      p->SetNixVector (nixVector);
+    }
+
   // Get the interface number that we go out of, by extracting
   // from the nix-vector
   if (m_totalNeighbors == 0)
@@ -989,9 +994,14 @@
             {
               *os << *(it->second) << std::endl;
             }
+          else
+            {
+              *os << "-" << std::endl;
+            }
         }
     }
-  *os << "IpRouteCache:" << std::endl;
+  
+  *os << "IpRouteCache:" << std::endl;  
   if (m_ipRouteCache.size () > 0)
     {
       *os << std::setw (30) << "Destination";
@@ -1249,8 +1259,8 @@
   *os << std::resetiosflags (std::ios::adjustfield) << std::setiosflags (std::ios::left);
   *os << "Time: " << Now().As (unit)
       << ", Nix Routing" << std::endl;
-  *os << "Route Path: ";
-  *os << "(Node " << source->GetId () << " to Node " << destNode->GetId () << ", ";
+  *os << "Route path from ";
+  *os << "Node " << source->GetId () << " to Node " << destNode->GetId () << ", ";
   *os << "Nix Vector: ";
 
   // Check the Nix cache
@@ -1264,8 +1274,6 @@
       // Build the nix-vector, given the source node and the
       // dest IP address
       nixVectorInCache = GetNixVector (source, dest, nullptr);
-      // cache it
-      m_nixCache.insert (typename NixMap_t::value_type (dest, nixVectorInCache));
     }
 
   if (nixVectorInCache || (!nixVectorInCache && source == destNode))
@@ -1282,7 +1290,7 @@
 
           *os << *nixVector;
         }
-      *os << ")" << std::endl;
+      *os << std::endl;
 
       if (source == destNode)
         {
@@ -1360,6 +1368,7 @@
   if (g_isCacheDirty)
     {
       FlushGlobalNixRoutingCache ();
+      g_epoch++;
       g_isCacheDirty = false;
     }
 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/nix-vector-routing/model/nix-vector-routing.h ns-3.36/src/nix-vector-routing/model/nix-vector-routing.h
--- ns-3.35/src/nix-vector-routing/model/nix-vector-routing.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/nix-vector-routing/model/nix-vector-routing.h	2022-04-30 18:23:58.118734800 -0700
@@ -219,13 +219,6 @@
   bool BuildNixVector (const std::vector< Ptr<Node> > & parentVector, uint32_t source, uint32_t dest, Ptr<NixVector> nixVector) const;
 
   /**
-   * Special variation of BuildNixVector for when a node is sending to itself
-   * \param [out] nixVector the NixVector to be used for routing
-   * \returns true on success, false otherwise.
-   */
-  bool BuildNixVectorLocal (Ptr<NixVector> nixVector);
-
-  /**
    * Simply iterates through the nodes net-devices and determines
    * how many neighbors the node has.
    * \param [in] node node pointer
@@ -455,6 +448,11 @@
    */
   static bool g_isCacheDirty;
 
+  /**
+   * Nix Epoch, incremented each time a flush is perfomed.
+   */
+  static uint32_t g_epoch;
+
   /** Cache stores nix-vectors based on destination ip */
   mutable NixMap_t m_nixCache;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/nix-vector-routing/test/nix-test.cc ns-3.36/src/nix-vector-routing/test/nix-test.cc
--- ns-3.35/src/nix-vector-routing/test/nix-test.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/nix-vector-routing/test/nix-test.cc	2022-04-30 18:23:58.118734800 -0700
@@ -117,12 +117,10 @@
 
 void NixVectorRoutingTest::ReceivePkt (Ptr<Socket> socket)
 {
-  uint32_t availableData;
-  availableData = socket->GetRxAvailable ();
+  [[maybe_unused]] uint32_t availableData = socket->GetRxAvailable ();
   m_receivedPacket = socket->Recv (std::numeric_limits<uint32_t>::max (), 0);
   NS_TEST_ASSERT_MSG_EQ (availableData, m_receivedPacket->GetSize (),
                          "availableData should be equal to the size of packet received.");
-  NS_UNUSED (availableData);
   m_receivedPacketSizes.push_back (m_receivedPacket->GetSize ());
 }
 
@@ -314,21 +312,21 @@
 
   // Test the Path
   const std::string p_nSrcnAnCnDstv4 = "Time: +3s, Nix Routing\n"
-                                              "Route Path: (Node 0 to Node 4, Nix Vector: 01001)\n"
+                                              "Route path from Node 0 to Node 4, Nix Vector: 01001 (5 bits left)\n"
                                               "10.1.0.1                 (Node 0)  ---->   10.1.0.2                 (Node 1)\n"
                                               "10.1.4.1                 (Node 1)  ---->   10.1.4.2                 (Node 3)\n"
                                               "10.1.3.1                 (Node 3)  ---->   10.1.3.2                 (Node 4)\n\n";
   NS_TEST_EXPECT_MSG_EQ (stringStream1v4.str (), p_nSrcnAnCnDstv4, "Routing Path is incorrect.");
 
   const std::string p_nSrcnAnCnDstv6 = "Time: +3s, Nix Routing\n"
-                                              "Route Path: (Node 0 to Node 4, Nix Vector: 01001)\n"
+                                              "Route path from Node 0 to Node 4, Nix Vector: 01001 (5 bits left)\n"
                                               "2001::200:ff:fe00:1      (Node 0)  ---->   fe80::200:ff:fe00:2      (Node 1)\n"
                                               "fe80::200:ff:fe00:9      (Node 1)  ---->   fe80::200:ff:fe00:a      (Node 3)\n"
                                               "fe80::200:ff:fe00:7      (Node 3)  ---->   2001:3::200:ff:fe00:8    (Node 4)\n\n";
   NS_TEST_EXPECT_MSG_EQ (stringStream1v6.str (), p_nSrcnAnCnDstv6, "Routing Path is incorrect.");
 
   const std::string p_nSrcnAnBnCnDstv4 = "Time: +9s, Nix Routing\n"
-                                                 "Route Path: (Node 0 to Node 4, Nix Vector: 0111)\n"
+                                                 "Route path from Node 0 to Node 4, Nix Vector: 0111 (4 bits left)\n"
                                                  "10.1.0.1                 (Node 0)  ---->   10.1.0.2                 (Node 1)\n"
                                                  "10.1.1.1                 (Node 1)  ---->   10.1.1.2                 (Node 2)\n"
                                                  "10.1.2.1                 (Node 2)  ---->   10.1.2.2                 (Node 3)\n"
@@ -336,7 +334,7 @@
   NS_TEST_EXPECT_MSG_EQ (stringStream3v4.str (), p_nSrcnAnBnCnDstv4, "Routing Path is incorrect.");
 
   const std::string p_nSrcnAnBnCnDstv6 = "Time: +9s, Nix Routing\n"
-                                                 "Route Path: (Node 0 to Node 4, Nix Vector: 0111)\n"
+                                                 "Route path from Node 0 to Node 4, Nix Vector: 0111 (4 bits left)\n"
                                                  "2001::200:ff:fe00:1      (Node 0)  ---->   fe80::200:ff:fe00:2      (Node 1)\n"
                                                  "fe80::200:ff:fe00:3      (Node 1)  ---->   fe80::200:ff:fe00:4      (Node 2)\n"
                                                  "fe80::200:ff:fe00:5      (Node 2)  ---->   fe80::200:ff:fe00:6      (Node 3)\n"
@@ -380,4 +378,4 @@
 };
 
 /// Static variable for test initialization
-static NixVectorRoutingTestSuite g_nixVectorRoutingTestSuite;
\ No newline at end of file
+static NixVectorRoutingTestSuite g_nixVectorRoutingTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/nix-vector-routing/wscript ns-3.36/src/nix-vector-routing/wscript
--- ns-3.35/src/nix-vector-routing/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/nix-vector-routing/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,30 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    module = bld.create_ns3_module('nix-vector-routing', ['internet'])
-    module.includes = '.'
-    module.source = [
-        'model/nix-vector-routing.cc',
-        'helper/nix-vector-helper.cc',
-        ]
-
-    nix_vector_test = bld.create_ns3_module_test_library('nix-vector-routing')
-    nix_vector_test.source = [
-        'test/nix-test.cc',
-    ]
-
-    headers = bld(features='ns3header')
-    headers.module = 'nix-vector-routing'
-    headers.source = [
-        'model/nix-vector-routing.h',
-        'helper/nix-vector-helper.h',
-        ]
-    headers.deprecated = [
-        'model/ipv4-nix-vector-routing.h',
-        'helper/ipv4-nix-vector-helper.h',
-        ]
-
-    if bld.env['ENABLE_EXAMPLES']:
-        bld.recurse('examples')
-
-    bld.ns3_python_bindings()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/olsr/bindings/callbacks_list.py ns-3.36/src/olsr/bindings/callbacks_list.py
--- ns-3.35/src/olsr/bindings/callbacks_list.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/olsr/bindings/callbacks_list.py	2022-04-30 18:23:58.118734800 -0700
@@ -7,5 +7,5 @@
     ['void', 'ns3::Ptr<ns3::Socket>', 'const ns3::Address &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<ns3::Socket>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'const ns3::olsr::PacketHeader &', 'const std::vector<ns3::olsr::MessageHeader, std::allocator<ns3::olsr::MessageHeader> > &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'const ns3::olsr::PacketHeader &', 'const std::vector<ns3::olsr::MessageHeader, std::allocator<ns3::olsr::MessageHeader>> &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
 ]
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/olsr/bindings/modulegen__gcc_ILP32.py ns-3.36/src/olsr/bindings/modulegen__gcc_ILP32.py
--- ns-3.35/src/olsr/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/olsr/bindings/modulegen__gcc_ILP32.py	2022-04-30 18:23:58.118734800 -0700
@@ -71,6 +71,8 @@
     module.add_class('EventGarbageCollector', import_from_module='ns.core')
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'], import_from_module='ns.core')
     ## hash.h (module 'core'): ns3::Hasher [class]
     module.add_class('Hasher', import_from_module='ns.core')
     ## inet6-socket-address.h (module 'network'): ns3::Inet6SocketAddress [class]
@@ -152,8 +154,6 @@
     typehandlers.add_type_alias('std::vector< ns3::Ptr< ns3::Node > > const_iterator', 'ns3::NodeContainer::Iterator')
     typehandlers.add_type_alias('std::vector< ns3::Ptr< ns3::Node > > const_iterator*', 'ns3::NodeContainer::Iterator*')
     typehandlers.add_type_alias('std::vector< ns3::Ptr< ns3::Node > > const_iterator&', 'ns3::NodeContainer::Iterator&')
-    ## non-copyable.h (module 'core'): ns3::NonCopyable [class]
-    module.add_class('NonCopyable', destructor_visibility='protected', import_from_module='ns.core')
     ## object-base.h (module 'core'): ns3::ObjectBase [class]
     module.add_class('ObjectBase', allow_subclassing=True, import_from_module='ns.core')
     ## object.h (module 'core'): ns3::ObjectDeleter [struct]
@@ -246,29 +246,29 @@
     module.add_class('RandomVariableStream', import_from_module='ns.core', parent=root_module['ns3::Object'])
     ## random-variable-stream.h (module 'core'): ns3::SequentialRandomVariable [class]
     module.add_class('SequentialRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv4MulticastRoute', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv4Route', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv4Route>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::OutputStreamWrapper', 'ns3::empty', 'ns3::DefaultDeleter<ns3::OutputStreamWrapper>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
     ## socket.h (module 'network'): ns3::Socket [class]
     module.add_class('Socket', import_from_module='ns.network', parent=root_module['ns3::Object'])
@@ -449,8 +449,8 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['bool', 'ns3::Ptr<ns3::Socket>', 'const ns3::Address &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['ns3::ObjectBase *', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, const ns3::olsr::PacketHeader &, const std::vector<ns3::olsr::MessageHeader, std::allocator<ns3::olsr::MessageHeader> > &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'const ns3::olsr::PacketHeader &', 'const std::vector<ns3::olsr::MessageHeader, std::allocator<ns3::olsr::MessageHeader> > &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, const ns3::olsr::PacketHeader &, const std::vector<ns3::olsr::MessageHeader, std::allocator<ns3::olsr::MessageHeader>> &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'const ns3::olsr::PacketHeader &', 'const std::vector<ns3::olsr::MessageHeader, std::allocator<ns3::olsr::MessageHeader>> &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<const ns3::Packet>, unsigned short, const ns3::Address &, const ns3::Address &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'const ns3::Address &', 'const ns3::Address &', 'ns3::NetDevice::PacketType', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
@@ -465,7 +465,7 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## ipv4-list-routing.h (module 'internet'): ns3::Ipv4ListRouting [class]
     module.add_class('Ipv4ListRouting', import_from_module='ns.internet', parent=root_module['ns3::Ipv4RoutingProtocol'])
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     module.add_container('std::vector< ns3::Ipv6Address >', 'ns3::Ipv6Address', container_type='vector')
     module.add_container('std::map< unsigned int, unsigned int >', ('unsigned int', 'unsigned int'), container_type='map')
     module.add_container('std::vector< unsigned int >', 'unsigned int', container_type='vector')
@@ -698,7 +698,6 @@
     register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
     register_Ns3Mac8Address_methods(root_module, root_module['ns3::Mac8Address'])
     register_Ns3NodeContainer_methods(root_module, root_module['ns3::NodeContainer'])
-    register_Ns3NonCopyable_methods(root_module, root_module['ns3::NonCopyable'])
     register_Ns3ObjectBase_methods(root_module, root_module['ns3::ObjectBase'])
     register_Ns3ObjectDeleter_methods(root_module, root_module['ns3::ObjectDeleter'])
     register_Ns3ObjectFactory_methods(root_module, root_module['ns3::ObjectFactory'])
@@ -806,7 +805,7 @@
     register_Ns3AddressValue_methods(root_module, root_module['ns3::AddressValue'])
     register_Ns3CallbackImpl__Bool_Ns3Ptr__lt__ns3Socket__gt___Const_ns3Address___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Ns3ObjectBase___star___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3CallbackImpl__Void_Const_ns3OlsrPacketHeader___amp___Const_stdVector__lt__ns3OlsrMessageHeader__stdAllocator__lt__ns3OlsrMessageHeader__gt_____gt_____amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, const ns3::olsr::PacketHeader &, const std::vector<ns3::olsr::MessageHeader, std::allocator<ns3::olsr::MessageHeader> > &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Const_ns3OlsrPacketHeader___amp___Const_stdVector__lt__ns3OlsrMessageHeader__stdAllocator__lt__ns3OlsrMessageHeader__gt____gt_____amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, const ns3::olsr::PacketHeader &, const std::vector<ns3::olsr::MessageHeader, std::allocator<ns3::olsr::MessageHeader>> &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3NetDevice__gt___Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_short_Const_ns3Address___amp___Const_ns3Address___amp___Ns3NetDevicePacketType_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<const ns3::Packet>, unsigned short, const ns3::Address &, const ns3::Address &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3NetDevice__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::NetDevice>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3Socket__gt___Const_ns3Address___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
@@ -2534,12 +2533,6 @@
                    is_const=True)
     return
 
-def register_Ns3NonCopyable_methods(root_module, cls):
-    ## non-copyable.h (module 'core'): ns3::NonCopyable::NonCopyable() [constructor]
-    cls.add_constructor([], 
-                        visibility='protected')
-    return
-
 def register_Ns3ObjectBase_methods(root_module, cls):
     ## object-base.h (module 'core'): ns3::ObjectBase::ObjectBase() [constructor]
     cls.add_constructor([])
@@ -3417,8 +3410,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -3641,14 +3634,14 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('>=')
     cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_unary_numeric_operator('-')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
     cls.add_constructor([])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(double const value) [constructor]
@@ -3667,6 +3660,8 @@
     cls.add_constructor([param('long unsigned int const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int const v) [constructor]
     cls.add_constructor([param('long long unsigned int const', 'v')])
+    ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int128_t const v) [constructor]
+    cls.add_constructor([param('int128_t const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t const hi, uint64_t const lo) [constructor]
     cls.add_constructor([param('int64_t const', 'hi'), param('uint64_t const', 'lo')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [constructor]
@@ -4106,86 +4101,86 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Ipv4MulticastRoute_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv4MulticastRoute__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter< ns3::Ipv4MulticastRoute > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Ipv4Route_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv4Route__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter< ns3::Ipv4Route > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3OutputStreamWrapper_Ns3Empty_Ns3DefaultDeleter__lt__ns3OutputStreamWrapper__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter< ns3::OutputStreamWrapper > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
@@ -4308,7 +4303,7 @@
                    'uint8_t', 
                    [param('uint8_t', 'ipTos')], 
                    is_static=True)
-    ## socket.h (module 'network'): void ns3::Socket::Ipv6JoinGroup(ns3::Ipv6Address address, ns3::Socket::Ipv6MulticastFilterMode filterMode, std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address> > sourceAddresses) [member function]
+    ## socket.h (module 'network'): void ns3::Socket::Ipv6JoinGroup(ns3::Ipv6Address address, ns3::Socket::Ipv6MulticastFilterMode filterMode, std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address>> sourceAddresses) [member function]
     cls.add_method('Ipv6JoinGroup', 
                    'void', 
                    [param('ns3::Ipv6Address', 'address'), param('ns3::Socket::Ipv6MulticastFilterMode', 'filterMode'), param('std::vector< ns3::Ipv6Address >', 'sourceAddresses')], 
@@ -5910,7 +5905,7 @@
                    'ns3::Ipv4Address', 
                    [], 
                    is_const=True)
-    ## ipv4-route.h (module 'internet'): std::map<unsigned int, unsigned int, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, unsigned int> > > ns3::Ipv4MulticastRoute::GetOutputTtlMap() const [member function]
+    ## ipv4-route.h (module 'internet'): std::map<unsigned int, unsigned int, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, unsigned int>>> ns3::Ipv4MulticastRoute::GetOutputTtlMap() const [member function]
     cls.add_method('GetOutputTtlMap', 
                    'std::map< unsigned int, unsigned int >', 
                    [], 
@@ -6051,7 +6046,7 @@
     cls.add_method('AddHostRouteTo', 
                    'void', 
                    [param('ns3::Ipv4Address', 'dest'), param('uint32_t', 'interface'), param('uint32_t', 'metric', default_value='0')])
-    ## ipv4-static-routing.h (module 'internet'): void ns3::Ipv4StaticRouting::AddMulticastRoute(ns3::Ipv4Address origin, ns3::Ipv4Address group, uint32_t inputInterface, std::vector<unsigned int, std::allocator<unsigned int> > outputInterfaces) [member function]
+    ## ipv4-static-routing.h (module 'internet'): void ns3::Ipv4StaticRouting::AddMulticastRoute(ns3::Ipv4Address origin, ns3::Ipv4Address group, uint32_t inputInterface, std::vector<unsigned int, std::allocator<unsigned int>> outputInterfaces) [member function]
     cls.add_method('AddMulticastRoute', 
                    'void', 
                    [param('ns3::Ipv4Address', 'origin'), param('ns3::Ipv4Address', 'group'), param('uint32_t', 'inputInterface'), param('std::vector< unsigned int >', 'outputInterfaces')])
@@ -6482,10 +6477,16 @@
     cls.add_method('ExtractNeighborIndex', 
                    'uint32_t', 
                    [param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetEpoch() const [member function]
+    cls.add_method('GetEpoch', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() const [member function]
     cls.add_method('GetRemainingBits', 
                    'uint32_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -6496,6 +6497,10 @@
                    'uint32_t', 
                    [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
+    ## nix-vector.h (module 'network'): void ns3::NixVector::SetEpoch(uint32_t epoch) [member function]
+    cls.add_method('SetEpoch', 
+                   'void', 
+                   [param('uint32_t', 'epoch')])
     return
 
 def register_Ns3Node_methods(root_module, cls):
@@ -6872,10 +6877,11 @@
                    'uint32_t', 
                    [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) const [member function]
     cls.add_method('SetNixVector', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')], 
+                   is_const=True)
     ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
     cls.add_method('ToString', 
                    'std::string', 
@@ -7083,22 +7089,22 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3CallbackImpl__Void_Const_ns3OlsrPacketHeader___amp___Const_stdVector__lt__ns3OlsrMessageHeader__stdAllocator__lt__ns3OlsrMessageHeader__gt_____gt_____amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, const ns3::olsr::PacketHeader &, const std::vector<ns3::olsr::MessageHeader, std::allocator<ns3::olsr::MessageHeader> > &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+def register_Ns3CallbackImpl__Void_Const_ns3OlsrPacketHeader___amp___Const_stdVector__lt__ns3OlsrMessageHeader__stdAllocator__lt__ns3OlsrMessageHeader__gt____gt_____amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, const ns3::olsr::PacketHeader &, const std::vector<ns3::olsr::MessageHeader, std::allocator<ns3::olsr::MessageHeader>> &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, const ns3::olsr::PacketHeader &, const std::vector<ns3::olsr::MessageHeader, std::allocator<ns3::olsr::MessageHeader> > &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, const ns3::olsr::PacketHeader &, const std::vector<ns3::olsr::MessageHeader, std::allocator<ns3::olsr::MessageHeader> > &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, const ns3::olsr::PacketHeader &, const std::vector<ns3::olsr::MessageHeader, std::allocator<ns3::olsr::MessageHeader>> &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, const ns3::olsr::PacketHeader &, const std::vector<ns3::olsr::MessageHeader, std::allocator<ns3::olsr::MessageHeader>> &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
     cls.add_constructor([param('ns3::CallbackImpl< void, ns3::olsr::PacketHeader const &, std::vector< ns3::olsr::MessageHeader, std::allocator< ns3::olsr::MessageHeader > > const, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, const ns3::olsr::PacketHeader &, const std::vector<ns3::olsr::MessageHeader, std::allocator<ns3::olsr::MessageHeader> > &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, const ns3::olsr::PacketHeader &, const std::vector<ns3::olsr::MessageHeader, std::allocator<ns3::olsr::MessageHeader>> &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
     cls.add_method('DoGetTypeid', 
                    'std::string', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, const ns3::olsr::PacketHeader &, const std::vector<ns3::olsr::MessageHeader, std::allocator<ns3::olsr::MessageHeader> > &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, const ns3::olsr::PacketHeader &, const std::vector<ns3::olsr::MessageHeader, std::allocator<ns3::olsr::MessageHeader>> &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
     cls.add_method('GetTypeid', 
                    'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, const ns3::olsr::PacketHeader &, const std::vector<ns3::olsr::MessageHeader, std::allocator<ns3::olsr::MessageHeader> > &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::olsr::PacketHeader const & arg0, std::vector<ns3::olsr::MessageHeader, std::allocator<ns3::olsr::MessageHeader> > const & arg1) [member operator]
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, const ns3::olsr::PacketHeader &, const std::vector<ns3::olsr::MessageHeader, std::allocator<ns3::olsr::MessageHeader>> &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::olsr::PacketHeader const & arg0, std::vector<ns3::olsr::MessageHeader, std::allocator<ns3::olsr::MessageHeader>> const & arg1) [member operator]
     cls.add_method('operator()', 
                    'void', 
                    [param('ns3::olsr::PacketHeader const &', 'arg0'), param('std::vector< ns3::olsr::MessageHeader > const &', 'arg1')], 
@@ -7896,7 +7902,7 @@
     cls.add_method('FindMprSelectorTuple', 
                    'ns3::olsr::MprSelectorTuple *', 
                    [param('ns3::Ipv4Address const &', 'mainAddr')])
-    ## olsr-state.h (module 'olsr'): std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address> > ns3::olsr::OlsrState::FindNeighborInterfaces(ns3::Ipv4Address const & neighborMainAddr) const [member function]
+    ## olsr-state.h (module 'olsr'): std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address>> ns3::olsr::OlsrState::FindNeighborInterfaces(ns3::Ipv4Address const & neighborMainAddr) const [member function]
     cls.add_method('FindNeighborInterfaces', 
                    'std::vector< ns3::Ipv4Address >', 
                    [param('ns3::Ipv4Address const &', 'neighborMainAddr')], 
@@ -8108,7 +8114,7 @@
     cls.add_method('Dump', 
                    'void', 
                    [])
-    ## olsr-routing-protocol.h (module 'olsr'): std::vector<ns3::olsr::RoutingTableEntry, std::allocator<ns3::olsr::RoutingTableEntry> > ns3::olsr::RoutingProtocol::GetRoutingTableEntries() const [member function]
+    ## olsr-routing-protocol.h (module 'olsr'): std::vector<ns3::olsr::RoutingTableEntry, std::allocator<ns3::olsr::RoutingTableEntry>> ns3::olsr::RoutingProtocol::GetRoutingTableEntries() const [member function]
     cls.add_method('GetRoutingTableEntries', 
                    'std::vector< ns3::olsr::RoutingTableEntry >', 
                    [], 
@@ -8147,12 +8153,12 @@
     cls.add_method('AssignStreams', 
                    'int64_t', 
                    [param('int64_t', 'stream')])
-    ## olsr-routing-protocol.h (module 'olsr'): std::set<unsigned int, std::less<unsigned int>, std::allocator<unsigned int> > ns3::olsr::RoutingProtocol::GetInterfaceExclusions() const [member function]
+    ## olsr-routing-protocol.h (module 'olsr'): std::set<unsigned int, std::less<unsigned int>, std::allocator<unsigned int>> ns3::olsr::RoutingProtocol::GetInterfaceExclusions() const [member function]
     cls.add_method('GetInterfaceExclusions', 
                    'std::set< unsigned int >', 
                    [], 
                    is_const=True)
-    ## olsr-routing-protocol.h (module 'olsr'): void ns3::olsr::RoutingProtocol::SetInterfaceExclusions(std::set<unsigned int, std::less<unsigned int>, std::allocator<unsigned int> > exceptions) [member function]
+    ## olsr-routing-protocol.h (module 'olsr'): void ns3::olsr::RoutingProtocol::SetInterfaceExclusions(std::set<unsigned int, std::less<unsigned int>, std::allocator<unsigned int>> exceptions) [member function]
     cls.add_method('SetInterfaceExclusions', 
                    'void', 
                    [param('std::set< unsigned int >', 'exceptions')])
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/olsr/bindings/modulegen__gcc_LP64.py ns-3.36/src/olsr/bindings/modulegen__gcc_LP64.py
--- ns-3.35/src/olsr/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/olsr/bindings/modulegen__gcc_LP64.py	2022-04-30 18:23:58.118734800 -0700
@@ -71,6 +71,8 @@
     module.add_class('EventGarbageCollector', import_from_module='ns.core')
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'], import_from_module='ns.core')
     ## hash.h (module 'core'): ns3::Hasher [class]
     module.add_class('Hasher', import_from_module='ns.core')
     ## inet6-socket-address.h (module 'network'): ns3::Inet6SocketAddress [class]
@@ -152,8 +154,6 @@
     typehandlers.add_type_alias('std::vector< ns3::Ptr< ns3::Node > > const_iterator', 'ns3::NodeContainer::Iterator')
     typehandlers.add_type_alias('std::vector< ns3::Ptr< ns3::Node > > const_iterator*', 'ns3::NodeContainer::Iterator*')
     typehandlers.add_type_alias('std::vector< ns3::Ptr< ns3::Node > > const_iterator&', 'ns3::NodeContainer::Iterator&')
-    ## non-copyable.h (module 'core'): ns3::NonCopyable [class]
-    module.add_class('NonCopyable', destructor_visibility='protected', import_from_module='ns.core')
     ## object-base.h (module 'core'): ns3::ObjectBase [class]
     module.add_class('ObjectBase', allow_subclassing=True, import_from_module='ns.core')
     ## object.h (module 'core'): ns3::ObjectDeleter [struct]
@@ -246,29 +246,29 @@
     module.add_class('RandomVariableStream', import_from_module='ns.core', parent=root_module['ns3::Object'])
     ## random-variable-stream.h (module 'core'): ns3::SequentialRandomVariable [class]
     module.add_class('SequentialRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv4MulticastRoute', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv4Route', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv4Route>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::OutputStreamWrapper', 'ns3::empty', 'ns3::DefaultDeleter<ns3::OutputStreamWrapper>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
     ## socket.h (module 'network'): ns3::Socket [class]
     module.add_class('Socket', import_from_module='ns.network', parent=root_module['ns3::Object'])
@@ -449,8 +449,8 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['bool', 'ns3::Ptr<ns3::Socket>', 'const ns3::Address &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['ns3::ObjectBase *', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, const ns3::olsr::PacketHeader &, const std::vector<ns3::olsr::MessageHeader, std::allocator<ns3::olsr::MessageHeader> > &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'const ns3::olsr::PacketHeader &', 'const std::vector<ns3::olsr::MessageHeader, std::allocator<ns3::olsr::MessageHeader> > &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, const ns3::olsr::PacketHeader &, const std::vector<ns3::olsr::MessageHeader, std::allocator<ns3::olsr::MessageHeader>> &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'const ns3::olsr::PacketHeader &', 'const std::vector<ns3::olsr::MessageHeader, std::allocator<ns3::olsr::MessageHeader>> &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<const ns3::Packet>, unsigned short, const ns3::Address &, const ns3::Address &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'const ns3::Address &', 'const ns3::Address &', 'ns3::NetDevice::PacketType', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
@@ -465,7 +465,7 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## ipv4-list-routing.h (module 'internet'): ns3::Ipv4ListRouting [class]
     module.add_class('Ipv4ListRouting', import_from_module='ns.internet', parent=root_module['ns3::Ipv4RoutingProtocol'])
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     module.add_container('std::vector< ns3::Ipv6Address >', 'ns3::Ipv6Address', container_type='vector')
     module.add_container('std::map< unsigned int, unsigned int >', ('unsigned int', 'unsigned int'), container_type='map')
     module.add_container('std::vector< unsigned int >', 'unsigned int', container_type='vector')
@@ -698,7 +698,6 @@
     register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
     register_Ns3Mac8Address_methods(root_module, root_module['ns3::Mac8Address'])
     register_Ns3NodeContainer_methods(root_module, root_module['ns3::NodeContainer'])
-    register_Ns3NonCopyable_methods(root_module, root_module['ns3::NonCopyable'])
     register_Ns3ObjectBase_methods(root_module, root_module['ns3::ObjectBase'])
     register_Ns3ObjectDeleter_methods(root_module, root_module['ns3::ObjectDeleter'])
     register_Ns3ObjectFactory_methods(root_module, root_module['ns3::ObjectFactory'])
@@ -806,7 +805,7 @@
     register_Ns3AddressValue_methods(root_module, root_module['ns3::AddressValue'])
     register_Ns3CallbackImpl__Bool_Ns3Ptr__lt__ns3Socket__gt___Const_ns3Address___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Ns3ObjectBase___star___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3CallbackImpl__Void_Const_ns3OlsrPacketHeader___amp___Const_stdVector__lt__ns3OlsrMessageHeader__stdAllocator__lt__ns3OlsrMessageHeader__gt_____gt_____amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, const ns3::olsr::PacketHeader &, const std::vector<ns3::olsr::MessageHeader, std::allocator<ns3::olsr::MessageHeader> > &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Const_ns3OlsrPacketHeader___amp___Const_stdVector__lt__ns3OlsrMessageHeader__stdAllocator__lt__ns3OlsrMessageHeader__gt____gt_____amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, const ns3::olsr::PacketHeader &, const std::vector<ns3::olsr::MessageHeader, std::allocator<ns3::olsr::MessageHeader>> &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3NetDevice__gt___Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_short_Const_ns3Address___amp___Const_ns3Address___amp___Ns3NetDevicePacketType_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<const ns3::Packet>, unsigned short, const ns3::Address &, const ns3::Address &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3NetDevice__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::NetDevice>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3Socket__gt___Const_ns3Address___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
@@ -2534,12 +2533,6 @@
                    is_const=True)
     return
 
-def register_Ns3NonCopyable_methods(root_module, cls):
-    ## non-copyable.h (module 'core'): ns3::NonCopyable::NonCopyable() [constructor]
-    cls.add_constructor([], 
-                        visibility='protected')
-    return
-
 def register_Ns3ObjectBase_methods(root_module, cls):
     ## object-base.h (module 'core'): ns3::ObjectBase::ObjectBase() [constructor]
     cls.add_constructor([])
@@ -3417,8 +3410,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -3641,14 +3634,14 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('>=')
     cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_unary_numeric_operator('-')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
     cls.add_constructor([])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(double const value) [constructor]
@@ -3667,6 +3660,8 @@
     cls.add_constructor([param('long unsigned int const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int const v) [constructor]
     cls.add_constructor([param('long long unsigned int const', 'v')])
+    ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int128_t const v) [constructor]
+    cls.add_constructor([param('int128_t const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t const hi, uint64_t const lo) [constructor]
     cls.add_constructor([param('int64_t const', 'hi'), param('uint64_t const', 'lo')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [constructor]
@@ -4106,86 +4101,86 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Ipv4MulticastRoute_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv4MulticastRoute__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter< ns3::Ipv4MulticastRoute > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Ipv4Route_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv4Route__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter< ns3::Ipv4Route > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3OutputStreamWrapper_Ns3Empty_Ns3DefaultDeleter__lt__ns3OutputStreamWrapper__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter< ns3::OutputStreamWrapper > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
@@ -4308,7 +4303,7 @@
                    'uint8_t', 
                    [param('uint8_t', 'ipTos')], 
                    is_static=True)
-    ## socket.h (module 'network'): void ns3::Socket::Ipv6JoinGroup(ns3::Ipv6Address address, ns3::Socket::Ipv6MulticastFilterMode filterMode, std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address> > sourceAddresses) [member function]
+    ## socket.h (module 'network'): void ns3::Socket::Ipv6JoinGroup(ns3::Ipv6Address address, ns3::Socket::Ipv6MulticastFilterMode filterMode, std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address>> sourceAddresses) [member function]
     cls.add_method('Ipv6JoinGroup', 
                    'void', 
                    [param('ns3::Ipv6Address', 'address'), param('ns3::Socket::Ipv6MulticastFilterMode', 'filterMode'), param('std::vector< ns3::Ipv6Address >', 'sourceAddresses')], 
@@ -5910,7 +5905,7 @@
                    'ns3::Ipv4Address', 
                    [], 
                    is_const=True)
-    ## ipv4-route.h (module 'internet'): std::map<unsigned int, unsigned int, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, unsigned int> > > ns3::Ipv4MulticastRoute::GetOutputTtlMap() const [member function]
+    ## ipv4-route.h (module 'internet'): std::map<unsigned int, unsigned int, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, unsigned int>>> ns3::Ipv4MulticastRoute::GetOutputTtlMap() const [member function]
     cls.add_method('GetOutputTtlMap', 
                    'std::map< unsigned int, unsigned int >', 
                    [], 
@@ -6051,7 +6046,7 @@
     cls.add_method('AddHostRouteTo', 
                    'void', 
                    [param('ns3::Ipv4Address', 'dest'), param('uint32_t', 'interface'), param('uint32_t', 'metric', default_value='0')])
-    ## ipv4-static-routing.h (module 'internet'): void ns3::Ipv4StaticRouting::AddMulticastRoute(ns3::Ipv4Address origin, ns3::Ipv4Address group, uint32_t inputInterface, std::vector<unsigned int, std::allocator<unsigned int> > outputInterfaces) [member function]
+    ## ipv4-static-routing.h (module 'internet'): void ns3::Ipv4StaticRouting::AddMulticastRoute(ns3::Ipv4Address origin, ns3::Ipv4Address group, uint32_t inputInterface, std::vector<unsigned int, std::allocator<unsigned int>> outputInterfaces) [member function]
     cls.add_method('AddMulticastRoute', 
                    'void', 
                    [param('ns3::Ipv4Address', 'origin'), param('ns3::Ipv4Address', 'group'), param('uint32_t', 'inputInterface'), param('std::vector< unsigned int >', 'outputInterfaces')])
@@ -6482,10 +6477,16 @@
     cls.add_method('ExtractNeighborIndex', 
                    'uint32_t', 
                    [param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetEpoch() const [member function]
+    cls.add_method('GetEpoch', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() const [member function]
     cls.add_method('GetRemainingBits', 
                    'uint32_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -6496,6 +6497,10 @@
                    'uint32_t', 
                    [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
+    ## nix-vector.h (module 'network'): void ns3::NixVector::SetEpoch(uint32_t epoch) [member function]
+    cls.add_method('SetEpoch', 
+                   'void', 
+                   [param('uint32_t', 'epoch')])
     return
 
 def register_Ns3Node_methods(root_module, cls):
@@ -6872,10 +6877,11 @@
                    'uint32_t', 
                    [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) const [member function]
     cls.add_method('SetNixVector', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')], 
+                   is_const=True)
     ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
     cls.add_method('ToString', 
                    'std::string', 
@@ -7083,22 +7089,22 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3CallbackImpl__Void_Const_ns3OlsrPacketHeader___amp___Const_stdVector__lt__ns3OlsrMessageHeader__stdAllocator__lt__ns3OlsrMessageHeader__gt_____gt_____amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, const ns3::olsr::PacketHeader &, const std::vector<ns3::olsr::MessageHeader, std::allocator<ns3::olsr::MessageHeader> > &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+def register_Ns3CallbackImpl__Void_Const_ns3OlsrPacketHeader___amp___Const_stdVector__lt__ns3OlsrMessageHeader__stdAllocator__lt__ns3OlsrMessageHeader__gt____gt_____amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, const ns3::olsr::PacketHeader &, const std::vector<ns3::olsr::MessageHeader, std::allocator<ns3::olsr::MessageHeader>> &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, const ns3::olsr::PacketHeader &, const std::vector<ns3::olsr::MessageHeader, std::allocator<ns3::olsr::MessageHeader> > &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, const ns3::olsr::PacketHeader &, const std::vector<ns3::olsr::MessageHeader, std::allocator<ns3::olsr::MessageHeader> > &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, const ns3::olsr::PacketHeader &, const std::vector<ns3::olsr::MessageHeader, std::allocator<ns3::olsr::MessageHeader>> &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, const ns3::olsr::PacketHeader &, const std::vector<ns3::olsr::MessageHeader, std::allocator<ns3::olsr::MessageHeader>> &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
     cls.add_constructor([param('ns3::CallbackImpl< void, ns3::olsr::PacketHeader const &, std::vector< ns3::olsr::MessageHeader, std::allocator< ns3::olsr::MessageHeader > > const, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, const ns3::olsr::PacketHeader &, const std::vector<ns3::olsr::MessageHeader, std::allocator<ns3::olsr::MessageHeader> > &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, const ns3::olsr::PacketHeader &, const std::vector<ns3::olsr::MessageHeader, std::allocator<ns3::olsr::MessageHeader>> &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
     cls.add_method('DoGetTypeid', 
                    'std::string', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, const ns3::olsr::PacketHeader &, const std::vector<ns3::olsr::MessageHeader, std::allocator<ns3::olsr::MessageHeader> > &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, const ns3::olsr::PacketHeader &, const std::vector<ns3::olsr::MessageHeader, std::allocator<ns3::olsr::MessageHeader>> &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
     cls.add_method('GetTypeid', 
                    'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, const ns3::olsr::PacketHeader &, const std::vector<ns3::olsr::MessageHeader, std::allocator<ns3::olsr::MessageHeader> > &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::olsr::PacketHeader const & arg0, std::vector<ns3::olsr::MessageHeader, std::allocator<ns3::olsr::MessageHeader> > const & arg1) [member operator]
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, const ns3::olsr::PacketHeader &, const std::vector<ns3::olsr::MessageHeader, std::allocator<ns3::olsr::MessageHeader>> &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::olsr::PacketHeader const & arg0, std::vector<ns3::olsr::MessageHeader, std::allocator<ns3::olsr::MessageHeader>> const & arg1) [member operator]
     cls.add_method('operator()', 
                    'void', 
                    [param('ns3::olsr::PacketHeader const &', 'arg0'), param('std::vector< ns3::olsr::MessageHeader > const &', 'arg1')], 
@@ -7896,7 +7902,7 @@
     cls.add_method('FindMprSelectorTuple', 
                    'ns3::olsr::MprSelectorTuple *', 
                    [param('ns3::Ipv4Address const &', 'mainAddr')])
-    ## olsr-state.h (module 'olsr'): std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address> > ns3::olsr::OlsrState::FindNeighborInterfaces(ns3::Ipv4Address const & neighborMainAddr) const [member function]
+    ## olsr-state.h (module 'olsr'): std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address>> ns3::olsr::OlsrState::FindNeighborInterfaces(ns3::Ipv4Address const & neighborMainAddr) const [member function]
     cls.add_method('FindNeighborInterfaces', 
                    'std::vector< ns3::Ipv4Address >', 
                    [param('ns3::Ipv4Address const &', 'neighborMainAddr')], 
@@ -8108,7 +8114,7 @@
     cls.add_method('Dump', 
                    'void', 
                    [])
-    ## olsr-routing-protocol.h (module 'olsr'): std::vector<ns3::olsr::RoutingTableEntry, std::allocator<ns3::olsr::RoutingTableEntry> > ns3::olsr::RoutingProtocol::GetRoutingTableEntries() const [member function]
+    ## olsr-routing-protocol.h (module 'olsr'): std::vector<ns3::olsr::RoutingTableEntry, std::allocator<ns3::olsr::RoutingTableEntry>> ns3::olsr::RoutingProtocol::GetRoutingTableEntries() const [member function]
     cls.add_method('GetRoutingTableEntries', 
                    'std::vector< ns3::olsr::RoutingTableEntry >', 
                    [], 
@@ -8147,12 +8153,12 @@
     cls.add_method('AssignStreams', 
                    'int64_t', 
                    [param('int64_t', 'stream')])
-    ## olsr-routing-protocol.h (module 'olsr'): std::set<unsigned int, std::less<unsigned int>, std::allocator<unsigned int> > ns3::olsr::RoutingProtocol::GetInterfaceExclusions() const [member function]
+    ## olsr-routing-protocol.h (module 'olsr'): std::set<unsigned int, std::less<unsigned int>, std::allocator<unsigned int>> ns3::olsr::RoutingProtocol::GetInterfaceExclusions() const [member function]
     cls.add_method('GetInterfaceExclusions', 
                    'std::set< unsigned int >', 
                    [], 
                    is_const=True)
-    ## olsr-routing-protocol.h (module 'olsr'): void ns3::olsr::RoutingProtocol::SetInterfaceExclusions(std::set<unsigned int, std::less<unsigned int>, std::allocator<unsigned int> > exceptions) [member function]
+    ## olsr-routing-protocol.h (module 'olsr'): void ns3::olsr::RoutingProtocol::SetInterfaceExclusions(std::set<unsigned int, std::less<unsigned int>, std::allocator<unsigned int>> exceptions) [member function]
     cls.add_method('SetInterfaceExclusions', 
                    'void', 
                    [param('std::set< unsigned int >', 'exceptions')])
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/olsr/CMakeLists.txt ns-3.36/src/olsr/CMakeLists.txt
--- ns-3.35/src/olsr/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/olsr/CMakeLists.txt	2022-04-30 18:23:58.118734800 -0700
@@ -0,0 +1,22 @@
+build_lib(
+  LIBNAME olsr
+  SOURCE_FILES
+    helper/olsr-helper.cc
+    model/olsr-header.cc
+    model/olsr-routing-protocol.cc
+    model/olsr-state.cc
+  HEADER_FILES
+    helper/olsr-helper.h
+    model/olsr-header.h
+    model/olsr-repositories.h
+    model/olsr-routing-protocol.h
+    model/olsr-state.h
+  LIBRARIES_TO_LINK ${libinternet}
+  TEST_SOURCES
+    test/regression-test-suite.cc
+    test/bug780-test.cc
+    test/hello-regression-test.cc
+    test/olsr-header-test-suite.cc
+    test/olsr-routing-protocol-test-suite.cc
+    test/tc-regression-test.cc
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/olsr/examples/CMakeLists.txt ns-3.36/src/olsr/examples/CMakeLists.txt
--- ns-3.35/src/olsr/examples/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/olsr/examples/CMakeLists.txt	2022-04-30 18:23:58.118734800 -0700
@@ -0,0 +1,21 @@
+build_lib_example(
+  NAME olsr-hna
+  SOURCE_FILES olsr-hna.cc
+  LIBRARIES_TO_LINK
+    ${libcore}
+    ${libmobility}
+    ${libwifi}
+    ${libcsma}
+    ${libolsr}
+)
+
+build_lib_example(
+  NAME simple-point-to-point-olsr
+  SOURCE_FILES simple-point-to-point-olsr.cc
+  LIBRARIES_TO_LINK
+    ${libpoint-to-point}
+    ${libinternet}
+    ${libolsr}
+    ${libapplications}
+    ${libwifi}
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/olsr/examples/olsr-hna.cc ns-3.36/src/olsr/examples/olsr-hna.cc
--- ns-3.35/src/olsr/examples/olsr-hna.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/olsr/examples/olsr-hna.cc	2022-04-30 18:23:58.118734800 -0700
@@ -35,19 +35,19 @@
 // If no HNA message is generated by B, a will not be able to form a route to C.
 // This can be verified as follows:
 //
-// ./waf --run olsr-hna
+// ./ns3 run olsr-hna
 //
 // There are two ways to make a node to generate HNA messages.
 //
 // One way is to use olsr::RoutingProtocol::SetRoutingTableAssociation ()
 // to use which you may run:
 //
-// ./waf --run "olsr-hna --assocMethod1=1"
+// ./ns3 run "olsr-hna --assocMethod1=1"
 //
 // The other way is to use olsr::RoutingProtocol::AddHostNetworkAssociation ()
 // to use which you may run:
 //
-// ./waf --run "olsr-hna --assocMethod2=1"
+// ./ns3 run "olsr-hna --assocMethod2=1"
 //
 
 #include <iostream>
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/olsr/examples/wscript ns-3.36/src/olsr/examples/wscript
--- ns-3.35/src/olsr/examples/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/olsr/examples/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,10 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    obj = bld.create_ns3_program('simple-point-to-point-olsr',
-                                 ['point-to-point', 'internet', 'olsr', 'applications', 'wifi'])
-    obj.source = 'simple-point-to-point-olsr.cc'
-
-    obj = bld.create_ns3_program('olsr-hna',
-                                 ['core', 'mobility', 'wifi', 'csma', 'olsr'])
-    obj.source = 'olsr-hna.cc'
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/olsr/wscript ns-3.36/src/olsr/wscript
--- ns-3.35/src/olsr/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/olsr/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,43 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    module = bld.create_ns3_module('olsr', ['internet'])
-    module.includes = '.'
-    module.source = [
-        'model/olsr-header.cc',
-        'model/olsr-state.cc',
-        'model/olsr-routing-protocol.cc',
-        'helper/olsr-helper.cc',
-        ]
-
-    module_test = bld.create_ns3_module_test_library('olsr')
-    module_test.source = [
-        'test/bug780-test.cc',
-        'test/hello-regression-test.cc',
-        'test/olsr-header-test-suite.cc',
-        'test/regression-test-suite.cc',
-        'test/olsr-routing-protocol-test-suite.cc',
-        'test/tc-regression-test.cc',
-        ]
-
-    # Tests encapsulating example programs should be listed here
-    if (bld.env['ENABLE_EXAMPLES']):
-        module_test.source.extend([
-        #   'test/olsr-examples-test-suite.cc',
-            ])
-    
-    headers = bld(features='ns3header')
-    headers.module = 'olsr'
-    headers.source = [
-        'model/olsr-routing-protocol.h',
-        'model/olsr-header.h',
-        'model/olsr-state.h',
-        'model/olsr-repositories.h',
-        'helper/olsr-helper.h',
-        ]
-
-
-    if bld.env['ENABLE_EXAMPLES']:
-        bld.recurse('examples')
-
-    bld.ns3_python_bindings()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/openflow/CMakeLists.txt ns-3.36/src/openflow/CMakeLists.txt
--- ns-3.35/src/openflow/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/openflow/CMakeLists.txt	2022-04-30 18:23:58.118734800 -0700
@@ -0,0 +1,68 @@
+set(NS3_WITH_OPENFLOW
+    ""
+    CACHE PATH
+          "Build with Openflow support"
+)
+set(NS3_OPENFLOW
+    "OFF"
+    CACHE INTERNAL
+          "ON if Openflow is found in NS3_WITH_OPENFLOW"
+)
+
+find_external_library(
+  DEPENDENCY_NAME openflow
+  HEADER_NAME openflow.h
+  LIBRARY_NAME openflow
+  SEARCH_PATHS ${NS3_WITH_OPENFLOW}
+)
+
+if((NOT
+    openflow_FOUND)
+   AND (NOT
+        ${openflow_FOUND})
+)
+  message(
+    ${HIGHLIGHTED_STATUS}
+    "Skipping src/openflow"
+  )
+  return()
+endif()
+
+check_include_file_cxx(
+  boost/static_assert.hpp
+  BOOST_STATIC_ASSERT
+)
+if(NOT
+   BOOST_STATIC_ASSERT
+)
+  message(STATUS "Openflow requires Boost static_assert.hpp")
+  return()
+endif()
+
+include_directories(${openflow_INCLUDE_DIRS})
+add_definitions(
+  -DNS3_OPENFLOW
+  -DENABLE_OPENFLOW
+)
+set(NS3_OPENFLOW
+    "ON"
+    CACHE INTERNAL
+          "ON if Openflow is found in NS3_WITH_OPENFLOW"
+)
+
+add_compile_options(-Wno-stringop-truncation)
+
+build_lib(
+  LIBNAME openflow
+  SOURCE_FILES
+    helper/openflow-switch-helper.cc
+    model/openflow-interface.cc
+    model/openflow-switch-net-device.cc
+  HEADER_FILES
+    helper/openflow-switch-helper.h
+    model/openflow-interface.h
+    model/openflow-switch-net-device.h
+  LIBRARIES_TO_LINK ${libinternet}
+                    ${openflow_LIBRARIES}
+  TEST_SOURCES test/openflow-switch-test-suite.cc
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/openflow/doc/openflow-switch.rst ns-3.36/src/openflow/doc/openflow-switch.rst
--- ns-3.35/src/openflow/doc/openflow-switch.rst	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/openflow/doc/openflow-switch.rst	2022-04-30 18:23:58.122734800 -0700
@@ -138,7 +138,7 @@
 
 1. Obtain the OFSID code.
    An ns-3 specific OFSID branch is provided to ensure
-   operation with ns-3. Use mercurial to download this branch and waf to build 
+   operation with ns-3. Use mercurial to download this branch and ns3 to build
    the library::
 
      $ hg clone http://code.nsnam.org/openflow
@@ -146,14 +146,14 @@
 
    From the "openflow" directory, run::
      
-     $ ./waf configure
-     $ ./waf build
+     $ ./ns3 configure
+     $ ./ns3 build
 
 2. Your OFSID is now built into a libopenflow.a library!
    To link to an ns-3 build with this OpenFlow switch module, run from the ns-3-dev
    (or whatever you have named your distribution)::
 
-     $ ./waf configure --enable-examples --enable-tests --with-openflow=path/to/openflow
+     $ ./ns3 configure --enable-examples --enable-tests --with-openflow=path/to/openflow
 
 3. Under ``---- Summary of optional NS-3 features:`` you should see:
 
@@ -163,7 +163,7 @@
 
    indicating the library has been linked to ns-3. Run::
 
-     $ ./waf build
+     $ ./ns3 build
 
 to build ns-3 and activate the OpenFlowSwitch module in ns-3.
 
@@ -172,11 +172,11 @@
 For an example demonstrating its use in a simple learning controller/switch, 
 run::
 
-  $ ./waf --run openflow-switch
+  $ ./ns3 run openflow-switch
 
 To see it in detailed logging, run::
 
-  $ ./waf --run "openflow-switch -v"
+  $ ./ns3 run "openflow-switch -v"
 
 
 Helpers
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/openflow/examples/CMakeLists.txt ns-3.36/src/openflow/examples/CMakeLists.txt
--- ns-3.35/src/openflow/examples/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/openflow/examples/CMakeLists.txt	2022-04-30 18:23:58.122734800 -0700
@@ -0,0 +1,9 @@
+build_lib_example(
+  NAME openflow-switch
+  SOURCE_FILES openflow-switch.cc
+  LIBRARIES_TO_LINK
+    ${libopenflow}
+    ${libinternet}
+    ${libcsma}
+    ${libapplications}
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/openflow/examples/wscript ns-3.36/src/openflow/examples/wscript
--- ns-3.35/src/openflow/examples/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/openflow/examples/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,6 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-   obj = bld.create_ns3_program('openflow-switch',
-                                ['openflow', 'csma', 'internet', 'applications'])
-   obj.source = 'openflow-switch.cc'
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/openflow/model/openflow-interface.h ns-3.36/src/openflow/model/openflow-interface.h
--- ns-3.35/src/openflow/model/openflow-interface.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/openflow/model/openflow-interface.h	2022-04-30 18:23:58.122734800 -0700
@@ -111,6 +111,7 @@
 namespace ofi {
 
 /**
+ * \ingroup openflow
  * \brief Port and its metadata.
  *
  * We need to store port metadata, because OpenFlow dictates that there
@@ -134,16 +135,27 @@
 
   uint32_t config;            ///< Some subset of OFPPC_* flags.
   uint32_t state;             ///< Some subset of OFPPS_* flags.
-  Ptr<NetDevice> netdev;
-  unsigned long long int rx_packets, tx_packets;
-  unsigned long long int rx_bytes, tx_bytes;
-  unsigned long long int tx_dropped;
-  unsigned long long int mpls_ttl0_dropped;
+  Ptr<NetDevice> netdev;      ///< NetDevice pointer
+  unsigned long long int rx_packets;  //!< Counter of Rx packets
+  unsigned long long int tx_packets;  //!< Counter of Tx packets
+  unsigned long long int rx_bytes;    //!< Counter of Rx bytes
+  unsigned long long int tx_bytes;    //!< Counter of Tx bytes
+  unsigned long long int tx_dropped;  //!< Counter of Tx dropped packets
+  unsigned long long int mpls_ttl0_dropped; //!< Counter of packets dropped due to MPLS TTL
 };
 
+/**
+ * \ingroup openflow
+ * OpenFlow statistics
+ */
 class Stats
 {
 public:
+  /**
+   * Constructor
+   * \param _type OpenFlow stats type.
+   * \param body_len Stat body length.
+   */
   Stats (ofp_stats_types _type, size_t body_len);
 
   /**
@@ -180,15 +192,16 @@
    */
   struct FlowStatsState
   {
-    int table_idx;
-    sw_table_position position;
-    ofp_flow_stats_request rq;
-    time_t now;
+    int table_idx;      //!< Table index
+    sw_table_position position; //!< Table position
+    ofp_flow_stats_request rq;  //!< Stats requests
+    time_t now; //!< Actual time
 
-    ofpbuf *buffer;
+    ofpbuf *buffer; //!< Buffer
   };
 
   /**
+   * \ingroup openflow
    * \brief State of the PortStats request/reply.
    */
   struct PortStatsState
@@ -197,27 +210,52 @@
     uint32_t *ports;    ///< Array of ports in network byte order
   };
 
-  ofp_stats_types type;
+  ofp_stats_types type; //!< Status type
 private:
+  /**
+   * Dumps the stats description
+   * \param [in] state The state.
+   * \param [out] buffer Output buffer.
+   * \return zero on success
+   */
   int DescStatsDump (void *state, ofpbuf *buffer);
 
+  /**
+   * @{
+   * Initialize the stats.
+   * \param body Body member of the struct ofp_stats_request.
+   * \param body_len Length of the body member.
+   * \param state State information.
+   * \return 0 if successful, otherwise a negative error code.
+   */
   int FlowStatsInit (const void *body, int body_len, void **state);
-  int (*FlowDumpCallback)(sw_flow *flow, void *state);
-  int FlowStatsDump (Ptr<OpenFlowSwitchNetDevice> dp, FlowStatsState *s, ofpbuf *buffer);
-
   int AggregateStatsInit (const void *body, int body_len, void **state);
+  int PortStatsInit (const void *body, int body_len, void **state);
+  /** @} */
+
+  /// Flow dump callback functor
+  int (*FlowDumpCallback)(sw_flow *flow, void *state);
+  /// Aggregate dump callback functor
   int (*AggregateDumpCallback)(sw_flow *flow, void *state);
-  int AggregateStatsDump (Ptr<OpenFlowSwitchNetDevice> dp, ofp_aggregate_stats_request *s, ofpbuf *buffer);
 
+  /**
+   * @{
+   * Dump the stats.
+   * \param dp OpenFlow NetDevice.
+   * \param state State.
+   * \param [out] buffer output buffer.
+   * \return 0 if successful
+   */
+  int FlowStatsDump (Ptr<OpenFlowSwitchNetDevice> dp, FlowStatsState *state, ofpbuf *buffer);
+  int AggregateStatsDump (Ptr<OpenFlowSwitchNetDevice> dp, ofp_aggregate_stats_request *state, ofpbuf *buffer);
   int TableStatsDump (Ptr<OpenFlowSwitchNetDevice> dp, void *state, ofpbuf *buffer);
-
-  int PortStatsInit (const void *body, int body_len, void **state);
-  int PortStatsDump (Ptr<OpenFlowSwitchNetDevice> dp, PortStatsState *s, ofpbuf *buffer);
-
+  int PortStatsDump (Ptr<OpenFlowSwitchNetDevice> dp, PortStatsState *state, ofpbuf *buffer);
   int PortTableStatsDump (Ptr<OpenFlowSwitchNetDevice> dp, void *state, ofpbuf *buffer);
+  /** @} */
 };
 
 /**
+ * \ingroup openflow
  * \brief Class for handling flow table actions.
  */
 struct Action
@@ -251,6 +289,7 @@
 };
 
 /**
+ * \ingroup openflow
  * \brief Class for handling virtual port table actions.
  */
 struct VPortAction
@@ -283,6 +322,7 @@
 };
 
 /**
+ * \ingroup openflow
  * \brief Class for handling Ericsson Vendor-defined actions.
  */
 struct EricssonAction
@@ -314,6 +354,7 @@
 };
 
 /**
+ * \ingroup openflow
  * \brief Callback for a stats dump request.
  */
 struct StatsDumpCallback
@@ -326,6 +367,7 @@
 };
 
 /**
+ * \ingroup openflow
  * \brief Packet Metadata, allows us to track the packet's metadata as it passes through the switch.
  */
 struct SwitchPacketMetadata
@@ -338,6 +380,7 @@
 };
 
 /**
+ * \ingroup openflow
  * \brief An interface for a Controller of OpenFlowSwitchNetDevices
  *
  * Follows the OpenFlow specification for a controller.
@@ -424,11 +467,13 @@
    */
   uint8_t GetPacketType (ofpbuf* buffer);
 
+  /// OpenFlowSwitchNetDevice container type
   typedef std::set<Ptr<OpenFlowSwitchNetDevice> > Switches_t;
   Switches_t m_switches;  ///< The collection of switches registered to this controller.
 };
 
 /**
+ * \ingroup openflow
  * Demonstration of a Drop controller. When a connected switch
  * passes it a packet the switch doesn't recognize, the controller
  * configures the switch to make a flow that drops alike packets.
@@ -446,6 +491,7 @@
 };
 
 /**
+ * \ingroup openflow
  * Demonstration of a Learning controller. When a connected switch
  * passes it a packet the switch doesn't recognize, the controller
  * delves into its learned states and figures out if we know what
@@ -469,11 +515,13 @@
   void ReceiveFromSwitch (Ptr<OpenFlowSwitchNetDevice> swtch, ofpbuf* buffer);
 
 protected:
+  /// Learned state
   struct LearnedState
   {
     uint32_t port;                      ///< Learned port.
   };
   Time m_expirationTime;                ///< Time it takes for learned MAC state entry/created flow to expire.
+  /// Learned state type
   typedef std::map<Mac48Address, LearnedState> LearnState_t;
   LearnState_t m_learnState;            ///< Learned state data.
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/openflow/model/openflow-switch-net-device.h ns-3.36/src/openflow/model/openflow-switch-net-device.h
--- ns-3.35/src/openflow/model/openflow-switch-net-device.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/openflow/model/openflow-switch-net-device.h	2022-04-30 18:23:58.122734800 -0700
@@ -80,6 +80,13 @@
  */
 
 /**
+ * \ingroup openflow
+ * \ingroup tests
+ * \defgroup openflow-tests OpenFlow module tests
+ */
+
+
+/**
  * \ingroup openflow 
  * \brief A net device that switches multiple LAN segments via an OpenFlow-compatible flow table
  */
@@ -136,7 +143,7 @@
    *
    * \param switchPort The port to add.
    * \return 0 if everything's ok, otherwise an error number.
-   * \sa #EXFULL
+   * Possible error numbers: EXFULL
    */
   int AddSwitchPort (Ptr<NetDevice> switchPort);
 
@@ -148,7 +155,7 @@
    * don't have an understood use [perhaps it may have to do with
    * MPLS integration].
    *
-   * \sa #EINVAL
+   * Possible error numbers: EINVAL
    *
    * \param ovpm The data for adding a virtual port.
    * \return 0 if everything's ok, otherwise an error number.
@@ -258,7 +265,7 @@
    * \param protocol The protocol defining the Packet.
    * \param src The source address of the Packet.
    * \param dst The destination address of the Packet.
-   * \param PacketType Type of the packet.
+   * \param packetType Type of the packet.
    */
   void ReceiveFromDevice (Ptr<NetDevice> netdev, Ptr<const Packet> packet, uint16_t protocol, const Address& src, const Address& dst, PacketType packetType);
 
@@ -278,7 +285,7 @@
   /**
    * Add a flow.
    *
-   * \sa #ENOMEM, #ENOBUFS, #ESRCH
+   * Possible error numbers: ENOMEM, ENOBUFS, ESRCH
    *
    * \param ofm The flow data to add.
    * \return 0 if everything's ok, otherwise an error number.
@@ -307,6 +314,7 @@
    * Sends a copy of the Packet over the provided output port
    *
    * \param packet_uid Packet UID; used to fetch the packet and its metadata.
+   * \param out_port Output port.
    */
   void OutputPacket (uint32_t packet_uid, int out_port);
 
@@ -477,15 +485,16 @@
   int ReceivePacketOut (const void *msg);
   int ReceiveFlow (const void *msg);
   int ReceivePortMod (const void *msg);
-  int ReceiveStatsRequest (const void *oh);
-  int ReceiveEchoRequest (const void *oh);
-  int ReceiveEchoReply (const void *oh);
+  int ReceiveStatsRequest (const void *msg);
+  int ReceiveEchoRequest (const void *msg);
+  int ReceiveEchoReply (const void *msg);
   int ReceiveVPortMod (const void *msg);
   int ReceiveVPortTableFeaturesRequest (const void *msg);
   /**@}*/
 
-  /// Callbacks
+  /// Rx Callback
   NetDevice::ReceiveCallback m_rxCallback;
+  /// Promiscuopus Rx Callback
   NetDevice::PromiscReceiveCallback m_promiscRxCallback;
 
   Mac48Address m_address;               ///< Address of this device.
@@ -494,9 +503,11 @@
   uint32_t m_ifIndex;                   ///< Interface Index
   uint16_t m_mtu;                       ///< Maximum Transmission Unit
 
+  /// PacketData type
   typedef std::map<uint32_t,ofi::SwitchPacketMetadata> PacketData_t;
   PacketData_t m_packetData;            ///< Packet data
 
+  /// Switch's port type
   typedef std::vector<ofi::Port> Ports_t;
   Ports_t m_ports;                      ///< Switch's ports
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/openflow/test/openflow-switch-test-suite.cc ns-3.36/src/openflow/test/openflow-switch-test-suite.cc
--- ns-3.35/src/openflow/test/openflow-switch-test-suite.cc	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/openflow/test/openflow-switch-test-suite.cc	2022-04-30 18:23:58.122734800 -0700
@@ -29,7 +29,12 @@
 // to use the using directive to access the ns3 namespace directly
 using namespace ns3;
 
-// This is an example TestCase.
+
+/**
+ * \ingroup openflow-tests
+ *
+ * \brief OpenFlow Test
+ */
 class SwitchFlowTableTestCase : public TestCase
 {
 public:
@@ -46,7 +51,7 @@
 private:
   virtual void DoRun (void);
 
-  sw_chain* m_chain;
+  sw_chain* m_chain; //!< OpenFlow service function chain
 };
 
 void
@@ -173,6 +178,11 @@
   NS_TEST_ASSERT_MSG_EQ (chain_lookup (m_chain, &key), 0, "Key provided shouldn't match the flow but it does.");
 }
 
+/**
+ * \ingroup openflow-tests
+ *
+ * \brief OpenFlow TestSuite
+ */
 class SwitchTestSuite : public TestSuite
 {
 public:
@@ -184,6 +194,6 @@
   AddTestCase (new SwitchFlowTableTestCase, TestCase::QUICK);
 }
 
-// Do not forget to allocate an instance of this TestSuite
+/// Do not forget to allocate an instance of this TestSuite
 static SwitchTestSuite switchTestSuite;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/openflow/wscript ns-3.36/src/openflow/wscript
--- ns-3.35/src/openflow/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/openflow/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,164 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-import os
-from waflib import Logs, Options
-from waflib.Errors import WafError
-
-def options(opt):
-    opt.add_option('--with-openflow',
-                   help=('Path to OFSID source for NS-3 OpenFlow Integration support'),
-                   default='', dest='with_openflow')
-
-def configure(conf):
-    if Options.options.with_openflow:
-        if os.path.isdir(Options.options.with_openflow):
-            conf.msg("Checking for OpenFlow location", ("%s (given)" % Options.options.with_openflow))
-            conf.env['WITH_OPENFLOW'] = os.path.abspath(Options.options.with_openflow)
-    else:
-        # bake.py uses ../../build, while ns-3-dev uses ../openflow.
-        lib_to_check = 'libopenflow.a'
-        openflow_bake_build_dir = os.path.join('..', '..', 'build')
-        openflow_bake_lib_dir = os.path.join(openflow_bake_build_dir, 'lib')
-        openflow_dir = os.path.join('..','openflow')
-        if os.path.exists(os.path.join(openflow_bake_lib_dir, lib_to_check)):
-            conf.msg("Checking for OpenFlow location",("%s (guessed)" % openflow_bake_build_dir))
-            conf.env['WITH_OPENFLOW'] = os.path.abspath(openflow_bake_build_dir)
-        elif os.path.isdir(openflow_dir):
-            conf.msg("Checking for OpenFlow location", ("%s (guessed)" % openflow_dir))
-            conf.env['WITH_OPENFLOW'] = os.path.abspath(openflow_dir)
-        del openflow_bake_build_dir
-        del openflow_bake_lib_dir
-        del openflow_dir
-    if not conf.env['WITH_OPENFLOW']:
-        conf.msg("Checking for OpenFlow location", False)
-        conf.report_optional_feature("openflow", "NS-3 OpenFlow Integration", False,
-                                     "OpenFlow not enabled (see option --with-openflow)")
-        # Add this module to the list of modules that won't be built
-        # if they are enabled.
-        conf.env['MODULES_NOT_BUILT'].append('openflow')
-        return 
-
-    if not conf.require_boost_incs('openflow', 'NS-3 OpenFlow Integration'):
-        conf.env['MODULES_NOT_BUILT'].append('openflow')
-        return 
-
-    test_code = '''
-#include "openflow/openflow.h"
-#include "openflow/nicira-ext.h"
-#include "openflow/ericsson-ext.h"
-
-extern "C"
-{
-#define private _private
-#define delete _delete
-#define list List
-
-#include "openflow/private/csum.h"
-#include "openflow/private/poll-loop.h"
-#include "openflow/private/rconn.h"
-#include "openflow/private/stp.h"
-#include "openflow/private/vconn.h"
-#include "openflow/private/xtoxll.h"
-
-#include "openflow/private/chain.h"
-#include "openflow/private/table.h"
-#include "openflow/private/datapath.h" // The functions below are defined in datapath.c
-uint32_t save_buffer (ofpbuf *);
-ofpbuf * retrieve_buffer (uint32_t id);
-void discard_buffer (uint32_t id);
-#include "openflow/private/dp_act.h" // The functions below are defined in dp_act.c
-void set_vlan_vid (ofpbuf *buffer, sw_flow_key *key, const ofp_action_header *ah);
-void set_vlan_pcp (ofpbuf *buffer, sw_flow_key *key, const ofp_action_header *ah);
-void strip_vlan (ofpbuf *buffer, sw_flow_key *key, const ofp_action_header *ah);
-void set_dl_addr (ofpbuf *buffer, sw_flow_key *key, const ofp_action_header *ah);
-void set_nw_addr (ofpbuf *buffer, sw_flow_key *key, const ofp_action_header *ah);
-void set_tp_port (ofpbuf *buffer, sw_flow_key *key, const ofp_action_header *ah);
-void set_mpls_label (ofpbuf *buffer, sw_flow_key *key, const ofp_action_header *ah);
-void set_mpls_exp (ofpbuf *buffer, sw_flow_key *key, const ofp_action_header *ah);
-#include "openflow/private/pt_act.h" // The function below is defined in pt_act.c
-void update_checksums (ofpbuf *buffer, const sw_flow_key *key, uint32_t old_word, uint32_t new_word);
-
-#undef list
-#undef private
-#undef delete
-}
-
-int main()
-{
-  return 0;
-}
-'''
-    conf.env['HAVE_DL'] = conf.check(mandatory=True, lib='dl', define_name='HAVE_DL', uselib_store='DL')
-
-    conf.env.append_value('NS3_MODULE_PATH',os.path.abspath(os.path.join(conf.env['WITH_OPENFLOW'],'build')))
-    conf.env.append_value('NS3_MODULE_PATH',os.path.abspath(os.path.join(conf.env['WITH_OPENFLOW'],'lib')))
-    
-    conf.env['INCLUDES_OPENFLOW'] = [
-        os.path.abspath(os.path.join(conf.env['WITH_OPENFLOW'],'include'))]
-    conf.env['LIBPATH_OPENFLOW'] = [
-        os.path.abspath(os.path.join(conf.env['WITH_OPENFLOW'],'build')),
-        os.path.abspath(os.path.join(conf.env['WITH_OPENFLOW'],'lib'))]
-    
-    conf.env['DEFINES_OPENFLOW'] = ['NS3_OPENFLOW']
-
-    conf.env['OPENFLOW'] = conf.check_nonfatal(fragment=test_code, lib='openflow', 
-                                               libpath=conf.env['LIBPATH_OPENFLOW'],
-                                               use='OPENFLOW DL')
-    conf.env.append_value('LIB_OPENFLOW', 'dl')
-    conf.report_optional_feature("openflow", "NS-3 OpenFlow Integration",
-                                 conf.env['OPENFLOW'], "openflow library not found")
-    if conf.env['OPENFLOW']:
-        conf.env['ENABLE_OPENFLOW'] = True
-        # Openflow library has some strncpy() usage that can trigger warnings
-        if conf.env['BUILD_PROFILE'] == 'optimized':
-            conf.env.append_value('CXXFLAGS', '-Wno-stringop-truncation')
-    else:
-        # Add this module to the list of modules that won't be built
-        # if they are enabled.
-        conf.env['MODULES_NOT_BUILT'].append('openflow')
-
-
-
-def build(bld):
-    # Don't do anything for this module if openflow's not enabled.
-    if 'openflow' in bld.env['MODULES_NOT_BUILT']:
-        return
-
-    # Build the Switch module
-    obj = bld.create_ns3_module('openflow', ['internet'])
-    obj.use.append('BOOST')
-    obj.source = [
-        ]
-
-    obj_test = bld.create_ns3_module_test_library('openflow')
-    obj_test.source = [
-        ]
-
-    # Tests encapsulating example programs should be listed here
-    if (bld.env['ENABLE_EXAMPLES']):
-        obj_test.source.extend([
-        #   'test/openflow-examples-test-suite.cc',
-            ])
-    
-    if bld.env['OPENFLOW'] and bld.env['HAVE_DL']:
-        obj.use.extend('OPENFLOW DL'.split())
-        obj_test.use.extend('OPENFLOW DL'.split())
-
-    headers = bld(features='ns3header')
-    headers.module = 'openflow'
-    headers.source = [
-        ]
-
-    if bld.env['ENABLE_OPENFLOW']:
-        obj.source.append('model/openflow-interface.cc')
-        obj.source.append('model/openflow-switch-net-device.cc')
-        obj.source.append('helper/openflow-switch-helper.cc')
-
-        obj.env.append_value('DEFINES', 'NS3_OPENFLOW')
-        obj_test.source.append('test/openflow-switch-test-suite.cc')
-        headers.source.append('model/openflow-interface.h')
-        headers.source.append('model/openflow-switch-net-device.h')
-        headers.source.append('helper/openflow-switch-helper.h')
-
-    if bld.env['ENABLE_EXAMPLES'] and bld.env['ENABLE_OPENFLOW']:
-        bld.recurse('examples')
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/point-to-point/bindings/callbacks_list.py ns-3.36/src/point-to-point/bindings/callbacks_list.py
--- ns-3.35/src/point-to-point/bindings/callbacks_list.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/point-to-point/bindings/callbacks_list.py	2022-04-30 18:23:58.126734700 -0700
@@ -1,6 +1,5 @@
 callback_classes = [
     ['ns3::ObjectBase *', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Time', 'ns3::Time', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['bool', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'const ns3::Address &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['bool', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'const ns3::Address &', 'const ns3::Address &', 'ns3::NetDevice::PacketType', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
@@ -8,6 +7,7 @@
     ['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'std::basic_string<char>', 'ns3::Ptr<const ns3::Packet>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Time', 'ns3::Time', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'unsigned int', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::QueueDiscItem>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
 ]
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/point-to-point/bindings/modulegen__gcc_ILP32.py ns-3.36/src/point-to-point/bindings/modulegen__gcc_ILP32.py
--- ns-3.35/src/point-to-point/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/point-to-point/bindings/modulegen__gcc_ILP32.py	2022-04-30 18:23:58.126734700 -0700
@@ -81,6 +81,8 @@
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::TraceSourceAccessor'])
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'], import_from_module='ns.core')
     ## hash.h (module 'core'): ns3::Hasher [class]
     module.add_class('Hasher', import_from_module='ns.core')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
@@ -219,27 +221,27 @@
     module.add_class('RandomVariableStream', import_from_module='ns.core', parent=root_module['ns3::Object'])
     ## random-variable-stream.h (module 'core'): ns3::SequentialRandomVariable [class]
     module.add_class('SequentialRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::OutputStreamWrapper', 'ns3::empty', 'ns3::DefaultDeleter<ns3::OutputStreamWrapper>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::QueueItem', 'ns3::empty', 'ns3::DefaultDeleter<ns3::QueueItem>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
     module.add_class('TraceSourceAccessor', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >'])
@@ -450,7 +452,7 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned int', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## queue-item.h (module 'network'): ns3::QueueDiscItem [class]
     module.add_class('QueueDiscItem', import_from_module='ns.network', parent=root_module['ns3::QueueItem'])
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     module.add_container('std::list< unsigned int >', 'unsigned int', container_type='list')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )', 'ns3::TimePrinter')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )*', 'ns3::TimePrinter*')
@@ -2452,6 +2454,8 @@
     cls.add_constructor([param('ns3::ObjectFactory const &', 'arg0')])
     ## object-factory.h (module 'core'): ns3::ObjectFactory::ObjectFactory() [constructor]
     cls.add_constructor([])
+    ## object-factory.h (module 'core'): ns3::ObjectFactory::ObjectFactory(std::string const & typeId) [constructor]
+    cls.add_constructor([param('std::string const &', 'typeId')])
     ## object-factory.h (module 'core'): ns3::Ptr<ns3::Object> ns3::ObjectFactory::Create() const [member function]
     cls.add_method('Create', 
                    'ns3::Ptr< ns3::Object >', 
@@ -2853,6 +2857,10 @@
     cls.add_constructor([param('ns3::PointToPointHelper const &', 'arg0')])
     ## point-to-point-helper.h (module 'point-to-point'): ns3::PointToPointHelper::PointToPointHelper() [constructor]
     cls.add_constructor([])
+    ## point-to-point-helper.h (module 'point-to-point'): void ns3::PointToPointHelper::DisableFlowControl() [member function]
+    cls.add_method('DisableFlowControl', 
+                   'void', 
+                   [])
     ## point-to-point-helper.h (module 'point-to-point'): ns3::NetDeviceContainer ns3::PointToPointHelper::Install(ns3::NodeContainer c) [member function]
     cls.add_method('Install', 
                    'ns3::NetDeviceContainer', 
@@ -3367,8 +3375,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -3596,14 +3604,14 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('>=')
     cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_unary_numeric_operator('-')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
     cls.add_constructor([])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(double const value) [constructor]
@@ -3622,6 +3630,8 @@
     cls.add_constructor([param('long unsigned int const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int const v) [constructor]
     cls.add_constructor([param('long long unsigned int const', 'v')])
+    ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int128_t const v) [constructor]
+    cls.add_constructor([param('int128_t const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t const hi, uint64_t const lo) [constructor]
     cls.add_constructor([param('int64_t const', 'hi'), param('uint64_t const', 'lo')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [constructor]
@@ -4018,6 +4028,11 @@
     cls.add_method('SetMaxSize', 
                    'void', 
                    [param('ns3::QueueSize', 'size')])
+    ## queue.h (module 'network'): bool ns3::QueueBase::WouldOverflow(uint32_t nPackets, uint32_t nBytes) const [member function]
+    cls.add_method('WouldOverflow', 
+                   'bool', 
+                   [param('uint32_t', 'nPackets'), param('uint32_t', 'nBytes')], 
+                   is_const=True)
     return
 
 def register_Ns3RandomVariableStream_methods(root_module, cls):
@@ -4104,79 +4119,79 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3OutputStreamWrapper_Ns3Empty_Ns3DefaultDeleter__lt__ns3OutputStreamWrapper__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter< ns3::OutputStreamWrapper > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3QueueItem_Ns3Empty_Ns3DefaultDeleter__lt__ns3QueueItem__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> >::SimpleRefCount(ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>>::SimpleRefCount(ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::QueueItem, ns3::empty, ns3::DefaultDeleter< ns3::QueueItem > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
@@ -4618,17 +4633,12 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::Packet const> '], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
                    is_static=True, template_parameters=['ns3::Ptr<ns3::NetDevice> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Time'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::Packet const> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
@@ -4648,6 +4658,11 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
+                   is_static=True, template_parameters=['ns3::Time'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
                    is_static=True, template_parameters=['ns3::Ptr<ns3::QueueDiscItem const> '], visibility='protected')
     return
 
@@ -5422,7 +5437,7 @@
     cls.add_constructor([param('ns3::ListErrorModel const &', 'arg0')])
     ## error-model.h (module 'network'): ns3::ListErrorModel::ListErrorModel() [constructor]
     cls.add_constructor([])
-    ## error-model.h (module 'network'): std::list<unsigned int, std::allocator<unsigned int> > ns3::ListErrorModel::GetList() const [member function]
+    ## error-model.h (module 'network'): std::list<unsigned int, std::allocator<unsigned int>> ns3::ListErrorModel::GetList() const [member function]
     cls.add_method('GetList', 
                    'std::list< unsigned int >', 
                    [], 
@@ -5432,7 +5447,7 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## error-model.h (module 'network'): void ns3::ListErrorModel::SetList(std::list<unsigned int, std::allocator<unsigned int> > const & packetlist) [member function]
+    ## error-model.h (module 'network'): void ns3::ListErrorModel::SetList(std::list<unsigned int, std::allocator<unsigned int>> const & packetlist) [member function]
     cls.add_method('SetList', 
                    'void', 
                    [param('std::list< unsigned int > const &', 'packetlist')])
@@ -5686,10 +5701,16 @@
     cls.add_method('ExtractNeighborIndex', 
                    'uint32_t', 
                    [param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetEpoch() const [member function]
+    cls.add_method('GetEpoch', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() const [member function]
     cls.add_method('GetRemainingBits', 
                    'uint32_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -5700,6 +5721,10 @@
                    'uint32_t', 
                    [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
+    ## nix-vector.h (module 'network'): void ns3::NixVector::SetEpoch(uint32_t epoch) [member function]
+    cls.add_method('SetEpoch', 
+                   'void', 
+                   [param('uint32_t', 'epoch')])
     return
 
 def register_Ns3Node_methods(root_module, cls):
@@ -6076,10 +6101,11 @@
                    'uint32_t', 
                    [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) const [member function]
     cls.add_method('SetNixVector', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')], 
+                   is_const=True)
     ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
     cls.add_method('ToString', 
                    'std::string', 
@@ -6206,11 +6232,11 @@
     cls.add_method('Attach', 
                    'bool', 
                    [param('ns3::Ptr< ns3::PointToPointChannel >', 'ch')])
-    ## point-to-point-net-device.h (module 'point-to-point'): void ns3::PointToPointNetDevice::SetQueue(ns3::Ptr<ns3::Queue<ns3::Packet> > queue) [member function]
+    ## point-to-point-net-device.h (module 'point-to-point'): void ns3::PointToPointNetDevice::SetQueue(ns3::Ptr<ns3::Queue<ns3::Packet>> queue) [member function]
     cls.add_method('SetQueue', 
                    'void', 
                    [param('ns3::Ptr< ns3::Queue< ns3::Packet > >', 'queue')])
-    ## point-to-point-net-device.h (module 'point-to-point'): ns3::Ptr<ns3::Queue<ns3::Packet> > ns3::PointToPointNetDevice::GetQueue() const [member function]
+    ## point-to-point-net-device.h (module 'point-to-point'): ns3::Ptr<ns3::Queue<ns3::Packet>> ns3::PointToPointNetDevice::GetQueue() const [member function]
     cls.add_method('GetQueue', 
                    'ns3::Ptr< ns3::Queue< ns3::Packet > >', 
                    [], 
@@ -6681,7 +6707,7 @@
     cls.add_constructor([param('ns3::ReceiveListErrorModel const &', 'arg0')])
     ## error-model.h (module 'network'): ns3::ReceiveListErrorModel::ReceiveListErrorModel() [constructor]
     cls.add_constructor([])
-    ## error-model.h (module 'network'): std::list<unsigned int, std::allocator<unsigned int> > ns3::ReceiveListErrorModel::GetList() const [member function]
+    ## error-model.h (module 'network'): std::list<unsigned int, std::allocator<unsigned int>> ns3::ReceiveListErrorModel::GetList() const [member function]
     cls.add_method('GetList', 
                    'std::list< unsigned int >', 
                    [], 
@@ -6691,7 +6717,7 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## error-model.h (module 'network'): void ns3::ReceiveListErrorModel::SetList(std::list<unsigned int, std::allocator<unsigned int> > const & packetlist) [member function]
+    ## error-model.h (module 'network'): void ns3::ReceiveListErrorModel::SetList(std::list<unsigned int, std::allocator<unsigned int>> const & packetlist) [member function]
     cls.add_method('SetList', 
                    'void', 
                    [param('std::list< unsigned int > const &', 'packetlist')])
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/point-to-point/bindings/modulegen__gcc_LP64.py ns-3.36/src/point-to-point/bindings/modulegen__gcc_LP64.py
--- ns-3.35/src/point-to-point/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/point-to-point/bindings/modulegen__gcc_LP64.py	2022-04-30 18:23:58.126734700 -0700
@@ -81,6 +81,8 @@
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::TraceSourceAccessor'])
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'], import_from_module='ns.core')
     ## hash.h (module 'core'): ns3::Hasher [class]
     module.add_class('Hasher', import_from_module='ns.core')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
@@ -219,27 +221,27 @@
     module.add_class('RandomVariableStream', import_from_module='ns.core', parent=root_module['ns3::Object'])
     ## random-variable-stream.h (module 'core'): ns3::SequentialRandomVariable [class]
     module.add_class('SequentialRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::OutputStreamWrapper', 'ns3::empty', 'ns3::DefaultDeleter<ns3::OutputStreamWrapper>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::QueueItem', 'ns3::empty', 'ns3::DefaultDeleter<ns3::QueueItem>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
     module.add_class('TraceSourceAccessor', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >'])
@@ -450,7 +452,7 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned int', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## queue-item.h (module 'network'): ns3::QueueDiscItem [class]
     module.add_class('QueueDiscItem', import_from_module='ns.network', parent=root_module['ns3::QueueItem'])
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     module.add_container('std::list< unsigned int >', 'unsigned int', container_type='list')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )', 'ns3::TimePrinter')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )*', 'ns3::TimePrinter*')
@@ -2452,6 +2454,8 @@
     cls.add_constructor([param('ns3::ObjectFactory const &', 'arg0')])
     ## object-factory.h (module 'core'): ns3::ObjectFactory::ObjectFactory() [constructor]
     cls.add_constructor([])
+    ## object-factory.h (module 'core'): ns3::ObjectFactory::ObjectFactory(std::string const & typeId) [constructor]
+    cls.add_constructor([param('std::string const &', 'typeId')])
     ## object-factory.h (module 'core'): ns3::Ptr<ns3::Object> ns3::ObjectFactory::Create() const [member function]
     cls.add_method('Create', 
                    'ns3::Ptr< ns3::Object >', 
@@ -2853,6 +2857,10 @@
     cls.add_constructor([param('ns3::PointToPointHelper const &', 'arg0')])
     ## point-to-point-helper.h (module 'point-to-point'): ns3::PointToPointHelper::PointToPointHelper() [constructor]
     cls.add_constructor([])
+    ## point-to-point-helper.h (module 'point-to-point'): void ns3::PointToPointHelper::DisableFlowControl() [member function]
+    cls.add_method('DisableFlowControl', 
+                   'void', 
+                   [])
     ## point-to-point-helper.h (module 'point-to-point'): ns3::NetDeviceContainer ns3::PointToPointHelper::Install(ns3::NodeContainer c) [member function]
     cls.add_method('Install', 
                    'ns3::NetDeviceContainer', 
@@ -3367,8 +3375,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -3596,14 +3604,14 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('>=')
     cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_unary_numeric_operator('-')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
     cls.add_constructor([])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(double const value) [constructor]
@@ -3622,6 +3630,8 @@
     cls.add_constructor([param('long unsigned int const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int const v) [constructor]
     cls.add_constructor([param('long long unsigned int const', 'v')])
+    ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int128_t const v) [constructor]
+    cls.add_constructor([param('int128_t const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t const hi, uint64_t const lo) [constructor]
     cls.add_constructor([param('int64_t const', 'hi'), param('uint64_t const', 'lo')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [constructor]
@@ -4018,6 +4028,11 @@
     cls.add_method('SetMaxSize', 
                    'void', 
                    [param('ns3::QueueSize', 'size')])
+    ## queue.h (module 'network'): bool ns3::QueueBase::WouldOverflow(uint32_t nPackets, uint32_t nBytes) const [member function]
+    cls.add_method('WouldOverflow', 
+                   'bool', 
+                   [param('uint32_t', 'nPackets'), param('uint32_t', 'nBytes')], 
+                   is_const=True)
     return
 
 def register_Ns3RandomVariableStream_methods(root_module, cls):
@@ -4104,79 +4119,79 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3OutputStreamWrapper_Ns3Empty_Ns3DefaultDeleter__lt__ns3OutputStreamWrapper__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter< ns3::OutputStreamWrapper > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3QueueItem_Ns3Empty_Ns3DefaultDeleter__lt__ns3QueueItem__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> >::SimpleRefCount(ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>>::SimpleRefCount(ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::QueueItem, ns3::empty, ns3::DefaultDeleter< ns3::QueueItem > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
@@ -4618,17 +4633,12 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::Packet const> '], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
                    is_static=True, template_parameters=['ns3::Ptr<ns3::NetDevice> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Time'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::Packet const> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
@@ -4648,6 +4658,11 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
+                   is_static=True, template_parameters=['ns3::Time'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
                    is_static=True, template_parameters=['ns3::Ptr<ns3::QueueDiscItem const> '], visibility='protected')
     return
 
@@ -5422,7 +5437,7 @@
     cls.add_constructor([param('ns3::ListErrorModel const &', 'arg0')])
     ## error-model.h (module 'network'): ns3::ListErrorModel::ListErrorModel() [constructor]
     cls.add_constructor([])
-    ## error-model.h (module 'network'): std::list<unsigned int, std::allocator<unsigned int> > ns3::ListErrorModel::GetList() const [member function]
+    ## error-model.h (module 'network'): std::list<unsigned int, std::allocator<unsigned int>> ns3::ListErrorModel::GetList() const [member function]
     cls.add_method('GetList', 
                    'std::list< unsigned int >', 
                    [], 
@@ -5432,7 +5447,7 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## error-model.h (module 'network'): void ns3::ListErrorModel::SetList(std::list<unsigned int, std::allocator<unsigned int> > const & packetlist) [member function]
+    ## error-model.h (module 'network'): void ns3::ListErrorModel::SetList(std::list<unsigned int, std::allocator<unsigned int>> const & packetlist) [member function]
     cls.add_method('SetList', 
                    'void', 
                    [param('std::list< unsigned int > const &', 'packetlist')])
@@ -5686,10 +5701,16 @@
     cls.add_method('ExtractNeighborIndex', 
                    'uint32_t', 
                    [param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetEpoch() const [member function]
+    cls.add_method('GetEpoch', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() const [member function]
     cls.add_method('GetRemainingBits', 
                    'uint32_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -5700,6 +5721,10 @@
                    'uint32_t', 
                    [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
+    ## nix-vector.h (module 'network'): void ns3::NixVector::SetEpoch(uint32_t epoch) [member function]
+    cls.add_method('SetEpoch', 
+                   'void', 
+                   [param('uint32_t', 'epoch')])
     return
 
 def register_Ns3Node_methods(root_module, cls):
@@ -6076,10 +6101,11 @@
                    'uint32_t', 
                    [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) const [member function]
     cls.add_method('SetNixVector', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')], 
+                   is_const=True)
     ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
     cls.add_method('ToString', 
                    'std::string', 
@@ -6206,11 +6232,11 @@
     cls.add_method('Attach', 
                    'bool', 
                    [param('ns3::Ptr< ns3::PointToPointChannel >', 'ch')])
-    ## point-to-point-net-device.h (module 'point-to-point'): void ns3::PointToPointNetDevice::SetQueue(ns3::Ptr<ns3::Queue<ns3::Packet> > queue) [member function]
+    ## point-to-point-net-device.h (module 'point-to-point'): void ns3::PointToPointNetDevice::SetQueue(ns3::Ptr<ns3::Queue<ns3::Packet>> queue) [member function]
     cls.add_method('SetQueue', 
                    'void', 
                    [param('ns3::Ptr< ns3::Queue< ns3::Packet > >', 'queue')])
-    ## point-to-point-net-device.h (module 'point-to-point'): ns3::Ptr<ns3::Queue<ns3::Packet> > ns3::PointToPointNetDevice::GetQueue() const [member function]
+    ## point-to-point-net-device.h (module 'point-to-point'): ns3::Ptr<ns3::Queue<ns3::Packet>> ns3::PointToPointNetDevice::GetQueue() const [member function]
     cls.add_method('GetQueue', 
                    'ns3::Ptr< ns3::Queue< ns3::Packet > >', 
                    [], 
@@ -6681,7 +6707,7 @@
     cls.add_constructor([param('ns3::ReceiveListErrorModel const &', 'arg0')])
     ## error-model.h (module 'network'): ns3::ReceiveListErrorModel::ReceiveListErrorModel() [constructor]
     cls.add_constructor([])
-    ## error-model.h (module 'network'): std::list<unsigned int, std::allocator<unsigned int> > ns3::ReceiveListErrorModel::GetList() const [member function]
+    ## error-model.h (module 'network'): std::list<unsigned int, std::allocator<unsigned int>> ns3::ReceiveListErrorModel::GetList() const [member function]
     cls.add_method('GetList', 
                    'std::list< unsigned int >', 
                    [], 
@@ -6691,7 +6717,7 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## error-model.h (module 'network'): void ns3::ReceiveListErrorModel::SetList(std::list<unsigned int, std::allocator<unsigned int> > const & packetlist) [member function]
+    ## error-model.h (module 'network'): void ns3::ReceiveListErrorModel::SetList(std::list<unsigned int, std::allocator<unsigned int>> const & packetlist) [member function]
     cls.add_method('SetList', 
                    'void', 
                    [param('std::list< unsigned int > const &', 'packetlist')])
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/point-to-point/CMakeLists.txt ns-3.36/src/point-to-point/CMakeLists.txt
--- ns-3.35/src/point-to-point/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/point-to-point/CMakeLists.txt	2022-04-30 18:23:58.126734700 -0700
@@ -0,0 +1,36 @@
+set(mpi_sources)
+set(mpi_headers)
+set(mpi_libraries)
+
+if(${ENABLE_MPI})
+  set(mpi_sources
+      model/point-to-point-remote-channel.cc
+  )
+  set(mpi_headers
+      model/point-to-point-remote-channel.h
+  )
+  set(mpi_libraries
+      ${libmpi}
+      ${MPI_CXX_LIBRARIES}
+  )
+  include_directories(${MPI_CXX_INCLUDE_DIRS})
+endif()
+
+build_lib(
+  LIBNAME point-to-point
+  SOURCE_FILES
+    ${mpi_sources}
+    helper/point-to-point-helper.cc
+    model/point-to-point-channel.cc
+    model/point-to-point-net-device.cc
+    model/ppp-header.cc
+  HEADER_FILES
+    ${mpi_headers}
+    helper/point-to-point-helper.h
+    model/point-to-point-channel.h
+    model/point-to-point-net-device.h
+    model/ppp-header.h
+  LIBRARIES_TO_LINK ${libnetwork}
+                    ${mpi_libraries}
+  TEST_SOURCES test/point-to-point-test.cc
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/point-to-point/examples/CMakeLists.txt ns-3.36/src/point-to-point/examples/CMakeLists.txt
--- ns-3.35/src/point-to-point/examples/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/point-to-point/examples/CMakeLists.txt	2022-04-30 18:23:58.126734700 -0700
@@ -0,0 +1,6 @@
+build_lib_example(
+  NAME main-attribute-value
+  SOURCE_FILES main-attribute-value.cc
+  LIBRARIES_TO_LINK ${libnetwork}
+                    ${libpoint-to-point}
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/point-to-point/examples/wscript ns-3.36/src/point-to-point/examples/wscript
--- ns-3.35/src/point-to-point/examples/wscript	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/point-to-point/examples/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,8 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    if not bld.env['ENABLE_EXAMPLES']:
-        return;
-
-    obj = bld.create_ns3_program('main-attribute-value', ['network', 'point-to-point'])
-    obj.source = 'main-attribute-value.cc'
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/point-to-point/helper/point-to-point-helper.cc ns-3.36/src/point-to-point/helper/point-to-point-helper.cc
--- ns-3.35/src/point-to-point/helper/point-to-point-helper.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/point-to-point/helper/point-to-point-helper.cc	2022-04-30 18:23:58.130735000 -0700
@@ -47,6 +47,7 @@
   m_queueFactory.SetTypeId ("ns3::DropTailQueue<Packet>");
   m_deviceFactory.SetTypeId ("ns3::PointToPointNetDevice");
   m_channelFactory.SetTypeId ("ns3::PointToPointChannel");
+  m_enableFlowControl = true;
 }
 
 void 
@@ -77,6 +78,12 @@
   m_channelFactory.Set (n1, v1);
 }
 
+void
+PointToPointHelper::DisableFlowControl (void)
+{
+  m_enableFlowControl = false;
+}
+
 void 
 PointToPointHelper::EnablePcapInternal (std::string prefix, Ptr<NetDevice> nd, bool promiscuous, bool explicitFilename)
 {
@@ -240,13 +247,16 @@
   b->AddDevice (devB);
   Ptr<Queue<Packet> > queueB = m_queueFactory.Create<Queue<Packet> > ();
   devB->SetQueue (queueB);
-  // Aggregate NetDeviceQueueInterface objects
-  Ptr<NetDeviceQueueInterface> ndqiA = CreateObject<NetDeviceQueueInterface> ();
-  ndqiA->GetTxQueue (0)->ConnectQueueTraces (queueA);
-  devA->AggregateObject (ndqiA);
-  Ptr<NetDeviceQueueInterface> ndqiB = CreateObject<NetDeviceQueueInterface> ();
-  ndqiB->GetTxQueue (0)->ConnectQueueTraces (queueB);
-  devB->AggregateObject (ndqiB);
+  if (m_enableFlowControl)
+    {
+      // Aggregate NetDeviceQueueInterface objects
+      Ptr<NetDeviceQueueInterface> ndqiA = CreateObject<NetDeviceQueueInterface> ();
+      ndqiA->GetTxQueue (0)->ConnectQueueTraces (queueA);
+      devA->AggregateObject (ndqiA);
+      Ptr<NetDeviceQueueInterface> ndqiB = CreateObject<NetDeviceQueueInterface> ();
+      ndqiB->GetTxQueue (0)->ConnectQueueTraces (queueB);
+      devB->AggregateObject (ndqiB);
+    }
 
   Ptr<PointToPointChannel> channel = 0;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/point-to-point/helper/point-to-point-helper.h ns-3.36/src/point-to-point/helper/point-to-point-helper.h
--- ns-3.35/src/point-to-point/helper/point-to-point-helper.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/point-to-point/helper/point-to-point-helper.h	2022-04-30 18:23:58.130735000 -0700
@@ -100,6 +100,16 @@
   void SetChannelAttribute (std::string name, const AttributeValue &value);
 
   /**
+   * Disable flow control only if you know what you are doing. By disabling
+   * flow control, this NetDevice will be sent packets even if there is no
+   * room for them (such packets will be likely dropped by this NetDevice).
+   * Also, any queue disc installed on this NetDevice will have no effect,
+   * as every packet enqueued to the traffic control layer queue disc will
+   * be immediately dequeued.
+   */
+  void DisableFlowControl (void);
+
+  /**
    * \param c a set of nodes
    * \return a NetDeviceContainer for nodes
    *
@@ -184,6 +194,7 @@
   ObjectFactory m_queueFactory;         //!< Queue Factory
   ObjectFactory m_channelFactory;       //!< Channel Factory
   ObjectFactory m_deviceFactory;        //!< Device Factory
+  bool m_enableFlowControl;             //!< whether to enable flow control
 };
 
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/point-to-point/wscript ns-3.36/src/point-to-point/wscript
--- ns-3.35/src/point-to-point/wscript	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/point-to-point/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,43 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-
-def build(bld):
-    if bld.env['ENABLE_MPI']:
-        module = bld.create_ns3_module('point-to-point', ['network', 'mpi'])
-    else:
-        module = bld.create_ns3_module('point-to-point', ['network'])
-    module.source = [
-        'model/point-to-point-net-device.cc',
-        'model/point-to-point-channel.cc',
-        'model/ppp-header.cc',
-        'helper/point-to-point-helper.cc',
-        ]
-    if bld.env['ENABLE_MPI']:
-        module.source.append('model/point-to-point-remote-channel.cc')
-    
-    module_test = bld.create_ns3_module_test_library('point-to-point')
-    module_test.source = [
-        'test/point-to-point-test.cc',
-        ]
-
-    # Tests encapsulating example programs should be listed here
-    if (bld.env['ENABLE_EXAMPLES']):
-        module_test.source.extend([
-        #   'test/point-to-point-examples-test-suite.cc',
-            ])
-    
-    headers = bld(features='ns3header')
-    headers.module = 'point-to-point'
-    headers.source = [
-        'model/point-to-point-net-device.h',
-        'model/point-to-point-channel.h',
-        'model/ppp-header.h',
-        'helper/point-to-point-helper.h',
-        ]
-    if bld.env['ENABLE_MPI']:
-        headers.source.append('model/point-to-point-remote-channel.h')
-
-    if (bld.env['ENABLE_EXAMPLES']):
-        bld.recurse('examples')
-
-    bld.ns3_python_bindings()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/point-to-point-layout/bindings/modulegen__gcc_ILP32.py ns-3.36/src/point-to-point-layout/bindings/modulegen__gcc_ILP32.py
--- ns-3.35/src/point-to-point-layout/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/point-to-point-layout/bindings/modulegen__gcc_ILP32.py	2022-04-30 18:23:58.126734700 -0700
@@ -79,6 +79,8 @@
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::TraceSourceAccessor'])
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'], import_from_module='ns.core')
     ## hash.h (module 'core'): ns3::Hasher [class]
     module.add_class('Hasher', import_from_module='ns.core')
     ## inet6-socket-address.h (module 'network'): ns3::Inet6SocketAddress [class]
@@ -263,29 +265,29 @@
     module.add_class('AggregateIterator', import_from_module='ns.core', outer_class=root_module['ns3::Object'])
     ## pcap-file-wrapper.h (module 'network'): ns3::PcapFileWrapper [class]
     module.add_class('PcapFileWrapper', import_from_module='ns.network', parent=root_module['ns3::Object'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv4MulticastRoute', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv4Route', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv4Route>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::OutputStreamWrapper', 'ns3::empty', 'ns3::DefaultDeleter<ns3::OutputStreamWrapper>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
     ## socket.h (module 'network'): ns3::Socket [class]
     module.add_class('Socket', import_from_module='ns.network', parent=root_module['ns3::Object'])
@@ -489,7 +491,7 @@
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::Socket>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::Socket>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     module.add_container('std::vector< bool >', 'bool', container_type='vector')
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     module.add_container('std::vector< ns3::Ipv6Address >', 'ns3::Ipv6Address', container_type='vector')
     module.add_container('std::map< unsigned int, unsigned int >', ('unsigned int', 'unsigned int'), container_type='map')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )', 'ns3::TimePrinter')
@@ -2335,11 +2337,11 @@
     cls.add_method('Assign', 
                    'ns3::Ipv6InterfaceContainer', 
                    [param('ns3::NetDeviceContainer const &', 'c')])
-    ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6InterfaceContainer ns3::Ipv6AddressHelper::Assign(ns3::NetDeviceContainer const & c, std::vector<bool, std::allocator<bool> > withConfiguration) [member function]
+    ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6InterfaceContainer ns3::Ipv6AddressHelper::Assign(ns3::NetDeviceContainer const & c, std::vector<bool, std::allocator<bool>> withConfiguration) [member function]
     cls.add_method('Assign', 
                    'ns3::Ipv6InterfaceContainer', 
                    [param('ns3::NetDeviceContainer const &', 'c'), param('std::vector< bool >', 'withConfiguration')])
-    ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6InterfaceContainer ns3::Ipv6AddressHelper::Assign(ns3::NetDeviceContainer const & c, std::vector<bool, std::allocator<bool> > withConfiguration, std::vector<bool, std::allocator<bool> > onLink) [member function]
+    ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6InterfaceContainer ns3::Ipv6AddressHelper::Assign(ns3::NetDeviceContainer const & c, std::vector<bool, std::allocator<bool>> withConfiguration, std::vector<bool, std::allocator<bool>> onLink) [member function]
     cls.add_method('Assign', 
                    'ns3::Ipv6InterfaceContainer', 
                    [param('ns3::NetDeviceContainer const &', 'c'), param('std::vector< bool >', 'withConfiguration'), param('std::vector< bool >', 'onLink')])
@@ -3524,6 +3526,10 @@
     cls.add_constructor([param('ns3::PointToPointHelper const &', 'arg0')])
     ## point-to-point-helper.h (module 'point-to-point'): ns3::PointToPointHelper::PointToPointHelper() [constructor]
     cls.add_constructor([])
+    ## point-to-point-helper.h (module 'point-to-point'): void ns3::PointToPointHelper::DisableFlowControl() [member function]
+    cls.add_method('DisableFlowControl', 
+                   'void', 
+                   [])
     ## point-to-point-helper.h (module 'point-to-point'): ns3::NetDeviceContainer ns3::PointToPointHelper::Install(ns3::NodeContainer c) [member function]
     cls.add_method('Install', 
                    'ns3::NetDeviceContainer', 
@@ -4030,8 +4036,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -4254,14 +4260,14 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('>=')
     cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_unary_numeric_operator('-')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
     cls.add_constructor([])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(double const value) [constructor]
@@ -4280,6 +4286,8 @@
     cls.add_constructor([param('long unsigned int const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int const v) [constructor]
     cls.add_constructor([param('long long unsigned int const', 'v')])
+    ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int128_t const v) [constructor]
+    cls.add_constructor([param('int128_t const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t const hi, uint64_t const lo) [constructor]
     cls.add_constructor([param('int64_t const', 'hi'), param('uint64_t const', 'lo')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [constructor]
@@ -4443,10 +4451,6 @@
     cls.add_method('SetTcp', 
                    'void', 
                    [param('std::string', 'tid')])
-    ## internet-stack-helper.h (module 'internet'): void ns3::InternetStackHelper::SetTcp(std::string tid, std::string attr, ns3::AttributeValue const & val) [member function]
-    cls.add_method('SetTcp', 
-                   'void', 
-                   [param('std::string', 'tid'), param('std::string', 'attr'), param('ns3::AttributeValue const &', 'val')])
     ## internet-stack-helper.h (module 'internet'): void ns3::InternetStackHelper::EnableAsciiIpv4Internal(ns3::Ptr<ns3::OutputStreamWrapper> stream, std::string prefix, ns3::Ptr<ns3::Ipv4> ipv4, uint32_t interface, bool explicitFilename) [member function]
     cls.add_method('EnableAsciiIpv4Internal', 
                    'void', 
@@ -4951,86 +4955,86 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Ipv4MulticastRoute_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv4MulticastRoute__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter< ns3::Ipv4MulticastRoute > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Ipv4Route_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv4Route__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter< ns3::Ipv4Route > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3OutputStreamWrapper_Ns3Empty_Ns3DefaultDeleter__lt__ns3OutputStreamWrapper__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter< ns3::OutputStreamWrapper > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
@@ -5153,7 +5157,7 @@
                    'uint8_t', 
                    [param('uint8_t', 'ipTos')], 
                    is_static=True)
-    ## socket.h (module 'network'): void ns3::Socket::Ipv6JoinGroup(ns3::Ipv6Address address, ns3::Socket::Ipv6MulticastFilterMode filterMode, std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address> > sourceAddresses) [member function]
+    ## socket.h (module 'network'): void ns3::Socket::Ipv6JoinGroup(ns3::Ipv6Address address, ns3::Socket::Ipv6MulticastFilterMode filterMode, std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address>> sourceAddresses) [member function]
     cls.add_method('Ipv6JoinGroup', 
                    'void', 
                    [param('ns3::Ipv6Address', 'address'), param('ns3::Socket::Ipv6MulticastFilterMode', 'filterMode'), param('std::vector< ns3::Ipv6Address >', 'sourceAddresses')], 
@@ -6610,7 +6614,7 @@
                    'ns3::Ipv4Address', 
                    [], 
                    is_const=True)
-    ## ipv4-route.h (module 'internet'): std::map<unsigned int, unsigned int, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, unsigned int> > > ns3::Ipv4MulticastRoute::GetOutputTtlMap() const [member function]
+    ## ipv4-route.h (module 'internet'): std::map<unsigned int, unsigned int, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, unsigned int>>> ns3::Ipv4MulticastRoute::GetOutputTtlMap() const [member function]
     cls.add_method('GetOutputTtlMap', 
                    'std::map< unsigned int, unsigned int >', 
                    [], 
@@ -7535,10 +7539,16 @@
     cls.add_method('ExtractNeighborIndex', 
                    'uint32_t', 
                    [param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetEpoch() const [member function]
+    cls.add_method('GetEpoch', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() const [member function]
     cls.add_method('GetRemainingBits', 
                    'uint32_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -7549,6 +7559,10 @@
                    'uint32_t', 
                    [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
+    ## nix-vector.h (module 'network'): void ns3::NixVector::SetEpoch(uint32_t epoch) [member function]
+    cls.add_method('SetEpoch', 
+                   'void', 
+                   [param('uint32_t', 'epoch')])
     return
 
 def register_Ns3Node_methods(root_module, cls):
@@ -7880,10 +7894,11 @@
                    'uint32_t', 
                    [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) const [member function]
     cls.add_method('SetNixVector', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')], 
+                   is_const=True)
     ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
     cls.add_method('ToString', 
                    'std::string', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/point-to-point-layout/bindings/modulegen__gcc_LP64.py ns-3.36/src/point-to-point-layout/bindings/modulegen__gcc_LP64.py
--- ns-3.35/src/point-to-point-layout/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/point-to-point-layout/bindings/modulegen__gcc_LP64.py	2022-04-30 18:23:58.126734700 -0700
@@ -79,6 +79,8 @@
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::TraceSourceAccessor'])
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'], import_from_module='ns.core')
     ## hash.h (module 'core'): ns3::Hasher [class]
     module.add_class('Hasher', import_from_module='ns.core')
     ## inet6-socket-address.h (module 'network'): ns3::Inet6SocketAddress [class]
@@ -263,29 +265,29 @@
     module.add_class('AggregateIterator', import_from_module='ns.core', outer_class=root_module['ns3::Object'])
     ## pcap-file-wrapper.h (module 'network'): ns3::PcapFileWrapper [class]
     module.add_class('PcapFileWrapper', import_from_module='ns.network', parent=root_module['ns3::Object'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv4MulticastRoute', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv4Route', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv4Route>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::OutputStreamWrapper', 'ns3::empty', 'ns3::DefaultDeleter<ns3::OutputStreamWrapper>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
     ## socket.h (module 'network'): ns3::Socket [class]
     module.add_class('Socket', import_from_module='ns.network', parent=root_module['ns3::Object'])
@@ -489,7 +491,7 @@
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::Socket>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::Socket>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     module.add_container('std::vector< bool >', 'bool', container_type='vector')
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     module.add_container('std::vector< ns3::Ipv6Address >', 'ns3::Ipv6Address', container_type='vector')
     module.add_container('std::map< unsigned int, unsigned int >', ('unsigned int', 'unsigned int'), container_type='map')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )', 'ns3::TimePrinter')
@@ -2335,11 +2337,11 @@
     cls.add_method('Assign', 
                    'ns3::Ipv6InterfaceContainer', 
                    [param('ns3::NetDeviceContainer const &', 'c')])
-    ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6InterfaceContainer ns3::Ipv6AddressHelper::Assign(ns3::NetDeviceContainer const & c, std::vector<bool, std::allocator<bool> > withConfiguration) [member function]
+    ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6InterfaceContainer ns3::Ipv6AddressHelper::Assign(ns3::NetDeviceContainer const & c, std::vector<bool, std::allocator<bool>> withConfiguration) [member function]
     cls.add_method('Assign', 
                    'ns3::Ipv6InterfaceContainer', 
                    [param('ns3::NetDeviceContainer const &', 'c'), param('std::vector< bool >', 'withConfiguration')])
-    ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6InterfaceContainer ns3::Ipv6AddressHelper::Assign(ns3::NetDeviceContainer const & c, std::vector<bool, std::allocator<bool> > withConfiguration, std::vector<bool, std::allocator<bool> > onLink) [member function]
+    ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6InterfaceContainer ns3::Ipv6AddressHelper::Assign(ns3::NetDeviceContainer const & c, std::vector<bool, std::allocator<bool>> withConfiguration, std::vector<bool, std::allocator<bool>> onLink) [member function]
     cls.add_method('Assign', 
                    'ns3::Ipv6InterfaceContainer', 
                    [param('ns3::NetDeviceContainer const &', 'c'), param('std::vector< bool >', 'withConfiguration'), param('std::vector< bool >', 'onLink')])
@@ -3524,6 +3526,10 @@
     cls.add_constructor([param('ns3::PointToPointHelper const &', 'arg0')])
     ## point-to-point-helper.h (module 'point-to-point'): ns3::PointToPointHelper::PointToPointHelper() [constructor]
     cls.add_constructor([])
+    ## point-to-point-helper.h (module 'point-to-point'): void ns3::PointToPointHelper::DisableFlowControl() [member function]
+    cls.add_method('DisableFlowControl', 
+                   'void', 
+                   [])
     ## point-to-point-helper.h (module 'point-to-point'): ns3::NetDeviceContainer ns3::PointToPointHelper::Install(ns3::NodeContainer c) [member function]
     cls.add_method('Install', 
                    'ns3::NetDeviceContainer', 
@@ -4030,8 +4036,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -4254,14 +4260,14 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('>=')
     cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_unary_numeric_operator('-')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
     cls.add_constructor([])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(double const value) [constructor]
@@ -4280,6 +4286,8 @@
     cls.add_constructor([param('long unsigned int const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int const v) [constructor]
     cls.add_constructor([param('long long unsigned int const', 'v')])
+    ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int128_t const v) [constructor]
+    cls.add_constructor([param('int128_t const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t const hi, uint64_t const lo) [constructor]
     cls.add_constructor([param('int64_t const', 'hi'), param('uint64_t const', 'lo')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [constructor]
@@ -4443,10 +4451,6 @@
     cls.add_method('SetTcp', 
                    'void', 
                    [param('std::string', 'tid')])
-    ## internet-stack-helper.h (module 'internet'): void ns3::InternetStackHelper::SetTcp(std::string tid, std::string attr, ns3::AttributeValue const & val) [member function]
-    cls.add_method('SetTcp', 
-                   'void', 
-                   [param('std::string', 'tid'), param('std::string', 'attr'), param('ns3::AttributeValue const &', 'val')])
     ## internet-stack-helper.h (module 'internet'): void ns3::InternetStackHelper::EnableAsciiIpv4Internal(ns3::Ptr<ns3::OutputStreamWrapper> stream, std::string prefix, ns3::Ptr<ns3::Ipv4> ipv4, uint32_t interface, bool explicitFilename) [member function]
     cls.add_method('EnableAsciiIpv4Internal', 
                    'void', 
@@ -4951,86 +4955,86 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Ipv4MulticastRoute_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv4MulticastRoute__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter< ns3::Ipv4MulticastRoute > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Ipv4Route_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv4Route__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter< ns3::Ipv4Route > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3OutputStreamWrapper_Ns3Empty_Ns3DefaultDeleter__lt__ns3OutputStreamWrapper__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter< ns3::OutputStreamWrapper > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
@@ -5153,7 +5157,7 @@
                    'uint8_t', 
                    [param('uint8_t', 'ipTos')], 
                    is_static=True)
-    ## socket.h (module 'network'): void ns3::Socket::Ipv6JoinGroup(ns3::Ipv6Address address, ns3::Socket::Ipv6MulticastFilterMode filterMode, std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address> > sourceAddresses) [member function]
+    ## socket.h (module 'network'): void ns3::Socket::Ipv6JoinGroup(ns3::Ipv6Address address, ns3::Socket::Ipv6MulticastFilterMode filterMode, std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address>> sourceAddresses) [member function]
     cls.add_method('Ipv6JoinGroup', 
                    'void', 
                    [param('ns3::Ipv6Address', 'address'), param('ns3::Socket::Ipv6MulticastFilterMode', 'filterMode'), param('std::vector< ns3::Ipv6Address >', 'sourceAddresses')], 
@@ -6610,7 +6614,7 @@
                    'ns3::Ipv4Address', 
                    [], 
                    is_const=True)
-    ## ipv4-route.h (module 'internet'): std::map<unsigned int, unsigned int, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, unsigned int> > > ns3::Ipv4MulticastRoute::GetOutputTtlMap() const [member function]
+    ## ipv4-route.h (module 'internet'): std::map<unsigned int, unsigned int, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, unsigned int>>> ns3::Ipv4MulticastRoute::GetOutputTtlMap() const [member function]
     cls.add_method('GetOutputTtlMap', 
                    'std::map< unsigned int, unsigned int >', 
                    [], 
@@ -7535,10 +7539,16 @@
     cls.add_method('ExtractNeighborIndex', 
                    'uint32_t', 
                    [param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetEpoch() const [member function]
+    cls.add_method('GetEpoch', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() const [member function]
     cls.add_method('GetRemainingBits', 
                    'uint32_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -7549,6 +7559,10 @@
                    'uint32_t', 
                    [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
+    ## nix-vector.h (module 'network'): void ns3::NixVector::SetEpoch(uint32_t epoch) [member function]
+    cls.add_method('SetEpoch', 
+                   'void', 
+                   [param('uint32_t', 'epoch')])
     return
 
 def register_Ns3Node_methods(root_module, cls):
@@ -7880,10 +7894,11 @@
                    'uint32_t', 
                    [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) const [member function]
     cls.add_method('SetNixVector', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')], 
+                   is_const=True)
     ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
     cls.add_method('ToString', 
                    'std::string', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/point-to-point-layout/CMakeLists.txt ns-3.36/src/point-to-point-layout/CMakeLists.txt
--- ns-3.35/src/point-to-point-layout/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/point-to-point-layout/CMakeLists.txt	2022-04-30 18:23:58.122734800 -0700
@@ -0,0 +1,15 @@
+build_lib(
+  LIBNAME point-to-point-layout
+  SOURCE_FILES
+    model/point-to-point-dumbbell.cc
+    model/point-to-point-grid.cc
+    model/point-to-point-star.cc
+  HEADER_FILES
+    model/point-to-point-dumbbell.h
+    model/point-to-point-grid.h
+    model/point-to-point-star.h
+  LIBRARIES_TO_LINK
+    ${libinternet}
+    ${libpoint-to-point}
+    ${libmobility}
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/point-to-point-layout/doc/point-to-point-dumbbell.rst ns-3.36/src/point-to-point-layout/doc/point-to-point-dumbbell.rst
--- ns-3.35/src/point-to-point-layout/doc/point-to-point-dumbbell.rst	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/point-to-point-layout/doc/point-to-point-dumbbell.rst	2022-04-30 18:23:58.126734700 -0700
@@ -145,22 +145,22 @@
 ``src/netanim/examples``. The following command shows the available command-
 line options for this example::
 
-   $ ./waf --run "dumbbell-animation --PrintHelp"
+   $ ./ns3 run "dumbbell-animation --PrintHelp"
 
 The following command sets up a dumbbell topology with the default
 configuration::
 
-   $ ./waf --run dumbbell-animation
+   $ ./ns3 run dumbbell-animation
 
 The following command sets up a dumbbell topology with 6 left leaf nodes and 9
 right leaf nodes::
 
-   $ ./waf --run "dumbbell-animation --nLeftLeaf=6 --nRightLeaf=9"
+   $ ./ns3 run "dumbbell-animation --nLeftLeaf=6 --nRightLeaf=9"
 
 The following command sets up a dumbbell topology with 10 left leaf nodes and
 10 right leaf nodes::
 
-   $ ./waf --run "dumbbell-animation --nLeaf=10"
+   $ ./ns3 run "dumbbell-animation --nLeaf=10"
 
 The expected output from the previous commands is a XML file to playback the
 animation using NetAnim.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/point-to-point-layout/model/point-to-point-dumbbell.h ns-3.36/src/point-to-point-layout/model/point-to-point-dumbbell.h
--- ns-3.35/src/point-to-point-layout/model/point-to-point-dumbbell.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/point-to-point-layout/model/point-to-point-dumbbell.h	2022-04-30 18:23:58.126734700 -0700
@@ -23,12 +23,12 @@
 
 #include <string>
 
-#include "point-to-point-helper.h"
-#include "ipv4-address-helper.h"
-#include "ipv6-address-helper.h"
-#include "internet-stack-helper.h"
-#include "ipv4-interface-container.h"
-#include "ipv6-interface-container.h"
+#include "ns3/point-to-point-helper.h"
+#include "ns3/ipv4-address-helper.h"
+#include "ns3/ipv6-address-helper.h"
+#include "ns3/internet-stack-helper.h"
+#include "ns3/ipv4-interface-container.h"
+#include "ns3/ipv6-interface-container.h"
 
 namespace ns3 {
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/point-to-point-layout/model/point-to-point-grid.h ns-3.36/src/point-to-point-layout/model/point-to-point-grid.h
--- ns-3.35/src/point-to-point-layout/model/point-to-point-grid.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/point-to-point-layout/model/point-to-point-grid.h	2022-04-30 18:23:58.126734700 -0700
@@ -23,13 +23,13 @@
 
 #include <vector>
 
-#include "internet-stack-helper.h"
-#include "point-to-point-helper.h"
-#include "ipv4-address-helper.h"
-#include "ipv6-address-helper.h"
-#include "ipv4-interface-container.h"
-#include "ipv6-interface-container.h"
-#include "net-device-container.h"
+#include "ns3/internet-stack-helper.h"
+#include "ns3/point-to-point-helper.h"
+#include "ns3/ipv4-address-helper.h"
+#include "ns3/ipv6-address-helper.h"
+#include "ns3/ipv4-interface-container.h"
+#include "ns3/ipv6-interface-container.h"
+#include "ns3/net-device-container.h"
 
 namespace ns3 {
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/point-to-point-layout/model/point-to-point-star.h ns-3.36/src/point-to-point-layout/model/point-to-point-star.h
--- ns-3.35/src/point-to-point-layout/model/point-to-point-star.h	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/point-to-point-layout/model/point-to-point-star.h	2022-04-30 18:23:58.126734700 -0700
@@ -21,12 +21,12 @@
 
 #include <string>
 
-#include "point-to-point-helper.h"
-#include "ipv4-address-helper.h"
-#include "ipv6-address-helper.h"
-#include "internet-stack-helper.h"
-#include "ipv4-interface-container.h"
-#include "ipv6-interface-container.h"
+#include "ns3/point-to-point-helper.h"
+#include "ns3/ipv4-address-helper.h"
+#include "ns3/ipv6-address-helper.h"
+#include "ns3/internet-stack-helper.h"
+#include "ns3/ipv4-interface-container.h"
+#include "ns3/ipv6-interface-container.h"
 
 namespace ns3 {
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/point-to-point-layout/wscript ns-3.36/src/point-to-point-layout/wscript
--- ns-3.35/src/point-to-point-layout/wscript	2021-10-01 13:26:47.000000000 -0700
+++ ns-3.36/src/point-to-point-layout/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,23 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    module = bld.create_ns3_module('point-to-point-layout', ['internet', 'point-to-point', 'mobility'])
-    module.includes = '.'
-    module.source = [
-        'model/point-to-point-dumbbell.cc',
-        'model/point-to-point-grid.cc',
-        'model/point-to-point-star.cc',
-        ]
-
-    headers = bld(features='ns3header')
-    headers.module = 'point-to-point-layout'
-    headers.source = [
-        'model/point-to-point-dumbbell.h',
-        'model/point-to-point-grid.h',
-        'model/point-to-point-star.h',
-        ]
-
-    bld.ns3_python_bindings()
-
-
-
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/propagation/bindings/modulegen__gcc_ILP32.py ns-3.36/src/propagation/bindings/modulegen__gcc_ILP32.py
--- ns-3.35/src/propagation/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/propagation/bindings/modulegen__gcc_ILP32.py	2022-04-30 18:23:58.130735000 -0700
@@ -51,6 +51,8 @@
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::TraceSourceAccessor'])
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'], import_from_module='ns.core')
     ## hash.h (module 'core'): ns3::Hasher [class]
     module.add_class('Hasher', import_from_module='ns.core')
     ## log.h (module 'core'): ns3::LogComponent [class]
@@ -118,19 +120,19 @@
     module.add_class('RangePropagationLossModel', parent=root_module['ns3::PropagationLossModel'])
     ## random-variable-stream.h (module 'core'): ns3::SequentialRandomVariable [class]
     module.add_class('SequentialRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
     ## three-gpp-propagation-loss-model.h (module 'propagation'): ns3::ThreeGppPropagationLossModel [class]
     module.add_class('ThreeGppPropagationLossModel', parent=root_module['ns3::PropagationLossModel'])
@@ -279,7 +281,7 @@
     module.add_class('ProbabilisticV2vHighwayChannelConditionModel', parent=root_module['ns3::ThreeGppChannelConditionModel'])
     ## probabilistic-v2v-channel-condition-model.h (module 'propagation'): ns3::ProbabilisticV2vUrbanChannelConditionModel [class]
     module.add_class('ProbabilisticV2vUrbanChannelConditionModel', parent=root_module['ns3::ThreeGppChannelConditionModel'])
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     typehandlers.add_type_alias('ns3::Vector3D', 'ns3::Vector')
     typehandlers.add_type_alias('ns3::Vector3D*', 'ns3::Vector*')
     typehandlers.add_type_alias('ns3::Vector3D&', 'ns3::Vector&')
@@ -1064,8 +1066,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -1354,14 +1356,14 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('>=')
     cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_unary_numeric_operator('-')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
     cls.add_constructor([])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(double const value) [constructor]
@@ -1380,6 +1382,8 @@
     cls.add_constructor([param('long unsigned int const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int const v) [constructor]
     cls.add_constructor([param('long long unsigned int const', 'v')])
+    ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int128_t const v) [constructor]
+    cls.add_constructor([param('int128_t const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t const hi, uint64_t const lo) [constructor]
     cls.add_constructor([param('int64_t const', 'hi'), param('uint64_t const', 'lo')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [constructor]
@@ -1526,7 +1530,7 @@
     cls.add_method('DoAssignStreams', 
                    'int64_t', 
                    [param('int64_t', 'stream')], 
-                   is_pure_virtual=True, is_virtual=True, visibility='private')
+                   is_pure_virtual=True, is_virtual=True, visibility='protected')
     return
 
 def register_Ns3PropagationLossModel_methods(root_module, cls):
@@ -1554,16 +1558,16 @@
     cls.add_method('AssignStreams', 
                    'int64_t', 
                    [param('int64_t', 'stream')])
+    ## propagation-loss-model.h (module 'propagation'): int64_t ns3::PropagationLossModel::DoAssignStreams(int64_t stream) [member function]
+    cls.add_method('DoAssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')], 
+                   is_pure_virtual=True, is_virtual=True, visibility='protected')
     ## propagation-loss-model.h (module 'propagation'): double ns3::PropagationLossModel::DoCalcRxPower(double txPowerDbm, ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
     cls.add_method('DoCalcRxPower', 
                    'double', 
                    [param('double', 'txPowerDbm'), param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
                    is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
-    ## propagation-loss-model.h (module 'propagation'): int64_t ns3::PropagationLossModel::DoAssignStreams(int64_t stream) [member function]
-    cls.add_method('DoAssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'stream')], 
-                   is_pure_virtual=True, is_virtual=True, visibility='private')
     return
 
 def register_Ns3RandomPropagationDelayModel_methods(root_module, cls):
@@ -1712,51 +1716,51 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
@@ -2451,10 +2455,10 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## channel-condition-model.h (module 'propagation'): bool ns3::ChannelCondition::IsEqual(ns3::Ptr<const ns3::ChannelCondition> otherCondition) const [member function]
+    ## channel-condition-model.h (module 'propagation'): bool ns3::ChannelCondition::IsEqual(ns3::ChannelCondition::LosConditionValue losCondition, ns3::ChannelCondition::O2iConditionValue o2iCondition) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
-                   [param('ns3::Ptr< ns3::ChannelCondition const >', 'otherCondition')], 
+                   [param('ns3::ChannelCondition::LosConditionValue', 'losCondition'), param('ns3::ChannelCondition::O2iConditionValue', 'o2iCondition')], 
                    is_const=True)
     ## channel-condition-model.h (module 'propagation'): bool ns3::ChannelCondition::IsI2i() const [member function]
     cls.add_method('IsI2i', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/propagation/bindings/modulegen__gcc_LP64.py ns-3.36/src/propagation/bindings/modulegen__gcc_LP64.py
--- ns-3.35/src/propagation/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/propagation/bindings/modulegen__gcc_LP64.py	2022-04-30 18:23:58.130735000 -0700
@@ -51,6 +51,8 @@
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::TraceSourceAccessor'])
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'], import_from_module='ns.core')
     ## hash.h (module 'core'): ns3::Hasher [class]
     module.add_class('Hasher', import_from_module='ns.core')
     ## log.h (module 'core'): ns3::LogComponent [class]
@@ -118,19 +120,19 @@
     module.add_class('RangePropagationLossModel', parent=root_module['ns3::PropagationLossModel'])
     ## random-variable-stream.h (module 'core'): ns3::SequentialRandomVariable [class]
     module.add_class('SequentialRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
     ## three-gpp-propagation-loss-model.h (module 'propagation'): ns3::ThreeGppPropagationLossModel [class]
     module.add_class('ThreeGppPropagationLossModel', parent=root_module['ns3::PropagationLossModel'])
@@ -279,7 +281,7 @@
     module.add_class('ProbabilisticV2vHighwayChannelConditionModel', parent=root_module['ns3::ThreeGppChannelConditionModel'])
     ## probabilistic-v2v-channel-condition-model.h (module 'propagation'): ns3::ProbabilisticV2vUrbanChannelConditionModel [class]
     module.add_class('ProbabilisticV2vUrbanChannelConditionModel', parent=root_module['ns3::ThreeGppChannelConditionModel'])
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     typehandlers.add_type_alias('ns3::Vector3D', 'ns3::Vector')
     typehandlers.add_type_alias('ns3::Vector3D*', 'ns3::Vector*')
     typehandlers.add_type_alias('ns3::Vector3D&', 'ns3::Vector&')
@@ -1064,8 +1066,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -1354,14 +1356,14 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('>=')
     cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_unary_numeric_operator('-')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
     cls.add_constructor([])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(double const value) [constructor]
@@ -1380,6 +1382,8 @@
     cls.add_constructor([param('long unsigned int const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int const v) [constructor]
     cls.add_constructor([param('long long unsigned int const', 'v')])
+    ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int128_t const v) [constructor]
+    cls.add_constructor([param('int128_t const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t const hi, uint64_t const lo) [constructor]
     cls.add_constructor([param('int64_t const', 'hi'), param('uint64_t const', 'lo')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [constructor]
@@ -1526,7 +1530,7 @@
     cls.add_method('DoAssignStreams', 
                    'int64_t', 
                    [param('int64_t', 'stream')], 
-                   is_pure_virtual=True, is_virtual=True, visibility='private')
+                   is_pure_virtual=True, is_virtual=True, visibility='protected')
     return
 
 def register_Ns3PropagationLossModel_methods(root_module, cls):
@@ -1554,16 +1558,16 @@
     cls.add_method('AssignStreams', 
                    'int64_t', 
                    [param('int64_t', 'stream')])
+    ## propagation-loss-model.h (module 'propagation'): int64_t ns3::PropagationLossModel::DoAssignStreams(int64_t stream) [member function]
+    cls.add_method('DoAssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')], 
+                   is_pure_virtual=True, is_virtual=True, visibility='protected')
     ## propagation-loss-model.h (module 'propagation'): double ns3::PropagationLossModel::DoCalcRxPower(double txPowerDbm, ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
     cls.add_method('DoCalcRxPower', 
                    'double', 
                    [param('double', 'txPowerDbm'), param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
                    is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
-    ## propagation-loss-model.h (module 'propagation'): int64_t ns3::PropagationLossModel::DoAssignStreams(int64_t stream) [member function]
-    cls.add_method('DoAssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'stream')], 
-                   is_pure_virtual=True, is_virtual=True, visibility='private')
     return
 
 def register_Ns3RandomPropagationDelayModel_methods(root_module, cls):
@@ -1712,51 +1716,51 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
@@ -2451,10 +2455,10 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## channel-condition-model.h (module 'propagation'): bool ns3::ChannelCondition::IsEqual(ns3::Ptr<const ns3::ChannelCondition> otherCondition) const [member function]
+    ## channel-condition-model.h (module 'propagation'): bool ns3::ChannelCondition::IsEqual(ns3::ChannelCondition::LosConditionValue losCondition, ns3::ChannelCondition::O2iConditionValue o2iCondition) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
-                   [param('ns3::Ptr< ns3::ChannelCondition const >', 'otherCondition')], 
+                   [param('ns3::ChannelCondition::LosConditionValue', 'losCondition'), param('ns3::ChannelCondition::O2iConditionValue', 'o2iCondition')], 
                    is_const=True)
     ## channel-condition-model.h (module 'propagation'): bool ns3::ChannelCondition::IsI2i() const [member function]
     cls.add_method('IsI2i', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/propagation/CMakeLists.txt ns-3.36/src/propagation/CMakeLists.txt
--- ns-3.35/src/propagation/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/propagation/CMakeLists.txt	2022-04-30 18:23:58.130735000 -0700
@@ -0,0 +1,45 @@
+build_lib(
+  LIBNAME propagation
+  SOURCE_FILES
+    model/channel-condition-model.cc
+    model/cost231-propagation-loss-model.cc
+    model/itu-r-1411-los-propagation-loss-model.cc
+    model/itu-r-1411-nlos-over-rooftop-propagation-loss-model.cc
+    model/jakes-process.cc
+    model/jakes-propagation-loss-model.cc
+    model/kun-2600-mhz-propagation-loss-model.cc
+    model/okumura-hata-propagation-loss-model.cc
+    model/probabilistic-v2v-channel-condition-model.cc
+    model/propagation-delay-model.cc
+    model/propagation-loss-model.cc
+    model/three-gpp-propagation-loss-model.cc
+    model/three-gpp-v2v-propagation-loss-model.cc
+  HEADER_FILES
+    model/channel-condition-model.h
+    model/cost231-propagation-loss-model.h
+    model/itu-r-1411-los-propagation-loss-model.h
+    model/itu-r-1411-nlos-over-rooftop-propagation-loss-model.h
+    model/jakes-process.h
+    model/jakes-propagation-loss-model.h
+    model/kun-2600-mhz-propagation-loss-model.h
+    model/okumura-hata-propagation-loss-model.h
+    model/probabilistic-v2v-channel-condition-model.h
+    model/propagation-cache.h
+    model/propagation-delay-model.h
+    model/propagation-environment.h
+    model/propagation-loss-model.h
+    model/three-gpp-propagation-loss-model.h
+    model/three-gpp-v2v-propagation-loss-model.h
+  LIBRARIES_TO_LINK ${libnetwork}
+                    ${libmobility}
+  TEST_SOURCES
+    test/channel-condition-model-test-suite.cc
+    test/itu-r-1411-los-test-suite.cc
+    test/itu-r-1411-nlos-over-rooftop-test-suite.cc
+    test/kun-2600-mhz-test-suite.cc
+    test/okumura-hata-test-suite.cc
+    test/probabilistic-v2v-channel-condition-model-test.cc
+    test/propagation-loss-model-test-suite.cc
+    test/three-gpp-propagation-loss-model-test-suite.cc
+    test/three-gpp-propagation-loss-model-test-suite.cc
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/propagation/examples/CMakeLists.txt ns-3.36/src/propagation/examples/CMakeLists.txt
--- ns-3.35/src/propagation/examples/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/propagation/examples/CMakeLists.txt	2022-04-30 18:23:58.130735000 -0700
@@ -0,0 +1,20 @@
+build_lib_example(
+  NAME main-propagation-loss
+  SOURCE_FILES main-propagation-loss.cc
+  LIBRARIES_TO_LINK
+    ${libcore}
+    ${libpropagation}
+    ${libconfig-store}
+    ${libstats}
+    ${libmobility}
+    ${libbuildings}
+)
+
+build_lib_example(
+  NAME jakes-propagation-model-example
+  SOURCE_FILES jakes-propagation-model-example.cc
+  LIBRARIES_TO_LINK
+    ${libcore}
+    ${libpropagation}
+    ${libbuildings}
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/propagation/examples/wscript ns-3.36/src/propagation/examples/wscript
--- ns-3.35/src/propagation/examples/wscript	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/propagation/examples/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,13 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    if not bld.env['ENABLE_EXAMPLES']:
-        return;
-
-    obj = bld.create_ns3_program('main-propagation-loss',
-                                 ['core', 'mobility', 'config-store', 'stats', 'propagation', 'buildings'])
-    obj.source = 'main-propagation-loss.cc'
-
-    obj = bld.create_ns3_program('jakes-propagation-model-example',
-                                 ['core', 'propagation', 'buildings'])
-    obj.source = 'jakes-propagation-model-example.cc'
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/propagation/model/channel-condition-model.cc ns-3.36/src/propagation/model/channel-condition-model.cc
--- ns-3.35/src/propagation/model/channel-condition-model.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/propagation/model/channel-condition-model.cc	2022-04-30 18:23:58.130735000 -0700
@@ -117,10 +117,9 @@
 }
 
 bool
-ChannelCondition::IsEqual (Ptr<const ChannelCondition> otherCondition) const
+ChannelCondition::IsEqual (LosConditionValue losCondition, O2iConditionValue o2iCondition) const
 {
-  return (m_o2iCondition == otherCondition->GetO2iCondition ()
-          && m_losCondition == otherCondition->GetLosCondition ());
+  return (m_losCondition == losCondition && m_o2iCondition == o2iCondition);
 }
 
 std::ostream& operator<< (std::ostream& os, ChannelCondition::LosConditionValue cond)
@@ -182,12 +181,9 @@
 {}
 
 Ptr<ChannelCondition>
-AlwaysLosChannelConditionModel::GetChannelCondition (Ptr<const MobilityModel> a,
-                                                     Ptr<const MobilityModel> b) const
+AlwaysLosChannelConditionModel::GetChannelCondition ([[maybe_unused]] Ptr<const MobilityModel> a,
+                                                     [[maybe_unused]] Ptr<const MobilityModel> b) const
 {
-  NS_UNUSED (a);
-  NS_UNUSED (b);
-
   Ptr<ChannelCondition> c = CreateObject<ChannelCondition> (ChannelCondition::LOS);
 
   return c;
@@ -221,12 +217,9 @@
 {}
 
 Ptr<ChannelCondition>
-NeverLosChannelConditionModel::GetChannelCondition (Ptr<const MobilityModel> a,
-                                                    Ptr<const MobilityModel> b) const
+NeverLosChannelConditionModel::GetChannelCondition ([[maybe_unused]] Ptr<const MobilityModel> a,
+                                                    [[maybe_unused]] Ptr<const MobilityModel> b) const
 {
-  NS_UNUSED (a);
-  NS_UNUSED (b);
-
   Ptr<ChannelCondition> c = CreateObject<ChannelCondition> (ChannelCondition::NLOS);
 
   return c;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/propagation/model/channel-condition-model.h ns-3.36/src/propagation/model/channel-condition-model.h
--- ns-3.35/src/propagation/model/channel-condition-model.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/propagation/model/channel-condition-model.h	2022-04-30 18:23:58.130735000 -0700
@@ -100,7 +100,7 @@
    * Set the LosConditionValue with the information about the LOS/NLOS
    * state of the channel
    *
-   * \param the LosConditionValue
+   * \param losCondition the LosConditionValue
    */
   void SetLosCondition (LosConditionValue losCondition);
   
@@ -169,10 +169,11 @@
   /**
    * Return true if this instance is equivalent to the one passed as argument
    *
-   * \param otherCondition the other instance to compare with this instance
-   * \return true if this instance is equivalent to the one passed as argument
+   * \param losCondition the LOS condition of the other channel condition instance
+   * \param o2iCondition the 02I condition of the other channel condition instance
+   * \return true if the channel LOS and O2i conditions of the instance are equivalent to those passed as arguments
    */
-  bool IsEqual (Ptr<const ChannelCondition> otherCondition) const;
+  bool IsEqual (LosConditionValue losCondition, O2iConditionValue o2iCondition) const;
 
 private:
   LosConditionValue m_losCondition; //!< contains the information about the LOS state of the channel
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/propagation/model/cost231-propagation-loss-model.h ns-3.36/src/propagation/model/cost231-propagation-loss-model.h
--- ns-3.35/src/propagation/model/cost231-propagation-loss-model.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/propagation/model/cost231-propagation-loss-model.h	2022-04-30 18:23:58.130735000 -0700
@@ -58,6 +58,10 @@
   static TypeId GetTypeId (void);
   Cost231PropagationLossModel ();
 
+  // Delete copy constructor and assignment operator to avoid misuse
+  Cost231PropagationLossModel (const Cost231PropagationLossModel &) = delete;
+  Cost231PropagationLossModel & operator = (const Cost231PropagationLossModel &) = delete;
+
   /**
    * Get the propagation loss
    * \param a the mobility model of the source
@@ -123,30 +127,17 @@
    * \param shadowing the shadowing value
    */
   void SetShadowing (double shadowing);
+
 private:
-  /**
-   * \brief Copy constructor
-   *
-   * Defined and unimplemented to avoid misuse
-   */
-  Cost231PropagationLossModel (const Cost231PropagationLossModel &);
-  /**
-   * \brief Copy constructor
-   *
-   * Defined and unimplemented to avoid misuse
-   * \returns
-   */
-  Cost231PropagationLossModel & operator = (const Cost231PropagationLossModel &);
+  double DoCalcRxPower (double txPowerDbm, Ptr<MobilityModel> a, Ptr<MobilityModel> b) const override;
+  int64_t DoAssignStreams (int64_t stream) override;
 
-  virtual double DoCalcRxPower (double txPowerDbm, Ptr<MobilityModel> a, Ptr<MobilityModel> b) const;
-  virtual int64_t DoAssignStreams (int64_t stream);
   double m_BSAntennaHeight; //!< BS Antenna Height [m]
   double m_SSAntennaHeight; //!< SS Antenna Height [m]
   double m_lambda; //!< The wavelength
   double m_minDistance; //!< minimum distance [m]
   double m_frequency; //!< frequency [Hz]
   double m_shadowing; //!< Shadowing loss [dB]
-
 };
 
 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/propagation/model/itu-r-1411-los-propagation-loss-model.h ns-3.36/src/propagation/model/itu-r-1411-los-propagation-loss-model.h
--- ns-3.35/src/propagation/model/itu-r-1411-los-propagation-loss-model.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/propagation/model/itu-r-1411-los-propagation-loss-model.h	2022-04-30 18:23:58.130735000 -0700
@@ -53,6 +53,10 @@
   ItuR1411LosPropagationLossModel ();
   virtual ~ItuR1411LosPropagationLossModel ();
 
+  // Delete copy constructor and assignment operator to avoid misuse
+  ItuR1411LosPropagationLossModel (const ItuR1411LosPropagationLossModel &) = delete;
+  ItuR1411LosPropagationLossModel & operator = (const ItuR1411LosPropagationLossModel &) = delete;
+
   /** 
    * Set the operating frequency
    * 
@@ -72,25 +76,12 @@
   double GetLoss (Ptr<MobilityModel> a, Ptr<MobilityModel> b) const;
 
 private:
-  /**
-   * \brief Copy constructor
-   *
-   * Defined and unimplemented to avoid misuse
-   */
-  ItuR1411LosPropagationLossModel (const ItuR1411LosPropagationLossModel &);
-  /**
-   * \brief Copy constructor
-   *
-   * Defined and unimplemented to avoid misuse
-   * \returns
-   */
-  ItuR1411LosPropagationLossModel & operator = (const ItuR1411LosPropagationLossModel &);
+  double DoCalcRxPower (double txPowerDbm,
+                        Ptr<MobilityModel> a,
+                        Ptr<MobilityModel> b) const override;
+
+  int64_t DoAssignStreams (int64_t stream) override;
 
-  virtual double DoCalcRxPower (double txPowerDbm,
-                                Ptr<MobilityModel> a,
-                                Ptr<MobilityModel> b) const;
-  virtual int64_t DoAssignStreams (int64_t stream);
-  
   double m_lambda; //!< wavelength
 };
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/propagation/model/itu-r-1411-nlos-over-rooftop-propagation-loss-model.h ns-3.36/src/propagation/model/itu-r-1411-nlos-over-rooftop-propagation-loss-model.h
--- ns-3.35/src/propagation/model/itu-r-1411-nlos-over-rooftop-propagation-loss-model.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/propagation/model/itu-r-1411-nlos-over-rooftop-propagation-loss-model.h	2022-04-30 18:23:58.130735000 -0700
@@ -53,6 +53,10 @@
   ItuR1411NlosOverRooftopPropagationLossModel ();
   virtual ~ItuR1411NlosOverRooftopPropagationLossModel ();
 
+  // Delete copy constructor and assignment operator to avoid misuse
+  ItuR1411NlosOverRooftopPropagationLossModel (const ItuR1411NlosOverRooftopPropagationLossModel &) = delete;
+  ItuR1411NlosOverRooftopPropagationLossModel & operator = (const ItuR1411NlosOverRooftopPropagationLossModel &) = delete;
+
   /** 
    * Set the operating frequency
    * 
@@ -72,25 +76,11 @@
   double GetLoss (Ptr<MobilityModel> a, Ptr<MobilityModel> b) const;
 
 private:
-  /**
-   * \brief Copy constructor
-   *
-   * Defined and unimplemented to avoid misuse
-   */
-  ItuR1411NlosOverRooftopPropagationLossModel (const ItuR1411NlosOverRooftopPropagationLossModel &);
-  /**
-   * \brief Copy constructor
-   *
-   * Defined and unimplemented to avoid misuse
-   * \returns
-   */
-  ItuR1411NlosOverRooftopPropagationLossModel & operator = (const ItuR1411NlosOverRooftopPropagationLossModel &);
+  double DoCalcRxPower (double txPowerDbm,
+                        Ptr<MobilityModel> a,
+                        Ptr<MobilityModel> b) const override;
+  int64_t DoAssignStreams (int64_t stream) override;
 
-  virtual double DoCalcRxPower (double txPowerDbm,
-                                Ptr<MobilityModel> a,
-                                Ptr<MobilityModel> b) const;
-  virtual int64_t DoAssignStreams (int64_t stream);
-  
   double m_frequency; //!< frequency in MHz
   double m_lambda; //!< wavelength
   EnvironmentType m_environment; //!< Environment Scenario
@@ -107,4 +97,3 @@
 
 
 #endif // ITU_R_1411_NLOS_OVER_ROOFTOP_PROPAGATION_LOSS_MODEL_H
-
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/propagation/model/jakes-propagation-loss-model.h ns-3.36/src/propagation/model/jakes-propagation-loss-model.h
--- ns-3.35/src/propagation/model/jakes-propagation-loss-model.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/propagation/model/jakes-propagation-loss-model.h	2022-04-30 18:23:58.130735000 -0700
@@ -43,27 +43,19 @@
   static TypeId GetTypeId ();
   JakesPropagationLossModel ();
   virtual ~JakesPropagationLossModel ();
-  
+
+  // Delete copy constructor and assignment operator to avoid misuse
+  JakesPropagationLossModel (const JakesPropagationLossModel &) = delete;
+  JakesPropagationLossModel & operator = (const JakesPropagationLossModel &) = delete;
+
 private:
   friend class JakesProcess;
 
-  /**
-   * \brief Copy constructor
-   *
-   * Defined and unimplemented to avoid misuse
-   */
-  JakesPropagationLossModel (const JakesPropagationLossModel &);
-  /**
-   * \brief Copy constructor
-   *
-   * Defined and unimplemented to avoid misuse
-   * \returns
-   */
-  JakesPropagationLossModel & operator = (const JakesPropagationLossModel &);
   double DoCalcRxPower (double txPowerDbm,
                         Ptr<MobilityModel> a,
-                        Ptr<MobilityModel> b) const;
-  virtual int64_t DoAssignStreams (int64_t stream);
+                        Ptr<MobilityModel> b) const override;
+
+  int64_t DoAssignStreams (int64_t stream) override;
 
   /**
    * Get the underlying RNG stream
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/propagation/model/kun-2600-mhz-propagation-loss-model.h ns-3.36/src/propagation/model/kun-2600-mhz-propagation-loss-model.h
--- ns-3.35/src/propagation/model/kun-2600-mhz-propagation-loss-model.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/propagation/model/kun-2600-mhz-propagation-loss-model.h	2022-04-30 18:23:58.130735000 -0700
@@ -51,6 +51,10 @@
   Kun2600MhzPropagationLossModel ();
   virtual ~Kun2600MhzPropagationLossModel ();
 
+  // Delete copy constructor and assignment operator to avoid misuse
+  Kun2600MhzPropagationLossModel (const Kun2600MhzPropagationLossModel &) = delete;
+  Kun2600MhzPropagationLossModel & operator = (const Kun2600MhzPropagationLossModel &) = delete;
+
   /** 
    * \param a the first mobility model
    * \param b the second mobility model
@@ -61,26 +65,11 @@
   double GetLoss (Ptr<MobilityModel> a, Ptr<MobilityModel> b) const;
 
 private:
-  /**
-   * \brief Copy constructor
-   *
-   * Defined and unimplemented to avoid misuse
-   */
-  Kun2600MhzPropagationLossModel (const Kun2600MhzPropagationLossModel &);
-  /**
-   * \brief Copy constructor
-   *
-   * Defined and unimplemented to avoid misuse
-   * \returns
-   */
-  Kun2600MhzPropagationLossModel & operator = (const Kun2600MhzPropagationLossModel &);
-
   // inherited from PropagationLossModel
-  virtual double DoCalcRxPower (double txPowerDbm,
-                                Ptr<MobilityModel> a,
-                                Ptr<MobilityModel> b) const;
-  virtual int64_t DoAssignStreams (int64_t stream);
-  
+  double DoCalcRxPower (double txPowerDbm,
+                        Ptr<MobilityModel> a,
+                        Ptr<MobilityModel> b) const override;
+  int64_t DoAssignStreams (int64_t stream) override;
 };
 
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/propagation/model/okumura-hata-propagation-loss-model.h ns-3.36/src/propagation/model/okumura-hata-propagation-loss-model.h
--- ns-3.35/src/propagation/model/okumura-hata-propagation-loss-model.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/propagation/model/okumura-hata-propagation-loss-model.h	2022-04-30 18:23:58.130735000 -0700
@@ -54,6 +54,10 @@
   OkumuraHataPropagationLossModel ();
   virtual ~OkumuraHataPropagationLossModel ();
 
+  // Delete copy constructor and assignment operator to avoid misuse
+  OkumuraHataPropagationLossModel (const OkumuraHataPropagationLossModel &) = delete;
+  OkumuraHataPropagationLossModel & operator = (const OkumuraHataPropagationLossModel &) = delete;
+
   /** 
    * \param a the first mobility model
    * \param b the second mobility model
@@ -64,25 +68,11 @@
   double GetLoss (Ptr<MobilityModel> a, Ptr<MobilityModel> b) const;
 
 private:
-  /**
-   * \brief Copy constructor
-   *
-   * Defined and unimplemented to avoid misuse
-   */
-  OkumuraHataPropagationLossModel (const OkumuraHataPropagationLossModel &);
-  /**
-   * \brief Copy constructor
-   *
-   * Defined and unimplemented to avoid misuse
-   * \returns
-   */
-  OkumuraHataPropagationLossModel & operator = (const OkumuraHataPropagationLossModel &);
+  double DoCalcRxPower (double txPowerDbm,
+                        Ptr<MobilityModel> a,
+                        Ptr<MobilityModel> b) const override;
+  int64_t DoAssignStreams (int64_t stream) override;
 
-  virtual double DoCalcRxPower (double txPowerDbm,
-                                Ptr<MobilityModel> a,
-                                Ptr<MobilityModel> b) const;
-  virtual int64_t DoAssignStreams (int64_t stream);
-  
   EnvironmentType m_environment;  //!< Environment Scenario
   CitySize m_citySize;  //!< Size of the city
   double m_frequency; //!< frequency in Hz
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/propagation/model/propagation-delay-model.h ns-3.36/src/propagation/model/propagation-delay-model.h
--- ns-3.35/src/propagation/model/propagation-delay-model.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/propagation/model/propagation-delay-model.h	2022-04-30 18:23:58.130735000 -0700
@@ -58,14 +58,19 @@
    * 'stream'.  Return the number of streams (possibly zero) that
    * have been assigned.
    *
-   * \param stream
+   * \param stream first stream index to use
    * \return the number of stream indices assigned by this model
    */
   int64_t AssignStreams (int64_t stream);
-private:
+protected:
   /**
+   * Assign a fixed random variable stream number to the random variables used by this model.
+   * 
    * Subclasses must implement this; those not using random variables
-   * can return zero
+   * can return zero.
+   * 
+   * \param stream first stream index to use
+   * \return the number of stream indices assigned by this model
    */
   virtual int64_t DoAssignStreams (int64_t stream) = 0;
 };
@@ -89,9 +94,9 @@
    */
   RandomPropagationDelayModel ();
   virtual ~RandomPropagationDelayModel ();
-  virtual Time GetDelay (Ptr<MobilityModel> a, Ptr<MobilityModel> b) const;
+  Time GetDelay (Ptr<MobilityModel> a, Ptr<MobilityModel> b) const override;
 private:
-  virtual int64_t DoAssignStreams (int64_t stream);
+  int64_t DoAssignStreams (int64_t stream) override;
   Ptr<RandomVariableStream> m_variable; //!< random generator
 };
 
@@ -113,7 +118,7 @@
    * Use the default parameters from PropagationDelayConstantSpeed.
    */
   ConstantSpeedPropagationDelayModel ();
-  virtual Time GetDelay (Ptr<MobilityModel> a, Ptr<MobilityModel> b) const;
+  Time GetDelay (Ptr<MobilityModel> a, Ptr<MobilityModel> b) const override;
   /**
    * \param speed the new speed (m/s)
    */
@@ -123,7 +128,7 @@
    */
   double GetSpeed (void) const;
 private:
-  virtual int64_t DoAssignStreams (int64_t stream);
+  int64_t DoAssignStreams (int64_t stream) override;
   double m_speed; //!< speed
 };
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/propagation/model/propagation-loss-model.h ns-3.36/src/propagation/model/propagation-loss-model.h
--- ns-3.35/src/propagation/model/propagation-loss-model.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/propagation/model/propagation-loss-model.h	2022-04-30 18:23:58.130735000 -0700
@@ -33,7 +33,12 @@
 
 /**
  * \defgroup propagation Propagation Models
- *
+ */
+
+/**
+ * \ingroup propagation
+ * \ingroup tests
+ * \defgroup propagation-tests Propagation module tests
  */
 
 class MobilityModel;
@@ -59,6 +64,10 @@
   PropagationLossModel ();
   virtual ~PropagationLossModel ();
 
+  // Delete copy constructor and assignment operator to avoid misuse
+  PropagationLossModel (const PropagationLossModel &) = delete;
+  PropagationLossModel & operator = (const PropagationLossModel &) = delete;
+
   /**
    * \brief Enables a chain of loss models to act on the signal
    * \param next The next PropagationLossModel to add to the chain
@@ -101,28 +110,25 @@
    * together, this method will also assign streams to the
    * downstream models.
    *
-   * \param stream
+   * \param stream the stream index offset start
    * \return the number of stream indices assigned by this model
    */
   int64_t AssignStreams (int64_t stream);
 
-private:
+protected:
   /**
-   * \brief Copy constructor
-   *
-   * Defined and unimplemented to avoid misuse
-   */
-  PropagationLossModel (const PropagationLossModel &);
-  /**
-   * \brief Copy constructor
-   *
-   * Defined and unimplemented to avoid misuse
-   * \returns
+   * Assign a fixed random variable stream number to the random variables used by this model.
+   * 
+   * Subclasses must implement this; those not using random variables
+   * can return zero.
+   * 
+   * \param stream first stream index to use
+   * \return the number of stream indices assigned by this model
    */
-  PropagationLossModel &operator = (const PropagationLossModel &);
+  virtual int64_t DoAssignStreams (int64_t stream) = 0;
 
+private:
   /**
-   * Returns the Rx Power taking into account only the particular
    * PropagationLossModel.
    *
    * \param txPowerDbm current transmission power (in dBm)
@@ -134,12 +140,6 @@
                                 Ptr<MobilityModel> a,
                                 Ptr<MobilityModel> b) const = 0;
 
-  /**
-   * Subclasses must implement this; those not using random variables
-   * can return zero
-   */
-  virtual int64_t DoAssignStreams (int64_t stream) = 0;
-
   Ptr<PropagationLossModel> m_next; //!< Next propagation loss model in the list
 };
 
@@ -160,24 +160,16 @@
   RandomPropagationLossModel ();
   virtual ~RandomPropagationLossModel ();
 
+  // Delete copy constructor and assignment operator to avoid misuse
+  RandomPropagationLossModel (const RandomPropagationLossModel &) = delete;
+  RandomPropagationLossModel & operator = (const RandomPropagationLossModel &) = delete;
+
 private:
-  /**
-   * \brief Copy constructor
-   *
-   * Defined and unimplemented to avoid misuse
-   */
-  RandomPropagationLossModel (const RandomPropagationLossModel &);
-  /**
-   * \brief Copy constructor
-   *
-   * Defined and unimplemented to avoid misuse
-   * \returns
-   */
-  RandomPropagationLossModel & operator = (const RandomPropagationLossModel &);
-  virtual double DoCalcRxPower (double txPowerDbm,
-                                Ptr<MobilityModel> a,
-                                Ptr<MobilityModel> b) const;
-  virtual int64_t DoAssignStreams (int64_t stream);
+  double DoCalcRxPower (double txPowerDbm,
+                        Ptr<MobilityModel> a,
+                        Ptr<MobilityModel> b) const override;
+  int64_t DoAssignStreams (int64_t stream) override;
+
   Ptr<RandomVariableStream> m_variable; //!< random generator
 };
 
@@ -267,6 +259,11 @@
    */
   static TypeId GetTypeId (void);
   FriisPropagationLossModel ();
+
+  // Delete copy constructor and assignment operator to avoid misuse
+  FriisPropagationLossModel (const FriisPropagationLossModel &) = delete;
+  FriisPropagationLossModel & operator = (const FriisPropagationLossModel &) = delete;
+
   /**
    * \param frequency (Hz)
    *
@@ -304,24 +301,10 @@
   double GetSystemLoss (void) const;
 
 private:
-  /**
-   * \brief Copy constructor
-   *
-   * Defined and unimplemented to avoid misuse
-   */
-  FriisPropagationLossModel (const FriisPropagationLossModel &);
-  /**
-   * \brief Copy constructor
-   *
-   * Defined and unimplemented to avoid misuse
-   * \returns
-   */
-  FriisPropagationLossModel & operator = (const FriisPropagationLossModel &);
-
-  virtual double DoCalcRxPower (double txPowerDbm,
-                                Ptr<MobilityModel> a,
-                                Ptr<MobilityModel> b) const;
-  virtual int64_t DoAssignStreams (int64_t stream);
+  double DoCalcRxPower (double txPowerDbm,
+                        Ptr<MobilityModel> a,
+                        Ptr<MobilityModel> b) const override;
+  int64_t DoAssignStreams (int64_t stream) override;
 
   /**
    * Transforms a Dbm value to Watt
@@ -381,6 +364,10 @@
   static TypeId GetTypeId (void);
   TwoRayGroundPropagationLossModel ();
 
+  // Delete copy constructor and assignment operator to avoid misuse
+  TwoRayGroundPropagationLossModel (const TwoRayGroundPropagationLossModel &) = delete;
+  TwoRayGroundPropagationLossModel & operator = (const TwoRayGroundPropagationLossModel &) = delete;
+
   /**
    * \param frequency (Hz)
    *
@@ -424,24 +411,10 @@
   void SetHeightAboveZ (double heightAboveZ);
 
 private:
-  /**
-   * \brief Copy constructor
-   *
-   * Defined and unimplemented to avoid misuse
-   */
-  TwoRayGroundPropagationLossModel (const TwoRayGroundPropagationLossModel &);
-  /**
-   * \brief Copy constructor
-   *
-   * Defined and unimplemented to avoid misuse
-   * \returns
-   */
-  TwoRayGroundPropagationLossModel & operator = (const TwoRayGroundPropagationLossModel &);
-
-  virtual double DoCalcRxPower (double txPowerDbm,
-                                Ptr<MobilityModel> a,
-                                Ptr<MobilityModel> b) const;
-  virtual int64_t DoAssignStreams (int64_t stream);
+  double DoCalcRxPower (double txPowerDbm,
+                        Ptr<MobilityModel> a,
+                        Ptr<MobilityModel> b) const override;
+  int64_t DoAssignStreams (int64_t stream) override;
 
   /**
    * Transforms a Dbm value to Watt
@@ -494,6 +467,10 @@
   static TypeId GetTypeId (void);
   LogDistancePropagationLossModel ();
 
+  // Delete copy constructor and assignment operator to avoid misuse
+  LogDistancePropagationLossModel (const LogDistancePropagationLossModel &) = delete;
+  LogDistancePropagationLossModel & operator = (const LogDistancePropagationLossModel &) = delete;
+
   /**
    * \param n the path loss exponent.
    * Set the path loss exponent.
@@ -512,24 +489,11 @@
   void SetReference (double referenceDistance, double referenceLoss);
 
 private:
-  /**
-   * \brief Copy constructor
-   *
-   * Defined and unimplemented to avoid misuse
-   */
-  LogDistancePropagationLossModel (const LogDistancePropagationLossModel &);
-  /**
-   * \brief Copy constructor
-   *
-   * Defined and unimplemented to avoid misuse
-   * \returns
-   */
-  LogDistancePropagationLossModel & operator = (const LogDistancePropagationLossModel &);
+  double DoCalcRxPower (double txPowerDbm,
+                        Ptr<MobilityModel> a,
+                        Ptr<MobilityModel> b) const override;
 
-  virtual double DoCalcRxPower (double txPowerDbm,
-                                Ptr<MobilityModel> a,
-                                Ptr<MobilityModel> b) const;
-  virtual int64_t DoAssignStreams (int64_t stream);
+  int64_t DoAssignStreams (int64_t stream) override;
 
   /**
    *  Creates a default reference loss model
@@ -592,27 +556,18 @@
   static TypeId GetTypeId (void);
   ThreeLogDistancePropagationLossModel ();
 
+  // Delete copy constructor and assignment operator to avoid misuse
+  ThreeLogDistancePropagationLossModel (const ThreeLogDistancePropagationLossModel &) = delete;
+  ThreeLogDistancePropagationLossModel & operator = (const ThreeLogDistancePropagationLossModel &) = delete;
+
   // Parameters are all accessible via attributes.
 
 private:
-  /**
-   * \brief Copy constructor
-   *
-   * Defined and unimplemented to avoid misuse
-   */
-  ThreeLogDistancePropagationLossModel (const ThreeLogDistancePropagationLossModel&);
-  /**
-   * \brief Copy constructor
-   *
-   * Defined and unimplemented to avoid misuse
-   * \returns
-   */
-  ThreeLogDistancePropagationLossModel& operator= (const ThreeLogDistancePropagationLossModel&);
+  double DoCalcRxPower (double txPowerDbm,
+                        Ptr<MobilityModel> a,
+                        Ptr<MobilityModel> b) const override;
 
-  virtual double DoCalcRxPower (double txPowerDbm,
-                                Ptr<MobilityModel> a,
-                                Ptr<MobilityModel> b) const;
-  virtual int64_t DoAssignStreams (int64_t stream);
+  int64_t DoAssignStreams (int64_t stream) override;
 
   double m_distance0; //!< Beginning of the first (near) distance field
   double m_distance1; //!< Beginning of the second (middle) distance field.
@@ -663,27 +618,18 @@
 
   NakagamiPropagationLossModel ();
 
+  // Delete copy constructor and assignment operator to avoid misuse
+  NakagamiPropagationLossModel (const NakagamiPropagationLossModel &) = delete;
+  NakagamiPropagationLossModel & operator = (const NakagamiPropagationLossModel &) = delete;
+
   // Parameters are all accessible via attributes.
 
 private:
-  /**
-   * \brief Copy constructor
-   *
-   * Defined and unimplemented to avoid misuse
-   */
-  NakagamiPropagationLossModel (const NakagamiPropagationLossModel&);
-  /**
-   * \brief Copy constructor
-   *
-   * Defined and unimplemented to avoid misuse
-   * \returns
-   */
-  NakagamiPropagationLossModel& operator= (const NakagamiPropagationLossModel&);
+  double DoCalcRxPower (double txPowerDbm,
+                        Ptr<MobilityModel> a,
+                        Ptr<MobilityModel> b) const override;
 
-  virtual double DoCalcRxPower (double txPowerDbm,
-                                Ptr<MobilityModel> a,
-                                Ptr<MobilityModel> b) const;
-  virtual int64_t DoAssignStreams (int64_t stream);
+  int64_t DoAssignStreams (int64_t stream) override;
 
   double m_distance1; //!< Distance1
   double m_distance2; //!< Distance2
@@ -720,6 +666,11 @@
 
   FixedRssLossModel ();
   virtual ~FixedRssLossModel ();
+
+  // Delete copy constructor and assignment operator to avoid misuse
+  FixedRssLossModel (const FixedRssLossModel &) = delete;
+  FixedRssLossModel & operator = (const FixedRssLossModel &) = delete;
+
   /**
    * \param rss (dBm) the received signal strength
    *
@@ -728,25 +679,12 @@
   void SetRss (double rss);
 
 private:
-  /**
-   * \brief Copy constructor
-   *
-   * Defined and unimplemented to avoid misuse
-   */
-  FixedRssLossModel (const FixedRssLossModel &);
-  /**
-   * \brief Copy constructor
-   *
-   * Defined and unimplemented to avoid misuse
-   * \returns
-   */
-  FixedRssLossModel & operator = (const FixedRssLossModel &);
+  double DoCalcRxPower (double txPowerDbm,
+                        Ptr<MobilityModel> a,
+                        Ptr<MobilityModel> b) const override;
 
-  virtual double DoCalcRxPower (double txPowerDbm,
-                                Ptr<MobilityModel> a,
-                                Ptr<MobilityModel> b) const;
+  int64_t DoAssignStreams (int64_t stream) override;
 
-  virtual int64_t DoAssignStreams (int64_t stream);
   double m_rss; //!< the received signal strength
 };
 
@@ -769,6 +707,10 @@
   MatrixPropagationLossModel ();
   virtual ~MatrixPropagationLossModel ();
 
+  // Delete copy constructor and assignment operator to avoid misuse
+  MatrixPropagationLossModel (const MatrixPropagationLossModel &) = delete;
+  MatrixPropagationLossModel & operator = (const MatrixPropagationLossModel &) = delete;
+
   /**
    * \brief Set loss (in dB, positive) between pair of ns-3 objects
    * (typically, nodes).
@@ -787,26 +729,12 @@
   void SetDefaultLoss (double defaultLoss);
 
 private:
-  /**
-   * \brief Copy constructor
-   *
-   * Defined and unimplemented to avoid misuse
-   */
-  MatrixPropagationLossModel (const MatrixPropagationLossModel &);
-  /**
-   * \brief Copy constructor
-   *
-   * Defined and unimplemented to avoid misuse
-   * \returns
-   */
-  MatrixPropagationLossModel &operator = (const MatrixPropagationLossModel &);
+  double DoCalcRxPower (double txPowerDbm,
+                        Ptr<MobilityModel> a,
+                        Ptr<MobilityModel> b) const override;
 
-  virtual double DoCalcRxPower (double txPowerDbm,
-                                Ptr<MobilityModel> a,
-                                Ptr<MobilityModel> b) const;
+  int64_t DoAssignStreams (int64_t stream) override;
 
-  virtual int64_t DoAssignStreams (int64_t stream);
-private:
   double m_default; //!< default loss
 
   /// Typedef: Mobility models pair
@@ -834,25 +762,18 @@
    */
   static TypeId GetTypeId (void);
   RangePropagationLossModel ();
+
+  // Delete copy constructor and assignment operator to avoid misuse
+  RangePropagationLossModel (const RangePropagationLossModel &) = delete;
+  RangePropagationLossModel & operator = (const RangePropagationLossModel &) = delete;
+
 private:
-  /**
-   * \brief Copy constructor
-   *
-   * Defined and unimplemented to avoid misuse
-   */
-  RangePropagationLossModel (const RangePropagationLossModel&);
-  /**
-   * \brief Copy constructor
-   *
-   * Defined and unimplemented to avoid misuse
-   * \returns
-   */
-  RangePropagationLossModel& operator= (const RangePropagationLossModel&);
-  virtual double DoCalcRxPower (double txPowerDbm,
-                                Ptr<MobilityModel> a,
-                                Ptr<MobilityModel> b) const;
-  virtual int64_t DoAssignStreams (int64_t stream);
-private:
+  double DoCalcRxPower (double txPowerDbm,
+                        Ptr<MobilityModel> a,
+                        Ptr<MobilityModel> b) const override;
+
+  int64_t DoAssignStreams (int64_t stream) override;
+
   double m_range; //!< Maximum Transmission Range (meters)
 };
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/propagation/model/three-gpp-propagation-loss-model.cc ns-3.36/src/propagation/model/three-gpp-propagation-loss-model.cc
--- ns-3.35/src/propagation/model/three-gpp-propagation-loss-model.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/propagation/model/three-gpp-propagation-loss-model.cc	2022-04-30 18:23:58.130735000 -0700
@@ -32,7 +32,7 @@
 
 NS_LOG_COMPONENT_DEFINE ("ThreeGppPropagationLossModel");
 
-static const double M_C = 3.0e8; // propagation velocity in free space
+static const double M_C = 3.0e8; //!< propagation velocity in free space
 
 // ------------------------------------------------------------------------- //
 
@@ -480,9 +480,8 @@
 }
 
 double
-ThreeGppRmaPropagationLossModel::Pl1 (double frequency, double distance3D, double h, double w)
+ThreeGppRmaPropagationLossModel::Pl1 (double frequency, double distance3D, double h, [[maybe_unused]] double w)
 {
-  NS_UNUSED (w);
   double loss = 20.0 * log10 (40.0 * M_PI * distance3D * frequency / 1e9 / 3.0) + std::min (0.03 * pow (h, 1.72), 10.0) * log10 (distance3D) - std::min (0.044 * pow (h, 1.72), 14.77) + 0.002 * log10 (h) * distance3D;
   return loss;
 }
@@ -651,11 +650,11 @@
 }
 
 double
-ThreeGppUmaPropagationLossModel::GetShadowingStd (Ptr<MobilityModel> a, Ptr<MobilityModel> b, ChannelCondition::LosConditionValue cond) const
+ThreeGppUmaPropagationLossModel::GetShadowingStd ([[maybe_unused]] Ptr<MobilityModel> a, 
+                                                  [[maybe_unused]] Ptr<MobilityModel> b, 
+                                                  ChannelCondition::LosConditionValue cond) const
 {
   NS_LOG_FUNCTION (this);
-  NS_UNUSED (a);
-  NS_UNUSED (b);
   double shadowingStd;
 
   if (cond == ChannelCondition::LosConditionValue::LOS)
@@ -736,10 +735,10 @@
 }
 
 double
-ThreeGppUmiStreetCanyonPropagationLossModel::GetBpDistance (double hUt, double hBs, double distance2D) const
+ThreeGppUmiStreetCanyonPropagationLossModel::GetBpDistance (double hUt, double hBs, 
+                                                            [[maybe_unused]] double distance2D) const
 {
   NS_LOG_FUNCTION (this);
-  NS_UNUSED (distance2D);
 
   // compute hE (see 3GPP TR 38.901, Table 7.4.1-1, Note 1)
   double hE = 1.0;
@@ -868,11 +867,11 @@
 }
 
 double
-ThreeGppUmiStreetCanyonPropagationLossModel::GetShadowingStd (Ptr<MobilityModel> a, Ptr<MobilityModel> b, ChannelCondition::LosConditionValue cond) const
+ThreeGppUmiStreetCanyonPropagationLossModel::GetShadowingStd ([[maybe_unused]] Ptr<MobilityModel> a, 
+                                                              [[maybe_unused]] Ptr<MobilityModel> b, 
+                                                              ChannelCondition::LosConditionValue cond) const
 {
   NS_LOG_FUNCTION (this);
-  NS_UNUSED (a);
-  NS_UNUSED (b);
   double shadowingStd;
 
   if (cond == ChannelCondition::LosConditionValue::LOS)
@@ -943,13 +942,12 @@
 }
 
 double
-ThreeGppIndoorOfficePropagationLossModel::GetLossLos (double distance2D, double distance3D, double hUt, double hBs) const
+ThreeGppIndoorOfficePropagationLossModel::GetLossLos ([[maybe_unused]] double distance2D, 
+                                                      [[maybe_unused]] double distance3D, 
+                                                      [[maybe_unused]] double hUt, 
+                                                      [[maybe_unused]] double hBs) const
 {
   NS_LOG_FUNCTION (this);
-  NS_UNUSED (distance2D);
-  NS_UNUSED (distance3D);
-  NS_UNUSED (hUt);
-  NS_UNUSED (hBs);
 
   // check if the distance is outside the validity range
   if (distance3D < 1.0 || distance3D > 150.0)
@@ -986,11 +984,11 @@
 }
 
 double
-ThreeGppIndoorOfficePropagationLossModel::GetShadowingStd (Ptr<MobilityModel> a, Ptr<MobilityModel> b, ChannelCondition::LosConditionValue cond) const
+ThreeGppIndoorOfficePropagationLossModel::GetShadowingStd ([[maybe_unused]] Ptr<MobilityModel> a, 
+                                                           [[maybe_unused]] Ptr<MobilityModel> b, 
+                                                           ChannelCondition::LosConditionValue cond) const
 {
   NS_LOG_FUNCTION (this);
-  NS_UNUSED (a);
-  NS_UNUSED (b);
   double shadowingStd;
 
   if (cond == ChannelCondition::LosConditionValue::LOS)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/propagation/model/three-gpp-propagation-loss-model.h ns-3.36/src/propagation/model/three-gpp-propagation-loss-model.h
--- ns-3.35/src/propagation/model/three-gpp-propagation-loss-model.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/propagation/model/three-gpp-propagation-loss-model.h	2022-04-30 18:23:58.130735000 -0700
@@ -26,8 +26,10 @@
 namespace ns3 {
 
 /**
-* \brief Base class for the 3GPP propagation models
-*/
+ * \ingroup propagation
+ * 
+ * \brief Base class for the 3GPP propagation models
+ */
 class ThreeGppPropagationLossModel : public PropagationLossModel
 {
 public:
@@ -101,15 +103,6 @@
                                 Ptr<MobilityModel> a,
                                 Ptr<MobilityModel> b) const override;
 
-  /**
-   * If this  model uses objects of type RandomVariableStream,
-   * set the stream numbers to the integers starting with the offset
-   * 'stream'. Return the number of streams (possibly zero) that
-   * have been assigned.
-   *
-   * \param stream
-   * \return the number of stream indices assigned by this model
-   */
   virtual int64_t DoAssignStreams (int64_t stream) override;
   
   /**
@@ -391,15 +384,6 @@
   ThreeGppUmaPropagationLossModel & operator = (const ThreeGppUmaPropagationLossModel &) = delete;
 
 private:
-  /**
-   * If this  model uses objects of type RandomVariableStream,
-   * set the stream numbers to the integers starting with the offset
-   * 'stream'. Return the number of streams (possibly zero) that
-   * have been assigned.
-   *
-   * \param stream
-   * \return the number of stream indices assigned by this model
-   */
   virtual int64_t DoAssignStreams (int64_t stream) override;
 
   /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/propagation/test/channel-condition-model-test-suite.cc ns-3.36/src/propagation/test/channel-condition-model-test-suite.cc
--- ns-3.35/src/propagation/test/channel-condition-model-test-suite.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/propagation/test/channel-condition-model-test-suite.cc	2022-04-30 18:23:58.130735000 -0700
@@ -32,6 +32,8 @@
 NS_LOG_COMPONENT_DEFINE ("ChannelConditionModelsTest");
 
 /**
+ * \ingroup propagation-tests
+ *
  * Test case for the 3GPP channel condition models. It determines the
  * channel condition multiple times, estimates the LOS probability and
  * compares it with the value given by the formulas in 3GPP TR 38.901,
@@ -263,6 +265,8 @@
 }
 
 /**
+ * \ingroup propagation-tests
+ *
  * Test suite for the channel condition models
  */
 class ChannelConditionModelsTestSuite : public TestSuite
@@ -277,4 +281,5 @@
   AddTestCase (new ThreeGppChannelConditionModelTestCase, TestCase::QUICK);
 }
 
-static ChannelConditionModelsTestSuite ChannelConditionModelsTestSuite;
+/// Static variable for test initialization
+static ChannelConditionModelsTestSuite g_channelConditionModelsTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/propagation/test/itu-r-1411-los-test-suite.cc ns-3.36/src/propagation/test/itu-r-1411-los-test-suite.cc
--- ns-3.35/src/propagation/test/itu-r-1411-los-test-suite.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/propagation/test/itu-r-1411-los-test-suite.cc	2022-04-30 18:23:58.130735000 -0700
@@ -33,22 +33,43 @@
 
 NS_LOG_COMPONENT_DEFINE ("ItuR1411LosPropagationLossModelTest");
 
+/**
+ * \ingroup propagation-tests
+ *
+ * \brief ItuR1411LosPropagationLossModel Test Case
+ * 
+ */
 class ItuR1411LosPropagationLossModelTestCase : public TestCase
 {
 public:
+  /**
+   * Constructor
+   * 
+   * \param freq carrier frequency in Hz
+   * \param dist 2D distance between UT and BS in meters
+   * \param hb height of BS in meters
+   * \param hm height of UT in meters
+   * \param refValue reference loss value
+   * \param name TestCase name
+   */ 
   ItuR1411LosPropagationLossModelTestCase (double freq, double dist, double hb, double hm, double refValue, std::string name);
   virtual ~ItuR1411LosPropagationLossModelTestCase ();
 
 private:
   virtual void DoRun (void);
-  Ptr<MobilityModel> CreateMobilityModel (uint16_t index);
 
-  double m_freq;
-  double m_dist;
-  double m_hb;
-  double m_hm;
-  double m_lossRef;
+  /**
+   * Create a MobilityModel
+   * \param index mobility model index
+   * \return a new MobilityModel
+   */
+  Ptr<MobilityModel> CreateMobilityModel (uint16_t index);
 
+  double m_freq;    //!< carrier frequency in Hz
+  double m_dist;    //!< 2D distance between UT and BS in meters
+  double m_hb;      //!< height of BS in meters
+  double m_hm;      //!< height of UT in meters
+  double m_lossRef; //!< reference loss
 };
 
 ItuR1411LosPropagationLossModelTestCase::ItuR1411LosPropagationLossModelTestCase (double freq, double dist, double hb, double hm, double refValue, std::string name)
@@ -92,7 +113,12 @@
 }
 
 
-
+/**
+ * \ingroup propagation-tests
+ *
+ * \brief ItuR1411LosPropagationLossModel TestSuite
+ * 
+ */
 class ItuR1411LosPropagationLossModelTestSuite : public TestSuite
 {
 public:
@@ -108,16 +134,9 @@
   LogComponentEnable ("ItuR1411LosPropagationLossModelTest", LOG_LEVEL_ALL);
 
   // reference values obtained with the octave scripts in src/propagation/test/reference/
-
   AddTestCase (new ItuR1411LosPropagationLossModelTestCase (2.1140e9, 100, 30, 1,  81.005, "freq=2114MHz, dist=100m"), TestCase::QUICK);
-
   AddTestCase (new ItuR1411LosPropagationLossModelTestCase (1999e6, 200, 30, 1,  87.060, "freq=1999MHz, dist=200m"), TestCase::QUICK);
-
-
-
-
 }
 
-
-
+/// Static variable for test initialization
 static ItuR1411LosPropagationLossModelTestSuite g_ituR1411LosTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/propagation/test/itu-r-1411-nlos-over-rooftop-test-suite.cc ns-3.36/src/propagation/test/itu-r-1411-nlos-over-rooftop-test-suite.cc
--- ns-3.35/src/propagation/test/itu-r-1411-nlos-over-rooftop-test-suite.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/propagation/test/itu-r-1411-nlos-over-rooftop-test-suite.cc	2022-04-30 18:23:58.130735000 -0700
@@ -33,24 +33,47 @@
 
 NS_LOG_COMPONENT_DEFINE ("ItuR1411NlosOverRooftopPropagationLossModelTest");
 
+/**
+ * \ingroup propagation-tests
+ *
+ * \brief ItuR1411NlosOverRooftopPropagationLossModel Test Case
+ * 
+ */
 class ItuR1411NlosOverRooftopPropagationLossModelTestCase : public TestCase
 {
 public:
+  /**
+   * Constructor
+   * 
+   * \param freq carrier frequency in Hz
+   * \param dist 2D distance between UT and BS in meters
+   * \param hb height of BS in meters
+   * \param hm height of UT in meters
+   * \param env environment type
+   * \param city city type
+   * \param refValue reference loss value
+   * \param name TestCase name
+   */ 
   ItuR1411NlosOverRooftopPropagationLossModelTestCase (double freq, double dist, double hb, double hm, EnvironmentType env, CitySize city, double refValue, std::string name);
   virtual ~ItuR1411NlosOverRooftopPropagationLossModelTestCase ();
 
 private:
   virtual void DoRun (void);
-  Ptr<MobilityModel> CreateMobilityModel (uint16_t index);
 
-  double m_freq;
-  double m_dist;
-  double m_hb;
-  double m_hm;
-  EnvironmentType m_env;
-  CitySize m_city;
-  double m_lossRef;
+  /**
+   * Create a MobilityModel
+   * \param index mobility model index
+   * \return a new MobilityModel
+   */
+  Ptr<MobilityModel> CreateMobilityModel (uint16_t index);
 
+  double m_freq;    //!< carrier frequency in Hz
+  double m_dist;    //!< 2D distance between UT and BS in meters
+  double m_hb;      //!< height of BS in meters
+  double m_hm;      //!< height of UT in meters
+  EnvironmentType m_env;  //!< environment type
+  CitySize m_city;        //!< city type
+  double m_lossRef; //!< reference loss
 };
 
 ItuR1411NlosOverRooftopPropagationLossModelTestCase::ItuR1411NlosOverRooftopPropagationLossModelTestCase (double freq, double dist, double hb, double hm, EnvironmentType env, CitySize city, double refValue, std::string name)
@@ -98,7 +121,12 @@
 }
 
 
-
+/**
+ * \ingroup propagation-tests
+ *
+ * \brief ItuR1411NlosOverRooftopPropagationLossModel TestSuite
+ * 
+ */
 class ItuR1411NlosOverRooftopPropagationLossModelTestSuite : public TestSuite
 {
 public:
@@ -106,21 +134,15 @@
 };
 
 
-
 ItuR1411NlosOverRooftopPropagationLossModelTestSuite::ItuR1411NlosOverRooftopPropagationLossModelTestSuite ()
   : TestSuite ("itu-r-1411-nlos-over-rooftop", SYSTEM)
 {
-
   LogComponentEnable ("ItuR1411NlosOverRooftopPropagationLossModelTest", LOG_LEVEL_ALL);
 
   // reference values obtained with the octave scripts in src/propagation/test/reference/
-
   AddTestCase (new ItuR1411NlosOverRooftopPropagationLossModelTestCase (2.1140e9, 900, 30, 1, UrbanEnvironment, LargeCity, 143.68, "f=2114Mhz, dist=900, urban large city"), TestCase::QUICK);
-
   AddTestCase (new ItuR1411NlosOverRooftopPropagationLossModelTestCase (1.865e9, 500, 30, 1, UrbanEnvironment, LargeCity,  132.84, "f=2114Mhz, dist=900, urban large city"), TestCase::QUICK);
-
 }
 
-
-
+/// Static variable for test initialization
 static ItuR1411NlosOverRooftopPropagationLossModelTestSuite g_ituR1411NlosOverRooftopTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/propagation/test/kun-2600-mhz-test-suite.cc ns-3.36/src/propagation/test/kun-2600-mhz-test-suite.cc
--- ns-3.35/src/propagation/test/kun-2600-mhz-test-suite.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/propagation/test/kun-2600-mhz-test-suite.cc	2022-04-30 18:23:58.130735000 -0700
@@ -33,21 +33,41 @@
 
 NS_LOG_COMPONENT_DEFINE ("Kun2600MhzPropagationLossModelTest");
 
+/**
+ * \ingroup propagation-tests
+ *
+ * \brief Kun2600MhzPropagationLossModel Test Case
+ * 
+ */
 class Kun2600MhzPropagationLossModelTestCase : public TestCase
 {
 public:
+  /**
+   * Constructor
+   * 
+   * \param dist 2D distance between UT and BS in meters
+   * \param hb height of BS in meters
+   * \param hm height of UT in meters
+   * \param refValue reference loss value
+   * \param name TestCase name
+   */ 
   Kun2600MhzPropagationLossModelTestCase (double dist, double hb, double hm, double refValue, std::string name);
   virtual ~Kun2600MhzPropagationLossModelTestCase ();
 
 private:
   virtual void DoRun (void);
+  
+  /**
+   * Create a MobilityModel
+   * \param index mobility model index
+   * \return a new MobilityModel
+   */
   Ptr<MobilityModel> CreateMobilityModel (uint16_t index);
 
-  double m_dist;
-  double m_hb;
-  double m_hm;
-  double m_lossRef;
-
+  double m_dist;    //!< 2D distance between UT and BS in meters
+  double m_hb;      //!< height of BS in meters
+  double m_hm;      //!< height of UT in meters
+  double m_lossRef; //!< reference loss
 };
 
 Kun2600MhzPropagationLossModelTestCase::Kun2600MhzPropagationLossModelTestCase (double dist, double hb, double hm, double refValue, std::string name)
@@ -90,6 +110,12 @@
 
 
 
+/**
+ * \ingroup propagation-tests
+ *
+ * \brief Kun2600MhzPropagationLossModel TestSuite
+ * 
+ */
 class Kun2600MhzPropagationLossModelTestSuite : public TestSuite
 {
 public:
@@ -101,14 +127,10 @@
 Kun2600MhzPropagationLossModelTestSuite::Kun2600MhzPropagationLossModelTestSuite ()
   : TestSuite ("kun-2600-mhz", SYSTEM)
 {
-
   LogComponentEnable ("Kun2600MhzPropagationLossModelTest", LOG_LEVEL_ALL);
 
   AddTestCase (new Kun2600MhzPropagationLossModelTestCase (2000, 30, 1,  121.83, "dist=2000m"), TestCase::QUICK);
-
-
 }
 
-
-
+/// Static variable for test initialization
 static Kun2600MhzPropagationLossModelTestSuite g_kun2600MhzTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/propagation/test/okumura-hata-test-suite.cc ns-3.36/src/propagation/test/okumura-hata-test-suite.cc
--- ns-3.35/src/propagation/test/okumura-hata-test-suite.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/propagation/test/okumura-hata-test-suite.cc	2022-04-30 18:23:58.130735000 -0700
@@ -33,24 +33,46 @@
 
 NS_LOG_COMPONENT_DEFINE ("OkumuraHataPropagationLossModelTest");
 
+/**
+ * \ingroup propagation-tests
+ *
+ * \brief OkumuraHataPropagationLossModel Test Case
+ */
 class OkumuraHataPropagationLossModelTestCase : public TestCase
 {
 public:
+  /**
+   * Constructor
+   * 
+   * \param freq carrier frequency in Hz
+   * \param dist 2D distance between UT and BS in meters
+   * \param hb height of BS in meters
+   * \param hm height of UT in meters
+   * \param env environment type
+   * \param city city type
+   * \param refValue reference loss value
+   * \param name TestCase name
+   */ 
   OkumuraHataPropagationLossModelTestCase (double freq, double dist, double hb, double hm, EnvironmentType env, CitySize city, double refValue, std::string name);
   virtual ~OkumuraHataPropagationLossModelTestCase ();
 
 private:
   virtual void DoRun (void);
-  Ptr<MobilityModel> CreateMobilityModel (uint16_t index);
 
-  double m_freq;
-  double m_dist;
-  double m_hb;
-  double m_hm;
-  EnvironmentType m_env;
-  CitySize m_city;
-  double m_lossRef;
+  /**
+   * Create a MobilityModel
+   * \param index mobility model index
+   * \return a new MobilityModel
+   */
+  Ptr<MobilityModel> CreateMobilityModel (uint16_t index);
 
+  double m_freq;    //!< carrier frequency in Hz
+  double m_dist;    //!< 2D distance between UT and BS in meters
+  double m_hb;      //!< height of BS in meters
+  double m_hm;      //!< height of UT in meters
+  EnvironmentType m_env;  //!< environment type
+  CitySize m_city;        //!< city type
+  double m_lossRef; //!< reference loss
 };
 
 OkumuraHataPropagationLossModelTestCase::OkumuraHataPropagationLossModelTestCase (double freq, double dist, double hb, double hm, EnvironmentType env, CitySize city, double refValue, std::string name)
@@ -98,44 +120,40 @@
 }
 
 
-
+/**
+ * \ingroup propagation-tests
+ *
+ * \brief OkumuraHataPropagationLossModel TestSuite
+ * 
+ * This TestSuite tests the following cases:
+ *   - UrbanEnvironment - Large City (original OH and COST231 OH)
+ *   - UrbanEnvironment - Small City (original OH and COST231 OH)
+ *   - SubUrbanEnvironment (original OH only)
+ *   - OpenAreasEnvironment (original OH only)
+ */
 class OkumuraHataPropagationLossModelTestSuite : public TestSuite
 {
 public:
   OkumuraHataPropagationLossModelTestSuite ();
 };
 
-
-
 OkumuraHataPropagationLossModelTestSuite::OkumuraHataPropagationLossModelTestSuite ()
   : TestSuite ("okumura-hata", SYSTEM)
 {
-
   LogComponentEnable ("OkumuraHataPropagationLossModelTest", LOG_LEVEL_ALL);
-
-
   // reference values obtained with the octave scripts in src/propagation/test/reference/
 
-
   double freq = 869e6; // this will use the original OH model
-
   AddTestCase (new OkumuraHataPropagationLossModelTestCase (freq, 2000, 30, 1, UrbanEnvironment, LargeCity, 137.93, "original OH Urban Large city"), TestCase::QUICK);
-
   AddTestCase (new OkumuraHataPropagationLossModelTestCase (freq, 2000, 30, 1, UrbanEnvironment, SmallCity, 137.88, "original OH Urban small city"), TestCase::QUICK);
-
   AddTestCase (new OkumuraHataPropagationLossModelTestCase (freq, 2000, 30, 1, SubUrbanEnvironment, LargeCity, 128.03, "original OH SubUrban"), TestCase::QUICK);
-
   AddTestCase (new OkumuraHataPropagationLossModelTestCase (freq, 2000, 30, 1, OpenAreasEnvironment, LargeCity, 110.21, "original OH OpenAreas"), TestCase::QUICK);
 
-
   freq = 2.1140e9;  // this will use the extended COST231 OH model
-
   AddTestCase (new OkumuraHataPropagationLossModelTestCase (freq, 2000, 30, 1, UrbanEnvironment, LargeCity, 148.55, "COST231 OH Urban Large city"), TestCase::QUICK);
-
   AddTestCase (new OkumuraHataPropagationLossModelTestCase (freq, 2000, 30, 1, UrbanEnvironment, SmallCity, 150.64, "COST231 OH Urban small city and suburban"), TestCase::QUICK);
-
 }
 
 
-
+/// Static variable for test initialization
 static OkumuraHataPropagationLossModelTestSuite g_okumuraHataTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/propagation/test/probabilistic-v2v-channel-condition-model-test.cc ns-3.36/src/propagation/test/probabilistic-v2v-channel-condition-model-test.cc
--- ns-3.35/src/propagation/test/probabilistic-v2v-channel-condition-model-test.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/propagation/test/probabilistic-v2v-channel-condition-model-test.cc	2022-04-30 18:23:58.130735000 -0700
@@ -36,6 +36,8 @@
 NS_LOG_COMPONENT_DEFINE ("ProbabilisticV2vChannelConditionModelsTest");
 
 /**
+ * \ingroup propagation-tests
+ * 
  * Test case for the V2V Urban channel condition models using a fully
  * probabilistic model to determine LOS, NLOS and NLOSv states. The test
  * determines the channel condition multiple times,
@@ -226,6 +228,8 @@
 }
 
 /**
+ * \ingroup propagation-tests
+ * 
  * Test case for the V2V Highway channel condition models using a fully
  * probabilistic model to determine LOS, NLOS and NLOSv states. The test
  * determines the channel condition multiple times,
@@ -434,6 +438,8 @@
 }
 
 /**
+ * \ingroup propagation-tests
+ * 
  * Test suite for the probabilistic V2V channel condition model
  *
  * The tests V2vUrbanProbChCondModelTestCase and
@@ -458,4 +464,5 @@
   AddTestCase (new V2vHighwayProbChCondModelTestCase, TestCase::QUICK); // test for a fully probabilistic model (NLOS vs LOS vs NLOSv), in V2V highway scenario*/
 }
 
-static ProbabilisticV2vChCondModelsTestSuite probabilisticV2vChCondModelsTestSuite;
+/// Static variable for test initialization
+static ProbabilisticV2vChCondModelsTestSuite g_probabilisticV2vChCondModelsTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/propagation/test/propagation-loss-model-test-suite.cc ns-3.36/src/propagation/test/propagation-loss-model-test-suite.cc
--- ns-3.35/src/propagation/test/propagation-loss-model-test-suite.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/propagation/test/propagation-loss-model-test-suite.cc	2022-04-30 18:23:58.130735000 -0700
@@ -33,7 +33,19 @@
 // This is a simple test to validate propagation loss models of ns-3 wifi.
 // See the chapter in the ns-3 testing and validation guide for more detail
 // ===========================================================================
-//
+
+
+/**
+ * \ingroup propagation
+ * \defgroup propagation-test Propagation module tests
+ */
+
+
+/**
+ * \ingroup propagation-tests
+ *
+ * \brief FriisPropagationLossModel Test
+ */
 class FriisPropagationLossModelTestCase : public TestCase
 {
 public:
@@ -43,13 +55,15 @@
 private:
   virtual void DoRun (void);
 
+  /// Test vector
   typedef struct {
-    Vector m_position;
-    double m_pt;  // dBm
-    double m_pr;  // W
-    double m_tolerance;
+    Vector m_position;  //!< Test node position
+    double m_pt;        //!< Tx power [dBm]
+    double m_pr;        //!< Rx power [W]
+    double m_tolerance; //!< Tolerance
   } TestVector;
 
+  /// Test vectors
   TestVectors<TestVector> m_testVectors;
 };
 
@@ -132,6 +146,11 @@
 
 // Added for Two-Ray Ground Model - tomhewer@mac.com
 
+/**
+ * \ingroup propagation-tests
+ *
+ * \brief TwoRayGroundPropagationLossModel Test
+ */
 class TwoRayGroundPropagationLossModelTestCase : public TestCase
 {
 public:
@@ -141,14 +160,15 @@
 private:
   virtual void DoRun (void);
 
-  typedef struct
-  {
-    Vector m_position;
-    double m_pt;  // dBm
-    double m_pr;  // W
-    double m_tolerance;
+  /// Test vector
+  typedef struct {
+    Vector m_position;  //!< Test node position
+    double m_pt;        //!< Tx power [dBm]
+    double m_pr;        //!< Rx power [W]
+    double m_tolerance; //!< Tolerance
   } TestVector;
 
+  /// Test vectors
   TestVectors<TestVector> m_testVectors;
 };
 
@@ -261,6 +281,11 @@
 }
 
 
+/**
+ * \ingroup propagation-tests
+ *
+ * \brief LogDistancePropagationLossModel Test
+ */
 class LogDistancePropagationLossModelTestCase : public TestCase
 {
 public:
@@ -270,13 +295,15 @@
 private:
   virtual void DoRun (void);
 
+  /// Test vector
   typedef struct {
-    Vector m_position;
-    double m_pt;  // dBm
-    double m_pr;  // W
-    double m_tolerance;
+    Vector m_position;  //!< Test node position
+    double m_pt;        //!< Tx power [dBm]
+    double m_pr;        //!< Rx power [W]
+    double m_tolerance; //!< Tolerance
   } TestVector;
 
+  /// Test vectors
   TestVectors<TestVector> m_testVectors;
 };
 
@@ -348,6 +375,11 @@
     }
 }
 
+/**
+ * \ingroup propagation-tests
+ *
+ * \brief MatrixPropagationLossModel Test
+ */
 class MatrixPropagationLossModelTestCase : public TestCase
 {
 public:
@@ -396,6 +428,11 @@
   Simulator::Destroy ();
 }
 
+/**
+ * \ingroup propagation-tests
+ *
+ * \brief RangePropagationLossModel Test
+ */
 class RangePropagationLossModelTestCase : public TestCase
 {
 public:
@@ -436,6 +473,18 @@
   Simulator::Destroy ();
 }
 
+/**
+ * \ingroup propagation-tests
+ *
+ * \brief Propagation models TestSuite
+ * 
+ * This TestSuite tests the following models:
+ *   - FriisPropagationLossModel
+ *   - TwoRayGroundPropagationLossModel
+ *   - LogDistancePropagationLossModel
+ *   - MatrixPropagationLossModel
+ *   - RangePropagationLossModel
+ */
 class PropagationLossModelsTestSuite : public TestSuite
 {
 public:
@@ -452,4 +501,5 @@
   AddTestCase (new RangePropagationLossModelTestCase, TestCase::QUICK);
 }
 
-static PropagationLossModelsTestSuite propagationLossModelsTestSuite;
+/// Static variable for test initialization
+static PropagationLossModelsTestSuite g_propagationLossModelsTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/propagation/test/three-gpp-propagation-loss-model-test-suite.cc ns-3.36/src/propagation/test/three-gpp-propagation-loss-model-test-suite.cc
--- ns-3.35/src/propagation/test/three-gpp-propagation-loss-model-test-suite.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/propagation/test/three-gpp-propagation-loss-model-test-suite.cc	2022-04-30 18:23:58.134734900 -0700
@@ -36,6 +36,8 @@
 NS_LOG_COMPONENT_DEFINE ("ThreeGppPropagationLossModelsTest");
 
 /**
+ * \ingroup propagation-tests
+ * 
  * Test case for the class ThreeGppRmaPropagationLossModel.
  * It computes the pathloss between two nodes and compares it with the value
  * obtained using the formula in 3GPP TR 38.901, Table 7.4.1-1.
@@ -193,6 +195,8 @@
 }
 
 /**
+ * \ingroup propagation-tests
+ * 
  * Test case for the class ThreeGppUmaPropagationLossModel.
  * It computes the pathloss between two nodes and compares it with the value
  * obtained using the formula in 3GPP TR 38.901, Table 7.4.1-1.
@@ -350,6 +354,8 @@
 }
 
 /**
+ * \ingroup propagation-tests
+ * 
  * Test case for the class ThreeGppUmiStreetCanyonPropagationLossModel.
  * It computes the pathloss between two nodes and compares it with the value
  * obtained using the formula in 3GPP TR 38.901, Table 7.4.1-1.
@@ -501,6 +507,8 @@
 }
 
 /**
+ * \ingroup propagation-tests
+ * 
  * Test case for the class ThreeGppIndoorOfficePropagationLossModel.
  * It computes the pathloss between two nodes and compares it with the value
  * obtained using the formula in 3GPP TR 38.901, Table 7.4.1-1.
@@ -658,6 +666,8 @@
 }
 
 /**
+ * \ingroup propagation-tests
+ * 
  * Test case for the class ThreeGppV2vUrbanPropagationLossModel.
  * It computes the pathloss between two nodes and compares it with the value
  * obtained using the formula in 3GPP TR 37.885 Table 6.2.1-1 for v2v
@@ -811,6 +821,8 @@
 }
 
 /**
+ * \ingroup propagation-tests
+ * 
  * Test case for the class ThreeGppV2vHighwayPropagationLossModel.
  * It computes the pathloss between two nodes and compares it with the value
  * obtained using the formula in 3GPP TR 37.885 Table 6.2.1-1 for v2v
@@ -963,7 +975,11 @@
   Simulator::Destroy ();
 }
 
-// Test to check if the shadowing fading is correctly computed
+/**
+ * \ingroup propagation-tests
+ * 
+ * Test to check if the shadowing fading is correctly computed
+ */
 class ThreeGppShadowingTestCase : public TestCase
 {
 public:
@@ -981,6 +997,7 @@
    * \param hBs the BS height in meters
    * \param hUt the UT height in meters
    * \param distance the intial distance between the BS and the UT
+   * \param shadowingEnabled true if shadowging must be enabled
    */
   void RunTest (uint16_t testNum, std::string propagationLossModelType, double hBs, double hUt, double distance, bool shadowingEnabled);
 
@@ -993,6 +1010,10 @@
    */
   void EvaluateLoss (Ptr<MobilityModel> a, Ptr<MobilityModel> b, uint8_t testNum);
 
+  /**
+   * Change the channel condition model
+   * \param ccm the new ChannelConditionModel
+   */
   void ChangeChannelCondition (Ptr<ChannelConditionModel> ccm);
 
   /**
@@ -1207,6 +1228,20 @@
     }
 }
 
+/**
+ * \ingroup propagation-tests
+ *
+ * \brief 3GPP Propagation models TestSuite
+ * 
+ * This TestSuite tests the following models:
+ *   - ThreeGppRmaPropagationLossModel
+ *   - ThreeGppUmaPropagationLossModel
+ *   - ThreeGppUmiPropagationLossModel
+ *   - ThreeGppIndoorOfficePropagationLossModel
+ *   - ThreeGppV2vUrbanPropagationLossModel
+ *   - ThreeGppV2vHighwayPropagationLossModel
+ *   - ThreeGppShadowing
+ */
 class ThreeGppPropagationLossModelsTestSuite : public TestSuite
 {
 public:
@@ -1225,4 +1260,5 @@
   AddTestCase (new ThreeGppShadowingTestCase, TestCase::QUICK);
 }
 
-static ThreeGppPropagationLossModelsTestSuite propagationLossModelsTestSuite;
+/// Static variable for test initialization
+static ThreeGppPropagationLossModelsTestSuite g_propagationLossModelsTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/propagation/wscript ns-3.36/src/propagation/wscript
--- ns-3.35/src/propagation/wscript	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/propagation/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,63 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    module = bld.create_ns3_module('propagation', ['network', 'mobility'])
-    module.includes = '.'
-    module.source = [
-        'model/propagation-delay-model.cc',
-        'model/propagation-loss-model.cc',
-        'model/jakes-propagation-loss-model.cc',
-        'model/jakes-process.cc',
-        'model/cost231-propagation-loss-model.cc',
-        'model/okumura-hata-propagation-loss-model.cc',
-        'model/itu-r-1411-los-propagation-loss-model.cc',
-        'model/itu-r-1411-nlos-over-rooftop-propagation-loss-model.cc',
-        'model/kun-2600-mhz-propagation-loss-model.cc',
-        'model/channel-condition-model.cc',
-        'model/probabilistic-v2v-channel-condition-model.cc',
-        'model/three-gpp-propagation-loss-model.cc',
-        'model/three-gpp-v2v-propagation-loss-model.cc',
-        ]
-
-    module_test = bld.create_ns3_module_test_library('propagation')
-    module_test.source = [
-        'test/propagation-loss-model-test-suite.cc',
-        'test/okumura-hata-test-suite.cc',
-        'test/itu-r-1411-los-test-suite.cc',
-        'test/kun-2600-mhz-test-suite.cc',
-        'test/itu-r-1411-nlos-over-rooftop-test-suite.cc',
-        'test/channel-condition-model-test-suite.cc',
-        'test/three-gpp-propagation-loss-model-test-suite.cc',
-        'test/probabilistic-v2v-channel-condition-model-test.cc',
-        ]
-
-    # Tests encapsulating example programs should be listed here
-    if (bld.env['ENABLE_EXAMPLES']):
-        module_test.source.extend([
-        #   'test/propagation-examples-test-suite.cc',
-            ])
-    
-    headers = bld(features='ns3header')
-    headers.module = 'propagation'
-    headers.source = [
-        'model/propagation-delay-model.h',
-        'model/propagation-loss-model.h',
-        'model/jakes-propagation-loss-model.h',
-        'model/jakes-process.h',
-        'model/propagation-cache.h',
-        'model/cost231-propagation-loss-model.h',
-        'model/propagation-environment.h',
-        'model/okumura-hata-propagation-loss-model.h',
-        'model/itu-r-1411-los-propagation-loss-model.h',
-        'model/itu-r-1411-nlos-over-rooftop-propagation-loss-model.h',
-        'model/kun-2600-mhz-propagation-loss-model.h',
-        'model/channel-condition-model.h',
-        'model/probabilistic-v2v-channel-condition-model.h',
-        'model/three-gpp-propagation-loss-model.h',
-        'model/three-gpp-v2v-propagation-loss-model.h',
-        ]
-
-    if (bld.env['ENABLE_EXAMPLES']):
-        bld.recurse('examples')
-
-    bld.ns3_python_bindings()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/sixlowpan/bindings/modulegen__gcc_ILP32.py ns-3.36/src/sixlowpan/bindings/modulegen__gcc_ILP32.py
--- ns-3.35/src/sixlowpan/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/sixlowpan/bindings/modulegen__gcc_ILP32.py	2022-04-30 18:23:58.138734800 -0700
@@ -69,6 +69,8 @@
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::TraceSourceAccessor'])
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'], import_from_module='ns.core')
     ## hash.h (module 'core'): ns3::Hasher [class]
     module.add_class('Hasher', import_from_module='ns.core')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
@@ -190,23 +192,23 @@
     module.add_class('RandomVariableStream', import_from_module='ns.core', parent=root_module['ns3::Object'])
     ## random-variable-stream.h (module 'core'): ns3::SequentialRandomVariable [class]
     module.add_class('SequentialRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
     ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanBc0 [class]
     module.add_class('SixLowPanBc0', parent=root_module['ns3::Header'])
@@ -377,7 +379,7 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::Ptr<ns3::SixLowPanNetDevice>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::SixLowPanNetDevice::DropReason, ns3::Ptr<const ns3::Packet>, ns3::Ptr<ns3::SixLowPanNetDevice>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::SixLowPanNetDevice::DropReason', 'ns3::Ptr<const ns3::Packet>', 'ns3::Ptr<ns3::SixLowPanNetDevice>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )', 'ns3::TimePrinter')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )*', 'ns3::TimePrinter*')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )&', 'ns3::TimePrinter&')
@@ -2748,8 +2750,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -2972,14 +2974,14 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('>=')
     cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_unary_numeric_operator('-')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
     cls.add_constructor([])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(double const value) [constructor]
@@ -2998,6 +3000,8 @@
     cls.add_constructor([param('long unsigned int const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int const v) [constructor]
     cls.add_constructor([param('long long unsigned int const', 'v')])
+    ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int128_t const v) [constructor]
+    cls.add_constructor([param('int128_t const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t const hi, uint64_t const lo) [constructor]
     cls.add_constructor([param('int64_t const', 'hi'), param('uint64_t const', 'lo')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [constructor]
@@ -3265,65 +3269,65 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
@@ -5263,10 +5267,16 @@
     cls.add_method('ExtractNeighborIndex', 
                    'uint32_t', 
                    [param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetEpoch() const [member function]
+    cls.add_method('GetEpoch', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() const [member function]
     cls.add_method('GetRemainingBits', 
                    'uint32_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -5277,6 +5287,10 @@
                    'uint32_t', 
                    [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
+    ## nix-vector.h (module 'network'): void ns3::NixVector::SetEpoch(uint32_t epoch) [member function]
+    cls.add_method('SetEpoch', 
+                   'void', 
+                   [param('uint32_t', 'epoch')])
     return
 
 def register_Ns3NormalRandomVariable_methods(root_module, cls):
@@ -5552,10 +5566,11 @@
                    'uint32_t', 
                    [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) const [member function]
     cls.add_method('SetNixVector', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')], 
+                   is_const=True)
     ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
     cls.add_method('ToString', 
                    'std::string', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/sixlowpan/bindings/modulegen__gcc_LP64.py ns-3.36/src/sixlowpan/bindings/modulegen__gcc_LP64.py
--- ns-3.35/src/sixlowpan/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/sixlowpan/bindings/modulegen__gcc_LP64.py	2022-04-30 18:23:58.138734800 -0700
@@ -69,6 +69,8 @@
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::TraceSourceAccessor'])
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'], import_from_module='ns.core')
     ## hash.h (module 'core'): ns3::Hasher [class]
     module.add_class('Hasher', import_from_module='ns.core')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
@@ -190,23 +192,23 @@
     module.add_class('RandomVariableStream', import_from_module='ns.core', parent=root_module['ns3::Object'])
     ## random-variable-stream.h (module 'core'): ns3::SequentialRandomVariable [class]
     module.add_class('SequentialRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
     ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanBc0 [class]
     module.add_class('SixLowPanBc0', parent=root_module['ns3::Header'])
@@ -377,7 +379,7 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::Ptr<ns3::SixLowPanNetDevice>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::SixLowPanNetDevice::DropReason, ns3::Ptr<const ns3::Packet>, ns3::Ptr<ns3::SixLowPanNetDevice>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::SixLowPanNetDevice::DropReason', 'ns3::Ptr<const ns3::Packet>', 'ns3::Ptr<ns3::SixLowPanNetDevice>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )', 'ns3::TimePrinter')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )*', 'ns3::TimePrinter*')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )&', 'ns3::TimePrinter&')
@@ -2748,8 +2750,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -2972,14 +2974,14 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('>=')
     cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_unary_numeric_operator('-')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
     cls.add_constructor([])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(double const value) [constructor]
@@ -2998,6 +3000,8 @@
     cls.add_constructor([param('long unsigned int const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int const v) [constructor]
     cls.add_constructor([param('long long unsigned int const', 'v')])
+    ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int128_t const v) [constructor]
+    cls.add_constructor([param('int128_t const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t const hi, uint64_t const lo) [constructor]
     cls.add_constructor([param('int64_t const', 'hi'), param('uint64_t const', 'lo')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [constructor]
@@ -3265,65 +3269,65 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
@@ -5263,10 +5267,16 @@
     cls.add_method('ExtractNeighborIndex', 
                    'uint32_t', 
                    [param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetEpoch() const [member function]
+    cls.add_method('GetEpoch', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() const [member function]
     cls.add_method('GetRemainingBits', 
                    'uint32_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -5277,6 +5287,10 @@
                    'uint32_t', 
                    [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
+    ## nix-vector.h (module 'network'): void ns3::NixVector::SetEpoch(uint32_t epoch) [member function]
+    cls.add_method('SetEpoch', 
+                   'void', 
+                   [param('uint32_t', 'epoch')])
     return
 
 def register_Ns3NormalRandomVariable_methods(root_module, cls):
@@ -5552,10 +5566,11 @@
                    'uint32_t', 
                    [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) const [member function]
     cls.add_method('SetNixVector', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')], 
+                   is_const=True)
     ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
     cls.add_method('ToString', 
                    'std::string', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/sixlowpan/CMakeLists.txt ns-3.36/src/sixlowpan/CMakeLists.txt
--- ns-3.35/src/sixlowpan/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/sixlowpan/CMakeLists.txt	2022-04-30 18:23:58.134734900 -0700
@@ -0,0 +1,29 @@
+set(example_as_test_suite)
+if(${ENABLE_EXAMPLES})
+  set(example_as_test_suite
+      test/sixlowpan-examples-test-suite.cc
+  )
+endif()
+
+build_lib(
+  LIBNAME sixlowpan
+  SOURCE_FILES
+    helper/sixlowpan-helper.cc
+    model/sixlowpan-header.cc
+    model/sixlowpan-net-device.cc
+  HEADER_FILES
+    helper/sixlowpan-helper.h
+    model/sixlowpan-header.h
+    model/sixlowpan-net-device.h
+  LIBRARIES_TO_LINK
+    ${libinternet}
+    ${libinternet}
+    ${libcore}
+  TEST_SOURCES
+    ${example_as_test_suite}
+    test/mock-net-device.cc
+    test/sixlowpan-fragmentation-test.cc
+    test/sixlowpan-hc1-test.cc
+    test/sixlowpan-iphc-stateful-test.cc
+    test/sixlowpan-iphc-test.cc
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/sixlowpan/examples/CMakeLists.txt ns-3.36/src/sixlowpan/examples/CMakeLists.txt
--- ns-3.35/src/sixlowpan/examples/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/sixlowpan/examples/CMakeLists.txt	2022-04-30 18:23:58.138734800 -0700
@@ -0,0 +1,44 @@
+build_lib_example(
+  NAME example-sixlowpan
+  SOURCE_FILES example-sixlowpan.cc
+  LIBRARIES_TO_LINK
+    ${libnetwork}
+    ${libsixlowpan}
+    ${libinternet}
+    ${libcsma}
+    ${libinternet-apps}
+)
+
+build_lib_example(
+  NAME example-ping-lr-wpan
+  SOURCE_FILES example-ping-lr-wpan.cc
+  LIBRARIES_TO_LINK
+    ${libnetwork}
+    ${libsixlowpan}
+    ${libinternet}
+    ${liblr-wpan}
+    ${libinternet-apps}
+)
+
+build_lib_example(
+  NAME example-ping-lr-wpan-beacon
+  SOURCE_FILES example-ping-lr-wpan-beacon.cc
+  LIBRARIES_TO_LINK
+    ${libnetwork}
+    ${libsixlowpan}
+    ${libinternet}
+    ${liblr-wpan}
+    ${libinternet-apps}
+)
+
+build_lib_example(
+  NAME example-ping-lr-wpan-mesh-under
+  SOURCE_FILES example-ping-lr-wpan-mesh-under.cc
+  LIBRARIES_TO_LINK
+    ${libnetwork}
+    ${libsixlowpan}
+    ${libinternet}
+    ${liblr-wpan}
+    ${libinternet-apps}
+    ${libcsma}
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/sixlowpan/examples/wscript ns-3.36/src/sixlowpan/examples/wscript
--- ns-3.35/src/sixlowpan/examples/wscript	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/sixlowpan/examples/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,21 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    if not bld.env['ENABLE_EXAMPLES']:
-        return;
-
-    obj = bld.create_ns3_program('example-sixlowpan',
-                                 ['network', 'sixlowpan', 'internet', 'csma', 'internet-apps'])
-    obj.source = 'example-sixlowpan.cc'
-    
-    obj = bld.create_ns3_program('example-ping-lr-wpan',
-                                 ['network', 'sixlowpan', 'internet', 'lr-wpan', 'internet-apps'])
-    obj.source = 'example-ping-lr-wpan.cc'
-    
-    obj = bld.create_ns3_program('example-ping-lr-wpan-beacon',
-                                 ['network', 'sixlowpan', 'internet', 'lr-wpan', 'internet-apps'])
-    obj.source = 'example-ping-lr-wpan-beacon.cc'
-
-    obj = bld.create_ns3_program('example-ping-lr-wpan-mesh-under',
-                                 ['network', 'sixlowpan', 'internet', 'lr-wpan', 'internet-apps', 'csma'])
-    obj.source = 'example-ping-lr-wpan-mesh-under.cc'
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/sixlowpan/model/sixlowpan-net-device.cc ns-3.36/src/sixlowpan/model/sixlowpan-net-device.cc
--- ns-3.35/src/sixlowpan/model/sixlowpan-net-device.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/sixlowpan/model/sixlowpan-net-device.cc	2022-04-30 18:23:58.138734800 -0700
@@ -201,7 +201,7 @@
   SixLowPanDispatch::Dispatch_e dispatchVal;
   Ptr<Packet> copyPkt = packet->Copy ();
 
-  m_rxTrace (copyPkt, m_node->GetObject<SixLowPanNetDevice> (), GetIfIndex ());
+  m_rxTrace (copyPkt, this, GetIfIndex ());
 
   copyPkt->CopyData (&dispatchRawVal, sizeof(dispatchRawVal));
   dispatchVal = SixLowPanDispatch::GetDispatchType (dispatchRawVal);
@@ -237,7 +237,7 @@
       if (!hasBc0)
         {
           NS_LOG_LOGIC ("Dropped packet - we only support mesh if it is paired with a BC0");
-          m_dropTrace (DROP_UNKNOWN_EXTENSION, copyPkt, m_node->GetObject<SixLowPanNetDevice> (), GetIfIndex ());
+          m_dropTrace (DROP_UNKNOWN_EXTENSION, copyPkt, this, GetIfIndex ());
           return;
         }
 
@@ -336,7 +336,7 @@
     case SixLowPanDispatch::LOWPAN_HC1:
       if (m_useIphc)
         {
-          m_dropTrace (DROP_DISALLOWED_COMPRESSION, copyPkt, m_node->GetObject<SixLowPanNetDevice> (), GetIfIndex ());
+          m_dropTrace (DROP_DISALLOWED_COMPRESSION, copyPkt, this, GetIfIndex ());
           return;
         }
       DecompressLowPanHc1 (copyPkt, realSrc, realDst);
@@ -345,12 +345,12 @@
     case SixLowPanDispatch::LOWPAN_IPHC:
       if (!m_useIphc)
         {
-          m_dropTrace (DROP_DISALLOWED_COMPRESSION, copyPkt, m_node->GetObject<SixLowPanNetDevice> (), GetIfIndex ());
+          m_dropTrace (DROP_DISALLOWED_COMPRESSION, copyPkt, this, GetIfIndex ());
           return;
         }
       if (DecompressLowPanIphc (copyPkt, realSrc, realDst))
         {
-          m_dropTrace (DROP_SATETFUL_DECOMPRESSION_PROBLEM, copyPkt, m_node->GetObject<SixLowPanNetDevice> (), GetIfIndex ());
+          m_dropTrace (DROP_SATETFUL_DECOMPRESSION_PROBLEM, copyPkt, this, GetIfIndex ());
         }
       else
         {
@@ -359,7 +359,7 @@
       break;
     default:
       NS_LOG_DEBUG ("Unsupported 6LoWPAN encoding: dropping.");
-      m_dropTrace (DROP_UNKNOWN_EXTENSION, copyPkt, m_node->GetObject<SixLowPanNetDevice> (), GetIfIndex ());
+      m_dropTrace (DROP_UNKNOWN_EXTENSION, copyPkt, this, GetIfIndex ());
       break;
     }
 
@@ -628,7 +628,7 @@
       for ( it = fragmentList.begin (); it != fragmentList.end (); it++ )
         {
           NS_LOG_DEBUG ( "SixLowPanNetDevice::Send (Fragment) " << **it );
-          m_txTrace (*it, m_node->GetObject<SixLowPanNetDevice> (), GetIfIndex ());
+          m_txTrace (*it, this, GetIfIndex ());
 
           if (useMesh)
             {
@@ -649,7 +649,7 @@
     }
   else
     {
-      m_txTrace (packet, m_node->GetObject<SixLowPanNetDevice> (), GetIfIndex ());
+      m_txTrace (packet, this, GetIfIndex ());
 
       if (useMesh)
         {
@@ -827,9 +827,8 @@
   Ipv6Header ipHeader;
   SixLowPanHc1 encoding;
 
-  uint32_t ret = packet->RemoveHeader (encoding);
+  [[maybe_unused]] uint32_t ret = packet->RemoveHeader (encoding);
   NS_LOG_DEBUG ("removed " << ret << " bytes - pkt is " << *packet);
-  NS_UNUSED (ret);
 
   ipHeader.SetHopLimit (encoding.GetHopLimit ());
 
@@ -1335,9 +1334,8 @@
   Ipv6Header ipHeader;
   SixLowPanIphc encoding;
 
-  uint32_t ret = packet->RemoveHeader (encoding);
+  [[maybe_unused]] uint32_t ret = packet->RemoveHeader (encoding);
   NS_LOG_DEBUG ("removed " << ret << " bytes - pkt is " << *packet);
-  NS_UNUSED (ret);
 
   // Hop Limit
   ipHeader.SetHopLimit (encoding.GetHopLimit ());
@@ -1916,9 +1914,8 @@
 
   SixLowPanNhcExtension encoding;
 
-  uint32_t ret = packet->RemoveHeader (encoding);
+  [[maybe_unused]] uint32_t ret = packet->RemoveHeader (encoding);
   NS_LOG_DEBUG ("removed " << ret << " bytes - pkt is " << *packet);
-  NS_UNUSED (ret);
 
   Ipv6ExtensionHopByHopHeader hopHeader;
   Ipv6ExtensionRoutingHeader routingHeader;
@@ -2113,7 +2110,7 @@
       actualHeaderType = Ipv6Header::IPV6_IPV6;
       if (DecompressLowPanIphc (packet, src, dst))
         {
-          m_dropTrace (DROP_SATETFUL_DECOMPRESSION_PROBLEM, packet, m_node->GetObject<SixLowPanNetDevice> (), GetIfIndex ());
+          m_dropTrace (DROP_SATETFUL_DECOMPRESSION_PROBLEM, packet, this, GetIfIndex ());
           return std::pair<uint8_t, bool> (0, true);
         }
       break;
@@ -2189,9 +2186,8 @@
   UdpHeader udpHeader;
   SixLowPanUdpNhcExtension encoding;
 
-  uint32_t ret = packet->RemoveHeader (encoding);
+  [[maybe_unused]] uint32_t ret = packet->RemoveHeader (encoding);
   NS_LOG_DEBUG ("removed " << ret << " bytes - pkt is " << *packet);
-  NS_UNUSED (ret);
 
   // Set the value of the ports
   switch ( encoding.GetPorts () )
@@ -2375,7 +2371,7 @@
         case SixLowPanDispatch::LOWPAN_IPHC:
           if (DecompressLowPanIphc (p, src, dst))
             {
-              m_dropTrace (DROP_SATETFUL_DECOMPRESSION_PROBLEM, p, m_node->GetObject<SixLowPanNetDevice> (), GetIfIndex ());
+              m_dropTrace (DROP_SATETFUL_DECOMPRESSION_PROBLEM, p, this, GetIfIndex ());
               return false;
             }
           break;
@@ -2409,7 +2405,7 @@
           for (std::list< Ptr<Packet> >::iterator fragIter = storedFragments.begin ();
                fragIter != storedFragments.end (); fragIter++)
             {
-              m_dropTrace (DROP_FRAGMENT_BUFFER_FULL, *fragIter, m_node->GetObject<SixLowPanNetDevice> (), GetIfIndex ());
+              m_dropTrace (DROP_FRAGMENT_BUFFER_FULL, *fragIter, this, GetIfIndex ());
             }
 
           m_timeoutEventList.erase (m_fragments[oldestKey]->GetTimeoutIter ());
@@ -2602,7 +2598,7 @@
   for (std::list< Ptr<Packet> >::iterator fragIter = storedFragments.begin ();
        fragIter != storedFragments.end (); fragIter++)
     {
-      m_dropTrace (DROP_FRAGMENT_TIMEOUT, *fragIter, m_node->GetObject<SixLowPanNetDevice> (), iif);
+      m_dropTrace (DROP_FRAGMENT_TIMEOUT, *fragIter, this, iif);
     }
   // clear the buffers
   it->second = 0;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/sixlowpan/model/sixlowpan-net-device.h ns-3.36/src/sixlowpan/model/sixlowpan-net-device.h
--- ns-3.35/src/sixlowpan/model/sixlowpan-net-device.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/sixlowpan/model/sixlowpan-net-device.h	2022-04-30 18:23:58.142734800 -0700
@@ -54,6 +54,12 @@
 
 /**
  * \ingroup sixlowpan
+ * \ingroup tests
+ * \defgroup sixlowpan-tests 6LoWPAN module tests
+ */
+
+/**
+ * \ingroup sixlowpan
  *
  * \brief Shim performing 6LoWPAN compression, decompression and fragmentation.
  *
@@ -88,6 +94,10 @@
    */
   SixLowPanNetDevice ();
 
+  // Delete copy constructor and assignment operator to avoid misuse
+  SixLowPanNetDevice (SixLowPanNetDevice const &) = delete;
+  SixLowPanNetDevice & operator = (SixLowPanNetDevice const &) = delete;
+
   // inherited from NetDevice base class
   virtual void SetIfIndex (const uint32_t index);
   virtual uint32_t GetIfIndex (void) const;
@@ -235,19 +245,6 @@
 
 private:
   /**
-   * \brief Copy constructor
-   *
-   * Defined and unimplemented to avoid misuse.
-   */
-  SixLowPanNetDevice (SixLowPanNetDevice const &);
-  /**
-   * \brief Copy constructor
-   *
-   * Defined and unimplemented to avoid misuse.
-   * \returns
-   */
-  SixLowPanNetDevice& operator= (SixLowPanNetDevice const &);
-  /**
    * \brief Receives all the packets from a NetDevice for further processing.
    * \param [in] device The NetDevice the packet ws received from.
    * \param [in] packet The received packet.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/sixlowpan/test/sixlowpan-fragmentation-test.cc ns-3.36/src/sixlowpan/test/sixlowpan-fragmentation-test.cc
--- ns-3.35/src/sixlowpan/test/sixlowpan-fragmentation-test.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/sixlowpan/test/sixlowpan-fragmentation-test.cc	2022-04-30 18:23:58.142734800 -0700
@@ -45,8 +45,7 @@
 using namespace ns3;
 
 /**
- * \ingroup sixlowpan-test
- * \ingroup tests
+ * \ingroup sixlowpan-tests
  *
  * \brief 6LoWPAN Fragmentation Test
  */
@@ -462,8 +461,7 @@
 
 
 /**
- * \ingroup sixlowpan-test
- * \ingroup tests
+ * \ingroup sixlowpan-tests
  *
  * \brief 6LoWPAN Fragmentation TestSuite
  */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/sixlowpan/test/sixlowpan-hc1-test.cc ns-3.36/src/sixlowpan/test/sixlowpan-hc1-test.cc
--- ns-3.35/src/sixlowpan/test/sixlowpan-hc1-test.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/sixlowpan/test/sixlowpan-hc1-test.cc	2022-04-30 18:23:58.142734800 -0700
@@ -40,8 +40,7 @@
 using namespace ns3;
 
 /**
- * \ingroup sixlowpan-test
- * \ingroup tests
+ * \ingroup sixlowpan-tests
  *
  * \brief 6LoWPAN HC1 Test
  */
@@ -211,8 +210,7 @@
 
 
 /**
- * \ingroup sixlowpan-test
- * \ingroup tests
+ * \ingroup sixlowpan-tests
  *
  * \brief 6LoWPAN HC1 TestSuite
  */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/sixlowpan/test/sixlowpan-iphc-stateful-test.cc ns-3.36/src/sixlowpan/test/sixlowpan-iphc-stateful-test.cc
--- ns-3.35/src/sixlowpan/test/sixlowpan-iphc-stateful-test.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/sixlowpan/test/sixlowpan-iphc-stateful-test.cc	2022-04-30 18:23:58.142734800 -0700
@@ -43,14 +43,7 @@
 using namespace ns3;
 
 /**
- * \ingroup sixlowpan
- * \defgroup sixlowpan-test 6LoWPAN module tests
- */
-
-
-/**
- * \ingroup sixlowpan-test
- * \ingroup tests
+ * \ingroup sixlowpan-tests
  *
  * \brief 6LoWPAN IPHC stateful compression Test
  */
@@ -318,8 +311,7 @@
 
 
 /**
- * \ingroup sixlowpan-test
- * \ingroup tests
+ * \ingroup sixlowpan-tests
  *
  * \brief 6LoWPAN IPHC TestSuite
  */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/sixlowpan/test/sixlowpan-iphc-test.cc ns-3.36/src/sixlowpan/test/sixlowpan-iphc-test.cc
--- ns-3.35/src/sixlowpan/test/sixlowpan-iphc-test.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/sixlowpan/test/sixlowpan-iphc-test.cc	2022-04-30 18:23:58.142734800 -0700
@@ -39,15 +39,9 @@
 
 using namespace ns3;
 
-/**
- * \ingroup sixlowpan
- * \defgroup sixlowpan-test 6LoWPAN module tests
- */
-
 
 /**
- * \ingroup sixlowpan-test
- * \ingroup tests
+ * \ingroup sixlowpan-tests
  *
  * \brief 6LoWPAN IPHC Test
  */
@@ -215,8 +209,7 @@
 
 
 /**
- * \ingroup sixlowpan-test
- * \ingroup tests
+ * \ingroup sixlowpan-tests
  *
  * \brief 6LoWPAN IPHC TestSuite
  */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/sixlowpan/wscript ns-3.36/src/sixlowpan/wscript
--- ns-3.35/src/sixlowpan/wscript	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/sixlowpan/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,40 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    module = bld.create_ns3_module('sixlowpan', ['internet', 'network', 'core'])
-    module.includes = '.'
-    module.source = [
-        'model/sixlowpan-net-device.cc',
-        'model/sixlowpan-header.cc',
-        'helper/sixlowpan-helper.cc',
-        ]
-
-    module_test = bld.create_ns3_module_test_library('sixlowpan')
-    module_test.source = [
-        'test/mock-net-device.cc',
-        'test/sixlowpan-hc1-test.cc',
-        'test/sixlowpan-iphc-test.cc',
-        'test/sixlowpan-iphc-stateful-test.cc',
-        'test/sixlowpan-fragmentation-test.cc',
-        ]
-
-    # This suite runs an example, only include if examples are built
-    # Tests encapsulating example programs should be listed here
-    if (bld.env['ENABLE_EXAMPLES']):
-        module_test.source.extend([
-            'test/sixlowpan-examples-test-suite.cc',
-            ])
-    
-    headers = bld(features=['ns3header'])
-    headers.module = 'sixlowpan'
-    headers.source = [
-        'model/sixlowpan-net-device.h',
-        'model/sixlowpan-header.h',
-        'helper/sixlowpan-helper.h',
-        ]
-
-
-    if (bld.env['ENABLE_EXAMPLES']):
-        bld.recurse('examples')
-   
-    bld.ns3_python_bindings()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/spectrum/bindings/callbacks_list.py ns-3.36/src/spectrum/bindings/callbacks_list.py
--- ns-3.35/src/spectrum/bindings/callbacks_list.py	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/spectrum/bindings/callbacks_list.py	2022-04-30 18:23:58.142734800 -0700
@@ -8,11 +8,11 @@
     ['void', 'unsigned int', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::QueueDiscItem>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['bool', 'ns3::Ptr<ns3::Packet>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Ptr<ns3::Packet>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::MobilityModel>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::SpectrumPhy>', 'ns3::Ptr<const ns3::SpectrumPhy>', 'double', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::MobilityModel>', 'ns3::Ptr<const ns3::MobilityModel>', 'double', 'double', 'double', 'double', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<ns3::SpectrumSignalParameters>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['bool', 'ns3::Ptr<ns3::Packet>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Ptr<ns3::Packet>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::SpectrumValue>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
 ]
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/spectrum/bindings/modulegen__gcc_ILP32.py ns-3.36/src/spectrum/bindings/modulegen__gcc_ILP32.py
--- ns-3.35/src/spectrum/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/spectrum/bindings/modulegen__gcc_ILP32.py	2022-04-30 18:23:58.142734800 -0700
@@ -73,6 +73,8 @@
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::Hash::Implementation'])
     ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::MatrixBasedChannelModel::ChannelMatrix> [struct]
     module.add_class('DefaultDeleter', template_parameters=['ns3::MatrixBasedChannelModel::ChannelMatrix'])
+    ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::MatrixBasedChannelModel::ChannelParams> [struct]
+    module.add_class('DefaultDeleter', template_parameters=['ns3::MatrixBasedChannelModel::ChannelParams'])
     ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::NixVector> [struct]
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::NixVector'])
     ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::Packet> [struct]
@@ -89,6 +91,8 @@
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::TraceSourceAccessor'])
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'], import_from_module='ns.core')
     ## hash.h (module 'core'): ns3::Hasher [class]
     module.add_class('Hasher', import_from_module='ns.core')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
@@ -143,8 +147,6 @@
     typehandlers.add_type_alias('std::vector< ns3::Ptr< ns3::Node > > const_iterator', 'ns3::NodeContainer::Iterator')
     typehandlers.add_type_alias('std::vector< ns3::Ptr< ns3::Node > > const_iterator*', 'ns3::NodeContainer::Iterator*')
     typehandlers.add_type_alias('std::vector< ns3::Ptr< ns3::Node > > const_iterator&', 'ns3::NodeContainer::Iterator&')
-    ## non-copyable.h (module 'core'): ns3::NonCopyable [class]
-    module.add_class('NonCopyable', destructor_visibility='protected', import_from_module='ns.core')
     ## object-base.h (module 'core'): ns3::ObjectBase [class]
     module.add_class('ObjectBase', allow_subclassing=True, import_from_module='ns.core')
     ## object.h (module 'core'): ns3::ObjectDeleter [struct]
@@ -248,6 +250,8 @@
     typehandlers.add_type_alias('std::vector< std::complex< double > >', 'ns3::PhasedArrayModel::ComplexVector')
     typehandlers.add_type_alias('std::vector< std::complex< double > >*', 'ns3::PhasedArrayModel::ComplexVector*')
     typehandlers.add_type_alias('std::vector< std::complex< double > >&', 'ns3::PhasedArrayModel::ComplexVector&')
+    ## phased-array-spectrum-propagation-loss-model.h (module 'spectrum'): ns3::PhasedArraySpectrumPropagationLossModel [class]
+    module.add_class('PhasedArraySpectrumPropagationLossModel', parent=root_module['ns3::Object'])
     ## propagation-delay-model.h (module 'propagation'): ns3::PropagationDelayModel [class]
     module.add_class('PropagationDelayModel', import_from_module='ns.propagation', parent=root_module['ns3::Object'])
     ## propagation-loss-model.h (module 'propagation'): ns3::PropagationLossModel [class]
@@ -264,35 +268,37 @@
     module.add_class('RangePropagationLossModel', import_from_module='ns.propagation', parent=root_module['ns3::PropagationLossModel'])
     ## random-variable-stream.h (module 'core'): ns3::SequentialRandomVariable [class]
     module.add_class('SequentialRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MatrixBasedChannelModel::ChannelMatrix, ns3::empty, ns3::DefaultDeleter<ns3::MatrixBasedChannelModel::ChannelMatrix> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MatrixBasedChannelModel::ChannelMatrix, ns3::empty, ns3::DefaultDeleter<ns3::MatrixBasedChannelModel::ChannelMatrix>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::MatrixBasedChannelModel::ChannelMatrix', 'ns3::empty', 'ns3::DefaultDeleter<ns3::MatrixBasedChannelModel::ChannelMatrix>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MatrixBasedChannelModel::ChannelParams, ns3::empty, ns3::DefaultDeleter<ns3::MatrixBasedChannelModel::ChannelParams>> [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::MatrixBasedChannelModel::ChannelParams', 'ns3::empty', 'ns3::DefaultDeleter<ns3::MatrixBasedChannelModel::ChannelParams>'])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::QueueItem', 'ns3::empty', 'ns3::DefaultDeleter<ns3::QueueItem>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumConverter, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumConverter> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumConverter, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumConverter>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::SpectrumConverter', 'ns3::empty', 'ns3::DefaultDeleter<ns3::SpectrumConverter>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::SpectrumModel', 'ns3::empty', 'ns3::DefaultDeleter<ns3::SpectrumModel>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::SpectrumSignalParameters', 'ns3::empty', 'ns3::DefaultDeleter<ns3::SpectrumSignalParameters>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::SpectrumValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::SpectrumValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
     ## spectrum-converter.h (module 'spectrum'): ns3::SpectrumConverter [class]
     module.add_class('SpectrumConverter', parent=root_module['ns3::SimpleRefCount< ns3::SpectrumConverter, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumConverter> >'])
@@ -314,7 +320,7 @@
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::SpectrumValue > )*', 'ns3::SpectrumValue::TracedCallback*')
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::SpectrumValue > )&', 'ns3::SpectrumValue::TracedCallback&')
     ## three-gpp-spectrum-propagation-loss-model.h (module 'spectrum'): ns3::ThreeGppSpectrumPropagationLossModel [class]
-    module.add_class('ThreeGppSpectrumPropagationLossModel', parent=root_module['ns3::SpectrumPropagationLossModel'])
+    module.add_class('ThreeGppSpectrumPropagationLossModel', parent=root_module['ns3::PhasedArraySpectrumPropagationLossModel'])
     ## propagation-loss-model.h (module 'propagation'): ns3::ThreeLogDistancePropagationLossModel [class]
     module.add_class('ThreeLogDistancePropagationLossModel', import_from_module='ns.propagation', parent=root_module['ns3::PropagationLossModel'])
     ## trace-fading-loss-model.h (module 'spectrum'): ns3::TraceFadingLossModel [class]
@@ -458,6 +464,8 @@
     module.add_class('MatrixBasedChannelModel', parent=root_module['ns3::Object'])
     ## matrix-based-channel-model.h (module 'spectrum'): ns3::MatrixBasedChannelModel::ChannelMatrix [struct]
     module.add_class('ChannelMatrix', outer_class=root_module['ns3::MatrixBasedChannelModel'], parent=root_module['ns3::SimpleRefCount< ns3::MatrixBasedChannelModel::ChannelMatrix, ns3::empty, ns3::DefaultDeleter<ns3::MatrixBasedChannelModel::ChannelMatrix> >'])
+    ## matrix-based-channel-model.h (module 'spectrum'): ns3::MatrixBasedChannelModel::ChannelParams [struct]
+    module.add_class('ChannelParams', outer_class=root_module['ns3::MatrixBasedChannelModel'], parent=root_module['ns3::SimpleRefCount< ns3::MatrixBasedChannelModel::ChannelParams, ns3::empty, ns3::DefaultDeleter<ns3::MatrixBasedChannelModel::ChannelParams> >'])
     typehandlers.add_type_alias('std::vector< double >', 'ns3::MatrixBasedChannelModel::DoubleVector')
     typehandlers.add_type_alias('std::vector< double >*', 'ns3::MatrixBasedChannelModel::DoubleVector*')
     typehandlers.add_type_alias('std::vector< double >&', 'ns3::MatrixBasedChannelModel::DoubleVector&')
@@ -656,7 +664,7 @@
     typehandlers.add_type_alias('std::vector< ns3::Ptr< ns3::SpectrumPhy > >*', 'ns3::SingleModelSpectrumChannel::PhyList*')
     typehandlers.add_type_alias('std::vector< ns3::Ptr< ns3::SpectrumPhy > >&', 'ns3::SingleModelSpectrumChannel::PhyList&')
     module.add_container('std::vector< double >', 'double', container_type='vector')
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     module.add_container('std::vector< ns3::Ptr< ns3::SpectrumPhy > >', 'ns3::Ptr< ns3::SpectrumPhy >', container_type='vector')
     module.add_container('ns3::SpectrumConverterMap_t', ('unsigned int', 'ns3::SpectrumConverter'), container_type='map')
     module.add_container('std::vector< std::pair< unsigned int, unsigned int > >', 'std::pair< unsigned int, unsigned int >', container_type='vector')
@@ -682,6 +690,21 @@
     typehandlers.add_type_alias('std::map< unsigned int, ns3::RxSpectrumModelInfo >', 'ns3::RxSpectrumModelInfoMap_t')
     typehandlers.add_type_alias('std::map< unsigned int, ns3::RxSpectrumModelInfo >*', 'ns3::RxSpectrumModelInfoMap_t*')
     typehandlers.add_type_alias('std::map< unsigned int, ns3::RxSpectrumModelInfo >&', 'ns3::RxSpectrumModelInfoMap_t&')
+    typehandlers.add_type_alias('ns3::Callback< bool, ns3::Ptr< ns3::Packet >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::GenericPhyTxStartCallback')
+    typehandlers.add_type_alias('ns3::Callback< bool, ns3::Ptr< ns3::Packet >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::GenericPhyTxStartCallback*')
+    typehandlers.add_type_alias('ns3::Callback< bool, ns3::Ptr< ns3::Packet >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::GenericPhyTxStartCallback&')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::GenericPhyTxEndCallback')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::GenericPhyTxEndCallback*')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::GenericPhyTxEndCallback&')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::GenericPhyRxStartCallback')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::GenericPhyRxStartCallback*')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::GenericPhyRxStartCallback&')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::GenericPhyRxEndErrorCallback')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::GenericPhyRxEndErrorCallback*')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::GenericPhyRxEndErrorCallback&')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::GenericPhyRxEndOkCallback')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::GenericPhyRxEndOkCallback*')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::GenericPhyRxEndOkCallback&')
     typehandlers.add_type_alias('std::vector< double >', 'ns3::Values')
     typehandlers.add_type_alias('std::vector< double >*', 'ns3::Values*')
     typehandlers.add_type_alias('std::vector< double >&', 'ns3::Values&')
@@ -703,21 +726,6 @@
     typehandlers.add_type_alias('ns3::Vector3DChecker*', 'ns3::VectorChecker*')
     typehandlers.add_type_alias('ns3::Vector3DChecker&', 'ns3::VectorChecker&')
     module.add_typedef(root_module['ns3::Vector3DChecker'], 'VectorChecker')
-    typehandlers.add_type_alias('ns3::Callback< bool, ns3::Ptr< ns3::Packet >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::GenericPhyTxStartCallback')
-    typehandlers.add_type_alias('ns3::Callback< bool, ns3::Ptr< ns3::Packet >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::GenericPhyTxStartCallback*')
-    typehandlers.add_type_alias('ns3::Callback< bool, ns3::Ptr< ns3::Packet >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::GenericPhyTxStartCallback&')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::GenericPhyTxEndCallback')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::GenericPhyTxEndCallback*')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::GenericPhyTxEndCallback&')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::GenericPhyRxStartCallback')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::GenericPhyRxStartCallback*')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::GenericPhyRxStartCallback&')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::GenericPhyRxEndErrorCallback')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::GenericPhyRxEndErrorCallback*')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::GenericPhyRxEndErrorCallback&')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::GenericPhyRxEndOkCallback')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::GenericPhyRxEndOkCallback*')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::GenericPhyRxEndOkCallback&')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )', 'ns3::TimePrinter')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )*', 'ns3::TimePrinter*')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )&', 'ns3::TimePrinter&')
@@ -873,6 +881,7 @@
     register_Ns3DefaultDeleter__Ns3EventImpl_methods(root_module, root_module['ns3::DefaultDeleter< ns3::EventImpl >'])
     register_Ns3DefaultDeleter__Ns3HashImplementation_methods(root_module, root_module['ns3::DefaultDeleter< ns3::Hash::Implementation >'])
     register_Ns3DefaultDeleter__Ns3MatrixBasedChannelModelChannelMatrix_methods(root_module, root_module['ns3::DefaultDeleter< ns3::MatrixBasedChannelModel::ChannelMatrix >'])
+    register_Ns3DefaultDeleter__Ns3MatrixBasedChannelModelChannelParams_methods(root_module, root_module['ns3::DefaultDeleter< ns3::MatrixBasedChannelModel::ChannelParams >'])
     register_Ns3DefaultDeleter__Ns3NixVector_methods(root_module, root_module['ns3::DefaultDeleter< ns3::NixVector >'])
     register_Ns3DefaultDeleter__Ns3Packet_methods(root_module, root_module['ns3::DefaultDeleter< ns3::Packet >'])
     register_Ns3DefaultDeleter__Ns3QueueItem_methods(root_module, root_module['ns3::DefaultDeleter< ns3::QueueItem >'])
@@ -896,7 +905,6 @@
     register_Ns3MicrowaveOvenSpectrumValueHelper_methods(root_module, root_module['ns3::MicrowaveOvenSpectrumValueHelper'])
     register_Ns3NetDeviceContainer_methods(root_module, root_module['ns3::NetDeviceContainer'])
     register_Ns3NodeContainer_methods(root_module, root_module['ns3::NodeContainer'])
-    register_Ns3NonCopyable_methods(root_module, root_module['ns3::NonCopyable'])
     register_Ns3ObjectBase_methods(root_module, root_module['ns3::ObjectBase'])
     register_Ns3ObjectDeleter_methods(root_module, root_module['ns3::ObjectDeleter'])
     register_Ns3ObjectFactory_methods(root_module, root_module['ns3::ObjectFactory'])
@@ -937,6 +945,7 @@
     register_Ns3Object_methods(root_module, root_module['ns3::Object'])
     register_Ns3ObjectAggregateIterator_methods(root_module, root_module['ns3::Object::AggregateIterator'])
     register_Ns3PhasedArrayModel_methods(root_module, root_module['ns3::PhasedArrayModel'])
+    register_Ns3PhasedArraySpectrumPropagationLossModel_methods(root_module, root_module['ns3::PhasedArraySpectrumPropagationLossModel'])
     register_Ns3PropagationDelayModel_methods(root_module, root_module['ns3::PropagationDelayModel'])
     register_Ns3PropagationLossModel_methods(root_module, root_module['ns3::PropagationLossModel'])
     register_Ns3QueueBase_methods(root_module, root_module['ns3::QueueBase'])
@@ -952,6 +961,7 @@
     register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >'])
     register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >'])
     register_Ns3SimpleRefCount__Ns3MatrixBasedChannelModelChannelMatrix_Ns3Empty_Ns3DefaultDeleter__lt__ns3MatrixBasedChannelModelChannelMatrix__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::MatrixBasedChannelModel::ChannelMatrix, ns3::empty, ns3::DefaultDeleter<ns3::MatrixBasedChannelModel::ChannelMatrix> >'])
+    register_Ns3SimpleRefCount__Ns3MatrixBasedChannelModelChannelParams_Ns3Empty_Ns3DefaultDeleter__lt__ns3MatrixBasedChannelModelChannelParams__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::MatrixBasedChannelModel::ChannelParams, ns3::empty, ns3::DefaultDeleter<ns3::MatrixBasedChannelModel::ChannelParams> >'])
     register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >'])
     register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >'])
     register_Ns3SimpleRefCount__Ns3QueueItem_Ns3Empty_Ns3DefaultDeleter__lt__ns3QueueItem__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> >'])
@@ -1035,6 +1045,7 @@
     register_Ns3Mac64AddressValue_methods(root_module, root_module['ns3::Mac64AddressValue'])
     register_Ns3MatrixBasedChannelModel_methods(root_module, root_module['ns3::MatrixBasedChannelModel'])
     register_Ns3MatrixBasedChannelModelChannelMatrix_methods(root_module, root_module['ns3::MatrixBasedChannelModel::ChannelMatrix'])
+    register_Ns3MatrixBasedChannelModelChannelParams_methods(root_module, root_module['ns3::MatrixBasedChannelModel::ChannelParams'])
     register_Ns3MatrixPropagationLossModel_methods(root_module, root_module['ns3::MatrixPropagationLossModel'])
     register_Ns3MobilityModel_methods(root_module, root_module['ns3::MobilityModel'])
     register_Ns3NakagamiPropagationLossModel_methods(root_module, root_module['ns3::NakagamiPropagationLossModel'])
@@ -1810,6 +1821,18 @@
                    is_static=True)
     return
 
+def register_Ns3DefaultDeleter__Ns3MatrixBasedChannelModelChannelParams_methods(root_module, cls):
+    ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::MatrixBasedChannelModel::ChannelParams>::DefaultDeleter() [constructor]
+    cls.add_constructor([])
+    ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::MatrixBasedChannelModel::ChannelParams>::DefaultDeleter(ns3::DefaultDeleter<ns3::MatrixBasedChannelModel::ChannelParams> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::DefaultDeleter< ns3::MatrixBasedChannelModel::ChannelParams > const &', 'arg0')])
+    ## default-deleter.h (module 'core'): static void ns3::DefaultDeleter<ns3::MatrixBasedChannelModel::ChannelParams>::Delete(ns3::MatrixBasedChannelModel::ChannelParams * object) [member function]
+    cls.add_method('Delete', 
+                   'void', 
+                   [param('ns3::MatrixBasedChannelModel::ChannelParams *', 'object')], 
+                   is_static=True)
+    return
+
 def register_Ns3DefaultDeleter__Ns3NixVector_methods(root_module, cls):
     ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::NixVector>::DefaultDeleter() [constructor]
     cls.add_constructor([])
@@ -2859,12 +2882,6 @@
                    is_const=True)
     return
 
-def register_Ns3NonCopyable_methods(root_module, cls):
-    ## non-copyable.h (module 'core'): ns3::NonCopyable::NonCopyable() [constructor]
-    cls.add_constructor([], 
-                        visibility='protected')
-    return
-
 def register_Ns3ObjectBase_methods(root_module, cls):
     ## object-base.h (module 'core'): ns3::ObjectBase::ObjectBase() [constructor]
     cls.add_constructor([])
@@ -3790,8 +3807,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -4181,7 +4198,7 @@
                    'ns3::Ptr< ns3::SpectrumValue >', 
                    [param('uint32_t', 'centerFrequency'), param('uint16_t', 'totalChannelWidth'), param('uint32_t', 'bandBandwidth'), param('uint16_t', 'guardBandwidth'), param('std::pair< unsigned int, unsigned int >', 'band')], 
                    is_static=True)
-    ## wifi-spectrum-value-helper.h (module 'spectrum'): static void ns3::WifiSpectrumValueHelper::CreateSpectrumMaskForOfdm(ns3::Ptr<ns3::SpectrumValue> c, std::vector<std::pair<unsigned int, unsigned int>, std::allocator<std::pair<unsigned int, unsigned int> > > allocatedSubBands, ns3::WifiSpectrumBand maskBand, double txPowerPerBandW, uint32_t nGuardBands, uint32_t innerSlopeWidth, double minInnerBandDbr, double minOuterbandDbr, double lowestPointDbr) [member function]
+    ## wifi-spectrum-value-helper.h (module 'spectrum'): static void ns3::WifiSpectrumValueHelper::CreateSpectrumMaskForOfdm(ns3::Ptr<ns3::SpectrumValue> c, std::vector<std::pair<unsigned int, unsigned int>, std::allocator<std::pair<unsigned int, unsigned int>>> allocatedSubBands, ns3::WifiSpectrumBand maskBand, double txPowerPerBandW, uint32_t nGuardBands, uint32_t innerSlopeWidth, double minInnerBandDbr, double minOuterbandDbr, double lowestPointDbr) [member function]
     cls.add_method('CreateSpectrumMaskForOfdm', 
                    'void', 
                    [param('ns3::Ptr< ns3::SpectrumValue >', 'c'), param('std::vector< std::pair< unsigned int, unsigned int > >', 'allocatedSubBands'), param('std::pair< unsigned int, unsigned int >', 'maskBand'), param('double', 'txPowerPerBandW'), param('uint32_t', 'nGuardBands'), param('uint32_t', 'innerSlopeWidth'), param('double', 'minInnerBandDbr'), param('double', 'minOuterbandDbr'), param('double', 'lowestPointDbr')], 
@@ -4225,14 +4242,14 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('>=')
     cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_unary_numeric_operator('-')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
     cls.add_constructor([])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(double const value) [constructor]
@@ -4251,6 +4268,8 @@
     cls.add_constructor([param('long unsigned int const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int const v) [constructor]
     cls.add_constructor([param('long long unsigned int const', 'v')])
+    ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int128_t const v) [constructor]
+    cls.add_constructor([param('int128_t const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t const hi, uint64_t const lo) [constructor]
     cls.add_constructor([param('int64_t const', 'hi'), param('uint64_t const', 'lo')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [constructor]
@@ -4464,6 +4483,11 @@
                    'ns3::Vector', 
                    [param('uint64_t', 'index')], 
                    is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## phased-array-model.h (module 'antenna'): uint32_t ns3::PhasedArrayModel::GetId() const [member function]
+    cls.add_method('GetId', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
     ## phased-array-model.h (module 'antenna'): uint64_t ns3::PhasedArrayModel::GetNumberOfElements() const [member function]
     cls.add_method('GetNumberOfElements', 
                    'uint64_t', 
@@ -4494,6 +4518,37 @@
                    is_static=True, visibility='protected')
     return
 
+def register_Ns3PhasedArraySpectrumPropagationLossModel_methods(root_module, cls):
+    ## phased-array-spectrum-propagation-loss-model.h (module 'spectrum'): ns3::PhasedArraySpectrumPropagationLossModel::PhasedArraySpectrumPropagationLossModel(ns3::PhasedArraySpectrumPropagationLossModel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::PhasedArraySpectrumPropagationLossModel const &', 'arg0')])
+    ## phased-array-spectrum-propagation-loss-model.h (module 'spectrum'): ns3::PhasedArraySpectrumPropagationLossModel::PhasedArraySpectrumPropagationLossModel() [constructor]
+    cls.add_constructor([])
+    ## phased-array-spectrum-propagation-loss-model.h (module 'spectrum'): ns3::Ptr<ns3::SpectrumValue> ns3::PhasedArraySpectrumPropagationLossModel::CalcRxPowerSpectralDensity(ns3::Ptr<const ns3::SpectrumValue> txPsd, ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b, ns3::Ptr<const ns3::PhasedArrayModel> aPhasedArrayModel, ns3::Ptr<const ns3::PhasedArrayModel> bPhasedArrayModel) const [member function]
+    cls.add_method('CalcRxPowerSpectralDensity', 
+                   'ns3::Ptr< ns3::SpectrumValue >', 
+                   [param('ns3::Ptr< ns3::SpectrumValue const >', 'txPsd'), param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b'), param('ns3::Ptr< ns3::PhasedArrayModel const >', 'aPhasedArrayModel'), param('ns3::Ptr< ns3::PhasedArrayModel const >', 'bPhasedArrayModel')], 
+                   is_const=True)
+    ## phased-array-spectrum-propagation-loss-model.h (module 'spectrum'): static ns3::TypeId ns3::PhasedArraySpectrumPropagationLossModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## phased-array-spectrum-propagation-loss-model.h (module 'spectrum'): void ns3::PhasedArraySpectrumPropagationLossModel::SetNext(ns3::Ptr<ns3::PhasedArraySpectrumPropagationLossModel> next) [member function]
+    cls.add_method('SetNext', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::PhasedArraySpectrumPropagationLossModel >', 'next')])
+    ## phased-array-spectrum-propagation-loss-model.h (module 'spectrum'): void ns3::PhasedArraySpectrumPropagationLossModel::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## phased-array-spectrum-propagation-loss-model.h (module 'spectrum'): ns3::Ptr<ns3::SpectrumValue> ns3::PhasedArraySpectrumPropagationLossModel::DoCalcRxPowerSpectralDensity(ns3::Ptr<const ns3::SpectrumValue> txPsd, ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b, ns3::Ptr<const ns3::PhasedArrayModel> aPhasedArrayModel, ns3::Ptr<const ns3::PhasedArrayModel> bPhasedArrayModel) const [member function]
+    cls.add_method('DoCalcRxPowerSpectralDensity', 
+                   'ns3::Ptr< ns3::SpectrumValue >', 
+                   [param('ns3::Ptr< ns3::SpectrumValue const >', 'txPsd'), param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b'), param('ns3::Ptr< ns3::PhasedArrayModel const >', 'aPhasedArrayModel'), param('ns3::Ptr< ns3::PhasedArrayModel const >', 'bPhasedArrayModel')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
+    return
+
 def register_Ns3PropagationDelayModel_methods(root_module, cls):
     ## propagation-delay-model.h (module 'propagation'): ns3::PropagationDelayModel::PropagationDelayModel() [constructor]
     cls.add_constructor([])
@@ -4517,7 +4572,7 @@
     cls.add_method('DoAssignStreams', 
                    'int64_t', 
                    [param('int64_t', 'stream')], 
-                   is_pure_virtual=True, is_virtual=True, visibility='private')
+                   is_pure_virtual=True, is_virtual=True, visibility='protected')
     return
 
 def register_Ns3PropagationLossModel_methods(root_module, cls):
@@ -4545,16 +4600,16 @@
     cls.add_method('AssignStreams', 
                    'int64_t', 
                    [param('int64_t', 'stream')])
+    ## propagation-loss-model.h (module 'propagation'): int64_t ns3::PropagationLossModel::DoAssignStreams(int64_t stream) [member function]
+    cls.add_method('DoAssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')], 
+                   is_pure_virtual=True, is_virtual=True, visibility='protected')
     ## propagation-loss-model.h (module 'propagation'): double ns3::PropagationLossModel::DoCalcRxPower(double txPowerDbm, ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
     cls.add_method('DoCalcRxPower', 
                    'double', 
                    [param('double', 'txPowerDbm'), param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
                    is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
-    ## propagation-loss-model.h (module 'propagation'): int64_t ns3::PropagationLossModel::DoAssignStreams(int64_t stream) [member function]
-    cls.add_method('DoAssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'stream')], 
-                   is_pure_virtual=True, is_virtual=True, visibility='private')
     return
 
 def register_Ns3QueueBase_methods(root_module, cls):
@@ -4645,6 +4700,11 @@
     cls.add_method('SetMaxSize', 
                    'void', 
                    [param('ns3::QueueSize', 'size')])
+    ## queue.h (module 'network'): bool ns3::QueueBase::WouldOverflow(uint32_t nPackets, uint32_t nBytes) const [member function]
+    cls.add_method('WouldOverflow', 
+                   'bool', 
+                   [param('uint32_t', 'nPackets'), param('uint32_t', 'nBytes')], 
+                   is_const=True)
     return
 
 def register_Ns3RandomPropagationDelayModel_methods(root_module, cls):
@@ -4793,107 +4853,114 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3MatrixBasedChannelModelChannelMatrix_Ns3Empty_Ns3DefaultDeleter__lt__ns3MatrixBasedChannelModelChannelMatrix__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MatrixBasedChannelModel::ChannelMatrix, ns3::empty, ns3::DefaultDeleter<ns3::MatrixBasedChannelModel::ChannelMatrix> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MatrixBasedChannelModel::ChannelMatrix, ns3::empty, ns3::DefaultDeleter<ns3::MatrixBasedChannelModel::ChannelMatrix>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MatrixBasedChannelModel::ChannelMatrix, ns3::empty, ns3::DefaultDeleter<ns3::MatrixBasedChannelModel::ChannelMatrix> >::SimpleRefCount(ns3::SimpleRefCount<ns3::MatrixBasedChannelModel::ChannelMatrix, ns3::empty, ns3::DefaultDeleter<ns3::MatrixBasedChannelModel::ChannelMatrix> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MatrixBasedChannelModel::ChannelMatrix, ns3::empty, ns3::DefaultDeleter<ns3::MatrixBasedChannelModel::ChannelMatrix>>::SimpleRefCount(ns3::SimpleRefCount<ns3::MatrixBasedChannelModel::ChannelMatrix, ns3::empty, ns3::DefaultDeleter<ns3::MatrixBasedChannelModel::ChannelMatrix>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::MatrixBasedChannelModel::ChannelMatrix, ns3::empty, ns3::DefaultDeleter< ns3::MatrixBasedChannelModel::ChannelMatrix > > const &', 'o')])
     return
 
+def register_Ns3SimpleRefCount__Ns3MatrixBasedChannelModelChannelParams_Ns3Empty_Ns3DefaultDeleter__lt__ns3MatrixBasedChannelModelChannelParams__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MatrixBasedChannelModel::ChannelParams, ns3::empty, ns3::DefaultDeleter<ns3::MatrixBasedChannelModel::ChannelParams>>::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MatrixBasedChannelModel::ChannelParams, ns3::empty, ns3::DefaultDeleter<ns3::MatrixBasedChannelModel::ChannelParams>>::SimpleRefCount(ns3::SimpleRefCount<ns3::MatrixBasedChannelModel::ChannelParams, ns3::empty, ns3::DefaultDeleter<ns3::MatrixBasedChannelModel::ChannelParams>> const & o) [constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::MatrixBasedChannelModel::ChannelParams, ns3::empty, ns3::DefaultDeleter< ns3::MatrixBasedChannelModel::ChannelParams > > const &', 'o')])
+    return
+
 def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3QueueItem_Ns3Empty_Ns3DefaultDeleter__lt__ns3QueueItem__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> >::SimpleRefCount(ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>>::SimpleRefCount(ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::QueueItem, ns3::empty, ns3::DefaultDeleter< ns3::QueueItem > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3SpectrumConverter_Ns3Empty_Ns3DefaultDeleter__lt__ns3SpectrumConverter__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumConverter, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumConverter> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumConverter, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumConverter>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumConverter, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumConverter> >::SimpleRefCount(ns3::SimpleRefCount<ns3::SpectrumConverter, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumConverter> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumConverter, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumConverter>>::SimpleRefCount(ns3::SimpleRefCount<ns3::SpectrumConverter, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumConverter>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::SpectrumConverter, ns3::empty, ns3::DefaultDeleter< ns3::SpectrumConverter > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3SpectrumModel_Ns3Empty_Ns3DefaultDeleter__lt__ns3SpectrumModel__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel> >::SimpleRefCount(ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel>>::SimpleRefCount(ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter< ns3::SpectrumModel > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3SpectrumSignalParameters_Ns3Empty_Ns3DefaultDeleter__lt__ns3SpectrumSignalParameters__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters> >::SimpleRefCount(ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters>>::SimpleRefCount(ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter< ns3::SpectrumSignalParameters > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3SpectrumValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3SpectrumValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter< ns3::SpectrumValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
@@ -4983,16 +5050,16 @@
     cls.add_binary_comparison_operator('==')
     ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(ns3::SpectrumModel const & arg0) [constructor]
     cls.add_constructor([param('ns3::SpectrumModel const &', 'arg0')])
-    ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(std::vector<double, std::allocator<double> > const & centerFreqs) [constructor]
+    ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(std::vector<double, std::allocator<double>> const & centerFreqs) [constructor]
     cls.add_constructor([param('std::vector< double > const &', 'centerFreqs')])
     ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(ns3::Bands const & bands) [constructor]
     cls.add_constructor([param('ns3::Bands const &', 'bands')])
-    ## spectrum-model.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo> >::const_iterator ns3::SpectrumModel::Begin() const [member function]
+    ## spectrum-model.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo>>::const_iterator ns3::SpectrumModel::Begin() const [member function]
     cls.add_method('Begin', 
                    'std::vector< ns3::BandInfo > const_iterator', 
                    [], 
                    is_const=True)
-    ## spectrum-model.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo> >::const_iterator ns3::SpectrumModel::End() const [member function]
+    ## spectrum-model.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo>>::const_iterator ns3::SpectrumModel::End() const [member function]
     cls.add_method('End', 
                    'std::vector< ns3::BandInfo > const_iterator', 
                    [], 
@@ -5052,9 +5119,9 @@
                    'ns3::Ptr< ns3::SpectrumModel const >', 
                    [], 
                    is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::AntennaModel> ns3::SpectrumPhy::GetRxAntenna() const [member function]
-    cls.add_method('GetRxAntenna', 
-                   'ns3::Ptr< ns3::AntennaModel >', 
+    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::Object> ns3::SpectrumPhy::GetAntenna() const [member function]
+    cls.add_method('GetAntenna', 
+                   'ns3::Ptr< ns3::Object >', 
                    [], 
                    is_const=True, is_pure_virtual=True, is_virtual=True)
     ## spectrum-phy.h (module 'spectrum'): void ns3::SpectrumPhy::StartRx(ns3::Ptr<ns3::SpectrumSignalParameters> params) [member function]
@@ -5140,22 +5207,22 @@
     cls.add_constructor([param('ns3::Ptr< ns3::SpectrumModel const >', 'sm')])
     ## spectrum-value.h (module 'spectrum'): ns3::SpectrumValue::SpectrumValue() [constructor]
     cls.add_constructor([])
-    ## spectrum-value.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo> >::const_iterator ns3::SpectrumValue::ConstBandsBegin() const [member function]
+    ## spectrum-value.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo>>::const_iterator ns3::SpectrumValue::ConstBandsBegin() const [member function]
     cls.add_method('ConstBandsBegin', 
                    'std::vector< ns3::BandInfo > const_iterator', 
                    [], 
                    is_const=True)
-    ## spectrum-value.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo> >::const_iterator ns3::SpectrumValue::ConstBandsEnd() const [member function]
+    ## spectrum-value.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo>>::const_iterator ns3::SpectrumValue::ConstBandsEnd() const [member function]
     cls.add_method('ConstBandsEnd', 
                    'std::vector< ns3::BandInfo > const_iterator', 
                    [], 
                    is_const=True)
-    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double> >::const_iterator ns3::SpectrumValue::ConstValuesBegin() const [member function]
+    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double>>::const_iterator ns3::SpectrumValue::ConstValuesBegin() const [member function]
     cls.add_method('ConstValuesBegin', 
                    'std::vector< double > const_iterator', 
                    [], 
                    is_const=True)
-    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double> >::const_iterator ns3::SpectrumValue::ConstValuesEnd() const [member function]
+    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double>>::const_iterator ns3::SpectrumValue::ConstValuesEnd() const [member function]
     cls.add_method('ConstValuesEnd', 
                    'std::vector< double > const_iterator', 
                    [], 
@@ -5185,11 +5252,11 @@
                    'double const &', 
                    [param('uint32_t', 'pos')], 
                    is_const=True)
-    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double> >::iterator ns3::SpectrumValue::ValuesBegin() [member function]
+    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double>>::iterator ns3::SpectrumValue::ValuesBegin() [member function]
     cls.add_method('ValuesBegin', 
                    'std::vector< double > iterator', 
                    [])
-    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double> >::iterator ns3::SpectrumValue::ValuesEnd() [member function]
+    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double>>::iterator ns3::SpectrumValue::ValuesEnd() [member function]
     cls.add_method('ValuesEnd', 
                    'std::vector< double > iterator', 
                    [])
@@ -5200,14 +5267,10 @@
     cls.add_constructor([param('ns3::ThreeGppSpectrumPropagationLossModel const &', 'arg0')])
     ## three-gpp-spectrum-propagation-loss-model.h (module 'spectrum'): ns3::ThreeGppSpectrumPropagationLossModel::ThreeGppSpectrumPropagationLossModel() [constructor]
     cls.add_constructor([])
-    ## three-gpp-spectrum-propagation-loss-model.h (module 'spectrum'): void ns3::ThreeGppSpectrumPropagationLossModel::AddDevice(ns3::Ptr<ns3::NetDevice> n, ns3::Ptr<const ns3::PhasedArrayModel> a) [member function]
-    cls.add_method('AddDevice', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::NetDevice >', 'n'), param('ns3::Ptr< ns3::PhasedArrayModel const >', 'a')])
-    ## three-gpp-spectrum-propagation-loss-model.h (module 'spectrum'): ns3::Ptr<ns3::SpectrumValue> ns3::ThreeGppSpectrumPropagationLossModel::DoCalcRxPowerSpectralDensity(ns3::Ptr<const ns3::SpectrumValue> txPsd, ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b) const [member function]
+    ## three-gpp-spectrum-propagation-loss-model.h (module 'spectrum'): ns3::Ptr<ns3::SpectrumValue> ns3::ThreeGppSpectrumPropagationLossModel::DoCalcRxPowerSpectralDensity(ns3::Ptr<const ns3::SpectrumValue> txPsd, ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b, ns3::Ptr<const ns3::PhasedArrayModel> aPhasedArrayModel, ns3::Ptr<const ns3::PhasedArrayModel> bPhasedArrayModel) const [member function]
     cls.add_method('DoCalcRxPowerSpectralDensity', 
                    'ns3::Ptr< ns3::SpectrumValue >', 
-                   [param('ns3::Ptr< ns3::SpectrumValue const >', 'txPsd'), param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b')], 
+                   [param('ns3::Ptr< ns3::SpectrumValue const >', 'txPsd'), param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b'), param('ns3::Ptr< ns3::PhasedArrayModel const >', 'aPhasedArrayModel'), param('ns3::Ptr< ns3::PhasedArrayModel const >', 'bPhasedArrayModel')], 
                    is_const=True, is_virtual=True)
     ## three-gpp-spectrum-propagation-loss-model.h (module 'spectrum'): void ns3::ThreeGppSpectrumPropagationLossModel::DoDispose() [member function]
     cls.add_method('DoDispose', 
@@ -5431,9 +5494,9 @@
                    'ns3::Ptr< ns3::SpectrumModel const >', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## tv-spectrum-transmitter.h (module 'spectrum'): ns3::Ptr<ns3::AntennaModel> ns3::TvSpectrumTransmitter::GetRxAntenna() const [member function]
-    cls.add_method('GetRxAntenna', 
-                   'ns3::Ptr< ns3::AntennaModel >', 
+    ## tv-spectrum-transmitter.h (module 'spectrum'): ns3::Ptr<ns3::Object> ns3::TvSpectrumTransmitter::GetAntenna() const [member function]
+    cls.add_method('GetAntenna', 
+                   'ns3::Ptr< ns3::Object >', 
                    [], 
                    is_const=True, is_virtual=True)
     ## tv-spectrum-transmitter.h (module 'spectrum'): void ns3::TvSpectrumTransmitter::StartRx(ns3::Ptr<ns3::SpectrumSignalParameters> params) [member function]
@@ -5600,9 +5663,9 @@
                    'ns3::Ptr< ns3::SpectrumModel const >', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## waveform-generator.h (module 'spectrum'): ns3::Ptr<ns3::AntennaModel> ns3::WaveformGenerator::GetRxAntenna() const [member function]
-    cls.add_method('GetRxAntenna', 
-                   'ns3::Ptr< ns3::AntennaModel >', 
+    ## waveform-generator.h (module 'spectrum'): ns3::Ptr<ns3::Object> ns3::WaveformGenerator::GetAntenna() const [member function]
+    cls.add_method('GetAntenna', 
+                   'ns3::Ptr< ns3::Object >', 
                    [], 
                    is_const=True, is_virtual=True)
     ## waveform-generator.h (module 'spectrum'): void ns3::WaveformGenerator::StartRx(ns3::Ptr<ns3::SpectrumSignalParameters> params) [member function]
@@ -6052,32 +6115,32 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['bool'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::MobilityModel const> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::Packet> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::SpectrumPhy const> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::MobilityModel const> '], visibility='protected')
+                   is_static=True, template_parameters=['double'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::SpectrumPhy const> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::SpectrumSignalParameters> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['double'], visibility='protected')
+                   is_static=True, template_parameters=['bool'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::SpectrumSignalParameters> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::Packet> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
@@ -6162,10 +6225,10 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## channel-condition-model.h (module 'propagation'): bool ns3::ChannelCondition::IsEqual(ns3::Ptr<const ns3::ChannelCondition> otherCondition) const [member function]
+    ## channel-condition-model.h (module 'propagation'): bool ns3::ChannelCondition::IsEqual(ns3::ChannelCondition::LosConditionValue losCondition, ns3::ChannelCondition::O2iConditionValue o2iCondition) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
-                   [param('ns3::Ptr< ns3::ChannelCondition const >', 'otherCondition')], 
+                   [param('ns3::ChannelCondition::LosConditionValue', 'losCondition'), param('ns3::ChannelCondition::O2iConditionValue', 'o2iCondition')], 
                    is_const=True)
     ## channel-condition-model.h (module 'propagation'): bool ns3::ChannelCondition::IsI2i() const [member function]
     cls.add_method('IsI2i', 
@@ -6890,9 +6953,9 @@
                    'ns3::Ptr< ns3::SpectrumModel const >', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## half-duplex-ideal-phy.h (module 'spectrum'): ns3::Ptr<ns3::AntennaModel> ns3::HalfDuplexIdealPhy::GetRxAntenna() const [member function]
-    cls.add_method('GetRxAntenna', 
-                   'ns3::Ptr< ns3::AntennaModel >', 
+    ## half-duplex-ideal-phy.h (module 'spectrum'): ns3::Ptr<ns3::Object> ns3::HalfDuplexIdealPhy::GetAntenna() const [member function]
+    cls.add_method('GetAntenna', 
+                   'ns3::Ptr< ns3::Object >', 
                    [], 
                    is_const=True, is_virtual=True)
     ## half-duplex-ideal-phy.h (module 'spectrum'): void ns3::HalfDuplexIdealPhy::StartRx(ns3::Ptr<ns3::SpectrumSignalParameters> params) [member function]
@@ -7356,11 +7419,16 @@
                    'ns3::Ptr< ns3::MatrixBasedChannelModel::ChannelMatrix const >', 
                    [param('ns3::Ptr< ns3::MobilityModel const >', 'aMob'), param('ns3::Ptr< ns3::MobilityModel const >', 'bMob'), param('ns3::Ptr< ns3::PhasedArrayModel const >', 'aAntenna'), param('ns3::Ptr< ns3::PhasedArrayModel const >', 'bAntenna')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## matrix-based-channel-model.h (module 'spectrum'): static uint32_t ns3::MatrixBasedChannelModel::GetKey(uint32_t x1, uint32_t x2) [member function]
+    ## matrix-based-channel-model.h (module 'spectrum'): static uint64_t ns3::MatrixBasedChannelModel::GetKey(uint32_t a, uint32_t b) [member function]
     cls.add_method('GetKey', 
-                   'uint32_t', 
-                   [param('uint32_t', 'x1'), param('uint32_t', 'x2')], 
+                   'uint64_t', 
+                   [param('uint32_t', 'a'), param('uint32_t', 'b')], 
                    is_static=True)
+    ## matrix-based-channel-model.h (module 'spectrum'): ns3::Ptr<const ns3::MatrixBasedChannelModel::ChannelParams> ns3::MatrixBasedChannelModel::GetParams(ns3::Ptr<const ns3::MobilityModel> aMob, ns3::Ptr<const ns3::MobilityModel> bMob) const [member function]
+    cls.add_method('GetParams', 
+                   'ns3::Ptr< ns3::MatrixBasedChannelModel::ChannelParams const >', 
+                   [param('ns3::Ptr< ns3::MobilityModel const >', 'aMob'), param('ns3::Ptr< ns3::MobilityModel const >', 'bMob')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## matrix-based-channel-model.h (module 'spectrum'): ns3::MatrixBasedChannelModel::AOA_INDEX [variable]
     cls.add_static_attribute('AOA_INDEX', 'uint8_t const', is_const=True)
     ## matrix-based-channel-model.h (module 'spectrum'): ns3::MatrixBasedChannelModel::AOD_INDEX [variable]
@@ -7376,23 +7444,40 @@
     cls.add_constructor([])
     ## matrix-based-channel-model.h (module 'spectrum'): ns3::MatrixBasedChannelModel::ChannelMatrix::ChannelMatrix(ns3::MatrixBasedChannelModel::ChannelMatrix const & arg0) [constructor]
     cls.add_constructor([param('ns3::MatrixBasedChannelModel::ChannelMatrix const &', 'arg0')])
-    ## matrix-based-channel-model.h (module 'spectrum'): bool ns3::MatrixBasedChannelModel::ChannelMatrix::IsReverse(uint32_t const aId, uint32_t const bId) const [member function]
+    ## matrix-based-channel-model.h (module 'spectrum'): bool ns3::MatrixBasedChannelModel::ChannelMatrix::IsReverse(uint32_t aAntennaId, uint32_t bAntennaId) const [member function]
     cls.add_method('IsReverse', 
                    'bool', 
-                   [param('uint32_t const', 'aId'), param('uint32_t const', 'bId')], 
+                   [param('uint32_t', 'aAntennaId'), param('uint32_t', 'bAntennaId')], 
                    is_const=True)
-    ## matrix-based-channel-model.h (module 'spectrum'): ns3::MatrixBasedChannelModel::ChannelMatrix::m_angle [variable]
-    cls.add_instance_attribute('m_angle', 'ns3::MatrixBasedChannelModel::Double2DVector', is_const=False)
+    ## matrix-based-channel-model.h (module 'spectrum'): ns3::MatrixBasedChannelModel::ChannelMatrix::m_antennaPair [variable]
+    cls.add_instance_attribute('m_antennaPair', 'std::pair< unsigned int, unsigned int >', is_const=False)
     ## matrix-based-channel-model.h (module 'spectrum'): ns3::MatrixBasedChannelModel::ChannelMatrix::m_channel [variable]
     cls.add_instance_attribute('m_channel', 'ns3::MatrixBasedChannelModel::Complex3DVector', is_const=False)
-    ## matrix-based-channel-model.h (module 'spectrum'): ns3::MatrixBasedChannelModel::ChannelMatrix::m_delay [variable]
-    cls.add_instance_attribute('m_delay', 'ns3::MatrixBasedChannelModel::DoubleVector', is_const=False)
     ## matrix-based-channel-model.h (module 'spectrum'): ns3::MatrixBasedChannelModel::ChannelMatrix::m_generatedTime [variable]
     cls.add_instance_attribute('m_generatedTime', 'ns3::Time', is_const=False)
     ## matrix-based-channel-model.h (module 'spectrum'): ns3::MatrixBasedChannelModel::ChannelMatrix::m_nodeIds [variable]
     cls.add_instance_attribute('m_nodeIds', 'std::pair< unsigned int, unsigned int >', is_const=False)
     return
 
+def register_Ns3MatrixBasedChannelModelChannelParams_methods(root_module, cls):
+    ## matrix-based-channel-model.h (module 'spectrum'): ns3::MatrixBasedChannelModel::ChannelParams::ChannelParams() [constructor]
+    cls.add_constructor([])
+    ## matrix-based-channel-model.h (module 'spectrum'): ns3::MatrixBasedChannelModel::ChannelParams::ChannelParams(ns3::MatrixBasedChannelModel::ChannelParams const & arg0) [constructor]
+    cls.add_constructor([param('ns3::MatrixBasedChannelModel::ChannelParams const &', 'arg0')])
+    ## matrix-based-channel-model.h (module 'spectrum'): ns3::MatrixBasedChannelModel::ChannelParams::m_D [variable]
+    cls.add_instance_attribute('m_D', 'ns3::MatrixBasedChannelModel::DoubleVector', is_const=False)
+    ## matrix-based-channel-model.h (module 'spectrum'): ns3::MatrixBasedChannelModel::ChannelParams::m_alpha [variable]
+    cls.add_instance_attribute('m_alpha', 'ns3::MatrixBasedChannelModel::DoubleVector', is_const=False)
+    ## matrix-based-channel-model.h (module 'spectrum'): ns3::MatrixBasedChannelModel::ChannelParams::m_angle [variable]
+    cls.add_instance_attribute('m_angle', 'ns3::MatrixBasedChannelModel::Double2DVector', is_const=False)
+    ## matrix-based-channel-model.h (module 'spectrum'): ns3::MatrixBasedChannelModel::ChannelParams::m_delay [variable]
+    cls.add_instance_attribute('m_delay', 'ns3::MatrixBasedChannelModel::DoubleVector', is_const=False)
+    ## matrix-based-channel-model.h (module 'spectrum'): ns3::MatrixBasedChannelModel::ChannelParams::m_generatedTime [variable]
+    cls.add_instance_attribute('m_generatedTime', 'ns3::Time', is_const=False)
+    ## matrix-based-channel-model.h (module 'spectrum'): ns3::MatrixBasedChannelModel::ChannelParams::m_nodeIds [variable]
+    cls.add_instance_attribute('m_nodeIds', 'std::pair< unsigned int, unsigned int >', is_const=False)
+    return
+
 def register_Ns3MatrixPropagationLossModel_methods(root_module, cls):
     ## propagation-loss-model.h (module 'propagation'): static ns3::TypeId ns3::MatrixPropagationLossModel::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
@@ -7716,10 +7801,16 @@
     cls.add_method('ExtractNeighborIndex', 
                    'uint32_t', 
                    [param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetEpoch() const [member function]
+    cls.add_method('GetEpoch', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() const [member function]
     cls.add_method('GetRemainingBits', 
                    'uint32_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -7730,6 +7821,10 @@
                    'uint32_t', 
                    [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
+    ## nix-vector.h (module 'network'): void ns3::NixVector::SetEpoch(uint32_t epoch) [member function]
+    cls.add_method('SetEpoch', 
+                   'void', 
+                   [param('uint32_t', 'epoch')])
     return
 
 def register_Ns3Node_methods(root_module, cls):
@@ -8243,10 +8338,11 @@
                    'uint32_t', 
                    [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) const [member function]
     cls.add_method('SetNixVector', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')], 
+                   is_const=True)
     ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
     cls.add_method('ToString', 
                    'std::string', 
@@ -8625,9 +8721,9 @@
                    'ns3::Ptr< ns3::SpectrumModel const >', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## spectrum-analyzer.h (module 'spectrum'): ns3::Ptr<ns3::AntennaModel> ns3::SpectrumAnalyzer::GetRxAntenna() const [member function]
-    cls.add_method('GetRxAntenna', 
-                   'ns3::Ptr< ns3::AntennaModel >', 
+    ## spectrum-analyzer.h (module 'spectrum'): ns3::Ptr<ns3::Object> ns3::SpectrumAnalyzer::GetAntenna() const [member function]
+    cls.add_method('GetAntenna', 
+                   'ns3::Ptr< ns3::Object >', 
                    [], 
                    is_const=True, is_virtual=True)
     ## spectrum-analyzer.h (module 'spectrum'): void ns3::SpectrumAnalyzer::StartRx(ns3::Ptr<ns3::SpectrumSignalParameters> params) [member function]
@@ -8670,6 +8766,10 @@
     cls.add_constructor([param('ns3::SpectrumChannel const &', 'arg0')])
     ## spectrum-channel.h (module 'spectrum'): ns3::SpectrumChannel::SpectrumChannel() [constructor]
     cls.add_constructor([])
+    ## spectrum-channel.h (module 'spectrum'): void ns3::SpectrumChannel::AddPhasedArraySpectrumPropagationLossModel(ns3::Ptr<ns3::PhasedArraySpectrumPropagationLossModel> loss) [member function]
+    cls.add_method('AddPhasedArraySpectrumPropagationLossModel', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::PhasedArraySpectrumPropagationLossModel >', 'loss')])
     ## spectrum-channel.h (module 'spectrum'): void ns3::SpectrumChannel::AddPropagationLossModel(ns3::Ptr<ns3::PropagationLossModel> loss) [member function]
     cls.add_method('AddPropagationLossModel', 
                    'void', 
@@ -8688,6 +8788,10 @@
                    'void', 
                    [], 
                    is_virtual=True)
+    ## spectrum-channel.h (module 'spectrum'): ns3::Ptr<ns3::PhasedArraySpectrumPropagationLossModel> ns3::SpectrumChannel::GetPhasedArraySpectrumPropagationLossModel() [member function]
+    cls.add_method('GetPhasedArraySpectrumPropagationLossModel', 
+                   'ns3::Ptr< ns3::PhasedArraySpectrumPropagationLossModel >', 
+                   [])
     ## spectrum-channel.h (module 'spectrum'): ns3::Ptr<ns3::PropagationLossModel> ns3::SpectrumChannel::GetPropagationLossModel() [member function]
     cls.add_method('GetPropagationLossModel', 
                    'ns3::Ptr< ns3::PropagationLossModel >', 
@@ -8701,6 +8805,11 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## spectrum-channel.h (module 'spectrum'): void ns3::SpectrumChannel::RemoveRx(ns3::Ptr<ns3::SpectrumPhy> phy) [member function]
+    cls.add_method('RemoveRx', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::SpectrumPhy >', 'phy')], 
+                   is_pure_virtual=True, is_virtual=True)
     ## spectrum-channel.h (module 'spectrum'): void ns3::SpectrumChannel::SetPropagationDelayModel(ns3::Ptr<ns3::PropagationDelayModel> delay) [member function]
     cls.add_method('SetPropagationDelayModel', 
                    'void', 
@@ -8781,6 +8890,11 @@
                    'double', 
                    [], 
                    is_const=True)
+    ## three-gpp-channel-model.h (module 'spectrum'): ns3::Ptr<const ns3::MatrixBasedChannelModel::ChannelParams> ns3::ThreeGppChannelModel::GetParams(ns3::Ptr<const ns3::MobilityModel> aMob, ns3::Ptr<const ns3::MobilityModel> bMob) const [member function]
+    cls.add_method('GetParams', 
+                   'ns3::Ptr< ns3::MatrixBasedChannelModel::ChannelParams const >', 
+                   [param('ns3::Ptr< ns3::MobilityModel const >', 'aMob'), param('ns3::Ptr< ns3::MobilityModel const >', 'bMob')], 
+                   is_const=True, is_virtual=True)
     ## three-gpp-channel-model.h (module 'spectrum'): std::string ns3::ThreeGppChannelModel::GetScenario() const [member function]
     cls.add_method('GetScenario', 
                    'std::string', 
@@ -8803,11 +8917,46 @@
     cls.add_method('SetScenario', 
                    'void', 
                    [param('std::string const &', 'scenario')])
+    ## three-gpp-channel-model.h (module 'spectrum'): ns3::MatrixBasedChannelModel::DoubleVector ns3::ThreeGppChannelModel::CalcAttenuationOfBlockage(ns3::Ptr<ns3::ThreeGppChannelModel::ThreeGppChannelParams> const channelParams, ns3::MatrixBasedChannelModel::DoubleVector const & clusterAOA, ns3::MatrixBasedChannelModel::DoubleVector const & clusterZOA) const [member function]
+    cls.add_method('CalcAttenuationOfBlockage', 
+                   'ns3::MatrixBasedChannelModel::DoubleVector', 
+                   [param('ns3::Ptr< ns3::ThreeGppChannelModel::ThreeGppChannelParams > const', 'channelParams'), param('ns3::MatrixBasedChannelModel::DoubleVector const &', 'clusterAOA'), param('ns3::MatrixBasedChannelModel::DoubleVector const &', 'clusterZOA')], 
+                   is_const=True, visibility='protected')
+    ## three-gpp-channel-model.h (module 'spectrum'): bool ns3::ThreeGppChannelModel::ChannelMatrixNeedsUpdate(ns3::Ptr<const ns3::ThreeGppChannelModel::ThreeGppChannelParams> channelParams, ns3::Ptr<const ns3::MatrixBasedChannelModel::ChannelMatrix> channelMatrix) [member function]
+    cls.add_method('ChannelMatrixNeedsUpdate', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::ThreeGppChannelModel::ThreeGppChannelParams const >', 'channelParams'), param('ns3::Ptr< ns3::MatrixBasedChannelModel::ChannelMatrix const >', 'channelMatrix')], 
+                   visibility='protected')
+    ## three-gpp-channel-model.h (module 'spectrum'): bool ns3::ThreeGppChannelModel::ChannelParamsNeedsUpdate(ns3::Ptr<const ns3::ThreeGppChannelModel::ThreeGppChannelParams> channelParams, ns3::Ptr<const ns3::ChannelCondition> channelCondition) const [member function]
+    cls.add_method('ChannelParamsNeedsUpdate', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::ThreeGppChannelModel::ThreeGppChannelParams const >', 'channelParams'), param('ns3::Ptr< ns3::ChannelCondition const >', 'channelCondition')], 
+                   is_const=True, visibility='protected')
+    ## three-gpp-channel-model.h (module 'spectrum'): ns3::Ptr<ns3::ThreeGppChannelModel::ThreeGppChannelParams> ns3::ThreeGppChannelModel::GenerateChannelParameters(ns3::Ptr<const ns3::ChannelCondition> const channelCondition, ns3::Ptr<const ns3::ThreeGppChannelModel::ParamsTable> const table3gpp, ns3::Ptr<const ns3::MobilityModel> const aMob, ns3::Ptr<const ns3::MobilityModel> const bMob) const [member function]
+    cls.add_method('GenerateChannelParameters', 
+                   'ns3::Ptr< ns3::ThreeGppChannelModel::ThreeGppChannelParams >', 
+                   [param('ns3::Ptr< ns3::ChannelCondition const > const', 'channelCondition'), param('ns3::Ptr< ns3::ThreeGppChannelModel::ParamsTable const > const', 'table3gpp'), param('ns3::Ptr< ns3::MobilityModel const > const', 'aMob'), param('ns3::Ptr< ns3::MobilityModel const > const', 'bMob')], 
+                   is_const=True, visibility='protected')
+    ## three-gpp-channel-model.h (module 'spectrum'): ns3::Ptr<ns3::MatrixBasedChannelModel::ChannelMatrix> ns3::ThreeGppChannelModel::GetNewChannel(ns3::Ptr<const ns3::ThreeGppChannelModel::ThreeGppChannelParams> channelParams, ns3::Ptr<const ns3::ThreeGppChannelModel::ParamsTable> table3gpp, ns3::Ptr<const ns3::MobilityModel> const sMob, ns3::Ptr<const ns3::MobilityModel> const uMob, ns3::Ptr<const ns3::PhasedArrayModel> sAntenna, ns3::Ptr<const ns3::PhasedArrayModel> uAntenna) const [member function]
+    cls.add_method('GetNewChannel', 
+                   'ns3::Ptr< ns3::MatrixBasedChannelModel::ChannelMatrix >', 
+                   [param('ns3::Ptr< ns3::ThreeGppChannelModel::ThreeGppChannelParams const >', 'channelParams'), param('ns3::Ptr< ns3::ThreeGppChannelModel::ParamsTable const >', 'table3gpp'), param('ns3::Ptr< ns3::MobilityModel const > const', 'sMob'), param('ns3::Ptr< ns3::MobilityModel const > const', 'uMob'), param('ns3::Ptr< ns3::PhasedArrayModel const >', 'sAntenna'), param('ns3::Ptr< ns3::PhasedArrayModel const >', 'uAntenna')], 
+                   is_const=True, is_virtual=True, visibility='protected')
     ## three-gpp-channel-model.h (module 'spectrum'): ns3::Ptr<const ns3::ThreeGppChannelModel::ParamsTable> ns3::ThreeGppChannelModel::GetThreeGppTable(ns3::Ptr<const ns3::ChannelCondition> channelCondition, double hBS, double hUT, double distance2D) const [member function]
     cls.add_method('GetThreeGppTable', 
                    'ns3::Ptr< ns3::ThreeGppChannelModel::ParamsTable const >', 
                    [param('ns3::Ptr< ns3::ChannelCondition const >', 'channelCondition'), param('double', 'hBS'), param('double', 'hUT'), param('double', 'distance2D')], 
-                   is_const=True, is_virtual=True, visibility='private')
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## three-gpp-channel-model.h (module 'spectrum'): void ns3::ThreeGppChannelModel::Shuffle(double * first, double * last) const [member function]
+    cls.add_method('Shuffle', 
+                   'void', 
+                   [param('double *', 'first'), param('double *', 'last')], 
+                   is_const=True, visibility='protected')
+    ## three-gpp-channel-model.h (module 'spectrum'): static std::pair<double, double> ns3::ThreeGppChannelModel::WrapAngles(double azimuthRad, double inclinationRad) [member function]
+    cls.add_method('WrapAngles', 
+                   'std::pair< double, double >', 
+                   [param('double', 'azimuthRad'), param('double', 'inclinationRad')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3ThreeGppIndoorMixedOfficeChannelConditionModel_methods(root_module, cls):
@@ -9264,7 +9413,7 @@
                    'void', 
                    [param('ns3::Callback< bool, ns3::Ptr< ns3::NetDevice >, ns3::Ptr< ns3::Packet const >, unsigned short, ns3::Address const &, ns3::Address const &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty >', 'cb')], 
                    is_virtual=True)
-    ## aloha-noack-net-device.h (module 'spectrum'): void ns3::AlohaNoackNetDevice::SetQueue(ns3::Ptr<ns3::Queue<ns3::Packet> > queue) [member function]
+    ## aloha-noack-net-device.h (module 'spectrum'): void ns3::AlohaNoackNetDevice::SetQueue(ns3::Ptr<ns3::Queue<ns3::Packet>> queue) [member function]
     cls.add_method('SetQueue', 
                    'void', 
                    [param('ns3::Ptr< ns3::Queue< ns3::Packet > >', 'queue')], 
@@ -9661,6 +9810,11 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## multi-model-spectrum-channel.h (module 'spectrum'): void ns3::MultiModelSpectrumChannel::RemoveRx(ns3::Ptr<ns3::SpectrumPhy> phy) [member function]
+    cls.add_method('RemoveRx', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::SpectrumPhy >', 'phy')], 
+                   is_virtual=True)
     ## multi-model-spectrum-channel.h (module 'spectrum'): void ns3::MultiModelSpectrumChannel::StartTx(ns3::Ptr<ns3::SpectrumSignalParameters> params) [member function]
     cls.add_method('StartTx', 
                    'void', 
@@ -9756,6 +9910,11 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## single-model-spectrum-channel.h (module 'spectrum'): void ns3::SingleModelSpectrumChannel::RemoveRx(ns3::Ptr<ns3::SpectrumPhy> phy) [member function]
+    cls.add_method('RemoveRx', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::SpectrumPhy >', 'phy')], 
+                   is_virtual=True)
     ## single-model-spectrum-channel.h (module 'spectrum'): void ns3::SingleModelSpectrumChannel::StartTx(ns3::Ptr<ns3::SpectrumSignalParameters> params) [member function]
     cls.add_method('StartTx', 
                    'void', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/spectrum/bindings/modulegen__gcc_LP64.py ns-3.36/src/spectrum/bindings/modulegen__gcc_LP64.py
--- ns-3.35/src/spectrum/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/spectrum/bindings/modulegen__gcc_LP64.py	2022-04-30 18:23:58.142734800 -0700
@@ -73,6 +73,8 @@
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::Hash::Implementation'])
     ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::MatrixBasedChannelModel::ChannelMatrix> [struct]
     module.add_class('DefaultDeleter', template_parameters=['ns3::MatrixBasedChannelModel::ChannelMatrix'])
+    ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::MatrixBasedChannelModel::ChannelParams> [struct]
+    module.add_class('DefaultDeleter', template_parameters=['ns3::MatrixBasedChannelModel::ChannelParams'])
     ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::NixVector> [struct]
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::NixVector'])
     ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::Packet> [struct]
@@ -89,6 +91,8 @@
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::TraceSourceAccessor'])
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'], import_from_module='ns.core')
     ## hash.h (module 'core'): ns3::Hasher [class]
     module.add_class('Hasher', import_from_module='ns.core')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
@@ -143,8 +147,6 @@
     typehandlers.add_type_alias('std::vector< ns3::Ptr< ns3::Node > > const_iterator', 'ns3::NodeContainer::Iterator')
     typehandlers.add_type_alias('std::vector< ns3::Ptr< ns3::Node > > const_iterator*', 'ns3::NodeContainer::Iterator*')
     typehandlers.add_type_alias('std::vector< ns3::Ptr< ns3::Node > > const_iterator&', 'ns3::NodeContainer::Iterator&')
-    ## non-copyable.h (module 'core'): ns3::NonCopyable [class]
-    module.add_class('NonCopyable', destructor_visibility='protected', import_from_module='ns.core')
     ## object-base.h (module 'core'): ns3::ObjectBase [class]
     module.add_class('ObjectBase', allow_subclassing=True, import_from_module='ns.core')
     ## object.h (module 'core'): ns3::ObjectDeleter [struct]
@@ -248,6 +250,8 @@
     typehandlers.add_type_alias('std::vector< std::complex< double > >', 'ns3::PhasedArrayModel::ComplexVector')
     typehandlers.add_type_alias('std::vector< std::complex< double > >*', 'ns3::PhasedArrayModel::ComplexVector*')
     typehandlers.add_type_alias('std::vector< std::complex< double > >&', 'ns3::PhasedArrayModel::ComplexVector&')
+    ## phased-array-spectrum-propagation-loss-model.h (module 'spectrum'): ns3::PhasedArraySpectrumPropagationLossModel [class]
+    module.add_class('PhasedArraySpectrumPropagationLossModel', parent=root_module['ns3::Object'])
     ## propagation-delay-model.h (module 'propagation'): ns3::PropagationDelayModel [class]
     module.add_class('PropagationDelayModel', import_from_module='ns.propagation', parent=root_module['ns3::Object'])
     ## propagation-loss-model.h (module 'propagation'): ns3::PropagationLossModel [class]
@@ -264,35 +268,37 @@
     module.add_class('RangePropagationLossModel', import_from_module='ns.propagation', parent=root_module['ns3::PropagationLossModel'])
     ## random-variable-stream.h (module 'core'): ns3::SequentialRandomVariable [class]
     module.add_class('SequentialRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MatrixBasedChannelModel::ChannelMatrix, ns3::empty, ns3::DefaultDeleter<ns3::MatrixBasedChannelModel::ChannelMatrix> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MatrixBasedChannelModel::ChannelMatrix, ns3::empty, ns3::DefaultDeleter<ns3::MatrixBasedChannelModel::ChannelMatrix>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::MatrixBasedChannelModel::ChannelMatrix', 'ns3::empty', 'ns3::DefaultDeleter<ns3::MatrixBasedChannelModel::ChannelMatrix>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MatrixBasedChannelModel::ChannelParams, ns3::empty, ns3::DefaultDeleter<ns3::MatrixBasedChannelModel::ChannelParams>> [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::MatrixBasedChannelModel::ChannelParams', 'ns3::empty', 'ns3::DefaultDeleter<ns3::MatrixBasedChannelModel::ChannelParams>'])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::QueueItem', 'ns3::empty', 'ns3::DefaultDeleter<ns3::QueueItem>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumConverter, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumConverter> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumConverter, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumConverter>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::SpectrumConverter', 'ns3::empty', 'ns3::DefaultDeleter<ns3::SpectrumConverter>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::SpectrumModel', 'ns3::empty', 'ns3::DefaultDeleter<ns3::SpectrumModel>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::SpectrumSignalParameters', 'ns3::empty', 'ns3::DefaultDeleter<ns3::SpectrumSignalParameters>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::SpectrumValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::SpectrumValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
     ## spectrum-converter.h (module 'spectrum'): ns3::SpectrumConverter [class]
     module.add_class('SpectrumConverter', parent=root_module['ns3::SimpleRefCount< ns3::SpectrumConverter, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumConverter> >'])
@@ -314,7 +320,7 @@
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::SpectrumValue > )*', 'ns3::SpectrumValue::TracedCallback*')
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::SpectrumValue > )&', 'ns3::SpectrumValue::TracedCallback&')
     ## three-gpp-spectrum-propagation-loss-model.h (module 'spectrum'): ns3::ThreeGppSpectrumPropagationLossModel [class]
-    module.add_class('ThreeGppSpectrumPropagationLossModel', parent=root_module['ns3::SpectrumPropagationLossModel'])
+    module.add_class('ThreeGppSpectrumPropagationLossModel', parent=root_module['ns3::PhasedArraySpectrumPropagationLossModel'])
     ## propagation-loss-model.h (module 'propagation'): ns3::ThreeLogDistancePropagationLossModel [class]
     module.add_class('ThreeLogDistancePropagationLossModel', import_from_module='ns.propagation', parent=root_module['ns3::PropagationLossModel'])
     ## trace-fading-loss-model.h (module 'spectrum'): ns3::TraceFadingLossModel [class]
@@ -458,6 +464,8 @@
     module.add_class('MatrixBasedChannelModel', parent=root_module['ns3::Object'])
     ## matrix-based-channel-model.h (module 'spectrum'): ns3::MatrixBasedChannelModel::ChannelMatrix [struct]
     module.add_class('ChannelMatrix', outer_class=root_module['ns3::MatrixBasedChannelModel'], parent=root_module['ns3::SimpleRefCount< ns3::MatrixBasedChannelModel::ChannelMatrix, ns3::empty, ns3::DefaultDeleter<ns3::MatrixBasedChannelModel::ChannelMatrix> >'])
+    ## matrix-based-channel-model.h (module 'spectrum'): ns3::MatrixBasedChannelModel::ChannelParams [struct]
+    module.add_class('ChannelParams', outer_class=root_module['ns3::MatrixBasedChannelModel'], parent=root_module['ns3::SimpleRefCount< ns3::MatrixBasedChannelModel::ChannelParams, ns3::empty, ns3::DefaultDeleter<ns3::MatrixBasedChannelModel::ChannelParams> >'])
     typehandlers.add_type_alias('std::vector< double >', 'ns3::MatrixBasedChannelModel::DoubleVector')
     typehandlers.add_type_alias('std::vector< double >*', 'ns3::MatrixBasedChannelModel::DoubleVector*')
     typehandlers.add_type_alias('std::vector< double >&', 'ns3::MatrixBasedChannelModel::DoubleVector&')
@@ -656,7 +664,7 @@
     typehandlers.add_type_alias('std::vector< ns3::Ptr< ns3::SpectrumPhy > >*', 'ns3::SingleModelSpectrumChannel::PhyList*')
     typehandlers.add_type_alias('std::vector< ns3::Ptr< ns3::SpectrumPhy > >&', 'ns3::SingleModelSpectrumChannel::PhyList&')
     module.add_container('std::vector< double >', 'double', container_type='vector')
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     module.add_container('std::vector< ns3::Ptr< ns3::SpectrumPhy > >', 'ns3::Ptr< ns3::SpectrumPhy >', container_type='vector')
     module.add_container('ns3::SpectrumConverterMap_t', ('unsigned int', 'ns3::SpectrumConverter'), container_type='map')
     module.add_container('std::vector< std::pair< unsigned int, unsigned int > >', 'std::pair< unsigned int, unsigned int >', container_type='vector')
@@ -682,6 +690,21 @@
     typehandlers.add_type_alias('std::map< unsigned int, ns3::RxSpectrumModelInfo >', 'ns3::RxSpectrumModelInfoMap_t')
     typehandlers.add_type_alias('std::map< unsigned int, ns3::RxSpectrumModelInfo >*', 'ns3::RxSpectrumModelInfoMap_t*')
     typehandlers.add_type_alias('std::map< unsigned int, ns3::RxSpectrumModelInfo >&', 'ns3::RxSpectrumModelInfoMap_t&')
+    typehandlers.add_type_alias('ns3::Callback< bool, ns3::Ptr< ns3::Packet >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::GenericPhyTxStartCallback')
+    typehandlers.add_type_alias('ns3::Callback< bool, ns3::Ptr< ns3::Packet >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::GenericPhyTxStartCallback*')
+    typehandlers.add_type_alias('ns3::Callback< bool, ns3::Ptr< ns3::Packet >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::GenericPhyTxStartCallback&')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::GenericPhyTxEndCallback')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::GenericPhyTxEndCallback*')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::GenericPhyTxEndCallback&')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::GenericPhyRxStartCallback')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::GenericPhyRxStartCallback*')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::GenericPhyRxStartCallback&')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::GenericPhyRxEndErrorCallback')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::GenericPhyRxEndErrorCallback*')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::GenericPhyRxEndErrorCallback&')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::GenericPhyRxEndOkCallback')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::GenericPhyRxEndOkCallback*')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::GenericPhyRxEndOkCallback&')
     typehandlers.add_type_alias('std::vector< double >', 'ns3::Values')
     typehandlers.add_type_alias('std::vector< double >*', 'ns3::Values*')
     typehandlers.add_type_alias('std::vector< double >&', 'ns3::Values&')
@@ -703,21 +726,6 @@
     typehandlers.add_type_alias('ns3::Vector3DChecker*', 'ns3::VectorChecker*')
     typehandlers.add_type_alias('ns3::Vector3DChecker&', 'ns3::VectorChecker&')
     module.add_typedef(root_module['ns3::Vector3DChecker'], 'VectorChecker')
-    typehandlers.add_type_alias('ns3::Callback< bool, ns3::Ptr< ns3::Packet >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::GenericPhyTxStartCallback')
-    typehandlers.add_type_alias('ns3::Callback< bool, ns3::Ptr< ns3::Packet >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::GenericPhyTxStartCallback*')
-    typehandlers.add_type_alias('ns3::Callback< bool, ns3::Ptr< ns3::Packet >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::GenericPhyTxStartCallback&')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::GenericPhyTxEndCallback')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::GenericPhyTxEndCallback*')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::GenericPhyTxEndCallback&')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::GenericPhyRxStartCallback')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::GenericPhyRxStartCallback*')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::GenericPhyRxStartCallback&')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::GenericPhyRxEndErrorCallback')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::GenericPhyRxEndErrorCallback*')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::GenericPhyRxEndErrorCallback&')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::GenericPhyRxEndOkCallback')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::GenericPhyRxEndOkCallback*')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::GenericPhyRxEndOkCallback&')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )', 'ns3::TimePrinter')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )*', 'ns3::TimePrinter*')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )&', 'ns3::TimePrinter&')
@@ -873,6 +881,7 @@
     register_Ns3DefaultDeleter__Ns3EventImpl_methods(root_module, root_module['ns3::DefaultDeleter< ns3::EventImpl >'])
     register_Ns3DefaultDeleter__Ns3HashImplementation_methods(root_module, root_module['ns3::DefaultDeleter< ns3::Hash::Implementation >'])
     register_Ns3DefaultDeleter__Ns3MatrixBasedChannelModelChannelMatrix_methods(root_module, root_module['ns3::DefaultDeleter< ns3::MatrixBasedChannelModel::ChannelMatrix >'])
+    register_Ns3DefaultDeleter__Ns3MatrixBasedChannelModelChannelParams_methods(root_module, root_module['ns3::DefaultDeleter< ns3::MatrixBasedChannelModel::ChannelParams >'])
     register_Ns3DefaultDeleter__Ns3NixVector_methods(root_module, root_module['ns3::DefaultDeleter< ns3::NixVector >'])
     register_Ns3DefaultDeleter__Ns3Packet_methods(root_module, root_module['ns3::DefaultDeleter< ns3::Packet >'])
     register_Ns3DefaultDeleter__Ns3QueueItem_methods(root_module, root_module['ns3::DefaultDeleter< ns3::QueueItem >'])
@@ -896,7 +905,6 @@
     register_Ns3MicrowaveOvenSpectrumValueHelper_methods(root_module, root_module['ns3::MicrowaveOvenSpectrumValueHelper'])
     register_Ns3NetDeviceContainer_methods(root_module, root_module['ns3::NetDeviceContainer'])
     register_Ns3NodeContainer_methods(root_module, root_module['ns3::NodeContainer'])
-    register_Ns3NonCopyable_methods(root_module, root_module['ns3::NonCopyable'])
     register_Ns3ObjectBase_methods(root_module, root_module['ns3::ObjectBase'])
     register_Ns3ObjectDeleter_methods(root_module, root_module['ns3::ObjectDeleter'])
     register_Ns3ObjectFactory_methods(root_module, root_module['ns3::ObjectFactory'])
@@ -937,6 +945,7 @@
     register_Ns3Object_methods(root_module, root_module['ns3::Object'])
     register_Ns3ObjectAggregateIterator_methods(root_module, root_module['ns3::Object::AggregateIterator'])
     register_Ns3PhasedArrayModel_methods(root_module, root_module['ns3::PhasedArrayModel'])
+    register_Ns3PhasedArraySpectrumPropagationLossModel_methods(root_module, root_module['ns3::PhasedArraySpectrumPropagationLossModel'])
     register_Ns3PropagationDelayModel_methods(root_module, root_module['ns3::PropagationDelayModel'])
     register_Ns3PropagationLossModel_methods(root_module, root_module['ns3::PropagationLossModel'])
     register_Ns3QueueBase_methods(root_module, root_module['ns3::QueueBase'])
@@ -952,6 +961,7 @@
     register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >'])
     register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >'])
     register_Ns3SimpleRefCount__Ns3MatrixBasedChannelModelChannelMatrix_Ns3Empty_Ns3DefaultDeleter__lt__ns3MatrixBasedChannelModelChannelMatrix__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::MatrixBasedChannelModel::ChannelMatrix, ns3::empty, ns3::DefaultDeleter<ns3::MatrixBasedChannelModel::ChannelMatrix> >'])
+    register_Ns3SimpleRefCount__Ns3MatrixBasedChannelModelChannelParams_Ns3Empty_Ns3DefaultDeleter__lt__ns3MatrixBasedChannelModelChannelParams__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::MatrixBasedChannelModel::ChannelParams, ns3::empty, ns3::DefaultDeleter<ns3::MatrixBasedChannelModel::ChannelParams> >'])
     register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >'])
     register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >'])
     register_Ns3SimpleRefCount__Ns3QueueItem_Ns3Empty_Ns3DefaultDeleter__lt__ns3QueueItem__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> >'])
@@ -1035,6 +1045,7 @@
     register_Ns3Mac64AddressValue_methods(root_module, root_module['ns3::Mac64AddressValue'])
     register_Ns3MatrixBasedChannelModel_methods(root_module, root_module['ns3::MatrixBasedChannelModel'])
     register_Ns3MatrixBasedChannelModelChannelMatrix_methods(root_module, root_module['ns3::MatrixBasedChannelModel::ChannelMatrix'])
+    register_Ns3MatrixBasedChannelModelChannelParams_methods(root_module, root_module['ns3::MatrixBasedChannelModel::ChannelParams'])
     register_Ns3MatrixPropagationLossModel_methods(root_module, root_module['ns3::MatrixPropagationLossModel'])
     register_Ns3MobilityModel_methods(root_module, root_module['ns3::MobilityModel'])
     register_Ns3NakagamiPropagationLossModel_methods(root_module, root_module['ns3::NakagamiPropagationLossModel'])
@@ -1810,6 +1821,18 @@
                    is_static=True)
     return
 
+def register_Ns3DefaultDeleter__Ns3MatrixBasedChannelModelChannelParams_methods(root_module, cls):
+    ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::MatrixBasedChannelModel::ChannelParams>::DefaultDeleter() [constructor]
+    cls.add_constructor([])
+    ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::MatrixBasedChannelModel::ChannelParams>::DefaultDeleter(ns3::DefaultDeleter<ns3::MatrixBasedChannelModel::ChannelParams> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::DefaultDeleter< ns3::MatrixBasedChannelModel::ChannelParams > const &', 'arg0')])
+    ## default-deleter.h (module 'core'): static void ns3::DefaultDeleter<ns3::MatrixBasedChannelModel::ChannelParams>::Delete(ns3::MatrixBasedChannelModel::ChannelParams * object) [member function]
+    cls.add_method('Delete', 
+                   'void', 
+                   [param('ns3::MatrixBasedChannelModel::ChannelParams *', 'object')], 
+                   is_static=True)
+    return
+
 def register_Ns3DefaultDeleter__Ns3NixVector_methods(root_module, cls):
     ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::NixVector>::DefaultDeleter() [constructor]
     cls.add_constructor([])
@@ -2859,12 +2882,6 @@
                    is_const=True)
     return
 
-def register_Ns3NonCopyable_methods(root_module, cls):
-    ## non-copyable.h (module 'core'): ns3::NonCopyable::NonCopyable() [constructor]
-    cls.add_constructor([], 
-                        visibility='protected')
-    return
-
 def register_Ns3ObjectBase_methods(root_module, cls):
     ## object-base.h (module 'core'): ns3::ObjectBase::ObjectBase() [constructor]
     cls.add_constructor([])
@@ -3790,8 +3807,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -4181,7 +4198,7 @@
                    'ns3::Ptr< ns3::SpectrumValue >', 
                    [param('uint32_t', 'centerFrequency'), param('uint16_t', 'totalChannelWidth'), param('uint32_t', 'bandBandwidth'), param('uint16_t', 'guardBandwidth'), param('std::pair< unsigned int, unsigned int >', 'band')], 
                    is_static=True)
-    ## wifi-spectrum-value-helper.h (module 'spectrum'): static void ns3::WifiSpectrumValueHelper::CreateSpectrumMaskForOfdm(ns3::Ptr<ns3::SpectrumValue> c, std::vector<std::pair<unsigned int, unsigned int>, std::allocator<std::pair<unsigned int, unsigned int> > > allocatedSubBands, ns3::WifiSpectrumBand maskBand, double txPowerPerBandW, uint32_t nGuardBands, uint32_t innerSlopeWidth, double minInnerBandDbr, double minOuterbandDbr, double lowestPointDbr) [member function]
+    ## wifi-spectrum-value-helper.h (module 'spectrum'): static void ns3::WifiSpectrumValueHelper::CreateSpectrumMaskForOfdm(ns3::Ptr<ns3::SpectrumValue> c, std::vector<std::pair<unsigned int, unsigned int>, std::allocator<std::pair<unsigned int, unsigned int>>> allocatedSubBands, ns3::WifiSpectrumBand maskBand, double txPowerPerBandW, uint32_t nGuardBands, uint32_t innerSlopeWidth, double minInnerBandDbr, double minOuterbandDbr, double lowestPointDbr) [member function]
     cls.add_method('CreateSpectrumMaskForOfdm', 
                    'void', 
                    [param('ns3::Ptr< ns3::SpectrumValue >', 'c'), param('std::vector< std::pair< unsigned int, unsigned int > >', 'allocatedSubBands'), param('std::pair< unsigned int, unsigned int >', 'maskBand'), param('double', 'txPowerPerBandW'), param('uint32_t', 'nGuardBands'), param('uint32_t', 'innerSlopeWidth'), param('double', 'minInnerBandDbr'), param('double', 'minOuterbandDbr'), param('double', 'lowestPointDbr')], 
@@ -4225,14 +4242,14 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('>=')
     cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_unary_numeric_operator('-')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
     cls.add_constructor([])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(double const value) [constructor]
@@ -4251,6 +4268,8 @@
     cls.add_constructor([param('long unsigned int const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int const v) [constructor]
     cls.add_constructor([param('long long unsigned int const', 'v')])
+    ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int128_t const v) [constructor]
+    cls.add_constructor([param('int128_t const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t const hi, uint64_t const lo) [constructor]
     cls.add_constructor([param('int64_t const', 'hi'), param('uint64_t const', 'lo')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [constructor]
@@ -4464,6 +4483,11 @@
                    'ns3::Vector', 
                    [param('uint64_t', 'index')], 
                    is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## phased-array-model.h (module 'antenna'): uint32_t ns3::PhasedArrayModel::GetId() const [member function]
+    cls.add_method('GetId', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
     ## phased-array-model.h (module 'antenna'): uint64_t ns3::PhasedArrayModel::GetNumberOfElements() const [member function]
     cls.add_method('GetNumberOfElements', 
                    'uint64_t', 
@@ -4494,6 +4518,37 @@
                    is_static=True, visibility='protected')
     return
 
+def register_Ns3PhasedArraySpectrumPropagationLossModel_methods(root_module, cls):
+    ## phased-array-spectrum-propagation-loss-model.h (module 'spectrum'): ns3::PhasedArraySpectrumPropagationLossModel::PhasedArraySpectrumPropagationLossModel(ns3::PhasedArraySpectrumPropagationLossModel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::PhasedArraySpectrumPropagationLossModel const &', 'arg0')])
+    ## phased-array-spectrum-propagation-loss-model.h (module 'spectrum'): ns3::PhasedArraySpectrumPropagationLossModel::PhasedArraySpectrumPropagationLossModel() [constructor]
+    cls.add_constructor([])
+    ## phased-array-spectrum-propagation-loss-model.h (module 'spectrum'): ns3::Ptr<ns3::SpectrumValue> ns3::PhasedArraySpectrumPropagationLossModel::CalcRxPowerSpectralDensity(ns3::Ptr<const ns3::SpectrumValue> txPsd, ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b, ns3::Ptr<const ns3::PhasedArrayModel> aPhasedArrayModel, ns3::Ptr<const ns3::PhasedArrayModel> bPhasedArrayModel) const [member function]
+    cls.add_method('CalcRxPowerSpectralDensity', 
+                   'ns3::Ptr< ns3::SpectrumValue >', 
+                   [param('ns3::Ptr< ns3::SpectrumValue const >', 'txPsd'), param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b'), param('ns3::Ptr< ns3::PhasedArrayModel const >', 'aPhasedArrayModel'), param('ns3::Ptr< ns3::PhasedArrayModel const >', 'bPhasedArrayModel')], 
+                   is_const=True)
+    ## phased-array-spectrum-propagation-loss-model.h (module 'spectrum'): static ns3::TypeId ns3::PhasedArraySpectrumPropagationLossModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## phased-array-spectrum-propagation-loss-model.h (module 'spectrum'): void ns3::PhasedArraySpectrumPropagationLossModel::SetNext(ns3::Ptr<ns3::PhasedArraySpectrumPropagationLossModel> next) [member function]
+    cls.add_method('SetNext', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::PhasedArraySpectrumPropagationLossModel >', 'next')])
+    ## phased-array-spectrum-propagation-loss-model.h (module 'spectrum'): void ns3::PhasedArraySpectrumPropagationLossModel::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## phased-array-spectrum-propagation-loss-model.h (module 'spectrum'): ns3::Ptr<ns3::SpectrumValue> ns3::PhasedArraySpectrumPropagationLossModel::DoCalcRxPowerSpectralDensity(ns3::Ptr<const ns3::SpectrumValue> txPsd, ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b, ns3::Ptr<const ns3::PhasedArrayModel> aPhasedArrayModel, ns3::Ptr<const ns3::PhasedArrayModel> bPhasedArrayModel) const [member function]
+    cls.add_method('DoCalcRxPowerSpectralDensity', 
+                   'ns3::Ptr< ns3::SpectrumValue >', 
+                   [param('ns3::Ptr< ns3::SpectrumValue const >', 'txPsd'), param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b'), param('ns3::Ptr< ns3::PhasedArrayModel const >', 'aPhasedArrayModel'), param('ns3::Ptr< ns3::PhasedArrayModel const >', 'bPhasedArrayModel')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
+    return
+
 def register_Ns3PropagationDelayModel_methods(root_module, cls):
     ## propagation-delay-model.h (module 'propagation'): ns3::PropagationDelayModel::PropagationDelayModel() [constructor]
     cls.add_constructor([])
@@ -4517,7 +4572,7 @@
     cls.add_method('DoAssignStreams', 
                    'int64_t', 
                    [param('int64_t', 'stream')], 
-                   is_pure_virtual=True, is_virtual=True, visibility='private')
+                   is_pure_virtual=True, is_virtual=True, visibility='protected')
     return
 
 def register_Ns3PropagationLossModel_methods(root_module, cls):
@@ -4545,16 +4600,16 @@
     cls.add_method('AssignStreams', 
                    'int64_t', 
                    [param('int64_t', 'stream')])
+    ## propagation-loss-model.h (module 'propagation'): int64_t ns3::PropagationLossModel::DoAssignStreams(int64_t stream) [member function]
+    cls.add_method('DoAssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')], 
+                   is_pure_virtual=True, is_virtual=True, visibility='protected')
     ## propagation-loss-model.h (module 'propagation'): double ns3::PropagationLossModel::DoCalcRxPower(double txPowerDbm, ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
     cls.add_method('DoCalcRxPower', 
                    'double', 
                    [param('double', 'txPowerDbm'), param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
                    is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
-    ## propagation-loss-model.h (module 'propagation'): int64_t ns3::PropagationLossModel::DoAssignStreams(int64_t stream) [member function]
-    cls.add_method('DoAssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'stream')], 
-                   is_pure_virtual=True, is_virtual=True, visibility='private')
     return
 
 def register_Ns3QueueBase_methods(root_module, cls):
@@ -4645,6 +4700,11 @@
     cls.add_method('SetMaxSize', 
                    'void', 
                    [param('ns3::QueueSize', 'size')])
+    ## queue.h (module 'network'): bool ns3::QueueBase::WouldOverflow(uint32_t nPackets, uint32_t nBytes) const [member function]
+    cls.add_method('WouldOverflow', 
+                   'bool', 
+                   [param('uint32_t', 'nPackets'), param('uint32_t', 'nBytes')], 
+                   is_const=True)
     return
 
 def register_Ns3RandomPropagationDelayModel_methods(root_module, cls):
@@ -4793,107 +4853,114 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3MatrixBasedChannelModelChannelMatrix_Ns3Empty_Ns3DefaultDeleter__lt__ns3MatrixBasedChannelModelChannelMatrix__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MatrixBasedChannelModel::ChannelMatrix, ns3::empty, ns3::DefaultDeleter<ns3::MatrixBasedChannelModel::ChannelMatrix> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MatrixBasedChannelModel::ChannelMatrix, ns3::empty, ns3::DefaultDeleter<ns3::MatrixBasedChannelModel::ChannelMatrix>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MatrixBasedChannelModel::ChannelMatrix, ns3::empty, ns3::DefaultDeleter<ns3::MatrixBasedChannelModel::ChannelMatrix> >::SimpleRefCount(ns3::SimpleRefCount<ns3::MatrixBasedChannelModel::ChannelMatrix, ns3::empty, ns3::DefaultDeleter<ns3::MatrixBasedChannelModel::ChannelMatrix> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MatrixBasedChannelModel::ChannelMatrix, ns3::empty, ns3::DefaultDeleter<ns3::MatrixBasedChannelModel::ChannelMatrix>>::SimpleRefCount(ns3::SimpleRefCount<ns3::MatrixBasedChannelModel::ChannelMatrix, ns3::empty, ns3::DefaultDeleter<ns3::MatrixBasedChannelModel::ChannelMatrix>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::MatrixBasedChannelModel::ChannelMatrix, ns3::empty, ns3::DefaultDeleter< ns3::MatrixBasedChannelModel::ChannelMatrix > > const &', 'o')])
     return
 
+def register_Ns3SimpleRefCount__Ns3MatrixBasedChannelModelChannelParams_Ns3Empty_Ns3DefaultDeleter__lt__ns3MatrixBasedChannelModelChannelParams__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MatrixBasedChannelModel::ChannelParams, ns3::empty, ns3::DefaultDeleter<ns3::MatrixBasedChannelModel::ChannelParams>>::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MatrixBasedChannelModel::ChannelParams, ns3::empty, ns3::DefaultDeleter<ns3::MatrixBasedChannelModel::ChannelParams>>::SimpleRefCount(ns3::SimpleRefCount<ns3::MatrixBasedChannelModel::ChannelParams, ns3::empty, ns3::DefaultDeleter<ns3::MatrixBasedChannelModel::ChannelParams>> const & o) [constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::MatrixBasedChannelModel::ChannelParams, ns3::empty, ns3::DefaultDeleter< ns3::MatrixBasedChannelModel::ChannelParams > > const &', 'o')])
+    return
+
 def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3QueueItem_Ns3Empty_Ns3DefaultDeleter__lt__ns3QueueItem__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> >::SimpleRefCount(ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>>::SimpleRefCount(ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::QueueItem, ns3::empty, ns3::DefaultDeleter< ns3::QueueItem > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3SpectrumConverter_Ns3Empty_Ns3DefaultDeleter__lt__ns3SpectrumConverter__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumConverter, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumConverter> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumConverter, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumConverter>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumConverter, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumConverter> >::SimpleRefCount(ns3::SimpleRefCount<ns3::SpectrumConverter, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumConverter> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumConverter, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumConverter>>::SimpleRefCount(ns3::SimpleRefCount<ns3::SpectrumConverter, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumConverter>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::SpectrumConverter, ns3::empty, ns3::DefaultDeleter< ns3::SpectrumConverter > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3SpectrumModel_Ns3Empty_Ns3DefaultDeleter__lt__ns3SpectrumModel__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel> >::SimpleRefCount(ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel>>::SimpleRefCount(ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter< ns3::SpectrumModel > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3SpectrumSignalParameters_Ns3Empty_Ns3DefaultDeleter__lt__ns3SpectrumSignalParameters__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters> >::SimpleRefCount(ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters>>::SimpleRefCount(ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter< ns3::SpectrumSignalParameters > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3SpectrumValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3SpectrumValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter< ns3::SpectrumValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
@@ -4983,16 +5050,16 @@
     cls.add_binary_comparison_operator('==')
     ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(ns3::SpectrumModel const & arg0) [constructor]
     cls.add_constructor([param('ns3::SpectrumModel const &', 'arg0')])
-    ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(std::vector<double, std::allocator<double> > const & centerFreqs) [constructor]
+    ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(std::vector<double, std::allocator<double>> const & centerFreqs) [constructor]
     cls.add_constructor([param('std::vector< double > const &', 'centerFreqs')])
     ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(ns3::Bands const & bands) [constructor]
     cls.add_constructor([param('ns3::Bands const &', 'bands')])
-    ## spectrum-model.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo> >::const_iterator ns3::SpectrumModel::Begin() const [member function]
+    ## spectrum-model.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo>>::const_iterator ns3::SpectrumModel::Begin() const [member function]
     cls.add_method('Begin', 
                    'std::vector< ns3::BandInfo > const_iterator', 
                    [], 
                    is_const=True)
-    ## spectrum-model.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo> >::const_iterator ns3::SpectrumModel::End() const [member function]
+    ## spectrum-model.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo>>::const_iterator ns3::SpectrumModel::End() const [member function]
     cls.add_method('End', 
                    'std::vector< ns3::BandInfo > const_iterator', 
                    [], 
@@ -5052,9 +5119,9 @@
                    'ns3::Ptr< ns3::SpectrumModel const >', 
                    [], 
                    is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::AntennaModel> ns3::SpectrumPhy::GetRxAntenna() const [member function]
-    cls.add_method('GetRxAntenna', 
-                   'ns3::Ptr< ns3::AntennaModel >', 
+    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::Object> ns3::SpectrumPhy::GetAntenna() const [member function]
+    cls.add_method('GetAntenna', 
+                   'ns3::Ptr< ns3::Object >', 
                    [], 
                    is_const=True, is_pure_virtual=True, is_virtual=True)
     ## spectrum-phy.h (module 'spectrum'): void ns3::SpectrumPhy::StartRx(ns3::Ptr<ns3::SpectrumSignalParameters> params) [member function]
@@ -5140,22 +5207,22 @@
     cls.add_constructor([param('ns3::Ptr< ns3::SpectrumModel const >', 'sm')])
     ## spectrum-value.h (module 'spectrum'): ns3::SpectrumValue::SpectrumValue() [constructor]
     cls.add_constructor([])
-    ## spectrum-value.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo> >::const_iterator ns3::SpectrumValue::ConstBandsBegin() const [member function]
+    ## spectrum-value.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo>>::const_iterator ns3::SpectrumValue::ConstBandsBegin() const [member function]
     cls.add_method('ConstBandsBegin', 
                    'std::vector< ns3::BandInfo > const_iterator', 
                    [], 
                    is_const=True)
-    ## spectrum-value.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo> >::const_iterator ns3::SpectrumValue::ConstBandsEnd() const [member function]
+    ## spectrum-value.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo>>::const_iterator ns3::SpectrumValue::ConstBandsEnd() const [member function]
     cls.add_method('ConstBandsEnd', 
                    'std::vector< ns3::BandInfo > const_iterator', 
                    [], 
                    is_const=True)
-    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double> >::const_iterator ns3::SpectrumValue::ConstValuesBegin() const [member function]
+    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double>>::const_iterator ns3::SpectrumValue::ConstValuesBegin() const [member function]
     cls.add_method('ConstValuesBegin', 
                    'std::vector< double > const_iterator', 
                    [], 
                    is_const=True)
-    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double> >::const_iterator ns3::SpectrumValue::ConstValuesEnd() const [member function]
+    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double>>::const_iterator ns3::SpectrumValue::ConstValuesEnd() const [member function]
     cls.add_method('ConstValuesEnd', 
                    'std::vector< double > const_iterator', 
                    [], 
@@ -5185,11 +5252,11 @@
                    'double const &', 
                    [param('uint32_t', 'pos')], 
                    is_const=True)
-    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double> >::iterator ns3::SpectrumValue::ValuesBegin() [member function]
+    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double>>::iterator ns3::SpectrumValue::ValuesBegin() [member function]
     cls.add_method('ValuesBegin', 
                    'std::vector< double > iterator', 
                    [])
-    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double> >::iterator ns3::SpectrumValue::ValuesEnd() [member function]
+    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double>>::iterator ns3::SpectrumValue::ValuesEnd() [member function]
     cls.add_method('ValuesEnd', 
                    'std::vector< double > iterator', 
                    [])
@@ -5200,14 +5267,10 @@
     cls.add_constructor([param('ns3::ThreeGppSpectrumPropagationLossModel const &', 'arg0')])
     ## three-gpp-spectrum-propagation-loss-model.h (module 'spectrum'): ns3::ThreeGppSpectrumPropagationLossModel::ThreeGppSpectrumPropagationLossModel() [constructor]
     cls.add_constructor([])
-    ## three-gpp-spectrum-propagation-loss-model.h (module 'spectrum'): void ns3::ThreeGppSpectrumPropagationLossModel::AddDevice(ns3::Ptr<ns3::NetDevice> n, ns3::Ptr<const ns3::PhasedArrayModel> a) [member function]
-    cls.add_method('AddDevice', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::NetDevice >', 'n'), param('ns3::Ptr< ns3::PhasedArrayModel const >', 'a')])
-    ## three-gpp-spectrum-propagation-loss-model.h (module 'spectrum'): ns3::Ptr<ns3::SpectrumValue> ns3::ThreeGppSpectrumPropagationLossModel::DoCalcRxPowerSpectralDensity(ns3::Ptr<const ns3::SpectrumValue> txPsd, ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b) const [member function]
+    ## three-gpp-spectrum-propagation-loss-model.h (module 'spectrum'): ns3::Ptr<ns3::SpectrumValue> ns3::ThreeGppSpectrumPropagationLossModel::DoCalcRxPowerSpectralDensity(ns3::Ptr<const ns3::SpectrumValue> txPsd, ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b, ns3::Ptr<const ns3::PhasedArrayModel> aPhasedArrayModel, ns3::Ptr<const ns3::PhasedArrayModel> bPhasedArrayModel) const [member function]
     cls.add_method('DoCalcRxPowerSpectralDensity', 
                    'ns3::Ptr< ns3::SpectrumValue >', 
-                   [param('ns3::Ptr< ns3::SpectrumValue const >', 'txPsd'), param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b')], 
+                   [param('ns3::Ptr< ns3::SpectrumValue const >', 'txPsd'), param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b'), param('ns3::Ptr< ns3::PhasedArrayModel const >', 'aPhasedArrayModel'), param('ns3::Ptr< ns3::PhasedArrayModel const >', 'bPhasedArrayModel')], 
                    is_const=True, is_virtual=True)
     ## three-gpp-spectrum-propagation-loss-model.h (module 'spectrum'): void ns3::ThreeGppSpectrumPropagationLossModel::DoDispose() [member function]
     cls.add_method('DoDispose', 
@@ -5431,9 +5494,9 @@
                    'ns3::Ptr< ns3::SpectrumModel const >', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## tv-spectrum-transmitter.h (module 'spectrum'): ns3::Ptr<ns3::AntennaModel> ns3::TvSpectrumTransmitter::GetRxAntenna() const [member function]
-    cls.add_method('GetRxAntenna', 
-                   'ns3::Ptr< ns3::AntennaModel >', 
+    ## tv-spectrum-transmitter.h (module 'spectrum'): ns3::Ptr<ns3::Object> ns3::TvSpectrumTransmitter::GetAntenna() const [member function]
+    cls.add_method('GetAntenna', 
+                   'ns3::Ptr< ns3::Object >', 
                    [], 
                    is_const=True, is_virtual=True)
     ## tv-spectrum-transmitter.h (module 'spectrum'): void ns3::TvSpectrumTransmitter::StartRx(ns3::Ptr<ns3::SpectrumSignalParameters> params) [member function]
@@ -5600,9 +5663,9 @@
                    'ns3::Ptr< ns3::SpectrumModel const >', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## waveform-generator.h (module 'spectrum'): ns3::Ptr<ns3::AntennaModel> ns3::WaveformGenerator::GetRxAntenna() const [member function]
-    cls.add_method('GetRxAntenna', 
-                   'ns3::Ptr< ns3::AntennaModel >', 
+    ## waveform-generator.h (module 'spectrum'): ns3::Ptr<ns3::Object> ns3::WaveformGenerator::GetAntenna() const [member function]
+    cls.add_method('GetAntenna', 
+                   'ns3::Ptr< ns3::Object >', 
                    [], 
                    is_const=True, is_virtual=True)
     ## waveform-generator.h (module 'spectrum'): void ns3::WaveformGenerator::StartRx(ns3::Ptr<ns3::SpectrumSignalParameters> params) [member function]
@@ -6052,32 +6115,32 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['bool'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::MobilityModel const> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::Packet> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::SpectrumPhy const> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::MobilityModel const> '], visibility='protected')
+                   is_static=True, template_parameters=['double'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::SpectrumPhy const> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::SpectrumSignalParameters> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['double'], visibility='protected')
+                   is_static=True, template_parameters=['bool'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::SpectrumSignalParameters> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::Packet> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
@@ -6162,10 +6225,10 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## channel-condition-model.h (module 'propagation'): bool ns3::ChannelCondition::IsEqual(ns3::Ptr<const ns3::ChannelCondition> otherCondition) const [member function]
+    ## channel-condition-model.h (module 'propagation'): bool ns3::ChannelCondition::IsEqual(ns3::ChannelCondition::LosConditionValue losCondition, ns3::ChannelCondition::O2iConditionValue o2iCondition) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
-                   [param('ns3::Ptr< ns3::ChannelCondition const >', 'otherCondition')], 
+                   [param('ns3::ChannelCondition::LosConditionValue', 'losCondition'), param('ns3::ChannelCondition::O2iConditionValue', 'o2iCondition')], 
                    is_const=True)
     ## channel-condition-model.h (module 'propagation'): bool ns3::ChannelCondition::IsI2i() const [member function]
     cls.add_method('IsI2i', 
@@ -6890,9 +6953,9 @@
                    'ns3::Ptr< ns3::SpectrumModel const >', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## half-duplex-ideal-phy.h (module 'spectrum'): ns3::Ptr<ns3::AntennaModel> ns3::HalfDuplexIdealPhy::GetRxAntenna() const [member function]
-    cls.add_method('GetRxAntenna', 
-                   'ns3::Ptr< ns3::AntennaModel >', 
+    ## half-duplex-ideal-phy.h (module 'spectrum'): ns3::Ptr<ns3::Object> ns3::HalfDuplexIdealPhy::GetAntenna() const [member function]
+    cls.add_method('GetAntenna', 
+                   'ns3::Ptr< ns3::Object >', 
                    [], 
                    is_const=True, is_virtual=True)
     ## half-duplex-ideal-phy.h (module 'spectrum'): void ns3::HalfDuplexIdealPhy::StartRx(ns3::Ptr<ns3::SpectrumSignalParameters> params) [member function]
@@ -7356,11 +7419,16 @@
                    'ns3::Ptr< ns3::MatrixBasedChannelModel::ChannelMatrix const >', 
                    [param('ns3::Ptr< ns3::MobilityModel const >', 'aMob'), param('ns3::Ptr< ns3::MobilityModel const >', 'bMob'), param('ns3::Ptr< ns3::PhasedArrayModel const >', 'aAntenna'), param('ns3::Ptr< ns3::PhasedArrayModel const >', 'bAntenna')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## matrix-based-channel-model.h (module 'spectrum'): static uint32_t ns3::MatrixBasedChannelModel::GetKey(uint32_t x1, uint32_t x2) [member function]
+    ## matrix-based-channel-model.h (module 'spectrum'): static uint64_t ns3::MatrixBasedChannelModel::GetKey(uint32_t a, uint32_t b) [member function]
     cls.add_method('GetKey', 
-                   'uint32_t', 
-                   [param('uint32_t', 'x1'), param('uint32_t', 'x2')], 
+                   'uint64_t', 
+                   [param('uint32_t', 'a'), param('uint32_t', 'b')], 
                    is_static=True)
+    ## matrix-based-channel-model.h (module 'spectrum'): ns3::Ptr<const ns3::MatrixBasedChannelModel::ChannelParams> ns3::MatrixBasedChannelModel::GetParams(ns3::Ptr<const ns3::MobilityModel> aMob, ns3::Ptr<const ns3::MobilityModel> bMob) const [member function]
+    cls.add_method('GetParams', 
+                   'ns3::Ptr< ns3::MatrixBasedChannelModel::ChannelParams const >', 
+                   [param('ns3::Ptr< ns3::MobilityModel const >', 'aMob'), param('ns3::Ptr< ns3::MobilityModel const >', 'bMob')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## matrix-based-channel-model.h (module 'spectrum'): ns3::MatrixBasedChannelModel::AOA_INDEX [variable]
     cls.add_static_attribute('AOA_INDEX', 'uint8_t const', is_const=True)
     ## matrix-based-channel-model.h (module 'spectrum'): ns3::MatrixBasedChannelModel::AOD_INDEX [variable]
@@ -7376,23 +7444,40 @@
     cls.add_constructor([])
     ## matrix-based-channel-model.h (module 'spectrum'): ns3::MatrixBasedChannelModel::ChannelMatrix::ChannelMatrix(ns3::MatrixBasedChannelModel::ChannelMatrix const & arg0) [constructor]
     cls.add_constructor([param('ns3::MatrixBasedChannelModel::ChannelMatrix const &', 'arg0')])
-    ## matrix-based-channel-model.h (module 'spectrum'): bool ns3::MatrixBasedChannelModel::ChannelMatrix::IsReverse(uint32_t const aId, uint32_t const bId) const [member function]
+    ## matrix-based-channel-model.h (module 'spectrum'): bool ns3::MatrixBasedChannelModel::ChannelMatrix::IsReverse(uint32_t aAntennaId, uint32_t bAntennaId) const [member function]
     cls.add_method('IsReverse', 
                    'bool', 
-                   [param('uint32_t const', 'aId'), param('uint32_t const', 'bId')], 
+                   [param('uint32_t', 'aAntennaId'), param('uint32_t', 'bAntennaId')], 
                    is_const=True)
-    ## matrix-based-channel-model.h (module 'spectrum'): ns3::MatrixBasedChannelModel::ChannelMatrix::m_angle [variable]
-    cls.add_instance_attribute('m_angle', 'ns3::MatrixBasedChannelModel::Double2DVector', is_const=False)
+    ## matrix-based-channel-model.h (module 'spectrum'): ns3::MatrixBasedChannelModel::ChannelMatrix::m_antennaPair [variable]
+    cls.add_instance_attribute('m_antennaPair', 'std::pair< unsigned int, unsigned int >', is_const=False)
     ## matrix-based-channel-model.h (module 'spectrum'): ns3::MatrixBasedChannelModel::ChannelMatrix::m_channel [variable]
     cls.add_instance_attribute('m_channel', 'ns3::MatrixBasedChannelModel::Complex3DVector', is_const=False)
-    ## matrix-based-channel-model.h (module 'spectrum'): ns3::MatrixBasedChannelModel::ChannelMatrix::m_delay [variable]
-    cls.add_instance_attribute('m_delay', 'ns3::MatrixBasedChannelModel::DoubleVector', is_const=False)
     ## matrix-based-channel-model.h (module 'spectrum'): ns3::MatrixBasedChannelModel::ChannelMatrix::m_generatedTime [variable]
     cls.add_instance_attribute('m_generatedTime', 'ns3::Time', is_const=False)
     ## matrix-based-channel-model.h (module 'spectrum'): ns3::MatrixBasedChannelModel::ChannelMatrix::m_nodeIds [variable]
     cls.add_instance_attribute('m_nodeIds', 'std::pair< unsigned int, unsigned int >', is_const=False)
     return
 
+def register_Ns3MatrixBasedChannelModelChannelParams_methods(root_module, cls):
+    ## matrix-based-channel-model.h (module 'spectrum'): ns3::MatrixBasedChannelModel::ChannelParams::ChannelParams() [constructor]
+    cls.add_constructor([])
+    ## matrix-based-channel-model.h (module 'spectrum'): ns3::MatrixBasedChannelModel::ChannelParams::ChannelParams(ns3::MatrixBasedChannelModel::ChannelParams const & arg0) [constructor]
+    cls.add_constructor([param('ns3::MatrixBasedChannelModel::ChannelParams const &', 'arg0')])
+    ## matrix-based-channel-model.h (module 'spectrum'): ns3::MatrixBasedChannelModel::ChannelParams::m_D [variable]
+    cls.add_instance_attribute('m_D', 'ns3::MatrixBasedChannelModel::DoubleVector', is_const=False)
+    ## matrix-based-channel-model.h (module 'spectrum'): ns3::MatrixBasedChannelModel::ChannelParams::m_alpha [variable]
+    cls.add_instance_attribute('m_alpha', 'ns3::MatrixBasedChannelModel::DoubleVector', is_const=False)
+    ## matrix-based-channel-model.h (module 'spectrum'): ns3::MatrixBasedChannelModel::ChannelParams::m_angle [variable]
+    cls.add_instance_attribute('m_angle', 'ns3::MatrixBasedChannelModel::Double2DVector', is_const=False)
+    ## matrix-based-channel-model.h (module 'spectrum'): ns3::MatrixBasedChannelModel::ChannelParams::m_delay [variable]
+    cls.add_instance_attribute('m_delay', 'ns3::MatrixBasedChannelModel::DoubleVector', is_const=False)
+    ## matrix-based-channel-model.h (module 'spectrum'): ns3::MatrixBasedChannelModel::ChannelParams::m_generatedTime [variable]
+    cls.add_instance_attribute('m_generatedTime', 'ns3::Time', is_const=False)
+    ## matrix-based-channel-model.h (module 'spectrum'): ns3::MatrixBasedChannelModel::ChannelParams::m_nodeIds [variable]
+    cls.add_instance_attribute('m_nodeIds', 'std::pair< unsigned int, unsigned int >', is_const=False)
+    return
+
 def register_Ns3MatrixPropagationLossModel_methods(root_module, cls):
     ## propagation-loss-model.h (module 'propagation'): static ns3::TypeId ns3::MatrixPropagationLossModel::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
@@ -7716,10 +7801,16 @@
     cls.add_method('ExtractNeighborIndex', 
                    'uint32_t', 
                    [param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetEpoch() const [member function]
+    cls.add_method('GetEpoch', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() const [member function]
     cls.add_method('GetRemainingBits', 
                    'uint32_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -7730,6 +7821,10 @@
                    'uint32_t', 
                    [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
+    ## nix-vector.h (module 'network'): void ns3::NixVector::SetEpoch(uint32_t epoch) [member function]
+    cls.add_method('SetEpoch', 
+                   'void', 
+                   [param('uint32_t', 'epoch')])
     return
 
 def register_Ns3Node_methods(root_module, cls):
@@ -8243,10 +8338,11 @@
                    'uint32_t', 
                    [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) const [member function]
     cls.add_method('SetNixVector', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')], 
+                   is_const=True)
     ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
     cls.add_method('ToString', 
                    'std::string', 
@@ -8625,9 +8721,9 @@
                    'ns3::Ptr< ns3::SpectrumModel const >', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## spectrum-analyzer.h (module 'spectrum'): ns3::Ptr<ns3::AntennaModel> ns3::SpectrumAnalyzer::GetRxAntenna() const [member function]
-    cls.add_method('GetRxAntenna', 
-                   'ns3::Ptr< ns3::AntennaModel >', 
+    ## spectrum-analyzer.h (module 'spectrum'): ns3::Ptr<ns3::Object> ns3::SpectrumAnalyzer::GetAntenna() const [member function]
+    cls.add_method('GetAntenna', 
+                   'ns3::Ptr< ns3::Object >', 
                    [], 
                    is_const=True, is_virtual=True)
     ## spectrum-analyzer.h (module 'spectrum'): void ns3::SpectrumAnalyzer::StartRx(ns3::Ptr<ns3::SpectrumSignalParameters> params) [member function]
@@ -8670,6 +8766,10 @@
     cls.add_constructor([param('ns3::SpectrumChannel const &', 'arg0')])
     ## spectrum-channel.h (module 'spectrum'): ns3::SpectrumChannel::SpectrumChannel() [constructor]
     cls.add_constructor([])
+    ## spectrum-channel.h (module 'spectrum'): void ns3::SpectrumChannel::AddPhasedArraySpectrumPropagationLossModel(ns3::Ptr<ns3::PhasedArraySpectrumPropagationLossModel> loss) [member function]
+    cls.add_method('AddPhasedArraySpectrumPropagationLossModel', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::PhasedArraySpectrumPropagationLossModel >', 'loss')])
     ## spectrum-channel.h (module 'spectrum'): void ns3::SpectrumChannel::AddPropagationLossModel(ns3::Ptr<ns3::PropagationLossModel> loss) [member function]
     cls.add_method('AddPropagationLossModel', 
                    'void', 
@@ -8688,6 +8788,10 @@
                    'void', 
                    [], 
                    is_virtual=True)
+    ## spectrum-channel.h (module 'spectrum'): ns3::Ptr<ns3::PhasedArraySpectrumPropagationLossModel> ns3::SpectrumChannel::GetPhasedArraySpectrumPropagationLossModel() [member function]
+    cls.add_method('GetPhasedArraySpectrumPropagationLossModel', 
+                   'ns3::Ptr< ns3::PhasedArraySpectrumPropagationLossModel >', 
+                   [])
     ## spectrum-channel.h (module 'spectrum'): ns3::Ptr<ns3::PropagationLossModel> ns3::SpectrumChannel::GetPropagationLossModel() [member function]
     cls.add_method('GetPropagationLossModel', 
                    'ns3::Ptr< ns3::PropagationLossModel >', 
@@ -8701,6 +8805,11 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## spectrum-channel.h (module 'spectrum'): void ns3::SpectrumChannel::RemoveRx(ns3::Ptr<ns3::SpectrumPhy> phy) [member function]
+    cls.add_method('RemoveRx', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::SpectrumPhy >', 'phy')], 
+                   is_pure_virtual=True, is_virtual=True)
     ## spectrum-channel.h (module 'spectrum'): void ns3::SpectrumChannel::SetPropagationDelayModel(ns3::Ptr<ns3::PropagationDelayModel> delay) [member function]
     cls.add_method('SetPropagationDelayModel', 
                    'void', 
@@ -8781,6 +8890,11 @@
                    'double', 
                    [], 
                    is_const=True)
+    ## three-gpp-channel-model.h (module 'spectrum'): ns3::Ptr<const ns3::MatrixBasedChannelModel::ChannelParams> ns3::ThreeGppChannelModel::GetParams(ns3::Ptr<const ns3::MobilityModel> aMob, ns3::Ptr<const ns3::MobilityModel> bMob) const [member function]
+    cls.add_method('GetParams', 
+                   'ns3::Ptr< ns3::MatrixBasedChannelModel::ChannelParams const >', 
+                   [param('ns3::Ptr< ns3::MobilityModel const >', 'aMob'), param('ns3::Ptr< ns3::MobilityModel const >', 'bMob')], 
+                   is_const=True, is_virtual=True)
     ## three-gpp-channel-model.h (module 'spectrum'): std::string ns3::ThreeGppChannelModel::GetScenario() const [member function]
     cls.add_method('GetScenario', 
                    'std::string', 
@@ -8803,11 +8917,46 @@
     cls.add_method('SetScenario', 
                    'void', 
                    [param('std::string const &', 'scenario')])
+    ## three-gpp-channel-model.h (module 'spectrum'): ns3::MatrixBasedChannelModel::DoubleVector ns3::ThreeGppChannelModel::CalcAttenuationOfBlockage(ns3::Ptr<ns3::ThreeGppChannelModel::ThreeGppChannelParams> const channelParams, ns3::MatrixBasedChannelModel::DoubleVector const & clusterAOA, ns3::MatrixBasedChannelModel::DoubleVector const & clusterZOA) const [member function]
+    cls.add_method('CalcAttenuationOfBlockage', 
+                   'ns3::MatrixBasedChannelModel::DoubleVector', 
+                   [param('ns3::Ptr< ns3::ThreeGppChannelModel::ThreeGppChannelParams > const', 'channelParams'), param('ns3::MatrixBasedChannelModel::DoubleVector const &', 'clusterAOA'), param('ns3::MatrixBasedChannelModel::DoubleVector const &', 'clusterZOA')], 
+                   is_const=True, visibility='protected')
+    ## three-gpp-channel-model.h (module 'spectrum'): bool ns3::ThreeGppChannelModel::ChannelMatrixNeedsUpdate(ns3::Ptr<const ns3::ThreeGppChannelModel::ThreeGppChannelParams> channelParams, ns3::Ptr<const ns3::MatrixBasedChannelModel::ChannelMatrix> channelMatrix) [member function]
+    cls.add_method('ChannelMatrixNeedsUpdate', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::ThreeGppChannelModel::ThreeGppChannelParams const >', 'channelParams'), param('ns3::Ptr< ns3::MatrixBasedChannelModel::ChannelMatrix const >', 'channelMatrix')], 
+                   visibility='protected')
+    ## three-gpp-channel-model.h (module 'spectrum'): bool ns3::ThreeGppChannelModel::ChannelParamsNeedsUpdate(ns3::Ptr<const ns3::ThreeGppChannelModel::ThreeGppChannelParams> channelParams, ns3::Ptr<const ns3::ChannelCondition> channelCondition) const [member function]
+    cls.add_method('ChannelParamsNeedsUpdate', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::ThreeGppChannelModel::ThreeGppChannelParams const >', 'channelParams'), param('ns3::Ptr< ns3::ChannelCondition const >', 'channelCondition')], 
+                   is_const=True, visibility='protected')
+    ## three-gpp-channel-model.h (module 'spectrum'): ns3::Ptr<ns3::ThreeGppChannelModel::ThreeGppChannelParams> ns3::ThreeGppChannelModel::GenerateChannelParameters(ns3::Ptr<const ns3::ChannelCondition> const channelCondition, ns3::Ptr<const ns3::ThreeGppChannelModel::ParamsTable> const table3gpp, ns3::Ptr<const ns3::MobilityModel> const aMob, ns3::Ptr<const ns3::MobilityModel> const bMob) const [member function]
+    cls.add_method('GenerateChannelParameters', 
+                   'ns3::Ptr< ns3::ThreeGppChannelModel::ThreeGppChannelParams >', 
+                   [param('ns3::Ptr< ns3::ChannelCondition const > const', 'channelCondition'), param('ns3::Ptr< ns3::ThreeGppChannelModel::ParamsTable const > const', 'table3gpp'), param('ns3::Ptr< ns3::MobilityModel const > const', 'aMob'), param('ns3::Ptr< ns3::MobilityModel const > const', 'bMob')], 
+                   is_const=True, visibility='protected')
+    ## three-gpp-channel-model.h (module 'spectrum'): ns3::Ptr<ns3::MatrixBasedChannelModel::ChannelMatrix> ns3::ThreeGppChannelModel::GetNewChannel(ns3::Ptr<const ns3::ThreeGppChannelModel::ThreeGppChannelParams> channelParams, ns3::Ptr<const ns3::ThreeGppChannelModel::ParamsTable> table3gpp, ns3::Ptr<const ns3::MobilityModel> const sMob, ns3::Ptr<const ns3::MobilityModel> const uMob, ns3::Ptr<const ns3::PhasedArrayModel> sAntenna, ns3::Ptr<const ns3::PhasedArrayModel> uAntenna) const [member function]
+    cls.add_method('GetNewChannel', 
+                   'ns3::Ptr< ns3::MatrixBasedChannelModel::ChannelMatrix >', 
+                   [param('ns3::Ptr< ns3::ThreeGppChannelModel::ThreeGppChannelParams const >', 'channelParams'), param('ns3::Ptr< ns3::ThreeGppChannelModel::ParamsTable const >', 'table3gpp'), param('ns3::Ptr< ns3::MobilityModel const > const', 'sMob'), param('ns3::Ptr< ns3::MobilityModel const > const', 'uMob'), param('ns3::Ptr< ns3::PhasedArrayModel const >', 'sAntenna'), param('ns3::Ptr< ns3::PhasedArrayModel const >', 'uAntenna')], 
+                   is_const=True, is_virtual=True, visibility='protected')
     ## three-gpp-channel-model.h (module 'spectrum'): ns3::Ptr<const ns3::ThreeGppChannelModel::ParamsTable> ns3::ThreeGppChannelModel::GetThreeGppTable(ns3::Ptr<const ns3::ChannelCondition> channelCondition, double hBS, double hUT, double distance2D) const [member function]
     cls.add_method('GetThreeGppTable', 
                    'ns3::Ptr< ns3::ThreeGppChannelModel::ParamsTable const >', 
                    [param('ns3::Ptr< ns3::ChannelCondition const >', 'channelCondition'), param('double', 'hBS'), param('double', 'hUT'), param('double', 'distance2D')], 
-                   is_const=True, is_virtual=True, visibility='private')
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## three-gpp-channel-model.h (module 'spectrum'): void ns3::ThreeGppChannelModel::Shuffle(double * first, double * last) const [member function]
+    cls.add_method('Shuffle', 
+                   'void', 
+                   [param('double *', 'first'), param('double *', 'last')], 
+                   is_const=True, visibility='protected')
+    ## three-gpp-channel-model.h (module 'spectrum'): static std::pair<double, double> ns3::ThreeGppChannelModel::WrapAngles(double azimuthRad, double inclinationRad) [member function]
+    cls.add_method('WrapAngles', 
+                   'std::pair< double, double >', 
+                   [param('double', 'azimuthRad'), param('double', 'inclinationRad')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3ThreeGppIndoorMixedOfficeChannelConditionModel_methods(root_module, cls):
@@ -9264,7 +9413,7 @@
                    'void', 
                    [param('ns3::Callback< bool, ns3::Ptr< ns3::NetDevice >, ns3::Ptr< ns3::Packet const >, unsigned short, ns3::Address const &, ns3::Address const &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty >', 'cb')], 
                    is_virtual=True)
-    ## aloha-noack-net-device.h (module 'spectrum'): void ns3::AlohaNoackNetDevice::SetQueue(ns3::Ptr<ns3::Queue<ns3::Packet> > queue) [member function]
+    ## aloha-noack-net-device.h (module 'spectrum'): void ns3::AlohaNoackNetDevice::SetQueue(ns3::Ptr<ns3::Queue<ns3::Packet>> queue) [member function]
     cls.add_method('SetQueue', 
                    'void', 
                    [param('ns3::Ptr< ns3::Queue< ns3::Packet > >', 'queue')], 
@@ -9661,6 +9810,11 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## multi-model-spectrum-channel.h (module 'spectrum'): void ns3::MultiModelSpectrumChannel::RemoveRx(ns3::Ptr<ns3::SpectrumPhy> phy) [member function]
+    cls.add_method('RemoveRx', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::SpectrumPhy >', 'phy')], 
+                   is_virtual=True)
     ## multi-model-spectrum-channel.h (module 'spectrum'): void ns3::MultiModelSpectrumChannel::StartTx(ns3::Ptr<ns3::SpectrumSignalParameters> params) [member function]
     cls.add_method('StartTx', 
                    'void', 
@@ -9756,6 +9910,11 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## single-model-spectrum-channel.h (module 'spectrum'): void ns3::SingleModelSpectrumChannel::RemoveRx(ns3::Ptr<ns3::SpectrumPhy> phy) [member function]
+    cls.add_method('RemoveRx', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::SpectrumPhy >', 'phy')], 
+                   is_virtual=True)
     ## single-model-spectrum-channel.h (module 'spectrum'): void ns3::SingleModelSpectrumChannel::StartTx(ns3::Ptr<ns3::SpectrumSignalParameters> params) [member function]
     cls.add_method('StartTx', 
                    'void', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/spectrum/CMakeLists.txt ns-3.36/src/spectrum/CMakeLists.txt
--- ns-3.35/src/spectrum/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/spectrum/CMakeLists.txt	2022-04-30 18:23:58.142734800 -0700
@@ -0,0 +1,92 @@
+set(source_files
+    helper/adhoc-aloha-noack-ideal-phy-helper.cc
+    helper/spectrum-analyzer-helper.cc
+    helper/spectrum-helper.cc
+    helper/tv-spectrum-transmitter-helper.cc
+    helper/waveform-generator-helper.cc
+    model/aloha-noack-mac-header.cc
+    model/aloha-noack-net-device.cc
+    model/constant-spectrum-propagation-loss.cc
+    model/friis-spectrum-propagation-loss.cc
+    model/half-duplex-ideal-phy-signal-parameters.cc
+    model/half-duplex-ideal-phy.cc
+    model/matrix-based-channel-model.cc
+    model/microwave-oven-spectrum-value-helper.cc
+    model/multi-model-spectrum-channel.cc
+    model/non-communicating-net-device.cc
+    model/single-model-spectrum-channel.cc
+    model/spectrum-analyzer.cc
+    model/spectrum-channel.cc
+    model/spectrum-converter.cc
+    model/spectrum-error-model.cc
+    model/spectrum-interference.cc
+    model/spectrum-model-300kHz-300GHz-log.cc
+    model/spectrum-model-ism2400MHz-res1MHz.cc
+    model/spectrum-model.cc
+    model/spectrum-phy.cc
+    model/spectrum-propagation-loss-model.cc
+    model/phased-array-spectrum-propagation-loss-model.cc
+    model/spectrum-signal-parameters.cc
+    model/spectrum-value.cc
+    model/three-gpp-channel-model.cc
+    model/three-gpp-spectrum-propagation-loss-model.cc
+    model/trace-fading-loss-model.cc
+    model/tv-spectrum-transmitter.cc
+    model/waveform-generator.cc
+    model/wifi-spectrum-value-helper.cc
+)
+
+set(header_files
+    helper/adhoc-aloha-noack-ideal-phy-helper.h
+    helper/spectrum-analyzer-helper.h
+    helper/spectrum-helper.h
+    helper/tv-spectrum-transmitter-helper.h
+    helper/waveform-generator-helper.h
+    model/aloha-noack-mac-header.h
+    model/aloha-noack-net-device.h
+    model/constant-spectrum-propagation-loss.h
+    model/friis-spectrum-propagation-loss.h
+    model/half-duplex-ideal-phy-signal-parameters.h
+    model/half-duplex-ideal-phy.h
+    model/matrix-based-channel-model.h
+    model/microwave-oven-spectrum-value-helper.h
+    model/multi-model-spectrum-channel.h
+    model/non-communicating-net-device.h
+    model/single-model-spectrum-channel.h
+    model/spectrum-analyzer.h
+    model/spectrum-channel.h
+    model/spectrum-converter.h
+    model/spectrum-error-model.h
+    model/spectrum-interference.h
+    model/spectrum-model-300kHz-300GHz-log.h
+    model/spectrum-model-ism2400MHz-res1MHz.h
+    model/spectrum-model.h
+    model/spectrum-phy.h
+    model/spectrum-propagation-loss-model.h
+    model/phased-array-spectrum-propagation-loss-model.h
+    model/spectrum-signal-parameters.h
+    model/spectrum-value.h
+    model/three-gpp-channel-model.h
+    model/three-gpp-spectrum-propagation-loss-model.h
+    model/trace-fading-loss-model.h
+    model/tv-spectrum-transmitter.h
+    model/waveform-generator.h
+    model/wifi-spectrum-value-helper.h
+    test/spectrum-test.h
+)
+
+build_lib(
+  LIBNAME spectrum
+  SOURCE_FILES ${source_files}
+  HEADER_FILES ${header_files}
+  LIBRARIES_TO_LINK ${libpropagation}
+                    ${libantenna}
+  TEST_SOURCES
+    test/spectrum-ideal-phy-test.cc
+    test/spectrum-interference-test.cc
+    test/spectrum-value-test.cc
+    test/spectrum-waveform-generator-test.cc
+    test/three-gpp-channel-test-suite.cc
+    test/tv-helper-distribution-test.cc
+    test/tv-spectrum-transmitter-test.cc
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/spectrum/doc/spectrum-channel-phy-interface.seqdiag ns-3.36/src/spectrum/doc/spectrum-channel-phy-interface.seqdiag
--- ns-3.35/src/spectrum/doc/spectrum-channel-phy-interface.seqdiag	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/spectrum/doc/spectrum-channel-phy-interface.seqdiag	2022-04-30 18:23:58.142734800 -0700
@@ -14,14 +14,14 @@
 
 	BSpectrumPhy <<- SpectrumChannel [label="GetMobility ()"]
 	BSpectrumPhy <<- SpectrumChannel [label="GetRxSpectrumModel ()"]
-	BSpectrumPhy <<- SpectrumChannel [label="GetRxAntenna ()"]
+	BSpectrumPhy <<- SpectrumChannel [label="GetAntenna ()"]
 	SpectrumChannel -> SpectrumChannel [label="evaluate propagation between A and B"]
 	BSpectrumPhy  <<- SpectrumChannel[label="StartRx (SpectrumSignalParameters)"]
 
 	CSpectrumPhy  <<- SpectrumChannel[label="GetMobility ()"]
 	CSpectrumPhy  <<- SpectrumChannel[label="GetRxSpectrumModel ()"]
 	CSpectrumPhy  <<- SpectrumChannel[label="GetRxSpectrumModel ()"]
-	CSpectrumPhy  <<- SpectrumChannel[label="GetRxAntenna ()"]
+	CSpectrumPhy  <<- SpectrumChannel[label="GetAntenna ()"]
 	SpectrumChannel ->> SpectrumChannel [label="evaluate propagation between A and C"]
 	CSpectrumPhy  <<- SpectrumChannel[label="StartRx (SpectrumSignalParameters)"]
 
@@ -32,7 +32,7 @@
 	CSpectrumPhy  <<- SpectrumChannel[label="GetMobility ()"]
 	CSpectrumPhy  <<- SpectrumChannel[label="GetRxSpectrumModel ()"]
 	CSpectrumPhy  <<- SpectrumChannel[label="GetRxSpectrumModel ()"]
-	CSpectrumPhy  <<- SpectrumChannel[label="GetRxAntenna ()"]
+	CSpectrumPhy  <<- SpectrumChannel[label="GetAntenna ()"]
 	SpectrumChannel ->> SpectrumChannel [label="evaluate propagation between B and C"]
 	CSpectrumPhy  <<- SpectrumChannel[label="StartRx (SpectrumSignalParameters)"]
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/spectrum/doc/spectrum.rst ns-3.36/src/spectrum/doc/spectrum.rst
--- ns-3.35/src/spectrum/doc/spectrum.rst	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/spectrum/doc/spectrum.rst	2022-04-30 18:23:58.146735000 -0700
@@ -123,7 +123,7 @@
 ``SingleModelSpectrumChannel`` and ``MultiModelSpectrumChannel``. They
 both provide this functionality:
 
- * Propagation loss modeling, in two forms:
+ * Propagation loss modeling, in three forms:
 
    - you can plug models based on ``PropagationLossModel`` on these
      channels. Only linear models (where the loss value does not
@@ -136,6 +136,14 @@
      a separate loss value is calculated and applied to each component
      of the power spectral density.
 
+   - you can plug models based on ``PhasedArraySpectrumPropagationLossModel`` 
+     on these channels. These models can have frequency-dependent loss, i.e.,
+     a separate loss value is calculated and applied to each component
+     of the power spectral density. Additionally, these models support 
+     the phased antenna array at the transmitter and the receiver, i.e., 
+     ns-3 antenna type ``PhasedArrayModel``.
+
+
  * Propagation delay modeling, by plugging a model based on
    ``PropagationDelayModel``. The delay is independent of frequency and
    applied to the signal as a whole. Delay modeling is implemented by
@@ -642,36 +650,59 @@
 ThreeGppSpectrumPropagationLossModel
 ####################################
 
-The class ThreeGppSpectrumPropagationLossModel extends the SpectrumPropagationLossModel
-interface and enables the modeling of frequency
-dependent propagation phenomena. The main method is DoCalcRxPowerSpectralDensity,
-which takes as input the power spectral density (PSD) of the transmitted signal,
-the mobility models of the transmitting node and receiving node, and
-returns the PSD of the received signal.
+The class ThreeGppSpectrumPropagationLossModel implements the 
+PhasedArraySpectrumPropagationLossModel interface and enables the modeling of frequency
+dependent propagation phenomena while taking into account the specific pair of the 
+phased antenna array at the transmitter and the receiver. The main method is 
+DoCalcRxPowerSpectralDensity, which takes as input the power spectral density (PSD) 
+of the transmitted signal, the mobility models of the transmitting node and receiving node, 
+and the phased antenna array of the transmitting node, and of the receiving node. 
+Finally, it returns the PSD of the received signal.
 
 Procedure used to compute the PSD of to compute the PSD of the received signal:
 
 1. Retrieve the beamforming vectors
 To account for the beamforming, ThreeGppSpectrumPropagationLossModel has to
 retrieve the beamforming vectors of the transmitting and receiving antennas.
-The method DoCalcRxPowerSpectralDensity uses m_deviceAntennaMap to obtain the
-antenna objects associated to the transmitting and receiving devices, and calls
-the method GetCurrentBeamformingVector to retrieve the beamforming vectors.
-For each device using the channel, the m_deviceAntennaMap contains the associated
-antenna object of type PhasedArrayModel. Since the mapping is one-to-one,
-the model supports a single antenna object for each device.
-The m_deviceAntennaMap has to be initialized by inserting the device-antenna
-pairs using the method AddDevice.
+The method DoCalcRxPowerSpectralDensity uses the antenna objects 
+that are passed as parameters for both the transmitting and receiving devices, 
+and calls the method GetCurrentBeamformingVector to retrieve the beamforming vectors 
+of these antenna objects.
 
-2. Retrieve the channel matrix
+2. Retrieve the channel matrix and the channel params
 The ThreeGppSpectrumPropagationLossModel relies on the ThreeGppChannelModel class
-to obtain the channel matrix. In particular, it makes use of the method GetChannel,
+to obtain the channel matrix and channel parameters. 
+In particular, it makes use of the method GetChannel,
 which returns a ChannelMatrix object containing the channel
-matrix and other channel parameters.
+matrix, the generation time, the node pair, and the phased antenna array pair among 
+which is created this channel matrix.
+Apart from the function GetChannel, there is a function called GetParams which 
+returns a ChannelParams object containing the channel parameters.
+Notice that the channel information is split into these two structures 
+(ChannelMatrix and ChannelParams) to support multiple collocate phased antenna arrays at 
+TX/RX node. ChannelParams (also its specialization ThreeGppChannelParams structure) 
+contains parameters which are common for all channels among 
+the same RX/TX node pair, while ChannelMatrix contains the channel matrix for the specific pair 
+of the phased antenna arrays of TX/RX nodes.
+For example, if the TX and the RX node have multiple collocated antenna arrays, 
+then there will be multiple channel matrices among this pair of nodes for different pairs 
+of antenna arrays of the TX and the RX node.
+These channel matrices that are among the same pair of nodes have common channel parameters, 
+i.e., they share the same channel condition, cluster powers, cluster delays, 
+AoD, AoA, ZoD, ZoA, K_factor, delay spread, etc.
+On the other hand, each pair of TX and RX antenna arrays has a specific channel matrix 
+and fading, which depends on the actual antenna element positions and field patterns of 
+each pair of antennas array subpartitions.
 The ThreeGppChannelModel instance is automatically
 created in the the ThreeGppSpectrumPropagationLossModel constructor and it can
 be configured using the method SetChannelModelAttribute ().
 
+Notice that in MultiModelSpectrumChannel in StartTx function we added a 
+condition that checks whether the TX/RX SpectrumPhy instances belong to different 
+TX/RX nodes. This is needed to avoid pathloss models calculations among 
+the phased antenna arrays of the same node, because there are no models yet 
+in ns-3 that support the calculation of this kind of interference.
+
 4. Compute the long term component
 The method GetLongTerm returns the long term component obtained by multiplying
 the channel matrix and the beamforming vectors. To reduce the computational
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/spectrum/examples/CMakeLists.txt ns-3.36/src/spectrum/examples/CMakeLists.txt
--- ns-3.35/src/spectrum/examples/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/spectrum/examples/CMakeLists.txt	2022-04-30 18:23:58.146735000 -0700
@@ -0,0 +1,57 @@
+build_lib_example(
+  NAME adhoc-aloha-ideal-phy
+  SOURCE_FILES adhoc-aloha-ideal-phy.cc
+  LIBRARIES_TO_LINK
+    ${libspectrum}
+    ${libmobility}
+    ${libinternet}
+    ${libapplications}
+)
+
+build_lib_example(
+  NAME adhoc-aloha-ideal-phy-matrix-propagation-loss-model
+  SOURCE_FILES adhoc-aloha-ideal-phy-matrix-propagation-loss-model.cc
+  LIBRARIES_TO_LINK
+    ${libspectrum}
+    ${libmobility}
+    ${libinternet}
+    ${libapplications}
+)
+
+build_lib_example(
+  NAME adhoc-aloha-ideal-phy-with-microwave-oven
+  SOURCE_FILES adhoc-aloha-ideal-phy-with-microwave-oven.cc
+  LIBRARIES_TO_LINK
+    ${libspectrum}
+    ${libmobility}
+    ${libinternet}
+    ${libapplications}
+)
+
+build_lib_example(
+  NAME tv-trans-example
+  SOURCE_FILES tv-trans-example.cc
+  LIBRARIES_TO_LINK
+    ${libspectrum}
+    ${libmobility}
+    ${libcore}
+)
+
+build_lib_example(
+  NAME tv-trans-regional-example
+  SOURCE_FILES tv-trans-regional-example.cc
+  LIBRARIES_TO_LINK
+    ${libspectrum}
+    ${libmobility}
+    ${libcore}
+)
+
+build_lib_example(
+  NAME three-gpp-channel-example
+  SOURCE_FILES three-gpp-channel-example.cc
+  LIBRARIES_TO_LINK
+    ${libspectrum}
+    ${libmobility}
+    ${libcore}
+    ${liblte}
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/spectrum/examples/three-gpp-channel-example.cc ns-3.36/src/spectrum/examples/three-gpp-channel-example.cc
--- ns-3.35/src/spectrum/examples/three-gpp-channel-example.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/spectrum/examples/three-gpp-channel-example.cc	2022-04-30 18:23:58.146735000 -0700
@@ -51,6 +51,41 @@
 static Ptr<ThreeGppSpectrumPropagationLossModel> m_spectrumLossModel; //!< the SpectrumPropagationLossModel object
 
 /**
+ * \brief A structure that holds the parameters for the
+ * ComputeSnr function. In this way the problem with the limited
+ * number of parameters of method Schedule is avoided.
+ */
+struct ComputeSnrParams
+{
+  Ptr<MobilityModel> txMob; //!< the tx mobility model
+  Ptr<MobilityModel> rxMob; //!< the rx mobility model
+  double txPow; //!< the tx power in dBm
+  double noiseFigure; //!< the noise figure in dB
+  Ptr<PhasedArrayModel> txAntenna; //!< the tx antenna array
+  Ptr<PhasedArrayModel> rxAntenna; //!< the rx antenna array
+
+  /**
+   * \brief Constructor
+   * \param pTxMob the tx mobility model
+   * \param pRxMob the rx mobility model
+   * \param pTxPow the tx power in dBm
+   * \param pNoiseFigure the noise figure in dB
+   * \param pTxAntenna the tx antenna array
+   * \param pRxAntenna the rx antenna array
+   */
+  ComputeSnrParams (Ptr<MobilityModel> pTxMob, Ptr<MobilityModel> pRxMob, double pTxPow, double pNoiseFigure,
+                    Ptr<PhasedArrayModel> pTxAntenna, Ptr<PhasedArrayModel> pRxAntenna)
+  {
+    txMob = pTxMob;
+    rxMob = pRxMob;
+    txPow = pTxPow;
+    noiseFigure = pNoiseFigure;
+    txAntenna = pTxAntenna;
+    rxAntenna = pRxAntenna;
+  }
+};
+
+/**
  * Perform the beamforming using the DFT beamforming method
  * \param thisDevice the device performing the beamforming
  * \param thisAntenna the antenna object associated to thisDevice
@@ -93,13 +128,10 @@
 
 /**
  * Compute the average SNR
- * \param txMob the tx mobility model
- * \param rxMob the rx mobility model
- * \param txPow the transmitting power in dBm
- * \param noiseFigure the noise figure in dB
+ * \param params A structure that holds the parameters that are needed to perform calculations in ComputeSnr
  */
 static void
-ComputeSnr (Ptr<MobilityModel> txMob, Ptr<MobilityModel> rxMob, double txPow, double noiseFigure)
+ComputeSnr (ComputeSnrParams& params)
 {
   // Create the tx PSD using the LteSpectrumValueHelper
   // 100 RBs corresponds to 18 MHz (1 RB = 180 kHz)
@@ -109,23 +141,26 @@
   {
     activeRbs0[i] = i;
   }
-  Ptr<SpectrumValue> txPsd = LteSpectrumValueHelper::CreateTxPowerSpectralDensity (2100, 100, txPow, activeRbs0);
+  Ptr<SpectrumValue> txPsd = LteSpectrumValueHelper::CreateTxPowerSpectralDensity (2100, 100, params.txPow, activeRbs0);
   Ptr<SpectrumValue> rxPsd = txPsd->Copy ();
   NS_LOG_DEBUG ("Average tx power " << 10*log10(Sum (*txPsd) * 180e3) << " dB");
 
   // create the noise PSD
-  Ptr<SpectrumValue> noisePsd = LteSpectrumValueHelper::CreateNoisePowerSpectralDensity (2100, 100, noiseFigure);
+  Ptr<SpectrumValue> noisePsd = LteSpectrumValueHelper::CreateNoisePowerSpectralDensity (2100, 100, params.noiseFigure);
   NS_LOG_DEBUG ("Average noise power " << 10*log10 (Sum (*noisePsd) * 180e3) << " dB");
 
   // apply the pathloss
-  double propagationGainDb = m_propagationLossModel->CalcRxPower (0, txMob, rxMob);
+  double propagationGainDb = m_propagationLossModel->CalcRxPower (0, params.txMob, params.rxMob);
   NS_LOG_DEBUG ("Pathloss " << -propagationGainDb << " dB");
   double propagationGainLinear = std::pow (10.0, (propagationGainDb) / 10.0);
   *(rxPsd) *= propagationGainLinear;
 
+  NS_ASSERT_MSG (params.txAntenna, "params.txAntenna is nullptr!");
+  NS_ASSERT_MSG (params.rxAntenna, "params.rxAntenna is nullptr!");
+
   // apply the fast fading and the beamforming gain
-  rxPsd = m_spectrumLossModel->CalcRxPowerSpectralDensity (rxPsd, txMob, rxMob);
-  NS_LOG_DEBUG ("Average rx power " << 10*log10 (Sum (*rxPsd) * 180e3) << " dB");
+  rxPsd = m_spectrumLossModel->CalcRxPowerSpectralDensity (rxPsd, params.txMob, params.rxMob, params.txAntenna, params.rxAntenna);
+  NS_LOG_DEBUG ("Average rx power " << 10 * log10 (Sum (*rxPsd) * 180e3) << " dB");
 
   // compute the SNR
   NS_LOG_DEBUG ("Average SNR " << 10 * log10 (Sum (*rxPsd) / Sum (*noisePsd)) << " dB");
@@ -231,17 +266,13 @@
   Ptr<PhasedArrayModel> txAntenna = CreateObjectWithAttributes<UniformPlanarArray> ("NumColumns", UintegerValue (2), "NumRows", UintegerValue (2));
   Ptr<PhasedArrayModel> rxAntenna = CreateObjectWithAttributes<UniformPlanarArray> ("NumColumns", UintegerValue (2), "NumRows", UintegerValue (2));
 
-  // initialize the devices in the ThreeGppSpectrumPropagationLossModel
-  m_spectrumLossModel->AddDevice (txDev, txAntenna);
-  m_spectrumLossModel->AddDevice (rxDev, rxAntenna);
-
   // set the beamforming vectors
   DoBeamforming (txDev, txAntenna, rxDev);
   DoBeamforming (rxDev, rxAntenna, txDev);
 
   for (int i = 0; i < floor (simTime / timeRes); i++)
   {
-    Simulator::Schedule (MilliSeconds (timeRes*i), &ComputeSnr, txMob, rxMob, txPow, noiseFigure);
+    Simulator::Schedule (MilliSeconds (timeRes*i), &ComputeSnr, ComputeSnrParams (txMob, rxMob, txPow, noiseFigure, txAntenna, rxAntenna));
   }
 
   Simulator::Run ();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/spectrum/examples/wscript ns-3.36/src/spectrum/examples/wscript
--- ns-3.35/src/spectrum/examples/wscript	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/spectrum/examples/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,26 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    obj = bld.create_ns3_program('adhoc-aloha-ideal-phy',
-                                 ['spectrum', 'mobility', 'internet', 'applications'])
-    obj.source = 'adhoc-aloha-ideal-phy.cc'
-
-    obj = bld.create_ns3_program('adhoc-aloha-ideal-phy-matrix-propagation-loss-model',
-                                 ['spectrum', 'mobility', 'internet', 'applications'])
-    obj.source = 'adhoc-aloha-ideal-phy-matrix-propagation-loss-model.cc'
-
-    obj = bld.create_ns3_program('adhoc-aloha-ideal-phy-with-microwave-oven',
-                                 ['spectrum', 'mobility', 'internet', 'applications'])
-    obj.source = 'adhoc-aloha-ideal-phy-with-microwave-oven.cc'
-
-    obj = bld.create_ns3_program('tv-trans-example',
-                                 ['spectrum', 'mobility', 'core'])
-    obj.source = 'tv-trans-example.cc'
-
-    obj = bld.create_ns3_program('tv-trans-regional-example',
-                                 ['spectrum', 'mobility', 'core'])
-    obj.source = 'tv-trans-regional-example.cc'
-
-    obj = bld.create_ns3_program('three-gpp-channel-example',
-                                 ['spectrum', 'mobility', 'core', 'lte'])
-    obj.source = 'three-gpp-channel-example.cc'
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/spectrum/model/half-duplex-ideal-phy.cc ns-3.36/src/spectrum/model/half-duplex-ideal-phy.cc
--- ns-3.35/src/spectrum/model/half-duplex-ideal-phy.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/spectrum/model/half-duplex-ideal-phy.cc	2022-04-30 18:23:58.146735000 -0700
@@ -255,8 +255,8 @@
   m_phyMacRxEndOkCallback = c;
 }
 
-Ptr<AntennaModel>
-HalfDuplexIdealPhy::GetRxAntenna () const
+Ptr<Object>
+HalfDuplexIdealPhy::GetAntenna () const
 {
   NS_LOG_FUNCTION (this);
   return m_antenna;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/spectrum/model/half-duplex-ideal-phy.h ns-3.36/src/spectrum/model/half-duplex-ideal-phy.h
--- ns-3.35/src/spectrum/model/half-duplex-ideal-phy.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/spectrum/model/half-duplex-ideal-phy.h	2022-04-30 18:23:58.146735000 -0700
@@ -105,7 +105,7 @@
   Ptr<MobilityModel> GetMobility () const;
   Ptr<NetDevice> GetDevice () const;
   Ptr<const SpectrumModel> GetRxSpectrumModel () const;
-  Ptr<AntennaModel> GetRxAntenna () const;
+  Ptr<Object> GetAntenna () const;
   void StartRx (Ptr<SpectrumSignalParameters> params);
 
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/spectrum/model/half-duplex-ideal-phy-signal-parameters.h ns-3.36/src/spectrum/model/half-duplex-ideal-phy-signal-parameters.h
--- ns-3.35/src/spectrum/model/half-duplex-ideal-phy-signal-parameters.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/spectrum/model/half-duplex-ideal-phy-signal-parameters.h	2022-04-30 18:23:58.146735000 -0700
@@ -46,6 +46,7 @@
 
   /**
    * copy constructor
+   * \param p object to copy
    */
   HalfDuplexIdealPhySignalParameters (const HalfDuplexIdealPhySignalParameters& p);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/spectrum/model/matrix-based-channel-model.h ns-3.36/src/spectrum/model/matrix-based-channel-model.h
--- ns-3.35/src/spectrum/model/matrix-based-channel-model.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/spectrum/model/matrix-based-channel-model.h	2022-04-30 18:23:58.146735000 -0700
@@ -54,16 +54,14 @@
   typedef std::vector<PhasedArrayModel::ComplexVector> Complex2DVector; //!< type definition for complex matrices
   typedef std::vector<Complex2DVector> Complex3DVector; //!< type definition for complex 3D matrices
 
-
   /**
    * Data structure that stores a channel realization
    */
   struct ChannelMatrix : public SimpleRefCount<ChannelMatrix>
   {
     Complex3DVector    m_channel; //!< channel matrix H[u][s][n].
-    DoubleVector       m_delay; //!< cluster delay in nanoseconds.
-    Double2DVector     m_angle; //!< cluster angle angle[direction][n], where direction = 0(AOA), 1(ZOA), 2(AOD), 3(ZOD) in degree.
     Time               m_generatedTime; //!< generation time
+    std::pair<uint32_t, uint32_t> m_antennaPair; //!< the first element is the ID of the antenna of the s-node (the antenna of the transmitter when the channel was generated), the second element is ID of the antenna of the u-node antenna (the antenna of the receiver when the channel was generated)
     std::pair<uint32_t, uint32_t> m_nodeIds; //!< the first element is the s-node ID (the transmitter when the channel was generated), the second element is the u-node ID (the receiver when the channel was generated)
 
     /**
@@ -74,20 +72,38 @@
     /**
      * Returns true if the ChannelMatrix object was generated
      * considering node b as transmitter and node a as receiver.
-     * \param aId id of the a node
-     * \param bId id of the b node
+     * \param aAntennaId the ID of the antenna array of the a node
+     * \param bAntennaId the ID of the antenna array of the b node
      * \return true if b is the rx and a is the tx, false otherwise
      */
-    bool IsReverse (const uint32_t aId, const uint32_t bId) const
+    bool IsReverse (uint32_t aAntennaId, uint32_t bAntennaId) const
     {
-      uint32_t sId, uId;
-      std::tie (sId, uId) = m_nodeIds;
-      NS_ASSERT_MSG ((sId == aId && uId == bId) || (sId == bId && uId == aId),
-                      "This matrix represents the channel between " << sId << " and " << uId);
-      return (sId == bId && uId == aId);
+      uint32_t sAntennaId, uAntennaId;
+      std::tie (sAntennaId, uAntennaId) = m_antennaPair;
+      NS_ASSERT_MSG ((sAntennaId == aAntennaId && uAntennaId == bAntennaId) || (sAntennaId == bAntennaId && uAntennaId == aAntennaId),
+                      "This channel matrix does not represent the channel among the antenna arrays for which are provided IDs.");
+      return (sAntennaId == bAntennaId && uAntennaId == aAntennaId);
     }
   };
 
+
+  /**
+   * Data structure that stores channel parameters
+   */
+  struct ChannelParams : public SimpleRefCount<ChannelParams>
+  {
+    Time               m_generatedTime; //!< generation time
+    DoubleVector       m_delay; //!< cluster delay in nanoseconds.
+    Double2DVector     m_angle; //!< cluster angle angle[direction][n], where direction = 0(AOA), 1(ZOA), 2(AOD), 3(ZOD) in degree.
+    DoubleVector m_alpha; //!< alpha term per cluster as described in 3GPP TR 37.885 v15.3.0, Sec. 6.2.3 for calculating doppler
+    DoubleVector m_D; //!< D term per cluster as described in 3GPP TR 37.885 v15.3.0, Sec. 6.2.3 for calculating doppler
+    std::pair<uint32_t, uint32_t> m_nodeIds; //!< the first element is the s-node ID (the transmitter when the channel params were generated), the second element is the u-node ID (the receiver when the channel params were generated generated)
+    /**
+     * Destructor for ChannelParams
+     */
+    virtual ~ChannelParams () = default;
+  };
+
   /**
    * Returns a matrix with a realization of the channel between
    * the nodes with mobility objects passed as input parameters.
@@ -112,14 +128,26 @@
                                                Ptr<const PhasedArrayModel> bAntenna) = 0;
   
   /**
-   * Calculate the channel key using the Cantor function
-   * \param x1 first value
-   * \param x2 second value
-   * \return \f$ (((x1 + x2) * (x1 + x2 + 1))/2) + x2; \f$
+   * Returns a channel parameters structure used to obtain the channel between
+   * the nodes with mobility objects passed as input parameters.
+   *
+   * \param aMob mobility model of the a device
+   * \param bMob mobility model of the b device
+   * \return the channel matrix
+   */
+  virtual Ptr<const ChannelParams> GetParams (Ptr<const MobilityModel> aMob,
+                                              Ptr<const MobilityModel> bMob) const = 0;
+
+  /**
+   * Generate a unique value for the pair of unsigned integer of 32 bits,
+   * where the order does not matter, i.e., the same value will be returned for (a,b) and (b,a).
+   * \param a the first value
+   * \param b the second value
+   * \return return an integer representing a unique value for the pair of values
    */
-  static constexpr uint32_t GetKey (uint32_t x1, uint32_t x2)
+  static uint64_t GetKey (uint32_t a, uint32_t b)
   {
-   return (((x1 + x2) * (x1 + x2 + 1)) / 2) + x2;
+   return (uint64_t) std::min (a, b) << 32 | std::max (a, b);
   }
 
   static const uint8_t AOA_INDEX = 0; //!< index of the AOA value in the m_angle array
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/spectrum/model/multi-model-spectrum-channel.cc ns-3.36/src/spectrum/model/multi-model-spectrum-channel.cc
--- ns-3.35/src/spectrum/model/multi-model-spectrum-channel.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/spectrum/model/multi-model-spectrum-channel.cc	2022-04-30 18:23:58.146735000 -0700
@@ -106,16 +106,10 @@
 }
 
 void
-MultiModelSpectrumChannel::AddRx (Ptr<SpectrumPhy> phy)
+MultiModelSpectrumChannel::RemoveRx (Ptr<SpectrumPhy> phy)
 {
   NS_LOG_FUNCTION (this << phy);
 
-  Ptr<const SpectrumModel> rxSpectrumModel = phy->GetRxSpectrumModel ();
-
-  NS_ASSERT_MSG ((0 != rxSpectrumModel), "phy->GetRxSpectrumModel () returned 0. Please check that the RxSpectrumModel is already set for the phy before calling MultiModelSpectrumChannel::AddRx (phy)");
-
-  SpectrumModelUid_t rxSpectrumModelUid = rxSpectrumModel->GetUid ();
-
   // remove a previous entry of this phy if it exists
   // we need to scan for all rxSpectrumModel values since we don't
   // know which spectrum model the phy had when it was previously added
@@ -130,8 +124,22 @@
           rxInfoIterator->second.m_rxPhys.erase (phyIt);
           --m_numDevices;
           break; // there should be at most one entry
-        }       
+        }
     }
+}
+
+void
+MultiModelSpectrumChannel::AddRx (Ptr<SpectrumPhy> phy)
+{
+  NS_LOG_FUNCTION (this << phy);
+
+  Ptr<const SpectrumModel> rxSpectrumModel = phy->GetRxSpectrumModel ();
+
+  NS_ASSERT_MSG ((0 != rxSpectrumModel), "phy->GetRxSpectrumModel () returned 0. Please check that the RxSpectrumModel is already set for the phy before calling MultiModelSpectrumChannel::AddRx (phy)");
+
+  SpectrumModelUid_t rxSpectrumModelUid = rxSpectrumModel->GetUid ();
+
+  RemoveRx (phy);
 
   ++m_numDevices;
 
@@ -269,6 +277,19 @@
 
           if ((*rxPhyIterator) != txParams->txPhy)
             {
+              Ptr<NetDevice> rxNetDevice = (*rxPhyIterator)->GetDevice ();
+              Ptr<NetDevice> txNetDevice = txParams->txPhy->GetDevice ();
+
+              if (rxNetDevice && txNetDevice)
+                {
+                  // we assume that devices are attached to a node
+                  if (rxNetDevice->GetNode()->GetId() == txNetDevice->GetNode()->GetId())
+                    {
+                      NS_LOG_DEBUG ("Skipping the pathloss calculation among different antennas of the same node, not supported yet by any pathloss model in ns-3.");
+                      continue;
+                    }
+                }
+
               NS_LOG_LOGIC ("copying signal parameters " << txParams);
               Ptr<SpectrumSignalParameters> rxParams = txParams->Copy ();
               rxParams->psd = Copy<SpectrumValue> (convertedTxPowerSpectrum);
@@ -289,7 +310,7 @@
                       NS_LOG_LOGIC ("txAntennaGain = " << txAntennaGain << " dB");
                       pathLossDb -= txAntennaGain;
                     }
-                  Ptr<AntennaModel> rxAntenna = (*rxPhyIterator)->GetRxAntenna ();
+                  Ptr<AntennaModel> rxAntenna = DynamicCast<AntennaModel>((*rxPhyIterator)->GetAntenna ());
                   if (rxAntenna != 0)
                     {
                       Angles rxAngles (txMobility->GetPosition (), receiverMobility->GetPosition ());
@@ -320,6 +341,15 @@
                     {
                       rxParams->psd = m_spectrumPropagationLoss->CalcRxPowerSpectralDensity (rxParams->psd, txMobility, receiverMobility);
                     }
+                  else if (m_phasedArraySpectrumPropagationLoss)
+                    {
+                      Ptr<const PhasedArrayModel> txPhasedArrayModel = DynamicCast<PhasedArrayModel> (txParams->txPhy->GetAntenna ());
+                      Ptr<const PhasedArrayModel> rxPhasedArrayModel = DynamicCast<PhasedArrayModel> ((*rxPhyIterator)->GetAntenna ());
+
+                      NS_ASSERT_MSG (txPhasedArrayModel && rxPhasedArrayModel, "PhasedArrayModel instances should be installed at both TX and RX SpectrumPhy in order to use PhasedArraySpectrumPropagationLoss.");
+
+                      rxParams->psd = m_phasedArraySpectrumPropagationLoss->CalcRxPowerSpectralDensity (rxParams->psd, txMobility, receiverMobility, txPhasedArrayModel, rxPhasedArrayModel);
+                     }
 
                   if (m_propagationDelay)
                     {
@@ -327,11 +357,10 @@
                     }
                 }
 
-              Ptr<NetDevice> netDev = (*rxPhyIterator)->GetDevice ();
-              if (netDev)
+              if (rxNetDevice)
                 {
                   // the receiver has a NetDevice, so we expect that it is attached to a Node
-                  uint32_t dstNode =  netDev->GetNode ()->GetId ();
+                  uint32_t dstNode = rxNetDevice->GetNode ()->GetId ();
                   Simulator::ScheduleWithContext (dstNode, delay, &MultiModelSpectrumChannel::StartRx, this,
                                                   rxParams, *rxPhyIterator);
                 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/spectrum/model/multi-model-spectrum-channel.h ns-3.36/src/spectrum/model/multi-model-spectrum-channel.h
--- ns-3.35/src/spectrum/model/multi-model-spectrum-channel.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/spectrum/model/multi-model-spectrum-channel.h	2022-04-30 18:23:58.146735000 -0700
@@ -116,6 +116,7 @@
   static TypeId GetTypeId (void);
 
   // inherited from SpectrumChannel
+  virtual void RemoveRx (Ptr<SpectrumPhy> phy);
   virtual void AddRx (Ptr<SpectrumPhy> phy);
   virtual void StartTx (Ptr<SpectrumSignalParameters> params);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/spectrum/model/phased-array-spectrum-propagation-loss-model.cc ns-3.36/src/spectrum/model/phased-array-spectrum-propagation-loss-model.cc
--- ns-3.35/src/spectrum/model/phased-array-spectrum-propagation-loss-model.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/spectrum/model/phased-array-spectrum-propagation-loss-model.cc	2022-04-30 18:23:58.146735000 -0700
@@ -0,0 +1,80 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2021 CTTC
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+
+#include "phased-array-spectrum-propagation-loss-model.h"
+#include <ns3/log.h>
+#include <ns3/phased-array-model.h>
+
+namespace ns3 {
+
+NS_LOG_COMPONENT_DEFINE ("PhasedArraySpectrumPropagationLossModel");
+
+NS_OBJECT_ENSURE_REGISTERED (PhasedArraySpectrumPropagationLossModel);
+
+PhasedArraySpectrumPropagationLossModel::PhasedArraySpectrumPropagationLossModel ()
+  : m_next (0)
+{
+}
+
+PhasedArraySpectrumPropagationLossModel::~PhasedArraySpectrumPropagationLossModel ()
+{
+}
+
+void
+PhasedArraySpectrumPropagationLossModel::DoDispose ()
+{
+  m_next = 0;
+}
+
+TypeId
+PhasedArraySpectrumPropagationLossModel::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::PhasedArraySpectrumPropagationLossModel")
+    .SetParent<Object> ()
+    .SetGroupName ("Spectrum")
+  ;
+  return tid;
+}
+
+
+void PhasedArraySpectrumPropagationLossModel::SetNext (Ptr<PhasedArraySpectrumPropagationLossModel> next)
+{
+  m_next = next;
+}
+
+Ptr<SpectrumValue>
+PhasedArraySpectrumPropagationLossModel::CalcRxPowerSpectralDensity (Ptr<const SpectrumValue> txPsd,
+                                                                     Ptr<const MobilityModel> a,
+                                                                     Ptr<const MobilityModel> b,
+                                                                     Ptr<const PhasedArrayModel> aPhasedArrayModel,
+                                                                     Ptr<const PhasedArrayModel> bPhasedArrayModel) const
+{
+  // Here we assume that all the models in the chain of models are of type
+  // PhasedArraySpectrumPropagationLossModel that provides the implementation of
+  // this function, i.e. has phased array model of TX and RX as parameters
+  Ptr<SpectrumValue> rxPsd = DoCalcRxPowerSpectralDensity (txPsd, a, b, aPhasedArrayModel, bPhasedArrayModel);
+  if (m_next != 0)
+    {
+      rxPsd = m_next->CalcRxPowerSpectralDensity (rxPsd, a, b, aPhasedArrayModel, bPhasedArrayModel);
+    }
+  return rxPsd;
+}
+
+} // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/spectrum/model/phased-array-spectrum-propagation-loss-model.h ns-3.36/src/spectrum/model/phased-array-spectrum-propagation-loss-model.h
--- ns-3.35/src/spectrum/model/phased-array-spectrum-propagation-loss-model.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/spectrum/model/phased-array-spectrum-propagation-loss-model.h	2022-04-30 18:23:58.146735000 -0700
@@ -0,0 +1,120 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2021 CTTC
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+#ifndef PHASED_ARRAY_SPECTRUM_PROPAGATION_LOSS_MODEL_H
+#define PHASED_ARRAY_SPECTRUM_PROPAGATION_LOSS_MODEL_H
+
+
+#include <ns3/object.h>
+#include <ns3/mobility-model.h>
+#include <ns3/spectrum-value.h>
+#include <ns3/phased-array-model.h>
+
+namespace ns3 {
+
+
+/**
+ * \ingroup spectrum
+ *
+ * \brief spectrum-aware propagation loss model that is
+ * compatible with PhasedArrayModel type of ns-3 antenna
+ *
+ * Interface for propagation loss models to be adopted when
+ * transmissions are modeled with a power spectral density by means of
+ * the SpectrumValue class, and when PhasedArrayModel type of atenna
+ * is being used for TX and RX.
+ *
+ */
+class PhasedArraySpectrumPropagationLossModel : public Object
+{
+public:
+  PhasedArraySpectrumPropagationLossModel ();
+  virtual ~PhasedArraySpectrumPropagationLossModel ();
+
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
+  static TypeId GetTypeId ();
+
+  /**
+   * Used to chain various instances of PhasedArraySpectrumPropagationLossModel
+   *
+   * @param next
+   */
+  void SetNext (Ptr<PhasedArraySpectrumPropagationLossModel> next);
+
+  /**
+   * This method is to be called to calculate
+   *
+   * @param txPsd the SpectrumValue representing the power spectral
+   * density of the transmission. Watt units are to be used for radio
+   * communications, and Pascal units for acoustic communications
+   * (e.g., underwater).
+   *
+   * @param a sender mobility
+   * @param b receiver mobility
+   * @param aPhasedArrayModel the instance of the phased antenna array of the sender
+   * @param bPhasedArrayModel the instance of the phased antenna array of the receiver
+   *
+   * @return set of values Vs frequency representing the received
+   * power in the same units used for the txPower parameter.
+   */
+  Ptr<SpectrumValue> CalcRxPowerSpectralDensity (Ptr<const SpectrumValue> txPsd,
+                                                 Ptr<const MobilityModel> a,
+                                                 Ptr<const MobilityModel> b,
+                                                 Ptr<const PhasedArrayModel> aPhasedArrayModel,
+                                                 Ptr<const PhasedArrayModel> bPhasedArrayModel) const;
+
+protected:
+  virtual void DoDispose ();
+
+
+private:
+  /**
+   *
+   * @param txPsd set of values Vs frequency representing the
+   * transmission power. See SpectrumChannel for details.
+   * @param a sender mobility
+   * @param b receiver mobility
+   * @param aPhasedArrayModel the instance of the phased antenna array of the sender
+   * @param bPhasedArrayModel the instance of the phased antenna array of the receiver
+   *
+   * @return set of values Vs frequency representing the received
+   * power in the same units used for the txPower parameter.
+   */
+  virtual Ptr<SpectrumValue> DoCalcRxPowerSpectralDensity (Ptr<const SpectrumValue> txPsd,
+                                                           Ptr<const MobilityModel> a,
+                                                           Ptr<const MobilityModel> b,
+                                                           Ptr<const PhasedArrayModel> aPhasedArrayModel,
+                                                           Ptr<const PhasedArrayModel> bPhasedArrayModel) const = 0;
+
+  Ptr<PhasedArraySpectrumPropagationLossModel> m_next; //!< PhasedArraySpectrumPropagationLossModel chained to this one.
+};
+
+
+
+
+
+
+} // namespace ns3
+
+#endif /* PHASED_ARRAY_SPECTRUM_PROPAGATION_LOSS_MODEL_H */
+
+
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/spectrum/model/single-model-spectrum-channel.cc ns-3.36/src/spectrum/model/single-model-spectrum-channel.cc
--- ns-3.35/src/spectrum/model/single-model-spectrum-channel.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/spectrum/model/single-model-spectrum-channel.cc	2022-04-30 18:23:58.146735000 -0700
@@ -34,6 +34,7 @@
 #include <ns3/antenna-model.h>
 #include <ns3/angles.h>
 
+#include <algorithm>
 
 #include "single-model-spectrum-channel.h"
 
@@ -72,6 +73,17 @@
 
 
 void
+SingleModelSpectrumChannel::RemoveRx (Ptr<SpectrumPhy> phy)
+{
+  NS_LOG_FUNCTION (this << phy);
+  auto it = std::find (begin (m_phyList), end (m_phyList), phy);
+  if (it != std::end (m_phyList))
+    {
+      m_phyList.erase (it);
+    }
+}
+
+void
 SingleModelSpectrumChannel::AddRx (Ptr<SpectrumPhy> phy)
 {
   NS_LOG_FUNCTION (this << phy);
@@ -110,6 +122,19 @@
        rxPhyIterator != m_phyList.end ();
        ++rxPhyIterator)
     {
+      Ptr<NetDevice> rxNetDevice = (*rxPhyIterator)->GetDevice ();
+      Ptr<NetDevice> txNetDevice = txParams->txPhy->GetDevice ();
+
+      if (rxNetDevice && txNetDevice)
+        {
+          // we assume that devices are attached to a node
+          if (rxNetDevice->GetNode()->GetId() == txNetDevice->GetNode()->GetId())
+            {
+              NS_LOG_DEBUG ("Skipping the pathloss calculation among different antennas of the same node, not supported yet by any pathloss model in ns-3.");
+              continue;
+            }
+        }
+
       if ((*rxPhyIterator) != txParams->txPhy)
         {
           Time delay  = MicroSeconds (0);
@@ -131,7 +156,7 @@
                   NS_LOG_LOGIC ("txAntennaGain = " << txAntennaGain << " dB");
                   pathLossDb -= txAntennaGain;
                 }
-              Ptr<AntennaModel> rxAntenna = (*rxPhyIterator)->GetRxAntenna ();
+              Ptr<AntennaModel> rxAntenna = DynamicCast<AntennaModel>((*rxPhyIterator)->GetAntenna ());
               if (rxAntenna != 0)
                 {
                   Angles rxAngles (senderMobility->GetPosition (), receiverMobility->GetPosition ());
@@ -170,11 +195,10 @@
             }
 
 
-          Ptr<NetDevice> netDev = (*rxPhyIterator)->GetDevice ();
-          if (netDev)
+          if (rxNetDevice)
             {
               // the receiver has a NetDevice, so we expect that it is attached to a Node
-              uint32_t dstNode =  netDev->GetNode ()->GetId ();
+              uint32_t dstNode =  rxNetDevice->GetNode ()->GetId ();
               Simulator::ScheduleWithContext (dstNode, delay, &SingleModelSpectrumChannel::StartRx, this, rxParams, *rxPhyIterator);
             }
           else
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/spectrum/model/single-model-spectrum-channel.h ns-3.36/src/spectrum/model/single-model-spectrum-channel.h
--- ns-3.35/src/spectrum/model/single-model-spectrum-channel.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/spectrum/model/single-model-spectrum-channel.h	2022-04-30 18:23:58.146735000 -0700
@@ -50,6 +50,7 @@
   static TypeId GetTypeId (void);
 
   // inherited from SpectrumChannel
+  virtual void RemoveRx (Ptr<SpectrumPhy> phy);
   virtual void AddRx (Ptr<SpectrumPhy> phy);
   virtual void StartTx (Ptr<SpectrumSignalParameters> params);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/spectrum/model/spectrum-analyzer.cc ns-3.36/src/spectrum/model/spectrum-analyzer.cc
--- ns-3.35/src/spectrum/model/spectrum-analyzer.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/spectrum/model/spectrum-analyzer.cc	2022-04-30 18:23:58.146735000 -0700
@@ -142,8 +142,8 @@
 }
 
 
-Ptr<AntennaModel>
-SpectrumAnalyzer::GetRxAntenna () const
+Ptr<Object>
+SpectrumAnalyzer::GetAntenna () const
 {
   return m_antenna;
 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/spectrum/model/spectrum-analyzer.h ns-3.36/src/spectrum/model/spectrum-analyzer.h
--- ns-3.35/src/spectrum/model/spectrum-analyzer.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/spectrum/model/spectrum-analyzer.h	2022-04-30 18:23:58.146735000 -0700
@@ -65,7 +65,7 @@
   Ptr<MobilityModel> GetMobility () const;
   Ptr<NetDevice> GetDevice () const;
   Ptr<const SpectrumModel> GetRxSpectrumModel () const;
-  Ptr<AntennaModel> GetRxAntenna () const;
+  Ptr<Object> GetAntenna () const;
   void StartRx (Ptr<SpectrumSignalParameters> params);
 
 
@@ -114,10 +114,12 @@
 
   /**
    * Adds a signal to the data collected.
+   * \param psd signal to add
    */
   void AddSignal (Ptr<const SpectrumValue> psd);
   /**
    * Removes a signal to the data collected.
+   * \param psd signal to subtract
    */
   void SubtractSignal  (Ptr<const SpectrumValue> psd);
   /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/spectrum/model/spectrum-channel.cc ns-3.36/src/spectrum/model/spectrum-channel.cc
--- ns-3.35/src/spectrum/model/spectrum-channel.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/spectrum/model/spectrum-channel.cc	2022-04-30 18:23:58.146735000 -0700
@@ -136,6 +136,18 @@
 }
 
 void
+SpectrumChannel::AddPhasedArraySpectrumPropagationLossModel (Ptr<PhasedArraySpectrumPropagationLossModel> loss)
+{
+  NS_LOG_FUNCTION (this << loss);
+  if (m_phasedArraySpectrumPropagationLoss)
+    {
+      loss->SetNext (m_phasedArraySpectrumPropagationLoss);
+    }
+  m_phasedArraySpectrumPropagationLoss = loss;
+}
+
+
+void
 SpectrumChannel::SetPropagationDelayModel (Ptr<PropagationDelayModel> delay)
 {
   NS_ASSERT (m_propagationDelay == 0);
@@ -149,6 +161,13 @@
   return m_spectrumPropagationLoss;
 }
 
+Ptr<PhasedArraySpectrumPropagationLossModel>
+SpectrumChannel::GetPhasedArraySpectrumPropagationLossModel (void)
+{
+  NS_LOG_FUNCTION (this);
+  return m_phasedArraySpectrumPropagationLoss;
+}
+
 Ptr<PropagationLossModel>
 SpectrumChannel::GetPropagationLossModel ()
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/spectrum/model/spectrum-channel.h ns-3.36/src/spectrum/model/spectrum-channel.h
--- ns-3.35/src/spectrum/model/spectrum-channel.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/spectrum/model/spectrum-channel.h	2022-04-30 18:23:58.146735000 -0700
@@ -27,6 +27,7 @@
 #include <ns3/channel.h>
 #include <ns3/spectrum-signal-parameters.h>
 #include <ns3/spectrum-propagation-loss-model.h>
+#include <ns3/phased-array-spectrum-propagation-loss-model.h>
 #include <ns3/propagation-delay-model.h>
 #include <ns3/propagation-loss-model.h>
 #include <ns3/spectrum-phy.h>
@@ -84,6 +85,13 @@
   void AddSpectrumPropagationLossModel (Ptr<SpectrumPropagationLossModel> loss);
 
   /**
+   * Add the frequency-dependent propagation loss model
+   * that is compapatible with the phased antenna arrays at the TX and RX
+   * \param loss a pointer to the propagation loss model to be used.
+   */
+  void AddPhasedArraySpectrumPropagationLossModel (Ptr<PhasedArraySpectrumPropagationLossModel> loss);
+
+  /**
    * Set the propagation delay model to be used
    * \param delay Ptr to the propagation delay model to be used.
    */
@@ -96,6 +104,13 @@
   Ptr<SpectrumPropagationLossModel> GetSpectrumPropagationLossModel (void);
 
   /**
+   * Get the frequency-dependent propagation loss model that is
+   * compatible with the phased antenna arrays at TX and RX
+   * \returns a pointer to the propagation loss model.
+   */
+  Ptr<PhasedArraySpectrumPropagationLossModel> GetPhasedArraySpectrumPropagationLossModel (void);
+
+  /**
    * Get the propagation loss model.
    * \returns a pointer to the propagation loss model.
    */
@@ -109,6 +124,21 @@
   virtual void StartTx (Ptr<SpectrumSignalParameters> params) = 0;
 
   /**
+   * \brief Remove a SpectrumPhy from a channel
+   *
+   * This method is used to detach a SpectrumPhy instance from a
+   * SpectrumChannel instance, so that the SpectrumPhy does not receive
+   * packets sent on that channel.
+   *
+   * This method is to be implemented by all classes inheriting from
+   * SpectrumChannel.
+   *
+   * @param phy the SpectrumPhy instance to be removed from the channel as
+   * a receiver.
+   */
+  virtual void RemoveRx (Ptr<SpectrumPhy> phy) = 0;
+
+  /**
    * \brief Add a SpectrumPhy to a channel, so it can receive packets
    *
    * This method is used to attach a SpectrumPhy instance to a
@@ -198,6 +228,11 @@
    */
   Ptr<SpectrumPropagationLossModel> m_spectrumPropagationLoss;
 
+  /**
+   * Frequency-dependent propagation loss model to be used with this channel.
+   */
+  Ptr<PhasedArraySpectrumPropagationLossModel> m_phasedArraySpectrumPropagationLoss;
+
 
 };
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/spectrum/model/spectrum-model-300kHz-300GHz-log.cc ns-3.36/src/spectrum/model/spectrum-model-300kHz-300GHz-log.cc
--- ns-3.35/src/spectrum/model/spectrum-model-300kHz-300GHz-log.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/spectrum/model/spectrum-model-300kHz-300GHz-log.cc	2022-04-30 18:23:58.146735000 -0700
@@ -24,10 +24,19 @@
 namespace ns3 {
 
 
+/**
+ * \ingroup spectrum
+ * Spectrum model logger for frequencies between 300 Khz 300 Ghz
+ */
 Ptr<SpectrumModel> SpectrumModel300Khz300GhzLog;
 
 
-
+/**
+ * \ingroup spectrum
+ * 
+ * Static initializer class for Spectrum model logger 
+ * for frequencies between 300 Khz 300 Ghz
+ */
 class static_SpectrumModel300Khz300GhzLog_initializer
 {
 public:
@@ -42,10 +51,12 @@
     SpectrumModel300Khz300GhzLog = Create<SpectrumModel> (freqs);
   }
 
-} static_SpectrumModel300Khz300GhzLog_initializer_instance;
-
-
-
+};
 
+/**
+ * \ingroup spectrum
+ * Static variable for analyzer initialization
+ */
+static_SpectrumModel300Khz300GhzLog_initializer g_static_SpectrumModel300Khz300GhzLog_initializer_instance;
 
 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/spectrum/model/spectrum-model.h ns-3.36/src/spectrum/model/spectrum-model.h
--- ns-3.35/src/spectrum/model/spectrum-model.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/spectrum/model/spectrum-model.h	2022-04-30 18:23:58.146735000 -0700
@@ -28,7 +28,12 @@
 
 /**
  * \defgroup spectrum Spectrum Models
- *
+ */
+
+/**
+ * \ingroup spectrum
+ * \ingroup tests
+ * \defgroup spectrum-tests Spectrum Models tests
  */
 
 /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/spectrum/model/spectrum-model-ism2400MHz-res1MHz.cc ns-3.36/src/spectrum/model/spectrum-model-ism2400MHz-res1MHz.cc
--- ns-3.35/src/spectrum/model/spectrum-model-ism2400MHz-res1MHz.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/spectrum/model/spectrum-model-ism2400MHz-res1MHz.cc	2022-04-30 18:23:58.146735000 -0700
@@ -23,11 +23,20 @@
 
 namespace ns3 {
 
-
+/**
+ * \ingroup spectrum
+ * Spectrum model logger for frequencies in the 2.4 GHz ISM band
+ * with 1 MHz resolution.
+ */
 Ptr<SpectrumModel> SpectrumModelIsm2400MhzRes1Mhz;
 
 
-
+/**
+ * \ingroup spectrum
+ * 
+ * Static initializer class for Spectrum model logger for 
+ * frequencies in the 2.4 GHz ISM band with 1 MHz resolution.
+ */
 class static_SpectrumModelIsm2400MhzRes1Mhz_initializer
 {
 public:
@@ -44,10 +53,12 @@
     SpectrumModelIsm2400MhzRes1Mhz = Create<SpectrumModel> (freqs);
   }
 
-} static_SpectrumModelIsm2400MhzRes1Mhz_initializer_instance;
-
-
-
+};
 
+/**
+ * \ingroup spectrum
+ * Static variable for analyzer initialization
+ */
+static_SpectrumModelIsm2400MhzRes1Mhz_initializer g_static_SpectrumModelIsm2400MhzRes1Mhz_initializer_instance;
 
 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/spectrum/model/spectrum-phy.cc ns-3.36/src/spectrum/model/spectrum-phy.cc
--- ns-3.35/src/spectrum/model/spectrum-phy.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/spectrum/model/spectrum-phy.cc	2022-04-30 18:23:58.146735000 -0700
@@ -51,6 +51,4 @@
 {
   NS_LOG_FUNCTION (this);
 }
-
-
 } // namespace
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/spectrum/model/spectrum-phy.h ns-3.36/src/spectrum/model/spectrum-phy.h
--- ns-3.35/src/spectrum/model/spectrum-phy.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/spectrum/model/spectrum-phy.h	2022-04-30 18:23:58.146735000 -0700
@@ -31,6 +31,7 @@
 class SpectrumChannel;
 class MobilityModel;
 class AntennaModel;
+class PhasedArrayModel;
 class SpectrumValue;
 class SpectrumModel;
 class NetDevice;
@@ -49,6 +50,10 @@
   SpectrumPhy ();
   virtual ~SpectrumPhy ();
 
+  // Delete copy constructor and assignment operator to avoid misuse
+  SpectrumPhy (SpectrumPhy const &) = delete;
+  SpectrumPhy &operator= (SpectrumPhy const &) = delete;
+
   /**
    * \brief Get the type ID.
    * \return the object TypeId
@@ -99,11 +104,16 @@
   virtual Ptr<const SpectrumModel> GetRxSpectrumModel () const = 0;
 
   /**
-   * Get the AntennaModel used by the NetDevice for reception
+   * \brief Get the AntennaModel used by this SpectrumPhy instance for
+   * transmission and/or reception
+   *
+   * Note that in general and depending on each module design, there can be
+   * multiple SpectrumPhy instances per NetDevice.
    *
-   * @return a Ptr to the AntennaModel used by the NetDevice for reception
+   * @return a Ptr to the AntennaModel used by this SpectrumPhy instance for
+   * transmission and/or reception
    */
-  virtual Ptr<AntennaModel> GetRxAntenna () const = 0;
+  virtual Ptr<Object> GetAntenna () const = 0;
 
   /**
    * Notify the SpectrumPhy instance of an incoming signal
@@ -111,35 +121,7 @@
    * @param params the parameters of the signals being received
    */
   virtual void StartRx (Ptr<SpectrumSignalParameters> params) = 0;
-
-private:
-  /**
-   * \brief Copy constructor
-   *
-   * Defined and unimplemented to avoid misuse
-   */
-  SpectrumPhy (SpectrumPhy const &);
-  /**
-   * \brief Copy constructor
-   *
-   * Defined and unimplemented to avoid misuse
-   * \returns
-   */
-  SpectrumPhy& operator= (SpectrumPhy const &);
 };
-
-
-
-
-
-
-
-
-
 } // namespace ns3
 
-
-
-
-
 #endif /* SPECTRUM_PHY_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/spectrum/model/spectrum-signal-parameters.h ns-3.36/src/spectrum/model/spectrum-signal-parameters.h
--- ns-3.35/src/spectrum/model/spectrum-signal-parameters.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/spectrum/model/spectrum-signal-parameters.h	2022-04-30 18:23:58.146735000 -0700
@@ -66,6 +66,7 @@
 
   /**
    * copy constructor
+   * \param p object to copy
    */
   SpectrumSignalParameters (const SpectrumSignalParameters& p);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/spectrum/model/spectrum-value.h ns-3.36/src/spectrum/model/spectrum-value.h
--- ns-3.35/src/spectrum/model/spectrum-value.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/spectrum/model/spectrum-value.h	2022-04-30 18:23:58.146735000 -0700
@@ -572,10 +572,12 @@
   void ChangeSign ();
   /**
    * Shift the values to the left
+   * \param n number of positions to shift
    */
   void ShiftLeft (int n);
   /**
    * Shift the values to the right
+   * \param n number of positions to shift
    */
   void ShiftRight (int n);
   /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/spectrum/model/three-gpp-channel-model.cc ns-3.36/src/spectrum/model/three-gpp-channel-model.cc
--- ns-3.35/src/spectrum/model/three-gpp-channel-model.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/spectrum/model/three-gpp-channel-model.cc	2022-04-30 18:23:58.146735000 -0700
@@ -40,20 +40,18 @@
 
 NS_OBJECT_ENSURE_REGISTERED (ThreeGppChannelModel);
 
-//Table 7.5-3: Ray offset angles within a cluster, given for rms angle spread normalized to 1.
+/// The ray offset angles within a cluster, given for rms angle spread normalized to 1. (Table 7.5-3)
 static const double offSetAlpha[20] = {
-  0.0447,-0.0447,0.1413,-0.1413,0.2492,-0.2492,0.3715,-0.3715,0.5129,-0.5129,0.6797,-0.6797,0.8844,-0.8844,1.1481,-1.1481,1.5195,-1.5195,2.1551,-2.1551
-};
+  0.0447, -0.0447, 0.1413, -0.1413, 0.2492, -0.2492, 0.3715, -0.3715, 0.5129, -0.5129,
+  0.6797, -0.6797, 0.8844, -0.8844, 1.1481, -1.1481, 1.5195, -1.5195, 2.1551, -2.1551};
 
-/*
- * The cross correlation matrix is constructed according to table 7.5-6.
- * All the square root matrix is being generated using the Cholesky decomposition
- * and following the order of [SF,K,DS,ASD,ASA,ZSD,ZSA].
- * The parameter K is ignored in NLOS.
+/**
+ * The square root matrix for <em>RMa LOS</em>, which is generated using the
+ * Cholesky decomposition according to table 7.5-6 Part 2 and follows the order
+ * of [SF, K, DS, ASD, ASA, ZSD, ZSA].
  *
  * The Matlab file to generate the matrices can be found in
  * https://github.com/nyuwireless-unipd/ns3-mmwave/blob/master/src/mmwave/model/BeamFormingMatrix/SqrtMatrix.m
- *
  */
 static const double sqrtC_RMa_LOS[7][7] = {
   {1, 0, 0, 0, 0, 0, 0},
@@ -65,6 +63,15 @@
   {-0.17, -0.02, 0.21362, -0.14, 0.24, 0.142773, 0.909661},
 };
 
+/**
+ * The square root matrix for <em>RMa NLOS</em>, which is generated using the
+ * Cholesky decomposition according to table 7.5-6 Part 2 and follows the order
+ * of [SF, K, DS, ASD, ASA, ZSD, ZSA].
+ * The parameter K is ignored.
+ * 
+ * The Matlab file to generate the matrices can be found in
+ * https://github.com/nyuwireless-unipd/ns3-mmwave/blob/master/src/mmwave/model/BeamFormingMatrix/SqrtMatrix.m
+ */
 static const double sqrtC_RMa_NLOS[6][6] = {
   {1, 0, 0, 0, 0, 0},
   {-0.5, 0.866025, 0, 0, 0, 0},
@@ -74,6 +81,14 @@
   {-0.25, -0.606218, -0.240013, 0.26, -0.231685, 0.625392},
 };
 
+/**
+ * The square root matrix for <em>RMa O2I</em>, which is generated using the
+ * Cholesky decomposition according to table 7.5-6 Part 2 and follows the order
+ * of [SF, K, DS, ASD, ASA, ZSD, ZSA].
+ * 
+ * The Matlab file to generate the matrices can be found in
+ * https://github.com/nyuwireless-unipd/ns3-mmwave/blob/master/src/mmwave/model/BeamFormingMatrix/SqrtMatrix.m
+ */
 static const double sqrtC_RMa_O2I[6][6] = {
   {1, 0, 0, 0, 0, 0},
   {0, 1, 0, 0, 0, 0},
@@ -83,6 +98,14 @@
   {0, 0, 0.47, 0.152631, -0.393194, 0.775373},
 };
 
+/**
+ * The square root matrix for <em>UMa LOS</em>, which is generated using the
+ * Cholesky decomposition according to table 7.5-6 Part 1 and follows the order
+ * of [SF, K, DS, ASD, ASA, ZSD, ZSA].
+ *
+ * The Matlab file to generate the matrices can be found in
+ * https://github.com/nyuwireless-unipd/ns3-mmwave/blob/master/src/mmwave/model/BeamFormingMatrix/SqrtMatrix.m
+ */
 static const double sqrtC_UMa_LOS[7][7] = {
   {1, 0, 0, 0, 0, 0, 0},
   {0, 1, 0, 0, 0, 0, 0},
@@ -93,7 +116,15 @@
   {-0.8, 0, -0.388057, -0.367926, 0.238537, -3.58949e-15, 0.130931},
 };
 
-
+/**
+ * The square root matrix for <em>UMa NLOS</em>, which is generated using the
+ * Cholesky decomposition according to table 7.5-6 Part 1 and follows the order
+ * of [SF, K, DS, ASD, ASA, ZSD, ZSA].
+ * The parameter K is ignored.
+ * 
+ * The Matlab file to generate the matrices can be found in
+ * https://github.com/nyuwireless-unipd/ns3-mmwave/blob/master/src/mmwave/model/BeamFormingMatrix/SqrtMatrix.m
+ */
 static const double sqrtC_UMa_NLOS[6][6] = {
   {1, 0, 0, 0, 0, 0},
   {-0.4, 0.916515, 0, 0, 0, 0},
@@ -103,6 +134,14 @@
   {-0.4, -0.174574, -0.396459, 0.392138, 0.49099, 0.507445},
 };
 
+/**
+ * The square root matrix for <em>UMa O2I</em>, which is generated using the
+ * Cholesky decomposition according to table 7.5-6 Part 1 and follows the order
+ * of [SF, K, DS, ASD, ASA, ZSD, ZSA].
+ * 
+ * The Matlab file to generate the matrices can be found in
+ * https://github.com/nyuwireless-unipd/ns3-mmwave/blob/master/src/mmwave/model/BeamFormingMatrix/SqrtMatrix.m
+ */
 static const double sqrtC_UMa_O2I[6][6] = {
   {1, 0, 0, 0, 0, 0},
   {-0.5, 0.866025, 0, 0, 0, 0},
@@ -113,6 +152,14 @@
 
 };
 
+/**
+ * The square root matrix for <em>UMi LOS</em>, which is generated using the
+ * Cholesky decomposition according to table 7.5-6 Part 1 and follows the order
+ * of [SF, K, DS, ASD, ASA, ZSD, ZSA].
+ *
+ * The Matlab file to generate the matrices can be found in
+ * https://github.com/nyuwireless-unipd/ns3-mmwave/blob/master/src/mmwave/model/BeamFormingMatrix/SqrtMatrix.m
+ */
 static const double sqrtC_UMi_LOS[7][7] = {
   {1, 0, 0, 0, 0, 0, 0},
   {0.5, 0.866025, 0, 0, 0, 0, 0},
@@ -123,6 +170,15 @@
   {0, 0, 0.280976, 0.231921, -0.490509, 0.11916, 0.782603},
 };
 
+/**
+ * The square root matrix for <em>UMi NLOS</em>, which is generated using the
+ * Cholesky decomposition according to table 7.5-6 Part 1 and follows the order
+ * of [SF, K, DS, ASD, ASA, ZSD, ZSA].
+ * The parameter K is ignored.
+ * 
+ * The Matlab file to generate the matrices can be found in
+ * https://github.com/nyuwireless-unipd/ns3-mmwave/blob/master/src/mmwave/model/BeamFormingMatrix/SqrtMatrix.m
+ */
 static const double sqrtC_UMi_NLOS[6][6] = {
   {1, 0, 0, 0, 0, 0},
   {-0.7, 0.714143, 0, 0, 0, 0},
@@ -132,6 +188,14 @@
   {0, 0, 0.5, 0.221981, -0.566238, 0.616522},
 };
 
+/**
+ * The square root matrix for <em>UMi O2I</em>, which is generated using the
+ * Cholesky decomposition according to table 7.5-6 Part 1 and follows the order
+ * of [SF, K, DS, ASD, ASA, ZSD, ZSA].
+ * 
+ * The Matlab file to generate the matrices can be found in
+ * https://github.com/nyuwireless-unipd/ns3-mmwave/blob/master/src/mmwave/model/BeamFormingMatrix/SqrtMatrix.m
+ */
 static const double sqrtC_UMi_O2I[6][6] = {
   {1, 0, 0, 0, 0, 0},
   {-0.5, 0.866025, 0, 0, 0, 0},
@@ -141,6 +205,14 @@
   {0, -0.23094, 0.16843, 0.808554, -0.220827, 0.464515},
 };
 
+/**
+ * The square root matrix for <em>Indoor-Office LOS</em>, which is generated
+ * using the Cholesky decomposition according to table 7.5-6 Part 2 and follows
+ * the order of [SF, K, DS, ASD, ASA, ZSD, ZSA].
+ *
+ * The Matlab file to generate the matrices can be found in
+ * https://github.com/nyuwireless-unipd/ns3-mmwave/blob/master/src/mmwave/model/BeamFormingMatrix/SqrtMatrix.m
+ */
 static const double sqrtC_office_LOS[7][7] = {
   {1, 0, 0, 0, 0, 0, 0},
   {0.5, 0.866025, 0, 0, 0, 0, 0},
@@ -151,6 +223,15 @@
   {0.3, -0.057735, 0.73598, -0.348236, 0.0610847, -0.304997, 0.383375},
 };
 
+/**
+ * The square root matrix for <em>Indoor-Office NLOS</em>, which is generated
+ * using the Cholesky decomposition according to table 7.5-6 Part 2 and follows
+ * the order of [SF, K, DS, ASD, ASA, ZSD, ZSA].
+ * The parameter K is ignored.
+ * 
+ * The Matlab file to generate the matrices can be found in
+ * https://github.com/nyuwireless-unipd/ns3-mmwave/blob/master/src/mmwave/model/BeamFormingMatrix/SqrtMatrix.m
+ */
 static const double sqrtC_office_NLOS[6][6] = {
   {1, 0, 0, 0, 0, 0},
   {-0.5, 0.866025, 0, 0, 0, 0},
@@ -165,6 +246,7 @@
   NS_LOG_FUNCTION (this);
   m_uniformRv = CreateObject<UniformRandomVariable> ();
   m_uniformRvShuffle = CreateObject<UniformRandomVariable> ();
+  m_uniformRvDoppler = CreateObject<UniformRandomVariable> ();
 
   m_normalRv = CreateObject<NormalRandomVariable> ();
   m_normalRv->SetAttribute ("Mean", DoubleValue (0.0));
@@ -180,11 +262,12 @@
 ThreeGppChannelModel::DoDispose ()
 {
   NS_LOG_FUNCTION (this);
-  m_channelMap.clear ();
   if (m_channelConditionModel)
     {
       m_channelConditionModel->Dispose ();
     }
+  m_channelMatrixMap.clear ();
+  m_channelParamsMap.clear ();
   m_channelConditionModel = nullptr;
 }
 
@@ -192,7 +275,6 @@
 ThreeGppChannelModel::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::ThreeGppChannelModel")
-    .SetParent<Object> ()
     .SetGroupName ("Spectrum")
     .SetParent<MatrixBasedChannelModel> ()
     .AddConstructor<ThreeGppChannelModel> ()
@@ -240,6 +322,14 @@
                    DoubleValue (1),
                    MakeDoubleAccessor (&ThreeGppChannelModel::m_blockerSpeed),
                    MakeDoubleChecker<double> ())
+    .AddAttribute ("vScatt",
+                   "Maximum speed of the vehicle in the layout (see 3GPP TR 37.885 v15.3.0, Sec. 6.2.3)."
+                   "Used to compute the additional contribution for the Doppler of"
+                   "delayed (reflected) paths",
+                   DoubleValue (0.0),
+                   MakeDoubleAccessor (&ThreeGppChannelModel::m_vScatt),
+                   MakeDoubleChecker<double> (0.0))
+
   ;
   return tid;
 }
@@ -280,7 +370,7 @@
   NS_ASSERT_MSG (scenario == "RMa" || scenario == "UMa" || scenario == "UMi-StreetCanyon"
                  || scenario == "InH-OfficeOpen" || scenario == "InH-OfficeMixed"
                  || scenario == "V2V-Urban" || scenario == "V2V-Highway",
-                 "Unknown scenario, choose between RMa, UMa, UMi-StreetCanyon,"
+                 "Unknown scenario, choose between: RMa, UMa, UMi-StreetCanyon, "
                  "InH-OfficeOpen, InH-OfficeMixed, V2V-Urban or V2V-Highway");
   m_scenario = scenario;
 }
@@ -293,7 +383,8 @@
 }
 
 Ptr<const ThreeGppChannelModel::ParamsTable>
-ThreeGppChannelModel::GetThreeGppTable (Ptr<const ChannelCondition> channelCondition, double hBS, double hUT, double distance2D) const
+ThreeGppChannelModel::GetThreeGppTable (Ptr<const ChannelCondition> channelCondition, double hBS,
+                                        double hUT, double distance2D) const
 {
   NS_LOG_FUNCTION (this);
 
@@ -356,7 +447,7 @@
           table3gpp->m_sigLgASD = 0.45;
           table3gpp->m_uLgASA = 1.52;
           table3gpp->m_sigLgASA = 0.13;
-          table3gpp->m_uLgZSA = 0.58,
+          table3gpp->m_uLgZSA = 0.58;
           table3gpp->m_sigLgZSA = 0.37;
           table3gpp->m_uLgZSD = std::max (-1.0, -0.19 * (distance2D / 1000) - 0.01 * (hUT - 1.5) + 0.28);
           table3gpp->m_sigLgZSD = 0.30;
@@ -390,7 +481,7 @@
           table3gpp->m_sigLgASD = 0.18;
           table3gpp->m_uLgASA = 1.66;
           table3gpp->m_sigLgASA = 0.21;
-          table3gpp->m_uLgZSA = 0.93,
+          table3gpp->m_uLgZSA = 0.93;
           table3gpp->m_sigLgZSA = 0.22;
           table3gpp->m_uLgZSD = std::max (-1.0, -0.19 * (distance2D / 1000) - 0.01 * (hUT - 1.5) + 0.28);
           table3gpp->m_sigLgZSD = 0.30;
@@ -460,7 +551,7 @@
           double cfc = -0.13 * log10 (fcGHz) + 2.03;
           double efc = 7.66 * log10 (fcGHz) - 5.96;
 
-          double offsetZOD = efc - std::pow (10, afc * log10 (std::max (bfc,distance2D)) + cfc);
+          double offsetZOD = efc - std::pow (10, afc * log10 (std::max (bfc, distance2D)) + cfc);
 
           if (!los && !o2i)
             {
@@ -573,7 +664,7 @@
         }
       else
         {
-          double uLgZSD = std::max (-0.5, -3.1 * distance2D / 1000 + 0.01 * std::max (hUT - hBS,0.0) + 0.2);
+          double uLgZSD = std::max (-0.5, -3.1 * distance2D / 1000 + 0.01 * std::max (hUT - hBS, 0.0) + 0.2);
           double offsetZOD = -1 * std::pow (10, -1.5 * log10 (std::max (10.0, distance2D)) + 3.3);
           if (!los && !o2i)
             {
@@ -645,7 +736,7 @@
             }
         }
     }
-  else if (m_scenario == "InH-OfficeMixed"||m_scenario == "InH-OfficeOpen")
+  else if (m_scenario == "InH-OfficeMixed" || m_scenario == "InH-OfficeOpen")
     {
       NS_ASSERT_MSG (!o2i, "The indoor scenario does out support outdoor to indoor");
       if (los)
@@ -731,8 +822,8 @@
           table3gpp->m_sigLgASD = 0.1;
           table3gpp->m_uLgASA = -0.1 * log10 (1 + fcGHz) + 1.6;
           table3gpp->m_sigLgASA = 0.1;
-          table3gpp->m_uLgZSA = -0.1 * log10 (1 + fcGHz) + 0.73,
-          table3gpp->m_sigLgZSA = -0.04 * log10 (1 + fcGHz) + 0.34,
+          table3gpp->m_uLgZSA = -0.1 * log10 (1 + fcGHz) + 0.73;
+          table3gpp->m_sigLgZSA = -0.04 * log10 (1 + fcGHz) + 0.34;
           table3gpp->m_uLgZSD = -0.1 * log10 (1 + fcGHz) + 0.73;
           table3gpp->m_sigLgZSD = -0.04 * log10 (1 + fcGHz) + 0.34;
           table3gpp->m_offsetZOD = 0;
@@ -765,7 +856,7 @@
           table3gpp->m_sigLgASD = 0.05 * log10 (1 + fcGHz) + 0.3;
           table3gpp->m_uLgASA = -0.08 * log10 (1 + fcGHz) + 1.81;
           table3gpp->m_sigLgASA = 0.05 * log10 (1 + fcGHz) + 0.3;
-          table3gpp->m_uLgZSA = -0.04 * log10 (1 + fcGHz) + 0.92,
+          table3gpp->m_uLgZSA = -0.04 * log10 (1 + fcGHz) + 0.92;
           table3gpp->m_sigLgZSA = -0.07 * log10 (1 + fcGHz) + 0.41;
           table3gpp->m_uLgZSD = -0.04 * log10 (1 + fcGHz) + 0.92;
           table3gpp->m_sigLgZSD = -0.07 * log10 (1 + fcGHz) + 0.41;
@@ -910,7 +1001,7 @@
           table3gpp->m_sigLgASD = 0.05 * log10 (1 + fcGHz) + 0.3;
           table3gpp->m_uLgASA = -0.08 * log10 (1 + fcGHz) + 1.81;
           table3gpp->m_sigLgASA = 0.05 * log10 (1 + fcGHz) + 0.3;
-          table3gpp->m_uLgZSA = -0.04 * log10 (1 + fcGHz) + 0.92,
+          table3gpp->m_uLgZSA = -0.04 * log10 (1 + fcGHz) + 0.92;
           table3gpp->m_sigLgZSA = -0.07 * log10 (1 + fcGHz) + 0.41;
           table3gpp->m_uLgZSD = -0.04 * log10 (1 + fcGHz) + 0.92;
           table3gpp->m_sigLgZSD = -0.07 * log10 (1 + fcGHz) + 0.41;
@@ -948,29 +1039,45 @@
 }
 
 bool
-ThreeGppChannelModel::ChannelMatrixNeedsUpdate (Ptr<const ThreeGppChannelMatrix> channelMatrix, Ptr<const ChannelCondition> channelCondition) const
+ThreeGppChannelModel::ChannelParamsNeedsUpdate (Ptr<const ThreeGppChannelParams> channelParams,
+                                                Ptr<const ChannelCondition> channelCondition) const
 {
   NS_LOG_FUNCTION (this);
 
   bool update = false;
 
   // if the channel condition is different the channel has to be updated
-  if (!channelMatrix->m_channelCondition->IsEqual (channelCondition))
+  if (!channelCondition->IsEqual (channelParams->m_losCondition, channelParams->m_o2iCondition))
     {
       NS_LOG_DEBUG ("Update the channel condition");
       update = true;
     }
 
   // if the coherence time is over the channel has to be updated
-  if (!m_updatePeriod.IsZero () && Simulator::Now () - channelMatrix->m_generatedTime > m_updatePeriod)
+  if (!m_updatePeriod.IsZero () && Simulator::Now () - channelParams->m_generatedTime > m_updatePeriod)
     {
-      NS_LOG_DEBUG ("Generation time " << channelMatrix->m_generatedTime.As (Time::NS) << " now " << Now ().As (Time::NS));
+      NS_LOG_DEBUG ("Generation time " << channelParams->m_generatedTime.As (Time::NS) << " now " << Now ().As (Time::NS));
       update = true;
     }
 
   return update;
 }
 
+
+bool
+ThreeGppChannelModel::ChannelMatrixNeedsUpdate (Ptr<const ThreeGppChannelParams> channelParams, Ptr<const ChannelMatrix> channelMatrix)
+{
+
+  if (channelParams->m_generatedTime > channelMatrix->m_generatedTime)
+    {
+      return true;
+    }
+  else
+    {
+      return false;
+    }
+}
+
 Ptr<const MatrixBasedChannelModel::ChannelMatrix>
 ThreeGppChannelModel::GetChannel (Ptr<const MobilityModel> aMob,
                                   Ptr<const MobilityModel> bMob,
@@ -979,107 +1086,135 @@
 {
   NS_LOG_FUNCTION (this);
 
-  // Compute the channel key. The key is reciprocal, i.e., key (a, b) = key (b, a)
-  uint32_t x1 = std::min (aMob->GetObject<Node> ()->GetId (), bMob->GetObject<Node> ()->GetId ());
-  uint32_t x2 = std::max (aMob->GetObject<Node> ()->GetId (), bMob->GetObject<Node> ()->GetId ());
-  uint32_t channelId = GetKey (x1, x2);
+  // Compute the channel params key. The key is reciprocal, i.e., key (a, b) = key (b, a)
+  uint64_t channelParamsKey = GetKey (aMob->GetObject<Node> ()->GetId (), bMob->GetObject<Node> ()->GetId ());
+  // Compute the channel matrix key. The key is reciprocal, i.e., key (a, b) = key (b, a)
+  uint64_t channelMatrixKey = GetKey (aAntenna->GetId (), bAntenna->GetId ());
 
   // retrieve the channel condition
   Ptr<const ChannelCondition> condition = m_channelConditionModel->GetChannelCondition (aMob, bMob);
 
   // Check if the channel is present in the map and return it, otherwise
   // generate a new channel
-  bool update = false;
-  bool notFound = false;
-  Ptr<ThreeGppChannelMatrix> channelMatrix;
-  if (m_channelMap.find (channelId) != m_channelMap.end ())
+  bool updateParams = false;
+  bool updateMatrix = false;
+  bool notFoundParams = false;
+  bool notFoundMatrix = false;
+  Ptr<ChannelMatrix> channelMatrix;
+  Ptr<ThreeGppChannelParams> channelParams;
+
+
+  if (m_channelParamsMap.find (channelParamsKey) != m_channelParamsMap.end ())
+    {
+      channelParams = m_channelParamsMap[channelParamsKey];
+      // check if it has to be updated
+      updateParams = ChannelParamsNeedsUpdate (channelParams, condition);
+    }
+  else
+    {
+      NS_LOG_DEBUG ("channel params not found");
+      notFoundParams = true;
+    }
+
+  double x = aMob->GetPosition ().x - bMob->GetPosition ().x;
+  double y = aMob->GetPosition ().y - bMob->GetPosition ().y;
+  double distance2D = sqrt (x * x + y * y);
+
+  // NOTE we assume hUT = min (height(a), height(b)) and
+  // hBS = max (height (a), height (b))
+  double hUt = std::min (aMob->GetPosition ().z, bMob->GetPosition ().z);
+  double hBs = std::max (aMob->GetPosition ().z, bMob->GetPosition ().z);
+
+  // get the 3GPP parameters
+  Ptr<const ParamsTable> table3gpp = GetThreeGppTable (condition, hBs, hUt, distance2D);
+
+  if (notFoundParams || updateParams)
+    {
+      //Step 4: Generate large scale parameters. All LSPS are uncorrelated.
+      //Step 5: Generate Delays.
+      //Step 6: Generate cluster powers.
+      //Step 7: Generate arrival and departure angles for both azimuth and elevation.
+      //Step 8: Coupling of rays within a cluster for both azimuth and elevation
+      //shuffle all the arrays to perform random coupling
+      //Step 9: Generate the cross polarization power ratios
+      //Step 10: Draw initial phases
+      channelParams = GenerateChannelParameters (condition, table3gpp, aMob, bMob);
+      // store or replace the channel parameters
+      m_channelParamsMap[channelParamsKey] = channelParams;
+    }
+
+  if (m_channelMatrixMap.find (channelMatrixKey) != m_channelMatrixMap.end ())
     {
       // channel matrix present in the map
       NS_LOG_DEBUG ("channel matrix present in the map");
-      channelMatrix = m_channelMap[channelId];
-
-      // check if it has to be updated
-      update = ChannelMatrixNeedsUpdate (channelMatrix, condition);
+      channelMatrix = m_channelMatrixMap[channelMatrixKey];
+      updateMatrix = ChannelMatrixNeedsUpdate (channelParams, channelMatrix);
     }
   else
     {
       NS_LOG_DEBUG ("channel matrix not found");
-      notFound = true;
+      notFoundMatrix = true;
     }
 
   // If the channel is not present in the map or if it has to be updated
   // generate a new realization
-  if (notFound || update)
+  if (notFoundMatrix || updateMatrix)
     {
       // channel matrix not found or has to be updated, generate a new one
-      Angles txAngle (bMob->GetPosition (), aMob->GetPosition ());
-      Angles rxAngle (aMob->GetPosition (), bMob->GetPosition ());
-
-      double x = aMob->GetPosition ().x - bMob->GetPosition ().x;
-      double y = aMob->GetPosition ().y - bMob->GetPosition ().y;
-      double distance2D = sqrt (x * x + y * y);
-
-      // NOTE we assume hUT = min (height(a), height(b)) and
-      // hBS = max (height (a), height (b))
-      double hUt = std::min (aMob->GetPosition ().z, bMob->GetPosition ().z);
-      double hBs = std::max (aMob->GetPosition ().z, bMob->GetPosition ().z);
-
-      // TODO this is not currently used, it is needed for the computation of the
-      // additional blockage in case of spatial consistent update
-      // I do not know who is the UT, I can use the relative distance between
-      // tx and rx instead
-      Vector locUt = Vector (0.0, 0.0, 0.0);
-
-      channelMatrix = GetNewChannel (locUt, condition, aAntenna, bAntenna, rxAngle, txAngle, distance2D, hBs, hUt);
-      channelMatrix->m_nodeIds = std::make_pair (aMob->GetObject<Node> ()->GetId (), bMob->GetObject<Node> ()->GetId ());
+      channelMatrix = GetNewChannel (channelParams, table3gpp, aMob, bMob, aAntenna, bAntenna);
+      channelMatrix->m_antennaPair = std::make_pair (aAntenna->GetId (), bAntenna->GetId ()); // save antenna pair, with the exact order of s and u antennas at the moment of the channel generation
 
       // store or replace the channel matrix in the channel map
-      m_channelMap[channelId] = channelMatrix;
+      m_channelMatrixMap[channelMatrixKey] = channelMatrix;
     }
 
   return channelMatrix;
 }
 
-Ptr<ThreeGppChannelModel::ThreeGppChannelMatrix>
-ThreeGppChannelModel::GetNewChannel (Vector locUT, Ptr<const ChannelCondition> channelCondition,
-                                     Ptr<const PhasedArrayModel> sAntenna,
-                                     Ptr<const PhasedArrayModel> uAntenna,
-                                     Angles &uAngle, Angles &sAngle,
-                                     double dis2D, double hBS, double hUT) const
+Ptr<const MatrixBasedChannelModel::ChannelParams>
+ThreeGppChannelModel::GetParams (Ptr<const MobilityModel> aMob,
+                                 Ptr<const MobilityModel> bMob) const
 {
   NS_LOG_FUNCTION (this);
 
-  NS_ASSERT_MSG (m_frequency > 0.0, "Set the operating frequency first!");
+  // Compute the channel key. The key is reciprocal, i.e., key (a, b) = key (b, a)
+  uint64_t channelParamsKey = GetKey (aMob->GetObject<Node> ()->GetId (), bMob->GetObject<Node> ()->GetId ());
 
-  // get the 3GPP parameters
-  Ptr<const ParamsTable> table3gpp = GetThreeGppTable (channelCondition, hBS, hUT, dis2D);
+  if (m_channelParamsMap.find (channelParamsKey) != m_channelParamsMap.end ())
+    {
+      return m_channelParamsMap.find (channelParamsKey)->second;
+    }
+  else
+    {
+      NS_LOG_WARN ("Channel params map not found. Returning a nullptr.");
+      return nullptr;
+    }
+}
 
-  // get the number of clusters and the number of rays per cluster
-  uint8_t numOfCluster = table3gpp->m_numOfCluster;
-  uint8_t raysPerCluster = table3gpp->m_raysPerCluster;
 
+Ptr<ThreeGppChannelModel::ThreeGppChannelParams>
+ThreeGppChannelModel::GenerateChannelParameters (const Ptr<const ChannelCondition> channelCondition,
+                                                 const Ptr<const ParamsTable> table3gpp,
+                                                 const Ptr<const MobilityModel> aMob,
+                                                 const Ptr<const MobilityModel> bMob) const
+{
+
+  NS_LOG_FUNCTION (this);
   // create a channel matrix instance
-  Ptr<ThreeGppChannelMatrix> channelParams = Create<ThreeGppChannelMatrix> ();
-  channelParams->m_channelCondition = channelCondition; // set the channel condition
+  Ptr<ThreeGppChannelParams> channelParams = Create<ThreeGppChannelParams> ();
   channelParams->m_generatedTime = Simulator::Now ();
-
-  // compute the 3D distance using eq. 7.4-1
-  double dis3D = std::sqrt (dis2D * dis2D + (hBS - hUT) * (hBS - hUT));
-
-  bool los = channelCondition->IsLos ();
-  bool o2i = channelCondition->IsO2i ();
+  channelParams->m_nodeIds = std::make_pair (aMob->GetObject<Node> ()->GetId (), bMob->GetObject<Node> ()->GetId ());
+  channelParams->m_losCondition = channelCondition->GetLosCondition ();
+  channelParams->m_o2iCondition = channelCondition->GetO2iCondition ();
 
   //Step 4: Generate large scale parameters. All LSPS are uncorrelated.
   DoubleVector LSPsIndep, LSPs;
-  uint8_t paramNum;
-  if (los)
+  uint8_t paramNum = 6;
+  if (channelParams->m_losCondition == ChannelCondition::LOS)
     {
       paramNum = 7;
     }
-  else
-    {
-      paramNum = 6;
-    }
+
   //Generate paramNum independent LSPs.
   for (uint8_t iter = 0; iter < paramNum; iter++)
     {
@@ -1096,11 +1231,10 @@
     }
 
   // NOTE the shadowing is generated in the propagation loss model
-
-  double DS,ASD,ASA,ZSA,ZSD,K_factor = 0;
-  if (los)
+  double DS, ASD, ASA, ZSA, ZSD, kFactor = 0;
+  if (channelParams->m_losCondition == ChannelCondition::LOS)
     {
-      K_factor = LSPs[1] * table3gpp->m_sigK + table3gpp->m_uK;
+      kFactor = LSPs[1] * table3gpp->m_sigK + table3gpp->m_uK;
       DS = pow (10, LSPs[2] * table3gpp->m_sigLgDS + table3gpp->m_uLgDS);
       ASD = pow (10, LSPs[3] * table3gpp->m_sigLgASD + table3gpp->m_uLgASD);
       ASA = pow (10, LSPs[4] * table3gpp->m_sigLgASA + table3gpp->m_uLgASA);
@@ -1121,17 +1255,19 @@
   ZSD = std::min (ZSD, 52.0);
   ZSA = std::min (ZSA, 52.0);
 
+  // save DS and K_factor parameters in the structure
   channelParams->m_DS = DS;
-  channelParams->m_K = K_factor;
+  channelParams->m_K_factor = kFactor;
 
-  NS_LOG_INFO ("K-factor=" << K_factor << ",DS=" << DS << ", ASD=" << ASD << ", ASA=" << ASA << ", ZSD=" << ZSD << ", ZSA=" << ZSA);
+  NS_LOG_INFO ("K-factor=" << kFactor << ", DS=" << DS << ", ASD=" << ASD << ", ASA=" << ASA
+                           << ", ZSD=" << ZSD << ", ZSA=" << ZSA);
 
   //Step 5: Generate Delays.
   DoubleVector clusterDelay;
   double minTau = 100.0;
-  for (uint8_t cIndex = 0; cIndex < numOfCluster; cIndex++)
+  for (uint8_t cIndex = 0; cIndex < table3gpp->m_numOfCluster; cIndex++)
     {
-      double tau = -1 * table3gpp->m_rTau * DS * log (m_uniformRv->GetValue (0,1)); //(7.5-1)
+      double tau = -1 * table3gpp->m_rTau * DS * log (m_uniformRv->GetValue (0, 1)); //(7.5-1)
       if (minTau > tau)
         {
           minTau = tau;
@@ -1139,7 +1275,7 @@
       clusterDelay.push_back (tau);
     }
 
-  for (uint8_t cIndex = 0; cIndex < numOfCluster; cIndex++)
+  for (uint8_t cIndex = 0; cIndex < table3gpp->m_numOfCluster; cIndex++)
     {
       clusterDelay[cIndex] -= minTau;
     }
@@ -1151,34 +1287,37 @@
   //Step 6: Generate cluster powers.
   DoubleVector clusterPower;
   double powerSum = 0;
-  for (uint8_t cIndex = 0; cIndex < numOfCluster; cIndex++)
+  for (uint8_t cIndex = 0; cIndex < table3gpp->m_numOfCluster; cIndex++)
     {
       double power = exp (-1 * clusterDelay[cIndex] * (table3gpp->m_rTau - 1) / table3gpp->m_rTau / DS) *
-        pow (10,-1 * m_normalRv->GetValue () * table3gpp->m_perClusterShadowingStd / 10);                       //(7.5-5)
+        pow (10, -1 * m_normalRv->GetValue () * table3gpp->m_perClusterShadowingStd / 10);                       //(7.5-5)
       powerSum += power;
       clusterPower.push_back (power);
     }
+  channelParams->m_clusterPower = clusterPower;
+
   double powerMax = 0;
 
-  for (uint8_t cIndex = 0; cIndex < numOfCluster; cIndex++)
+  for (uint8_t cIndex = 0; cIndex < table3gpp->m_numOfCluster; cIndex++)
     {
-      clusterPower[cIndex] = clusterPower[cIndex] / powerSum; //(7.5-6)
+      channelParams->m_clusterPower[cIndex] = channelParams->m_clusterPower[cIndex] / powerSum; //(7.5-6)
     }
 
   DoubleVector clusterPowerForAngles; // this power is only for equation (7.5-9) and (7.5-14), not for (7.5-22)
-  if (los)
+  if (channelParams->m_losCondition == ChannelCondition::LOS)
     {
-      double K_linear = pow (10,K_factor / 10);
+      double kLinear = pow (10, kFactor / 10);
 
-      for (uint8_t cIndex = 0; cIndex < numOfCluster; cIndex++)
+      for (uint8_t cIndex = 0; cIndex < table3gpp->m_numOfCluster; cIndex++)
         {
           if (cIndex == 0)
             {
-              clusterPowerForAngles.push_back (clusterPower[cIndex] / (1 + K_linear) + K_linear / (1 + K_linear));                  //(7.5-8)
+              clusterPowerForAngles.push_back (channelParams->m_clusterPower[cIndex] / (1 + kLinear) +
+                                               kLinear / (1 + kLinear));                  //(7.5-8)
             }
           else
             {
-              clusterPowerForAngles.push_back (clusterPower[cIndex] / (1 + K_linear)); //(7.5-8)
+              clusterPowerForAngles.push_back (channelParams->m_clusterPower[cIndex] / (1 + kLinear)); //(7.5-8)
             }
           if (powerMax < clusterPowerForAngles[cIndex])
             {
@@ -1188,9 +1327,9 @@
     }
   else
     {
-      for (uint8_t cIndex = 0; cIndex < numOfCluster; cIndex++)
+      for (uint8_t cIndex = 0; cIndex < table3gpp->m_numOfCluster; cIndex++)
         {
-          clusterPowerForAngles.push_back (clusterPower[cIndex]); //(7.5-6)
+          clusterPowerForAngles.push_back (channelParams->m_clusterPower[cIndex]); //(7.5-6)
           if (powerMax < clusterPowerForAngles[cIndex])
             {
               powerMax = clusterPowerForAngles[cIndex];
@@ -1199,147 +1338,139 @@
     }
 
   //remove clusters with less than -25 dB power compared to the maxim cluster power;
-  //double thresh = pow(10,-2.5);
+  //double thresh = pow(10, -2.5);
   double thresh = 0.0032;
-  for (uint8_t cIndex = numOfCluster; cIndex > 0; cIndex--)
+  for (uint8_t cIndex = table3gpp->m_numOfCluster; cIndex > 0; cIndex--)
     {
       if (clusterPowerForAngles[cIndex - 1] < thresh * powerMax )
         {
           clusterPowerForAngles.erase (clusterPowerForAngles.begin () + cIndex - 1);
-          clusterPower.erase (clusterPower.begin () + cIndex - 1);
+          channelParams->m_clusterPower.erase (channelParams->m_clusterPower.begin () + cIndex - 1);
           clusterDelay.erase (clusterDelay.begin () + cIndex - 1);
         }
     }
 
-  NS_ASSERT (clusterPower.size () < UINT8_MAX);
-  uint8_t numReducedCluster = clusterPower.size ();
-
-  channelParams->m_numCluster = numReducedCluster;
+  NS_ASSERT (channelParams->m_clusterPower.size () < UINT8_MAX);
+  channelParams->m_reducedClusterNumber = channelParams->m_clusterPower.size ();
   // Resume step 5 to compute the delay for LoS condition.
-  if (los)
+  if (channelParams->m_losCondition == ChannelCondition::LOS)
     {
-      double C_tau = 0.7705 - 0.0433 * K_factor + 2e-4 * pow (K_factor,2) + 17e-6 * pow (K_factor,3);         //(7.5-3)
-      for (uint8_t cIndex = 0; cIndex < numReducedCluster; cIndex++)
+      double cTau = 0.7705 - 0.0433 * kFactor + 2e-4 * pow (kFactor,2) + 17e-6 * pow (kFactor,3);         //(7.5-3)
+      for (uint8_t cIndex = 0; cIndex < channelParams->m_reducedClusterNumber; cIndex++)
         {
-          clusterDelay[cIndex] = clusterDelay[cIndex] / C_tau;             //(7.5-4)
+          clusterDelay[cIndex] = clusterDelay[cIndex] / cTau; //(7.5-4)
         }
     }
 
   //Step 7: Generate arrival and departure angles for both azimuth and elevation.
 
-  double C_NLOS, C_phi;
+  double cNlos;
   //According to table 7.5-6, only cluster number equals to 8, 10, 11, 12, 19 and 20 is valid.
   //Not sure why the other cases are in Table 7.5-2.
-  switch (numOfCluster) // Table 7.5-2
+  switch (table3gpp->m_numOfCluster) // Table 7.5-2
     {
       case 4:
-        C_NLOS = 0.779;
+        cNlos = 0.779;
         break;
       case 5:
-        C_NLOS = 0.860;
+        cNlos = 0.860;
         break;
       case 8:
-        C_NLOS = 1.018;
+        cNlos = 1.018;
         break;
       case 10:
-        C_NLOS = 1.090;
+        cNlos = 1.090;
         break;
       case 11:
-        C_NLOS = 1.123;
+        cNlos = 1.123;
         break;
       case 12:
-        C_NLOS = 1.146;
+        cNlos = 1.146;
         break;
       case 14:
-        C_NLOS = 1.190;
+        cNlos = 1.190;
         break;
       case 15:
-        C_NLOS = 1.221;
+        cNlos = 1.221;
         break;
       case 16:
-        C_NLOS = 1.226;
+        cNlos = 1.226;
         break;
       case 19:
-        C_NLOS = 1.273;
+        cNlos = 1.273;
         break;
       case 20:
-        C_NLOS = 1.289;
+        cNlos = 1.289;
         break;
       default:
         NS_FATAL_ERROR ("Invalid cluster number");
     }
 
-  if (los)
-    {
-      C_phi = C_NLOS * (1.1035 - 0.028 * K_factor - 2e-3 * pow (K_factor,2) + 1e-4 * pow (K_factor,3));         //(7.5-10))
-    }
-  else
+  double cPhi = cNlos;
+
+  if (channelParams->m_losCondition == ChannelCondition::LOS)
     {
-      C_phi = C_NLOS;  //(7.5-10)
+      cPhi *= (1.1035 - 0.028 * kFactor - 2e-3 * pow (kFactor, 2) + 1e-4 * pow (kFactor, 3)); //(7.5-10))
     }
 
-  double C_theta;
-  switch (numOfCluster) //Table 7.5-4
+  switch (table3gpp->m_numOfCluster) //Table 7.5-4
     {
       case 8:
-        C_NLOS = 0.889;
+        cNlos = 0.889;
         break;
       case 10:
-        C_NLOS = 0.957;
+        cNlos = 0.957;
         break;
       case 11:
-        C_NLOS = 1.031;
+        cNlos = 1.031;
         break;
       case 12:
-        C_NLOS = 1.104;
+        cNlos = 1.104;
         break;
       case 15:
-        C_NLOS = 1.1088;
+        cNlos = 1.1088;
         break;
       case 19:
-        C_NLOS = 1.184;
+        cNlos = 1.184;
         break;
       case 20:
-        C_NLOS = 1.178;
+        cNlos = 1.178;
         break;
       default:
         NS_FATAL_ERROR ("Invalid cluster number");
     }
 
-  if (los)
-    {
-      C_theta = C_NLOS * (1.3086 + 0.0339 * K_factor - 0.0077 * pow (K_factor,2) + 2e-4 * pow (K_factor,3));         //(7.5-15)
-    }
-  else
+  double cTheta = cNlos;
+  if (channelCondition->IsLos())
     {
-      C_theta = C_NLOS;
+      cTheta *= (1.3086 + 0.0339 * kFactor - 0.0077 * pow (kFactor, 2) + 2e-4 * pow (kFactor, 3)); //(7.5-15)
     }
 
-
   DoubleVector clusterAoa, clusterAod, clusterZoa, clusterZod;
-  double angle;
-  for (uint8_t cIndex = 0; cIndex < numReducedCluster; cIndex++)
+  for (uint8_t cIndex = 0; cIndex < channelParams->m_reducedClusterNumber; cIndex++)
     {
-      angle = 2 * ASA * sqrt (-1 * log (clusterPowerForAngles[cIndex] / powerMax)) / 1.4 / C_phi;        //(7.5-9)
-      clusterAoa.push_back (angle);
-      angle = 2 * ASD * sqrt (-1 * log (clusterPowerForAngles[cIndex] / powerMax)) / 1.4 / C_phi;        //(7.5-9)
-      clusterAod.push_back (angle);
-      angle = -1 * ZSA * log (clusterPowerForAngles[cIndex] / powerMax) / C_theta;         //(7.5-14)
-      clusterZoa.push_back (angle);
-      angle = -1 * ZSD * log (clusterPowerForAngles[cIndex] / powerMax) / C_theta;
-      clusterZod.push_back (angle);
+      double logCalc = -1 * log (clusterPowerForAngles[cIndex] / powerMax);
+      double angle = 2 * sqrt (logCalc) / 1.4 / cPhi; //(7.5-9)
+      clusterAoa.push_back (ASA * angle);
+      clusterAod.push_back (ASD * angle);
+      angle = logCalc / cTheta; //(7.5-14)
+      clusterZoa.push_back (ZSA * angle);
+      clusterZod.push_back (ZSD * angle);
     }
 
-  for (uint8_t cIndex = 0; cIndex < numReducedCluster; cIndex++)
+  Angles sAngle (bMob->GetPosition (), aMob->GetPosition ());
+  Angles uAngle (aMob->GetPosition (), bMob->GetPosition ());
+
+  for (uint8_t cIndex = 0; cIndex < channelParams->m_reducedClusterNumber; cIndex++)
     {
       int Xn = 1;
-      if (m_uniformRv->GetValue (0,1) < 0.5)
+      if (m_uniformRv->GetValue (0, 1) < 0.5)
         {
           Xn = -1;
         }
       clusterAoa[cIndex] = clusterAoa[cIndex] * Xn + (m_normalRv->GetValue () * ASA / 7) + RadiansToDegrees (uAngle.GetAzimuth ());        //(7.5-11)
       clusterAod[cIndex] = clusterAod[cIndex] * Xn + (m_normalRv->GetValue () * ASD / 7) + RadiansToDegrees (sAngle.GetAzimuth ());
-      if (o2i)
+      if (channelCondition->IsO2i ())
         {
           clusterZoa[cIndex] = clusterZoa[cIndex] * Xn + (m_normalRv->GetValue () * ZSA / 7) + 90;            //(7.5-16)
         }
@@ -1348,140 +1479,147 @@
           clusterZoa[cIndex] = clusterZoa[cIndex] * Xn + (m_normalRv->GetValue () * ZSA / 7) + RadiansToDegrees (uAngle.GetInclination ());            //(7.5-16)
         }
       clusterZod[cIndex] = clusterZod[cIndex] * Xn + (m_normalRv->GetValue () * ZSD / 7) + RadiansToDegrees (sAngle.GetInclination ()) + table3gpp->m_offsetZOD;        //(7.5-19)
-
     }
 
-  if (los)
+  if (channelParams->m_losCondition == ChannelCondition::LOS)
     {
-      //The 7.5-12 can be rewrite as Theta_n,ZOA = Theta_n,ZOA - (Theta_1,ZOA - Theta_LOS,ZOA) = Theta_n,ZOA - diffZOA,
-      //Similar as AOD, ZSA and ZSD.
+      // The 7.5-12 can be rewrite as Theta_n,ZOA = Theta_n,ZOA - (Theta_1,ZOA - Theta_LOS,ZOA) = Theta_n,ZOA - diffZOA,
+      // Similar as AOD, ZSA and ZSD.
       double diffAoa = clusterAoa[0] - RadiansToDegrees (uAngle.GetAzimuth ());
       double diffAod = clusterAod[0] - RadiansToDegrees (sAngle.GetAzimuth ());
       double diffZsa = clusterZoa[0] - RadiansToDegrees (uAngle.GetInclination ());
       double diffZsd = clusterZod[0] - RadiansToDegrees (sAngle.GetInclination ());
 
-      for (uint8_t cIndex = 0; cIndex < numReducedCluster; cIndex++)
+      for (uint8_t cIndex = 0; cIndex < channelParams->m_reducedClusterNumber; cIndex++)
         {
           clusterAoa[cIndex] -= diffAoa; //(7.5-12)
           clusterAod[cIndex] -= diffAod;
           clusterZoa[cIndex] -= diffZsa; //(7.5-17)
           clusterZod[cIndex] -= diffZsd;
-
         }
     }
 
-  double rayAoa_radian[numReducedCluster][raysPerCluster]; //rayAoa_radian[n][m], where n is cluster index, m is ray index
-  double rayAod_radian[numReducedCluster][raysPerCluster]; //rayAod_radian[n][m], where n is cluster index, m is ray index
-  double rayZoa_radian[numReducedCluster][raysPerCluster]; //rayZoa_radian[n][m], where n is cluster index, m is ray index
-  double rayZod_radian[numReducedCluster][raysPerCluster]; //rayZod_radian[n][m], where n is cluster index, m is ray index
-
-  for (uint8_t nInd = 0; nInd < numReducedCluster; nInd++)
-    {
-      for (uint8_t mInd = 0; mInd < raysPerCluster; mInd++)
-        {
-          double tempAoa = clusterAoa[nInd] + table3gpp->m_cASA * offSetAlpha[mInd]; //(7.5-13)
-          double tempZoa = clusterZoa[nInd] + table3gpp->m_cZSA * offSetAlpha[mInd]; //(7.5-18)
-          std::tie (rayAoa_radian[nInd][mInd], rayZoa_radian[nInd][mInd]) = WrapAngles (DegreesToRadians (tempAoa), DegreesToRadians (tempZoa));
-
-          double tempAod = clusterAod[nInd] + table3gpp->m_cASD * offSetAlpha[mInd]; //(7.5-13)
-          double tempZod = clusterZod[nInd] + 0.375 * pow (10,table3gpp->m_uLgZSD) * offSetAlpha[mInd]; //(7.5-20)
-          std::tie (rayAod_radian[nInd][mInd], rayZod_radian[nInd][mInd]) = WrapAngles (DegreesToRadians (tempAod), DegreesToRadians (tempZod));
-        }
-    }
-  DoubleVector angle_degree;
   double sizeTemp = clusterZoa.size ();
   for (uint8_t ind = 0; ind < 4; ind++)
     {
+      DoubleVector angleDegree;
       switch (ind)
         {
           case 0:
-            angle_degree = clusterAoa;
+            angleDegree = clusterAoa;
             break;
           case 1:
-            angle_degree = clusterZoa;
+            angleDegree = clusterZoa;
             break;
           case 2:
-            angle_degree = clusterAod;
+            angleDegree = clusterAod;
             break;
           case 3:
-            angle_degree = clusterZod;
+            angleDegree = clusterZod;
             break;
           default:
             NS_FATAL_ERROR ("Programming Error");
         }
-
       for (uint8_t nIndex = 0; nIndex < sizeTemp; nIndex++)
         {
-          while (angle_degree[nIndex] > 360)
+          while (angleDegree[nIndex] > 360)
             {
-              angle_degree[nIndex] -= 360;
+              angleDegree[nIndex] -= 360;
             }
 
-          while (angle_degree[nIndex] < 0)
+          while (angleDegree[nIndex] < 0)
             {
-              angle_degree[nIndex] += 360;
+              angleDegree[nIndex] += 360;
             }
 
           if (ind == 1 || ind == 3)
             {
-              if (angle_degree[nIndex] > 180)
+              if (angleDegree[nIndex] > 180)
                 {
-                  angle_degree[nIndex] = 360 - angle_degree[nIndex];
+                  angleDegree[nIndex] = 360 - angleDegree[nIndex];
                 }
             }
         }
       switch (ind)
         {
           case 0:
-            clusterAoa = angle_degree;
+            clusterAoa = angleDegree;
             break;
           case 1:
-            clusterZoa = angle_degree;
+            clusterZoa = angleDegree;
             break;
           case 2:
-            clusterAod = angle_degree;
+            clusterAod = angleDegree;
             break;
           case 3:
-            clusterZod = angle_degree;
+            clusterZod = angleDegree;
             break;
           default:
             NS_FATAL_ERROR ("Programming Error");
         }
     }
 
-  DoubleVector attenuation_dB;
+  DoubleVector attenuationDb;
   if (m_blockage)
     {
-      attenuation_dB = CalcAttenuationOfBlockage (channelParams, clusterAoa, clusterZoa);
-      for (uint8_t cInd = 0; cInd < numReducedCluster; cInd++)
+      attenuationDb = CalcAttenuationOfBlockage (channelParams, clusterAoa, clusterZoa);
+      for (uint8_t cInd = 0; cInd < channelParams->m_reducedClusterNumber; cInd++)
         {
-          clusterPower[cInd] = clusterPower[cInd] / pow (10,attenuation_dB[cInd] / 10);
+          channelParams->m_clusterPower[cInd] = channelParams->m_clusterPower[cInd] / pow (10,attenuationDb[cInd] / 10);
         }
     }
   else
     {
-      attenuation_dB.push_back (0);
+      attenuationDb.push_back (0);
     }
 
+  // store attenuation
+  channelParams->m_attenuation_dB = attenuationDb;
+
   //Step 8: Coupling of rays within a cluster for both azimuth and elevation
   //shuffle all the arrays to perform random coupling
-  for (uint8_t cIndex = 0; cIndex < numReducedCluster; cIndex++)
+  MatrixBasedChannelModel::Double2DVector rayAoaRadian (channelParams->m_reducedClusterNumber, DoubleVector (table3gpp->m_raysPerCluster, 0)); //rayAoaRadian[n][m], where n is cluster index, m is ray index
+  MatrixBasedChannelModel::Double2DVector rayAodRadian (channelParams->m_reducedClusterNumber, DoubleVector (table3gpp->m_raysPerCluster, 0)); //rayAodRadian[n][m], where n is cluster index, m is ray index
+  MatrixBasedChannelModel::Double2DVector rayZoaRadian (channelParams->m_reducedClusterNumber, DoubleVector (table3gpp->m_raysPerCluster, 0)); //rayZoaRadian[n][m], where n is cluster index, m is ray index
+  MatrixBasedChannelModel::Double2DVector rayZodRadian (channelParams->m_reducedClusterNumber, DoubleVector (table3gpp->m_raysPerCluster, 0)); //rayZodRadian[n][m], where n is cluster index, m is ray index
+
+  for (uint8_t nInd = 0; nInd < channelParams->m_reducedClusterNumber; nInd++)
+    {
+      for (uint8_t mInd = 0; mInd < table3gpp->m_raysPerCluster; mInd++)
+        {
+          double tempAoa = clusterAoa[nInd] + table3gpp->m_cASA * offSetAlpha[mInd]; //(7.5-13)
+          double tempZoa = clusterZoa[nInd] + table3gpp->m_cZSA * offSetAlpha[mInd]; //(7.5-18)
+          std::tie (rayAoaRadian[nInd][mInd], rayZoaRadian[nInd][mInd]) = WrapAngles (DegreesToRadians (tempAoa), DegreesToRadians (tempZoa));
+
+          double tempAod = clusterAod[nInd] + table3gpp->m_cASD * offSetAlpha[mInd]; //(7.5-13)
+          double tempZod = clusterZod[nInd] + 0.375 * pow (10,table3gpp->m_uLgZSD) * offSetAlpha[mInd]; //(7.5-20)
+          std::tie (rayAodRadian[nInd][mInd], rayZodRadian[nInd][mInd]) = WrapAngles (DegreesToRadians (tempAod), DegreesToRadians (tempZod));
+        }
+    }
+
+  for (uint8_t cIndex = 0; cIndex < channelParams->m_reducedClusterNumber; cIndex++)
     {
-      Shuffle (&rayAod_radian[cIndex][0], &rayAod_radian[cIndex][raysPerCluster]);
-      Shuffle (&rayAoa_radian[cIndex][0], &rayAoa_radian[cIndex][raysPerCluster]);
-      Shuffle (&rayZod_radian[cIndex][0], &rayZod_radian[cIndex][raysPerCluster]);
-      Shuffle (&rayZoa_radian[cIndex][0], &rayZoa_radian[cIndex][raysPerCluster]);
+      Shuffle (&rayAodRadian[cIndex][0], &rayAodRadian[cIndex][table3gpp->m_raysPerCluster]);
+      Shuffle (&rayAoaRadian[cIndex][0], &rayAoaRadian[cIndex][table3gpp->m_raysPerCluster]);
+      Shuffle (&rayZodRadian[cIndex][0], &rayZodRadian[cIndex][table3gpp->m_raysPerCluster]);
+      Shuffle (&rayZoaRadian[cIndex][0], &rayZoaRadian[cIndex][table3gpp->m_raysPerCluster]);
     }
 
+  // store values
+  channelParams->m_rayAodRadian = rayAodRadian;
+  channelParams->m_rayAoaRadian = rayAoaRadian;
+  channelParams->m_rayZodRadian = rayZodRadian;
+  channelParams->m_rayZoaRadian = rayZoaRadian;
+
   //Step 9: Generate the cross polarization power ratios
   //Step 10: Draw initial phases
   Double2DVector crossPolarizationPowerRatios; // vector containing the cross polarization power ratios, as defined by 7.5-21
-  Double3DVector clusterPhase; //rayAoa_radian[n][m], where n is cluster index, m is ray index
-  for (uint8_t nInd = 0; nInd < numReducedCluster; nInd++)
+  Double3DVector clusterPhase; //rayAoaRadian[n][m], where n is cluster index, m is ray index
+  for (uint8_t nInd = 0; nInd < channelParams->m_reducedClusterNumber; nInd++)
     {
       DoubleVector temp; // used to store the XPR values
       Double2DVector temp2; // used to store the PHI values for all the possible combination of polarization
-      for (uint8_t mInd = 0; mInd < raysPerCluster; mInd++)
+      for (uint8_t mInd = 0; mInd < table3gpp->m_raysPerCluster; mInd++)
         {
           double uXprLinear = pow (10, table3gpp->m_uXpr / 10); // convert to linear
           double sigXprLinear = pow (10, table3gpp->m_sigXpr / 10); // convert to linear
@@ -1497,52 +1635,228 @@
       crossPolarizationPowerRatios.push_back (temp);
       clusterPhase.push_back (temp2);
     }
+  // store the cluster phase
   channelParams->m_clusterPhase = clusterPhase;
-
-  //Step 11: Generate channel coefficients for each cluster n and each receiver
-  // and transmitter element pair u,s.
-
-  Complex3DVector H_NLOS; // channel coefficients H_NLOS [u][s][n],
-  // where u and s are receive and transmit antenna element, n is cluster index.
-  uint64_t uSize = uAntenna->GetNumberOfElements ();
-  uint64_t sSize = sAntenna->GetNumberOfElements ();
+  channelParams->m_crossPolarizationPowerRatios = crossPolarizationPowerRatios;
 
   uint8_t cluster1st = 0, cluster2nd = 0; // first and second strongest cluster;
   double maxPower = 0;
-  for (uint8_t cIndex = 0; cIndex < numReducedCluster; cIndex++)
+  for (uint8_t cIndex = 0; cIndex < channelParams->m_reducedClusterNumber; cIndex++)
     {
-      if (maxPower < clusterPower[cIndex])
+      if (maxPower < channelParams->m_clusterPower[cIndex])
         {
-          maxPower = clusterPower[cIndex];
+          maxPower = channelParams->m_clusterPower[cIndex];
           cluster1st = cIndex;
         }
     }
+  channelParams->m_cluster1st = cluster1st;
   maxPower = 0;
-  for (uint8_t cIndex = 0; cIndex < numReducedCluster; cIndex++)
+  for (uint8_t cIndex = 0; cIndex < channelParams->m_reducedClusterNumber; cIndex++)
     {
-      if (maxPower < clusterPower[cIndex] && cluster1st != cIndex)
+      if (maxPower < channelParams->m_clusterPower[cIndex] && cluster1st != cIndex)
         {
-          maxPower = clusterPower[cIndex];
+          maxPower = channelParams->m_clusterPower[cIndex];
           cluster2nd = cIndex;
         }
     }
+  channelParams->m_cluster2nd = cluster2nd;
 
-  NS_LOG_INFO ("1st strongest cluster:" << (int)cluster1st << ", 2nd strongest cluster:" << (int)cluster2nd);
+  NS_LOG_INFO ("1st strongest cluster:" << +cluster1st
+                                        << ", 2nd strongest cluster:" << +cluster2nd);
+
+  // store the delays and the angles for the subclusters
+  if (cluster1st == cluster2nd)
+    {
+      clusterDelay.push_back (clusterDelay[cluster1st] + 1.28 * table3gpp->m_cDS);
+      clusterDelay.push_back (clusterDelay[cluster1st] + 2.56 * table3gpp->m_cDS);
 
-  Complex3DVector H_usn;  //channel coffecient H_usn[u][s][n];
+      clusterAoa.push_back (clusterAoa[cluster1st]);
+      clusterAoa.push_back (clusterAoa[cluster1st]);
+
+      clusterZoa.push_back (clusterZoa[cluster1st]);
+      clusterZoa.push_back (clusterZoa[cluster1st]);
+
+      clusterAod.push_back (clusterAod[cluster1st]);
+      clusterAod.push_back (clusterAod[cluster1st]);
+
+      clusterZod.push_back (clusterZod[cluster1st]);
+      clusterZod.push_back (clusterZod[cluster1st]);
+    }
+  else
+    {
+      double min, max;
+      if (cluster1st < cluster2nd)
+        {
+          min = cluster1st;
+          max = cluster2nd;
+        }
+      else
+        {
+          min = cluster2nd;
+          max = cluster1st;
+        }
+      clusterDelay.push_back (clusterDelay[min] + 1.28 * table3gpp->m_cDS);
+      clusterDelay.push_back (clusterDelay[min] + 2.56 * table3gpp->m_cDS);
+      clusterDelay.push_back (clusterDelay[max] + 1.28 * table3gpp->m_cDS);
+      clusterDelay.push_back (clusterDelay[max] + 2.56 * table3gpp->m_cDS);
+
+      clusterAoa.push_back (clusterAoa[min]);
+      clusterAoa.push_back (clusterAoa[min]);
+      clusterAoa.push_back (clusterAoa[max]);
+      clusterAoa.push_back (clusterAoa[max]);
+
+      clusterZoa.push_back (clusterZoa[min]);
+      clusterZoa.push_back (clusterZoa[min]);
+      clusterZoa.push_back (clusterZoa[max]);
+      clusterZoa.push_back (clusterZoa[max]);
+
+      clusterAod.push_back (clusterAod[min]);
+      clusterAod.push_back (clusterAod[min]);
+      clusterAod.push_back (clusterAod[max]);
+      clusterAod.push_back (clusterAod[max]);
+
+      clusterZod.push_back (clusterZod[min]);
+      clusterZod.push_back (clusterZod[min]);
+      clusterZod.push_back (clusterZod[max]);
+      clusterZod.push_back (clusterZod[max]);
+
+
+    }
+
+  channelParams->m_delay = clusterDelay;
+  channelParams->m_angle.clear ();
+  channelParams->m_angle.push_back (clusterAoa);
+  channelParams->m_angle.push_back (clusterZoa);
+  channelParams->m_angle.push_back (clusterAod);
+  channelParams->m_angle.push_back (clusterZod);
+
+  // Compute alpha and D as described in 3GPP TR 37.885 v15.3.0, Sec. 6.2.3
+  // These terms account for an additional Doppler contribution due to the
+  // presence of moving objects in the surrounding environment, such as in
+  // vehicular scenarios.
+  // This contribution is applied only to the delayed (reflected) paths and
+  // must be properly configured by setting the value of
+  // m_vScatt, which is defined as "maximum speed of the vehicle in the
+  // layout".
+  // By default, m_vScatt is set to 0, so there is no additional Doppler
+  // contribution.
+
+  DoubleVector dopplerTermAlpha, dopplerTermD;
+
+  // 2 or 4 is added to account for additional subrays for the 1st and 2nd clusters, if there is only one cluster then would be added 2 more subrays (see creation of Husn channel matrix)
+  uint8_t updatedClusterNumber = (channelParams->m_reducedClusterNumber == 1) ? channelParams->m_reducedClusterNumber + 2 : channelParams->m_reducedClusterNumber + 4;
+
+  for (uint8_t cIndex = 0; cIndex < updatedClusterNumber ; cIndex++)
+    {
+      double alpha = 0;
+      double D = 0;
+      if (cIndex != 0)
+      {
+        alpha = m_uniformRvDoppler->GetValue (-1, 1);
+        D = m_uniformRvDoppler->GetValue (-m_vScatt, m_vScatt);
+      }
+      dopplerTermAlpha.push_back (alpha);
+      dopplerTermD.push_back (D);
+    }
+  channelParams->m_alpha = dopplerTermAlpha;
+  channelParams->m_D = dopplerTermD;
+
+  return channelParams;
+}
+
+Ptr<MatrixBasedChannelModel::ChannelMatrix>
+ThreeGppChannelModel::GetNewChannel (Ptr<const ThreeGppChannelParams> channelParams,
+                                     Ptr<const ParamsTable> table3gpp,
+                                     const Ptr<const MobilityModel> sMob,
+                                     const Ptr<const MobilityModel> uMob,
+                                     Ptr<const PhasedArrayModel> sAntenna,
+                                     Ptr<const PhasedArrayModel> uAntenna
+                                     ) const
+{
+  NS_LOG_FUNCTION (this);
+
+  NS_ASSERT_MSG (m_frequency > 0.0, "Set the operating frequency first!");
+
+  // create a channel matrix instance
+  Ptr<ChannelMatrix> channelMatrix = Create<ChannelMatrix> ();
+  channelMatrix->m_generatedTime = Simulator::Now ();
+  // save in which order is generated this matrix
+  channelMatrix->m_nodeIds = std::make_pair (sMob->GetObject<Node> ()->GetId (), uMob->GetObject<Node> ()->GetId ());
+  // check if channelParams structure is generated in direction s-to-u or u-to-s
+  bool isSameDirection = (channelParams->m_nodeIds == channelMatrix->m_nodeIds);
+
+  MatrixBasedChannelModel::Double2DVector rayAodRadian;
+  MatrixBasedChannelModel::Double2DVector rayAoaRadian;
+  MatrixBasedChannelModel::Double2DVector rayZodRadian;
+  MatrixBasedChannelModel::Double2DVector rayZoaRadian;
+
+  // if channel params is generated in the same direction in which we
+  // generate the channel matrix, angles and zenit od departure and arrival are ok,
+  // just set them to corresponding variable that will be used for the generation
+  // of channel matrix, otherwise we need to flip angles and zenits of departure and arrival
+  if (isSameDirection)
+    {
+      rayAodRadian = channelParams->m_rayAodRadian;
+      rayAoaRadian = channelParams->m_rayAoaRadian;
+      rayZodRadian = channelParams->m_rayZodRadian;
+      rayZoaRadian = channelParams->m_rayZoaRadian;
+    }
+  else
+    {
+      rayAodRadian = channelParams->m_rayAoaRadian;
+      rayAoaRadian = channelParams->m_rayAodRadian;
+      rayZodRadian = channelParams->m_rayZoaRadian;
+      rayZoaRadian = channelParams->m_rayZodRadian;
+    }
+
+  //Step 11: Generate channel coefficients for each cluster n and each receiver
+  // and transmitter element pair u,s.
+  Complex3DVector hUsn;  //channel coffecient hUsn[u][s][n];
+  // where u and s are receive and transmit antenna element, n is cluster index.
   // NOTE Since each of the strongest 2 clusters are divided into 3 sub-clusters,
   // the total cluster will be numReducedCLuster + 4.
+  uint64_t uSize = uAntenna->GetNumberOfElements ();
+  uint64_t sSize = sAntenna->GetNumberOfElements ();
 
-  H_usn.resize (uSize);
+  hUsn.resize (uSize);
   for (uint64_t uIndex = 0; uIndex < uSize; uIndex++)
     {
-      H_usn[uIndex].resize (sSize);
+      hUsn[uIndex].resize (sSize);
       for (uint64_t sIndex = 0; sIndex < sSize; sIndex++)
         {
-          H_usn[uIndex][sIndex].resize (numReducedCluster);
+          hUsn[uIndex][sIndex].resize (channelParams->m_reducedClusterNumber);
         }
     }
 
+  NS_ASSERT (channelParams->m_reducedClusterNumber <= channelParams->m_clusterPhase.size ());
+  NS_ASSERT (channelParams->m_reducedClusterNumber <= channelParams->m_clusterPower.size ());
+  NS_ASSERT (channelParams->m_reducedClusterNumber <= channelParams->m_crossPolarizationPowerRatios.size ());
+  NS_ASSERT (channelParams->m_reducedClusterNumber <= rayZoaRadian.size ());
+  NS_ASSERT (channelParams->m_reducedClusterNumber <= rayZodRadian.size ());
+  NS_ASSERT (channelParams->m_reducedClusterNumber <= rayAoaRadian.size ());
+  NS_ASSERT (channelParams->m_reducedClusterNumber <= rayAodRadian.size ());
+  NS_ASSERT (table3gpp->m_raysPerCluster <= channelParams->m_clusterPhase[0].size ());
+  NS_ASSERT (table3gpp->m_raysPerCluster <= channelParams->m_crossPolarizationPowerRatios[0].size ());
+  NS_ASSERT (table3gpp->m_raysPerCluster <= rayZoaRadian[0].size ());
+  NS_ASSERT (table3gpp->m_raysPerCluster <= rayZodRadian[0].size ());
+  NS_ASSERT (table3gpp->m_raysPerCluster <= rayAoaRadian[0].size ());
+  NS_ASSERT (table3gpp->m_raysPerCluster <= rayAodRadian[0].size ());
+
+
+  double x = sMob->GetPosition ().x - uMob->GetPosition ().x;
+  double y = sMob->GetPosition ().y - uMob->GetPosition ().y;
+  double distance2D = sqrt (x * x + y * y);
+  // NOTE we assume hUT = min (height(a), height(b)) and
+  // hBS = max (height (a), height (b))
+  double hUt = std::min (sMob->GetPosition ().z, uMob->GetPosition ().z);
+  double hBs = std::max (sMob->GetPosition ().z, uMob->GetPosition ().z);
+  // compute the 3D distance using eq. 7.4-1
+  double distance3D = std::sqrt (distance2D * distance2D + (hBs - hUt) * (hBs - hUt));
+
+  Angles sAngle (uMob->GetPosition (), sMob->GetPosition ());
+  Angles uAngle (sMob->GetPosition (), uMob->GetPosition ());
+
+
   // The following for loops computes the channel coefficients
   for (uint64_t uIndex = 0; uIndex < uSize; uIndex++)
     {
@@ -1550,67 +1864,74 @@
 
       for (uint64_t sIndex = 0; sIndex < sSize; sIndex++)
         {
-
           Vector sLoc = sAntenna->GetElementLocation (sIndex);
 
-          for (uint8_t nIndex = 0; nIndex < numReducedCluster; nIndex++)
+          for (uint8_t nIndex = 0; nIndex < channelParams->m_reducedClusterNumber; nIndex++)
             {
               //Compute the N-2 weakest cluster, assuming 0 slant angle and a
               //polarization slant angle configured in the array (7.5-22)
-              if (nIndex != cluster1st && nIndex != cluster2nd)
+              if (nIndex != channelParams->m_cluster1st && nIndex != channelParams->m_cluster2nd)
                 {
                   std::complex<double> rays (0,0);
-                  for (uint8_t mIndex = 0; mIndex < raysPerCluster; mIndex++)
+                  for (uint8_t mIndex = 0; mIndex < table3gpp->m_raysPerCluster; mIndex++)
                     {
-                      DoubleVector initialPhase = clusterPhase[nIndex][mIndex];
-                      double k = crossPolarizationPowerRatios[nIndex][mIndex];
+                      DoubleVector initialPhase = channelParams->m_clusterPhase[nIndex][mIndex];
+                      double k = channelParams->m_crossPolarizationPowerRatios[nIndex][mIndex];
                       //lambda_0 is accounted in the antenna spacing uLoc and sLoc.
-                      double rxPhaseDiff = 2 * M_PI * (sin (rayZoa_radian[nIndex][mIndex]) * cos (rayAoa_radian[nIndex][mIndex]) * uLoc.x
-                                                       + sin (rayZoa_radian[nIndex][mIndex]) * sin (rayAoa_radian[nIndex][mIndex]) * uLoc.y
-                                                       + cos (rayZoa_radian[nIndex][mIndex]) * uLoc.z);
-
-                      double txPhaseDiff = 2 * M_PI * (sin (rayZod_radian[nIndex][mIndex]) * cos (rayAod_radian[nIndex][mIndex]) * sLoc.x
-                                                       + sin (rayZod_radian[nIndex][mIndex]) * sin (rayAod_radian[nIndex][mIndex]) * sLoc.y
-                                                       + cos (rayZod_radian[nIndex][mIndex]) * sLoc.z);
-                      // NOTE Doppler is computed in the CalcBeamformingGain function and is simplified to only account for the center anngle of each cluster.
+                      double rxPhaseDiff = 2 * M_PI * (sin (rayZoaRadian[nIndex][mIndex]) * cos (rayAoaRadian[nIndex][mIndex]) * uLoc.x
+                                                       + sin (rayZoaRadian[nIndex][mIndex]) * sin (rayAoaRadian[nIndex][mIndex]) * uLoc.y
+                                                       + cos (rayZoaRadian[nIndex][mIndex]) * uLoc.z);
+
+                      double txPhaseDiff = 2 * M_PI * (sin (rayZodRadian[nIndex][mIndex]) * cos (rayAodRadian[nIndex][mIndex]) * sLoc.x
+                                                       + sin (rayZodRadian[nIndex][mIndex]) * sin (rayAodRadian[nIndex][mIndex]) * sLoc.y
+                                                       + cos (rayZodRadian[nIndex][mIndex]) * sLoc.z);
+                      // NOTE Doppler is computed in the CalcBeamformingGain function and is simplified to only account for the center angle of each cluster.
 
                       double rxFieldPatternPhi, rxFieldPatternTheta, txFieldPatternPhi, txFieldPatternTheta;
-                      std::tie (rxFieldPatternPhi, rxFieldPatternTheta) = uAntenna->GetElementFieldPattern (Angles (rayAoa_radian[nIndex][mIndex], rayZoa_radian[nIndex][mIndex]));
-                      std::tie (txFieldPatternPhi, txFieldPatternTheta) = sAntenna->GetElementFieldPattern (Angles (rayAod_radian[nIndex][mIndex], rayZod_radian[nIndex][mIndex]));
-
-                      rays += (exp (std::complex<double> (0, initialPhase[0])) * rxFieldPatternTheta * txFieldPatternTheta +
-                               +exp (std::complex<double> (0, initialPhase[1])) * std::sqrt (1 / k) * rxFieldPatternTheta * txFieldPatternPhi +
-                               +exp (std::complex<double> (0, initialPhase[2])) * std::sqrt (1 / k) * rxFieldPatternPhi * txFieldPatternTheta +
-                               +exp (std::complex<double> (0, initialPhase[3])) * rxFieldPatternPhi * txFieldPatternPhi)
-                        * exp (std::complex<double> (0, rxPhaseDiff))
-                        * exp (std::complex<double> (0, txPhaseDiff));
+                      std::tie (rxFieldPatternPhi, rxFieldPatternTheta) = uAntenna->GetElementFieldPattern (Angles (channelParams->m_rayAoaRadian[nIndex][mIndex], channelParams->m_rayZoaRadian[nIndex][mIndex]));
+                      std::tie (txFieldPatternPhi, txFieldPatternTheta) = sAntenna->GetElementFieldPattern (Angles (channelParams->m_rayAodRadian[nIndex][mIndex], channelParams->m_rayZodRadian[nIndex][mIndex]));
+                      NS_ASSERT (4 <= initialPhase.size ());
+                      rays += (std::complex<double> (cos (initialPhase[0]), sin (initialPhase[0])) * rxFieldPatternTheta * txFieldPatternTheta +
+                               std::complex<double> (cos (initialPhase[1]), sin (initialPhase[1])) * std::sqrt (1 / k) * rxFieldPatternTheta * txFieldPatternPhi +
+                               std::complex<double> (cos (initialPhase[2]), sin (initialPhase[2])) * std::sqrt (1 / k) * rxFieldPatternPhi * txFieldPatternTheta +
+                               std::complex<double> (cos (initialPhase[3]), sin (initialPhase[3])) * rxFieldPatternPhi * txFieldPatternPhi)
+                        * std::complex<double> (cos (rxPhaseDiff), sin (rxPhaseDiff))
+                        * std::complex<double> (cos (txPhaseDiff), sin (txPhaseDiff));
                     }
-                  rays *= sqrt (clusterPower[nIndex] / raysPerCluster);
-                  H_usn[uIndex][sIndex][nIndex] = rays;
+                  rays *= sqrt (channelParams->m_clusterPower[nIndex] / table3gpp->m_raysPerCluster);
+                  hUsn[uIndex][sIndex][nIndex] = rays;
                 }
               else  //(7.5-28)
                 {
-                  std::complex<double> raysSub1 (0,0);
-                  std::complex<double> raysSub2 (0,0);
-                  std::complex<double> raysSub3 (0,0);
+                  std::complex<double> raysSub1 (0, 0);
+                  std::complex<double> raysSub2 (0, 0);
+                  std::complex<double> raysSub3 (0, 0);
 
-                  for (uint8_t mIndex = 0; mIndex < raysPerCluster; mIndex++)
+                  for (uint8_t mIndex = 0; mIndex < table3gpp->m_raysPerCluster; mIndex++)
                     {
-                      double k = crossPolarizationPowerRatios[nIndex][mIndex];
+                      double k = channelParams->m_crossPolarizationPowerRatios[nIndex][mIndex];
 
                       //ZML:Just remind me that the angle offsets for the 3 subclusters were not generated correctly.
+                      DoubleVector initialPhase = channelParams->m_clusterPhase[nIndex][mIndex];
+                      NS_ASSERT (4 <= initialPhase.size ());
 
-                      DoubleVector initialPhase = clusterPhase[nIndex][mIndex];
-                      double rxPhaseDiff = 2 * M_PI * (sin (rayZoa_radian[nIndex][mIndex]) * cos (rayAoa_radian[nIndex][mIndex]) * uLoc.x
-                                                       + sin (rayZoa_radian[nIndex][mIndex]) * sin (rayAoa_radian[nIndex][mIndex]) * uLoc.y
-                                                       + cos (rayZoa_radian[nIndex][mIndex]) * uLoc.z);
-                      double txPhaseDiff = 2 * M_PI * (sin (rayZod_radian[nIndex][mIndex]) * cos (rayAod_radian[nIndex][mIndex]) * sLoc.x
-                                                       + sin (rayZod_radian[nIndex][mIndex]) * sin (rayAod_radian[nIndex][mIndex]) * sLoc.y
-                                                       + cos (rayZod_radian[nIndex][mIndex]) * sLoc.z);
+                      double rxPhaseDiff = 2 * M_PI * (sin (rayZoaRadian[nIndex][mIndex]) * cos (rayAoaRadian[nIndex][mIndex]) * uLoc.x
+                                                       + sin (rayZoaRadian[nIndex][mIndex]) * sin (rayAoaRadian[nIndex][mIndex]) * uLoc.y
+                                                       + cos (rayZoaRadian[nIndex][mIndex]) * uLoc.z);
+                      double txPhaseDiff = 2 * M_PI * (sin (rayZodRadian[nIndex][mIndex]) * cos (rayAodRadian[nIndex][mIndex]) * sLoc.x
+                                                       + sin (rayZodRadian[nIndex][mIndex]) * sin (rayAodRadian[nIndex][mIndex]) * sLoc.y
+                                                       + cos (rayZodRadian[nIndex][mIndex]) * sLoc.z);
 
                       double rxFieldPatternPhi, rxFieldPatternTheta, txFieldPatternPhi, txFieldPatternTheta;
-                      std::tie (rxFieldPatternPhi, rxFieldPatternTheta) = uAntenna->GetElementFieldPattern (Angles (rayAoa_radian[nIndex][mIndex], rayZoa_radian[nIndex][mIndex]));
-                      std::tie (txFieldPatternPhi, txFieldPatternTheta) = sAntenna->GetElementFieldPattern (Angles (rayAod_radian[nIndex][mIndex], rayZod_radian[nIndex][mIndex]));
+                      std::tie (rxFieldPatternPhi, rxFieldPatternTheta) = uAntenna->GetElementFieldPattern (Angles (rayAoaRadian[nIndex][mIndex], rayZoaRadian[nIndex][mIndex]));
+                      std::tie (txFieldPatternPhi, txFieldPatternTheta) = sAntenna->GetElementFieldPattern (Angles (rayAodRadian[nIndex][mIndex], rayZodRadian[nIndex][mIndex]));
+
+                      std::complex<double> raySub = (std::complex<double> (cos (initialPhase[0]), sin (initialPhase[0])) * rxFieldPatternTheta * txFieldPatternTheta +
+                                                     std::complex<double> (cos (initialPhase[1]), sin (initialPhase[1])) * sqrt (1 / k) * rxFieldPatternTheta * txFieldPatternPhi +
+                                                     std::complex<double> (cos (initialPhase[2]), sin (initialPhase[2])) * sqrt (1 / k) * rxFieldPatternPhi * txFieldPatternTheta +
+                                                     std::complex<double> (cos (initialPhase[3]), sin (initialPhase[3])) * rxFieldPatternPhi * txFieldPatternPhi)
+                        * std::complex<double> (cos (rxPhaseDiff), sin (rxPhaseDiff))
+                        * std::complex<double> (cos (txPhaseDiff), sin (txPhaseDiff));
 
                       switch (mIndex)
                         {
@@ -1620,46 +1941,31 @@
                           case 12:
                           case 17:
                           case 18:
-                            raysSub2 += (exp (std::complex<double> (0, initialPhase[0])) * rxFieldPatternTheta * txFieldPatternTheta +
-                                         +exp (std::complex<double> (0, initialPhase[1])) * std::sqrt (1 / k) * rxFieldPatternTheta * txFieldPatternPhi +
-                                         +exp (std::complex<double> (0, initialPhase[2])) * std::sqrt (1 / k) * rxFieldPatternPhi * txFieldPatternTheta +
-                                         +exp (std::complex<double> (0, initialPhase[3])) * rxFieldPatternPhi * txFieldPatternPhi)
-                              * exp (std::complex<double> (0, rxPhaseDiff))
-                              * exp (std::complex<double> (0, txPhaseDiff));
+                            raysSub2 += raySub;
                             break;
                           case 13:
                           case 14:
                           case 15:
                           case 16:
-                            raysSub3 += (exp (std::complex<double> (0, initialPhase[0])) * rxFieldPatternTheta * txFieldPatternTheta +
-                                         +exp (std::complex<double> (0, initialPhase[1])) * std::sqrt (1 / k) * rxFieldPatternTheta * txFieldPatternPhi +
-                                         +exp (std::complex<double> (0, initialPhase[2])) * std::sqrt (1 / k) * rxFieldPatternPhi * txFieldPatternTheta +
-                                         +exp (std::complex<double> (0, initialPhase[3])) * rxFieldPatternPhi * txFieldPatternPhi)
-                              * exp (std::complex<double> (0, rxPhaseDiff))
-                              * exp (std::complex<double> (0, txPhaseDiff));
+                            raysSub3 += raySub;
                             break;
                           default:                      //case 1,2,3,4,5,6,7,8,19,20
-                            raysSub1 += (exp (std::complex<double> (0, initialPhase[0])) * rxFieldPatternTheta * txFieldPatternTheta +
-                                         +exp (std::complex<double> (0, initialPhase[1])) * std::sqrt (1 / k) * rxFieldPatternTheta * txFieldPatternPhi +
-                                         +exp (std::complex<double> (0, initialPhase[2])) * std::sqrt (1 / k) * rxFieldPatternPhi * txFieldPatternTheta +
-                                         +exp (std::complex<double> (0, initialPhase[3])) * rxFieldPatternPhi * txFieldPatternPhi)
-                              * exp (std::complex<double> (0, rxPhaseDiff))
-                              * exp (std::complex<double> (0, txPhaseDiff));
+                            raysSub1 += raySub;
                             break;
                         }
                     }
-                  raysSub1 *= sqrt (clusterPower[nIndex] / raysPerCluster);
-                  raysSub2 *= sqrt (clusterPower[nIndex] / raysPerCluster);
-                  raysSub3 *= sqrt (clusterPower[nIndex] / raysPerCluster);
-                  H_usn[uIndex][sIndex][nIndex] = raysSub1;
-                  H_usn[uIndex][sIndex].push_back (raysSub2);
-                  H_usn[uIndex][sIndex].push_back (raysSub3);
-
+                  raysSub1 *= sqrt (channelParams->m_clusterPower[nIndex] / table3gpp->m_raysPerCluster);
+                  raysSub2 *= sqrt (channelParams->m_clusterPower[nIndex] / table3gpp->m_raysPerCluster);
+                  raysSub3 *= sqrt (channelParams->m_clusterPower[nIndex] / table3gpp->m_raysPerCluster);
+                  hUsn[uIndex][sIndex][nIndex] = raysSub1;
+                  hUsn[uIndex][sIndex].push_back (raysSub2);
+                  hUsn[uIndex][sIndex].push_back (raysSub3);
                 }
             }
-          if (los) //(7.5-29) && (7.5-30)
+
+          if (channelParams->m_losCondition == ChannelCondition::LOS) //(7.5-29) && (7.5-30)
             {
-              std::complex<double> ray (0,0);
+              std::complex<double> ray (0, 0);
               double rxPhaseDiff = 2 * M_PI * (sin (uAngle.GetInclination ()) * cos (uAngle.GetAzimuth ()) * uLoc.x
                                                + sin (uAngle.GetInclination ()) * sin (uAngle.GetAzimuth ()) * uLoc.y
                                                + cos (uAngle.GetInclination ()) * uLoc.z);
@@ -1674,94 +1980,36 @@
               double lambda = 3e8 / m_frequency; // the wavelength of the carrier frequency
 
               ray = (rxFieldPatternTheta * txFieldPatternTheta - rxFieldPatternPhi * txFieldPatternPhi)
-                * exp (std::complex<double> (0, -2 * M_PI * dis3D / lambda))
-                * exp (std::complex<double> (0, rxPhaseDiff))
-                * exp (std::complex<double> (0, txPhaseDiff));
+                * std::complex<double> (cos (-2 * M_PI * distance3D / lambda), sin (-2 * M_PI * distance3D / lambda))
+                * std::complex<double> (cos (rxPhaseDiff), sin (rxPhaseDiff))
+                * std::complex<double> (cos (txPhaseDiff), sin (txPhaseDiff));
 
-              double K_linear = pow (10,K_factor / 10);
+              double kLinear = pow (10, channelParams->m_K_factor / 10);
               // the LOS path should be attenuated if blockage is enabled.
-              H_usn[uIndex][sIndex][0] = sqrt (1 / (K_linear + 1)) * H_usn[uIndex][sIndex][0] + sqrt (K_linear / (1 + K_linear)) * ray / pow (10,attenuation_dB[0] / 10);           //(7.5-30) for tau = tau1
-              double tempSize = H_usn[uIndex][sIndex].size ();
+              hUsn[uIndex][sIndex][0] = sqrt (1 / (kLinear + 1)) * hUsn[uIndex][sIndex][0] + sqrt (kLinear / (1 + kLinear)) * ray / pow (10, channelParams->m_attenuation_dB[0] / 10);           //(7.5-30) for tau = tau1
+              double tempSize = hUsn[uIndex][sIndex].size ();
               for (uint8_t nIndex = 1; nIndex < tempSize; nIndex++)
                 {
-                  H_usn[uIndex][sIndex][nIndex] *= sqrt (1 / (K_linear + 1)); //(7.5-30) for tau = tau2...taunN
+                  hUsn[uIndex][sIndex][nIndex] *= sqrt (1 / (kLinear + 1)); //(7.5-30) for tau = tau2...taunN
                 }
-
             }
         }
     }
 
-  // store the delays and the angles for the subclusters
-  if (cluster1st == cluster2nd)
+  NS_LOG_DEBUG ("Husn (sAntenna, uAntenna):" << sAntenna->GetId () << ", " << uAntenna->GetId ());
+  for (auto& i:hUsn)
     {
-      clusterDelay.push_back (clusterDelay[cluster1st] + 1.28 * table3gpp->m_cDS);
-      clusterDelay.push_back (clusterDelay[cluster1st] + 2.56 * table3gpp->m_cDS);
-
-      clusterAoa.push_back (clusterAoa[cluster1st]);
-      clusterAoa.push_back (clusterAoa[cluster1st]);
-
-      clusterZoa.push_back (clusterZoa[cluster1st]);
-      clusterZoa.push_back (clusterZoa[cluster1st]);
-
-      clusterAod.push_back (clusterAod[cluster1st]);
-      clusterAod.push_back (clusterAod[cluster1st]);
-
-      clusterZod.push_back (clusterZod[cluster1st]);
-      clusterZod.push_back (clusterZod[cluster1st]);
-    }
-  else
-    {
-      double min, max;
-      if (cluster1st < cluster2nd)
-        {
-          min = cluster1st;
-          max = cluster2nd;
-        }
-      else
+      for (auto& j:i)
         {
-          min = cluster2nd;
-          max = cluster1st;
+          for (auto& k:j)
+            {
+              NS_LOG_DEBUG (" " << k << ",");
+            }
         }
-      clusterDelay.push_back (clusterDelay[min] + 1.28 * table3gpp->m_cDS);
-      clusterDelay.push_back (clusterDelay[min] + 2.56 * table3gpp->m_cDS);
-      clusterDelay.push_back (clusterDelay[max] + 1.28 * table3gpp->m_cDS);
-      clusterDelay.push_back (clusterDelay[max] + 2.56 * table3gpp->m_cDS);
-
-      clusterAoa.push_back (clusterAoa[min]);
-      clusterAoa.push_back (clusterAoa[min]);
-      clusterAoa.push_back (clusterAoa[max]);
-      clusterAoa.push_back (clusterAoa[max]);
-
-      clusterZoa.push_back (clusterZoa[min]);
-      clusterZoa.push_back (clusterZoa[min]);
-      clusterZoa.push_back (clusterZoa[max]);
-      clusterZoa.push_back (clusterZoa[max]);
-
-      clusterAod.push_back (clusterAod[min]);
-      clusterAod.push_back (clusterAod[min]);
-      clusterAod.push_back (clusterAod[max]);
-      clusterAod.push_back (clusterAod[max]);
-
-      clusterZod.push_back (clusterZod[min]);
-      clusterZod.push_back (clusterZod[min]);
-      clusterZod.push_back (clusterZod[max]);
-      clusterZod.push_back (clusterZod[max]);
-
-
     }
-
-  NS_LOG_INFO ("size of coefficient matrix =[" << H_usn.size () << "][" << H_usn[0].size () << "][" << H_usn[0][0].size () << "]");
-
-  channelParams->m_channel = H_usn;
-  channelParams->m_delay = clusterDelay;
-
-  channelParams->m_angle.clear ();
-  channelParams->m_angle.push_back (clusterAoa);
-  channelParams->m_angle.push_back (clusterZoa);
-  channelParams->m_angle.push_back (clusterAod);
-  channelParams->m_angle.push_back (clusterZod);
-
-  return channelParams;
+  NS_LOG_INFO ("size of coefficient matrix =[" << hUsn.size () << "][" << hUsn[0].size () << "][" << hUsn[0][0].size () << "]");
+  channelMatrix->m_channel = hUsn;
+  return channelMatrix;
 }
 
 std::pair<double, double>
@@ -1769,11 +2017,11 @@
 {
   inclinationRad = WrapTo2Pi (inclinationRad);
   if (inclinationRad > M_PI)
-  {
-    // inclination must be in [0, M_PI]
-    inclinationRad -= M_PI;
-    azimuthRad += M_PI;
-  }
+    {
+      // inclination must be in [0, M_PI]
+      inclinationRad -= M_PI;
+      azimuthRad += M_PI;
+    }
 
   azimuthRad = WrapTo2Pi (azimuthRad);
 
@@ -1786,7 +2034,7 @@
 }
 
 MatrixBasedChannelModel::DoubleVector
-ThreeGppChannelModel::CalcAttenuationOfBlockage (Ptr<ThreeGppChannelModel::ThreeGppChannelMatrix> params,
+ThreeGppChannelModel::CalcAttenuationOfBlockage (const Ptr<ThreeGppChannelModel::ThreeGppChannelParams> channelParams,
                                                  const DoubleVector &clusterAOA,
                                                  const DoubleVector &clusterZOA) const
 {
@@ -1802,25 +2050,22 @@
 
   //step b:Generate the size and location of each blocker
   //generate self blocking (i.e., for blockage from the human body)
-  double phi_sb, x_sb, theta_sb, y_sb;
   //table 7.6.4.1-1 Self-blocking region parameters.
+  // Defaults: landscape mode
+  double phiSb = 40;
+  double xSb = 160;
+  double thetaSb = 110;
+  double ySb = 75;
   if (m_portraitMode)
     {
-      phi_sb = 260;
-      x_sb = 120;
-      theta_sb = 100;
-      y_sb = 80;
-    }
-  else // landscape mode
-    {
-      phi_sb = 40;
-      x_sb = 160;
-      theta_sb = 110;
-      y_sb = 75;
+      phiSb = 260;
+      xSb = 120;
+      thetaSb = 100;
+      ySb = 80;
     }
 
   //generate or update non-self blocking
-  if (params->m_nonSelfBlocking.size () == 0) //generate new blocking regions
+  if (channelParams->m_nonSelfBlocking.size () == 0) //generate new blocking regions
     {
       for (uint16_t blockInd = 0; blockInd < m_numNonSelfBlocking; blockInd++)
         {
@@ -1841,12 +2086,12 @@
               table.push_back (5);  //y_k
               table.push_back (10);  //r
             }
-          params->m_nonSelfBlocking.push_back (table);
+          channelParams->m_nonSelfBlocking.push_back (table);
         }
     }
   else
     {
-      double deltaX = sqrt (pow (params->m_preLocUT.x - params->m_locUT.x, 2) + pow (params->m_preLocUT.y - params->m_locUT.y, 2));
+      double deltaX = sqrt (pow (channelParams->m_preLocUT.x - channelParams->m_locUT.x, 2) + pow (channelParams->m_preLocUT.y - channelParams->m_locUT.y, 2));
       //if deltaX and speed are both 0, the autocorrelation is 1, skip updating
       if (deltaX > 1e-6 || m_blockerSpeed > 1e-6)
         {
@@ -1859,7 +2104,7 @@
             }
           else
             {
-              if (params->m_channelCondition->IsO2i ()) // outdoor to indoor
+              if (channelParams->m_o2iCondition == ChannelCondition::O2I) // outdoor to indoor
                 {
                   corrDis = 5;
                 }
@@ -1872,7 +2117,7 @@
           if (m_blockerSpeed > 1e-6) // speed not equal to 0
             {
               double corrT = corrDis / m_blockerSpeed;
-              R = exp (-1 * (deltaX / corrDis + (Now ().GetSeconds () - params->m_generatedTime.GetSeconds ()) / corrT));
+              R = exp (-1 * (deltaX / corrDis + (Now ().GetSeconds () - channelParams->m_generatedTime.GetSeconds ()) / corrT));
             }
           else
             {
@@ -1880,7 +2125,7 @@
             }
 
           NS_LOG_INFO ("Distance change:" << deltaX << " Speed:" << m_blockerSpeed
-                                          << " Time difference:" << Now ().GetSeconds () - params->m_generatedTime.GetSeconds ()
+                                          << " Time difference:" << Now ().GetSeconds () - channelParams->m_generatedTime.GetSeconds ()
                                           << " correlation:" << R);
 
           //In order to generate correlated uniform random variables, we first generate correlated normal random variables and map the normal RV to uniform RV.
@@ -1898,8 +2143,8 @@
             {
 
               //Generate a new correlated normal RV with the following formula
-              params->m_nonSelfBlocking[blockInd][PHI_INDEX] =
-                R * params->m_nonSelfBlocking[blockInd][PHI_INDEX] + sqrt (1 - R * R) * m_normalRv->GetValue ();
+              channelParams->m_nonSelfBlocking[blockInd][PHI_INDEX] =
+                R * channelParams->m_nonSelfBlocking[blockInd][PHI_INDEX] + sqrt (1 - R * R) * m_normalRv->GetValue ();
             }
         }
 
@@ -1912,21 +2157,23 @@
       NS_ASSERT_MSG (clusterZOA[cInd] >= 0 && clusterZOA[cInd] <= 180, "the ZOA should be the range of [0,180]");
 
       //check self blocking
-      NS_LOG_INFO ("AOA=" << clusterAOA[cInd] << " Block Region[" << phi_sb - x_sb / 2 << "," << phi_sb + x_sb / 2 << "]");
-      NS_LOG_INFO ("ZOA=" << clusterZOA[cInd] << " Block Region[" << theta_sb - y_sb / 2 << "," << theta_sb + y_sb / 2 << "]");
-      if ( std::abs (clusterAOA[cInd] - phi_sb) < (x_sb / 2) && std::abs (clusterZOA[cInd] - theta_sb) < (y_sb / 2))
+      NS_LOG_INFO ("AOA=" << clusterAOA[cInd] << " Block Region[" << phiSb - xSb / 2 << ","
+                          << phiSb + xSb / 2 << "]");
+      NS_LOG_INFO ("ZOA=" << clusterZOA[cInd] << " Block Region[" << thetaSb - ySb / 2 << ","
+                          << thetaSb + ySb / 2 << "]");
+      if (std::abs (clusterAOA[cInd] - phiSb) < (xSb / 2)
+          && std::abs (clusterZOA[cInd] - thetaSb) < (ySb / 2))
         {
           powerAttenuation[cInd] += 30;               //anttenuate by 30 dB.
-          NS_LOG_INFO ("Cluster[" << (int)cInd << "] is blocked by self blocking region and reduce 30 dB power,"
+          NS_LOG_INFO ("Cluster[" << +cInd << "] is blocked by self blocking region and reduce 30 dB power,"
                        "the attenuation is [" << powerAttenuation[cInd] << " dB]");
         }
 
       //check non-self blocking
-      double phiK, xK, thetaK, yK;
       for (uint16_t blockInd = 0; blockInd < m_numNonSelfBlocking; blockInd++)
         {
           //The normal RV is transformed to uniform RV with the desired correlation.
-          phiK = (0.5 * erfc (-1 * params->m_nonSelfBlocking[blockInd][PHI_INDEX] / sqrt (2))) * 360;
+          double phiK = (0.5 * erfc (-1 * channelParams->m_nonSelfBlocking[blockInd][PHI_INDEX] / sqrt (2))) * 360;
           while (phiK > 360)
             {
               phiK -= 360;
@@ -1937,9 +2184,10 @@
               phiK += 360;
             }
 
-          xK = params->m_nonSelfBlocking[blockInd][X_INDEX];
-          thetaK = params->m_nonSelfBlocking[blockInd][THETA_INDEX];
-          yK = params->m_nonSelfBlocking[blockInd][Y_INDEX];
+          double xK = channelParams->m_nonSelfBlocking[blockInd][X_INDEX];
+          double thetaK = channelParams->m_nonSelfBlocking[blockInd][THETA_INDEX];
+          double yK = channelParams->m_nonSelfBlocking[blockInd][Y_INDEX];
+
           NS_LOG_INFO ("AOA=" << clusterAOA[cInd] << " Block Region[" << phiK - xK << "," << phiK + xK << "]");
           NS_LOG_INFO ("ZOA=" << clusterZOA[cInd] << " Block Region[" << thetaK - yK << "," << thetaK + yK << "]");
 
@@ -1986,26 +2234,24 @@
                   signZ2 = 1;
                 }
               double lambda = 3e8 / m_frequency;
-              double F_A1 = atan (signA1 * M_PI / 2 * sqrt (M_PI / lambda *
-                                                            params->m_nonSelfBlocking[blockInd][R_INDEX] * (1 / cos (DegreesToRadians (A1)) - 1))) / M_PI; //(7.6-23)
-              double F_A2 = atan (signA2 * M_PI / 2 * sqrt (M_PI / lambda *
-                                                            params->m_nonSelfBlocking[blockInd][R_INDEX] * (1 / cos (DegreesToRadians (A2)) - 1))) / M_PI;
-              double F_Z1 = atan (signZ1 * M_PI / 2 * sqrt (M_PI / lambda *
-                                                            params->m_nonSelfBlocking[blockInd][R_INDEX] * (1 / cos (DegreesToRadians (Z1)) - 1))) / M_PI;
-              double F_Z2 = atan (signZ2 * M_PI / 2 * sqrt (M_PI / lambda *
-                                                            params->m_nonSelfBlocking[blockInd][R_INDEX] * (1 / cos (DegreesToRadians (Z2)) - 1))) / M_PI;
-              double L_dB = -20 * log10 (1 - (F_A1 + F_A2) * (F_Z1 + F_Z2));                  //(7.6-22)
-              powerAttenuation[cInd] += L_dB;
-              NS_LOG_INFO ("Cluster[" << (int)cInd << "] is blocked by no-self blocking, "
-                           "the loss is [" << L_dB << "]" << " dB");
-
+              double fA1 = atan (signA1 * M_PI / 2 * sqrt (M_PI / lambda *
+                                                           channelParams->m_nonSelfBlocking[blockInd][R_INDEX] * (1 / cos (DegreesToRadians (A1)) - 1))) / M_PI; //(7.6-23)
+              double fA2 = atan (signA2 * M_PI / 2 * sqrt (M_PI / lambda *
+                                                           channelParams->m_nonSelfBlocking[blockInd][R_INDEX] * (1 / cos (DegreesToRadians (A2)) - 1))) / M_PI;
+              double fZ1 = atan (signZ1 * M_PI / 2 * sqrt (M_PI / lambda *
+                                                           channelParams->m_nonSelfBlocking[blockInd][R_INDEX] * (1 / cos (DegreesToRadians (Z1)) - 1))) / M_PI;
+              double fZ2 = atan (signZ2 * M_PI / 2 * sqrt (M_PI / lambda *
+                                                           channelParams->m_nonSelfBlocking[blockInd][R_INDEX] * (1 / cos (DegreesToRadians (Z2)) - 1))) / M_PI;
+              double lDb = -20 * log10 (1 - (fA1 + fA2) * (fZ1 + fZ2));                  //(7.6-22)
+              powerAttenuation[cInd] += lDb;
+              NS_LOG_INFO ("Cluster[" << +cInd << "] is blocked by no-self blocking, the loss is ["
+                                      << lDb << "] dB");
             }
         }
     }
   return powerAttenuation;
 }
 
-
 void
 ThreeGppChannelModel::Shuffle (double * first, double * last) const
 {
@@ -2022,7 +2268,8 @@
   m_normalRv->SetStream (stream);
   m_uniformRv->SetStream (stream + 1);
   m_uniformRvShuffle->SetStream (stream + 2);
-  return 3;
+  m_uniformRvDoppler->SetStream (stream + 3);
+  return 4;
 }
 
 }  // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/spectrum/model/three-gpp-channel-model.h ns-3.36/src/spectrum/model/three-gpp-channel-model.h
--- ns-3.35/src/spectrum/model/three-gpp-channel-model.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/spectrum/model/three-gpp-channel-model.h	2022-04-30 18:23:58.146735000 -0700
@@ -57,7 +57,7 @@
    * Destructor
    */
   ~ThreeGppChannelModel ();
-  
+
   void DoDispose () override;
 
   /**
@@ -66,10 +66,9 @@
    */
   static TypeId GetTypeId ();
 
-
   /**
    * Set the channel condition model
-   * \param a pointer to the ChannelConditionModel object
+   * \param model a pointer to the ChannelConditionModel object
    */
   void SetChannelConditionModel (Ptr<ChannelConditionModel> model);
 
@@ -104,7 +103,7 @@
   std::string GetScenario (void) const;
 
   /**
-   * Looks for the channel matrix associated to the aMob and bMob pair in m_channelMap.
+   * Looks for the channel matrix associated to the aMob and bMob pair in m_channelMatrixMap.
    * If found, it checks if it has to be updated. If not found or if it has to
    * be updated, it generates a new uncorrelated channel matrix using the
    * method GetNewChannel and updates m_channelMap.
@@ -119,6 +118,18 @@
                                        Ptr<const MobilityModel> bMob,
                                        Ptr<const PhasedArrayModel> aAntenna,
                                        Ptr<const PhasedArrayModel> bAntenna) override;
+
+
+  /**
+   * Looks for the channel params associated to the aMob and bMob pair in
+   * m_channelParamsMap. If not found it will return a nullptr.
+   *
+   * \param aMob mobility model of the a device
+   * \param bMob mobility model of the b device
+   * \return the channel params
+   */
+  Ptr<const ChannelParams> GetParams (Ptr<const MobilityModel> aMob,
+                                      Ptr<const MobilityModel> bMob) const override;
   /**
    * \brief Assign a fixed random variable stream number to the random variables
    * used by this model.
@@ -128,7 +139,7 @@
    */
   int64_t AssignStreams (int64_t stream);
   
-private:
+protected:
   /**
    * Wrap an (azimuth, inclination) angle pair in a valid range.
    * Specifically, inclination must be in [0, M_PI] and azimuth in [0, 2*M_PI).
@@ -143,34 +154,46 @@
    * \return the wrapped (azimuth, inclination) angle pair in radians
    */
   static std::pair<double, double> WrapAngles (double azimuthRad, double inclinationRad);
+
   /**
    * \brief Shuffle the elements of a simple sequence container of type double
    * \param first Pointer to the first element among the elements to be shuffled
    * \param last Pointer to the last element among the elements to be shuffled
    */
   void Shuffle (double * first, double * last) const;
+
   /**
-   * Extends the struct ChannelMatrix by including information that are used 
-   * within the class ThreeGppChannelModel
+   * Extends the struct ChannelParams by including information that is used
+   * within the ThreeGppChannelModel class
    */
-  struct ThreeGppChannelMatrix : public MatrixBasedChannelModel::ChannelMatrix
+  struct ThreeGppChannelParams : public MatrixBasedChannelModel::ChannelParams
   {
-    Ptr<const ChannelCondition> m_channelCondition; //!< the channel condition
-    
+    ChannelCondition:: LosConditionValue m_losCondition; //!< contains the information about the LOS state of the channel
+    ChannelCondition::O2iConditionValue m_o2iCondition; //!< contains the information about the O2I state of the channel
     // TODO these are not currently used, they have to be correctly set when including the spatial consistent update procedure
-    /*The following parameters are stored for spatial consistent updating. The notation is 
+    /*The following parameters are stored for spatial consistent updating. The notation is
     that of 3GPP technical reports, but it can apply also to other channel realizations*/
     MatrixBasedChannelModel::Double2DVector m_nonSelfBlocking; //!< store the blockages
     Vector m_preLocUT; //!< location of UT when generating the previous channel
     Vector m_locUT; //!< location of UT
     MatrixBasedChannelModel::Double2DVector m_norRvAngles; //!< stores the normal variable for random angles angle[cluster][id] generated for equation (7.6-11)-(7.6-14), where id = 0(aoa),1(zoa),2(aod),3(zod)
     double m_DS; //!< delay spread
-    double m_K; //!< K factor
-    uint8_t m_numCluster; //!< reduced cluster number;
+    double m_K_factor; //!< K factor
+    uint8_t m_reducedClusterNumber; //!< reduced cluster number;
+    MatrixBasedChannelModel::Double2DVector m_rayAodRadian; //!< the vector containing AOD angles
+    MatrixBasedChannelModel::Double2DVector m_rayAoaRadian; //!< the vector containing AOA angles
+    MatrixBasedChannelModel::Double2DVector m_rayZodRadian; //!< the vector containing ZOD angles
+    MatrixBasedChannelModel::Double2DVector m_rayZoaRadian; //!< the vector containing ZOA angles
     MatrixBasedChannelModel::Double3DVector m_clusterPhase; //!< the initial random phases
+    MatrixBasedChannelModel::Double2DVector m_crossPolarizationPowerRatios;//!< cross polarization power ratios
     Vector m_speed; //!< velocity
     double m_dis2D; //!< 2D distance between tx and rx
     double m_dis3D; //!< 3D distance between tx and rx
+    DoubleVector m_clusterPower; //!< cluster powers
+    DoubleVector m_attenuation_dB; //!< vector that stores the attenuation of the blockage
+    uint8_t m_cluster1st; //!< index of the first strongest cluster
+    uint8_t m_cluster2nd; //!< index of the second strongest cluster
+
   };
 
   /**
@@ -179,31 +202,30 @@
    */
   struct ParamsTable : public SimpleRefCount<ParamsTable>
   {
-    uint8_t m_numOfCluster = 0;
-    uint8_t m_raysPerCluster = 0;
-    double m_uLgDS = 0;
-    double m_sigLgDS = 0;
-    double m_uLgASD = 0;
-    double m_sigLgASD = 0;
-    double m_uLgASA = 0;
-    double m_sigLgASA = 0;
-    double m_uLgZSA = 0;
-    double m_sigLgZSA = 0;
-    double m_uLgZSD = 0;
-    double m_sigLgZSD = 0;
-    double m_offsetZOD = 0;
-    double m_cDS = 0;
-    double m_cASD = 0;
-    double m_cASA = 0;
-    double m_cZSA = 0;
-    double m_uK = 0;
-    double m_sigK = 0;
-    double m_rTau = 0;
-    double m_uXpr = 0;
-    double m_sigXpr = 0;
-    double m_perClusterShadowingStd = 0;
-
-    double m_sqrtC[7][7];
+    uint8_t m_numOfCluster = 0; //!< Number of clusters
+    uint8_t m_raysPerCluster = 0; //!< Number of rays per cluster
+    double m_uLgDS = 0; //!< Mean value of 10-base logarithm of delay spread
+    double m_sigLgDS = 0; //!< Standard deviation value of 10-base logarithm of delay spread
+    double m_uLgASD = 0; //!< Mean value of 10-base logarithm of azimuth angle spread of departure
+    double m_sigLgASD = 0; //!< Standard deviation of 10-base logarithm of azimuth angle spread of departure
+    double m_uLgASA = 0; //!< Mean value of 10-base logarithm of azimuth angle spread of arrival
+    double m_sigLgASA = 0; //!< Standard deviation of 10-base logarithm of azimuth angle spread of arrival
+    double m_uLgZSA = 0; //!< Mean value of 10-base logarithm of zenith angle spread of arrival
+    double m_sigLgZSA = 0; //!< Standard deviation of 10-base logarithm of zenith angle spread of arrival
+    double m_uLgZSD = 0; //!< Mean value of 10-base logarithm of zenith angle spread of departure
+    double m_sigLgZSD = 0; //!< Standard deviation of 10-base logarithm of zenith angle spread of departure
+    double m_offsetZOD = 0; //!< Offset of zenith angle of departure
+    double m_cDS = 0; //!< Cluster DS
+    double m_cASD = 0; //!< Cluster ASD (Azimuth angle Spread of Departure)
+    double m_cASA = 0; //!< Cluster ASA (Azimuth angle Spread of Arrival)
+    double m_cZSA = 0; //!< Cluster ZSA (Zenith angle Spread of Arrival)
+    double m_uK = 0; //!< Mean of K-factor
+    double m_sigK = 0; //!< Standard deviation of K-factor
+    double m_rTau = 0; //!< Delay scaling parameter
+    double m_uXpr = 0; //!< Mean of Cross-Polarization Ratio
+    double m_sigXpr = 0; //!< Standard deviation of Cross-Polarization Ratio
+    double m_perClusterShadowingStd = 0; //!< Per cluster shadowing standard deviation 
+    double m_sqrtC[7][7]; //!< The square root matrix and follows the order of [SF, K, DS, ASD, ASA, ZSD, ZSA]
   };
 
   /**
@@ -217,45 +239,81 @@
   virtual Ptr<const ParamsTable> GetThreeGppTable (Ptr<const ChannelCondition> channelCondition, double hBS, double hUT, double distance2D) const;
 
   /**
-   * Compute the channel matrix between two devices using the procedure
-   * described in 3GPP TR 38.901
-   * \param locUT the location of the UT
+   * Prepare 3gpp channel parameters among the nodes a and b.
+   * The function does the followin steps described in 3GPP 38.901:
+   *
+   * Step 4: Generate large scale parameters. All LSPS are uncorrelated.
+   * Step 5: Generate Delays.
+   * Step 6: Generate cluster powers.
+   * Step 7: Generate arrival and departure angles for both azimuth and elevation.
+   * Step 8: Coupling of rays within a cluster for both azimuth and elevation
+   * shuffle all the arrays to perform random coupling
+   * Step 9: Generate the cross polarization power ratios
+   * Step 10: Draw initial phases
+   *
+   * All relevant generated parameters are added then to ThreeGppChannelParams
+   * which is the return value of this function.
    * \param channelCondition the channel condition
-   * \param sAntenna the s node antenna array
-   * \param uAntenna the u node antenna array
-   * \param uAngle the u node angle
-   * \param sAngle the s node angle
-   * \param dis2D the 2D distance between tx and rx
-   * \param hBS the height of the BS
-   * \param hUT the height of the UT
+   * \param table3gpp the 3gpp parameters from the table
+   * \param aMob the a node mobility model
+   * \param bMob the b node mobility model
+   * \return ThreeGppChannelParams structure with all the channel parameters generated according 38.901 steps from 4 to 10.
+   */
+  Ptr<ThreeGppChannelParams> GenerateChannelParameters (const Ptr<const ChannelCondition> channelCondition,
+                                                        const Ptr<const ParamsTable> table3gpp,
+                                                        const Ptr<const MobilityModel> aMob,
+                                                        const Ptr<const MobilityModel> bMob) const;
+
+  /**
+   * Compute the channel matrix between two nodes a and b, and their
+   * antenna arrays aAntenna and bAntenna using the procedure
+   * described in 3GPP TR 38.901
+   * \param channelParams the channel parameters previously generated for the pair of nodes a and b
+   * \param table3gpp the 3gpp parameters table
+   * \param sMob the mobility model of node s
+   * \param uMob the mobility model of node u
+   * \param sAntenna the antenna array of node s
+   * \param uAntenna the antenna array of node u
    * \return the channel realization
    */
-  Ptr<ThreeGppChannelMatrix> GetNewChannel (Vector locUT, Ptr<const ChannelCondition> channelCondition,
-                                            Ptr<const PhasedArrayModel> sAntenna,
-                                            Ptr<const PhasedArrayModel> uAntenna,
-                                            Angles &uAngle, Angles &sAngle,
-                                            double dis2D, double hBS, double hUT) const;
 
+  virtual Ptr<ChannelMatrix> GetNewChannel (Ptr<const ThreeGppChannelParams> channelParams,
+                                    Ptr<const ParamsTable> table3gpp,
+                                    const Ptr<const MobilityModel> sMob,
+                                    const Ptr<const MobilityModel> uMob,
+                                    Ptr<const PhasedArrayModel> sAntenna,
+                                    Ptr<const PhasedArrayModel> uAntenna) const;
   /**
    * Applies the blockage model A described in 3GPP TR 38.901
-   * \param params the channel matrix
+   * \param channelParams the channel parameters structure
    * \param clusterAOA vector containing the azimuth angle of arrival for each cluster
    * \param clusterZOA vector containing the zenith angle of arrival for each cluster
    * \return vector containing the power attenuation for each cluster
    */
-  DoubleVector CalcAttenuationOfBlockage (Ptr<ThreeGppChannelMatrix> params,
+  DoubleVector CalcAttenuationOfBlockage (const Ptr<ThreeGppChannelModel::ThreeGppChannelParams> channelParams,
                                           const DoubleVector &clusterAOA,
                                           const DoubleVector &clusterZOA) const;
 
   /**
-   * Check if the channel matrix has to be updated
-   * \param channelMatrix channel matrix
+   * Check if the channel params has to be updated
+   * \param channelParams channel params
    * \param channelCondition the channel condition
+   * \return true if the channel params has to be updated, false otherwise
+   */
+  bool ChannelParamsNeedsUpdate (Ptr<const ThreeGppChannelParams> channelParams,
+                                 Ptr<const ChannelCondition> channelCondition) const;
+
+  /**
+   * Check if the channel matrix has to be updated (it needs update when the channel params generation
+   * time is more recent than channel matrix generation time
+   * \param channelParams channel params structure
+   * \param channelMatrix channel matrix structure
    * \return true if the channel matrix has to be updated, false otherwise
    */
-  bool ChannelMatrixNeedsUpdate (Ptr<const ThreeGppChannelMatrix> channelMatrix, Ptr<const ChannelCondition> channelCondition) const;
+  bool ChannelMatrixNeedsUpdate (Ptr<const ThreeGppChannelParams> channelParams, Ptr<const ChannelMatrix> channelMatrix);
 
-  std::unordered_map<uint32_t, Ptr<ThreeGppChannelMatrix> > m_channelMap; //!< map containing the channel realizations
+  std::unordered_map<uint64_t, Ptr<ChannelMatrix> > m_channelMatrixMap; //!< map containing the channel realizations per pair of PhasedAntennaArray instances, the key of this map is reciprocal uniquely identifies a pair of PhasedAntennaArrays
+  std::unordered_map<uint64_t, Ptr<ThreeGppChannelParams> > m_channelParamsMap; //!< map containing the common channel parameters per pair of nodes, the key of this map is reciprocal and uniquely identifies a pair of nodes
   Time m_updatePeriod; //!< the channel update period
   double m_frequency; //!< the operating frequency
   std::string m_scenario; //!< the 3GPP scenario
@@ -264,6 +322,11 @@
   Ptr<NormalRandomVariable> m_normalRv; //!< normal random variable
   Ptr<UniformRandomVariable> m_uniformRvShuffle; //!< uniform random variable used to shuffle array in GetNewChannel
 
+  // Variable used to compute the additional Doppler contribution for the delayed
+  // (reflected) paths, as described in 3GPP TR 37.885 v15.3.0, Sec. 6.2.3.
+  double m_vScatt; //!< value used to compute the additional Doppler contribution for the delayed paths
+  Ptr<UniformRandomVariable> m_uniformRvDoppler; //!< uniform random variable, used to compute the additional Doppler contribution
+
   // parameters for the blockage model
   bool m_blockage; //!< enables the blockage model A
   uint16_t m_numNonSelfBlocking; //!< number of non-self-blocking regions
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/spectrum/model/three-gpp-spectrum-propagation-loss-model.cc ns-3.36/src/spectrum/model/three-gpp-spectrum-propagation-loss-model.cc
--- ns-3.35/src/spectrum/model/three-gpp-spectrum-propagation-loss-model.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/spectrum/model/three-gpp-spectrum-propagation-loss-model.cc	2022-04-30 18:23:58.146735000 -0700
@@ -21,11 +21,10 @@
  */
 
 #include "ns3/log.h"
+#include "three-gpp-channel-model.h"
 #include "three-gpp-spectrum-propagation-loss-model.h"
 #include "ns3/net-device.h"
-#include "ns3/phased-array-model.h"
 #include "ns3/node.h"
-#include "ns3/channel-condition-model.h"
 #include "ns3/double.h"
 #include "ns3/string.h"
 #include "ns3/simulator.h"
@@ -41,7 +40,6 @@
 ThreeGppSpectrumPropagationLossModel::ThreeGppSpectrumPropagationLossModel ()
 {
   NS_LOG_FUNCTION (this);
-  m_uniformRv = CreateObject<UniformRandomVariable> ();
 }
 
 ThreeGppSpectrumPropagationLossModel::~ThreeGppSpectrumPropagationLossModel ()
@@ -52,7 +50,6 @@
 void
 ThreeGppSpectrumPropagationLossModel::DoDispose ()
 {
-  m_deviceAntennaMap.clear ();
   m_longTermMap.clear ();
   m_channelModel->Dispose ();
   m_channelModel = nullptr;
@@ -62,7 +59,7 @@
 ThreeGppSpectrumPropagationLossModel::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::ThreeGppSpectrumPropagationLossModel")
-    .SetParent<SpectrumPropagationLossModel> ()
+    .SetParent<PhasedArraySpectrumPropagationLossModel> ()
     .SetGroupName ("Spectrum")
     .AddConstructor<ThreeGppSpectrumPropagationLossModel> ()
     .AddAttribute("ChannelModel", 
@@ -71,13 +68,6 @@
                   MakePointerAccessor (&ThreeGppSpectrumPropagationLossModel::SetChannelModel,
                                        &ThreeGppSpectrumPropagationLossModel::GetChannelModel),
                                        MakePointerChecker<MatrixBasedChannelModel> ())
-    .AddAttribute ("vScatt",
-                   "Maximum speed of the vehicle in the layout (see 3GPP TR 37.885 v15.3.0, Sec. 6.2.3)."
-                   "Used to compute the additional contribution for the Doppler of" 
-                   "delayed (reflected) paths",
-                   DoubleValue (0.0),
-                   MakeDoubleAccessor (&ThreeGppSpectrumPropagationLossModel::m_vScatt),
-                   MakeDoubleChecker<double> (0.0))
     ;
   return tid;
 }
@@ -94,13 +84,6 @@
   return m_channelModel;
 }
 
-void
-ThreeGppSpectrumPropagationLossModel::AddDevice (Ptr<NetDevice> n, Ptr<const PhasedArrayModel> a)
-{
-  NS_ASSERT_MSG (m_deviceAntennaMap.find (n->GetNode ()->GetId ()) == m_deviceAntennaMap.end (), "Device is already present in the map");
-  m_deviceAntennaMap.insert (std::make_pair (n->GetNode ()->GetId (), a));
-}
-
 double
 ThreeGppSpectrumPropagationLossModel::GetFrequency () const
 {
@@ -131,18 +114,24 @@
   uint16_t sAntenna = static_cast<uint16_t> (sW.size ());
   uint16_t uAntenna = static_cast<uint16_t> (uW.size ());
 
+  NS_ASSERT (uAntenna == params->m_channel.size ());
+  NS_ASSERT (sAntenna == params->m_channel.at (0).size());
+
   NS_LOG_DEBUG ("CalcLongTerm with sAntenna " << sAntenna << " uAntenna " << uAntenna);
   //store the long term part to reduce computation load
   //only the small scale fading needs to be updated if the large scale parameters and antenna weights remain unchanged.
   PhasedArrayModel::ComplexVector longTerm;
   uint8_t numCluster = static_cast<uint8_t> (params->m_channel[0][0].size ());
 
+  NS_ASSERT (uAntenna == params->m_channel.size ());
+  NS_ASSERT (sAntenna == params->m_channel.at (0).size());
+
   for (uint8_t cIndex = 0; cIndex < numCluster; cIndex++)
     {
-      std::complex<double> txSum (0,0);
+      std::complex<double> txSum (0, 0);
       for (uint16_t sIndex = 0; sIndex < sAntenna; sIndex++)
         {
-          std::complex<double> rxSum (0,0);
+          std::complex<double> rxSum (0, 0);
           for (uint16_t uIndex = 0; uIndex < uAntenna; uIndex++)
             {
               rxSum = rxSum + uW[uIndex] * params->m_channel[uIndex][sIndex][cIndex];
@@ -157,7 +146,8 @@
 Ptr<SpectrumValue>
 ThreeGppSpectrumPropagationLossModel::CalcBeamformingGain (Ptr<SpectrumValue> txPsd,
                                                            PhasedArrayModel::ComplexVector longTerm,
-                                                           Ptr<const MatrixBasedChannelModel::ChannelMatrix> params,
+                                                           Ptr<const MatrixBasedChannelModel::ChannelMatrix> channelMatrix,
+                                                           Ptr<const MatrixBasedChannelModel::ChannelParams> channelParams,
                                                            const ns3::Vector &sSpeed, const ns3::Vector &uSpeed) const
 {
   NS_LOG_FUNCTION (this);
@@ -165,58 +155,97 @@
   Ptr<SpectrumValue> tempPsd = Copy<SpectrumValue> (txPsd);
 
   //channel[rx][tx][cluster]
-  uint8_t numCluster = static_cast<uint8_t> (params->m_channel[0][0].size ());
+  uint8_t numCluster = static_cast<uint8_t> (channelMatrix->m_channel[0][0].size ());
 
   // compute the doppler term
   // NOTE the update of Doppler is simplified by only taking the center angle of
   // each cluster in to consideration.
   double slotTime = Simulator::Now ().GetSeconds ();
+  double factor = 2 * M_PI * slotTime * GetFrequency () / 3e8;
   PhasedArrayModel::ComplexVector doppler;
+
+  // The following asserts might seem paranoic, but it is important to
+  // make sure that all the structures that are passed to this function
+  // are of the correct dimensions before using the operator [].
+  // If you dont understand the comment read about the difference of .at()
+  // and [] operators, ...
+  NS_ASSERT (numCluster <= channelParams->m_alpha.size ());
+  NS_ASSERT (numCluster <= channelParams->m_D.size());
+  NS_ASSERT (numCluster <= channelParams->m_angle[MatrixBasedChannelModel::ZOA_INDEX].size());
+  NS_ASSERT (numCluster <= channelParams->m_angle[MatrixBasedChannelModel::ZOD_INDEX].size());
+  NS_ASSERT (numCluster <= channelParams->m_angle[MatrixBasedChannelModel::AOA_INDEX].size());
+  NS_ASSERT (numCluster <= channelParams->m_angle[MatrixBasedChannelModel::AOD_INDEX].size());
+  NS_ASSERT (numCluster <= longTerm.size());
+
+  // check if channelParams structure is generated in direction s-to-u or u-to-s
+  bool isSameDirection = (channelParams->m_nodeIds == channelMatrix->m_nodeIds);
+
+  MatrixBasedChannelModel::DoubleVector zoa;
+  MatrixBasedChannelModel::DoubleVector zod;
+  MatrixBasedChannelModel::DoubleVector aoa;
+  MatrixBasedChannelModel::DoubleVector aod;
+
+  // if channel params is generated in the same direction in which we
+  // generate the channel matrix, angles and zenit od departure and arrival are ok,
+  // just set them to corresponding variable that will be used for the generation
+  // of channel matrix, otherwise we need to flip angles and zenits of departure and arrival
+  if (isSameDirection)
+    {
+      zoa = channelParams->m_angle[MatrixBasedChannelModel::ZOA_INDEX];
+      zod = channelParams->m_angle[MatrixBasedChannelModel::ZOD_INDEX];
+      aoa = channelParams->m_angle[MatrixBasedChannelModel::AOA_INDEX];
+      aod = channelParams->m_angle[MatrixBasedChannelModel::AOD_INDEX];
+    }
+  else
+    {
+      zod = channelParams->m_angle[MatrixBasedChannelModel::ZOA_INDEX];
+      zoa = channelParams->m_angle[MatrixBasedChannelModel::ZOD_INDEX];
+      aod = channelParams->m_angle[MatrixBasedChannelModel::AOA_INDEX];
+      aoa = channelParams->m_angle[MatrixBasedChannelModel::AOD_INDEX];
+    }
+
   for (uint8_t cIndex = 0; cIndex < numCluster; cIndex++)
     {
       // Compute alpha and D as described in 3GPP TR 37.885 v15.3.0, Sec. 6.2.3
-      // These terms account for an additional Doppler contribution due to the 
-      // presence of moving objects in the sorrounding environment, such as in 
+      // These terms account for an additional Doppler contribution due to the
+      // presence of moving objects in the sorrounding environment, such as in
       // vehicular scenarios.
-      // This contribution is applied only to the delayed (reflected) paths and 
-      // must be properly configured by setting the value of 
-      // m_vScatt, which is defined as "maximum speed of the vehicle in the 
-      // layout". 
-      // By default, m_vScatt is set to 0, so there is no additional Doppler 
+      // This contribution is applied only to the delayed (reflected) paths and
+      // must be properly configured by setting the value of
+      // m_vScatt, which is defined as "maximum speed of the vehicle in the
+      // layout".
+      // By default, m_vScatt is set to 0, so there is no additional Doppler
       // contribution.
-      double alpha = 0; 
-      double D = 0; 
-      if (cIndex != 0)
-      {
-        alpha = m_uniformRv->GetValue (-1, 1);
-        D = m_uniformRv->GetValue (-m_vScatt, m_vScatt);
-      }
-      
-      //cluster angle angle[direction][n],where, direction = 0(aoa), 1(zoa).
-      double temp_doppler = 2 * M_PI * ((sin (params->m_angle[MatrixBasedChannelModel::ZOA_INDEX][cIndex] * M_PI / 180) * cos (params->m_angle[MatrixBasedChannelModel::AOA_INDEX][cIndex] * M_PI / 180) * uSpeed.x
-                                         + sin (params->m_angle[MatrixBasedChannelModel::ZOA_INDEX][cIndex] * M_PI / 180) * sin (params->m_angle[MatrixBasedChannelModel::AOA_INDEX][cIndex] * M_PI / 180) * uSpeed.y
-                                         + cos (params->m_angle[MatrixBasedChannelModel::ZOA_INDEX][cIndex] * M_PI / 180) * uSpeed.z)
-                                         + (sin (params->m_angle[MatrixBasedChannelModel::ZOD_INDEX][cIndex] * M_PI / 180) * cos (params->m_angle[MatrixBasedChannelModel::AOD_INDEX][cIndex] * M_PI / 180) * sSpeed.x
-                                         + sin (params->m_angle[MatrixBasedChannelModel::ZOD_INDEX][cIndex] * M_PI / 180) * sin (params->m_angle[MatrixBasedChannelModel::AOD_INDEX][cIndex] * M_PI / 180) * sSpeed.y
-                                         + cos (params->m_angle[MatrixBasedChannelModel::ZOD_INDEX][cIndex] * M_PI / 180) * sSpeed.z) + 2 * alpha * D)
-                           * slotTime * GetFrequency () / 3e8;
-      doppler.push_back (exp (std::complex<double> (0, temp_doppler)));
+
+      double alpha = channelParams->m_alpha [cIndex];
+      double D = channelParams->m_D [cIndex];
+
+      //cluster angle angle[direction][n], where direction = 0(aoa), 1(zoa).
+      double tempDoppler = factor * ((sin (zoa [cIndex] * M_PI / 180) * cos (aoa [cIndex] * M_PI / 180) * uSpeed.x
+                                       + sin (zoa [cIndex] * M_PI / 180) * sin (aoa [cIndex] * M_PI / 180) * uSpeed.y
+                                       + cos (zoa [cIndex] * M_PI / 180) * uSpeed.z)
+                                       + (sin (zod [cIndex] * M_PI / 180) * cos (aod [cIndex] * M_PI / 180) * sSpeed.x
+                                       + sin (zod [cIndex] * M_PI / 180) * sin (aod [cIndex] * M_PI / 180) * sSpeed.y
+                                       + cos (zod [cIndex] * M_PI / 180) * sSpeed.z) + 2 * alpha * D);
+      doppler.push_back (std::complex<double> (cos (tempDoppler), sin (tempDoppler)));
     }
 
+  NS_ASSERT (numCluster <= doppler.size());
+
   // apply the doppler term and the propagation delay to the long term component
   // to obtain the beamforming gain
   auto vit = tempPsd->ValuesBegin (); // psd iterator
-  auto sbit = tempPsd->ConstBandsBegin(); // band iterator
+  auto sbit = tempPsd->ConstBandsBegin (); // band iterator
   while (vit != tempPsd->ValuesEnd ())
     {
-      std::complex<double> subsbandGain (0.0,0.0);
       if ((*vit) != 0.00)
         {
+          std::complex<double> subsbandGain (0.0, 0.0);
           double fsb = (*sbit).fc; // center frequency of the sub-band
           for (uint8_t cIndex = 0; cIndex < numCluster; cIndex++)
             {
-              double delay = -2 * M_PI * fsb * (params->m_delay[cIndex]);
-              subsbandGain = subsbandGain + longTerm[cIndex] * doppler[cIndex] * exp (std::complex<double> (0, delay));
+              double delay = -2 * M_PI * fsb * (channelParams->m_delay[cIndex]);
+              subsbandGain = subsbandGain + longTerm[cIndex] * doppler[cIndex] * std::complex<double> (cos (delay), sin (delay));
             }
           *vit = (*vit) * (norm (subsbandGain));
         }
@@ -227,54 +256,51 @@
 }
 
 PhasedArrayModel::ComplexVector
-ThreeGppSpectrumPropagationLossModel::GetLongTerm (uint32_t aId, uint32_t bId,
-                                                   Ptr<const MatrixBasedChannelModel::ChannelMatrix> channelMatrix,
-                                                   const PhasedArrayModel::ComplexVector &aW,
-                                                   const PhasedArrayModel::ComplexVector &bW) const
+ThreeGppSpectrumPropagationLossModel::GetLongTerm (Ptr<const MatrixBasedChannelModel::ChannelMatrix> channelMatrix,
+                                                   Ptr<const PhasedArrayModel> aPhasedArrayModel,
+                                                   Ptr<const PhasedArrayModel> bPhasedArrayModel) const
 {
   PhasedArrayModel::ComplexVector longTerm; // vector containing the long term component for each cluster
 
   // check if the channel matrix was generated considering a as the s-node and
   // b as the u-node or viceversa
   PhasedArrayModel::ComplexVector sW, uW;
-  if (!channelMatrix->IsReverse (aId, bId))
+  if (!channelMatrix->IsReverse (aPhasedArrayModel->GetId (), bPhasedArrayModel->GetId ()))
   {
-    sW = aW;
-    uW = bW;
+    sW = aPhasedArrayModel->GetBeamformingVector ();
+    uW = bPhasedArrayModel->GetBeamformingVector ();
   }
   else
   {
-    sW = bW;
-    uW = aW;
+    sW = bPhasedArrayModel->GetBeamformingVector ();
+    uW = aPhasedArrayModel->GetBeamformingVector ();
   }
 
-  // compute the long term key, the key is unique for each tx-rx pair
-  uint32_t x1 = std::min (aId, bId);
-  uint32_t x2 = std::max (aId, bId);
-  uint32_t longTermId = MatrixBasedChannelModel::GetKey (x1, x2);
-
   bool update = false; // indicates whether the long term has to be updated
   bool notFound = false; // indicates if the long term has not been computed yet
 
+  // compute the long term key, the key is unique for each tx-rx pair
+  uint64_t longTermId = MatrixBasedChannelModel::GetKey (aPhasedArrayModel->GetId (), bPhasedArrayModel->GetId ());
+
   // look for the long term in the map and check if it is valid
   if (m_longTermMap.find (longTermId) != m_longTermMap.end ())
-  {
-    NS_LOG_DEBUG ("found the long term component in the map");
-    longTerm = m_longTermMap[longTermId]->m_longTerm;
+    {
+      NS_LOG_DEBUG ("found the long term component in the map");
+      longTerm = m_longTermMap[longTermId]->m_longTerm;
 
-    // check if the channel matrix has been updated
-    // or the s beam has been changed
-    // or the u beam has been changed
-    update = (m_longTermMap[longTermId]->m_channel->m_generatedTime != channelMatrix->m_generatedTime
-              || m_longTermMap[longTermId]->m_sW != sW
-              || m_longTermMap[longTermId]->m_uW != uW);
+      // check if the channel matrix has been updated
+      // or the s beam has been changed
+      // or the u beam has been changed
+      update = (m_longTermMap[longTermId]->m_channel->m_generatedTime != channelMatrix->m_generatedTime
+                || m_longTermMap[longTermId]->m_sW != sW
+                || m_longTermMap[longTermId]->m_uW != uW);
 
-  }
+    }
   else
-  {
-    NS_LOG_DEBUG ("long term component NOT found");
-    notFound = true;
-  }
+    {
+      NS_LOG_DEBUG ("long term component NOT found");
+      notFound = true;
+    }
 
   if (update || notFound)
     {
@@ -298,7 +324,9 @@
 Ptr<SpectrumValue>
 ThreeGppSpectrumPropagationLossModel::DoCalcRxPowerSpectralDensity (Ptr<const SpectrumValue> txPsd,
                                                                     Ptr<const MobilityModel> a,
-                                                                    Ptr<const MobilityModel> b) const
+                                                                    Ptr<const MobilityModel> b,
+                                                                    Ptr<const PhasedArrayModel> aPhasedArrayModel,
+                                                                    Ptr<const PhasedArrayModel> bPhasedArrayModel) const
 {
   NS_LOG_FUNCTION (this);
   uint32_t aId = a->GetObject<Node> ()->GetId (); // id of the node a
@@ -310,26 +338,21 @@
   Ptr<SpectrumValue> rxPsd = Copy<SpectrumValue> (txPsd);
 
   // retrieve the antenna of device a
-  NS_ASSERT_MSG (m_deviceAntennaMap.find (aId) != m_deviceAntennaMap.end (), "Antenna not found for node " << aId);
-  Ptr<const PhasedArrayModel> aAntenna = m_deviceAntennaMap.at (aId);
-  NS_LOG_DEBUG ("a node " << a->GetObject<Node> () << " antenna " << aAntenna);
+  NS_ASSERT_MSG (aPhasedArrayModel, "Antenna not found for node " << aId);
+  NS_LOG_DEBUG ("a node " << a->GetObject<Node> () << " antenna " << aPhasedArrayModel);
 
   // retrieve the antenna of the device b
-  NS_ASSERT_MSG (m_deviceAntennaMap.find (bId) != m_deviceAntennaMap.end (), "Antenna not found for device " << bId);
-  Ptr<const PhasedArrayModel> bAntenna = m_deviceAntennaMap.at (bId);
-  NS_LOG_DEBUG ("b node " << bId << " antenna " << bAntenna);
-
-  Ptr<const MatrixBasedChannelModel::ChannelMatrix> channelMatrix = m_channelModel->GetChannel (a, b, aAntenna, bAntenna);
-
-  // get the precoding and combining vectors
-  PhasedArrayModel::ComplexVector aW = aAntenna->GetBeamformingVector ();
-  PhasedArrayModel::ComplexVector bW = bAntenna->GetBeamformingVector ();
+  NS_ASSERT_MSG (bPhasedArrayModel, "Antenna not found for device " << bId);
+  NS_LOG_DEBUG ("b node " << bId << " antenna " << bPhasedArrayModel);
+
+  Ptr<const MatrixBasedChannelModel::ChannelMatrix> channelMatrix = m_channelModel->GetChannel (a, b, aPhasedArrayModel, bPhasedArrayModel);
+  Ptr<const MatrixBasedChannelModel::ChannelParams> channelParams = m_channelModel->GetParams (a, b);
 
   // retrieve the long term component
-  PhasedArrayModel::ComplexVector longTerm = GetLongTerm (aId, bId, channelMatrix, aW, bW);
+  PhasedArrayModel::ComplexVector longTerm = GetLongTerm (channelMatrix, aPhasedArrayModel, bPhasedArrayModel);
 
   // apply the beamforming gain
-  rxPsd = CalcBeamformingGain (rxPsd, longTerm, channelMatrix, a->GetVelocity (), b->GetVelocity ());
+  rxPsd = CalcBeamformingGain (rxPsd, longTerm, channelMatrix, channelParams, a->GetVelocity (), b->GetVelocity ());
 
   return rxPsd;
 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/spectrum/model/three-gpp-spectrum-propagation-loss-model.h ns-3.36/src/spectrum/model/three-gpp-spectrum-propagation-loss-model.h
--- ns-3.35/src/spectrum/model/three-gpp-spectrum-propagation-loss-model.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/spectrum/model/three-gpp-spectrum-propagation-loss-model.h	2022-04-30 18:23:58.146735000 -0700
@@ -22,18 +22,16 @@
 #ifndef THREE_GPP_SPECTRUM_PROPAGATION_LOSS_H
 #define THREE_GPP_SPECTRUM_PROPAGATION_LOSS_H
 
-#include "ns3/spectrum-propagation-loss-model.h"
 #include <complex.h>
 #include <map>
 #include <unordered_map>
 #include "ns3/matrix-based-channel-model.h"
 #include "ns3/random-variable-stream.h"
+#include "ns3/phased-array-spectrum-propagation-loss-model.h"
 
 namespace ns3 {
 
 class NetDevice;
-class ChannelConditionModel;
-class ChannelCondition;
 
 /**
  * \ingroup spectrum
@@ -49,7 +47,7 @@
  * \see PhasedArrayModel
  * \see ChannelCondition
  */
-class ThreeGppSpectrumPropagationLossModel : public SpectrumPropagationLossModel
+class ThreeGppSpectrumPropagationLossModel : public PhasedArraySpectrumPropagationLossModel
 {
 public:
   /**
@@ -61,7 +59,7 @@
    * Destructor
    */
   ~ThreeGppSpectrumPropagationLossModel ();
-  
+
   void DoDispose () override;
 
   /**
@@ -80,15 +78,7 @@
    * Get the channel model object
    * \return a pointer to the object implementing the MatrixBasedChannelModel interface
    */
-  Ptr<MatrixBasedChannelModel> GetChannelModel() const;
-
-  /**
-   * Add a device-antenna pair
-   * \param n a pointer to the NetDevice
-   * \param a a pointer to the associated PhasedArrayModel
-   */
-  void AddDevice (Ptr<NetDevice> n, Ptr<const PhasedArrayModel> a);
-
+  Ptr<MatrixBasedChannelModel> GetChannelModel () const;
 
   /**
    * Sets the value of an attribute belonging to the associated
@@ -102,7 +92,7 @@
    * Returns the value of an attribute belonging to the associated
    * MatrixBasedChannelModel instance
    * \param name name of the attribute
-   * \param where the result should be stored
+   * \param value where the result should be stored
    */
   void GetChannelModelAttribute (const std::string &name, AttributeValue &value) const;
 
@@ -123,12 +113,15 @@
    * \param txPsd tx PSD
    * \param a first node mobility model
    * \param b second node mobility model
-   *
+   * \param aPhasedArrayModel the antenna array of the first node
+   * \param bPhasedArrayModel the antenna array of the second node
    * \return the received PSD
    */
   Ptr<SpectrumValue> DoCalcRxPowerSpectralDensity (Ptr<const SpectrumValue> txPsd,
-                                                           Ptr<const MobilityModel> a,
-                                                           Ptr<const MobilityModel> b) const override;
+                                                   Ptr<const MobilityModel> a,
+                                                   Ptr<const MobilityModel> b,
+                                                   Ptr<const PhasedArrayModel> aPhasedArrayModel,
+                                                   Ptr<const PhasedArrayModel> bPhasedArrayModel) const override;
 
 private:
   /**
@@ -152,17 +145,14 @@
    * Looks for the long term component in m_longTermMap. If found, checks
    * whether it has to be updated. If not found or if it has to be updated,
    * calls the method CalcLongTerm to compute it.
-   * \param aId id of the first node
-   * \param bId id of the second node
    * \param channelMatrix the channel matrix
-   * \param aW the beamforming vector of the first device
-   * \param bW the beamforming vector of the second device
-   * \return vector containing the long term compoenent for each cluster
-   */
-  PhasedArrayModel::ComplexVector GetLongTerm (uint32_t aId, uint32_t bId,
-                                                        Ptr<const MatrixBasedChannelModel::ChannelMatrix> channelMatrix,
-                                                        const PhasedArrayModel::ComplexVector &aW,
-                                                        const PhasedArrayModel::ComplexVector &bW) const;
+   * \param aPhasedArrayModel the antenna array of the tx device
+   * \param bPhasedArrayModel the antenna array of the rx device
+   * \return vector containing the long term component for each cluster
+   */
+  PhasedArrayModel::ComplexVector GetLongTerm (Ptr<const MatrixBasedChannelModel::ChannelMatrix> channelMatrix,
+                                               Ptr<const PhasedArrayModel> aPhasedArrayModel,
+                                               Ptr<const PhasedArrayModel> bPhasedArrayModel) const;
   /**
    * Computes the long term component
    * \param channelMatrix the channel matrix H
@@ -171,31 +161,27 @@
    * \return the long term component
    */
   PhasedArrayModel::ComplexVector CalcLongTerm (Ptr<const MatrixBasedChannelModel::ChannelMatrix> channelMatrix,
-                                                         const PhasedArrayModel::ComplexVector &sW,
-                                                         const PhasedArrayModel::ComplexVector &uW) const;
+                                                const PhasedArrayModel::ComplexVector &sW,
+                                                const PhasedArrayModel::ComplexVector &uW) const;
 
   /**
    * Computes the beamforming gain and applies it to the tx PSD
    * \param txPsd the tx PSD
    * \param longTerm the long term component
-   * \param params The channel matrix
+   * \param channelMatrix The channel matrix structure
+   * \param channelParams The channel params structure
    * \param sSpeed speed of the first node
    * \param uSpeed speed of the second node
    * \return the rx PSD
    */
   Ptr<SpectrumValue> CalcBeamformingGain (Ptr<SpectrumValue> txPsd,
                                           PhasedArrayModel::ComplexVector longTerm,
-                                          Ptr<const MatrixBasedChannelModel::ChannelMatrix> params,
+                                          Ptr<const MatrixBasedChannelModel::ChannelMatrix> channelMatrix,
+                                          Ptr<const MatrixBasedChannelModel::ChannelParams> channelParams,
                                           const Vector &sSpeed, const Vector &uSpeed) const;
 
-  std::unordered_map <uint32_t, Ptr<const PhasedArrayModel> > m_deviceAntennaMap; //!< map containig the <node, antenna> associations
-  mutable std::unordered_map < uint32_t, Ptr<const LongTerm> > m_longTermMap; //!< map containing the long term components
+  mutable std::unordered_map < uint64_t, Ptr<const LongTerm> > m_longTermMap; //!< map containing the long term components
   Ptr<MatrixBasedChannelModel> m_channelModel; //!< the model to generate the channel matrix
-  
-  // Variable used to compute the additional Doppler contribution for the delayed 
-  // (reflected) paths, as described in 3GPP TR 37.885 v15.3.0, Sec. 6.2.3.
-  double m_vScatt; //!< value used to compute the additional Doppler contribution for the delayed paths 
-  Ptr<UniformRandomVariable> m_uniformRv; //!< uniform random variable, used to compute the additional Doppler contribution
 };
 } // namespace ns3
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/spectrum/model/tv-spectrum-transmitter.cc ns-3.36/src/spectrum/model/tv-spectrum-transmitter.cc
--- ns-3.35/src/spectrum/model/tv-spectrum-transmitter.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/spectrum/model/tv-spectrum-transmitter.cc	2022-04-30 18:23:58.150735000 -0700
@@ -164,8 +164,8 @@
   return 0;
 }
 
-Ptr<AntennaModel>
-TvSpectrumTransmitter::GetRxAntenna () const
+Ptr<Object>
+TvSpectrumTransmitter::GetAntenna () const
 {
   NS_LOG_FUNCTION (this);
   return m_antenna;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/spectrum/model/tv-spectrum-transmitter.h ns-3.36/src/spectrum/model/tv-spectrum-transmitter.h
--- ns-3.35/src/spectrum/model/tv-spectrum-transmitter.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/spectrum/model/tv-spectrum-transmitter.h	2022-04-30 18:23:58.150735000 -0700
@@ -74,7 +74,7 @@
   Ptr<NetDevice> GetDevice () const;
   // device does not use Rx but these pure virtual methods must be implemented
   Ptr<const SpectrumModel> GetRxSpectrumModel () const;
-  Ptr<AntennaModel> GetRxAntenna () const;
+  Ptr<Object> GetAntenna () const;
   void StartRx (Ptr<SpectrumSignalParameters> params);
 
   /** 
@@ -103,9 +103,6 @@
    * Analog PSD approximated from Figure 4 of the following paper:
    * Stephen Shellhammer, Ahmed Sadek, and Wenyi Zhang. "Technical Challenges 
    * for Cognitive Radio in the TV White Space Spectrum." Qualcomm Incorporated.
-   *
-   *
-   * @return a pointer to the power spectral density of the TV transmitter
    */
   virtual void CreateTvPsd ();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/spectrum/model/waveform-generator.cc ns-3.36/src/spectrum/model/waveform-generator.cc
--- ns-3.35/src/spectrum/model/waveform-generator.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/spectrum/model/waveform-generator.cc	2022-04-30 18:23:58.150735000 -0700
@@ -154,8 +154,8 @@
   m_txPowerSpectralDensity = txPsd;
 }
 
-Ptr<AntennaModel>
-WaveformGenerator::GetRxAntenna () const
+Ptr<Object>
+WaveformGenerator::GetAntenna () const
 {
   return m_antenna;
 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/spectrum/model/waveform-generator.h ns-3.36/src/spectrum/model/waveform-generator.h
--- ns-3.35/src/spectrum/model/waveform-generator.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/spectrum/model/waveform-generator.h	2022-04-30 18:23:58.150735000 -0700
@@ -70,7 +70,7 @@
   Ptr<MobilityModel> GetMobility () const;
   Ptr<NetDevice> GetDevice () const;
   Ptr<const SpectrumModel> GetRxSpectrumModel () const;
-  Ptr<AntennaModel> GetRxAntenna () const;
+  Ptr<Object> GetAntenna () const;
   void StartRx (Ptr<SpectrumSignalParameters> params);
 
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/spectrum/test/spectrum-ideal-phy-test.cc ns-3.36/src/spectrum/test/spectrum-ideal-phy-test.cc
--- ns-3.35/src/spectrum/test/spectrum-ideal-phy-test.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/spectrum/test/spectrum-ideal-phy-test.cc	2022-04-30 18:23:58.150735000 -0700
@@ -64,9 +64,21 @@
 }
 
 
+/**
+ * \ingroup spectrum-tests
+ *
+ * \brief Ideal Spectrum PHY Test
+ */
 class SpectrumIdealPhyTestCase : public TestCase
 {
 public:
+  /**
+   * Constructor
+   * \param snrLinear SNR (linear)
+   * \param phyRate PHY rate (bps)
+   * \param rateIsAchievable Check if the rate is achievable
+   * \param channelType Channel type
+   */
   SpectrumIdealPhyTestCase (double snrLinear,
 			    uint64_t phyRate,
 			    bool rateIsAchievable,
@@ -75,12 +87,19 @@
 
 private:
   virtual void DoRun (void);
+  /**
+   * Get the test name
+   * \param channelType Channel type
+   * \param snrLinear SNR (linear)
+   * \param phyRate PHY rate (bps)
+   * \return the test name
+   */
   static std::string Name (std::string channelType, double snrLinear, uint64_t phyRate);
   
-  double      m_snrLinear;
-  uint64_t    m_phyRate;
-  bool        m_rateIsAchievable;
-  std::string m_channelType;
+  double      m_snrLinear;        //!< SNR (linear)
+  uint64_t    m_phyRate;          //!< PHY rate (bps)
+  bool        m_rateIsAchievable; //!< Check if the rate is achievable
+  std::string m_channelType;      //!< Channel type
 };
 
 std::string 
@@ -210,7 +229,11 @@
 
 
 
-
+/**
+ * \ingroup spectrum-tests
+ *
+ * \brief Ideal Spectrum PHY TestSuite
+ */
 class SpectrumIdealPhyTestSuite : public TestSuite
 {
 public:
@@ -245,4 +268,5 @@
     }
 }
 
+/// Static variable for test initialization
 static SpectrumIdealPhyTestSuite g_spectrumIdealPhyTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/spectrum/test/spectrum-interference-test.cc ns-3.36/src/spectrum/test/spectrum-interference-test.cc
--- ns-3.35/src/spectrum/test/spectrum-interference-test.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/spectrum/test/spectrum-interference-test.cc	2022-04-30 18:23:58.150735000 -0700
@@ -34,19 +34,35 @@
 
 
 
+/**
+ * \ingroup spectrum-tests
+ *
+ * \brief Spectrum Interference Test
+ */
 class SpectrumInterferenceTestCase : public TestCase
 {
 public:
+  /**
+   * Constructor
+   * \param s Spectrum value
+   * \param txBytes number of bytes to transmit
+   * \param rxCorrect extected Rx bytes
+   * \param name test name
+   */
   SpectrumInterferenceTestCase (Ptr<SpectrumValue> s, uint32_t txBytes, bool rxCorrect, std::string name);
   virtual ~SpectrumInterferenceTestCase ();
   virtual void DoRun (void);
+  /**
+   * Retrieve the test results
+   * \param si SpectrumInterference instance
+   */
   void RetrieveTestResult (SpectrumInterference* si);
 
 private:
-  Ptr<SpectrumValue> m_s;
-  uint32_t m_txBytes;
-  uint32_t m_rxCorrectKnownOutcome;
-  Ptr<const SpectrumModel> m_mySpectrumModel;
+  Ptr<SpectrumValue> m_s;             //!< Spectrum value
+  uint32_t m_txBytes;                 //!< number of bytes to transmit
+  uint32_t m_rxCorrectKnownOutcome;   //!< extected Rx bytes
+  Ptr<const SpectrumModel> m_mySpectrumModel; //!< Spectrum model pointer
 };
 
 
@@ -130,6 +146,11 @@
 
 
 
+/**
+ * \ingroup spectrum-tests
+ *
+ * \brief Spectrum Interference TestSuite
+ */
 class SpectrumInterferenceTestSuite : public TestSuite
 {
 public:
@@ -191,4 +212,5 @@
 
 }
 
+/// Static variable for test initialization
 static SpectrumInterferenceTestSuite spectrumInterferenceTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/spectrum/test/spectrum-test.h ns-3.36/src/spectrum/test/spectrum-test.h
--- ns-3.35/src/spectrum/test/spectrum-test.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/spectrum/test/spectrum-test.h	2022-04-30 18:23:58.150735000 -0700
@@ -25,6 +25,14 @@
 
 
 /**
+ * \ingroup spectrum
+ * \defgroup spectrum-test Spectrum module tests
+ */
+
+
+/**
+ * \ingroup spectrum-tests
+ *
  * \brief Test if two SpectrumModel instances are equal within a given tolerance.
  *
  * This test compares component-by-component the two SpectrumModel
@@ -38,20 +46,16 @@
  *
  */
 #define NS_TEST_ASSERT_MSG_SPECTRUM_MODEL_EQ_TOL(actual, expected, tol, msg) \
-  NS_TEST_ASSERT_MSG_SPECTRUM_MODEL_EQ_TOL_INTERNAL (actual, expected, tol, msg, __FILE__, __LINE__)
-
-
-#define NS_TEST_ASSERT_MSG_SPECTRUM_MODEL_EQ_TOL_INTERNAL(actual, expected, tol, msg, file, line) \
-  do                                                                           \
-    {                                                                          \
-      Bands::const_iterator i = (actual).Begin ();                      \
-      Bands::const_iterator j = (expected).Begin ();                    \
-      uint32_t k = 0;                                                          \
-      while (i != (actual).End () && j != (expected).End ())            \
-        {                                                                      \
-          if ((i->fl > j->fl + (tol)) || (i->fl < j->fl - (tol))        \
-              || (i->fc > j->fc + (tol)) || (i->fc < j->fc - (tol))        \
-              || (i->fh > j->fh + (tol)) || (i->fh < j->fh - (tol)))       \
+  do                                                                         \
+    {                                                                        \
+      Bands::const_iterator i = (actual).Begin ();                           \
+      Bands::const_iterator j = (expected).Begin ();                         \
+      uint32_t k = 0;                                                        \
+      while (i != (actual).End () && j != (expected).End ())                 \
+        {                                                                    \
+          if ((i->fl > j->fl + (tol)) || (i->fl < j->fl - (tol))             \
+              || (i->fc > j->fc + (tol)) || (i->fc < j->fc - (tol))          \
+              || (i->fh > j->fh + (tol)) || (i->fh < j->fh - (tol)))         \
             {                                           \
               ASSERT_ON_FAILURE;                        \
               std::ostringstream indexStream;           \
@@ -63,7 +67,7 @@
               std::ostringstream expectedStream;        \
               expectedStream << j->fl << " <-- " << j->fc << " --> " << j->fh;          \
               ReportTestFailure (std::string (# actual) + indexStream.str () + " == " + std::string (# expected) + indexStream.str (),    \
-                                 actualStream.str (), expectedStream.str (), msgStream.str (), (file), (line)); \
+                                 actualStream.str (), expectedStream.str (), msgStream.str (), ( __FILE__), ( __LINE__)); \
               CONTINUE_ON_FAILURE;                                      \
             }                   \
           ++i;   \
@@ -79,13 +83,15 @@
           std::ostringstream expectedStream;        \
           expectedStream <<  (j != (expected).End ());              \
           ReportTestFailure ("Bands::iterator == End ()",                                  \
-                             actualStream.str (), expectedStream.str (), msgStream.str (), (file), (line)); \
+                             actualStream.str (), expectedStream.str (), msgStream.str (), ( __FILE__), ( __LINE__)); \
         } \
     }            \
   while (false); \
 
 
 /**
+ * \ingroup spectrum-tests
+ * 
  * \brief Test if two SpectrumValue instances are equal within a given tolerance.
  *
  * This test compares component-by-component the two SpectrumValue
@@ -99,12 +105,8 @@
  *
  */
 #define NS_TEST_ASSERT_MSG_SPECTRUM_VALUE_EQ_TOL(actual, expected, tol, msg) \
-  NS_TEST_ASSERT_MSG_SPECTRUM_VALUE_EQ_TOL_INTERNAL (actual, expected, tol, msg, __FILE__, __LINE__)
-
-
-#define NS_TEST_ASSERT_MSG_SPECTRUM_VALUE_EQ_TOL_INTERNAL(actual, expected, tol, msg, file, line) \
-  do                                                                           \
-    {                                                                          \
+  do                                                                         \
+    {                                                                        \
       Values::const_iterator i = (actual).ConstValuesBegin ();          \
       Values::const_iterator j = (expected).ConstValuesBegin ();        \
       uint32_t k = 0;                                                          \
@@ -122,7 +124,7 @@
               std::ostringstream expectedStream;        \
               expectedStream << expected;               \
               ReportTestFailure (std::string (# actual) + indexStream.str () + " == " + std::string (# expected) + indexStream.str (),    \
-                                 actualStream.str (), expectedStream.str (), msgStream.str (), file, line);     \
+                                 actualStream.str (), expectedStream.str (), msgStream.str (),  __FILE__,  __LINE__);     \
               CONTINUE_ON_FAILURE;                                      \
             }                   \
           ++i;   \
@@ -138,7 +140,7 @@
           std::ostringstream expectedStream;        \
           expectedStream <<  (j != (expected).ConstValuesEnd ());   \
           ReportTestFailure ("Values::const_iterator == ConstValuesEnd ()",                                        \
-                             actualStream.str (), expectedStream.str (), msgStream.str (), (file), (line)); \
+                             actualStream.str (), expectedStream.str (), msgStream.str (), ( __FILE__), ( __LINE__)); \
         } \
     }            \
   while (false); \
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/spectrum/test/spectrum-value-test.cc ns-3.36/src/spectrum/test/spectrum-value-test.cc
--- ns-3.35/src/spectrum/test/spectrum-value-test.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/spectrum/test/spectrum-value-test.cc	2022-04-30 18:23:58.150735000 -0700
@@ -34,17 +34,35 @@
 
 #define TOLERANCE 1e-6
 
+/**
+ * \ingroup spectrum-tests
+ *
+ * \brief Spectrum Value Test
+ */
 class SpectrumValueTestCase : public TestCase
 {
 public:
+  /**
+   * Constructor
+   * \param a first SpectrumValue
+   * \param b second SpectrumValue
+   * \param name test name
+   */
   SpectrumValueTestCase (SpectrumValue a, SpectrumValue b, std::string name);
   virtual ~SpectrumValueTestCase ();
   virtual void DoRun (void);
 
 private:
+  /**
+   * Check that two SpectrumValue are equal withing a tolerance
+   * \param x first SpectrumValue
+   * \param y second SpectrumValue
+   * \return true if the two values are withing the tolerance
+   */
   bool MoreOrLessEqual (SpectrumValue x, SpectrumValue y);
-  SpectrumValue m_a;
-  SpectrumValue m_b;
+
+  SpectrumValue m_a; //!< first SpectrumValue
+  SpectrumValue m_b; //!< second SpectrumValue
 };
 
 
@@ -78,10 +96,11 @@
 
 
 
-
-
-
-
+/**
+ * \ingroup spectrum-tests
+ *
+ * \brief Spectrum Value TestSuite
+ */
 class SpectrumValueTestSuite : public TestSuite
 {
 public:
@@ -246,10 +265,11 @@
 
 
 
-
-
-
-
+/**
+ * \ingroup spectrum-tests
+ *
+ * \brief Spectrum Converter TestSuite
+ */
 class SpectrumConverterTestSuite : public TestSuite
 {
 public:
@@ -327,15 +347,11 @@
 //   NS_LOG_LOGIC(t21b);
 //   NS_LOG_LOGIC(*res);
   AddTestCase (new SpectrumValueTestCase (t21b, *res, ""), TestCase::QUICK);
-
-
 }
 
 
 
-
-
-
-// static instance of test suites
+/// Static variable for test initialization
 static SpectrumValueTestSuite g_SpectrumValueTestSuite;
+/// Static variable for test initialization
 static SpectrumConverterTestSuite g_SpectrumConverterTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/spectrum/test/spectrum-waveform-generator-test.cc ns-3.36/src/spectrum/test/spectrum-waveform-generator-test.cc
--- ns-3.35/src/spectrum/test/spectrum-waveform-generator-test.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/spectrum/test/spectrum-waveform-generator-test.cc	2022-04-30 18:23:58.150735000 -0700
@@ -28,20 +28,36 @@
 
 
 
+/**
+ * \ingroup spectrum-tests
+ *
+ * \brief Waveform generator Test
+ */
 class WaveformGeneratorTestCase : public TestCase
 {
 public:
+  /**
+   * Constructor
+   * 
+   * \param period waveform period (seconds)
+   * \param dutyCycle waveform duty cycle
+   * \param stop stop time (seconds)
+   */
   WaveformGeneratorTestCase (double period, double dutyCycle, double stop);
   virtual ~WaveformGeneratorTestCase ();
 
 private:
   virtual void DoRun (void);
 
+  /**
+   * Trace if the waveform is active
+   * \param newPkt unused.
+   */
   void    TraceWave (Ptr<const Packet> newPkt);
-  double  m_period;
-  double  m_dutyCycle;
-  double  m_stop;
-  int     m_fails;
+  double  m_period;     //!< waveform period (seconds)
+  double  m_dutyCycle;  //!< waveform duty cycle 
+  double  m_stop;       //!< stop time (seconds)
+  int     m_fails;      //!< failure check
 };
 
 void
@@ -101,6 +117,11 @@
 }
 
 
+/**
+ * \ingroup spectrum-tests
+ *
+ * \brief Waveform generator TestSuite
+ */
 class WaveformGeneratorTestSuite : public TestSuite
 {
 public:
@@ -118,4 +139,5 @@
   AddTestCase (new WaveformGeneratorTestCase (1.0, 0.5, 1.7), TestCase::QUICK);
 }
 
+/// Static variable for test initialization
 static WaveformGeneratorTestSuite g_waveformGeneratorTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/spectrum/test/three-gpp-channel-test-suite.cc ns-3.36/src/spectrum/test/three-gpp-channel-test-suite.cc
--- ns-3.35/src/spectrum/test/three-gpp-channel-test-suite.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/spectrum/test/three-gpp-channel-test-suite.cc	2022-04-30 18:23:58.150735000 -0700
@@ -41,6 +41,8 @@
 NS_LOG_COMPONENT_DEFINE ("ThreeGppChannelTestSuite");
 
 /**
+ * \ingroup spectrum-tests
+ *
  * Test case for the ThreeGppChannelModel class.
  * 1) check if the channel matrix has the correct dimensions
  * 2) check if the channel matrix is correctly normalized
@@ -207,6 +209,8 @@
 }
 
 /**
+ * \ingroup spectrum-tests
+ *
  * Test case for the ThreeGppChannelModel class.
  * It checks if the channel realizations are correctly updated during the
  * simulation.
@@ -346,6 +350,48 @@
 }
 
 /**
+ * \ingroup spectrum-tests
+ * \brief A structure that holds the parameters for the function
+ * CheckLongTermUpdate. In this way the problem with the limited
+ * number of parameters of method Schedule is avoided.
+ */
+struct CheckLongTermUpdateParams
+{
+  Ptr<ThreeGppSpectrumPropagationLossModel> lossModel; //!< the ThreeGppSpectrumPropagationLossModel object used to compute the rx PSD
+  Ptr<SpectrumValue> txPsd; //!< the PSD of the tx signal
+  Ptr<MobilityModel> txMob; //!< the mobility model of the tx device
+  Ptr<MobilityModel> rxMob; //!< the mobility model of the rx device
+  Ptr<SpectrumValue> rxPsdOld; //!< the previously received PSD
+  Ptr<PhasedArrayModel> txAntenna; //!< the antenna array of the tx device
+  Ptr<PhasedArrayModel> rxAntenna; //!< the antenna array of the rx device
+
+  /**
+   * \brief Constructor
+   * \param pLossModel the ThreeGppSpectrumPropagationLossModel object used to compute the rx PSD
+   * \param pTxPsd the PSD of the tx signal
+   * \param pTxMob the tx mobility model
+   * \param pRxMob the rx mobility model
+   * \param pRxPsdOld the previously received PSD
+   * \param pTxAntenna the tx antenna array
+   * \param pRxAntenna the rx antenna array
+   */
+  CheckLongTermUpdateParams (Ptr<ThreeGppSpectrumPropagationLossModel> pLossModel, Ptr<SpectrumValue> pTxPsd,
+                             Ptr<MobilityModel> pTxMob, Ptr<MobilityModel> pRxMob, Ptr<SpectrumValue> pRxPsdOld,
+                             Ptr<PhasedArrayModel> pTxAntenna, Ptr<PhasedArrayModel> pRxAntenna)
+  {
+    lossModel = pLossModel;
+    txPsd = pTxPsd;
+    txMob = pTxMob;
+    rxMob = pRxMob;
+    rxPsdOld = pRxPsdOld;
+    txAntenna = pTxAntenna;
+    rxAntenna = pRxAntenna;
+  }
+};
+
+/**
+ * \ingroup spectrum-tests
+ * 
  * Test case for the ThreeGppSpectrumPropagationLossModelTest class.
  * 1) checks if the long term components for the direct and the reverse link
  *    are the same
@@ -384,14 +430,9 @@
   /**
    * Test of the long term component is correctly updated when the channel
    * matrix is recomputed
-   * \param lossModel the ThreeGppSpectrumPropagationLossModel object used to
-   *        compute the rx PSD
-   * \param txPsd the PSD of the transmitted signal
-   * \param txMob the mobility model of the tx device
-   * \param rxMob the mobility model of the rx device
-   * \param rxPsdOld the previously received PSD
+   * \param params a structure that contains the set of parameters needed by CheckLongTermUpdate in order to perform calculations
    */
-  void CheckLongTermUpdate (Ptr<ThreeGppSpectrumPropagationLossModel> lossModel, Ptr<SpectrumValue> txPsd, Ptr<MobilityModel> txMob, Ptr<MobilityModel> rxMob, Ptr<SpectrumValue> rxPsdOld);
+  void CheckLongTermUpdate (CheckLongTermUpdateParams &params);
 
   /**
    * Checks if two PSDs are equal
@@ -440,10 +481,10 @@
 }
 
 void
-ThreeGppSpectrumPropagationLossModelTest::CheckLongTermUpdate (Ptr<ThreeGppSpectrumPropagationLossModel> lossModel, Ptr<SpectrumValue> txPsd, Ptr<MobilityModel> txMob, Ptr<MobilityModel> rxMob, Ptr<SpectrumValue> rxPsdOld)
+ThreeGppSpectrumPropagationLossModelTest::CheckLongTermUpdate (CheckLongTermUpdateParams &params)
 {
-  Ptr<SpectrumValue> rxPsdNew = lossModel->DoCalcRxPowerSpectralDensity (txPsd, txMob, rxMob);
-  NS_TEST_ASSERT_MSG_EQ (ArePsdEqual (rxPsdOld, rxPsdNew),  false, "The long term is not updated when the channel matrix is recomputed");
+  Ptr<SpectrumValue> rxPsdNew = params.lossModel->DoCalcRxPowerSpectralDensity (params.txPsd, params.txMob, params.rxMob, params.txAntenna, params.rxAntenna);
+  NS_TEST_ASSERT_MSG_EQ (ArePsdEqual (params.rxPsdOld, rxPsdNew),  false, "The long term is not updated when the channel matrix is recomputed");
 }
 
 void
@@ -498,10 +539,6 @@
                                                                                     "NumRows", UintegerValue (rxAntennaElements [1]),
                                                                                     "AntennaElement", PointerValue(CreateObject<IsotropicAntennaModel> ()));
   
-  // initialize ThreeGppSpectrumPropagationLossModel
-  lossModel->AddDevice (txDev, txAntenna);
-  lossModel->AddDevice (rxDev, rxAntenna);
-
   // set the beamforming vectors
   DoBeamforming (txDev, txAntenna, rxDev, rxAntenna);
   DoBeamforming (rxDev, rxAntenna, txDev, txAntenna);
@@ -513,10 +550,10 @@
   Ptr<SpectrumValue> txPsd =  sf.CreateTxPowerSpectralDensity (txPower, channelNumber);
 
   // compute the rx psd
-  Ptr<SpectrumValue> rxPsdOld = lossModel->DoCalcRxPowerSpectralDensity (txPsd, txMob, rxMob);
+  Ptr<SpectrumValue> rxPsdOld = lossModel->DoCalcRxPowerSpectralDensity (txPsd, txMob, rxMob, txAntenna, rxAntenna);
 
   // 1) check that the rx PSD is equal for both the direct and the reverse channel
-  Ptr<SpectrumValue> rxPsdNew = lossModel->DoCalcRxPowerSpectralDensity (txPsd, rxMob, txMob);
+  Ptr<SpectrumValue> rxPsdNew = lossModel->DoCalcRxPowerSpectralDensity (txPsd, rxMob, txMob, rxAntenna, txAntenna);
   NS_TEST_ASSERT_MSG_EQ (ArePsdEqual (rxPsdOld, rxPsdNew),  true, "The long term for the direct and the reverse channel are different");
 
   // 2) check if the long term is updated when changing the BF vector
@@ -526,7 +563,7 @@
   txBfVector [0] = std::complex<double> (0.0, 0.0);
   txAntenna->SetBeamformingVector (txBfVector);
 
-  rxPsdNew = lossModel->DoCalcRxPowerSpectralDensity (txPsd, rxMob, txMob);
+  rxPsdNew = lossModel->DoCalcRxPowerSpectralDensity (txPsd, rxMob, txMob, rxAntenna, txAntenna);
   NS_TEST_ASSERT_MSG_EQ (ArePsdEqual (rxPsdOld, rxPsdNew),  false, "Changing the BF vectors the rx PSD does not change");
 
   // update rxPsdOld
@@ -534,14 +571,14 @@
 
   // 3) check if the long term is updated when the channel matrix is recomputed
   Simulator::Schedule (MilliSeconds (101), &ThreeGppSpectrumPropagationLossModelTest::CheckLongTermUpdate,
-                       this, lossModel, txPsd, txMob, rxMob, rxPsdOld);
+                       this, CheckLongTermUpdateParams (lossModel, txPsd, txMob, rxMob, rxPsdOld, txAntenna, rxAntenna));
 
   Simulator::Run ();
   Simulator::Destroy ();
 }
 
 /**
- * \ingroup spectrum
+ * \ingroup spectrum-tests
  *
  * Test suite for the ThreeGppChannelModel class
  */
@@ -562,4 +599,5 @@
   AddTestCase (new ThreeGppSpectrumPropagationLossModelTest, TestCase::QUICK);
 }
 
+/// Static variable for test initialization
 static ThreeGppChannelTestSuite myTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/spectrum/test/tv-helper-distribution-test.cc ns-3.36/src/spectrum/test/tv-helper-distribution-test.cc
--- ns-3.35/src/spectrum/test/tv-helper-distribution-test.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/spectrum/test/tv-helper-distribution-test.cc	2022-04-30 18:23:58.150735000 -0700
@@ -22,7 +22,13 @@
 #include <ns3/log.h>
 #include <ns3/tv-spectrum-transmitter-helper.h>
 
+NS_LOG_COMPONENT_DEFINE ("TvHelperDistributionTest");
+
+using namespace ns3;
+
 /**
+ * \ingroup spectrum-tests
+ * 
  * This test verifies the accuracy of the private GetRandomNumTransmitters()  
  * method in the TvSpectrumTransmitterHelper class. The method generates a 
  * random number corresponding to the number of TV transmitters to create based 
@@ -40,21 +46,26 @@
  * 41 and 60 transmitters can be created (all inclusive). This is tested with 
  * various cases.
  */
-NS_LOG_COMPONENT_DEFINE ("TvHelperDistributionTest");
-
-using namespace ns3;
-
-
 class TvHelperDistributionTestCase : public TestCase
 {
 public:
+  /**
+   * Constructor
+   * 
+   * \param maxNumTransmitters maximum number of transmitters.
+   */
   TvHelperDistributionTestCase (uint32_t maxNumTransmitters);
   virtual ~TvHelperDistributionTestCase ();
 
 private:
   virtual void DoRun (void);
+  /**
+   * Build the test name
+   * \param maxNumTransmitters maximum number of transmitters.
+   * \return The test name
+   */
   static std::string Name (uint32_t maxNumTransmitters);
-  uint32_t m_maxNumTransmitters;
+  uint32_t m_maxNumTransmitters;  //!< Maximum number of transmitters.
 };
 
 std::string 
@@ -120,6 +131,11 @@
 }
 
 
+/**
+ * \ingroup spectrum-tests
+ *
+ * Test suite for the TvSpectrumTransmitterHelper class
+ */
 class TvHelperDistributionTestSuite : public TestSuite
 {
 public:
@@ -137,4 +153,5 @@
     }
 }
 
+/// Static variable for test initialization
 static TvHelperDistributionTestSuite g_TvHelperDistributionTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/spectrum/test/tv-spectrum-transmitter-test.cc ns-3.36/src/spectrum/test/tv-spectrum-transmitter-test.cc
--- ns-3.35/src/spectrum/test/tv-spectrum-transmitter-test.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/spectrum/test/tv-spectrum-transmitter-test.cc	2022-04-30 18:23:58.150735000 -0700
@@ -25,13 +25,6 @@
 #include <ns3/double.h>
 #include <ns3/tv-spectrum-transmitter.h>
 
-/**
- * This test verifies the accuracy of the spectrum/PSD model in the 
- * TvSpectrumTransmitter class. To do so, it tests if the max power spectral 
- * density, start frequency, and end frequency comply with expected values. 
- * Values for TV/modulation type, start frequency, channel bandwidth, and 
- * base PSD are swept and tested for each case.
- */
 NS_LOG_COMPONENT_DEFINE ("TvSpectrumTransmitterTest");
 
 using namespace ns3;
@@ -41,9 +34,25 @@
 //           Follows http://realtimecollisiondetection.net/blog/?p=89
 double epsilon;
 
+/**
+ * \ingroup spectrum-tests
+ *
+ * This test verifies the accuracy of the spectrum/PSD model in the 
+ * TvSpectrumTransmitter class. To do so, it tests if the max power spectral 
+ * density, start frequency, and end frequency comply with expected values. 
+ * Values for TV/modulation type, start frequency, channel bandwidth, and 
+ * base PSD are swept and tested for each case.
+ */
 class TvSpectrumTransmitterTestCase : public TestCase
 {
 public:
+  /**
+   * Constructor
+   * \param startFrequency Start frequency.
+   * \param channelBandwidth Channel Bandwidth.
+   * \param basePsd Base Power Spectral Density (PSD).
+   * \param tvType TV type.
+   */
   TvSpectrumTransmitterTestCase (double startFrequency, 
                             double channelBandwidth, 
                             double basePsd, 
@@ -52,15 +61,23 @@
 
 private:
   virtual void DoRun (void);
+  /**
+   * Build the test name
+   * \param tvType TV type.
+   * \param startFrequency Start frequency.
+   * \param channelBandwidth Channel Bandwidth.
+   * \param basePsd Base Power Spectral Density (PSD).
+   * \return The test name
+   */
   static std::string Name (TvSpectrumTransmitter::TvType tvType, 
                            double startFrequency, 
                            double channelBandwidth, 
                            double basePsd);
 
-  double m_startFrequency;
-  double m_channelBandwidth; 
-  double m_basePsd;
-  TvSpectrumTransmitter::TvType m_tvType;
+  double m_startFrequency;      //!< Start frequency.
+  double m_channelBandwidth;    //!< Channel Bandwidth.
+  double m_basePsd;             //!< Base Power Spectral Density (PSD).
+  TvSpectrumTransmitter::TvType m_tvType; //!< TV type.
 };
 
 
@@ -154,6 +171,11 @@
 }
 
 
+/**
+ * \ingroup spectrum-tests
+ *
+ * Test suite for the TvSpectrumTransmitter class
+ */
 class TvSpectrumTransmitterTestSuite : public TestSuite
 {
 public:
@@ -208,4 +230,5 @@
     }
 }
 
+/// Static variable for test initialization
 static TvSpectrumTransmitterTestSuite g_tvSpectrumTransmitterTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/spectrum/wscript ns-3.36/src/spectrum/wscript
--- ns-3.35/src/spectrum/wscript	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/spectrum/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,104 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-
-    module = bld.create_ns3_module('spectrum', ['propagation', 'antenna'])
-    module.source = [
-        'model/spectrum-model.cc',
-        'model/spectrum-value.cc',
-        'model/spectrum-converter.cc',
-        'model/spectrum-signal-parameters.cc',
-        'model/spectrum-propagation-loss-model.cc',
-        'model/friis-spectrum-propagation-loss.cc',
-        'model/constant-spectrum-propagation-loss.cc',
-        'model/spectrum-phy.cc',
-        'model/spectrum-channel.cc',
-        'model/single-model-spectrum-channel.cc',
-        'model/multi-model-spectrum-channel.cc',
-        'model/spectrum-interference.cc',
-        'model/spectrum-error-model.cc',
-        'model/spectrum-model-ism2400MHz-res1MHz.cc',
-        'model/spectrum-model-300kHz-300GHz-log.cc',
-        'model/wifi-spectrum-value-helper.cc',
-        'model/waveform-generator.cc',
-        'model/spectrum-analyzer.cc',
-        'model/aloha-noack-mac-header.cc',
-        'model/aloha-noack-net-device.cc',
-        'model/half-duplex-ideal-phy.cc',
-        'model/half-duplex-ideal-phy-signal-parameters.cc',
-        'model/non-communicating-net-device.cc',
-        'model/microwave-oven-spectrum-value-helper.cc',
-        'model/tv-spectrum-transmitter.cc',
-        'model/trace-fading-loss-model.cc',
-        'model/three-gpp-spectrum-propagation-loss-model.cc',
-        'model/three-gpp-channel-model.cc',
-        'model/matrix-based-channel-model.cc',
-        'helper/spectrum-helper.cc',
-        'helper/adhoc-aloha-noack-ideal-phy-helper.cc',
-        'helper/waveform-generator-helper.cc',
-        'helper/spectrum-analyzer-helper.cc',
-        'helper/tv-spectrum-transmitter-helper.cc',
-        ]
-
-    module_test = bld.create_ns3_module_test_library('spectrum')
-    module_test.source = [
-        'test/spectrum-interference-test.cc',
-        'test/spectrum-value-test.cc',
-        'test/spectrum-ideal-phy-test.cc',
-        'test/spectrum-waveform-generator-test.cc',
-        'test/tv-helper-distribution-test.cc',
-        'test/tv-spectrum-transmitter-test.cc',
-        'test/three-gpp-channel-test-suite.cc',
-        ]
-
-    # Tests encapsulating example programs should be listed here
-    if (bld.env['ENABLE_EXAMPLES']):
-        module_test.source.extend([
-        #   'test/spectrum-examples-test-suite.cc',
-            ])
-    
-    headers = bld(features='ns3header')
-    headers.module = 'spectrum'
-    headers.source = [
-        'model/spectrum-model.h',
-        'model/spectrum-value.h',
-        'model/spectrum-converter.h',
-        'model/spectrum-signal-parameters.h',
-        'model/spectrum-propagation-loss-model.h',
-        'model/friis-spectrum-propagation-loss.h',
-        'model/constant-spectrum-propagation-loss.h',
-        'model/spectrum-phy.h',
-        'model/spectrum-channel.h',
-        'model/single-model-spectrum-channel.h',
-        'model/multi-model-spectrum-channel.h',
-        'model/spectrum-interference.h',
-        'model/spectrum-error-model.h',
-        'model/spectrum-model-ism2400MHz-res1MHz.h',
-        'model/spectrum-model-300kHz-300GHz-log.h',
-        'model/wifi-spectrum-value-helper.h',
-        'model/waveform-generator.h',
-        'model/spectrum-analyzer.h',
-        'model/aloha-noack-mac-header.h',
-        'model/aloha-noack-net-device.h',
-        'model/half-duplex-ideal-phy.h',
-        'model/half-duplex-ideal-phy-signal-parameters.h',
-        'model/non-communicating-net-device.h',
-        'model/microwave-oven-spectrum-value-helper.h',
-        'model/tv-spectrum-transmitter.h',
-        'model/trace-fading-loss-model.h',
-        'model/three-gpp-spectrum-propagation-loss-model.h',
-        'model/three-gpp-channel-model.h',
-        'model/matrix-based-channel-model.h',
-        'helper/spectrum-helper.h',
-        'helper/adhoc-aloha-noack-ideal-phy-helper.h',
-        'helper/waveform-generator-helper.h',
-        'helper/spectrum-analyzer-helper.h',
-        'helper/tv-spectrum-transmitter-helper.h',
-        'test/spectrum-test.h',
-        ]
-
-    if (bld.env['ENABLE_EXAMPLES']):
-        bld.recurse('examples')
-
-
-    bld.ns3_python_bindings()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/stats/bindings/callbacks_list.py ns-3.36/src/stats/bindings/callbacks_list.py
--- ns-3.35/src/stats/bindings/callbacks_list.py	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/stats/bindings/callbacks_list.py	2022-04-30 18:23:58.150735000 -0700
@@ -1,7 +1,7 @@
 callback_classes = [
     ['ns3::ObjectBase *', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'bool', 'bool', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'double', 'double', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'bool', 'bool', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'unsigned short', 'unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'unsigned int', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'unsigned char', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/stats/bindings/modulegen__gcc_ILP32.py ns-3.36/src/stats/bindings/modulegen__gcc_ILP32.py
--- ns-3.35/src/stats/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/stats/bindings/modulegen__gcc_ILP32.py	2022-04-30 18:23:58.150735000 -0700
@@ -45,12 +45,12 @@
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::EventImpl'])
     ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::Hash::Implementation> [struct]
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::Hash::Implementation'])
-    ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::SQLiteOutput> [struct]
-    module.add_class('DefaultDeleter', template_parameters=['ns3::SQLiteOutput'])
     ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::TraceSourceAccessor> [struct]
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::TraceSourceAccessor'])
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'], import_from_module='ns.core')
     ## file-helper.h (module 'stats'): ns3::FileHelper [class]
     module.add_class('FileHelper')
     ## gnuplot.h (module 'stats'): ns3::Gnuplot [class]
@@ -140,21 +140,19 @@
     module.add_class('Object', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter >'])
     ## object.h (module 'core'): ns3::Object::AggregateIterator [class]
     module.add_class('AggregateIterator', import_from_module='ns.core', outer_class=root_module['ns3::Object'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SQLiteOutput, ns3::empty, ns3::DefaultDeleter<ns3::SQLiteOutput> > [class]
-    module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::SQLiteOutput', 'ns3::empty', 'ns3::DefaultDeleter<ns3::SQLiteOutput>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
     module.add_class('TraceSourceAccessor', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >'])
@@ -216,10 +214,6 @@
     module.add_class('OmnetDataOutput', parent=root_module['ns3::DataOutputInterface'])
     ## probe.h (module 'stats'): ns3::Probe [class]
     module.add_class('Probe', parent=root_module['ns3::DataCollectionObject'])
-    ## sqlite-output.h (module 'stats'): ns3::SQLiteOutput [class]
-    module.add_class('SQLiteOutput', parent=root_module['ns3::SimpleRefCount< ns3::SQLiteOutput, ns3::empty, ns3::DefaultDeleter<ns3::SQLiteOutput> >'])
-    ## sqlite-data-output.h (module 'stats'): ns3::SqliteDataOutput [class]
-    module.add_class('SqliteDataOutput', parent=root_module['ns3::DataOutputInterface'])
     ## time-data-calculators.h (module 'stats'): ns3::TimeMinMaxAvgTotalCalculator [class]
     module.add_class('TimeMinMaxAvgTotalCalculator', parent=root_module['ns3::DataCalculator'])
     ## time-probe.h (module 'stats'): ns3::TimeProbe [class]
@@ -259,7 +253,7 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned short', 'unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## double-probe.h (module 'stats'): ns3::DoubleProbe [class]
     module.add_class('DoubleProbe', parent=root_module['ns3::Probe'])
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     typehandlers.add_type_alias('std::list< ns3::Ptr< ns3::DataCalculator > >', 'ns3::DataCalculatorList')
     typehandlers.add_type_alias('std::list< ns3::Ptr< ns3::DataCalculator > >*', 'ns3::DataCalculatorList*')
     typehandlers.add_type_alias('std::list< ns3::Ptr< ns3::DataCalculator > >&', 'ns3::DataCalculatorList&')
@@ -386,7 +380,6 @@
     register_Ns3DefaultDeleter__Ns3CallbackImplBase_methods(root_module, root_module['ns3::DefaultDeleter< ns3::CallbackImplBase >'])
     register_Ns3DefaultDeleter__Ns3EventImpl_methods(root_module, root_module['ns3::DefaultDeleter< ns3::EventImpl >'])
     register_Ns3DefaultDeleter__Ns3HashImplementation_methods(root_module, root_module['ns3::DefaultDeleter< ns3::Hash::Implementation >'])
-    register_Ns3DefaultDeleter__Ns3SQLiteOutput_methods(root_module, root_module['ns3::DefaultDeleter< ns3::SQLiteOutput >'])
     register_Ns3DefaultDeleter__Ns3TraceSourceAccessor_methods(root_module, root_module['ns3::DefaultDeleter< ns3::TraceSourceAccessor >'])
     register_Ns3EventId_methods(root_module, root_module['ns3::EventId'])
     register_Ns3FileHelper_methods(root_module, root_module['ns3::FileHelper'])
@@ -428,7 +421,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__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >'])
     register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >'])
-    register_Ns3SimpleRefCount__Ns3SQLiteOutput_Ns3Empty_Ns3DefaultDeleter__lt__ns3SQLiteOutput__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::SQLiteOutput, ns3::empty, ns3::DefaultDeleter<ns3::SQLiteOutput> >'])
     register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >'])
     register_Ns3TraceSourceAccessor_methods(root_module, root_module['ns3::TraceSourceAccessor'])
     register_Ns3AttributeAccessor_methods(root_module, root_module['ns3::AttributeAccessor'])
@@ -458,8 +450,6 @@
     register_Ns3ObjectFactoryValue_methods(root_module, root_module['ns3::ObjectFactoryValue'])
     register_Ns3OmnetDataOutput_methods(root_module, root_module['ns3::OmnetDataOutput'])
     register_Ns3Probe_methods(root_module, root_module['ns3::Probe'])
-    register_Ns3SQLiteOutput_methods(root_module, root_module['ns3::SQLiteOutput'])
-    register_Ns3SqliteDataOutput_methods(root_module, root_module['ns3::SqliteDataOutput'])
     register_Ns3TimeMinMaxAvgTotalCalculator_methods(root_module, root_module['ns3::TimeMinMaxAvgTotalCalculator'])
     register_Ns3TimeProbe_methods(root_module, root_module['ns3::TimeProbe'])
     register_Ns3TimeSeriesAdaptor_methods(root_module, root_module['ns3::TimeSeriesAdaptor'])
@@ -648,18 +638,6 @@
                    is_static=True)
     return
 
-def register_Ns3DefaultDeleter__Ns3SQLiteOutput_methods(root_module, cls):
-    ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::SQLiteOutput>::DefaultDeleter() [constructor]
-    cls.add_constructor([])
-    ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::SQLiteOutput>::DefaultDeleter(ns3::DefaultDeleter<ns3::SQLiteOutput> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::DefaultDeleter< ns3::SQLiteOutput > const &', 'arg0')])
-    ## default-deleter.h (module 'core'): static void ns3::DefaultDeleter<ns3::SQLiteOutput>::Delete(ns3::SQLiteOutput * object) [member function]
-    cls.add_method('Delete', 
-                   'void', 
-                   [param('ns3::SQLiteOutput *', 'object')], 
-                   is_static=True)
-    return
-
 def register_Ns3DefaultDeleter__Ns3TraceSourceAccessor_methods(root_module, cls):
     ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::TraceSourceAccessor>::DefaultDeleter() [constructor]
     cls.add_constructor([])
@@ -1723,8 +1701,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -1952,14 +1930,14 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('>=')
     cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_unary_numeric_operator('-')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
     cls.add_constructor([])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(double const value) [constructor]
@@ -1978,6 +1956,8 @@
     cls.add_constructor([param('long unsigned int const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int const v) [constructor]
     cls.add_constructor([param('long long unsigned int const', 'v')])
+    ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int128_t const v) [constructor]
+    cls.add_constructor([param('int128_t const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t const hi, uint64_t const lo) [constructor]
     cls.add_constructor([param('int64_t const', 'hi'), param('uint64_t const', 'lo')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [constructor]
@@ -2189,58 +2169,51 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
-def register_Ns3SimpleRefCount__Ns3SQLiteOutput_Ns3Empty_Ns3DefaultDeleter__lt__ns3SQLiteOutput__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SQLiteOutput, ns3::empty, ns3::DefaultDeleter<ns3::SQLiteOutput> >::SimpleRefCount() [constructor]
-    cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SQLiteOutput, ns3::empty, ns3::DefaultDeleter<ns3::SQLiteOutput> >::SimpleRefCount(ns3::SimpleRefCount<ns3::SQLiteOutput, ns3::empty, ns3::DefaultDeleter<ns3::SQLiteOutput> > const & o) [constructor]
-    cls.add_constructor([param('ns3::SimpleRefCount< ns3::SQLiteOutput, ns3::empty, ns3::DefaultDeleter< ns3::SQLiteOutput > > const &', 'o')])
-    return
-
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
@@ -2613,11 +2586,11 @@
     cls.add_method('AddMetadata', 
                    'void', 
                    [param('std::string', 'key'), param('uint32_t', 'value')])
-    ## data-collector.h (module 'stats'): std::list<ns3::Ptr<ns3::DataCalculator>, std::allocator<ns3::Ptr<ns3::DataCalculator> > >::iterator ns3::DataCollector::DataCalculatorBegin() [member function]
+    ## data-collector.h (module 'stats'): std::list<ns3::Ptr<ns3::DataCalculator>, std::allocator<ns3::Ptr<ns3::DataCalculator>>>::iterator ns3::DataCollector::DataCalculatorBegin() [member function]
     cls.add_method('DataCalculatorBegin', 
                    'std::list< ns3::Ptr< ns3::DataCalculator > > iterator', 
                    [])
-    ## data-collector.h (module 'stats'): std::list<ns3::Ptr<ns3::DataCalculator>, std::allocator<ns3::Ptr<ns3::DataCalculator> > >::iterator ns3::DataCollector::DataCalculatorEnd() [member function]
+    ## data-collector.h (module 'stats'): std::list<ns3::Ptr<ns3::DataCalculator>, std::allocator<ns3::Ptr<ns3::DataCalculator>>>::iterator ns3::DataCollector::DataCalculatorEnd() [member function]
     cls.add_method('DataCalculatorEnd', 
                    'std::list< ns3::Ptr< ns3::DataCalculator > > iterator', 
                    [])
@@ -2655,11 +2628,11 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## data-collector.h (module 'stats'): std::list<std::pair<std::basic_string<char>, std::basic_string<char> >, std::allocator<std::pair<std::basic_string<char>, std::basic_string<char> > > >::iterator ns3::DataCollector::MetadataBegin() [member function]
+    ## data-collector.h (module 'stats'): std::list<std::pair<std::basic_string<char>, std::basic_string<char>>, std::allocator<std::pair<std::basic_string<char>, std::basic_string<char>>>>::iterator ns3::DataCollector::MetadataBegin() [member function]
     cls.add_method('MetadataBegin', 
                    'std::list< std::pair< std::string, std::string > > iterator', 
                    [])
-    ## data-collector.h (module 'stats'): std::list<std::pair<std::basic_string<char>, std::basic_string<char> >, std::allocator<std::pair<std::basic_string<char>, std::basic_string<char> > > >::iterator ns3::DataCollector::MetadataEnd() [member function]
+    ## data-collector.h (module 'stats'): std::list<std::pair<std::basic_string<char>, std::basic_string<char>>, std::allocator<std::pair<std::basic_string<char>, std::basic_string<char>>>>::iterator ns3::DataCollector::MetadataEnd() [member function]
     cls.add_method('MetadataEnd', 
                    'std::list< std::pair< std::string, std::string > > iterator', 
                    [])
@@ -3309,119 +3282,6 @@
                    is_const=True, is_virtual=True)
     return
 
-def register_Ns3SQLiteOutput_methods(root_module, cls):
-    ## sqlite-output.h (module 'stats'): ns3::SQLiteOutput::SQLiteOutput(ns3::SQLiteOutput const & arg0) [constructor]
-    cls.add_constructor([param('ns3::SQLiteOutput const &', 'arg0')])
-    ## sqlite-output.h (module 'stats'): ns3::SQLiteOutput::SQLiteOutput(std::string const & name, std::string const & semName) [constructor]
-    cls.add_constructor([param('std::string const &', 'name'), param('std::string const &', 'semName')])
-    ## sqlite-output.h (module 'stats'): void ns3::SQLiteOutput::SetJournalInMemory() [member function]
-    cls.add_method('SetJournalInMemory', 
-                   'void', 
-                   [])
-    ## sqlite-output.h (module 'stats'): bool ns3::SQLiteOutput::SpinExec(std::string const & cmd) const [member function]
-    cls.add_method('SpinExec', 
-                   'bool', 
-                   [param('std::string const &', 'cmd')], 
-                   is_const=True)
-    ## sqlite-output.h (module 'stats'): bool ns3::SQLiteOutput::SpinExec(sqlite3_stmt * stmt) const [member function]
-    cls.add_method('SpinExec', 
-                   'bool', 
-                   [param('sqlite3_stmt *', 'stmt')], 
-                   is_const=True)
-    ## sqlite-output.h (module 'stats'): static int ns3::SQLiteOutput::SpinFinalize(sqlite3_stmt * stmt) [member function]
-    cls.add_method('SpinFinalize', 
-                   'int', 
-                   [param('sqlite3_stmt *', 'stmt')], 
-                   is_static=True)
-    ## sqlite-output.h (module 'stats'): bool ns3::SQLiteOutput::SpinPrepare(sqlite3_stmt * * stmt, std::string const & cmd) const [member function]
-    cls.add_method('SpinPrepare', 
-                   'bool', 
-                   [param('sqlite3_stmt * *', 'stmt'), param('std::string const &', 'cmd')], 
-                   is_const=True)
-    ## sqlite-output.h (module 'stats'): static int ns3::SQLiteOutput::SpinReset(sqlite3_stmt * stmt) [member function]
-    cls.add_method('SpinReset', 
-                   'int', 
-                   [param('sqlite3_stmt *', 'stmt')], 
-                   is_static=True)
-    ## sqlite-output.h (module 'stats'): static int ns3::SQLiteOutput::SpinStep(sqlite3_stmt * stmt) [member function]
-    cls.add_method('SpinStep', 
-                   'int', 
-                   [param('sqlite3_stmt *', 'stmt')], 
-                   is_static=True)
-    ## sqlite-output.h (module 'stats'): bool ns3::SQLiteOutput::WaitExec(std::string const & cmd) const [member function]
-    cls.add_method('WaitExec', 
-                   'bool', 
-                   [param('std::string const &', 'cmd')], 
-                   is_const=True)
-    ## sqlite-output.h (module 'stats'): bool ns3::SQLiteOutput::WaitExec(sqlite3_stmt * stmt) const [member function]
-    cls.add_method('WaitExec', 
-                   'bool', 
-                   [param('sqlite3_stmt *', 'stmt')], 
-                   is_const=True)
-    ## sqlite-output.h (module 'stats'): bool ns3::SQLiteOutput::WaitPrepare(sqlite3_stmt * * stmt, std::string const & cmd) const [member function]
-    cls.add_method('WaitPrepare', 
-                   'bool', 
-                   [param('sqlite3_stmt * *', 'stmt'), param('std::string const &', 'cmd')], 
-                   is_const=True)
-    ## sqlite-output.h (module 'stats'): static bool ns3::SQLiteOutput::CheckError(sqlite3 * db, int rc, std::string const & cmd, sem_t * sem, bool hardExit) [member function]
-    cls.add_method('CheckError', 
-                   'bool', 
-                   [param('sqlite3 *', 'db'), param('int', 'rc'), param('std::string const &', 'cmd'), param('sem_t *', 'sem'), param('bool', 'hardExit')], 
-                   is_static=True, visibility='protected')
-    ## sqlite-output.h (module 'stats'): static void ns3::SQLiteOutput::Error(sqlite3 * db, std::string const & cmd) [member function]
-    cls.add_method('Error', 
-                   'void', 
-                   [param('sqlite3 *', 'db'), param('std::string const &', 'cmd')], 
-                   is_static=True, visibility='protected')
-    ## sqlite-output.h (module 'stats'): static int ns3::SQLiteOutput::SpinExec(sqlite3 * db, std::string const & cmd) [member function]
-    cls.add_method('SpinExec', 
-                   'int', 
-                   [param('sqlite3 *', 'db'), param('std::string const &', 'cmd')], 
-                   is_static=True, visibility='protected')
-    ## sqlite-output.h (module 'stats'): static int ns3::SQLiteOutput::SpinExec(sqlite3 * db, sqlite3_stmt * stmt) [member function]
-    cls.add_method('SpinExec', 
-                   'int', 
-                   [param('sqlite3 *', 'db'), param('sqlite3_stmt *', 'stmt')], 
-                   is_static=True, visibility='protected')
-    ## sqlite-output.h (module 'stats'): static int ns3::SQLiteOutput::SpinPrepare(sqlite3 * db, sqlite3_stmt * * stmt, std::string const & cmd) [member function]
-    cls.add_method('SpinPrepare', 
-                   'int', 
-                   [param('sqlite3 *', 'db'), param('sqlite3_stmt * *', 'stmt'), param('std::string const &', 'cmd')], 
-                   is_static=True, visibility='protected')
-    ## sqlite-output.h (module 'stats'): int ns3::SQLiteOutput::WaitExec(sqlite3 * db, std::string const & cmd) const [member function]
-    cls.add_method('WaitExec', 
-                   'int', 
-                   [param('sqlite3 *', 'db'), param('std::string const &', 'cmd')], 
-                   is_const=True, visibility='protected')
-    ## sqlite-output.h (module 'stats'): int ns3::SQLiteOutput::WaitExec(sqlite3 * db, sqlite3_stmt * stmt) const [member function]
-    cls.add_method('WaitExec', 
-                   'int', 
-                   [param('sqlite3 *', 'db'), param('sqlite3_stmt *', 'stmt')], 
-                   is_const=True, visibility='protected')
-    ## sqlite-output.h (module 'stats'): int ns3::SQLiteOutput::WaitPrepare(sqlite3 * db, sqlite3_stmt * * stmt, std::string const & cmd) const [member function]
-    cls.add_method('WaitPrepare', 
-                   'int', 
-                   [param('sqlite3 *', 'db'), param('sqlite3_stmt * *', 'stmt'), param('std::string const &', 'cmd')], 
-                   is_const=True, visibility='protected')
-    return
-
-def register_Ns3SqliteDataOutput_methods(root_module, cls):
-    ## sqlite-data-output.h (module 'stats'): ns3::SqliteDataOutput::SqliteDataOutput(ns3::SqliteDataOutput const & arg0) [constructor]
-    cls.add_constructor([param('ns3::SqliteDataOutput const &', 'arg0')])
-    ## sqlite-data-output.h (module 'stats'): ns3::SqliteDataOutput::SqliteDataOutput() [constructor]
-    cls.add_constructor([])
-    ## sqlite-data-output.h (module 'stats'): static ns3::TypeId ns3::SqliteDataOutput::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## sqlite-data-output.h (module 'stats'): void ns3::SqliteDataOutput::Output(ns3::DataCollector & dc) [member function]
-    cls.add_method('Output', 
-                   'void', 
-                   [param('ns3::DataCollector &', 'dc')], 
-                   is_virtual=True)
-    return
-
 def register_Ns3TimeMinMaxAvgTotalCalculator_methods(root_module, cls):
     ## time-data-calculators.h (module 'stats'): ns3::TimeMinMaxAvgTotalCalculator::TimeMinMaxAvgTotalCalculator(ns3::TimeMinMaxAvgTotalCalculator const & arg0) [constructor]
     cls.add_constructor([param('ns3::TimeMinMaxAvgTotalCalculator const &', 'arg0')])
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/stats/bindings/modulegen__gcc_LP64.py ns-3.36/src/stats/bindings/modulegen__gcc_LP64.py
--- ns-3.35/src/stats/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/stats/bindings/modulegen__gcc_LP64.py	2022-04-30 18:23:58.150735000 -0700
@@ -45,12 +45,12 @@
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::EventImpl'])
     ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::Hash::Implementation> [struct]
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::Hash::Implementation'])
-    ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::SQLiteOutput> [struct]
-    module.add_class('DefaultDeleter', template_parameters=['ns3::SQLiteOutput'])
     ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::TraceSourceAccessor> [struct]
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::TraceSourceAccessor'])
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'], import_from_module='ns.core')
     ## file-helper.h (module 'stats'): ns3::FileHelper [class]
     module.add_class('FileHelper')
     ## gnuplot.h (module 'stats'): ns3::Gnuplot [class]
@@ -140,21 +140,19 @@
     module.add_class('Object', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter >'])
     ## object.h (module 'core'): ns3::Object::AggregateIterator [class]
     module.add_class('AggregateIterator', import_from_module='ns.core', outer_class=root_module['ns3::Object'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SQLiteOutput, ns3::empty, ns3::DefaultDeleter<ns3::SQLiteOutput> > [class]
-    module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::SQLiteOutput', 'ns3::empty', 'ns3::DefaultDeleter<ns3::SQLiteOutput>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
     module.add_class('TraceSourceAccessor', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >'])
@@ -216,10 +214,6 @@
     module.add_class('OmnetDataOutput', parent=root_module['ns3::DataOutputInterface'])
     ## probe.h (module 'stats'): ns3::Probe [class]
     module.add_class('Probe', parent=root_module['ns3::DataCollectionObject'])
-    ## sqlite-output.h (module 'stats'): ns3::SQLiteOutput [class]
-    module.add_class('SQLiteOutput', parent=root_module['ns3::SimpleRefCount< ns3::SQLiteOutput, ns3::empty, ns3::DefaultDeleter<ns3::SQLiteOutput> >'])
-    ## sqlite-data-output.h (module 'stats'): ns3::SqliteDataOutput [class]
-    module.add_class('SqliteDataOutput', parent=root_module['ns3::DataOutputInterface'])
     ## time-data-calculators.h (module 'stats'): ns3::TimeMinMaxAvgTotalCalculator [class]
     module.add_class('TimeMinMaxAvgTotalCalculator', parent=root_module['ns3::DataCalculator'])
     ## time-probe.h (module 'stats'): ns3::TimeProbe [class]
@@ -259,7 +253,7 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned short', 'unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## double-probe.h (module 'stats'): ns3::DoubleProbe [class]
     module.add_class('DoubleProbe', parent=root_module['ns3::Probe'])
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     typehandlers.add_type_alias('std::list< ns3::Ptr< ns3::DataCalculator > >', 'ns3::DataCalculatorList')
     typehandlers.add_type_alias('std::list< ns3::Ptr< ns3::DataCalculator > >*', 'ns3::DataCalculatorList*')
     typehandlers.add_type_alias('std::list< ns3::Ptr< ns3::DataCalculator > >&', 'ns3::DataCalculatorList&')
@@ -386,7 +380,6 @@
     register_Ns3DefaultDeleter__Ns3CallbackImplBase_methods(root_module, root_module['ns3::DefaultDeleter< ns3::CallbackImplBase >'])
     register_Ns3DefaultDeleter__Ns3EventImpl_methods(root_module, root_module['ns3::DefaultDeleter< ns3::EventImpl >'])
     register_Ns3DefaultDeleter__Ns3HashImplementation_methods(root_module, root_module['ns3::DefaultDeleter< ns3::Hash::Implementation >'])
-    register_Ns3DefaultDeleter__Ns3SQLiteOutput_methods(root_module, root_module['ns3::DefaultDeleter< ns3::SQLiteOutput >'])
     register_Ns3DefaultDeleter__Ns3TraceSourceAccessor_methods(root_module, root_module['ns3::DefaultDeleter< ns3::TraceSourceAccessor >'])
     register_Ns3EventId_methods(root_module, root_module['ns3::EventId'])
     register_Ns3FileHelper_methods(root_module, root_module['ns3::FileHelper'])
@@ -428,7 +421,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__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >'])
     register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >'])
-    register_Ns3SimpleRefCount__Ns3SQLiteOutput_Ns3Empty_Ns3DefaultDeleter__lt__ns3SQLiteOutput__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::SQLiteOutput, ns3::empty, ns3::DefaultDeleter<ns3::SQLiteOutput> >'])
     register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >'])
     register_Ns3TraceSourceAccessor_methods(root_module, root_module['ns3::TraceSourceAccessor'])
     register_Ns3AttributeAccessor_methods(root_module, root_module['ns3::AttributeAccessor'])
@@ -458,8 +450,6 @@
     register_Ns3ObjectFactoryValue_methods(root_module, root_module['ns3::ObjectFactoryValue'])
     register_Ns3OmnetDataOutput_methods(root_module, root_module['ns3::OmnetDataOutput'])
     register_Ns3Probe_methods(root_module, root_module['ns3::Probe'])
-    register_Ns3SQLiteOutput_methods(root_module, root_module['ns3::SQLiteOutput'])
-    register_Ns3SqliteDataOutput_methods(root_module, root_module['ns3::SqliteDataOutput'])
     register_Ns3TimeMinMaxAvgTotalCalculator_methods(root_module, root_module['ns3::TimeMinMaxAvgTotalCalculator'])
     register_Ns3TimeProbe_methods(root_module, root_module['ns3::TimeProbe'])
     register_Ns3TimeSeriesAdaptor_methods(root_module, root_module['ns3::TimeSeriesAdaptor'])
@@ -648,18 +638,6 @@
                    is_static=True)
     return
 
-def register_Ns3DefaultDeleter__Ns3SQLiteOutput_methods(root_module, cls):
-    ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::SQLiteOutput>::DefaultDeleter() [constructor]
-    cls.add_constructor([])
-    ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::SQLiteOutput>::DefaultDeleter(ns3::DefaultDeleter<ns3::SQLiteOutput> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::DefaultDeleter< ns3::SQLiteOutput > const &', 'arg0')])
-    ## default-deleter.h (module 'core'): static void ns3::DefaultDeleter<ns3::SQLiteOutput>::Delete(ns3::SQLiteOutput * object) [member function]
-    cls.add_method('Delete', 
-                   'void', 
-                   [param('ns3::SQLiteOutput *', 'object')], 
-                   is_static=True)
-    return
-
 def register_Ns3DefaultDeleter__Ns3TraceSourceAccessor_methods(root_module, cls):
     ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::TraceSourceAccessor>::DefaultDeleter() [constructor]
     cls.add_constructor([])
@@ -1723,8 +1701,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -1952,14 +1930,14 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('>=')
     cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_unary_numeric_operator('-')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
     cls.add_constructor([])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(double const value) [constructor]
@@ -1978,6 +1956,8 @@
     cls.add_constructor([param('long unsigned int const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int const v) [constructor]
     cls.add_constructor([param('long long unsigned int const', 'v')])
+    ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int128_t const v) [constructor]
+    cls.add_constructor([param('int128_t const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t const hi, uint64_t const lo) [constructor]
     cls.add_constructor([param('int64_t const', 'hi'), param('uint64_t const', 'lo')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [constructor]
@@ -2189,58 +2169,51 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
-def register_Ns3SimpleRefCount__Ns3SQLiteOutput_Ns3Empty_Ns3DefaultDeleter__lt__ns3SQLiteOutput__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SQLiteOutput, ns3::empty, ns3::DefaultDeleter<ns3::SQLiteOutput> >::SimpleRefCount() [constructor]
-    cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SQLiteOutput, ns3::empty, ns3::DefaultDeleter<ns3::SQLiteOutput> >::SimpleRefCount(ns3::SimpleRefCount<ns3::SQLiteOutput, ns3::empty, ns3::DefaultDeleter<ns3::SQLiteOutput> > const & o) [constructor]
-    cls.add_constructor([param('ns3::SimpleRefCount< ns3::SQLiteOutput, ns3::empty, ns3::DefaultDeleter< ns3::SQLiteOutput > > const &', 'o')])
-    return
-
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
@@ -2613,11 +2586,11 @@
     cls.add_method('AddMetadata', 
                    'void', 
                    [param('std::string', 'key'), param('uint32_t', 'value')])
-    ## data-collector.h (module 'stats'): std::list<ns3::Ptr<ns3::DataCalculator>, std::allocator<ns3::Ptr<ns3::DataCalculator> > >::iterator ns3::DataCollector::DataCalculatorBegin() [member function]
+    ## data-collector.h (module 'stats'): std::list<ns3::Ptr<ns3::DataCalculator>, std::allocator<ns3::Ptr<ns3::DataCalculator>>>::iterator ns3::DataCollector::DataCalculatorBegin() [member function]
     cls.add_method('DataCalculatorBegin', 
                    'std::list< ns3::Ptr< ns3::DataCalculator > > iterator', 
                    [])
-    ## data-collector.h (module 'stats'): std::list<ns3::Ptr<ns3::DataCalculator>, std::allocator<ns3::Ptr<ns3::DataCalculator> > >::iterator ns3::DataCollector::DataCalculatorEnd() [member function]
+    ## data-collector.h (module 'stats'): std::list<ns3::Ptr<ns3::DataCalculator>, std::allocator<ns3::Ptr<ns3::DataCalculator>>>::iterator ns3::DataCollector::DataCalculatorEnd() [member function]
     cls.add_method('DataCalculatorEnd', 
                    'std::list< ns3::Ptr< ns3::DataCalculator > > iterator', 
                    [])
@@ -2655,11 +2628,11 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## data-collector.h (module 'stats'): std::list<std::pair<std::basic_string<char>, std::basic_string<char> >, std::allocator<std::pair<std::basic_string<char>, std::basic_string<char> > > >::iterator ns3::DataCollector::MetadataBegin() [member function]
+    ## data-collector.h (module 'stats'): std::list<std::pair<std::basic_string<char>, std::basic_string<char>>, std::allocator<std::pair<std::basic_string<char>, std::basic_string<char>>>>::iterator ns3::DataCollector::MetadataBegin() [member function]
     cls.add_method('MetadataBegin', 
                    'std::list< std::pair< std::string, std::string > > iterator', 
                    [])
-    ## data-collector.h (module 'stats'): std::list<std::pair<std::basic_string<char>, std::basic_string<char> >, std::allocator<std::pair<std::basic_string<char>, std::basic_string<char> > > >::iterator ns3::DataCollector::MetadataEnd() [member function]
+    ## data-collector.h (module 'stats'): std::list<std::pair<std::basic_string<char>, std::basic_string<char>>, std::allocator<std::pair<std::basic_string<char>, std::basic_string<char>>>>::iterator ns3::DataCollector::MetadataEnd() [member function]
     cls.add_method('MetadataEnd', 
                    'std::list< std::pair< std::string, std::string > > iterator', 
                    [])
@@ -3309,119 +3282,6 @@
                    is_const=True, is_virtual=True)
     return
 
-def register_Ns3SQLiteOutput_methods(root_module, cls):
-    ## sqlite-output.h (module 'stats'): ns3::SQLiteOutput::SQLiteOutput(ns3::SQLiteOutput const & arg0) [constructor]
-    cls.add_constructor([param('ns3::SQLiteOutput const &', 'arg0')])
-    ## sqlite-output.h (module 'stats'): ns3::SQLiteOutput::SQLiteOutput(std::string const & name, std::string const & semName) [constructor]
-    cls.add_constructor([param('std::string const &', 'name'), param('std::string const &', 'semName')])
-    ## sqlite-output.h (module 'stats'): void ns3::SQLiteOutput::SetJournalInMemory() [member function]
-    cls.add_method('SetJournalInMemory', 
-                   'void', 
-                   [])
-    ## sqlite-output.h (module 'stats'): bool ns3::SQLiteOutput::SpinExec(std::string const & cmd) const [member function]
-    cls.add_method('SpinExec', 
-                   'bool', 
-                   [param('std::string const &', 'cmd')], 
-                   is_const=True)
-    ## sqlite-output.h (module 'stats'): bool ns3::SQLiteOutput::SpinExec(sqlite3_stmt * stmt) const [member function]
-    cls.add_method('SpinExec', 
-                   'bool', 
-                   [param('sqlite3_stmt *', 'stmt')], 
-                   is_const=True)
-    ## sqlite-output.h (module 'stats'): static int ns3::SQLiteOutput::SpinFinalize(sqlite3_stmt * stmt) [member function]
-    cls.add_method('SpinFinalize', 
-                   'int', 
-                   [param('sqlite3_stmt *', 'stmt')], 
-                   is_static=True)
-    ## sqlite-output.h (module 'stats'): bool ns3::SQLiteOutput::SpinPrepare(sqlite3_stmt * * stmt, std::string const & cmd) const [member function]
-    cls.add_method('SpinPrepare', 
-                   'bool', 
-                   [param('sqlite3_stmt * *', 'stmt'), param('std::string const &', 'cmd')], 
-                   is_const=True)
-    ## sqlite-output.h (module 'stats'): static int ns3::SQLiteOutput::SpinReset(sqlite3_stmt * stmt) [member function]
-    cls.add_method('SpinReset', 
-                   'int', 
-                   [param('sqlite3_stmt *', 'stmt')], 
-                   is_static=True)
-    ## sqlite-output.h (module 'stats'): static int ns3::SQLiteOutput::SpinStep(sqlite3_stmt * stmt) [member function]
-    cls.add_method('SpinStep', 
-                   'int', 
-                   [param('sqlite3_stmt *', 'stmt')], 
-                   is_static=True)
-    ## sqlite-output.h (module 'stats'): bool ns3::SQLiteOutput::WaitExec(std::string const & cmd) const [member function]
-    cls.add_method('WaitExec', 
-                   'bool', 
-                   [param('std::string const &', 'cmd')], 
-                   is_const=True)
-    ## sqlite-output.h (module 'stats'): bool ns3::SQLiteOutput::WaitExec(sqlite3_stmt * stmt) const [member function]
-    cls.add_method('WaitExec', 
-                   'bool', 
-                   [param('sqlite3_stmt *', 'stmt')], 
-                   is_const=True)
-    ## sqlite-output.h (module 'stats'): bool ns3::SQLiteOutput::WaitPrepare(sqlite3_stmt * * stmt, std::string const & cmd) const [member function]
-    cls.add_method('WaitPrepare', 
-                   'bool', 
-                   [param('sqlite3_stmt * *', 'stmt'), param('std::string const &', 'cmd')], 
-                   is_const=True)
-    ## sqlite-output.h (module 'stats'): static bool ns3::SQLiteOutput::CheckError(sqlite3 * db, int rc, std::string const & cmd, sem_t * sem, bool hardExit) [member function]
-    cls.add_method('CheckError', 
-                   'bool', 
-                   [param('sqlite3 *', 'db'), param('int', 'rc'), param('std::string const &', 'cmd'), param('sem_t *', 'sem'), param('bool', 'hardExit')], 
-                   is_static=True, visibility='protected')
-    ## sqlite-output.h (module 'stats'): static void ns3::SQLiteOutput::Error(sqlite3 * db, std::string const & cmd) [member function]
-    cls.add_method('Error', 
-                   'void', 
-                   [param('sqlite3 *', 'db'), param('std::string const &', 'cmd')], 
-                   is_static=True, visibility='protected')
-    ## sqlite-output.h (module 'stats'): static int ns3::SQLiteOutput::SpinExec(sqlite3 * db, std::string const & cmd) [member function]
-    cls.add_method('SpinExec', 
-                   'int', 
-                   [param('sqlite3 *', 'db'), param('std::string const &', 'cmd')], 
-                   is_static=True, visibility='protected')
-    ## sqlite-output.h (module 'stats'): static int ns3::SQLiteOutput::SpinExec(sqlite3 * db, sqlite3_stmt * stmt) [member function]
-    cls.add_method('SpinExec', 
-                   'int', 
-                   [param('sqlite3 *', 'db'), param('sqlite3_stmt *', 'stmt')], 
-                   is_static=True, visibility='protected')
-    ## sqlite-output.h (module 'stats'): static int ns3::SQLiteOutput::SpinPrepare(sqlite3 * db, sqlite3_stmt * * stmt, std::string const & cmd) [member function]
-    cls.add_method('SpinPrepare', 
-                   'int', 
-                   [param('sqlite3 *', 'db'), param('sqlite3_stmt * *', 'stmt'), param('std::string const &', 'cmd')], 
-                   is_static=True, visibility='protected')
-    ## sqlite-output.h (module 'stats'): int ns3::SQLiteOutput::WaitExec(sqlite3 * db, std::string const & cmd) const [member function]
-    cls.add_method('WaitExec', 
-                   'int', 
-                   [param('sqlite3 *', 'db'), param('std::string const &', 'cmd')], 
-                   is_const=True, visibility='protected')
-    ## sqlite-output.h (module 'stats'): int ns3::SQLiteOutput::WaitExec(sqlite3 * db, sqlite3_stmt * stmt) const [member function]
-    cls.add_method('WaitExec', 
-                   'int', 
-                   [param('sqlite3 *', 'db'), param('sqlite3_stmt *', 'stmt')], 
-                   is_const=True, visibility='protected')
-    ## sqlite-output.h (module 'stats'): int ns3::SQLiteOutput::WaitPrepare(sqlite3 * db, sqlite3_stmt * * stmt, std::string const & cmd) const [member function]
-    cls.add_method('WaitPrepare', 
-                   'int', 
-                   [param('sqlite3 *', 'db'), param('sqlite3_stmt * *', 'stmt'), param('std::string const &', 'cmd')], 
-                   is_const=True, visibility='protected')
-    return
-
-def register_Ns3SqliteDataOutput_methods(root_module, cls):
-    ## sqlite-data-output.h (module 'stats'): ns3::SqliteDataOutput::SqliteDataOutput(ns3::SqliteDataOutput const & arg0) [constructor]
-    cls.add_constructor([param('ns3::SqliteDataOutput const &', 'arg0')])
-    ## sqlite-data-output.h (module 'stats'): ns3::SqliteDataOutput::SqliteDataOutput() [constructor]
-    cls.add_constructor([])
-    ## sqlite-data-output.h (module 'stats'): static ns3::TypeId ns3::SqliteDataOutput::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## sqlite-data-output.h (module 'stats'): void ns3::SqliteDataOutput::Output(ns3::DataCollector & dc) [member function]
-    cls.add_method('Output', 
-                   'void', 
-                   [param('ns3::DataCollector &', 'dc')], 
-                   is_virtual=True)
-    return
-
 def register_Ns3TimeMinMaxAvgTotalCalculator_methods(root_module, cls):
     ## time-data-calculators.h (module 'stats'): ns3::TimeMinMaxAvgTotalCalculator::TimeMinMaxAvgTotalCalculator(ns3::TimeMinMaxAvgTotalCalculator const & arg0) [constructor]
     cls.add_constructor([param('ns3::TimeMinMaxAvgTotalCalculator const &', 'arg0')])
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/stats/CMakeLists.txt ns-3.36/src/stats/CMakeLists.txt
--- ns-3.35/src/stats/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/stats/CMakeLists.txt	2022-04-30 18:23:58.150735000 -0700
@@ -0,0 +1,93 @@
+set(sqlite_sources)
+set(sqlite_header)
+set(sqlite_libraries)
+if(${ENABLE_SQLITE})
+  set(sqlite_sources
+      model/sqlite-data-output.cc
+  )
+  set(sqlite_headers
+      model/sqlite-data-output.h
+  )
+  include_directories(${SQLite3_INCLUDE_DIRS})
+  set(sqlite_libraries
+      ${SQLite3_LIBRARIES}
+  )
+  if(HAVE_SEMAPHORE_H)
+    list(
+      APPEND
+      sqlite_sources
+      model/sqlite-output.cc
+    )
+    list(
+      APPEND
+      sqlite_headers
+      model/sqlite-output.h
+    )
+  endif()
+endif()
+
+set(source_files
+    ${sqlite_sources}
+    helper/file-helper.cc
+    helper/gnuplot-helper.cc
+    model/boolean-probe.cc
+    model/data-calculator.cc
+    model/data-collection-object.cc
+    model/data-collector.cc
+    model/data-output-interface.cc
+    model/double-probe.cc
+    model/file-aggregator.cc
+    model/get-wildcard-matches.cc
+    model/gnuplot-aggregator.cc
+    model/gnuplot.cc
+    model/histogram.cc
+    model/omnet-data-output.cc
+    model/probe.cc
+    model/time-data-calculators.cc
+    model/time-probe.cc
+    model/time-series-adaptor.cc
+    model/uinteger-16-probe.cc
+    model/uinteger-32-probe.cc
+    model/uinteger-8-probe.cc
+)
+
+set(header_files
+    ${sqlite_headers}
+    helper/file-helper.h
+    helper/gnuplot-helper.h
+    model/average.h
+    model/basic-data-calculators.h
+    model/boolean-probe.h
+    model/data-calculator.h
+    model/data-collection-object.h
+    model/data-collector.h
+    model/data-output-interface.h
+    model/double-probe.h
+    model/file-aggregator.h
+    model/get-wildcard-matches.h
+    model/gnuplot-aggregator.h
+    model/gnuplot.h
+    model/histogram.h
+    model/omnet-data-output.h
+    model/probe.h
+    model/stats.h
+    model/time-data-calculators.h
+    model/time-probe.h
+    model/time-series-adaptor.h
+    model/uinteger-16-probe.h
+    model/uinteger-32-probe.h
+    model/uinteger-8-probe.h
+)
+
+build_lib(
+  LIBNAME stats
+  SOURCE_FILES ${source_files}
+  HEADER_FILES ${header_files}
+  LIBRARIES_TO_LINK ${libcore}
+                    ${sqlite_libraries}
+  TEST_SOURCES
+    test/average-test-suite.cc
+    test/basic-data-calculators-test-suite.cc
+    test/double-probe-test-suite.cc
+    test/histogram-test-suite.cc
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/stats/doc/probe.rst ns-3.36/src/stats/doc/probe.rst
--- ns-3.35/src/stats/doc/probe.rst	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/stats/doc/probe.rst	2022-04-30 18:23:58.150735000 -0700
@@ -184,7 +184,7 @@
 existing |ns3| models.  Note that in order to be able to use the DoubleProbe in this example like this, 2 things were necessary:
 
 1. the stats module header file was included in the example .cc file 
-2. the example was made dependent on the stats module in its wscript file.
+2. the example was made dependent on the stats module in its CMakeLists.txt file.
 
 Analogous things need to be done in order to add other Probes in other places in the |ns3| code base.
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/stats/examples/CMakeLists.txt ns-3.36/src/stats/examples/CMakeLists.txt
--- ns-3.35/src/stats/examples/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/stats/examples/CMakeLists.txt	2022-04-30 18:23:58.150735000 -0700
@@ -0,0 +1,26 @@
+build_lib_example(
+  NAME time-probe-example
+  SOURCE_FILES time-probe-example.cc
+  LIBRARIES_TO_LINK ${libstats}
+)
+
+set(base_examples
+    gnuplot-example
+    double-probe-example
+    gnuplot-aggregator-example
+    gnuplot-helper-example
+    file-aggregator-example
+    file-helper-example
+)
+
+foreach(
+  example
+  ${base_examples}
+)
+  build_lib_example(
+    NAME ${example}
+    SOURCE_FILES ${example}.cc
+    LIBRARIES_TO_LINK ${libnetwork}
+                      ${libstats}
+  )
+endforeach()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/stats/examples/double-probe-example.cc ns-3.36/src/stats/examples/double-probe-example.cc
--- ns-3.35/src/stats/examples/double-probe-example.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/stats/examples/double-probe-example.cc	2022-04-30 18:23:58.150735000 -0700
@@ -31,7 +31,7 @@
 
 NS_LOG_COMPONENT_DEFINE ("DoubleProbeExample");
 
-/*
+/**
  * This is our test object, an object that increments counters at
  * various times and emits one of them as a trace source.
  */
@@ -46,11 +46,14 @@
   Emitter ();
 private:
   void DoInitialize (void);
+
+  /// Generate data - actually this function is not traced.
   void Emit (void);
+  /// Counts how many times this function is called.
   void Count (void);
 
-  TracedValue<double> m_counter;  // normally this would be integer type
-  Ptr<ExponentialRandomVariable> m_var;
+  TracedValue<double> m_counter;  //!< Sample counter, normally this would be integer type
+  Ptr<ExponentialRandomVariable> m_var; //!< Random number generator
 
 };
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/stats/examples/file-aggregator-example.cc ns-3.36/src/stats/examples/file-aggregator-example.cc
--- ns-3.35/src/stats/examples/file-aggregator-example.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/stats/examples/file-aggregator-example.cc	2022-04-30 18:23:58.150735000 -0700
@@ -25,14 +25,10 @@
 
 namespace {
 
-//===========================================================================
-// Function: CreateCommaSeparatedFile
-//
-//
-// This function creates a file with 2 columns of values and separated
-// by commas.
-//===========================================================================
-
+/**
+ * This function creates a file with 2 columns of values and separated
+ * by commas.
+ */
 void CreateCommaSeparatedFile ()
 {
   using namespace std;
@@ -69,14 +65,10 @@
 }
 
 
-//===========================================================================
-// Function: CreateSpaceSeparatedFile
-//
-//
-// This function creates a file with 2 columns of values and separated
-// by spaces.
-//===========================================================================
-
+/**
+ * This function creates a file with 2 columns of values and separated
+ * by commas.
+ */
 void CreateSpaceSeparatedFile ()
 {
   using namespace std;
@@ -114,13 +106,9 @@
 }
 
 
-//===========================================================================
-// Function: CreateFormattedFile
-//
-//
-// This function creates a file with formatted values.
-//===========================================================================
-
+/**
+ * This function creates a file with formatted values.
+ */
 void CreateFormattedFile ()
 {
   using namespace std;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/stats/examples/file-helper-example.cc ns-3.36/src/stats/examples/file-helper-example.cc
--- ns-3.35/src/stats/examples/file-helper-example.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/stats/examples/file-helper-example.cc	2022-04-30 18:23:58.150735000 -0700
@@ -34,11 +34,11 @@
 
 NS_LOG_COMPONENT_DEFINE ("FileHelperExample");
 
-//
-// This is our test object, an object that increments a counter according
-// to a Poisson process, and exports the (integer-valued) count as a
-// trace source.
-//
+/**
+ * This is our test object, an object that increments a counter according
+ * to a Poisson process, and exports the (integer-valued) count as a
+ * trace source.
+ */
 class Emitter : public Object
 {
 public:
@@ -50,10 +50,11 @@
   Emitter ();
 private:
   void DoInitialize (void);
+  /// Counts how many time this function is called.
   void Count (void);
 
-  TracedValue<uint32_t> m_counter;
-  Ptr<ExponentialRandomVariable> m_var;
+  TracedValue<uint32_t> m_counter; //!< Simple counter
+  Ptr<ExponentialRandomVariable> m_var; //!< Random number generator.
 
 };
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/stats/examples/gnuplot-aggregator-example.cc ns-3.36/src/stats/examples/gnuplot-aggregator-example.cc
--- ns-3.35/src/stats/examples/gnuplot-aggregator-example.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/stats/examples/gnuplot-aggregator-example.cc	2022-04-30 18:23:58.150735000 -0700
@@ -25,13 +25,9 @@
 
 namespace {
 
-//===========================================================================
-// Function: Create2dPlot
-//
-//
-// This function creates a 2-Dimensional plot.
-//===========================================================================
-
+/**
+ * This function creates a 2-Dimensional plot.
+ */
 void Create2dPlot ()
 {
   using namespace std;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/stats/examples/gnuplot-example.cc ns-3.36/src/stats/examples/gnuplot-example.cc
--- ns-3.35/src/stats/examples/gnuplot-example.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/stats/examples/gnuplot-example.cc	2022-04-30 18:23:58.150735000 -0700
@@ -26,13 +26,9 @@
 
 namespace {
 
-//===========================================================================
-// Function: Create2DPlotFile
-//
-//
-// This function creates a 2-D plot file.
-//===========================================================================
-
+/**
+ * This function creates a 2-D plot file.
+ */
 void Create2DPlotFile ()
 {
   std::string fileNameWithNoExtension = "plot-2d";
@@ -92,13 +88,9 @@
 }
 
 
-//===========================================================================
-// Function: Create2DPlotWithErrorBarsFile
-//
-//
-// This function creates a 2-D plot with error bars file.
-//===========================================================================
-
+/**
+ * This function creates a 2-D plot with error bars file.
+ */
 void Create2DPlotWithErrorBarsFile ()
 {
   std::string fileNameWithNoExtension = "plot-2d-with-error-bars";
@@ -170,13 +162,9 @@
 }
 
 
-//===========================================================================
-// Function: Create3DPlotFile
-//
-//
-// This function creates a 3-D plot file.
-//===========================================================================
-
+/**
+ * This function creates a 3-D plot file.
+ */
 void Create3DPlotFile ()
 {
   std::string fileNameWithNoExtension = "plot-3d";
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/stats/examples/gnuplot-helper-example.cc ns-3.36/src/stats/examples/gnuplot-helper-example.cc
--- ns-3.35/src/stats/examples/gnuplot-helper-example.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/stats/examples/gnuplot-helper-example.cc	2022-04-30 18:23:58.150735000 -0700
@@ -34,11 +34,11 @@
 
 NS_LOG_COMPONENT_DEFINE ("GnuplotHelperExample");
 
-//
-// This is our test object, an object that increments a counter according
-// to a Poisson process, and exports the (integer-valued) count as a
-// trace source.
-//
+/**
+ * This is our test object, an object that increments a counter according
+ * to a Poisson process, and exports the (integer-valued) count as a
+ * trace source.
+ */
 class Emitter : public Object
 {
 public:
@@ -50,10 +50,11 @@
   Emitter ();
 private:
   void DoInitialize (void);
+  /// Counts how many time this function is called.
   void Count (void);
 
-  TracedValue<uint32_t> m_counter;
-  Ptr<ExponentialRandomVariable> m_var;
+  TracedValue<uint32_t> m_counter; //!< Simple counter
+  Ptr<ExponentialRandomVariable> m_var; //!< Random number generator.
 };
 
 NS_OBJECT_ENSURE_REGISTERED (Emitter);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/stats/examples/time-probe-example.cc ns-3.36/src/stats/examples/time-probe-example.cc
--- ns-3.35/src/stats/examples/time-probe-example.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/stats/examples/time-probe-example.cc	2022-04-30 18:23:58.150735000 -0700
@@ -45,11 +45,11 @@
 
 NS_LOG_COMPONENT_DEFINE ("TimeProbeExample");
 
-//
-// This is our test object, an object that emits values according to
-// a Poisson arrival process.   It emits a traced Time value as a 
-// trace source; this takes the value of interarrival time
-//
+/**
+ * This is our test object, an object that emits values according to
+ * a Poisson arrival process.   It emits a traced Time value as a 
+ * trace source; this takes the value of interarrival time
+ */
 class Emitter : public Object
 {
 public:
@@ -61,12 +61,12 @@
   Emitter ();
 private:
   void DoInitialize (void);
-//  void Emit (void);
+  /// Generate data.
   void Emit (void);
 
-  TracedValue<Time> m_interval;  
-  Time m_last;  
-  Ptr<ExponentialRandomVariable> m_var;
+  TracedValue<Time> m_interval;  //!< Interarrival time between events.
+  Time m_last;                   //!< Current interarrival time.
+  Ptr<ExponentialRandomVariable> m_var; //!< Random number generator.
 };
 
 NS_OBJECT_ENSURE_REGISTERED (Emitter);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/stats/examples/wscript ns-3.36/src/stats/examples/wscript
--- ns-3.35/src/stats/examples/wscript	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/stats/examples/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,28 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    if not bld.env['ENABLE_EXAMPLES']:
-        return;
-
-    obj = bld.create_ns3_program('gnuplot-example', ['network', 'stats'])
-    obj.source = 'gnuplot-example.cc'
-
-    program = bld.create_ns3_program('double-probe-example', ['network', 'stats'])
-    program.source = 'double-probe-example.cc'
-
-    program = bld.create_ns3_program('time-probe-example', ['stats'])
-    program.source = 'time-probe-example.cc'
-
-    program = bld.create_ns3_program('gnuplot-aggregator-example', ['network', 'stats'])
-    program.source = 'gnuplot-aggregator-example.cc'
-
-    program = bld.create_ns3_program('gnuplot-helper-example', ['network', 'stats'])
-    program.source = 'gnuplot-helper-example.cc'
-
-    program = bld.create_ns3_program('file-aggregator-example', ['network', 'stats'])
-    program.source = 'file-aggregator-example.cc'
-
-    program = bld.create_ns3_program('file-helper-example', ['network', 'stats'])
-    program.source = 'file-helper-example.cc'
-
-
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/stats/model/average.h ns-3.36/src/stats/model/average.h
--- ns-3.35/src/stats/model/average.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/stats/model/average.h	2022-04-30 18:23:58.150735000 -0700
@@ -45,7 +45,10 @@
   {
   }
 
-  /// Add new sample
+  /**
+   * Add new sample
+   * \param x The sample
+   */
   void Update (T const & x)
   {
     // Give the variance calculator the next value.
@@ -66,19 +69,40 @@
   }
 
   // Sample statistics
-  /// Sample size
+  /**
+   * Sample size
+   * \return the sample size
+   */
   uint32_t Count   () const { return m_size; }
-  /// Minimum
+  /**
+   * Sample minimum
+   * \return the minimum of the sample
+   */
   T        Min     () const { return m_min; }
-  /// Maximum
+  /**
+   * Sample maximum
+   * \return the maximum of the sample
+   */
   T        Max     () const { return m_max; }
-  /// Sample average
+  /**
+   * Sample average
+   * \return the average of the sample
+   */
   double   Avg     () const { return m_varianceCalculator.getMean ();}
-  /// Estimate of mean, alias to Avg
+  /**
+   * Sample estimate of mean, alias to Avg
+   * \return the average of the sample
+   */
   double   Mean    () const { return Avg (); }
-  /// Unbiased estimate of variance
+  /**
+   * Sample unbiased nbiased estimate of variance
+   * \return the unbiased nbiased estimate of variance
+   */
   double   Var     () const { return m_varianceCalculator.getVariance ();}
-  /// Standard deviation
+  /**
+   * Sample standard deviation
+   * \return the standard deviation
+   */
   double   Stddev  () const { return std::sqrt (Var ()); }
 
   /**
@@ -109,7 +133,7 @@
    */
   double   Error95 () const { return 1.960 * std::sqrt (Var () / Count ()); }
   /**
-  * \brief Margin of error of the mean for 99% confidence level 
+   * \brief Margin of error of the mean for 99% confidence level 
    *
    * Note that estimates are valid for 
    *   - uncorrelated measurements, 
@@ -129,7 +153,12 @@
   MinMaxAvgTotalCalculator<double> m_varianceCalculator; //!< Variance calculator.
 };
 
-/// Print avg (err) [min, max]
+/**
+ * Print avg (err) [min, max]
+ * \param os The output stream
+ * \param x The Average value to print
+ * \return the ouput stream.
+ */
 template <typename T>
 std::ostream & operator<< (std::ostream & os, Average<T> const & x)
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/stats/model/basic-data-calculators.h ns-3.36/src/stats/model/basic-data-calculators.h
--- ns-3.35/src/stats/model/basic-data-calculators.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/stats/model/basic-data-calculators.h	2022-04-30 18:23:58.150735000 -0700
@@ -106,6 +106,9 @@
   double getSqrSum () const { return m_squareTotal; }
 
 protected:
+  /**
+   * Dispose of this Object.
+   */
   virtual void DoDispose (void);
 
   uint32_t m_count;      //!< Count value of MinMaxAvgTotalCalculator
@@ -160,9 +163,9 @@
 TypeId
 MinMaxAvgTotalCalculator<T>::GetTypeId (void)
 {
-  static TypeId tid = TypeId ( ("ns3::MinMaxAvgTotalCalculator<"
-                                + TypeNameGet<T> ()
-                                + ">").c_str () )
+  static TypeId tid = TypeId ("ns3::MinMaxAvgTotalCalculator<"
+                              + TypeNameGet<T> ()
+                              + ">")
     .SetParent<Object> ()
     .SetGroupName ("Stats")
     .AddConstructor<MinMaxAvgTotalCalculator<T> > ()
@@ -299,6 +302,9 @@
   virtual void Output (DataOutputCallback &callback) const;
 
 protected:
+  /**
+   * Dispose of this Object.
+   */
   virtual void DoDispose (void);
 
   T m_count; //!< Count value of CounterCalculator
@@ -323,9 +329,9 @@
 TypeId
 CounterCalculator<T>::GetTypeId (void)
 {
-  static TypeId tid = TypeId ( ("ns3::CounterCalculator<"
-                                + TypeNameGet<T> ()
-                                + ">").c_str () )
+  static TypeId tid = TypeId ("ns3::CounterCalculator<"
+                              + TypeNameGet<T> ()
+                              + ">")
     .SetParent<Object> ()
     .SetGroupName ("Stats")
     .AddConstructor<CounterCalculator<T> > ()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/stats/model/data-collection-object.h ns-3.36/src/stats/model/data-collection-object.h
--- ns-3.35/src/stats/model/data-collection-object.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/stats/model/data-collection-object.h	2022-04-30 18:23:58.150735000 -0700
@@ -51,13 +51,22 @@
   /// Unset the status of an individual object.
   void Disable (void);
 
-  /// Check the status of an individual object.
+  /**
+   * Check the status of an individual object.
+   * \return true if the object is enabled
+   */
   virtual bool IsEnabled (void) const;
 
-  /// Get the object's name.
+  /**
+   * Get the object's name.
+   * \return the object's name
+   */
   std::string GetName (void) const;
 
-  /// Set the object's name.  All spaces are replaced by underscores.
+  /**
+   * Set the object's name.
+   * \param name the object's name
+   */
   void SetName (std::string name);
 
 protected:
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/stats/model/gnuplot.cc ns-3.36/src/stats/model/gnuplot.cc
--- ns-3.35/src/stats/model/gnuplot.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/stats/model/gnuplot.cc	2022-04-30 18:23:58.154734800 -0700
@@ -325,7 +325,9 @@
 
 // --- Gnuplot2dDataset ---------------------------------------------------- //
 
+/// Default plot style static instance
 enum Gnuplot2dDataset::Style Gnuplot2dDataset::m_defaultStyle = LINES;
+/// Default error bars type static instance
 enum Gnuplot2dDataset::ErrorBars Gnuplot2dDataset::m_defaultErrorBars = NONE;
 
 Gnuplot2dDataset::Gnuplot2dDataset (const std::string& title)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/stats/model/gnuplot.h ns-3.36/src/stats/model/gnuplot.h
--- ns-3.35/src/stats/model/gnuplot.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/stats/model/gnuplot.h	2022-04-30 18:23:58.154734800 -0700
@@ -142,7 +142,7 @@
   };
 
   /**
-   * \param title the title to be associated to this dataset.
+   * \param title the title to be associated to this dataset (default "Untitled").
    *
    * Create an empty dataset. Usually, the dataset's title is 
    * displayed in the legend box.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/stats/model/sqlite-data-output.h ns-3.36/src/stats/model/sqlite-data-output.h
--- ns-3.35/src/stats/model/sqlite-data-output.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/stats/model/sqlite-data-output.h	2022-04-30 18:23:58.154734800 -0700
@@ -63,7 +63,7 @@
 public:
     /**
      * Constructor
-     * \param owner pointer to the instance this object belongs to
+     * \param db pointer to the instance this object belongs to
      * \param run experiment descriptor
      */
     SqliteOutputCallback (const Ptr<SQLiteOutput> &db, std::string run);
@@ -137,7 +137,7 @@
     Ptr<SQLiteOutput> m_db; //!< Db
     std::string m_runLabel; //!< Run label
 
-
+    /// Pointer to a Sqlite3 singleton statement
     sqlite3_stmt *m_insertSingletonStatement;
   };
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/stats/model/sqlite-output.cc ns-3.36/src/stats/model/sqlite-output.cc
--- ns-3.35/src/stats/model/sqlite-output.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/stats/model/sqlite-output.cc	2022-04-30 18:23:58.154734800 -0700
@@ -20,7 +20,6 @@
 #include <sys/stat.h>
 #include <fcntl.h>
 #include "ns3/abort.h"
-#include "ns3/unused.h"
 #include "ns3/log.h"
 #include "ns3/nstime.h"
 
@@ -90,13 +89,12 @@
 
 template<typename T>
 T
-SQLiteOutput::RetrieveColumn (sqlite3_stmt *stmt, int pos) const
+SQLiteOutput::RetrieveColumn ([[maybe_unused]] sqlite3_stmt *stmt, [[maybe_unused]] int pos) const
 {
-  NS_UNUSED (stmt);
-  NS_UNUSED (pos);
   NS_FATAL_ERROR ("Can't call generic fn");
 }
 
+/// \copydoc SQLiteOutput::RetrieveColumn
 template<>
 int
 SQLiteOutput::RetrieveColumn (sqlite3_stmt *stmt, int pos) const
@@ -104,6 +102,7 @@
   return sqlite3_column_int (stmt, pos);
 }
 
+/// \copydoc SQLiteOutput::RetrieveColumn
 template<>
 uint32_t
 SQLiteOutput::RetrieveColumn (sqlite3_stmt *stmt, int pos) const
@@ -111,6 +110,7 @@
   return static_cast<uint32_t> (sqlite3_column_int (stmt, pos));
 }
 
+/// \copydoc SQLiteOutput::RetrieveColumn
 template<>
 double
 SQLiteOutput::RetrieveColumn (sqlite3_stmt *stmt, int pos) const
@@ -120,15 +120,13 @@
 
 template<typename T>
 bool
-SQLiteOutput::Bind (sqlite3_stmt *stmt, int pos, const T &value) const
+SQLiteOutput::Bind ([[maybe_unused]] sqlite3_stmt *stmt, [[maybe_unused]] int pos, [[maybe_unused]] const T &value) const
 {
-  NS_UNUSED (stmt);
-  NS_UNUSED (pos);
-  NS_UNUSED (value);
   NS_FATAL_ERROR ("Can't call generic fn");
   return false;
 }
 
+//! \copydoc SQLiteOutput::Bind
 template<>
 bool
 SQLiteOutput::Bind (sqlite3_stmt *stmt, int pos, const Time &value) const
@@ -140,6 +138,7 @@
   return false;
 }
 
+//! \copydoc SQLiteOutput::Bind
 template<>
 bool
 SQLiteOutput::Bind (sqlite3_stmt *stmt, int pos, const double &value) const
@@ -151,6 +150,7 @@
   return false;
 }
 
+//! \copydoc SQLiteOutput::Bind
 template<>
 bool
 SQLiteOutput::Bind (sqlite3_stmt *stmt, int pos, const uint32_t &value) const
@@ -162,6 +162,7 @@
   return false;
 }
 
+//! \copydoc SQLiteOutput::Bind
 template<>
 bool
 SQLiteOutput::Bind (sqlite3_stmt *stmt, int pos, const long &value) const
@@ -173,6 +174,7 @@
   return false;
 }
 
+//! \copydoc SQLiteOutput::Bind
 template<>
 bool
 SQLiteOutput::Bind (sqlite3_stmt *stmt, int pos, const long long &value) const
@@ -184,6 +186,7 @@
   return false;
 }
 
+//! \copydoc SQLiteOutput::Bind
 template<>
 bool
 SQLiteOutput::Bind (sqlite3_stmt *stmt, int pos, const uint16_t &value) const
@@ -195,6 +198,7 @@
   return false;
 }
 
+//! \copydoc SQLiteOutput::Bind
 template<>
 bool
 SQLiteOutput::Bind (sqlite3_stmt *stmt, int pos, const uint8_t &value) const
@@ -206,6 +210,7 @@
   return false;
 }
 
+//! \copydoc SQLiteOutput::Bind
 template<>
 bool
 SQLiteOutput::Bind (sqlite3_stmt *stmt, int pos, const int &value) const
@@ -217,6 +222,7 @@
   return false;
 }
 
+//! \copydoc SQLiteOutput::Bind
 template<>
 bool
 SQLiteOutput::Bind (sqlite3_stmt *stmt, int pos, const std::string &value) const
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/stats/model/sqlite-output.h ns-3.36/src/stats/model/sqlite-output.h
--- ns-3.35/src/stats/model/sqlite-output.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/stats/model/sqlite-output.h	2022-04-30 18:23:58.154734800 -0700
@@ -113,6 +113,7 @@
    * \param stmt Sqlite statement
    * \param pos Position of the bind argument inside the statement
    * \param value Value to bind
+   * \return true on success, false otherwise
    */
   template<typename T>
   bool Bind (sqlite3_stmt *stmt, int pos, const T &value) const;
@@ -121,6 +122,7 @@
    * \brief Retrieve a value from an executed statement
    * \param stmt sqlite statement
    * \param pos Column position
+   * \return the value from the executed statement
    */
   template<typename T>
   T RetrieveColumn (sqlite3_stmt *stmt, int pos) const;
@@ -185,7 +187,14 @@
    */
   static int SpinExec (sqlite3 *db, const std::string &cmd);
 
+  /**
+   * \brief Execute a Prepared Statement Object ignoring concurrency problems, retrying instead
+   * \param db Database
+   * \param stmt Prepared Statement Object
+   * \return Sqlite error code
+   */
   static int SpinExec (sqlite3 *db, sqlite3_stmt *stmt);
+  
   /**
    * \brief Preparing a command ignoring concurrency problems, retrying instead
    * \param db Database
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/stats/model/stats.h ns-3.36/src/stats/model/stats.h
--- ns-3.35/src/stats/model/stats.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/stats/model/stats.h	2022-04-30 18:23:58.154734800 -0700
@@ -75,4 +75,10 @@
  * for subsequent output in a specific format, e.g., Omnet++, SQLite, etc.
  */
 
+/**
+ * \ingroup stats
+ * \ingroup tests
+ * \defgroup stats-tests Statistics module tests
+ */
+
 #endif /* STATS_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/stats/test/average-test-suite.cc ns-3.36/src/stats/test/average-test-suite.cc
--- ns-3.35/src/stats/test/average-test-suite.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/stats/test/average-test-suite.cc	2022-04-30 18:23:58.154734800 -0700
@@ -29,10 +29,11 @@
 // documented.  Current value is sufficient for all test platforms.
 const double TOLERANCE = 2e-14;
 
-// ===========================================================================
-// Test case for a single integer.
-// ===========================================================================
-
+/**
+ * \ingroup stats-tests
+ *
+ * \brief Average class - Test case for a single integer.
+ */
 class OneIntegerAverageTestCase : public TestCase
 {
 public:
@@ -61,7 +62,6 @@
   long count = 1;
 
   double sum = 0;
-  double sqrSum = 0;
   double min;
   double max;
   double mean;
@@ -78,7 +78,6 @@
       calculator.Update (value);
 
       sum    += value;
-      sqrSum += value * value;
     }
 
   // Calculate the expected values for the statistical functions.
@@ -98,10 +97,11 @@
 }
 
 
-// ===========================================================================
-// Test case for five integers.
-// ===========================================================================
-
+/**
+ * \ingroup stats-tests
+ *
+ * \brief Average class - Test case for five integers.
+ */
 class FiveIntegersAverageTestCase : public TestCase
 {
 public:
@@ -167,10 +167,11 @@
 }
 
 
-// ===========================================================================
-// Test case for five double values.
-// ===========================================================================
-
+/**
+ * \ingroup stats-tests
+ *
+ * \brief Average class - Test case for five double values.
+ */
 class FiveDoublesAverageTestCase : public TestCase
 {
 public:
@@ -236,6 +237,11 @@
 }
 
 
+/**
+ * \ingroup stats-tests
+ *
+ * \brief Average class TestSuite
+ */
 class AverageTestSuite : public TestSuite
 {
 public:
@@ -250,4 +256,5 @@
   AddTestCase (new FiveDoublesAverageTestCase, TestCase::QUICK);
 }
 
+ /// Static variable for test initialization
 static AverageTestSuite averageTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/stats/test/basic-data-calculators-test-suite.cc ns-3.36/src/stats/test/basic-data-calculators-test-suite.cc
--- ns-3.35/src/stats/test/basic-data-calculators-test-suite.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/stats/test/basic-data-calculators-test-suite.cc	2022-04-30 18:23:58.154734800 -0700
@@ -27,10 +27,11 @@
 
 const double TOLERANCE = 1e-14;
 
-// ===========================================================================
-// Test case for a single integer.
-// ===========================================================================
-
+/**
+ * \ingroup stats-tests
+ *
+ * \brief MinMaxAvgTotalCalculator class - Test case for a single integer.
+ */
 class OneIntegerTestCase : public TestCase
 {
 public:
@@ -98,10 +99,11 @@
 }
 
 
-// ===========================================================================
-// Test case for five integers.
-// ===========================================================================
-
+/**
+ * \ingroup stats-tests
+ *
+ * \brief MinMaxAvgTotalCalculator class - Test case for five integers.
+ */
 class FiveIntegersTestCase : public TestCase
 {
 public:
@@ -169,10 +171,11 @@
 }
 
 
-// ===========================================================================
-// Test case for five double values.
-// ===========================================================================
-
+/**
+ * \ingroup stats-tests
+ *
+ * \brief MinMaxAvgTotalCalculator class - Test case for five double values.
+ */
 class FiveDoublesTestCase : public TestCase
 {
 public:
@@ -240,6 +243,11 @@
 }
 
 
+/**
+ * \ingroup stats-tests
+ *
+ * \brief MinMaxAvgTotalCalculator class TestSuite
+ */
 class BasicDataCalculatorsTestSuite : public TestSuite
 {
 public:
@@ -254,4 +262,5 @@
   AddTestCase (new FiveDoublesTestCase, TestCase::QUICK);
 }
 
-static BasicDataCalculatorsTestSuite basicDataCalculatorsTestSuite;
+ /// Static variable for test initialization
+ static BasicDataCalculatorsTestSuite basicDataCalculatorsTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/stats/test/double-probe-test-suite.cc ns-3.36/src/stats/test/double-probe-test-suite.cc
--- ns-3.35/src/stats/test/double-probe-test-suite.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/stats/test/double-probe-test-suite.cc	2022-04-30 18:23:58.154734800 -0700
@@ -14,9 +14,18 @@
 
 using namespace ns3;
 
+/**
+ * \ingroup stats-tests
+ *
+ * \brief Simple data emitter to check that a probe receives data.
+ */
 class SampleEmitter : public Object
 {
 public:
+  /**
+   * \brief Get the type ID.
+   * \return The object TypeId.
+   */
   static TypeId GetTypeId (void);
   SampleEmitter ()
   {
@@ -25,35 +34,40 @@
   virtual ~SampleEmitter ()
   {
   }
+  /// Start emission of data.
   void Start ()
   {
     Reschedule ();
   }
+  /// Reschedule a report \sa Report
   void Reschedule ()
   {
     m_time = m_var->GetValue ();
     Simulator::Schedule (Seconds (m_time), &SampleEmitter::Report, this);
     m_time += Simulator::Now ().GetSeconds ();
   }
+  /// \return the time delta of the next report.
   double GetTime ()
   {
     return m_time;
   }
+  /// \return a random variable, different for each reschedule.
   double GetValue ()
   {
     return aux;
   }
 private:
+  /// Reports a new value and reschedules \sa Reschedule
   void Report ()
   {
     aux = m_var->GetValue ();
     m_trace = aux;
     Reschedule ();
   }
-  Ptr<ExponentialRandomVariable> m_var;
-  double m_time;
-  TracedValue<double> m_trace;
-  double aux;
+  Ptr<ExponentialRandomVariable> m_var; //!< Random value generator.
+  double m_time;  //!< Delta time between reschedules.
+  TracedValue<double> m_trace; //!< Trace
+  double aux; //!< Emitted value.
 };
 
 
@@ -69,6 +83,12 @@
   return tid;
 }
 
+
+/**
+ * \ingroup stats-tests
+ *
+ * \brief DoubleProbe class - Test case for connecting and receiving data.
+ */
 class ProbeTestCase1 : public TestCase
 {
 public:
@@ -77,10 +97,17 @@
 
 private:
   virtual void DoRun (void);
+
+  /**
+   * Trace sink.
+   * \param context Trace context
+   * \param oldValue Old value
+   * \param newValue New value
+   */
   void TraceSink (std::string context, double oldValue, double newValue);
-  uint32_t m_objectProbed;
-  uint32_t m_pathProbed;
-  Ptr<SampleEmitter> m_s;
+  uint32_t m_objectProbed;  //!< Number of probes by Object
+  uint32_t m_pathProbed;    //!< Number of probed by Path
+  Ptr<SampleEmitter> m_s;   //!< Sample emitter pointer
 };
 
 ProbeTestCase1::ProbeTestCase1 ()
@@ -160,6 +187,11 @@
 }
 
 
+/**
+ * \ingroup stats-tests
+ *
+ * \brief DoubleProbe class TestSuite
+ */
 class ProbeTestSuite : public TestSuite
 {
 public:
@@ -172,6 +204,6 @@
   AddTestCase (new ProbeTestCase1, TestCase::QUICK);
 }
 
-// Do not forget to allocate an instance of this TestSuite
+ /// Static variable for test initialization
 static ProbeTestSuite probeTestSuite;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/stats/test/histogram-test-suite.cc ns-3.36/src/stats/test/histogram-test-suite.cc
--- ns-3.35/src/stats/test/histogram-test-suite.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/stats/test/histogram-test-suite.cc	2022-04-30 18:23:58.154734800 -0700
@@ -24,13 +24,7 @@
 using namespace ns3;
 
 /**
- * \ingroup stats
- * \defgroup stats-test Stats module tests
- */
-
-/**
- * \ingroup stats-test
- * \ingroup tests
+ * \ingroup stats-tests
  *
  * \brief Histogram Test
  */
@@ -81,8 +75,7 @@
 }
 
 /**
- * \ingroup stats-test
- * \ingroup tests
+ * \ingroup stats-tests
  *
  * \brief Histogram TestSuite
  */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/stats/wscript ns-3.36/src/stats/wscript
--- ns-3.35/src/stats/wscript	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/stats/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,95 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def configure(conf):
-    have_sqlite3 = conf.check_cfg(package='sqlite3', uselib_store='SQLITE3',
-                                  args=['--cflags', '--libs'],
-                                  mandatory=False)
-
-    conf.env['SQLITE_STATS'] = have_sqlite3
-    have_sem = conf.check_nonfatal(header_name='semaphore.h', define_name='HAVE_SEMAPHORE_H')
-    conf.env['SEMAPHORE_ENABLED'] = have_sem
-    conf.report_optional_feature("SQLiteStats", "SQLite stats support",
-                                 conf.env['SQLITE_STATS'] and conf.env['SEMAPHORE_ENABLED'],
-                                 "library 'sqlite3' and/or semaphore.h not found")
-
-def build(bld):
-    obj = bld.create_ns3_module('stats', ['core'])
-    obj.source = [
-        'helper/file-helper.cc',
-        'helper/gnuplot-helper.cc',
-        'model/data-calculator.cc',
-        'model/time-data-calculators.cc',
-        'model/data-output-interface.cc',
-        'model/omnet-data-output.cc',
-        'model/data-collector.cc',
-        'model/gnuplot.cc',
-        'model/data-collection-object.cc',
-        'model/probe.cc',
-        'model/boolean-probe.cc',
-        'model/double-probe.cc',
-        'model/time-probe.cc',
-        'model/uinteger-8-probe.cc',
-        'model/uinteger-16-probe.cc',
-        'model/uinteger-32-probe.cc',
-        'model/time-series-adaptor.cc',
-        'model/file-aggregator.cc',
-        'model/gnuplot-aggregator.cc',
-        'model/get-wildcard-matches.cc', 
-        'model/histogram.cc',
-        ]
-
-    module_test = bld.create_ns3_module_test_library('stats')
-    module_test.source = [
-        'test/basic-data-calculators-test-suite.cc',
-        'test/average-test-suite.cc',
-        'test/double-probe-test-suite.cc',
-        'test/histogram-test-suite.cc',
-        ]
-
-    # Tests encapsulating example programs should be listed here
-    if (bld.env['ENABLE_EXAMPLES']):
-        module_test.source.extend([
-        #   'test/stats-examples-test-suite.cc',
-            ])
-    
-    headers = bld(features='ns3header')
-    headers.module = 'stats'
-    headers.source = [
-        'helper/file-helper.h',
-        'helper/gnuplot-helper.h',
-        'model/data-calculator.h',
-        'model/time-data-calculators.h',
-        'model/basic-data-calculators.h',
-        'model/data-output-interface.h',
-        'model/omnet-data-output.h',
-        'model/data-collector.h',
-        'model/gnuplot.h',
-        'model/average.h',
-        'model/data-collection-object.h',
-        'model/probe.h',
-        'model/boolean-probe.h',
-        'model/double-probe.h',
-        'model/time-probe.h',
-        'model/uinteger-8-probe.h',
-        'model/uinteger-16-probe.h',
-        'model/uinteger-32-probe.h',
-        'model/time-series-adaptor.h',
-        'model/file-aggregator.h',
-        'model/gnuplot-aggregator.h',
-        'model/get-wildcard-matches.h',
-        'model/histogram.h',
-        ]
-
-    if bld.env['SQLITE_STATS']:
-        headers.source.append('model/sqlite-data-output.h')
-        obj.source.append('model/sqlite-data-output.cc')
-        obj.use.append('SQLITE3')
-
-    if bld.env['SQLITE_STATS'] and bld.env['SEMAPHORE_ENABLED']:
-        obj.source.append('model/sqlite-output.cc')
-        headers.source.append('model/sqlite-output.h')
-
-    if (bld.env['ENABLE_EXAMPLES']):
-        bld.recurse('examples')
-
-    bld.ns3_python_bindings()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/tap-bridge/bindings/modulegen__gcc_ILP32.py ns-3.36/src/tap-bridge/bindings/modulegen__gcc_ILP32.py
--- ns-3.35/src/tap-bridge/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/tap-bridge/bindings/modulegen__gcc_ILP32.py	2022-04-30 18:23:58.154734800 -0700
@@ -75,6 +75,8 @@
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::TraceSourceAccessor'])
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'], import_from_module='ns.core')
     ## hash.h (module 'core'): ns3::Hasher [class]
     module.add_class('Hasher', import_from_module='ns.core')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
@@ -182,27 +184,27 @@
     module.add_class('Object', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter >'])
     ## object.h (module 'core'): ns3::Object::AggregateIterator [class]
     module.add_class('AggregateIterator', import_from_module='ns.core', outer_class=root_module['ns3::Object'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::FdReader, ns3::empty, ns3::DefaultDeleter<ns3::FdReader> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::FdReader, ns3::empty, ns3::DefaultDeleter<ns3::FdReader>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::FdReader', 'ns3::empty', 'ns3::DefaultDeleter<ns3::FdReader>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SystemThread, ns3::empty, ns3::DefaultDeleter<ns3::SystemThread> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SystemThread, ns3::empty, ns3::DefaultDeleter<ns3::SystemThread>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::SystemThread', 'ns3::empty', 'ns3::DefaultDeleter<ns3::SystemThread>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
     ## system-thread.h (module 'core'): ns3::SystemThread [class]
     module.add_class('SystemThread', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::SystemThread, ns3::empty, ns3::DefaultDeleter<ns3::SystemThread> >'])
@@ -336,7 +338,7 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char *, long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned char *', 'long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )', 'ns3::TimePrinter')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )*', 'ns3::TimePrinter*')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )&', 'ns3::TimePrinter&')
@@ -2659,8 +2661,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -2883,14 +2885,14 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('>=')
     cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_unary_numeric_operator('-')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
     cls.add_constructor([])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(double const value) [constructor]
@@ -2909,6 +2911,8 @@
     cls.add_constructor([param('long unsigned int const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int const v) [constructor]
     cls.add_constructor([param('long long unsigned int const', 'v')])
+    ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int128_t const v) [constructor]
+    cls.add_constructor([param('int128_t const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t const hi, uint64_t const lo) [constructor]
     cls.add_constructor([param('int64_t const', 'hi'), param('uint64_t const', 'lo')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [constructor]
@@ -3093,79 +3097,79 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3FdReader_Ns3Empty_Ns3DefaultDeleter__lt__ns3FdReader__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::FdReader, ns3::empty, ns3::DefaultDeleter<ns3::FdReader> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::FdReader, ns3::empty, ns3::DefaultDeleter<ns3::FdReader>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::FdReader, ns3::empty, ns3::DefaultDeleter<ns3::FdReader> >::SimpleRefCount(ns3::SimpleRefCount<ns3::FdReader, ns3::empty, ns3::DefaultDeleter<ns3::FdReader> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::FdReader, ns3::empty, ns3::DefaultDeleter<ns3::FdReader>>::SimpleRefCount(ns3::SimpleRefCount<ns3::FdReader, ns3::empty, ns3::DefaultDeleter<ns3::FdReader>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::FdReader, ns3::empty, ns3::DefaultDeleter< ns3::FdReader > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3SystemThread_Ns3Empty_Ns3DefaultDeleter__lt__ns3SystemThread__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SystemThread, ns3::empty, ns3::DefaultDeleter<ns3::SystemThread> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SystemThread, ns3::empty, ns3::DefaultDeleter<ns3::SystemThread>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SystemThread, ns3::empty, ns3::DefaultDeleter<ns3::SystemThread> >::SimpleRefCount(ns3::SimpleRefCount<ns3::SystemThread, ns3::empty, ns3::DefaultDeleter<ns3::SystemThread> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SystemThread, ns3::empty, ns3::DefaultDeleter<ns3::SystemThread>>::SimpleRefCount(ns3::SimpleRefCount<ns3::SystemThread, ns3::empty, ns3::DefaultDeleter<ns3::SystemThread>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::SystemThread, ns3::empty, ns3::DefaultDeleter< ns3::SystemThread > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
@@ -3987,10 +3991,16 @@
     cls.add_method('ExtractNeighborIndex', 
                    'uint32_t', 
                    [param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetEpoch() const [member function]
+    cls.add_method('GetEpoch', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() const [member function]
     cls.add_method('GetRemainingBits', 
                    'uint32_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -4001,6 +4011,10 @@
                    'uint32_t', 
                    [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
+    ## nix-vector.h (module 'network'): void ns3::NixVector::SetEpoch(uint32_t epoch) [member function]
+    cls.add_method('SetEpoch', 
+                   'void', 
+                   [param('uint32_t', 'epoch')])
     return
 
 def register_Ns3Node_methods(root_module, cls):
@@ -4319,10 +4333,11 @@
                    'uint32_t', 
                    [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) const [member function]
     cls.add_method('SetNixVector', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')], 
+                   is_const=True)
     ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
     cls.add_method('ToString', 
                    'std::string', 
@@ -4887,6 +4902,14 @@
 
 def register_functions(root_module):
     module = root_module
+    ## tap-encode-decode.h (module 'tap-bridge'): std::string ns3::TapBufferToString(uint8_t * buffer, uint32_t len) [free function]
+    module.add_function('TapBufferToString', 
+                        'std::string', 
+                        [param('uint8_t *', 'buffer'), param('uint32_t', 'len')])
+    ## tap-encode-decode.h (module 'tap-bridge'): bool ns3::TapStringToBuffer(std::string s, uint8_t * buffer, uint32_t * len) [free function]
+    module.add_function('TapStringToBuffer', 
+                        'bool', 
+                        [param('std::string', 's'), param('uint8_t *', 'buffer'), param('uint32_t *', 'len')])
     register_functions_ns3_FatalImpl(module.add_cpp_namespace('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.add_cpp_namespace('Hash'), root_module)
     register_functions_ns3_TracedValueCallback(module.add_cpp_namespace('TracedValueCallback'), root_module)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/tap-bridge/bindings/modulegen__gcc_LP64.py ns-3.36/src/tap-bridge/bindings/modulegen__gcc_LP64.py
--- ns-3.35/src/tap-bridge/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/tap-bridge/bindings/modulegen__gcc_LP64.py	2022-04-30 18:23:58.154734800 -0700
@@ -75,6 +75,8 @@
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::TraceSourceAccessor'])
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'], import_from_module='ns.core')
     ## hash.h (module 'core'): ns3::Hasher [class]
     module.add_class('Hasher', import_from_module='ns.core')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
@@ -182,27 +184,27 @@
     module.add_class('Object', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter >'])
     ## object.h (module 'core'): ns3::Object::AggregateIterator [class]
     module.add_class('AggregateIterator', import_from_module='ns.core', outer_class=root_module['ns3::Object'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::FdReader, ns3::empty, ns3::DefaultDeleter<ns3::FdReader> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::FdReader, ns3::empty, ns3::DefaultDeleter<ns3::FdReader>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::FdReader', 'ns3::empty', 'ns3::DefaultDeleter<ns3::FdReader>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SystemThread, ns3::empty, ns3::DefaultDeleter<ns3::SystemThread> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SystemThread, ns3::empty, ns3::DefaultDeleter<ns3::SystemThread>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::SystemThread', 'ns3::empty', 'ns3::DefaultDeleter<ns3::SystemThread>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
     ## system-thread.h (module 'core'): ns3::SystemThread [class]
     module.add_class('SystemThread', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::SystemThread, ns3::empty, ns3::DefaultDeleter<ns3::SystemThread> >'])
@@ -336,7 +338,7 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char *, long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned char *', 'long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )', 'ns3::TimePrinter')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )*', 'ns3::TimePrinter*')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )&', 'ns3::TimePrinter&')
@@ -2659,8 +2661,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -2883,14 +2885,14 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('>=')
     cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_unary_numeric_operator('-')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
     cls.add_constructor([])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(double const value) [constructor]
@@ -2909,6 +2911,8 @@
     cls.add_constructor([param('long unsigned int const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int const v) [constructor]
     cls.add_constructor([param('long long unsigned int const', 'v')])
+    ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int128_t const v) [constructor]
+    cls.add_constructor([param('int128_t const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t const hi, uint64_t const lo) [constructor]
     cls.add_constructor([param('int64_t const', 'hi'), param('uint64_t const', 'lo')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [constructor]
@@ -3093,79 +3097,79 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3FdReader_Ns3Empty_Ns3DefaultDeleter__lt__ns3FdReader__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::FdReader, ns3::empty, ns3::DefaultDeleter<ns3::FdReader> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::FdReader, ns3::empty, ns3::DefaultDeleter<ns3::FdReader>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::FdReader, ns3::empty, ns3::DefaultDeleter<ns3::FdReader> >::SimpleRefCount(ns3::SimpleRefCount<ns3::FdReader, ns3::empty, ns3::DefaultDeleter<ns3::FdReader> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::FdReader, ns3::empty, ns3::DefaultDeleter<ns3::FdReader>>::SimpleRefCount(ns3::SimpleRefCount<ns3::FdReader, ns3::empty, ns3::DefaultDeleter<ns3::FdReader>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::FdReader, ns3::empty, ns3::DefaultDeleter< ns3::FdReader > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3SystemThread_Ns3Empty_Ns3DefaultDeleter__lt__ns3SystemThread__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SystemThread, ns3::empty, ns3::DefaultDeleter<ns3::SystemThread> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SystemThread, ns3::empty, ns3::DefaultDeleter<ns3::SystemThread>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SystemThread, ns3::empty, ns3::DefaultDeleter<ns3::SystemThread> >::SimpleRefCount(ns3::SimpleRefCount<ns3::SystemThread, ns3::empty, ns3::DefaultDeleter<ns3::SystemThread> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SystemThread, ns3::empty, ns3::DefaultDeleter<ns3::SystemThread>>::SimpleRefCount(ns3::SimpleRefCount<ns3::SystemThread, ns3::empty, ns3::DefaultDeleter<ns3::SystemThread>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::SystemThread, ns3::empty, ns3::DefaultDeleter< ns3::SystemThread > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
@@ -3987,10 +3991,16 @@
     cls.add_method('ExtractNeighborIndex', 
                    'uint32_t', 
                    [param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetEpoch() const [member function]
+    cls.add_method('GetEpoch', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() const [member function]
     cls.add_method('GetRemainingBits', 
                    'uint32_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -4001,6 +4011,10 @@
                    'uint32_t', 
                    [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
+    ## nix-vector.h (module 'network'): void ns3::NixVector::SetEpoch(uint32_t epoch) [member function]
+    cls.add_method('SetEpoch', 
+                   'void', 
+                   [param('uint32_t', 'epoch')])
     return
 
 def register_Ns3Node_methods(root_module, cls):
@@ -4319,10 +4333,11 @@
                    'uint32_t', 
                    [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) const [member function]
     cls.add_method('SetNixVector', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')], 
+                   is_const=True)
     ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
     cls.add_method('ToString', 
                    'std::string', 
@@ -4887,6 +4902,14 @@
 
 def register_functions(root_module):
     module = root_module
+    ## tap-encode-decode.h (module 'tap-bridge'): std::string ns3::TapBufferToString(uint8_t * buffer, uint32_t len) [free function]
+    module.add_function('TapBufferToString', 
+                        'std::string', 
+                        [param('uint8_t *', 'buffer'), param('uint32_t', 'len')])
+    ## tap-encode-decode.h (module 'tap-bridge'): bool ns3::TapStringToBuffer(std::string s, uint8_t * buffer, uint32_t * len) [free function]
+    module.add_function('TapStringToBuffer', 
+                        'bool', 
+                        [param('std::string', 's'), param('uint8_t *', 'buffer'), param('uint32_t *', 'len')])
     register_functions_ns3_FatalImpl(module.add_cpp_namespace('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.add_cpp_namespace('Hash'), root_module)
     register_functions_ns3_TracedValueCallback(module.add_cpp_namespace('TracedValueCallback'), root_module)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/tap-bridge/CMakeLists.txt ns-3.36/src/tap-bridge/CMakeLists.txt
--- ns-3.35/src/tap-bridge/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/tap-bridge/CMakeLists.txt	2022-04-30 18:23:58.154734800 -0700
@@ -0,0 +1,51 @@
+if((NOT
+    ${ENABLE_REALTIME})
+   OR (NOT
+       ${ENABLE_EMU})
+)
+  message(
+    ${HIGHLIGHTED_STATUS}
+    "tap-bridge requires emulation and realtime features"
+  )
+  message(
+    ${HIGHLIGHTED_STATUS}
+    "Skipping src/tap-bridge"
+  )
+  list(
+    REMOVE_ITEM
+    libs_to_build
+    tap-bridge
+    PARENT_SCOPE
+  )
+  return()
+endif()
+
+build_lib(
+  LIBNAME tap-bridge
+  SOURCE_FILES
+    helper/tap-bridge-helper.cc
+    model/tap-bridge.cc
+    model/tap-encode-decode.cc
+  HEADER_FILES
+    helper/tap-bridge-helper.h
+    model/tap-bridge.h
+    model/tap-encode-decode.h
+  LIBRARIES_TO_LINK
+    ${libcore}
+    ${libinternet}
+    ${libnetwork}
+)
+
+add_definitions(
+  -DTAP_CREATOR="${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/src/tap-bridge/ns${NS3_VER}-tap-creator${build_profile_suffix}"
+)
+add_executable(
+  tap-creator
+  model/tap-creator.cc
+  model/tap-encode-decode.cc
+)
+set_runtime_outputdirectory(
+  tap-creator
+  ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/src/tap-bridge/
+  ""
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/tap-bridge/examples/CMakeLists.txt ns-3.36/src/tap-bridge/examples/CMakeLists.txt
--- ns-3.35/src/tap-bridge/examples/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/tap-bridge/examples/CMakeLists.txt	2022-04-30 18:23:58.154734800 -0700
@@ -0,0 +1,44 @@
+if(${ENABLE_TAP})
+  build_lib_example(
+    NAME tap-csma
+    SOURCE_FILES tap-csma.cc
+    LIBRARIES_TO_LINK
+      ${libcsma}
+      ${libtap-bridge}
+      ${libinternet}
+      ${libwifi}
+  )
+
+  build_lib_example(
+    NAME tap-csma-virtual-machine
+    SOURCE_FILES tap-csma-virtual-machine.cc
+    LIBRARIES_TO_LINK
+      ${libcsma}
+      ${libtap-bridge}
+      ${libinternet}
+  )
+
+  build_lib_example(
+    NAME tap-wifi-virtual-machine
+    SOURCE_FILES tap-wifi-virtual-machine.cc
+    LIBRARIES_TO_LINK
+      ${libcsma}
+      ${libtap-bridge}
+      ${libinternet}
+      ${libwifi}
+      ${libmobility}
+  )
+
+  build_lib_example(
+    NAME tap-wifi-dumbbell
+    SOURCE_FILES tap-wifi-dumbbell.cc
+    LIBRARIES_TO_LINK
+      ${libwifi}
+      ${libcsma}
+      ${libpoint-to-point}
+      ${libtap-bridge}
+      ${libinternet}
+      ${libapplications}
+  )
+
+endif()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/tap-bridge/examples/tap-csma.cc ns-3.36/src/tap-bridge/examples/tap-csma.cc
--- ns-3.35/src/tap-bridge/examples/tap-csma.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/tap-bridge/examples/tap-csma.cc	2022-04-30 18:23:58.154734800 -0700
@@ -51,7 +51,7 @@
 //
 // 1) Ping one of the simulated nodes
 //
-//    ./waf --run tap-csma&
+//    ./ns3 run tap-csma&
 //    ping 10.1.1.2
 //
 #include <iostream>
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/tap-bridge/examples/tap-csma-virtual-machine.cc ns-3.36/src/tap-bridge/examples/tap-csma-virtual-machine.cc
--- ns-3.35/src/tap-bridge/examples/tap-csma-virtual-machine.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/tap-bridge/examples/tap-csma-virtual-machine.cc	2022-04-30 18:23:58.154734800 -0700
@@ -97,7 +97,7 @@
   // devices installed on both of the nodes.  The data rate and delay for the
   // channel can be set through the command-line parser.  For example,
   //
-  // ./waf --run "tap=csma-virtual-machine --ns3::CsmaChannel::DataRate=10000000"
+  // ./ns3 run "tap=csma-virtual-machine --ns3::CsmaChannel::DataRate=10000000"
   //
   CsmaHelper csma;
   NetDeviceContainer devices = csma.Install (nodes);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/tap-bridge/examples/tap-wifi-dumbbell.cc ns-3.36/src/tap-bridge/examples/tap-wifi-dumbbell.cc
--- ns-3.35/src/tap-bridge/examples/tap-wifi-dumbbell.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/tap-bridge/examples/tap-wifi-dumbbell.cc	2022-04-30 18:23:58.154734800 -0700
@@ -53,7 +53,7 @@
 //
 // 1) Ping one of the simulated nodes on the left side of the topology.
 //
-//    ./waf --run tap-wifi-dumbbell&
+//    ./ns3 run tap-wifi-dumbbell&
 //    ping 10.1.1.3
 //
 // 2) Configure a route in the linux host and ping once of the nodes on the 
@@ -61,7 +61,7 @@
 //    delays due to CBR background traffic on the point-to-point (see next
 //    item).
 //
-//    ./waf --run tap-wifi-dumbbell&
+//    ./ns3 run tap-wifi-dumbbell&
 //    sudo route add -net 10.1.3.0 netmask 255.255.255.0 dev thetap gw 10.1.1.2
 //    ping 10.1.3.4
 //
@@ -77,7 +77,7 @@
 //    reflected in large delays seen by ping.  You can crank down the CBR 
 //    traffic data rate and watch the ping timing change dramatically.
 //
-//    ./waf --run "tap-wifi-dumbbell --ns3::OnOffApplication::DataRate=100kb/s"&
+//    ./ns3 run "tap-wifi-dumbbell --ns3::OnOffApplication::DataRate=100kb/s"&
 //    sudo route add -net 10.1.3.0 netmask 255.255.255.0 dev thetap gw 10.1.1.2
 //    ping 10.1.3.4
 //
@@ -93,7 +93,7 @@
 //    sudo brctl addif mybridge mytap1
 //    sudo brctl addif mybridge mytap2
 //    sudo ifconfig mybridge 10.1.1.5 netmask 255.255.255.0 up
-//    ./waf --run "tap-wifi-dumbbell --mode=UseBridge --tapName=mytap2"&
+//    ./ns3 run "tap-wifi-dumbbell --mode=UseBridge --tapName=mytap2"&
 //    ping 10.1.1.3
 
 #include <iostream>
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/tap-bridge/examples/wscript ns-3.36/src/tap-bridge/examples/wscript
--- ns-3.35/src/tap-bridge/examples/wscript	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/tap-bridge/examples/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,15 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    env = bld.env
-    if env['ENABLE_TAP']:
-        obj = bld.create_ns3_program('tap-csma', ['csma', 'tap-bridge', 'internet', 'wifi'])
-        obj.source = 'tap-csma.cc'
-        obj = bld.create_ns3_program('tap-csma-virtual-machine', ['csma', 'tap-bridge', 'internet'])
-        obj.source = 'tap-csma-virtual-machine.cc'
-        bld.register_ns3_script('tap-csma-virtual-machine.py', ['csma', 'tap-bridge', 'internet'])
-        obj = bld.create_ns3_program('tap-wifi-virtual-machine', ['csma', 'tap-bridge', 'internet', 'wifi', 'mobility'])
-        obj.source = 'tap-wifi-virtual-machine.cc'
-        bld.register_ns3_script('tap-wifi-virtual-machine.py', ['csma', 'tap-bridge', 'internet', 'wifi', 'mobility'])
-        obj = bld.create_ns3_program('tap-wifi-dumbbell', ['wifi', 'csma', 'point-to-point', 'tap-bridge', 'internet', 'applications'])
-        obj.source = 'tap-wifi-dumbbell.cc'
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/tap-bridge/model/tap-bridge.h ns-3.36/src/tap-bridge/model/tap-bridge.h
--- ns-3.35/src/tap-bridge/model/tap-bridge.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/tap-bridge/model/tap-bridge.h	2022-04-30 18:23:58.154734800 -0700
@@ -49,15 +49,15 @@
 
 /**
  * \ingroup tap-bridge
- * 
- * \brief A bridge to make it appear that a real host process is connected to 
+ *
+ * \brief A bridge to make it appear that a real host process is connected to
  * an ns-3 net device.
  *
  * The Tap Bridge lives in a kind of a gray world somewhere between a
  * Linux host and an ns-3 bridge device.  From the Linux perspective,
  * this code appears as the user mode handler for a Tap net device.  That
  * is, when the Linux host writes to a /dev/tap device (that is either
- * manually or automatically created depending on basic operating mode 
+ * manually or automatically created depending on basic operating mode
  * -- more on this later), the write is redirected into the TapBridge that
  * lives in the ns-3 world; and from this perspective, becomes a read.
  * In other words, a Linux process writes a packet to a tap device and
@@ -70,7 +70,7 @@
  * the host using the Linux TAP mechanism.  This write to the device will
  * then appear to the Linux host as if a packet has arrived on its
  * device.
- * 
+ *
  * The upshot is that the Tap Bridge appears to bridge a tap device on a
  * Linux host in the "real world" to an ns-3 net device in the simulation
  * and make is appear that a ns-3 net device is actually installed in the
@@ -81,12 +81,12 @@
  * Linux.  This is not just arbitrary policy, it is because:
  *
  * - Bits sent to the Tap Bridge from higher layers in the ghost node (using
- *   the TapBridge Send() method) are completely ignored.  The Tap Bridge is 
+ *   the TapBridge Send() method) are completely ignored.  The Tap Bridge is
  *   not, itself, connected to any network, neither in Linux nor in ns-3;
  * - The bridged ns-3 net device is has had its receive callback disconnected
- *   from the ns-3 node and reconnected to the Tap Bridge.  All data received 
- *   by a bridged device will be sent to the Linux host and will not be 
- *   received by the node.  From the perspective of the ghost node, you can 
+ *   from the ns-3 node and reconnected to the Tap Bridge.  All data received
+ *   by a bridged device will be sent to the Linux host and will not be
+ *   received by the node.  From the perspective of the ghost node, you can
  *   send over this device but you cannot ever receive.
  *
  * Of course, if you understand all of the issues you can take control of
@@ -145,7 +145,7 @@
    * \param bridgedDevice device to set
    *
    * \attention The ns-3 net device that is being set as the device must have an
-   * an IP address assigned to it before the simulation is run.  This address 
+   * an IP address assigned to it before the simulation is run.  This address
    * will be used to set the hardware address of the host Linux device.
    */
   void SetBridgedNetDevice (Ptr<NetDevice> bridgedDevice);
@@ -156,7 +156,7 @@
    * The tap bridge consumes a non-trivial amount of time to start.  It starts
    * up in the context of a scheduled event to ensure that all configuration
    * has been completed before extracting the configuration (IP addresses, etc.)
-   * In order to allow a more reasonable start-up sequence than a thundering 
+   * In order to allow a more reasonable start-up sequence than a thundering
    * herd of devices, the time at which each device starts is also configurable
    * bot via the Attribute system and via this call.
    *
@@ -219,8 +219,8 @@
 protected:
   /**
    * Call out to a separate process running as suid root in order to get our
-   * tap device created.  We do this to avoid having the entire simulation 
-   * running as root.  If this method returns, we'll have a socket waiting 
+   * tap device created.  We do this to avoid having the entire simulation
+   * running as root.  If this method returns, we'll have a socket waiting
    * for us in m_sock that we can use to talk to the tap device.
    */
   virtual void DoDispose (void);
@@ -253,8 +253,8 @@
 
   /**
    * Call out to a separate process running as suid root in order to get our
-   * tap device created.  We do this to avoid having the entire simulation 
-   * running as root.  If this method returns, we'll have a socket waiting 
+   * tap device created.  We do this to avoid having the entire simulation
+   * running as root.  If this method returns, we'll have a socket waiting
    * for us in m_sock that we can use to talk to the tap device.
    */
   void CreateTap (void);
@@ -271,11 +271,13 @@
 
   /**
    * Callback to process packets that are read
+   * \param buf input buffer
+   * \param len input buffer length
    */
   void ReadCallback (uint8_t *buf, ssize_t len);
 
   /**
-   * Forward a packet received from the tap device to the bridged ns-3 
+   * Forward a packet received from the tap device to the bridged ns-3
    * device
    *
    * \param buf A character buffer containing the actual packet bits that were
@@ -289,17 +291,17 @@
    * checking on a received packet to make sure it isn't too evil for our
    * poor naive virginal simulator to handle.
    *
-   * \param packet The packet we received from the host, and which we need 
+   * \param packet The packet we received from the host, and which we need
    *               to check.
    * \param src    A pointer to the data structure that will get the source
    *               MAC address of the packet (extracted from the packet Ethernet
    *               header).
    * \param dst    A pointer to the data structure that will get the destination
-   *               MAC address of the packet (extracted from the packet Ethernet 
+   *               MAC address of the packet (extracted from the packet Ethernet
    *               header).
-   * \param type   A pointer to the variable that will get the packet type from 
+   * \param type   A pointer to the variable that will get the packet type from
    *               either the Ethernet header in the case of type interpretation
-   *               (DIX framing) or from the 802.2 LLC header in the case of 
+   *               (DIX framing) or from the 802.2 LLC header in the case of
    *               length interpretation (802.3 framing).
    * \returns the packet, or null if the packet has been filtered.
    */
@@ -410,8 +412,8 @@
   /**
    * The MAC address to use as the hardware address on the host; only used
    * in UseLocal mode.  This value comes from the MAC
-   * address assigned to the bridged ns-3 net device and matches the MAC 
-   * address of the underlying network TAP which we configured to have the 
+   * address assigned to the bridged ns-3 net device and matches the MAC
+   * address of the underlying network TAP which we configured to have the
    * same value.
    */
   Mac48Address m_tapMac;
@@ -438,7 +440,7 @@
 
   /**
    * a copy of the node id so the read thread doesn't have to GetNode() in
-   * in order to find the node ID.  Thread unsafe reference counting in 
+   * in order to find the node ID.  Thread unsafe reference counting in
    * multithreaded apps is not a good thing.
    */
   uint32_t m_nodeId;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/tap-bridge/wscript ns-3.36/src/tap-bridge/wscript
--- ns-3.35/src/tap-bridge/wscript	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/tap-bridge/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,57 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-import os.path
-
-def configure(conf):
-    if conf.env['ENABLE_THREADING']:
-        conf.env['ENABLE_TAP'] = conf.check_nonfatal(header_name='linux/if_tun.h',
-                                            define_name='HAVE_IF_TUN_H')
-        conf.report_optional_feature("TapBridge", "Tap Bridge",
-                                     conf.env['ENABLE_TAP'],
-                                     "<linux/if_tun.h> include not detected")
-    else:
-        conf.report_optional_feature("TapBridge", "Tap Bridge",
-                                     False,
-                                     "needs threading support which is not available")
-
-    if conf.env['ENABLE_TAP']:
-        blddir = os.path.abspath(os.path.join(conf.bldnode.abspath(), conf.variant))
-        tapcreatordir = os.path.abspath(os.path.join(blddir, "src/tap-bridge"))
-        conf.env.append_value('NS3_EXECUTABLE_PATH', tapcreatordir)
-    else:
-        # Add this module to the list of modules that won't be built
-        # if they are enabled.
-        conf.env['MODULES_NOT_BUILT'].append('tap-bridge')
-
-def build(bld):
-    # Don't do anything for this module if tap-bridge's not enabled.
-    if not bld.env['ENABLE_TAP']:
-        return
-
-    module = bld.create_ns3_module('tap-bridge', ['internet', 'network', 'core'])
-    module.source = [
-        'model/tap-bridge.cc',
-        'model/tap-encode-decode.cc',
-        'helper/tap-bridge-helper.cc',
-        ]
-    headers = bld(features='ns3header')
-    headers.module = 'tap-bridge'
-    headers.source = [
-        'model/tap-bridge.h',
-        'helper/tap-bridge-helper.h',
-        'doc/tap.h',
-        ]
-
-    if not bld.env['PLATFORM'].startswith('freebsd'):
-        tap_creator = bld.create_suid_program('tap-creator')
-        tap_creator.source = [
-            'model/tap-creator.cc',
-            'model/tap-encode-decode.cc',
-            ]
-
-    module.env.append_value("DEFINES", "TAP_CREATOR=\"%s\"" % (tap_creator.target,))
-
-    if bld.env['ENABLE_EXAMPLES']:
-        bld.recurse('examples')
-
-    bld.ns3_python_bindings()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/test/CMakeLists.txt ns-3.36/src/test/CMakeLists.txt
--- ns-3.35/src/test/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/test/CMakeLists.txt	2022-04-30 18:23:58.154734800 -0700
@@ -0,0 +1,106 @@
+set(dsr_sources)
+
+# cmake-format: off
+if((dsr IN_LIST ns3-all-enabled-modules)
+    AND (uan IN_LIST ns3-all-enabled-modules)
+    AND (olsr IN_LIST ns3-all-enabled-modules))
+  set(dsr_sources traced/traced-callback-typedef-test-suite.cc)
+endif()
+# cmake-format: on
+
+set(application_sources)
+set(csma_sources)
+set(wifi_sources)
+if(applications
+   IN_LIST
+   ns3-all-enabled-modules
+)
+  if(point-to-point
+     IN_LIST
+     ns3-all-enabled-modules
+  )
+    # cmake-format: off
+    set(applications_sources
+        ns3tcp/ns3tcp-loss-test-suite.cc
+        ns3tcp/ns3tcp-no-delay-test-suite.cc
+        ns3tcp/ns3tcp-socket-test-suite.cc
+        ns3tcp/ns3tcp-state-test-suite.cc
+    )
+    # cmake-format: on
+  endif()
+  if(wifi
+     IN_LIST
+     ns3-all-enabled-modules
+  )
+    set(wifi_sources
+        ns3wifi/wifi-issue-211-test-suite.cc
+        ns3wifi/wifi-ac-mapping-test-suite.cc
+        ns3wifi/wifi-msdu-aggregator-test-suite.cc
+    )
+  endif()
+  if((csma-layout
+      IN_LIST
+      ns3-all-enabled-modules
+     )
+     AND (internet-apps
+          IN_LIST
+          ns3-all-enabled-modules
+         )
+  )
+    set(csma_sources
+        csma-system-test-suite.cc
+    )
+  endif()
+endif()
+
+set(internet_sources)
+if(internet
+   IN_LIST
+   ns3-all-enabled-modules
+)
+  set(internet_sources
+      ns3tcp/ns3tcp-socket-writer.cc
+  )
+endif()
+
+set(network_sources)
+if(network
+   IN_LIST
+   ns3-all-enabled-modules
+)
+  set(network_sources
+      traced/traced-value-callback-typedef-test-suite.cc
+  )
+endif()
+
+set(traffic-control_sources)
+if(traffic-control
+   IN_LIST
+   ns3-all-enabled-modules
+)
+  set(traffic-control_sources
+      ns3tc/fq-cobalt-queue-disc-test-suite.cc
+      ns3tc/fq-codel-queue-disc-test-suite.cc
+      ns3tc/fq-pie-queue-disc-test-suite.cc
+      ns3tc/pfifo-fast-queue-disc-test-suite.cc
+  )
+endif()
+
+add_library(
+  ${libtest}
+  OBJECT
+  ${PROJECT_SOURCE_DIR}/build-support/empty.cc # empty source file if only
+  # libcore is enabled
+  ${applications_sources}
+  ${csma_sources}
+  ${dsr_sources}
+  ${internet_sources}
+  ${network_sources}
+  ${traffic-control_sources}
+  ${wifi_sources}
+)
+
+add_dependencies(
+  ${libtest}
+  copy_all_headers
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/test/csma-system-test-suite.cc ns-3.36/src/test/csma-system-test-suite.cc
--- ns-3.35/src/test/csma-system-test-suite.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/test/csma-system-test-suite.cc	2022-04-30 18:23:58.154734800 -0700
@@ -51,6 +51,11 @@
 
 using namespace ns3;
 
+/**
+ * \ingroup system-tests-csma
+ * 
+ * \brief CSMA Bridge mode test.
+ */
 class CsmaBridgeTestCase : public TestCase
 {
 public:
@@ -59,8 +64,14 @@
 
 private:
   virtual void DoRun (void);
+
+  /**
+   * Sink called when a packet is received.
+   * \param p Received packet (unused).
+   * \param ad Sender's address (uused).
+   */
   void SinkRx (Ptr<const Packet> p, const Address &ad);
-  uint32_t m_count;
+  uint32_t m_count; //!< Counter of received packets.
 };
 
 // Add some help text to this case to describe what it is intended to test
@@ -155,6 +166,11 @@
   NS_TEST_ASSERT_MSG_EQ (m_count, 10, "Bridge should have passed 10 packets");
 }
 
+/**
+ * \ingroup system-tests-csma
+ * 
+ * \brief CSMA Broadcast mode test.
+ */
 class CsmaBroadcastTestCase : public TestCase
 {
 public:
@@ -163,12 +179,26 @@
 
 private:
   virtual void DoRun (void);
+
+  /**
+   * Sink called when a packet is received by a node.
+   * \param p Received packet (unused).
+   * \param ad Sender's address (uused).
+   * @{
+   */
   void SinkRxNode1 (Ptr<const Packet> p, const Address &ad);
   void SinkRxNode2 (Ptr<const Packet> p, const Address &ad);
+  /** @} */
+
+  /**
+   * Sink called when a packet is dropped.
+   * \param p Received packet (unused).
+   */
   void DropEvent (Ptr<const Packet> p);
-  uint32_t m_countNode1;
-  uint32_t m_countNode2;
-  uint32_t m_drops;
+
+  uint32_t m_countNode1; //!< Counter of received packets on node 1.
+  uint32_t m_countNode2; //!< Counter of received packets on node 2.
+  uint32_t m_drops;      //!< Counter of dropped packets.
 };
 
 // Add some help text to this case to describe what it is intended to test
@@ -275,6 +305,11 @@
   NS_TEST_ASSERT_MSG_EQ (m_countNode2, 10, "Node 2 should have received 10 packets");
 }
 
+/**
+ * \ingroup system-tests-csma
+ * 
+ * \brief CSMA Multicast mode test.
+ */
 class CsmaMulticastTestCase : public TestCase
 {
 public:
@@ -283,10 +318,22 @@
 
 private:
   virtual void DoRun (void);
+
+  /**
+   * Sink called when a packet is received by a node.
+   * \param p Received packet (unused).
+   * \param ad Sender's address (uused).
+   */
   void SinkRx (Ptr<const Packet> p, const Address &ad);
+
+  /**
+   * Sink called when a packet is dropped.
+   * \param p Received packet (unused).
+   */
   void DropEvent (Ptr<const Packet> p);
-  uint32_t m_count;
-  uint32_t m_drops;
+
+  uint32_t m_count; //!< Counter of received packets.
+  uint32_t m_drops; //!< Counter of dropped packets.
 };
 
 // Add some help text to this case to describe what it is intended to test
@@ -435,6 +482,11 @@
   NS_TEST_ASSERT_MSG_EQ (m_count, 10, "Node 4 should have received 10 packets");
 }
 
+/**
+ * \ingroup system-tests-csma
+ * 
+ * \brief CSMA One Subnet mode test.
+ */
 class CsmaOneSubnetTestCase : public TestCase
 {
 public:
@@ -443,12 +495,25 @@
 
 private:
   virtual void DoRun (void);
+
+  /**
+   * Sink called when a packet is received by a node.
+   * \param p Received packet (unused).
+   * \param ad Sender's address (uused).
+   * @{
+   */
   void SinkRxNode0 (Ptr<const Packet> p, const Address &ad);
   void SinkRxNode1 (Ptr<const Packet> p, const Address &ad);
+  /** @} */
+
+  /**
+   * Sink called when a packet is dropped.
+   * \param p Received packet (unused).
+   */
   void DropEvent (Ptr<const Packet> p);
-  uint32_t m_countNode0;
-  uint32_t m_countNode1;
-  uint32_t m_drops;
+  uint32_t m_countNode0; //!< Counter of received packets on node 0.
+  uint32_t m_countNode1; //!< Counter of received packets on node 1.
+  uint32_t m_drops;      //!< Counter of dropped packets.
 };
 
 // Add some help text to this case to describe what it is intended to test
@@ -563,6 +628,11 @@
   NS_TEST_ASSERT_MSG_EQ (m_countNode1, 10, "Node 1 should have received 10 packets");
 }
 
+/**
+ * \ingroup system-tests-csma
+ * 
+ * \brief CSMA PacketSocket test.
+ */
 class CsmaPacketSocketTestCase : public TestCase
 {
 public:
@@ -571,10 +641,22 @@
 
 private:
   virtual void DoRun (void);
-  void SinkRx (std::string path, Ptr<const Packet> p, const Address &address);
+  /**
+   * Sink called when a packet is received by a node.
+   * \param path Sink path.
+   * \param p Received packet (unused).
+   * \param ad Sender's address (uused).
+   */
+  void SinkRx (std::string path, Ptr<const Packet> p, const Address &ad);
+
+  /**
+   * Sink called when a packet is dropped.
+   * \param p Received packet (unused).
+   */
   void DropEvent (Ptr<const Packet> p);
-  uint32_t m_count;
-  uint32_t m_drops;
+
+  uint32_t m_count; //!< Counter of received packets.
+  uint32_t m_drops; //!< Counter of dropped packets.
 };
 
 // Add some help text to this case to describe what it is intended to test
@@ -669,6 +751,11 @@
   NS_TEST_ASSERT_MSG_EQ (m_count, 10, "Node 0 should have received 10 packets");
 }
 
+/**
+ * \ingroup system-tests-csma
+ * 
+ * \brief CSMA PING test.
+ */
 class CsmaPingTestCase : public TestCase
 {
 public:
@@ -677,12 +764,29 @@
 
 private:
   virtual void DoRun (void);
+  /**
+   * Sink called when a packet is received by a node.
+   * \param p Received packet (unused).
+   * \param ad Sender's address (uused).
+   */
   void SinkRx (Ptr<const Packet> p, const Address &ad);
+
+  /**
+   * Sink called when a PING ois received.
+   * \param context Context path (unused).
+   * \param rtt Round Trip Time (unused).
+   */
   void PingRtt (std::string context, Time rtt);
+
+  /**
+   * Sink called when a packet is dropped.
+   * \param p Received packet (unused).
+   */
   void DropEvent (Ptr<const Packet> p);
-  uint32_t m_countSinkRx;
-  uint32_t m_countPingRtt;
-  uint32_t m_drops;
+
+  uint32_t m_countSinkRx;   //!< Counter of received packets.
+  uint32_t m_countPingRtt;  //!< Counter of PING received.
+  uint32_t m_drops;         //!< Counter of dropped packets.
 };
 
 // Add some help text to this case to describe what it is intended to test
@@ -790,6 +894,11 @@
   NS_TEST_ASSERT_MSG_EQ (m_countPingRtt, 9, "Node 2 should have been pinged 9 times");
 }
 
+/**
+ * \ingroup system-tests-csma
+ * 
+ * \brief CSMA Raw IP test.
+ */
 class CsmaRawIpSocketTestCase : public TestCase
 {
 public:
@@ -798,10 +907,22 @@
 
 private:
   virtual void DoRun (void);
+
+  /**
+   * Sink called when a packet is received by a node.
+   * \param p Received packet (unused).
+   * \param ad Sender's address (uused).
+   */
   void SinkRx (Ptr<const Packet> p, const Address &ad);
+
+  /**
+   * Sink called when a packet is dropped.
+   * \param p Received packet (unused).
+   */
   void DropEvent (Ptr<const Packet> p);
-  uint32_t m_count;
-  uint32_t m_drops;
+
+  uint32_t m_count; //!< Counter of received packets.
+  uint32_t m_drops; //!< Counter of dropped packets.
 };
 
 // Add some help text to this case to describe what it is intended to test
@@ -888,6 +1009,11 @@
   NS_TEST_ASSERT_MSG_EQ (m_count, 10, "Node 3 should have received 10 packets");
 }
 
+/**
+ * \ingroup system-tests-csma
+ * 
+ * \brief CSMA star mode test.
+ */
 class CsmaStarTestCase : public TestCase
 {
 public:
@@ -896,10 +1022,22 @@
 
 private:
   virtual void DoRun (void);
+
+  /**
+   * Sink called when a packet is received by a node.
+   * \param p Received packet (unused).
+   * \param ad Sender's address (uused).
+   */
   void SinkRx (Ptr<const Packet> p, const Address &ad);
+
+  /**
+   * Sink called when a packet is dropped.
+   * \param p Received packet (unused).
+   */
   void DropEvent (Ptr<const Packet> p);
-  uint32_t m_count;
-  uint32_t m_drops;
+
+  uint32_t m_count; //!< Counter of received packets.
+  uint32_t m_drops; //!< Counter of dropped packets.
 };
 
 // Add some help text to this case to describe what it is intended to test
@@ -1070,6 +1208,11 @@
   NS_TEST_ASSERT_MSG_EQ (m_count, 10 * ( nSpokes * (nFill + 1)), "Hub node did not receive the proper number of packets");
 }
 
+/**
+ * \ingroup system-tests-csma
+ * 
+ * \brief CSMA TestSuite.
+ */
 class CsmaSystemTestSuite : public TestSuite
 {
 public:
@@ -1089,5 +1232,5 @@
   AddTestCase (new CsmaStarTestCase, TestCase::QUICK);
 }
 
-// Do not forget to allocate an instance of this TestSuite
+/// Do not forget to allocate an instance of this TestSuite
 static CsmaSystemTestSuite csmaSystemTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/test/doc/tests.h ns-3.36/src/test/doc/tests.h
--- ns-3.35/src/test/doc/tests.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/test/doc/tests.h	2022-04-30 18:23:58.154734800 -0700
@@ -0,0 +1,84 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+/**
+ * \file
+ * \ingroup tests
+ * This file provides some doxygen documentation for the tests module.
+ */
+
+
+/**
+ * \ingroup tests
+ * \defgroup system-tests System Tests
+ * 
+ * \brief The "tests" module contains the System Tests, i.e., tests that
+ * dependss on multiple modules. Due to their dependencies, the System Tests
+ * are in this module.
+ * 
+ * Unit tests, on the contrary, are located in each module.
+ */
+
+/**
+ * \ingroup system-tests
+ * \ingroup traffic-control-test
+ * \defgroup system-tests-tc TrafficControl System Tests
+ * 
+ * \brief TrafficControl System Tests
+ */
+
+/**
+ * \ingroup system-tests
+ * \ingroup internet-test
+ * \defgroup system-tests-tcp TCP System Tests
+ * 
+ * \brief TCP System Tests
+ */
+
+/**
+ * \ingroup system-tests
+ * \ingroup wifi-test
+ * \defgroup system-tests-wifi WiFi System Tests
+ * 
+ * \brief WiFi System Tests
+ */
+
+/**
+ * \ingroup system-tests
+ * \defgroup system-tests-perf Performance System Tests
+ * 
+ * \brief Performance System Tests
+ * 
+ * Note: these tests are (for real) scripts to be run.
+ * The ouput is the time (in nanoseconds) that the test 
+ * required to perform the requested write operations.
+ */
+
+/**
+ * \ingroup system-tests
+ * \ingroup core-tests
+ * \defgroup system-tests-traced TracedCallback System Tests
+ * 
+ * \brief TracedCallback System Tests
+ */
+
+/**
+ * \ingroup system-tests
+ * \ingroup csma
+ * \defgroup system-tests-csma CSMA System Tests
+ * 
+ * \brief CSMA System Tests
+ */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/test/ns3tc/fq-cobalt-queue-disc-test-suite.cc ns-3.36/src/test/ns3tc/fq-cobalt-queue-disc-test-suite.cc
--- ns-3.35/src/test/ns3tc/fq-cobalt-queue-disc-test-suite.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/test/ns3tc/fq-cobalt-queue-disc-test-suite.cc	2022-04-30 18:23:58.158735000 -0700
@@ -39,12 +39,13 @@
 
 using namespace ns3;
 
-// Variable to assign m_hash to a new packet's flow
-int32_t m_hash;
+/// Variable to assign g_hash to a new packet's flow
+static int32_t g_hash;
 
 /**
- * Simple test packet filter able to classify IPv4 packets
- *
+ * \ingroup system-tests-tc
+ * 
+ * Simple test packet filter able to classify IPv4 packets.
  */
 class Ipv4FqCobaltTestPacketFilter : public Ipv4PacketFilter {
 public:
@@ -58,7 +59,18 @@
   virtual ~Ipv4FqCobaltTestPacketFilter ();
 
 private:
+  /**
+   * Classify a QueueDiscItem
+   * \param item The item to classify (unused).
+   * \return a pre-set hash value.
+   */
   virtual int32_t DoClassify (Ptr<QueueDiscItem> item) const;
+
+  /**
+   * Check the protocol.
+   * \param item The item to check (unused).
+   * \return true.
+   */
   virtual bool CheckProtocol (Ptr<QueueDiscItem> item) const;
 };
 
@@ -84,7 +96,7 @@
 int32_t
 Ipv4FqCobaltTestPacketFilter::DoClassify (Ptr<QueueDiscItem> item) const
 {
-  return m_hash;
+  return g_hash;
 }
 
 bool
@@ -94,7 +106,9 @@
 }
 
 /**
- * This class tests packets for which there is no suitable filter
+ * \ingroup system-tests-tc
+ * 
+ * This class tests packets for which there is no suitable filter.
  */
 class FqCobaltQueueDiscNoSuitableFilter : public TestCase
 {
@@ -123,7 +137,7 @@
   Ptr<Ipv4FqCobaltTestPacketFilter> filter = CreateObject<Ipv4FqCobaltTestPacketFilter> ();
   queueDisc->AddPacketFilter (filter);
 
-  m_hash = -1;
+  g_hash = -1;
   queueDisc->SetQuantum (1500);
   queueDisc->Initialize ();
 
@@ -145,7 +159,9 @@
 }
 
 /**
- * This class tests the IP flows separation and the packet limit
+ * \ingroup system-tests-tc
+ * 
+ * This class tests the IP flows separation and the packet limit.
  */
 class FqCobaltQueueDiscIPFlowsSeparationAndPacketLimit : public TestCase
 {
@@ -155,6 +171,11 @@
 
 private:
   virtual void DoRun (void);
+  /**
+   * Enqueue a packet.
+   * \param queue The queue disc.
+   * \param hdr The IPv4 header.
+   */
   void AddPacket (Ptr<FqCobaltQueueDisc> queue, Ipv4Header hdr);
 };
 
@@ -214,7 +235,9 @@
 }
 
 /**
- * This class tests the deficit per flow
+ * \ingroup system-tests-tc
+ * 
+ * This class tests the deficit per flow.
  */
 class FqCobaltQueueDiscDeficit : public TestCase
 {
@@ -224,6 +247,11 @@
 
 private:
   virtual void DoRun (void);
+  /**
+   * Enqueue a packet.
+   * \param queue The queue disc.
+   * \param hdr The IPv4 header.
+   */
   void AddPacket (Ptr<FqCobaltQueueDisc> queue, Ipv4Header hdr);
 };
 
@@ -356,7 +384,9 @@
 }
 
 /**
- * This class tests the TCP flows separation
+ * \ingroup system-tests-tc
+ * 
+ * This class tests the TCP flows separation.
  */
 class FqCobaltQueueDiscTCPFlowsSeparation : public TestCase
 {
@@ -366,6 +396,12 @@
 
 private:
   virtual void DoRun (void);
+  /**
+   * Enqueue a packet.
+   * \param queue The queue disc.
+   * \param ipHdr The IPv4 header.
+   * \param tcpHdr The TCP header.
+   */
   void AddPacket (Ptr<FqCobaltQueueDisc> queue, Ipv4Header ipHdr, TcpHeader tcpHdr);
 };
 
@@ -442,6 +478,8 @@
 }
 
 /**
+ * \ingroup system-tests-tc
+ * 
  * This class tests the UDP flows separation
  */
 class FqCobaltQueueDiscUDPFlowsSeparation : public TestCase
@@ -452,6 +490,12 @@
 
 private:
   virtual void DoRun (void);
+  /**
+   * Enqueue a packet.
+   * \param queue the queue disc
+   * \param ipHdr the IPv4 header
+   * \param udpHdr the UDP header
+   */
   void AddPacket (Ptr<FqCobaltQueueDisc> queue, Ipv4Header ipHdr, UdpHeader udpHdr);
 };
 
@@ -528,7 +572,10 @@
 }
 
 /**
- * This class tests ECN marking
+ * \ingroup system-tests-tc
+ * 
+ * \brief This class tests ECN marking.
+ * 
  * The test is divided into 3 sub test cases.
  * 1) CE threshold disabled
  * This test enqueues 100 packets in the beginning of the test and dequeues 60 (some packets are dropped too) packets with the
@@ -551,9 +598,33 @@
 
 private:
   virtual void DoRun (void);
+  /**
+   * Enqueue the given number of packets.
+   * \param queue The queue disc.
+   * \param hdr The IPv4 header.
+   * \param nPkt The number of packets.
+   * \param nPktEnqueued The expected number of enqueued packets.
+   * \param nQueueFlows The expected number of flow queues.
+   */
   void AddPacket (Ptr<FqCobaltQueueDisc> queue, Ipv4Header hdr, u_int32_t nPkt, u_int32_t nPktEnqueued, u_int32_t nQueueFlows);
+  /**
+   * Dequeue the given number of packets.
+   * \param queue The queue disc.
+   * \param nPkt The number of packets.
+   */
   void Dequeue (Ptr<FqCobaltQueueDisc> queue, uint32_t nPkt);
+  /**
+   * Dequeue the given number of packets at different times.
+   * \param queue The queue disc.
+   * \param delay The time between two consecutive dequeue operations.
+   * \param nPkt The number of packets.
+   */
   void DequeueWithDelay (Ptr<FqCobaltQueueDisc> queue, double delay, uint32_t nPkt);
+  /**
+   * Tracer for the DropNext attribute
+   * \param oldVal Old value.
+   * \param newVal New value.
+   */
   void DropNextTracer (int64_t oldVal, int64_t newVal);
   uint32_t m_dropNextCount;    ///< count the number of times m_dropNext is recalculated
 };
@@ -609,10 +680,8 @@
 }
 
 void
-FqCobaltQueueDiscEcnMarking::DropNextTracer (int64_t oldVal, int64_t newVal)
+FqCobaltQueueDiscEcnMarking::DropNextTracer ([[maybe_unused]] int64_t oldVal, [[maybe_unused]] int64_t newVal)
 {
-  NS_UNUSED (oldVal);
-  NS_UNUSED (newVal);
   m_dropNextCount++;
 }
 
@@ -819,9 +888,12 @@
   Simulator::Destroy ();
 }
 
-/*
- * This class tests linear probing, collision response, and set
- * creation capability of set associative hashing in FqCodel.
+/**
+ * \ingroup system-tests-tc
+ * 
+ * \brief This class tests linear probing, collision response, and set
+ * creation capability of set associative hashing in FqCobalt.
+ * 
  * We modified DoClassify () and CheckProtocol () so that we could control
  * the hash returned for each packet. In the beginning, we use flow hashes
  * ranging from 0 to 7. These must go into different queues in the same set. 
@@ -839,8 +911,7 @@
  * the hash. When a flow hash of 20 arrives, the value of outerhash
  * is 16. Since m_flowIndices[16] wasnâ€™t previously allotted, a new flow
  * is created, and the tag corresponding to this queue is set to 20.
-*/
-
+ */
 class FqCobaltQueueDiscSetLinearProbing : public TestCase
 {
 public:
@@ -848,6 +919,11 @@
   virtual ~FqCobaltQueueDiscSetLinearProbing ();
 private:
   virtual void DoRun (void);
+  /**
+   * Enqueue a packet.
+   * \param queue The queue disc.
+   * \param hdr The IPv4 header.
+   */
   void AddPacket (Ptr<FqCobaltQueueDisc> queue, Ipv4Header hdr);
 };
 
@@ -885,25 +961,25 @@
   hdr.SetDestination (Ipv4Address ("10.10.1.2"));
   hdr.SetProtocol (7);
 
-  m_hash = 0;
+  g_hash = 0;
   AddPacket (queueDisc, hdr);
-  m_hash = 1;
+  g_hash = 1;
   AddPacket (queueDisc, hdr);
   AddPacket (queueDisc, hdr);
-  m_hash = 2;
+  g_hash = 2;
   AddPacket (queueDisc, hdr);
-  m_hash = 3;
+  g_hash = 3;
   AddPacket (queueDisc, hdr);
-  m_hash = 4;
+  g_hash = 4;
   AddPacket (queueDisc, hdr);
   AddPacket (queueDisc, hdr);
-  m_hash = 5;
+  g_hash = 5;
   AddPacket (queueDisc, hdr);
-  m_hash = 6;
+  g_hash = 6;
   AddPacket (queueDisc, hdr);
-  m_hash = 7;
+  g_hash = 7;
   AddPacket (queueDisc, hdr);
-  m_hash = 1024;
+  g_hash = 1024;
   AddPacket (queueDisc, hdr);
 
   NS_TEST_ASSERT_MSG_EQ (queueDisc->QueueDisc::GetNPackets (), 11,
@@ -924,11 +1000,11 @@
                          "unexpected number of packets in the seventh flow queue of set one");
   NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (7)->GetQueueDisc ()->GetNPackets (), 1,
                          "unexpected number of packets in the eighth flow queue of set one");
-  m_hash = 1025;
+  g_hash = 1025;
   AddPacket (queueDisc, hdr);
   NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (0)->GetQueueDisc ()->GetNPackets (), 3,
                          "unexpected number of packets in the first flow of set one");
-  m_hash = 10;
+  g_hash = 10;
   AddPacket (queueDisc, hdr);
   NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (8)->GetQueueDisc ()->GetNPackets (), 1,
                          "unexpected number of packets in the first flow of set two");
@@ -937,8 +1013,13 @@
 
 
 /**
- * This class tests L4S mode. This test is divided to sub test one without hash collisions and so ECT0 and ECT1 flows are
+ * \ingroup system-tests-tc
+ * 
+ * \brief This class tests L4S mode. 
+ * 
+ * This test is divided to sub test one without hash collisions and so ECT0 and ECT1 flows are
  * classified into different flows.
+ * 
  * Sub Test 1
  * 70 packets are enqueued into both the flows with the delay of 0.5ms between two enqueues, and dequeued with the delay of 
  * 1ms between two dequeues.
@@ -955,9 +1036,33 @@
 
 private:
   virtual void DoRun (void);
+  /**
+   * Enqueue the given number of packets.
+   * \param queue The queue disc.
+   * \param hdr The IPv4 header.
+   * \param nPkt The number of packets.
+   */
   void AddPacket (Ptr<FqCobaltQueueDisc> queue, Ipv4Header hdr, u_int32_t nPkt);
+  /**
+   * Enqueue the given number of packets at different times.
+   * \param queue The queue disc.
+   * \param hdr The IPv4 header.
+   * \param delay The time between two consecutive enqueue operations.
+   * \param nPkt The number of packets.
+   */
   void AddPacketWithDelay (Ptr<FqCobaltQueueDisc> queue,Ipv4Header hdr, double delay, uint32_t nPkt);
+  /**
+   * Dequeue the given number of packets.
+   * \param queue The queue disc.
+   * \param nPkt The number of packets.
+   */
   void Dequeue (Ptr<FqCobaltQueueDisc> queue, uint32_t nPkt);
+  /**
+   * Dequeue the given number of packets at different times.
+   * \param queue The queue disc.
+   * \param delay The time between two consecutive dequeue operations.
+   * \param nPkt The number of packets.
+   */
   void DequeueWithDelay (Ptr<FqCobaltQueueDisc> queue, double delay, uint32_t nPkt);
 };
 
@@ -1103,6 +1208,11 @@
 
 }
 
+/**
+ * \ingroup system-tests-tc
+ * 
+ * FQ-COBALT queue disc test suite.
+ */
 class FqCobaltQueueDiscTestSuite : public TestSuite
 {
 public:
@@ -1122,4 +1232,5 @@
   AddTestCase (new FqCobaltQueueDiscL4sMode, TestCase::QUICK);
 }
 
-static FqCobaltQueueDiscTestSuite fqCobaltQueueDiscTestSuite;
+/// Do not forget to allocate an instance of this TestSuite.
+static FqCobaltQueueDiscTestSuite g_fqCobaltQueueDiscTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/test/ns3tc/fq-codel-queue-disc-test-suite.cc ns-3.36/src/test/ns3tc/fq-codel-queue-disc-test-suite.cc
--- ns-3.35/src/test/ns3tc/fq-codel-queue-disc-test-suite.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/test/ns3tc/fq-codel-queue-disc-test-suite.cc	2022-04-30 18:23:58.158735000 -0700
@@ -37,12 +37,13 @@
 
 using namespace ns3;
 
-// Variable to assign hash to a new packet's flow
-int32_t hash;
+/// Variable to assign g_hash to a new packet's flow
+static int32_t g_hash;
 
 /**
- * Simple test packet filter able to classify IPv4 packets
- *
+ * \ingroup system-tests-tc
+ * 
+ * Simple test packet filter able to classify IPv4 packets.
  */
 class Ipv4TestPacketFilter : public Ipv4PacketFilter {
 public:
@@ -56,7 +57,18 @@
   virtual ~Ipv4TestPacketFilter ();
 
 private:
+  /**
+   * Classify a QueueDiscItem
+   * \param item The item to classify (unused).
+   * \return a pre-set hash value.
+   */
   virtual int32_t DoClassify (Ptr<QueueDiscItem> item) const;
+
+  /**
+   * Check the protocol.
+   * \param item The item to check (unused).
+   * \return true.
+   */
   virtual bool CheckProtocol (Ptr<QueueDiscItem> item) const;
 };
 
@@ -82,7 +94,7 @@
 int32_t
 Ipv4TestPacketFilter::DoClassify (Ptr<QueueDiscItem> item) const
 {
-  return hash;
+  return g_hash;
 }
 
 bool
@@ -92,7 +104,9 @@
 }
 
 /**
- * This class tests packets for which there is no suitable filter
+ * \ingroup system-tests-tc
+ * 
+ * This class tests packets for which there is no suitable filter.
  */
 class FqCoDelQueueDiscNoSuitableFilter : public TestCase
 {
@@ -121,7 +135,7 @@
   Ptr<Ipv4TestPacketFilter> filter = CreateObject<Ipv4TestPacketFilter> ();
   queueDisc->AddPacketFilter (filter);
 
-  hash = -1;
+  g_hash = -1;
   queueDisc->SetQuantum (1500);
   queueDisc->Initialize ();
 
@@ -143,7 +157,9 @@
 }
 
 /**
- * This class tests the IP flows separation and the packet limit
+ * \ingroup system-tests-tc
+ * 
+ * This class tests the IP flows separation and the packet limit.
  */
 class FqCoDelQueueDiscIPFlowsSeparationAndPacketLimit : public TestCase
 {
@@ -153,6 +169,11 @@
 
 private:
   virtual void DoRun (void);
+  /**
+   * Enqueue a packet.
+   * \param queue The queue disc.
+   * \param hdr The IPv4 header.
+   */
   void AddPacket (Ptr<FqCoDelQueueDisc> queue, Ipv4Header hdr);
 };
 
@@ -212,7 +233,9 @@
 }
 
 /**
- * This class tests the deficit per flow
+ * \ingroup system-tests-tc
+ * 
+ * This class tests the deficit per flow.
  */
 class FqCoDelQueueDiscDeficit : public TestCase
 {
@@ -222,6 +245,11 @@
 
 private:
   virtual void DoRun (void);
+  /**
+   * Enqueue a packet.
+   * \param queue The queue disc.
+   * \param hdr The IPv4 header.
+   */
   void AddPacket (Ptr<FqCoDelQueueDisc> queue, Ipv4Header hdr);
 };
 
@@ -354,7 +382,9 @@
 }
 
 /**
- * This class tests the TCP flows separation
+ * \ingroup system-tests-tc
+ * 
+ * This class tests the TCP flows separation.
  */
 class FqCoDelQueueDiscTCPFlowsSeparation : public TestCase
 {
@@ -364,6 +394,12 @@
 
 private:
   virtual void DoRun (void);
+  /**
+   * Enqueue a packet.
+   * \param queue The queue disc.
+   * \param ipHdr The IPv4 header.
+   * \param tcpHdr The TCP header.
+   */
   void AddPacket (Ptr<FqCoDelQueueDisc> queue, Ipv4Header ipHdr, TcpHeader tcpHdr);
 };
 
@@ -440,6 +476,8 @@
 }
 
 /**
+ * \ingroup system-tests-tc
+ * 
  * This class tests the UDP flows separation
  */
 class FqCoDelQueueDiscUDPFlowsSeparation : public TestCase
@@ -450,6 +488,12 @@
 
 private:
   virtual void DoRun (void);
+  /**
+   * Enqueue a packet.
+   * \param queue The queue disc.
+   * \param ipHdr The IPv4 header.
+   * \param udpHdr The UDP header.
+   */
   void AddPacket (Ptr<FqCoDelQueueDisc> queue, Ipv4Header ipHdr, UdpHeader udpHdr);
 };
 
@@ -526,8 +570,12 @@
 }
 
 /**
- * This class tests ECN marking
- * Any future classifier options (e.g. SetAssociativeHash) should be disabled to prevent a hash collision on this test case.
+ * \ingroup system-tests-tc
+ * 
+ * \brief This class tests ECN marking.
+ * 
+ * Any future classifier options (e.g. SetAssociativeHash) should be
+ * disabled to prevent a hash collision on this test case.
  */
 class FqCoDelQueueDiscECNMarking : public TestCase
 {
@@ -537,8 +585,27 @@
 
 private:
   virtual void DoRun (void);
+  /**
+   * Enqueue some packets.
+   * \param queue The queue disc.
+   * \param hdr The IPv4 header.
+   * \param nPkt The number of packets to enqueue.
+   * \param nPktEnqueued The expected number of queue disc classes.
+   * \param nQueueFlows The expected number of flows in the queue.
+   */
   void AddPacket (Ptr<FqCoDelQueueDisc> queue, Ipv4Header hdr, u_int32_t nPkt, u_int32_t nPktEnqueued, u_int32_t nQueueFlows);
+  /**
+   * Dequeue some packets.
+   * \param queue The queue disc.
+   * \param nPkt The number of packets to dequeue.
+   */
   void Dequeue (Ptr<FqCoDelQueueDisc> queue, uint32_t nPkt);
+  /**
+   * Dequeue some packets with delay.
+   * \param queue The queue disc.
+   * \param delay Delay [seconds].
+   * \param nPkt The number of packets to dequeue.
+   */
   void DequeueWithDelay (Ptr<FqCoDelQueueDisc> queue, double delay, uint32_t nPkt);
 };
 
@@ -834,9 +901,12 @@
   Simulator::Destroy ();
 }
 
-/*
- * This class tests linear probing, collision response, and set
+/**
+ * \ingroup system-tests-tc
+ * 
+ * \brief This class tests linear probing, collision response, and set
  * creation capability of set associative hashing in FqCodel.
+ * 
  * We modified DoClassify () and CheckProtocol () so that we could control
  * the hash returned for each packet. In the beginning, we use flow hashes
  * ranging from 0 to 7. These must go into different queues in the same set. 
@@ -855,7 +925,6 @@
  * is 16. Since m_flowIndices[16] wasnâ€™t previously allotted, a new flow
  * is created, and the tag corresponding to this queue is set to 20.
 */
-
 class FqCoDelQueueDiscSetLinearProbing : public TestCase
 {
 public:
@@ -863,6 +932,11 @@
   virtual ~FqCoDelQueueDiscSetLinearProbing ();
 private:
   virtual void DoRun (void);
+  /**
+   * Enqueue a packet.
+   * \param queue The queue disc.
+   * \param hdr The IPv4 header.
+   */
   void AddPacket (Ptr<FqCoDelQueueDisc> queue, Ipv4Header hdr);
 };
 
@@ -900,25 +974,25 @@
   hdr.SetDestination (Ipv4Address ("10.10.1.2"));
   hdr.SetProtocol (7);
 
-  hash = 0;
+  g_hash = 0;
   AddPacket (queueDisc, hdr);
-  hash = 1;
+  g_hash = 1;
   AddPacket (queueDisc, hdr);
   AddPacket (queueDisc, hdr);
-  hash = 2;
+  g_hash = 2;
   AddPacket (queueDisc, hdr);
-  hash = 3;
+  g_hash = 3;
   AddPacket (queueDisc, hdr);
-  hash = 4;
+  g_hash = 4;
   AddPacket (queueDisc, hdr);
   AddPacket (queueDisc, hdr);
-  hash = 5;
+  g_hash = 5;
   AddPacket (queueDisc, hdr);
-  hash = 6;
+  g_hash = 6;
   AddPacket (queueDisc, hdr);
-  hash = 7;
+  g_hash = 7;
   AddPacket (queueDisc, hdr);
-  hash = 1024;
+  g_hash = 1024;
   AddPacket (queueDisc, hdr);
 
   NS_TEST_ASSERT_MSG_EQ (queueDisc->QueueDisc::GetNPackets (), 11,
@@ -939,11 +1013,11 @@
                          "unexpected number of packets in the seventh flow queue of set one");
   NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (7)->GetQueueDisc ()->GetNPackets (), 1,
                          "unexpected number of packets in the eighth flow queue of set one");
-  hash = 1025;
+  g_hash = 1025;
   AddPacket (queueDisc, hdr);
   NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (0)->GetQueueDisc ()->GetNPackets (), 3,
                          "unexpected number of packets in the first flow of set one");
-  hash = 10;
+  g_hash = 10;
   AddPacket (queueDisc, hdr);
   NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (8)->GetQueueDisc ()->GetNPackets (), 1,
                          "unexpected number of packets in the first flow of set two");
@@ -952,8 +1026,11 @@
 
 
 /**
- * This class tests L4S mode
- * Any future classifier options (e.g. SetAssociativeHash) should be disabled to prevent a hash collision on this test case.
+ * \ingroup system-tests-tc
+ * 
+ * \brief This class tests L4S mode.
+ * Any future classifier options (e.g. SetAssociativeHash) should be
+ * disabled to prevent a hash collision on this test case.
  */
 class FqCoDelQueueDiscL4sMode : public TestCase
 {
@@ -963,9 +1040,36 @@
 
 private:
   virtual void DoRun (void);
+
+  /**
+   * Enqueue some packets.
+   * \param queue The queue disc.
+   * \param hdr The IPv4 header.
+   * \param nPkt The number of packets to enqueue.
+   */
   void AddPacket (Ptr<FqCoDelQueueDisc> queue, Ipv4Header hdr, u_int32_t nPkt);
+
+  /**
+   * Enqueue some packets with delay.
+   * \param queue The queue disc.
+   * \param hdr The IPv4 header.
+   * \param delay Delay [seconds].
+   * \param nPkt The number of packets to enqueue.
+   */
   void AddPacketWithDelay (Ptr<FqCoDelQueueDisc> queue,Ipv4Header hdr, double delay, uint32_t nPkt);
+
+  /**
+   * Dequeue some packets.
+   * \param queue The queue disc.
+   * \param nPkt The number of packets to dequeue.
+   */
   void Dequeue (Ptr<FqCoDelQueueDisc> queue, uint32_t nPkt);
+  /**
+   * Dequeue some packets with delay.
+   * \param queue The queue disc.
+   * \param delay Delay [seconds].
+   * \param nPkt The number of packets to dequeue.
+   */
   void DequeueWithDelay (Ptr<FqCoDelQueueDisc> queue, double delay, uint32_t nPkt);
 };
 
@@ -1106,6 +1210,13 @@
   Simulator::Destroy ();
 
 }
+
+
+/**
+ * \ingroup system-tests-tc
+ * 
+ * FQ-CoDel queue disc test suite.
+ */
 class FqCoDelQueueDiscTestSuite : public TestSuite
 {
 public:
@@ -1125,4 +1236,5 @@
   AddTestCase (new FqCoDelQueueDiscL4sMode, TestCase::QUICK);
 }
 
-static FqCoDelQueueDiscTestSuite fqCoDelQueueDiscTestSuite;
\ No newline at end of file
+/// Do not forget to allocate an instance of this TestSuite.
+static FqCoDelQueueDiscTestSuite g_fqCoDelQueueDiscTestSuite;
\ No newline at end of file
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/test/ns3tc/fq-pie-queue-disc-test-suite.cc ns-3.36/src/test/ns3tc/fq-pie-queue-disc-test-suite.cc
--- ns-3.35/src/test/ns3tc/fq-pie-queue-disc-test-suite.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/test/ns3tc/fq-pie-queue-disc-test-suite.cc	2022-04-30 18:23:58.158735000 -0700
@@ -24,7 +24,7 @@
  *                         Vivek Jain <jain.vivek.anand@gmail.com>
  *                         Ankit Deepak <adadeepak8@gmail.com>
  *
-*/
+ */
 
 #include "ns3/test.h"
 #include "ns3/simulator.h"
@@ -44,12 +44,13 @@
 
 using namespace ns3;
 
-// Variable to assign g_hash to a new packet's flow
-int32_t g_hash;
+/// Variable to assign g_hash to a new packet's flow
+static int32_t g_hash;
 
 /**
- * Simple test packet filter able to classify IPv4 packets
- *
+ * \ingroup system-tests-tc
+ * 
+ * Simple test packet filter able to classify IPv4 packets.
  */
 class Ipv4FqPieTestPacketFilter : public Ipv4PacketFilter
 {
@@ -64,7 +65,18 @@
   virtual ~Ipv4FqPieTestPacketFilter ();
 
 private:
+  /**
+   * Classify a QueueDiscItem
+   * \param item The item to classify (unused).
+   * \return a pre-set hash value.
+   */
   virtual int32_t DoClassify (Ptr<QueueDiscItem> item) const;
+
+  /**
+   * Check the protocol.
+   * \param item The item to check (unused).
+   * \return true.
+   */
   virtual bool CheckProtocol (Ptr<QueueDiscItem> item) const;
 };
 
@@ -98,7 +110,9 @@
 }
 
 /**
- * This class tests packets for which there is no suitable filter
+ * \ingroup system-tests-tc
+ * 
+ * This class tests packets for which there is no suitable filter.
  */
 class FqPieQueueDiscNoSuitableFilter : public TestCase
 {
@@ -147,7 +161,9 @@
 }
 
 /**
- * This class tests the IP flows separation and the packet limit
+ * \ingroup system-tests-tc
+ * 
+ * This class tests the IP flows separation and the packet limit.
  */
 class FqPieQueueDiscIPFlowsSeparationAndPacketLimit : public TestCase
 {
@@ -157,6 +173,11 @@
 
 private:
   virtual void DoRun (void);
+  /**
+   * Enqueue a packet.
+   * \param queue the queue disc
+   * \param hdr the IPv4 header
+   */
   void AddPacket (Ptr<FqPieQueueDisc> queue, Ipv4Header hdr);
 };
 
@@ -214,7 +235,9 @@
 }
 
 /**
- * This class tests the deficit per flow
+ * \ingroup system-tests-tc
+ * 
+ * This class tests the deficit per flow.
  */
 class FqPieQueueDiscDeficit : public TestCase
 {
@@ -224,6 +247,11 @@
 
 private:
   virtual void DoRun (void);
+  /**
+   * Enqueue a packet.
+   * \param queue The queue disc.
+   * \param hdr The IPv4 header.
+   */
   void AddPacket (Ptr<FqPieQueueDisc> queue, Ipv4Header hdr);
 };
 
@@ -354,7 +382,9 @@
 }
 
 /**
- * This class tests the TCP flows separation
+ * \ingroup system-tests-tc
+ * 
+ * This class tests the TCP flows separation.
  */
 class FqPieQueueDiscTCPFlowsSeparation : public TestCase
 {
@@ -364,6 +394,12 @@
 
 private:
   virtual void DoRun (void);
+  /**
+   * Enqueue a packet.
+   * \param queue The queue disc.
+   * \param ipHdr The IPv4 header.
+   * \param tcpHdr The TCP header.
+   */
   void AddPacket (Ptr<FqPieQueueDisc> queue, Ipv4Header ipHdr, TcpHeader tcpHdr);
 };
 
@@ -438,6 +474,8 @@
 }
 
 /**
+ * \ingroup system-tests-tc
+ * 
  * This class tests the UDP flows separation
  */
 class FqPieQueueDiscUDPFlowsSeparation : public TestCase
@@ -448,6 +486,12 @@
 
 private:
   virtual void DoRun (void);
+  /**
+   * Enqueue a packet.
+   * \param queue The queue disc.
+   * \param ipHdr The IPv4 header.
+   * \param udpHdr The UDP header.
+   */
   void AddPacket (Ptr<FqPieQueueDisc> queue, Ipv4Header ipHdr, UdpHeader udpHdr);
 };
 
@@ -522,7 +566,12 @@
 }
 
 
-/*
+/**
+ * \ingroup system-tests-tc
+ * 
+ * \brief This class tests linear probing, collision response, and set
+ * creation capability of set associative hashing in FqPIE.
+ * 
  * This class tests linear probing, collision response, and set
  * creation capability of set associative hashing in FqPIE.
  * We modified DoClassify () and CheckProtocol () so that we could control
@@ -543,7 +592,6 @@
  * is 16. Since m_flowIndices[16] wasn't previously allotted, a new flow
  * is created, and the tag corresponding to this queue is set to 20.
 */
-
 class FqPieQueueDiscSetLinearProbing : public TestCase
 {
 public:
@@ -552,7 +600,12 @@
 
 private:
   virtual void DoRun (void);
-  void AddPacket (Ptr<FqPieQueueDisc> queue, Ipv4Header hdr);
+  /**
+   * Enqueue a packet.
+   * \param queue The queue disc.
+   * \param hdr The IPv4 header.
+   */
+   void AddPacket (Ptr<FqPieQueueDisc> queue, Ipv4Header hdr);
 };
 
 FqPieQueueDiscSetLinearProbing::FqPieQueueDiscSetLinearProbing ()
@@ -639,7 +692,11 @@
 
 
 /**
- * This class tests L4S mode. This test is divided to sub test one without hash collisions and so ECT0 and ECT1 flows are
+ * \ingroup system-tests-tc
+ * 
+ * \brief This class tests L4S mode. 
+ * 
+ * This test is divided to sub test one without hash collisions and so ECT0 and ECT1 flows are
  * classified into different flows.
  * Sub Test 1
  * 70 packets are enqueued into both the flows with the delay of 0.5ms between two enqueues, and dequeued with the delay of
@@ -657,9 +714,33 @@
 
 private:
   virtual void DoRun (void);
+  /**
+   * Enqueue the given number of packets.
+   * \param queue The queue disc.
+   * \param hdr The IPv4 header.
+   * \param nPkt The number of packets.
+   */
   void AddPacket (Ptr<FqPieQueueDisc> queue, Ipv4Header hdr, u_int32_t nPkt);
+  /**
+   * Enqueue the given number of packets at different times.
+   * \param queue The queue disc.
+   * \param hdr The IPv4 header.
+   * \param delay The time between two consecutive enqueue operations.
+   * \param nPkt The number of packets.
+   */
   void AddPacketWithDelay (Ptr<FqPieQueueDisc> queue,Ipv4Header hdr, double delay, uint32_t nPkt);
+  /**
+   * Dequeue the given number of packets.
+   * \param queue The queue disc.
+   * \param nPkt The number of packets.
+   */
   void Dequeue (Ptr<FqPieQueueDisc> queue, uint32_t nPkt);
+  /**
+   * Dequeue the given number of packets at different times.
+   * \param queue The queue disc.
+   * \param delay The time between two consecutive dequeue operations.
+   * \param nPkt The number of packets.
+   */
   void DequeueWithDelay (Ptr<FqPieQueueDisc> queue, double delay, uint32_t nPkt);
 };
 
@@ -802,6 +883,12 @@
   Simulator::Destroy ();
 }
 
+
+/**
+ * \ingroup system-tests-tc
+ * 
+ * FQ-PIE queue disc test suite.
+ */
 class FqPieQueueDiscTestSuite : public TestSuite
 {
 public:
@@ -820,4 +907,5 @@
   AddTestCase (new FqPieQueueDiscL4sMode, TestCase::QUICK);
 }
 
-static FqPieQueueDiscTestSuite FqPieQueueDiscTestSuite;
+/// Do not forget to allocate an instance of this TestSuite.
+static FqPieQueueDiscTestSuite g_fqPieQueueDiscTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/test/ns3tc/pfifo-fast-queue-disc-test-suite.cc ns-3.36/src/test/ns3tc/pfifo-fast-queue-disc-test-suite.cc
--- ns-3.35/src/test/ns3tc/pfifo-fast-queue-disc-test-suite.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/test/ns3tc/pfifo-fast-queue-disc-test-suite.cc	2022-04-30 18:23:58.158735000 -0700
@@ -32,6 +32,8 @@
 using namespace ns3;
 
 /**
+ * \ingroup system-tests-tc
+ * 
  * This class tests that each possible TOS is enqueued in the right band
  */
 class PfifoFastQueueDiscTosPrioritization : public TestCase
@@ -42,6 +44,13 @@
 
 private:
   virtual void DoRun (void);
+  /**
+   * Enqueue a packet and checks that it's added to the proper band.
+   * 
+   * \param queue The queue disc.
+   * \param tos The TOS of the packet.
+   * \param band Expected band.
+   */
   void TestTosValue (Ptr<PfifoFastQueueDisc> queue, uint8_t tos, uint32_t band);
 };
 
@@ -109,7 +118,9 @@
 }
 
 /**
- * This class tests that each possible DSCP is enqueued in the right band
+ * \ingroup system-tests-tc
+ * 
+ * This class tests that each possible DSCP is enqueued in the right band.
  */
 class PfifoFastQueueDiscDscpPrioritization : public TestCase
 {
@@ -119,6 +130,13 @@
 
 private:
   virtual void DoRun (void);
+  /**
+   * Enqueue a packet and checks that it's added to the proper band.
+   * 
+   * \param queue The queue disc.
+   * \param dscp The DSCP of the packet.
+   * \param band Expected band.
+   */
   void TestDscpValue (Ptr<PfifoFastQueueDisc> queue, Ipv4Header::DscpType dscp, uint32_t band);
 };
 
@@ -191,7 +209,9 @@
 }
 
 /**
- * This class tests that each band is txqueuelen deep
+ * \ingroup system-tests-tc
+ * 
+ * This class tests that each band is txqueuelen deep.
  */
 class PfifoFastQueueDiscOverflow : public TestCase
 {
@@ -201,6 +221,12 @@
 
 private:
   virtual void DoRun (void);
+  /**
+   * Enqueue a packet.
+   * 
+   * \param queue The queue disc.
+   * \param dscp The DSCP of the packet.
+   */
   void AddPacket (Ptr<PfifoFastQueueDisc> queue, Ipv4Header::DscpType dscp);
 };
 
@@ -264,8 +290,10 @@
 }
 
 /**
+ * \ingroup system-tests-tc
+ * 
  * This class tests that packets without a priority tag are handled by placing
- * them into band 1
+ * them into band 1.
  */
 class PfifoFastQueueDiscNoPriority : public TestCase
 {
@@ -326,6 +354,11 @@
   Simulator::Destroy ();
 }
 
+/**
+ * \ingroup system-tests-tc
+ * 
+ * PfifoFast queue disc test suite.
+ */
 class PfifoFastQueueDiscTestSuite : public TestSuite
 {
 public:
@@ -341,4 +374,5 @@
   AddTestCase (new PfifoFastQueueDiscNoPriority, TestCase::QUICK);
 }
 
-static PfifoFastQueueDiscTestSuite pfifoFastQueueTestSuite;
+/// Do not forget to allocate an instance of this TestSuite.
+static PfifoFastQueueDiscTestSuite g_pfifoFastQueueTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/test/ns3tcp/ns3tcp-cwnd-test-suite.cc ns-3.36/src/test/ns3tcp/ns3tcp-cwnd-test-suite.cc
--- ns-3.35/src/test/ns3tcp/ns3tcp-cwnd-test-suite.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/test/ns3tcp/ns3tcp-cwnd-test-suite.cc	1969-12-31 16:00:00.000000000 -0800
@@ -1,631 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2009 University of Washington
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-#include "ns3/log.h"
-#include "ns3/abort.h"
-#include "ns3/test.h"
-#include "ns3/pcap-file.h"
-#include "ns3/config.h"
-#include "ns3/string.h"
-#include "ns3/uinteger.h"
-#include "ns3/data-rate.h"
-#include "ns3/inet-socket-address.h"
-#include "ns3/point-to-point-helper.h"
-#include "ns3/internet-stack-helper.h"
-#include "ns3/ipv4-global-routing-helper.h"
-#include "ns3/ipv4-address-helper.h"
-#include "ns3/packet-sink-helper.h"
-#include "ns3/tcp-socket-factory.h"
-#include "ns3/traffic-control-helper.h"
-#include "ns3/simulator.h"
-#include "ns3/point-to-point-net-device.h"
-#include "ns3/pointer.h"
-#include "ns3/queue.h"
-
-using namespace ns3;
-
-NS_LOG_COMPONENT_DEFINE ("Ns3CwndTest");
-
-// ===========================================================================
-// This is a simple test to demonstrate how a known good model (a reference 
-// implementation) may be used to test another model without resorting to 
-// storing stimulus or response vectors.
-//
-// Node zero contains the model under test, in this case the ns-3 TCP 
-// implementation.  Node one contains the reference implementation that we
-// assume will generate good test vectors for us.  In this case, a Linux
-// TCP implementation is used to stimulate the ns-3 TCP model with what we
-// assume are perfectly good packets.  We watch the ns-3 implementation to
-// see what it does in the presence of these assumed good stimuli.
-//
-// The test is arranged as a typical ns-3 script, but we use the trace system
-// to peek into the running system and monitor the ns-3 TCP.
-//
-// The topology is just two nodes communicating over a point-to-point network.
-// The point-to-point network is chosen because it is simple and allows us to
-// easily generate pcap traces we can use to separately verify that the ns-3
-// implementation is responding correctly.  Once the operation is verified, we
-// enter a list of responses that capture the response succinctly.
-//
-//         node 0                 node 1
-//   +----------------+    +----------------+
-//   |    ns-3 TCP    |    |    Linux TCP   |
-//   +----------------+    +----------------+
-//   |    10.1.1.1    |    |    10.1.1.2    |
-//   +----------------+    +----------------+
-//   | point-to-point |    | point-to-point |
-//   +----------------+    +----------------+
-//           |                     |
-//           +---------------------+
-//                5 Mbps, 2 ms
-//
-// ===========================================================================
-//
-class SimpleSource : public Application 
-{
-public:
-
-  SimpleSource ();
-  virtual ~SimpleSource();
-
-  /**
-   * Register this type.
-   * \return The TypeId.
-   */
-  static TypeId GetTypeId (void);
-  
-  void Setup (Ptr<Socket> socket, Address address, uint32_t packetSize, uint32_t nPackets, DataRate dataRate);
-
-private:
-  virtual void StartApplication (void);
-  virtual void StopApplication (void);
-
-  void ScheduleTx (void);
-  void SendPacket (void);
-
-  Ptr<Socket>     m_socket;
-  Address         m_peer;
-  uint32_t        m_packetSize;
-  uint32_t        m_nPackets;
-  DataRate        m_dataRate;
-  EventId         m_sendEvent;
-  bool            m_running;
-  uint32_t        m_packetsSent;
-};
-
-SimpleSource::SimpleSource ()
-  : m_socket (0), 
-    m_peer (), 
-    m_packetSize (0), 
-    m_nPackets (0), 
-    m_dataRate (0), 
-    m_sendEvent (), 
-    m_running (false), 
-    m_packetsSent (0)
-{
-}
-
-SimpleSource::~SimpleSource()
-{
-  m_socket = 0;
-}
-
-/* static */
-TypeId
-SimpleSource::GetTypeId (void)
-{
-  static TypeId tid = TypeId ("SimpleSource")
-    .SetParent<Application> ()
-    .SetGroupName ("Stats")
-    .AddConstructor<SimpleSource> ()
-    ;
-  return tid;
-}
-  
-void
-SimpleSource::Setup (Ptr<Socket> socket, Address address, uint32_t packetSize, uint32_t nPackets, DataRate dataRate)
-{
-  m_socket = socket;
-  m_peer = address;
-  m_packetSize = packetSize;
-  m_nPackets = nPackets;
-  m_dataRate = dataRate;
-}
-
-void
-SimpleSource::StartApplication (void)
-{
-  m_running = true;
-  m_packetsSent = 0;
-  m_socket->Bind ();
-  m_socket->Connect (m_peer);
-  SendPacket ();
-}
-
-void 
-SimpleSource::StopApplication (void)
-{
-  m_running = false;
-
-  if (m_sendEvent.IsRunning ())
-    {
-      Simulator::Cancel (m_sendEvent);
-    }
-
-  if (m_socket)
-    {
-      m_socket->Close ();
-    }
-}
-
-void 
-SimpleSource::SendPacket (void)
-{
-  Ptr<Packet> packet = Create<Packet> (m_packetSize);
-  m_socket->Send (packet);
-
-  if (++m_packetsSent < m_nPackets)
-    {
-      ScheduleTx ();
-    }
-}
-
-void 
-SimpleSource::ScheduleTx (void)
-{
-  if (m_running)
-    {
-      Time tNext (Seconds (m_packetSize * 8 / static_cast<double> (m_dataRate.GetBitRate ())));
-      m_sendEvent = Simulator::Schedule (tNext, &SimpleSource::SendPacket, this);
-    }
-}
-
-class Ns3TcpCwndTestCase1 : public TestCase
-{
-public:
-  Ns3TcpCwndTestCase1 ();
-  virtual ~Ns3TcpCwndTestCase1 ();
-
-private:
-  virtual void DoRun (void);
-  bool m_writeResults;
-
-  class CwndEvent {
-public:
-    uint32_t m_oldCwnd;
-    uint32_t m_newCwnd;
-  };
-
-  TestVectors<CwndEvent> m_responses;
-
-  void CwndChange (uint32_t oldCwnd, uint32_t newCwnd);
-};
-
-Ns3TcpCwndTestCase1::Ns3TcpCwndTestCase1 ()
-  : TestCase ("Check to see that the ns-3 TCP congestion window works as expected against liblinux2.6.26.so"),
-    m_writeResults (false)
-{
-}
-
-Ns3TcpCwndTestCase1::~Ns3TcpCwndTestCase1 ()
-{
-}
-
-void
-Ns3TcpCwndTestCase1::CwndChange (uint32_t oldCwnd, uint32_t newCwnd)
-{
-  CwndEvent event;
-
-  event.m_oldCwnd = oldCwnd;
-  event.m_newCwnd = newCwnd;
-
-  m_responses.Add (event);
-
-  NS_LOG_DEBUG ("Cwnd change event " << m_responses.GetN () << " at " << Now ().As (Time::S) << " " << oldCwnd << " " << newCwnd);
-}
-
-void
-Ns3TcpCwndTestCase1::DoRun (void)
-{
-  NS_LOG_DEBUG ("Starting test case 1");
-  // This test was written with initial window of 1 segment
-  Config::SetDefault ("ns3::TcpSocket::InitialCwnd", UintegerValue (1));
-
-  //
-  // Create two nodes.  One (node zero) will be the node with the TCP
-  // under test which is the ns-3 TCP implementation.  The other node (node
-  // one) will be the node with the reference implementation we use to drive
-  // the tests.
-  //
-  NodeContainer nodes;
-  nodes.Create (2);
-
-  //
-  // For this test we'll use a point-to-point net device.  It's not as simple
-  // as a simple-net-device, but it provides nice places to hook trace events
-  // so we can see what's moving between our nodes.
-  //
-  PointToPointHelper pointToPoint;
-  pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
-  pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));
-
-  NetDeviceContainer devices;
-  devices = pointToPoint.Install (nodes);
-
-  //
-  // Install two variants of the internet stack.  The first, on node zero 
-  // uses the TCP under test, which is the default ns-3 TCP implementation.
-  //
-  InternetStackHelper stack;
-  stack.Install (nodes.Get (0));
-
-  //
-  // The other node, node one, is going to be set up to use a Linux TCP
-  // implementation that we consider a known good TCP.
-  //
-  std::string nscStack = "liblinux2.6.26.so";
-  stack.SetTcp ("ns3::NscTcpL4Protocol", "Library", StringValue ("liblinux2.6.26.so"));
-  stack.Install (nodes.Get (1));
-
-  //
-  // Assign the address 10.1.1.1 to the TCP implementation under test (index
-  // zero) and 10.1.1.2 to the reference implementation (index one).
-  //
-  Ipv4AddressHelper address;
-  address.SetBase ("10.1.1.0", "255.255.255.252");
-  Ipv4InterfaceContainer interfaces = address.Assign (devices);
-
-  //
-  // We need a place to send our TCP data on the node with the reference TCP 
-  // implementation.  We aren't really concerned about what happens there, so
-  // just create a sink.
-  //
-  uint16_t sinkPort = 8080;
-  Address sinkAddress (InetSocketAddress (interfaces.GetAddress (1), sinkPort));
-  PacketSinkHelper packetSinkHelper ("ns3::TcpSocketFactory", InetSocketAddress (Ipv4Address::GetAny (), sinkPort));
-  ApplicationContainer sinkApps = packetSinkHelper.Install (nodes.Get (1));
-  sinkApps.Start (Seconds (0.));
-  sinkApps.Stop (Seconds (1.1));
-
-  //
-  // This test uses a custom application that provides a direct handle to
-  // the socket (the socket of applications such as the OnOffApplication
-  // is not created until Application Start time, and is not easily accessible).
-  //
-  // So first, we create a socket and do the trace connect on it; then we pass this
-  // socket into the constructor of our simple application which we then install
-  // in the node with the ns-3 TCP.
-  //
-  Ptr<Socket> ns3TcpSocket = Socket::CreateSocket (nodes.Get (0), TcpSocketFactory::GetTypeId ());
-  ns3TcpSocket->TraceConnectWithoutContext ("CongestionWindowInflated", MakeCallback (&Ns3TcpCwndTestCase1::CwndChange, this));
-
-  Ptr<SimpleSource> app = CreateObject<SimpleSource> ();
-  // 1040 is size of packet objects used to write data to the socket (note:
-  // the actual TCP segment size will be 536 bytes).  10 is the number
-  // of packets, so we write 10 * 1040 bytes.  This requires 20 segments
-  // of payload size 536, with the last one being a partially full segment
-  app->Setup (ns3TcpSocket, sinkAddress, 1040, 10, DataRate ("5Mbps"));
-  nodes.Get (0)->AddApplication (app);
-  app->SetStartTime (Seconds (1.));
-  app->SetStopTime (Seconds (1.1));
-
-  //
-  // The idea here is that someone will look very closely at the all of the
-  // communications between the reference TCP and the TCP under test in this
-  // simulation and determine that all of the responses are correct.  We expect
-  // that this means generating a pcap trace file from the point-to-point link
-  // and examining the packets closely using tcpdump, wireshark or some such
-  // program.  So we provide the ability to generate a pcap trace of the 
-  // test execution for your perusal.
-  //
-  // Once the validation test is determined to be running exactly as expected,
-  // the set of congestion window changes is collected and hard coded into the 
-  // test results which will then be checked during the actual execution of the
-  // test.
-  //
-
-  if (m_writeResults)
-    {
-      pointToPoint.EnablePcapAll ("tcp-cwnd");
-    }
-
-  Simulator::Stop (Seconds (2));
-  Simulator::Run ();
-  Simulator::Destroy ();
-
-  //
-  // As new acks are received by the TCP under test, the congestion window 
-  // should be opened up by one segment (MSS bytes) each time.  This should
-  // trigger a congestion window change event which we hooked and saved above.
-  // We should now be able to look through the saved response vectors and follow
-  // the congestion window as it opens up when the ns-3 TCP under test 
-  // transmits its bits
-  //
-  // From inspecting the results, we know that we should see N_EVENTS congestion
-  // window change events (each time by MSS bytes) until reaching the largest
-  // value when the client closes.
-  //
-  const uint32_t MSS = 536;
-  const uint32_t N_EVENTS = 20;
-
-  CwndEvent event;
-
-  NS_TEST_ASSERT_MSG_EQ (m_responses.GetN (), N_EVENTS, "Unexpectedly low number of cwnd change events");
-
-  // Ignore the first event logged (i=0) when m_cWnd goes from 0 to MSS bytes
-  for (uint32_t i = 1, from = MSS, to = MSS * 2; i < N_EVENTS; ++i, from += MSS, to += MSS)
-    {
-      event = m_responses.Get (i);
-      NS_TEST_ASSERT_MSG_EQ (event.m_oldCwnd, from, "Wrong old cwnd value in cwnd change event " << i);
-      NS_TEST_ASSERT_MSG_EQ (event.m_newCwnd, to, "Wrong new cwnd value in cwnd change event " << i);
-    }
-}
-
-
-// ===========================================================================
-// Test case for cwnd changes due to out-of-order packets. A bottleneck 
-// link is created, and a limited droptail queue is used in order to 
-// force dropped packets, resulting in out-of-order packet delivery. 
-// This out-of-order delivery will result in a different congestion 
-// window behavior than testcase 1.  Specifically, duplicate ACKs
-// are encountered.
-//
-// Network topology
-//
-//        1Mb/s, 10ms      100kb/s, 10ms     1Mb/s, 10ms
-//    n0--------------n1-----------------n2---------------n3
-//
-// ===========================================================================
-class Ns3TcpCwndTestCase2 : public TestCase
-{
-public:
-  Ns3TcpCwndTestCase2 ();
-  virtual ~Ns3TcpCwndTestCase2 ();
-
-private:
-  virtual void DoRun (void);
-  void VerifyCwndRun (uint32_t beginIdx, uint32_t endIdx, uint32_t initialCwnd, uint32_t mss);
-  bool m_writeResults;
-
-  class CwndEvent {
-public:
-    uint32_t m_oldCwnd;
-    uint32_t m_newCwnd;
-  };
-
-  TestVectors<CwndEvent> m_responses;
-
-  void CwndChange (uint32_t oldCwnd, uint32_t newCwnd);
-  void CwndChangeNotInflated (uint32_t oldCwnd, uint32_t newCwnd);
-};
-
-Ns3TcpCwndTestCase2::Ns3TcpCwndTestCase2 ()
-  : TestCase ("Check to see that the ns-3 TCP congestion window works as expected for out-of-order packet delivery"),
-    m_writeResults (false)
-{
-}
-
-Ns3TcpCwndTestCase2::~Ns3TcpCwndTestCase2 ()
-{
-}
-
-void
-Ns3TcpCwndTestCase2::CwndChange (uint32_t oldCwnd, uint32_t newCwnd)
-{
-  CwndEvent event;
-
-  event.m_oldCwnd = oldCwnd;
-  event.m_newCwnd = newCwnd;
-
-  m_responses.Add (event);
-  NS_LOG_DEBUG ("Cwnd change event " << m_responses.GetN () << " at " << Now ().As (Time::S) << " " << oldCwnd << " " << newCwnd);
-}
-
-void
-Ns3TcpCwndTestCase2::CwndChangeNotInflated (uint32_t oldCwnd, uint32_t newCwnd)
-{
-  NS_LOG_DEBUG ("Cwnd NOT INFLATED change event " << m_responses.GetN () << " at " << Now ().As (Time::S) << " " << oldCwnd << " " << newCwnd);
-}
-
-void
-Ns3TcpCwndTestCase2::DoRun (void)
-{ 
-  NS_LOG_DEBUG ("Starting test case 2");
-  // Set up some default values for the simulation.
-  Config::SetDefault ("ns3::QueueBase::MaxSize", QueueSizeValue (QueueSize (QueueSizeUnit::PACKETS, 4)));
-  Packet::EnablePrinting ();
-  // This test was written with initial window of 1 segment
-  Config::SetDefault ("ns3::TcpSocket::InitialCwnd", UintegerValue (1));
-
-  NodeContainer n0n1;
-  n0n1.Create (2);
-
-  NodeContainer n1n2;
-  n1n2.Add (n0n1.Get (1));
-  n1n2.Create (1);
-
-  NodeContainer n2n3;
-  n2n3.Add (n1n2.Get (1));
-  n2n3.Create (1);
-
-  PointToPointHelper p2p1;
-  p2p1.SetDeviceAttribute ("DataRate", DataRateValue (DataRate (1000000)));
-  p2p1.SetChannelAttribute ("Delay", TimeValue (MilliSeconds (10)));
-  PointToPointHelper p2p2;
-  p2p2.SetDeviceAttribute ("DataRate", DataRateValue (DataRate (100000)));
-  p2p2.SetChannelAttribute ("Delay", TimeValue (MilliSeconds (10)));
-
-  // And then install devices and channels connecting our topology.
-  NetDeviceContainer dev0 = p2p1.Install (n0n1);
-  NetDeviceContainer dev1 = p2p2.Install (n1n2);
-  NetDeviceContainer dev2 = p2p1.Install (n2n3);
-
-  // Now add ip/tcp stack to all nodes.
-  InternetStackHelper internet;
-  internet.InstallAll ();
-
-  // Later, we add IP addresses.
-  Ipv4AddressHelper ipv4;
-  ipv4.SetBase ("10.1.3.0", "255.255.255.0");
-  ipv4.Assign (dev0);
-  ipv4.SetBase ("10.1.2.0", "255.255.255.0");
-  ipv4.Assign (dev1);
-  ipv4.SetBase ("10.1.1.0", "255.255.255.0");
-  Ipv4InterfaceContainer ipInterfs = ipv4.Assign (dev2);
-
-  // and setup ip routing tables to get total ip-level connectivity.
-  Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
-
-  // Disable traffic control layer so that drops occur
-  TrafficControlHelper tch;
-  tch.Uninstall (dev0);
-  tch.Uninstall (dev1);
-  tch.Uninstall (dev2);
-
-  // Set up the apps
-  uint16_t servPort = 50000;
-
-  // Create a packet sink to receive these packets on n3
-  PacketSinkHelper sink ("ns3::TcpSocketFactory",
-                         InetSocketAddress (Ipv4Address::GetAny (), servPort));
-
-  ApplicationContainer apps = sink.Install (n2n3.Get (1));
-  apps.Start (Seconds (0.0));
-  apps.Stop (Seconds (5.4));
-
-  // Create the socket for n0
-  Address sinkAddress (InetSocketAddress (ipInterfs.GetAddress (1), servPort));
-  Ptr<Socket> ns3TcpSocket = Socket::CreateSocket (n0n1.Get (0), TcpSocketFactory::GetTypeId ());
-  // Disable SACK because this test is testing NewReno behavior
-  ns3TcpSocket->SetAttribute ("Sack", BooleanValue (false));
-  ns3TcpSocket->TraceConnectWithoutContext ("CongestionWindowInflated", MakeCallback (&Ns3TcpCwndTestCase2::CwndChange, this));
-  ns3TcpSocket->TraceConnectWithoutContext ("CongestionWindow", MakeCallback (&Ns3TcpCwndTestCase2::CwndChangeNotInflated, this));
-
-  // Create and start the app for n0
-  Ptr<SimpleSource> app = CreateObject<SimpleSource> ();
-  app->Setup (ns3TcpSocket, sinkAddress, 1040, 1000, DataRate ("1Mbps"));
-  n0n1.Get (0)->AddApplication (app);
-  app->SetStartTime (Seconds (1.0));
-  app->SetStopTime (Seconds (4.1));
-
-  if (m_writeResults)
-    {
-      // Write a pcap for tcp cwnd testcase with out-of-order delivery
-      PointToPointHelper pointToPoint;
-      pointToPoint.EnablePcapAll ("tcp-cwnd-ood");
-    }
-
-  // Finally, set up the simulator to run.
-  Simulator::Stop (Seconds (4.1));
-  Simulator::Run ();
-  Simulator::Destroy ();
-
-  //
-  // As new acks are received by the TCP under test, the congestion window 
-  // should be opened up by one segment (MSS bytes) each time.  This should
-  // trigger a congestion window change event which we hooked and saved above.
-  // We should now be able to look through the saved response vectors and follow
-  // the congestion window as it opens up when the ns-3 TCP under test 
-  // transmits its bits
-  //
-  // From inspecting the results, we know that we should see N_EVENTS congestion
-  // window change events. On the tenth change event, the window should 
-  // be cut from 5360 to 4288 due to 3 dup acks (NewReno behavior is to
-  // cut in half, and then add 3 segments (5360/2 + 3*536 = 4288)
-  //
-  
-  const uint32_t MSS = 536;
-  const uint32_t N_EVENTS = 38;
-
-  CwndEvent event;
-
-  NS_LOG_DEBUG ("Number of response events: " << m_responses.GetN ());
-  //NS_TEST_ASSERT_MSG_EQ (m_responses.GetN (), N_EVENTS, "Unexpected number of cwnd change events");
-
-  // Ignore the first event logged (i=0) when m_cWnd goes from 0 to MSS bytes
-  VerifyCwndRun (1, 10, 2 * MSS, MSS);
-  
-  // At the point of loss, sndNxt = 15545; sndUna = 9113.  FlightSize is 4824, 
-  // so there are 9 segments outstanding.  Cut ssthresh to 9/2 (2412) and 
-  // cwnd to (9/2 + 3) = 4020
-  event = m_responses.Get (10);
-  NS_TEST_ASSERT_MSG_EQ (event.m_newCwnd, (MSS * 15)/2, "Wrong new cwnd value in cwnd change event " << 10);
-
-  // Verify that cwnd increments by one for a few segments
-  // from 8.5 at index 11 to 12.5 at index 15
-  VerifyCwndRun (11, 15, (MSS * 17)/2, MSS);
-
-  // partial ack at event 16, cwnd reset from 6700 (12.5*MSS) to 5092 (9.5*MSS)
-  NS_TEST_ASSERT_MSG_EQ (m_responses.Get (16).m_newCwnd, (MSS * 19)/2, "Wrong new cwnd value in cwnd change event " << 16);
-
-  // partial ack again of 3 segments after one more acks, cwnd reset to 7.5 
-  NS_TEST_ASSERT_MSG_EQ (m_responses.Get (18).m_newCwnd, (MSS * 15)/2, "Wrong new cwnd value in cwnd change event " << 18);
-
-  //DUP ACKS in remaining fast recovery
-  VerifyCwndRun (18, 20, (MSS * 15)/2, MSS);
-
-  // Process another partial ack
-  VerifyCwndRun (21, 24, (MSS * 13)/2, MSS);
- 
-  // Leaving fast recovery at event 25; set cwnd to 4 segments as per RFC 2582
-  // Sec. 3 para. 5 option 2 (sshthresh is 2412, 4.5 times MSS)
-  NS_TEST_ASSERT_MSG_EQ (m_responses.Get (25).m_newCwnd,  2412, "Wrong new cwnd value in cwnd change event " << 25);
-  
-  //In CongAvoid each event will increase cwnd by (MSS * MSS / cwnd)
-  uint32_t cwnd = 2412;
-  for (uint32_t i = 26; i < N_EVENTS; ++i)
-    {
-      double adder = static_cast<double> (MSS * MSS) / cwnd;
-      adder = std::max (1.0, adder);
-      cwnd += static_cast<uint32_t> (adder);    
-      NS_TEST_ASSERT_MSG_EQ (m_responses.Get (i).m_newCwnd, cwnd, "Wrong new cwnd value in cwnd change event " << i); 
-    }
-  NS_LOG_DEBUG ("Reading out the cwnd event log");  
-  for (uint32_t i = 0; i < N_EVENTS; ++i)
-  {
-    NS_LOG_DEBUG ("i: " << i << " newCwnd: " << m_responses.Get(i).m_newCwnd << " newCwnd segments " << static_cast<double> (m_responses.Get(i).m_newCwnd)/MSS);
-  }
-}
-
-void 
-Ns3TcpCwndTestCase2::VerifyCwndRun (uint32_t beginIdx, uint32_t endIdx, uint32_t initialCwnd, uint32_t mss)
-{
-
-  CwndEvent event;
-  
-  for(uint32_t i = beginIdx, to = initialCwnd; i < endIdx; ++i, to += mss)
-    {
-      event = m_responses.Get (i);
-      NS_TEST_ASSERT_MSG_EQ (event.m_newCwnd, to, "Wrong new cwnd value in cwnd change event " << i);      
-    }
-}
-
-class Ns3TcpCwndTestSuite : public TestSuite
-{
-public:
-  Ns3TcpCwndTestSuite ();
-};
-
-Ns3TcpCwndTestSuite::Ns3TcpCwndTestSuite ()
-  : TestSuite ("ns3-tcp-cwnd", SYSTEM)
-{
-  AddTestCase (new Ns3TcpCwndTestCase1, TestCase::QUICK);
-  AddTestCase (new Ns3TcpCwndTestCase2, TestCase::QUICK);
-}
-
-Ns3TcpCwndTestSuite ns3TcpCwndTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/test/ns3tcp/ns3tcp-interop-test-suite.cc ns-3.36/src/test/ns3tcp/ns3tcp-interop-test-suite.cc
--- ns-3.35/src/test/ns3tcp/ns3tcp-interop-test-suite.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/test/ns3tcp/ns3tcp-interop-test-suite.cc	1969-12-31 16:00:00.000000000 -0800
@@ -1,325 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2009 University of Washington
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-#include <string>
-
-#include "ns3/log.h"
-#include "ns3/abort.h"
-#include "ns3/test.h"
-#include "ns3/pcap-file.h"
-#include "ns3/config.h"
-#include "ns3/string.h"
-#include "ns3/uinteger.h"
-#include "ns3/inet-socket-address.h"
-#include "ns3/point-to-point-helper.h"
-#include "ns3/internet-stack-helper.h"
-#include "ns3/ipv4-address-helper.h"
-#include "ns3/ipv4-header.h"
-#include "ns3/packet-sink-helper.h"
-#include "ns3/on-off-helper.h"
-#include "ns3/simulator.h"
-
-using namespace ns3;
-
-NS_LOG_COMPONENT_DEFINE ("Ns3TcpInteropTest");
-
-// The below boolean constants should only be changed to 'true'       
-// during test debugging (i.e. do not commit the value 'true')
-
-// set to 'true' to have the test suite overwrite the response vectors
-// stored in the test directory.  This should only be done if you are
-// convinced through other means (e.g. pcap tracing or logging) that the
-// revised vectors are the correct ones.  In other words, don't simply
-// enable this to true to clear a failing test without looking at the
-// results closely.
-const bool WRITE_VECTORS = false;           // set to true to write response vectors
-const bool WRITE_PCAP = false;              // set to true to write out pcap
-const uint32_t PCAP_LINK_TYPE = 1187373553; // Some large random number -- we use to verify data was written by this program
-const uint32_t PCAP_SNAPLEN   = 64;         // Don't bother to save much data
-
-
-// ===========================================================================
-// This is a simple test to demonstrate how a known good model (a reference 
-// implementation) may be used to test another model in a relatively simple
-// way.
-//
-// Node zero contains the model under test, in this case the ns-3 TCP 
-// implementation.  Node one contains the reference implementation that we
-// assume will generate good test vectors for us.  In this case, a Linux
-// TCP implementation is used to stimulate the ns-3 TCP model with what we
-// assume are perfectly good packets.  We watch the ns-3 implementation to
-// see what it does in the presence of these assumed good stimuli.
-//
-// The test is arranged as a typical ns-3 script, but we use the trace system
-// to peek into the running system and monitor the ns-3 TCP.
-//
-// The topology is just two nodes communicating over a point-to-point network.
-// The point-to-point network is chosen because it is simple and allows us to
-// easily generate pcap traces we can use to separately verify that the ns-3
-// implementation is responding correctly.  Once the operation is verified, we
-// capture a set of response vectors that are then checked in the test to
-// ensure that the ns-3 TCP continues to respond correctly over time.
-//
-//         node 0                 node 1
-//   +----------------+    +----------------+
-//   |    ns-3 TCP    |    |    Linux TCP   |
-//   +----------------+    +----------------+
-//   |    10.1.1.1    |    |    10.1.1.2    |
-//   +----------------+    +----------------+
-//   | point-to-point |    | point-to-point |
-//   +----------------+    +----------------+
-//           |                     |
-//           +---------------------+
-//                5 Mbps, 2 ms
-//
-// ===========================================================================
-class Ns3TcpInteroperabilityTestCase : public TestCase
-{
-public:
-  Ns3TcpInteroperabilityTestCase ();
-  virtual ~Ns3TcpInteroperabilityTestCase ();
-
-private:
-  virtual void DoSetup (void);
-  virtual void DoRun (void);
-  virtual void DoTeardown (void);
-
-  void Ipv4L3Tx (std::string context, Ptr<const Packet> packet, Ptr<Ipv4> ipv4, uint32_t interface);
-
-  std::string m_pcapFilename;
-  PcapFile m_pcapFile;
-  bool m_writeVectors;
-  bool m_writeResults;
-};
-
-Ns3TcpInteroperabilityTestCase::Ns3TcpInteroperabilityTestCase ()
-  : TestCase ("Check to see that the ns-3 TCP can work with liblinux2.6.26.so"), m_writeVectors (WRITE_VECTORS), m_writeResults (WRITE_PCAP)
-{
-}
-
-Ns3TcpInteroperabilityTestCase::~Ns3TcpInteroperabilityTestCase ()
-{
-}
-
-void 
-Ns3TcpInteroperabilityTestCase::DoSetup (void)
-{
-  //
-  // We expect there to be a file called tcp-interop-response-vectors.pcap in
-  // the data directory
-  //
-  m_pcapFilename = CreateDataDirFilename ("ns3tcp-interop-response-vectors.pcap");
-
-  if (m_writeVectors)
-    {
-      m_pcapFile.Open (m_pcapFilename, std::ios::out|std::ios::binary);
-      m_pcapFile.Init (PCAP_LINK_TYPE, PCAP_SNAPLEN);
-    }
-  else
-    {
-      m_pcapFile.Open (m_pcapFilename, std::ios::in|std::ios::binary);
-      NS_ABORT_MSG_UNLESS (m_pcapFile.GetDataLinkType () == PCAP_LINK_TYPE, "Wrong response vectors in directory");
-    }
-}
-
-void 
-Ns3TcpInteroperabilityTestCase::DoTeardown (void)
-{
-  m_pcapFile.Close ();
-}
-
-void
-Ns3TcpInteroperabilityTestCase::Ipv4L3Tx (std::string context, Ptr<const Packet> packet, Ptr<Ipv4> ipv4, uint32_t interface)
-{
-  //
-  // We're not testing IP so remove and toss the header.  In order to do this,
-  // though, we need to copy the packet since we have a const version.
-  //
-  Ptr<Packet> p = packet->Copy ();
-  Ipv4Header ipHeader;
-  p->RemoveHeader (ipHeader);
-
-  //
-  // What is left is the TCP header and any data that may be sent.  We aren't
-  // sending any TCP data, so we expect what remains is only TCP header, which
-  // is a small thing to save.
-  //
-  if (m_writeVectors)
-    {
-      //
-      // Save the TCP under test response for later testing.
-      //
-      Time tNow = Simulator::Now ();
-      int64_t tMicroSeconds = tNow.GetMicroSeconds ();
-
-      m_pcapFile.Write (uint32_t (tMicroSeconds / 1000000), 
-                        uint32_t (tMicroSeconds % 1000000), 
-                        p
-                        );
-    }
-  else
-    {
-      //
-      // Read the TCP under test expected response from the expected vector
-      // file and see if it still does the right thing.
-      //
-      uint8_t expected[PCAP_SNAPLEN];
-      uint32_t tsSec, tsUsec, inclLen, origLen, readLen;
-      m_pcapFile.Read (expected, sizeof(expected), tsSec, tsUsec, inclLen, origLen, readLen);
-
-      uint8_t *actual = new uint8_t[readLen];
-      p->CopyData (actual, readLen);
-
-      uint32_t result = memcmp (actual, expected, readLen);
-
-      delete [] actual;
-
-      //
-      // Avoid streams of errors -- only report the first.
-      //
-      if (IsStatusSuccess ())
-        {
-          NS_TEST_EXPECT_MSG_EQ (result, 0, "Expected data comparison error");
-        }
-    }
-}
-
-void
-Ns3TcpInteroperabilityTestCase::DoRun (void)
-{
-  //
-  // Just create two nodes.  One (node zero) will be the node with the TCP
-  // under test which is the ns-3 TCP implementation.  The other node (node
-  // one) will be the node with the reference implementation we use to drive
-  // the tests.
-  //
-  NodeContainer nodes;
-  nodes.Create (2);
-
-  //
-  // For this test we'll use a point-to-point net device.  It's not as simple
-  // as a simple-net-device, but it provides nice places to hook trace events
-  // so we can see what's moving between our nodes.
-  //
-  PointToPointHelper pointToPoint;
-  pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
-  pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));
-
-  //
-  // Install the point-to-point devices on both nodes and connec them up.
-  //
-  NetDeviceContainer devices;
-  devices = pointToPoint.Install (nodes);
-
-  //
-  // Install two variants of the internet stack.  The first, on node zero 
-  // uses the TCP under test, which is the default ns-3 TCP implementation.
-  //
-  InternetStackHelper stack;
-  stack.Install (nodes.Get (0));
-
-  //
-  // The other node, node one, is going to be set up to use a Linux TCP
-  // implementation that we consider a known good TCP.
-  //
-  std::string nscStack = "liblinux2.6.26.so";
-  stack.SetTcp ("ns3::NscTcpL4Protocol", "Library", StringValue ("liblinux2.6.26.so"));
-  stack.Install (nodes.Get (1));
-
-  //
-  // Assign the address 10.1.1.1 to the TCP implementation under test (index
-  // zero) and 10.1.1.2 to the reference implementation (index one).
-  //
-  Ipv4AddressHelper address;
-  address.SetBase ("10.1.1.0", "255.255.255.252");
-  Ipv4InterfaceContainer interfaces = address.Assign (devices);
-
-  //
-  // We need a place for the TCP data to go on the node with the TCP under
-  // test, so just create a sink on node zero.
-  //
-  uint16_t sinkPort = 8080;
-  Address sinkAddress (InetSocketAddress (interfaces.GetAddress (0), sinkPort));
-  PacketSinkHelper packetSinkHelper ("ns3::TcpSocketFactory", InetSocketAddress (Ipv4Address::GetAny (), sinkPort));
-  ApplicationContainer sinkApps = packetSinkHelper.Install (nodes.Get (0));
-  sinkApps.Start (Seconds (0.));
-
-  //
-  // We need something to shove data down the pipe, so we create an on-off 
-  // application on the source node with the reference TCP implementation.
-  // The default behavior is to send for one second, then go quiet for one
-  // second, and repeat.
-  //
-  OnOffHelper onOffHelper ("ns3::TcpSocketFactory", sinkAddress);
-  onOffHelper.SetAttribute ("MaxBytes", UintegerValue (100000));
-  ApplicationContainer sourceApps = onOffHelper.Install (nodes.Get (1));
-  sourceApps.Start (Seconds (1.));
-  sourceApps.Stop (Seconds (10.));
-
-  //
-  // There are currently a limited number of trace hooks in the ns-3 TCP code.
-  // Rather than editing TCP to insert a bunch of trace hooks, we can just
-  // intercept the packets at the IPv4 layer.  See internet-stack-helper.cc
-  // for complete description of the trace hooks.  We're interested in the 
-  // responses of the TCP under test, which implies we need to hook the node
-  // zero Ipv4 layer three transmit trace source.  We'll then get all of the
-  // responses we need
-  //
-  Config::Connect ("/NodeList/0/$ns3::Ipv4L3Protocol/Tx", 
-                   MakeCallback (&Ns3TcpInteroperabilityTestCase::Ipv4L3Tx, this));
-
-  //
-  // The idea here is that someone will look very closely at the all of the
-  // communications between the reference TCP and the TCP under test in this
-  // simulation and determine that all of the responses are correct.  We expect
-  // that this means generating a pcap trace file from the point-to-point link
-  // and examining the packets closely using tcpdump, wireshark or some such
-  // program.  So we provide the ability to generate a pcap trace of the 
-  // test execution for your perusal.
-  //
-  // Once the validation test is determined to be running exactly as expected,
-  // we allow you to generate a file that contains the response vectors that 
-  // will be checked during the actual execution of the test.
-  //
-
-  if (m_writeResults)
-    {
-      pointToPoint.EnablePcapAll ("ns3-tcp-interop");
-    }
-
-  Simulator::Stop (Seconds (20));
-  Simulator::Run ();
-  Simulator::Destroy ();
-}
-
-class Ns3TcpInteroperabilityTestSuite : public TestSuite
-{
-public:
-  Ns3TcpInteroperabilityTestSuite ();
-};
-
-Ns3TcpInteroperabilityTestSuite::Ns3TcpInteroperabilityTestSuite ()
-  : TestSuite ("ns3-tcp-interoperability", SYSTEM)
-{
-  // We can't use NS_TEST_SOURCEDIR variable here because we use subdirectories
-  SetDataDir ("src/test/ns3tcp/response-vectors");
-  
-  AddTestCase (new Ns3TcpInteroperabilityTestCase, TestCase::QUICK);
-}
-
-static Ns3TcpInteroperabilityTestSuite ns3TcpInteroperabilityTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/test/ns3tcp/ns3tcp-loss-test-suite.cc ns-3.36/src/test/ns3tcp/ns3tcp-loss-test-suite.cc
--- ns-3.35/src/test/ns3tcp/ns3tcp-loss-test-suite.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/test/ns3tcp/ns3tcp-loss-test-suite.cc	2022-04-30 18:23:58.158735000 -0700
@@ -54,21 +54,28 @@
 // revised vectors are the correct ones.  In other words, don't simply
 // enable this to true to clear a failing test without looking at the
 // results closely.
-const bool WRITE_VECTORS = false;            // set to true to write response vectors
-const bool WRITE_PCAP = false;              // set to true to write out pcap
-const bool WRITE_LOGGING = false;            // set to true to write logging
-const uint32_t PCAP_LINK_TYPE = 1187373557; // Some large random number -- we use to verify data was written by this program
-const uint32_t PCAP_SNAPLEN   = 64;         // Don't bother to save much data
-
-// ===========================================================================
-// Tests of TCP implementation loss behavior
-// ===========================================================================
-//
-
+const bool WRITE_VECTORS = false;           //!< Set to true to write response vectors.
+const bool WRITE_PCAP = false;              //!< Set to true to write out pcap.
+const bool WRITE_LOGGING = false;           //!< Set to true to write logging.
+const uint32_t PCAP_LINK_TYPE = 1187373557; //!< Some large random number -- we use to verify data was written by this program.
+const uint32_t PCAP_SNAPLEN   = 64;         //!< Don't bother to save much data.
+
+/**
+ * \ingroup system-tests-tcp
+ * 
+ * \brief Tests of TCP implementation loss behavior.
+ */
 class Ns3TcpLossTestCase : public TestCase
 {
 public:
   Ns3TcpLossTestCase ();
+
+  /**
+   * Constructor.
+   * 
+   * \param tcpModel The TCP model name.
+   * \param testCase Testcase number.
+   */
   Ns3TcpLossTestCase (std::string tcpModel, uint32_t testCase);
   virtual ~Ns3TcpLossTestCase ()
   {
@@ -79,24 +86,50 @@
   virtual void DoRun (void);
   virtual void DoTeardown (void);
 
-  Ptr<OutputStreamWrapper> m_osw;
-  std::string m_pcapFilename;
-  PcapFile m_pcapFile;
-  uint32_t m_testCase;
-  uint32_t m_totalTxBytes;
-  uint32_t m_currentTxBytes;
-  bool m_writeVectors;
-  bool m_writeResults;
-  bool m_writeLogging;
-  bool m_needToClose;
-  std::string m_tcpModel;
-
+  Ptr<OutputStreamWrapper> m_osw; //!< The output stream.
+  std::string m_pcapFilename;     //!< The PCAP filename.
+  PcapFile m_pcapFile;            //!< The PCAP ffile.
+  uint32_t m_testCase;            //!< Testcase number.
+  uint32_t m_totalTxBytes;        //!< Total number of bytes to send.
+  uint32_t m_currentTxBytes;      //!< Current number of bytes sent.
+  bool m_writeVectors;            //!< True if response vectors have to be written (and not read).
+  bool m_writeResults;            //!< True if write PCAP files.
+  bool m_writeLogging;            //!< True if write logging.
+  bool m_needToClose;             //!< Check if the sending socket need to be closed.
+  std::string m_tcpModel;         //!< The TCP model name.
+
+  /**
+   * Check that the transmitted packets are consitent with the trace.
+   * This callback is hooked to ns3::Ipv4L3Protocol/Tx.
+   * 
+   * \param context The callback context (unused).
+   * \param packet The transmitted packet.
+   * \param ipv4 The IPv4 object that did send the packet (unused).
+   * \param interface The IPv4 interface that did send the packet (unused).
+   */
   void Ipv4L3Tx (std::string context, Ptr<const Packet> packet, Ptr<Ipv4> ipv4, uint32_t interface);
+  /**
+   * CWND trace.
+   * 
+   * \param oldval The old value.
+   * \param newval The new value.
+   */
   void CwndTracer (uint32_t oldval, uint32_t newval);
+  /**
+   * Write to the socket until the buffer is full.
+   * 
+   * \param localSocket The output socket.
+   * \param txSpace The space left on the socket (unused).
+   */
   void WriteUntilBufferFull (Ptr<Socket> localSocket, uint32_t txSpace);
-  void StartFlow (Ptr<Socket> localSocket,
-                  Ipv4Address servAddress,
-                  uint16_t servPort);
+  /**
+   * Start transmitting a TCP flow.
+   * 
+   * \param localSocket The sending socket.
+   * \param servAddress The IPv4 address of the server (i.e., the destination address).
+   * \param servPort The TCP port of the server (i.e., the destination port).
+   */
+  void StartFlow (Ptr<Socket> localSocket, Ipv4Address servAddress, uint16_t servPort);
 
 };
 
@@ -165,7 +198,7 @@
 }
 
 void
-Ns3TcpLossTestCase::Ipv4L3Tx (std::string context, Ptr<const Packet> packet, Ptr<Ipv4> ipv4, uint32_t interface)
+Ns3TcpLossTestCase::Ipv4L3Tx (std::string, Ptr<const Packet> packet, Ptr<Ipv4>, uint32_t)
 {
   //
   // We're not testing IP so remove and toss the header.  In order to do this,
@@ -244,7 +277,7 @@
 ////////////////////////////////////////////////////////////////////
 // Implementing an "application" to send bytes over a TCP connection
 void
-Ns3TcpLossTestCase::WriteUntilBufferFull (Ptr<Socket> localSocket, uint32_t txSpace)
+Ns3TcpLossTestCase::WriteUntilBufferFull (Ptr<Socket> localSocket, uint32_t)
 {
   while (m_currentTxBytes < m_totalTxBytes)
     {
@@ -473,6 +506,11 @@
   Simulator::Destroy ();
 }
 
+/**
+ * \ingroup system-tests-tcp
+ * 
+ * TCP implementation loss behavior TestSuite.
+ */
 class Ns3TcpLossTestSuite : public TestSuite
 {
 public:
@@ -506,5 +544,6 @@
 
 }
 
-static Ns3TcpLossTestSuite ns3TcpLossTestSuite;
+/// Do not forget to allocate an instance of this TestSuite.
+static Ns3TcpLossTestSuite g_ns3TcpLossTestSuite;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/test/ns3tcp/ns3tcp-no-delay-test-suite.cc ns-3.36/src/test/ns3tcp/ns3tcp-no-delay-test-suite.cc
--- ns-3.35/src/test/ns3tcp/ns3tcp-no-delay-test-suite.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/test/ns3tcp/ns3tcp-no-delay-test-suite.cc	2022-04-30 18:23:58.158735000 -0700
@@ -39,26 +39,37 @@
 
 NS_LOG_COMPONENT_DEFINE ("Ns3TcpNoDelayTest");
 
-// ===========================================================================
-// Tests of Nagle's algorithm and the TCP no delay option
-// ===========================================================================
-//
-//
+/**
+ * \ingroup system-tests-tcp
+ * 
+ * \brief Tests of Nagle's algorithm and the TCP no delay option.
+ */
 class Ns3TcpNoDelayTestCase : public TestCase
 {
 public:
+  /**
+   * Constructor.
+   * 
+   * \param noDelay Enable or disable TCP no delay option.
+   */
   Ns3TcpNoDelayTestCase (bool noDelay);
   virtual ~Ns3TcpNoDelayTestCase () {}
 
 private:
   virtual void DoRun (void);
-  bool m_noDelay;
-  bool m_writeResults;
+  bool m_noDelay;       //!< Enable or disable TCP no delay option.
+  bool m_writeResults;  //!< True if write PCAP files.
 
+  /**
+   * Receive a TCP packet.
+   * \param path The callback context (unused).
+   * \param p The received packet.
+   * \param address The sender's address (unused).
+   */
   void SinkRx (std::string path, Ptr<const Packet> p, const Address &address);
 
-  TestVectors<uint32_t> m_inputs;
-  TestVectors<uint32_t> m_responses;
+  TestVectors<uint32_t> m_inputs;     //!< Sent packets test vector.
+  TestVectors<uint32_t> m_responses;  //!< Received packets test vector.
 };
 
 Ns3TcpNoDelayTestCase::Ns3TcpNoDelayTestCase (bool noDelay)
@@ -69,7 +80,7 @@
 }
 
 void 
-Ns3TcpNoDelayTestCase::SinkRx (std::string path, Ptr<const Packet> p, const Address &address)
+Ns3TcpNoDelayTestCase::SinkRx (std::string, Ptr<const Packet> p, const Address &)
 {
   m_responses.Add (p->GetSize ());
 }
@@ -192,6 +203,11 @@
     }
 }
 
+/**
+ * \ingroup system-tests-tcp
+ * 
+ * TCP Nagle's algorithm and the TCP no delay option TestSuite.
+ */
 class Ns3TcpNoDelayTestSuite : public TestSuite
 {
 public:
@@ -205,4 +221,5 @@
   AddTestCase (new Ns3TcpNoDelayTestCase (false), TestCase::QUICK);
 }
 
-static Ns3TcpNoDelayTestSuite ns3TcpNoDelayTestSuite;
+/// Do not forget to allocate an instance of this TestSuite.
+static Ns3TcpNoDelayTestSuite g_ns3TcpNoDelayTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/test/ns3tcp/ns3tcp-socket-test-suite.cc ns-3.36/src/test/ns3tcp/ns3tcp-socket-test-suite.cc
--- ns-3.35/src/test/ns3tcp/ns3tcp-socket-test-suite.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/test/ns3tcp/ns3tcp-socket-test-suite.cc	2022-04-30 18:23:58.158735000 -0700
@@ -40,41 +40,48 @@
 
 NS_LOG_COMPONENT_DEFINE ("Ns3SocketTest");
 
-// ===========================================================================
-// Tests of TCP implementations from the application/socket perspective
-// ===========================================================================
-//
-//
-class Ns3TcpSocketTestCase1 : public TestCase
+/**
+ * \ingroup system-tests-tcp
+ * 
+ * \brief Tests of TCP implementations from the application/socket perspective 
+ * using point-to-point links.
+ */
+class Ns3TcpSocketTestCaseP2P : public TestCase
 {
 public:
-  Ns3TcpSocketTestCase1 ();
-  virtual ~Ns3TcpSocketTestCase1 () {}
+  Ns3TcpSocketTestCaseP2P ();
+  virtual ~Ns3TcpSocketTestCaseP2P () {}
 
 private:
   virtual void DoRun (void);
-  bool m_writeResults;
+  bool m_writeResults;  //!< True if write PCAP files.
 
+  /**
+   * Receive a TCP packet.
+   * \param path The callback context (unused).
+   * \param p The received packet.
+   * \param address The sender's address (unused).
+   */
   void SinkRx (std::string path, Ptr<const Packet> p, const Address &address);
 
-  TestVectors<uint32_t> m_inputs;
-  TestVectors<uint32_t> m_responses;
+  TestVectors<uint32_t> m_inputs;     //!< Sent packets test vector.
+  TestVectors<uint32_t> m_responses;  //!< Received packets test vector.
 };
 
-Ns3TcpSocketTestCase1::Ns3TcpSocketTestCase1 ()
+Ns3TcpSocketTestCaseP2P::Ns3TcpSocketTestCaseP2P ()
   : TestCase ("Check that ns-3 TCP successfully transfers an application data write of various sizes (point-to-point)"),
     m_writeResults (false)
 {
 }
 
 void 
-Ns3TcpSocketTestCase1::SinkRx (std::string path, Ptr<const Packet> p, const Address &address)
+Ns3TcpSocketTestCaseP2P::SinkRx (std::string path, Ptr<const Packet> p, const Address &address)
 {
   m_responses.Add (p->GetSize ());
 }
 
 void
-Ns3TcpSocketTestCase1::DoRun (void)
+Ns3TcpSocketTestCaseP2P::DoRun (void)
 {
   uint16_t sinkPort = 50000;
   double sinkStopTime = 40;  // sec; will trigger Socket::Close
@@ -116,7 +123,7 @@
   apps.Stop (sinkStopTimeObj);
 
   Config::Connect ("/NodeList/*/ApplicationList/*/$ns3::PacketSink/Rx",
-                   MakeCallback (&Ns3TcpSocketTestCase1::SinkRx, this));
+                   MakeCallback (&Ns3TcpSocketTestCaseP2P::SinkRx, this));
 
   Simulator::Schedule (Seconds (2), &SocketWriter::Connect, socketWriter);
   // Send 1, 10, 100, 1000 bytes
@@ -150,36 +157,48 @@
     }
 }
 
-class Ns3TcpSocketTestCase2 : public TestCase
+/**
+ * \ingroup system-tests-tcp
+ * 
+ * \brief Tests of TCP implementations from the application/socket perspective 
+ * using CSMA links.
+ */
+class Ns3TcpSocketTestCaseCsma : public TestCase
 {
 public:
-  Ns3TcpSocketTestCase2 ();
-  virtual ~Ns3TcpSocketTestCase2 () {}
+  Ns3TcpSocketTestCaseCsma ();
+  virtual ~Ns3TcpSocketTestCaseCsma () {}
 
 private:
   virtual void DoRun (void);
-  bool m_writeResults;
+  bool m_writeResults;  //!< True if write PCAP files.
 
+  /**
+   * Receive a TCP packet.
+   * \param path The callback context (unused).
+   * \param p The received packet.
+   * \param address The sender's address (unused).
+   */
   void SinkRx (std::string path, Ptr<const Packet> p, const Address &address);
 
-  TestVectors<uint32_t> m_inputs;
-  TestVectors<uint32_t> m_responses;
+  TestVectors<uint32_t> m_inputs;     //!< Sent packets test vector.
+  TestVectors<uint32_t> m_responses;  //!< Received packets test vector.
 };
 
-Ns3TcpSocketTestCase2::Ns3TcpSocketTestCase2 ()
+Ns3TcpSocketTestCaseCsma::Ns3TcpSocketTestCaseCsma ()
   : TestCase ("Check to see that ns-3 TCP successfully transfers an application data write of various sizes (CSMA)"),
     m_writeResults (false)
 {
 }
 
 void 
-Ns3TcpSocketTestCase2::SinkRx (std::string path, Ptr<const Packet> p, const Address &address)
+Ns3TcpSocketTestCaseCsma::SinkRx (std::string path, Ptr<const Packet> p, const Address &address)
 {
   m_responses.Add (p->GetSize ());
 }
 
 void
-Ns3TcpSocketTestCase2::DoRun (void)
+Ns3TcpSocketTestCaseCsma::DoRun (void)
 {
   uint16_t sinkPort = 50000;
   double sinkStopTime = 40;  // sec; will trigger Socket::Close
@@ -225,7 +244,7 @@
   apps.Stop (sinkStopTimeObj);
 
   Config::Connect ("/NodeList/*/ApplicationList/*/$ns3::PacketSink/Rx",
-                   MakeCallback (&Ns3TcpSocketTestCase2::SinkRx, this));
+                   MakeCallback (&Ns3TcpSocketTestCaseCsma::SinkRx, this));
 
   Simulator::Schedule (Seconds (2), &SocketWriter::Connect, socketWriter);
   // Send 1, 10, 100, 1000 bytes
@@ -262,6 +281,11 @@
     }
 }
 
+/**
+ * \ingroup system-tests-tcp
+ * 
+ * TCP implementations from the application/socket perspective TestSuite.
+ */
 class Ns3TcpSocketTestSuite : public TestSuite
 {
 public:
@@ -271,8 +295,9 @@
 Ns3TcpSocketTestSuite::Ns3TcpSocketTestSuite ()
   : TestSuite ("ns3-tcp-socket", SYSTEM)
 {
-  AddTestCase (new Ns3TcpSocketTestCase1, TestCase::QUICK);
-  AddTestCase (new Ns3TcpSocketTestCase2, TestCase::QUICK);
+  AddTestCase (new Ns3TcpSocketTestCaseP2P, TestCase::QUICK);
+  AddTestCase (new Ns3TcpSocketTestCaseCsma, TestCase::QUICK);
 }
 
-static Ns3TcpSocketTestSuite ns3TcpSocketTestSuite;
+/// Do not forget to allocate an instance of this TestSuite.
+static Ns3TcpSocketTestSuite g_ns3TcpSocketTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/test/ns3tcp/ns3tcp-socket-writer.h ns-3.36/src/test/ns3tcp/ns3tcp-socket-writer.h
--- ns-3.35/src/test/ns3tcp/ns3tcp-socket-writer.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/test/ns3tcp/ns3tcp-socket-writer.h	2022-04-30 18:23:58.158735000 -0700
@@ -24,7 +24,12 @@
 
 namespace ns3
 {
-//  Simple class to write data to sockets
+
+/**
+ * \ingroup system-tests-tcp
+ * 
+ * \brief Simple class to write data to sockets.
+ */
 class SocketWriter : public Application
 {
 public:
@@ -36,18 +41,33 @@
    */
   static TypeId GetTypeId (void);
   
+  /**
+   * Setup the socket.
+   * \param node The node owning the socket.
+   * \param peer The destinaiton address.
+   */
   void Setup (Ptr<Node> node, Address peer);
+  /**
+   * Connect the socket.
+   */
   void Connect ();
+  /**
+   * Write to the socket.
+   * \param numBytes The number of bytes to write.
+   */
   void Write (uint32_t numBytes);
+  /**
+   * Close the socket.
+   */
   void Close ();
 
 private:
   virtual void StartApplication (void);
   virtual void StopApplication (void);
-  Address m_peer;
-  Ptr<Node> m_node;
-  Ptr<Socket> m_socket;
-  bool m_isSetup;
-  bool m_isConnected;
+  Address m_peer;         //!< Peer's address.
+  Ptr<Node> m_node;       //!< Node pointer
+  Ptr<Socket> m_socket;   //!< Socket.
+  bool m_isSetup;         //!< True if the socket is connected.
+  bool m_isConnected;     //!< True if the socket setup has been done.
 };
 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/test/ns3tcp/ns3tcp-state-test-suite.cc ns-3.36/src/test/ns3tcp/ns3tcp-state-test-suite.cc
--- ns-3.35/src/test/ns3tcp/ns3tcp-state-test-suite.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/test/ns3tcp/ns3tcp-state-test-suite.cc	2022-04-30 18:23:58.158735000 -0700
@@ -56,21 +56,26 @@
 // revised vectors are the correct ones.  In other words, don't simply
 // enable this to true to clear a failing test without looking at the
 // results closely.
-const bool WRITE_VECTORS = false;           // set to true to write response vectors
-const bool WRITE_PCAP = false;              // set to true to write out pcap
-const bool WRITE_LOGGING = false;           // set to true to write logging
-const uint32_t PCAP_LINK_TYPE = 1187373554; // Some large random number -- we use to verify data was written by this program
-const uint32_t PCAP_SNAPLEN   = 64;         // Don't bother to save much data
-
-// ===========================================================================
-// Tests of TCP implementation state machine behavior
-// ===========================================================================
-//
+const bool WRITE_VECTORS = false;           //!< Set to true to write response vectors.
+const bool WRITE_PCAP = false;              //!< Set to true to write out pcap.
+const bool WRITE_LOGGING = false;           //!< Set to true to write logging.
+const uint32_t PCAP_LINK_TYPE = 1187373554; //!< Some large random number -- we use to verify data was written by this program.
+const uint32_t PCAP_SNAPLEN   = 64;         //!< Don't bother to save much data.
 
+
+/**
+ * \ingroup system-tests-tcp
+ * 
+ * \brief Tests of TCP implementation state machine behavior
+ */
 class Ns3TcpStateTestCase : public TestCase
 {
 public:
   Ns3TcpStateTestCase ();
+  /**
+   * Constructor.
+   * \param testCase Testcase number.
+   */
   Ns3TcpStateTestCase (uint32_t testCase);
   virtual ~Ns3TcpStateTestCase ()
   {
@@ -81,19 +86,50 @@
   virtual void DoRun (void);
   virtual void DoTeardown (void);
 
-  std::string m_pcapFilename;
-  PcapFile m_pcapFile;
-  uint32_t m_testCase;
-  uint32_t m_totalTxBytes;
-  uint32_t m_currentTxBytes;
-  bool m_writeVectors;
-  bool m_writeResults;
-  bool m_writeLogging;
-  bool m_needToClose;
-
+  std::string m_pcapFilename;     //!< The PCAP filename.
+  PcapFile m_pcapFile;            //!< The PCAP ffile.
+  uint32_t m_testCase;            //!< Testcase number.
+  uint32_t m_totalTxBytes;        //!< Total number of bytes to send.
+  uint32_t m_currentTxBytes;      //!< Current number of bytes sent.
+  bool m_writeVectors;            //!< True if response vectors have to be written (and not read).
+  bool m_writeResults;            //!< True if write PCAP files.
+  bool m_writeLogging;            //!< True if write logging.
+  bool m_needToClose;             //!< Check if the sending socket need to be closed.
+
+  /**
+   * Check that the transmitted packets are consitent with the trace.
+   * This callback is hooked to ns3::Ipv4L3Protocol/Tx.
+   * 
+   * \param context The callback context (unused).
+   * \param packet The transmitted packet.
+   * \param ipv4 The IPv4 object that did send the packet (unused).
+   * \param interface The IPv4 interface that did send the packet (unused).
+   */
   void Ipv4L3Tx (std::string context, Ptr<const Packet> packet, Ptr<Ipv4> ipv4, uint32_t interface);
+  /**
+   * Check that the received packets are consitent with the trace.
+   * This callback is hooked to ns3::Ipv4L3Protocol/Tx.
+   * 
+   * \param context The callback context (unused).
+   * \param packet The transmitted packet.
+   * \param ipv4 The IPv4 object that did send the packet (unused).
+   * \param interface The IPv4 interface that did send the packet (unused).
+   */
   void Ipv4L3Rx (std::string context, Ptr<const Packet> packet, Ptr<Ipv4> ipv4, uint32_t interface);
+  /**
+   * Write to the socket until the buffer is full.
+   * 
+   * \param localSocket The output socket.
+   * \param txSpace The space left on the socket (unused).
+   */
   void WriteUntilBufferFull (Ptr<Socket> localSocket, uint32_t txSpace);
+  /**
+   * Start transmitting a TCP flow.
+   * 
+   * \param localSocket The sending socket.
+   * \param servAddress The IPv4 address of the server (i.e., the destination address).
+   * \param servPort The TCP port of the server (i.e., the destination port).
+   */
   void StartFlow (Ptr<Socket> localSocket,
                   Ipv4Address servAddress,
                   uint16_t servPort);
@@ -157,7 +193,7 @@
 }
 
 void
-Ns3TcpStateTestCase::Ipv4L3Rx (std::string context, Ptr<const Packet> packet, Ptr<Ipv4> ipv4, uint32_t interface)
+Ns3TcpStateTestCase::Ipv4L3Rx (std::string, Ptr<const Packet> packet, Ptr<Ipv4>, uint32_t)
 {
   Ptr<Packet> received = packet->Copy ();
   Ipv4Header ipHeader;
@@ -169,7 +205,7 @@
 }
 
 void
-Ns3TcpStateTestCase::Ipv4L3Tx (std::string context, Ptr<const Packet> packet, Ptr<Ipv4> ipv4, uint32_t interface)
+Ns3TcpStateTestCase::Ipv4L3Tx (std::string, Ptr<const Packet> packet, Ptr<Ipv4>, uint32_t)
 {
   //
   // We're not testing IP so remove and toss the header.  In order to do this,
@@ -480,6 +516,11 @@
   Simulator::Destroy ();
 }
 
+/**
+ * \ingroup system-tests-tcp
+ * 
+ * TCP implementation state machine behavior TestSuite.
+ */
 class Ns3TcpStateTestSuite : public TestSuite
 {
 public:
@@ -504,4 +545,5 @@
   AddTestCase (new Ns3TcpStateTestCase (8), TestCase::QUICK);
 }
 
-static Ns3TcpStateTestSuite ns3TcpLossTestSuite;
+/// Do not forget to allocate an instance of this TestSuite.
+static Ns3TcpStateTestSuite g_ns3TcpLossTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/test/ns3tcp/nsctcp-loss-test-suite.cc ns-3.36/src/test/ns3tcp/nsctcp-loss-test-suite.cc
--- ns-3.35/src/test/ns3tcp/nsctcp-loss-test-suite.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/test/ns3tcp/nsctcp-loss-test-suite.cc	1969-12-31 16:00:00.000000000 -0800
@@ -1,282 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2010 University of Washington
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include "ns3/log.h"
-#include "ns3/abort.h"
-#include "ns3/test.h"
-#include "ns3/pcap-file.h"
-#include "ns3/config.h"
-#include "ns3/string.h"
-#include "ns3/uinteger.h"
-#include "ns3/data-rate.h"
-#include "ns3/inet-socket-address.h"
-#include "ns3/point-to-point-helper.h"
-#include "ns3/internet-stack-helper.h"
-#include "ns3/ipv4-global-routing-helper.h"
-#include "ns3/ipv4-address-helper.h"
-#include "ns3/packet-sink-helper.h"
-#include "ns3/tcp-socket-factory.h"
-#include "ns3/node-container.h"
-#include "ns3/simulator.h"
-#include "ns3/error-model.h"
-#include "ns3/pointer.h"
-#include "../ns3tcp/ns3tcp-socket-writer.h"
-
-using namespace ns3;
-
-NS_LOG_COMPONENT_DEFINE ("NscTcpLossTest");
-
-// ===========================================================================
-// Tests of TCP implementation loss behavior
-// ===========================================================================
-//
-
-class NscTcpLossTestCase1 : public TestCase
-{
-public:
-  NscTcpLossTestCase1 ();
-  virtual ~NscTcpLossTestCase1 () {}
-
-private:
-  virtual void DoRun (void);
-  bool m_writeResults;
-
-  void SinkRx (std::string path, Ptr<const Packet> p, const Address &address);
-
-  TestVectors<uint32_t> m_inputs;
-  TestVectors<uint32_t> m_responses;
-};
-
-NscTcpLossTestCase1::NscTcpLossTestCase1 ()
-  : TestCase ("Check that nsc TCP survives loss of first two SYNs"),
-    m_writeResults (false)
-{
-}
-
-void 
-NscTcpLossTestCase1::SinkRx (std::string path, Ptr<const Packet> p, const Address &address)
-{
-  m_responses.Add (p->GetSize ());
-}
-
-void
-NscTcpLossTestCase1::DoRun (void)
-{
-  uint16_t sinkPort = 50000;
-  double sinkStopTime = 40;  // sec; will trigger Socket::Close
-  double writerStopTime = 30;  // sec; will trigger Socket::Close
-  double simStopTime = 60;  // sec
-  Time sinkStopTimeObj = Seconds (sinkStopTime);
-  Time writerStopTimeObj = Seconds (writerStopTime);
-  Time simStopTimeObj= Seconds (simStopTime);
-  // This test was written with initial window of 1 segment
-  Config::SetDefault ("ns3::TcpSocket::InitialCwnd", UintegerValue (1));
-
-  Ptr<Node> n0 = CreateObject<Node> ();
-  Ptr<Node> n1 = CreateObject<Node> ();
-
-  PointToPointHelper pointToPoint;
-  pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
-  pointToPoint.SetChannelAttribute ("Delay", StringValue ("200ms"));
-
-  NetDeviceContainer devices;
-  devices = pointToPoint.Install (n0, n1);
-
-  InternetStackHelper internet;
-  internet.SetTcp ("ns3::NscTcpL4Protocol", "Library", StringValue ("liblinux2.6.26.so"));
-  internet.InstallAll ();
-
-  Ipv4AddressHelper address;
-  address.SetBase ("10.1.1.0", "255.255.255.252");
-  Ipv4InterfaceContainer ifContainer = address.Assign (devices);
-
-  Ptr<SocketWriter> socketWriter = CreateObject<SocketWriter> ();
-  Address sinkAddress (InetSocketAddress (ifContainer.GetAddress (1), sinkPort));
-  socketWriter->Setup (n0, sinkAddress);
-  n0->AddApplication (socketWriter);
-  socketWriter->SetStartTime (Seconds (0.));
-  socketWriter->SetStopTime (writerStopTimeObj);
-
-  PacketSinkHelper sink ("ns3::TcpSocketFactory",
-                         InetSocketAddress (Ipv4Address::GetAny (), sinkPort));
-  ApplicationContainer apps = sink.Install (n1);
-  // Start the sink application at time zero, and stop it at sinkStopTime
-  apps.Start (Seconds (0.0));
-  apps.Stop (sinkStopTimeObj);
-
-  Config::Connect ("/NodeList/*/ApplicationList/*/$ns3::PacketSink/Rx",
-                   MakeCallback (&NscTcpLossTestCase1::SinkRx, this));
-
-  Simulator::Schedule (Seconds (2), &SocketWriter::Connect, socketWriter);
-  Simulator::Schedule (Seconds (10), &SocketWriter::Write, socketWriter, 500);
-  m_inputs.Add (500);
-  Simulator::Schedule (writerStopTimeObj, &SocketWriter::Close, socketWriter);
-
-  std::list<uint32_t> sampleList;
-  // Lose first two SYNs
-  sampleList.push_back (0);
-  sampleList.push_back (1);
-  // This time, we'll explicitly create the error model we want
-  Ptr<ReceiveListErrorModel> pem = CreateObject<ReceiveListErrorModel> ();
-  pem->SetList (sampleList);
-  devices.Get (1)->SetAttribute ("ReceiveErrorModel", PointerValue (pem));
-
-  if (m_writeResults)
-    {
-      pointToPoint.EnablePcapAll ("nsc-tcp-loss-test-case-1");
-      pointToPoint.EnableAsciiAll ("nsc-tcp-loss-test-case-1");
-    }
-
-  Simulator::Stop (simStopTimeObj);
-  Simulator::Run ();
-  Simulator::Destroy ();
-
-  // Compare inputs and outputs
-  NS_TEST_ASSERT_MSG_EQ (m_inputs.GetN (), m_responses.GetN (), "Incorrect number of expected receive events");
-  for (uint32_t i = 0; i < m_responses.GetN (); i++)
-    {
-      uint32_t in = m_inputs.Get (i);
-      uint32_t out = m_responses.Get (i);
-      NS_TEST_ASSERT_MSG_EQ (in, out, "Mismatch:  expected " << in << " bytes, got " << out << " bytes");
-    }
-}
-
-class NscTcpLossTestCase2 : public TestCase
-{
-public:
-  NscTcpLossTestCase2 ();
-  virtual ~NscTcpLossTestCase2 () {}
-
-private:
-  virtual void DoRun (void);
-  bool m_writeResults;
-
-  void SinkRx (std::string path, Ptr<const Packet> p, const Address &address);
-
-  TestVectors<uint32_t> m_inputs;
-  TestVectors<uint32_t> m_responses;
-};
-
-NscTcpLossTestCase2::NscTcpLossTestCase2 ()
-  : TestCase ("Check that nsc TCP survives loss of first data packet"),
-    m_writeResults (false)
-{
-}
-
-void 
-NscTcpLossTestCase2::SinkRx (std::string path, Ptr<const Packet> p, const Address &address)
-{
-  m_responses.Add (p->GetSize ());
-}
-
-void
-NscTcpLossTestCase2::DoRun (void)
-{
-  uint16_t sinkPort = 50000;
-  double sinkStopTime = 40;  // sec; will trigger Socket::Close
-  double writerStopTime = 12;  // sec; will trigger Socket::Close
-  double simStopTime = 60;  // sec
-  Time sinkStopTimeObj = Seconds (sinkStopTime);
-  Time writerStopTimeObj = Seconds (writerStopTime);
-  Time simStopTimeObj= Seconds (simStopTime);
-  // This test was written with initial window of 1 segment
-  Config::SetDefault ("ns3::TcpSocket::InitialCwnd", UintegerValue (1));
-
-  Ptr<Node> n0 = CreateObject<Node> ();
-  Ptr<Node> n1 = CreateObject<Node> ();
-
-  PointToPointHelper pointToPoint;
-  pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
-  pointToPoint.SetChannelAttribute ("Delay", StringValue ("200ms"));
-
-  NetDeviceContainer devices;
-  devices = pointToPoint.Install (n0, n1);
-
-  InternetStackHelper internet;
-  internet.SetTcp ("ns3::NscTcpL4Protocol", "Library", StringValue ("liblinux2.6.26.so"));
-  internet.InstallAll ();
-
-  Ipv4AddressHelper address;
-  address.SetBase ("10.1.1.0", "255.255.255.252");
-  Ipv4InterfaceContainer ifContainer = address.Assign (devices);
-
-  Ptr<SocketWriter> socketWriter = CreateObject<SocketWriter> ();
-  Address sinkAddress (InetSocketAddress (ifContainer.GetAddress (1), sinkPort));
-  socketWriter->Setup (n0, sinkAddress);
-  n0->AddApplication (socketWriter);
-  socketWriter->SetStartTime (Seconds (0.));
-  socketWriter->SetStopTime (writerStopTimeObj);
-
-  PacketSinkHelper sink ("ns3::TcpSocketFactory",
-                         InetSocketAddress (Ipv4Address::GetAny (), sinkPort));
-  ApplicationContainer apps = sink.Install (n1);
-  // Start the sink application at time zero, and stop it at sinkStopTime
-  apps.Start (Seconds (0.0));
-  apps.Stop (sinkStopTimeObj);
-
-  Config::Connect ("/NodeList/*/ApplicationList/*/$ns3::PacketSink/Rx",
-                   MakeCallback (&NscTcpLossTestCase2::SinkRx, this));
-
-  Simulator::Schedule (Seconds (2), &SocketWriter::Connect, socketWriter);
-  Simulator::Schedule (Seconds (10), &SocketWriter::Write, socketWriter, 500);
-  m_inputs.Add (500);
-  Simulator::Schedule (writerStopTimeObj, &SocketWriter::Close, socketWriter);
-
-  std::list<uint32_t> sampleList;
-  // Lose first data segment
-  sampleList.push_back (2);
-  // This time, we'll explicitly create the error model we want
-  Ptr<ReceiveListErrorModel> pem = CreateObject<ReceiveListErrorModel> ();
-  pem->SetList (sampleList);
-  devices.Get (1)->SetAttribute ("ReceiveErrorModel", PointerValue (pem));
-
-  if (m_writeResults)
-    {
-      pointToPoint.EnablePcapAll ("nsc-tcp-loss-test-case-2");
-      pointToPoint.EnableAsciiAll ("nsc-tcp-loss-test-case-2");
-    }
-
-  Simulator::Stop (simStopTimeObj);
-  Simulator::Run ();
-  Simulator::Destroy ();
-
-  // Compare inputs and outputs
-  NS_TEST_ASSERT_MSG_EQ (m_inputs.GetN (), m_responses.GetN (), "Incorrect number of expected receive events");
-  for (uint32_t i = 0; i < m_responses.GetN (); i++)
-    {
-      uint32_t in = m_inputs.Get (i);
-      uint32_t out = m_responses.Get (i);
-      NS_TEST_ASSERT_MSG_EQ (in, out, "Mismatch:  expected " << in << " bytes, got " << out << " bytes");
-    }
-}
-
-class NscTcpLossTestSuite : public TestSuite
-{
-public:
-  NscTcpLossTestSuite ();
-};
-
-NscTcpLossTestSuite::NscTcpLossTestSuite ()
-  : TestSuite ("nsc-tcp-loss", SYSTEM)
-{
-  AddTestCase (new NscTcpLossTestCase1, TestCase::QUICK);
-  AddTestCase (new NscTcpLossTestCase2, TestCase::QUICK);
-}
-
-static NscTcpLossTestSuite nscTcpLossTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/test/ns3tcp/plot.gp ns-3.36/src/test/ns3tcp/plot.gp
--- ns-3.35/src/test/ns3tcp/plot.gp	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/test/ns3tcp/plot.gp	2022-04-30 18:23:58.158735000 -0700
@@ -22,7 +22,7 @@
 # * logging output from Ns3TcpLossTest case must first be enabled 
 # * by manually editing ns3-tcp-loss-test-suite.cc and setting 
 # * WRITE_LOGGING to true. Then, the test suite should be re-run 
-# * with ./waf --run "test-runner --suite='ns3-tcp-loss'"
+# * with ./ns3 run "test-runner --suite='ns3-tcp-loss'"
 # * This will generate a number of log files which are parsed 
 # * below for eventual plotting to .eps format using gnuplot.
 # * To run this file in gnuplot, simply: gnuplot plot.gp
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/test/ns3wifi/wifi-ac-mapping-test-suite.cc ns-3.36/src/test/ns3wifi/wifi-ac-mapping-test-suite.cc
--- ns-3.35/src/test/ns3wifi/wifi-ac-mapping-test-suite.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/test/ns3wifi/wifi-ac-mapping-test-suite.cc	2022-04-30 18:23:58.158735000 -0700
@@ -136,7 +136,6 @@
   wifiPhy.SetChannel (wifiChannel.Create ());
 
   Ssid ssid = Ssid ("wifi-ac-mapping");
-  wifi.SetRemoteStationManager ("ns3::ArfWifiManager");
 
   // Setup the AP, which will be the source of traffic for this test
   NodeContainer ap;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/test/ns3wifi/wifi-issue-211-test-suite.cc ns-3.36/src/test/ns3wifi/wifi-issue-211-test-suite.cc
--- ns-3.35/src/test/ns3wifi/wifi-issue-211-test-suite.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/test/ns3wifi/wifi-issue-211-test-suite.cc	2022-04-30 18:23:58.158735000 -0700
@@ -21,6 +21,7 @@
 
 #include "ns3/test.h"
 #include "ns3/string.h"
+#include "ns3/boolean.h"
 #include "ns3/qos-utils.h"
 #include "ns3/packet.h"
 #include "ns3/wifi-net-device.h"
@@ -128,7 +129,7 @@
   phy.SetChannel (spectrumChannel);
 
   WifiHelper wifi;
-  wifi.SetStandard (WIFI_STANDARD_80211n_5GHZ);
+  wifi.SetStandard (WIFI_STANDARD_80211n);
   wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager",
                                 "DataMode", StringValue ("HtMcs0"),
                                 "ControlMode", StringValue ("HtMcs0"));
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/test/perf/perf-io.cc ns-3.36/src/test/perf/perf-io.cc
--- ns-3.35/src/test/perf/perf-io.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/test/perf/perf-io.cc	1969-12-31 16:00:00.000000000 -0800
@@ -1,137 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-#include <ctime>
-#include <sys/time.h>
-
-#include <cstdio>
-#include <cstdlib>
-
-#include <iostream>
-#include <fstream>
-
-#include "ns3/core-module.h"
-#include "ns3/abort.h"
-
-using namespace ns3;
-
-static const uint64_t US_PER_NS = (uint64_t)1000;
-static const uint64_t US_PER_SEC = (uint64_t)1000000;
-static const uint64_t NS_PER_SEC = (uint64_t)1000000000;
-
-uint64_t
-GetRealtimeInNs (void)
-{
-  struct timeval tv;
-  gettimeofday (&tv, NULL);
-
-  uint64_t nsResult = tv.tv_sec * NS_PER_SEC + tv.tv_usec * US_PER_NS;
-  return nsResult;
-}
-
-void
-PerfFile (FILE *file, uint32_t n, const char *buffer, uint32_t size)
-{
-  for (uint32_t i = 0; i < n; ++i)
-    {
-      if (std::fwrite (buffer, 1, size, file) !=  size)
-        {
-          NS_ABORT_MSG ("PerfFile():  fwrite error");
-        }
-    }
-}
-
-void
-PerfStream (ostream &stream, uint32_t n, const char *buffer, uint32_t size)
-{
-
-  for (uint32_t i = 0; i < n; ++i)
-    {
-      stream.write (buffer, size);
-    }
-}
-
-int 
-main (int argc, char *argv[])
-{
-  uint32_t n = 100000;
-  uint32_t iter = 50;
-  bool doStream = false;
-  bool binmode = true;
- 
-
-  CommandLine cmd (__FILE__);
-  cmd.AddValue ("n", "How many times to write (defaults to 100000", n);
-  cmd.AddValue ("iter", "How many times to run the test looking for a min (defaults to 50)", iter);
-  cmd.AddValue ("doStream", "Run the C++ I/O benchmark otherwise the C I/O ", doStream);
-  cmd.AddValue ("binmode", "Select binary mode for the C++ I/O benchmark (defaults to true)", binmode);
-  cmd.Parse (argc, argv);
-
-  uint64_t result = std::numeric_limits<uint64_t>::max ();
-
-  char buffer[1024];
-
-  if (doStream)
-    {
-      //
-      // This will probably run on a machine doing other things.  Run it some
-      // relatively large number of times and try to find a minimum, which
-      // will hopefully represent a time when it runs free of interference.
-      //
-      for (uint32_t i = 0; i < iter; ++i)
-        {
-          ofstream stream;
-          if (binmode)
-            {
-              stream.open ("streamtest", std::ios_base::binary | std::ios_base::out);
-            }
-          else
-            {
-              stream.open ("streamtest", std::ios_base::out);
-            }
-
-          uint64_t start = GetRealtimeInNs ();
-          PerfStream (stream, n, buffer, 1024);
-          uint64_t et = GetRealtimeInNs () - start;
-          result = min (result, et);
-          stream.close ();
-          std::cout << "."; std::cout.flush ();
-        }
-      cout << std::endl;
-    }
-  else
-    {
-      //
-      // This will probably run on a machine doing other things.  Run it some
-      // relatively large number of times and try to find a minimum, which
-      // will hopefully represent a time when it runs free of interference.
-      //
-      for (uint32_t i = 0; i < iter; ++i)
-        {
-          FILE *file = fopen ("filetest", "w");
-
-          uint64_t start = GetRealtimeInNs ();
-          PerfFile (file, n, buffer, 1024);
-          uint64_t et = GetRealtimeInNs () - start;
-          result = std::min (result, et);
-          fclose (file);
-          file = 0;
-          std::cout << "."; std::cout.flush ();
-        }
-      std::cout << std::endl;
-    }
-  std::cout << argv[0] << ": " << result << "ns" << std::endl;
-}
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/test/perf/wscript ns-3.36/src/test/perf/wscript
--- ns-3.35/src/test/perf/wscript	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/test/perf/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,10 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def configure(conf):
-    pass
-
-def build(bld):
-    obj = bld.create_ns3_program('perf-io')
-    obj.source = 'perf-io.cc'
-
-
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/test/traced/traced-callback-typedef-test-suite.cc ns-3.36/src/test/traced/traced-callback-typedef-test-suite.cc
--- ns-3.35/src/test/traced/traced-callback-typedef-test-suite.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/test/traced/traced-callback-typedef-test-suite.cc	2022-04-30 18:23:58.158735000 -0700
@@ -40,9 +40,27 @@
 #include "ns3/stats-module.h"     // TimeSeriesAdapter
 #include "ns3/uan-module.h"       // UanPhy
 #include "ns3/wifi-phy-state-helper.h"
+#include "ns3/wifi-mac-header.h"
 
 using namespace ns3;
 
+/**
+ * \file
+ * \ingroup system-tests-traced
+ * 
+ * TracedCallback tests to verify if they are called with
+ * the right type and number of arguments.
+ */
+
+
+/**
+ * \ingroup system-tests-traced
+ * 
+ * TracedCallback Testcase.
+ * 
+ * This test verifies that the TracedCallback is called with
+ * the right type and number of arguments.
+ */
 class TracedCallbackTypedefTestCase : public TestCase
 {
 public:
@@ -59,30 +77,14 @@
    * in the \c m_nArgs public value, then inspect it
    * in the CheckType() method.
    */
-  static int m_nArgs;
+  static std::size_t m_nArgs;
 
 private:
-  /** Invoker boilerplate. */
-  template <typename T1, typename T2, typename T3, typename T4, typename T5>
-  class CheckerBase;
 
   /** Callback checkers. */
-  template <typename T1, typename T2, typename T3, typename T4, typename T5>
+  template <typename... Ts>
   class Checker;
 
-  template <typename T1, typename T2, typename T3, typename T4>
-  class Checker<T1, T2, T3, T4, empty>;
-
-  template <typename T1, typename T2, typename T3>
-  class Checker<T1, T2, T3, empty, empty>;
-
-
-  template <typename T1, typename T2>
-  class Checker<T1, T2, empty, empty, empty>;
-
-  template <typename T1>
-  class Checker<T1, empty, empty, empty, empty>;
-
   virtual void DoRun (void);
 
 };  // TracedCallbackTypedefTestCase
@@ -95,7 +97,12 @@
 
 namespace {
 
-/** Record typedefs which are identical to previously declared. */
+/** 
+ * \ingroup system-tests-traced
+ * 
+ * Record typedefs which are identical to previously declared.
+ * \return a container of strings representing the duplicates.
+ */
 std::set<std::string>
 Duplicates (void)
 {
@@ -111,12 +118,16 @@
 }
 
 /**
+ * \ingroup system-tests-traced
+ * 
  * Container for duplicate types.
  */
 std::set<std::string> g_dupes = Duplicates ();
 
 
 /**
+ * \ingroup system-tests-traced
+ * 
  * Stringify the known TracedCallback type names.
  *
  * \tparam T \explicit The typedef name.
@@ -130,6 +141,11 @@
   return "unknown";
 }
 
+/**
+ * \ingroup system-tests-traced
+ * 
+ * Returns a sting representing the type of a class.
+*/
 #define TYPENAME(T)               \
   template <> \
   inline std::string  \
@@ -141,8 +157,13 @@
   }
 
 /**
+ * \ingroup system-tests-traced
+ * 
  * \name Stringify known typename.
+*/
+/**
  * @{
+ * \brief Stringify a known typename
  */
 TYPENAME (dsr::DsrOptionSRHeader::TracedCallback);
 TYPENAME (EpcUeNas::StateTracedCallback);
@@ -155,7 +176,7 @@
 TYPENAME (LrWpanMac::SentTracedCallback);
 TYPENAME (LrWpanMac::StateTracedCallback);
 TYPENAME (LrWpanPhy::StateTracedCallback);
-// TYPENAME (LteEnbMac::DlSchedulingTracedCallback);
+TYPENAME (LteEnbMac::DlSchedulingTracedCallback);
 TYPENAME (LteEnbMac::UlSchedulingTracedCallback);
 TYPENAME (LteEnbPhy::ReportInterferenceTracedCallback);
 TYPENAME (LteEnbPhy::ReportUeSinrTracedCallback);
@@ -204,6 +225,8 @@
 
 
 /**
+ * \ingroup system-tests-traced
+ * 
  * Log that a callback was invoked.
  *
  * We can't actually do anything with any of the arguments,
@@ -211,66 +234,31 @@
  *
  * \param [in] N The number of arguments passed to the callback.
  */
-void SinkIt (unsigned int N)
+void SinkIt (std::size_t N)
 {
   std::cout << "with " << N << " args." << std::endl;
   TracedCallbackTypedefTestCase::m_nArgs = N;
 }
 
 /**
+ * \ingroup system-tests-traced
+ * 
  * Sink functions.
- * @{
  */
-template <typename T1, typename T2, typename T3, typename T4, typename T5>
+template <typename... Ts>
 class TracedCbSink
 {
 public:
-  static void Sink (T1 a1, T2 a2, T3 a3, T4 a4, T5 a5)
-  {
-    SinkIt (5);
-  }
-};
-
-template <typename T1, typename T2, typename T3, typename T4>
-class TracedCbSink<T1, T2, T3, T4, empty>
-{
-public:
-  static void Sink (T1 a1, T2 a2, T3 a3, T4 a4)
-  {
-    SinkIt (4);
-  }
-};
-
-template <typename T1, typename T2, typename T3>
-class TracedCbSink<T1, T2, T3, empty, empty>
-{
-public:
-  static void Sink (T1 a1, T2 a2, T3 a3)
-  {
-    SinkIt (3);
-  }
-};
-
-template <typename T1, typename T2>
-class TracedCbSink<T1, T2, empty, empty, empty>
-{
-public:
-  static void Sink (T1 a1, T2 a2)
-  {
-    SinkIt (2);
-  }
-};
-
-template <typename T1>
-class TracedCbSink< T1, empty, empty, empty, empty>
-{
-public:
-  static void Sink (T1 a1)
+  /**
+   * \brief Sink function, called by a TracedCallback.
+   * \tparam Ts prameters of the TracedCallback.
+   */
+  static void Sink (Ts...)
   {
-    SinkIt (1);
+    const std::size_t n = sizeof...(Ts);
+    SinkIt (n);
   }
 };
-/** @} */
 
 
 }  // unnamed namespace
@@ -285,142 +273,65 @@
   --------------------------------------------------------------------
 */
 
-int TracedCallbackTypedefTestCase::m_nArgs = 0;
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5>
-class TracedCallbackTypedefTestCase::CheckerBase : public Object
-{
-public:
-  typename TypeTraits<T1>::BaseType m1;
-  typename TypeTraits<T2>::BaseType m2;
-  typename TypeTraits<T3>::BaseType m3;
-  typename TypeTraits<T4>::BaseType m4;
-  typename TypeTraits<T5>::BaseType m5;
-
-  void Cleanup (int N)
-  {
-    if (m_nArgs == 0)
-      {
-        std::cout << std::endl;
-      }
-    NS_ASSERT_MSG (m_nArgs && m_nArgs == N, "failed.");
-    m_nArgs = 0;
-  }
-};  // TracedCallbackTypedefTestCase::CheckerBase
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5>
-class TracedCallbackTypedefTestCase::Checker : public CheckerBase<T1, T2, T3, T4, T5>
-{
-  TracedCallback<T1, T2, T3, T4, T5> m_cb;
-
-public:
-  template <typename U>
-  void Invoke (void)
-  {
-    const int N = 5;
-    U sink = TracedCbSink<T1, T2, T3, T4, T5>::Sink;
-    Callback<void, T1, T2, T3, T4, T5> cb = MakeCallback (sink);
-
-    std::cout << TypeName<U> (N) << " invoked ";
-    m_cb.ConnectWithoutContext (cb);
-    m_cb (this->m1, this->m2, this->m3, this->m4, this->m5);
-    this->Cleanup (N);
-  }
-};  // Checker<5>
+std::size_t TracedCallbackTypedefTestCase::m_nArgs = 0;
 
-template <typename T1, typename T2, typename T3, typename T4>
-class TracedCallbackTypedefTestCase::Checker<T1, T2, T3, T4, empty>
-  : public CheckerBase<T1, T2, T3, T4, empty>
+template <typename... Ts>
+class TracedCallbackTypedefTestCase::Checker : public Object
 {
-  TracedCallback<T1, T2, T3, T4> m_cb;
-
+  /// TracedCallback to be called.
+  TracedCallback<Ts...> m_cb;
 public:
-  template <typename U>
-  void Invoke (void)
-  {
-    const int N = 4;
-    U sink = TracedCbSink<T1, T2, T3, T4, empty>::Sink;
-    Callback<void, T1, T2, T3, T4> cb = MakeCallback (sink);
+  Checker  () {};
+  virtual ~Checker () {};
+  
+  /// Arguments of the TracedCallback.
+  std::tuple<typename TypeTraits<Ts>::BaseType...> m_items;
 
-    std::cout << TypeName<U> (N) << " invoked ";
-    m_cb.ConnectWithoutContext (cb);
-    m_cb (this->m1, this->m2, this->m3, this->m4);
-    this->Cleanup (N);
-  }
-};  // Checker <4>
+  /// Number of arguments of the TracedCallback.
+  const std::size_t m_nItems = sizeof...(Ts);
 
-template <typename T1, typename T2, typename T3>
-class TracedCallbackTypedefTestCase::Checker<T1, T2, T3, empty, empty>
-  : public CheckerBase<T1, T2, T3, empty, empty>
-{
-  TracedCallback<T1, T2, T3> m_cb;
-
-public:
+  /**
+   * Invoke a TracedCallback.
+   */
   template <typename U>
   void Invoke (void)
   {
-    const int N = 3;
-    U sink = TracedCbSink<T1, T2, T3, empty, empty>::Sink;
-    Callback<void, T1, T2, T3> cb = MakeCallback (sink);
+    U sink = TracedCbSink<Ts...>::Sink;
+    Callback<void, Ts...> cb = MakeCallback (sink);
 
-    std::cout << TypeName<U> (N) << " invoked ";
+    std::cout << TypeName<U> (m_nItems) << " invoked ";
     m_cb.ConnectWithoutContext (cb);
-    m_cb (this->m1, this->m2, this->m3);
-    this->Cleanup (N);
+    std::apply(m_cb, m_items);
+    Cleanup ();
   }
-};  // Checker<3>
-
-template <typename T1, typename T2>
-class TracedCallbackTypedefTestCase::Checker<T1, T2, empty, empty, empty>
-  : public CheckerBase<T1, T2, empty, empty, empty>
-{
-  TracedCallback<T1, T2> m_cb;
-
-public:
-  template <typename U>
-  void Invoke (void)
+  
+  /**
+   * Cleanup the test.
+   */
+  void Cleanup ()
   {
-    const int N = 2;
-    U sink = TracedCbSink<T1, T2, empty, empty, empty>::Sink;
-    Callback<void, T1, T2> cb = MakeCallback (sink);
-
-    std::cout << TypeName<U> (N) << " invoked ";
-    m_cb.ConnectWithoutContext (cb);
-    m_cb (this->m1, this->m2);
-    this->Cleanup (N);
+    if (m_nArgs == 0)
+      {
+        std::cout << std::endl;
+      }
+    NS_ASSERT_MSG (m_nArgs && m_nArgs == m_nItems, "failed, m_nArgs: " << m_nArgs << " N: " << m_nItems);
+    m_nArgs = 0;
   }
-};  // Checker<2>
-
-template <typename T1>
-class TracedCallbackTypedefTestCase::Checker<T1, empty, empty, empty, empty>
-  : public CheckerBase<T1, empty, empty, empty, empty>
-{
-  TracedCallback<T1> m_cb;
 
-public:
-  template <typename U>
-  void Invoke (void)
-  {
-    const int N = 1;
-    U sink = TracedCbSink<T1, empty, empty, empty, empty>::Sink;
-    Callback<void, T1> cb = MakeCallback (sink);
+};
 
-    std::cout << TypeName<U> (N) << " invoked ";
-    m_cb.ConnectWithoutContext (cb);
-    m_cb (this->m1);
-    this->Cleanup (N);
-  }
-};  // Checker<1>
 
 TracedCallbackTypedefTestCase::TracedCallbackTypedefTestCase ()
   : TestCase ("Check basic TracedCallback operation")
 {
 }
 
-void
-TracedCallbackTypedefTestCase::DoRun (void)
-{
-
+/**
+ * \ingroup system-tests-traced
+ * 
+ * Check the TracedCallback duplicate by checking if it maches the TracedCallback
+ * it is supposed to be equal to.
+ */
 #define DUPE(U, T1)                                                     \
   if (g_dupes.find ( # U ) == g_dupes.end ()) {                           \
       NS_TEST_ASSERT_MSG_NE (0, 1,                                        \
@@ -434,95 +345,85 @@
       " used to match the typedef " << # T1 <<                         \
       " but no longer does.  Please add a new CHECK call.")
 
-#define CHECK(U, T1, T2, T3, T4, T5)                                    \
-  CreateObject< Checker<T1, T2, T3, T4, T5> > ()->Invoke<U> ()
+
+/**
+ * \ingroup system-tests-traced
+ * 
+ * Check the TracedCallback by calling its Invoke function.
+ */
+#define CHECK(U, ...)                                    \
+  CreateObject< Checker< __VA_ARGS__ > > ()->Invoke<U> ()
+
+
+void
+TracedCallbackTypedefTestCase::DoRun (void)
+{
 
   CHECK (dsr::DsrOptionSRHeader::TracedCallback,
-         const dsr::DsrOptionSRHeader &,
-         empty, empty, empty, empty);
+         const dsr::DsrOptionSRHeader &);
 
   CHECK (EpcUeNas::StateTracedCallback,
-         EpcUeNas::State, EpcUeNas::State,
-         empty, empty, empty);
+         EpcUeNas::State, EpcUeNas::State);
 
   CHECK (Ipv4L3Protocol::DropTracedCallback,
          const Ipv4Header &, Ptr<const Packet>,
          Ipv4L3Protocol::DropReason, Ptr<Ipv4>, uint32_t );
 
   CHECK (Ipv4L3Protocol::SentTracedCallback,
-         const Ipv4Header &, Ptr<const Packet>, uint32_t,
-         empty, empty);
+         const Ipv4Header &, Ptr<const Packet>, uint32_t);
 
   CHECK (Ipv4L3Protocol::TxRxTracedCallback,
-         Ptr<const Packet>, Ptr<Ipv4>, uint32_t,
-         empty, empty);
+         Ptr<const Packet>, Ptr<Ipv4>, uint32_t);
 
   CHECK (Ipv6L3Protocol::DropTracedCallback,
          const Ipv6Header &, Ptr<const Packet>,
-         Ipv6L3Protocol::DropReason, Ptr<Ipv6>, uint32_t
-         );
+         Ipv6L3Protocol::DropReason, Ptr<Ipv6>, uint32_t);
 
   CHECK (Ipv6L3Protocol::SentTracedCallback,
-         const Ipv6Header &, Ptr<const Packet>, uint32_t,
-         empty, empty);
+         const Ipv6Header &, Ptr<const Packet>, uint32_t);
 
   CHECK (Ipv6L3Protocol::TxRxTracedCallback,
-         Ptr<const Packet>, Ptr<Ipv6>, uint32_t,
-         empty, empty);
+         Ptr<const Packet>, Ptr<Ipv6>, uint32_t);
 
   CHECK (LrWpanMac::SentTracedCallback,
-         Ptr<const Packet>, uint8_t, uint8_t,
-         empty, empty);
+         Ptr<const Packet>, uint8_t, uint8_t);
 
   CHECK (LrWpanMac::StateTracedCallback,
-         LrWpanMacState, LrWpanMacState,
-         empty, empty, empty);
+         LrWpanMacState, LrWpanMacState);
 
   CHECK (LrWpanPhy::StateTracedCallback,
-         Time, LrWpanPhyEnumeration, LrWpanPhyEnumeration,
-         empty, empty);
-
+         Time, LrWpanPhyEnumeration, LrWpanPhyEnumeration);
 
-  /*  Too many args :(
   CHECK (LteEnbMac::DlSchedulingTracedCallback,
          uint32_t, uint32_t, uint16_t,
-         uint8_t, uint16_t, uint8_t, uint16_t);
-  */
+         uint8_t, uint16_t, uint8_t, uint16_t, uint8_t);
 
   CHECK (LteEnbMac::UlSchedulingTracedCallback,
          uint32_t, uint32_t, uint16_t, uint8_t, uint16_t);
 
   CHECK (LteEnbPhy::ReportUeSinrTracedCallback,
-         uint16_t, uint16_t, double, uint8_t,
-         empty);
+         uint16_t, uint16_t, double, uint8_t);
 
   CHECK (LteEnbPhy::ReportInterferenceTracedCallback,
-         uint16_t, Ptr<SpectrumValue>,
-         empty, empty, empty);
+         uint16_t, Ptr<SpectrumValue>);
 
   CHECK (LteEnbRrc::ConnectionHandoverTracedCallback,
-         uint64_t, uint16_t, uint16_t,
-         empty, empty);
+         uint64_t, uint16_t, uint16_t);
 
   CHECK (LteEnbRrc::HandoverStartTracedCallback,
-         uint64_t, uint16_t, uint16_t, uint16_t,
-         empty);
+         uint64_t, uint16_t, uint16_t, uint16_t);
 
   CHECK (LteEnbRrc::NewUeContextTracedCallback,
-         uint16_t, uint16_t,
-         empty, empty, empty);
+         uint16_t, uint16_t);
 
   CHECK (LteEnbRrc::ReceiveReportTracedCallback,
-         uint64_t, uint16_t, uint16_t, LteRrcSap::MeasurementReport,
-         empty);
+         uint64_t, uint16_t, uint16_t, LteRrcSap::MeasurementReport);
 
   CHECK (LtePdcp::PduRxTracedCallback,
-         uint16_t, uint8_t, uint32_t, uint64_t,
-         empty);
+         uint16_t, uint8_t, uint32_t, uint64_t);
 
   CHECK (LtePdcp::PduTxTracedCallback,
-         uint16_t, uint8_t, uint32_t,
-         empty, empty);
+         uint16_t, uint8_t, uint32_t);
 
   DUPE  (LteRlc::NotifyTxTracedCallback, LtePdcp::PduTxTracedCallback);
 
@@ -532,12 +433,10 @@
          uint16_t, uint16_t, double, double, uint8_t);
 
   CHECK (LteUePhy::StateTracedCallback,
-         uint16_t, uint16_t, LteUePhy::State, LteUePhy::State,
-         empty);
+         uint16_t, uint16_t, LteUePhy::State, LteUePhy::State);
 
   CHECK (LteUeRrc::CellSelectionTracedCallback,
-         uint64_t, uint16_t,
-         empty, empty, empty);
+         uint64_t, uint16_t);
 
   DUPE  (LteUeRrc::ImsiCidRntiTracedCallback, LteEnbRrc::ConnectionHandoverTracedCallback);
 
@@ -547,130 +446,105 @@
          uint64_t, uint16_t, uint16_t, LteUeRrc::State, LteUeRrc::State);
 
   CHECK (Mac48Address::TracedCallback,
-         Mac48Address,
-         empty, empty, empty, empty);
+         Mac48Address);
 
   CHECK (MobilityModel::TracedCallback,
-         Ptr<const MobilityModel>,
-         empty, empty, empty, empty);
+         Ptr<const MobilityModel>);
 
   CHECK (olsr::RoutingProtocol::PacketTxRxTracedCallback,
-         const olsr::PacketHeader &, const olsr::MessageList &,
-         empty, empty, empty);
+         const olsr::PacketHeader &, const olsr::MessageList &);
 
   CHECK (olsr::RoutingProtocol::TableChangeTracedCallback,
-         uint32_t,
-         empty, empty, empty, empty);
+         uint32_t);
 
   CHECK (Packet::AddressTracedCallback,
-         Ptr<const Packet>, const Address &,
-         empty, empty, empty);
+         Ptr<const Packet>, const Address &);
 
   CHECK (Packet::Mac48AddressTracedCallback,
-         Ptr<const Packet>, Mac48Address,
-         empty, empty, empty);
+         Ptr<const Packet>, Mac48Address);
 
   CHECK (Packet::SinrTracedCallback,
-         Ptr<const Packet>, double,
-         empty, empty, empty);
+         Ptr<const Packet>, double);
 
   CHECK (Packet::SizeTracedCallback,
-         uint32_t, uint32_t,
-         empty, empty, empty);
+         uint32_t, uint32_t);
 
   CHECK (Packet::TracedCallback,
-         Ptr<const Packet>,
-         empty, empty, empty, empty);
+         Ptr<const Packet>);
 
   CHECK (PacketBurst::TracedCallback,
-         Ptr<const PacketBurst>,
-         empty, empty, empty, empty);
+         Ptr<const PacketBurst>);
 
   CHECK (dot11s::PeerManagementProtocol::LinkOpenCloseTracedCallback,
-         Mac48Address, Mac48Address,
-         empty, empty, empty);
+         Mac48Address, Mac48Address);
 
   CHECK (PhyReceptionStatParameters::TracedCallback,
-         PhyReceptionStatParameters,
-         empty, empty, empty, empty);
+         PhyReceptionStatParameters);
 
   CHECK (PhyTransmissionStatParameters::TracedCallback,
-         PhyTransmissionStatParameters,
-         empty, empty, empty, empty);
+         PhyTransmissionStatParameters);
 
   CHECK (SixLowPanNetDevice::DropTracedCallback,
          SixLowPanNetDevice::DropReason, Ptr<const Packet>,
-         Ptr<SixLowPanNetDevice>, uint32_t,
-         empty);
+         Ptr<SixLowPanNetDevice>, uint32_t);
 
   CHECK (SixLowPanNetDevice::RxTxTracedCallback,
-         Ptr<const Packet>, Ptr<SixLowPanNetDevice>, uint32_t,
-         empty, empty);
+         Ptr<const Packet>, Ptr<SixLowPanNetDevice>, uint32_t);
 
   CHECK (SpectrumChannel::LossTracedCallback,
-         Ptr<const SpectrumPhy>, Ptr<const SpectrumPhy>, double,
-         empty, empty);
+         Ptr<const SpectrumPhy>, Ptr<const SpectrumPhy>, double);
 
   CHECK (SpectrumValue::TracedCallback,
-         Ptr<SpectrumValue>,
-         empty, empty, empty, empty);
+         Ptr<SpectrumValue>);
 
   CHECK (TimeSeriesAdaptor::OutputTracedCallback,
-         double, double,
-         empty, empty, empty);
+         double, double);
 
   CHECK (UanMac::PacketModeTracedCallback,
-         Ptr<const Packet>, UanTxMode,
-         empty, empty, empty);
+         Ptr<const Packet>, UanTxMode);
 
   CHECK (UanMacCw::QueueTracedCallback,
-         Ptr<const Packet>, uint16_t,
-         empty, empty, empty);
+         Ptr<const Packet>, uint16_t);
 
   CHECK (UanMacRc::QueueTracedCallback,
-         Ptr<const Packet>, uint32_t,
-         empty, empty, empty);
+         Ptr<const Packet>, uint32_t);
 
   CHECK (UanNetDevice::RxTxTracedCallback,
-         Ptr<const Packet>, Mac8Address,
-         empty, empty, empty);
+         Ptr<const Packet>, Mac8Address);
 
   CHECK (UanPhy::TracedCallback,
-         Ptr<const Packet>, double, UanTxMode,
-         empty, empty);
+         Ptr<const Packet>, double, UanTxMode);
 
   CHECK (UeManager::StateTracedCallback,
          uint64_t, uint16_t, uint16_t, UeManager::State, UeManager::State);
 
   CHECK (WifiMacHeader::TracedCallback,
-         const WifiMacHeader &,
-         empty, empty, empty, empty);
+         const WifiMacHeader &);
 
   CHECK (WifiPhyStateHelper::RxEndErrorTracedCallback,
-         Ptr<const Packet>, double,
-         empty, empty, empty);
+         Ptr<const Packet>, double);
 
   CHECK (WifiPhyStateHelper::RxOkTracedCallback,
-         Ptr<const Packet>, double, WifiMode, WifiPreamble,
-         empty);
+         Ptr<const Packet>, double, WifiMode, WifiPreamble);
 
   CHECK (WifiPhyStateHelper::StateTracedCallback,
-         Time, Time, WifiPhyState,
-         empty, empty);
+         Time, Time, WifiPhyState);
 
   CHECK (WifiPhyStateHelper::TxTracedCallback,
-         Ptr<const Packet>, WifiMode, WifiPreamble, uint8_t,
-         empty);
+         Ptr<const Packet>, WifiMode, WifiPreamble, uint8_t);
 
   CHECK (WifiRemoteStationManager::PowerChangeTracedCallback,
-         double, double, Mac48Address,
-         empty, empty);
+         double, double, Mac48Address);
 
   CHECK (WifiRemoteStationManager::RateChangeTracedCallback,
-         DataRate, DataRate, Mac48Address,
-         empty, empty);
+         DataRate, DataRate, Mac48Address);
 }
 
+/**
+ * \ingroup system-tests-traced
+ *
+ * \brief TracedCallback typedef TestSuite
+ */
 class TracedCallbackTypedefTestSuite : public TestSuite
 {
 public:
@@ -683,4 +557,5 @@
   AddTestCase (new TracedCallbackTypedefTestCase, TestCase::QUICK);
 }
 
+/// Static variable for test initialization
 static TracedCallbackTypedefTestSuite tracedCallbackTypedefTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/test/traced/traced-value-callback-typedef-test-suite.cc ns-3.36/src/test/traced/traced-value-callback-typedef-test-suite.cc
--- ns-3.35/src/test/traced/traced-value-callback-typedef-test-suite.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/test/traced/traced-value-callback-typedef-test-suite.cc	2022-04-30 18:23:58.158735000 -0700
@@ -24,17 +24,30 @@
 
 using namespace ns3;
 
+/**
+ * \file
+ * \ingroup system-tests-traced
+ * 
+ * TracedValueCallback tests to verify that they work with different types
+ * of classes - it tests bool, double, various types of integers types, 
+ * Time, and SequenceNumber32.
+ */
+
 namespace {
 
 /**
+ * \ingroup system-tests-traced
+ * 
  * \name Stringify the known TracedValue type names.
- *
- * \returns The \c TracedValueCallback type name.
- * @{
+ */
+/**
+ * Generic template for unknown classes.
+ * 
+ * \returns The \c TracedValueCallback type name, or "unknown" for unknown classes.
  */
 template <typename T> inline
 std::string TypeName (void) { return "unknown"; }
-
+/** @{ */
 template <> inline std::string TypeName <bool>     (void) { return "Bool"    ; }
 template <> inline std::string TypeName <int8_t>   (void) { return "Int8_t"  ; }
 template <> inline std::string TypeName <int16_t>  (void) { return "Int16_t" ; }
@@ -51,6 +64,8 @@
 
 
 /**
+ * \ingroup system-tests-traced
+ * 
  * Result of callback test.
  *
  * Since the sink function is outside the invoking class,
@@ -63,6 +78,8 @@
   
 
 /**
+ * \ingroup system-tests-traced
+ * 
  * Template for TracedValue sink functions.
  *
  * This generates a sink function for any underlying type.
@@ -88,7 +105,11 @@
 }  // TracedValueCbSink<>()
   
 /**
+ * \ingroup system-tests-traced
+ * 
  * TracedValueCbSink specialization for Time.
+ * \param oldValue The old value,
+ * \param newValue The new value.
  */
 template <>
 void TracedValueCbSink<Time> (Time oldValue, Time newValue)
@@ -97,7 +118,11 @@
                                newValue.GetInteger ());
 }
 /**
+ * \ingroup system-tests-traced
+ * 
  * TracedValueCbSink specialization for SequenceNumber32.
+ * \param oldValue The old value,
+ * \param newValue The new value.
  */
 template <>  
 void TracedValueCbSink<SequenceNumber32> (SequenceNumber32 oldValue,
@@ -109,7 +134,12 @@
 
 }  // unnamed namespace
 
-  
+
+/**
+ * \ingroup system-tests-traced
+ *
+ * \brief TracedValueCallback Test Case
+ */
 class TracedValueCallbackTestCase : public TestCase
 {
 public:
@@ -125,22 +155,26 @@
   template <typename T>
   class CheckTvCb : public Object
   {
+    /// Traced value.
     TracedValue<T> m_value;
 
   public:
     /** Constructor. */
     CheckTvCb (void)  : m_value (0)  { }
     
-    /** Register this type. */
+    /**
+     * \brief Register this type.
+     * \return The object TypeId. 
+     */
     static TypeId GetTypeId (void)
     {
       static TypeId tid =
-        TypeId ( ("CheckTvCb<" + TypeName<T>() + ">").c_str ())
+        TypeId ("CheckTvCb<" + TypeName<T>() + ">")
         .SetParent <Object> ()
         .AddTraceSource ("value",
                          "A value being traced.",
                          MakeTraceSourceAccessor (&CheckTvCb<T>::m_value),
-                         ("ns3::TracedValueCallback::" + TypeName<T>()).c_str () )
+                         ("ns3::TracedValueCallback::" + TypeName<T>()) )
         ;
       return tid;
     }  // GetTypeId ()
@@ -152,7 +186,9 @@
      * aren't compatible, the connection will fail.
      *
      * Just to make sure, we increment the TracedValue,
-     * which calls the sink..
+     * which calls the sink.
+     * 
+     * \param cb Callback.
      */
     template <typename U>
     void Invoke (U cb)
@@ -229,6 +265,11 @@
   CheckType< SequenceNumber32, TracedValueCallback::SequenceNumber32 > ();
 }
 
+/**
+ * \ingroup system-tests-traced
+ *
+ * \brief TracedValueCallback TestSuite
+ */
 class TracedValueCallbackTestSuite : public TestSuite
 {
 public:
@@ -241,4 +282,5 @@
   AddTestCase (new TracedValueCallbackTestCase, TestCase::QUICK);
 }
 
+/// Static variable for test initialization
 static TracedValueCallbackTestSuite tracedValueCallbackTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/test/wscript ns-3.36/src/test/wscript
--- ns-3.35/src/test/wscript	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/test/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,58 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-import sys
-
-def configure(conf):
-    # Add the test module to the list of enabled modules that should
-    # not be built if this is a static build on Darwin.  They don't
-    # work there for the test module, and this is probably because the
-    # test module has no source files.
-    if conf.env['ENABLE_STATIC_NS3'] and sys.platform == 'darwin':
-        conf.env['MODULES_NOT_BUILT'].append('test')
-
-def build(bld):
-    # Don't do anything for this module if it should not be built.
-    if 'test' in bld.env['MODULES_NOT_BUILT']:
-        return
-
-    test = bld.create_ns3_module('test',
-                                 ['applications', 'bridge', 'config-store',
-                                  'csma', 'csma-layout', 'dsr',
-                                  'flow-monitor', 'internet', 'lr-wpan',
-                                  'lte', 'mesh', 'mobility', 'olsr',
-                                  'point-to-point', 'sixlowpan', 'stats',
-                                  'uan', 'wifi', 'internet-apps',
-                                  'point-to-point-layout', 'traffic-control'])
-
-    headers = bld(features='ns3header')
-    headers.module = 'test'
-
-    test_test = bld.create_ns3_module_test_library('test')
-    test_test.source = [
-        'csma-system-test-suite.cc',
-        'ns3tc/fq-codel-queue-disc-test-suite.cc',
-        'ns3tc/fq-cobalt-queue-disc-test-suite.cc',
-        'ns3tc/fq-pie-queue-disc-test-suite.cc',
-        'ns3tc/pfifo-fast-queue-disc-test-suite.cc',
-        'ns3tcp/ns3tcp-cwnd-test-suite.cc',
-        'ns3tcp/ns3tcp-interop-test-suite.cc',
-        'ns3tcp/ns3tcp-loss-test-suite.cc',
-        'ns3tcp/ns3tcp-no-delay-test-suite.cc',
-        'ns3tcp/ns3tcp-socket-test-suite.cc',
-        'ns3tcp/ns3tcp-state-test-suite.cc',
-        'ns3tcp/nsctcp-loss-test-suite.cc',
-        'ns3tcp/ns3tcp-socket-writer.cc',
-        'ns3wifi/wifi-msdu-aggregator-test-suite.cc',
-        'ns3wifi/wifi-ac-mapping-test-suite.cc',
-        'ns3wifi/wifi-issue-211-test-suite.cc',
-        'traced/traced-callback-typedef-test-suite.cc',
-        'traced/traced-value-callback-typedef-test-suite.cc',
-        ]
-
-    # Tests encapsulating example programs should be listed here
-    if (bld.env['ENABLE_EXAMPLES']):
-        test_test.source.extend([
-        #   'test/test-examples-test-suite.cc',
-            ])
-    
-
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/topology-read/bindings/modulegen__gcc_ILP32.py ns-3.36/src/topology-read/bindings/modulegen__gcc_ILP32.py
--- ns-3.35/src/topology-read/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/topology-read/bindings/modulegen__gcc_ILP32.py	2022-04-30 18:23:58.162735000 -0700
@@ -152,21 +152,21 @@
     module.add_class('Object', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter >'])
     ## object.h (module 'core'): ns3::Object::AggregateIterator [class]
     module.add_class('AggregateIterator', import_from_module='ns.core', outer_class=root_module['ns3::Object'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
     ## topology-reader.h (module 'topology-read'): ns3::TopologyReader [class]
     module.add_class('TopologyReader', parent=root_module['ns3::Object'])
@@ -283,8 +283,8 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'const ns3::Address &', 'const ns3::Address &', 'ns3::NetDevice::PacketType', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
-    module.add_container('std::map< std::string, std::string >', ('std::string', 'std::string'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, std::string >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'std::basic_string< char, std::char_traits< char >, std::allocator< char > >'), container_type='map')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )', 'ns3::TimePrinter')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )*', 'ns3::TimePrinter*')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )&', 'ns3::TimePrinter&')
@@ -2130,8 +2130,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -2486,58 +2486,58 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
@@ -3349,10 +3349,16 @@
     cls.add_method('ExtractNeighborIndex', 
                    'uint32_t', 
                    [param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetEpoch() const [member function]
+    cls.add_method('GetEpoch', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() const [member function]
     cls.add_method('GetRemainingBits', 
                    'uint32_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -3363,6 +3369,10 @@
                    'uint32_t', 
                    [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
+    ## nix-vector.h (module 'network'): void ns3::NixVector::SetEpoch(uint32_t epoch) [member function]
+    cls.add_method('SetEpoch', 
+                   'void', 
+                   [param('uint32_t', 'epoch')])
     return
 
 def register_Ns3Node_methods(root_module, cls):
@@ -3656,10 +3666,11 @@
                    'uint32_t', 
                    [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) const [member function]
     cls.add_method('SetNixVector', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')], 
+                   is_const=True)
     ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
     cls.add_method('ToString', 
                    'std::string', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/topology-read/bindings/modulegen__gcc_LP64.py ns-3.36/src/topology-read/bindings/modulegen__gcc_LP64.py
--- ns-3.35/src/topology-read/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/topology-read/bindings/modulegen__gcc_LP64.py	2022-04-30 18:23:58.162735000 -0700
@@ -152,21 +152,21 @@
     module.add_class('Object', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter >'])
     ## object.h (module 'core'): ns3::Object::AggregateIterator [class]
     module.add_class('AggregateIterator', import_from_module='ns.core', outer_class=root_module['ns3::Object'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
     ## topology-reader.h (module 'topology-read'): ns3::TopologyReader [class]
     module.add_class('TopologyReader', parent=root_module['ns3::Object'])
@@ -283,8 +283,8 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'const ns3::Address &', 'const ns3::Address &', 'ns3::NetDevice::PacketType', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
-    module.add_container('std::map< std::string, std::string >', ('std::string', 'std::string'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, std::string >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'std::basic_string< char, std::char_traits< char >, std::allocator< char > >'), container_type='map')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )', 'ns3::TimePrinter')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )*', 'ns3::TimePrinter*')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )&', 'ns3::TimePrinter&')
@@ -2130,8 +2130,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -2486,58 +2486,58 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
@@ -3349,10 +3349,16 @@
     cls.add_method('ExtractNeighborIndex', 
                    'uint32_t', 
                    [param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetEpoch() const [member function]
+    cls.add_method('GetEpoch', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() const [member function]
     cls.add_method('GetRemainingBits', 
                    'uint32_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -3363,6 +3369,10 @@
                    'uint32_t', 
                    [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
+    ## nix-vector.h (module 'network'): void ns3::NixVector::SetEpoch(uint32_t epoch) [member function]
+    cls.add_method('SetEpoch', 
+                   'void', 
+                   [param('uint32_t', 'epoch')])
     return
 
 def register_Ns3Node_methods(root_module, cls):
@@ -3656,10 +3666,11 @@
                    'uint32_t', 
                    [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) const [member function]
     cls.add_method('SetNixVector', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')], 
+                   is_const=True)
     ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
     cls.add_method('ToString', 
                    'std::string', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/topology-read/CMakeLists.txt ns-3.36/src/topology-read/CMakeLists.txt
--- ns-3.35/src/topology-read/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/topology-read/CMakeLists.txt	2022-04-30 18:23:58.158735000 -0700
@@ -0,0 +1,18 @@
+build_lib(
+  LIBNAME topology-read
+  SOURCE_FILES
+    helper/topology-reader-helper.cc
+    model/inet-topology-reader.cc
+    model/orbis-topology-reader.cc
+    model/rocketfuel-topology-reader.cc
+    model/topology-reader.cc
+  HEADER_FILES
+    helper/topology-reader-helper.h
+    model/inet-topology-reader.h
+    model/orbis-topology-reader.h
+    model/rocketfuel-topology-reader.h
+    model/topology-reader.h
+  LIBRARIES_TO_LINK ${libnetwork}
+                    ${PCRE_LIBRARIES}
+  TEST_SOURCES test/rocketfuel-topology-reader-test-suite.cc
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/topology-read/examples/CMakeLists.txt ns-3.36/src/topology-read/examples/CMakeLists.txt
--- ns-3.35/src/topology-read/examples/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/topology-read/examples/CMakeLists.txt	2022-04-30 18:23:58.162735000 -0700
@@ -0,0 +1,12 @@
+if(PCRE_FOUND)
+  build_lib_example(
+    NAME topology-example-sim
+    SOURCE_FILES topology-example-sim.cc
+    LIBRARIES_TO_LINK
+      ${libtopology-read}
+      ${libinternet}
+      ${libnix-vector-routing}
+      ${libpoint-to-point}
+      ${libapplications}
+  )
+endif()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/topology-read/examples/wscript ns-3.36/src/topology-read/examples/wscript
--- ns-3.35/src/topology-read/examples/wscript	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/topology-read/examples/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,5 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    obj = bld.create_ns3_program('topology-example-sim', ['topology-read', 'internet', 'nix-vector-routing', 'point-to-point', 'applications'])
-    obj.source = 'topology-example-sim.cc'
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/topology-read/model/inet-topology-reader.h ns-3.36/src/topology-read/model/inet-topology-reader.h
--- ns-3.35/src/topology-read/model/inet-topology-reader.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/topology-read/model/inet-topology-reader.h	2022-04-30 18:23:58.162735000 -0700
@@ -61,6 +61,10 @@
   InetTopologyReader ();
   virtual ~InetTopologyReader ();
 
+  // Delete copy constructor and assignment operator to avoid misuse
+  InetTopologyReader (const InetTopologyReader &) = delete;
+  InetTopologyReader & operator = (const InetTopologyReader &) = delete;
+
   /**
    * \brief Main topology reading function.
    *
@@ -75,21 +79,6 @@
    */
   virtual NodeContainer Read (void);
 
-private:
-  /**
-   * \brief Copy constructor
-   *
-   * Defined and unimplemented to avoid misuse.
-   */
-  InetTopologyReader (const InetTopologyReader&);
-  /**
-   * \brief Copy constructor
-   *
-   * Defined and unimplemented to avoid misuse.
-   * \returns
-   */
-  InetTopologyReader& operator= (const InetTopologyReader&);
-
   // end class InetTopologyReader
 };
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/topology-read/model/orbis-topology-reader.h ns-3.36/src/topology-read/model/orbis-topology-reader.h
--- ns-3.35/src/topology-read/model/orbis-topology-reader.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/topology-read/model/orbis-topology-reader.h	2022-04-30 18:23:58.166735000 -0700
@@ -58,6 +58,10 @@
   OrbisTopologyReader ();
   virtual ~OrbisTopologyReader ();
 
+  // Delete copy constructor and assignment operator to avoid misuse
+  OrbisTopologyReader (const OrbisTopologyReader &) = delete;
+  OrbisTopologyReader & operator = (const OrbisTopologyReader &) = delete;
+
   /**
    * \brief Main topology reading function.
    *
@@ -70,22 +74,6 @@
    */
   virtual NodeContainer Read (void);
 
-private:
-private:
-  /**
-   * \brief Copy constructor
-   *
-   * Defined and unimplemented to avoid misuse.
-   */
-  OrbisTopologyReader (const OrbisTopologyReader&);
-  /**
-   * \brief Copy constructor
-   *
-   * Defined and unimplemented to avoid misuse.
-   * \returns
-   */
-  OrbisTopologyReader& operator= (const OrbisTopologyReader&);
-
   // end class OrbisTopologyReader
 };
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/topology-read/model/rocketfuel-topology-reader.cc ns-3.36/src/topology-read/model/rocketfuel-topology-reader.cc
--- ns-3.35/src/topology-read/model/rocketfuel-topology-reader.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/topology-read/model/rocketfuel-topology-reader.cc	2022-04-30 18:23:58.166735000 -0700
@@ -24,7 +24,6 @@
 #include <sstream>
 #include <regex.h>
 #include "ns3/log.h"
-#include "ns3/unused.h"
 #include "ns3/node-container.h"
 #include "rocketfuel-topology-reader.h"
 
@@ -239,8 +238,8 @@
 
   sname = argv[0];
   tname = argv[1];
-  double v = strtod (argv[2], &endptr); // weight
-  NS_UNUSED (v); // suppress "set but not used" compiler warning in optimized builds
+  [[maybe_unused]] double v = strtod (argv[2], &endptr); // weight
+
   if (*endptr != '\0')
     {
       NS_LOG_WARN ("invalid weight: " << argv[2]);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/topology-read/model/rocketfuel-topology-reader.h ns-3.36/src/topology-read/model/rocketfuel-topology-reader.h
--- ns-3.35/src/topology-read/model/rocketfuel-topology-reader.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/topology-read/model/rocketfuel-topology-reader.h	2022-04-30 18:23:58.166735000 -0700
@@ -57,6 +57,10 @@
   RocketfuelTopologyReader ();
   virtual ~RocketfuelTopologyReader ();
 
+  // Delete copy constructor and assignment operator to avoid misuse
+  RocketfuelTopologyReader (const RocketfuelTopologyReader &) = delete;
+  RocketfuelTopologyReader & operator = (const RocketfuelTopologyReader &) = delete;
+
   /**
    * \brief Main topology reading function.
    *
@@ -117,22 +121,6 @@
   int m_nodesNumber; //!< Number of nodes.
   std::map<std::string, Ptr<Node> > m_nodeMap; //!< Map of the nodes (name, node).
 
-private:
-  /**
-   * \brief Copy constructor
-   *
-   * Defined and unimplemented to avoid misuse.
-   */
-  RocketfuelTopologyReader (const RocketfuelTopologyReader&);
-  /**
-   * \brief Copy constructor
-   *
-   * Defined and unimplemented to avoid misuse.
-   * \returns
-   */
-  RocketfuelTopologyReader& operator= (const RocketfuelTopologyReader&);
-
-
   // end class RocketfuelTopologyReader
 };
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/topology-read/model/topology-reader.h ns-3.36/src/topology-read/model/topology-reader.h
--- ns-3.35/src/topology-read/model/topology-reader.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/topology-read/model/topology-reader.h	2022-04-30 18:23:58.166735000 -0700
@@ -149,6 +149,10 @@
   TopologyReader ();
   virtual ~TopologyReader ();
 
+  // Delete copy constructor and assignment operator to avoid misuse
+  TopologyReader (const TopologyReader &) = delete;
+  TopologyReader & operator = (const TopologyReader &) = delete;
+
   /**
    * \brief Main topology reading function.
    *
@@ -205,21 +209,6 @@
   void AddLink (Link link);
 
 private:
-
-  /**
-   * \brief Copy constructor
-   *
-   * Defined and unimplemented to avoid misuse.
-   */
-  TopologyReader (const TopologyReader&);
-  /**
-   * \brief Copy constructor
-   *
-   * Defined and unimplemented to avoid misuse.
-   * \returns
-   */
-  TopologyReader& operator= (const TopologyReader&);
-
   /**
    * The name of the input file.
    */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/topology-read/wscript ns-3.36/src/topology-read/wscript
--- ns-3.35/src/topology-read/wscript	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/topology-read/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,37 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    obj = bld.create_ns3_module('topology-read', ['network'])
-    obj.source = [
-       'model/topology-reader.cc',
-       'model/inet-topology-reader.cc',
-       'model/orbis-topology-reader.cc',
-       'model/rocketfuel-topology-reader.cc',
-       'helper/topology-reader-helper.cc',
-        ]
-
-    module_test = bld.create_ns3_module_test_library('topology-read')
-    module_test.source = [
-        'test/rocketfuel-topology-reader-test-suite.cc',
-        ]
-
-    # Tests encapsulating example programs should be listed here
-    if (bld.env['ENABLE_EXAMPLES']):
-        module_test.source.extend([
-        #   'test/topology-examples-test-suite.cc',
-            ])
-        
-    headers = bld(features='ns3header')
-    headers.module = 'topology-read'
-    headers.source = [
-       'model/topology-reader.h',
-       'model/inet-topology-reader.h',
-       'model/orbis-topology-reader.h',
-       'model/rocketfuel-topology-reader.h',
-       'helper/topology-reader-helper.h',
-        ]
-
-    if bld.env['ENABLE_EXAMPLES']:
-        bld.recurse('examples')
-
-    bld.ns3_python_bindings()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/traffic-control/bindings/callbacks_list.py ns-3.36/src/traffic-control/bindings/callbacks_list.py
--- ns-3.35/src/traffic-control/bindings/callbacks_list.py	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/traffic-control/bindings/callbacks_list.py	2022-04-30 18:23:58.166735000 -0700
@@ -4,9 +4,9 @@
     ['void', 'ns3::Time', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::QueueDiscItem>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::QueueDiscItem>', 'const char *', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'long', 'long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'bool', 'bool', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'const ns3::Address &', 'const ns3::Address &', 'ns3::NetDevice::PacketType', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
 ]
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/traffic-control/bindings/modulegen__gcc_ILP32.py ns-3.36/src/traffic-control/bindings/modulegen__gcc_ILP32.py
--- ns-3.35/src/traffic-control/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/traffic-control/bindings/modulegen__gcc_ILP32.py	2022-04-30 18:23:58.166735000 -0700
@@ -77,6 +77,8 @@
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::TraceSourceAccessor'])
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'], import_from_module='ns.core')
     ## hash.h (module 'core'): ns3::Hasher [class]
     module.add_class('Hasher', import_from_module='ns.core')
     ## int-to-type.h (module 'core'): ns3::IntToType<0> [struct]
@@ -273,25 +275,25 @@
     module.add_enum('', ['DTYPE_NONE', 'DTYPE_FORCED', 'DTYPE_UNFORCED'], outer_class=root_module['ns3::RedQueueDisc'])
     ## random-variable-stream.h (module 'core'): ns3::SequentialRandomVariable [class]
     module.add_class('SequentialRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::QueueItem', 'ns3::empty', 'ns3::DefaultDeleter<ns3::QueueItem>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
     ## tbf-queue-disc.h (module 'traffic-control'): ns3::TbfQueueDisc [class]
     module.add_class('TbfQueueDisc', parent=root_module['ns3::QueueDisc'])
@@ -533,11 +535,11 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned int', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## queue-item.h (module 'network'): ns3::QueueDiscItem [class]
     module.add_class('QueueDiscItem', import_from_module='ns.network', parent=root_module['ns3::QueueItem'])
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     module.add_container('std::vector< ns3::Ptr< ns3::QueueDisc > >', 'ns3::Ptr< ns3::QueueDisc >', container_type='vector')
     module.add_container('std::vector< unsigned short >', 'short unsigned int', container_type='vector')
-    module.add_container('std::map< std::string, unsigned int >', ('std::string', 'unsigned int'), container_type='map')
-    module.add_container('std::map< std::string, unsigned long long >', ('std::string', 'long unsigned int'), container_type='map')
+    module.add_container('std::map< std::basic_string< char >, unsigned int, std::less< void >, std::allocator< std::pair< std::basic_string< char > const, unsigned int > > >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'unsigned int'), container_type='map')
+    module.add_container('std::map< std::basic_string< char >, unsigned long long, std::less< void >, std::allocator< std::pair< std::basic_string< char > const, unsigned long long > > >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'long unsigned int'), container_type='map')
     typehandlers.add_type_alias('std::array< unsigned short, 16 >', 'ns3::Priomap')
     typehandlers.add_type_alias('std::array< unsigned short, 16 >*', 'ns3::Priomap*')
     typehandlers.add_type_alias('std::array< unsigned short, 16 >&', 'ns3::Priomap&')
@@ -2710,7 +2712,7 @@
     cls.add_method('AddQueueDiscClass', 
                    'uint16_t', 
                    [param('ns3::ObjectFactory', 'factory')])
-    ## traffic-control-helper.h (module 'traffic-control'): ns3::Ptr<ns3::QueueDisc> ns3::QueueDiscFactory::CreateQueueDisc(std::vector<ns3::Ptr<ns3::QueueDisc>, std::allocator<ns3::Ptr<ns3::QueueDisc> > > const & queueDiscs) [member function]
+    ## traffic-control-helper.h (module 'traffic-control'): ns3::Ptr<ns3::QueueDisc> ns3::QueueDiscFactory::CreateQueueDisc(std::vector<ns3::Ptr<ns3::QueueDisc>, std::allocator<ns3::Ptr<ns3::QueueDisc>>> const & queueDiscs) [member function]
     cls.add_method('CreateQueueDisc', 
                    'ns3::Ptr< ns3::QueueDisc >', 
                    [param('std::vector< ns3::Ptr< ns3::QueueDisc > > const &', 'queueDiscs')])
@@ -3370,8 +3372,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -3599,14 +3601,14 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('>=')
     cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_unary_numeric_operator('-')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
     cls.add_constructor([])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(double const value) [constructor]
@@ -3625,6 +3627,8 @@
     cls.add_constructor([param('long unsigned int const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int const v) [constructor]
     cls.add_constructor([param('long long unsigned int const', 'v')])
+    ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int128_t const v) [constructor]
+    cls.add_constructor([param('int128_t const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t const hi, uint64_t const lo) [constructor]
     cls.add_constructor([param('int64_t const', 'hi'), param('uint64_t const', 'lo')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [constructor]
@@ -3925,6 +3929,11 @@
     cls.add_method('SetMaxSize', 
                    'void', 
                    [param('ns3::QueueSize', 'size')])
+    ## queue.h (module 'network'): bool ns3::QueueBase::WouldOverflow(uint32_t nPackets, uint32_t nBytes) const [member function]
+    cls.add_method('WouldOverflow', 
+                   'bool', 
+                   [param('uint32_t', 'nPackets'), param('uint32_t', 'nBytes')], 
+                   is_const=True)
     return
 
 def register_Ns3QueueDisc_methods(root_module, cls):
@@ -3932,7 +3941,7 @@
     cls.add_constructor([param('ns3::QueueDiscSizePolicy', 'policy', default_value='::ns3::QueueDiscSizePolicy::SINGLE_INTERNAL_QUEUE')])
     ## queue-disc.h (module 'traffic-control'): ns3::QueueDisc::QueueDisc(ns3::QueueDiscSizePolicy policy, ns3::QueueSizeUnit unit) [constructor]
     cls.add_constructor([param('ns3::QueueDiscSizePolicy', 'policy'), param('ns3::QueueSizeUnit', 'unit')])
-    ## queue-disc.h (module 'traffic-control'): void ns3::QueueDisc::AddInternalQueue(ns3::Ptr<ns3::Queue<ns3::QueueDiscItem> > queue) [member function]
+    ## queue-disc.h (module 'traffic-control'): void ns3::QueueDisc::AddInternalQueue(ns3::Ptr<ns3::Queue<ns3::QueueDiscItem>> queue) [member function]
     cls.add_method('AddInternalQueue', 
                    'void', 
                    [param('ns3::Ptr< ns3::Queue< ns3::QueueDiscItem > >', 'queue')])
@@ -3960,7 +3969,7 @@
     cls.add_method('GetCurrentSize', 
                    'ns3::QueueSize', 
                    [])
-    ## queue-disc.h (module 'traffic-control'): ns3::Ptr<ns3::Queue<ns3::QueueDiscItem> > ns3::QueueDisc::GetInternalQueue(std::size_t i) const [member function]
+    ## queue-disc.h (module 'traffic-control'): ns3::Ptr<ns3::Queue<ns3::QueueDiscItem>> ns3::QueueDisc::GetInternalQueue(std::size_t i) const [member function]
     cls.add_method('GetInternalQueue', 
                    'ns3::Ptr< ns3::Queue< ns3::QueueDiscItem > >', 
                    [param('std::size_t', 'i')], 
@@ -4149,17 +4158,17 @@
                    [param('std::ostream &', 'os')], 
                    is_const=True)
     ## queue-disc.h (module 'traffic-control'): ns3::QueueDisc::Stats::nDroppedBytesAfterDequeue [variable]
-    cls.add_instance_attribute('nDroppedBytesAfterDequeue', 'std::map< std::string, unsigned long long >', is_const=False)
+    cls.add_instance_attribute('nDroppedBytesAfterDequeue', 'std::map< std::basic_string< char >, unsigned long long, std::less< void >, std::allocator< std::pair< std::basic_string< char > const, unsigned long long > > >', is_const=False)
     ## queue-disc.h (module 'traffic-control'): ns3::QueueDisc::Stats::nDroppedBytesBeforeEnqueue [variable]
-    cls.add_instance_attribute('nDroppedBytesBeforeEnqueue', 'std::map< std::string, unsigned long long >', is_const=False)
+    cls.add_instance_attribute('nDroppedBytesBeforeEnqueue', 'std::map< std::basic_string< char >, unsigned long long, std::less< void >, std::allocator< std::pair< std::basic_string< char > const, unsigned long long > > >', is_const=False)
     ## queue-disc.h (module 'traffic-control'): ns3::QueueDisc::Stats::nDroppedPacketsAfterDequeue [variable]
-    cls.add_instance_attribute('nDroppedPacketsAfterDequeue', 'std::map< std::string, unsigned int >', is_const=False)
+    cls.add_instance_attribute('nDroppedPacketsAfterDequeue', 'std::map< std::basic_string< char >, unsigned int, std::less< void >, std::allocator< std::pair< std::basic_string< char > const, unsigned int > > >', is_const=False)
     ## queue-disc.h (module 'traffic-control'): ns3::QueueDisc::Stats::nDroppedPacketsBeforeEnqueue [variable]
-    cls.add_instance_attribute('nDroppedPacketsBeforeEnqueue', 'std::map< std::string, unsigned int >', is_const=False)
+    cls.add_instance_attribute('nDroppedPacketsBeforeEnqueue', 'std::map< std::basic_string< char >, unsigned int, std::less< void >, std::allocator< std::pair< std::basic_string< char > const, unsigned int > > >', is_const=False)
     ## queue-disc.h (module 'traffic-control'): ns3::QueueDisc::Stats::nMarkedBytes [variable]
-    cls.add_instance_attribute('nMarkedBytes', 'std::map< std::string, unsigned long long >', is_const=False)
+    cls.add_instance_attribute('nMarkedBytes', 'std::map< std::basic_string< char >, unsigned long long, std::less< void >, std::allocator< std::pair< std::basic_string< char > const, unsigned long long > > >', is_const=False)
     ## queue-disc.h (module 'traffic-control'): ns3::QueueDisc::Stats::nMarkedPackets [variable]
-    cls.add_instance_attribute('nMarkedPackets', 'std::map< std::string, unsigned int >', is_const=False)
+    cls.add_instance_attribute('nMarkedPackets', 'std::map< std::basic_string< char >, unsigned int, std::less< void >, std::allocator< std::pair< std::basic_string< char > const, unsigned int > > >', is_const=False)
     ## queue-disc.h (module 'traffic-control'): ns3::QueueDisc::Stats::nTotalDequeuedBytes [variable]
     cls.add_instance_attribute('nTotalDequeuedBytes', 'uint64_t', is_const=False)
     ## queue-disc.h (module 'traffic-control'): ns3::QueueDisc::Stats::nTotalDequeuedPackets [variable]
@@ -4396,72 +4405,72 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3QueueItem_Ns3Empty_Ns3DefaultDeleter__lt__ns3QueueItem__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> >::SimpleRefCount(ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>>::SimpleRefCount(ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::QueueItem, ns3::empty, ns3::DefaultDeleter< ns3::QueueItem > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
@@ -6496,10 +6505,16 @@
     cls.add_method('ExtractNeighborIndex', 
                    'uint32_t', 
                    [param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetEpoch() const [member function]
+    cls.add_method('GetEpoch', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() const [member function]
     cls.add_method('GetRemainingBits', 
                    'uint32_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -6510,6 +6525,10 @@
                    'uint32_t', 
                    [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
+    ## nix-vector.h (module 'network'): void ns3::NixVector::SetEpoch(uint32_t epoch) [member function]
+    cls.add_method('SetEpoch', 
+                   'void', 
+                   [param('uint32_t', 'epoch')])
     return
 
 def register_Ns3Node_methods(root_module, cls):
@@ -6873,10 +6892,11 @@
                    'uint32_t', 
                    [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) const [member function]
     cls.add_method('SetNixVector', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')], 
+                   is_const=True)
     ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
     cls.add_method('ToString', 
                    'std::string', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/traffic-control/bindings/modulegen__gcc_LP64.py ns-3.36/src/traffic-control/bindings/modulegen__gcc_LP64.py
--- ns-3.35/src/traffic-control/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/traffic-control/bindings/modulegen__gcc_LP64.py	2022-04-30 18:23:58.166735000 -0700
@@ -77,6 +77,8 @@
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::TraceSourceAccessor'])
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'], import_from_module='ns.core')
     ## hash.h (module 'core'): ns3::Hasher [class]
     module.add_class('Hasher', import_from_module='ns.core')
     ## int-to-type.h (module 'core'): ns3::IntToType<0> [struct]
@@ -273,25 +275,25 @@
     module.add_enum('', ['DTYPE_NONE', 'DTYPE_FORCED', 'DTYPE_UNFORCED'], outer_class=root_module['ns3::RedQueueDisc'])
     ## random-variable-stream.h (module 'core'): ns3::SequentialRandomVariable [class]
     module.add_class('SequentialRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::QueueItem', 'ns3::empty', 'ns3::DefaultDeleter<ns3::QueueItem>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
     ## tbf-queue-disc.h (module 'traffic-control'): ns3::TbfQueueDisc [class]
     module.add_class('TbfQueueDisc', parent=root_module['ns3::QueueDisc'])
@@ -533,11 +535,11 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned int', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## queue-item.h (module 'network'): ns3::QueueDiscItem [class]
     module.add_class('QueueDiscItem', import_from_module='ns.network', parent=root_module['ns3::QueueItem'])
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     module.add_container('std::vector< ns3::Ptr< ns3::QueueDisc > >', 'ns3::Ptr< ns3::QueueDisc >', container_type='vector')
     module.add_container('std::vector< unsigned short >', 'short unsigned int', container_type='vector')
-    module.add_container('std::map< std::string, unsigned int >', ('std::string', 'unsigned int'), container_type='map')
-    module.add_container('std::map< std::string, unsigned long >', ('std::string', 'long unsigned int'), container_type='map')
+    module.add_container('std::map< std::basic_string< char >, unsigned int, std::less< void >, std::allocator< std::pair< std::basic_string< char > const, unsigned int > > >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'unsigned int'), container_type='map')
+    module.add_container('std::map< std::basic_string< char >, unsigned long, std::less< void >, std::allocator< std::pair< std::basic_string< char > const, unsigned long > > >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'long unsigned int'), container_type='map')
     typehandlers.add_type_alias('std::array< unsigned short, 16 >', 'ns3::Priomap')
     typehandlers.add_type_alias('std::array< unsigned short, 16 >*', 'ns3::Priomap*')
     typehandlers.add_type_alias('std::array< unsigned short, 16 >&', 'ns3::Priomap&')
@@ -2710,7 +2712,7 @@
     cls.add_method('AddQueueDiscClass', 
                    'uint16_t', 
                    [param('ns3::ObjectFactory', 'factory')])
-    ## traffic-control-helper.h (module 'traffic-control'): ns3::Ptr<ns3::QueueDisc> ns3::QueueDiscFactory::CreateQueueDisc(std::vector<ns3::Ptr<ns3::QueueDisc>, std::allocator<ns3::Ptr<ns3::QueueDisc> > > const & queueDiscs) [member function]
+    ## traffic-control-helper.h (module 'traffic-control'): ns3::Ptr<ns3::QueueDisc> ns3::QueueDiscFactory::CreateQueueDisc(std::vector<ns3::Ptr<ns3::QueueDisc>, std::allocator<ns3::Ptr<ns3::QueueDisc>>> const & queueDiscs) [member function]
     cls.add_method('CreateQueueDisc', 
                    'ns3::Ptr< ns3::QueueDisc >', 
                    [param('std::vector< ns3::Ptr< ns3::QueueDisc > > const &', 'queueDiscs')])
@@ -3370,8 +3372,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -3599,14 +3601,14 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('>=')
     cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_unary_numeric_operator('-')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
     cls.add_constructor([])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(double const value) [constructor]
@@ -3625,6 +3627,8 @@
     cls.add_constructor([param('long unsigned int const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int const v) [constructor]
     cls.add_constructor([param('long long unsigned int const', 'v')])
+    ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int128_t const v) [constructor]
+    cls.add_constructor([param('int128_t const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t const hi, uint64_t const lo) [constructor]
     cls.add_constructor([param('int64_t const', 'hi'), param('uint64_t const', 'lo')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [constructor]
@@ -3925,6 +3929,11 @@
     cls.add_method('SetMaxSize', 
                    'void', 
                    [param('ns3::QueueSize', 'size')])
+    ## queue.h (module 'network'): bool ns3::QueueBase::WouldOverflow(uint32_t nPackets, uint32_t nBytes) const [member function]
+    cls.add_method('WouldOverflow', 
+                   'bool', 
+                   [param('uint32_t', 'nPackets'), param('uint32_t', 'nBytes')], 
+                   is_const=True)
     return
 
 def register_Ns3QueueDisc_methods(root_module, cls):
@@ -3932,7 +3941,7 @@
     cls.add_constructor([param('ns3::QueueDiscSizePolicy', 'policy', default_value='::ns3::QueueDiscSizePolicy::SINGLE_INTERNAL_QUEUE')])
     ## queue-disc.h (module 'traffic-control'): ns3::QueueDisc::QueueDisc(ns3::QueueDiscSizePolicy policy, ns3::QueueSizeUnit unit) [constructor]
     cls.add_constructor([param('ns3::QueueDiscSizePolicy', 'policy'), param('ns3::QueueSizeUnit', 'unit')])
-    ## queue-disc.h (module 'traffic-control'): void ns3::QueueDisc::AddInternalQueue(ns3::Ptr<ns3::Queue<ns3::QueueDiscItem> > queue) [member function]
+    ## queue-disc.h (module 'traffic-control'): void ns3::QueueDisc::AddInternalQueue(ns3::Ptr<ns3::Queue<ns3::QueueDiscItem>> queue) [member function]
     cls.add_method('AddInternalQueue', 
                    'void', 
                    [param('ns3::Ptr< ns3::Queue< ns3::QueueDiscItem > >', 'queue')])
@@ -3960,7 +3969,7 @@
     cls.add_method('GetCurrentSize', 
                    'ns3::QueueSize', 
                    [])
-    ## queue-disc.h (module 'traffic-control'): ns3::Ptr<ns3::Queue<ns3::QueueDiscItem> > ns3::QueueDisc::GetInternalQueue(std::size_t i) const [member function]
+    ## queue-disc.h (module 'traffic-control'): ns3::Ptr<ns3::Queue<ns3::QueueDiscItem>> ns3::QueueDisc::GetInternalQueue(std::size_t i) const [member function]
     cls.add_method('GetInternalQueue', 
                    'ns3::Ptr< ns3::Queue< ns3::QueueDiscItem > >', 
                    [param('std::size_t', 'i')], 
@@ -4149,17 +4158,17 @@
                    [param('std::ostream &', 'os')], 
                    is_const=True)
     ## queue-disc.h (module 'traffic-control'): ns3::QueueDisc::Stats::nDroppedBytesAfterDequeue [variable]
-    cls.add_instance_attribute('nDroppedBytesAfterDequeue', 'std::map< std::string, unsigned long >', is_const=False)
+    cls.add_instance_attribute('nDroppedBytesAfterDequeue', 'std::map< std::basic_string< char >, unsigned long, std::less< void >, std::allocator< std::pair< std::basic_string< char > const, unsigned long > > >', is_const=False)
     ## queue-disc.h (module 'traffic-control'): ns3::QueueDisc::Stats::nDroppedBytesBeforeEnqueue [variable]
-    cls.add_instance_attribute('nDroppedBytesBeforeEnqueue', 'std::map< std::string, unsigned long >', is_const=False)
+    cls.add_instance_attribute('nDroppedBytesBeforeEnqueue', 'std::map< std::basic_string< char >, unsigned long, std::less< void >, std::allocator< std::pair< std::basic_string< char > const, unsigned long > > >', is_const=False)
     ## queue-disc.h (module 'traffic-control'): ns3::QueueDisc::Stats::nDroppedPacketsAfterDequeue [variable]
-    cls.add_instance_attribute('nDroppedPacketsAfterDequeue', 'std::map< std::string, unsigned int >', is_const=False)
+    cls.add_instance_attribute('nDroppedPacketsAfterDequeue', 'std::map< std::basic_string< char >, unsigned int, std::less< void >, std::allocator< std::pair< std::basic_string< char > const, unsigned int > > >', is_const=False)
     ## queue-disc.h (module 'traffic-control'): ns3::QueueDisc::Stats::nDroppedPacketsBeforeEnqueue [variable]
-    cls.add_instance_attribute('nDroppedPacketsBeforeEnqueue', 'std::map< std::string, unsigned int >', is_const=False)
+    cls.add_instance_attribute('nDroppedPacketsBeforeEnqueue', 'std::map< std::basic_string< char >, unsigned int, std::less< void >, std::allocator< std::pair< std::basic_string< char > const, unsigned int > > >', is_const=False)
     ## queue-disc.h (module 'traffic-control'): ns3::QueueDisc::Stats::nMarkedBytes [variable]
-    cls.add_instance_attribute('nMarkedBytes', 'std::map< std::string, unsigned long >', is_const=False)
+    cls.add_instance_attribute('nMarkedBytes', 'std::map< std::basic_string< char >, unsigned long, std::less< void >, std::allocator< std::pair< std::basic_string< char > const, unsigned long > > >', is_const=False)
     ## queue-disc.h (module 'traffic-control'): ns3::QueueDisc::Stats::nMarkedPackets [variable]
-    cls.add_instance_attribute('nMarkedPackets', 'std::map< std::string, unsigned int >', is_const=False)
+    cls.add_instance_attribute('nMarkedPackets', 'std::map< std::basic_string< char >, unsigned int, std::less< void >, std::allocator< std::pair< std::basic_string< char > const, unsigned int > > >', is_const=False)
     ## queue-disc.h (module 'traffic-control'): ns3::QueueDisc::Stats::nTotalDequeuedBytes [variable]
     cls.add_instance_attribute('nTotalDequeuedBytes', 'uint64_t', is_const=False)
     ## queue-disc.h (module 'traffic-control'): ns3::QueueDisc::Stats::nTotalDequeuedPackets [variable]
@@ -4396,72 +4405,72 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3QueueItem_Ns3Empty_Ns3DefaultDeleter__lt__ns3QueueItem__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> >::SimpleRefCount(ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>>::SimpleRefCount(ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::QueueItem, ns3::empty, ns3::DefaultDeleter< ns3::QueueItem > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
@@ -6496,10 +6505,16 @@
     cls.add_method('ExtractNeighborIndex', 
                    'uint32_t', 
                    [param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetEpoch() const [member function]
+    cls.add_method('GetEpoch', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() const [member function]
     cls.add_method('GetRemainingBits', 
                    'uint32_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -6510,6 +6525,10 @@
                    'uint32_t', 
                    [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
+    ## nix-vector.h (module 'network'): void ns3::NixVector::SetEpoch(uint32_t epoch) [member function]
+    cls.add_method('SetEpoch', 
+                   'void', 
+                   [param('uint32_t', 'epoch')])
     return
 
 def register_Ns3Node_methods(root_module, cls):
@@ -6873,10 +6892,11 @@
                    'uint32_t', 
                    [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) const [member function]
     cls.add_method('SetNixVector', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')], 
+                   is_const=True)
     ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
     cls.add_method('ToString', 
                    'std::string', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/traffic-control/CMakeLists.txt ns-3.36/src/traffic-control/CMakeLists.txt
--- ns-3.35/src/traffic-control/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/traffic-control/CMakeLists.txt	2022-04-30 18:23:58.166735000 -0700
@@ -0,0 +1,54 @@
+build_lib(
+  LIBNAME traffic-control
+  SOURCE_FILES
+    helper/queue-disc-container.cc
+    helper/traffic-control-helper.cc
+    model/cobalt-queue-disc.cc
+    model/codel-queue-disc.cc
+    model/fifo-queue-disc.cc
+    model/fq-cobalt-queue-disc.cc
+    model/fq-codel-queue-disc.cc
+    model/fq-pie-queue-disc.cc
+    model/mq-queue-disc.cc
+    model/packet-filter.cc
+    model/pfifo-fast-queue-disc.cc
+    model/pie-queue-disc.cc
+    model/prio-queue-disc.cc
+    model/queue-disc.cc
+    model/red-queue-disc.cc
+    model/tbf-queue-disc.cc
+    model/traffic-control-layer.cc
+  HEADER_FILES
+    helper/queue-disc-container.h
+    helper/traffic-control-helper.h
+    model/cobalt-queue-disc.h
+    model/codel-queue-disc.h
+    model/fifo-queue-disc.h
+    model/fq-cobalt-queue-disc.h
+    model/fq-codel-queue-disc.h
+    model/fq-pie-queue-disc.h
+    model/mq-queue-disc.h
+    model/packet-filter.h
+    model/pfifo-fast-queue-disc.h
+    model/pie-queue-disc.h
+    model/prio-queue-disc.h
+    model/queue-disc.h
+    model/red-queue-disc.h
+    model/tbf-queue-disc.h
+    model/traffic-control-layer.h
+  LIBRARIES_TO_LINK
+    ${libnetwork}
+    ${libcore}
+    ${libconfig-store}
+  TEST_SOURCES
+    test/adaptive-red-queue-disc-test-suite.cc
+    test/cobalt-queue-disc-test-suite.cc
+    test/codel-queue-disc-test-suite.cc
+    test/fifo-queue-disc-test-suite.cc
+    test/pie-queue-disc-test-suite.cc
+    test/prio-queue-disc-test-suite.cc
+    test/queue-disc-traces-test-suite.cc
+    test/red-queue-disc-test-suite.cc
+    test/tbf-queue-disc-test-suite.cc
+    test/tc-flow-control-test-suite.cc
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/traffic-control/doc/cobalt.rst ns-3.36/src/traffic-control/doc/cobalt.rst
--- ns-3.35/src/traffic-control/doc/cobalt.rst	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/traffic-control/doc/cobalt.rst	2022-04-30 18:23:58.166735000 -0700
@@ -109,7 +109,7 @@
 
 ::
 
-   $ ./waf --run cobalt-vs-codel
+   $ ./ns3 run cobalt-vs-codel
 
 
 Validation
@@ -129,13 +129,13 @@
 
 ::
 
-  $ ./waf configure --enable-examples --enable-tests
-  $ ./waf build
+  $ ./ns3 configure --enable-examples --enable-tests
+  $ ./ns3 build
   $ ./test.py -s cobalt-queue-disc
 
 or
 
 ::
 
-  $ NS_LOG="CobaltQueueDisc" ./waf --run "test-runner --suite=cobalt-queue-disc"
+  $ NS_LOG="CobaltQueueDisc" ./ns3 run "test-runner --suite=cobalt-queue-disc"
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/traffic-control/doc/codel.rst ns-3.36/src/traffic-control/doc/codel.rst
--- ns-3.35/src/traffic-control/doc/codel.rst	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/traffic-control/doc/codel.rst	2022-04-30 18:23:58.166735000 -0700
@@ -82,8 +82,8 @@
 
 .. sourcecode:: bash
 
-   $ ./waf --run "codel-vs-pfifo-basic-test --PrintHelp"
-   $ ./waf --run "codel-vs-pfifo-basic-test --queueType=CoDel --pcapFileName=codel.pcap --cwndTrFileName=cwndCodel.tr" 
+   $ ./ns3 run "codel-vs-pfifo-basic-test --PrintHelp"
+   $ ./ns3 run "codel-vs-pfifo-basic-test --queueType=CoDel --pcapFileName=codel.pcap --cwndTrFileName=cwndCodel.tr"
 
 The expected output from the previous commands are two files: `codel.pcap` file and `cwndCoDel.tr` (ASCII trace) file The .pcap file can be analyzed using 
 wireshark or tcptrace:
@@ -97,8 +97,8 @@
 
 .. sourcecode:: bash
 
-   $ ./waf --run "codel-vs-pfifo-asymmetric --PrintHelp"
-   $ ./waf --run codel-vs-pfifo-asymmetric
+   $ ./ns3 run "codel-vs-pfifo-asymmetric --PrintHelp"
+   $ ./ns3 run codel-vs-pfifo-asymmetric
 
 The expected output from the previous commands is six pcap files:
 
@@ -137,13 +137,13 @@
 
 .. sourcecode:: bash
 
-  $ ./waf configure --enable-examples --enable-tests
-  $ ./waf build
+  $ ./ns3 configure --enable-examples --enable-tests
+  $ ./ns3 build
   $ ./test.py -s codel-queue-disc
 
 or  
 
 .. sourcecode:: bash
 
-  $ NS_LOG="CoDelQueueDisc" ./waf --run "test-runner --suite=codel-queue-disc"
+  $ NS_LOG="CoDelQueueDisc" ./ns3 run "test-runner --suite=codel-queue-disc"
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/traffic-control/doc/fq-cobalt.rst ns-3.36/src/traffic-control/doc/fq-cobalt.rst
--- ns-3.35/src/traffic-control/doc/fq-cobalt.rst	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/traffic-control/doc/fq-cobalt.rst	2022-04-30 18:23:58.166735000 -0700
@@ -74,10 +74,10 @@
 The tests are similar to the ones for FqCoDel queue disc mentioned in first section of this document.
 The test suite can be run using the following commands::
 
-  $ ./waf configure --enable-examples --enable-tests
-  $ ./waf build
+  $ ./ns3 configure --enable-examples --enable-tests
+  $ ./ns3 build
   $ ./test.py -s fq-cobalt-queue-disc
 
 or::
 
-  $ NS_LOG="FqCobaltQueueDisc" ./waf --run "test-runner --suite=fq-cobalt-queue-disc"
+  $ NS_LOG="FqCobaltQueueDisc" ./ns3 run "test-runner --suite=fq-cobalt-queue-disc"
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/traffic-control/doc/fq-codel.rst ns-3.36/src/traffic-control/doc/fq-codel.rst
--- ns-3.35/src/traffic-control/doc/fq-codel.rst	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/traffic-control/doc/fq-codel.rst	2022-04-30 18:23:58.166735000 -0700
@@ -131,8 +131,8 @@
 
 .. sourcecode:: bash
 
-   $ ./waf --run "FqCoDel-L4S-example --PrintHelp"
-   $ ./waf --run "FqCoDel-L4S-example --scenarioNum=5" 
+   $ ./ns3 run "FqCoDel-L4S-example --PrintHelp"
+   $ ./ns3 run "FqCoDel-L4S-example --scenarioNum=5"
 
 The expected output from the previous command are .dat files.
 
@@ -154,15 +154,15 @@
 
 .. sourcecode:: bash
 
-   $ ./waf configure --enable-examples --enable-tests
-   $ ./waf build
+   $ ./ns3 configure --enable-examples --enable-tests
+   $ ./ns3 build
    $ ./test.py -s fq-codel-queue-disc
 
 or:
 
 .. sourcecode:: bash
 
-   $ NS_LOG="FqCoDelQueueDisc" ./waf --run "test-runner --suite=fq-codel-queue-disc"
+   $ NS_LOG="FqCoDelQueueDisc" ./ns3 run "test-runner --suite=fq-codel-queue-disc"
 
 Set associative hashing is tested by generating a probability collision graph. 
 This graph is then overlapped with the theoretical graph provided in the original 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/traffic-control/doc/fq-pie.rst ns-3.36/src/traffic-control/doc/fq-pie.rst
--- ns-3.35/src/traffic-control/doc/fq-pie.rst	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/traffic-control/doc/fq-pie.rst	2022-04-30 18:23:58.166735000 -0700
@@ -89,10 +89,10 @@
 The tests are similar to the ones for FqCoDel queue disc mentioned in first section of this document.
 The test suite can be run using the following commands::
 
-  $ ./waf configure --enable-examples --enable-tests
-  $ ./waf build
+  $ ./ns3 configure --enable-examples --enable-tests
+  $ ./ns3 build
   $ ./test.py -s fq-pie-queue-disc
 
 or::
 
-  $ NS_LOG="FqPieQueueDisc" ./waf --run "test-runner --suite=fq-pie-queue-disc"
+  $ NS_LOG="FqPieQueueDisc" ./ns3 run "test-runner --suite=fq-pie-queue-disc"
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/traffic-control/doc/mq.rst ns-3.36/src/traffic-control/doc/mq.rst
--- ns-3.35/src/traffic-control/doc/mq.rst	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/traffic-control/doc/mq.rst	2022-04-30 18:23:58.166735000 -0700
@@ -70,13 +70,13 @@
 
 ::
 
-  $ ./waf configure --enable-examples --enable-tests
-  $ ./waf build
+  $ ./ns3 configure --enable-examples --enable-tests
+  $ ./ns3 build
   $ ./test.py -s ns3-wifi-ac-mapping
 
 or
 
 ::
 
-  $ NS_LOG="WifiAcMappingTest" ./waf --run "test-runner --suite=ns3-wifi-ac-mapping"
+  $ NS_LOG="WifiAcMappingTest" ./ns3 run "test-runner --suite=ns3-wifi-ac-mapping"
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/traffic-control/doc/pie.rst ns-3.36/src/traffic-control/doc/pie.rst
--- ns-3.35/src/traffic-control/doc/pie.rst	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/traffic-control/doc/pie.rst	2022-04-30 18:23:58.166735000 -0700
@@ -72,8 +72,8 @@
 
 .. sourcecode:: bash
 
-   $ ./waf --run "pie-example --PrintHelp"
-   $ ./waf --run "pie-example --writePcap=1" 
+   $ ./ns3 run "pie-example --PrintHelp"
+   $ ./ns3 run "pie-example --writePcap=1"
 
 The expected output from the previous commands are ten .pcap files.
 
@@ -103,13 +103,13 @@
 
 .. sourcecode:: bash
 
-  $ ./waf configure --enable-examples --enable-tests
-  $ ./waf build
+  $ ./ns3 configure --enable-examples --enable-tests
+  $ ./ns3 build
   $ ./test.py -s pie-queue-disc
 
 or alternatively (to see logging statements in a debug build):  
 
 .. sourcecode:: bash
 
-  $ NS_LOG="PieQueueDisc" ./waf --run "test-runner --suite=pie-queue-disc"
+  $ NS_LOG="PieQueueDisc" ./ns3 run "test-runner --suite=pie-queue-disc"
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/traffic-control/doc/prio.rst ns-3.36/src/traffic-control/doc/prio.rst
--- ns-3.35/src/traffic-control/doc/prio.rst	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/traffic-control/doc/prio.rst	2022-04-30 18:23:58.166735000 -0700
@@ -63,12 +63,12 @@
 
 .. sourcecode:: bash
 
-  $ ./waf configure --enable-examples --enable-tests
-  $ ./waf build
+  $ ./ns3 configure --enable-examples --enable-tests
+  $ ./ns3 build
   $ ./test.py -s prio-queue-disc
 
 or
 
 .. sourcecode:: bash
 
-  $ NS_LOG="PrioQueueDisc" ./waf --run "test-runner --suite=prio-queue-disc"
+  $ NS_LOG="PrioQueueDisc" ./ns3 run "test-runner --suite=prio-queue-disc"
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/traffic-control/doc/queue-discs.rst ns-3.36/src/traffic-control/doc/queue-discs.rst
--- ns-3.35/src/traffic-control/doc/queue-discs.rst	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/traffic-control/doc/queue-discs.rst	2022-04-30 18:23:58.166735000 -0700
@@ -187,6 +187,20 @@
 queue disc on the device.  By uninstalling without adding a new queue disc, it is also possible
 to have no queue disc installed on a device.
 
+Note that if no queue disc is installed on an underlying device, the traffic
+control layer will still respect flow control signals provided by the device, if
+any.  Specifically, if no queue disc is installed on a device, and the device is
+stopped, then any packet for that device will be dropped in the traffic control
+layer, and the device's drop trace will not record the drop -- instead, the TcDrop
+drop trace in the traffic control layer will record the drop.
+
+Flow control can be disabled for the devices that support it by using the
+``DisableFlowControl`` method of their helpers.  If there is no queue disc
+installed on the device, and the device is not performing flow control, then
+packets will immediately transit the traffic control layer and be sent to the
+device, regardless or not of whether the device's internal queue can accept it,
+and the traffic control layer's TcDrop trace will not be called.
+
 Helpers
 =======
 
@@ -213,7 +227,24 @@
 
 For this helper's configuration to take effect, it should be added to the ns-3 program after
 ``InternetStackHelper::Install()`` is called, but before IP addresses are configured using 
-``Ipv{4,6}AddressHelper``.
+``Ipv{4,6}AddressHelper``. For an example program, see examples/traffic-control/traffic-control.cc.
+
+If it is desired to install no queue disc on a device, it is necessary to use the Uninstall
+method of the TrafficControlHelper:
+
+.. sourcecode:: cpp
+
+  TrafficControlHelper tch;
+  tch.Uninstall (device);
+
+Note that the Uninstall method must be called after ``InternetStackHelper::Install()`` is called
+and after that IP addresses are configured using ``Ipv{4,6}AddressHelper``. For an example program,
+see src/test/ns3tcp/ns3tcp-cwnd-test-suite.cc (look at the ``Ns3TcpCwndTestCase2::DoRun`` method).
+Note also that this method does not uninstall the traffic control layer but instead
+removes the root queue disc on the device but keeps the traffic control layer present.
+Also, note that removing the root queue disc on a device supporting flow control does not disable
+the flow control. As mentioned above, this requires to call the DisableFlowControl method of the
+device helper, so that the device is created without support for the flow control.
 
 Implementation details
 **********************
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/traffic-control/doc/tbf.rst ns-3.36/src/traffic-control/doc/tbf.rst
--- ns-3.35/src/traffic-control/doc/tbf.rst	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/traffic-control/doc/tbf.rst	2022-04-30 18:23:58.166735000 -0700
@@ -113,8 +113,8 @@
 
 .. sourcecode:: bash
 
-   $ ./waf --run "tbf-example --PrintHelp"
-   $ ./waf --run "tbf-example --burst=125000 --rate=1Mbps --peakRate=1.5Mbps"
+   $ ./ns3 run "tbf-example --PrintHelp"
+   $ ./ns3 run "tbf-example --burst=125000 --rate=1Mbps --peakRate=1.5Mbps"
 
 The expected output from the previous commands are traced value changes in the number of tokens in the first and second buckets.
 
@@ -134,8 +134,8 @@
 
 .. sourcecode:: bash
 
-  $ ./waf configure --enable-examples --enable-tests
-  $ ./waf build
+  $ ./ns3 configure --enable-examples --enable-tests
+  $ ./ns3 build
   $ ./test.py -s tbf-queue-disc
 
 or
@@ -144,4 +144,4 @@
 
 .. sourcecode:: bash
 
-  $ NS_LOG="TbfQueueDisc" ./waf --run "test-runner --suite=tbf-queue-disc"
+  $ NS_LOG="TbfQueueDisc" ./ns3 run "test-runner --suite=tbf-queue-disc"
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/traffic-control/examples/CMakeLists.txt ns-3.36/src/traffic-control/examples/CMakeLists.txt
--- ns-3.35/src/traffic-control/examples/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/traffic-control/examples/CMakeLists.txt	2022-04-30 18:23:58.166735000 -0700
@@ -0,0 +1,88 @@
+build_lib_example(
+  NAME red-tests
+  SOURCE_FILES red-tests.cc
+  LIBRARIES_TO_LINK
+    ${libpoint-to-point}
+    ${libinternet}
+    ${libapplications}
+    ${libflow-monitor}
+    ${libtraffic-control}
+)
+
+build_lib_example(
+  NAME red-vs-ared
+  SOURCE_FILES red-vs-ared.cc
+  LIBRARIES_TO_LINK
+    ${libpoint-to-point}
+    ${libpoint-to-point-layout}
+    ${libinternet}
+    ${libapplications}
+    ${libtraffic-control}
+)
+
+build_lib_example(
+  NAME adaptive-red-tests
+  SOURCE_FILES adaptive-red-tests.cc
+  LIBRARIES_TO_LINK
+    ${libpoint-to-point}
+    ${libinternet}
+    ${libapplications}
+    ${libflow-monitor}
+    ${libtraffic-control}
+)
+
+build_lib_example(
+  NAME pfifo-vs-red
+  SOURCE_FILES pfifo-vs-red.cc
+  LIBRARIES_TO_LINK
+    ${libpoint-to-point}
+    ${libpoint-to-point-layout}
+    ${libinternet}
+    ${libapplications}
+    ${libtraffic-control}
+)
+
+build_lib_example(
+  NAME codel-vs-pfifo-basic-test
+  SOURCE_FILES codel-vs-pfifo-basic-test.cc
+  LIBRARIES_TO_LINK
+    ${libpoint-to-point}
+    ${libnetwork}
+    ${libinternet}
+    ${libapplications}
+    ${libtraffic-control}
+)
+
+build_lib_example(
+  NAME codel-vs-pfifo-asymmetric
+  SOURCE_FILES codel-vs-pfifo-asymmetric.cc
+  LIBRARIES_TO_LINK
+    ${libpoint-to-point}
+    ${libnetwork}
+    ${libinternet}
+    ${libapplications}
+    ${libtraffic-control}
+)
+
+build_lib_example(
+  NAME pie-example
+  SOURCE_FILES pie-example.cc
+  LIBRARIES_TO_LINK
+    ${libpoint-to-point}
+    ${libinternet}
+    ${libapplications}
+    ${libflow-monitor}
+    ${libtraffic-control}
+)
+
+build_lib_example(
+  NAME fqcodel-l4s-example
+  SOURCE_FILES fqcodel-l4s-example.cc
+  LIBRARIES_TO_LINK
+    ${libpoint-to-point}
+    ${libinternet}
+    ${libinternet-apps}
+    ${libapplications}
+    ${libflow-monitor}
+    ${libtraffic-control}
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/traffic-control/examples/fqcodel-l4s-example.cc ns-3.36/src/traffic-control/examples/fqcodel-l4s-example.cc
--- ns-3.35/src/traffic-control/examples/fqcodel-l4s-example.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/traffic-control/examples/fqcodel-l4s-example.cc	2022-04-30 18:23:58.166735000 -0700
@@ -24,6 +24,11 @@
  */
 
 // The 9 configurations below test BIC and DCTCP under various scenarios.
+// Scenarios are numbered 1-9.  By default, scenario number 0 (i.e., no
+// scenario) is configured, which means that the user is free to set
+// any of the parameters freely; if scenarios 1 through 9 are selected,
+// the scenario parameters are fixed.
+//
 // The configuration of the scenarios starts from basic TCP BIC without ECN
 // with the base RTT of 80ms and then in the next scenario, ECN is enabled,
 // and gradually, the complexity of the scenario increases and the last scenario
@@ -268,9 +273,11 @@
 * ---------------
 *    --n0TcpType:           First TCP type (bic, dctcp, or reno) [bic]
 *    --n1TcpType:           Second TCP type (cubic, dctcp, or reno) []
-*    --bottleneckQueueType: M3 queue type (fq or codel) [fq]
+*    --scenarioNum:         Scenario number from the scenarios avalaible in the file (1-9) [0]
+*    --bottleneckQueueType: n2 queue type (fq or codel) [fq]
 *    --baseRtt:             base RTT [80ms]
 *    --useCeThreshold:      use CE threshold [false]
+*    --useEcn:              use ECN [true]
 *    --ceThreshold:         CE threshold [1ms]
 *    --bottleneckRate       data rate of bottleneck [100Mbps]
 *    --linkrate:            data rate of edge link to bottleneck link [1Gbps]
@@ -851,9 +858,12 @@
   Simulator::Schedule (Seconds (5) + MilliSeconds (100), &ScheduleN0PacketSinkConnection);
   Simulator::Schedule (throughputSamplingInterval, &TraceN0Throughput, &n0TcpThroughputOfStream, throughputSamplingInterval);
   // Setup scheduled traces; TCP traces must be hooked after socket creation
-  Simulator::Schedule (Seconds (15) + MilliSeconds (100), &ScheduleN1TcpRttTraceConnection, &n1TcpRttOfStream);
-  Simulator::Schedule (Seconds (15) + MilliSeconds (100), &ScheduleN1TcpCwndTraceConnection, &n1TcpCwndOfStream);
-  Simulator::Schedule (Seconds (15) + MilliSeconds (100), &ScheduleN1PacketSinkConnection);
+  if (enableN1Tcp)
+    {
+      Simulator::Schedule (Seconds (15) + MilliSeconds (100), &ScheduleN1TcpRttTraceConnection, &n1TcpRttOfStream);
+      Simulator::Schedule (Seconds (15) + MilliSeconds (100), &ScheduleN1TcpCwndTraceConnection, &n1TcpCwndOfStream);
+      Simulator::Schedule (Seconds (15) + MilliSeconds (100), &ScheduleN1PacketSinkConnection);
+    }
   Simulator::Schedule (throughputSamplingInterval, &TraceN1Throughput, &n1TcpThroughputOfStream, throughputSamplingInterval);
   Simulator::Schedule (marksSamplingInterval, &TraceMarksFrequency, &marksFrequencyOfStream, marksSamplingInterval);
   Simulator::Schedule (marksSamplingInterval, &TraceDropsFrequency, &dropsFrequencyOfStream, marksSamplingInterval);
@@ -880,4 +890,4 @@
   lengthOfStream.close ();
   queueDelayN0OfStream.close ();
   queueDelayN1OfStream.close ();
-}
\ No newline at end of file
+}
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/traffic-control/examples/wscript ns-3.36/src/traffic-control/examples/wscript
--- ns-3.35/src/traffic-control/examples/wscript	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/traffic-control/examples/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,28 +0,0 @@
-# -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    pass
-
-    obj = bld.create_ns3_program('red-tests', ['point-to-point', 'internet', 'applications', 'flow-monitor', 'traffic-control'])
-    obj.source = 'red-tests.cc'
-
-    obj = bld.create_ns3_program('red-vs-ared', ['point-to-point', 'point-to-point-layout', 'internet', 'applications', 'traffic-control'])
-    obj.source = 'red-vs-ared.cc'
-
-    obj = bld.create_ns3_program('adaptive-red-tests', ['point-to-point', 'internet', 'applications', 'flow-monitor', 'traffic-control'])
-    obj.source = 'adaptive-red-tests.cc'
-
-    obj = bld.create_ns3_program('pfifo-vs-red', ['point-to-point', 'point-to-point-layout', 'internet', 'applications', 'traffic-control'])
-    obj.source = 'pfifo-vs-red.cc'
-
-    obj = bld.create_ns3_program('codel-vs-pfifo-basic-test', ['point-to-point','network', 'internet', 'applications', 'traffic-control'])
-    obj.source = 'codel-vs-pfifo-basic-test.cc'
-    
-    obj = bld.create_ns3_program('codel-vs-pfifo-asymmetric', ['point-to-point','network', 'internet', 'applications', 'traffic-control', 'config-store'])
-    obj.source = 'codel-vs-pfifo-asymmetric.cc'
-
-    obj = bld.create_ns3_program('pie-example', ['point-to-point', 'internet', 'applications', 'flow-monitor', 'traffic-control'])
-    obj.source = 'pie-example.cc'
-    
-    obj = bld.create_ns3_program('fqcodel-l4s-example', ['point-to-point', 'internet', 'applications', 'flow-monitor','internet-apps', 'traffic-control'])
-    obj.source = 'fqcodel-l4s-example.cc'
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/traffic-control/helper/traffic-control-helper.h ns-3.36/src/traffic-control/helper/traffic-control-helper.h
--- ns-3.35/src/traffic-control/helper/traffic-control-helper.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/traffic-control/helper/traffic-control-helper.h	2022-04-30 18:23:58.166735000 -0700
@@ -48,6 +48,9 @@
 
   virtual ~QueueDiscFactory () {}
 
+  // Delete default constructor to avoid misuse
+  QueueDiscFactory () = delete;
+
   /**
    * \brief Add a factory to create an internal queue
    *
@@ -87,13 +90,6 @@
   Ptr<QueueDisc> CreateQueueDisc (const std::vector<Ptr<QueueDisc> > & queueDiscs);
 
 private:
-  /**
-   * \brief Default constructor
-   *
-   * Defined and unimplemented to avoid misuse
-   */
-  QueueDiscFactory ();
-
   /// Factory to create this queue disc
   ObjectFactory m_queueDiscFactory;
   /// Vector of factories to create internal queues
@@ -127,6 +123,7 @@
   virtual ~TrafficControlHelper () {}
 
   /**
+   * \param nTxQueues the number of Tx queue disc classes
    * \returns a new TrafficControlHelper with a default configuration
    *
    * The default configuration is an FqCoDelQueueDisc, if the device has a single
@@ -272,6 +269,12 @@
    *
    * This method removes the root queue discs (and associated filters, classes
    * and queues) installed on the given devices.
+   * Note that the traffic control layer will continue to perform flow control
+   * if the device has an aggregated NetDeviceQueueInterface. If you really
+   * want that the Traffic Control layer forwards packets down to the NetDevice
+   * even if there is no room for them in the NetDevice queue(s), then disable
+   * the flow control by using the DisableFlowControl method of the NetDevice
+   * helper.
    */
   void Uninstall (NetDeviceContainer c);
 
@@ -280,6 +283,12 @@
    *
    * This method removes the root queue disc (and associated filters, classes
    * and queues) installed on the given device.
+   * Note that the traffic control layer will continue to perform flow control
+   * if the device has an aggregated NetDeviceQueueInterface. If you really
+   * want that the Traffic Control layer forwards packets down to the NetDevice
+   * even if there is no room for them in the NetDevice queue(s), then disable
+   * the flow control by using the DisableFlowControl method of the NetDevice
+   * helper.
    */
   void Uninstall (Ptr<NetDevice> d);
 
@@ -288,6 +297,7 @@
    * Actual implementation of the SetRootQueueDisc method.
    *
    * \param factory the factory used to create the root queue disc
+   * \returns zero on success
    */
   uint16_t DoSetRootQueueDisc (ObjectFactory factory);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/traffic-control/model/cobalt-queue-disc.cc ns-3.36/src/traffic-control/model/cobalt-queue-disc.cc
--- ns-3.35/src/traffic-control/model/cobalt-queue-disc.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/traffic-control/model/cobalt-queue-disc.cc	2022-04-30 18:23:58.166735000 -0700
@@ -129,16 +129,6 @@
   return (uint32_t)(((uint64_t)A * R) >> 32);
 }
 
-double min (double x, double y)
-{
-  return (x < y) ? x : y;
-}
-
-double max (double x, double y)
-{
-  return (x > y) ? x : y;
-}
-
 /**
  * Returns the current time translated in CoDel time representation
  * \return the current time
@@ -408,7 +398,7 @@
   if (CoDelTimeAfter ((now - m_lastUpdateTimeBlue), Time2CoDel (m_target)))
     {
       NS_LOG_LOGIC ("inside IF block");
-      m_pDrop = min (m_pDrop + m_increment, (double)1.0);
+      m_pDrop = std::min (m_pDrop + m_increment, (double)1.0);
       m_lastUpdateTimeBlue = now;
     }
   m_dropping = true;
@@ -425,7 +415,7 @@
   NS_LOG_FUNCTION (this);
   if (m_pDrop && CoDelTimeAfter ((now - m_lastUpdateTimeBlue), Time2CoDel (m_target)))
     {
-      m_pDrop = max (m_pDrop - m_decrement, (double)0.0);
+      m_pDrop = std::max (m_pDrop - m_decrement, (double)0.0);
       m_lastUpdateTimeBlue = now;
     }
   m_dropping = false;
@@ -501,7 +491,7 @@
       isMarked = (m_useEcn && Mark (item, FORCED_MARK));
       drop = !isMarked;
 
-      m_count = max (m_count, m_count + 1);
+      m_count = std::max (m_count, m_count + 1);
 
       InvSqrt ();
       m_dropNext = ControlLaw (m_dropNext);
@@ -530,7 +520,7 @@
   // Enable Blue Enhancement if sojourn time is greater than blueThreshold and its been m_target time until the last time blue was updated
   if (CoDelTimeAfter (sojournTime, Time2CoDel (m_blueThreshold)) && CoDelTimeAfter ((now - m_lastUpdateTimeBlue), Time2CoDel (m_target)))
     {
-      m_pDrop = min (m_pDrop + m_increment, (double)1.0);
+      m_pDrop = std::min (m_pDrop + m_increment, (double)1.0);
       m_lastUpdateTimeBlue = now;
     }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/traffic-control/model/cobalt-queue-disc.h ns-3.36/src/traffic-control/model/cobalt-queue-disc.h
--- ns-3.35/src/traffic-control/model/cobalt-queue-disc.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/traffic-control/model/cobalt-queue-disc.h	2022-04-30 18:23:58.166735000 -0700
@@ -165,6 +165,9 @@
    */
   int64_t ControlLaw (int64_t t);
 
+  /**
+   * \brief Updates the inverse square root
+   */
   void InvSqrt (void);
 
   /**
@@ -210,7 +213,8 @@
 
   /**
    * Called to decide whether the current packet should be dropped based on decisions taken by Blue and Codel working parallely
-   * Returns true if the packet should be dropped, false otherwise
+   *
+   * \return true if the packet should be dropped, false otherwise
    * \param item current packet
    * \param now time in CoDel time units (microseconds)
    */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/traffic-control/model/fq-codel-queue-disc.cc ns-3.36/src/traffic-control/model/fq-codel-queue-disc.cc
--- ns-3.35/src/traffic-control/model/fq-codel-queue-disc.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/traffic-control/model/fq-codel-queue-disc.cc	2022-04-30 18:23:58.170735000 -0700
@@ -329,8 +329,7 @@
               NS_LOG_DEBUG ("Increase deficit for new flow index " << flow->GetIndex ());
               flow->IncreaseDeficit (m_quantum);
               flow->SetStatus (FqCoDelFlow::OLD_FLOW);
-              m_oldFlows.push_back (flow);
-              m_newFlows.pop_front ();
+              m_oldFlows.splice (m_oldFlows.end (), m_newFlows, m_newFlows.begin ());
             }
           else
             {
@@ -347,8 +346,7 @@
             {
               NS_LOG_DEBUG ("Increase deficit for old flow index " << flow->GetIndex ());
               flow->IncreaseDeficit (m_quantum);
-              m_oldFlows.push_back (flow);
-              m_oldFlows.pop_front ();
+              m_oldFlows.splice (m_oldFlows.end (), m_oldFlows, m_oldFlows.begin ());
             }
           else
             {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/traffic-control/model/pie-queue-disc.cc ns-3.36/src/traffic-control/model/pie-queue-disc.cc
--- ns-3.35/src/traffic-control/model/pie-queue-disc.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/traffic-control/model/pie-queue-disc.cc	2022-04-30 18:23:58.170735000 -0700
@@ -89,7 +89,7 @@
                    MakeTimeChecker ())
     .AddAttribute ("MaxBurstAllowance",
                    "Current max burst allowance before random drop",
-                   TimeValue (MilliSeconds (15)),
+                   TimeValue (MilliSeconds (150)),
                    MakeTimeAccessor (&PieQueueDisc::m_maxBurst),
                    MakeTimeChecker ())
     .AddAttribute ("UseDequeueRateEstimator",
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/traffic-control/model/prio-queue-disc.h ns-3.36/src/traffic-control/model/prio-queue-disc.h
--- ns-3.35/src/traffic-control/model/prio-queue-disc.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/traffic-control/model/prio-queue-disc.h	2022-04-30 18:23:58.170735000 -0700
@@ -26,6 +26,7 @@
 
 namespace ns3 {
 
+/// Priority map
 typedef std::array<uint16_t, 16> Priomap;
 
 /**
@@ -106,6 +107,7 @@
  */
 std::istream &operator >> (std::istream &is, Priomap &priomap);
 
+
 ATTRIBUTE_HELPER_HEADER (Priomap);
 
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/traffic-control/model/queue-disc.cc ns-3.36/src/traffic-control/model/queue-disc.cc
--- ns-3.35/src/traffic-control/model/queue-disc.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/traffic-control/model/queue-disc.cc	2022-04-30 18:23:58.170735000 -0700
@@ -24,7 +24,6 @@
 #include "ns3/object-vector.h"
 #include "ns3/packet.h"
 #include "ns3/socket.h"
-#include "ns3/unused.h"
 #include "ns3/simulator.h"
 #include "queue-disc.h"
 #include "ns3/net-device-queue-interface.h"
@@ -402,9 +401,8 @@
   NS_LOG_FUNCTION (this);
 
   // Check the configuration and initialize the parameters of this queue disc
-  bool ok = CheckConfig ();
+  [[maybe_unused]] bool ok = CheckConfig ();
   NS_ASSERT_MSG (ok, "The queue disc configuration is not correct");
-  NS_UNUSED (ok); // suppress compiler warning
   InitializeParams ();
 
   // Check the configuration and initialize the parameters of the child queue discs
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/traffic-control/model/queue-disc.h ns-3.36/src/traffic-control/model/queue-disc.h
--- ns-3.35/src/traffic-control/model/queue-disc.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/traffic-control/model/queue-disc.h	2022-04-30 18:23:58.170735000 -0700
@@ -205,21 +205,21 @@
     /// Total packets dropped before enqueue
     uint32_t nTotalDroppedPacketsBeforeEnqueue;
     /// Packets dropped before enqueue, for each reason
-    std::map<std::string, uint32_t> nDroppedPacketsBeforeEnqueue;
+    std::map<std::string, uint32_t, std::less<>> nDroppedPacketsBeforeEnqueue;
     /// Total packets dropped after dequeue
     uint32_t nTotalDroppedPacketsAfterDequeue;
     /// Packets dropped after dequeue, for each reason
-    std::map<std::string, uint32_t> nDroppedPacketsAfterDequeue;
+    std::map<std::string, uint32_t, std::less<>> nDroppedPacketsAfterDequeue;
     /// Total dropped bytes
     uint64_t nTotalDroppedBytes;
     /// Total bytes dropped before enqueue
     uint64_t nTotalDroppedBytesBeforeEnqueue;
     /// Bytes dropped before enqueue, for each reason
-    std::map<std::string, uint64_t> nDroppedBytesBeforeEnqueue;
+    std::map<std::string, uint64_t, std::less<>> nDroppedBytesBeforeEnqueue;
     /// Total bytes dropped after dequeue
     uint64_t nTotalDroppedBytesAfterDequeue;
     /// Bytes dropped after dequeue, for each reason
-    std::map<std::string, uint64_t> nDroppedBytesAfterDequeue;
+    std::map<std::string, uint64_t, std::less<>> nDroppedBytesAfterDequeue;
     /// Total requeued packets
     uint32_t nTotalRequeuedPackets;
     /// Total requeued bytes
@@ -227,11 +227,11 @@
     /// Total marked packets
     uint32_t nTotalMarkedPackets;
     /// Marked packets, for each reason
-    std::map<std::string, uint32_t> nMarkedPackets;
+    std::map<std::string, uint32_t, std::less<>> nMarkedPackets;
     /// Total marked bytes
     uint32_t nTotalMarkedBytes;
     /// Marked bytes, for each reason
-    std::map<std::string, uint64_t> nMarkedBytes;
+    std::map<std::string, uint64_t, std::less<>> nMarkedBytes;
 
     /// constructor
     Stats ();
@@ -288,6 +288,10 @@
 
   virtual ~QueueDisc ();
 
+  // Delete copy constructor and assignment operator to avoid misuse
+  QueueDisc (const QueueDisc &) = delete;
+  QueueDisc & operator = (const QueueDisc &) = delete;
+
   /**
    * \brief Get the number of packets stored by the queue disc
    * \return the number of packets stored by the queue disc.
@@ -565,23 +569,6 @@
 
 private:
   /**
-   * \brief Copy constructor
-   * \param o object to copy
-   *
-   * Defined and unimplemented to avoid misuse
-   */
-  QueueDisc (const QueueDisc &o);
-
-  /**
-   * \brief Assignment operator
-   * \param o object to copy
-   * \returns the copied object
-   *
-   * Defined and unimplemented to avoid misuse
-   */
-  QueueDisc &operator = (const QueueDisc &o);
-
-  /**
    * This function actually enqueues a packet into the queue disc.
    * \param item item to enqueue
    * \return True if the operation was successful; false otherwise
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/traffic-control/model/traffic-control-layer.cc ns-3.36/src/traffic-control/model/traffic-control-layer.cc
--- ns-3.35/src/traffic-control/model/traffic-control-layer.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/traffic-control/model/traffic-control-layer.cc	2022-04-30 18:23:58.170735000 -0700
@@ -44,6 +44,12 @@
                    MakeObjectMapAccessor (&TrafficControlLayer::GetNDevices,
                                           &TrafficControlLayer::GetRootQueueDiscOnDeviceByIndex),
                    MakeObjectMapChecker<QueueDisc> ())
+    .AddTraceSource ("TcDrop",
+                     "Trace source indicating a packet has been dropped by the Traffic "
+                     "Control layer because no queue disc is installed on the device, the "
+                     "device supports flow control and the device queue is stopped",
+                     MakeTraceSourceAccessor (&TrafficControlLayer::m_dropped),
+                     "ns3::Packet::TracedCallback")
   ;
   return tid;
 }
@@ -373,9 +379,9 @@
     {
       // The device has no attached queue disc, thus add the header to the packet and
       // send it directly to the device if the selected queue is not stopped
+      item->AddHeader ();
       if (!devQueueIface || !devQueueIface->GetTxQueue (txq)->IsStopped ())
         {
-          item->AddHeader ();
           // a single queue device makes no use of the priority tag
           if (!devQueueIface || devQueueIface->GetNTxQueues () == 1)
             {
@@ -384,6 +390,10 @@
             }
           device->Send (item->GetPacket (), item->GetAddress (), item->GetProtocol ());
         }
+      else
+        {
+          m_dropped (item->GetPacket ());
+        }
     }
   else
     {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/traffic-control/model/traffic-control-layer.h ns-3.36/src/traffic-control/model/traffic-control-layer.h
--- ns-3.35/src/traffic-control/model/traffic-control-layer.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/traffic-control/model/traffic-control-layer.h	2022-04-30 18:23:58.170735000 -0700
@@ -22,6 +22,7 @@
 #include "ns3/object.h"
 #include "ns3/address.h"
 #include "ns3/net-device.h"
+#include "ns3/traced-callback.h"
 #include "ns3/node.h"
 #include "ns3/queue-item.h"
 #include <map>
@@ -108,6 +109,10 @@
 
   virtual ~TrafficControlLayer ();
 
+  // Delete copy constructor and assignment operator to avoid misuse
+  TrafficControlLayer (TrafficControlLayer const &) = delete;
+  TrafficControlLayer & operator = (TrafficControlLayer const &) = delete;
+
   /**
    * \brief Register an IN handler
    *
@@ -203,17 +208,6 @@
 
 private:
   /**
-   * \brief Copy constructor
-   * Disable default implementation to avoid misuse
-   */
-  TrafficControlLayer (TrafficControlLayer const &);
-  /**
-   * \brief Assignment operator
-   * \return this object
-   * Disable default implementation to avoid misuse
-   */
-  TrafficControlLayer& operator= (TrafficControlLayer const &);
-  /**
    * \brief Protocol handler entry.
    * This structure is used to demultiplex all the protocols.
    */
@@ -254,6 +248,13 @@
   /// Map storing the required information for each device with a queue disc installed
   std::map<Ptr<NetDevice>, NetDeviceInfo> m_netDevices;
   ProtocolHandlerList m_handlers;  //!< List of upper-layer handlers
+
+  /**
+   * The trace source fired when the Traffic Control layer drops a packet because
+   * no queue disc is installed on the device, the device supports flow control and
+   * the device queue is stopped
+   */
+  TracedCallback<Ptr<const Packet>> m_dropped;
 };
 
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/traffic-control/test/adaptive-red-queue-disc-test-suite.cc ns-3.36/src/traffic-control/test/adaptive-red-queue-disc-test-suite.cc
--- ns-3.35/src/traffic-control/test/adaptive-red-queue-disc-test-suite.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/traffic-control/test/adaptive-red-queue-disc-test-suite.cc	2022-04-30 18:23:58.170735000 -0700
@@ -52,22 +52,16 @@
    */
   AredQueueDiscTestItem (Ptr<Packet> p, const Address & addr);
   virtual ~AredQueueDiscTestItem ();
+
+  // Delete copy constructor and assignment operator to avoid misuse
+  AredQueueDiscTestItem (const AredQueueDiscTestItem &) = delete;
+  AredQueueDiscTestItem & operator = (const AredQueueDiscTestItem &) = delete;
+
   virtual void AddHeader (void);
   virtual bool Mark(void);
 
 private:
   AredQueueDiscTestItem ();
-  /**
-   * \brief Copy constructor
-   * Disable default implementation to avoid misuse
-   */
-  AredQueueDiscTestItem (const AredQueueDiscTestItem &);
-  /**
-   * \brief Assignment operator
-   * \return this object
-   * Disable default implementation to avoid misuse
-   */
-  AredQueueDiscTestItem &operator = (const AredQueueDiscTestItem &);
 };
 
 AredQueueDiscTestItem::AredQueueDiscTestItem (Ptr<Packet> p, const Address & addr)
@@ -150,141 +144,141 @@
       qSize = qSize * modeSize;
     }
 
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MinTh", DoubleValue (minTh)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MinTh", DoubleValue (minTh)), true,
                          "Verify that we can actually set the attribute MinTh");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxTh", DoubleValue (maxTh)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxTh", DoubleValue (maxTh)), true,
                          "Verify that we can actually set the attribute MaxTh");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
                          true, "Verify that we can actually set the attribute MaxSize");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("QW", DoubleValue (0.0)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("QW", DoubleValue (0.0)), true,
                          "Verify that we can actually set the attribute QW");
   queue->Initialize ();
   Enqueue (queue, pktSize, 300);
   QueueDisc::Stats st = queue->GetStats ();
-  NS_TEST_EXPECT_MSG_EQ (st.GetNDroppedPackets (RedQueueDisc::UNFORCED_DROP), 0,
+  NS_TEST_ASSERT_MSG_EQ (st.GetNDroppedPackets (RedQueueDisc::UNFORCED_DROP), 0,
                          "There should be zero unforced drops");
 
 
   // test 2: Verify automatic setting of QW. [QW = 0.0 with lesser LinkBandwidth]
   queue = CreateObject<RedQueueDisc> ();
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MinTh", DoubleValue (minTh)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MinTh", DoubleValue (minTh)), true,
                          "Verify that we can actually set the attribute MinTh");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxTh", DoubleValue (maxTh)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxTh", DoubleValue (maxTh)), true,
                          "Verify that we can actually set the attribute MaxTh");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
                          true, "Verify that we can actually set the attribute MaxSize");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("QW", DoubleValue (0.0)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("QW", DoubleValue (0.0)), true,
                          "Verify that we can actually set the attribute QW");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("LinkBandwidth", DataRateValue (DataRate ("0.015Mbps"))), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("LinkBandwidth", DataRateValue (DataRate ("0.015Mbps"))), true,
                          "Verify that we can actually set the attribute LinkBandwidth");
   queue->Initialize ();
   Enqueue (queue, pktSize, 300);
   st = queue->GetStats ();
-  NS_TEST_EXPECT_MSG_NE (st.GetNDroppedPackets (RedQueueDisc::UNFORCED_DROP), 0,
+  NS_TEST_ASSERT_MSG_NE (st.GetNDroppedPackets (RedQueueDisc::UNFORCED_DROP), 0,
                          "There should be some unforced drops");
 
 
   // test 3: Verify automatic setting of QW. [QW = -1.0 with default LinkBandwidth]
   queue = CreateObject<RedQueueDisc> ();
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MinTh", DoubleValue (minTh)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MinTh", DoubleValue (minTh)), true,
                          "Verify that we can actually set the attribute MinTh");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxTh", DoubleValue (maxTh)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxTh", DoubleValue (maxTh)), true,
                          "Verify that we can actually set the attribute MaxTh");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
                          true, "Verify that we can actually set the attribute MaxSize");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("QW", DoubleValue (-1.0)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("QW", DoubleValue (-1.0)), true,
                          "Verify that we can actually set the attribute QW");
   queue->Initialize ();
   Enqueue (queue, pktSize, 300);
   st = queue->GetStats ();
-  NS_TEST_EXPECT_MSG_EQ (st.GetNDroppedPackets (RedQueueDisc::UNFORCED_DROP), 0,
+  NS_TEST_ASSERT_MSG_EQ (st.GetNDroppedPackets (RedQueueDisc::UNFORCED_DROP), 0,
                          "There should be zero unforced drops");
 
 
   // test 4: Verify automatic setting of QW. [QW = -1.0 with lesser LinkBandwidth]
   queue = CreateObject<RedQueueDisc> ();
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MinTh", DoubleValue (minTh)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MinTh", DoubleValue (minTh)), true,
                          "Verify that we can actually set the attribute MinTh");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxTh", DoubleValue (maxTh)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxTh", DoubleValue (maxTh)), true,
                          "Verify that we can actually set the attribute MaxTh");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
                          true, "Verify that we can actually set the attribute MaxSize");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("QW", DoubleValue (-1.0)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("QW", DoubleValue (-1.0)), true,
                          "Verify that we can actually set the attribute QW");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("LinkBandwidth", DataRateValue (DataRate ("0.015Mbps"))), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("LinkBandwidth", DataRateValue (DataRate ("0.015Mbps"))), true,
                          "Verify that we can actually set the attribute LinkBandwidth");
   queue->Initialize ();
   Enqueue (queue, pktSize, 300);
   st = queue->GetStats ();
-  NS_TEST_EXPECT_MSG_NE (st.GetNDroppedPackets (RedQueueDisc::UNFORCED_DROP), 0,
+  NS_TEST_ASSERT_MSG_NE (st.GetNDroppedPackets (RedQueueDisc::UNFORCED_DROP), 0,
                          "There should be some unforced drops");
 
 
   // test 5: Verify automatic setting of QW. [QW = -2.0 with default LinkBandwidth]
   queue = CreateObject<RedQueueDisc> ();
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MinTh", DoubleValue (minTh)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MinTh", DoubleValue (minTh)), true,
                          "Verify that we can actually set the attribute MinTh");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxTh", DoubleValue (maxTh)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxTh", DoubleValue (maxTh)), true,
                          "Verify that we can actually set the attribute MaxTh");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
                          true, "Verify that we can actually set the attribute MaxSize");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("QW", DoubleValue (-2.0)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("QW", DoubleValue (-2.0)), true,
                          "Verify that we can actually set the attribute QW");
   queue->Initialize ();
   Enqueue (queue, pktSize, 300);
   st = queue->GetStats ();
   uint32_t test5 = st.GetNDroppedPackets (RedQueueDisc::UNFORCED_DROP);
-  NS_TEST_EXPECT_MSG_NE (test5, 0, "There should be some unforced drops");
+  NS_TEST_ASSERT_MSG_NE (test5, 0, "There should be some unforced drops");
 
 
   // test 6: Verify automatic setting of QW. [QW = -2.0 with lesser LinkBandwidth]
   queue = CreateObject<RedQueueDisc> ();
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MinTh", DoubleValue (minTh)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MinTh", DoubleValue (minTh)), true,
                          "Verify that we can actually set the attribute MinTh");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxTh", DoubleValue (maxTh)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxTh", DoubleValue (maxTh)), true,
                          "Verify that we can actually set the attribute MaxTh");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
                          true, "Verify that we can actually set the attribute MaxSize");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("QW", DoubleValue (-2.0)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("QW", DoubleValue (-2.0)), true,
                          "Verify that we can actually set the attribute QW");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("LinkBandwidth", DataRateValue (DataRate ("0.015Mbps"))), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("LinkBandwidth", DataRateValue (DataRate ("0.015Mbps"))), true,
                          "Verify that we can actually set the attribute LinkBandwidth");
   queue->Initialize ();
   Enqueue (queue, pktSize, 300);
   st = queue->GetStats ();
   uint32_t test6 = st.GetNDroppedPackets (RedQueueDisc::UNFORCED_DROP);
-  NS_TEST_EXPECT_MSG_NE (test6, test5, "Test 6 should have more unforced drops than Test 5");
+  NS_TEST_ASSERT_MSG_NE (test6, test5, "Test 6 should have more unforced drops than Test 5");
 
 
   // test 7: Verify automatic setting of minTh and maxTh. [minTh = maxTh = 0.0, with default LinkBandwidth]
   queue = CreateObject<RedQueueDisc> ();
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MinTh", DoubleValue (0.0)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MinTh", DoubleValue (0.0)), true,
                          "Verify that we can actually set the attribute MinTh");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxTh", DoubleValue (0.0)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxTh", DoubleValue (0.0)), true,
                          "Verify that we can actually set the attribute MaxTh");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
                          true, "Verify that we can actually set the attribute MaxSize");
   queue->Initialize ();
   Enqueue (queue, pktSize, 300);
   st = queue->GetStats ();
-  NS_TEST_EXPECT_MSG_NE (st.GetNDroppedPackets (RedQueueDisc::UNFORCED_DROP), 0,
+  NS_TEST_ASSERT_MSG_NE (st.GetNDroppedPackets (RedQueueDisc::UNFORCED_DROP), 0,
                          "There should be some unforced drops");
 
 
   // test 8: Verify automatic setting of minTh and maxTh. [minTh = maxTh = 0.0, with higher LinkBandwidth]
   queue = CreateObject<RedQueueDisc> ();
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MinTh", DoubleValue (0.0)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MinTh", DoubleValue (0.0)), true,
                          "Verify that we can actually set the attribute MinTh");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxTh", DoubleValue (0.0)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxTh", DoubleValue (0.0)), true,
                          "Verify that we can actually set the attribute MaxTh");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
                          true, "Verify that we can actually set the attribute MaxSize");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("LinkBandwidth", DataRateValue (DataRate ("150Mbps"))), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("LinkBandwidth", DataRateValue (DataRate ("150Mbps"))), true,
                          "Verify that we can actually set the attribute LinkBandwidth");
   queue->Initialize ();
   Enqueue (queue, pktSize, 300);
   st = queue->GetStats ();
-  NS_TEST_EXPECT_MSG_EQ (st.GetNDroppedPackets (RedQueueDisc::UNFORCED_DROP), 0,
+  NS_TEST_ASSERT_MSG_EQ (st.GetNDroppedPackets (RedQueueDisc::UNFORCED_DROP), 0,
                          "There should be zero unforced drops");
 
 
@@ -292,15 +286,15 @@
   queue = CreateObject<RedQueueDisc> ();
   minTh = 5 * modeSize;
   maxTh = 15 * modeSize;
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MinTh", DoubleValue (minTh)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MinTh", DoubleValue (minTh)), true,
                          "Verify that we can actually set the attribute MinTh");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxTh", DoubleValue (maxTh)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxTh", DoubleValue (maxTh)), true,
                          "Verify that we can actually set the attribute MaxTh");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
                          true, "Verify that we can actually set the attribute MaxSize");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("QW", DoubleValue (0.002)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("QW", DoubleValue (0.002)), true,
                          "Verify that we can actually set the attribute QW");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("LInterm", DoubleValue (2)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("LInterm", DoubleValue (2)), true,
                          "Verify that we can actually set the attribute LInterm");
   queue->Initialize ();
   EnqueueWithDelay (queue, pktSize, 300);
@@ -308,17 +302,17 @@
   Simulator::Run ();
   st = queue->GetStats ();
   uint32_t test9 = st.GetNDroppedPackets (RedQueueDisc::UNFORCED_DROP);
-  NS_TEST_EXPECT_MSG_NE (st.GetNDroppedPackets (RedQueueDisc::UNFORCED_DROP), 0,
+  NS_TEST_ASSERT_MSG_NE (st.GetNDroppedPackets (RedQueueDisc::UNFORCED_DROP), 0,
                          "There should be some unforced drops");
 
 
   // test 10: Adaptive RED (automatic and adaptive settings enabled)
   queue = CreateObject<RedQueueDisc> ();
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
                          true, "Verify that we can actually set the attribute MaxSize");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("LInterm", DoubleValue (2)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("LInterm", DoubleValue (2)), true,
                          "Verify that we can actually set the attribute LInterm");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("ARED", BooleanValue (true)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("ARED", BooleanValue (true)), true,
                          "Verify that we can actually set the attribute ARED");
   queue->Initialize ();
   EnqueueWithDelay (queue, pktSize, 300);
@@ -326,7 +320,7 @@
   Simulator::Run ();
   st = queue->GetStats ();
   uint32_t test10 = st.GetNDroppedPackets (RedQueueDisc::UNFORCED_DROP);
-  NS_TEST_EXPECT_MSG_LT (test10, test9, "Test 10 should have less unforced drops than test 9");
+  NS_TEST_ASSERT_MSG_LT (test10, test9, "Test 10 should have less unforced drops than test 9");
 }
 
 void
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/traffic-control/test/cobalt-queue-disc-test-suite.cc ns-3.36/src/traffic-control/test/cobalt-queue-disc-test-suite.cc
--- ns-3.35/src/traffic-control/test/cobalt-queue-disc-test-suite.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/traffic-control/test/cobalt-queue-disc-test-suite.cc	2022-04-30 18:23:58.170735000 -0700
@@ -46,27 +46,22 @@
    *
    * \param p packet
    * \param addr address
-   * \param protocol
+   * \param protocol protocol
+   * \param ecnCapable ECN capable
    */
-
   CobaltQueueDiscTestItem (Ptr<Packet> p, const Address & addr,uint16_t protocol, bool ecnCapable);
   virtual ~CobaltQueueDiscTestItem ();
+
+  // Delete copy constructor and assignment operator to avoid misuse
+  CobaltQueueDiscTestItem (const CobaltQueueDiscTestItem &) = delete;
+  CobaltQueueDiscTestItem & operator = (const CobaltQueueDiscTestItem &) = delete;
+
   virtual void AddHeader (void);
   virtual bool Mark (void);
 
 private:
   CobaltQueueDiscTestItem ();
-  /**
-   * \brief Copy constructor
-   * Disable default implementation to avoid misuse
-   */
-  CobaltQueueDiscTestItem (const CobaltQueueDiscTestItem &);
-  /**
-   * \brief Assignment operator
-   * \return this object
-   * Disable default implementation to avoid misuse
-   */
-  CobaltQueueDiscTestItem &operator = (const CobaltQueueDiscTestItem &);
+
   bool m_ecnCapablePacket; ///< ECN capable packet?
 };
 
@@ -140,11 +135,11 @@
 
   Address dest;
 
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("Interval", StringValue ("50ms")), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("Interval", StringValue ("50ms")), true,
                          "Verify that we can actually set the attribute Interval");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("Target", StringValue ("4ms")), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("Target", StringValue ("4ms")), true,
                          "Verify that we can actually set the attribute Target");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("BlueThreshold", TimeValue (Time::Max ())), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("BlueThreshold", TimeValue (Time::Max ())), true,
                          "Disable Blue enhancement");
 
   if (m_mode == QueueSizeUnit::BYTES)
@@ -155,7 +150,7 @@
     {
       modeSize = 1;
     }
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (m_mode, modeSize * 1500))),
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (m_mode, modeSize * 1500))),
                          true, "Verify that we can actually set the attribute MaxSize");
   queue->Initialize ();
 
@@ -167,58 +162,58 @@
   p5 = Create<Packet> (pktSize);
   p6 = Create<Packet> (pktSize);
 
-  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 0 * modeSize, "There should be no packets in queue");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 0 * modeSize, "There should be no packets in queue");
   queue->Enqueue (Create<CobaltQueueDiscTestItem> (p1, dest,0, false));
-  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 1 * modeSize, "There should be one packet in queue");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 1 * modeSize, "There should be one packet in queue");
   queue->Enqueue (Create<CobaltQueueDiscTestItem> (p2, dest,0, false));
-  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 2 * modeSize, "There should be two packets in queue");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 2 * modeSize, "There should be two packets in queue");
   queue->Enqueue (Create<CobaltQueueDiscTestItem> (p3, dest,0, false));
-  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 3 * modeSize, "There should be three packets in queue");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 3 * modeSize, "There should be three packets in queue");
   queue->Enqueue (Create<CobaltQueueDiscTestItem> (p4, dest,0, false));
-  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 4 * modeSize, "There should be four packets in queue");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 4 * modeSize, "There should be four packets in queue");
   queue->Enqueue (Create<CobaltQueueDiscTestItem> (p5, dest,0, false));
-  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 5 * modeSize, "There should be five packets in queue");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 5 * modeSize, "There should be five packets in queue");
   queue->Enqueue (Create<CobaltQueueDiscTestItem> (p6, dest,0, false));
-  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 6 * modeSize, "There should be six packets in queue");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 6 * modeSize, "There should be six packets in queue");
 
-  NS_TEST_EXPECT_MSG_EQ (queue->GetStats ().GetNDroppedPackets (CobaltQueueDisc::OVERLIMIT_DROP), 0, "There should be no packets being dropped due to full queue");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetStats ().GetNDroppedPackets (CobaltQueueDisc::OVERLIMIT_DROP), 0, "There should be no packets being dropped due to full queue");
 
   Ptr<QueueDiscItem> item;
 
   item = queue->Dequeue ();
-  NS_TEST_EXPECT_MSG_EQ ((item != 0), true, "I want to remove the first packet");
-  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 5 * modeSize, "There should be five packets in queue");
-  NS_TEST_EXPECT_MSG_EQ (item->GetPacket ()->GetUid (), p1->GetUid (), "was this the first packet ?");
+  NS_TEST_ASSERT_MSG_EQ ((item != 0), true, "I want to remove the first packet");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 5 * modeSize, "There should be five packets in queue");
+  NS_TEST_ASSERT_MSG_EQ (item->GetPacket ()->GetUid (), p1->GetUid (), "was this the first packet ?");
 
   item = queue->Dequeue ();
-  NS_TEST_EXPECT_MSG_EQ ((item != 0), true, "I want to remove the second packet");
-  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 4 * modeSize, "There should be four packets in queue");
-  NS_TEST_EXPECT_MSG_EQ (item->GetPacket ()->GetUid (), p2->GetUid (), "Was this the second packet ?");
+  NS_TEST_ASSERT_MSG_EQ ((item != 0), true, "I want to remove the second packet");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 4 * modeSize, "There should be four packets in queue");
+  NS_TEST_ASSERT_MSG_EQ (item->GetPacket ()->GetUid (), p2->GetUid (), "Was this the second packet ?");
 
   item = queue->Dequeue ();
-  NS_TEST_EXPECT_MSG_EQ ((item != 0), true, "I want to remove the third packet");
-  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 3 * modeSize, "There should be three packets in queue");
-  NS_TEST_EXPECT_MSG_EQ (item->GetPacket ()->GetUid (), p3->GetUid (), "Was this the third packet ?");
+  NS_TEST_ASSERT_MSG_EQ ((item != 0), true, "I want to remove the third packet");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 3 * modeSize, "There should be three packets in queue");
+  NS_TEST_ASSERT_MSG_EQ (item->GetPacket ()->GetUid (), p3->GetUid (), "Was this the third packet ?");
 
   item = queue->Dequeue ();
-  NS_TEST_EXPECT_MSG_EQ ((item != 0), true, "I want to remove the forth packet");
-  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 2 * modeSize, "There should be two packets in queue");
-  NS_TEST_EXPECT_MSG_EQ (item->GetPacket ()->GetUid (), p4->GetUid (), "Was this the fourth packet ?");
+  NS_TEST_ASSERT_MSG_EQ ((item != 0), true, "I want to remove the forth packet");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 2 * modeSize, "There should be two packets in queue");
+  NS_TEST_ASSERT_MSG_EQ (item->GetPacket ()->GetUid (), p4->GetUid (), "Was this the fourth packet ?");
 
   item = queue->Dequeue ();
-  NS_TEST_EXPECT_MSG_EQ ((item != 0), true, "I want to remove the fifth packet");
-  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 1 * modeSize, "There should be one packet in queue");
-  NS_TEST_EXPECT_MSG_EQ (item->GetPacket ()->GetUid (), p5->GetUid (), "Was this the fifth packet ?");
+  NS_TEST_ASSERT_MSG_EQ ((item != 0), true, "I want to remove the fifth packet");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 1 * modeSize, "There should be one packet in queue");
+  NS_TEST_ASSERT_MSG_EQ (item->GetPacket ()->GetUid (), p5->GetUid (), "Was this the fifth packet ?");
 
   item = queue->Dequeue ();
-  NS_TEST_EXPECT_MSG_EQ ((item != 0), true, "I want to remove the last packet");
-  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 0 * modeSize, "There should be zero packet in queue");
-  NS_TEST_EXPECT_MSG_EQ (item->GetPacket ()->GetUid (), p6->GetUid (), "Was this the sixth packet ?");
+  NS_TEST_ASSERT_MSG_EQ ((item != 0), true, "I want to remove the last packet");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 0 * modeSize, "There should be zero packet in queue");
+  NS_TEST_ASSERT_MSG_EQ (item->GetPacket ()->GetUid (), p6->GetUid (), "Was this the sixth packet ?");
 
   item = queue->Dequeue ();
-  NS_TEST_EXPECT_MSG_EQ ((item == 0), true, "There are really no packets in queue");
+  NS_TEST_ASSERT_MSG_EQ ((item == 0), true, "There are really no packets in queue");
 
-  NS_TEST_EXPECT_MSG_EQ (queue->GetStats ().GetNDroppedPackets (CobaltQueueDisc::TARGET_EXCEEDED_DROP), 0, "There should be no packet drops according to Cobalt algorithm");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetStats ().GetNDroppedPackets (CobaltQueueDisc::TARGET_EXCEEDED_DROP), 0, "There should be no packet drops according to Cobalt algorithm");
 }
 
 /**
@@ -244,7 +239,14 @@
    * \param mode the mode
    */
   void RunDropTest (QueueSizeUnit mode);
-
+  /**
+   * Enqueue the given number of packets, each of the given size,
+   * at different times.
+   *
+   * \param queue the queue disc
+   * \param size the packet size in bytes
+   * \param nPkt the number of packets
+   */
   void EnqueueWithDelay (Ptr<CobaltQueueDisc> queue, uint32_t size, uint32_t nPkt);
 
 };
@@ -272,9 +274,9 @@
     }
 
   queue = CreateObject<CobaltQueueDisc> ();
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, modeSize * 100))),
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, modeSize * 100))),
                          true, "Verify that we can actually set the attribute MaxSize");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("BlueThreshold", TimeValue (Time::Max ())), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("BlueThreshold", TimeValue (Time::Max ())), true,
                          "Disable Blue enhancement");
   queue->Initialize ();
 
@@ -293,8 +295,8 @@
   QueueDisc::Stats st = queue->GetStats ();
 
 // The Pdrop value should increase, from it's default value of zero
-  NS_TEST_EXPECT_MSG_NE (queue->GetPdrop (), 0, "Pdrop should be non-zero");
-  NS_TEST_EXPECT_MSG_NE (st.GetNDroppedPackets (CobaltQueueDisc::OVERLIMIT_DROP), 0, "Drops due to queue overflow should be non-zero");
+  NS_TEST_ASSERT_MSG_NE (queue->GetPdrop (), 0, "Pdrop should be non-zero");
+  NS_TEST_ASSERT_MSG_NE (st.GetNDroppedPackets (CobaltQueueDisc::OVERLIMIT_DROP), 0, "Drops due to queue overflow should be non-zero");
 }
 
 void
@@ -379,10 +381,8 @@
 }
 
 void
-CobaltQueueDiscMarkTest::DropNextTracer (int64_t oldVal, int64_t newVal)
+CobaltQueueDiscMarkTest::DropNextTracer ([[maybe_unused]] int64_t oldVal, [[maybe_unused]] int64_t newVal)
 {
-  NS_UNUSED (oldVal);
-  NS_UNUSED (newVal);
   m_dropNextCount++;
 }
 
@@ -410,17 +410,17 @@
       modeSize = 1;
     }
 
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (m_mode, modeSize * 500))),
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (m_mode, modeSize * 500))),
                          true, "Verify that we can actually set the attribute MaxSize");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("UseEcn", BooleanValue (false)),
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("UseEcn", BooleanValue (false)),
                          true, "Verify that we can actually set the attribute UseEcn");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("BlueThreshold", TimeValue (Time::Max ())), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("BlueThreshold", TimeValue (Time::Max ())), true,
                          "Disable Blue enhancement");
   queue->Initialize ();
 
   // Not-ECT traffic to induce packet drop
   Enqueue (queue, pktSize, 20, false);
-  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 20 * modeSize, "There should be 20 packets in queue.");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 20 * modeSize, "There should be 20 packets in queue.");
 
   // Although the first dequeue occurs with a sojourn time above target
   // there should not be any dropped packets in this interval
@@ -436,17 +436,17 @@
 
   // Test case 2, queue with ECN capable traffic for marking of packets instead of dropping
   queue = CreateObject<CobaltQueueDisc> ();
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (m_mode, modeSize * 500))),
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (m_mode, modeSize * 500))),
                          true, "Verify that we can actually set the attribute MaxSize");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("UseEcn", BooleanValue (true)),
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("UseEcn", BooleanValue (true)),
                          true, "Verify that we can actually set the attribute UseEcn");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("BlueThreshold", TimeValue (Time::Max ())), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("BlueThreshold", TimeValue (Time::Max ())), true,
                          "Disable Blue enhancement");
   queue->Initialize ();
 
   // ECN capable traffic
   Enqueue (queue, pktSize, 20, true);
-  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 20 * modeSize, "There should be 20 packets in queue.");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 20 * modeSize, "There should be 20 packets in queue.");
 
   // Although the first dequeue occurs with a sojourn time above target
   // there should not be any marked packets in this interval
@@ -467,11 +467,11 @@
 
   // Test case 3, some packets are ECN capable
   queue = CreateObject<CobaltQueueDisc> ();
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (m_mode, modeSize * 500))),
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (m_mode, modeSize * 500))),
                          true, "Verify that we can actually set the attribute MaxSize");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("UseEcn", BooleanValue (true)),
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("UseEcn", BooleanValue (true)),
                          true, "Verify that we can actually set the attribute UseEcn");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("BlueThreshold", TimeValue (Time::Max ())), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("BlueThreshold", TimeValue (Time::Max ())), true,
                          "Disable Blue enhancement");
   queue->Initialize ();
 
@@ -479,7 +479,7 @@
   Enqueue (queue, pktSize, 3, true);
   // Rest of the packet are not ecnCapable
   Enqueue (queue, pktSize, 17, false);
-  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 20 * modeSize, "There should be 20 packets in queue.");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 20 * modeSize, "There should be 20 packets in queue.");
 
   // Although the first dequeue occurs with a sojourn time above target
   // there should not be any marked packets in this interval
@@ -545,7 +545,7 @@
                   currentMarkCount = queue->GetStats ().GetNMarkedPackets (CobaltQueueDisc::FORCED_MARK);
                   NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize ().GetValue (), initialQSize - modeSize, "There should be 1 packet dequeued.");
                   NS_TEST_EXPECT_MSG_EQ (currentDropCount, 0, "There should not be any packet drops");
-                  NS_TEST_ASSERT_MSG_EQ (currentMarkCount, 0, "We are not in dropping state."
+                  NS_TEST_EXPECT_MSG_EQ (currentMarkCount, 0, "We are not in dropping state."
                                         "Sojourn time has just gone above target from below."
                                         "Hence, there should be no marked packets");
                 }
@@ -599,7 +599,7 @@
                   currentMarkCount = queue->GetStats ().GetNMarkedPackets (CobaltQueueDisc::FORCED_MARK);
                   NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize ().GetValue (), initialQSize - modeSize, "There should be 1 packet dequeued.");
                   NS_TEST_EXPECT_MSG_EQ (currentDropCount, 0, "There should not be any packet drops");
-                  NS_TEST_ASSERT_MSG_EQ (currentMarkCount, 0, "We are not in dropping state."
+                  NS_TEST_EXPECT_MSG_EQ (currentMarkCount, 0, "We are not in dropping state."
                                         "Sojourn time has just gone above target from below."
                                         "Hence, there should be no marked packets");
                 }
@@ -652,6 +652,11 @@
 class CobaltQueueDiscCeThresholdTest : public TestCase
 {
 public:
+  /**
+   * Constructor
+   *
+   * \param mode the queue size unit mode
+   */
   CobaltQueueDiscCeThresholdTest (QueueSizeUnit mode);
   virtual ~CobaltQueueDiscCeThresholdTest ();
 
@@ -765,11 +770,11 @@
       modeSize = 1;
     }
 
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("UseEcn", BooleanValue (true)),
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("UseEcn", BooleanValue (true)),
                          true, "Verify that we can actually set the attribute UseEcn");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("CeThreshold", TimeValue (MilliSeconds (1))),
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("CeThreshold", TimeValue (MilliSeconds (1))),
                          true, "Verify that we can actually set the attribute UseEcn");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("BlueThreshold", TimeValue (Time::Max ())), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("BlueThreshold", TimeValue (Time::Max ())), true,
                          "Disable Blue enhancement");
   queue->Initialize ();
 
@@ -817,6 +822,11 @@
 class CobaltQueueDiscEnhancedBlueTest : public TestCase
 {
 public:
+  /**
+   * Constructor
+   *
+   * \param mode the queue size unit mode
+   */
   CobaltQueueDiscEnhancedBlueTest (QueueSizeUnit mode);
   virtual ~CobaltQueueDiscEnhancedBlueTest ();
 
@@ -881,17 +891,17 @@
   QueueDisc::Stats st = queue->GetStats ();
 
   // The Pdrop value should increase, from it's default value of zero
-  NS_TEST_EXPECT_MSG_EQ (queue->GetPdrop (), 0.234375, "Pdrop should be increased by 1/256 for every packet whose sojourn time is above 400ms."
+  NS_TEST_ASSERT_MSG_EQ (queue->GetPdrop (), 0.234375, "Pdrop should be increased by 1/256 for every packet whose sojourn time is above 400ms."
                         " From the 41st dequeue until the last one, sojourn time is above 400ms, so 60 packets have sojourn time above 400ms"
                         "hence Pdrop should be increased 60*(1/256) which is 0.234375");
-  NS_TEST_EXPECT_MSG_EQ (st.GetNDroppedPackets (CobaltQueueDisc::TARGET_EXCEEDED_DROP), 49, "There should a fixed number of drops (49 here)");
+  NS_TEST_ASSERT_MSG_EQ (st.GetNDroppedPackets (CobaltQueueDisc::TARGET_EXCEEDED_DROP), 49, "There should a fixed number of drops (49 here)");
   Simulator::Destroy ();
 
 
   queue = CreateObject<CobaltQueueDisc> ();
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("UseEcn", BooleanValue (true)),
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("UseEcn", BooleanValue (true)),
                          true, "Verify that we can actually set the attribute UseEcn");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("BlueThreshold", TimeValue (Time::Max ())), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("BlueThreshold", TimeValue (Time::Max ())), true,
                          "Disable Blue enhancement");
   queue->Initialize ();
   Enqueue (queue, modeSize, 200);
@@ -902,8 +912,8 @@
 
   st = queue->GetStats ();
 
-  NS_TEST_EXPECT_MSG_EQ (queue->GetPdrop (), 0, "Pdrop should be zero");
-  NS_TEST_EXPECT_MSG_EQ (st.GetNDroppedPackets (CobaltQueueDisc::TARGET_EXCEEDED_DROP), 0, "There should not any dropped packets");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetPdrop (), 0, "Pdrop should be zero");
+  NS_TEST_ASSERT_MSG_EQ (st.GetNDroppedPackets (CobaltQueueDisc::TARGET_EXCEEDED_DROP), 0, "There should not any dropped packets");
   Simulator::Destroy ();
 }
 
@@ -933,6 +943,9 @@
 }
 
 
+/**
+ * The COBALT queue disc test suite.
+ */
 static class CobaltQueueDiscTestSuite : public TestSuite
 {
 public:
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/traffic-control/test/codel-queue-disc-test-suite.cc ns-3.36/src/traffic-control/test/codel-queue-disc-test-suite.cc
--- ns-3.35/src/traffic-control/test/codel-queue-disc-test-suite.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/traffic-control/test/codel-queue-disc-test-suite.cc	2022-04-30 18:23:58.170735000 -0700
@@ -71,22 +71,17 @@
    */
   CodelQueueDiscTestItem (Ptr<Packet> p, const Address & addr, bool ecnCapable);
   virtual ~CodelQueueDiscTestItem ();
+
+  // Delete copy constructor and assignment operator to avoid misuse
+  CodelQueueDiscTestItem (const CodelQueueDiscTestItem &) = delete;
+  CodelQueueDiscTestItem & operator = (const CodelQueueDiscTestItem &) = delete;
+
   virtual void AddHeader (void);
   virtual bool Mark(void);
 
 private:
   CodelQueueDiscTestItem ();
-  /**
-   * \brief Copy constructor
-   * Disable default implementation to avoid misuse
-   */
-  CodelQueueDiscTestItem (const CodelQueueDiscTestItem &);
-  /**
-   * \brief Assignment operator
-   * \return this object
-   * Disable default implementation to avoid misuse
-   */
-  CodelQueueDiscTestItem &operator = (const CodelQueueDiscTestItem &);
+  
   bool m_ecnCapablePacket; ///< ECN capable packet?
 };
 
@@ -152,11 +147,11 @@
   
   Address dest;
 
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MinBytes", UintegerValue (pktSize)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MinBytes", UintegerValue (pktSize)), true,
                          "Verify that we can actually set the attribute MinBytes");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("Interval", StringValue ("50ms")), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("Interval", StringValue ("50ms")), true,
                          "Verify that we can actually set the attribute Interval");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("Target", StringValue ("4ms")), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("Target", StringValue ("4ms")), true,
                          "Verify that we can actually set the attribute Target");
 
   if (m_mode == QueueSizeUnit::BYTES)
@@ -167,7 +162,7 @@
     {
       modeSize = 1;
     }
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (m_mode, modeSize * 1500))),
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (m_mode, modeSize * 1500))),
                          true, "Verify that we can actually set the attribute MaxSize");
   queue->Initialize ();
 
@@ -179,59 +174,59 @@
   p5 = Create<Packet> (pktSize);
   p6 = Create<Packet> (pktSize);
 
-  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize().GetValue (), 0 * modeSize, "There should be no packets in queue");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize().GetValue (), 0 * modeSize, "There should be no packets in queue");
   queue->Enqueue (Create<CodelQueueDiscTestItem> (p1, dest, false));
-  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize().GetValue (), 1 * modeSize, "There should be one packet in queue");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize().GetValue (), 1 * modeSize, "There should be one packet in queue");
   queue->Enqueue (Create<CodelQueueDiscTestItem> (p2, dest, false));
-  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize().GetValue (), 2 * modeSize, "There should be two packets in queue");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize().GetValue (), 2 * modeSize, "There should be two packets in queue");
   queue->Enqueue (Create<CodelQueueDiscTestItem> (p3, dest, false));
-  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize().GetValue (), 3 * modeSize, "There should be three packets in queue");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize().GetValue (), 3 * modeSize, "There should be three packets in queue");
   queue->Enqueue (Create<CodelQueueDiscTestItem> (p4, dest, false));
-  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize().GetValue (), 4 * modeSize, "There should be four packets in queue");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize().GetValue (), 4 * modeSize, "There should be four packets in queue");
   queue->Enqueue (Create<CodelQueueDiscTestItem> (p5, dest, false));
-  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize().GetValue (), 5 * modeSize, "There should be five packets in queue");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize().GetValue (), 5 * modeSize, "There should be five packets in queue");
   queue->Enqueue (Create<CodelQueueDiscTestItem> (p6, dest, false));
-  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize().GetValue (), 6 * modeSize, "There should be six packets in queue");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize().GetValue (), 6 * modeSize, "There should be six packets in queue");
 
-  NS_TEST_EXPECT_MSG_EQ (queue->GetStats ().GetNDroppedPackets (CoDelQueueDisc::OVERLIMIT_DROP),
+  NS_TEST_ASSERT_MSG_EQ (queue->GetStats ().GetNDroppedPackets (CoDelQueueDisc::OVERLIMIT_DROP),
                          0, "There should be no packets being dropped due to full queue");
 
   Ptr<QueueDiscItem> item;
 
   item = queue->Dequeue ();
-  NS_TEST_EXPECT_MSG_EQ ((item != 0), true, "I want to remove the first packet");
-  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize().GetValue (), 5 * modeSize, "There should be five packets in queue");
-  NS_TEST_EXPECT_MSG_EQ (item->GetPacket ()->GetUid (), p1->GetUid (), "was this the first packet ?");
+  NS_TEST_ASSERT_MSG_EQ ((item != 0), true, "I want to remove the first packet");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize().GetValue (), 5 * modeSize, "There should be five packets in queue");
+  NS_TEST_ASSERT_MSG_EQ (item->GetPacket ()->GetUid (), p1->GetUid (), "was this the first packet ?");
 
   item = queue->Dequeue ();
-  NS_TEST_EXPECT_MSG_EQ ((item != 0), true, "I want to remove the second packet");
-  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize().GetValue (), 4 * modeSize, "There should be four packets in queue");
-  NS_TEST_EXPECT_MSG_EQ (item->GetPacket ()->GetUid (), p2->GetUid (), "Was this the second packet ?");
+  NS_TEST_ASSERT_MSG_EQ ((item != 0), true, "I want to remove the second packet");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize().GetValue (), 4 * modeSize, "There should be four packets in queue");
+  NS_TEST_ASSERT_MSG_EQ (item->GetPacket ()->GetUid (), p2->GetUid (), "Was this the second packet ?");
 
   item = queue->Dequeue ();
-  NS_TEST_EXPECT_MSG_EQ ((item != 0), true, "I want to remove the third packet");
-  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize().GetValue (), 3 * modeSize, "There should be three packets in queue");
-  NS_TEST_EXPECT_MSG_EQ (item->GetPacket ()->GetUid (), p3->GetUid (), "Was this the third packet ?");
+  NS_TEST_ASSERT_MSG_EQ ((item != 0), true, "I want to remove the third packet");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize().GetValue (), 3 * modeSize, "There should be three packets in queue");
+  NS_TEST_ASSERT_MSG_EQ (item->GetPacket ()->GetUid (), p3->GetUid (), "Was this the third packet ?");
 
   item = queue->Dequeue ();
-  NS_TEST_EXPECT_MSG_EQ ((item != 0), true, "I want to remove the forth packet");
-  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize().GetValue (), 2 * modeSize, "There should be two packets in queue");
-  NS_TEST_EXPECT_MSG_EQ (item->GetPacket ()->GetUid (), p4->GetUid (), "Was this the fourth packet ?");
+  NS_TEST_ASSERT_MSG_EQ ((item != 0), true, "I want to remove the forth packet");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize().GetValue (), 2 * modeSize, "There should be two packets in queue");
+  NS_TEST_ASSERT_MSG_EQ (item->GetPacket ()->GetUid (), p4->GetUid (), "Was this the fourth packet ?");
 
   item = queue->Dequeue ();
-  NS_TEST_EXPECT_MSG_EQ ((item != 0), true, "I want to remove the fifth packet");
-  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize().GetValue (), 1 * modeSize, "There should be one packet in queue");
-  NS_TEST_EXPECT_MSG_EQ (item->GetPacket ()->GetUid (), p5->GetUid (), "Was this the fifth packet ?");
+  NS_TEST_ASSERT_MSG_EQ ((item != 0), true, "I want to remove the fifth packet");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize().GetValue (), 1 * modeSize, "There should be one packet in queue");
+  NS_TEST_ASSERT_MSG_EQ (item->GetPacket ()->GetUid (), p5->GetUid (), "Was this the fifth packet ?");
 
   item = queue->Dequeue ();
-  NS_TEST_EXPECT_MSG_EQ ((item != 0), true, "I want to remove the last packet");
-  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize().GetValue (), 0 * modeSize, "There should be zero packet in queue");
-  NS_TEST_EXPECT_MSG_EQ (item->GetPacket ()->GetUid (), p6->GetUid (), "Was this the sixth packet ?");
+  NS_TEST_ASSERT_MSG_EQ ((item != 0), true, "I want to remove the last packet");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize().GetValue (), 0 * modeSize, "There should be zero packet in queue");
+  NS_TEST_ASSERT_MSG_EQ (item->GetPacket ()->GetUid (), p6->GetUid (), "Was this the sixth packet ?");
 
   item = queue->Dequeue ();
-  NS_TEST_EXPECT_MSG_EQ ((item == 0), true, "There are really no packets in queue");
+  NS_TEST_ASSERT_MSG_EQ ((item == 0), true, "There are really no packets in queue");
 
-  NS_TEST_EXPECT_MSG_EQ (queue->GetStats ().GetNDroppedPackets (CoDelQueueDisc::TARGET_EXCEEDED_DROP), 0,
+  NS_TEST_ASSERT_MSG_EQ (queue->GetStats ().GetNDroppedPackets (CoDelQueueDisc::TARGET_EXCEEDED_DROP), 0,
                          "There should be no packet drops according to CoDel algorithm");
 }
 
@@ -292,9 +287,9 @@
   p2 = Create<Packet> (pktSize);
   p3 = Create<Packet> (pktSize);
 
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (m_mode, modeSize * 500))),
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (m_mode, modeSize * 500))),
                          true, "Verify that we can actually set the attribute MaxSize");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MinBytes", UintegerValue (pktSize)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MinBytes", UintegerValue (pktSize)), true,
                          "Verify that we can actually set the attribute MinBytes");
 
   queue->Initialize ();
@@ -304,8 +299,8 @@
   queue->Enqueue (Create<CodelQueueDiscTestItem> (p2, dest, false));
   queue->Enqueue (Create<CodelQueueDiscTestItem> (p3, dest, false));
 
-  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize().GetValue (), 500 * modeSize, "There should be 500 packets in queue");
-  NS_TEST_EXPECT_MSG_EQ (queue->GetStats ().GetNDroppedPackets (CoDelQueueDisc::OVERLIMIT_DROP),
+  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize().GetValue (), 500 * modeSize, "There should be 500 packets in queue");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetStats ().GetNDroppedPackets (CoDelQueueDisc::OVERLIMIT_DROP),
                          3, "There should be three packets being dropped due to full queue");
 }
 
@@ -370,8 +365,9 @@
   virtual void DoRun (void);
   /**
    * Codel control law function
-   * \param queue the queue disc
    * \param t
+   * \param interval
+   * \param recInvSqrt
    * \returns the codel control law
    */
   uint32_t _codel_control_law (uint32_t t, uint32_t interval, uint32_t recInvSqrt);
@@ -407,7 +403,7 @@
           codelTimeVal = queue->Time2CoDel (timeVal);
           uint32_t ns3Result = queue->ControlLaw (codelTimeVal, interval, recInvSqrt); 
           uint32_t linuxResult = _codel_control_law (codelTimeVal, interval, recInvSqrt); 
-          NS_TEST_EXPECT_MSG_EQ (ns3Result, linuxResult, "Linux result for ControlLaw should equal ns-3 result");
+          NS_TEST_ASSERT_MSG_EQ (ns3Result, linuxResult, "Linux result for ControlLaw should equal ns-3 result");
         }
     }
 }
@@ -460,10 +456,8 @@
 }
 
 void
-CoDelQueueDiscBasicDrop::DropNextTracer (uint32_t oldVal, uint32_t newVal)
+CoDelQueueDiscBasicDrop::DropNextTracer ([[maybe_unused]] uint32_t oldVal, [[maybe_unused]] uint32_t newVal)
 {
-  NS_UNUSED(oldVal);
-  NS_UNUSED(newVal);
   m_dropNextCount++;
 }
 
@@ -483,13 +477,13 @@
       modeSize = 1;
     }
 
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (m_mode, modeSize * 500))),
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (m_mode, modeSize * 500))),
                          true, "Verify that we can actually set the attribute MaxSize");
 
   queue->Initialize ();
 
   Enqueue (queue, pktSize, 20);
-  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 20 * modeSize, "There should be 20 packets in queue.");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 20 * modeSize, "There should be 20 packets in queue.");
 
   // Although the first dequeue occurs with a sojourn time above target
   // the dequeue should be successful in this interval
@@ -635,10 +629,8 @@
 }
 
 void
-CoDelQueueDiscBasicMark::DropNextTracer (uint32_t oldVal, uint32_t newVal)
+CoDelQueueDiscBasicMark::DropNextTracer ([[maybe_unused]] uint32_t oldVal, [[maybe_unused]] uint32_t newVal)
 {
-  NS_UNUSED(oldVal);
-  NS_UNUSED(newVal);
   m_dropNextCount++;
 }
 
@@ -667,16 +659,16 @@
       modeSize = 1;
     }
 
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (m_mode, modeSize * 500))),
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (m_mode, modeSize * 500))),
                          true, "Verify that we can actually set the attribute MaxSize");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("UseEcn", BooleanValue (true)),
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("UseEcn", BooleanValue (true)),
                          true, "Verify that we can actually set the attribute UseEcn");
   
   queue->Initialize ();
 
   // Not-ECT traffic to induce packet drop
   Enqueue (queue, pktSize, 20, false);
-  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 20 * modeSize, "There should be 20 packets in queue.");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 20 * modeSize, "There should be 20 packets in queue.");
 
   // Although the first dequeue occurs with a sojourn time above target
   // there should not be any dropped packets in this interval
@@ -692,16 +684,16 @@
 
   // Test case 2, queue with ECN capable traffic for marking of packets instead of dropping
   queue = CreateObject<CoDelQueueDisc> ();
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (m_mode, modeSize * 500))),
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (m_mode, modeSize * 500))),
                          true, "Verify that we can actually set the attribute MaxSize");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("UseEcn", BooleanValue (true)),
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("UseEcn", BooleanValue (true)),
                          true, "Verify that we can actually set the attribute UseEcn");
 
   queue->Initialize ();
 
   // ECN capable traffic to induce packets to be marked
   Enqueue (queue, pktSize, 20, true);
-  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 20 * modeSize, "There should be 20 packets in queue.");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 20 * modeSize, "There should be 20 packets in queue.");
 
   // Although the first dequeue occurs with a sojourn time above target
   // there should not be any target exceeded marked packets in this interval
@@ -723,11 +715,11 @@
 
   // Test case 3, some packets are ECN capable, with CE threshold set to 2ms
   queue = CreateObject<CoDelQueueDisc> ();
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (m_mode, modeSize * 500))),
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (m_mode, modeSize * 500))),
                          true, "Verify that we can actually set the attribute MaxSize");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("UseEcn", BooleanValue (true)),
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("UseEcn", BooleanValue (true)),
                          true, "Verify that we can actually set the attribute UseEcn");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("CeThreshold", TimeValue (MilliSeconds (2))),
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("CeThreshold", TimeValue (MilliSeconds (2))),
                          true, "Verify that we can actually set the attribute CeThreshold");
   
   queue->Initialize ();
@@ -736,7 +728,7 @@
   Enqueue (queue, pktSize, 3, true);
   // Rest of the packet are not ecnCapable
   Enqueue (queue, pktSize, 17, false);
-  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 20 * modeSize, "There should be 20 packets in queue.");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 20 * modeSize, "There should be 20 packets in queue.");
 
   // Although the first dequeue occurs with a sojourn time above target
   // there should not be any target exceeded marked packets in this interval
@@ -758,18 +750,18 @@
 
   // Test case 4, queue with ECN capable traffic and CeThreshold set for marking of packets instead of dropping
   queue = CreateObject<CoDelQueueDisc> ();
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (m_mode, modeSize * 500))),
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (m_mode, modeSize * 500))),
                          true, "Verify that we can actually set the attribute MaxSize");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("UseEcn", BooleanValue (true)),
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("UseEcn", BooleanValue (true)),
                          true, "Verify that we can actually set the attribute UseEcn");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("CeThreshold", TimeValue (MilliSeconds (2))),
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("CeThreshold", TimeValue (MilliSeconds (2))),
                          true, "Verify that we can actually set the attribute CeThreshold");
 
   queue->Initialize ();
 
   // ECN capable traffic to induce packets to be marked
   Enqueue (queue, pktSize, 20, true);
-  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 20 * modeSize, "There should be 20 packets in queue.");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 20 * modeSize, "There should be 20 packets in queue.");
 
   // The first dequeue occurs with a sojourn time below CE threshold
   // there should not any be CE threshold exceeded marked packets
@@ -835,8 +827,8 @@
                   currentDropCount = queue->GetStats ().GetNDroppedPackets (CoDelQueueDisc::TARGET_EXCEEDED_DROP);
                   currentTargetMarkCount = queue->GetStats ().GetNMarkedPackets (CoDelQueueDisc::TARGET_EXCEEDED_MARK);
                   currentCeThreshMarkCount = queue->GetStats ().GetNMarkedPackets (CoDelQueueDisc::CE_THRESHOLD_EXCEEDED_MARK);
-                  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize ().GetValue (), initialQSize - modeSize, "There should be 1 packet dequeued.");
-                  NS_TEST_EXPECT_MSG_EQ (currentDropCount, 0, "There should not be any packet drops");
+                  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize ().GetValue (), initialQSize - modeSize, "There should be 1 packet dequeued.");
+                  NS_TEST_ASSERT_MSG_EQ (currentDropCount, 0, "There should not be any packet drops");
                   NS_TEST_ASSERT_MSG_EQ (currentTargetMarkCount, 0, "We are not in dropping state."
                                         "Sojourn time has just gone above target from below."
                                         "Hence, there should be no target exceeded marked packets");
@@ -849,11 +841,11 @@
                   currentTargetMarkCount = queue->GetStats ().GetNMarkedPackets (CoDelQueueDisc::TARGET_EXCEEDED_MARK);
                   nPacketsBeforeFirstMark = initialQSize;
                   currentCeThreshMarkCount = queue->GetStats ().GetNMarkedPackets (CoDelQueueDisc::CE_THRESHOLD_EXCEEDED_MARK);
-                  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize ().GetValue (), initialQSize - modeSize, "Sojourn time has been above target for at least interval."
+                  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize ().GetValue (), initialQSize - modeSize, "Sojourn time has been above target for at least interval."
                                         "We enter the dropping state and perform initial packet marking"
                                         "So there should be only 1 more packet dequeued.");
-                  NS_TEST_EXPECT_MSG_EQ (currentDropCount, 0, "There should not be any packet drops");
-                  NS_TEST_EXPECT_MSG_EQ (currentTargetMarkCount, 1, "There should be 1 target exceeded marked packet");
+                  NS_TEST_ASSERT_MSG_EQ (currentDropCount, 0, "There should not be any packet drops");
+                  NS_TEST_ASSERT_MSG_EQ (currentTargetMarkCount, 1, "There should be 1 target exceeded marked packet");
                   NS_TEST_ASSERT_MSG_EQ (currentCeThreshMarkCount, 0, "There should not be any CE threshold exceeded marked packet");
                 }
             }
@@ -864,12 +856,12 @@
                   currentDropCount = queue->GetStats ().GetNDroppedPackets (CoDelQueueDisc::TARGET_EXCEEDED_DROP);
                   currentTargetMarkCount = queue->GetStats ().GetNMarkedPackets (CoDelQueueDisc::TARGET_EXCEEDED_MARK);
                   currentCeThreshMarkCount = queue->GetStats ().GetNMarkedPackets (CoDelQueueDisc::CE_THRESHOLD_EXCEEDED_MARK);
-                  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize ().GetValue (), initialQSize - modeSize, "We are in dropping state."
+                  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize ().GetValue (), initialQSize - modeSize, "We are in dropping state."
                                         "Sojourn is still above target."
                                         "However, it's not time for next target exceeded mark."
                                         "So there should be only 1 more packet dequeued");
-                  NS_TEST_EXPECT_MSG_EQ (currentDropCount, 0, "There should not be any packet drops");
-                  NS_TEST_EXPECT_MSG_EQ (currentTargetMarkCount, 1, "There should still be only 1 target exceeded marked packet from the last dequeue");
+                  NS_TEST_ASSERT_MSG_EQ (currentDropCount, 0, "There should not be any packet drops");
+                  NS_TEST_ASSERT_MSG_EQ (currentTargetMarkCount, 1, "There should still be only 1 target exceeded marked packet from the last dequeue");
                   NS_TEST_ASSERT_MSG_EQ (currentCeThreshMarkCount, 0, "There should not be any CE threshold exceeded marked packet");
                 }
               else if (currentTime.GetMicroSeconds () >= initialDropNext)
@@ -877,12 +869,12 @@
                   currentDropCount = queue->GetStats ().GetNDroppedPackets (CoDelQueueDisc::TARGET_EXCEEDED_DROP);
                   currentTargetMarkCount = queue->GetStats ().GetNMarkedPackets (CoDelQueueDisc::TARGET_EXCEEDED_MARK);
                   currentCeThreshMarkCount = queue->GetStats ().GetNMarkedPackets (CoDelQueueDisc::CE_THRESHOLD_EXCEEDED_MARK);
-                  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize ().GetValue (), initialQSize - modeSize, "We are in dropping state."
+                  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize ().GetValue (), initialQSize - modeSize, "We are in dropping state."
                                         "It's time for packet to be marked"
                                         "So there should be only 1 more packet dequeued");
-                  NS_TEST_EXPECT_MSG_EQ (currentDropCount, 0, "There should not be any packet drops");
-                  NS_TEST_EXPECT_MSG_EQ (currentTargetMarkCount, 2, "There should 2 target exceeded marked packet");
-                  NS_TEST_EXPECT_MSG_EQ (nPacketsBeforeFirstDrop, nPacketsBeforeFirstMark, "Number of packets in the queue before drop should be equal"
+                  NS_TEST_ASSERT_MSG_EQ (currentDropCount, 0, "There should not be any packet drops");
+                  NS_TEST_ASSERT_MSG_EQ (currentTargetMarkCount, 2, "There should 2 target exceeded marked packet");
+                  NS_TEST_ASSERT_MSG_EQ (nPacketsBeforeFirstDrop, nPacketsBeforeFirstMark, "Number of packets in the queue before drop should be equal"
                                         "to number of packets in the queue before first mark as the behavior untill packet N should be the same.");
                   NS_TEST_ASSERT_MSG_EQ (currentCeThreshMarkCount, 0, "There should not be any CE threshold exceeded marked packet");
                 }
@@ -897,8 +889,8 @@
                   currentDropCount = queue->GetStats ().GetNDroppedPackets (CoDelQueueDisc::TARGET_EXCEEDED_DROP);
                   currentTargetMarkCount = queue->GetStats ().GetNMarkedPackets (CoDelQueueDisc::TARGET_EXCEEDED_MARK);
                   currentCeThreshMarkCount = queue->GetStats ().GetNMarkedPackets (CoDelQueueDisc::CE_THRESHOLD_EXCEEDED_MARK);
-                  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize ().GetValue (), initialQSize - modeSize, "There should be 1 packet dequeued.");
-                  NS_TEST_EXPECT_MSG_EQ (currentDropCount, 0, "There should not be any packet drops");
+                  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize ().GetValue (), initialQSize - modeSize, "There should be 1 packet dequeued.");
+                  NS_TEST_ASSERT_MSG_EQ (currentDropCount, 0, "There should not be any packet drops");
                   NS_TEST_ASSERT_MSG_EQ (currentTargetMarkCount, 0, "We are not in dropping state."
                                         "Sojourn time has just gone above target from below."
                                         "Hence, there should be no target exceeded marked packets");
@@ -910,12 +902,12 @@
                   currentDropCount = queue->GetStats ().GetNDroppedPackets (CoDelQueueDisc::TARGET_EXCEEDED_DROP);
                   currentTargetMarkCount = queue->GetStats ().GetNMarkedPackets (CoDelQueueDisc::TARGET_EXCEEDED_MARK);
                   currentCeThreshMarkCount = queue->GetStats ().GetNMarkedPackets (CoDelQueueDisc::CE_THRESHOLD_EXCEEDED_MARK);
-                  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize ().GetValue (), initialQSize - modeSize, "Sojourn time has been above target for at least interval."
+                  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize ().GetValue (), initialQSize - modeSize, "Sojourn time has been above target for at least interval."
                                         "We enter the dropping state and perform initial packet marking"
                                         "So there should be only 1 more packet dequeued.");
-                  NS_TEST_EXPECT_MSG_EQ (currentDropCount, 0, "There should not be any packet drops");
-                  NS_TEST_EXPECT_MSG_EQ (currentTargetMarkCount, 1, "There should be 1 target exceeded marked packet");
-                  NS_TEST_EXPECT_MSG_EQ (currentCeThreshMarkCount, 1, "There should be 1 CE threshold exceeded marked packets");
+                  NS_TEST_ASSERT_MSG_EQ (currentDropCount, 0, "There should not be any packet drops");
+                  NS_TEST_ASSERT_MSG_EQ (currentTargetMarkCount, 1, "There should be 1 target exceeded marked packet");
+                  NS_TEST_ASSERT_MSG_EQ (currentCeThreshMarkCount, 1, "There should be 1 CE threshold exceeded marked packets");
                 }
             }
           else if (initialTargetMarkCount > 0)
@@ -925,25 +917,25 @@
                   currentDropCount = queue->GetStats ().GetNDroppedPackets (CoDelQueueDisc::TARGET_EXCEEDED_DROP);
                   currentTargetMarkCount = queue->GetStats ().GetNMarkedPackets (CoDelQueueDisc::TARGET_EXCEEDED_MARK);
                   currentCeThreshMarkCount = queue->GetStats ().GetNMarkedPackets (CoDelQueueDisc::CE_THRESHOLD_EXCEEDED_MARK);
-                  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize ().GetValue (), initialQSize - modeSize, "We are in dropping state."
+                  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize ().GetValue (), initialQSize - modeSize, "We are in dropping state."
                                         "Sojourn is still above target."
                                         "However, it's not time for next target exceeded mark."
                                         "So there should be only 1 more packet dequeued");
-                  NS_TEST_EXPECT_MSG_EQ (currentDropCount, 0, "There should not be any packet drops");
-                  NS_TEST_EXPECT_MSG_EQ (currentTargetMarkCount, 1, "There should still be only 1 target exceeded marked packet from the last dequeue");
-                  NS_TEST_EXPECT_MSG_EQ (currentCeThreshMarkCount, 2, "There should be 2 CE threshold exceeded marked packets");
+                  NS_TEST_ASSERT_MSG_EQ (currentDropCount, 0, "There should not be any packet drops");
+                  NS_TEST_ASSERT_MSG_EQ (currentTargetMarkCount, 1, "There should still be only 1 target exceeded marked packet from the last dequeue");
+                  NS_TEST_ASSERT_MSG_EQ (currentCeThreshMarkCount, 2, "There should be 2 CE threshold exceeded marked packets");
                 }
               else if (currentTime.GetMicroSeconds () >= initialDropNext)
                 {
                   currentDropCount = queue->GetStats ().GetNDroppedPackets (CoDelQueueDisc::TARGET_EXCEEDED_DROP);
                   currentTargetMarkCount = queue->GetStats ().GetNMarkedPackets (CoDelQueueDisc::TARGET_EXCEEDED_MARK);
                   currentCeThreshMarkCount = queue->GetStats ().GetNMarkedPackets (CoDelQueueDisc::CE_THRESHOLD_EXCEEDED_MARK);
-                  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize ().GetValue (), initialQSize - (m_dropNextCount + 1) * modeSize, "We are in dropping state."
+                  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize ().GetValue (), initialQSize - (m_dropNextCount + 1) * modeSize, "We are in dropping state."
                                         "It's time for packet to be dropped as packets are not ecnCapable"
                                         "The number of packets dequeued equals to the number of times m_dropNext is updated plus initial dequeue");
-                  NS_TEST_EXPECT_MSG_EQ (currentDropCount, m_dropNextCount, "The number of drops equals to the number of times m_dropNext is updated");
-                  NS_TEST_EXPECT_MSG_EQ (currentTargetMarkCount, 1, "There should still be only 1 target exceeded marked packet");
-                  NS_TEST_EXPECT_MSG_EQ (currentCeThreshMarkCount, 2, "There should still be 2 CE threshold exceeded marked packet as packets are not ecnCapable");
+                  NS_TEST_ASSERT_MSG_EQ (currentDropCount, m_dropNextCount, "The number of drops equals to the number of times m_dropNext is updated");
+                  NS_TEST_ASSERT_MSG_EQ (currentTargetMarkCount, 1, "There should still be only 1 target exceeded marked packet");
+                  NS_TEST_ASSERT_MSG_EQ (currentCeThreshMarkCount, 2, "There should still be 2 CE threshold exceeded marked packet as packets are not ecnCapable");
                 }
             }
         }
@@ -955,8 +947,8 @@
                 {
                   currentDropCount = queue->GetStats ().GetNDroppedPackets (CoDelQueueDisc::TARGET_EXCEEDED_DROP);
                   currentCeThreshMarkCount = queue->GetStats ().GetNMarkedPackets (CoDelQueueDisc::CE_THRESHOLD_EXCEEDED_MARK);
-                  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize ().GetValue (), initialQSize - modeSize, "There should be 1 packet dequeued.");
-                  NS_TEST_EXPECT_MSG_EQ (currentDropCount, 0, "There should not be any packet drops");
+                  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize ().GetValue (), initialQSize - modeSize, "There should be 1 packet dequeued.");
+                  NS_TEST_ASSERT_MSG_EQ (currentDropCount, 0, "There should not be any packet drops");
                   NS_TEST_ASSERT_MSG_EQ (currentCeThreshMarkCount, 0, "Sojourn time has not gone above CE threshold."
                                         "Hence, there should not be any CE threshold exceeded marked packet");
                 }
@@ -964,9 +956,9 @@
                 {
                   currentDropCount = queue->GetStats ().GetNDroppedPackets (CoDelQueueDisc::TARGET_EXCEEDED_DROP);
                   currentCeThreshMarkCount = queue->GetStats ().GetNMarkedPackets (CoDelQueueDisc::CE_THRESHOLD_EXCEEDED_MARK);
-                  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize ().GetValue (), initialQSize - modeSize, "There should be only 1 more packet dequeued.");
-                  NS_TEST_EXPECT_MSG_EQ (currentDropCount, 0, "There should not be any packet drops");
-                  NS_TEST_EXPECT_MSG_EQ (currentCeThreshMarkCount, 1, "Sojourn time has gone above CE threshold."
+                  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize ().GetValue (), initialQSize - modeSize, "There should be only 1 more packet dequeued.");
+                  NS_TEST_ASSERT_MSG_EQ (currentDropCount, 0, "There should not be any packet drops");
+                  NS_TEST_ASSERT_MSG_EQ (currentCeThreshMarkCount, 1, "Sojourn time has gone above CE threshold."
                                         "There should be 1 CE threshold exceeded marked packet");
                 }
             }
@@ -976,17 +968,17 @@
                 {
                   currentDropCount = queue->GetStats ().GetNDroppedPackets (CoDelQueueDisc::TARGET_EXCEEDED_DROP);
                   currentCeThreshMarkCount = queue->GetStats ().GetNMarkedPackets (CoDelQueueDisc::CE_THRESHOLD_EXCEEDED_MARK);
-                  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize ().GetValue (), initialQSize - modeSize, "There should be only 1 more packet dequeued.");
-                  NS_TEST_EXPECT_MSG_EQ (currentDropCount, 0, "There should not be any packet drops");
-                  NS_TEST_EXPECT_MSG_EQ (currentCeThreshMarkCount, 2, "There should be 2 CE threshold exceeded marked packets");
+                  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize ().GetValue (), initialQSize - modeSize, "There should be only 1 more packet dequeued.");
+                  NS_TEST_ASSERT_MSG_EQ (currentDropCount, 0, "There should not be any packet drops");
+                  NS_TEST_ASSERT_MSG_EQ (currentCeThreshMarkCount, 2, "There should be 2 CE threshold exceeded marked packets");
                 }
               else
                 { // In dropping state
                   currentDropCount = queue->GetStats ().GetNDroppedPackets (CoDelQueueDisc::TARGET_EXCEEDED_DROP);
                   currentCeThreshMarkCount = queue->GetStats ().GetNMarkedPackets (CoDelQueueDisc::CE_THRESHOLD_EXCEEDED_MARK);
-                  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize ().GetValue (), initialQSize - modeSize, "There should be only 1 more packet dequeued.");
-                  NS_TEST_EXPECT_MSG_EQ (currentDropCount, 0, "There should not be any packet drops");
-                  NS_TEST_EXPECT_MSG_EQ (currentCeThreshMarkCount, 3, "There should be 3 CE threshold exceeded marked packet");
+                  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize ().GetValue (), initialQSize - modeSize, "There should be only 1 more packet dequeued.");
+                  NS_TEST_ASSERT_MSG_EQ (currentDropCount, 0, "There should not be any packet drops");
+                  NS_TEST_ASSERT_MSG_EQ (currentCeThreshMarkCount, 3, "There should be 3 CE threshold exceeded marked packet");
                 }
             }
         }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/traffic-control/test/fifo-queue-disc-test-suite.cc ns-3.36/src/traffic-control/test/fifo-queue-disc-test-suite.cc
--- ns-3.35/src/traffic-control/test/fifo-queue-disc-test-suite.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/traffic-control/test/fifo-queue-disc-test-suite.cc	2022-04-30 18:23:58.170735000 -0700
@@ -50,22 +50,16 @@
    */
   FifoQueueDiscTestItem (Ptr<Packet> p, const Address & addr);
   virtual ~FifoQueueDiscTestItem ();
+
+  // Delete copy constructor and assignment operator to avoid misuse
+  FifoQueueDiscTestItem (const FifoQueueDiscTestItem &) = delete;
+  FifoQueueDiscTestItem & operator = (const FifoQueueDiscTestItem &) = delete;
+
   virtual void AddHeader (void);
   virtual bool Mark (void);
 
 private:
   FifoQueueDiscTestItem ();
-  /**
-   * \brief Copy constructor
-   * Disable default implementation to avoid misuse
-   */
-  FifoQueueDiscTestItem (const FifoQueueDiscTestItem &);
-  /**
-   * \brief Assignment operator
-   * \return this object
-   * Disable default implementation to avoid misuse
-   */
-  FifoQueueDiscTestItem &operator = (const FifoQueueDiscTestItem &);
 };
 
 FifoQueueDiscTestItem::FifoQueueDiscTestItem (Ptr<Packet> p, const Address & addr)
@@ -129,7 +123,7 @@
   uint32_t modeSize = (q->GetMaxSize ().GetUnit () == QueueSizeUnit::PACKETS ? 1 : pktSize);
   uint32_t numPackets = qSize / modeSize;
 
-  NS_TEST_EXPECT_MSG_EQ (q->GetCurrentSize ().GetValue (), 0, "The queue disc should be empty");
+  NS_TEST_ASSERT_MSG_EQ (q->GetCurrentSize ().GetValue (), 0, "The queue disc should be empty");
 
   // create and enqueue numPackets packets and store their UIDs; check they are all enqueued
   for (uint32_t i = 1; i <= numPackets; i++)
@@ -137,24 +131,24 @@
       p = Create<Packet> (pktSize);
       uids.push_back (p->GetUid ());
       q->Enqueue (Create<FifoQueueDiscTestItem> (p, dest));
-      NS_TEST_EXPECT_MSG_EQ (q->GetCurrentSize ().GetValue (), i * modeSize, "There should be " << i << " packet(s) in there");
+      NS_TEST_ASSERT_MSG_EQ (q->GetCurrentSize ().GetValue (), i * modeSize, "There should be " << i << " packet(s) in there");
     }
 
   // no room for another packet
-  NS_TEST_EXPECT_MSG_EQ (q->Enqueue (Create<FifoQueueDiscTestItem> (p, dest)), 
+  NS_TEST_ASSERT_MSG_EQ (q->Enqueue (Create<FifoQueueDiscTestItem> (p, dest)), 
                          false, "There should be no room for another packet");
 
   // dequeue and check packet order
   for (uint32_t i = 1; i <= numPackets; i++)
     {
       item = q->Dequeue ();
-      NS_TEST_EXPECT_MSG_EQ ((item != 0), true, "A packet should have been dequeued");
-      NS_TEST_EXPECT_MSG_EQ (q->GetCurrentSize ().GetValue (), (numPackets-i) * modeSize, "There should be " << numPackets-i << " packet(s) in there");
-      NS_TEST_EXPECT_MSG_EQ (item->GetPacket ()->GetUid (), uids[i-1], "was this the right packet?");
+      NS_TEST_ASSERT_MSG_EQ ((item != 0), true, "A packet should have been dequeued");
+      NS_TEST_ASSERT_MSG_EQ (q->GetCurrentSize ().GetValue (), (numPackets-i) * modeSize, "There should be " << numPackets-i << " packet(s) in there");
+      NS_TEST_ASSERT_MSG_EQ (item->GetPacket ()->GetUid (), uids[i-1], "was this the right packet?");
     }
 
   item = q->Dequeue ();
-  NS_TEST_EXPECT_MSG_EQ ((item == 0), true, "There are really no packets in there");
+  NS_TEST_ASSERT_MSG_EQ ((item == 0), true, "There are really no packets in there");
 }
 
 void
@@ -168,9 +162,9 @@
   // test 1: set the limit on the queue disc before initialization
   queue = CreateObject<FifoQueueDisc> ();
 
-  NS_TEST_EXPECT_MSG_EQ (queue->GetNInternalQueues (), 0, "Verify that the queue disc has no internal queue");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetNInternalQueues (), 0, "Verify that the queue disc has no internal queue");
 
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize",
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize",
                                                       QueueSizeValue (QueueSize (mode, numPackets*modeSize))),
                          true, "Verify that we can actually set the attribute MaxSize");
 
@@ -182,11 +176,11 @@
   // test 2: set the limit on the queue disc after initialization
   queue = CreateObject<FifoQueueDisc> ();
 
-  NS_TEST_EXPECT_MSG_EQ (queue->GetNInternalQueues (), 0, "Verify that the queue disc has no internal queue");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetNInternalQueues (), 0, "Verify that the queue disc has no internal queue");
 
   queue->Initialize ();
 
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize",
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize",
                                                       QueueSizeValue (QueueSize (mode, numPackets*modeSize))),
                          true, "Verify that we can actually set the attribute MaxSize");
 
@@ -196,7 +190,7 @@
   // test 3: set the limit on the internal queue before initialization
   queue = CreateObject<FifoQueueDisc> ();
 
-  NS_TEST_EXPECT_MSG_EQ (queue->GetNInternalQueues (), 0, "Verify that the queue disc has no internal queue");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetNInternalQueues (), 0, "Verify that the queue disc has no internal queue");
 
   ObjectFactory factory;
   factory.SetTypeId ("ns3::DropTailQueue<QueueDiscItem>");
@@ -218,23 +212,23 @@
   // test 4: set the limit on the internal queue after initialization
   queue = CreateObject<FifoQueueDisc> ();
 
-  NS_TEST_EXPECT_MSG_EQ (queue->GetNInternalQueues (), 0, "Verify that the queue disc has no internal queue");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetNInternalQueues (), 0, "Verify that the queue disc has no internal queue");
 
   queue->Initialize ();
 
-  NS_TEST_EXPECT_MSG_EQ (queue->GetNInternalQueues (), 1, "Verify that the queue disc got an internal queue");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetNInternalQueues (), 1, "Verify that the queue disc got an internal queue");
 
   Ptr<QueueDisc::InternalQueue> iq = queue->GetInternalQueue (0);
 
   if (mode == QueueSizeUnit::PACKETS)
     {
-      NS_TEST_EXPECT_MSG_EQ (iq->SetAttributeFailSafe ("MaxSize",
+      NS_TEST_ASSERT_MSG_EQ (iq->SetAttributeFailSafe ("MaxSize",
                                                        QueueSizeValue (QueueSize  (QueueSizeUnit::PACKETS, numPackets))),
                              true, "Verify that we can actually set the attribute MaxSize on the internal queue");
     }
   else
     {
-      NS_TEST_EXPECT_MSG_EQ (iq->SetAttributeFailSafe ("MaxSize",
+      NS_TEST_ASSERT_MSG_EQ (iq->SetAttributeFailSafe ("MaxSize",
                                                        QueueSizeValue (QueueSize  (QueueSizeUnit::BYTES, numPackets*pktSize))),
                              true, "Verify that we can actually set the attribute MaxSize on the internal queue");
     }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/traffic-control/test/pie-queue-disc-test-suite.cc ns-3.36/src/traffic-control/test/pie-queue-disc-test-suite.cc
--- ns-3.35/src/traffic-control/test/pie-queue-disc-test-suite.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/traffic-control/test/pie-queue-disc-test-suite.cc	2022-04-30 18:23:58.170735000 -0700
@@ -50,6 +50,11 @@
    */
   PieQueueDiscTestItem (Ptr<Packet> p, const Address & addr, bool ecnCapable);
   virtual ~PieQueueDiscTestItem ();
+
+  // Delete copy constructor and assignment operator to avoid misuse
+  PieQueueDiscTestItem (const PieQueueDiscTestItem &) = delete;
+  PieQueueDiscTestItem & operator = (const PieQueueDiscTestItem &) = delete;
+
   virtual void AddHeader (void);
   virtual bool Mark (void);
 
@@ -73,17 +78,7 @@
 
 private:
   PieQueueDiscTestItem ();
-  /**
-   * \brief Copy constructor
-   * Disable default implementation to avoid misuse
-   */
-  PieQueueDiscTestItem (const PieQueueDiscTestItem &);
-  /**
-   * \brief Assignment operator
-   * \return this object
-   * Disable default implementation to avoid misuse
-   */
-  PieQueueDiscTestItem &operator = (const PieQueueDiscTestItem &);
+
   bool m_ecnCapablePacket; //!< ECN capable packet?
 };
 
@@ -207,7 +202,7 @@
       qSize = qSize * modeSize;
     }
 
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
                          true, "Verify that we can actually set the attribute MaxSize");
 
   Ptr<Packet> p1, p2, p3, p4, p5, p6, p7, p8;
@@ -221,35 +216,35 @@
   p8 = Create<Packet> (pktSize);
 
   queue->Initialize ();
-  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 0 * modeSize, "There should be no packets in there");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 0 * modeSize, "There should be no packets in there");
   queue->Enqueue (Create<PieQueueDiscTestItem> (p1, dest, false));
-  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 1 * modeSize, "There should be one packet in there");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 1 * modeSize, "There should be one packet in there");
   queue->Enqueue (Create<PieQueueDiscTestItem> (p2, dest, false));
-  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 2 * modeSize, "There should be two packets in there");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 2 * modeSize, "There should be two packets in there");
   queue->Enqueue (Create<PieQueueDiscTestItem> (p3, dest, false));
   queue->Enqueue (Create<PieQueueDiscTestItem> (p4, dest, false));
   queue->Enqueue (Create<PieQueueDiscTestItem> (p5, dest, false));
   queue->Enqueue (Create<PieQueueDiscTestItem> (p6, dest, false));
   queue->Enqueue (Create<PieQueueDiscTestItem> (p7, dest, false));
   queue->Enqueue (Create<PieQueueDiscTestItem> (p8, dest, false));
-  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 8 * modeSize, "There should be eight packets in there");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 8 * modeSize, "There should be eight packets in there");
 
   Ptr<QueueDiscItem> item;
 
   item = queue->Dequeue ();
-  NS_TEST_EXPECT_MSG_EQ ((item != 0), true, "I want to remove the first packet");
-  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 7 * modeSize, "There should be seven packets in there");
-  NS_TEST_EXPECT_MSG_EQ (item->GetPacket ()->GetUid (), p1->GetUid (), "was this the first packet ?");
+  NS_TEST_ASSERT_MSG_EQ ((item != 0), true, "I want to remove the first packet");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 7 * modeSize, "There should be seven packets in there");
+  NS_TEST_ASSERT_MSG_EQ (item->GetPacket ()->GetUid (), p1->GetUid (), "was this the first packet ?");
 
   item = queue->Dequeue ();
-  NS_TEST_EXPECT_MSG_EQ ((item != 0), true, "I want to remove the second packet");
-  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 6 * modeSize, "There should be six packet in there");
-  NS_TEST_EXPECT_MSG_EQ (item->GetPacket ()->GetUid (), p2->GetUid (), "Was this the second packet ?");
+  NS_TEST_ASSERT_MSG_EQ ((item != 0), true, "I want to remove the second packet");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 6 * modeSize, "There should be six packet in there");
+  NS_TEST_ASSERT_MSG_EQ (item->GetPacket ()->GetUid (), p2->GetUid (), "Was this the second packet ?");
 
   item = queue->Dequeue ();
-  NS_TEST_EXPECT_MSG_EQ ((item != 0), true, "I want to remove the third packet");
-  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 5 * modeSize, "There should be five packets in there");
-  NS_TEST_EXPECT_MSG_EQ (item->GetPacket ()->GetUid (), p3->GetUid (), "Was this the third packet ?");
+  NS_TEST_ASSERT_MSG_EQ ((item != 0), true, "I want to remove the third packet");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 5 * modeSize, "There should be five packets in there");
+  NS_TEST_ASSERT_MSG_EQ (item->GetPacket ()->GetUid (), p3->GetUid (), "Was this the third packet ?");
 
   item = queue->Dequeue ();
   item = queue->Dequeue ();
@@ -258,7 +253,7 @@
   item = queue->Dequeue ();
 
   item = queue->Dequeue ();
-  NS_TEST_EXPECT_MSG_EQ ((item == 0), true, "There are really no packets in there");
+  NS_TEST_ASSERT_MSG_EQ ((item == 0), true, "There are really no packets in there");
 
 
   // test 2: more data with defaults, unforced drops but no forced drops
@@ -266,15 +261,15 @@
   // PieQueueDiscItem pointer for attributes
   testAttributes = Create<PieQueueDiscTestItem> (Create<Packet> (pktSize), dest, false);
   pktSize = 1000;  // pktSize != 0 because DequeueThreshold always works in bytes
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
                          true, "Verify that we can actually set the attribute MaxSize");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("Tupdate", TimeValue (Seconds (0.03))), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("Tupdate", TimeValue (Seconds (0.03))), true,
                          "Verify that we can actually set the attribute Tupdate");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("DequeueThreshold", UintegerValue (10000)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("DequeueThreshold", UintegerValue (10000)), true,
                          "Verify that we can actually set the attribute DequeueThreshold");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("QueueDelayReference", TimeValue (Seconds (0.02))), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("QueueDelayReference", TimeValue (Seconds (0.02))), true,
                          "Verify that we can actually set the attribute QueueDelayReference");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxBurstAllowance", TimeValue (Seconds (0.1))), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxBurstAllowance", TimeValue (Seconds (0.1))), true,
                          "Verify that we can actually set the attribute MaxBurstAllowance");
   queue->Initialize ();
   EnqueueWithDelay (queue, pktSize, 400, testAttributes);
@@ -283,23 +278,23 @@
   Simulator::Run ();
   QueueDisc::Stats st = queue->GetStats ();
   uint32_t test2 = st.GetNDroppedPackets (PieQueueDisc::UNFORCED_DROP);
-  NS_TEST_EXPECT_MSG_NE (test2, 0, "There should be some unforced drops");
-  NS_TEST_EXPECT_MSG_EQ (st.GetNDroppedPackets (PieQueueDisc::FORCED_DROP), 0, "There should be zero forced drops");
+  NS_TEST_ASSERT_MSG_NE (test2, 0, "There should be some unforced drops");
+  NS_TEST_ASSERT_MSG_EQ (st.GetNDroppedPackets (PieQueueDisc::FORCED_DROP), 0, "There should be zero forced drops");
 
 
   // test 3: same as test 2, but with higher QueueDelayReference
   queue = CreateObject<PieQueueDisc> ();
   // PieQueueDiscItem pointer for attributes
   testAttributes = Create<PieQueueDiscTestItem> (Create<Packet> (pktSize), dest, false);
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
                          true, "Verify that we can actually set the attribute MaxSize");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("Tupdate", TimeValue (Seconds (0.03))), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("Tupdate", TimeValue (Seconds (0.03))), true,
                          "Verify that we can actually set the attribute Tupdate");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("DequeueThreshold", UintegerValue (10000)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("DequeueThreshold", UintegerValue (10000)), true,
                          "Verify that we can actually set the attribute DequeueThreshold");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("QueueDelayReference", TimeValue (Seconds (0.08))), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("QueueDelayReference", TimeValue (Seconds (0.08))), true,
                          "Verify that we can actually set the attribute QueueDelayReference");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxBurstAllowance", TimeValue (Seconds (0.1))), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxBurstAllowance", TimeValue (Seconds (0.1))), true,
                          "Verify that we can actually set the attribute MaxBurstAllowance");
   queue->Initialize ();
   EnqueueWithDelay (queue, pktSize, 400, testAttributes);
@@ -308,23 +303,23 @@
   Simulator::Run ();
   st = queue->GetStats ();
   uint32_t test3 = st.GetNDroppedPackets (PieQueueDisc::UNFORCED_DROP);
-  NS_TEST_EXPECT_MSG_LT (test3, test2, "Test 3 should have less unforced drops than test 2");
-  NS_TEST_EXPECT_MSG_EQ (st.GetNDroppedPackets (PieQueueDisc::FORCED_DROP), 0, "There should be zero forced drops");
+  NS_TEST_ASSERT_MSG_LT (test3, test2, "Test 3 should have less unforced drops than test 2");
+  NS_TEST_ASSERT_MSG_EQ (st.GetNDroppedPackets (PieQueueDisc::FORCED_DROP), 0, "There should be zero forced drops");
 
 
   // test 4: same as test 2, but with reduced dequeue rate
   queue = CreateObject<PieQueueDisc> ();
   // PieQueueDiscItem pointer for attributes
   testAttributes = Create<PieQueueDiscTestItem> (Create<Packet> (pktSize), dest, false);
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
                          true, "Verify that we can actually set the attribute MaxSize");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("Tupdate", TimeValue (Seconds (0.03))), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("Tupdate", TimeValue (Seconds (0.03))), true,
                          "Verify that we can actually set the attribute Tupdate");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("DequeueThreshold", UintegerValue (10000)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("DequeueThreshold", UintegerValue (10000)), true,
                          "Verify that we can actually set the attribute DequeueThreshold");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("QueueDelayReference", TimeValue (Seconds (0.02))), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("QueueDelayReference", TimeValue (Seconds (0.02))), true,
                          "Verify that we can actually set the attribute QueueDelayReference");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxBurstAllowance", TimeValue (Seconds (0.1))), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxBurstAllowance", TimeValue (Seconds (0.1))), true,
                          "Verify that we can actually set the attribute MaxBurstAllowance");
   queue->Initialize ();
   EnqueueWithDelay (queue, pktSize, 400, testAttributes);
@@ -333,23 +328,23 @@
   Simulator::Run ();
   st = queue->GetStats ();
   uint32_t test4 = st.GetNDroppedPackets (PieQueueDisc::UNFORCED_DROP);
-  NS_TEST_EXPECT_MSG_GT (test4, test2, "Test 4 should have more unforced drops than test 2");
-  NS_TEST_EXPECT_MSG_EQ (st.GetNDroppedPackets (PieQueueDisc::FORCED_DROP), 0, "There should be zero forced drops");
+  NS_TEST_ASSERT_MSG_GT (test4, test2, "Test 4 should have more unforced drops than test 2");
+  NS_TEST_ASSERT_MSG_EQ (st.GetNDroppedPackets (PieQueueDisc::FORCED_DROP), 0, "There should be zero forced drops");
 
 
   // test 5: same dequeue rate as test 4, but with higher Tupdate
   queue = CreateObject<PieQueueDisc> ();
   // PieQueueDiscItem pointer for attributes
   testAttributes = Create<PieQueueDiscTestItem> (Create<Packet> (pktSize), dest, false);
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
                          true, "Verify that we can actually set the attribute MaxSize");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("Tupdate", TimeValue (Seconds (0.09))), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("Tupdate", TimeValue (Seconds (0.09))), true,
                          "Verify that we can actually set the attribute Tupdate");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("DequeueThreshold", UintegerValue (10000)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("DequeueThreshold", UintegerValue (10000)), true,
                          "Verify that we can actually set the attribute DequeueThreshold");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("QueueDelayReference", TimeValue (Seconds (0.02))), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("QueueDelayReference", TimeValue (Seconds (0.02))), true,
                          "Verify that we can actually set the attribute QueueDelayReference");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxBurstAllowance", TimeValue (Seconds (0.1))), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxBurstAllowance", TimeValue (Seconds (0.1))), true,
                          "Verify that we can actually set the attribute MaxBurstAllowance");
   queue->Initialize ();
   EnqueueWithDelay (queue, pktSize, 400, testAttributes);
@@ -358,17 +353,17 @@
   Simulator::Run ();
   st = queue->GetStats ();
   uint32_t test5 = st.GetNDroppedPackets (PieQueueDisc::UNFORCED_DROP);
-  NS_TEST_EXPECT_MSG_LT (test5, test4, "Test 5 should have less unforced drops than test 4");
-  NS_TEST_EXPECT_MSG_EQ (st.GetNDroppedPackets (PieQueueDisc::FORCED_DROP), 0, "There should be zero forced drops");
+  NS_TEST_ASSERT_MSG_LT (test5, test4, "Test 5 should have less unforced drops than test 4");
+  NS_TEST_ASSERT_MSG_EQ (st.GetNDroppedPackets (PieQueueDisc::FORCED_DROP), 0, "There should be zero forced drops");
 
 
   // test 6: same as test 2, but with UseDequeueRateEstimator enabled
   queue = CreateObject<PieQueueDisc> ();
   // PieQueueDiscItem pointer for attributes
   testAttributes = Create<PieQueueDiscTestItem> (Create<Packet> (pktSize), dest, false);
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
                          true, "Verify that we can actually set the attribute MaxSize");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("UseDequeueRateEstimator", BooleanValue (true)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("UseDequeueRateEstimator", BooleanValue (true)), true,
                          "Verify that we can actually set the attribute UseTimestamp");
   queue->Initialize ();
   EnqueueWithDelay (queue, pktSize, 400, testAttributes);
@@ -377,17 +372,17 @@
   Simulator::Run ();
   st = queue->GetStats ();
   uint32_t test6 = st.GetNDroppedPackets (PieQueueDisc::UNFORCED_DROP);
-  NS_TEST_EXPECT_MSG_NE (test6, 0, "There should be some unforced drops");
-  NS_TEST_EXPECT_MSG_EQ (st.GetNDroppedPackets (PieQueueDisc::FORCED_DROP), 0, "There should be zero forced drops");
+  NS_TEST_ASSERT_MSG_NE (test6, 0, "There should be some unforced drops");
+  NS_TEST_ASSERT_MSG_EQ (st.GetNDroppedPackets (PieQueueDisc::FORCED_DROP), 0, "There should be zero forced drops");
 
 
   // test 7: test with CapDropAdjustment disabled
   queue = CreateObject<PieQueueDisc> ();
   // PieQueueDiscItem pointer for attributes
   testAttributes = Create<PieQueueDiscTestItem> (Create<Packet> (pktSize), dest, false);
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
                          true, "Verify that we can actually set the attribute MaxSize");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("UseCapDropAdjustment", BooleanValue (false)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("UseCapDropAdjustment", BooleanValue (false)), true,
                          "Verify that we can actually set the attribute UseCapDropAdjustment");
   queue->Initialize ();
   testAttributes->m_checkProb = true;
@@ -397,9 +392,9 @@
   Simulator::Run ();
   st = queue->GetStats ();
   uint32_t test7 = st.GetNDroppedPackets (PieQueueDisc::UNFORCED_DROP);
-  NS_TEST_EXPECT_MSG_NE (test7, 0, "There should be some unforced drops");
-  NS_TEST_EXPECT_MSG_EQ (st.GetNDroppedPackets (PieQueueDisc::FORCED_DROP), 0, "There should be zero forced drops");
-  NS_TEST_EXPECT_MSG_GT (testAttributes->m_maxDropProbDiff, 0.02,
+  NS_TEST_ASSERT_MSG_NE (test7, 0, "There should be some unforced drops");
+  NS_TEST_ASSERT_MSG_EQ (st.GetNDroppedPackets (PieQueueDisc::FORCED_DROP), 0, "There should be zero forced drops");
+  NS_TEST_ASSERT_MSG_GT (testAttributes->m_maxDropProbDiff, 0.02,
                               "Maximum increase in drop probability should be greater than 0.02");
 
 
@@ -407,9 +402,9 @@
   queue = CreateObject<PieQueueDisc> ();
   // PieQueueDiscItem pointer for attributes
   testAttributes = Create<PieQueueDiscTestItem> (Create<Packet> (pktSize), dest, false);
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
                          true, "Verify that we can actually set the attribute MaxSize");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("UseCapDropAdjustment", BooleanValue (true)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("UseCapDropAdjustment", BooleanValue (true)), true,
                          "Verify that we can actually set the attribute UseCapDropAdjustment");
   queue->Initialize ();
   testAttributes->m_checkProb = true;
@@ -419,9 +414,9 @@
   Simulator::Run ();
   st = queue->GetStats ();
   uint32_t test8 = st.GetNDroppedPackets (PieQueueDisc::UNFORCED_DROP);
-  NS_TEST_EXPECT_MSG_NE (test8, 0, "There should be some unforced drops");
-  NS_TEST_EXPECT_MSG_EQ (st.GetNDroppedPackets (PieQueueDisc::FORCED_DROP), 0, "There should be zero forced drops");
-  NS_TEST_EXPECT_MSG_LT (testAttributes->m_maxDropProbDiff, 0.0200000000000001,
+  NS_TEST_ASSERT_MSG_NE (test8, 0, "There should be some unforced drops");
+  NS_TEST_ASSERT_MSG_EQ (st.GetNDroppedPackets (PieQueueDisc::FORCED_DROP), 0, "There should be zero forced drops");
+  NS_TEST_ASSERT_MSG_LT (testAttributes->m_maxDropProbDiff, 0.0200000000000001,
                               "Maximum increase in drop probability should be less than or equal to 0.02");
 
   
@@ -429,11 +424,11 @@
   queue = CreateObject<PieQueueDisc> ();
   // PieQueueDiscItem pointer for attributes
   testAttributes = Create<PieQueueDiscTestItem> (Create<Packet> (pktSize), dest, false);
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
                          true, "Verify that we can actually set the attribute MaxSize");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("UseEcn", BooleanValue (true)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("UseEcn", BooleanValue (true)), true,
                          "Verify that we can actually set the attribute UseEcn");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MarkEcnThreshold", DoubleValue (0.3)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MarkEcnThreshold", DoubleValue (0.3)), true,
                         "Verify that we can actually set the attribute MarkEcnThreshold");
   queue->Initialize ();
   EnqueueWithDelay (queue, pktSize, 400, testAttributes);
@@ -442,20 +437,20 @@
   Simulator::Run ();
   st = queue->GetStats ();
   uint32_t test9 = st.GetNMarkedPackets (PieQueueDisc::UNFORCED_MARK);
-  NS_TEST_EXPECT_MSG_EQ (test9, 0, "There should be zero unforced marks");
-  NS_TEST_EXPECT_MSG_NE (st.GetNDroppedPackets (PieQueueDisc::UNFORCED_DROP), 0, "There should be some unforced drops");
-  NS_TEST_EXPECT_MSG_EQ (st.GetNDroppedPackets (PieQueueDisc::FORCED_DROP), 0, "There should be zero forced drops");
+  NS_TEST_ASSERT_MSG_EQ (test9, 0, "There should be zero unforced marks");
+  NS_TEST_ASSERT_MSG_NE (st.GetNDroppedPackets (PieQueueDisc::UNFORCED_DROP), 0, "There should be some unforced drops");
+  NS_TEST_ASSERT_MSG_EQ (st.GetNDroppedPackets (PieQueueDisc::FORCED_DROP), 0, "There should be zero forced drops");
 
 
   // test 10: Packets are ECN capable, but PIE queue disc is not ECN enabled
   queue = CreateObject<PieQueueDisc> ();
   // PieQueueDiscItem pointer for attributes
   testAttributes = Create<PieQueueDiscTestItem> (Create<Packet> (pktSize), dest, false);
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
                          true, "Verify that we can actually set the attribute MaxSize");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("UseEcn", BooleanValue (false)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("UseEcn", BooleanValue (false)), true,
                          "Verify that we can actually set the attribute UseEcn");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MarkEcnThreshold", DoubleValue (0.3)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MarkEcnThreshold", DoubleValue (0.3)), true,
                         "Verify that we can actually set the attribute MarkEcnThreshold");
   queue->Initialize ();
   testAttributes->m_ecnCapable = true;
@@ -465,20 +460,20 @@
   Simulator::Run ();
   st = queue->GetStats ();
   uint32_t test10 = st.GetNMarkedPackets (PieQueueDisc::UNFORCED_MARK);
-  NS_TEST_EXPECT_MSG_EQ (test10, 0, "There should be zero unforced marks");
-  NS_TEST_EXPECT_MSG_NE (st.GetNDroppedPackets (PieQueueDisc::UNFORCED_DROP), 0, "There should be some unforced drops");
-  NS_TEST_EXPECT_MSG_EQ (st.GetNDroppedPackets (PieQueueDisc::FORCED_DROP), 0, "There should be zero forced drops");
+  NS_TEST_ASSERT_MSG_EQ (test10, 0, "There should be zero unforced marks");
+  NS_TEST_ASSERT_MSG_NE (st.GetNDroppedPackets (PieQueueDisc::UNFORCED_DROP), 0, "There should be some unforced drops");
+  NS_TEST_ASSERT_MSG_EQ (st.GetNDroppedPackets (PieQueueDisc::FORCED_DROP), 0, "There should be zero forced drops");
 
 
   // test 11: Packets and PIE queue disc both are ECN capable
   queue = CreateObject<PieQueueDisc> ();
   // PieQueueDiscItem pointer for attributes
   testAttributes = Create<PieQueueDiscTestItem> (Create<Packet> (pktSize), dest, false);
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
                          true, "Verify that we can actually set the attribute MaxSize");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("UseEcn", BooleanValue (true)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("UseEcn", BooleanValue (true)), true,
                          "Verify that we can actually set the attribute UseEcn");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MarkEcnThreshold", DoubleValue (0.3)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MarkEcnThreshold", DoubleValue (0.3)), true,
                         "Verify that we can actually set the attribute MarkEcnThreshold");
   queue->Initialize ();
   testAttributes->m_ecnCapable = true;
@@ -489,22 +484,22 @@
   Simulator::Run ();
   st = queue->GetStats ();
   uint32_t test11 = st.GetNMarkedPackets (PieQueueDisc::UNFORCED_MARK);
-  NS_TEST_EXPECT_MSG_NE (test11, 0, "There should be some unforced marks");
+  NS_TEST_ASSERT_MSG_NE (test11, 0, "There should be some unforced marks");
   // There are unforced drops because the value of m_maxDropProb goes beyond 0.3 in this test.
   // PIE drops the packets even when they are ECN capable if drop probability is more than 30%.
-  NS_TEST_EXPECT_MSG_NE (st.GetNDroppedPackets (PieQueueDisc::UNFORCED_DROP), 0, "There should be some unforced drops");
+  NS_TEST_ASSERT_MSG_NE (st.GetNDroppedPackets (PieQueueDisc::UNFORCED_DROP), 0, "There should be some unforced drops");
   // Confirm that m_maxDropProb goes above 0.3 in this test
-  NS_TEST_EXPECT_MSG_GT (testAttributes->m_maxDropProb, 0.3, "Maximum Drop probability should be greater than 0.3");
-  NS_TEST_EXPECT_MSG_EQ (st.GetNDroppedPackets (PieQueueDisc::FORCED_DROP), 0, "There should be zero forced drops");
+  NS_TEST_ASSERT_MSG_GT (testAttributes->m_maxDropProb, 0.3, "Maximum Drop probability should be greater than 0.3");
+  NS_TEST_ASSERT_MSG_EQ (st.GetNDroppedPackets (PieQueueDisc::FORCED_DROP), 0, "There should be zero forced drops");
 
 
   // test 12: test with derandomization enabled
   queue = CreateObject<PieQueueDisc> ();
   // PieQueueDiscItem pointer for attributes
   testAttributes = Create<PieQueueDiscTestItem> (Create<Packet> (pktSize), dest, false);
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
                          true, "Verify that we can actually set the attribute MaxSize");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("UseDerandomization", BooleanValue (true)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("UseDerandomization", BooleanValue (true)), true,
                          "Verify that we can actually set the attribute UseDerandomization");
   queue->Initialize ();
   testAttributes->m_checkAccuProb = true;
@@ -514,18 +509,18 @@
   Simulator::Run ();
   st = queue->GetStats ();
   uint32_t test12 = st.GetNDroppedPackets (PieQueueDisc::UNFORCED_DROP);
-  NS_TEST_EXPECT_MSG_NE (test12, 0, "There should be some unforced drops");
-  NS_TEST_EXPECT_MSG_EQ (st.GetNDroppedPackets (PieQueueDisc::FORCED_DROP), 0, "There should be zero forced drops");
-  NS_TEST_EXPECT_MSG_EQ (testAttributes->m_accuProbError, 0.0, "There should not be any error in setting accuProb");
+  NS_TEST_ASSERT_MSG_NE (test12, 0, "There should be some unforced drops");
+  NS_TEST_ASSERT_MSG_EQ (st.GetNDroppedPackets (PieQueueDisc::FORCED_DROP), 0, "There should be zero forced drops");
+  NS_TEST_ASSERT_MSG_EQ (testAttributes->m_accuProbError, 0.0, "There should not be any error in setting accuProb");
 
 
   // test 13: same as test 11 but with accumulated drop probability set below the low threshold
   queue = CreateObject<PieQueueDisc> ();
   // PieQueueDiscItem pointer for attributes
   testAttributes = Create<PieQueueDiscTestItem> (Create<Packet> (pktSize), dest, false);
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
                          true, "Verify that we can actually set the attribute MaxSize");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("UseDerandomization", BooleanValue (true)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("UseDerandomization", BooleanValue (true)), true,
                          "Verify that we can actually set the attribute UseDerandomization");
   queue->Initialize ();
   testAttributes->m_constAccuProb = true;
@@ -537,19 +532,19 @@
   Simulator::Run ();
   st = queue->GetStats ();
   uint32_t test13 = st.GetNDroppedPackets (PieQueueDisc::UNFORCED_DROP);
-  NS_TEST_EXPECT_MSG_EQ (test13, 0, "There should be zero unforced drops");
-  NS_TEST_EXPECT_MSG_EQ (st.GetNDroppedPackets (PieQueueDisc::FORCED_DROP), 0, "There should be zero forced drops");
+  NS_TEST_ASSERT_MSG_EQ (test13, 0, "There should be zero unforced drops");
+  NS_TEST_ASSERT_MSG_EQ (st.GetNDroppedPackets (PieQueueDisc::FORCED_DROP), 0, "There should be zero forced drops");
 
 
   // test 14: same as test 12 but with accumulated drop probability set above the high threshold
   queue = CreateObject<PieQueueDisc> ();
   // PieQueueDiscItem pointer for attributes
   testAttributes = Create<PieQueueDiscTestItem> (Create<Packet> (pktSize), dest, false);
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
                          true, "Verify that we can actually set the attribute MaxSize");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxBurstAllowance", TimeValue (Seconds (0.0))), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxBurstAllowance", TimeValue (Seconds (0.0))), true,
                          "Verify that we can actually set the attribute MaxBurstAllowance");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("UseDerandomization", BooleanValue (true)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("UseDerandomization", BooleanValue (true)), true,
                          "Verify that we can actually set the attribute UseDerandomization");
   queue->Initialize ();
   testAttributes->m_constAccuProb = true;
@@ -562,9 +557,9 @@
   Simulator::Run ();
   st = queue->GetStats ();
   uint32_t test14 = st.GetNDroppedPackets (PieQueueDisc::UNFORCED_DROP);
-  NS_TEST_EXPECT_MSG_EQ (test14, testAttributes->m_expectedDrops,
+  NS_TEST_ASSERT_MSG_EQ (test14, testAttributes->m_expectedDrops,
                         "The number of unforced drops should be equal to number of expected unforced drops");
-  NS_TEST_EXPECT_MSG_EQ (st.GetNDroppedPackets (PieQueueDisc::FORCED_DROP), 0, "There should be zero forced drops");
+  NS_TEST_ASSERT_MSG_EQ (st.GetNDroppedPackets (PieQueueDisc::FORCED_DROP), 0, "There should be zero forced drops");
 
 
   // test 15: tests Active/Inactive feature, ActiveThreshold set to a high value so PIE never starts and there should
@@ -582,8 +577,8 @@
   Simulator::Run ();
   st = queue->GetStats ();
   uint32_t test15 = st.GetNDroppedPackets (PieQueueDisc::UNFORCED_DROP);
-  NS_TEST_EXPECT_MSG_EQ (test15, 0, "There should not be any drops.");
-  NS_TEST_EXPECT_MSG_EQ (st.GetNMarkedPackets (PieQueueDisc::UNFORCED_MARK), 0, "There should be zero marks");
+  NS_TEST_ASSERT_MSG_EQ (test15, 0, "There should not be any drops.");
+  NS_TEST_ASSERT_MSG_EQ (st.GetNMarkedPackets (PieQueueDisc::UNFORCED_MARK), 0, "There should be zero marks");
 
 
   // test 16: tests Active/Inactive feature, ActiveThreshold set to a low value so PIE starts early
@@ -601,8 +596,8 @@
   Simulator::Run ();
   st = queue->GetStats ();
   uint32_t test16 = st.GetNDroppedPackets (PieQueueDisc::UNFORCED_DROP);
-  NS_TEST_EXPECT_MSG_NE (test16, 0, "There should be some drops.");
-  NS_TEST_EXPECT_MSG_EQ (st.GetNMarkedPackets (PieQueueDisc::UNFORCED_MARK), 0, "There should be zero marks");
+  NS_TEST_ASSERT_MSG_NE (test16, 0, "There should be some drops.");
+  NS_TEST_ASSERT_MSG_EQ (st.GetNMarkedPackets (PieQueueDisc::UNFORCED_MARK), 0, "There should be zero marks");
 }
 
 void
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/traffic-control/test/prio-queue-disc-test-suite.cc ns-3.36/src/traffic-control/test/prio-queue-disc-test-suite.cc
--- ns-3.35/src/traffic-control/test/prio-queue-disc-test-suite.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/traffic-control/test/prio-queue-disc-test-suite.cc	2022-04-30 18:23:58.170735000 -0700
@@ -182,16 +182,16 @@
     }
   qdisc->Initialize ();
 
-  NS_TEST_EXPECT_MSG_EQ (qdisc->GetNQueueDiscClasses (), 4, "Verify that the queue disc has 4 child queue discs");
+  NS_TEST_ASSERT_MSG_EQ (qdisc->GetNQueueDiscClasses (), 4, "Verify that the queue disc has 4 child queue discs");
 
-  NS_TEST_EXPECT_MSG_EQ (qdisc->SetAttributeFailSafe ("Priomap", StringValue (priomap)),
+  NS_TEST_ASSERT_MSG_EQ (qdisc->SetAttributeFailSafe ("Priomap", StringValue (priomap)),
                          true, "Verify that we can actually set the attribute Priomap");
 
   StringValue sv;
-  NS_TEST_EXPECT_MSG_EQ (qdisc->GetAttributeFailSafe ("Priomap", sv),
+  NS_TEST_ASSERT_MSG_EQ (qdisc->GetAttributeFailSafe ("Priomap", sv),
                          true, "Verify that we can actually get the attribute Priomap");
 
-  NS_TEST_EXPECT_MSG_EQ (sv.Get (), priomap, "Verify that the priomap has been correctly set");
+  NS_TEST_ASSERT_MSG_EQ (sv.Get (), priomap, "Verify that the priomap has been correctly set");
 
   /*
    * Test 2: classify packets based on priomap because no packet filter is installed
@@ -200,7 +200,7 @@
   // create packets with priorities from 0 to 3
   for (uint16_t i = 0; i < 4; i++)
     {
-      NS_TEST_EXPECT_MSG_EQ (qdisc->GetQueueDiscClass (i)->GetQueueDisc ()->GetNPackets (),
+      NS_TEST_ASSERT_MSG_EQ (qdisc->GetQueueDiscClass (i)->GetQueueDisc ()->GetNPackets (),
                              0, "There should be no packets in the child queue disc " << i);
 
       item = Create<PrioQueueDiscTestItem> (Create<Packet> (100), dest, i);
@@ -208,7 +208,7 @@
       // packet is assigned band i
       uids[i].push (item->GetPacket ()->GetUid ());
 
-      NS_TEST_EXPECT_MSG_EQ (qdisc->GetQueueDiscClass (i)->GetQueueDisc ()->GetNPackets (),
+      NS_TEST_ASSERT_MSG_EQ (qdisc->GetQueueDiscClass (i)->GetQueueDisc ()->GetNPackets (),
                              1, "There should be one packet in the child queue disc " << i);
     }
 
@@ -223,7 +223,7 @@
   // create packets with priorities from 4 to 7
   for (uint16_t i = 0; i < 4; i++)
     {
-      NS_TEST_EXPECT_MSG_EQ (qdisc->GetQueueDiscClass (i)->GetQueueDisc ()->GetNPackets (),
+      NS_TEST_ASSERT_MSG_EQ (qdisc->GetQueueDiscClass (i)->GetQueueDisc ()->GetNPackets (),
                              1, "There should be one packet in the child queue disc " << i);
 
       item = Create<PrioQueueDiscTestItem> (Create<Packet> (100), dest, i+4);
@@ -231,7 +231,7 @@
       // packet is assigned band i
       uids[i].push (item->GetPacket ()->GetUid ());
 
-      NS_TEST_EXPECT_MSG_EQ (qdisc->GetQueueDiscClass (i)->GetQueueDisc ()->GetNPackets (),
+      NS_TEST_ASSERT_MSG_EQ (qdisc->GetQueueDiscClass (i)->GetQueueDisc ()->GetNPackets (),
                              2, "There should be two packets in the child queue disc " << i);
     }
 
@@ -246,7 +246,7 @@
   for (uint16_t i = 0; i < 4; i++)
     {
       pf2->SetReturnValue (i);
-      NS_TEST_EXPECT_MSG_EQ (qdisc->GetQueueDiscClass (i)->GetQueueDisc ()->GetNPackets (),
+      NS_TEST_ASSERT_MSG_EQ (qdisc->GetQueueDiscClass (i)->GetQueueDisc ()->GetNPackets (),
                              2, "There should be two packets in the child queue disc " << i);
 
       item = Create<PrioQueueDiscTestItem> (Create<Packet> (100), dest, 0);
@@ -254,7 +254,7 @@
       // packet is assigned band i
       uids[i].push (item->GetPacket ()->GetUid ());
 
-      NS_TEST_EXPECT_MSG_EQ (qdisc->GetQueueDiscClass (i)->GetQueueDisc ()->GetNPackets (),
+      NS_TEST_ASSERT_MSG_EQ (qdisc->GetQueueDiscClass (i)->GetQueueDisc ()->GetNPackets (),
                              3, "There should be three packets in the child queue disc " << i);
     }
 
@@ -268,8 +268,8 @@
   for (uint16_t i = 0; i < 4; i++)
     {
       pf2->SetReturnValue (4+i);
-      NS_TEST_EXPECT_MSG_EQ (qdisc->GetBandForPriority (0), 0, "The band for priority 0 must be band 0");
-      NS_TEST_EXPECT_MSG_EQ (qdisc->GetQueueDiscClass (0)->GetQueueDisc ()->GetNPackets (), i+3u,
+      NS_TEST_ASSERT_MSG_EQ (qdisc->GetBandForPriority (0), 0, "The band for priority 0 must be band 0");
+      NS_TEST_ASSERT_MSG_EQ (qdisc->GetQueueDiscClass (0)->GetQueueDisc ()->GetNPackets (), i+3u,
                              "There should be " << i+3 << " packets in the child queue disc "
                              << qdisc->GetBandForPriority (0));
 
@@ -278,7 +278,7 @@
       // packet is assigned band 0
       uids[0].push (item->GetPacket ()->GetUid ());
 
-      NS_TEST_EXPECT_MSG_EQ (qdisc->GetQueueDiscClass (0)->GetQueueDisc ()->GetNPackets (), i+4u,
+      NS_TEST_ASSERT_MSG_EQ (qdisc->GetQueueDiscClass (0)->GetQueueDisc ()->GetNPackets (), i+4u,
                              "There should be " << i+4 << " packets in the child queue disc "
                              << qdisc->GetBandForPriority (0));
     }
@@ -293,11 +293,11 @@
         {
           if (uids[i].empty ())
             {
-              NS_TEST_EXPECT_MSG_EQ (qdisc->GetQueueDiscClass (i)->GetQueueDisc ()->GetNPackets (),
+              NS_TEST_ASSERT_MSG_EQ (qdisc->GetQueueDiscClass (i)->GetQueueDisc ()->GetNPackets (),
                                      0, "Band " << i << " should be empty");
               continue;
             }
-          NS_TEST_EXPECT_MSG_EQ (uids[i].front (), item->GetPacket ()->GetUid (),
+          NS_TEST_ASSERT_MSG_EQ (uids[i].front (), item->GetPacket ()->GetUid (),
                                  "The dequeued packet is not the one we expected");
           uids[i].pop ();
           break;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/traffic-control/test/queue-disc-traces-test-suite.cc ns-3.36/src/traffic-control/test/queue-disc-traces-test-suite.cc
--- ns-3.35/src/traffic-control/test/queue-disc-traces-test-suite.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/traffic-control/test/queue-disc-traces-test-suite.cc	2022-04-30 18:23:58.170735000 -0700
@@ -362,14 +362,14 @@
 void
 QueueDiscTracesTestCase::CheckQueued (Ptr<QueueDisc> qd, uint32_t nPackets, uint32_t nBytes)
 {
-  NS_TEST_EXPECT_MSG_EQ (qd->GetNPackets (), nPackets,
+  NS_TEST_ASSERT_MSG_EQ (qd->GetNPackets (), nPackets,
                          "Verify that the number of queued packets is computed correctly");
-  NS_TEST_EXPECT_MSG_EQ (m_counter[qd].m_nPackets, nPackets,
+  NS_TEST_ASSERT_MSG_EQ (m_counter[qd].m_nPackets, nPackets,
                          "Verify that the number of queued packets is computed correctly");
 
-  NS_TEST_EXPECT_MSG_EQ (qd->GetNBytes (), nBytes,
+  NS_TEST_ASSERT_MSG_EQ (qd->GetNBytes (), nBytes,
                          "Verify that the number of queued bytes is computed correctly");
-  NS_TEST_EXPECT_MSG_EQ (m_counter[qd].m_nBytes, nBytes,
+  NS_TEST_ASSERT_MSG_EQ (m_counter[qd].m_nBytes, nBytes,
                          "Verify that the number of queued bytes is computed correctly");
 }
 
@@ -378,14 +378,14 @@
 {
   QueueDisc::Stats stats = qd->GetStats ();
 
-  NS_TEST_EXPECT_MSG_EQ (stats.nTotalDroppedPacketsBeforeEnqueue, nDbePackets,
+  NS_TEST_ASSERT_MSG_EQ (stats.nTotalDroppedPacketsBeforeEnqueue, nDbePackets,
                          "Verify that the number of packets dropped before enqueue is computed correctly");
-  NS_TEST_EXPECT_MSG_EQ (m_counter[qd].m_nDbePackets, nDbePackets,
+  NS_TEST_ASSERT_MSG_EQ (m_counter[qd].m_nDbePackets, nDbePackets,
                          "Verify that the number of packets dropped before enqueue is computed correctly");
 
-  NS_TEST_EXPECT_MSG_EQ (stats.nTotalDroppedBytesBeforeEnqueue, nDbeBytes,
+  NS_TEST_ASSERT_MSG_EQ (stats.nTotalDroppedBytesBeforeEnqueue, nDbeBytes,
                          "Verify that the number of bytes dropped before enqueue is computed correctly");
-  NS_TEST_EXPECT_MSG_EQ (m_counter[qd].m_nDbeBytes, nDbeBytes,
+  NS_TEST_ASSERT_MSG_EQ (m_counter[qd].m_nDbeBytes, nDbeBytes,
                          "Verify that the number of bytes dropped before enqueue is computed correctly");
 }
 
@@ -394,14 +394,14 @@
 {
   QueueDisc::Stats stats = qd->GetStats ();
 
-  NS_TEST_EXPECT_MSG_EQ (stats.nTotalDroppedPacketsAfterDequeue, nDadPackets,
+  NS_TEST_ASSERT_MSG_EQ (stats.nTotalDroppedPacketsAfterDequeue, nDadPackets,
                          "Verify that the number of packets dropped after dequeue is computed correctly");
-  NS_TEST_EXPECT_MSG_EQ (m_counter[qd].m_nDadPackets, nDadPackets,
+  NS_TEST_ASSERT_MSG_EQ (m_counter[qd].m_nDadPackets, nDadPackets,
                          "Verify that the number of packets dropped after dequeue is computed correctly");
 
-  NS_TEST_EXPECT_MSG_EQ (stats.nTotalDroppedBytesAfterDequeue, nDadBytes,
+  NS_TEST_ASSERT_MSG_EQ (stats.nTotalDroppedBytesAfterDequeue, nDadBytes,
                          "Verify that the number of bytes dropped after dequeue is computed correctly");
-  NS_TEST_EXPECT_MSG_EQ (m_counter[qd].m_nDadBytes, nDadBytes,
+  NS_TEST_ASSERT_MSG_EQ (m_counter[qd].m_nDadBytes, nDadBytes,
                          "Verify that the number of bytes dropped after dequeue is computed correctly");
 }
 
@@ -418,7 +418,7 @@
 
   Ptr<QueueDisc> child = root->GetQueueDiscClass (0)->GetQueueDisc ();
 
-  NS_TEST_EXPECT_MSG_NE (child, 0, "The child queue disc has not been created");
+  NS_TEST_ASSERT_MSG_NE (child, 0, "The child queue disc has not been created");
 
   // Create counters and connect traces to the counters
   m_counter.emplace (root, TestCounter ());
@@ -464,8 +464,8 @@
   // of the child queue disc.
   item = root->Peek ();
 
-  NS_TEST_EXPECT_MSG_NE (item, 0, "A packet must have been returned");
-  NS_TEST_EXPECT_MSG_EQ (item->GetSize (), pktSizeUnit * 3, "The peeked packet has not the expected size");
+  NS_TEST_ASSERT_MSG_NE (item, 0, "A packet must have been returned");
+  NS_TEST_ASSERT_MSG_EQ (item->GetSize (), pktSizeUnit * 3, "The peeked packet has not the expected size");
 
   CheckQueued (root, 2, pktSizeUnit * 7);
   CheckDroppedBeforeEnqueue (root, 1, pktSizeUnit * 5);
@@ -478,8 +478,8 @@
   // Peek again. Nothing changes.
   item = root->Peek ();
 
-  NS_TEST_EXPECT_MSG_NE (item, 0, "A packet must have been returned");
-  NS_TEST_EXPECT_MSG_EQ (item->GetSize (), pktSizeUnit * 3, "The peeked packet has not the expected size");
+  NS_TEST_ASSERT_MSG_NE (item, 0, "A packet must have been returned");
+  NS_TEST_ASSERT_MSG_EQ (item->GetSize (), pktSizeUnit * 3, "The peeked packet has not the expected size");
 
   CheckQueued (root, 2, pktSizeUnit * 7);
   CheckDroppedBeforeEnqueue (root, 1, pktSizeUnit * 5);
@@ -492,8 +492,8 @@
   // Dequeue one packet. The root queue disc returns the previously peeked packet.
   item = root->Dequeue ();
 
-  NS_TEST_EXPECT_MSG_NE (item, 0, "A packet must have been returned");
-  NS_TEST_EXPECT_MSG_EQ (item->GetSize (), pktSizeUnit * 3, "The dequeued packet has not the expected size");
+  NS_TEST_ASSERT_MSG_NE (item, 0, "A packet must have been returned");
+  NS_TEST_ASSERT_MSG_EQ (item->GetSize (), pktSizeUnit * 3, "The dequeued packet has not the expected size");
 
   CheckQueued (root, 1, pktSizeUnit * 4);
   CheckDroppedBeforeEnqueue (root, 1, pktSizeUnit * 5);
@@ -506,8 +506,8 @@
   // Dequeue the last packet.
   item = root->Dequeue ();
 
-  NS_TEST_EXPECT_MSG_NE (item, 0, "A packet must have been returned");
-  NS_TEST_EXPECT_MSG_EQ (item->GetSize (), pktSizeUnit * 4, "The dequeued packet has not the expected size");
+  NS_TEST_ASSERT_MSG_NE (item, 0, "A packet must have been returned");
+  NS_TEST_ASSERT_MSG_EQ (item->GetSize (), pktSizeUnit * 4, "The dequeued packet has not the expected size");
 
   CheckQueued (root, 0, 0);
   CheckDroppedBeforeEnqueue (root, 1, pktSizeUnit * 5);
@@ -520,7 +520,7 @@
   // Peek a packet. No packet is left.
   item = root->Peek ();
 
-  NS_TEST_EXPECT_MSG_EQ (item, 0, "No packet must have been returned");
+  NS_TEST_ASSERT_MSG_EQ (item, 0, "No packet must have been returned");
 
   CheckQueued (root, 0, 0);
   CheckDroppedBeforeEnqueue (root, 1, pktSizeUnit * 5);
@@ -544,8 +544,8 @@
   // Dequeue one packet.
   item = root->Dequeue ();
 
-  NS_TEST_EXPECT_MSG_NE (item, 0, "A packet must have been returned");
-  NS_TEST_EXPECT_MSG_EQ (item->GetSize (), pktSizeUnit, "The dequeued packet has not the expected size");
+  NS_TEST_ASSERT_MSG_NE (item, 0, "A packet must have been returned");
+  NS_TEST_ASSERT_MSG_EQ (item->GetSize (), pktSizeUnit, "The dequeued packet has not the expected size");
 
   CheckQueued (root, 0, 0);
   CheckDroppedBeforeEnqueue (root, 1, pktSizeUnit * 5);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/traffic-control/test/red-queue-disc-test-suite.cc ns-3.36/src/traffic-control/test/red-queue-disc-test-suite.cc
--- ns-3.35/src/traffic-control/test/red-queue-disc-test-suite.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/traffic-control/test/red-queue-disc-test-suite.cc	2022-04-30 18:23:58.170735000 -0700
@@ -48,22 +48,17 @@
    */
   RedQueueDiscTestItem (Ptr<Packet> p, const Address & addr, bool ecnCapable);
   virtual ~RedQueueDiscTestItem ();
+
+  // Delete copy constructor and assignment operator to avoid misuse
+  RedQueueDiscTestItem (const RedQueueDiscTestItem &) = delete;
+  RedQueueDiscTestItem & operator = (const RedQueueDiscTestItem &) = delete;
+
   virtual void AddHeader (void);
   virtual bool Mark(void);
 
 private:
   RedQueueDiscTestItem ();
-  /**
-   * \brief Copy constructor
-   * Disable default implementation to avoid misuse
-   */
-  RedQueueDiscTestItem (const RedQueueDiscTestItem &);
-  /**
-   * \brief Assignment operator
-   * \return this object
-   * Disable default implementation to avoid misuse
-   */
-  RedQueueDiscTestItem &operator = (const RedQueueDiscTestItem &);
+
   bool m_ecnCapablePacket; ///< ECN capable packet?
 };
 
@@ -136,13 +131,13 @@
   Ptr<RedQueueDisc> queue = CreateObject<RedQueueDisc> ();
 
   // test 1: simple enqueue/dequeue with no drops
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MinTh", DoubleValue (minTh)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MinTh", DoubleValue (minTh)), true,
                          "Verify that we can actually set the attribute MinTh");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxTh", DoubleValue (maxTh)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxTh", DoubleValue (maxTh)), true,
                          "Verify that we can actually set the attribute MaxTh");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
                          true, "Verify that we can actually set the attribute MaxSize");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("QW", DoubleValue (0.002)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("QW", DoubleValue (0.002)), true,
                          "Verify that we can actually set the attribute QW");
 
   Address dest;
@@ -167,35 +162,35 @@
   p8 = Create<Packet> (pktSize);
 
   queue->Initialize ();
-  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 0 * modeSize, "There should be no packets in there");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 0 * modeSize, "There should be no packets in there");
   queue->Enqueue (Create<RedQueueDiscTestItem> (p1, dest, false));
-  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 1 * modeSize, "There should be one packet in there");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 1 * modeSize, "There should be one packet in there");
   queue->Enqueue (Create<RedQueueDiscTestItem> (p2, dest, false));
-  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 2 * modeSize, "There should be two packets in there");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 2 * modeSize, "There should be two packets in there");
   queue->Enqueue (Create<RedQueueDiscTestItem> (p3, dest, false));
   queue->Enqueue (Create<RedQueueDiscTestItem> (p4, dest, false));
   queue->Enqueue (Create<RedQueueDiscTestItem> (p5, dest, false));
   queue->Enqueue (Create<RedQueueDiscTestItem> (p6, dest, false));
   queue->Enqueue (Create<RedQueueDiscTestItem> (p7, dest, false));
   queue->Enqueue (Create<RedQueueDiscTestItem> (p8, dest, false));
-  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 8 * modeSize, "There should be eight packets in there");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 8 * modeSize, "There should be eight packets in there");
 
   Ptr<QueueDiscItem> item;
 
   item = queue->Dequeue ();
-  NS_TEST_EXPECT_MSG_EQ ((item != 0), true, "I want to remove the first packet");
-  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 7 * modeSize, "There should be seven packets in there");
-  NS_TEST_EXPECT_MSG_EQ (item->GetPacket ()->GetUid (), p1->GetUid (), "was this the first packet ?");
+  NS_TEST_ASSERT_MSG_EQ ((item != 0), true, "I want to remove the first packet");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 7 * modeSize, "There should be seven packets in there");
+  NS_TEST_ASSERT_MSG_EQ (item->GetPacket ()->GetUid (), p1->GetUid (), "was this the first packet ?");
 
   item = queue->Dequeue ();
-  NS_TEST_EXPECT_MSG_EQ ((item != 0), true, "I want to remove the second packet");
-  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 6 * modeSize, "There should be six packet in there");
-  NS_TEST_EXPECT_MSG_EQ (item->GetPacket ()->GetUid (), p2->GetUid (), "Was this the second packet ?");
+  NS_TEST_ASSERT_MSG_EQ ((item != 0), true, "I want to remove the second packet");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 6 * modeSize, "There should be six packet in there");
+  NS_TEST_ASSERT_MSG_EQ (item->GetPacket ()->GetUid (), p2->GetUid (), "Was this the second packet ?");
 
   item = queue->Dequeue ();
-  NS_TEST_EXPECT_MSG_EQ ((item != 0), true, "I want to remove the third packet");
-  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 5 * modeSize, "There should be five packets in there");
-  NS_TEST_EXPECT_MSG_EQ (item->GetPacket ()->GetUid (), p3->GetUid (), "Was this the third packet ?");
+  NS_TEST_ASSERT_MSG_EQ ((item != 0), true, "I want to remove the third packet");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 5 * modeSize, "There should be five packets in there");
+  NS_TEST_ASSERT_MSG_EQ (item->GetPacket ()->GetUid (), p3->GetUid (), "Was this the third packet ?");
 
   item = queue->Dequeue ();
   item = queue->Dequeue ();
@@ -204,7 +199,7 @@
   item = queue->Dequeue ();
 
   item = queue->Dequeue ();
-  NS_TEST_EXPECT_MSG_EQ ((item == 0), true, "There are really no packets in there");
+  NS_TEST_ASSERT_MSG_EQ ((item == 0), true, "There are really no packets in there");
 
 
   // test 2: more data, but with no drops
@@ -212,20 +207,20 @@
   minTh = 70 * modeSize;
   maxTh = 150 * modeSize;
   qSize = 300 * modeSize;
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MinTh", DoubleValue (minTh)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MinTh", DoubleValue (minTh)), true,
                          "Verify that we can actually set the attribute MinTh");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxTh", DoubleValue (maxTh)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxTh", DoubleValue (maxTh)), true,
                          "Verify that we can actually set the attribute MaxTh");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
                          true, "Verify that we can actually set the attribute MaxSize");
   queue->Initialize ();
   Enqueue (queue, pktSize, 300, false);
   QueueDisc::Stats st = queue->GetStats ();
-  NS_TEST_EXPECT_MSG_EQ (st.GetNDroppedPackets (RedQueueDisc::UNFORCED_DROP), 0,
+  NS_TEST_ASSERT_MSG_EQ (st.GetNDroppedPackets (RedQueueDisc::UNFORCED_DROP), 0,
                          "There should be zero unforced drops");
-  NS_TEST_EXPECT_MSG_EQ (st.GetNDroppedPackets (RedQueueDisc::FORCED_DROP), 0,
+  NS_TEST_ASSERT_MSG_EQ (st.GetNDroppedPackets (RedQueueDisc::FORCED_DROP), 0,
                          "There should be zero forced dropps");
-  NS_TEST_EXPECT_MSG_EQ (st.GetNDroppedPackets (QueueDisc::INTERNAL_QUEUE_DROP), 0,
+  NS_TEST_ASSERT_MSG_EQ (st.GetNDroppedPackets (QueueDisc::INTERNAL_QUEUE_DROP), 0,
                          "There should be zero drops due to queue limit");
 
   // save number of drops from tests
@@ -243,13 +238,13 @@
 
   // test 3: more data, now drops due QW change
   queue = CreateObject<RedQueueDisc> ();
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MinTh", DoubleValue (minTh)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MinTh", DoubleValue (minTh)), true,
                          "Verify that we can actually set the attribute MinTh");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxTh", DoubleValue (maxTh)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxTh", DoubleValue (maxTh)), true,
                          "Verify that we can actually set the attribute MaxTh");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
                          true, "Verify that we can actually set the attribute MaxSize");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("QW", DoubleValue (0.020)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("QW", DoubleValue (0.020)), true,
                          "Verify that we can actually set the attribute QW");
   queue->Initialize ();
   Enqueue (queue, pktSize, 300, false);
@@ -257,19 +252,19 @@
   drop.test3 = st.GetNDroppedPackets (RedQueueDisc::UNFORCED_DROP)
                + st.GetNDroppedPackets (RedQueueDisc::FORCED_DROP)
                + st.GetNDroppedPackets (QueueDisc::INTERNAL_QUEUE_DROP);
-  NS_TEST_EXPECT_MSG_NE (drop.test3, 0, "There should be some dropped packets");
+  NS_TEST_ASSERT_MSG_NE (drop.test3, 0, "There should be some dropped packets");
 
 
   // test 4: reduced maxTh, this causes more drops
   maxTh = 100 * modeSize;
   queue = CreateObject<RedQueueDisc> ();
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MinTh", DoubleValue (minTh)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MinTh", DoubleValue (minTh)), true,
                          "Verify that we can actually set the attribute MinTh");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxTh", DoubleValue (maxTh)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxTh", DoubleValue (maxTh)), true,
                          "Verify that we can actually set the attribute MaxTh");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
                          true, "Verify that we can actually set the attribute MaxSize");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("QW", DoubleValue (0.020)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("QW", DoubleValue (0.020)), true,
                          "Verify that we can actually set the attribute QW");
   queue->Initialize ();
   Enqueue (queue, pktSize, 300, false);
@@ -277,21 +272,21 @@
   drop.test4 = st.GetNDroppedPackets (RedQueueDisc::UNFORCED_DROP)
                + st.GetNDroppedPackets (RedQueueDisc::FORCED_DROP)
                + st.GetNDroppedPackets (QueueDisc::INTERNAL_QUEUE_DROP);
-  NS_TEST_EXPECT_MSG_GT (drop.test4, drop.test3, "Test 4 should have more drops than test 3");
+  NS_TEST_ASSERT_MSG_GT (drop.test4, drop.test3, "Test 4 should have more drops than test 3");
 
 
   // test 5: change drop probability to a high value (LInterm)
   maxTh = 150 * modeSize;
   queue = CreateObject<RedQueueDisc> ();
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MinTh", DoubleValue (minTh)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MinTh", DoubleValue (minTh)), true,
                          "Verify that we can actually set the attribute MinTh");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxTh", DoubleValue (maxTh)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxTh", DoubleValue (maxTh)), true,
                          "Verify that we can actually set the attribute MaxTh");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
                          true, "Verify that we can actually set the attribute MaxSize");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("QW", DoubleValue (0.020)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("QW", DoubleValue (0.020)), true,
                          "Verify that we can actually set the attribute QW");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("LInterm", DoubleValue (5)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("LInterm", DoubleValue (5)), true,
                          "Verify that we can actually set the attribute LInterm");
   queue->Initialize ();
   Enqueue (queue, pktSize, 300, false);
@@ -299,20 +294,20 @@
   drop.test5 = st.GetNDroppedPackets (RedQueueDisc::UNFORCED_DROP)
                + st.GetNDroppedPackets (RedQueueDisc::FORCED_DROP)
                + st.GetNDroppedPackets (QueueDisc::INTERNAL_QUEUE_DROP);
-  NS_TEST_EXPECT_MSG_GT (drop.test5, drop.test3, "Test 5 should have more drops than test 3");
+  NS_TEST_ASSERT_MSG_GT (drop.test5, drop.test3, "Test 5 should have more drops than test 3");
 
 
   // test 6: disable Gentle param
   queue = CreateObject<RedQueueDisc> ();
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MinTh", DoubleValue (minTh)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MinTh", DoubleValue (minTh)), true,
                          "Verify that we can actually set the attribute MinTh");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxTh", DoubleValue (maxTh)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxTh", DoubleValue (maxTh)), true,
                          "Verify that we can actually set the attribute MaxTh");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
                          true, "Verify that we can actually set the attribute MaxSize");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("QW", DoubleValue (0.020)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("QW", DoubleValue (0.020)), true,
                          "Verify that we can actually set the attribute QW");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("Gentle", BooleanValue (false)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("Gentle", BooleanValue (false)), true,
                          "Verify that we can actually set the attribute Gentle");
   queue->Initialize ();
   Enqueue (queue, pktSize, 300, false);
@@ -320,20 +315,20 @@
   drop.test6 = st.GetNDroppedPackets (RedQueueDisc::UNFORCED_DROP)
                + st.GetNDroppedPackets (RedQueueDisc::FORCED_DROP)
                + st.GetNDroppedPackets (QueueDisc::INTERNAL_QUEUE_DROP);
-  NS_TEST_EXPECT_MSG_GT (drop.test6, drop.test3, "Test 6 should have more drops than test 3");
+  NS_TEST_ASSERT_MSG_GT (drop.test6, drop.test3, "Test 6 should have more drops than test 3");
 
 
   // test 7: disable Wait param
   queue = CreateObject<RedQueueDisc> ();
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MinTh", DoubleValue (minTh)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MinTh", DoubleValue (minTh)), true,
                          "Verify that we can actually set the attribute MinTh");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxTh", DoubleValue (maxTh)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxTh", DoubleValue (maxTh)), true,
                          "Verify that we can actually set the attribute MaxTh");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
                          true, "Verify that we can actually set the attribute MaxSize");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("QW", DoubleValue (0.020)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("QW", DoubleValue (0.020)), true,
                          "Verify that we can actually set the attribute QW");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("Wait", BooleanValue (false)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("Wait", BooleanValue (false)), true,
                          "Verify that we can actually set the attribute Wait");
   queue->Initialize ();
   Enqueue (queue, pktSize, 300, false);
@@ -341,86 +336,86 @@
   drop.test7 = st.GetNDroppedPackets (RedQueueDisc::UNFORCED_DROP)
                + st.GetNDroppedPackets (RedQueueDisc::FORCED_DROP)
                + st.GetNDroppedPackets (QueueDisc::INTERNAL_QUEUE_DROP);
-  NS_TEST_EXPECT_MSG_GT (drop.test7, drop.test3, "Test 7 should have more drops than test 3");
+  NS_TEST_ASSERT_MSG_GT (drop.test7, drop.test3, "Test 7 should have more drops than test 3");
 
 
   // test 8: RED queue disc is ECN enabled, but packets are not ECN capable
   queue = CreateObject<RedQueueDisc> ();
   minTh = 30 * modeSize;
   maxTh = 90 * modeSize;
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MinTh", DoubleValue (minTh)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MinTh", DoubleValue (minTh)), true,
                          "Verify that we can actually set the attribute MinTh");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxTh", DoubleValue (maxTh)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxTh", DoubleValue (maxTh)), true,
                          "Verify that we can actually set the attribute MaxTh");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
                          true, "Verify that we can actually set the attribute MaxSize");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("QW", DoubleValue (0.002)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("QW", DoubleValue (0.002)), true,
                          "Verify that we can actually set the attribute QW");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("LInterm", DoubleValue (2)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("LInterm", DoubleValue (2)), true,
                          "Verify that we can actually set the attribute LInterm");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("Gentle", BooleanValue (true)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("Gentle", BooleanValue (true)), true,
                          "Verify that we can actually set the attribute Gentle");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("UseEcn", BooleanValue (true)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("UseEcn", BooleanValue (true)), true,
                          "Verify that we can actually set the attribute UseECN");
   queue->Initialize ();
   Enqueue (queue, pktSize, 300, false);
   st = queue->GetStats ();
   // Packets are not ECN capable, so there should be only unforced drops, no unforced marks
-  NS_TEST_EXPECT_MSG_NE (st.GetNDroppedPackets (RedQueueDisc::UNFORCED_DROP), 0,
+  NS_TEST_ASSERT_MSG_NE (st.GetNDroppedPackets (RedQueueDisc::UNFORCED_DROP), 0,
                          "There should be some unforced drops");
-  NS_TEST_EXPECT_MSG_EQ (st.GetNMarkedPackets (RedQueueDisc::UNFORCED_MARK), 0,
+  NS_TEST_ASSERT_MSG_EQ (st.GetNMarkedPackets (RedQueueDisc::UNFORCED_MARK), 0,
                          "There should be no unforced marks");
 
 
   // test 9: Packets are ECN capable, but RED queue disc is not ECN enabled
   queue = CreateObject<RedQueueDisc> ();
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MinTh", DoubleValue (minTh)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MinTh", DoubleValue (minTh)), true,
                          "Verify that we can actually set the attribute MinTh");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxTh", DoubleValue (maxTh)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxTh", DoubleValue (maxTh)), true,
                          "Verify that we can actually set the attribute MaxTh");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
                          true, "Verify that we can actually set the attribute MaxSize");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("QW", DoubleValue (0.002)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("QW", DoubleValue (0.002)), true,
                          "Verify that we can actually set the attribute QW");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("LInterm", DoubleValue (2)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("LInterm", DoubleValue (2)), true,
                          "Verify that we can actually set the attribute LInterm");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("Gentle", BooleanValue (true)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("Gentle", BooleanValue (true)), true,
                          "Verify that we can actually set the attribute Gentle");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("UseEcn", BooleanValue (false)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("UseEcn", BooleanValue (false)), true,
                          "Verify that we can actually set the attribute UseECN");
   queue->Initialize ();
   Enqueue (queue, pktSize, 300, true);
   st = queue->GetStats ();
   // RED queue disc is not ECN enabled, so there should be only unforced drops, no unforced marks
-  NS_TEST_EXPECT_MSG_NE (st.GetNDroppedPackets (RedQueueDisc::UNFORCED_DROP), 0,
+  NS_TEST_ASSERT_MSG_NE (st.GetNDroppedPackets (RedQueueDisc::UNFORCED_DROP), 0,
                          "There should be some unforced drops");
-  NS_TEST_EXPECT_MSG_EQ (st.GetNMarkedPackets (RedQueueDisc::UNFORCED_MARK), 0,
+  NS_TEST_ASSERT_MSG_EQ (st.GetNMarkedPackets (RedQueueDisc::UNFORCED_MARK), 0,
                          "There should be no unforced marks");
 
 
   // test 10: Packets are ECN capable and RED queue disc is ECN enabled
   queue = CreateObject<RedQueueDisc> ();
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MinTh", DoubleValue (minTh)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MinTh", DoubleValue (minTh)), true,
                          "Verify that we can actually set the attribute MinTh");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxTh", DoubleValue (maxTh)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxTh", DoubleValue (maxTh)), true,
                          "Verify that we can actually set the attribute MaxTh");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
                          true, "Verify that we can actually set the attribute MaxSize");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("QW", DoubleValue (0.002)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("QW", DoubleValue (0.002)), true,
                          "Verify that we can actually set the attribute QW");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("LInterm", DoubleValue (2)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("LInterm", DoubleValue (2)), true,
                          "Verify that we can actually set the attribute LInterm");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("Gentle", BooleanValue (true)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("Gentle", BooleanValue (true)), true,
                          "Verify that we can actually set the attribute Gentle");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("UseEcn", BooleanValue (true)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("UseEcn", BooleanValue (true)), true,
                          "Verify that we can actually set the attribute UseECN");
   queue->Initialize ();
   Enqueue (queue, pktSize, 300, true);
   st = queue->GetStats ();
   // Packets are ECN capable, RED queue disc is ECN enabled; there should be only unforced marks, no unforced drops
-  NS_TEST_EXPECT_MSG_EQ (st.GetNDroppedPackets (RedQueueDisc::UNFORCED_DROP), 0,
+  NS_TEST_ASSERT_MSG_EQ (st.GetNDroppedPackets (RedQueueDisc::UNFORCED_DROP), 0,
                          "There should be no unforced drops");
-  NS_TEST_EXPECT_MSG_NE (st.GetNMarkedPackets (RedQueueDisc::UNFORCED_MARK), 0,
+  NS_TEST_ASSERT_MSG_NE (st.GetNMarkedPackets (RedQueueDisc::UNFORCED_MARK), 0,
                          "There should be some unforced marks");
 
 
@@ -428,71 +423,71 @@
   queue = CreateObject<RedQueueDisc> ();
   minTh = 30 * modeSize;
   maxTh = 90 * modeSize;
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MinTh", DoubleValue (minTh)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MinTh", DoubleValue (minTh)), true,
                          "Verify that we can actually set the attribute MinTh");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxTh", DoubleValue (maxTh)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxTh", DoubleValue (maxTh)), true,
                          "Verify that we can actually set the attribute MaxTh");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
                          true, "Verify that we can actually set the attribute MaxSize");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("QW", DoubleValue (0.002)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("QW", DoubleValue (0.002)), true,
                          "Verify that we can actually set the attribute QW");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("LInterm", DoubleValue (2)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("LInterm", DoubleValue (2)), true,
                          "Verify that we can actually set the attribute LInterm");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("Gentle", BooleanValue (true)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("Gentle", BooleanValue (true)), true,
                          "Verify that we can actually set the attribute Gentle");
   queue->Initialize ();
   Enqueue (queue, pktSize, 300, false);
   st = queue->GetStats ();
   drop.test11 = st.GetNDroppedPackets (RedQueueDisc::UNFORCED_DROP);
-  NS_TEST_EXPECT_MSG_NE (drop.test11, 0, "There should some dropped packets due to probability mark");
+  NS_TEST_ASSERT_MSG_NE (drop.test11, 0, "There should some dropped packets due to probability mark");
 
 
   // test 12: Feng's Adaptive RED with default parameter settings and varying m_curMaxP
   queue = CreateObject<RedQueueDisc> ();
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MinTh", DoubleValue (minTh)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MinTh", DoubleValue (minTh)), true,
                          "Verify that we can actually set the attribute MinTh");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxTh", DoubleValue (maxTh)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxTh", DoubleValue (maxTh)), true,
                          "Verify that we can actually set the attribute MaxTh");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
                          true, "Verify that we can actually set the attribute MaxSize");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("QW", DoubleValue (0.002)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("QW", DoubleValue (0.002)), true,
                          "Verify that we can actually set the attribute QW");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("LInterm", DoubleValue (2)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("LInterm", DoubleValue (2)), true,
                          "Verify that we can actually set the attribute LInterm");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("Gentle", BooleanValue (true)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("Gentle", BooleanValue (true)), true,
                          "Verify that we can actually set the attribute Gentle");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("FengAdaptive", BooleanValue (true)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("FengAdaptive", BooleanValue (true)), true,
                          "Verify that we can actually set the attribute FengAdaptive");
   queue->Initialize ();
   Enqueue (queue, pktSize, 300, false);
   st = queue->GetStats ();
   drop.test12 = st.GetNDroppedPackets (RedQueueDisc::UNFORCED_DROP);
-  NS_TEST_EXPECT_MSG_LT (drop.test12, drop.test11, "Test 12 should have less drops due to probability mark than test 11");
+  NS_TEST_ASSERT_MSG_LT (drop.test12, drop.test11, "Test 12 should have less drops due to probability mark than test 11");
 
 
   // test 13: RED with Nonlinear drop probability
   queue = CreateObject<RedQueueDisc> ();
   minTh = 30 * modeSize;
   maxTh = 90 * modeSize;
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MinTh", DoubleValue (minTh)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MinTh", DoubleValue (minTh)), true,
                          "Verify that we can actually set the attribute MinTh");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxTh", DoubleValue (maxTh)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxTh", DoubleValue (maxTh)), true,
                          "Verify that we can actually set the attribute MaxTh");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
                          true, "Verify that we can actually set the attribute MaxSize");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("QW", DoubleValue (0.002)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("QW", DoubleValue (0.002)), true,
                          "Verify that we can actually set the attribute QW");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("LInterm", DoubleValue (2)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("LInterm", DoubleValue (2)), true,
                          "Verify that we can actually set the attribute LInterm");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("Gentle", BooleanValue (true)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("Gentle", BooleanValue (true)), true,
                          "Verify that we can actually set the attribute Gentle");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("NLRED", BooleanValue (true)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("NLRED", BooleanValue (true)), true,
                          "Verify that we can actually set the attribute NLRED");
   queue->Initialize ();
   Enqueue (queue, pktSize, 300, false);
   st = queue->GetStats ();
   drop.test13 = st.GetNDroppedPackets (RedQueueDisc::UNFORCED_DROP);
-  NS_TEST_EXPECT_MSG_LT (drop.test13, drop.test11, "Test 13 should have less drops due to probability mark than test 11");
+  NS_TEST_ASSERT_MSG_LT (drop.test13, drop.test11, "Test 13 should have less drops due to probability mark than test 11");
 
 }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/traffic-control/test/tbf-queue-disc-test-suite.cc ns-3.36/src/traffic-control/test/tbf-queue-disc-test-suite.cc
--- ns-3.35/src/traffic-control/test/tbf-queue-disc-test-suite.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/traffic-control/test/tbf-queue-disc-test-suite.cc	2022-04-30 18:23:58.170735000 -0700
@@ -52,22 +52,16 @@
    */
   TbfQueueDiscTestItem (Ptr<Packet> p, const Address & addr);
   virtual ~TbfQueueDiscTestItem ();
+
+  // Delete copy constructor and assignment operator to avoid misuse
+  TbfQueueDiscTestItem (const TbfQueueDiscTestItem &) = delete;
+  TbfQueueDiscTestItem & operator = (const TbfQueueDiscTestItem &) = delete;
+
   virtual void AddHeader (void);
   virtual bool Mark (void);
 
 private:
   TbfQueueDiscTestItem ();
-  /**
-   * \brief Copy constructor
-   * Disable default implementation to avoid misuse
-   */
-  TbfQueueDiscTestItem (const TbfQueueDiscTestItem &);
-  /**
-   * \brief Assignment operator
-   * \return this object
-   * Disable default implementation to avoid misuse
-   */
-  TbfQueueDiscTestItem &operator = (const TbfQueueDiscTestItem &);
 };
 
 TbfQueueDiscTestItem::TbfQueueDiscTestItem (Ptr<Packet> p, const Address & addr)
@@ -158,15 +152,15 @@
       qSize = qSize * modeSize;
     }
 
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
                          true, "Verify that we can actually set the attribute MaxSize");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("Burst", UintegerValue (burst)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("Burst", UintegerValue (burst)), true,
                          "Verify that we can actually set the attribute Burst");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("Mtu", UintegerValue (mtu)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("Mtu", UintegerValue (mtu)), true,
                          "Verify that we can actually set the attribute Mtu");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("Rate", DataRateValue (rate)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("Rate", DataRateValue (rate)), true,
                          "Verify that we can actually set the attribute Rate");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("PeakRate", DataRateValue (peakRate)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("PeakRate", DataRateValue (peakRate)), true,
                          "Verify that we can actually set the attribute PeakRate");
 
   Address dest;
@@ -179,47 +173,47 @@
   p5 = Create<Packet> (pktSize);
 
   queue->Initialize ();
-  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 0 * modeSize, "There should be no packets in there");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 0 * modeSize, "There should be no packets in there");
   queue->Enqueue (Create<TbfQueueDiscTestItem> (p1, dest));
-  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 1 * modeSize, "There should be one packet in there");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 1 * modeSize, "There should be one packet in there");
   queue->Enqueue (Create<TbfQueueDiscTestItem> (p2, dest));
-  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 2 * modeSize, "There should be two packets in there");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 2 * modeSize, "There should be two packets in there");
   queue->Enqueue (Create<TbfQueueDiscTestItem> (p3, dest));
-  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 3 * modeSize, "There should be three packets in there");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 3 * modeSize, "There should be three packets in there");
   queue->Enqueue (Create<TbfQueueDiscTestItem> (p4, dest));
-  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 4 * modeSize, "There should be four packets in there");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 4 * modeSize, "There should be four packets in there");
   queue->Enqueue (Create<TbfQueueDiscTestItem> (p5, dest));
-  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 4 * modeSize,
+  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 4 * modeSize,
                          "There should still be four packets in there as this enqueue cannot happen since QueueLimit will be exceeded");
 
   Ptr<QueueDiscItem> item;
-  NS_TEST_EXPECT_MSG_EQ (queue->GetFirstBucketTokens (), burst, "The first token bucket should be full");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetFirstBucketTokens (), burst, "The first token bucket should be full");
   item = queue->Dequeue ();
-  NS_TEST_EXPECT_MSG_EQ ((item != 0), true, "I want to remove the first packet");
-  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 3 * modeSize, "There should be three packets in there");
-  NS_TEST_EXPECT_MSG_EQ (item->GetPacket ()->GetUid (), p1->GetUid (), "was this the first packet ?");
-  NS_TEST_EXPECT_MSG_EQ (queue->GetFirstBucketTokens (), burst - (1 * pktSize),
+  NS_TEST_ASSERT_MSG_EQ ((item != 0), true, "I want to remove the first packet");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 3 * modeSize, "There should be three packets in there");
+  NS_TEST_ASSERT_MSG_EQ (item->GetPacket ()->GetUid (), p1->GetUid (), "was this the first packet ?");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetFirstBucketTokens (), burst - (1 * pktSize),
                          "The number of tokens in the first bucket should be one pktSize lesser");
 
   item = queue->Dequeue ();
-  NS_TEST_EXPECT_MSG_EQ ((item != 0), true, "I want to remove the second packet");
-  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 2 * modeSize, "There should be two packets in there");
-  NS_TEST_EXPECT_MSG_EQ (item->GetPacket ()->GetUid (), p2->GetUid (), "Was this the second packet ?");
-  NS_TEST_EXPECT_MSG_EQ (queue->GetFirstBucketTokens (), burst - (2 * pktSize),
+  NS_TEST_ASSERT_MSG_EQ ((item != 0), true, "I want to remove the second packet");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 2 * modeSize, "There should be two packets in there");
+  NS_TEST_ASSERT_MSG_EQ (item->GetPacket ()->GetUid (), p2->GetUid (), "Was this the second packet ?");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetFirstBucketTokens (), burst - (2 * pktSize),
                          "The number of tokens in the first bucket should be two pktSizes lesser");
 
   item = queue->Dequeue ();
-  NS_TEST_EXPECT_MSG_EQ ((item != 0), true, "I want to remove the third packet");
-  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 1 * modeSize, "There should be one packet in there");
-  NS_TEST_EXPECT_MSG_EQ (item->GetPacket ()->GetUid (), p3->GetUid (), "Was this the third packet ?");
-  NS_TEST_EXPECT_MSG_EQ (queue->GetFirstBucketTokens (), burst - (3 * pktSize),
+  NS_TEST_ASSERT_MSG_EQ ((item != 0), true, "I want to remove the third packet");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 1 * modeSize, "There should be one packet in there");
+  NS_TEST_ASSERT_MSG_EQ (item->GetPacket ()->GetUid (), p3->GetUid (), "Was this the third packet ?");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetFirstBucketTokens (), burst - (3 * pktSize),
                          "The number of tokens in the first bucket should be three pktSizes lesser");
 
   item = queue->Dequeue ();
-  NS_TEST_EXPECT_MSG_EQ ((item != 0), true, "I want to remove the fourth packet");
-  NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 0 * modeSize, "There should be zero packet in there");
-  NS_TEST_EXPECT_MSG_EQ (item->GetPacket ()->GetUid (), p4->GetUid (), "Was this the fourth packet ?");
-  NS_TEST_EXPECT_MSG_EQ (queue->GetFirstBucketTokens (), burst - (4 * pktSize),
+  NS_TEST_ASSERT_MSG_EQ ((item != 0), true, "I want to remove the fourth packet");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetCurrentSize ().GetValue (), 0 * modeSize, "There should be zero packet in there");
+  NS_TEST_ASSERT_MSG_EQ (item->GetPacket ()->GetUid (), p4->GetUid (), "Was this the fourth packet ?");
+  NS_TEST_ASSERT_MSG_EQ (queue->GetFirstBucketTokens (), burst - (4 * pktSize),
                          "The number of tokens in the first bucket should be four pktSizes lesser");
 
   // test 2 : When DataRate == FirstBucketTokenRate; packets should pass smoothly.
@@ -238,15 +232,15 @@
       qSize = qSize * modeSize;
     }
 
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
                          true, "Verify that we can actually set the attribute MaxSize");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("Burst", UintegerValue (burst)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("Burst", UintegerValue (burst)), true,
                          "Verify that we can actually set the attribute Burst");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("Mtu", UintegerValue (mtu)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("Mtu", UintegerValue (mtu)), true,
                          "Verify that we can actually set the attribute Mtu");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("Rate", DataRateValue (rate)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("Rate", DataRateValue (rate)), true,
                          "Verify that we can actually set the attribute Rate");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("PeakRate", DataRateValue (peakRate)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("PeakRate", DataRateValue (peakRate)), true,
                          "Verify that we can actually set the attribute PeakRate");
 
   queue->Initialize ();
@@ -301,15 +295,15 @@
       qSize = qSize * modeSize;
     }
 
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
                          true, "Verify that we can actually set the attribute MaxSize");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("Burst", UintegerValue (burst)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("Burst", UintegerValue (burst)), true,
                          "Verify that we can actually set the attribute Burst");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("Mtu", UintegerValue (mtu)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("Mtu", UintegerValue (mtu)), true,
                          "Verify that we can actually set the attribute Mtu");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("Rate", DataRateValue (rate)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("Rate", DataRateValue (rate)), true,
                          "Verify that we can actually set the attribute Rate");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("PeakRate", DataRateValue (peakRate)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("PeakRate", DataRateValue (peakRate)), true,
                          "Verify that we can actually set the attribute PeakRate");
 
   delay = 0.09;
@@ -375,15 +369,15 @@
       qSize = qSize * modeSize;
     }
 
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, qSize))),
                          true, "Verify that we can actually set the attribute MaxSize");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("Burst", UintegerValue (burst)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("Burst", UintegerValue (burst)), true,
                          "Verify that we can actually set the attribute Burst");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("Mtu", UintegerValue (mtu)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("Mtu", UintegerValue (mtu)), true,
                          "Verify that we can actually set the attribute Mtu");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("Rate", DataRateValue (rate)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("Rate", DataRateValue (rate)), true,
                          "Verify that we can actually set the attribute Rate");
-  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("PeakRate", DataRateValue (peakRate)), true,
+  NS_TEST_ASSERT_MSG_EQ (queue->SetAttributeFailSafe ("PeakRate", DataRateValue (peakRate)), true,
                          "Verify that we can actually set the attribute PeakRate");
 
   queue->Initialize ();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/traffic-control/test/tc-flow-control-test-suite.cc ns-3.36/src/traffic-control/test/tc-flow-control-test-suite.cc
--- ns-3.35/src/traffic-control/test/tc-flow-control-test-suite.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/traffic-control/test/tc-flow-control-test-suite.cc	2022-04-30 18:23:58.170735000 -0700
@@ -55,22 +55,16 @@
    */
   QueueDiscTestItem (Ptr<Packet> p);
   virtual ~QueueDiscTestItem ();
+
+  // Delete copy constructor and assignment operator to avoid misuse
+  QueueDiscTestItem (const QueueDiscTestItem &) = delete;
+  QueueDiscTestItem & operator = (const QueueDiscTestItem &) = delete;
+
   virtual void AddHeader (void);
   virtual bool Mark(void);
 
 private:
   QueueDiscTestItem ();
-  /**
-   * \brief Copy constructor
-   * Disable default implementation to avoid misuse
-   */
-  QueueDiscTestItem (const QueueDiscTestItem &);
-  /**
-   * \brief Assignment operator
-   * \return this object
-   * Disable default implementation to avoid misuse
-   */
-  QueueDiscTestItem &operator = (const QueueDiscTestItem &);
 };
 
 QueueDiscTestItem::QueueDiscTestItem (Ptr<Packet> p)
@@ -106,6 +100,8 @@
    * Constructor
    *
    * \param tt the test type
+   * \param deviceQueueLength the queue length of the device
+   * \param totalTxPackets the toal number of packets to transmit
    */
   TcFlowControlTestCase (QueueSizeUnit tt, uint32_t deviceQueueLength, uint32_t totalTxPackets);
   virtual ~TcFlowControlTestCase ();
@@ -138,9 +134,9 @@
    * \param msg the message to print if a different number of packets are stored
    */
   void CheckPacketsInQueueDisc (Ptr<NetDevice> dev, uint16_t nPackets, const std::string msg);
-  QueueSizeUnit m_type;       //!< the test type
-  uint32_t m_deviceQueueLength;
-  uint32_t m_totalTxPackets;
+  QueueSizeUnit m_type;         //!< the test type
+  uint32_t m_deviceQueueLength; //!< the queue length of the device
+  uint32_t m_totalTxPackets;    //!< the toal number of packets to transmit
 };
 
 TcFlowControlTestCase::TcFlowControlTestCase (QueueSizeUnit tt, uint32_t deviceQueueLength, uint32_t totalTxPackets)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/traffic-control/wscript ns-3.36/src/traffic-control/wscript
--- ns-3.35/src/traffic-control/wscript	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/traffic-control/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,77 +0,0 @@
-# -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-# def options(opt):
-#     pass
-
-# def configure(conf):
-#     conf.check_nonfatal(header_name='stdint.h', define_name='HAVE_STDINT_H')
-
-def build(bld):
-    module = bld.create_ns3_module('traffic-control', ['core', 'network'])
-    module.source = [
-      'model/traffic-control-layer.cc',
-      'model/packet-filter.cc',
-      'model/queue-disc.cc',
-      'model/pfifo-fast-queue-disc.cc',
-      'model/fifo-queue-disc.cc',
-      'model/red-queue-disc.cc',
-      'model/codel-queue-disc.cc',
-      'model/fq-codel-queue-disc.cc',
-      'model/pie-queue-disc.cc',
-      'model/fq-pie-queue-disc.cc',
-      'model/prio-queue-disc.cc',
-      'model/mq-queue-disc.cc',
-      'model/tbf-queue-disc.cc',
-      'model/cobalt-queue-disc.cc',
-      'model/fq-cobalt-queue-disc.cc',
-      'helper/traffic-control-helper.cc',
-      'helper/queue-disc-container.cc'
-        ]
-
-    module_test = bld.create_ns3_module_test_library('traffic-control')
-    module_test.source = [
-      'test/red-queue-disc-test-suite.cc',
-      'test/codel-queue-disc-test-suite.cc',
-      'test/adaptive-red-queue-disc-test-suite.cc',
-      'test/pie-queue-disc-test-suite.cc',
-      'test/fifo-queue-disc-test-suite.cc',
-      'test/prio-queue-disc-test-suite.cc',
-      'test/queue-disc-traces-test-suite.cc',
-      'test/tbf-queue-disc-test-suite.cc',
-      'test/tc-flow-control-test-suite.cc',
-      'test/cobalt-queue-disc-test-suite.cc'
-        ]
-
-    # Tests encapsulating example programs should be listed here
-    if (bld.env['ENABLE_EXAMPLES']):
-        module_test.source.extend([
-        #   'test/traffic-control-examples-test-suite.cc',
-            ])
-    
-    headers = bld(features='ns3header')
-    headers.module = 'traffic-control'
-    headers.source = [
-      'model/traffic-control-layer.h',
-      'model/packet-filter.h',
-      'model/queue-disc.h',
-      'model/pfifo-fast-queue-disc.h',
-      'model/fifo-queue-disc.h',
-      'model/red-queue-disc.h',
-      'model/codel-queue-disc.h',
-      'model/fq-codel-queue-disc.h',
-      'model/pie-queue-disc.h',
-      'model/fq-pie-queue-disc.h',
-      'model/prio-queue-disc.h',
-      'model/mq-queue-disc.h',
-      'model/tbf-queue-disc.h',
-      'model/cobalt-queue-disc.h',
-      'model/fq-cobalt-queue-disc.h',
-      'helper/traffic-control-helper.h',
-      'helper/queue-disc-container.h'
-        ]
-
-    if bld.env.ENABLE_EXAMPLES:
-        bld.recurse('examples')
-
-    bld.ns3_python_bindings()
-
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/uan/bindings/callbacks_list.py ns-3.36/src/uan/bindings/callbacks_list.py
--- ns-3.35/src/uan/bindings/callbacks_list.py	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/uan/bindings/callbacks_list.py	2022-04-30 18:23:58.170735000 -0700
@@ -6,8 +6,8 @@
     ['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'double', 'double', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Ptr<const ns3::MobilityModel>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::Mac8Address', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Ptr<const ns3::MobilityModel>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<ns3::Packet>', 'unsigned short', 'const ns3::Mac8Address &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<ns3::Packet>', 'double', 'ns3::UanTxMode', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<ns3::Packet>', 'double', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/uan/bindings/modulegen__gcc_ILP32.py ns-3.36/src/uan/bindings/modulegen__gcc_ILP32.py
--- ns-3.35/src/uan/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/uan/bindings/modulegen__gcc_ILP32.py	2022-04-30 18:23:58.174735000 -0700
@@ -78,6 +78,8 @@
     module.add_class('EnergySourceHelper', allow_subclassing=True, import_from_module='ns.energy')
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'], import_from_module='ns.core')
     ## hash.h (module 'core'): ns3::Hasher [class]
     module.add_class('Hasher', import_from_module='ns.core')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
@@ -232,23 +234,23 @@
     module.add_class('RandomVariableStream', import_from_module='ns.core', parent=root_module['ns3::Object'])
     ## random-variable-stream.h (module 'core'): ns3::SequentialRandomVariable [class]
     module.add_class('SequentialRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
     module.add_class('TraceSourceAccessor', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >'])
@@ -581,7 +583,7 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Time', 'ns3::Time', 'unsigned int', 'unsigned int', 'double', 'unsigned int', 'double', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     module.add_container('std::list< std::pair< ns3::Ptr< ns3::Packet >, ns3::Mac8Address > >', 'std::pair< ns3::Ptr< ns3::Packet >, ns3::Mac8Address >', container_type='list')
     module.add_container('std::vector< ns3::Tap >', 'ns3::Tap', container_type='vector')
     module.add_container('std::vector< std::complex< double > >', 'std::complex< double >', container_type='vector')
@@ -2824,7 +2826,7 @@
     cls.add_constructor([param('ns3::Reservation const &', 'arg0')])
     ## uan-mac-rc.h (module 'uan'): ns3::Reservation::Reservation() [constructor]
     cls.add_constructor([])
-    ## uan-mac-rc.h (module 'uan'): ns3::Reservation::Reservation(std::list<std::pair<ns3::Ptr<ns3::Packet>, ns3::Mac8Address>, std::allocator<std::pair<ns3::Ptr<ns3::Packet>, ns3::Mac8Address> > > & list, uint8_t frameNo, uint32_t maxPkts=0) [constructor]
+    ## uan-mac-rc.h (module 'uan'): ns3::Reservation::Reservation(std::list<std::pair<ns3::Ptr<ns3::Packet>, ns3::Mac8Address>, std::allocator<std::pair<ns3::Ptr<ns3::Packet>, ns3::Mac8Address>>> & list, uint8_t frameNo, uint32_t maxPkts=0) [constructor]
     cls.add_constructor([param('std::list< std::pair< ns3::Ptr< ns3::Packet >, ns3::Mac8Address > > &', 'list'), param('uint8_t', 'frameNo'), param('uint32_t', 'maxPkts', default_value='0')])
     ## uan-mac-rc.h (module 'uan'): void ns3::Reservation::AddTimestamp(ns3::Time t) [member function]
     cls.add_method('AddTimestamp', 
@@ -2845,7 +2847,7 @@
                    'uint32_t', 
                    [], 
                    is_const=True)
-    ## uan-mac-rc.h (module 'uan'): std::list<std::pair<ns3::Ptr<ns3::Packet>, ns3::Mac8Address>, std::allocator<std::pair<ns3::Ptr<ns3::Packet>, ns3::Mac8Address> > > const & ns3::Reservation::GetPktList() const [member function]
+    ## uan-mac-rc.h (module 'uan'): std::list<std::pair<ns3::Ptr<ns3::Packet>, ns3::Mac8Address>, std::allocator<std::pair<ns3::Ptr<ns3::Packet>, ns3::Mac8Address>>> const & ns3::Reservation::GetPktList() const [member function]
     cls.add_method('GetPktList', 
                    'std::list< std::pair< ns3::Ptr< ns3::Packet >, ns3::Mac8Address > > const &', 
                    [], 
@@ -3340,8 +3342,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -3666,11 +3668,11 @@
     cls.add_constructor([param('ns3::UanPdp const &', 'arg0')])
     ## uan-prop-model.h (module 'uan'): ns3::UanPdp::UanPdp() [constructor]
     cls.add_constructor([])
-    ## uan-prop-model.h (module 'uan'): ns3::UanPdp::UanPdp(std::vector<ns3::Tap, std::allocator<ns3::Tap> > taps, ns3::Time resolution) [constructor]
+    ## uan-prop-model.h (module 'uan'): ns3::UanPdp::UanPdp(std::vector<ns3::Tap, std::allocator<ns3::Tap>> taps, ns3::Time resolution) [constructor]
     cls.add_constructor([param('std::vector< ns3::Tap >', 'taps'), param('ns3::Time', 'resolution')])
-    ## uan-prop-model.h (module 'uan'): ns3::UanPdp::UanPdp(std::vector<std::complex<double>, std::allocator<std::complex<double> > > arrivals, ns3::Time resolution) [constructor]
+    ## uan-prop-model.h (module 'uan'): ns3::UanPdp::UanPdp(std::vector<std::complex<double>, std::allocator<std::complex<double>>> arrivals, ns3::Time resolution) [constructor]
     cls.add_constructor([param('std::vector< std::complex< double > >', 'arrivals'), param('ns3::Time', 'resolution')])
-    ## uan-prop-model.h (module 'uan'): ns3::UanPdp::UanPdp(std::vector<double, std::allocator<double> > arrivals, ns3::Time resolution) [constructor]
+    ## uan-prop-model.h (module 'uan'): ns3::UanPdp::UanPdp(std::vector<double, std::allocator<double>> arrivals, ns3::Time resolution) [constructor]
     cls.add_constructor([param('std::vector< double >', 'arrivals'), param('ns3::Time', 'resolution')])
     ## uan-prop-model.h (module 'uan'): static ns3::UanPdp ns3::UanPdp::CreateImpulsePdp() [member function]
     cls.add_method('CreateImpulsePdp', 
@@ -3947,14 +3949,14 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('>=')
     cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_unary_numeric_operator('-')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
     cls.add_constructor([])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(double const value) [constructor]
@@ -3973,6 +3975,8 @@
     cls.add_constructor([param('long unsigned int const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int const v) [constructor]
     cls.add_constructor([param('long long unsigned int const', 'v')])
+    ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int128_t const v) [constructor]
+    cls.add_constructor([param('int128_t const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t const hi, uint64_t const lo) [constructor]
     cls.add_constructor([param('int64_t const', 'hi'), param('uint64_t const', 'lo')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [constructor]
@@ -4261,65 +4265,65 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
@@ -4530,7 +4534,7 @@
                    'ns3::TypeId', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## uan-header-rc.h (module 'uan'): std::set<unsigned char, std::less<unsigned char>, std::allocator<unsigned char> > const & ns3::UanHeaderRcAck::GetNackedFrames() const [member function]
+    ## uan-header-rc.h (module 'uan'): std::set<unsigned char, std::less<unsigned char>, std::allocator<unsigned char>> const & ns3::UanHeaderRcAck::GetNackedFrames() const [member function]
     cls.add_method('GetNackedFrames', 
                    'std::set< unsigned char > const &', 
                    [], 
@@ -6718,17 +6722,17 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::MobilityModel const> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Mac8Address'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Mac8Address'], visibility='protected')
+                   is_static=True, template_parameters=['bool'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['bool'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::MobilityModel const> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
@@ -8014,10 +8018,16 @@
     cls.add_method('ExtractNeighborIndex', 
                    'uint32_t', 
                    [param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetEpoch() const [member function]
+    cls.add_method('GetEpoch', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() const [member function]
     cls.add_method('GetRemainingBits', 
                    'uint32_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -8028,6 +8038,10 @@
                    'uint32_t', 
                    [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
+    ## nix-vector.h (module 'network'): void ns3::NixVector::SetEpoch(uint32_t epoch) [member function]
+    cls.add_method('SetEpoch', 
+                   'void', 
+                   [param('uint32_t', 'epoch')])
     return
 
 def register_Ns3Node_methods(root_module, cls):
@@ -8391,10 +8405,11 @@
                    'uint32_t', 
                    [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) const [member function]
     cls.add_method('SetNixVector', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')], 
+                   is_const=True)
     ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
     cls.add_method('ToString', 
                    'std::string', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/uan/bindings/modulegen__gcc_LP64.py ns-3.36/src/uan/bindings/modulegen__gcc_LP64.py
--- ns-3.35/src/uan/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/uan/bindings/modulegen__gcc_LP64.py	2022-04-30 18:23:58.174735000 -0700
@@ -78,6 +78,8 @@
     module.add_class('EnergySourceHelper', allow_subclassing=True, import_from_module='ns.energy')
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'], import_from_module='ns.core')
     ## hash.h (module 'core'): ns3::Hasher [class]
     module.add_class('Hasher', import_from_module='ns.core')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
@@ -232,23 +234,23 @@
     module.add_class('RandomVariableStream', import_from_module='ns.core', parent=root_module['ns3::Object'])
     ## random-variable-stream.h (module 'core'): ns3::SequentialRandomVariable [class]
     module.add_class('SequentialRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
     module.add_class('TraceSourceAccessor', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >'])
@@ -581,7 +583,7 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Time', 'ns3::Time', 'unsigned int', 'unsigned int', 'double', 'unsigned int', 'double', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     module.add_container('std::list< std::pair< ns3::Ptr< ns3::Packet >, ns3::Mac8Address > >', 'std::pair< ns3::Ptr< ns3::Packet >, ns3::Mac8Address >', container_type='list')
     module.add_container('std::vector< ns3::Tap >', 'ns3::Tap', container_type='vector')
     module.add_container('std::vector< std::complex< double > >', 'std::complex< double >', container_type='vector')
@@ -2824,7 +2826,7 @@
     cls.add_constructor([param('ns3::Reservation const &', 'arg0')])
     ## uan-mac-rc.h (module 'uan'): ns3::Reservation::Reservation() [constructor]
     cls.add_constructor([])
-    ## uan-mac-rc.h (module 'uan'): ns3::Reservation::Reservation(std::list<std::pair<ns3::Ptr<ns3::Packet>, ns3::Mac8Address>, std::allocator<std::pair<ns3::Ptr<ns3::Packet>, ns3::Mac8Address> > > & list, uint8_t frameNo, uint32_t maxPkts=0) [constructor]
+    ## uan-mac-rc.h (module 'uan'): ns3::Reservation::Reservation(std::list<std::pair<ns3::Ptr<ns3::Packet>, ns3::Mac8Address>, std::allocator<std::pair<ns3::Ptr<ns3::Packet>, ns3::Mac8Address>>> & list, uint8_t frameNo, uint32_t maxPkts=0) [constructor]
     cls.add_constructor([param('std::list< std::pair< ns3::Ptr< ns3::Packet >, ns3::Mac8Address > > &', 'list'), param('uint8_t', 'frameNo'), param('uint32_t', 'maxPkts', default_value='0')])
     ## uan-mac-rc.h (module 'uan'): void ns3::Reservation::AddTimestamp(ns3::Time t) [member function]
     cls.add_method('AddTimestamp', 
@@ -2845,7 +2847,7 @@
                    'uint32_t', 
                    [], 
                    is_const=True)
-    ## uan-mac-rc.h (module 'uan'): std::list<std::pair<ns3::Ptr<ns3::Packet>, ns3::Mac8Address>, std::allocator<std::pair<ns3::Ptr<ns3::Packet>, ns3::Mac8Address> > > const & ns3::Reservation::GetPktList() const [member function]
+    ## uan-mac-rc.h (module 'uan'): std::list<std::pair<ns3::Ptr<ns3::Packet>, ns3::Mac8Address>, std::allocator<std::pair<ns3::Ptr<ns3::Packet>, ns3::Mac8Address>>> const & ns3::Reservation::GetPktList() const [member function]
     cls.add_method('GetPktList', 
                    'std::list< std::pair< ns3::Ptr< ns3::Packet >, ns3::Mac8Address > > const &', 
                    [], 
@@ -3340,8 +3342,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -3666,11 +3668,11 @@
     cls.add_constructor([param('ns3::UanPdp const &', 'arg0')])
     ## uan-prop-model.h (module 'uan'): ns3::UanPdp::UanPdp() [constructor]
     cls.add_constructor([])
-    ## uan-prop-model.h (module 'uan'): ns3::UanPdp::UanPdp(std::vector<ns3::Tap, std::allocator<ns3::Tap> > taps, ns3::Time resolution) [constructor]
+    ## uan-prop-model.h (module 'uan'): ns3::UanPdp::UanPdp(std::vector<ns3::Tap, std::allocator<ns3::Tap>> taps, ns3::Time resolution) [constructor]
     cls.add_constructor([param('std::vector< ns3::Tap >', 'taps'), param('ns3::Time', 'resolution')])
-    ## uan-prop-model.h (module 'uan'): ns3::UanPdp::UanPdp(std::vector<std::complex<double>, std::allocator<std::complex<double> > > arrivals, ns3::Time resolution) [constructor]
+    ## uan-prop-model.h (module 'uan'): ns3::UanPdp::UanPdp(std::vector<std::complex<double>, std::allocator<std::complex<double>>> arrivals, ns3::Time resolution) [constructor]
     cls.add_constructor([param('std::vector< std::complex< double > >', 'arrivals'), param('ns3::Time', 'resolution')])
-    ## uan-prop-model.h (module 'uan'): ns3::UanPdp::UanPdp(std::vector<double, std::allocator<double> > arrivals, ns3::Time resolution) [constructor]
+    ## uan-prop-model.h (module 'uan'): ns3::UanPdp::UanPdp(std::vector<double, std::allocator<double>> arrivals, ns3::Time resolution) [constructor]
     cls.add_constructor([param('std::vector< double >', 'arrivals'), param('ns3::Time', 'resolution')])
     ## uan-prop-model.h (module 'uan'): static ns3::UanPdp ns3::UanPdp::CreateImpulsePdp() [member function]
     cls.add_method('CreateImpulsePdp', 
@@ -3947,14 +3949,14 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('>=')
     cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_unary_numeric_operator('-')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
     cls.add_constructor([])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(double const value) [constructor]
@@ -3973,6 +3975,8 @@
     cls.add_constructor([param('long unsigned int const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int const v) [constructor]
     cls.add_constructor([param('long long unsigned int const', 'v')])
+    ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int128_t const v) [constructor]
+    cls.add_constructor([param('int128_t const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t const hi, uint64_t const lo) [constructor]
     cls.add_constructor([param('int64_t const', 'hi'), param('uint64_t const', 'lo')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [constructor]
@@ -4261,65 +4265,65 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
@@ -4530,7 +4534,7 @@
                    'ns3::TypeId', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## uan-header-rc.h (module 'uan'): std::set<unsigned char, std::less<unsigned char>, std::allocator<unsigned char> > const & ns3::UanHeaderRcAck::GetNackedFrames() const [member function]
+    ## uan-header-rc.h (module 'uan'): std::set<unsigned char, std::less<unsigned char>, std::allocator<unsigned char>> const & ns3::UanHeaderRcAck::GetNackedFrames() const [member function]
     cls.add_method('GetNackedFrames', 
                    'std::set< unsigned char > const &', 
                    [], 
@@ -6718,17 +6722,17 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::MobilityModel const> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Mac8Address'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Mac8Address'], visibility='protected')
+                   is_static=True, template_parameters=['bool'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['bool'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::MobilityModel const> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
@@ -8014,10 +8018,16 @@
     cls.add_method('ExtractNeighborIndex', 
                    'uint32_t', 
                    [param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetEpoch() const [member function]
+    cls.add_method('GetEpoch', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() const [member function]
     cls.add_method('GetRemainingBits', 
                    'uint32_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -8028,6 +8038,10 @@
                    'uint32_t', 
                    [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
+    ## nix-vector.h (module 'network'): void ns3::NixVector::SetEpoch(uint32_t epoch) [member function]
+    cls.add_method('SetEpoch', 
+                   'void', 
+                   [param('uint32_t', 'epoch')])
     return
 
 def register_Ns3Node_methods(root_module, cls):
@@ -8391,10 +8405,11 @@
                    'uint32_t', 
                    [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) const [member function]
     cls.add_method('SetNixVector', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')], 
+                   is_const=True)
     ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
     cls.add_method('ToString', 
                    'std::string', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/uan/CMakeLists.txt ns-3.36/src/uan/CMakeLists.txt
--- ns-3.35/src/uan/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/uan/CMakeLists.txt	2022-04-30 18:23:58.170735000 -0700
@@ -0,0 +1,57 @@
+build_lib(
+  LIBNAME uan
+  SOURCE_FILES
+    helper/acoustic-modem-energy-model-helper.cc
+    helper/uan-helper.cc
+    model/acoustic-modem-energy-model.cc
+    model/uan-channel.cc
+    model/uan-header-common.cc
+    model/uan-header-rc.cc
+    model/uan-mac-aloha.cc
+    model/uan-mac-cw.cc
+    model/uan-mac-rc-gw.cc
+    model/uan-mac-rc.cc
+    model/uan-mac.cc
+    model/uan-net-device.cc
+    model/uan-noise-model-default.cc
+    model/uan-noise-model.cc
+    model/uan-phy-dual.cc
+    model/uan-phy-gen.cc
+    model/uan-phy.cc
+    model/uan-prop-model-ideal.cc
+    model/uan-prop-model-thorp.cc
+    model/uan-prop-model.cc
+    model/uan-transducer-hd.cc
+    model/uan-transducer.cc
+    model/uan-tx-mode.cc
+  HEADER_FILES
+    helper/acoustic-modem-energy-model-helper.h
+    helper/uan-helper.h
+    model/acoustic-modem-energy-model.h
+    model/uan-channel.h
+    model/uan-header-common.h
+    model/uan-header-rc.h
+    model/uan-mac-aloha.h
+    model/uan-mac-cw.h
+    model/uan-mac-rc-gw.h
+    model/uan-mac-rc.h
+    model/uan-mac.h
+    model/uan-net-device.h
+    model/uan-noise-model-default.h
+    model/uan-noise-model.h
+    model/uan-phy-dual.h
+    model/uan-phy-gen.h
+    model/uan-phy.h
+    model/uan-prop-model-ideal.h
+    model/uan-prop-model-thorp.h
+    model/uan-prop-model.h
+    model/uan-transducer-hd.h
+    model/uan-transducer.h
+    model/uan-tx-mode.h
+  LIBRARIES_TO_LINK
+    ${libnetwork}
+    ${libmobility}
+    ${libenergy}
+  TEST_SOURCES test/uan-energy-model-test.cc
+               test/uan-test.cc
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/uan/examples/CMakeLists.txt ns-3.36/src/uan/examples/CMakeLists.txt
--- ns-3.35/src/uan/examples/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/uan/examples/CMakeLists.txt	2022-04-30 18:23:58.174735000 -0700
@@ -0,0 +1,34 @@
+set(base_examples
+    uan-cw-example
+    uan-rc-example
+    uan-ipv4-example
+    uan-ipv6-example
+    uan-raw-example
+)
+foreach(
+  example
+  ${base_examples}
+)
+  build_lib_example(
+    NAME ${example}
+    SOURCE_FILES ${example}.cc
+    LIBRARIES_TO_LINK
+      ${libinternet}
+      ${libmobility}
+      ${libstats}
+      ${libapplications}
+      ${libuan}
+  )
+endforeach()
+
+build_lib_example(
+  NAME uan-6lowpan-example
+  SOURCE_FILES uan-6lowpan-example.cc
+  LIBRARIES_TO_LINK
+    ${libinternet}
+    ${libmobility}
+    ${libstats}
+    ${libapplications}
+    ${libuan}
+    ${libsixlowpan}
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/uan/examples/wscript ns-3.36/src/uan/examples/wscript
--- ns-3.35/src/uan/examples/wscript	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/uan/examples/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,20 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    obj = bld.create_ns3_program('uan-cw-example', ['internet', 'mobility', 'stats', 'applications', 'uan'])
-    obj.source = 'uan-cw-example.cc'
-
-    obj = bld.create_ns3_program('uan-rc-example', ['internet', 'mobility', 'stats', 'applications', 'uan'])
-    obj.source = 'uan-rc-example.cc'
-
-    obj = bld.create_ns3_program ('uan-raw-example', ['internet', 'mobility', 'stats', 'uan'])
-    obj.source = 'uan-raw-example.cc'
-
-    obj = bld.create_ns3_program ('uan-ipv4-example', ['internet', 'mobility', 'stats', 'uan'])
-    obj.source = 'uan-ipv4-example.cc'
-
-    obj = bld.create_ns3_program ('uan-ipv6-example', ['internet', 'mobility', 'stats', 'uan'])
-    obj.source = 'uan-ipv6-example.cc'
-
-    obj = bld.create_ns3_program ('uan-6lowpan-example', ['internet', 'mobility', 'stats', 'uan', 'sixlowpan'])
-    obj.source = 'uan-6lowpan-example.cc'
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/uan/helper/uan-helper.cc ns-3.36/src/uan/helper/uan-helper.cc
--- ns-3.35/src/uan/helper/uan-helper.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/uan/helper/uan-helper.cc	2022-04-30 18:23:58.174735000 -0700
@@ -55,9 +55,9 @@
  * \param mode The transmission mode.
  */
 static void AsciiPhyTxEvent (std::ostream *os, std::string context,
-                             Ptr<const Packet> packet, double txPowerDb, UanTxMode mode)
+                             Ptr<const Packet> packet, 
+                             [[maybe_unused]] double txPowerDb, UanTxMode mode)
 {
-  NS_UNUSED (txPowerDb);
   *os << "+ " << Simulator::Now ().GetSeconds () << " " << context << " " << *packet << std::endl;
 }
 
@@ -71,9 +71,9 @@
  * \param mode The channel transmission mode.
  */
 static void AsciiPhyRxOkEvent (std::ostream *os, std::string context,
-                               Ptr<const Packet> packet, double snr, UanTxMode mode)
+                               Ptr<const Packet> packet, 
+                               [[maybe_unused]] double snr, UanTxMode mode)
 {
-  NS_UNUSED (snr);
   *os << "r " << Simulator::Now ().GetSeconds () << " " << context << " " << *packet << std::endl;
 }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/uan/model/uan-mac-aloha.cc ns-3.36/src/uan/model/uan-mac-aloha.cc
--- ns-3.35/src/uan/model/uan-mac-aloha.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/uan/model/uan-mac-aloha.cc	2022-04-30 18:23:58.174735000 -0700
@@ -114,9 +114,8 @@
 
 }
 void
-UanMacAloha::RxPacketGood (Ptr<Packet> pkt, double sinr, UanTxMode txMode)
+UanMacAloha::RxPacketGood (Ptr<Packet> pkt, [[maybe_unused]] double sinr, UanTxMode txMode)
 {
-  NS_UNUSED (sinr);
   UanHeaderCommon header;
   pkt->RemoveHeader (header);
   NS_LOG_DEBUG ("Receiving packet from " << header.GetSrc () << " For " << header.GetDest ());
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/uan/model/uan-mac-cw.cc ns-3.36/src/uan/model/uan-mac-cw.cc
--- ns-3.35/src/uan/model/uan-mac-cw.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/uan/model/uan-mac-cw.cc	2022-04-30 18:23:58.174735000 -0700
@@ -326,9 +326,8 @@
   return m_slotTime;
 }
 void
-UanMacCw::PhyRxPacketGood (Ptr<Packet> packet, double sinr, UanTxMode mode)
+UanMacCw::PhyRxPacketGood (Ptr<Packet> packet, [[maybe_unused]] double sinr, UanTxMode mode)
 {
-  NS_UNUSED (sinr);
   UanHeaderCommon header;
   packet->RemoveHeader (header);
 
@@ -338,9 +337,8 @@
     }
 }
 void
-UanMacCw::PhyRxPacketError (Ptr<Packet> packet, double sinr)
+UanMacCw::PhyRxPacketError (Ptr<Packet> packet, [[maybe_unused]] double sinr)
 {
-  NS_UNUSED (sinr);
 }
 void
 UanMacCw::SaveTimer (void)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/uan/model/uan-mac-rc.cc ns-3.36/src/uan/model/uan-mac-rc.cc
--- ns-3.35/src/uan/model/uan-mac-rc.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/uan/model/uan-mac-rc.cc	2022-04-30 18:23:58.174735000 -0700
@@ -144,9 +144,8 @@
 }
 
 void
-Reservation::SetTransmitted (bool t)
+Reservation::SetTransmitted ([[maybe_unused]] bool t)
 {
-  NS_UNUSED (t);
   m_transmitted = true;
 }
 
@@ -326,9 +325,8 @@
 }
 
 void
-UanMacRc::ReceiveOkFromPhy (Ptr<Packet> pkt, double sinr, UanTxMode mode)
+UanMacRc::ReceiveOkFromPhy (Ptr<Packet> pkt, [[maybe_unused]] double sinr, UanTxMode mode)
 {
-  NS_UNUSED (sinr);
   UanHeaderCommon ch;
   pkt->RemoveHeader (ch);
   if (ch.GetDest () == Mac8Address::ConvertFrom (GetAddress ()) || ch.GetDest () == Mac8Address::GetBroadcast ())
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/uan/model/uan-mac-rc-gw.cc ns-3.36/src/uan/model/uan-mac-rc-gw.cc
--- ns-3.35/src/uan/model/uan-mac-rc-gw.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/uan/model/uan-mac-rc-gw.cc	2022-04-30 18:23:58.174735000 -0700
@@ -171,10 +171,10 @@
 }
 
 bool
-UanMacRcGw::Enqueue (Ptr<Packet> packet, uint16_t protocolNumber, const Address &dest)
+UanMacRcGw::Enqueue (Ptr<Packet> packet, 
+                     [[maybe_unused]] uint16_t protocolNumber, 
+                     [[maybe_unused]] const Address &dest)
 {
-  NS_UNUSED (dest);
-  NS_UNUSED (protocolNumber);
   NS_LOG_WARN ("RCMAC Gateway transmission to acoustic nodes is not yet implemented");
   return false;
 }
@@ -194,15 +194,13 @@
 }
 
 void
-UanMacRcGw::ReceiveError (Ptr<Packet> pkt, double sinr)
+UanMacRcGw::ReceiveError (Ptr<Packet> pkt, [[maybe_unused]] double sinr)
 {
-  NS_UNUSED (sinr);
 }
 
 void
-UanMacRcGw::ReceivePacket (Ptr<Packet> pkt, double sinr, UanTxMode mode)
+UanMacRcGw::ReceivePacket (Ptr<Packet> pkt, [[maybe_unused]] double sinr, UanTxMode mode)
 {
-  NS_UNUSED (sinr);
   UanHeaderCommon ch;
   pkt->PeekHeader (ch);
 
@@ -536,9 +534,9 @@
 
 
 double
-UanMacRcGw::ComputeAlpha (uint32_t totalFrames, uint32_t totalBytes, uint32_t n, uint32_t a, double deltaK)
+UanMacRcGw::ComputeAlpha (uint32_t totalFrames, uint32_t totalBytes, 
+                          [[maybe_unused]] uint32_t n, uint32_t a, double deltaK)
 {
-  NS_UNUSED (n);
   double alpha;
   double lrae = m_rtsSize * 8.0 * a * std::exp (1.0);
   if (totalFrames == 0)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/uan/model/uan-net-device.cc ns-3.36/src/uan/model/uan-net-device.cc
--- ns-3.35/src/uan/model/uan-net-device.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/uan/model/uan-net-device.cc	2022-04-30 18:23:58.178735000 -0700
@@ -275,9 +275,8 @@
 }
 
 Address
-UanNetDevice::GetMulticast (Ipv4Address multicastGroup) const
+UanNetDevice::GetMulticast ([[maybe_unused]] Ipv4Address multicastGroup) const
 {
-  NS_UNUSED (multicastGroup);
   return m_mac->GetBroadcast ();
 }
 
@@ -309,11 +308,11 @@
 }
 
 bool
-UanNetDevice::SendFrom (Ptr<Packet> packet, const Address& source, const Address& dest, uint16_t protocolNumber)
+UanNetDevice::SendFrom (Ptr<Packet> packet, 
+                        [[maybe_unused]] const Address& source, 
+                        [[maybe_unused]] const Address& dest, 
+                        [[maybe_unused]] uint16_t protocolNumber)
 {
-  NS_UNUSED (source);
-  NS_UNUSED (dest);
-  NS_UNUSED (protocolNumber);
   // Not yet implemented
   NS_ASSERT_MSG (0, "Not yet implemented");
   return false;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/uan/model/uan-phy-dual.cc ns-3.36/src/uan/model/uan-phy-dual.cc
--- ns-3.35/src/uan/model/uan-phy-dual.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/uan/model/uan-phy-dual.cc	2022-04-30 18:23:58.178735000 -0700
@@ -273,9 +273,8 @@
 }
 
 void
-UanPhyDual::StartRxPacket (Ptr<Packet> pkt, double rxPowerDb, UanTxMode txMode, UanPdp pdp)
+UanPhyDual::StartRxPacket (Ptr<Packet> pkt, [[maybe_unused]] double rxPowerDb, UanTxMode txMode, UanPdp pdp)
 {
-  NS_UNUSED (rxPowerDb);
   // Not called.  StartRxPacket in m_phy1 and m_phy2 are called directly from Transducer.
 }
 
@@ -484,9 +483,8 @@
   m_phy2->SetMac (mac);
 }
 void
-UanPhyDual::NotifyTransStartTx (Ptr<Packet> packet, double txPowerDb, UanTxMode txMode)
+UanPhyDual::NotifyTransStartTx (Ptr<Packet> packet, [[maybe_unused]] double txPowerDb, UanTxMode txMode)
 {
-  NS_UNUSED (txPowerDb);
 }
 void
 UanPhyDual::NotifyIntChange (void)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/uan/model/uan-phy-dual.h ns-3.36/src/uan/model/uan-phy-dual.h
--- ns-3.35/src/uan/model/uan-phy-dual.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/uan/model/uan-phy-dual.h	2022-04-30 18:23:58.178735000 -0700
@@ -135,9 +135,8 @@
   virtual uint32_t GetNModes (void);
   virtual UanTxMode GetMode (uint32_t n);
   virtual void Clear (void);
-  virtual void SetSleepMode (bool sleep)
+  virtual void SetSleepMode ([[maybe_unused]] bool sleep)
   {
-    NS_UNUSED (sleep);
     /// \todo This method has to be implemented
   }
   int64_t AssignStreams (int64_t stream);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/uan/model/uan-phy-gen.cc ns-3.36/src/uan/model/uan-phy-gen.cc
--- ns-3.35/src/uan/model/uan-phy-gen.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/uan/model/uan-phy-gen.cc	2022-04-30 18:23:58.178735000 -0700
@@ -831,9 +831,8 @@
 }
 
 void
-UanPhyGen::RxEndEvent (Ptr<Packet> pkt, double rxPowerDb, UanTxMode txMode)
+UanPhyGen::RxEndEvent (Ptr<Packet> pkt, [[maybe_unused]] double rxPowerDb, UanTxMode txMode)
 {
-  NS_UNUSED (rxPowerDb);
   if (pkt != m_pktRx)
     {
       return;
@@ -1041,9 +1040,8 @@
 }
 
 void
-UanPhyGen::NotifyTransStartTx (Ptr<Packet> packet, double txPowerDb, UanTxMode txMode)
+UanPhyGen::NotifyTransStartTx (Ptr<Packet> packet, [[maybe_unused]] double txPowerDb, UanTxMode txMode)
 {
-  NS_UNUSED (txPowerDb);
   if (m_pktRx)
     {
       m_minRxSinrDb = -1e30;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/uan/test/uan-energy-model-test.cc ns-3.36/src/uan/test/uan-energy-model-test.cc
--- ns-3.35/src/uan/test/uan-energy-model-test.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/uan/test/uan-energy-model-test.cc	2022-04-30 18:23:58.178735000 -0700
@@ -116,10 +116,10 @@
 }
 
 bool
-AcousticModemEnergyTestCase::RxPacket (Ptr<NetDevice> dev, Ptr<const Packet> pkt, uint16_t mode, const Address &sender)
+AcousticModemEnergyTestCase::RxPacket (Ptr<NetDevice> dev, Ptr<const Packet> pkt, 
+                                       [[maybe_unused]] uint16_t mode, 
+                                       [[maybe_unused]] const Address &sender)
 {
-  NS_UNUSED (mode);
-  NS_UNUSED (sender);
   // increase the total bytes received
   m_bytesRx += pkt->GetSize ();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/uan/test/uan-test.cc ns-3.36/src/uan/test/uan-test.cc
--- ns-3.35/src/uan/test/uan-test.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/uan/test/uan-test.cc	2022-04-30 18:23:58.178735000 -0700
@@ -98,10 +98,10 @@
 }
 
 bool
-UanTest::RxPacket (Ptr<NetDevice> dev, Ptr<const Packet> pkt, uint16_t mode, const Address &sender)
+UanTest::RxPacket (Ptr<NetDevice> dev, Ptr<const Packet> pkt, 
+                   [[maybe_unused]] uint16_t mode, 
+                   [[maybe_unused]] const Address &sender)
 {
-  NS_UNUSED (mode);
-  NS_UNUSED (sender);
   m_bytesRx += pkt->GetSize ();
   return true;
 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/uan/wscript ns-3.36/src/uan/wscript
--- ns-3.35/src/uan/wscript	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/uan/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,74 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    module = bld.create_ns3_module('uan', ['network', 'energy', 'mobility'])
-    module.source = [
-        'model/uan-channel.cc',
-        'model/uan-phy-gen.cc',
-        'model/uan-mac.cc',
-        'model/uan-transducer.cc',
-        'model/uan-transducer-hd.cc',
-        'model/uan-net-device.cc',
-        'model/uan-tx-mode.cc',
-        'model/uan-prop-model.cc',
-        'model/uan-prop-model-ideal.cc',
-        'model/uan-mac-aloha.cc',
-        'model/uan-header-common.cc',
-        'model/uan-noise-model-default.cc',
-        'model/uan-mac-cw.cc',
-        'model/uan-prop-model-thorp.cc',
-        'model/uan-phy-dual.cc',
-        'model/uan-header-rc.cc',
-        'model/uan-mac-rc.cc',
-        'model/uan-mac-rc-gw.cc',
-        'model/uan-phy.cc',
-        'model/uan-noise-model.cc',
-        'model/acoustic-modem-energy-model.cc',
-        'helper/uan-helper.cc',
-        'helper/acoustic-modem-energy-model-helper.cc',
-        ]
-
-    module_test = bld.create_ns3_module_test_library('uan')
-    module_test.source = [
-        'test/uan-test.cc',
-        'test/uan-energy-model-test.cc',
-        ]
-    
-    # Tests encapsulating example programs should be listed here
-    if (bld.env['ENABLE_EXAMPLES']):
-        module_test.source.extend([
-        #   'test/uan-examples-test-suite.cc',
-            ])
-    
-    headers = bld(features='ns3header')
-    headers.module = 'uan'
-    headers.source = [
-        'model/uan-channel.h',
-        'model/uan-phy.h',
-        'model/uan-mac.h',
-        'model/uan-net-device.h',
-        'model/uan-prop-model.h',
-        'model/uan-tx-mode.h',
-        'model/uan-transducer.h',
-        'model/uan-phy-gen.h',
-        'model/uan-transducer-hd.h',
-        'model/uan-prop-model-ideal.h',
-        'model/uan-mac-aloha.h',
-        'model/uan-header-common.h',
-        'model/uan-noise-model.h',
-        'model/uan-noise-model-default.h',
-        'model/uan-mac-cw.h',
-        'model/uan-prop-model-thorp.h',
-        'model/uan-phy-dual.h',
-        'model/uan-header-rc.h',
-        'model/uan-mac-rc.h',
-        'model/acoustic-modem-energy-model.h',
-        'helper/uan-helper.h',
-        'helper/acoustic-modem-energy-model-helper.h',
-        'model/uan-mac-rc-gw.h',
-        ]
-
-    if (bld.env['ENABLE_EXAMPLES']):
-      bld.recurse('examples')
-
-    bld.ns3_python_bindings()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/virtual-net-device/bindings/modulegen__gcc_ILP32.py ns-3.36/src/virtual-net-device/bindings/modulegen__gcc_ILP32.py
--- ns-3.35/src/virtual-net-device/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/virtual-net-device/bindings/modulegen__gcc_ILP32.py	2022-04-30 18:23:58.178735000 -0700
@@ -150,21 +150,21 @@
     module.add_class('Object', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter >'])
     ## object.h (module 'core'): ns3::Object::AggregateIterator [class]
     module.add_class('AggregateIterator', import_from_module='ns.core', outer_class=root_module['ns3::Object'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
     module.add_class('TraceSourceAccessor', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >'])
@@ -278,7 +278,7 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'const ns3::Address &', 'const ns3::Address &', 'ns3::NetDevice::PacketType', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )', 'ns3::TimePrinter')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )*', 'ns3::TimePrinter*')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )&', 'ns3::TimePrinter&')
@@ -2104,8 +2104,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -2460,58 +2460,58 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
@@ -3219,10 +3219,16 @@
     cls.add_method('ExtractNeighborIndex', 
                    'uint32_t', 
                    [param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetEpoch() const [member function]
+    cls.add_method('GetEpoch', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() const [member function]
     cls.add_method('GetRemainingBits', 
                    'uint32_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -3233,6 +3239,10 @@
                    'uint32_t', 
                    [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
+    ## nix-vector.h (module 'network'): void ns3::NixVector::SetEpoch(uint32_t epoch) [member function]
+    cls.add_method('SetEpoch', 
+                   'void', 
+                   [param('uint32_t', 'epoch')])
     return
 
 def register_Ns3Node_methods(root_module, cls):
@@ -3511,10 +3521,11 @@
                    'uint32_t', 
                    [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) const [member function]
     cls.add_method('SetNixVector', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')], 
+                   is_const=True)
     ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
     cls.add_method('ToString', 
                    'std::string', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/virtual-net-device/bindings/modulegen__gcc_LP64.py ns-3.36/src/virtual-net-device/bindings/modulegen__gcc_LP64.py
--- ns-3.35/src/virtual-net-device/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/virtual-net-device/bindings/modulegen__gcc_LP64.py	2022-04-30 18:23:58.178735000 -0700
@@ -150,21 +150,21 @@
     module.add_class('Object', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter >'])
     ## object.h (module 'core'): ns3::Object::AggregateIterator [class]
     module.add_class('AggregateIterator', import_from_module='ns.core', outer_class=root_module['ns3::Object'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
     module.add_class('TraceSourceAccessor', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >'])
@@ -278,7 +278,7 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'const ns3::Address &', 'const ns3::Address &', 'ns3::NetDevice::PacketType', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )', 'ns3::TimePrinter')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )*', 'ns3::TimePrinter*')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )&', 'ns3::TimePrinter&')
@@ -2104,8 +2104,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -2460,58 +2460,58 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
@@ -3219,10 +3219,16 @@
     cls.add_method('ExtractNeighborIndex', 
                    'uint32_t', 
                    [param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetEpoch() const [member function]
+    cls.add_method('GetEpoch', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() const [member function]
     cls.add_method('GetRemainingBits', 
                    'uint32_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -3233,6 +3239,10 @@
                    'uint32_t', 
                    [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
+    ## nix-vector.h (module 'network'): void ns3::NixVector::SetEpoch(uint32_t epoch) [member function]
+    cls.add_method('SetEpoch', 
+                   'void', 
+                   [param('uint32_t', 'epoch')])
     return
 
 def register_Ns3Node_methods(root_module, cls):
@@ -3511,10 +3521,11 @@
                    'uint32_t', 
                    [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) const [member function]
     cls.add_method('SetNixVector', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')], 
+                   is_const=True)
     ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
     cls.add_method('ToString', 
                    'std::string', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/virtual-net-device/CMakeLists.txt ns-3.36/src/virtual-net-device/CMakeLists.txt
--- ns-3.35/src/virtual-net-device/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/virtual-net-device/CMakeLists.txt	2022-04-30 18:23:58.178735000 -0700
@@ -0,0 +1,6 @@
+build_lib(
+  LIBNAME virtual-net-device
+  SOURCE_FILES model/virtual-net-device.cc
+  HEADER_FILES model/virtual-net-device.h
+  LIBRARIES_TO_LINK ${libnetwork}
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/virtual-net-device/examples/CMakeLists.txt ns-3.36/src/virtual-net-device/examples/CMakeLists.txt
--- ns-3.35/src/virtual-net-device/examples/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/virtual-net-device/examples/CMakeLists.txt	2022-04-30 18:23:58.178735000 -0700
@@ -0,0 +1,9 @@
+build_lib_example(
+  NAME virtual-net-device
+  SOURCE_FILES virtual-net-device.cc
+  LIBRARIES_TO_LINK
+    ${libvirtual-net-device}
+    ${libpoint-to-point}
+    ${libinternet}
+    ${libapplications}
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/virtual-net-device/examples/virtual-net-device.cc ns-3.36/src/virtual-net-device/examples/virtual-net-device.cc
--- ns-3.35/src/virtual-net-device/examples/virtual-net-device.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/virtual-net-device/examples/virtual-net-device.cc	2022-04-30 18:23:58.178735000 -0700
@@ -58,20 +58,32 @@
 
 NS_LOG_COMPONENT_DEFINE ("VirtualNetDeviceExample");
 
+/**
+ * \ingroup virtual-net-device
+ * 
+ * Tunnel class - its goal is to create and manage the tunnels between endpoints.
+ */
 class Tunnel
 {
-  Ptr<Socket> m_n3Socket;
-  Ptr<Socket> m_n0Socket;
-  Ptr<Socket> m_n1Socket;
-  Ipv4Address m_n3Address;
-  Ipv4Address m_n0Address;
-  Ipv4Address m_n1Address;
-  Ptr<UniformRandomVariable> m_rng;
-  Ptr<VirtualNetDevice> m_n0Tap;
-  Ptr<VirtualNetDevice> m_n1Tap;
-  Ptr<VirtualNetDevice> m_n3Tap;
-
-
+  Ptr<Socket> m_n3Socket; //!< Socket on the N3 node
+  Ptr<Socket> m_n0Socket; //!< Socket on the N0 node
+  Ptr<Socket> m_n1Socket; //!< Socket on the N1 node
+  Ipv4Address m_n3Address;  //!< Address of the N3 node
+  Ipv4Address m_n0Address;  //!< Address of the N0 node
+  Ipv4Address m_n1Address;  //!< Address of the N1 node
+  Ptr<UniformRandomVariable> m_rng; //!< Random number generator
+  Ptr<VirtualNetDevice> m_n0Tap;  //!< VirtualNetDevice on the N0 node
+  Ptr<VirtualNetDevice> m_n1Tap;  //!< VirtualNetDevice on the N1 node
+  Ptr<VirtualNetDevice> m_n3Tap;  //!< VirtualNetDevice on the N3 node
+
+  /**
+   * Send a packet through the N0 VirtualNetDevice
+   * \param packet Packet to send
+   * \param source Source IPv4 address
+   * \param dest Destination IPv4 address
+   * \param protocolNumber Protocol number
+   * \return true (always)
+   */
   bool
   N0VirtualSend (Ptr<Packet> packet, const Address& source, const Address& dest, uint16_t protocolNumber)
   {
@@ -80,6 +92,14 @@
     return true;
   }
 
+  /**
+   * Send a packet through the N1 VirtualNetDevice
+   * \param packet Packet to send
+   * \param source Source IPv4 address
+   * \param dest Destination IPv4 address
+   * \param protocolNumber Protocol number
+   * \return true (always)
+   */
   bool
   N1VirtualSend (Ptr<Packet> packet, const Address& source, const Address& dest, uint16_t protocolNumber)
   {
@@ -88,6 +108,14 @@
     return true;
   }
 
+  /**
+   * Send a packet through the N3 VirtualNetDevice
+   * \param packet Packet to send
+   * \param source Source IPv4 address
+   * \param dest Destination IPv4 address
+   * \param protocolNumber Protocol number
+   * \return true (always)
+   */
   bool
   N3VirtualSend (Ptr<Packet> packet, const Address& source, const Address& dest, uint16_t protocolNumber)
   {
@@ -104,6 +132,10 @@
     return true;
   }
 
+  /**
+   * Receive a packet on the N3 VirtualNetDevice
+   * \param socket Receiving socket
+   */
   void N3SocketRecv (Ptr<Socket> socket)
   {
     Ptr<Packet> packet = socket->Recv (65535, 0);
@@ -111,6 +143,10 @@
     m_n3Tap->Receive (packet, 0x0800, m_n3Tap->GetAddress (), m_n3Tap->GetAddress (), NetDevice::PACKET_HOST);
   }
 
+  /**
+   * Receive a packet on the N0 VirtualNetDevice
+   * \param socket Receiving socket
+   */
   void N0SocketRecv (Ptr<Socket> socket)
   {
     Ptr<Packet> packet = socket->Recv (65535, 0);
@@ -118,6 +154,10 @@
     m_n0Tap->Receive (packet, 0x0800, m_n0Tap->GetAddress (), m_n0Tap->GetAddress (), NetDevice::PACKET_HOST);
   }
 
+  /**
+   * Receive a packet on the N1 VirtualNetDevice
+   * \param socket Receiving socket
+   */
   void N1SocketRecv (Ptr<Socket> socket)
   {
     Ptr<Packet> packet = socket->Recv (65535, 0);
@@ -127,6 +167,15 @@
 
 public:
 
+  /**
+   * Constructor
+   * \param n3 Pointer of Node 3
+   * \param n0 Pointer of Node 0
+   * \param n1 Pointer of Node 1
+   * \param n3Addr IPv4 address of Node 3
+   * \param n0Addr IPv4 address of Node 0
+   * \param n1Addr IPv4 address of Node 1
+   */
   Tunnel (Ptr<Node> n3, Ptr<Node> n0, Ptr<Node> n1,
           Ipv4Address n3Addr, Ipv4Address n0Addr, Ipv4Address n1Addr)
     : m_n3Address (n3Addr), m_n0Address (n0Addr), m_n1Address (n1Addr)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/virtual-net-device/examples/wscript ns-3.36/src/virtual-net-device/examples/wscript
--- ns-3.35/src/virtual-net-device/examples/wscript	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/virtual-net-device/examples/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,7 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-
-    obj = bld.create_ns3_program('virtual-net-device', ['virtual-net-device', 'point-to-point', 'internet', 'applications'])
-    obj.source = 'virtual-net-device.cc'
-    
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/virtual-net-device/model/virtual-net-device.h ns-3.36/src/virtual-net-device/model/virtual-net-device.h
--- ns-3.35/src/virtual-net-device/model/virtual-net-device.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/virtual-net-device/model/virtual-net-device.h	2022-04-30 18:23:58.178735000 -0700
@@ -64,6 +64,10 @@
    */
   typedef Callback<bool, Ptr<Packet>, const Address&, const Address&, uint16_t> SendCallback;
 
+  /**
+   * \brief Get the type ID.
+   * \return The object TypeId.
+   */
   static TypeId GetTypeId (void);
   VirtualNetDevice ();
 
@@ -94,6 +98,7 @@
 
   /**
    * \brief Configure whether the virtual device supports SendFrom
+   * \param supportsSendFrom true if the device supports SendFrom
    */
   void SetSupportsSendFrom (bool supportsSendFrom);
 
@@ -152,22 +157,22 @@
 
 private:
 
-  Address m_myAddress;
-  SendCallback m_sendCb;
-  TracedCallback<Ptr<const Packet> > m_macRxTrace;
-  TracedCallback<Ptr<const Packet> > m_macTxTrace;
-  TracedCallback<Ptr<const Packet> > m_macPromiscRxTrace;
-  TracedCallback<Ptr<const Packet> > m_snifferTrace;
-  TracedCallback<Ptr<const Packet> > m_promiscSnifferTrace;
-  Ptr<Node> m_node;
-  ReceiveCallback m_rxCallback;
-  PromiscReceiveCallback m_promiscRxCallback;
-  std::string m_name;
-  uint32_t m_index;
-  uint16_t m_mtu;
-  bool m_needsArp;
-  bool m_supportsSendFrom;
-  bool m_isPointToPoint;
+  Address m_myAddress;    //!< MAC address
+  SendCallback m_sendCb;  //!< send callback
+  TracedCallback<Ptr<const Packet> > m_macRxTrace;            //!< Rx trace
+  TracedCallback<Ptr<const Packet> > m_macTxTrace;            //!< Tx trace
+  TracedCallback<Ptr<const Packet> > m_macPromiscRxTrace;     //!< Promisc Rx trace
+  TracedCallback<Ptr<const Packet> > m_snifferTrace;          //!< Sniffer trace
+  TracedCallback<Ptr<const Packet> > m_promiscSnifferTrace;   //!< Promisc Sniffer trace
+  Ptr<Node> m_node;                               //!< Pointer to the node
+  ReceiveCallback m_rxCallback;                   //!< Rx callback
+  PromiscReceiveCallback m_promiscRxCallback;     //!< Promisc Rx callback
+  std::string m_name;       //!< Name of the device
+  uint32_t m_index;         //!< Device index
+  uint16_t m_mtu;           //!< MTU
+  bool m_needsArp;          //!< True if the device needs ARP
+  bool m_supportsSendFrom;  //!< True if the device supports SendFrm
+  bool m_isPointToPoint;    //!< True if the device is a PointToPoint type device
 };
 
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/virtual-net-device/wscript ns-3.36/src/virtual-net-device/wscript
--- ns-3.35/src/virtual-net-device/wscript	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/virtual-net-device/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,18 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-
-def build(bld):
-    module = bld.create_ns3_module('virtual-net-device', ['network'])
-    module.source = [
-        'model/virtual-net-device.cc',
-        ]
-    headers = bld(features='ns3header')
-    headers.module = 'virtual-net-device'
-    headers.source = [
-        'model/virtual-net-device.h',
-        ]
-
-    if bld.env['ENABLE_EXAMPLES']:
-        bld.recurse('examples')
-
-    bld.ns3_python_bindings()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/visualizer/bindings/modulegen__gcc_ILP32.py ns-3.36/src/visualizer/bindings/modulegen__gcc_ILP32.py
--- ns-3.35/src/visualizer/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/visualizer/bindings/modulegen__gcc_ILP32.py	2022-04-30 18:23:58.186735200 -0700
@@ -69,6 +69,8 @@
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::TraceSourceAccessor'])
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'], import_from_module='ns.core')
     ## hash.h (module 'core'): ns3::Hasher [class]
     module.add_class('Hasher', import_from_module='ns.core')
     ## inet6-socket-address.h (module 'network'): ns3::Inet6SocketAddress [class]
@@ -424,18 +426,18 @@
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::Socket>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::Socket>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::set< ns3::TypeId >', 'ns3::TypeId', container_type='set')
+    module.add_container('std::vector< ns3::PyViz::RxPacketSample >', 'ns3::PyViz::RxPacketSample', container_type='vector')
+    module.add_container('std::vector< ns3::PyViz::TxPacketSample >', 'ns3::PyViz::TxPacketSample', container_type='vector')
+    module.add_container('std::vector< ns3::PyViz::PacketSample >', 'ns3::PyViz::PacketSample', container_type='vector')
     module.add_container('std::vector< std::string >', 'std::string', container_type='vector')
     module.add_container('std::vector< ns3::PyViz::TransmissionSample >', 'ns3::PyViz::TransmissionSample', container_type='vector')
     module.add_container('ns3::PyViz::TransmissionSampleList', 'ns3::PyViz::TransmissionSample', container_type='vector')
     module.add_container('std::vector< ns3::PyViz::PacketDropSample >', 'ns3::PyViz::PacketDropSample', container_type='vector')
     module.add_container('ns3::PyViz::PacketDropSampleList', 'ns3::PyViz::PacketDropSample', container_type='vector')
-    module.add_container('std::vector< ns3::PyViz::RxPacketSample >', 'ns3::PyViz::RxPacketSample', container_type='vector')
-    module.add_container('std::vector< ns3::PyViz::TxPacketSample >', 'ns3::PyViz::TxPacketSample', container_type='vector')
-    module.add_container('std::vector< ns3::PyViz::PacketSample >', 'ns3::PyViz::PacketSample', container_type='vector')
     module.add_container('std::set< unsigned int >', 'unsigned int', container_type='set')
     module.add_container('std::vector< ns3::PyViz::NetDeviceStatistics >', 'ns3::PyViz::NetDeviceStatistics', container_type='vector')
     module.add_container('std::vector< ns3::PyViz::NodeStatistics >', 'ns3::PyViz::NodeStatistics', container_type='vector')
-    module.add_container('std::set< ns3::TypeId >', 'ns3::TypeId', container_type='set')
     module.add_container('std::vector< ns3::Ipv6Address >', 'ns3::Ipv6Address', container_type='vector')
     module.add_container('std::map< unsigned int, unsigned int >', ('unsigned int', 'unsigned int'), container_type='map')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )', 'ns3::TimePrinter')
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/visualizer/bindings/modulegen__gcc_LP64.py ns-3.36/src/visualizer/bindings/modulegen__gcc_LP64.py
--- ns-3.35/src/visualizer/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/visualizer/bindings/modulegen__gcc_LP64.py	2022-04-30 18:23:58.186735200 -0700
@@ -69,6 +69,8 @@
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::TraceSourceAccessor'])
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'], import_from_module='ns.core')
     ## hash.h (module 'core'): ns3::Hasher [class]
     module.add_class('Hasher', import_from_module='ns.core')
     ## inet6-socket-address.h (module 'network'): ns3::Inet6SocketAddress [class]
@@ -424,18 +426,18 @@
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::Socket>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::Socket>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::set< ns3::TypeId >', 'ns3::TypeId', container_type='set')
+    module.add_container('std::vector< ns3::PyViz::RxPacketSample >', 'ns3::PyViz::RxPacketSample', container_type='vector')
+    module.add_container('std::vector< ns3::PyViz::TxPacketSample >', 'ns3::PyViz::TxPacketSample', container_type='vector')
+    module.add_container('std::vector< ns3::PyViz::PacketSample >', 'ns3::PyViz::PacketSample', container_type='vector')
     module.add_container('std::vector< std::string >', 'std::string', container_type='vector')
     module.add_container('std::vector< ns3::PyViz::TransmissionSample >', 'ns3::PyViz::TransmissionSample', container_type='vector')
     module.add_container('ns3::PyViz::TransmissionSampleList', 'ns3::PyViz::TransmissionSample', container_type='vector')
     module.add_container('std::vector< ns3::PyViz::PacketDropSample >', 'ns3::PyViz::PacketDropSample', container_type='vector')
     module.add_container('ns3::PyViz::PacketDropSampleList', 'ns3::PyViz::PacketDropSample', container_type='vector')
-    module.add_container('std::vector< ns3::PyViz::RxPacketSample >', 'ns3::PyViz::RxPacketSample', container_type='vector')
-    module.add_container('std::vector< ns3::PyViz::TxPacketSample >', 'ns3::PyViz::TxPacketSample', container_type='vector')
-    module.add_container('std::vector< ns3::PyViz::PacketSample >', 'ns3::PyViz::PacketSample', container_type='vector')
     module.add_container('std::set< unsigned int >', 'unsigned int', container_type='set')
     module.add_container('std::vector< ns3::PyViz::NetDeviceStatistics >', 'ns3::PyViz::NetDeviceStatistics', container_type='vector')
     module.add_container('std::vector< ns3::PyViz::NodeStatistics >', 'ns3::PyViz::NodeStatistics', container_type='vector')
-    module.add_container('std::set< ns3::TypeId >', 'ns3::TypeId', container_type='set')
     module.add_container('std::vector< ns3::Ipv6Address >', 'ns3::Ipv6Address', container_type='vector')
     module.add_container('std::map< unsigned int, unsigned int >', ('unsigned int', 'unsigned int'), container_type='map')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )', 'ns3::TimePrinter')
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/visualizer/CMakeLists.txt ns-3.36/src/visualizer/CMakeLists.txt
--- ns-3.35/src/visualizer/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/visualizer/CMakeLists.txt	2022-04-30 18:23:58.178735000 -0700
@@ -0,0 +1,43 @@
+include_directories(${Python3_INCLUDE_DIRS})
+
+build_lib(
+  LIBNAME visualizer
+  SOURCE_FILES model/pyviz.cc
+               model/visual-simulator-impl.cc
+  HEADER_FILES model/pyviz.h
+  LIBRARIES_TO_LINK
+    ${Python3_LIBRARIES}
+    ${libcore}
+    ${libinternet}
+    ${libwifi}
+    ${libpoint-to-point}
+    ${libcsma}
+    ${libbridge}
+    ${libwimax}
+    ${liblte}
+    ${libmesh}
+)
+
+# move visualizer folder to build/bindings/python, which allows us to add only
+# PYTHONPATH=ns-3-dev/build/bindings/python
+file(
+  GLOB_RECURSE
+  visualizer_files
+  ${CMAKE_CURRENT_SOURCE_DIR}/visualizer/*
+)
+foreach(
+  file
+  ${visualizer_files}
+)
+  string(
+    REPLACE "${CMAKE_CURRENT_SOURCE_DIR}"
+            "${CMAKE_OUTPUT_DIRECTORY}/bindings/python"
+            destination
+            ${file}
+  )
+  configure_file(
+    ${file}
+    ${destination}
+    COPYONLY
+  )
+endforeach()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/visualizer/examples/CMakeLists.txt ns-3.36/src/visualizer/examples/CMakeLists.txt
--- ns-3.35/src/visualizer/examples/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/visualizer/examples/CMakeLists.txt	2022-04-30 18:23:58.186735200 -0700
@@ -0,0 +1 @@
+
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/visualizer/examples/readme.txt ns-3.36/src/visualizer/examples/readme.txt
--- ns-3.35/src/visualizer/examples/readme.txt	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/visualizer/examples/readme.txt	2022-04-30 18:23:58.186735200 -0700
@@ -3,7 +3,7 @@
 script uses ns-3's command line parser (class CommandLine), and add 'visualizer'
 as a module dependency to that program.
 
-Alternatively, run the example with waf --run adding the --visualize option.
+Alternatively, run the example with ns3 run adding the --visualize option.
 For example:
 
-./waf --run wifi-simple-adhoc-grid --visualize
+./ns3 run wifi-simple-adhoc-grid --visualize
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/visualizer/model/dummy-file-for-static-builds.cc ns-3.36/src/visualizer/model/dummy-file-for-static-builds.cc
--- ns-3.35/src/visualizer/model/dummy-file-for-static-builds.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/visualizer/model/dummy-file-for-static-builds.cc	1969-12-31 16:00:00.000000000 -0800
@@ -1,21 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright 2011 University of Washington
- * 
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Mitch Watrous (watrous@u.washington.edu)
- */
-
-// This file does nothing.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/visualizer/model/pyviz.h ns-3.36/src/visualizer/model/pyviz.h
--- ns-3.35/src/visualizer/model/pyviz.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/visualizer/model/pyviz.h	2022-04-30 18:23:58.186735200 -0700
@@ -210,10 +210,20 @@
 
 
   // Yes, I know, this is just a utility function, not really related to the class in any way.
-
+  /**
+   * Utility function - clips a line to a bounding box.
+   * \param [in] boundsX1 Bounding box, minimum X coord
+   * \param [in] boundsY1 Bounding box, minimum Y coord
+   * \param [in] boundsX2 Bounding box, maximum X coord
+   * \param [in] boundsY2 Bounding box, maximum Y coord
+   * \param [in,out] lineX1 Line, minimum X coord (any on input, clipped to the bounding box on output)
+   * \param [in,out] lineY1 Line, minimum Y coord (any on input, clipped to the bounding box on output)
+   * \param [in,out] lineX2 Line, maximum X coord (any on input, clipped to the bounding box on output)
+   * \param [in,out] lineY2 Line, maximum Y coord (any on input, clipped to the bounding box on output)
+   */
   // -#- @lineX1(direction=inout); @lineY1(direction=inout); @lineX2(direction=inout); @lineY2(direction=inout) -#-
-  static void LineClipping (double boundsX1, double boundsY1, double boundsX2, double boundsY2, double &lineX1, double &lineY1, double &lineX2, double &lineY2); ///< don't break this line or pybindgen will not be able to pick up the above annotation :(
-
+  static void LineClipping (double boundsX1, double boundsY1, double boundsX2, double boundsY2, double &lineX1, double &lineY1, double &lineX2, double &lineY2);
+  // Don't break the above line or pybindgen will not be able to pick up the above annotation :(
 
 private:
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/visualizer/model/visual-simulator-impl.cc ns-3.36/src/visualizer/model/visual-simulator-impl.cc
--- ns-3.35/src/visualizer/model/visual-simulator-impl.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/visualizer/model/visual-simulator-impl.cc	2022-04-30 18:23:58.186735200 -0700
@@ -18,6 +18,8 @@
  * Author: Gustavo Carneiro <gjcarneiro@gmail.com> <gjc@inescporto.pt>
  */
 #include <Python.h>
+#undef HAVE_PTHREAD_H
+#undef HAVE_SYS_STAT_H
 #include "visual-simulator-impl.h"
 #include "ns3/default-simulator-impl.h"
 #include "ns3/log.h"
@@ -31,7 +33,10 @@
 
 namespace
 {
-/// Get an object factory configured to the default simulator implementation
+/**
+ * Get an object factory configured to the default simulator implementation
+ * \return an object factory.
+ */
 ObjectFactory
 GetDefaultSimulatorImplFactory ()
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/visualizer/model/visual-simulator-impl.h ns-3.36/src/visualizer/model/visual-simulator-impl.h
--- ns-3.35/src/visualizer/model/visual-simulator-impl.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/visualizer/model/visual-simulator-impl.h	2022-04-30 18:23:58.186735200 -0700
@@ -81,7 +81,11 @@
   void NotifyConstructionCompleted (void);
 
 private:
-  Ptr<SimulatorImpl> GetSim (); ///< get the simulator implementation
+  /**
+   * Get the simulator implementation
+   * \return a pointer to the simulator implementation
+   */
+  Ptr<SimulatorImpl> GetSim ();
   Ptr<SimulatorImpl> m_simulator; ///< the simulator implementation
   ObjectFactory m_simulatorImplFactory; ///< simulator implementation factory
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/visualizer/visualizer/base.py ns-3.36/src/visualizer/visualizer/base.py
--- ns-3.35/src/visualizer/visualizer/base.py	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/visualizer/visualizer/base.py	2022-04-30 18:23:58.186735200 -0700
@@ -16,9 +16,9 @@
 
 ## PyVizObject class
 class PyVizObject(GObject.GObject):
-    ## @var __gtype_name__
-    #  global type name
+    ##  global type name
     __gtype_name__ = "PyVizObject"
+
     ## Returns tooltip text string.
     #
     ## @param tooltip: tooltip object.
@@ -47,11 +47,12 @@
     ## @var is_virtual
     #  is virtual
     def __init__(self, is_wireless=None, is_virtual=False):
-        ''' Initialize function.
-
+        """!
+        Initialize function.
+        @param self The current class
         @param is_wireless is wireless flag
         @param is_virtual is virtual flag
-        '''
+        """
         assert is_virtual or is_wireless is not None
         self.is_wireless = is_wireless
         self.is_virtual = is_virtual
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/visualizer/visualizer/core.py ns-3.36/src/visualizer/visualizer/core.py
--- ns-3.35/src/visualizer/visualizer/core.py	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/visualizer/visualizer/core.py	2022-04-30 18:23:58.186735200 -0700
@@ -110,18 +110,19 @@
     #  selected property
     ## @var highlighted
     #  highlighted property
-    ## @var __gsignals__
-    # signal emitted whenever a tooltip is about to be shown for the node
-    # the first signal parameter is a python list of strings, to which information can be appended
+
+    ## signal emitted whenever a tooltip is about to be shown for the node
+    ## the first signal parameter is a python list of strings, to which 
+    ## information can be appended
     __gsignals__ = {
         'query-extra-tooltip-info': (GObject.SignalFlags.RUN_LAST, None, (object,)),
         }
 
     def __init__(self, visualizer, node_index):
-        """ Initialize function.
+        """! Initialize function.
         @param self The object pointer.
-        @param visualizer: visualizer object
-        @param node_index: node index
+        @param visualizer visualizer object
+        @param node_index node index
         """
         super(Node, self).__init__()
 
@@ -524,7 +525,6 @@
 
         @param self: class object.
         @param channel: channel.
-        @return none
         """
         self.channel = channel
         self.canvas_item = GooCanvas.CanvasEllipse(radius_x=30, radius_y=30,
@@ -576,7 +576,6 @@
         @param self: class object.
         @param node1: class object.
         @param node2: class object.
-        @return none
         """
         assert isinstance(node1, Node)
         assert isinstance(node2, (Node, Channel))
@@ -621,7 +620,6 @@
 
         @param self: class object.
         @param viz: class object.
-        @return none
         """
         super(SimulationThread, self).__init__()
         assert isinstance(viz, Visualizer)
@@ -689,8 +687,8 @@
     #  none
     ## @var SELECTED
     #  selected
-    ## @var __slots__
-    #  enumeration
+
+    ## enumeration
     __slots__ = []
 ShowTransmissionsMode.ALL = ShowTransmissionsMode()
 ShowTransmissionsMode.NONE = ShowTransmissionsMode()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/visualizer/visualizer/hud.py ns-3.36/src/visualizer/visualizer/hud.py
--- ns-3.35/src/visualizer/visualizer/hud.py	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/visualizer/visualizer/hud.py	2022-04-30 18:23:58.186735200 -0700
@@ -25,7 +25,6 @@
 
         @param self: this object
         @param viz: visualization object
-        @return none
         """
         self.viz = viz
         self.color = 0x8080C0FF
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/visualizer/visualizer/ipython_view.py ns-3.36/src/visualizer/visualizer/ipython_view.py
--- ns-3.35/src/visualizer/visualizer/ipython_view.py	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/visualizer/visualizer/ipython_view.py	2022-04-30 18:23:58.186735200 -0700
@@ -84,7 +84,6 @@
     @param cout: Console standard output.
     @param cerr: Console standard error.
     @param input_func: Replacement for builtin raw_input()
-    @return none
     """
     io = IPython.utils.io
     if input_func:
@@ -149,6 +148,7 @@
   def __update_namespace(self):
     """!
     Update self.IP namespace for autocompletion with sys.modules
+    @return none
     """
     for k, v in list(sys.modules.items()):
         if not '.' in k:
@@ -157,6 +157,7 @@
   def execute(self):
     """!
     Executes the current line provided by the shell object.
+    @return none
     """
     self.history_level = 0
     orig_stdout = sys.stdout
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/visualizer/visualizer/plugins/interface_statistics.py ns-3.36/src/visualizer/visualizer/plugins/interface_statistics.py
--- ns-3.35/src/visualizer/visualizer/plugins/interface_statistics.py	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/visualizer/visualizer/plugins/interface_statistics.py	2022-04-30 18:23:58.186735200 -0700
@@ -18,13 +18,12 @@
 
     ## NetDevStats class
     class NetDevStats(object):
-        ## @var __slots__
-        #  class members
+        ## class members
         __slots__ = ['rxPackets', 'rxBytes', 'txPackets', 'txBytes',
                      'rxPacketRate', 'rxBitRate', 'txPacketRate', 'txBitRate']
 
     def __init__(self, visualizer):
-        """
+        """!
         Collects interface statistics for all nodes.
         @param self this object
         @param visualizer visualizer object
@@ -123,7 +122,7 @@
         ) = range(9)
 
     def __init__(self, visualizer, node_index, statistics_collector):
-        """
+        """!
         Initializer.
         @param self this object
         @param visualizer the visualizer object
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/visualizer/visualizer/plugins/ipv4_routing_table.py ns-3.36/src/visualizer/visualizer/plugins/ipv4_routing_table.py
--- ns-3.35/src/visualizer/visualizer/plugins/ipv4_routing_table.py	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/visualizer/visualizer/plugins/ipv4_routing_table.py	2022-04-30 18:23:58.186735200 -0700
@@ -25,12 +25,11 @@
         ) = range(5)
 
     def __init__(self, visualizer, node_index):
-        """
+        """!
         Initializer
         @param self this object
         @param visualizer visualizer object
         @param node_index the node index
-        @return the statistics
         """
         InformationWindow.__init__(self)
         self.win = Gtk.Dialog(parent=visualizer.window,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/visualizer/visualizer/plugins/olsr.py ns-3.36/src/visualizer/visualizer/plugins/olsr.py
--- ns-3.35/src/visualizer/visualizer/plugins/olsr.py	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/visualizer/visualizer/plugins/olsr.py	2022-04-30 18:23:58.186735200 -0700
@@ -32,7 +32,6 @@
         @param self this object
         @param visualizer visualizer object
         @param node_index the node index
-        @return none
         """
         InformationWindow.__init__(self)
         self.win = Gtk.Dialog(parent=visualizer.window,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/visualizer/visualizer/plugins/show_last_packets.py ns-3.36/src/visualizer/visualizer/plugins/show_last_packets.py
--- ns-3.35/src/visualizer/visualizer/plugins/show_last_packets.py	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/visualizer/visualizer/plugins/show_last_packets.py	2022-04-30 18:23:58.186735200 -0700
@@ -95,7 +95,7 @@
 
 
     def __init__(self, visualizer, node_index):
-        """
+        """!
         Initializer
         @param self this object
         @param visualizer the visualizer object
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/visualizer/visualizer/plugins/wifi_intrastructure_link.py ns-3.36/src/visualizer/visualizer/plugins/wifi_intrastructure_link.py
--- ns-3.35/src/visualizer/visualizer/plugins/wifi_intrastructure_link.py	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/visualizer/visualizer/plugins/wifi_intrastructure_link.py	2022-04-30 18:23:58.186735200 -0700
@@ -114,7 +114,6 @@
         """! Initialize function.
         @param self The object pointer.
         @param dummy_viz A dummy visualizer
-        @return none
         """
         self.access_points = {} # bssid -> node
         self.stations = [] # list of (sta_netdevice, viz_node, wifi_link)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/visualizer/visualizer/svgitem.py ns-3.36/src/visualizer/visualizer/svgitem.py
--- ns-3.35/src/visualizer/visualizer/svgitem.py	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/visualizer/visualizer/svgitem.py	2022-04-30 18:23:58.186735200 -0700
@@ -32,13 +32,13 @@
     #  maximum x
     ## @var bounds_y2
     #  maximum y
-    ## @var __gproperties__
-    # setup our custom properties
+
+    ## setup our custom properties
     __gproperties__ = {
         'x': (float,                                # property type
               'X',                                  # property nick name
               'The x coordinate of a SVG image',    # property description
-              -10e6,                                    # property minimum value
+              -10e6,                                # property minimum value
               10e6,                                 # property maximum value
               0,                                    # property default value
               GObject.PARAM_READWRITE),             # property flags
@@ -69,9 +69,13 @@
         }
 
     def __init__(self, x, y, rsvg_handle, **kwargs):
-        """
+        """!
         Initializer
         @param self this object
+        @param x The x coordinate of a SVG image
+        @param y The y coordinate of a SVG image
+        @param rsvg_handle SVG handle
+        @param kwargs key-value arguments 
         """
         super(SvgItem, self).__init__(**kwargs)
         assert isinstance(rsvg_handle, rsvg.Handle)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/visualizer/wscript ns-3.36/src/visualizer/wscript
--- ns-3.35/src/visualizer/wscript	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/visualizer/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,101 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-from waflib import Options
-
-required_python_modules = [
-    'gi',
-    'gi.repository.GObject',
-    'cairo',
-    'pygraphviz',
-    'gi.repository.Gtk',
-    'gi.repository.Gdk',
-    'gi.repository.Pango',
-    'gi.repository.GooCanvas',
-]
-
-
-def configure(conf):
-    # If Python was explicitly disabled, then add this module to the
-    # list of modules that won't be built if they are enabled.
-    conf.env['ENABLE_PYVIZ'] = True
-    if not conf.check_optional_feature("python"):
-        conf.env['ENABLE_PYVIZ'] = False
-        conf.report_optional_feature("PyViz", "PyViz visualizer",
-                                     False,
-                                     "Python Bindings are needed but not enabled")
-        conf.env['MODULES_NOT_BUILT'].append('visualizer')
-        return
-
-    modules_missing = []
-    for pymod in required_python_modules:
-        try:
-            conf.check_python_module(pymod)
-        except conf.errors.ConfigurationError:
-            modules_missing.append(pymod)
-    if modules_missing:
-        conf.report_optional_feature("PyViz", "PyViz visualizer",
-                                     False, "Missing python modules: %s" % (', '.join(modules_missing),))
-        conf.env['ENABLE_PYVIZ'] = False
-        conf.env['MODULES_NOT_BUILT'].append('visualizer')
-        return
-
-    conf.report_optional_feature("PyViz", "PyViz visualizer", True, None)
-
-
-def build(bld):
-
-    module = bld.create_ns3_module('visualizer', ['internet', 'wifi', 'point-to-point', 'csma', 'bridge', 'wimax', 'lte', 'mesh'])
-    headers = bld(features='ns3header')
-    headers.module = 'visualizer'
-
-    # Don't do anything more for this module if Python was explicitly
-    # disabled.
-    if not bld.env['ENABLE_PYVIZ']:
-        return
-
-    headers.source = []
-
-    # XXX This file was added so that static builds would work on
-    # Darwin, which doesn't like modules with no source files.  It
-    # would have been better to add this module to the list
-    # conf.env['MODULES_NOT_BUILT'] if Python bindings were not
-    # enabled, but it's not possible for this module to determine in
-    # its configure() function if Python bindings will be enabled
-    # because that is done by the wscript file in bindings/python that
-    # is parsed after this module's wscript file is parsed.
-    module.source = [
-        'model/dummy-file-for-static-builds.cc',
-        ]
-
-    module.features += ' pyembed'
-    #module.env.append_value('CXXFLAGS', module.env['shlib_CXXFLAGS'])
-    #module.includes = '.'
-
-    module.source.extend([
-        'model/pyviz.cc',
-        'model/visual-simulator-impl.cc',
-        ])
-    headers.source.append('model/pyviz.h')
-
-    vissrc = [
-        'visualizer/base.py',
-        'visualizer/core.py',
-        'visualizer/hud.py',
-        'visualizer/__init__.py',
-        'visualizer/svgitem.py',
-        ]
-    pyviz = bld(features='py')
-    pyviz.source = vissrc
-    pyviz.install_path = '${PYTHONARCHDIR}/visualizer'
-
-    visplugin_src = [
-        'visualizer/plugins/interface_statistics.py',
-        'visualizer/plugins/ipv4_routing_table.py',
-        'visualizer/plugins/olsr.py',
-        'visualizer/plugins/show_last_packets.py',
-        'visualizer/plugins/wifi_intrastructure_link.py'
-        ]
-    pyvizplug = bld(features='py')
-    pyvizplug.source = visplugin_src
-    pyvizplug.install_path = '${PYTHONARCHDIR}/visualizer/plugins'
-
-    bld.ns3_python_bindings()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wave/bindings/callbacks_list.py ns-3.36/src/wave/bindings/callbacks_list.py
--- ns-3.35/src/wave/bindings/callbacks_list.py	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wave/bindings/callbacks_list.py	2022-04-30 18:23:58.186735200 -0700
@@ -18,41 +18,40 @@
     ['void', 'const ns3::Ipv6Header &', 'ns3::Ptr<const ns3::Packet>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'std::basic_string<char>', 'ns3::Ptr<const ns3::Packet>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Ptr<const ns3::MobilityModel>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['unsigned long', 'unsigned short', 'unsigned short', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['unsigned long', 'const ns3::WifiTxVector &', 'unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['unsigned long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['bool', 'unsigned short', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['bool', 'const ns3::WifiTxVector &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Ptr<ns3::WifiPsdu>', 'ns3::RxSignalInfo', 'ns3::WifiTxVector', 'std::vector<bool, std::allocator<bool>>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Ptr<ns3::WifiPsdu>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Time', 'ns3::Time', 'WifiPhyState', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Ptr<const ns3::Packet>', 'double', 'ns3::WifiMode', 'ns3::WifiPreamble', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Ptr<const ns3::Packet>', 'double', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::WifiMode', 'ns3::WifiPreamble', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu>>>>', 'ns3::WifiTxVector', 'double', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Ptr<const ns3::Packet>', 'std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int>>, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double>>>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::WifiTxVector', 'ns3::Time', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::WifiPhyRxfailureReason', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'ns3::WifiTxVector', 'ns3::MpduInfo', 'ns3::SignalNoiseDbm', 'unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'ns3::WifiTxVector', 'ns3::MpduInfo', 'unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::Mac48Address', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Mac48Address', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::Mac48Address', 'ns3::Mac48Address', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Mac48Address', 'unsigned char', 'bool', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Mac48Address', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Ptr<const ns3::WifiMacQueueItem>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Time', 'ns3::Mac48Address', 'unsigned char', 'ns3::OriginatorBlockAckAgreement::State', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::WifiMacDropReason', 'ns3::Ptr<const ns3::WifiMacQueueItem>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'unsigned int', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Time', 'ns3::Time', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'const ns3::WifiMacHeader &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::WifiMacDropReason', 'ns3::Ptr<const ns3::WifiMacQueueItem>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Ptr<const ns3::WifiMacQueueItem>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'unsigned char', 'ns3::Ptr<const ns3::WifiMacQueueItem>', 'const ns3::WifiTxVector &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'unsigned char', 'ns3::Ptr<const ns3::WifiPsdu>', 'const ns3::WifiTxVector &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'unsigned char', 'std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *', 'const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *', 'unsigned long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'unsigned char', 'std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *', 'const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *', 'unsigned long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'unsigned int', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::QueueDiscItem>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['bool', 'ns3::Ptr<ns3::WifiMac>', 'const ns3::OrganizationIdentifier &', 'ns3::Ptr<const ns3::Packet>', 'const ns3::Address &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['bool', 'ns3::Ptr<const ns3::Packet>', 'const ns3::Address &', 'unsigned int', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Address', 'ns3::Address', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Ptr<const ns3::MobilityModel>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Mac48Address', 'unsigned char', 'bool', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Mac48Address', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Time', 'ns3::Mac48Address', 'unsigned char', 'ns3::OriginatorBlockAckAgreement::State', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Time', 'ns3::Time', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<ns3::WifiMacQueueItem>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Ptr<ns3::WifiPsdu>', 'ns3::RxSignalInfo', 'ns3::WifiTxVector', 'std::vector<bool, std::allocator<bool> >', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Ptr<ns3::WifiPsdu>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Time', 'ns3::Time', 'WifiPhyState', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Ptr<const ns3::Packet>', 'double', 'ns3::WifiMode', 'ns3::WifiPreamble', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Ptr<const ns3::Packet>', 'double', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::WifiMode', 'ns3::WifiPreamble', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >', 'ns3::WifiTxVector', 'double', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Ptr<const ns3::Packet>', 'std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::WifiTxVector', 'ns3::Time', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::WifiPhyRxfailureReason', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'ns3::WifiTxVector', 'ns3::MpduInfo', 'ns3::SignalNoiseDbm', 'unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'ns3::WifiTxVector', 'ns3::MpduInfo', 'unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
 ]
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wave/bindings/modulegen__gcc_ILP32.py ns-3.36/src/wave/bindings/modulegen__gcc_ILP32.py
--- ns-3.35/src/wave/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wave/bindings/modulegen__gcc_ILP32.py	2022-04-30 18:23:58.186735200 -0700
@@ -24,32 +24,18 @@
     module.add_enum('AcIndex', ['AC_BE', 'AC_BK', 'AC_VI', 'AC_VO', 'AC_BE_NQOS', 'AC_BEACON', 'AC_UNDEF'], import_from_module='ns.wifi')
     ## ctrl-headers.h (module 'wifi'): ns3::TriggerFrameType [enumeration]
     module.add_enum('TriggerFrameType', ['BASIC_TRIGGER', 'BFRP_TRIGGER', 'MU_BAR_TRIGGER', 'MU_RTS_TRIGGER', 'BSRP_TRIGGER', 'GCR_MU_BAR_TRIGGER', 'BQRP_TRIGGER', 'NFRP_TRIGGER'], import_from_module='ns.wifi')
-    ## wifi-mpdu-type.h (module 'wifi'): ns3::MpduType [enumeration]
-    module.add_enum('MpduType', ['NORMAL_MPDU', 'SINGLE_MPDU', 'FIRST_MPDU_IN_AGGREGATE', 'MIDDLE_MPDU_IN_AGGREGATE', 'LAST_MPDU_IN_AGGREGATE'], import_from_module='ns.wifi')
+    ## wifi-mac.h (module 'wifi'): ns3::WifiMacDropReason [enumeration]
+    module.add_enum('WifiMacDropReason', ['WIFI_MAC_DROP_FAILED_ENQUEUE', 'WIFI_MAC_DROP_EXPIRED_LIFETIME', 'WIFI_MAC_DROP_REACHED_RETRY_LIMIT', 'WIFI_MAC_DROP_QOS_OLD_PACKET'], import_from_module='ns.wifi')
     ## channel-scheduler.h (module 'wave'): ns3::ChannelAccess [enumeration]
     module.add_enum('ChannelAccess', ['ContinuousAccess', 'AlternatingAccess', 'ExtendedAccess', 'DefaultCchAccess', 'NoAccess'])
     ## vsa-manager.h (module 'wave'): ns3::VsaTransmitInterval [enumeration]
     module.add_enum('VsaTransmitInterval', ['VSA_TRANSMIT_IN_CCHI', 'VSA_TRANSMIT_IN_SCHI', 'VSA_TRANSMIT_IN_BOTHI'])
     ## queue-size.h (module 'network'): ns3::QueueSizeUnit [enumeration]
     module.add_enum('QueueSizeUnit', ['PACKETS', 'BYTES'], import_from_module='ns.network')
-    ## regular-wifi-mac.h (module 'wifi'): ns3::WifiTxTimerReason [enumeration]
-    module.add_enum('WifiTxTimerReason', [], import_from_module='ns.wifi')
-    ## wifi-mac.h (module 'wifi'): ns3::WifiMacDropReason [enumeration]
-    module.add_enum('WifiMacDropReason', ['WIFI_MAC_DROP_FAILED_ENQUEUE', 'WIFI_MAC_DROP_EXPIRED_LIFETIME', 'WIFI_MAC_DROP_REACHED_RETRY_LIMIT', 'WIFI_MAC_DROP_QOS_OLD_PACKET'], import_from_module='ns.wifi')
     ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacType [enumeration]
     module.add_enum('WifiMacType', ['WIFI_MAC_CTL_TRIGGER', 'WIFI_MAC_CTL_CTLWRAPPER', 'WIFI_MAC_CTL_RTS', 'WIFI_MAC_CTL_CTS', 'WIFI_MAC_CTL_ACK', 'WIFI_MAC_CTL_BACKREQ', 'WIFI_MAC_CTL_BACKRESP', 'WIFI_MAC_CTL_END', 'WIFI_MAC_CTL_END_ACK', 'WIFI_MAC_MGT_BEACON', 'WIFI_MAC_MGT_ASSOCIATION_REQUEST', 'WIFI_MAC_MGT_ASSOCIATION_RESPONSE', 'WIFI_MAC_MGT_DISASSOCIATION', 'WIFI_MAC_MGT_REASSOCIATION_REQUEST', 'WIFI_MAC_MGT_REASSOCIATION_RESPONSE', 'WIFI_MAC_MGT_PROBE_REQUEST', 'WIFI_MAC_MGT_PROBE_RESPONSE', 'WIFI_MAC_MGT_AUTHENTICATION', 'WIFI_MAC_MGT_DEAUTHENTICATION', 'WIFI_MAC_MGT_ACTION', 'WIFI_MAC_MGT_ACTION_NO_ACK', 'WIFI_MAC_MGT_MULTIHOP_ACTION', 'WIFI_MAC_DATA', 'WIFI_MAC_DATA_CFACK', 'WIFI_MAC_DATA_CFPOLL', 'WIFI_MAC_DATA_CFACK_CFPOLL', 'WIFI_MAC_DATA_NULL', 'WIFI_MAC_DATA_NULL_CFACK', 'WIFI_MAC_DATA_NULL_CFPOLL', 'WIFI_MAC_DATA_NULL_CFACK_CFPOLL', 'WIFI_MAC_QOSDATA', 'WIFI_MAC_QOSDATA_CFACK', 'WIFI_MAC_QOSDATA_CFPOLL', 'WIFI_MAC_QOSDATA_CFACK_CFPOLL', 'WIFI_MAC_QOSDATA_NULL', 'WIFI_MAC_QOSDATA_NULL_CFPOLL', 'WIFI_MAC_QOSDATA_NULL_CFACK_CFPOLL'], import_from_module='ns.wifi')
     ## wifi-mac.h (module 'wifi'): ns3::TypeOfStation [enumeration]
     module.add_enum('TypeOfStation', ['STA', 'AP', 'ADHOC_STA', 'MESH', 'OCB'], import_from_module='ns.wifi')
-    ## wifi-standards.h (module 'wifi'): ns3::WifiPhyStandard [enumeration]
-    module.add_enum('WifiPhyStandard', ['WIFI_PHY_STANDARD_80211a', 'WIFI_PHY_STANDARD_80211b', 'WIFI_PHY_STANDARD_80211g', 'WIFI_PHY_STANDARD_80211p', 'WIFI_PHY_STANDARD_80211n', 'WIFI_PHY_STANDARD_80211ac', 'WIFI_PHY_STANDARD_80211ax', 'WIFI_PHY_STANDARD_UNSPECIFIED'], import_from_module='ns.wifi')
-    ## wifi-standards.h (module 'wifi'): ns3::WifiMacStandard [enumeration]
-    module.add_enum('WifiMacStandard', ['WIFI_MAC_STANDARD_80211', 'WIFI_MAC_STANDARD_80211n', 'WIFI_MAC_STANDARD_80211ac', 'WIFI_MAC_STANDARD_80211ax'], import_from_module='ns.wifi')
-    ## wifi-standards.h (module 'wifi'): ns3::WifiStandard [enumeration]
-    module.add_enum('WifiStandard', ['WIFI_STANDARD_80211a', 'WIFI_STANDARD_80211b', 'WIFI_STANDARD_80211g', 'WIFI_STANDARD_80211p', 'WIFI_STANDARD_80211n_2_4GHZ', 'WIFI_STANDARD_80211n_5GHZ', 'WIFI_STANDARD_80211ac', 'WIFI_STANDARD_80211ax_2_4GHZ', 'WIFI_STANDARD_80211ax_5GHZ', 'WIFI_STANDARD_80211ax_6GHZ'], import_from_module='ns.wifi')
-    ## wifi-standards.h (module 'wifi'): ns3::FrequencyChannelType [enumeration]
-    module.add_enum('FrequencyChannelType', ['WIFI_PHY_DSSS_CHANNEL', 'WIFI_PHY_OFDM_CHANNEL', 'WIFI_PHY_80211p_CHANNEL'], import_from_module='ns.wifi')
-    ## wifi-phy-band.h (module 'wifi'): ns3::WifiPhyBand [enumeration]
-    module.add_enum('WifiPhyBand', ['WIFI_PHY_BAND_2_4GHZ', 'WIFI_PHY_BAND_5GHZ', 'WIFI_PHY_BAND_6GHZ', 'WIFI_PHY_BAND_UNSPECIFIED'], import_from_module='ns.wifi')
     ## wifi-phy-common.h (module 'wifi'): ns3::WifiPreamble [enumeration]
     module.add_enum('WifiPreamble', ['WIFI_PREAMBLE_LONG', 'WIFI_PREAMBLE_SHORT', 'WIFI_PREAMBLE_HT_MF', 'WIFI_PREAMBLE_VHT_SU', 'WIFI_PREAMBLE_VHT_MU', 'WIFI_PREAMBLE_HE_SU', 'WIFI_PREAMBLE_HE_ER_SU', 'WIFI_PREAMBLE_HE_MU', 'WIFI_PREAMBLE_HE_TB'], import_from_module='ns.wifi')
     ## wifi-phy-common.h (module 'wifi'): ns3::WifiModulationClass [enumeration]
@@ -59,7 +45,15 @@
     ## wifi-phy-common.h (module 'wifi'): ns3::WifiPpduType [enumeration]
     module.add_enum('WifiPpduType', ['WIFI_PPDU_TYPE_SU', 'WIFI_PPDU_TYPE_DL_MU', 'WIFI_PPDU_TYPE_UL_MU'], import_from_module='ns.wifi')
     ## wifi-phy-common.h (module 'wifi'): ns3::WifiPhyRxfailureReason [enumeration]
-    module.add_enum('WifiPhyRxfailureReason', ['UNKNOWN', 'UNSUPPORTED_SETTINGS', 'CHANNEL_SWITCHING', 'RXING', 'TXING', 'SLEEPING', 'BUSY_DECODING_PREAMBLE', 'PREAMBLE_DETECT_FAILURE', 'RECEPTION_ABORTED_BY_TX', 'L_SIG_FAILURE', 'HT_SIG_FAILURE', 'SIG_A_FAILURE', 'SIG_B_FAILURE', 'PREAMBLE_DETECTION_PACKET_SWITCH', 'FRAME_CAPTURE_PACKET_SWITCH', 'OBSS_PD_CCA_RESET', 'HE_TB_PPDU_TOO_LATE', 'FILTERED'], import_from_module='ns.wifi')
+    module.add_enum('WifiPhyRxfailureReason', ['UNKNOWN', 'UNSUPPORTED_SETTINGS', 'CHANNEL_SWITCHING', 'RXING', 'TXING', 'SLEEPING', 'POWERED_OFF', 'TRUNCATED_TX', 'BUSY_DECODING_PREAMBLE', 'PREAMBLE_DETECT_FAILURE', 'RECEPTION_ABORTED_BY_TX', 'L_SIG_FAILURE', 'HT_SIG_FAILURE', 'SIG_A_FAILURE', 'SIG_B_FAILURE', 'PREAMBLE_DETECTION_PACKET_SWITCH', 'FRAME_CAPTURE_PACKET_SWITCH', 'OBSS_PD_CCA_RESET', 'HE_TB_PPDU_TOO_LATE', 'FILTERED'], import_from_module='ns.wifi')
+    ## wifi-mpdu-type.h (module 'wifi'): ns3::MpduType [enumeration]
+    module.add_enum('MpduType', ['NORMAL_MPDU', 'SINGLE_MPDU', 'FIRST_MPDU_IN_AGGREGATE', 'MIDDLE_MPDU_IN_AGGREGATE', 'LAST_MPDU_IN_AGGREGATE'], import_from_module='ns.wifi')
+    ## wifi-standards.h (module 'wifi'): ns3::WifiStandard [enumeration]
+    module.add_enum('WifiStandard', ['WIFI_STANDARD_UNSPECIFIED', 'WIFI_STANDARD_80211a', 'WIFI_STANDARD_80211b', 'WIFI_STANDARD_80211g', 'WIFI_STANDARD_80211p', 'WIFI_STANDARD_80211n', 'WIFI_STANDARD_80211ac', 'WIFI_STANDARD_80211ax'], import_from_module='ns.wifi')
+    ## wifi-standards.h (module 'wifi'): ns3::FrequencyChannelType [enumeration]
+    module.add_enum('FrequencyChannelType', ['WIFI_PHY_DSSS_CHANNEL', 'WIFI_PHY_OFDM_CHANNEL', 'WIFI_PHY_80211p_CHANNEL'], import_from_module='ns.wifi')
+    ## wifi-phy-band.h (module 'wifi'): ns3::WifiPhyBand [enumeration]
+    module.add_enum('WifiPhyBand', ['WIFI_PHY_BAND_2_4GHZ', 'WIFI_PHY_BAND_5GHZ', 'WIFI_PHY_BAND_6GHZ', 'WIFI_PHY_BAND_UNSPECIFIED'], import_from_module='ns.wifi')
     ## log.h (module 'core'): ns3::LogLevel [enumeration]
     module.add_enum('LogLevel', ['LOG_NONE', 'LOG_ERROR', 'LOG_LEVEL_ERROR', 'LOG_WARN', 'LOG_LEVEL_WARN', 'LOG_DEBUG', 'LOG_LEVEL_DEBUG', 'LOG_INFO', 'LOG_LEVEL_INFO', 'LOG_FUNCTION', 'LOG_LEVEL_FUNCTION', 'LOG_LOGIC', 'LOG_LEVEL_LOGIC', 'LOG_ALL', 'LOG_LEVEL_ALL', 'LOG_PREFIX_FUNC', 'LOG_PREFIX_TIME', 'LOG_PREFIX_NODE', 'LOG_PREFIX_LEVEL', 'LOG_PREFIX_ALL'], import_from_module='ns.core')
     ## address.h (module 'network'): ns3::Address [class]
@@ -168,6 +162,8 @@
     module.add_class('EdcaParameter')
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'], import_from_module='ns.core')
     ## hash.h (module 'core'): ns3::Hasher [class]
     module.add_class('Hasher', import_from_module='ns.core')
     ## wifi-tx-vector.h (module 'wifi'): ns3::HeMuUserInfo [struct]
@@ -413,24 +409,18 @@
     typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::ConstellationSizeCallback')
     typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::ConstellationSizeCallback*')
     typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::ConstellationSizeCallback&')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::PhyRateCallback')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::PhyRateCallback*')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::PhyRateCallback&')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::PhyRateFromTxVectorCallback')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::PhyRateFromTxVectorCallback*')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::PhyRateFromTxVectorCallback&')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::DataRateCallback')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::DataRateCallback*')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::DataRateCallback&')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::DataRateFromTxVectorCallback')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::DataRateFromTxVectorCallback*')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::DataRateFromTxVectorCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::PhyRateCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::PhyRateCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::PhyRateCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::DataRateCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::DataRateCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::DataRateCallback&')
     typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::NonHtReferenceRateCallback')
     typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::NonHtReferenceRateCallback*')
     typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::NonHtReferenceRateCallback&')
-    typehandlers.add_type_alias('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::ModeAllowedCallback')
-    typehandlers.add_type_alias('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::ModeAllowedCallback*')
-    typehandlers.add_type_alias('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::ModeAllowedCallback&')
+    typehandlers.add_type_alias('ns3::Callback< bool, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::AllowedCallback')
+    typehandlers.add_type_alias('ns3::Callback< bool, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::AllowedCallback*')
+    typehandlers.add_type_alias('ns3::Callback< bool, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::AllowedCallback&')
     ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiNoAck [struct]
     module.add_class('WifiNoAck', import_from_module='ns.wifi', parent=root_module['ns3::WifiAcknowledgment'])
     ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiNormalAck [struct]
@@ -441,6 +431,9 @@
     module.add_enum('SupportedPcapDataLinkTypes', ['DLT_IEEE802_11', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO'], outer_class=root_module['ns3::WifiPhyHelper'], import_from_module='ns.wifi')
     ## wifi-phy-operating-channel.h (module 'wifi'): ns3::WifiPhyOperatingChannel [class]
     module.add_class('WifiPhyOperatingChannel', import_from_module='ns.wifi')
+    typehandlers.add_type_alias('std::set< std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand > > const_iterator', 'ns3::WifiPhyOperatingChannel::ConstIterator')
+    typehandlers.add_type_alias('std::set< std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand > > const_iterator*', 'ns3::WifiPhyOperatingChannel::ConstIterator*')
+    typehandlers.add_type_alias('std::set< std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand > > const_iterator&', 'ns3::WifiPhyOperatingChannel::ConstIterator&')
     ## wifi-protection.h (module 'wifi'): ns3::WifiProtection [struct]
     module.add_class('WifiProtection', allow_subclassing=True, import_from_module='ns.wifi')
     ## wifi-protection.h (module 'wifi'): ns3::WifiProtection::Method [enumeration]
@@ -459,8 +452,6 @@
     module.add_class('WifiSpectrumValue5MhzFactory', allow_subclassing=True, import_from_module='ns.spectrum')
     ## wifi-spectrum-value-helper.h (module 'spectrum'): ns3::WifiSpectrumValueHelper [class]
     module.add_class('WifiSpectrumValueHelper', import_from_module='ns.spectrum')
-    ## wifi-standards.h (module 'wifi'): ns3::WifiStandardInfo [struct]
-    module.add_class('WifiStandardInfo', import_from_module='ns.wifi')
     ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters [class]
     module.add_class('WifiTxParameters', import_from_module='ns.wifi')
     ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters::PsduInfo [struct]
@@ -536,53 +527,53 @@
     module.add_class('RandomVariableStream', import_from_module='ns.core', parent=root_module['ns3::Object'])
     ## random-variable-stream.h (module 'core'): ns3::SequentialRandomVariable [class]
     module.add_class('SequentialRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ChannelCoordinationListener, ns3::empty, ns3::DefaultDeleter<ns3::ChannelCoordinationListener> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ChannelCoordinationListener, ns3::empty, ns3::DefaultDeleter<ns3::ChannelCoordinationListener>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::ChannelCoordinationListener', 'ns3::empty', 'ns3::DefaultDeleter<ns3::ChannelCoordinationListener>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Event, ns3::empty, ns3::DefaultDeleter<ns3::Event> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Event, ns3::empty, ns3::DefaultDeleter<ns3::Event>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Event', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Event>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv4MulticastRoute', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv4Route', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv4Route>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MacRxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacRxMiddle> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MacRxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacRxMiddle>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::MacRxMiddle', 'ns3::empty', 'ns3::DefaultDeleter<ns3::MacRxMiddle>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MacTxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacTxMiddle> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MacTxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacTxMiddle>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::MacTxMiddle', 'ns3::empty', 'ns3::DefaultDeleter<ns3::MacTxMiddle>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::OutputStreamWrapper', 'ns3::empty', 'ns3::DefaultDeleter<ns3::OutputStreamWrapper>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::PhyEntity', 'ns3::empty', 'ns3::DefaultDeleter<ns3::PhyEntity>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::QueueItem', 'ns3::empty', 'ns3::DefaultDeleter<ns3::QueueItem>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::SpectrumModel', 'ns3::empty', 'ns3::DefaultDeleter<ns3::SpectrumModel>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::SpectrumValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::SpectrumValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::WifiInformationElement', 'ns3::empty', 'ns3::DefaultDeleter<ns3::WifiInformationElement>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiMacQueueItem, ns3::empty, ns3::DefaultDeleter<ns3::WifiMacQueueItem> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiMacQueueItem, ns3::empty, ns3::DefaultDeleter<ns3::WifiMacQueueItem>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::WifiMacQueueItem', 'ns3::empty', 'ns3::DefaultDeleter<ns3::WifiMacQueueItem>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiPpdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPpdu> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiPpdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPpdu>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::WifiPpdu', 'ns3::empty', 'ns3::DefaultDeleter<ns3::WifiPpdu>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiPsdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPsdu> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiPsdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPsdu>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::WifiPsdu', 'ns3::empty', 'ns3::DefaultDeleter<ns3::WifiPsdu>'])
     ## socket.h (module 'network'): ns3::Socket [class]
     module.add_class('Socket', import_from_module='ns.network', parent=root_module['ns3::Object'])
@@ -693,6 +684,9 @@
     typehandlers.add_type_alias('void ( * ) ( ns3::WifiTxVector, ns3::Time )', 'ns3::WifiPhy::PhyRxPayloadBeginTracedCallback')
     typehandlers.add_type_alias('void ( * ) ( ns3::WifiTxVector, ns3::Time )*', 'ns3::WifiPhy::PhyRxPayloadBeginTracedCallback*')
     typehandlers.add_type_alias('void ( * ) ( ns3::WifiTxVector, ns3::Time )&', 'ns3::WifiPhy::PhyRxPayloadBeginTracedCallback&')
+    typehandlers.add_type_alias('std::tuple< unsigned char, unsigned short, int, unsigned char >', 'ns3::WifiPhy::ChannelTuple')
+    typehandlers.add_type_alias('std::tuple< unsigned char, unsigned short, int, unsigned char >*', 'ns3::WifiPhy::ChannelTuple*')
+    typehandlers.add_type_alias('std::tuple< unsigned char, unsigned short, int, unsigned char >&', 'ns3::WifiPhy::ChannelTuple&')
     ## wifi-phy-state-helper.h (module 'wifi'): ns3::WifiPhyStateHelper [class]
     module.add_class('WifiPhyStateHelper', import_from_module='ns.wifi', parent=root_module['ns3::Object'])
     typehandlers.add_type_alias('void ( * ) ( ns3::Time, ns3::Time, WifiPhyState )', 'ns3::WifiPhyStateHelper::StateTracedCallback')
@@ -966,6 +960,8 @@
     module.add_class('ObjectFactoryChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
     ## object-factory.h (module 'core'): ns3::ObjectFactoryValue [class]
     module.add_class('ObjectFactoryValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## ocb-wifi-mac.h (module 'wave'): ns3::OcbWifiMac [class]
+    module.add_class('OcbWifiMac', parent=root_module['ns3::WifiMac'])
     ## vendor-specific-action.h (module 'wave'): ns3::OrganizationIdentifierChecker [class]
     module.add_class('OrganizationIdentifierChecker', parent=root_module['ns3::AttributeChecker'])
     ## vendor-specific-action.h (module 'wave'): ns3::OrganizationIdentifierValue [class]
@@ -1050,8 +1046,6 @@
     module.add_enum('ErrorUnit', ['ERROR_UNIT_BIT', 'ERROR_UNIT_BYTE', 'ERROR_UNIT_PACKET'], outer_class=root_module['ns3::RateErrorModel'], import_from_module='ns.network')
     ## error-model.h (module 'network'): ns3::ReceiveListErrorModel [class]
     module.add_class('ReceiveListErrorModel', import_from_module='ns.network', parent=root_module['ns3::ErrorModel'])
-    ## regular-wifi-mac.h (module 'wifi'): ns3::RegularWifiMac [class]
-    module.add_class('RegularWifiMac', import_from_module='ns.wifi', parent=root_module['ns3::WifiMac'])
     ## ssid.h (module 'wifi'): ns3::Ssid [class]
     module.add_class('Ssid', import_from_module='ns.wifi', parent=root_module['ns3::WifiInformationElement'])
     ## ssid.h (module 'wifi'): ns3::SsidChecker [class]
@@ -1098,22 +1092,20 @@
     module.add_class('BinaryErrorModel', import_from_module='ns.network', parent=root_module['ns3::ErrorModel'])
     ## error-model.h (module 'network'): ns3::BurstErrorModel [class]
     module.add_class('BurstErrorModel', import_from_module='ns.network', parent=root_module['ns3::ErrorModel'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['bool', 'const ns3::WifiTxVector &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<bool, ns3::Ptr<const ns3::Packet>, const ns3::Address &, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['bool', 'ns3::Ptr<const ns3::Packet>', 'const ns3::Address &', 'unsigned int', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['bool', 'ns3::Ptr<ns3::Socket>', 'const ns3::Address &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<bool, ns3::Ptr<ns3::WifiMac>, const ns3::OrganizationIdentifier &, ns3::Ptr<const ns3::Packet>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['bool', 'ns3::Ptr<ns3::WifiMac>', 'const ns3::OrganizationIdentifier &', 'ns3::Ptr<const ns3::Packet>', 'const ns3::Address &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['bool', 'unsigned short', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['ns3::ObjectBase *', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned long long', 'const ns3::WifiTxVector &', 'unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned long long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned long long', 'unsigned short', 'unsigned short', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, const ns3::Ipv4Header &, ns3::Ptr<const ns3::Packet>, ns3::Ipv4L3Protocol::DropReason, ns3::Ptr<ns3::Ipv4>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
@@ -1148,8 +1140,8 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::WifiPhyRxfailureReason', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<const ns3::Packet>', 'std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int>>, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double>>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<const ns3::Packet>', 'std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int>>, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double>>>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, ns3::SignalNoiseDbm, unsigned short, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'ns3::WifiTxVector', 'ns3::MpduInfo', 'ns3::SignalNoiseDbm', 'unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
@@ -1170,8 +1162,8 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::Socket>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::WifiMacQueueItem>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::WifiPsdu>', 'ns3::RxSignalInfo', 'ns3::WifiTxVector', 'std::vector<bool, std::allocator<bool> >', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::WifiPsdu>', 'ns3::RxSignalInfo', 'ns3::WifiTxVector', 'std::vector<bool, std::allocator<bool>>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::WifiPsdu>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::Mac48Address, unsigned char, ns3::OriginatorBlockAckAgreement::State, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
@@ -1186,20 +1178,18 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::WifiTxVector', 'ns3::Time', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >', 'ns3::WifiTxVector', 'double', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu>>>>, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu>>>>', 'ns3::WifiTxVector', 'double', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned char', 'ns3::Ptr<const ns3::WifiMacQueueItem>', 'const ns3::WifiTxVector &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned char', 'ns3::Ptr<const ns3::WifiPsdu>', 'const ns3::WifiTxVector &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned char', 'std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *', 'const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *', 'unsigned long long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned char', 'std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *', 'const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *', 'unsigned long long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned int', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## ocb-wifi-mac.h (module 'wave'): ns3::OcbWifiMac [class]
-    module.add_class('OcbWifiMac', parent=root_module['ns3::RegularWifiMac'])
     ## queue-item.h (module 'network'): ns3::QueueDiscItem [class]
     module.add_class('QueueDiscItem', import_from_module='ns.network', parent=root_module['ns3::QueueItem'])
     ## wave-net-device.h (module 'wave'): ns3::WaveNetDevice [class]
@@ -1214,7 +1204,7 @@
     module.add_container('ns3::HeRu::SubcarrierGroup', 'std::pair< short, short >', container_type='vector')
     module.add_container('std::map< std::pair< unsigned char, ns3::HeRu::RuType >, std::vector< std::vector< std::pair< short, short > > > >', ('std::pair< unsigned char, ns3::HeRu::RuType >', 'std::vector< std::vector< std::pair< short, short > > >'), container_type='map')
     module.add_container('std::map< std::pair< unsigned int, unsigned int >, double >', ('std::pair< unsigned int, unsigned int >', 'double'), container_type='map')
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     module.add_container('ns3::EdcaParameters', ('ns3::AcIndex', 'ns3::EdcaParameter'), container_type='map')
     module.add_container('std::vector< double >', 'double', container_type='vector')
     module.add_container('std::vector< int >', 'int', container_type='vector')
@@ -1224,6 +1214,7 @@
     module.add_container('std::map< ns3::Mac48Address, ns3::WifiDlMuBarBaSequence::BlockAckInfo >', ('ns3::Mac48Address', 'ns3::WifiDlMuBarBaSequence::BlockAckInfo'), container_type='map')
     module.add_container('std::map< ns3::Mac48Address, ns3::WifiDlMuBarBaSequence::BlockAckReqInfo >', ('ns3::Mac48Address', 'ns3::WifiDlMuBarBaSequence::BlockAckReqInfo'), container_type='map')
     module.add_container('std::map< ns3::Mac48Address, ns3::WifiDlMuTfMuBar::BlockAckInfo >', ('ns3::Mac48Address', 'ns3::WifiDlMuTfMuBar::BlockAckInfo'), container_type='map')
+    module.add_container('std::set< std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand > >', 'std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand >', container_type='set')
     module.add_container('ns3::WifiModeList', 'ns3::WifiMode', container_type='vector')
     module.add_container('std::vector< std::pair< unsigned int, unsigned int > >', 'std::pair< unsigned int, unsigned int >', container_type='vector')
     module.add_container('std::map< unsigned char, std::set< unsigned short > >', ('unsigned char', 'std::set< unsigned short >'), container_type='map')
@@ -1233,7 +1224,6 @@
     module.add_container('std::vector< ns3::Ipv6Address >', 'ns3::Ipv6Address', container_type='vector')
     module.add_container('std::vector< ns3::BandInfo >', 'ns3::BandInfo', container_type='vector')
     module.add_container('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > >', 'std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader >', container_type='list')
-    module.add_container('std::set< std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand > >', 'std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand >', container_type='set')
     module.add_container('ns3::WifiConstPsduMap', ('short unsigned int', 'ns3::Ptr< ns3::WifiPsdu const >'), container_type='map')
     module.add_container('std::list< ns3::WifiMode >', 'ns3::WifiMode', container_type='list')
     module.add_container('std::list< unsigned char >', 'unsigned char', container_type='list')
@@ -1255,6 +1245,21 @@
     typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > >', 'ns3::WifiPsduMap')
     typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > >*', 'ns3::WifiPsduMap*')
     typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > >&', 'ns3::WifiPsduMap&')
+    typehandlers.add_type_alias('std::map< ns3::AcIndex, ns3::EdcaParameter >', 'ns3::EdcaParameters')
+    typehandlers.add_type_alias('std::map< ns3::AcIndex, ns3::EdcaParameter >*', 'ns3::EdcaParameters*')
+    typehandlers.add_type_alias('std::map< ns3::AcIndex, ns3::EdcaParameter >&', 'ns3::EdcaParameters&')
+    typehandlers.add_type_alias('std::map< ns3::AcIndex, ns3::EdcaParameter > const_iterator', 'ns3::EdcaParametersI')
+    typehandlers.add_type_alias('std::map< ns3::AcIndex, ns3::EdcaParameter > const_iterator*', 'ns3::EdcaParametersI*')
+    typehandlers.add_type_alias('std::map< ns3::AcIndex, ns3::EdcaParameter > const_iterator&', 'ns3::EdcaParametersI&')
+    typehandlers.add_type_alias('ns3::Callback< bool, ns3::Ptr< ns3::WifiMac >, ns3::OrganizationIdentifier const &, ns3::Ptr< ns3::Packet const >, ns3::Address const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::VscCallback')
+    typehandlers.add_type_alias('ns3::Callback< bool, ns3::Ptr< ns3::WifiMac >, ns3::OrganizationIdentifier const &, ns3::Ptr< ns3::Packet const >, ns3::Address const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::VscCallback*')
+    typehandlers.add_type_alias('ns3::Callback< bool, ns3::Ptr< ns3::WifiMac >, ns3::OrganizationIdentifier const &, ns3::Ptr< ns3::Packet const >, ns3::Address const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::VscCallback&')
+    typehandlers.add_type_alias('uint8_t', 'ns3::WifiInformationElementId')
+    typehandlers.add_type_alias('uint8_t*', 'ns3::WifiInformationElementId*')
+    typehandlers.add_type_alias('uint8_t&', 'ns3::WifiInformationElementId&')
+    typehandlers.add_type_alias('std::pair< ns3::Mac48Address, unsigned char >', 'ns3::WifiAddressTidPair')
+    typehandlers.add_type_alias('std::pair< ns3::Mac48Address, unsigned char >*', 'ns3::WifiAddressTidPair*')
+    typehandlers.add_type_alias('std::pair< ns3::Mac48Address, unsigned char >&', 'ns3::WifiAddressTidPair&')
     typehandlers.add_type_alias('std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand >', 'ns3::FrequencyChannelInfo')
     typehandlers.add_type_alias('std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand >*', 'ns3::FrequencyChannelInfo*')
     typehandlers.add_type_alias('std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand >&', 'ns3::FrequencyChannelInfo&')
@@ -1282,6 +1287,15 @@
     typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'ns3::WifiConstPsduMap')
     typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >*', 'ns3::WifiConstPsduMap*')
     typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >&', 'ns3::WifiConstPsduMap&')
+    typehandlers.add_type_alias('std::vector< ns3::WifiMode >', 'ns3::WifiModeList')
+    typehandlers.add_type_alias('std::vector< ns3::WifiMode >*', 'ns3::WifiModeList*')
+    typehandlers.add_type_alias('std::vector< ns3::WifiMode >&', 'ns3::WifiModeList&')
+    typehandlers.add_type_alias('std::vector< ns3::WifiMode > const_iterator', 'ns3::WifiModeListIterator')
+    typehandlers.add_type_alias('std::vector< ns3::WifiMode > const_iterator*', 'ns3::WifiModeListIterator*')
+    typehandlers.add_type_alias('std::vector< ns3::WifiMode > const_iterator&', 'ns3::WifiModeListIterator&')
+    typehandlers.add_type_alias('uint16_t', 'ns3::WifiCodeRate')
+    typehandlers.add_type_alias('uint16_t*', 'ns3::WifiCodeRate*')
+    typehandlers.add_type_alias('uint16_t&', 'ns3::WifiCodeRate&')
     typehandlers.add_type_alias('ns3::Vector3D', 'ns3::Vector')
     typehandlers.add_type_alias('ns3::Vector3D*', 'ns3::Vector*')
     typehandlers.add_type_alias('ns3::Vector3D&', 'ns3::Vector&')
@@ -1294,30 +1308,6 @@
     typehandlers.add_type_alias('ns3::Vector3DChecker*', 'ns3::VectorChecker*')
     typehandlers.add_type_alias('ns3::Vector3DChecker&', 'ns3::VectorChecker&')
     module.add_typedef(root_module['ns3::Vector3DChecker'], 'VectorChecker')
-    typehandlers.add_type_alias('std::map< ns3::AcIndex, ns3::EdcaParameter >', 'ns3::EdcaParameters')
-    typehandlers.add_type_alias('std::map< ns3::AcIndex, ns3::EdcaParameter >*', 'ns3::EdcaParameters*')
-    typehandlers.add_type_alias('std::map< ns3::AcIndex, ns3::EdcaParameter >&', 'ns3::EdcaParameters&')
-    typehandlers.add_type_alias('std::map< ns3::AcIndex, ns3::EdcaParameter > const_iterator', 'ns3::EdcaParametersI')
-    typehandlers.add_type_alias('std::map< ns3::AcIndex, ns3::EdcaParameter > const_iterator*', 'ns3::EdcaParametersI*')
-    typehandlers.add_type_alias('std::map< ns3::AcIndex, ns3::EdcaParameter > const_iterator&', 'ns3::EdcaParametersI&')
-    typehandlers.add_type_alias('ns3::Callback< bool, ns3::Ptr< ns3::WifiMac >, ns3::OrganizationIdentifier const &, ns3::Ptr< ns3::Packet const >, ns3::Address const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::VscCallback')
-    typehandlers.add_type_alias('ns3::Callback< bool, ns3::Ptr< ns3::WifiMac >, ns3::OrganizationIdentifier const &, ns3::Ptr< ns3::Packet const >, ns3::Address const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::VscCallback*')
-    typehandlers.add_type_alias('ns3::Callback< bool, ns3::Ptr< ns3::WifiMac >, ns3::OrganizationIdentifier const &, ns3::Ptr< ns3::Packet const >, ns3::Address const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::VscCallback&')
-    typehandlers.add_type_alias('uint8_t', 'ns3::WifiInformationElementId')
-    typehandlers.add_type_alias('uint8_t*', 'ns3::WifiInformationElementId*')
-    typehandlers.add_type_alias('uint8_t&', 'ns3::WifiInformationElementId&')
-    typehandlers.add_type_alias('std::pair< ns3::Mac48Address, unsigned char >', 'ns3::WifiAddressTidPair')
-    typehandlers.add_type_alias('std::pair< ns3::Mac48Address, unsigned char >*', 'ns3::WifiAddressTidPair*')
-    typehandlers.add_type_alias('std::pair< ns3::Mac48Address, unsigned char >&', 'ns3::WifiAddressTidPair&')
-    typehandlers.add_type_alias('std::vector< ns3::WifiMode >', 'ns3::WifiModeList')
-    typehandlers.add_type_alias('std::vector< ns3::WifiMode >*', 'ns3::WifiModeList*')
-    typehandlers.add_type_alias('std::vector< ns3::WifiMode >&', 'ns3::WifiModeList&')
-    typehandlers.add_type_alias('std::vector< ns3::WifiMode > const_iterator', 'ns3::WifiModeListIterator')
-    typehandlers.add_type_alias('std::vector< ns3::WifiMode > const_iterator*', 'ns3::WifiModeListIterator*')
-    typehandlers.add_type_alias('std::vector< ns3::WifiMode > const_iterator&', 'ns3::WifiModeListIterator&')
-    typehandlers.add_type_alias('uint16_t', 'ns3::WifiCodeRate')
-    typehandlers.add_type_alias('uint16_t*', 'ns3::WifiCodeRate*')
-    typehandlers.add_type_alias('uint16_t&', 'ns3::WifiCodeRate&')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )', 'ns3::TimePrinter')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )*', 'ns3::TimePrinter*')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )&', 'ns3::TimePrinter&')
@@ -1570,7 +1560,6 @@
     register_Ns3WifiRtsCtsProtection_methods(root_module, root_module['ns3::WifiRtsCtsProtection'])
     register_Ns3WifiSpectrumValue5MhzFactory_methods(root_module, root_module['ns3::WifiSpectrumValue5MhzFactory'])
     register_Ns3WifiSpectrumValueHelper_methods(root_module, root_module['ns3::WifiSpectrumValueHelper'])
-    register_Ns3WifiStandardInfo_methods(root_module, root_module['ns3::WifiStandardInfo'])
     register_Ns3WifiTxParameters_methods(root_module, root_module['ns3::WifiTxParameters'])
     register_Ns3WifiTxParametersPsduInfo_methods(root_module, root_module['ns3::WifiTxParameters::PsduInfo'])
     register_Ns3WifiTxTimer_methods(root_module, root_module['ns3::WifiTxTimer'])
@@ -1726,6 +1715,7 @@
     register_Ns3NormalRandomVariable_methods(root_module, root_module['ns3::NormalRandomVariable'])
     register_Ns3ObjectFactoryChecker_methods(root_module, root_module['ns3::ObjectFactoryChecker'])
     register_Ns3ObjectFactoryValue_methods(root_module, root_module['ns3::ObjectFactoryValue'])
+    register_Ns3OcbWifiMac_methods(root_module, root_module['ns3::OcbWifiMac'])
     register_Ns3OrganizationIdentifierChecker_methods(root_module, root_module['ns3::OrganizationIdentifierChecker'])
     register_Ns3OrganizationIdentifierValue_methods(root_module, root_module['ns3::OrganizationIdentifierValue'])
     register_Ns3OutputStreamWrapper_methods(root_module, root_module['ns3::OutputStreamWrapper'])
@@ -1746,7 +1736,6 @@
     register_Ns3QueueSizeValue_methods(root_module, root_module['ns3::QueueSizeValue'])
     register_Ns3RateErrorModel_methods(root_module, root_module['ns3::RateErrorModel'])
     register_Ns3ReceiveListErrorModel_methods(root_module, root_module['ns3::ReceiveListErrorModel'])
-    register_Ns3RegularWifiMac_methods(root_module, root_module['ns3::RegularWifiMac'])
     register_Ns3Ssid_methods(root_module, root_module['ns3::Ssid'])
     register_Ns3SsidChecker_methods(root_module, root_module['ns3::SsidChecker'])
     register_Ns3SsidValue_methods(root_module, root_module['ns3::SsidValue'])
@@ -1769,14 +1758,13 @@
     register_Ns3AddressValue_methods(root_module, root_module['ns3::AddressValue'])
     register_Ns3BinaryErrorModel_methods(root_module, root_module['ns3::BinaryErrorModel'])
     register_Ns3BurstErrorModel_methods(root_module, root_module['ns3::BurstErrorModel'])
+    register_Ns3CallbackImpl__Bool_Const_ns3WifiTxVector___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Bool_Ns3Ptr__lt__const_ns3Packet__gt___Const_ns3Address___amp___Unsigned_int_Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< bool, ns3::Ptr<const ns3::Packet>, const ns3::Address &, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Bool_Ns3Ptr__lt__ns3Socket__gt___Const_ns3Address___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Bool_Ns3Ptr__lt__ns3WifiMac__gt___Const_ns3OrganizationIdentifier___amp___Ns3Ptr__lt__const_ns3Packet__gt___Const_ns3Address___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< bool, ns3::Ptr<ns3::WifiMac>, const ns3::OrganizationIdentifier &, ns3::Ptr<const ns3::Packet>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3CallbackImpl__Bool_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Ns3ObjectBase___star___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Unsigned_long_Const_ns3WifiTxVector___amp___Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned long long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3CallbackImpl__Unsigned_long_Unsigned_short_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Const_ns3Ipv4Header___amp___Ns3Ptr__lt__const_ns3Packet__gt___Ns3Ipv4L3ProtocolDropReason_Ns3Ptr__lt__ns3Ipv4__gt___Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, const ns3::Ipv4Header &, ns3::Ptr<const ns3::Packet>, ns3::Ipv4L3Protocol::DropReason, ns3::Ptr<ns3::Ipv4>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Const_ns3Ipv4Header___amp___Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, const ns3::Ipv4Header &, ns3::Ptr<const ns3::Packet>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
@@ -1794,7 +1782,7 @@
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Ns3WifiMode_Ns3WifiPreamble_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::Packet>, ns3::WifiMode, ns3::WifiPreamble, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Ns3WifiPhyRxfailureReason_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::Packet>, ns3::WifiPhyRxfailureReason, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::Packet>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___StdMap__lt__stdPair__lt__unsigned_int__unsigned_int__gt____double__stdLess__lt__stdPair__lt__unsigned_int__unsigned_int__gt_____gt____stdAllocator__lt__stdPair__lt__const_stdPair__lt__unsigned_int__unsigned_int__gt____double__gt_____gt_____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___StdMap__lt__stdPair__lt__unsigned_int__unsigned_int__gt____double__stdLess__lt__stdPair__lt__unsigned_int__unsigned_int__gt____gt____stdAllocator__lt__stdPair__lt__const_stdPair__lt__unsigned_int__unsigned_int__gt____double__gt____gt____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int>>, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double>>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_short_Ns3WifiTxVector_Ns3MpduInfo_Ns3SignalNoiseDbm_Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, ns3::SignalNoiseDbm, unsigned short, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_short_Ns3WifiTxVector_Ns3MpduInfo_Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3QueueDiscItem__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::QueueDiscItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
@@ -1805,7 +1793,7 @@
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3Socket__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3Socket__gt___Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::Socket>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiMacQueueItem__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiPsdu__gt___Ns3RxSignalInfo_Ns3WifiTxVector_StdVector__lt__bool__stdAllocator__lt__bool__gt_____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiPsdu__gt___Ns3RxSignalInfo_Ns3WifiTxVector_StdVector__lt__bool__stdAllocator__lt__bool__gt____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiPsdu__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::WifiPsdu>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Time_Ns3Mac48Address_Unsigned_char_Ns3OriginatorBlockAckAgreementState_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Time, ns3::Mac48Address, unsigned char, ns3::OriginatorBlockAckAgreement::State, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Time_Ns3Time_WifiPhyState_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Time, ns3::Time, WifiPhyState, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
@@ -1813,13 +1801,12 @@
     register_Ns3CallbackImpl__Void_Ns3WifiMacDropReason_Ns3Ptr__lt__const_ns3WifiMacQueueItem__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3WifiTxVector_Ns3Time_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::WifiTxVector, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3CallbackImpl__Void_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__const_ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__const_ns3WifiPsdu__gt_____gt_____gt_____gt___Ns3WifiTxVector_Double_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__const_ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__const_ns3WifiPsdu__gt____gt____gt____gt___Ns3WifiTxVector_Double_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu>>>>, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Unsigned_char_Ns3Ptr__lt__const_ns3WifiMacQueueItem__gt___Const_ns3WifiTxVector___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Unsigned_char_Ns3Ptr__lt__const_ns3WifiPsdu__gt___Const_ns3WifiTxVector___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3CallbackImpl__Void_Unsigned_char_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt_____gt_____gt_____gt_____star___Const_stdSet__lt__ns3Mac48Address__stdLess__lt__ns3Mac48Address__gt____stdAllocator__lt__ns3Mac48Address__gt_____gt_____star___Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Unsigned_char_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt____gt____gt____gt_____star___Const_stdSet__lt__ns3Mac48Address__stdLess__lt__ns3Mac48Address__gt____stdAllocator__lt__ns3Mac48Address__gt____gt_____star___Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Unsigned_int_Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3OcbWifiMac_methods(root_module, root_module['ns3::OcbWifiMac'])
     register_Ns3QueueDiscItem_methods(root_module, root_module['ns3::QueueDiscItem'])
     register_Ns3WaveNetDevice_methods(root_module, root_module['ns3::WaveNetDevice'])
     register_Ns3HashImplementation_methods(root_module, root_module['ns3::Hash::Implementation'])
@@ -2388,7 +2375,7 @@
     cls.add_constructor([])
     ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::BlockAckType(ns3::BlockAckType::Variant v) [constructor]
     cls.add_constructor([param('ns3::BlockAckType::Variant', 'v')])
-    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::BlockAckType(ns3::BlockAckType::Variant v, std::vector<unsigned char, std::allocator<unsigned char> > l) [constructor]
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::BlockAckType(ns3::BlockAckType::Variant v, std::vector<unsigned char, std::allocator<unsigned char>> l) [constructor]
     cls.add_constructor([param('ns3::BlockAckType::Variant', 'v'), param('std::vector< unsigned char >', 'l')])
     ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::m_bitmapLen [variable]
     cls.add_instance_attribute('m_bitmapLen', 'std::vector< unsigned char >', is_const=False)
@@ -2405,11 +2392,11 @@
     cls.add_method('Advance', 
                    'void', 
                    [param('std::size_t', 'count')])
-    ## block-ack-window.h (module 'wifi'): std::vector<bool, std::allocator<bool> >::reference ns3::BlockAckWindow::At(std::size_t distance) [member function]
+    ## block-ack-window.h (module 'wifi'): std::vector<bool, std::allocator<bool>>::reference ns3::BlockAckWindow::At(std::size_t distance) [member function]
     cls.add_method('At', 
                    'std::vector< bool > reference', 
                    [param('std::size_t', 'distance')])
-    ## block-ack-window.h (module 'wifi'): std::vector<bool, std::allocator<bool> >::const_reference ns3::BlockAckWindow::At(std::size_t distance) const [member function]
+    ## block-ack-window.h (module 'wifi'): std::vector<bool, std::allocator<bool>>::const_reference ns3::BlockAckWindow::At(std::size_t distance) const [member function]
     cls.add_method('At', 
                    'std::vector< bool > const_reference', 
                    [param('std::size_t', 'distance')], 
@@ -3365,6 +3352,8 @@
     return
 
 def register_Ns3HeMuUserInfo_methods(root_module, cls):
+    cls.add_binary_comparison_operator('==')
+    cls.add_binary_comparison_operator('!=')
     ## wifi-tx-vector.h (module 'wifi'): ns3::HeMuUserInfo::HeMuUserInfo() [constructor]
     cls.add_constructor([])
     ## wifi-tx-vector.h (module 'wifi'): ns3::HeMuUserInfo::HeMuUserInfo(ns3::HeMuUserInfo const & arg0) [constructor]
@@ -3382,7 +3371,7 @@
     cls.add_constructor([])
     ## he-ru.h (module 'wifi'): ns3::HeRu::HeRu(ns3::HeRu const & arg0) [constructor]
     cls.add_constructor([param('ns3::HeRu const &', 'arg0')])
-    ## he-ru.h (module 'wifi'): static bool ns3::HeRu::DoesOverlap(uint16_t bw, ns3::HeRu::RuSpec ru, std::vector<ns3::HeRu::RuSpec, std::allocator<ns3::HeRu::RuSpec> > const & v) [member function]
+    ## he-ru.h (module 'wifi'): static bool ns3::HeRu::DoesOverlap(uint16_t bw, ns3::HeRu::RuSpec ru, std::vector<ns3::HeRu::RuSpec, std::allocator<ns3::HeRu::RuSpec>> const & v) [member function]
     cls.add_method('DoesOverlap', 
                    'bool', 
                    [param('uint16_t', 'bw'), param('ns3::HeRu::RuSpec', 'ru'), param('std::vector< ns3::HeRu::RuSpec > const &', 'v')], 
@@ -3402,7 +3391,7 @@
                    'uint16_t', 
                    [param('ns3::HeRu::RuType', 'ruType')], 
                    is_static=True)
-    ## he-ru.h (module 'wifi'): static std::vector<ns3::HeRu::RuSpec, std::allocator<ns3::HeRu::RuSpec> > ns3::HeRu::GetCentral26TonesRus(uint16_t bw, ns3::HeRu::RuType ruType) [member function]
+    ## he-ru.h (module 'wifi'): static std::vector<ns3::HeRu::RuSpec, std::allocator<ns3::HeRu::RuSpec>> ns3::HeRu::GetCentral26TonesRus(uint16_t bw, ns3::HeRu::RuType ruType) [member function]
     cls.add_method('GetCentral26TonesRus', 
                    'std::vector< ns3::HeRu::RuSpec >', 
                    [param('uint16_t', 'bw'), param('ns3::HeRu::RuType', 'ruType')], 
@@ -3422,7 +3411,7 @@
                    'ns3::HeRu::RuType', 
                    [param('uint16_t', 'bandwidth')], 
                    is_static=True)
-    ## he-ru.h (module 'wifi'): static std::vector<ns3::HeRu::RuSpec, std::allocator<ns3::HeRu::RuSpec> > ns3::HeRu::GetRusOfType(uint16_t bw, ns3::HeRu::RuType ruType) [member function]
+    ## he-ru.h (module 'wifi'): static std::vector<ns3::HeRu::RuSpec, std::allocator<ns3::HeRu::RuSpec>> ns3::HeRu::GetRusOfType(uint16_t bw, ns3::HeRu::RuType ruType) [member function]
     cls.add_method('GetRusOfType', 
                    'std::vector< ns3::HeRu::RuSpec >', 
                    [param('uint16_t', 'bw'), param('ns3::HeRu::RuType', 'ruType')], 
@@ -3438,6 +3427,8 @@
 
 def register_Ns3HeRuRuSpec_methods(root_module, cls):
     cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('!=')
+    cls.add_binary_comparison_operator('==')
     ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec::RuSpec(ns3::HeRu::RuSpec const & arg0) [constructor]
     cls.add_constructor([param('ns3::HeRu::RuSpec const &', 'arg0')])
     ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec::RuSpec() [constructor]
@@ -5923,8 +5914,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -6254,7 +6245,7 @@
     cls.add_method('AssignStreams', 
                    'int64_t', 
                    [param('ns3::NodeContainer', 'c'), param('int64_t', 'stream')])
-    ## wave-bsm-helper.h (module 'wave'): static std::vector<int, std::allocator<int> > & ns3::WaveBsmHelper::GetNodesMoving() [member function]
+    ## wave-bsm-helper.h (module 'wave'): static std::vector<int, std::allocator<int>> & ns3::WaveBsmHelper::GetNodesMoving() [member function]
     cls.add_method('GetNodesMoving', 
                    'std::vector< int > &', 
                    [], 
@@ -6273,7 +6264,7 @@
                    'ns3::ApplicationContainer', 
                    [param('ns3::Ptr< ns3::Node >', 'node')], 
                    is_const=True)
-    ## wave-bsm-helper.h (module 'wave'): void ns3::WaveBsmHelper::Install(ns3::Ipv4InterfaceContainer & i, ns3::Time totalTime, uint32_t wavePacketSize, ns3::Time waveInterval, double gpsAccuracyNs, std::vector<double, std::allocator<double> > ranges, int chAccessMode, ns3::Time txMaxDelay) [member function]
+    ## wave-bsm-helper.h (module 'wave'): void ns3::WaveBsmHelper::Install(ns3::Ipv4InterfaceContainer & i, ns3::Time totalTime, uint32_t wavePacketSize, ns3::Time waveInterval, double gpsAccuracyNs, std::vector<double, std::allocator<double>> ranges, int chAccessMode, ns3::Time txMaxDelay) [member function]
     cls.add_method('Install', 
                    'void', 
                    [param('ns3::Ipv4InterfaceContainer &', 'i'), param('ns3::Time', 'totalTime'), param('uint32_t', 'wavePacketSize'), param('ns3::Time', 'waveInterval'), param('double', 'gpsAccuracyNs'), param('std::vector< double >', 'ranges'), param('int', 'chAccessMode'), param('ns3::Time', 'txMaxDelay')])
@@ -6292,7 +6283,7 @@
     cls.add_method('AssignStreams', 
                    'int64_t', 
                    [param('ns3::NetDeviceContainer', 'c'), param('int64_t', 'stream')])
-    ## wave-helper.h (module 'wave'): void ns3::WaveHelper::CreateMacForChannel(std::vector<unsigned int, std::allocator<unsigned int> > channelNumbers) [member function]
+    ## wave-helper.h (module 'wave'): void ns3::WaveHelper::CreateMacForChannel(std::vector<unsigned int, std::allocator<unsigned int>> channelNumbers) [member function]
     cls.add_method('CreateMacForChannel', 
                    'void', 
                    [param('std::vector< unsigned int >', 'channelNumbers')])
@@ -6360,7 +6351,7 @@
 def register_Ns3WifiAcknowledgment_methods(root_module, cls):
     ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiAcknowledgment::WifiAcknowledgment(ns3::WifiAcknowledgment::Method m) [constructor]
     cls.add_constructor([param('ns3::WifiAcknowledgment::Method', 'm')])
-    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiAcknowledgment::Copy() const [member function]
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment>> ns3::WifiAcknowledgment::Copy() const [member function]
     cls.add_method('Copy', 
                    'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
                    [], 
@@ -6419,7 +6410,7 @@
 def register_Ns3WifiBarBlockAck_methods(root_module, cls):
     ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiBarBlockAck::WifiBarBlockAck() [constructor]
     cls.add_constructor([])
-    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiBarBlockAck::Copy() const [member function]
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment>> ns3::WifiBarBlockAck::Copy() const [member function]
     cls.add_method('Copy', 
                    'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
                    [], 
@@ -6449,7 +6440,7 @@
 def register_Ns3WifiBlockAck_methods(root_module, cls):
     ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiBlockAck::WifiBlockAck() [constructor]
     cls.add_constructor([])
-    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiBlockAck::Copy() const [member function]
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment>> ns3::WifiBlockAck::Copy() const [member function]
     cls.add_method('Copy', 
                    'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
                    [], 
@@ -6482,7 +6473,7 @@
                    'bool', 
                    [param('ns3::Mac48Address', 'receiver'), param('uint8_t', 'tid'), param('ns3::WifiMacHeader::QosAckPolicy', 'ackPolicy')], 
                    is_const=True, is_virtual=True)
-    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiDlMuAggregateTf::Copy() const [member function]
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment>> ns3::WifiDlMuAggregateTf::Copy() const [member function]
     cls.add_method('Copy', 
                    'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
                    [], 
@@ -6523,7 +6514,7 @@
                    'bool', 
                    [param('ns3::Mac48Address', 'receiver'), param('uint8_t', 'tid'), param('ns3::WifiMacHeader::QosAckPolicy', 'ackPolicy')], 
                    is_const=True, is_virtual=True)
-    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiDlMuBarBaSequence::Copy() const [member function]
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment>> ns3::WifiDlMuBarBaSequence::Copy() const [member function]
     cls.add_method('Copy', 
                    'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
                    [], 
@@ -6586,7 +6577,7 @@
                    'bool', 
                    [param('ns3::Mac48Address', 'receiver'), param('uint8_t', 'tid'), param('ns3::WifiMacHeader::QosAckPolicy', 'ackPolicy')], 
                    is_const=True, is_virtual=True)
-    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiDlMuTfMuBar::Copy() const [member function]
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment>> ns3::WifiDlMuTfMuBar::Copy() const [member function]
     cls.add_method('Copy', 
                    'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
                    [], 
@@ -6628,6 +6619,10 @@
     cls.add_method('AssignStreams', 
                    'int64_t', 
                    [param('ns3::NetDeviceContainer', 'c'), param('int64_t', 'stream')])
+    ## wifi-helper.h (module 'wifi'): void ns3::WifiHelper::DisableFlowControl() [member function]
+    cls.add_method('DisableFlowControl', 
+                   'void', 
+                   [])
     ## wifi-helper.h (module 'wifi'): static void ns3::WifiHelper::EnableLogComponents() [member function]
     cls.add_method('EnableLogComponents', 
                    'void', 
@@ -6677,10 +6672,10 @@
     cls.add_constructor([param('ns3::WifiMacHelper const &', 'arg0')])
     ## wifi-mac-helper.h (module 'wifi'): ns3::WifiMacHelper::WifiMacHelper() [constructor]
     cls.add_constructor([])
-    ## wifi-mac-helper.h (module 'wifi'): ns3::Ptr<ns3::WifiMac> ns3::WifiMacHelper::Create(ns3::Ptr<ns3::NetDevice> device, ns3::WifiStandard standard) const [member function]
+    ## wifi-mac-helper.h (module 'wifi'): ns3::Ptr<ns3::WifiMac> ns3::WifiMacHelper::Create(ns3::Ptr<ns3::WifiNetDevice> device, ns3::WifiStandard standard) const [member function]
     cls.add_method('Create', 
                    'ns3::Ptr< ns3::WifiMac >', 
-                   [param('ns3::Ptr< ns3::NetDevice >', 'device'), param('ns3::WifiStandard', 'standard')], 
+                   [param('ns3::Ptr< ns3::WifiNetDevice >', 'device'), param('ns3::WifiStandard', 'standard')], 
                    is_const=True, is_virtual=True)
     return
 
@@ -6765,6 +6760,11 @@
                    'bool', 
                    [param('uint16_t', 'channelWidth'), param('uint8_t', 'nss')], 
                    is_const=True)
+    ## wifi-mode.h (module 'wifi'): bool ns3::WifiMode::IsAllowed(ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('IsAllowed', 
+                   'bool', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True)
     ## wifi-mode.h (module 'wifi'): bool ns3::WifiMode::IsHigherCodeRate(ns3::WifiMode mode) const [member function]
     cls.add_method('IsHigherCodeRate', 
                    'bool', 
@@ -6785,22 +6785,22 @@
 def register_Ns3WifiModeFactory_methods(root_module, cls):
     ## wifi-mode.h (module 'wifi'): ns3::WifiModeFactory::WifiModeFactory(ns3::WifiModeFactory const & arg0) [constructor]
     cls.add_constructor([param('ns3::WifiModeFactory const &', 'arg0')])
-    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMcs(std::string uniqueName, uint8_t mcsValue, ns3::WifiModulationClass modClass, ns3::WifiModeFactory::CodeRateCallback codeRateCallback, ns3::WifiModeFactory::ConstellationSizeCallback constellationSizeCallback, ns3::WifiModeFactory::PhyRateCallback phyRateCallback, ns3::WifiModeFactory::PhyRateFromTxVectorCallback phyRateFromTxVectorCallback, ns3::WifiModeFactory::DataRateCallback dataRateCallback, ns3::WifiModeFactory::DataRateFromTxVectorCallback dataRateFromTxVectorCallback, ns3::WifiModeFactory::NonHtReferenceRateCallback nonHtReferenceRateCallback, ns3::WifiModeFactory::ModeAllowedCallback isModeAllowedCallback) [member function]
+    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMcs(std::string uniqueName, uint8_t mcsValue, ns3::WifiModulationClass modClass, bool isMandatory, ns3::WifiModeFactory::CodeRateCallback codeRateCallback, ns3::WifiModeFactory::ConstellationSizeCallback constellationSizeCallback, ns3::WifiModeFactory::PhyRateCallback phyRateCallback, ns3::WifiModeFactory::DataRateCallback dataRateCallback, ns3::WifiModeFactory::NonHtReferenceRateCallback nonHtReferenceRateCallback, ns3::WifiModeFactory::AllowedCallback isAllowedCallback) [member function]
     cls.add_method('CreateWifiMcs', 
                    'ns3::WifiMode', 
-                   [param('std::string', 'uniqueName'), param('uint8_t', 'mcsValue'), param('ns3::WifiModulationClass', 'modClass'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'codeRateCallback'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'constellationSizeCallback'), param('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateCallback'), param('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateFromTxVectorCallback'), param('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateCallback'), param('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateFromTxVectorCallback'), param('ns3::Callback< unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'nonHtReferenceRateCallback'), param('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'isModeAllowedCallback')], 
+                   [param('std::string', 'uniqueName'), param('uint8_t', 'mcsValue'), param('ns3::WifiModulationClass', 'modClass'), param('bool', 'isMandatory'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'codeRateCallback'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'constellationSizeCallback'), param('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateCallback'), param('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateCallback'), param('ns3::Callback< unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'nonHtReferenceRateCallback'), param('ns3::Callback< bool, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'isAllowedCallback')], 
                    is_static=True)
-    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMode(std::string uniqueName, ns3::WifiModulationClass modClass, bool isMandatory, ns3::WifiModeFactory::CodeRateCallback codeRateCallback, ns3::WifiModeFactory::ConstellationSizeCallback constellationSizeCallback, ns3::WifiModeFactory::PhyRateCallback phyRateCallback, ns3::WifiModeFactory::PhyRateFromTxVectorCallback phyRateFromTxVectorCallback, ns3::WifiModeFactory::DataRateCallback dataRateCallback, ns3::WifiModeFactory::DataRateFromTxVectorCallback dataRateFromTxVectorCallback, ns3::WifiModeFactory::ModeAllowedCallback isModeAllowedCallback) [member function]
+    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMode(std::string uniqueName, ns3::WifiModulationClass modClass, bool isMandatory, ns3::WifiModeFactory::CodeRateCallback codeRateCallback, ns3::WifiModeFactory::ConstellationSizeCallback constellationSizeCallback, ns3::WifiModeFactory::PhyRateCallback phyRateCallback, ns3::WifiModeFactory::DataRateCallback dataRateCallback, ns3::WifiModeFactory::AllowedCallback isAllowedCallback) [member function]
     cls.add_method('CreateWifiMode', 
                    'ns3::WifiMode', 
-                   [param('std::string', 'uniqueName'), param('ns3::WifiModulationClass', 'modClass'), param('bool', 'isMandatory'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'codeRateCallback'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'constellationSizeCallback'), param('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateCallback'), param('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateFromTxVectorCallback'), param('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateCallback'), param('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateFromTxVectorCallback'), param('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'isModeAllowedCallback')], 
+                   [param('std::string', 'uniqueName'), param('ns3::WifiModulationClass', 'modClass'), param('bool', 'isMandatory'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'codeRateCallback'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'constellationSizeCallback'), param('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateCallback'), param('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateCallback'), param('ns3::Callback< bool, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'isAllowedCallback')], 
                    is_static=True)
     return
 
 def register_Ns3WifiNoAck_methods(root_module, cls):
     ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiNoAck::WifiNoAck() [constructor]
     cls.add_constructor([])
-    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiNoAck::Copy() const [member function]
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment>> ns3::WifiNoAck::Copy() const [member function]
     cls.add_method('Copy', 
                    'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
                    [], 
@@ -6822,7 +6822,7 @@
 def register_Ns3WifiNormalAck_methods(root_module, cls):
     ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiNormalAck::WifiNormalAck() [constructor]
     cls.add_constructor([])
-    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiNormalAck::Copy() const [member function]
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment>> ns3::WifiNormalAck::Copy() const [member function]
     cls.add_method('Copy', 
                    'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
                    [], 
@@ -6848,10 +6848,10 @@
     cls.add_constructor([param('ns3::WifiPhyHelper const &', 'arg0')])
     ## wifi-helper.h (module 'wifi'): ns3::WifiPhyHelper::WifiPhyHelper() [constructor]
     cls.add_constructor([])
-    ## wifi-helper.h (module 'wifi'): ns3::Ptr<ns3::WifiPhy> ns3::WifiPhyHelper::Create(ns3::Ptr<ns3::Node> node, ns3::Ptr<ns3::NetDevice> device) const [member function]
+    ## wifi-helper.h (module 'wifi'): ns3::Ptr<ns3::WifiPhy> ns3::WifiPhyHelper::Create(ns3::Ptr<ns3::Node> node, ns3::Ptr<ns3::WifiNetDevice> device) const [member function]
     cls.add_method('Create', 
                    'ns3::Ptr< ns3::WifiPhy >', 
-                   [param('ns3::Ptr< ns3::Node >', 'node'), param('ns3::Ptr< ns3::NetDevice >', 'device')], 
+                   [param('ns3::Ptr< ns3::Node >', 'node'), param('ns3::Ptr< ns3::WifiNetDevice >', 'device')], 
                    is_const=True, is_pure_virtual=True, is_virtual=True)
     ## wifi-helper.h (module 'wifi'): void ns3::WifiPhyHelper::DisablePreambleDetectionModel() [member function]
     cls.add_method('DisablePreambleDetectionModel', 
@@ -6909,6 +6909,16 @@
     cls.add_constructor([param('ns3::WifiPhyOperatingChannel const &', 'arg0')])
     ## wifi-phy-operating-channel.h (module 'wifi'): ns3::WifiPhyOperatingChannel::WifiPhyOperatingChannel() [constructor]
     cls.add_constructor([])
+    ## wifi-phy-operating-channel.h (module 'wifi'): static ns3::WifiPhyOperatingChannel::ConstIterator ns3::WifiPhyOperatingChannel::FindFirst(uint8_t number, uint16_t frequency, uint16_t width, ns3::WifiStandard standard, ns3::WifiPhyBand band, ns3::WifiPhyOperatingChannel::ConstIterator start=ns3::WifiPhyOperatingChannel::m_frequencyChannels.begin()) [member function]
+    cls.add_method('FindFirst', 
+                   'ns3::WifiPhyOperatingChannel::ConstIterator', 
+                   [param('uint8_t', 'number'), param('uint16_t', 'frequency'), param('uint16_t', 'width'), param('ns3::WifiStandard', 'standard'), param('ns3::WifiPhyBand', 'band'), param('std::set< std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand > > const_iterator', 'start', default_value='ns3::WifiPhyOperatingChannel::m_frequencyChannels.begin()')], 
+                   is_static=True)
+    ## wifi-phy-operating-channel.h (module 'wifi'): static uint8_t ns3::WifiPhyOperatingChannel::GetDefaultChannelNumber(uint16_t width, ns3::WifiStandard standard, ns3::WifiPhyBand band) [member function]
+    cls.add_method('GetDefaultChannelNumber', 
+                   'uint8_t', 
+                   [param('uint16_t', 'width'), param('ns3::WifiStandard', 'standard'), param('ns3::WifiPhyBand', 'band')], 
+                   is_static=True)
     ## wifi-phy-operating-channel.h (module 'wifi'): uint16_t ns3::WifiPhyOperatingChannel::GetFrequency() const [member function]
     cls.add_method('GetFrequency', 
                    'uint16_t', 
@@ -6929,6 +6939,11 @@
                    'uint8_t', 
                    [param('uint16_t', 'primaryChannelWidth')], 
                    is_const=True)
+    ## wifi-phy-operating-channel.h (module 'wifi'): uint8_t ns3::WifiPhyOperatingChannel::GetPrimaryChannelNumber(uint16_t primaryChannelWidth, ns3::WifiStandard standard) const [member function]
+    cls.add_method('GetPrimaryChannelNumber', 
+                   'uint8_t', 
+                   [param('uint16_t', 'primaryChannelWidth'), param('ns3::WifiStandard', 'standard')], 
+                   is_const=True)
     ## wifi-phy-operating-channel.h (module 'wifi'): uint16_t ns3::WifiPhyOperatingChannel::GetWidth() const [member function]
     cls.add_method('GetWidth', 
                    'uint16_t', 
@@ -6939,24 +6954,26 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## wifi-phy-operating-channel.h (module 'wifi'): void ns3::WifiPhyOperatingChannel::Set(uint8_t number, uint16_t frequency, uint16_t width, ns3::WifiPhyStandard standard, ns3::WifiPhyBand band) [member function]
+    ## wifi-phy-operating-channel.h (module 'wifi'): void ns3::WifiPhyOperatingChannel::Set(uint8_t number, uint16_t frequency, uint16_t width, ns3::WifiStandard standard, ns3::WifiPhyBand band) [member function]
     cls.add_method('Set', 
                    'void', 
-                   [param('uint8_t', 'number'), param('uint16_t', 'frequency'), param('uint16_t', 'width'), param('ns3::WifiPhyStandard', 'standard'), param('ns3::WifiPhyBand', 'band')])
-    ## wifi-phy-operating-channel.h (module 'wifi'): void ns3::WifiPhyOperatingChannel::SetDefault(uint16_t width, ns3::WifiPhyStandard standard, ns3::WifiPhyBand band) [member function]
+                   [param('uint8_t', 'number'), param('uint16_t', 'frequency'), param('uint16_t', 'width'), param('ns3::WifiStandard', 'standard'), param('ns3::WifiPhyBand', 'band')])
+    ## wifi-phy-operating-channel.h (module 'wifi'): void ns3::WifiPhyOperatingChannel::SetDefault(uint16_t width, ns3::WifiStandard standard, ns3::WifiPhyBand band) [member function]
     cls.add_method('SetDefault', 
                    'void', 
-                   [param('uint16_t', 'width'), param('ns3::WifiPhyStandard', 'standard'), param('ns3::WifiPhyBand', 'band')])
+                   [param('uint16_t', 'width'), param('ns3::WifiStandard', 'standard'), param('ns3::WifiPhyBand', 'band')])
     ## wifi-phy-operating-channel.h (module 'wifi'): void ns3::WifiPhyOperatingChannel::SetPrimary20Index(uint8_t index) [member function]
     cls.add_method('SetPrimary20Index', 
                    'void', 
                    [param('uint8_t', 'index')])
+    ## wifi-phy-operating-channel.h (module 'wifi'): ns3::WifiPhyOperatingChannel::m_frequencyChannels [variable]
+    cls.add_static_attribute('m_frequencyChannels', 'std::set< std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand > > const', is_const=True)
     return
 
 def register_Ns3WifiProtection_methods(root_module, cls):
     ## wifi-protection.h (module 'wifi'): ns3::WifiProtection::WifiProtection(ns3::WifiProtection::Method m) [constructor]
     cls.add_constructor([param('ns3::WifiProtection::Method', 'm')])
-    ## wifi-protection.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection> > ns3::WifiProtection::Copy() const [member function]
+    ## wifi-protection.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection>> ns3::WifiProtection::Copy() const [member function]
     cls.add_method('Copy', 
                    'std::unique_ptr< ns3::WifiProtection, std::default_delete< ns3::WifiProtection > >', 
                    [], 
@@ -7051,7 +7068,7 @@
 def register_Ns3WifiRtsCtsProtection_methods(root_module, cls):
     ## wifi-protection.h (module 'wifi'): ns3::WifiRtsCtsProtection::WifiRtsCtsProtection() [constructor]
     cls.add_constructor([])
-    ## wifi-protection.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection> > ns3::WifiRtsCtsProtection::Copy() const [member function]
+    ## wifi-protection.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection>> ns3::WifiRtsCtsProtection::Copy() const [member function]
     cls.add_method('Copy', 
                    'std::unique_ptr< ns3::WifiProtection, std::default_delete< ns3::WifiProtection > >', 
                    [], 
@@ -7136,7 +7153,7 @@
                    'ns3::Ptr< ns3::SpectrumValue >', 
                    [param('uint32_t', 'centerFrequency'), param('uint16_t', 'totalChannelWidth'), param('uint32_t', 'bandBandwidth'), param('uint16_t', 'guardBandwidth'), param('std::pair< unsigned int, unsigned int >', 'band')], 
                    is_static=True)
-    ## wifi-spectrum-value-helper.h (module 'spectrum'): static void ns3::WifiSpectrumValueHelper::CreateSpectrumMaskForOfdm(ns3::Ptr<ns3::SpectrumValue> c, std::vector<std::pair<unsigned int, unsigned int>, std::allocator<std::pair<unsigned int, unsigned int> > > allocatedSubBands, ns3::WifiSpectrumBand maskBand, double txPowerPerBandW, uint32_t nGuardBands, uint32_t innerSlopeWidth, double minInnerBandDbr, double minOuterbandDbr, double lowestPointDbr) [member function]
+    ## wifi-spectrum-value-helper.h (module 'spectrum'): static void ns3::WifiSpectrumValueHelper::CreateSpectrumMaskForOfdm(ns3::Ptr<ns3::SpectrumValue> c, std::vector<std::pair<unsigned int, unsigned int>, std::allocator<std::pair<unsigned int, unsigned int>>> allocatedSubBands, ns3::WifiSpectrumBand maskBand, double txPowerPerBandW, uint32_t nGuardBands, uint32_t innerSlopeWidth, double minInnerBandDbr, double minOuterbandDbr, double lowestPointDbr) [member function]
     cls.add_method('CreateSpectrumMaskForOfdm', 
                    'void', 
                    [param('ns3::Ptr< ns3::SpectrumValue >', 'c'), param('std::vector< std::pair< unsigned int, unsigned int > >', 'allocatedSubBands'), param('std::pair< unsigned int, unsigned int >', 'maskBand'), param('double', 'txPowerPerBandW'), param('uint32_t', 'nGuardBands'), param('uint32_t', 'innerSlopeWidth'), param('double', 'minInnerBandDbr'), param('double', 'minOuterbandDbr'), param('double', 'lowestPointDbr')], 
@@ -7163,19 +7180,6 @@
                    is_static=True)
     return
 
-def register_Ns3WifiStandardInfo_methods(root_module, cls):
-    ## wifi-standards.h (module 'wifi'): ns3::WifiStandardInfo::WifiStandardInfo() [constructor]
-    cls.add_constructor([])
-    ## wifi-standards.h (module 'wifi'): ns3::WifiStandardInfo::WifiStandardInfo(ns3::WifiStandardInfo const & arg0) [constructor]
-    cls.add_constructor([param('ns3::WifiStandardInfo const &', 'arg0')])
-    ## wifi-standards.h (module 'wifi'): ns3::WifiStandardInfo::macStandard [variable]
-    cls.add_instance_attribute('macStandard', 'ns3::WifiMacStandard', is_const=False)
-    ## wifi-standards.h (module 'wifi'): ns3::WifiStandardInfo::phyBand [variable]
-    cls.add_instance_attribute('phyBand', 'ns3::WifiPhyBand', is_const=False)
-    ## wifi-standards.h (module 'wifi'): ns3::WifiStandardInfo::phyStandard [variable]
-    cls.add_instance_attribute('phyStandard', 'ns3::WifiPhyStandard', is_const=False)
-    return
-
 def register_Ns3WifiTxParameters_methods(root_module, cls):
     ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters::WifiTxParameters() [constructor]
     cls.add_constructor([])
@@ -7503,7 +7507,7 @@
 def register_Ns3WifiUlMuMultiStaBa_methods(root_module, cls):
     ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiUlMuMultiStaBa::WifiUlMuMultiStaBa() [constructor]
     cls.add_constructor([])
-    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiUlMuMultiStaBa::Copy() const [member function]
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment>> ns3::WifiUlMuMultiStaBa::Copy() const [member function]
     cls.add_method('Copy', 
                    'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
                    [], 
@@ -7572,10 +7576,10 @@
     cls.add_method('SetChannel', 
                    'void', 
                    [param('std::string', 'channelName')])
-    ## yans-wifi-helper.h (module 'wifi'): ns3::Ptr<ns3::WifiPhy> ns3::YansWifiPhyHelper::Create(ns3::Ptr<ns3::Node> node, ns3::Ptr<ns3::NetDevice> device) const [member function]
+    ## yans-wifi-helper.h (module 'wifi'): ns3::Ptr<ns3::WifiPhy> ns3::YansWifiPhyHelper::Create(ns3::Ptr<ns3::Node> node, ns3::Ptr<ns3::WifiNetDevice> device) const [member function]
     cls.add_method('Create', 
                    'ns3::Ptr< ns3::WifiPhy >', 
-                   [param('ns3::Ptr< ns3::Node >', 'node'), param('ns3::Ptr< ns3::NetDevice >', 'device')], 
+                   [param('ns3::Ptr< ns3::Node >', 'node'), param('ns3::Ptr< ns3::WifiNetDevice >', 'device')], 
                    is_const=True, is_virtual=True, visibility='private')
     return
 
@@ -7596,14 +7600,14 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('>=')
     cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_unary_numeric_operator('-')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
     cls.add_constructor([])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(double const value) [constructor]
@@ -7622,6 +7626,8 @@
     cls.add_constructor([param('long unsigned int const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int const v) [constructor]
     cls.add_constructor([param('long long unsigned int const', 'v')])
+    ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int128_t const v) [constructor]
+    cls.add_constructor([param('int128_t const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t const hi, uint64_t const lo) [constructor]
     cls.add_constructor([param('int64_t const', 'hi'), param('uint64_t const', 'lo')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [constructor]
@@ -7834,10 +7840,6 @@
     cls.add_method('SetTcp', 
                    'void', 
                    [param('std::string', 'tid')])
-    ## internet-stack-helper.h (module 'internet'): void ns3::InternetStackHelper::SetTcp(std::string tid, std::string attr, ns3::AttributeValue const & val) [member function]
-    cls.add_method('SetTcp', 
-                   'void', 
-                   [param('std::string', 'tid'), param('std::string', 'attr'), param('ns3::AttributeValue const &', 'val')])
     ## internet-stack-helper.h (module 'internet'): void ns3::InternetStackHelper::EnableAsciiIpv4Internal(ns3::Ptr<ns3::OutputStreamWrapper> stream, std::string prefix, ns3::Ptr<ns3::Ipv4> ipv4, uint32_t interface, bool explicitFilename) [member function]
     cls.add_method('EnableAsciiIpv4Internal', 
                    'void', 
@@ -8463,6 +8465,11 @@
     cls.add_method('SetMaxSize', 
                    'void', 
                    [param('ns3::QueueSize', 'size')])
+    ## queue.h (module 'network'): bool ns3::QueueBase::WouldOverflow(uint32_t nPackets, uint32_t nBytes) const [member function]
+    cls.add_method('WouldOverflow', 
+                   'bool', 
+                   [param('uint32_t', 'nPackets'), param('uint32_t', 'nBytes')], 
+                   is_const=True)
     return
 
 def register_Ns3RandomVariableStream_methods(root_module, cls):
@@ -8549,170 +8556,170 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3ChannelCoordinationListener_Ns3Empty_Ns3DefaultDeleter__lt__ns3ChannelCoordinationListener__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ChannelCoordinationListener, ns3::empty, ns3::DefaultDeleter<ns3::ChannelCoordinationListener> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ChannelCoordinationListener, ns3::empty, ns3::DefaultDeleter<ns3::ChannelCoordinationListener>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ChannelCoordinationListener, ns3::empty, ns3::DefaultDeleter<ns3::ChannelCoordinationListener> >::SimpleRefCount(ns3::SimpleRefCount<ns3::ChannelCoordinationListener, ns3::empty, ns3::DefaultDeleter<ns3::ChannelCoordinationListener> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ChannelCoordinationListener, ns3::empty, ns3::DefaultDeleter<ns3::ChannelCoordinationListener>>::SimpleRefCount(ns3::SimpleRefCount<ns3::ChannelCoordinationListener, ns3::empty, ns3::DefaultDeleter<ns3::ChannelCoordinationListener>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::ChannelCoordinationListener, ns3::empty, ns3::DefaultDeleter< ns3::ChannelCoordinationListener > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Event_Ns3Empty_Ns3DefaultDeleter__lt__ns3Event__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Event, ns3::empty, ns3::DefaultDeleter<ns3::Event> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Event, ns3::empty, ns3::DefaultDeleter<ns3::Event>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Event, ns3::empty, ns3::DefaultDeleter<ns3::Event> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Event, ns3::empty, ns3::DefaultDeleter<ns3::Event> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Event, ns3::empty, ns3::DefaultDeleter<ns3::Event>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Event, ns3::empty, ns3::DefaultDeleter<ns3::Event>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Event, ns3::empty, ns3::DefaultDeleter< ns3::Event > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Ipv4MulticastRoute_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv4MulticastRoute__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter< ns3::Ipv4MulticastRoute > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Ipv4Route_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv4Route__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter< ns3::Ipv4Route > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3MacRxMiddle_Ns3Empty_Ns3DefaultDeleter__lt__ns3MacRxMiddle__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MacRxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacRxMiddle> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MacRxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacRxMiddle>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MacRxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacRxMiddle> >::SimpleRefCount(ns3::SimpleRefCount<ns3::MacRxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacRxMiddle> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MacRxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacRxMiddle>>::SimpleRefCount(ns3::SimpleRefCount<ns3::MacRxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacRxMiddle>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::MacRxMiddle, ns3::empty, ns3::DefaultDeleter< ns3::MacRxMiddle > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3MacTxMiddle_Ns3Empty_Ns3DefaultDeleter__lt__ns3MacTxMiddle__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MacTxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacTxMiddle> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MacTxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacTxMiddle>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MacTxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacTxMiddle> >::SimpleRefCount(ns3::SimpleRefCount<ns3::MacTxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacTxMiddle> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MacTxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacTxMiddle>>::SimpleRefCount(ns3::SimpleRefCount<ns3::MacTxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacTxMiddle>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::MacTxMiddle, ns3::empty, ns3::DefaultDeleter< ns3::MacTxMiddle > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3OutputStreamWrapper_Ns3Empty_Ns3DefaultDeleter__lt__ns3OutputStreamWrapper__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter< ns3::OutputStreamWrapper > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3PhyEntity_Ns3Empty_Ns3DefaultDeleter__lt__ns3PhyEntity__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity> >::SimpleRefCount(ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity>>::SimpleRefCount(ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter< ns3::PhyEntity > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3QueueItem_Ns3Empty_Ns3DefaultDeleter__lt__ns3QueueItem__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> >::SimpleRefCount(ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>>::SimpleRefCount(ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::QueueItem, ns3::empty, ns3::DefaultDeleter< ns3::QueueItem > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3SpectrumModel_Ns3Empty_Ns3DefaultDeleter__lt__ns3SpectrumModel__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel> >::SimpleRefCount(ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel>>::SimpleRefCount(ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter< ns3::SpectrumModel > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3SpectrumValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3SpectrumValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter< ns3::SpectrumValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3WifiInformationElement_Ns3Empty_Ns3DefaultDeleter__lt__ns3WifiInformationElement__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement> >::SimpleRefCount(ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement>>::SimpleRefCount(ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter< ns3::WifiInformationElement > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3WifiMacQueueItem_Ns3Empty_Ns3DefaultDeleter__lt__ns3WifiMacQueueItem__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiMacQueueItem, ns3::empty, ns3::DefaultDeleter<ns3::WifiMacQueueItem> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiMacQueueItem, ns3::empty, ns3::DefaultDeleter<ns3::WifiMacQueueItem>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiMacQueueItem, ns3::empty, ns3::DefaultDeleter<ns3::WifiMacQueueItem> >::SimpleRefCount(ns3::SimpleRefCount<ns3::WifiMacQueueItem, ns3::empty, ns3::DefaultDeleter<ns3::WifiMacQueueItem> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiMacQueueItem, ns3::empty, ns3::DefaultDeleter<ns3::WifiMacQueueItem>>::SimpleRefCount(ns3::SimpleRefCount<ns3::WifiMacQueueItem, ns3::empty, ns3::DefaultDeleter<ns3::WifiMacQueueItem>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::WifiMacQueueItem, ns3::empty, ns3::DefaultDeleter< ns3::WifiMacQueueItem > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3WifiPpdu_Ns3Empty_Ns3DefaultDeleter__lt__ns3WifiPpdu__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiPpdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPpdu> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiPpdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPpdu>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiPpdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPpdu> >::SimpleRefCount(ns3::SimpleRefCount<ns3::WifiPpdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPpdu> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiPpdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPpdu>>::SimpleRefCount(ns3::SimpleRefCount<ns3::WifiPpdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPpdu>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::WifiPpdu, ns3::empty, ns3::DefaultDeleter< ns3::WifiPpdu > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3WifiPsdu_Ns3Empty_Ns3DefaultDeleter__lt__ns3WifiPsdu__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiPsdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPsdu> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiPsdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPsdu>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiPsdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPsdu> >::SimpleRefCount(ns3::SimpleRefCount<ns3::WifiPsdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPsdu> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiPsdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPsdu>>::SimpleRefCount(ns3::SimpleRefCount<ns3::WifiPsdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPsdu>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::WifiPsdu, ns3::empty, ns3::DefaultDeleter< ns3::WifiPsdu > > const &', 'o')])
     return
 
@@ -8835,7 +8842,7 @@
                    'uint8_t', 
                    [param('uint8_t', 'ipTos')], 
                    is_static=True)
-    ## socket.h (module 'network'): void ns3::Socket::Ipv6JoinGroup(ns3::Ipv6Address address, ns3::Socket::Ipv6MulticastFilterMode filterMode, std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address> > sourceAddresses) [member function]
+    ## socket.h (module 'network'): void ns3::Socket::Ipv6JoinGroup(ns3::Ipv6Address address, ns3::Socket::Ipv6MulticastFilterMode filterMode, std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address>> sourceAddresses) [member function]
     cls.add_method('Ipv6JoinGroup', 
                    'void', 
                    [param('ns3::Ipv6Address', 'address'), param('ns3::Socket::Ipv6MulticastFilterMode', 'filterMode'), param('std::vector< ns3::Ipv6Address >', 'sourceAddresses')], 
@@ -9360,16 +9367,16 @@
     cls.add_binary_comparison_operator('==')
     ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(ns3::SpectrumModel const & arg0) [constructor]
     cls.add_constructor([param('ns3::SpectrumModel const &', 'arg0')])
-    ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(std::vector<double, std::allocator<double> > const & centerFreqs) [constructor]
+    ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(std::vector<double, std::allocator<double>> const & centerFreqs) [constructor]
     cls.add_constructor([param('std::vector< double > const &', 'centerFreqs')])
     ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(ns3::Bands const & bands) [constructor]
     cls.add_constructor([param('ns3::Bands const &', 'bands')])
-    ## spectrum-model.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo> >::const_iterator ns3::SpectrumModel::Begin() const [member function]
+    ## spectrum-model.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo>>::const_iterator ns3::SpectrumModel::Begin() const [member function]
     cls.add_method('Begin', 
                    'std::vector< ns3::BandInfo > const_iterator', 
                    [], 
                    is_const=True)
-    ## spectrum-model.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo> >::const_iterator ns3::SpectrumModel::End() const [member function]
+    ## spectrum-model.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo>>::const_iterator ns3::SpectrumModel::End() const [member function]
     cls.add_method('End', 
                    'std::vector< ns3::BandInfo > const_iterator', 
                    [], 
@@ -9416,22 +9423,22 @@
     cls.add_constructor([param('ns3::Ptr< ns3::SpectrumModel const >', 'sm')])
     ## spectrum-value.h (module 'spectrum'): ns3::SpectrumValue::SpectrumValue() [constructor]
     cls.add_constructor([])
-    ## spectrum-value.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo> >::const_iterator ns3::SpectrumValue::ConstBandsBegin() const [member function]
+    ## spectrum-value.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo>>::const_iterator ns3::SpectrumValue::ConstBandsBegin() const [member function]
     cls.add_method('ConstBandsBegin', 
                    'std::vector< ns3::BandInfo > const_iterator', 
                    [], 
                    is_const=True)
-    ## spectrum-value.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo> >::const_iterator ns3::SpectrumValue::ConstBandsEnd() const [member function]
+    ## spectrum-value.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo>>::const_iterator ns3::SpectrumValue::ConstBandsEnd() const [member function]
     cls.add_method('ConstBandsEnd', 
                    'std::vector< ns3::BandInfo > const_iterator', 
                    [], 
                    is_const=True)
-    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double> >::const_iterator ns3::SpectrumValue::ConstValuesBegin() const [member function]
+    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double>>::const_iterator ns3::SpectrumValue::ConstValuesBegin() const [member function]
     cls.add_method('ConstValuesBegin', 
                    'std::vector< double > const_iterator', 
                    [], 
                    is_const=True)
-    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double> >::const_iterator ns3::SpectrumValue::ConstValuesEnd() const [member function]
+    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double>>::const_iterator ns3::SpectrumValue::ConstValuesEnd() const [member function]
     cls.add_method('ConstValuesEnd', 
                    'std::vector< double > const_iterator', 
                    [], 
@@ -9461,11 +9468,11 @@
                    'double const &', 
                    [param('uint32_t', 'pos')], 
                    is_const=True)
-    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double> >::iterator ns3::SpectrumValue::ValuesBegin() [member function]
+    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double>>::iterator ns3::SpectrumValue::ValuesBegin() [member function]
     cls.add_method('ValuesBegin', 
                    'std::vector< double > iterator', 
                    [])
-    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double> >::iterator ns3::SpectrumValue::ValuesEnd() [member function]
+    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double>>::iterator ns3::SpectrumValue::ValuesEnd() [member function]
     cls.add_method('ValuesEnd', 
                    'std::vector< double > iterator', 
                    [])
@@ -9640,11 +9647,6 @@
                    'void', 
                    [], 
                    is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::NotifyChannelSwitching() [member function]
-    cls.add_method('NotifyChannelSwitching', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
     ## txop.h (module 'wifi'): void ns3::Txop::NotifyOff() [member function]
     cls.add_method('NotifyOff', 
                    'void', 
@@ -9703,10 +9705,10 @@
     cls.add_method('SetTxopLimit', 
                    'void', 
                    [param('ns3::Time', 'txopLimit')])
-    ## txop.h (module 'wifi'): void ns3::Txop::SetWifiMac(ns3::Ptr<ns3::RegularWifiMac> const mac) [member function]
+    ## txop.h (module 'wifi'): void ns3::Txop::SetWifiMac(ns3::Ptr<ns3::WifiMac> const mac) [member function]
     cls.add_method('SetWifiMac', 
                    'void', 
-                   [param('ns3::Ptr< ns3::RegularWifiMac > const', 'mac')], 
+                   [param('ns3::Ptr< ns3::WifiMac > const', 'mac')], 
                    is_virtual=True)
     ## txop.h (module 'wifi'): void ns3::Txop::StartBackoffNow(uint32_t nSlots) [member function]
     cls.add_method('StartBackoffNow', 
@@ -10069,7 +10071,7 @@
 def register_Ns3WifiAckAfterTbPpdu_methods(root_module, cls):
     ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiAckAfterTbPpdu::WifiAckAfterTbPpdu() [constructor]
     cls.add_constructor([])
-    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiAckAfterTbPpdu::Copy() const [member function]
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment>> ns3::WifiAckAfterTbPpdu::Copy() const [member function]
     cls.add_method('Copy', 
                    'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
                    [], 
@@ -10108,16 +10110,16 @@
                    'void', 
                    [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('ns3::WifiAcknowledgment const *', 'acknowledgment')], 
                    is_static=True)
-    ## wifi-ack-manager.h (module 'wifi'): void ns3::WifiAckManager::SetWifiMac(ns3::Ptr<ns3::RegularWifiMac> mac) [member function]
+    ## wifi-ack-manager.h (module 'wifi'): void ns3::WifiAckManager::SetWifiMac(ns3::Ptr<ns3::WifiMac> mac) [member function]
     cls.add_method('SetWifiMac', 
                    'void', 
-                   [param('ns3::Ptr< ns3::RegularWifiMac >', 'mac')])
-    ## wifi-ack-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiAckManager::TryAddMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters const & txParams) [member function]
+                   [param('ns3::Ptr< ns3::WifiMac >', 'mac')])
+    ## wifi-ack-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment>> ns3::WifiAckManager::TryAddMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters const & txParams) [member function]
     cls.add_method('TryAddMpdu', 
                    'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::WifiTxParameters const &', 'txParams')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## wifi-ack-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiAckManager::TryAggregateMsdu(ns3::Ptr<const ns3::WifiMacQueueItem> msdu, ns3::WifiTxParameters const & txParams) [member function]
+    ## wifi-ack-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment>> ns3::WifiAckManager::TryAggregateMsdu(ns3::Ptr<const ns3::WifiMacQueueItem> msdu, ns3::WifiTxParameters const & txParams) [member function]
     cls.add_method('TryAggregateMsdu', 
                    'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'msdu'), param('ns3::WifiTxParameters const &', 'txParams')], 
@@ -10132,7 +10134,7 @@
 def register_Ns3WifiCtsToSelfProtection_methods(root_module, cls):
     ## wifi-protection.h (module 'wifi'): ns3::WifiCtsToSelfProtection::WifiCtsToSelfProtection() [constructor]
     cls.add_constructor([])
-    ## wifi-protection.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection> > ns3::WifiCtsToSelfProtection::Copy() const [member function]
+    ## wifi-protection.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection>> ns3::WifiCtsToSelfProtection::Copy() const [member function]
     cls.add_method('Copy', 
                    'std::unique_ptr< ns3::WifiProtection, std::default_delete< ns3::WifiProtection > >', 
                    [], 
@@ -10205,102 +10207,153 @@
     return
 
 def register_Ns3WifiMac_methods(root_module, cls):
+    ## wifi-mac.h (module 'wifi'): static ns3::TypeId ns3::WifiMac::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## wifi-mac.h (module 'wifi'): ns3::WifiMac::WifiMac() [constructor]
     cls.add_constructor([])
-    ## wifi-mac.h (module 'wifi'): ns3::WifiMac::WifiMac(ns3::WifiMac const & arg0) [constructor]
-    cls.add_constructor([param('ns3::WifiMac const &', 'arg0')])
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::ConfigureStandard(ns3::WifiStandard standard) [member function]
-    cls.add_method('ConfigureStandard', 
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetDevice(ns3::Ptr<ns3::WifiNetDevice> const device) [member function]
+    cls.add_method('SetDevice', 
                    'void', 
-                   [param('ns3::WifiStandard', 'standard')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::DoDispose() [member function]
-    cls.add_method('DoDispose', 
+                   [param('ns3::Ptr< ns3::WifiNetDevice > const', 'device')])
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiNetDevice> ns3::WifiMac::GetDevice() const [member function]
+    cls.add_method('GetDevice', 
+                   'ns3::Ptr< ns3::WifiNetDevice >', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::FrameExchangeManager> ns3::WifiMac::GetFrameExchangeManager() const [member function]
+    cls.add_method('GetFrameExchangeManager', 
+                   'ns3::Ptr< ns3::FrameExchangeManager >', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::Txop> ns3::WifiMac::GetTxop() const [member function]
+    cls.add_method('GetTxop', 
+                   'ns3::Ptr< ns3::Txop >', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::WifiMac::GetQosTxop(ns3::AcIndex ac) const [member function]
+    cls.add_method('GetQosTxop', 
+                   'ns3::Ptr< ns3::QosTxop >', 
+                   [param('ns3::AcIndex', 'ac')], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::WifiMac::GetQosTxop(uint8_t tid) const [member function]
+    cls.add_method('GetQosTxop', 
+                   'ns3::Ptr< ns3::QosTxop >', 
+                   [param('uint8_t', 'tid')], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueue> ns3::WifiMac::GetTxopQueue(ns3::AcIndex ac) const [member function]
+    cls.add_method('GetTxopQueue', 
+                   'ns3::Ptr< ns3::WifiMacQueue >', 
+                   [param('ns3::AcIndex', 'ac')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetTypeOfStation(ns3::TypeOfStation type) [member function]
+    cls.add_method('SetTypeOfStation', 
                    'void', 
+                   [param('ns3::TypeOfStation', 'type')])
+    ## wifi-mac.h (module 'wifi'): ns3::TypeOfStation ns3::WifiMac::GetTypeOfStation() const [member function]
+    cls.add_method('GetTypeOfStation', 
+                   'ns3::TypeOfStation', 
                    [], 
-                   is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to, ns3::Mac48Address from) [member function]
-    cls.add_method('Enqueue', 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetSsid(ns3::Ssid ssid) [member function]
+    cls.add_method('SetSsid', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to'), param('ns3::Mac48Address', 'from')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to) [member function]
-    cls.add_method('Enqueue', 
+                   [param('ns3::Ssid', 'ssid')])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetPromisc() [member function]
+    cls.add_method('SetPromisc', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to')], 
-                   is_pure_virtual=True, is_virtual=True)
+                   [])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetCtsToSelfSupported(bool enable) [member function]
+    cls.add_method('SetCtsToSelfSupported', 
+                   'void', 
+                   [param('bool', 'enable')])
     ## wifi-mac.h (module 'wifi'): ns3::Mac48Address ns3::WifiMac::GetAddress() const [member function]
     cls.add_method('GetAddress', 
                    'ns3::Mac48Address', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): ns3::Mac48Address ns3::WifiMac::GetBssid() const [member function]
-    cls.add_method('GetBssid', 
-                   'ns3::Mac48Address', 
-                   [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::NetDevice> ns3::WifiMac::GetDevice() const [member function]
-    cls.add_method('GetDevice', 
-                   'ns3::Ptr< ns3::NetDevice >', 
-                   [], 
                    is_const=True)
-    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::HeConfiguration> ns3::WifiMac::GetHeConfiguration() const [member function]
-    cls.add_method('GetHeConfiguration', 
-                   'ns3::Ptr< ns3::HeConfiguration >', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::HtConfiguration> ns3::WifiMac::GetHtConfiguration() const [member function]
-    cls.add_method('GetHtConfiguration', 
-                   'ns3::Ptr< ns3::HtConfiguration >', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::GetShortSlotTimeSupported() const [member function]
-    cls.add_method('GetShortSlotTimeSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## wifi-mac.h (module 'wifi'): ns3::Ssid ns3::WifiMac::GetSsid() const [member function]
     cls.add_method('GetSsid', 
                    'ns3::Ssid', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): static ns3::TypeId ns3::WifiMac::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## wifi-mac.h (module 'wifi'): ns3::TypeOfStation ns3::WifiMac::GetTypeOfStation() const [member function]
-    cls.add_method('GetTypeOfStation', 
-                   'ns3::TypeOfStation', 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetAddress(ns3::Mac48Address address) [member function]
+    cls.add_method('SetAddress', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Mac48Address ns3::WifiMac::GetBssid() const [member function]
+    cls.add_method('GetBssid', 
+                   'ns3::Mac48Address', 
                    [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetBssid(ns3::Mac48Address bssid) [member function]
+    cls.add_method('SetBssid', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'bssid')])
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::CanForwardPacketsTo(ns3::Mac48Address to) const [member function]
+    cls.add_method('CanForwardPacketsTo', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'to')], 
                    is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::VhtConfiguration> ns3::WifiMac::GetVhtConfiguration() const [member function]
-    cls.add_method('GetVhtConfiguration', 
-                   'ns3::Ptr< ns3::VhtConfiguration >', 
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to, ns3::Mac48Address from) [member function]
+    cls.add_method('Enqueue', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to'), param('ns3::Mac48Address', 'from')], 
+                   is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to) [member function]
+    cls.add_method('Enqueue', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::SupportsSendFrom() const [member function]
+    cls.add_method('SupportsSendFrom', 
+                   'bool', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetWifiPhy(ns3::Ptr<ns3::WifiPhy> phy) [member function]
+    cls.add_method('SetWifiPhy', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPhy >', 'phy')], 
+                   is_virtual=True)
     ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiPhy> ns3::WifiMac::GetWifiPhy() const [member function]
     cls.add_method('GetWifiPhy', 
                    'ns3::Ptr< ns3::WifiPhy >', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::ResetWifiPhy() [member function]
+    cls.add_method('ResetWifiPhy', 
+                   'void', 
+                   [])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetWifiRemoteStationManager(ns3::Ptr<ns3::WifiRemoteStationManager> stationManager) [member function]
+    cls.add_method('SetWifiRemoteStationManager', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiRemoteStationManager >', 'stationManager')])
     ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiRemoteStationManager> ns3::WifiMac::GetWifiRemoteStationManager() const [member function]
     cls.add_method('GetWifiRemoteStationManager', 
                    'ns3::Ptr< ns3::WifiRemoteStationManager >', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyPromiscRx(ns3::Ptr<const ns3::Packet> packet) [member function]
-    cls.add_method('NotifyPromiscRx', 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetForwardUpCallback(ns3::WifiMac::ForwardUpCallback upCallback) [member function]
+    cls.add_method('SetForwardUpCallback', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyRx(ns3::Ptr<const ns3::Packet> packet) [member function]
-    cls.add_method('NotifyRx', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'upCallback')])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetLinkUpCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkUp) [member function]
+    cls.add_method('SetLinkUpCallback', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyRxDrop(ns3::Ptr<const ns3::Packet> packet) [member function]
-    cls.add_method('NotifyRxDrop', 
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkUp')], 
+                   is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetLinkDownCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkDown) [member function]
+    cls.add_method('SetLinkDownCallback', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkDown')])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyChannelSwitching() [member function]
+    cls.add_method('NotifyChannelSwitching', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
     ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyTx(ns3::Ptr<const ns3::Packet> packet) [member function]
     cls.add_method('NotifyTx', 
                    'void', 
@@ -10309,75 +10362,163 @@
     cls.add_method('NotifyTxDrop', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet const >', 'packet')])
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::ResetWifiPhy() [member function]
-    cls.add_method('ResetWifiPhy', 
-                   'void', 
-                   [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetAddress(ns3::Mac48Address address) [member function]
-    cls.add_method('SetAddress', 
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyRx(ns3::Ptr<const ns3::Packet> packet) [member function]
+    cls.add_method('NotifyRx', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetDevice(ns3::Ptr<ns3::NetDevice> const device) [member function]
-    cls.add_method('SetDevice', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyPromiscRx(ns3::Ptr<const ns3::Packet> packet) [member function]
+    cls.add_method('NotifyPromiscRx', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NetDevice > const', 'device')])
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetForwardUpCallback(ns3::WifiMac::ForwardUpCallback upCallback) [member function]
-    cls.add_method('SetForwardUpCallback', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyRxDrop(ns3::Ptr<const ns3::Packet> packet) [member function]
+    cls.add_method('NotifyRxDrop', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'upCallback')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetLinkDownCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkDown) [member function]
-    cls.add_method('SetLinkDownCallback', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::ConfigureStandard(ns3::WifiStandard standard) [member function]
+    cls.add_method('ConfigureStandard', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkDown')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetLinkUpCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkUp) [member function]
-    cls.add_method('SetLinkUpCallback', 
+                   [param('ns3::WifiStandard', 'standard')], 
+                   is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::HtConfiguration> ns3::WifiMac::GetHtConfiguration() const [member function]
+    cls.add_method('GetHtConfiguration', 
+                   'ns3::Ptr< ns3::HtConfiguration >', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::VhtConfiguration> ns3::WifiMac::GetVhtConfiguration() const [member function]
+    cls.add_method('GetVhtConfiguration', 
+                   'ns3::Ptr< ns3::VhtConfiguration >', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::HeConfiguration> ns3::WifiMac::GetHeConfiguration() const [member function]
+    cls.add_method('GetHeConfiguration', 
+                   'ns3::Ptr< ns3::HeConfiguration >', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::ExtendedCapabilities ns3::WifiMac::GetExtendedCapabilities() const [member function]
+    cls.add_method('GetExtendedCapabilities', 
+                   'ns3::ExtendedCapabilities', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::HtCapabilities ns3::WifiMac::GetHtCapabilities() const [member function]
+    cls.add_method('GetHtCapabilities', 
+                   'ns3::HtCapabilities', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::VhtCapabilities ns3::WifiMac::GetVhtCapabilities() const [member function]
+    cls.add_method('GetVhtCapabilities', 
+                   'ns3::VhtCapabilities', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::HeCapabilities ns3::WifiMac::GetHeCapabilities() const [member function]
+    cls.add_method('GetHeCapabilities', 
+                   'ns3::HeCapabilities', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::GetQosSupported() const [member function]
+    cls.add_method('GetQosSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::GetErpSupported() const [member function]
+    cls.add_method('GetErpSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::GetDsssSupported() const [member function]
+    cls.add_method('GetDsssSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::GetHtSupported() const [member function]
+    cls.add_method('GetHtSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::GetVhtSupported() const [member function]
+    cls.add_method('GetVhtSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::GetHeSupported() const [member function]
+    cls.add_method('GetHeSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): uint32_t ns3::WifiMac::GetMaxAmpduSize(ns3::AcIndex ac) const [member function]
+    cls.add_method('GetMaxAmpduSize', 
+                   'uint32_t', 
+                   [param('ns3::AcIndex', 'ac')], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): uint16_t ns3::WifiMac::GetMaxAmsduSize(ns3::AcIndex ac) const [member function]
+    cls.add_method('GetMaxAmsduSize', 
+                   'uint16_t', 
+                   [param('ns3::AcIndex', 'ac')], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkUp')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetPromisc() [member function]
-    cls.add_method('SetPromisc', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::DoDispose() [member function]
+    cls.add_method('DoDispose', 
                    'void', 
                    [], 
-                   is_pure_virtual=True, is_virtual=True)
+                   is_virtual=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::ConfigureContentionWindow(uint32_t cwMin, uint32_t cwMax) [member function]
+    cls.add_method('ConfigureContentionWindow', 
+                   'void', 
+                   [param('uint32_t', 'cwMin'), param('uint32_t', 'cwMax')], 
+                   is_virtual=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetQosSupported(bool enable) [member function]
+    cls.add_method('SetQosSupported', 
+                   'void', 
+                   [param('bool', 'enable')], 
+                   visibility='protected')
     ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetShortSlotTimeSupported(bool enable) [member function]
     cls.add_method('SetShortSlotTimeSupported', 
                    'void', 
                    [param('bool', 'enable')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetSsid(ns3::Ssid ssid) [member function]
-    cls.add_method('SetSsid', 
-                   'void', 
-                   [param('ns3::Ssid', 'ssid')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetTypeOfStation(ns3::TypeOfStation type) [member function]
-    cls.add_method('SetTypeOfStation', 
-                   'void', 
-                   [param('ns3::TypeOfStation', 'type')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetWifiPhy(ns3::Ptr<ns3::WifiPhy> phy) [member function]
-    cls.add_method('SetWifiPhy', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiPhy >', 'phy')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetWifiRemoteStationManager(ns3::Ptr<ns3::WifiRemoteStationManager> stationManager) [member function]
-    cls.add_method('SetWifiRemoteStationManager', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiRemoteStationManager >', 'stationManager')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::SupportsSendFrom() const [member function]
-    cls.add_method('SupportsSendFrom', 
+                   visibility='protected')
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::GetShortSlotTimeSupported() const [member function]
+    cls.add_method('GetShortSlotTimeSupported', 
                    'bool', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::ConfigureDcf(ns3::Ptr<ns3::Txop> dcf, uint32_t cwmin, uint32_t cwmax, bool isDsss, ns3::AcIndex ac) [member function]
-    cls.add_method('ConfigureDcf', 
+                   is_const=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::WifiMac::GetVOQueue() const [member function]
+    cls.add_method('GetVOQueue', 
+                   'ns3::Ptr< ns3::QosTxop >', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::WifiMac::GetVIQueue() const [member function]
+    cls.add_method('GetVIQueue', 
+                   'ns3::Ptr< ns3::QosTxop >', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::WifiMac::GetBEQueue() const [member function]
+    cls.add_method('GetBEQueue', 
+                   'ns3::Ptr< ns3::QosTxop >', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::WifiMac::GetBKQueue() const [member function]
+    cls.add_method('GetBKQueue', 
+                   'ns3::Ptr< ns3::QosTxop >', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::Receive(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('Receive', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
+                   is_virtual=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::ForwardUp(ns3::Ptr<const ns3::Packet> packet, ns3::Mac48Address from, ns3::Mac48Address to) [member function]
+    cls.add_method('ForwardUp', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Txop >', 'dcf'), param('uint32_t', 'cwmin'), param('uint32_t', 'cwmax'), param('bool', 'isDsss'), param('ns3::AcIndex', 'ac')], 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::Mac48Address', 'from'), param('ns3::Mac48Address', 'to')], 
                    visibility='protected')
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::DeaggregateAmsduAndForward(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('DeaggregateAmsduAndForward', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
+                   is_virtual=True, visibility='protected')
     return
 
 def register_Ns3WifiMacHeader_methods(root_module, cls):
@@ -10815,6 +10956,11 @@
     cls.add_method('GetHeader', 
                    'ns3::WifiMacHeader &', 
                    [])
+    ## wifi-mac-queue-item.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::WifiMacQueueItem::GetItem() const [member function]
+    cls.add_method('GetItem', 
+                   'ns3::Ptr< ns3::WifiMacQueueItem >', 
+                   [], 
+                   is_const=True)
     ## wifi-mac-queue-item.h (module 'wifi'): ns3::Ptr<const ns3::Packet> ns3::WifiMacQueueItem::GetPacket() const [member function]
     cls.add_method('GetPacket', 
                    'ns3::Ptr< ns3::Packet const >', 
@@ -10835,11 +10981,6 @@
                    'ns3::AcIndex', 
                    [], 
                    is_const=True)
-    ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem::ConstIterator ns3::WifiMacQueueItem::GetQueueIterator() const [member function]
-    cls.add_method('GetQueueIterator', 
-                   'ns3::WifiMacQueueItem::ConstIterator', 
-                   [], 
-                   is_const=True)
     ## wifi-mac-queue-item.h (module 'wifi'): uint32_t ns3::WifiMacQueueItem::GetSize() const [member function]
     cls.add_method('GetSize', 
                    'uint32_t', 
@@ -10891,7 +11032,7 @@
 def register_Ns3WifiNoProtection_methods(root_module, cls):
     ## wifi-protection.h (module 'wifi'): ns3::WifiNoProtection::WifiNoProtection() [constructor]
     cls.add_constructor([])
-    ## wifi-protection.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection> > ns3::WifiNoProtection::Copy() const [member function]
+    ## wifi-protection.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection>> ns3::WifiNoProtection::Copy() const [member function]
     cls.add_method('Copy', 
                    'std::unique_ptr< ns3::WifiProtection, std::default_delete< ns3::WifiProtection > >', 
                    [], 
@@ -10913,8 +11054,6 @@
                    is_static=True)
     ## wifi-phy.h (module 'wifi'): ns3::WifiPhy::WifiPhy() [constructor]
     cls.add_constructor([])
-    ## wifi-phy.h (module 'wifi'): ns3::WifiPhy::m_frequencyChannels [variable]
-    cls.add_static_attribute('m_frequencyChannels', 'std::set< std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand > > const', is_const=True)
     ## wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::WifiPhyStateHelper> ns3::WifiPhy::GetState() const [member function]
     cls.add_method('GetState', 
                    'ns3::Ptr< ns3::WifiPhyStateHelper >', 
@@ -10961,10 +11100,10 @@
     cls.add_method('Send', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::Send(ns3::WifiConstPsduMap psdus, ns3::WifiTxVector txVector) [member function]
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::Send(ns3::WifiConstPsduMap psdus, ns3::WifiTxVector const & txVector) [member function]
     cls.add_method('Send', 
                    'void', 
-                   [param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'psdus'), param('ns3::WifiTxVector', 'txVector')])
+                   [param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'psdus'), param('ns3::WifiTxVector const &', 'txVector')])
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::StartTx(ns3::Ptr<ns3::WifiPpdu> ppdu) [member function]
     cls.add_method('StartTx', 
                    'void', 
@@ -11075,12 +11214,12 @@
                    'ns3::Time', 
                    [param('ns3::WifiTxVector const &', 'txVector')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> > ns3::WifiPhy::GetModeList() const [member function]
+    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode>> ns3::WifiPhy::GetModeList() const [member function]
     cls.add_method('GetModeList', 
                    'std::list< ns3::WifiMode >', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> > ns3::WifiPhy::GetModeList(ns3::WifiModulationClass modulation) const [member function]
+    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode>> ns3::WifiPhy::GetModeList(ns3::WifiModulationClass modulation) const [member function]
     cls.add_method('GetModeList', 
                    'std::list< ns3::WifiMode >', 
                    [param('ns3::WifiModulationClass', 'modulation')], 
@@ -11147,7 +11286,7 @@
                    'uint32_t', 
                    [param('ns3::WifiModulationClass', 'modulation')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): std::list<unsigned char, std::allocator<unsigned char> > ns3::WifiPhy::GetBssMembershipSelectorList() const [member function]
+    ## wifi-phy.h (module 'wifi'): std::list<unsigned char, std::allocator<unsigned char>> ns3::WifiPhy::GetBssMembershipSelectorList() const [member function]
     cls.add_method('GetBssMembershipSelectorList', 
                    'std::list< unsigned char >', 
                    [], 
@@ -11157,12 +11296,12 @@
                    'uint16_t', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> > ns3::WifiPhy::GetMcsList() const [member function]
+    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode>> ns3::WifiPhy::GetMcsList() const [member function]
     cls.add_method('GetMcsList', 
                    'std::list< ns3::WifiMode >', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> > ns3::WifiPhy::GetMcsList(ns3::WifiModulationClass modulation) const [member function]
+    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode>> ns3::WifiPhy::GetMcsList(ns3::WifiModulationClass modulation) const [member function]
     cls.add_method('GetMcsList', 
                    'std::list< ns3::WifiMode >', 
                    [param('ns3::WifiModulationClass', 'modulation')], 
@@ -11172,11 +11311,6 @@
                    'ns3::WifiMode', 
                    [param('ns3::WifiModulationClass', 'modulation'), param('uint8_t', 'mcs')], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetChannelNumber(uint8_t id) [member function]
-    cls.add_method('SetChannelNumber', 
-                   'void', 
-                   [param('uint8_t', 'id')], 
-                   is_virtual=True)
     ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetChannelNumber() const [member function]
     cls.add_method('GetChannelNumber', 
                    'uint8_t', 
@@ -11187,14 +11321,14 @@
                    'ns3::Time', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::ConfigureStandardAndBand(ns3::WifiPhyStandard standard, ns3::WifiPhyBand band) [member function]
-    cls.add_method('ConfigureStandardAndBand', 
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::ConfigureStandard(ns3::WifiStandard standard) [member function]
+    cls.add_method('ConfigureStandard', 
                    'void', 
-                   [param('ns3::WifiPhyStandard', 'standard'), param('ns3::WifiPhyBand', 'band')], 
+                   [param('ns3::WifiStandard', 'standard')], 
                    is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): ns3::WifiPhyStandard ns3::WifiPhy::GetPhyStandard() const [member function]
-    cls.add_method('GetPhyStandard', 
-                   'ns3::WifiPhyStandard', 
+    ## wifi-phy.h (module 'wifi'): ns3::WifiStandard ns3::WifiPhy::GetStandard() const [member function]
+    cls.add_method('GetStandard', 
+                   'ns3::WifiStandard', 
                    [], 
                    is_const=True)
     ## wifi-phy.h (module 'wifi'): ns3::WifiPhyBand ns3::WifiPhy::GetPhyBand() const [member function]
@@ -11236,7 +11370,7 @@
     cls.add_method('NotifyRxDrop', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiPhyRxfailureReason', 'reason')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyMonitorSniffRx(ns3::Ptr<const ns3::WifiPsdu> psdu, uint16_t channelFreqMhz, ns3::WifiTxVector txVector, ns3::SignalNoiseDbm signalNoise, std::vector<bool, std::allocator<bool> > statusPerMpdu, uint16_t staId=65535) [member function]
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyMonitorSniffRx(ns3::Ptr<const ns3::WifiPsdu> psdu, uint16_t channelFreqMhz, ns3::WifiTxVector txVector, ns3::SignalNoiseDbm signalNoise, std::vector<bool, std::allocator<bool>> statusPerMpdu, uint16_t staId=65535) [member function]
     cls.add_method('NotifyMonitorSniffRx', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('uint16_t', 'channelFreqMhz'), param('ns3::WifiTxVector', 'txVector'), param('ns3::SignalNoiseDbm', 'signalNoise'), param('std::vector< bool >', 'statusPerMpdu'), param('uint16_t', 'staId', default_value='65535')])
@@ -11316,13 +11450,13 @@
                    'double', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetDevice(ns3::Ptr<ns3::NetDevice> const device) [member function]
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetDevice(ns3::Ptr<ns3::WifiNetDevice> const device) [member function]
     cls.add_method('SetDevice', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NetDevice > const', 'device')])
-    ## wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::NetDevice> ns3::WifiPhy::GetDevice() const [member function]
+                   [param('ns3::Ptr< ns3::WifiNetDevice > const', 'device')])
+    ## wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::WifiNetDevice> ns3::WifiPhy::GetDevice() const [member function]
     cls.add_method('GetDevice', 
-                   'ns3::Ptr< ns3::NetDevice >', 
+                   'ns3::Ptr< ns3::WifiNetDevice >', 
                    [], 
                    is_const=True)
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetMobility(ns3::Ptr<ns3::MobilityModel> const mobility) [member function]
@@ -11334,24 +11468,20 @@
                    'ns3::Ptr< ns3::MobilityModel >', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetOperatingChannel(uint8_t number, uint16_t frequency, uint16_t width) [member function]
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetOperatingChannel(ns3::WifiPhy::ChannelTuple const & channelTuple) [member function]
     cls.add_method('SetOperatingChannel', 
                    'void', 
-                   [param('uint8_t', 'number'), param('uint16_t', 'frequency'), param('uint16_t', 'width')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetFrequency(uint16_t freq) [member function]
-    cls.add_method('SetFrequency', 
-                   'void', 
-                   [param('uint16_t', 'freq')], 
-                   is_virtual=True)
+                   [param('ns3::WifiPhy::ChannelTuple const &', 'channelTuple')])
     ## wifi-phy.h (module 'wifi'): uint16_t ns3::WifiPhy::GetFrequency() const [member function]
     cls.add_method('GetFrequency', 
                    'uint16_t', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetPrimary20Index(uint8_t index) [member function]
-    cls.add_method('SetPrimary20Index', 
-                   'void', 
-                   [param('uint8_t', 'index')])
+    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetPrimary20Index() const [member function]
+    cls.add_method('GetPrimary20Index', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetNumberOfAntennas(uint8_t antennas) [member function]
     cls.add_method('SetNumberOfAntennas', 
                    'void', 
@@ -11413,16 +11543,11 @@
                    'uint16_t', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetChannelWidth(uint16_t channelWidth) [member function]
-    cls.add_method('SetChannelWidth', 
-                   'void', 
-                   [param('uint16_t', 'channelWidth')], 
-                   is_virtual=True)
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::AddSupportedChannelWidth(uint16_t width) [member function]
     cls.add_method('AddSupportedChannelWidth', 
                    'void', 
                    [param('uint16_t', 'width')])
-    ## wifi-phy.h (module 'wifi'): std::vector<unsigned short, std::allocator<unsigned short> > ns3::WifiPhy::GetSupportedChannelWidthSet() const [member function]
+    ## wifi-phy.h (module 'wifi'): std::vector<unsigned short, std::allocator<unsigned short>> ns3::WifiPhy::GetSupportedChannelWidthSet() const [member function]
     cls.add_method('GetSupportedChannelWidthSet', 
                    'std::vector< unsigned short >', 
                    [], 
@@ -11480,6 +11605,11 @@
                    'std::tuple< double, double, double >', 
                    [], 
                    is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetPrimaryChannelNumber(uint16_t primaryChannelWidth) const [member function]
+    cls.add_method('GetPrimaryChannelNumber', 
+                   'uint8_t', 
+                   [param('uint16_t', 'primaryChannelWidth')], 
+                   is_const=True)
     ## wifi-phy.h (module 'wifi'): ns3::WifiPhy::WifiPhy(ns3::WifiPhy const & arg0) [constructor]
     cls.add_constructor([param('ns3::WifiPhy const &', 'arg0')])
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::DoDispose() [member function]
@@ -11492,11 +11622,16 @@
                    'void', 
                    [], 
                    visibility='protected')
-    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::DoChannelSwitch() [member function]
-    cls.add_method('DoChannelSwitch', 
+    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetDelayUntilChannelSwitch() [member function]
+    cls.add_method('GetDelayUntilChannelSwitch', 
                    'ns3::Time', 
                    [], 
                    visibility='protected')
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::DoChannelSwitch() [member function]
+    cls.add_method('DoChannelSwitch', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SwitchMaybeToCcaBusy(uint16_t channelWidth) [member function]
     cls.add_method('SwitchMaybeToCcaBusy', 
                    'void', 
@@ -11617,7 +11752,7 @@
     cls.add_method('SwitchFromRxEndError', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('double', 'snr')])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchFromRxEndOk(ns3::Ptr<ns3::WifiPsdu> psdu, ns3::RxSignalInfo rxSignalInfo, ns3::WifiTxVector txVector, uint16_t staId, std::vector<bool, std::allocator<bool> > statusPerMpdu) [member function]
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchFromRxEndOk(ns3::Ptr<ns3::WifiPsdu> psdu, ns3::RxSignalInfo rxSignalInfo, ns3::WifiTxVector txVector, uint16_t staId, std::vector<bool, std::allocator<bool>> statusPerMpdu) [member function]
     cls.add_method('SwitchFromRxEndOk', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('ns3::RxSignalInfo', 'rxSignalInfo'), param('ns3::WifiTxVector', 'txVector'), param('uint16_t', 'staId'), param('std::vector< bool >', 'statusPerMpdu')])
@@ -11753,16 +11888,16 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## wifi-protection-manager.h (module 'wifi'): void ns3::WifiProtectionManager::SetWifiMac(ns3::Ptr<ns3::RegularWifiMac> mac) [member function]
+    ## wifi-protection-manager.h (module 'wifi'): void ns3::WifiProtectionManager::SetWifiMac(ns3::Ptr<ns3::WifiMac> mac) [member function]
     cls.add_method('SetWifiMac', 
                    'void', 
-                   [param('ns3::Ptr< ns3::RegularWifiMac >', 'mac')])
-    ## wifi-protection-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection> > ns3::WifiProtectionManager::TryAddMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters const & txParams) [member function]
+                   [param('ns3::Ptr< ns3::WifiMac >', 'mac')])
+    ## wifi-protection-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection>> ns3::WifiProtectionManager::TryAddMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters const & txParams) [member function]
     cls.add_method('TryAddMpdu', 
                    'std::unique_ptr< ns3::WifiProtection, std::default_delete< ns3::WifiProtection > >', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::WifiTxParameters const &', 'txParams')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## wifi-protection-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection> > ns3::WifiProtectionManager::TryAggregateMsdu(ns3::Ptr<const ns3::WifiMacQueueItem> msdu, ns3::WifiTxParameters const & txParams) [member function]
+    ## wifi-protection-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection>> ns3::WifiProtectionManager::TryAggregateMsdu(ns3::Ptr<const ns3::WifiMacQueueItem> msdu, ns3::WifiTxParameters const & txParams) [member function]
     cls.add_method('TryAggregateMsdu', 
                    'std::unique_ptr< ns3::WifiProtection, std::default_delete< ns3::WifiProtection > >', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'msdu'), param('ns3::WifiTxParameters const &', 'txParams')], 
@@ -11784,7 +11919,7 @@
     cls.add_constructor([param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('bool', 'isSingle')])
     ## wifi-psdu.h (module 'wifi'): ns3::WifiPsdu::WifiPsdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, bool isSingle) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('bool', 'isSingle')])
-    ## wifi-psdu.h (module 'wifi'): ns3::WifiPsdu::WifiPsdu(std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > > mpduList) [constructor]
+    ## wifi-psdu.h (module 'wifi'): ns3::WifiPsdu::WifiPsdu(std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem>>> mpduList) [constructor]
     cls.add_constructor([param('std::vector< ns3::Ptr< ns3::WifiMacQueueItem > >', 'mpduList')])
     ## wifi-psdu.h (module 'wifi'): ns3::WifiMacHeader::QosAckPolicy ns3::WifiPsdu::GetAckPolicyForTid(uint8_t tid) const [member function]
     cls.add_method('GetAckPolicyForTid', 
@@ -11850,7 +11985,7 @@
                    'uint32_t', 
                    [], 
                    is_const=True)
-    ## wifi-psdu.h (module 'wifi'): std::set<unsigned char, std::less<unsigned char>, std::allocator<unsigned char> > ns3::WifiPsdu::GetTids() const [member function]
+    ## wifi-psdu.h (module 'wifi'): std::set<unsigned char, std::less<unsigned char>, std::allocator<unsigned char>> ns3::WifiPsdu::GetTids() const [member function]
     cls.add_method('GetTids', 
                    'std::set< unsigned char >', 
                    [], 
@@ -11883,21 +12018,21 @@
     cls.add_method('SetDuration', 
                    'void', 
                    [param('ns3::Time', 'duration')])
-    ## wifi-psdu.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > >::const_iterator ns3::WifiPsdu::begin() const [member function]
+    ## wifi-psdu.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem>>>::const_iterator ns3::WifiPsdu::begin() const [member function]
     cls.add_method('begin', 
                    'std::vector< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 
                    [], 
                    is_const=True)
-    ## wifi-psdu.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > >::iterator ns3::WifiPsdu::begin() [member function]
+    ## wifi-psdu.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem>>>::iterator ns3::WifiPsdu::begin() [member function]
     cls.add_method('begin', 
                    'std::vector< ns3::Ptr< ns3::WifiMacQueueItem > > iterator', 
                    [])
-    ## wifi-psdu.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > >::const_iterator ns3::WifiPsdu::end() const [member function]
+    ## wifi-psdu.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem>>>::const_iterator ns3::WifiPsdu::end() const [member function]
     cls.add_method('end', 
                    'std::vector< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 
                    [], 
                    is_const=True)
-    ## wifi-psdu.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > >::iterator ns3::WifiPsdu::end() [member function]
+    ## wifi-psdu.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem>>>::iterator ns3::WifiPsdu::end() [member function]
     cls.add_method('end', 
                    'std::vector< ns3::Ptr< ns3::WifiMacQueueItem > > iterator', 
                    [])
@@ -12878,7 +13013,7 @@
     cls.add_method('NotifyMissedAck', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')])
-    ## block-ack-manager.h (module 'wifi'): std::pair<unsigned short, unsigned short> ns3::BlockAckManager::NotifyGotBlockAck(ns3::CtrlBAckResponseHeader const & blockAck, ns3::Mac48Address recipient, std::set<unsigned char, std::less<unsigned char>, std::allocator<unsigned char> > const & tids, size_t index=0) [member function]
+    ## block-ack-manager.h (module 'wifi'): std::pair<unsigned short, unsigned short> ns3::BlockAckManager::NotifyGotBlockAck(ns3::CtrlBAckResponseHeader const & blockAck, ns3::Mac48Address recipient, std::set<unsigned char, std::less<unsigned char>, std::allocator<unsigned char>> const & tids, size_t index=0) [member function]
     cls.add_method('NotifyGotBlockAck', 
                    'std::pair< unsigned short, unsigned short >', 
                    [param('ns3::CtrlBAckResponseHeader const &', 'blockAck'), param('ns3::Mac48Address', 'recipient'), param('std::set< unsigned char > const &', 'tids'), param('size_t', 'index', default_value='0')])
@@ -13042,7 +13177,7 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## bsm-application.h (module 'wave'): void ns3::BsmApplication::Setup(ns3::Ipv4InterfaceContainer & i, int nodeId, ns3::Time totalTime, uint32_t wavePacketSize, ns3::Time waveInterval, double gpsAccuracyNs, std::vector<double, std::allocator<double> > rangesSq, ns3::Ptr<ns3::WaveBsmStats> waveBsmStats, std::vector<int, std::allocator<int> > * nodesMoving, int mode, ns3::Time txDelay) [member function]
+    ## bsm-application.h (module 'wave'): void ns3::BsmApplication::Setup(ns3::Ipv4InterfaceContainer & i, int nodeId, ns3::Time totalTime, uint32_t wavePacketSize, ns3::Time waveInterval, double gpsAccuracyNs, std::vector<double, std::allocator<double>> rangesSq, ns3::Ptr<ns3::WaveBsmStats> waveBsmStats, std::vector<int, std::allocator<int>> * nodesMoving, int mode, ns3::Time txDelay) [member function]
     cls.add_method('Setup', 
                    'void', 
                    [param('ns3::Ipv4InterfaceContainer &', 'i'), param('int', 'nodeId'), param('ns3::Time', 'totalTime'), param('uint32_t', 'wavePacketSize'), param('ns3::Time', 'waveInterval'), param('double', 'gpsAccuracyNs'), param('std::vector< double >', 'rangesSq'), param('ns3::Ptr< ns3::WaveBsmStats >', 'waveBsmStats'), param('std::vector< int > *', 'nodesMoving'), param('int', 'mode'), param('ns3::Time', 'txDelay')])
@@ -13096,17 +13231,12 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['void'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiMacQueueItem const> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::ObjectBase*'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::ObjectBase*'], visibility='protected')
+                   is_static=True, template_parameters=['void'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
@@ -13181,12 +13311,12 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['unsigned long long'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::MobilityModel const> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['unsigned char'], visibility='protected')
+                   is_static=True, template_parameters=['unsigned long long'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
@@ -13196,137 +13326,142 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Mac48Address'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Time'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Time'], visibility='protected')
+                   is_static=True, template_parameters=['WifiPhyState'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::OriginatorBlockAckAgreement::State'], visibility='protected')
+                   is_static=True, template_parameters=['double'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::WifiMacDropReason'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::WifiMode'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::WifiMacHeader const&'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::WifiPreamble'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiPsdu const> '], visibility='protected')
+                   is_static=True, template_parameters=['unsigned char'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['std::unordered_map<unsigned short', ' ns3::Ptr<ns3::WifiPsdu>', ' std::hash<unsigned short>', ' std::equal_to<unsigned short>', ' std::allocator<std::pair<unsigned short const', ' ns3::Ptr<ns3::WifiPsdu> > > >*'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiPsdu> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['std::set<ns3::Mac48Address', ' std::less<ns3::Mac48Address>', ' std::allocator<ns3::Mac48Address> > const*'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::RxSignalInfo'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::QueueDiscItem const> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::WifiTxVector'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiMac> '], visibility='protected')
+                   is_static=True, template_parameters=['std::vector<bool', ' std::allocator<bool> > '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::OrganizationIdentifier const&'], visibility='protected')
+                   is_static=True, template_parameters=['std::unordered_map<unsigned short', ' ns3::Ptr<ns3::WifiPsdu const>', ' std::hash<unsigned short>', ' std::equal_to<unsigned short>', ' std::allocator<std::pair<unsigned short const', ' ns3::Ptr<ns3::WifiPsdu const> > > > '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Address'], visibility='protected')
+                   is_static=True, template_parameters=['std::map<std::pair<unsigned int', ' unsigned int>', ' double', ' std::less<std::pair<unsigned int', ' unsigned int> >', ' std::allocator<std::pair<std::pair<unsigned int', ' unsigned int> const', ' double> > > '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::MobilityModel const> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::WifiPhyRxfailureReason'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiMacQueueItem> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::MpduInfo'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['WifiPhyState'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::SignalNoiseDbm'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['double'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Mac48Address'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::WifiMode'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::WifiMacHeader const&'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::WifiPreamble'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::WifiMacDropReason'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiPsdu> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiMacQueueItem const> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::RxSignalInfo'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiPsdu const> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::WifiTxVector'], visibility='protected')
+                   is_static=True, template_parameters=['std::unordered_map<unsigned short', ' ns3::Ptr<ns3::WifiPsdu>', ' std::hash<unsigned short>', ' std::equal_to<unsigned short>', ' std::allocator<std::pair<unsigned short const', ' ns3::Ptr<ns3::WifiPsdu> > > >*'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['std::vector<bool', ' std::allocator<bool> > '], visibility='protected')
+                   is_static=True, template_parameters=['std::set<ns3::Mac48Address', ' std::less<ns3::Mac48Address>', ' std::allocator<ns3::Mac48Address> > const*'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['std::unordered_map<unsigned short', ' ns3::Ptr<ns3::WifiPsdu const>', ' std::hash<unsigned short>', ' std::equal_to<unsigned short>', ' std::allocator<std::pair<unsigned short const', ' ns3::Ptr<ns3::WifiPsdu const> > > > '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::QueueDiscItem const> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['std::map<std::pair<unsigned int', ' unsigned int>', ' double', ' std::less<std::pair<unsigned int', ' unsigned int> >', ' std::allocator<std::pair<std::pair<unsigned int', ' unsigned int> const', ' double> > > '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiMac> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::WifiPhyRxfailureReason'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::OrganizationIdentifier const&'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::MpduInfo'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Address'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::SignalNoiseDbm'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::OriginatorBlockAckAgreement::State'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiMacQueueItem> '], visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -13701,7 +13836,7 @@
     cls.add_method('GetOperatingClass', 
                    'uint32_t', 
                    [param('uint32_t', 'channelNumber')])
-    ## channel-manager.h (module 'wave'): static std::vector<unsigned int, std::allocator<unsigned int> > ns3::ChannelManager::GetSchs() [member function]
+    ## channel-manager.h (module 'wave'): static std::vector<unsigned int, std::allocator<unsigned int>> ns3::ChannelManager::GetSchs() [member function]
     cls.add_method('GetSchs', 
                    'std::vector< unsigned int >', 
                    [], 
@@ -13711,7 +13846,7 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## channel-manager.h (module 'wave'): static std::vector<unsigned int, std::allocator<unsigned int> > ns3::ChannelManager::GetWaveChannels() [member function]
+    ## channel-manager.h (module 'wave'): static std::vector<unsigned int, std::allocator<unsigned int>> ns3::ChannelManager::GetWaveChannels() [member function]
     cls.add_method('GetWaveChannels', 
                    'std::vector< unsigned int >', 
                    [], 
@@ -13979,7 +14114,7 @@
                    'uint32_t', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_virtual=True)
-    ## ctrl-headers.h (module 'wifi'): std::vector<unsigned int, std::allocator<unsigned int> > ns3::CtrlBAckResponseHeader::FindPerAidTidInfoWithAid(uint16_t aid) const [member function]
+    ## ctrl-headers.h (module 'wifi'): std::vector<unsigned int, std::allocator<unsigned int>> ns3::CtrlBAckResponseHeader::FindPerAidTidInfoWithAid(uint16_t aid) const [member function]
     cls.add_method('FindPerAidTidInfoWithAid', 
                    'std::vector< unsigned int >', 
                    [param('uint16_t', 'aid')], 
@@ -13994,7 +14129,7 @@
                    'uint16_t', 
                    [param('std::size_t', 'index')], 
                    is_const=True)
-    ## ctrl-headers.h (module 'wifi'): std::vector<unsigned char, std::allocator<unsigned char> > const & ns3::CtrlBAckResponseHeader::GetBitmap(std::size_t index=0) const [member function]
+    ## ctrl-headers.h (module 'wifi'): std::vector<unsigned char, std::allocator<unsigned char>> const & ns3::CtrlBAckResponseHeader::GetBitmap(std::size_t index=0) const [member function]
     cls.add_method('GetBitmap', 
                    'std::vector< unsigned char > const &', 
                    [param('std::size_t', 'index', default_value='0')], 
@@ -15004,8 +15139,9 @@
     ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::NotifySwitchingStartNow(ns3::Time duration) [member function]
     cls.add_method('NotifySwitchingStartNow', 
                    'void', 
-                   [param('ns3::Time', 'duration')])
-    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::Receive(ns3::Ptr<ns3::WifiPsdu> psdu, ns3::RxSignalInfo rxSignalInfo, ns3::WifiTxVector txVector, std::vector<bool, std::allocator<bool> > perMpduStatus) [member function]
+                   [param('ns3::Time', 'duration')], 
+                   is_virtual=True)
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::Receive(ns3::Ptr<ns3::WifiPsdu> psdu, ns3::RxSignalInfo rxSignalInfo, ns3::WifiTxVector txVector, std::vector<bool, std::allocator<bool>> perMpduStatus) [member function]
     cls.add_method('Receive', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('ns3::RxSignalInfo', 'rxSignalInfo'), param('ns3::WifiTxVector', 'txVector'), param('std::vector< bool >', 'perMpduStatus')])
@@ -15062,10 +15198,10 @@
                    'void', 
                    [param('ns3::Ptr< ns3::WifiProtectionManager >', 'protectionManager')], 
                    is_virtual=True)
-    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SetWifiMac(ns3::Ptr<ns3::RegularWifiMac> const mac) [member function]
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SetWifiMac(ns3::Ptr<ns3::WifiMac> const mac) [member function]
     cls.add_method('SetWifiMac', 
                    'void', 
-                   [param('ns3::Ptr< ns3::RegularWifiMac > const', 'mac')], 
+                   [param('ns3::Ptr< ns3::WifiMac > const', 'mac')], 
                    is_virtual=True)
     ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SetWifiPhy(ns3::Ptr<ns3::WifiPhy> const phy) [member function]
     cls.add_method('SetWifiPhy', 
@@ -15087,6 +15223,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')], 
                    is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::DoCtsTimeout(ns3::Ptr<ns3::WifiPsdu> psdu) [member function]
+    cls.add_method('DoCtsTimeout', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu')], 
+                   visibility='protected')
     ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
@@ -15097,7 +15238,7 @@
                    'void', 
                    [param('ns3::WifiMacHeader const &', 'rtsHdr'), param('ns3::WifiTxVector &', 'ctsTxVector'), param('double', 'rtsSnr')], 
                    visibility='protected')
-    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::EndReceiveAmpdu(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::RxSignalInfo const & rxSignalInfo, ns3::WifiTxVector const & txVector, std::vector<bool, std::allocator<bool> > const & perMpduStatus) [member function]
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::EndReceiveAmpdu(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::RxSignalInfo const & rxSignalInfo, ns3::WifiTxVector const & txVector, std::vector<bool, std::allocator<bool>> const & perMpduStatus) [member function]
     cls.add_method('EndReceiveAmpdu', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::RxSignalInfo const &', 'rxSignalInfo'), param('ns3::WifiTxVector const &', 'txVector'), param('std::vector< bool > const &', 'perMpduStatus')], 
@@ -15127,6 +15268,11 @@
                    'ns3::Ptr< ns3::WifiMacQueueItem >', 
                    [], 
                    visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): uint32_t ns3::FrameExchangeManager::GetPsduSize(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetPsduSize', 
+                   'uint32_t', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True, visibility='protected')
     ## frame-exchange-manager.h (module 'wifi'): ns3::Time ns3::FrameExchangeManager::GetRtsDurationId(ns3::WifiTxVector const & rtsTxVector, ns3::Time txDuration, ns3::Time response) const [member function]
     cls.add_method('GetRtsDurationId', 
                    'ns3::Time', 
@@ -15172,13 +15318,13 @@
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiTxVector const &', 'ackTxVector'), param('ns3::RxSignalInfo const &', 'rxInfo'), param('double', 'snr')], 
                    is_virtual=True, visibility='protected')
-    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::RetransmitMpduAfterMissedAck(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) const [member function]
-    cls.add_method('RetransmitMpduAfterMissedAck', 
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::ReleaseSequenceNumber(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) const [member function]
+    cls.add_method('ReleaseSequenceNumber', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
                    is_const=True, is_virtual=True, visibility='protected')
-    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::RetransmitMpduAfterMissedCts(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) const [member function]
-    cls.add_method('RetransmitMpduAfterMissedCts', 
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::RetransmitMpduAfterMissedAck(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) const [member function]
+    cls.add_method('RetransmitMpduAfterMissedAck', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
                    is_const=True, is_virtual=True, visibility='protected')
@@ -15298,19 +15444,14 @@
                    'uint8_t', 
                    [], 
                    is_const=True)
-    ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetHeLtfAndGiForHePpdus() const [member function]
-    cls.add_method('GetHeLtfAndGiForHePpdus', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
     ## he-capabilities.h (module 'wifi'): uint32_t ns3::HeCapabilities::GetHeMacCapabilitiesInfo1() const [member function]
     cls.add_method('GetHeMacCapabilitiesInfo1', 
                    'uint32_t', 
                    [], 
                    is_const=True)
-    ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetHeMacCapabilitiesInfo2() const [member function]
+    ## he-capabilities.h (module 'wifi'): uint16_t ns3::HeCapabilities::GetHeMacCapabilitiesInfo2() const [member function]
     cls.add_method('GetHeMacCapabilitiesInfo2', 
-                   'uint8_t', 
+                   'uint16_t', 
                    [], 
                    is_const=True)
     ## he-capabilities.h (module 'wifi'): uint64_t ns3::HeCapabilities::GetHePhyCapabilitiesInfo1() const [member function]
@@ -15318,11 +15459,26 @@
                    'uint64_t', 
                    [], 
                    is_const=True)
-    ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetHePhyCapabilitiesInfo2() const [member function]
+    ## he-capabilities.h (module 'wifi'): uint16_t ns3::HeCapabilities::GetHePhyCapabilitiesInfo2() const [member function]
     cls.add_method('GetHePhyCapabilitiesInfo2', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetHePhyCapabilitiesInfo3() const [member function]
+    cls.add_method('GetHePhyCapabilitiesInfo3', 
                    'uint8_t', 
                    [], 
                    is_const=True)
+    ## he-capabilities.h (module 'wifi'): bool ns3::HeCapabilities::GetHePpdu4xHeLtf800nsGi() const [member function]
+    cls.add_method('GetHePpdu4xHeLtf800nsGi', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## he-capabilities.h (module 'wifi'): bool ns3::HeCapabilities::GetHeSuPpdu1xHeLtf800nsGi() const [member function]
+    cls.add_method('GetHeSuPpdu1xHeLtf800nsGi', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetHighestMcsSupported() const [member function]
     cls.add_method('GetHighestMcsSupported', 
                    'uint8_t', 
@@ -15382,18 +15538,22 @@
     cls.add_method('SetChannelWidthSet', 
                    'void', 
                    [param('uint8_t', 'channelWidthSet')])
-    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHeLtfAndGiForHePpdus(uint8_t heLtfAndGiForHePpdus) [member function]
-    cls.add_method('SetHeLtfAndGiForHePpdus', 
-                   'void', 
-                   [param('uint8_t', 'heLtfAndGiForHePpdus')])
-    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHeMacCapabilitiesInfo(uint32_t ctrl1, uint8_t ctrl2) [member function]
+    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHeMacCapabilitiesInfo(uint32_t ctrl1, uint16_t ctrl2) [member function]
     cls.add_method('SetHeMacCapabilitiesInfo', 
                    'void', 
-                   [param('uint32_t', 'ctrl1'), param('uint8_t', 'ctrl2')])
-    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHePhyCapabilitiesInfo(uint64_t ctrl1, uint8_t ctrl2) [member function]
+                   [param('uint32_t', 'ctrl1'), param('uint16_t', 'ctrl2')])
+    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHePhyCapabilitiesInfo(uint64_t ctrl1, uint16_t ctrl2, uint8_t ctrl3) [member function]
     cls.add_method('SetHePhyCapabilitiesInfo', 
                    'void', 
-                   [param('uint64_t', 'ctrl1'), param('uint8_t', 'ctrl2')])
+                   [param('uint64_t', 'ctrl1'), param('uint16_t', 'ctrl2'), param('uint8_t', 'ctrl3')])
+    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHePpdu4xHeLtf800nsGi(bool heSuPpdu4xHeLtf800nsGi) [member function]
+    cls.add_method('SetHePpdu4xHeLtf800nsGi', 
+                   'void', 
+                   [param('bool', 'heSuPpdu4xHeLtf800nsGi')])
+    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHeSuPpdu1xHeLtf800nsGi(bool heSuPpdu1xHeLtf800nsGi) [member function]
+    cls.add_method('SetHeSuPpdu1xHeLtf800nsGi', 
+                   'void', 
+                   [param('bool', 'heSuPpdu1xHeLtf800nsGi')])
     ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHeSupported(uint8_t heSupported) [member function]
     cls.add_method('SetHeSupported', 
                    'void', 
@@ -16174,7 +16334,7 @@
                    'ns3::Ipv4Address', 
                    [], 
                    is_const=True)
-    ## ipv4-route.h (module 'internet'): std::map<unsigned int, unsigned int, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, unsigned int> > > ns3::Ipv4MulticastRoute::GetOutputTtlMap() const [member function]
+    ## ipv4-route.h (module 'internet'): std::map<unsigned int, unsigned int, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, unsigned int>>> ns3::Ipv4MulticastRoute::GetOutputTtlMap() const [member function]
     cls.add_method('GetOutputTtlMap', 
                    'std::map< unsigned int, unsigned int >', 
                    [], 
@@ -16904,7 +17064,7 @@
     cls.add_constructor([param('ns3::ListErrorModel const &', 'arg0')])
     ## error-model.h (module 'network'): ns3::ListErrorModel::ListErrorModel() [constructor]
     cls.add_constructor([])
-    ## error-model.h (module 'network'): std::list<unsigned int, std::allocator<unsigned int> > ns3::ListErrorModel::GetList() const [member function]
+    ## error-model.h (module 'network'): std::list<unsigned int, std::allocator<unsigned int>> ns3::ListErrorModel::GetList() const [member function]
     cls.add_method('GetList', 
                    'std::list< unsigned int >', 
                    [], 
@@ -16914,7 +17074,7 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## error-model.h (module 'network'): void ns3::ListErrorModel::SetList(std::list<unsigned int, std::allocator<unsigned int> > const & packetlist) [member function]
+    ## error-model.h (module 'network'): void ns3::ListErrorModel::SetList(std::list<unsigned int, std::allocator<unsigned int>> const & packetlist) [member function]
     cls.add_method('SetList', 
                    'void', 
                    [param('std::list< unsigned int > const &', 'packetlist')])
@@ -17282,10 +17442,16 @@
     cls.add_method('ExtractNeighborIndex', 
                    'uint32_t', 
                    [param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetEpoch() const [member function]
+    cls.add_method('GetEpoch', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() const [member function]
     cls.add_method('GetRemainingBits', 
                    'uint32_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -17296,6 +17462,10 @@
                    'uint32_t', 
                    [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
+    ## nix-vector.h (module 'network'): void ns3::NixVector::SetEpoch(uint32_t epoch) [member function]
+    cls.add_method('SetEpoch', 
+                   'void', 
+                   [param('uint32_t', 'epoch')])
     return
 
 def register_Ns3Node_methods(root_module, cls):
@@ -17471,6 +17641,111 @@
                    [param('ns3::ObjectFactory const &', 'value')])
     return
 
+def register_Ns3OcbWifiMac_methods(root_module, cls):
+    ## ocb-wifi-mac.h (module 'wave'): static ns3::TypeId ns3::OcbWifiMac::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## ocb-wifi-mac.h (module 'wave'): ns3::OcbWifiMac::OcbWifiMac() [constructor]
+    cls.add_constructor([])
+    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::SendVsc(ns3::Ptr<ns3::Packet> vsc, ns3::Mac48Address peer, ns3::OrganizationIdentifier oi) [member function]
+    cls.add_method('SendVsc', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'vsc'), param('ns3::Mac48Address', 'peer'), param('ns3::OrganizationIdentifier', 'oi')])
+    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::AddReceiveVscCallback(ns3::OrganizationIdentifier oi, ns3::VscCallback cb) [member function]
+    cls.add_method('AddReceiveVscCallback', 
+                   'void', 
+                   [param('ns3::OrganizationIdentifier', 'oi'), param('ns3::Callback< bool, ns3::Ptr< ns3::WifiMac >, ns3::OrganizationIdentifier const &, ns3::Ptr< ns3::Packet const >, ns3::Address const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'cb')])
+    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::RemoveReceiveVscCallback(ns3::OrganizationIdentifier oi) [member function]
+    cls.add_method('RemoveReceiveVscCallback', 
+                   'void', 
+                   [param('ns3::OrganizationIdentifier', 'oi')])
+    ## ocb-wifi-mac.h (module 'wave'): ns3::Ssid ns3::OcbWifiMac::GetSsid() const [member function]
+    cls.add_method('GetSsid', 
+                   'ns3::Ssid', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::SetSsid(ns3::Ssid ssid) [member function]
+    cls.add_method('SetSsid', 
+                   'void', 
+                   [param('ns3::Ssid', 'ssid')], 
+                   is_virtual=True)
+    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::SetBssid(ns3::Mac48Address bssid) [member function]
+    cls.add_method('SetBssid', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'bssid')], 
+                   is_virtual=True)
+    ## ocb-wifi-mac.h (module 'wave'): ns3::Mac48Address ns3::OcbWifiMac::GetBssid() const [member function]
+    cls.add_method('GetBssid', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::SetLinkUpCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkUp) [member function]
+    cls.add_method('SetLinkUpCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkUp')], 
+                   is_virtual=True)
+    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::SetLinkDownCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkDown) [member function]
+    cls.add_method('SetLinkDownCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkDown')], 
+                   is_virtual=True)
+    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to) [member function]
+    cls.add_method('Enqueue', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to')], 
+                   is_virtual=True)
+    ## ocb-wifi-mac.h (module 'wave'): bool ns3::OcbWifiMac::CanForwardPacketsTo(ns3::Mac48Address to) const [member function]
+    cls.add_method('CanForwardPacketsTo', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'to')], 
+                   is_const=True, is_virtual=True)
+    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::ConfigureEdca(uint32_t cwmin, uint32_t cwmax, uint32_t aifsn, ns3::AcIndex ac) [member function]
+    cls.add_method('ConfigureEdca', 
+                   'void', 
+                   [param('uint32_t', 'cwmin'), param('uint32_t', 'cwmax'), param('uint32_t', 'aifsn'), param('ns3::AcIndex', 'ac')])
+    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::EnableForWave(ns3::Ptr<ns3::WaveNetDevice> device) [member function]
+    cls.add_method('EnableForWave', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WaveNetDevice >', 'device')])
+    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::Suspend() [member function]
+    cls.add_method('Suspend', 
+                   'void', 
+                   [])
+    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::Resume() [member function]
+    cls.add_method('Resume', 
+                   'void', 
+                   [])
+    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::MakeVirtualBusy(ns3::Time duration) [member function]
+    cls.add_method('MakeVirtualBusy', 
+                   'void', 
+                   [param('ns3::Time', 'duration')])
+    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::CancleTx(ns3::AcIndex ac) [member function]
+    cls.add_method('CancleTx', 
+                   'void', 
+                   [param('ns3::AcIndex', 'ac')])
+    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::Reset() [member function]
+    cls.add_method('Reset', 
+                   'void', 
+                   [])
+    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::ConfigureStandard(ns3::WifiStandard standard) [member function]
+    cls.add_method('ConfigureStandard', 
+                   'void', 
+                   [param('ns3::WifiStandard', 'standard')], 
+                   is_virtual=True)
+    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::Receive(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('Receive', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
+                   is_virtual=True, visibility='private')
+    return
+
 def register_Ns3OrganizationIdentifierChecker_methods(root_module, cls):
     ## vendor-specific-action.h (module 'wave'): ns3::OrganizationIdentifierChecker::OrganizationIdentifierChecker() [constructor]
     cls.add_constructor([])
@@ -17712,10 +17987,11 @@
                    'uint32_t', 
                    [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) const [member function]
     cls.add_method('SetNixVector', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')], 
+                   is_const=True)
     ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
     cls.add_method('ToString', 
                    'std::string', 
@@ -17924,12 +18200,12 @@
     cls.add_method('Transmit', 
                    'void', 
                    [param('ns3::Time', 'txDuration'), param('ns3::Ptr< ns3::WifiPpdu >', 'ppdu'), param('std::string', 'type')])
-    ## phy-entity.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> >::const_iterator ns3::PhyEntity::begin() const [member function]
+    ## phy-entity.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode>>::const_iterator ns3::PhyEntity::begin() const [member function]
     cls.add_method('begin', 
                    'std::list< ns3::WifiMode > const_iterator', 
                    [], 
                    is_const=True)
-    ## phy-entity.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> >::const_iterator ns3::PhyEntity::end() const [member function]
+    ## phy-entity.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode>>::const_iterator ns3::PhyEntity::end() const [member function]
     cls.add_method('end', 
                    'std::list< ns3::WifiMode > const_iterator', 
                    [], 
@@ -18014,7 +18290,7 @@
                    'uint16_t', 
                    [param('ns3::WifiTxVector const &', 'txVector')], 
                    is_const=True, visibility='protected')
-    ## phy-entity.h (module 'wifi'): std::pair<unsigned short, std::pair<unsigned int, unsigned int> > ns3::PhyEntity::GetChannelWidthAndBand(ns3::WifiTxVector const & txVector, uint16_t staId) const [member function]
+    ## phy-entity.h (module 'wifi'): std::pair<unsigned short, std::pair<unsigned int, unsigned int>> ns3::PhyEntity::GetChannelWidthAndBand(ns3::WifiTxVector const & txVector, uint16_t staId) const [member function]
     cls.add_method('GetChannelWidthAndBand', 
                    'std::pair< unsigned short, std::pair< unsigned int, unsigned int > >', 
                    [param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId')], 
@@ -18024,7 +18300,7 @@
                    'ns3::Ptr< ns3::Event const >', 
                    [], 
                    is_const=True, visibility='protected')
-    ## phy-entity.h (module 'wifi'): std::map<std::pair<unsigned long long, ns3::WifiPreamble>, ns3::Ptr<ns3::Event>, std::less<std::pair<unsigned long long, ns3::WifiPreamble> >, std::allocator<std::pair<const std::pair<unsigned long long, ns3::WifiPreamble>, ns3::Ptr<ns3::Event> > > > const & ns3::PhyEntity::GetCurrentPreambleEvents() const [member function]
+    ## phy-entity.h (module 'wifi'): std::map<std::pair<unsigned long long, ns3::WifiPreamble>, ns3::Ptr<ns3::Event>, std::less<std::pair<unsigned long long, ns3::WifiPreamble>>, std::allocator<std::pair<const std::pair<unsigned long long, ns3::WifiPreamble>, ns3::Ptr<ns3::Event>>>> const & ns3::PhyEntity::GetCurrentPreambleEvents() const [member function]
     cls.add_method('GetCurrentPreambleEvents', 
                    'std::map< std::pair< unsigned long long, ns3::WifiPreamble >, ns3::Ptr< ns3::Event > > const &', 
                    [], 
@@ -18079,6 +18355,11 @@
                    'void', 
                    [param('bool', 'reset')], 
                    visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::NotifyPayloadBegin(ns3::WifiTxVector const & txVector, ns3::Time const & payloadDuration) [member function]
+    cls.add_method('NotifyPayloadBegin', 
+                   'void', 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time const &', 'payloadDuration')], 
+                   visibility='protected')
     ## phy-entity.h (module 'wifi'): uint64_t ns3::PhyEntity::ObtainNextUid(ns3::WifiTxVector const & txVector) [member function]
     cls.add_method('ObtainNextUid', 
                    'uint64_t', 
@@ -18435,18 +18716,14 @@
     cls.add_method('PeekNextSequenceNumberFor', 
                    'uint16_t', 
                    [param('ns3::WifiMacHeader const *', 'hdr')])
-    ## qos-txop.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::QosTxop::PeekNextMpdu(uint8_t tid=8, ns3::Mac48Address recipient=ns3::Mac48Address::GetBroadcast()) [member function]
-    cls.add_method('PeekNextMpdu', 
-                   'ns3::Ptr< ns3::WifiMacQueueItem const >', 
-                   [param('uint8_t', 'tid', default_value='8'), param('ns3::Mac48Address', 'recipient', default_value='ns3::Mac48Address::GetBroadcast()')])
-    ## qos-txop.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::QosTxop::PeekNextMpdu(ns3::WifiMacQueueItem::ConstIterator queueIt, uint8_t tid=8, ns3::Mac48Address recipient=ns3::Mac48Address::GetBroadcast()) [member function]
+    ## qos-txop.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::QosTxop::PeekNextMpdu(uint8_t tid=8, ns3::Mac48Address recipient=ns3::Mac48Address::GetBroadcast(), ns3::Ptr<const ns3::WifiMacQueueItem> item=nullptr) [member function]
     cls.add_method('PeekNextMpdu', 
                    'ns3::Ptr< ns3::WifiMacQueueItem const >', 
-                   [param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'queueIt'), param('uint8_t', 'tid', default_value='8'), param('ns3::Mac48Address', 'recipient', default_value='ns3::Mac48Address::GetBroadcast()')])
-    ## qos-txop.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::QosTxop::GetNextMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> peekedItem, ns3::WifiTxParameters & txParams, ns3::Time availableTime, bool initialFrame, ns3::WifiMacQueueItem::ConstIterator & queueIt) [member function]
+                   [param('uint8_t', 'tid', default_value='8'), param('ns3::Mac48Address', 'recipient', default_value='ns3::Mac48Address::GetBroadcast()'), param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'item', default_value='nullptr')])
+    ## qos-txop.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::QosTxop::GetNextMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> peekedItem, ns3::WifiTxParameters & txParams, ns3::Time availableTime, bool initialFrame) [member function]
     cls.add_method('GetNextMpdu', 
                    'ns3::Ptr< ns3::WifiMacQueueItem >', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'peekedItem'), param('ns3::WifiTxParameters &', 'txParams'), param('ns3::Time', 'availableTime'), param('bool', 'initialFrame'), param('ns3::WifiMacQueueItem::ConstIterator &', 'queueIt')])
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'peekedItem'), param('ns3::WifiTxParameters &', 'txParams'), param('ns3::Time', 'availableTime'), param('bool', 'initialFrame')])
     ## qos-txop.h (module 'wifi'): void ns3::QosTxop::AssignSequenceNumber(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) const [member function]
     cls.add_method('AssignSequenceNumber', 
                    'void', 
@@ -18948,7 +19225,7 @@
     cls.add_constructor([param('ns3::ReceiveListErrorModel const &', 'arg0')])
     ## error-model.h (module 'network'): ns3::ReceiveListErrorModel::ReceiveListErrorModel() [constructor]
     cls.add_constructor([])
-    ## error-model.h (module 'network'): std::list<unsigned int, std::allocator<unsigned int> > ns3::ReceiveListErrorModel::GetList() const [member function]
+    ## error-model.h (module 'network'): std::list<unsigned int, std::allocator<unsigned int>> ns3::ReceiveListErrorModel::GetList() const [member function]
     cls.add_method('GetList', 
                    'std::list< unsigned int >', 
                    [], 
@@ -18958,7 +19235,7 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## error-model.h (module 'network'): void ns3::ReceiveListErrorModel::SetList(std::list<unsigned int, std::allocator<unsigned int> > const & packetlist) [member function]
+    ## error-model.h (module 'network'): void ns3::ReceiveListErrorModel::SetList(std::list<unsigned int, std::allocator<unsigned int>> const & packetlist) [member function]
     cls.add_method('SetList', 
                    'void', 
                    [param('std::list< unsigned int > const &', 'packetlist')])
@@ -18974,289 +19251,6 @@
                    is_virtual=True, visibility='private')
     return
 
-def register_Ns3RegularWifiMac_methods(root_module, cls):
-    ## regular-wifi-mac.h (module 'wifi'): static ns3::TypeId ns3::RegularWifiMac::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::RegularWifiMac::RegularWifiMac() [constructor]
-    cls.add_constructor([])
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetShortSlotTimeSupported(bool enable) [member function]
-    cls.add_method('SetShortSlotTimeSupported', 
-                   'void', 
-                   [param('bool', 'enable')], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetSsid(ns3::Ssid ssid) [member function]
-    cls.add_method('SetSsid', 
-                   'void', 
-                   [param('ns3::Ssid', 'ssid')], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetAddress(ns3::Mac48Address address) [member function]
-    cls.add_method('SetAddress', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetPromisc() [member function]
-    cls.add_method('SetPromisc', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetShortSlotTimeSupported() const [member function]
-    cls.add_method('GetShortSlotTimeSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ssid ns3::RegularWifiMac::GetSsid() const [member function]
-    cls.add_method('GetSsid', 
-                   'ns3::Ssid', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Mac48Address ns3::RegularWifiMac::GetAddress() const [member function]
-    cls.add_method('GetAddress', 
-                   'ns3::Mac48Address', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Mac48Address ns3::RegularWifiMac::GetBssid() const [member function]
-    cls.add_method('GetBssid', 
-                   'ns3::Mac48Address', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to, ns3::Mac48Address from) [member function]
-    cls.add_method('Enqueue', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to'), param('ns3::Mac48Address', 'from')], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::SupportsSendFrom() const [member function]
-    cls.add_method('SupportsSendFrom', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetWifiPhy(ns3::Ptr<ns3::WifiPhy> const phy) [member function]
-    cls.add_method('SetWifiPhy', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiPhy > const', 'phy')], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiPhy> ns3::RegularWifiMac::GetWifiPhy() const [member function]
-    cls.add_method('GetWifiPhy', 
-                   'ns3::Ptr< ns3::WifiPhy >', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::ResetWifiPhy() [member function]
-    cls.add_method('ResetWifiPhy', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetWifiRemoteStationManager(ns3::Ptr<ns3::WifiRemoteStationManager> const stationManager) [member function]
-    cls.add_method('SetWifiRemoteStationManager', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiRemoteStationManager > const', 'stationManager')], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::ConfigureStandard(ns3::WifiStandard standard) [member function]
-    cls.add_method('ConfigureStandard', 
-                   'void', 
-                   [param('ns3::WifiStandard', 'standard')], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::TypeOfStation ns3::RegularWifiMac::GetTypeOfStation() const [member function]
-    cls.add_method('GetTypeOfStation', 
-                   'ns3::TypeOfStation', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetForwardUpCallback(ns3::WifiMac::ForwardUpCallback upCallback) [member function]
-    cls.add_method('SetForwardUpCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'upCallback')], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetLinkUpCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkUp) [member function]
-    cls.add_method('SetLinkUpCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkUp')], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetLinkDownCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkDown) [member function]
-    cls.add_method('SetLinkDownCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkDown')], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiRemoteStationManager> ns3::RegularWifiMac::GetWifiRemoteStationManager() const [member function]
-    cls.add_method('GetWifiRemoteStationManager', 
-                   'ns3::Ptr< ns3::WifiRemoteStationManager >', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to) [member function]
-    cls.add_method('Enqueue', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::FrameExchangeManager> ns3::RegularWifiMac::GetFrameExchangeManager() const [member function]
-    cls.add_method('GetFrameExchangeManager', 
-                   'ns3::Ptr< ns3::FrameExchangeManager >', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetCtsToSelfSupported(bool enable) [member function]
-    cls.add_method('SetCtsToSelfSupported', 
-                   'void', 
-                   [param('bool', 'enable')])
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetBssid(ns3::Mac48Address bssid) [member function]
-    cls.add_method('SetBssid', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'bssid')])
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::Txop> ns3::RegularWifiMac::GetTxop() const [member function]
-    cls.add_method('GetTxop', 
-                   'ns3::Ptr< ns3::Txop >', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::RegularWifiMac::GetQosTxop(ns3::AcIndex ac) const [member function]
-    cls.add_method('GetQosTxop', 
-                   'ns3::Ptr< ns3::QosTxop >', 
-                   [param('ns3::AcIndex', 'ac')], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::RegularWifiMac::GetQosTxop(uint8_t tid) const [member function]
-    cls.add_method('GetQosTxop', 
-                   'ns3::Ptr< ns3::QosTxop >', 
-                   [param('uint8_t', 'tid')], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueue> ns3::RegularWifiMac::GetTxopQueue(ns3::AcIndex ac) const [member function]
-    cls.add_method('GetTxopQueue', 
-                   'ns3::Ptr< ns3::WifiMacQueue >', 
-                   [param('ns3::AcIndex', 'ac')], 
-                   is_const=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetQosSupported() const [member function]
-    cls.add_method('GetQosSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetErpSupported() const [member function]
-    cls.add_method('GetErpSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetDsssSupported() const [member function]
-    cls.add_method('GetDsssSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetHtSupported() const [member function]
-    cls.add_method('GetHtSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetVhtSupported() const [member function]
-    cls.add_method('GetVhtSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetHeSupported() const [member function]
-    cls.add_method('GetHeSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::ExtendedCapabilities ns3::RegularWifiMac::GetExtendedCapabilities() const [member function]
-    cls.add_method('GetExtendedCapabilities', 
-                   'ns3::ExtendedCapabilities', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::HtCapabilities ns3::RegularWifiMac::GetHtCapabilities() const [member function]
-    cls.add_method('GetHtCapabilities', 
-                   'ns3::HtCapabilities', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::VhtCapabilities ns3::RegularWifiMac::GetVhtCapabilities() const [member function]
-    cls.add_method('GetVhtCapabilities', 
-                   'ns3::VhtCapabilities', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::HeCapabilities ns3::RegularWifiMac::GetHeCapabilities() const [member function]
-    cls.add_method('GetHeCapabilities', 
-                   'ns3::HeCapabilities', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): uint32_t ns3::RegularWifiMac::GetMaxAmpduSize(ns3::AcIndex ac) const [member function]
-    cls.add_method('GetMaxAmpduSize', 
-                   'uint32_t', 
-                   [param('ns3::AcIndex', 'ac')], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): uint16_t ns3::RegularWifiMac::GetMaxAmsduSize(ns3::AcIndex ac) const [member function]
-    cls.add_method('GetMaxAmsduSize', 
-                   'uint16_t', 
-                   [param('ns3::AcIndex', 'ac')], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::DoInitialize() [member function]
-    cls.add_method('DoInitialize', 
-                   'void', 
-                   [], 
-                   is_virtual=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::DoDispose() [member function]
-    cls.add_method('DoDispose', 
-                   'void', 
-                   [], 
-                   is_virtual=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetTypeOfStation(ns3::TypeOfStation type) [member function]
-    cls.add_method('SetTypeOfStation', 
-                   'void', 
-                   [param('ns3::TypeOfStation', 'type')], 
-                   is_virtual=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::RegularWifiMac::GetVOQueue() const [member function]
-    cls.add_method('GetVOQueue', 
-                   'ns3::Ptr< ns3::QosTxop >', 
-                   [], 
-                   is_const=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::RegularWifiMac::GetVIQueue() const [member function]
-    cls.add_method('GetVIQueue', 
-                   'ns3::Ptr< ns3::QosTxop >', 
-                   [], 
-                   is_const=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::RegularWifiMac::GetBEQueue() const [member function]
-    cls.add_method('GetBEQueue', 
-                   'ns3::Ptr< ns3::QosTxop >', 
-                   [], 
-                   is_const=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::RegularWifiMac::GetBKQueue() const [member function]
-    cls.add_method('GetBKQueue', 
-                   'ns3::Ptr< ns3::QosTxop >', 
-                   [], 
-                   is_const=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::ConfigureContentionWindow(uint32_t cwMin, uint32_t cwMax) [member function]
-    cls.add_method('ConfigureContentionWindow', 
-                   'void', 
-                   [param('uint32_t', 'cwMin'), param('uint32_t', 'cwMax')], 
-                   visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::Receive(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('Receive', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
-                   is_virtual=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::ForwardUp(ns3::Ptr<const ns3::Packet> packet, ns3::Mac48Address from, ns3::Mac48Address to) [member function]
-    cls.add_method('ForwardUp', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::Mac48Address', 'from'), param('ns3::Mac48Address', 'to')], 
-                   visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::DeaggregateAmsduAndForward(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('DeaggregateAmsduAndForward', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
-                   is_virtual=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetQosSupported(bool enable) [member function]
-    cls.add_method('SetQosSupported', 
-                   'void', 
-                   [param('bool', 'enable')], 
-                   is_virtual=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetupFrameExchangeManager() [member function]
-    cls.add_method('SetupFrameExchangeManager', 
-                   'void', 
-                   [], 
-                   visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetErpSupported(bool enable) [member function]
-    cls.add_method('SetErpSupported', 
-                   'void', 
-                   [param('bool', 'enable')], 
-                   visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetDsssSupported(bool enable) [member function]
-    cls.add_method('SetDsssSupported', 
-                   'void', 
-                   [param('bool', 'enable')], 
-                   visibility='protected')
-    return
-
 def register_Ns3Ssid_methods(root_module, cls):
     cls.add_output_stream_operator()
     ## ssid.h (module 'wifi'): ns3::Ssid::Ssid(ns3::Ssid const & arg0) [constructor]
@@ -19743,10 +19737,6 @@
     cls.add_method('PushFront', 
                    'bool', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'item')])
-    ## wifi-mac-queue.h (module 'wifi'): bool ns3::WifiMacQueue::Insert(ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos, ns3::Ptr<ns3::WifiMacQueueItem> item) [member function]
-    cls.add_method('Insert', 
-                   'bool', 
-                   [param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos'), param('ns3::Ptr< ns3::WifiMacQueueItem >', 'item')])
     ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::WifiMacQueue::Dequeue() [member function]
     cls.add_method('Dequeue', 
                    'ns3::Ptr< ns3::WifiMacQueueItem >', 
@@ -19761,39 +19751,39 @@
                    'ns3::Ptr< ns3::WifiMacQueueItem const >', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## wifi-mac-queue.h (module 'wifi'): ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator ns3::WifiMacQueue::PeekByAddress(ns3::Mac48Address dest, ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos=ns3::WifiMacQueue::EMPTY) const [member function]
+    ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::WifiMacQueue::PeekByAddress(ns3::Mac48Address dest, ns3::Ptr<const ns3::WifiMacQueueItem> item=nullptr) const [member function]
     cls.add_method('PeekByAddress', 
-                   'ns3::Queue< ns3::WifiMacQueueItem > ConstIterator', 
-                   [param('ns3::Mac48Address', 'dest'), param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos', default_value='ns3::WifiMacQueue::EMPTY')], 
+                   'ns3::Ptr< ns3::WifiMacQueueItem const >', 
+                   [param('ns3::Mac48Address', 'dest'), param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'item', default_value='nullptr')], 
                    is_const=True)
-    ## wifi-mac-queue.h (module 'wifi'): ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator ns3::WifiMacQueue::PeekByTid(uint8_t tid, ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos=ns3::WifiMacQueue::EMPTY) const [member function]
+    ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::WifiMacQueue::PeekByTid(uint8_t tid, ns3::Ptr<const ns3::WifiMacQueueItem> item=nullptr) const [member function]
     cls.add_method('PeekByTid', 
-                   'ns3::Queue< ns3::WifiMacQueueItem > ConstIterator', 
-                   [param('uint8_t', 'tid'), param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos', default_value='ns3::WifiMacQueue::EMPTY')], 
+                   'ns3::Ptr< ns3::WifiMacQueueItem const >', 
+                   [param('uint8_t', 'tid'), param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'item', default_value='nullptr')], 
                    is_const=True)
-    ## wifi-mac-queue.h (module 'wifi'): ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator ns3::WifiMacQueue::PeekByTidAndAddress(uint8_t tid, ns3::Mac48Address dest, ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos=ns3::WifiMacQueue::EMPTY) const [member function]
+    ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::WifiMacQueue::PeekByTidAndAddress(uint8_t tid, ns3::Mac48Address dest, ns3::Ptr<const ns3::WifiMacQueueItem> item=nullptr) const [member function]
     cls.add_method('PeekByTidAndAddress', 
-                   'ns3::Queue< ns3::WifiMacQueueItem > ConstIterator', 
-                   [param('uint8_t', 'tid'), param('ns3::Mac48Address', 'dest'), param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos', default_value='ns3::WifiMacQueue::EMPTY')], 
+                   'ns3::Ptr< ns3::WifiMacQueueItem const >', 
+                   [param('uint8_t', 'tid'), param('ns3::Mac48Address', 'dest'), param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'item', default_value='nullptr')], 
                    is_const=True)
-    ## wifi-mac-queue.h (module 'wifi'): ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator ns3::WifiMacQueue::PeekFirstAvailable(ns3::Ptr<ns3::QosBlockedDestinations> const blockedPackets=nullptr, ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos=ns3::WifiMacQueue::EMPTY) const [member function]
+    ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::WifiMacQueue::PeekFirstAvailable(ns3::Ptr<ns3::QosBlockedDestinations> const blockedPackets=nullptr, ns3::Ptr<const ns3::WifiMacQueueItem> item=nullptr) const [member function]
     cls.add_method('PeekFirstAvailable', 
-                   'ns3::Queue< ns3::WifiMacQueueItem > ConstIterator', 
-                   [param('ns3::Ptr< ns3::QosBlockedDestinations > const', 'blockedPackets', default_value='nullptr'), param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos', default_value='ns3::WifiMacQueue::EMPTY')], 
+                   'ns3::Ptr< ns3::WifiMacQueueItem const >', 
+                   [param('ns3::Ptr< ns3::QosBlockedDestinations > const', 'blockedPackets', default_value='nullptr'), param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'item', default_value='nullptr')], 
                    is_const=True)
     ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::WifiMacQueue::Remove() [member function]
     cls.add_method('Remove', 
                    'ns3::Ptr< ns3::WifiMacQueueItem >', 
                    [], 
                    is_virtual=True)
-    ## wifi-mac-queue.h (module 'wifi'): bool ns3::WifiMacQueue::Remove(ns3::Ptr<const ns3::Packet> packet) [member function]
+    ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::WifiMacQueue::Remove(ns3::Ptr<const ns3::WifiMacQueueItem> item, bool removeExpired=false) [member function]
     cls.add_method('Remove', 
-                   'bool', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
-    ## wifi-mac-queue.h (module 'wifi'): ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator ns3::WifiMacQueue::Remove(ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos, bool removeExpired=false) [member function]
-    cls.add_method('Remove', 
-                   'ns3::Queue< ns3::WifiMacQueueItem > ConstIterator', 
-                   [param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos'), param('bool', 'removeExpired', default_value='false')])
+                   'ns3::Ptr< ns3::WifiMacQueueItem const >', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'item'), param('bool', 'removeExpired', default_value='false')])
+    ## wifi-mac-queue.h (module 'wifi'): void ns3::WifiMacQueue::Replace(ns3::Ptr<const ns3::WifiMacQueueItem> currentItem, ns3::Ptr<ns3::WifiMacQueueItem> newItem) [member function]
+    cls.add_method('Replace', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'currentItem'), param('ns3::Ptr< ns3::WifiMacQueueItem >', 'newItem')])
     ## wifi-mac-queue.h (module 'wifi'): uint32_t ns3::WifiMacQueue::GetNPacketsByAddress(ns3::Mac48Address dest) [member function]
     cls.add_method('GetNPacketsByAddress', 
                    'uint32_t', 
@@ -19824,12 +19814,10 @@
     cls.add_method('GetNBytes', 
                    'uint32_t', 
                    [])
-    ## wifi-mac-queue.h (module 'wifi'): bool ns3::WifiMacQueue::TtlExceeded(ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator & it, ns3::Time const & now) [member function]
+    ## wifi-mac-queue.h (module 'wifi'): bool ns3::WifiMacQueue::TtlExceeded(ns3::Ptr<const ns3::WifiMacQueueItem> item, ns3::Time const & now) [member function]
     cls.add_method('TtlExceeded', 
                    'bool', 
-                   [param('ns3::Queue< ns3::WifiMacQueueItem > ConstIterator &', 'it'), param('ns3::Time const &', 'now')])
-    ## wifi-mac-queue.h (module 'wifi'): ns3::WifiMacQueue::EMPTY [variable]
-    cls.add_static_attribute('EMPTY', 'ns3::Queue< ns3::WifiMacQueueItem > ConstIterator const', is_const=True)
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'item'), param('ns3::Time const &', 'now')])
     ## wifi-mac-queue.h (module 'wifi'): ns3::WifiMacQueue::WifiMacQueue(ns3::WifiMacQueue const & arg0) [constructor]
     cls.add_constructor([param('ns3::WifiMacQueue const &', 'arg0')])
     return
@@ -19882,6 +19870,15 @@
                    is_static=True)
     ## wifi-net-device.h (module 'wifi'): ns3::WifiNetDevice::WifiNetDevice() [constructor]
     cls.add_constructor([])
+    ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::SetStandard(ns3::WifiStandard standard) [member function]
+    cls.add_method('SetStandard', 
+                   'void', 
+                   [param('ns3::WifiStandard', 'standard')])
+    ## wifi-net-device.h (module 'wifi'): ns3::WifiStandard ns3::WifiNetDevice::GetStandard() const [member function]
+    cls.add_method('GetStandard', 
+                   'ns3::WifiStandard', 
+                   [], 
+                   is_const=True)
     ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::SetMac(ns3::Ptr<ns3::WifiMac> const mac) [member function]
     cls.add_method('SetMac', 
                    'void', 
@@ -20221,6 +20218,28 @@
                    is_virtual=True, visibility='private')
     return
 
+def register_Ns3CallbackImpl__Bool_Const_ns3WifiTxVector___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< bool, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): bool ns3::CallbackImpl<bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::WifiTxVector const & arg0) [member operator]
+    cls.add_method('operator()', 
+                   'bool', 
+                   [param('ns3::WifiTxVector const &', 'arg0')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
 def register_Ns3CallbackImpl__Bool_Ns3Ptr__lt__const_ns3Packet__gt___Const_ns3Address___amp___Unsigned_int_Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
     ## callback.h (module 'core'): ns3::CallbackImpl<bool, ns3::Ptr<const ns3::Packet>, const ns3::Address &, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
@@ -20287,28 +20306,6 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3CallbackImpl__Bool_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): bool ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(short unsigned int arg0, unsigned char arg1) [member operator]
-    cls.add_method('operator()', 
-                   'bool', 
-                   [param('short unsigned int', 'arg0'), param('unsigned char', 'arg1')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
 def register_Ns3CallbackImpl__Ns3ObjectBase___star___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
     ## callback.h (module 'core'): ns3::CallbackImpl<ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
@@ -20375,28 +20372,6 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3CallbackImpl__Unsigned_long_Unsigned_short_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): long unsigned int ns3::CallbackImpl<unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(short unsigned int arg0, short unsigned int arg1, unsigned char arg2) [member operator]
-    cls.add_method('operator()', 
-                   'long unsigned int', 
-                   [param('short unsigned int', 'arg0'), param('short unsigned int', 'arg1'), param('unsigned char', 'arg2')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
 def register_Ns3CallbackImpl__Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
     ## callback.h (module 'core'): ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
@@ -20771,22 +20746,22 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___StdMap__lt__stdPair__lt__unsigned_int__unsigned_int__gt____double__stdLess__lt__stdPair__lt__unsigned_int__unsigned_int__gt_____gt____stdAllocator__lt__stdPair__lt__const_stdPair__lt__unsigned_int__unsigned_int__gt____double__gt_____gt_____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___StdMap__lt__stdPair__lt__unsigned_int__unsigned_int__gt____double__stdLess__lt__stdPair__lt__unsigned_int__unsigned_int__gt____gt____stdAllocator__lt__stdPair__lt__const_stdPair__lt__unsigned_int__unsigned_int__gt____double__gt____gt____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int>>, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double>>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int>>, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double>>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int>>, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double>>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
     cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::Packet const >, std::map< std::pair< unsigned int, unsigned int >, double >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int>>, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double>>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
     cls.add_method('DoGetTypeid', 
                    'std::string', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int>>, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double>>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
     cls.add_method('GetTypeid', 
                    'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::Packet> arg0, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > > arg1) [member operator]
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int>>, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double>>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::Packet> arg0, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int>>, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double>>> arg1) [member operator]
     cls.add_method('operator()', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet const >', 'arg0'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'arg1')], 
@@ -21014,22 +20989,22 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiPsdu__gt___Ns3RxSignalInfo_Ns3WifiTxVector_StdVector__lt__bool__stdAllocator__lt__bool__gt_____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiPsdu__gt___Ns3RxSignalInfo_Ns3WifiTxVector_StdVector__lt__bool__stdAllocator__lt__bool__gt____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
     cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::WifiPsdu >, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
     cls.add_method('DoGetTypeid', 
                    'std::string', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
     cls.add_method('GetTypeid', 
                    'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<ns3::WifiPsdu> arg0, ns3::RxSignalInfo arg1, ns3::WifiTxVector arg2, std::vector<bool, std::allocator<bool> > arg3) [member operator]
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<ns3::WifiPsdu> arg0, ns3::RxSignalInfo arg1, ns3::WifiTxVector arg2, std::vector<bool, std::allocator<bool>> arg3) [member operator]
     cls.add_method('operator()', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiPsdu >', 'arg0'), param('ns3::RxSignalInfo', 'arg1'), param('ns3::WifiTxVector', 'arg2'), param('std::vector< bool >', 'arg3')], 
@@ -21191,22 +21166,22 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3CallbackImpl__Void_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__const_ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__const_ns3WifiPsdu__gt_____gt_____gt_____gt___Ns3WifiTxVector_Double_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+def register_Ns3CallbackImpl__Void_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__const_ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__const_ns3WifiPsdu__gt____gt____gt____gt___Ns3WifiTxVector_Double_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu>>>>, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu>>>>, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu>>>>, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
     cls.add_constructor([param('ns3::CallbackImpl< void, std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu>>>>, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
     cls.add_method('DoGetTypeid', 
                    'std::string', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu>>>>, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
     cls.add_method('GetTypeid', 
                    'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > > arg0, ns3::WifiTxVector arg1, double arg2) [member operator]
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu>>>>, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu>>>> arg0, ns3::WifiTxVector arg1, double arg2) [member operator]
     cls.add_method('operator()', 
                    'void', 
                    [param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'arg0'), param('ns3::WifiTxVector', 'arg1'), param('double', 'arg2')], 
@@ -21258,22 +21233,22 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3CallbackImpl__Void_Unsigned_char_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt_____gt_____gt_____gt_____star___Const_stdSet__lt__ns3Mac48Address__stdLess__lt__ns3Mac48Address__gt____stdAllocator__lt__ns3Mac48Address__gt_____gt_____star___Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+def register_Ns3CallbackImpl__Void_Unsigned_char_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt____gt____gt____gt_____star___Const_stdSet__lt__ns3Mac48Address__stdLess__lt__ns3Mac48Address__gt____stdAllocator__lt__ns3Mac48Address__gt____gt_____star___Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
     cls.add_constructor([param('ns3::CallbackImpl< void, unsigned char, std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu >, std::hash< unsigned short >, std::equal_to< unsigned short >, std::allocator< std::pair< unsigned short const, ns3::Ptr< ns3::WifiPsdu > > > > *, std::set< ns3::Mac48Address, std::less< ns3::Mac48Address >, std::allocator< ns3::Mac48Address > > const, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
     cls.add_method('DoGetTypeid', 
                    'std::string', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
     cls.add_method('GetTypeid', 
                    'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(unsigned char arg0, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > * arg1, std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > const * arg2, long unsigned int arg3) [member operator]
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(unsigned char arg0, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> * arg1, std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> const * arg2, long unsigned int arg3) [member operator]
     cls.add_method('operator()', 
                    'void', 
                    [param('unsigned char', 'arg0'), param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > > *', 'arg1'), param('std::set< ns3::Mac48Address > const *', 'arg2'), param('long unsigned int', 'arg3')], 
@@ -21325,106 +21300,6 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3OcbWifiMac_methods(root_module, cls):
-    ## ocb-wifi-mac.h (module 'wave'): static ns3::TypeId ns3::OcbWifiMac::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## ocb-wifi-mac.h (module 'wave'): ns3::OcbWifiMac::OcbWifiMac() [constructor]
-    cls.add_constructor([])
-    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::SendVsc(ns3::Ptr<ns3::Packet> vsc, ns3::Mac48Address peer, ns3::OrganizationIdentifier oi) [member function]
-    cls.add_method('SendVsc', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'vsc'), param('ns3::Mac48Address', 'peer'), param('ns3::OrganizationIdentifier', 'oi')])
-    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::AddReceiveVscCallback(ns3::OrganizationIdentifier oi, ns3::VscCallback cb) [member function]
-    cls.add_method('AddReceiveVscCallback', 
-                   'void', 
-                   [param('ns3::OrganizationIdentifier', 'oi'), param('ns3::Callback< bool, ns3::Ptr< ns3::WifiMac >, ns3::OrganizationIdentifier const &, ns3::Ptr< ns3::Packet const >, ns3::Address const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'cb')])
-    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::RemoveReceiveVscCallback(ns3::OrganizationIdentifier oi) [member function]
-    cls.add_method('RemoveReceiveVscCallback', 
-                   'void', 
-                   [param('ns3::OrganizationIdentifier', 'oi')])
-    ## ocb-wifi-mac.h (module 'wave'): ns3::Ssid ns3::OcbWifiMac::GetSsid() const [member function]
-    cls.add_method('GetSsid', 
-                   'ns3::Ssid', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::SetSsid(ns3::Ssid ssid) [member function]
-    cls.add_method('SetSsid', 
-                   'void', 
-                   [param('ns3::Ssid', 'ssid')], 
-                   is_virtual=True)
-    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::SetBssid(ns3::Mac48Address bssid) [member function]
-    cls.add_method('SetBssid', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'bssid')], 
-                   is_virtual=True)
-    ## ocb-wifi-mac.h (module 'wave'): ns3::Mac48Address ns3::OcbWifiMac::GetBssid() const [member function]
-    cls.add_method('GetBssid', 
-                   'ns3::Mac48Address', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::SetLinkUpCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkUp) [member function]
-    cls.add_method('SetLinkUpCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkUp')], 
-                   is_virtual=True)
-    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::SetLinkDownCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkDown) [member function]
-    cls.add_method('SetLinkDownCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkDown')], 
-                   is_virtual=True)
-    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to) [member function]
-    cls.add_method('Enqueue', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to')], 
-                   is_virtual=True)
-    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::ConfigureEdca(uint32_t cwmin, uint32_t cwmax, uint32_t aifsn, ns3::AcIndex ac) [member function]
-    cls.add_method('ConfigureEdca', 
-                   'void', 
-                   [param('uint32_t', 'cwmin'), param('uint32_t', 'cwmax'), param('uint32_t', 'aifsn'), param('ns3::AcIndex', 'ac')])
-    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::EnableForWave(ns3::Ptr<ns3::WaveNetDevice> device) [member function]
-    cls.add_method('EnableForWave', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WaveNetDevice >', 'device')])
-    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::Suspend() [member function]
-    cls.add_method('Suspend', 
-                   'void', 
-                   [])
-    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::Resume() [member function]
-    cls.add_method('Resume', 
-                   'void', 
-                   [])
-    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::MakeVirtualBusy(ns3::Time duration) [member function]
-    cls.add_method('MakeVirtualBusy', 
-                   'void', 
-                   [param('ns3::Time', 'duration')])
-    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::CancleTx(ns3::AcIndex ac) [member function]
-    cls.add_method('CancleTx', 
-                   'void', 
-                   [param('ns3::AcIndex', 'ac')])
-    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::Reset() [member function]
-    cls.add_method('Reset', 
-                   'void', 
-                   [])
-    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::ConfigureStandard(ns3::WifiStandard standard) [member function]
-    cls.add_method('ConfigureStandard', 
-                   'void', 
-                   [param('ns3::WifiStandard', 'standard')], 
-                   is_virtual=True)
-    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::DoDispose() [member function]
-    cls.add_method('DoDispose', 
-                   'void', 
-                   [], 
-                   is_virtual=True, visibility='protected')
-    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::Receive(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('Receive', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
-                   is_virtual=True, visibility='private')
-    return
-
 def register_Ns3QueueDiscItem_methods(root_module, cls):
     ## queue-item.h (module 'network'): ns3::QueueDiscItem::QueueDiscItem(ns3::Ptr<ns3::Packet> p, ns3::Address const & addr, uint16_t protocol) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::Packet >', 'p'), param('ns3::Address const &', 'addr'), param('uint16_t', 'protocol')])
@@ -21495,7 +21370,7 @@
                    'ns3::Ptr< ns3::OcbWifiMac >', 
                    [param('uint32_t', 'channelNumber')], 
                    is_const=True)
-    ## wave-net-device.h (module 'wave'): std::map<unsigned int, ns3::Ptr<ns3::OcbWifiMac>, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, ns3::Ptr<ns3::OcbWifiMac> > > > ns3::WaveNetDevice::GetMacs() const [member function]
+    ## wave-net-device.h (module 'wave'): std::map<unsigned int, ns3::Ptr<ns3::OcbWifiMac>, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, ns3::Ptr<ns3::OcbWifiMac>>>> ns3::WaveNetDevice::GetMacs() const [member function]
     cls.add_method('GetMacs', 
                    'std::map< unsigned int, ns3::Ptr< ns3::OcbWifiMac > >', 
                    [], 
@@ -21509,7 +21384,7 @@
                    'ns3::Ptr< ns3::WifiPhy >', 
                    [param('uint32_t', 'index')], 
                    is_const=True)
-    ## wave-net-device.h (module 'wave'): std::vector<ns3::Ptr<ns3::WifiPhy>, std::allocator<ns3::Ptr<ns3::WifiPhy> > > ns3::WaveNetDevice::GetPhys() const [member function]
+    ## wave-net-device.h (module 'wave'): std::vector<ns3::Ptr<ns3::WifiPhy>, std::allocator<ns3::Ptr<ns3::WifiPhy>>> ns3::WaveNetDevice::GetPhys() const [member function]
     cls.add_method('GetPhys', 
                    'std::vector< ns3::Ptr< ns3::WifiPhy > >', 
                    [], 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wave/bindings/modulegen__gcc_LP64.py ns-3.36/src/wave/bindings/modulegen__gcc_LP64.py
--- ns-3.35/src/wave/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wave/bindings/modulegen__gcc_LP64.py	2022-04-30 18:23:58.190735000 -0700
@@ -24,32 +24,18 @@
     module.add_enum('AcIndex', ['AC_BE', 'AC_BK', 'AC_VI', 'AC_VO', 'AC_BE_NQOS', 'AC_BEACON', 'AC_UNDEF'], import_from_module='ns.wifi')
     ## ctrl-headers.h (module 'wifi'): ns3::TriggerFrameType [enumeration]
     module.add_enum('TriggerFrameType', ['BASIC_TRIGGER', 'BFRP_TRIGGER', 'MU_BAR_TRIGGER', 'MU_RTS_TRIGGER', 'BSRP_TRIGGER', 'GCR_MU_BAR_TRIGGER', 'BQRP_TRIGGER', 'NFRP_TRIGGER'], import_from_module='ns.wifi')
-    ## wifi-mpdu-type.h (module 'wifi'): ns3::MpduType [enumeration]
-    module.add_enum('MpduType', ['NORMAL_MPDU', 'SINGLE_MPDU', 'FIRST_MPDU_IN_AGGREGATE', 'MIDDLE_MPDU_IN_AGGREGATE', 'LAST_MPDU_IN_AGGREGATE'], import_from_module='ns.wifi')
+    ## wifi-mac.h (module 'wifi'): ns3::WifiMacDropReason [enumeration]
+    module.add_enum('WifiMacDropReason', ['WIFI_MAC_DROP_FAILED_ENQUEUE', 'WIFI_MAC_DROP_EXPIRED_LIFETIME', 'WIFI_MAC_DROP_REACHED_RETRY_LIMIT', 'WIFI_MAC_DROP_QOS_OLD_PACKET'], import_from_module='ns.wifi')
     ## channel-scheduler.h (module 'wave'): ns3::ChannelAccess [enumeration]
     module.add_enum('ChannelAccess', ['ContinuousAccess', 'AlternatingAccess', 'ExtendedAccess', 'DefaultCchAccess', 'NoAccess'])
     ## vsa-manager.h (module 'wave'): ns3::VsaTransmitInterval [enumeration]
     module.add_enum('VsaTransmitInterval', ['VSA_TRANSMIT_IN_CCHI', 'VSA_TRANSMIT_IN_SCHI', 'VSA_TRANSMIT_IN_BOTHI'])
     ## queue-size.h (module 'network'): ns3::QueueSizeUnit [enumeration]
     module.add_enum('QueueSizeUnit', ['PACKETS', 'BYTES'], import_from_module='ns.network')
-    ## regular-wifi-mac.h (module 'wifi'): ns3::WifiTxTimerReason [enumeration]
-    module.add_enum('WifiTxTimerReason', [], import_from_module='ns.wifi')
-    ## wifi-mac.h (module 'wifi'): ns3::WifiMacDropReason [enumeration]
-    module.add_enum('WifiMacDropReason', ['WIFI_MAC_DROP_FAILED_ENQUEUE', 'WIFI_MAC_DROP_EXPIRED_LIFETIME', 'WIFI_MAC_DROP_REACHED_RETRY_LIMIT', 'WIFI_MAC_DROP_QOS_OLD_PACKET'], import_from_module='ns.wifi')
     ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacType [enumeration]
     module.add_enum('WifiMacType', ['WIFI_MAC_CTL_TRIGGER', 'WIFI_MAC_CTL_CTLWRAPPER', 'WIFI_MAC_CTL_RTS', 'WIFI_MAC_CTL_CTS', 'WIFI_MAC_CTL_ACK', 'WIFI_MAC_CTL_BACKREQ', 'WIFI_MAC_CTL_BACKRESP', 'WIFI_MAC_CTL_END', 'WIFI_MAC_CTL_END_ACK', 'WIFI_MAC_MGT_BEACON', 'WIFI_MAC_MGT_ASSOCIATION_REQUEST', 'WIFI_MAC_MGT_ASSOCIATION_RESPONSE', 'WIFI_MAC_MGT_DISASSOCIATION', 'WIFI_MAC_MGT_REASSOCIATION_REQUEST', 'WIFI_MAC_MGT_REASSOCIATION_RESPONSE', 'WIFI_MAC_MGT_PROBE_REQUEST', 'WIFI_MAC_MGT_PROBE_RESPONSE', 'WIFI_MAC_MGT_AUTHENTICATION', 'WIFI_MAC_MGT_DEAUTHENTICATION', 'WIFI_MAC_MGT_ACTION', 'WIFI_MAC_MGT_ACTION_NO_ACK', 'WIFI_MAC_MGT_MULTIHOP_ACTION', 'WIFI_MAC_DATA', 'WIFI_MAC_DATA_CFACK', 'WIFI_MAC_DATA_CFPOLL', 'WIFI_MAC_DATA_CFACK_CFPOLL', 'WIFI_MAC_DATA_NULL', 'WIFI_MAC_DATA_NULL_CFACK', 'WIFI_MAC_DATA_NULL_CFPOLL', 'WIFI_MAC_DATA_NULL_CFACK_CFPOLL', 'WIFI_MAC_QOSDATA', 'WIFI_MAC_QOSDATA_CFACK', 'WIFI_MAC_QOSDATA_CFPOLL', 'WIFI_MAC_QOSDATA_CFACK_CFPOLL', 'WIFI_MAC_QOSDATA_NULL', 'WIFI_MAC_QOSDATA_NULL_CFPOLL', 'WIFI_MAC_QOSDATA_NULL_CFACK_CFPOLL'], import_from_module='ns.wifi')
     ## wifi-mac.h (module 'wifi'): ns3::TypeOfStation [enumeration]
     module.add_enum('TypeOfStation', ['STA', 'AP', 'ADHOC_STA', 'MESH', 'OCB'], import_from_module='ns.wifi')
-    ## wifi-standards.h (module 'wifi'): ns3::WifiPhyStandard [enumeration]
-    module.add_enum('WifiPhyStandard', ['WIFI_PHY_STANDARD_80211a', 'WIFI_PHY_STANDARD_80211b', 'WIFI_PHY_STANDARD_80211g', 'WIFI_PHY_STANDARD_80211p', 'WIFI_PHY_STANDARD_80211n', 'WIFI_PHY_STANDARD_80211ac', 'WIFI_PHY_STANDARD_80211ax', 'WIFI_PHY_STANDARD_UNSPECIFIED'], import_from_module='ns.wifi')
-    ## wifi-standards.h (module 'wifi'): ns3::WifiMacStandard [enumeration]
-    module.add_enum('WifiMacStandard', ['WIFI_MAC_STANDARD_80211', 'WIFI_MAC_STANDARD_80211n', 'WIFI_MAC_STANDARD_80211ac', 'WIFI_MAC_STANDARD_80211ax'], import_from_module='ns.wifi')
-    ## wifi-standards.h (module 'wifi'): ns3::WifiStandard [enumeration]
-    module.add_enum('WifiStandard', ['WIFI_STANDARD_80211a', 'WIFI_STANDARD_80211b', 'WIFI_STANDARD_80211g', 'WIFI_STANDARD_80211p', 'WIFI_STANDARD_80211n_2_4GHZ', 'WIFI_STANDARD_80211n_5GHZ', 'WIFI_STANDARD_80211ac', 'WIFI_STANDARD_80211ax_2_4GHZ', 'WIFI_STANDARD_80211ax_5GHZ', 'WIFI_STANDARD_80211ax_6GHZ'], import_from_module='ns.wifi')
-    ## wifi-standards.h (module 'wifi'): ns3::FrequencyChannelType [enumeration]
-    module.add_enum('FrequencyChannelType', ['WIFI_PHY_DSSS_CHANNEL', 'WIFI_PHY_OFDM_CHANNEL', 'WIFI_PHY_80211p_CHANNEL'], import_from_module='ns.wifi')
-    ## wifi-phy-band.h (module 'wifi'): ns3::WifiPhyBand [enumeration]
-    module.add_enum('WifiPhyBand', ['WIFI_PHY_BAND_2_4GHZ', 'WIFI_PHY_BAND_5GHZ', 'WIFI_PHY_BAND_6GHZ', 'WIFI_PHY_BAND_UNSPECIFIED'], import_from_module='ns.wifi')
     ## wifi-phy-common.h (module 'wifi'): ns3::WifiPreamble [enumeration]
     module.add_enum('WifiPreamble', ['WIFI_PREAMBLE_LONG', 'WIFI_PREAMBLE_SHORT', 'WIFI_PREAMBLE_HT_MF', 'WIFI_PREAMBLE_VHT_SU', 'WIFI_PREAMBLE_VHT_MU', 'WIFI_PREAMBLE_HE_SU', 'WIFI_PREAMBLE_HE_ER_SU', 'WIFI_PREAMBLE_HE_MU', 'WIFI_PREAMBLE_HE_TB'], import_from_module='ns.wifi')
     ## wifi-phy-common.h (module 'wifi'): ns3::WifiModulationClass [enumeration]
@@ -59,7 +45,15 @@
     ## wifi-phy-common.h (module 'wifi'): ns3::WifiPpduType [enumeration]
     module.add_enum('WifiPpduType', ['WIFI_PPDU_TYPE_SU', 'WIFI_PPDU_TYPE_DL_MU', 'WIFI_PPDU_TYPE_UL_MU'], import_from_module='ns.wifi')
     ## wifi-phy-common.h (module 'wifi'): ns3::WifiPhyRxfailureReason [enumeration]
-    module.add_enum('WifiPhyRxfailureReason', ['UNKNOWN', 'UNSUPPORTED_SETTINGS', 'CHANNEL_SWITCHING', 'RXING', 'TXING', 'SLEEPING', 'BUSY_DECODING_PREAMBLE', 'PREAMBLE_DETECT_FAILURE', 'RECEPTION_ABORTED_BY_TX', 'L_SIG_FAILURE', 'HT_SIG_FAILURE', 'SIG_A_FAILURE', 'SIG_B_FAILURE', 'PREAMBLE_DETECTION_PACKET_SWITCH', 'FRAME_CAPTURE_PACKET_SWITCH', 'OBSS_PD_CCA_RESET', 'HE_TB_PPDU_TOO_LATE', 'FILTERED'], import_from_module='ns.wifi')
+    module.add_enum('WifiPhyRxfailureReason', ['UNKNOWN', 'UNSUPPORTED_SETTINGS', 'CHANNEL_SWITCHING', 'RXING', 'TXING', 'SLEEPING', 'POWERED_OFF', 'TRUNCATED_TX', 'BUSY_DECODING_PREAMBLE', 'PREAMBLE_DETECT_FAILURE', 'RECEPTION_ABORTED_BY_TX', 'L_SIG_FAILURE', 'HT_SIG_FAILURE', 'SIG_A_FAILURE', 'SIG_B_FAILURE', 'PREAMBLE_DETECTION_PACKET_SWITCH', 'FRAME_CAPTURE_PACKET_SWITCH', 'OBSS_PD_CCA_RESET', 'HE_TB_PPDU_TOO_LATE', 'FILTERED'], import_from_module='ns.wifi')
+    ## wifi-mpdu-type.h (module 'wifi'): ns3::MpduType [enumeration]
+    module.add_enum('MpduType', ['NORMAL_MPDU', 'SINGLE_MPDU', 'FIRST_MPDU_IN_AGGREGATE', 'MIDDLE_MPDU_IN_AGGREGATE', 'LAST_MPDU_IN_AGGREGATE'], import_from_module='ns.wifi')
+    ## wifi-standards.h (module 'wifi'): ns3::WifiStandard [enumeration]
+    module.add_enum('WifiStandard', ['WIFI_STANDARD_UNSPECIFIED', 'WIFI_STANDARD_80211a', 'WIFI_STANDARD_80211b', 'WIFI_STANDARD_80211g', 'WIFI_STANDARD_80211p', 'WIFI_STANDARD_80211n', 'WIFI_STANDARD_80211ac', 'WIFI_STANDARD_80211ax'], import_from_module='ns.wifi')
+    ## wifi-standards.h (module 'wifi'): ns3::FrequencyChannelType [enumeration]
+    module.add_enum('FrequencyChannelType', ['WIFI_PHY_DSSS_CHANNEL', 'WIFI_PHY_OFDM_CHANNEL', 'WIFI_PHY_80211p_CHANNEL'], import_from_module='ns.wifi')
+    ## wifi-phy-band.h (module 'wifi'): ns3::WifiPhyBand [enumeration]
+    module.add_enum('WifiPhyBand', ['WIFI_PHY_BAND_2_4GHZ', 'WIFI_PHY_BAND_5GHZ', 'WIFI_PHY_BAND_6GHZ', 'WIFI_PHY_BAND_UNSPECIFIED'], import_from_module='ns.wifi')
     ## log.h (module 'core'): ns3::LogLevel [enumeration]
     module.add_enum('LogLevel', ['LOG_NONE', 'LOG_ERROR', 'LOG_LEVEL_ERROR', 'LOG_WARN', 'LOG_LEVEL_WARN', 'LOG_DEBUG', 'LOG_LEVEL_DEBUG', 'LOG_INFO', 'LOG_LEVEL_INFO', 'LOG_FUNCTION', 'LOG_LEVEL_FUNCTION', 'LOG_LOGIC', 'LOG_LEVEL_LOGIC', 'LOG_ALL', 'LOG_LEVEL_ALL', 'LOG_PREFIX_FUNC', 'LOG_PREFIX_TIME', 'LOG_PREFIX_NODE', 'LOG_PREFIX_LEVEL', 'LOG_PREFIX_ALL'], import_from_module='ns.core')
     ## address.h (module 'network'): ns3::Address [class]
@@ -168,6 +162,8 @@
     module.add_class('EdcaParameter')
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'], import_from_module='ns.core')
     ## hash.h (module 'core'): ns3::Hasher [class]
     module.add_class('Hasher', import_from_module='ns.core')
     ## wifi-tx-vector.h (module 'wifi'): ns3::HeMuUserInfo [struct]
@@ -413,24 +409,18 @@
     typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::ConstellationSizeCallback')
     typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::ConstellationSizeCallback*')
     typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::ConstellationSizeCallback&')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::PhyRateCallback')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::PhyRateCallback*')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::PhyRateCallback&')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::PhyRateFromTxVectorCallback')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::PhyRateFromTxVectorCallback*')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::PhyRateFromTxVectorCallback&')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::DataRateCallback')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::DataRateCallback*')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::DataRateCallback&')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::DataRateFromTxVectorCallback')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::DataRateFromTxVectorCallback*')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::DataRateFromTxVectorCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::PhyRateCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::PhyRateCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::PhyRateCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::DataRateCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::DataRateCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::DataRateCallback&')
     typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::NonHtReferenceRateCallback')
     typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::NonHtReferenceRateCallback*')
     typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::NonHtReferenceRateCallback&')
-    typehandlers.add_type_alias('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::ModeAllowedCallback')
-    typehandlers.add_type_alias('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::ModeAllowedCallback*')
-    typehandlers.add_type_alias('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::ModeAllowedCallback&')
+    typehandlers.add_type_alias('ns3::Callback< bool, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::AllowedCallback')
+    typehandlers.add_type_alias('ns3::Callback< bool, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::AllowedCallback*')
+    typehandlers.add_type_alias('ns3::Callback< bool, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::AllowedCallback&')
     ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiNoAck [struct]
     module.add_class('WifiNoAck', import_from_module='ns.wifi', parent=root_module['ns3::WifiAcknowledgment'])
     ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiNormalAck [struct]
@@ -441,6 +431,9 @@
     module.add_enum('SupportedPcapDataLinkTypes', ['DLT_IEEE802_11', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO'], outer_class=root_module['ns3::WifiPhyHelper'], import_from_module='ns.wifi')
     ## wifi-phy-operating-channel.h (module 'wifi'): ns3::WifiPhyOperatingChannel [class]
     module.add_class('WifiPhyOperatingChannel', import_from_module='ns.wifi')
+    typehandlers.add_type_alias('std::set< std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand > > const_iterator', 'ns3::WifiPhyOperatingChannel::ConstIterator')
+    typehandlers.add_type_alias('std::set< std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand > > const_iterator*', 'ns3::WifiPhyOperatingChannel::ConstIterator*')
+    typehandlers.add_type_alias('std::set< std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand > > const_iterator&', 'ns3::WifiPhyOperatingChannel::ConstIterator&')
     ## wifi-protection.h (module 'wifi'): ns3::WifiProtection [struct]
     module.add_class('WifiProtection', allow_subclassing=True, import_from_module='ns.wifi')
     ## wifi-protection.h (module 'wifi'): ns3::WifiProtection::Method [enumeration]
@@ -459,8 +452,6 @@
     module.add_class('WifiSpectrumValue5MhzFactory', allow_subclassing=True, import_from_module='ns.spectrum')
     ## wifi-spectrum-value-helper.h (module 'spectrum'): ns3::WifiSpectrumValueHelper [class]
     module.add_class('WifiSpectrumValueHelper', import_from_module='ns.spectrum')
-    ## wifi-standards.h (module 'wifi'): ns3::WifiStandardInfo [struct]
-    module.add_class('WifiStandardInfo', import_from_module='ns.wifi')
     ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters [class]
     module.add_class('WifiTxParameters', import_from_module='ns.wifi')
     ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters::PsduInfo [struct]
@@ -536,53 +527,53 @@
     module.add_class('RandomVariableStream', import_from_module='ns.core', parent=root_module['ns3::Object'])
     ## random-variable-stream.h (module 'core'): ns3::SequentialRandomVariable [class]
     module.add_class('SequentialRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ChannelCoordinationListener, ns3::empty, ns3::DefaultDeleter<ns3::ChannelCoordinationListener> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ChannelCoordinationListener, ns3::empty, ns3::DefaultDeleter<ns3::ChannelCoordinationListener>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::ChannelCoordinationListener', 'ns3::empty', 'ns3::DefaultDeleter<ns3::ChannelCoordinationListener>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Event, ns3::empty, ns3::DefaultDeleter<ns3::Event> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Event, ns3::empty, ns3::DefaultDeleter<ns3::Event>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Event', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Event>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv4MulticastRoute', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv4Route', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv4Route>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MacRxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacRxMiddle> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MacRxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacRxMiddle>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::MacRxMiddle', 'ns3::empty', 'ns3::DefaultDeleter<ns3::MacRxMiddle>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MacTxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacTxMiddle> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MacTxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacTxMiddle>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::MacTxMiddle', 'ns3::empty', 'ns3::DefaultDeleter<ns3::MacTxMiddle>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::OutputStreamWrapper', 'ns3::empty', 'ns3::DefaultDeleter<ns3::OutputStreamWrapper>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::PhyEntity', 'ns3::empty', 'ns3::DefaultDeleter<ns3::PhyEntity>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::QueueItem', 'ns3::empty', 'ns3::DefaultDeleter<ns3::QueueItem>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::SpectrumModel', 'ns3::empty', 'ns3::DefaultDeleter<ns3::SpectrumModel>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::SpectrumValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::SpectrumValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::WifiInformationElement', 'ns3::empty', 'ns3::DefaultDeleter<ns3::WifiInformationElement>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiMacQueueItem, ns3::empty, ns3::DefaultDeleter<ns3::WifiMacQueueItem> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiMacQueueItem, ns3::empty, ns3::DefaultDeleter<ns3::WifiMacQueueItem>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::WifiMacQueueItem', 'ns3::empty', 'ns3::DefaultDeleter<ns3::WifiMacQueueItem>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiPpdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPpdu> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiPpdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPpdu>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::WifiPpdu', 'ns3::empty', 'ns3::DefaultDeleter<ns3::WifiPpdu>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiPsdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPsdu> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiPsdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPsdu>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::WifiPsdu', 'ns3::empty', 'ns3::DefaultDeleter<ns3::WifiPsdu>'])
     ## socket.h (module 'network'): ns3::Socket [class]
     module.add_class('Socket', import_from_module='ns.network', parent=root_module['ns3::Object'])
@@ -693,6 +684,9 @@
     typehandlers.add_type_alias('void ( * ) ( ns3::WifiTxVector, ns3::Time )', 'ns3::WifiPhy::PhyRxPayloadBeginTracedCallback')
     typehandlers.add_type_alias('void ( * ) ( ns3::WifiTxVector, ns3::Time )*', 'ns3::WifiPhy::PhyRxPayloadBeginTracedCallback*')
     typehandlers.add_type_alias('void ( * ) ( ns3::WifiTxVector, ns3::Time )&', 'ns3::WifiPhy::PhyRxPayloadBeginTracedCallback&')
+    typehandlers.add_type_alias('std::tuple< unsigned char, unsigned short, int, unsigned char >', 'ns3::WifiPhy::ChannelTuple')
+    typehandlers.add_type_alias('std::tuple< unsigned char, unsigned short, int, unsigned char >*', 'ns3::WifiPhy::ChannelTuple*')
+    typehandlers.add_type_alias('std::tuple< unsigned char, unsigned short, int, unsigned char >&', 'ns3::WifiPhy::ChannelTuple&')
     ## wifi-phy-state-helper.h (module 'wifi'): ns3::WifiPhyStateHelper [class]
     module.add_class('WifiPhyStateHelper', import_from_module='ns.wifi', parent=root_module['ns3::Object'])
     typehandlers.add_type_alias('void ( * ) ( ns3::Time, ns3::Time, WifiPhyState )', 'ns3::WifiPhyStateHelper::StateTracedCallback')
@@ -966,6 +960,8 @@
     module.add_class('ObjectFactoryChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
     ## object-factory.h (module 'core'): ns3::ObjectFactoryValue [class]
     module.add_class('ObjectFactoryValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## ocb-wifi-mac.h (module 'wave'): ns3::OcbWifiMac [class]
+    module.add_class('OcbWifiMac', parent=root_module['ns3::WifiMac'])
     ## vendor-specific-action.h (module 'wave'): ns3::OrganizationIdentifierChecker [class]
     module.add_class('OrganizationIdentifierChecker', parent=root_module['ns3::AttributeChecker'])
     ## vendor-specific-action.h (module 'wave'): ns3::OrganizationIdentifierValue [class]
@@ -1050,8 +1046,6 @@
     module.add_enum('ErrorUnit', ['ERROR_UNIT_BIT', 'ERROR_UNIT_BYTE', 'ERROR_UNIT_PACKET'], outer_class=root_module['ns3::RateErrorModel'], import_from_module='ns.network')
     ## error-model.h (module 'network'): ns3::ReceiveListErrorModel [class]
     module.add_class('ReceiveListErrorModel', import_from_module='ns.network', parent=root_module['ns3::ErrorModel'])
-    ## regular-wifi-mac.h (module 'wifi'): ns3::RegularWifiMac [class]
-    module.add_class('RegularWifiMac', import_from_module='ns.wifi', parent=root_module['ns3::WifiMac'])
     ## ssid.h (module 'wifi'): ns3::Ssid [class]
     module.add_class('Ssid', import_from_module='ns.wifi', parent=root_module['ns3::WifiInformationElement'])
     ## ssid.h (module 'wifi'): ns3::SsidChecker [class]
@@ -1098,22 +1092,20 @@
     module.add_class('BinaryErrorModel', import_from_module='ns.network', parent=root_module['ns3::ErrorModel'])
     ## error-model.h (module 'network'): ns3::BurstErrorModel [class]
     module.add_class('BurstErrorModel', import_from_module='ns.network', parent=root_module['ns3::ErrorModel'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['bool', 'const ns3::WifiTxVector &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<bool, ns3::Ptr<const ns3::Packet>, const ns3::Address &, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['bool', 'ns3::Ptr<const ns3::Packet>', 'const ns3::Address &', 'unsigned int', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['bool', 'ns3::Ptr<ns3::Socket>', 'const ns3::Address &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<bool, ns3::Ptr<ns3::WifiMac>, const ns3::OrganizationIdentifier &, ns3::Ptr<const ns3::Packet>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['bool', 'ns3::Ptr<ns3::WifiMac>', 'const ns3::OrganizationIdentifier &', 'ns3::Ptr<const ns3::Packet>', 'const ns3::Address &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['bool', 'unsigned short', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['ns3::ObjectBase *', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned long', 'const ns3::WifiTxVector &', 'unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned long', 'unsigned short', 'unsigned short', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, const ns3::Ipv4Header &, ns3::Ptr<const ns3::Packet>, ns3::Ipv4L3Protocol::DropReason, ns3::Ptr<ns3::Ipv4>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
@@ -1148,8 +1140,8 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::WifiPhyRxfailureReason', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<const ns3::Packet>', 'std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int>>, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double>>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<const ns3::Packet>', 'std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int>>, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double>>>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, ns3::SignalNoiseDbm, unsigned short, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'ns3::WifiTxVector', 'ns3::MpduInfo', 'ns3::SignalNoiseDbm', 'unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
@@ -1170,8 +1162,8 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::Socket>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::WifiMacQueueItem>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::WifiPsdu>', 'ns3::RxSignalInfo', 'ns3::WifiTxVector', 'std::vector<bool, std::allocator<bool> >', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::WifiPsdu>', 'ns3::RxSignalInfo', 'ns3::WifiTxVector', 'std::vector<bool, std::allocator<bool>>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::WifiPsdu>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::Mac48Address, unsigned char, ns3::OriginatorBlockAckAgreement::State, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
@@ -1186,20 +1178,18 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::WifiTxVector', 'ns3::Time', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >', 'ns3::WifiTxVector', 'double', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu>>>>, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu>>>>', 'ns3::WifiTxVector', 'double', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned char', 'ns3::Ptr<const ns3::WifiMacQueueItem>', 'const ns3::WifiTxVector &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned char', 'ns3::Ptr<const ns3::WifiPsdu>', 'const ns3::WifiTxVector &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned char', 'std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *', 'const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *', 'unsigned long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned char', 'std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *', 'const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *', 'unsigned long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned int', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## ocb-wifi-mac.h (module 'wave'): ns3::OcbWifiMac [class]
-    module.add_class('OcbWifiMac', parent=root_module['ns3::RegularWifiMac'])
     ## queue-item.h (module 'network'): ns3::QueueDiscItem [class]
     module.add_class('QueueDiscItem', import_from_module='ns.network', parent=root_module['ns3::QueueItem'])
     ## wave-net-device.h (module 'wave'): ns3::WaveNetDevice [class]
@@ -1214,7 +1204,7 @@
     module.add_container('ns3::HeRu::SubcarrierGroup', 'std::pair< short, short >', container_type='vector')
     module.add_container('std::map< std::pair< unsigned char, ns3::HeRu::RuType >, std::vector< std::vector< std::pair< short, short > > > >', ('std::pair< unsigned char, ns3::HeRu::RuType >', 'std::vector< std::vector< std::pair< short, short > > >'), container_type='map')
     module.add_container('std::map< std::pair< unsigned int, unsigned int >, double >', ('std::pair< unsigned int, unsigned int >', 'double'), container_type='map')
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     module.add_container('ns3::EdcaParameters', ('ns3::AcIndex', 'ns3::EdcaParameter'), container_type='map')
     module.add_container('std::vector< double >', 'double', container_type='vector')
     module.add_container('std::vector< int >', 'int', container_type='vector')
@@ -1224,6 +1214,7 @@
     module.add_container('std::map< ns3::Mac48Address, ns3::WifiDlMuBarBaSequence::BlockAckInfo >', ('ns3::Mac48Address', 'ns3::WifiDlMuBarBaSequence::BlockAckInfo'), container_type='map')
     module.add_container('std::map< ns3::Mac48Address, ns3::WifiDlMuBarBaSequence::BlockAckReqInfo >', ('ns3::Mac48Address', 'ns3::WifiDlMuBarBaSequence::BlockAckReqInfo'), container_type='map')
     module.add_container('std::map< ns3::Mac48Address, ns3::WifiDlMuTfMuBar::BlockAckInfo >', ('ns3::Mac48Address', 'ns3::WifiDlMuTfMuBar::BlockAckInfo'), container_type='map')
+    module.add_container('std::set< std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand > >', 'std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand >', container_type='set')
     module.add_container('ns3::WifiModeList', 'ns3::WifiMode', container_type='vector')
     module.add_container('std::vector< std::pair< unsigned int, unsigned int > >', 'std::pair< unsigned int, unsigned int >', container_type='vector')
     module.add_container('std::map< unsigned char, std::set< unsigned short > >', ('unsigned char', 'std::set< unsigned short >'), container_type='map')
@@ -1233,7 +1224,6 @@
     module.add_container('std::vector< ns3::Ipv6Address >', 'ns3::Ipv6Address', container_type='vector')
     module.add_container('std::vector< ns3::BandInfo >', 'ns3::BandInfo', container_type='vector')
     module.add_container('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > >', 'std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader >', container_type='list')
-    module.add_container('std::set< std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand > >', 'std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand >', container_type='set')
     module.add_container('ns3::WifiConstPsduMap', ('short unsigned int', 'ns3::Ptr< ns3::WifiPsdu const >'), container_type='map')
     module.add_container('std::list< ns3::WifiMode >', 'ns3::WifiMode', container_type='list')
     module.add_container('std::list< unsigned char >', 'unsigned char', container_type='list')
@@ -1255,6 +1245,21 @@
     typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > >', 'ns3::WifiPsduMap')
     typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > >*', 'ns3::WifiPsduMap*')
     typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > >&', 'ns3::WifiPsduMap&')
+    typehandlers.add_type_alias('std::map< ns3::AcIndex, ns3::EdcaParameter >', 'ns3::EdcaParameters')
+    typehandlers.add_type_alias('std::map< ns3::AcIndex, ns3::EdcaParameter >*', 'ns3::EdcaParameters*')
+    typehandlers.add_type_alias('std::map< ns3::AcIndex, ns3::EdcaParameter >&', 'ns3::EdcaParameters&')
+    typehandlers.add_type_alias('std::map< ns3::AcIndex, ns3::EdcaParameter > const_iterator', 'ns3::EdcaParametersI')
+    typehandlers.add_type_alias('std::map< ns3::AcIndex, ns3::EdcaParameter > const_iterator*', 'ns3::EdcaParametersI*')
+    typehandlers.add_type_alias('std::map< ns3::AcIndex, ns3::EdcaParameter > const_iterator&', 'ns3::EdcaParametersI&')
+    typehandlers.add_type_alias('ns3::Callback< bool, ns3::Ptr< ns3::WifiMac >, ns3::OrganizationIdentifier const &, ns3::Ptr< ns3::Packet const >, ns3::Address const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::VscCallback')
+    typehandlers.add_type_alias('ns3::Callback< bool, ns3::Ptr< ns3::WifiMac >, ns3::OrganizationIdentifier const &, ns3::Ptr< ns3::Packet const >, ns3::Address const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::VscCallback*')
+    typehandlers.add_type_alias('ns3::Callback< bool, ns3::Ptr< ns3::WifiMac >, ns3::OrganizationIdentifier const &, ns3::Ptr< ns3::Packet const >, ns3::Address const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::VscCallback&')
+    typehandlers.add_type_alias('uint8_t', 'ns3::WifiInformationElementId')
+    typehandlers.add_type_alias('uint8_t*', 'ns3::WifiInformationElementId*')
+    typehandlers.add_type_alias('uint8_t&', 'ns3::WifiInformationElementId&')
+    typehandlers.add_type_alias('std::pair< ns3::Mac48Address, unsigned char >', 'ns3::WifiAddressTidPair')
+    typehandlers.add_type_alias('std::pair< ns3::Mac48Address, unsigned char >*', 'ns3::WifiAddressTidPair*')
+    typehandlers.add_type_alias('std::pair< ns3::Mac48Address, unsigned char >&', 'ns3::WifiAddressTidPair&')
     typehandlers.add_type_alias('std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand >', 'ns3::FrequencyChannelInfo')
     typehandlers.add_type_alias('std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand >*', 'ns3::FrequencyChannelInfo*')
     typehandlers.add_type_alias('std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand >&', 'ns3::FrequencyChannelInfo&')
@@ -1282,6 +1287,15 @@
     typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'ns3::WifiConstPsduMap')
     typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >*', 'ns3::WifiConstPsduMap*')
     typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >&', 'ns3::WifiConstPsduMap&')
+    typehandlers.add_type_alias('std::vector< ns3::WifiMode >', 'ns3::WifiModeList')
+    typehandlers.add_type_alias('std::vector< ns3::WifiMode >*', 'ns3::WifiModeList*')
+    typehandlers.add_type_alias('std::vector< ns3::WifiMode >&', 'ns3::WifiModeList&')
+    typehandlers.add_type_alias('std::vector< ns3::WifiMode > const_iterator', 'ns3::WifiModeListIterator')
+    typehandlers.add_type_alias('std::vector< ns3::WifiMode > const_iterator*', 'ns3::WifiModeListIterator*')
+    typehandlers.add_type_alias('std::vector< ns3::WifiMode > const_iterator&', 'ns3::WifiModeListIterator&')
+    typehandlers.add_type_alias('uint16_t', 'ns3::WifiCodeRate')
+    typehandlers.add_type_alias('uint16_t*', 'ns3::WifiCodeRate*')
+    typehandlers.add_type_alias('uint16_t&', 'ns3::WifiCodeRate&')
     typehandlers.add_type_alias('ns3::Vector3D', 'ns3::Vector')
     typehandlers.add_type_alias('ns3::Vector3D*', 'ns3::Vector*')
     typehandlers.add_type_alias('ns3::Vector3D&', 'ns3::Vector&')
@@ -1294,30 +1308,6 @@
     typehandlers.add_type_alias('ns3::Vector3DChecker*', 'ns3::VectorChecker*')
     typehandlers.add_type_alias('ns3::Vector3DChecker&', 'ns3::VectorChecker&')
     module.add_typedef(root_module['ns3::Vector3DChecker'], 'VectorChecker')
-    typehandlers.add_type_alias('std::map< ns3::AcIndex, ns3::EdcaParameter >', 'ns3::EdcaParameters')
-    typehandlers.add_type_alias('std::map< ns3::AcIndex, ns3::EdcaParameter >*', 'ns3::EdcaParameters*')
-    typehandlers.add_type_alias('std::map< ns3::AcIndex, ns3::EdcaParameter >&', 'ns3::EdcaParameters&')
-    typehandlers.add_type_alias('std::map< ns3::AcIndex, ns3::EdcaParameter > const_iterator', 'ns3::EdcaParametersI')
-    typehandlers.add_type_alias('std::map< ns3::AcIndex, ns3::EdcaParameter > const_iterator*', 'ns3::EdcaParametersI*')
-    typehandlers.add_type_alias('std::map< ns3::AcIndex, ns3::EdcaParameter > const_iterator&', 'ns3::EdcaParametersI&')
-    typehandlers.add_type_alias('ns3::Callback< bool, ns3::Ptr< ns3::WifiMac >, ns3::OrganizationIdentifier const &, ns3::Ptr< ns3::Packet const >, ns3::Address const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::VscCallback')
-    typehandlers.add_type_alias('ns3::Callback< bool, ns3::Ptr< ns3::WifiMac >, ns3::OrganizationIdentifier const &, ns3::Ptr< ns3::Packet const >, ns3::Address const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::VscCallback*')
-    typehandlers.add_type_alias('ns3::Callback< bool, ns3::Ptr< ns3::WifiMac >, ns3::OrganizationIdentifier const &, ns3::Ptr< ns3::Packet const >, ns3::Address const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::VscCallback&')
-    typehandlers.add_type_alias('uint8_t', 'ns3::WifiInformationElementId')
-    typehandlers.add_type_alias('uint8_t*', 'ns3::WifiInformationElementId*')
-    typehandlers.add_type_alias('uint8_t&', 'ns3::WifiInformationElementId&')
-    typehandlers.add_type_alias('std::pair< ns3::Mac48Address, unsigned char >', 'ns3::WifiAddressTidPair')
-    typehandlers.add_type_alias('std::pair< ns3::Mac48Address, unsigned char >*', 'ns3::WifiAddressTidPair*')
-    typehandlers.add_type_alias('std::pair< ns3::Mac48Address, unsigned char >&', 'ns3::WifiAddressTidPair&')
-    typehandlers.add_type_alias('std::vector< ns3::WifiMode >', 'ns3::WifiModeList')
-    typehandlers.add_type_alias('std::vector< ns3::WifiMode >*', 'ns3::WifiModeList*')
-    typehandlers.add_type_alias('std::vector< ns3::WifiMode >&', 'ns3::WifiModeList&')
-    typehandlers.add_type_alias('std::vector< ns3::WifiMode > const_iterator', 'ns3::WifiModeListIterator')
-    typehandlers.add_type_alias('std::vector< ns3::WifiMode > const_iterator*', 'ns3::WifiModeListIterator*')
-    typehandlers.add_type_alias('std::vector< ns3::WifiMode > const_iterator&', 'ns3::WifiModeListIterator&')
-    typehandlers.add_type_alias('uint16_t', 'ns3::WifiCodeRate')
-    typehandlers.add_type_alias('uint16_t*', 'ns3::WifiCodeRate*')
-    typehandlers.add_type_alias('uint16_t&', 'ns3::WifiCodeRate&')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )', 'ns3::TimePrinter')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )*', 'ns3::TimePrinter*')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )&', 'ns3::TimePrinter&')
@@ -1570,7 +1560,6 @@
     register_Ns3WifiRtsCtsProtection_methods(root_module, root_module['ns3::WifiRtsCtsProtection'])
     register_Ns3WifiSpectrumValue5MhzFactory_methods(root_module, root_module['ns3::WifiSpectrumValue5MhzFactory'])
     register_Ns3WifiSpectrumValueHelper_methods(root_module, root_module['ns3::WifiSpectrumValueHelper'])
-    register_Ns3WifiStandardInfo_methods(root_module, root_module['ns3::WifiStandardInfo'])
     register_Ns3WifiTxParameters_methods(root_module, root_module['ns3::WifiTxParameters'])
     register_Ns3WifiTxParametersPsduInfo_methods(root_module, root_module['ns3::WifiTxParameters::PsduInfo'])
     register_Ns3WifiTxTimer_methods(root_module, root_module['ns3::WifiTxTimer'])
@@ -1726,6 +1715,7 @@
     register_Ns3NormalRandomVariable_methods(root_module, root_module['ns3::NormalRandomVariable'])
     register_Ns3ObjectFactoryChecker_methods(root_module, root_module['ns3::ObjectFactoryChecker'])
     register_Ns3ObjectFactoryValue_methods(root_module, root_module['ns3::ObjectFactoryValue'])
+    register_Ns3OcbWifiMac_methods(root_module, root_module['ns3::OcbWifiMac'])
     register_Ns3OrganizationIdentifierChecker_methods(root_module, root_module['ns3::OrganizationIdentifierChecker'])
     register_Ns3OrganizationIdentifierValue_methods(root_module, root_module['ns3::OrganizationIdentifierValue'])
     register_Ns3OutputStreamWrapper_methods(root_module, root_module['ns3::OutputStreamWrapper'])
@@ -1746,7 +1736,6 @@
     register_Ns3QueueSizeValue_methods(root_module, root_module['ns3::QueueSizeValue'])
     register_Ns3RateErrorModel_methods(root_module, root_module['ns3::RateErrorModel'])
     register_Ns3ReceiveListErrorModel_methods(root_module, root_module['ns3::ReceiveListErrorModel'])
-    register_Ns3RegularWifiMac_methods(root_module, root_module['ns3::RegularWifiMac'])
     register_Ns3Ssid_methods(root_module, root_module['ns3::Ssid'])
     register_Ns3SsidChecker_methods(root_module, root_module['ns3::SsidChecker'])
     register_Ns3SsidValue_methods(root_module, root_module['ns3::SsidValue'])
@@ -1769,14 +1758,13 @@
     register_Ns3AddressValue_methods(root_module, root_module['ns3::AddressValue'])
     register_Ns3BinaryErrorModel_methods(root_module, root_module['ns3::BinaryErrorModel'])
     register_Ns3BurstErrorModel_methods(root_module, root_module['ns3::BurstErrorModel'])
+    register_Ns3CallbackImpl__Bool_Const_ns3WifiTxVector___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Bool_Ns3Ptr__lt__const_ns3Packet__gt___Const_ns3Address___amp___Unsigned_int_Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< bool, ns3::Ptr<const ns3::Packet>, const ns3::Address &, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Bool_Ns3Ptr__lt__ns3Socket__gt___Const_ns3Address___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Bool_Ns3Ptr__lt__ns3WifiMac__gt___Const_ns3OrganizationIdentifier___amp___Ns3Ptr__lt__const_ns3Packet__gt___Const_ns3Address___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< bool, ns3::Ptr<ns3::WifiMac>, const ns3::OrganizationIdentifier &, ns3::Ptr<const ns3::Packet>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3CallbackImpl__Bool_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Ns3ObjectBase___star___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Unsigned_long_Const_ns3WifiTxVector___amp___Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3CallbackImpl__Unsigned_long_Unsigned_short_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Const_ns3Ipv4Header___amp___Ns3Ptr__lt__const_ns3Packet__gt___Ns3Ipv4L3ProtocolDropReason_Ns3Ptr__lt__ns3Ipv4__gt___Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, const ns3::Ipv4Header &, ns3::Ptr<const ns3::Packet>, ns3::Ipv4L3Protocol::DropReason, ns3::Ptr<ns3::Ipv4>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Const_ns3Ipv4Header___amp___Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, const ns3::Ipv4Header &, ns3::Ptr<const ns3::Packet>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
@@ -1794,7 +1782,7 @@
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Ns3WifiMode_Ns3WifiPreamble_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::Packet>, ns3::WifiMode, ns3::WifiPreamble, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Ns3WifiPhyRxfailureReason_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::Packet>, ns3::WifiPhyRxfailureReason, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::Packet>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___StdMap__lt__stdPair__lt__unsigned_int__unsigned_int__gt____double__stdLess__lt__stdPair__lt__unsigned_int__unsigned_int__gt_____gt____stdAllocator__lt__stdPair__lt__const_stdPair__lt__unsigned_int__unsigned_int__gt____double__gt_____gt_____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___StdMap__lt__stdPair__lt__unsigned_int__unsigned_int__gt____double__stdLess__lt__stdPair__lt__unsigned_int__unsigned_int__gt____gt____stdAllocator__lt__stdPair__lt__const_stdPair__lt__unsigned_int__unsigned_int__gt____double__gt____gt____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int>>, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double>>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_short_Ns3WifiTxVector_Ns3MpduInfo_Ns3SignalNoiseDbm_Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, ns3::SignalNoiseDbm, unsigned short, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_short_Ns3WifiTxVector_Ns3MpduInfo_Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3QueueDiscItem__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::QueueDiscItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
@@ -1805,7 +1793,7 @@
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3Socket__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3Socket__gt___Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::Socket>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiMacQueueItem__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiPsdu__gt___Ns3RxSignalInfo_Ns3WifiTxVector_StdVector__lt__bool__stdAllocator__lt__bool__gt_____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiPsdu__gt___Ns3RxSignalInfo_Ns3WifiTxVector_StdVector__lt__bool__stdAllocator__lt__bool__gt____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiPsdu__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::WifiPsdu>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Time_Ns3Mac48Address_Unsigned_char_Ns3OriginatorBlockAckAgreementState_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Time, ns3::Mac48Address, unsigned char, ns3::OriginatorBlockAckAgreement::State, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Time_Ns3Time_WifiPhyState_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Time, ns3::Time, WifiPhyState, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
@@ -1813,13 +1801,12 @@
     register_Ns3CallbackImpl__Void_Ns3WifiMacDropReason_Ns3Ptr__lt__const_ns3WifiMacQueueItem__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3WifiTxVector_Ns3Time_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::WifiTxVector, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3CallbackImpl__Void_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__const_ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__const_ns3WifiPsdu__gt_____gt_____gt_____gt___Ns3WifiTxVector_Double_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__const_ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__const_ns3WifiPsdu__gt____gt____gt____gt___Ns3WifiTxVector_Double_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu>>>>, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Unsigned_char_Ns3Ptr__lt__const_ns3WifiMacQueueItem__gt___Const_ns3WifiTxVector___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Unsigned_char_Ns3Ptr__lt__const_ns3WifiPsdu__gt___Const_ns3WifiTxVector___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3CallbackImpl__Void_Unsigned_char_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt_____gt_____gt_____gt_____star___Const_stdSet__lt__ns3Mac48Address__stdLess__lt__ns3Mac48Address__gt____stdAllocator__lt__ns3Mac48Address__gt_____gt_____star___Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Unsigned_char_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt____gt____gt____gt_____star___Const_stdSet__lt__ns3Mac48Address__stdLess__lt__ns3Mac48Address__gt____stdAllocator__lt__ns3Mac48Address__gt____gt_____star___Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Unsigned_int_Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3OcbWifiMac_methods(root_module, root_module['ns3::OcbWifiMac'])
     register_Ns3QueueDiscItem_methods(root_module, root_module['ns3::QueueDiscItem'])
     register_Ns3WaveNetDevice_methods(root_module, root_module['ns3::WaveNetDevice'])
     register_Ns3HashImplementation_methods(root_module, root_module['ns3::Hash::Implementation'])
@@ -2388,7 +2375,7 @@
     cls.add_constructor([])
     ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::BlockAckType(ns3::BlockAckType::Variant v) [constructor]
     cls.add_constructor([param('ns3::BlockAckType::Variant', 'v')])
-    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::BlockAckType(ns3::BlockAckType::Variant v, std::vector<unsigned char, std::allocator<unsigned char> > l) [constructor]
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::BlockAckType(ns3::BlockAckType::Variant v, std::vector<unsigned char, std::allocator<unsigned char>> l) [constructor]
     cls.add_constructor([param('ns3::BlockAckType::Variant', 'v'), param('std::vector< unsigned char >', 'l')])
     ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::m_bitmapLen [variable]
     cls.add_instance_attribute('m_bitmapLen', 'std::vector< unsigned char >', is_const=False)
@@ -2405,11 +2392,11 @@
     cls.add_method('Advance', 
                    'void', 
                    [param('std::size_t', 'count')])
-    ## block-ack-window.h (module 'wifi'): std::vector<bool, std::allocator<bool> >::reference ns3::BlockAckWindow::At(std::size_t distance) [member function]
+    ## block-ack-window.h (module 'wifi'): std::vector<bool, std::allocator<bool>>::reference ns3::BlockAckWindow::At(std::size_t distance) [member function]
     cls.add_method('At', 
                    'std::vector< bool > reference', 
                    [param('std::size_t', 'distance')])
-    ## block-ack-window.h (module 'wifi'): std::vector<bool, std::allocator<bool> >::const_reference ns3::BlockAckWindow::At(std::size_t distance) const [member function]
+    ## block-ack-window.h (module 'wifi'): std::vector<bool, std::allocator<bool>>::const_reference ns3::BlockAckWindow::At(std::size_t distance) const [member function]
     cls.add_method('At', 
                    'std::vector< bool > const_reference', 
                    [param('std::size_t', 'distance')], 
@@ -3365,6 +3352,8 @@
     return
 
 def register_Ns3HeMuUserInfo_methods(root_module, cls):
+    cls.add_binary_comparison_operator('==')
+    cls.add_binary_comparison_operator('!=')
     ## wifi-tx-vector.h (module 'wifi'): ns3::HeMuUserInfo::HeMuUserInfo() [constructor]
     cls.add_constructor([])
     ## wifi-tx-vector.h (module 'wifi'): ns3::HeMuUserInfo::HeMuUserInfo(ns3::HeMuUserInfo const & arg0) [constructor]
@@ -3382,7 +3371,7 @@
     cls.add_constructor([])
     ## he-ru.h (module 'wifi'): ns3::HeRu::HeRu(ns3::HeRu const & arg0) [constructor]
     cls.add_constructor([param('ns3::HeRu const &', 'arg0')])
-    ## he-ru.h (module 'wifi'): static bool ns3::HeRu::DoesOverlap(uint16_t bw, ns3::HeRu::RuSpec ru, std::vector<ns3::HeRu::RuSpec, std::allocator<ns3::HeRu::RuSpec> > const & v) [member function]
+    ## he-ru.h (module 'wifi'): static bool ns3::HeRu::DoesOverlap(uint16_t bw, ns3::HeRu::RuSpec ru, std::vector<ns3::HeRu::RuSpec, std::allocator<ns3::HeRu::RuSpec>> const & v) [member function]
     cls.add_method('DoesOverlap', 
                    'bool', 
                    [param('uint16_t', 'bw'), param('ns3::HeRu::RuSpec', 'ru'), param('std::vector< ns3::HeRu::RuSpec > const &', 'v')], 
@@ -3402,7 +3391,7 @@
                    'uint16_t', 
                    [param('ns3::HeRu::RuType', 'ruType')], 
                    is_static=True)
-    ## he-ru.h (module 'wifi'): static std::vector<ns3::HeRu::RuSpec, std::allocator<ns3::HeRu::RuSpec> > ns3::HeRu::GetCentral26TonesRus(uint16_t bw, ns3::HeRu::RuType ruType) [member function]
+    ## he-ru.h (module 'wifi'): static std::vector<ns3::HeRu::RuSpec, std::allocator<ns3::HeRu::RuSpec>> ns3::HeRu::GetCentral26TonesRus(uint16_t bw, ns3::HeRu::RuType ruType) [member function]
     cls.add_method('GetCentral26TonesRus', 
                    'std::vector< ns3::HeRu::RuSpec >', 
                    [param('uint16_t', 'bw'), param('ns3::HeRu::RuType', 'ruType')], 
@@ -3422,7 +3411,7 @@
                    'ns3::HeRu::RuType', 
                    [param('uint16_t', 'bandwidth')], 
                    is_static=True)
-    ## he-ru.h (module 'wifi'): static std::vector<ns3::HeRu::RuSpec, std::allocator<ns3::HeRu::RuSpec> > ns3::HeRu::GetRusOfType(uint16_t bw, ns3::HeRu::RuType ruType) [member function]
+    ## he-ru.h (module 'wifi'): static std::vector<ns3::HeRu::RuSpec, std::allocator<ns3::HeRu::RuSpec>> ns3::HeRu::GetRusOfType(uint16_t bw, ns3::HeRu::RuType ruType) [member function]
     cls.add_method('GetRusOfType', 
                    'std::vector< ns3::HeRu::RuSpec >', 
                    [param('uint16_t', 'bw'), param('ns3::HeRu::RuType', 'ruType')], 
@@ -3438,6 +3427,8 @@
 
 def register_Ns3HeRuRuSpec_methods(root_module, cls):
     cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('!=')
+    cls.add_binary_comparison_operator('==')
     ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec::RuSpec(ns3::HeRu::RuSpec const & arg0) [constructor]
     cls.add_constructor([param('ns3::HeRu::RuSpec const &', 'arg0')])
     ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec::RuSpec() [constructor]
@@ -5923,8 +5914,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -6254,7 +6245,7 @@
     cls.add_method('AssignStreams', 
                    'int64_t', 
                    [param('ns3::NodeContainer', 'c'), param('int64_t', 'stream')])
-    ## wave-bsm-helper.h (module 'wave'): static std::vector<int, std::allocator<int> > & ns3::WaveBsmHelper::GetNodesMoving() [member function]
+    ## wave-bsm-helper.h (module 'wave'): static std::vector<int, std::allocator<int>> & ns3::WaveBsmHelper::GetNodesMoving() [member function]
     cls.add_method('GetNodesMoving', 
                    'std::vector< int > &', 
                    [], 
@@ -6273,7 +6264,7 @@
                    'ns3::ApplicationContainer', 
                    [param('ns3::Ptr< ns3::Node >', 'node')], 
                    is_const=True)
-    ## wave-bsm-helper.h (module 'wave'): void ns3::WaveBsmHelper::Install(ns3::Ipv4InterfaceContainer & i, ns3::Time totalTime, uint32_t wavePacketSize, ns3::Time waveInterval, double gpsAccuracyNs, std::vector<double, std::allocator<double> > ranges, int chAccessMode, ns3::Time txMaxDelay) [member function]
+    ## wave-bsm-helper.h (module 'wave'): void ns3::WaveBsmHelper::Install(ns3::Ipv4InterfaceContainer & i, ns3::Time totalTime, uint32_t wavePacketSize, ns3::Time waveInterval, double gpsAccuracyNs, std::vector<double, std::allocator<double>> ranges, int chAccessMode, ns3::Time txMaxDelay) [member function]
     cls.add_method('Install', 
                    'void', 
                    [param('ns3::Ipv4InterfaceContainer &', 'i'), param('ns3::Time', 'totalTime'), param('uint32_t', 'wavePacketSize'), param('ns3::Time', 'waveInterval'), param('double', 'gpsAccuracyNs'), param('std::vector< double >', 'ranges'), param('int', 'chAccessMode'), param('ns3::Time', 'txMaxDelay')])
@@ -6292,7 +6283,7 @@
     cls.add_method('AssignStreams', 
                    'int64_t', 
                    [param('ns3::NetDeviceContainer', 'c'), param('int64_t', 'stream')])
-    ## wave-helper.h (module 'wave'): void ns3::WaveHelper::CreateMacForChannel(std::vector<unsigned int, std::allocator<unsigned int> > channelNumbers) [member function]
+    ## wave-helper.h (module 'wave'): void ns3::WaveHelper::CreateMacForChannel(std::vector<unsigned int, std::allocator<unsigned int>> channelNumbers) [member function]
     cls.add_method('CreateMacForChannel', 
                    'void', 
                    [param('std::vector< unsigned int >', 'channelNumbers')])
@@ -6360,7 +6351,7 @@
 def register_Ns3WifiAcknowledgment_methods(root_module, cls):
     ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiAcknowledgment::WifiAcknowledgment(ns3::WifiAcknowledgment::Method m) [constructor]
     cls.add_constructor([param('ns3::WifiAcknowledgment::Method', 'm')])
-    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiAcknowledgment::Copy() const [member function]
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment>> ns3::WifiAcknowledgment::Copy() const [member function]
     cls.add_method('Copy', 
                    'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
                    [], 
@@ -6419,7 +6410,7 @@
 def register_Ns3WifiBarBlockAck_methods(root_module, cls):
     ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiBarBlockAck::WifiBarBlockAck() [constructor]
     cls.add_constructor([])
-    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiBarBlockAck::Copy() const [member function]
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment>> ns3::WifiBarBlockAck::Copy() const [member function]
     cls.add_method('Copy', 
                    'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
                    [], 
@@ -6449,7 +6440,7 @@
 def register_Ns3WifiBlockAck_methods(root_module, cls):
     ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiBlockAck::WifiBlockAck() [constructor]
     cls.add_constructor([])
-    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiBlockAck::Copy() const [member function]
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment>> ns3::WifiBlockAck::Copy() const [member function]
     cls.add_method('Copy', 
                    'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
                    [], 
@@ -6482,7 +6473,7 @@
                    'bool', 
                    [param('ns3::Mac48Address', 'receiver'), param('uint8_t', 'tid'), param('ns3::WifiMacHeader::QosAckPolicy', 'ackPolicy')], 
                    is_const=True, is_virtual=True)
-    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiDlMuAggregateTf::Copy() const [member function]
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment>> ns3::WifiDlMuAggregateTf::Copy() const [member function]
     cls.add_method('Copy', 
                    'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
                    [], 
@@ -6523,7 +6514,7 @@
                    'bool', 
                    [param('ns3::Mac48Address', 'receiver'), param('uint8_t', 'tid'), param('ns3::WifiMacHeader::QosAckPolicy', 'ackPolicy')], 
                    is_const=True, is_virtual=True)
-    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiDlMuBarBaSequence::Copy() const [member function]
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment>> ns3::WifiDlMuBarBaSequence::Copy() const [member function]
     cls.add_method('Copy', 
                    'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
                    [], 
@@ -6586,7 +6577,7 @@
                    'bool', 
                    [param('ns3::Mac48Address', 'receiver'), param('uint8_t', 'tid'), param('ns3::WifiMacHeader::QosAckPolicy', 'ackPolicy')], 
                    is_const=True, is_virtual=True)
-    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiDlMuTfMuBar::Copy() const [member function]
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment>> ns3::WifiDlMuTfMuBar::Copy() const [member function]
     cls.add_method('Copy', 
                    'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
                    [], 
@@ -6628,6 +6619,10 @@
     cls.add_method('AssignStreams', 
                    'int64_t', 
                    [param('ns3::NetDeviceContainer', 'c'), param('int64_t', 'stream')])
+    ## wifi-helper.h (module 'wifi'): void ns3::WifiHelper::DisableFlowControl() [member function]
+    cls.add_method('DisableFlowControl', 
+                   'void', 
+                   [])
     ## wifi-helper.h (module 'wifi'): static void ns3::WifiHelper::EnableLogComponents() [member function]
     cls.add_method('EnableLogComponents', 
                    'void', 
@@ -6677,10 +6672,10 @@
     cls.add_constructor([param('ns3::WifiMacHelper const &', 'arg0')])
     ## wifi-mac-helper.h (module 'wifi'): ns3::WifiMacHelper::WifiMacHelper() [constructor]
     cls.add_constructor([])
-    ## wifi-mac-helper.h (module 'wifi'): ns3::Ptr<ns3::WifiMac> ns3::WifiMacHelper::Create(ns3::Ptr<ns3::NetDevice> device, ns3::WifiStandard standard) const [member function]
+    ## wifi-mac-helper.h (module 'wifi'): ns3::Ptr<ns3::WifiMac> ns3::WifiMacHelper::Create(ns3::Ptr<ns3::WifiNetDevice> device, ns3::WifiStandard standard) const [member function]
     cls.add_method('Create', 
                    'ns3::Ptr< ns3::WifiMac >', 
-                   [param('ns3::Ptr< ns3::NetDevice >', 'device'), param('ns3::WifiStandard', 'standard')], 
+                   [param('ns3::Ptr< ns3::WifiNetDevice >', 'device'), param('ns3::WifiStandard', 'standard')], 
                    is_const=True, is_virtual=True)
     return
 
@@ -6765,6 +6760,11 @@
                    'bool', 
                    [param('uint16_t', 'channelWidth'), param('uint8_t', 'nss')], 
                    is_const=True)
+    ## wifi-mode.h (module 'wifi'): bool ns3::WifiMode::IsAllowed(ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('IsAllowed', 
+                   'bool', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True)
     ## wifi-mode.h (module 'wifi'): bool ns3::WifiMode::IsHigherCodeRate(ns3::WifiMode mode) const [member function]
     cls.add_method('IsHigherCodeRate', 
                    'bool', 
@@ -6785,22 +6785,22 @@
 def register_Ns3WifiModeFactory_methods(root_module, cls):
     ## wifi-mode.h (module 'wifi'): ns3::WifiModeFactory::WifiModeFactory(ns3::WifiModeFactory const & arg0) [constructor]
     cls.add_constructor([param('ns3::WifiModeFactory const &', 'arg0')])
-    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMcs(std::string uniqueName, uint8_t mcsValue, ns3::WifiModulationClass modClass, ns3::WifiModeFactory::CodeRateCallback codeRateCallback, ns3::WifiModeFactory::ConstellationSizeCallback constellationSizeCallback, ns3::WifiModeFactory::PhyRateCallback phyRateCallback, ns3::WifiModeFactory::PhyRateFromTxVectorCallback phyRateFromTxVectorCallback, ns3::WifiModeFactory::DataRateCallback dataRateCallback, ns3::WifiModeFactory::DataRateFromTxVectorCallback dataRateFromTxVectorCallback, ns3::WifiModeFactory::NonHtReferenceRateCallback nonHtReferenceRateCallback, ns3::WifiModeFactory::ModeAllowedCallback isModeAllowedCallback) [member function]
+    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMcs(std::string uniqueName, uint8_t mcsValue, ns3::WifiModulationClass modClass, bool isMandatory, ns3::WifiModeFactory::CodeRateCallback codeRateCallback, ns3::WifiModeFactory::ConstellationSizeCallback constellationSizeCallback, ns3::WifiModeFactory::PhyRateCallback phyRateCallback, ns3::WifiModeFactory::DataRateCallback dataRateCallback, ns3::WifiModeFactory::NonHtReferenceRateCallback nonHtReferenceRateCallback, ns3::WifiModeFactory::AllowedCallback isAllowedCallback) [member function]
     cls.add_method('CreateWifiMcs', 
                    'ns3::WifiMode', 
-                   [param('std::string', 'uniqueName'), param('uint8_t', 'mcsValue'), param('ns3::WifiModulationClass', 'modClass'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'codeRateCallback'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'constellationSizeCallback'), param('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateCallback'), param('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateFromTxVectorCallback'), param('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateCallback'), param('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateFromTxVectorCallback'), param('ns3::Callback< unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'nonHtReferenceRateCallback'), param('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'isModeAllowedCallback')], 
+                   [param('std::string', 'uniqueName'), param('uint8_t', 'mcsValue'), param('ns3::WifiModulationClass', 'modClass'), param('bool', 'isMandatory'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'codeRateCallback'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'constellationSizeCallback'), param('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateCallback'), param('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateCallback'), param('ns3::Callback< unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'nonHtReferenceRateCallback'), param('ns3::Callback< bool, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'isAllowedCallback')], 
                    is_static=True)
-    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMode(std::string uniqueName, ns3::WifiModulationClass modClass, bool isMandatory, ns3::WifiModeFactory::CodeRateCallback codeRateCallback, ns3::WifiModeFactory::ConstellationSizeCallback constellationSizeCallback, ns3::WifiModeFactory::PhyRateCallback phyRateCallback, ns3::WifiModeFactory::PhyRateFromTxVectorCallback phyRateFromTxVectorCallback, ns3::WifiModeFactory::DataRateCallback dataRateCallback, ns3::WifiModeFactory::DataRateFromTxVectorCallback dataRateFromTxVectorCallback, ns3::WifiModeFactory::ModeAllowedCallback isModeAllowedCallback) [member function]
+    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMode(std::string uniqueName, ns3::WifiModulationClass modClass, bool isMandatory, ns3::WifiModeFactory::CodeRateCallback codeRateCallback, ns3::WifiModeFactory::ConstellationSizeCallback constellationSizeCallback, ns3::WifiModeFactory::PhyRateCallback phyRateCallback, ns3::WifiModeFactory::DataRateCallback dataRateCallback, ns3::WifiModeFactory::AllowedCallback isAllowedCallback) [member function]
     cls.add_method('CreateWifiMode', 
                    'ns3::WifiMode', 
-                   [param('std::string', 'uniqueName'), param('ns3::WifiModulationClass', 'modClass'), param('bool', 'isMandatory'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'codeRateCallback'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'constellationSizeCallback'), param('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateCallback'), param('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateFromTxVectorCallback'), param('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateCallback'), param('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateFromTxVectorCallback'), param('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'isModeAllowedCallback')], 
+                   [param('std::string', 'uniqueName'), param('ns3::WifiModulationClass', 'modClass'), param('bool', 'isMandatory'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'codeRateCallback'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'constellationSizeCallback'), param('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateCallback'), param('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateCallback'), param('ns3::Callback< bool, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'isAllowedCallback')], 
                    is_static=True)
     return
 
 def register_Ns3WifiNoAck_methods(root_module, cls):
     ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiNoAck::WifiNoAck() [constructor]
     cls.add_constructor([])
-    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiNoAck::Copy() const [member function]
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment>> ns3::WifiNoAck::Copy() const [member function]
     cls.add_method('Copy', 
                    'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
                    [], 
@@ -6822,7 +6822,7 @@
 def register_Ns3WifiNormalAck_methods(root_module, cls):
     ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiNormalAck::WifiNormalAck() [constructor]
     cls.add_constructor([])
-    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiNormalAck::Copy() const [member function]
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment>> ns3::WifiNormalAck::Copy() const [member function]
     cls.add_method('Copy', 
                    'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
                    [], 
@@ -6848,10 +6848,10 @@
     cls.add_constructor([param('ns3::WifiPhyHelper const &', 'arg0')])
     ## wifi-helper.h (module 'wifi'): ns3::WifiPhyHelper::WifiPhyHelper() [constructor]
     cls.add_constructor([])
-    ## wifi-helper.h (module 'wifi'): ns3::Ptr<ns3::WifiPhy> ns3::WifiPhyHelper::Create(ns3::Ptr<ns3::Node> node, ns3::Ptr<ns3::NetDevice> device) const [member function]
+    ## wifi-helper.h (module 'wifi'): ns3::Ptr<ns3::WifiPhy> ns3::WifiPhyHelper::Create(ns3::Ptr<ns3::Node> node, ns3::Ptr<ns3::WifiNetDevice> device) const [member function]
     cls.add_method('Create', 
                    'ns3::Ptr< ns3::WifiPhy >', 
-                   [param('ns3::Ptr< ns3::Node >', 'node'), param('ns3::Ptr< ns3::NetDevice >', 'device')], 
+                   [param('ns3::Ptr< ns3::Node >', 'node'), param('ns3::Ptr< ns3::WifiNetDevice >', 'device')], 
                    is_const=True, is_pure_virtual=True, is_virtual=True)
     ## wifi-helper.h (module 'wifi'): void ns3::WifiPhyHelper::DisablePreambleDetectionModel() [member function]
     cls.add_method('DisablePreambleDetectionModel', 
@@ -6909,6 +6909,16 @@
     cls.add_constructor([param('ns3::WifiPhyOperatingChannel const &', 'arg0')])
     ## wifi-phy-operating-channel.h (module 'wifi'): ns3::WifiPhyOperatingChannel::WifiPhyOperatingChannel() [constructor]
     cls.add_constructor([])
+    ## wifi-phy-operating-channel.h (module 'wifi'): static ns3::WifiPhyOperatingChannel::ConstIterator ns3::WifiPhyOperatingChannel::FindFirst(uint8_t number, uint16_t frequency, uint16_t width, ns3::WifiStandard standard, ns3::WifiPhyBand band, ns3::WifiPhyOperatingChannel::ConstIterator start=ns3::WifiPhyOperatingChannel::m_frequencyChannels.begin()) [member function]
+    cls.add_method('FindFirst', 
+                   'ns3::WifiPhyOperatingChannel::ConstIterator', 
+                   [param('uint8_t', 'number'), param('uint16_t', 'frequency'), param('uint16_t', 'width'), param('ns3::WifiStandard', 'standard'), param('ns3::WifiPhyBand', 'band'), param('std::set< std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand > > const_iterator', 'start', default_value='ns3::WifiPhyOperatingChannel::m_frequencyChannels.begin()')], 
+                   is_static=True)
+    ## wifi-phy-operating-channel.h (module 'wifi'): static uint8_t ns3::WifiPhyOperatingChannel::GetDefaultChannelNumber(uint16_t width, ns3::WifiStandard standard, ns3::WifiPhyBand band) [member function]
+    cls.add_method('GetDefaultChannelNumber', 
+                   'uint8_t', 
+                   [param('uint16_t', 'width'), param('ns3::WifiStandard', 'standard'), param('ns3::WifiPhyBand', 'band')], 
+                   is_static=True)
     ## wifi-phy-operating-channel.h (module 'wifi'): uint16_t ns3::WifiPhyOperatingChannel::GetFrequency() const [member function]
     cls.add_method('GetFrequency', 
                    'uint16_t', 
@@ -6929,6 +6939,11 @@
                    'uint8_t', 
                    [param('uint16_t', 'primaryChannelWidth')], 
                    is_const=True)
+    ## wifi-phy-operating-channel.h (module 'wifi'): uint8_t ns3::WifiPhyOperatingChannel::GetPrimaryChannelNumber(uint16_t primaryChannelWidth, ns3::WifiStandard standard) const [member function]
+    cls.add_method('GetPrimaryChannelNumber', 
+                   'uint8_t', 
+                   [param('uint16_t', 'primaryChannelWidth'), param('ns3::WifiStandard', 'standard')], 
+                   is_const=True)
     ## wifi-phy-operating-channel.h (module 'wifi'): uint16_t ns3::WifiPhyOperatingChannel::GetWidth() const [member function]
     cls.add_method('GetWidth', 
                    'uint16_t', 
@@ -6939,24 +6954,26 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## wifi-phy-operating-channel.h (module 'wifi'): void ns3::WifiPhyOperatingChannel::Set(uint8_t number, uint16_t frequency, uint16_t width, ns3::WifiPhyStandard standard, ns3::WifiPhyBand band) [member function]
+    ## wifi-phy-operating-channel.h (module 'wifi'): void ns3::WifiPhyOperatingChannel::Set(uint8_t number, uint16_t frequency, uint16_t width, ns3::WifiStandard standard, ns3::WifiPhyBand band) [member function]
     cls.add_method('Set', 
                    'void', 
-                   [param('uint8_t', 'number'), param('uint16_t', 'frequency'), param('uint16_t', 'width'), param('ns3::WifiPhyStandard', 'standard'), param('ns3::WifiPhyBand', 'band')])
-    ## wifi-phy-operating-channel.h (module 'wifi'): void ns3::WifiPhyOperatingChannel::SetDefault(uint16_t width, ns3::WifiPhyStandard standard, ns3::WifiPhyBand band) [member function]
+                   [param('uint8_t', 'number'), param('uint16_t', 'frequency'), param('uint16_t', 'width'), param('ns3::WifiStandard', 'standard'), param('ns3::WifiPhyBand', 'band')])
+    ## wifi-phy-operating-channel.h (module 'wifi'): void ns3::WifiPhyOperatingChannel::SetDefault(uint16_t width, ns3::WifiStandard standard, ns3::WifiPhyBand band) [member function]
     cls.add_method('SetDefault', 
                    'void', 
-                   [param('uint16_t', 'width'), param('ns3::WifiPhyStandard', 'standard'), param('ns3::WifiPhyBand', 'band')])
+                   [param('uint16_t', 'width'), param('ns3::WifiStandard', 'standard'), param('ns3::WifiPhyBand', 'band')])
     ## wifi-phy-operating-channel.h (module 'wifi'): void ns3::WifiPhyOperatingChannel::SetPrimary20Index(uint8_t index) [member function]
     cls.add_method('SetPrimary20Index', 
                    'void', 
                    [param('uint8_t', 'index')])
+    ## wifi-phy-operating-channel.h (module 'wifi'): ns3::WifiPhyOperatingChannel::m_frequencyChannels [variable]
+    cls.add_static_attribute('m_frequencyChannels', 'std::set< std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand > > const', is_const=True)
     return
 
 def register_Ns3WifiProtection_methods(root_module, cls):
     ## wifi-protection.h (module 'wifi'): ns3::WifiProtection::WifiProtection(ns3::WifiProtection::Method m) [constructor]
     cls.add_constructor([param('ns3::WifiProtection::Method', 'm')])
-    ## wifi-protection.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection> > ns3::WifiProtection::Copy() const [member function]
+    ## wifi-protection.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection>> ns3::WifiProtection::Copy() const [member function]
     cls.add_method('Copy', 
                    'std::unique_ptr< ns3::WifiProtection, std::default_delete< ns3::WifiProtection > >', 
                    [], 
@@ -7051,7 +7068,7 @@
 def register_Ns3WifiRtsCtsProtection_methods(root_module, cls):
     ## wifi-protection.h (module 'wifi'): ns3::WifiRtsCtsProtection::WifiRtsCtsProtection() [constructor]
     cls.add_constructor([])
-    ## wifi-protection.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection> > ns3::WifiRtsCtsProtection::Copy() const [member function]
+    ## wifi-protection.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection>> ns3::WifiRtsCtsProtection::Copy() const [member function]
     cls.add_method('Copy', 
                    'std::unique_ptr< ns3::WifiProtection, std::default_delete< ns3::WifiProtection > >', 
                    [], 
@@ -7136,7 +7153,7 @@
                    'ns3::Ptr< ns3::SpectrumValue >', 
                    [param('uint32_t', 'centerFrequency'), param('uint16_t', 'totalChannelWidth'), param('uint32_t', 'bandBandwidth'), param('uint16_t', 'guardBandwidth'), param('std::pair< unsigned int, unsigned int >', 'band')], 
                    is_static=True)
-    ## wifi-spectrum-value-helper.h (module 'spectrum'): static void ns3::WifiSpectrumValueHelper::CreateSpectrumMaskForOfdm(ns3::Ptr<ns3::SpectrumValue> c, std::vector<std::pair<unsigned int, unsigned int>, std::allocator<std::pair<unsigned int, unsigned int> > > allocatedSubBands, ns3::WifiSpectrumBand maskBand, double txPowerPerBandW, uint32_t nGuardBands, uint32_t innerSlopeWidth, double minInnerBandDbr, double minOuterbandDbr, double lowestPointDbr) [member function]
+    ## wifi-spectrum-value-helper.h (module 'spectrum'): static void ns3::WifiSpectrumValueHelper::CreateSpectrumMaskForOfdm(ns3::Ptr<ns3::SpectrumValue> c, std::vector<std::pair<unsigned int, unsigned int>, std::allocator<std::pair<unsigned int, unsigned int>>> allocatedSubBands, ns3::WifiSpectrumBand maskBand, double txPowerPerBandW, uint32_t nGuardBands, uint32_t innerSlopeWidth, double minInnerBandDbr, double minOuterbandDbr, double lowestPointDbr) [member function]
     cls.add_method('CreateSpectrumMaskForOfdm', 
                    'void', 
                    [param('ns3::Ptr< ns3::SpectrumValue >', 'c'), param('std::vector< std::pair< unsigned int, unsigned int > >', 'allocatedSubBands'), param('std::pair< unsigned int, unsigned int >', 'maskBand'), param('double', 'txPowerPerBandW'), param('uint32_t', 'nGuardBands'), param('uint32_t', 'innerSlopeWidth'), param('double', 'minInnerBandDbr'), param('double', 'minOuterbandDbr'), param('double', 'lowestPointDbr')], 
@@ -7163,19 +7180,6 @@
                    is_static=True)
     return
 
-def register_Ns3WifiStandardInfo_methods(root_module, cls):
-    ## wifi-standards.h (module 'wifi'): ns3::WifiStandardInfo::WifiStandardInfo() [constructor]
-    cls.add_constructor([])
-    ## wifi-standards.h (module 'wifi'): ns3::WifiStandardInfo::WifiStandardInfo(ns3::WifiStandardInfo const & arg0) [constructor]
-    cls.add_constructor([param('ns3::WifiStandardInfo const &', 'arg0')])
-    ## wifi-standards.h (module 'wifi'): ns3::WifiStandardInfo::macStandard [variable]
-    cls.add_instance_attribute('macStandard', 'ns3::WifiMacStandard', is_const=False)
-    ## wifi-standards.h (module 'wifi'): ns3::WifiStandardInfo::phyBand [variable]
-    cls.add_instance_attribute('phyBand', 'ns3::WifiPhyBand', is_const=False)
-    ## wifi-standards.h (module 'wifi'): ns3::WifiStandardInfo::phyStandard [variable]
-    cls.add_instance_attribute('phyStandard', 'ns3::WifiPhyStandard', is_const=False)
-    return
-
 def register_Ns3WifiTxParameters_methods(root_module, cls):
     ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters::WifiTxParameters() [constructor]
     cls.add_constructor([])
@@ -7503,7 +7507,7 @@
 def register_Ns3WifiUlMuMultiStaBa_methods(root_module, cls):
     ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiUlMuMultiStaBa::WifiUlMuMultiStaBa() [constructor]
     cls.add_constructor([])
-    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiUlMuMultiStaBa::Copy() const [member function]
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment>> ns3::WifiUlMuMultiStaBa::Copy() const [member function]
     cls.add_method('Copy', 
                    'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
                    [], 
@@ -7572,10 +7576,10 @@
     cls.add_method('SetChannel', 
                    'void', 
                    [param('std::string', 'channelName')])
-    ## yans-wifi-helper.h (module 'wifi'): ns3::Ptr<ns3::WifiPhy> ns3::YansWifiPhyHelper::Create(ns3::Ptr<ns3::Node> node, ns3::Ptr<ns3::NetDevice> device) const [member function]
+    ## yans-wifi-helper.h (module 'wifi'): ns3::Ptr<ns3::WifiPhy> ns3::YansWifiPhyHelper::Create(ns3::Ptr<ns3::Node> node, ns3::Ptr<ns3::WifiNetDevice> device) const [member function]
     cls.add_method('Create', 
                    'ns3::Ptr< ns3::WifiPhy >', 
-                   [param('ns3::Ptr< ns3::Node >', 'node'), param('ns3::Ptr< ns3::NetDevice >', 'device')], 
+                   [param('ns3::Ptr< ns3::Node >', 'node'), param('ns3::Ptr< ns3::WifiNetDevice >', 'device')], 
                    is_const=True, is_virtual=True, visibility='private')
     return
 
@@ -7596,14 +7600,14 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('>=')
     cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_unary_numeric_operator('-')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
     cls.add_constructor([])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(double const value) [constructor]
@@ -7622,6 +7626,8 @@
     cls.add_constructor([param('long unsigned int const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int const v) [constructor]
     cls.add_constructor([param('long long unsigned int const', 'v')])
+    ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int128_t const v) [constructor]
+    cls.add_constructor([param('int128_t const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t const hi, uint64_t const lo) [constructor]
     cls.add_constructor([param('int64_t const', 'hi'), param('uint64_t const', 'lo')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [constructor]
@@ -7834,10 +7840,6 @@
     cls.add_method('SetTcp', 
                    'void', 
                    [param('std::string', 'tid')])
-    ## internet-stack-helper.h (module 'internet'): void ns3::InternetStackHelper::SetTcp(std::string tid, std::string attr, ns3::AttributeValue const & val) [member function]
-    cls.add_method('SetTcp', 
-                   'void', 
-                   [param('std::string', 'tid'), param('std::string', 'attr'), param('ns3::AttributeValue const &', 'val')])
     ## internet-stack-helper.h (module 'internet'): void ns3::InternetStackHelper::EnableAsciiIpv4Internal(ns3::Ptr<ns3::OutputStreamWrapper> stream, std::string prefix, ns3::Ptr<ns3::Ipv4> ipv4, uint32_t interface, bool explicitFilename) [member function]
     cls.add_method('EnableAsciiIpv4Internal', 
                    'void', 
@@ -8463,6 +8465,11 @@
     cls.add_method('SetMaxSize', 
                    'void', 
                    [param('ns3::QueueSize', 'size')])
+    ## queue.h (module 'network'): bool ns3::QueueBase::WouldOverflow(uint32_t nPackets, uint32_t nBytes) const [member function]
+    cls.add_method('WouldOverflow', 
+                   'bool', 
+                   [param('uint32_t', 'nPackets'), param('uint32_t', 'nBytes')], 
+                   is_const=True)
     return
 
 def register_Ns3RandomVariableStream_methods(root_module, cls):
@@ -8549,170 +8556,170 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3ChannelCoordinationListener_Ns3Empty_Ns3DefaultDeleter__lt__ns3ChannelCoordinationListener__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ChannelCoordinationListener, ns3::empty, ns3::DefaultDeleter<ns3::ChannelCoordinationListener> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ChannelCoordinationListener, ns3::empty, ns3::DefaultDeleter<ns3::ChannelCoordinationListener>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ChannelCoordinationListener, ns3::empty, ns3::DefaultDeleter<ns3::ChannelCoordinationListener> >::SimpleRefCount(ns3::SimpleRefCount<ns3::ChannelCoordinationListener, ns3::empty, ns3::DefaultDeleter<ns3::ChannelCoordinationListener> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::ChannelCoordinationListener, ns3::empty, ns3::DefaultDeleter<ns3::ChannelCoordinationListener>>::SimpleRefCount(ns3::SimpleRefCount<ns3::ChannelCoordinationListener, ns3::empty, ns3::DefaultDeleter<ns3::ChannelCoordinationListener>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::ChannelCoordinationListener, ns3::empty, ns3::DefaultDeleter< ns3::ChannelCoordinationListener > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Event_Ns3Empty_Ns3DefaultDeleter__lt__ns3Event__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Event, ns3::empty, ns3::DefaultDeleter<ns3::Event> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Event, ns3::empty, ns3::DefaultDeleter<ns3::Event>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Event, ns3::empty, ns3::DefaultDeleter<ns3::Event> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Event, ns3::empty, ns3::DefaultDeleter<ns3::Event> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Event, ns3::empty, ns3::DefaultDeleter<ns3::Event>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Event, ns3::empty, ns3::DefaultDeleter<ns3::Event>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Event, ns3::empty, ns3::DefaultDeleter< ns3::Event > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Ipv4MulticastRoute_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv4MulticastRoute__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter< ns3::Ipv4MulticastRoute > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Ipv4Route_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv4Route__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter< ns3::Ipv4Route > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3MacRxMiddle_Ns3Empty_Ns3DefaultDeleter__lt__ns3MacRxMiddle__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MacRxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacRxMiddle> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MacRxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacRxMiddle>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MacRxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacRxMiddle> >::SimpleRefCount(ns3::SimpleRefCount<ns3::MacRxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacRxMiddle> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MacRxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacRxMiddle>>::SimpleRefCount(ns3::SimpleRefCount<ns3::MacRxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacRxMiddle>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::MacRxMiddle, ns3::empty, ns3::DefaultDeleter< ns3::MacRxMiddle > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3MacTxMiddle_Ns3Empty_Ns3DefaultDeleter__lt__ns3MacTxMiddle__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MacTxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacTxMiddle> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MacTxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacTxMiddle>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MacTxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacTxMiddle> >::SimpleRefCount(ns3::SimpleRefCount<ns3::MacTxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacTxMiddle> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MacTxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacTxMiddle>>::SimpleRefCount(ns3::SimpleRefCount<ns3::MacTxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacTxMiddle>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::MacTxMiddle, ns3::empty, ns3::DefaultDeleter< ns3::MacTxMiddle > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3OutputStreamWrapper_Ns3Empty_Ns3DefaultDeleter__lt__ns3OutputStreamWrapper__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter< ns3::OutputStreamWrapper > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3PhyEntity_Ns3Empty_Ns3DefaultDeleter__lt__ns3PhyEntity__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity> >::SimpleRefCount(ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity>>::SimpleRefCount(ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter< ns3::PhyEntity > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3QueueItem_Ns3Empty_Ns3DefaultDeleter__lt__ns3QueueItem__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> >::SimpleRefCount(ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>>::SimpleRefCount(ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::QueueItem, ns3::empty, ns3::DefaultDeleter< ns3::QueueItem > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3SpectrumModel_Ns3Empty_Ns3DefaultDeleter__lt__ns3SpectrumModel__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel> >::SimpleRefCount(ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel>>::SimpleRefCount(ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter< ns3::SpectrumModel > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3SpectrumValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3SpectrumValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter< ns3::SpectrumValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3WifiInformationElement_Ns3Empty_Ns3DefaultDeleter__lt__ns3WifiInformationElement__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement> >::SimpleRefCount(ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement>>::SimpleRefCount(ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter< ns3::WifiInformationElement > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3WifiMacQueueItem_Ns3Empty_Ns3DefaultDeleter__lt__ns3WifiMacQueueItem__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiMacQueueItem, ns3::empty, ns3::DefaultDeleter<ns3::WifiMacQueueItem> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiMacQueueItem, ns3::empty, ns3::DefaultDeleter<ns3::WifiMacQueueItem>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiMacQueueItem, ns3::empty, ns3::DefaultDeleter<ns3::WifiMacQueueItem> >::SimpleRefCount(ns3::SimpleRefCount<ns3::WifiMacQueueItem, ns3::empty, ns3::DefaultDeleter<ns3::WifiMacQueueItem> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiMacQueueItem, ns3::empty, ns3::DefaultDeleter<ns3::WifiMacQueueItem>>::SimpleRefCount(ns3::SimpleRefCount<ns3::WifiMacQueueItem, ns3::empty, ns3::DefaultDeleter<ns3::WifiMacQueueItem>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::WifiMacQueueItem, ns3::empty, ns3::DefaultDeleter< ns3::WifiMacQueueItem > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3WifiPpdu_Ns3Empty_Ns3DefaultDeleter__lt__ns3WifiPpdu__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiPpdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPpdu> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiPpdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPpdu>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiPpdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPpdu> >::SimpleRefCount(ns3::SimpleRefCount<ns3::WifiPpdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPpdu> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiPpdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPpdu>>::SimpleRefCount(ns3::SimpleRefCount<ns3::WifiPpdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPpdu>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::WifiPpdu, ns3::empty, ns3::DefaultDeleter< ns3::WifiPpdu > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3WifiPsdu_Ns3Empty_Ns3DefaultDeleter__lt__ns3WifiPsdu__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiPsdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPsdu> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiPsdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPsdu>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiPsdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPsdu> >::SimpleRefCount(ns3::SimpleRefCount<ns3::WifiPsdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPsdu> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiPsdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPsdu>>::SimpleRefCount(ns3::SimpleRefCount<ns3::WifiPsdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPsdu>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::WifiPsdu, ns3::empty, ns3::DefaultDeleter< ns3::WifiPsdu > > const &', 'o')])
     return
 
@@ -8835,7 +8842,7 @@
                    'uint8_t', 
                    [param('uint8_t', 'ipTos')], 
                    is_static=True)
-    ## socket.h (module 'network'): void ns3::Socket::Ipv6JoinGroup(ns3::Ipv6Address address, ns3::Socket::Ipv6MulticastFilterMode filterMode, std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address> > sourceAddresses) [member function]
+    ## socket.h (module 'network'): void ns3::Socket::Ipv6JoinGroup(ns3::Ipv6Address address, ns3::Socket::Ipv6MulticastFilterMode filterMode, std::vector<ns3::Ipv6Address, std::allocator<ns3::Ipv6Address>> sourceAddresses) [member function]
     cls.add_method('Ipv6JoinGroup', 
                    'void', 
                    [param('ns3::Ipv6Address', 'address'), param('ns3::Socket::Ipv6MulticastFilterMode', 'filterMode'), param('std::vector< ns3::Ipv6Address >', 'sourceAddresses')], 
@@ -9360,16 +9367,16 @@
     cls.add_binary_comparison_operator('==')
     ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(ns3::SpectrumModel const & arg0) [constructor]
     cls.add_constructor([param('ns3::SpectrumModel const &', 'arg0')])
-    ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(std::vector<double, std::allocator<double> > const & centerFreqs) [constructor]
+    ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(std::vector<double, std::allocator<double>> const & centerFreqs) [constructor]
     cls.add_constructor([param('std::vector< double > const &', 'centerFreqs')])
     ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(ns3::Bands const & bands) [constructor]
     cls.add_constructor([param('ns3::Bands const &', 'bands')])
-    ## spectrum-model.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo> >::const_iterator ns3::SpectrumModel::Begin() const [member function]
+    ## spectrum-model.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo>>::const_iterator ns3::SpectrumModel::Begin() const [member function]
     cls.add_method('Begin', 
                    'std::vector< ns3::BandInfo > const_iterator', 
                    [], 
                    is_const=True)
-    ## spectrum-model.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo> >::const_iterator ns3::SpectrumModel::End() const [member function]
+    ## spectrum-model.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo>>::const_iterator ns3::SpectrumModel::End() const [member function]
     cls.add_method('End', 
                    'std::vector< ns3::BandInfo > const_iterator', 
                    [], 
@@ -9416,22 +9423,22 @@
     cls.add_constructor([param('ns3::Ptr< ns3::SpectrumModel const >', 'sm')])
     ## spectrum-value.h (module 'spectrum'): ns3::SpectrumValue::SpectrumValue() [constructor]
     cls.add_constructor([])
-    ## spectrum-value.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo> >::const_iterator ns3::SpectrumValue::ConstBandsBegin() const [member function]
+    ## spectrum-value.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo>>::const_iterator ns3::SpectrumValue::ConstBandsBegin() const [member function]
     cls.add_method('ConstBandsBegin', 
                    'std::vector< ns3::BandInfo > const_iterator', 
                    [], 
                    is_const=True)
-    ## spectrum-value.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo> >::const_iterator ns3::SpectrumValue::ConstBandsEnd() const [member function]
+    ## spectrum-value.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo>>::const_iterator ns3::SpectrumValue::ConstBandsEnd() const [member function]
     cls.add_method('ConstBandsEnd', 
                    'std::vector< ns3::BandInfo > const_iterator', 
                    [], 
                    is_const=True)
-    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double> >::const_iterator ns3::SpectrumValue::ConstValuesBegin() const [member function]
+    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double>>::const_iterator ns3::SpectrumValue::ConstValuesBegin() const [member function]
     cls.add_method('ConstValuesBegin', 
                    'std::vector< double > const_iterator', 
                    [], 
                    is_const=True)
-    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double> >::const_iterator ns3::SpectrumValue::ConstValuesEnd() const [member function]
+    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double>>::const_iterator ns3::SpectrumValue::ConstValuesEnd() const [member function]
     cls.add_method('ConstValuesEnd', 
                    'std::vector< double > const_iterator', 
                    [], 
@@ -9461,11 +9468,11 @@
                    'double const &', 
                    [param('uint32_t', 'pos')], 
                    is_const=True)
-    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double> >::iterator ns3::SpectrumValue::ValuesBegin() [member function]
+    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double>>::iterator ns3::SpectrumValue::ValuesBegin() [member function]
     cls.add_method('ValuesBegin', 
                    'std::vector< double > iterator', 
                    [])
-    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double> >::iterator ns3::SpectrumValue::ValuesEnd() [member function]
+    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double>>::iterator ns3::SpectrumValue::ValuesEnd() [member function]
     cls.add_method('ValuesEnd', 
                    'std::vector< double > iterator', 
                    [])
@@ -9640,11 +9647,6 @@
                    'void', 
                    [], 
                    is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::NotifyChannelSwitching() [member function]
-    cls.add_method('NotifyChannelSwitching', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
     ## txop.h (module 'wifi'): void ns3::Txop::NotifyOff() [member function]
     cls.add_method('NotifyOff', 
                    'void', 
@@ -9703,10 +9705,10 @@
     cls.add_method('SetTxopLimit', 
                    'void', 
                    [param('ns3::Time', 'txopLimit')])
-    ## txop.h (module 'wifi'): void ns3::Txop::SetWifiMac(ns3::Ptr<ns3::RegularWifiMac> const mac) [member function]
+    ## txop.h (module 'wifi'): void ns3::Txop::SetWifiMac(ns3::Ptr<ns3::WifiMac> const mac) [member function]
     cls.add_method('SetWifiMac', 
                    'void', 
-                   [param('ns3::Ptr< ns3::RegularWifiMac > const', 'mac')], 
+                   [param('ns3::Ptr< ns3::WifiMac > const', 'mac')], 
                    is_virtual=True)
     ## txop.h (module 'wifi'): void ns3::Txop::StartBackoffNow(uint32_t nSlots) [member function]
     cls.add_method('StartBackoffNow', 
@@ -10069,7 +10071,7 @@
 def register_Ns3WifiAckAfterTbPpdu_methods(root_module, cls):
     ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiAckAfterTbPpdu::WifiAckAfterTbPpdu() [constructor]
     cls.add_constructor([])
-    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiAckAfterTbPpdu::Copy() const [member function]
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment>> ns3::WifiAckAfterTbPpdu::Copy() const [member function]
     cls.add_method('Copy', 
                    'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
                    [], 
@@ -10108,16 +10110,16 @@
                    'void', 
                    [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('ns3::WifiAcknowledgment const *', 'acknowledgment')], 
                    is_static=True)
-    ## wifi-ack-manager.h (module 'wifi'): void ns3::WifiAckManager::SetWifiMac(ns3::Ptr<ns3::RegularWifiMac> mac) [member function]
+    ## wifi-ack-manager.h (module 'wifi'): void ns3::WifiAckManager::SetWifiMac(ns3::Ptr<ns3::WifiMac> mac) [member function]
     cls.add_method('SetWifiMac', 
                    'void', 
-                   [param('ns3::Ptr< ns3::RegularWifiMac >', 'mac')])
-    ## wifi-ack-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiAckManager::TryAddMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters const & txParams) [member function]
+                   [param('ns3::Ptr< ns3::WifiMac >', 'mac')])
+    ## wifi-ack-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment>> ns3::WifiAckManager::TryAddMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters const & txParams) [member function]
     cls.add_method('TryAddMpdu', 
                    'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::WifiTxParameters const &', 'txParams')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## wifi-ack-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiAckManager::TryAggregateMsdu(ns3::Ptr<const ns3::WifiMacQueueItem> msdu, ns3::WifiTxParameters const & txParams) [member function]
+    ## wifi-ack-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment>> ns3::WifiAckManager::TryAggregateMsdu(ns3::Ptr<const ns3::WifiMacQueueItem> msdu, ns3::WifiTxParameters const & txParams) [member function]
     cls.add_method('TryAggregateMsdu', 
                    'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'msdu'), param('ns3::WifiTxParameters const &', 'txParams')], 
@@ -10132,7 +10134,7 @@
 def register_Ns3WifiCtsToSelfProtection_methods(root_module, cls):
     ## wifi-protection.h (module 'wifi'): ns3::WifiCtsToSelfProtection::WifiCtsToSelfProtection() [constructor]
     cls.add_constructor([])
-    ## wifi-protection.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection> > ns3::WifiCtsToSelfProtection::Copy() const [member function]
+    ## wifi-protection.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection>> ns3::WifiCtsToSelfProtection::Copy() const [member function]
     cls.add_method('Copy', 
                    'std::unique_ptr< ns3::WifiProtection, std::default_delete< ns3::WifiProtection > >', 
                    [], 
@@ -10205,102 +10207,153 @@
     return
 
 def register_Ns3WifiMac_methods(root_module, cls):
+    ## wifi-mac.h (module 'wifi'): static ns3::TypeId ns3::WifiMac::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## wifi-mac.h (module 'wifi'): ns3::WifiMac::WifiMac() [constructor]
     cls.add_constructor([])
-    ## wifi-mac.h (module 'wifi'): ns3::WifiMac::WifiMac(ns3::WifiMac const & arg0) [constructor]
-    cls.add_constructor([param('ns3::WifiMac const &', 'arg0')])
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::ConfigureStandard(ns3::WifiStandard standard) [member function]
-    cls.add_method('ConfigureStandard', 
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetDevice(ns3::Ptr<ns3::WifiNetDevice> const device) [member function]
+    cls.add_method('SetDevice', 
                    'void', 
-                   [param('ns3::WifiStandard', 'standard')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::DoDispose() [member function]
-    cls.add_method('DoDispose', 
+                   [param('ns3::Ptr< ns3::WifiNetDevice > const', 'device')])
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiNetDevice> ns3::WifiMac::GetDevice() const [member function]
+    cls.add_method('GetDevice', 
+                   'ns3::Ptr< ns3::WifiNetDevice >', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::FrameExchangeManager> ns3::WifiMac::GetFrameExchangeManager() const [member function]
+    cls.add_method('GetFrameExchangeManager', 
+                   'ns3::Ptr< ns3::FrameExchangeManager >', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::Txop> ns3::WifiMac::GetTxop() const [member function]
+    cls.add_method('GetTxop', 
+                   'ns3::Ptr< ns3::Txop >', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::WifiMac::GetQosTxop(ns3::AcIndex ac) const [member function]
+    cls.add_method('GetQosTxop', 
+                   'ns3::Ptr< ns3::QosTxop >', 
+                   [param('ns3::AcIndex', 'ac')], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::WifiMac::GetQosTxop(uint8_t tid) const [member function]
+    cls.add_method('GetQosTxop', 
+                   'ns3::Ptr< ns3::QosTxop >', 
+                   [param('uint8_t', 'tid')], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueue> ns3::WifiMac::GetTxopQueue(ns3::AcIndex ac) const [member function]
+    cls.add_method('GetTxopQueue', 
+                   'ns3::Ptr< ns3::WifiMacQueue >', 
+                   [param('ns3::AcIndex', 'ac')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetTypeOfStation(ns3::TypeOfStation type) [member function]
+    cls.add_method('SetTypeOfStation', 
                    'void', 
+                   [param('ns3::TypeOfStation', 'type')])
+    ## wifi-mac.h (module 'wifi'): ns3::TypeOfStation ns3::WifiMac::GetTypeOfStation() const [member function]
+    cls.add_method('GetTypeOfStation', 
+                   'ns3::TypeOfStation', 
                    [], 
-                   is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to, ns3::Mac48Address from) [member function]
-    cls.add_method('Enqueue', 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetSsid(ns3::Ssid ssid) [member function]
+    cls.add_method('SetSsid', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to'), param('ns3::Mac48Address', 'from')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to) [member function]
-    cls.add_method('Enqueue', 
+                   [param('ns3::Ssid', 'ssid')])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetPromisc() [member function]
+    cls.add_method('SetPromisc', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to')], 
-                   is_pure_virtual=True, is_virtual=True)
+                   [])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetCtsToSelfSupported(bool enable) [member function]
+    cls.add_method('SetCtsToSelfSupported', 
+                   'void', 
+                   [param('bool', 'enable')])
     ## wifi-mac.h (module 'wifi'): ns3::Mac48Address ns3::WifiMac::GetAddress() const [member function]
     cls.add_method('GetAddress', 
                    'ns3::Mac48Address', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): ns3::Mac48Address ns3::WifiMac::GetBssid() const [member function]
-    cls.add_method('GetBssid', 
-                   'ns3::Mac48Address', 
-                   [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::NetDevice> ns3::WifiMac::GetDevice() const [member function]
-    cls.add_method('GetDevice', 
-                   'ns3::Ptr< ns3::NetDevice >', 
-                   [], 
                    is_const=True)
-    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::HeConfiguration> ns3::WifiMac::GetHeConfiguration() const [member function]
-    cls.add_method('GetHeConfiguration', 
-                   'ns3::Ptr< ns3::HeConfiguration >', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::HtConfiguration> ns3::WifiMac::GetHtConfiguration() const [member function]
-    cls.add_method('GetHtConfiguration', 
-                   'ns3::Ptr< ns3::HtConfiguration >', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::GetShortSlotTimeSupported() const [member function]
-    cls.add_method('GetShortSlotTimeSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## wifi-mac.h (module 'wifi'): ns3::Ssid ns3::WifiMac::GetSsid() const [member function]
     cls.add_method('GetSsid', 
                    'ns3::Ssid', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): static ns3::TypeId ns3::WifiMac::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## wifi-mac.h (module 'wifi'): ns3::TypeOfStation ns3::WifiMac::GetTypeOfStation() const [member function]
-    cls.add_method('GetTypeOfStation', 
-                   'ns3::TypeOfStation', 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetAddress(ns3::Mac48Address address) [member function]
+    cls.add_method('SetAddress', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Mac48Address ns3::WifiMac::GetBssid() const [member function]
+    cls.add_method('GetBssid', 
+                   'ns3::Mac48Address', 
                    [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetBssid(ns3::Mac48Address bssid) [member function]
+    cls.add_method('SetBssid', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'bssid')])
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::CanForwardPacketsTo(ns3::Mac48Address to) const [member function]
+    cls.add_method('CanForwardPacketsTo', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'to')], 
                    is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::VhtConfiguration> ns3::WifiMac::GetVhtConfiguration() const [member function]
-    cls.add_method('GetVhtConfiguration', 
-                   'ns3::Ptr< ns3::VhtConfiguration >', 
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to, ns3::Mac48Address from) [member function]
+    cls.add_method('Enqueue', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to'), param('ns3::Mac48Address', 'from')], 
+                   is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to) [member function]
+    cls.add_method('Enqueue', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::SupportsSendFrom() const [member function]
+    cls.add_method('SupportsSendFrom', 
+                   'bool', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetWifiPhy(ns3::Ptr<ns3::WifiPhy> phy) [member function]
+    cls.add_method('SetWifiPhy', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPhy >', 'phy')], 
+                   is_virtual=True)
     ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiPhy> ns3::WifiMac::GetWifiPhy() const [member function]
     cls.add_method('GetWifiPhy', 
                    'ns3::Ptr< ns3::WifiPhy >', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::ResetWifiPhy() [member function]
+    cls.add_method('ResetWifiPhy', 
+                   'void', 
+                   [])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetWifiRemoteStationManager(ns3::Ptr<ns3::WifiRemoteStationManager> stationManager) [member function]
+    cls.add_method('SetWifiRemoteStationManager', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiRemoteStationManager >', 'stationManager')])
     ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiRemoteStationManager> ns3::WifiMac::GetWifiRemoteStationManager() const [member function]
     cls.add_method('GetWifiRemoteStationManager', 
                    'ns3::Ptr< ns3::WifiRemoteStationManager >', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyPromiscRx(ns3::Ptr<const ns3::Packet> packet) [member function]
-    cls.add_method('NotifyPromiscRx', 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetForwardUpCallback(ns3::WifiMac::ForwardUpCallback upCallback) [member function]
+    cls.add_method('SetForwardUpCallback', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyRx(ns3::Ptr<const ns3::Packet> packet) [member function]
-    cls.add_method('NotifyRx', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'upCallback')])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetLinkUpCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkUp) [member function]
+    cls.add_method('SetLinkUpCallback', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyRxDrop(ns3::Ptr<const ns3::Packet> packet) [member function]
-    cls.add_method('NotifyRxDrop', 
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkUp')], 
+                   is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetLinkDownCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkDown) [member function]
+    cls.add_method('SetLinkDownCallback', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkDown')])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyChannelSwitching() [member function]
+    cls.add_method('NotifyChannelSwitching', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
     ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyTx(ns3::Ptr<const ns3::Packet> packet) [member function]
     cls.add_method('NotifyTx', 
                    'void', 
@@ -10309,75 +10362,163 @@
     cls.add_method('NotifyTxDrop', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet const >', 'packet')])
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::ResetWifiPhy() [member function]
-    cls.add_method('ResetWifiPhy', 
-                   'void', 
-                   [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetAddress(ns3::Mac48Address address) [member function]
-    cls.add_method('SetAddress', 
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyRx(ns3::Ptr<const ns3::Packet> packet) [member function]
+    cls.add_method('NotifyRx', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetDevice(ns3::Ptr<ns3::NetDevice> const device) [member function]
-    cls.add_method('SetDevice', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyPromiscRx(ns3::Ptr<const ns3::Packet> packet) [member function]
+    cls.add_method('NotifyPromiscRx', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NetDevice > const', 'device')])
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetForwardUpCallback(ns3::WifiMac::ForwardUpCallback upCallback) [member function]
-    cls.add_method('SetForwardUpCallback', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyRxDrop(ns3::Ptr<const ns3::Packet> packet) [member function]
+    cls.add_method('NotifyRxDrop', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'upCallback')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetLinkDownCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkDown) [member function]
-    cls.add_method('SetLinkDownCallback', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::ConfigureStandard(ns3::WifiStandard standard) [member function]
+    cls.add_method('ConfigureStandard', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkDown')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetLinkUpCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkUp) [member function]
-    cls.add_method('SetLinkUpCallback', 
+                   [param('ns3::WifiStandard', 'standard')], 
+                   is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::HtConfiguration> ns3::WifiMac::GetHtConfiguration() const [member function]
+    cls.add_method('GetHtConfiguration', 
+                   'ns3::Ptr< ns3::HtConfiguration >', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::VhtConfiguration> ns3::WifiMac::GetVhtConfiguration() const [member function]
+    cls.add_method('GetVhtConfiguration', 
+                   'ns3::Ptr< ns3::VhtConfiguration >', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::HeConfiguration> ns3::WifiMac::GetHeConfiguration() const [member function]
+    cls.add_method('GetHeConfiguration', 
+                   'ns3::Ptr< ns3::HeConfiguration >', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::ExtendedCapabilities ns3::WifiMac::GetExtendedCapabilities() const [member function]
+    cls.add_method('GetExtendedCapabilities', 
+                   'ns3::ExtendedCapabilities', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::HtCapabilities ns3::WifiMac::GetHtCapabilities() const [member function]
+    cls.add_method('GetHtCapabilities', 
+                   'ns3::HtCapabilities', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::VhtCapabilities ns3::WifiMac::GetVhtCapabilities() const [member function]
+    cls.add_method('GetVhtCapabilities', 
+                   'ns3::VhtCapabilities', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::HeCapabilities ns3::WifiMac::GetHeCapabilities() const [member function]
+    cls.add_method('GetHeCapabilities', 
+                   'ns3::HeCapabilities', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::GetQosSupported() const [member function]
+    cls.add_method('GetQosSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::GetErpSupported() const [member function]
+    cls.add_method('GetErpSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::GetDsssSupported() const [member function]
+    cls.add_method('GetDsssSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::GetHtSupported() const [member function]
+    cls.add_method('GetHtSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::GetVhtSupported() const [member function]
+    cls.add_method('GetVhtSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::GetHeSupported() const [member function]
+    cls.add_method('GetHeSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): uint32_t ns3::WifiMac::GetMaxAmpduSize(ns3::AcIndex ac) const [member function]
+    cls.add_method('GetMaxAmpduSize', 
+                   'uint32_t', 
+                   [param('ns3::AcIndex', 'ac')], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): uint16_t ns3::WifiMac::GetMaxAmsduSize(ns3::AcIndex ac) const [member function]
+    cls.add_method('GetMaxAmsduSize', 
+                   'uint16_t', 
+                   [param('ns3::AcIndex', 'ac')], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkUp')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetPromisc() [member function]
-    cls.add_method('SetPromisc', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::DoDispose() [member function]
+    cls.add_method('DoDispose', 
                    'void', 
                    [], 
-                   is_pure_virtual=True, is_virtual=True)
+                   is_virtual=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::ConfigureContentionWindow(uint32_t cwMin, uint32_t cwMax) [member function]
+    cls.add_method('ConfigureContentionWindow', 
+                   'void', 
+                   [param('uint32_t', 'cwMin'), param('uint32_t', 'cwMax')], 
+                   is_virtual=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetQosSupported(bool enable) [member function]
+    cls.add_method('SetQosSupported', 
+                   'void', 
+                   [param('bool', 'enable')], 
+                   visibility='protected')
     ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetShortSlotTimeSupported(bool enable) [member function]
     cls.add_method('SetShortSlotTimeSupported', 
                    'void', 
                    [param('bool', 'enable')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetSsid(ns3::Ssid ssid) [member function]
-    cls.add_method('SetSsid', 
-                   'void', 
-                   [param('ns3::Ssid', 'ssid')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetTypeOfStation(ns3::TypeOfStation type) [member function]
-    cls.add_method('SetTypeOfStation', 
-                   'void', 
-                   [param('ns3::TypeOfStation', 'type')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetWifiPhy(ns3::Ptr<ns3::WifiPhy> phy) [member function]
-    cls.add_method('SetWifiPhy', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiPhy >', 'phy')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetWifiRemoteStationManager(ns3::Ptr<ns3::WifiRemoteStationManager> stationManager) [member function]
-    cls.add_method('SetWifiRemoteStationManager', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiRemoteStationManager >', 'stationManager')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::SupportsSendFrom() const [member function]
-    cls.add_method('SupportsSendFrom', 
+                   visibility='protected')
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::GetShortSlotTimeSupported() const [member function]
+    cls.add_method('GetShortSlotTimeSupported', 
                    'bool', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::ConfigureDcf(ns3::Ptr<ns3::Txop> dcf, uint32_t cwmin, uint32_t cwmax, bool isDsss, ns3::AcIndex ac) [member function]
-    cls.add_method('ConfigureDcf', 
+                   is_const=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::WifiMac::GetVOQueue() const [member function]
+    cls.add_method('GetVOQueue', 
+                   'ns3::Ptr< ns3::QosTxop >', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::WifiMac::GetVIQueue() const [member function]
+    cls.add_method('GetVIQueue', 
+                   'ns3::Ptr< ns3::QosTxop >', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::WifiMac::GetBEQueue() const [member function]
+    cls.add_method('GetBEQueue', 
+                   'ns3::Ptr< ns3::QosTxop >', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::WifiMac::GetBKQueue() const [member function]
+    cls.add_method('GetBKQueue', 
+                   'ns3::Ptr< ns3::QosTxop >', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::Receive(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('Receive', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
+                   is_virtual=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::ForwardUp(ns3::Ptr<const ns3::Packet> packet, ns3::Mac48Address from, ns3::Mac48Address to) [member function]
+    cls.add_method('ForwardUp', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Txop >', 'dcf'), param('uint32_t', 'cwmin'), param('uint32_t', 'cwmax'), param('bool', 'isDsss'), param('ns3::AcIndex', 'ac')], 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::Mac48Address', 'from'), param('ns3::Mac48Address', 'to')], 
                    visibility='protected')
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::DeaggregateAmsduAndForward(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('DeaggregateAmsduAndForward', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
+                   is_virtual=True, visibility='protected')
     return
 
 def register_Ns3WifiMacHeader_methods(root_module, cls):
@@ -10815,6 +10956,11 @@
     cls.add_method('GetHeader', 
                    'ns3::WifiMacHeader &', 
                    [])
+    ## wifi-mac-queue-item.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::WifiMacQueueItem::GetItem() const [member function]
+    cls.add_method('GetItem', 
+                   'ns3::Ptr< ns3::WifiMacQueueItem >', 
+                   [], 
+                   is_const=True)
     ## wifi-mac-queue-item.h (module 'wifi'): ns3::Ptr<const ns3::Packet> ns3::WifiMacQueueItem::GetPacket() const [member function]
     cls.add_method('GetPacket', 
                    'ns3::Ptr< ns3::Packet const >', 
@@ -10835,11 +10981,6 @@
                    'ns3::AcIndex', 
                    [], 
                    is_const=True)
-    ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem::ConstIterator ns3::WifiMacQueueItem::GetQueueIterator() const [member function]
-    cls.add_method('GetQueueIterator', 
-                   'ns3::WifiMacQueueItem::ConstIterator', 
-                   [], 
-                   is_const=True)
     ## wifi-mac-queue-item.h (module 'wifi'): uint32_t ns3::WifiMacQueueItem::GetSize() const [member function]
     cls.add_method('GetSize', 
                    'uint32_t', 
@@ -10891,7 +11032,7 @@
 def register_Ns3WifiNoProtection_methods(root_module, cls):
     ## wifi-protection.h (module 'wifi'): ns3::WifiNoProtection::WifiNoProtection() [constructor]
     cls.add_constructor([])
-    ## wifi-protection.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection> > ns3::WifiNoProtection::Copy() const [member function]
+    ## wifi-protection.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection>> ns3::WifiNoProtection::Copy() const [member function]
     cls.add_method('Copy', 
                    'std::unique_ptr< ns3::WifiProtection, std::default_delete< ns3::WifiProtection > >', 
                    [], 
@@ -10913,8 +11054,6 @@
                    is_static=True)
     ## wifi-phy.h (module 'wifi'): ns3::WifiPhy::WifiPhy() [constructor]
     cls.add_constructor([])
-    ## wifi-phy.h (module 'wifi'): ns3::WifiPhy::m_frequencyChannels [variable]
-    cls.add_static_attribute('m_frequencyChannels', 'std::set< std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand > > const', is_const=True)
     ## wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::WifiPhyStateHelper> ns3::WifiPhy::GetState() const [member function]
     cls.add_method('GetState', 
                    'ns3::Ptr< ns3::WifiPhyStateHelper >', 
@@ -10961,10 +11100,10 @@
     cls.add_method('Send', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::Send(ns3::WifiConstPsduMap psdus, ns3::WifiTxVector txVector) [member function]
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::Send(ns3::WifiConstPsduMap psdus, ns3::WifiTxVector const & txVector) [member function]
     cls.add_method('Send', 
                    'void', 
-                   [param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'psdus'), param('ns3::WifiTxVector', 'txVector')])
+                   [param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'psdus'), param('ns3::WifiTxVector const &', 'txVector')])
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::StartTx(ns3::Ptr<ns3::WifiPpdu> ppdu) [member function]
     cls.add_method('StartTx', 
                    'void', 
@@ -11075,12 +11214,12 @@
                    'ns3::Time', 
                    [param('ns3::WifiTxVector const &', 'txVector')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> > ns3::WifiPhy::GetModeList() const [member function]
+    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode>> ns3::WifiPhy::GetModeList() const [member function]
     cls.add_method('GetModeList', 
                    'std::list< ns3::WifiMode >', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> > ns3::WifiPhy::GetModeList(ns3::WifiModulationClass modulation) const [member function]
+    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode>> ns3::WifiPhy::GetModeList(ns3::WifiModulationClass modulation) const [member function]
     cls.add_method('GetModeList', 
                    'std::list< ns3::WifiMode >', 
                    [param('ns3::WifiModulationClass', 'modulation')], 
@@ -11147,7 +11286,7 @@
                    'uint32_t', 
                    [param('ns3::WifiModulationClass', 'modulation')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): std::list<unsigned char, std::allocator<unsigned char> > ns3::WifiPhy::GetBssMembershipSelectorList() const [member function]
+    ## wifi-phy.h (module 'wifi'): std::list<unsigned char, std::allocator<unsigned char>> ns3::WifiPhy::GetBssMembershipSelectorList() const [member function]
     cls.add_method('GetBssMembershipSelectorList', 
                    'std::list< unsigned char >', 
                    [], 
@@ -11157,12 +11296,12 @@
                    'uint16_t', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> > ns3::WifiPhy::GetMcsList() const [member function]
+    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode>> ns3::WifiPhy::GetMcsList() const [member function]
     cls.add_method('GetMcsList', 
                    'std::list< ns3::WifiMode >', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> > ns3::WifiPhy::GetMcsList(ns3::WifiModulationClass modulation) const [member function]
+    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode>> ns3::WifiPhy::GetMcsList(ns3::WifiModulationClass modulation) const [member function]
     cls.add_method('GetMcsList', 
                    'std::list< ns3::WifiMode >', 
                    [param('ns3::WifiModulationClass', 'modulation')], 
@@ -11172,11 +11311,6 @@
                    'ns3::WifiMode', 
                    [param('ns3::WifiModulationClass', 'modulation'), param('uint8_t', 'mcs')], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetChannelNumber(uint8_t id) [member function]
-    cls.add_method('SetChannelNumber', 
-                   'void', 
-                   [param('uint8_t', 'id')], 
-                   is_virtual=True)
     ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetChannelNumber() const [member function]
     cls.add_method('GetChannelNumber', 
                    'uint8_t', 
@@ -11187,14 +11321,14 @@
                    'ns3::Time', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::ConfigureStandardAndBand(ns3::WifiPhyStandard standard, ns3::WifiPhyBand band) [member function]
-    cls.add_method('ConfigureStandardAndBand', 
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::ConfigureStandard(ns3::WifiStandard standard) [member function]
+    cls.add_method('ConfigureStandard', 
                    'void', 
-                   [param('ns3::WifiPhyStandard', 'standard'), param('ns3::WifiPhyBand', 'band')], 
+                   [param('ns3::WifiStandard', 'standard')], 
                    is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): ns3::WifiPhyStandard ns3::WifiPhy::GetPhyStandard() const [member function]
-    cls.add_method('GetPhyStandard', 
-                   'ns3::WifiPhyStandard', 
+    ## wifi-phy.h (module 'wifi'): ns3::WifiStandard ns3::WifiPhy::GetStandard() const [member function]
+    cls.add_method('GetStandard', 
+                   'ns3::WifiStandard', 
                    [], 
                    is_const=True)
     ## wifi-phy.h (module 'wifi'): ns3::WifiPhyBand ns3::WifiPhy::GetPhyBand() const [member function]
@@ -11236,7 +11370,7 @@
     cls.add_method('NotifyRxDrop', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiPhyRxfailureReason', 'reason')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyMonitorSniffRx(ns3::Ptr<const ns3::WifiPsdu> psdu, uint16_t channelFreqMhz, ns3::WifiTxVector txVector, ns3::SignalNoiseDbm signalNoise, std::vector<bool, std::allocator<bool> > statusPerMpdu, uint16_t staId=65535) [member function]
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyMonitorSniffRx(ns3::Ptr<const ns3::WifiPsdu> psdu, uint16_t channelFreqMhz, ns3::WifiTxVector txVector, ns3::SignalNoiseDbm signalNoise, std::vector<bool, std::allocator<bool>> statusPerMpdu, uint16_t staId=65535) [member function]
     cls.add_method('NotifyMonitorSniffRx', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('uint16_t', 'channelFreqMhz'), param('ns3::WifiTxVector', 'txVector'), param('ns3::SignalNoiseDbm', 'signalNoise'), param('std::vector< bool >', 'statusPerMpdu'), param('uint16_t', 'staId', default_value='65535')])
@@ -11316,13 +11450,13 @@
                    'double', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetDevice(ns3::Ptr<ns3::NetDevice> const device) [member function]
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetDevice(ns3::Ptr<ns3::WifiNetDevice> const device) [member function]
     cls.add_method('SetDevice', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NetDevice > const', 'device')])
-    ## wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::NetDevice> ns3::WifiPhy::GetDevice() const [member function]
+                   [param('ns3::Ptr< ns3::WifiNetDevice > const', 'device')])
+    ## wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::WifiNetDevice> ns3::WifiPhy::GetDevice() const [member function]
     cls.add_method('GetDevice', 
-                   'ns3::Ptr< ns3::NetDevice >', 
+                   'ns3::Ptr< ns3::WifiNetDevice >', 
                    [], 
                    is_const=True)
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetMobility(ns3::Ptr<ns3::MobilityModel> const mobility) [member function]
@@ -11334,24 +11468,20 @@
                    'ns3::Ptr< ns3::MobilityModel >', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetOperatingChannel(uint8_t number, uint16_t frequency, uint16_t width) [member function]
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetOperatingChannel(ns3::WifiPhy::ChannelTuple const & channelTuple) [member function]
     cls.add_method('SetOperatingChannel', 
                    'void', 
-                   [param('uint8_t', 'number'), param('uint16_t', 'frequency'), param('uint16_t', 'width')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetFrequency(uint16_t freq) [member function]
-    cls.add_method('SetFrequency', 
-                   'void', 
-                   [param('uint16_t', 'freq')], 
-                   is_virtual=True)
+                   [param('ns3::WifiPhy::ChannelTuple const &', 'channelTuple')])
     ## wifi-phy.h (module 'wifi'): uint16_t ns3::WifiPhy::GetFrequency() const [member function]
     cls.add_method('GetFrequency', 
                    'uint16_t', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetPrimary20Index(uint8_t index) [member function]
-    cls.add_method('SetPrimary20Index', 
-                   'void', 
-                   [param('uint8_t', 'index')])
+    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetPrimary20Index() const [member function]
+    cls.add_method('GetPrimary20Index', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetNumberOfAntennas(uint8_t antennas) [member function]
     cls.add_method('SetNumberOfAntennas', 
                    'void', 
@@ -11413,16 +11543,11 @@
                    'uint16_t', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetChannelWidth(uint16_t channelWidth) [member function]
-    cls.add_method('SetChannelWidth', 
-                   'void', 
-                   [param('uint16_t', 'channelWidth')], 
-                   is_virtual=True)
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::AddSupportedChannelWidth(uint16_t width) [member function]
     cls.add_method('AddSupportedChannelWidth', 
                    'void', 
                    [param('uint16_t', 'width')])
-    ## wifi-phy.h (module 'wifi'): std::vector<unsigned short, std::allocator<unsigned short> > ns3::WifiPhy::GetSupportedChannelWidthSet() const [member function]
+    ## wifi-phy.h (module 'wifi'): std::vector<unsigned short, std::allocator<unsigned short>> ns3::WifiPhy::GetSupportedChannelWidthSet() const [member function]
     cls.add_method('GetSupportedChannelWidthSet', 
                    'std::vector< unsigned short >', 
                    [], 
@@ -11480,6 +11605,11 @@
                    'std::tuple< double, double, double >', 
                    [], 
                    is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetPrimaryChannelNumber(uint16_t primaryChannelWidth) const [member function]
+    cls.add_method('GetPrimaryChannelNumber', 
+                   'uint8_t', 
+                   [param('uint16_t', 'primaryChannelWidth')], 
+                   is_const=True)
     ## wifi-phy.h (module 'wifi'): ns3::WifiPhy::WifiPhy(ns3::WifiPhy const & arg0) [constructor]
     cls.add_constructor([param('ns3::WifiPhy const &', 'arg0')])
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::DoDispose() [member function]
@@ -11492,11 +11622,16 @@
                    'void', 
                    [], 
                    visibility='protected')
-    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::DoChannelSwitch() [member function]
-    cls.add_method('DoChannelSwitch', 
+    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetDelayUntilChannelSwitch() [member function]
+    cls.add_method('GetDelayUntilChannelSwitch', 
                    'ns3::Time', 
                    [], 
                    visibility='protected')
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::DoChannelSwitch() [member function]
+    cls.add_method('DoChannelSwitch', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SwitchMaybeToCcaBusy(uint16_t channelWidth) [member function]
     cls.add_method('SwitchMaybeToCcaBusy', 
                    'void', 
@@ -11617,7 +11752,7 @@
     cls.add_method('SwitchFromRxEndError', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('double', 'snr')])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchFromRxEndOk(ns3::Ptr<ns3::WifiPsdu> psdu, ns3::RxSignalInfo rxSignalInfo, ns3::WifiTxVector txVector, uint16_t staId, std::vector<bool, std::allocator<bool> > statusPerMpdu) [member function]
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchFromRxEndOk(ns3::Ptr<ns3::WifiPsdu> psdu, ns3::RxSignalInfo rxSignalInfo, ns3::WifiTxVector txVector, uint16_t staId, std::vector<bool, std::allocator<bool>> statusPerMpdu) [member function]
     cls.add_method('SwitchFromRxEndOk', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('ns3::RxSignalInfo', 'rxSignalInfo'), param('ns3::WifiTxVector', 'txVector'), param('uint16_t', 'staId'), param('std::vector< bool >', 'statusPerMpdu')])
@@ -11753,16 +11888,16 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## wifi-protection-manager.h (module 'wifi'): void ns3::WifiProtectionManager::SetWifiMac(ns3::Ptr<ns3::RegularWifiMac> mac) [member function]
+    ## wifi-protection-manager.h (module 'wifi'): void ns3::WifiProtectionManager::SetWifiMac(ns3::Ptr<ns3::WifiMac> mac) [member function]
     cls.add_method('SetWifiMac', 
                    'void', 
-                   [param('ns3::Ptr< ns3::RegularWifiMac >', 'mac')])
-    ## wifi-protection-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection> > ns3::WifiProtectionManager::TryAddMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters const & txParams) [member function]
+                   [param('ns3::Ptr< ns3::WifiMac >', 'mac')])
+    ## wifi-protection-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection>> ns3::WifiProtectionManager::TryAddMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters const & txParams) [member function]
     cls.add_method('TryAddMpdu', 
                    'std::unique_ptr< ns3::WifiProtection, std::default_delete< ns3::WifiProtection > >', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::WifiTxParameters const &', 'txParams')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## wifi-protection-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection> > ns3::WifiProtectionManager::TryAggregateMsdu(ns3::Ptr<const ns3::WifiMacQueueItem> msdu, ns3::WifiTxParameters const & txParams) [member function]
+    ## wifi-protection-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection>> ns3::WifiProtectionManager::TryAggregateMsdu(ns3::Ptr<const ns3::WifiMacQueueItem> msdu, ns3::WifiTxParameters const & txParams) [member function]
     cls.add_method('TryAggregateMsdu', 
                    'std::unique_ptr< ns3::WifiProtection, std::default_delete< ns3::WifiProtection > >', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'msdu'), param('ns3::WifiTxParameters const &', 'txParams')], 
@@ -11784,7 +11919,7 @@
     cls.add_constructor([param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('bool', 'isSingle')])
     ## wifi-psdu.h (module 'wifi'): ns3::WifiPsdu::WifiPsdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, bool isSingle) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('bool', 'isSingle')])
-    ## wifi-psdu.h (module 'wifi'): ns3::WifiPsdu::WifiPsdu(std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > > mpduList) [constructor]
+    ## wifi-psdu.h (module 'wifi'): ns3::WifiPsdu::WifiPsdu(std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem>>> mpduList) [constructor]
     cls.add_constructor([param('std::vector< ns3::Ptr< ns3::WifiMacQueueItem > >', 'mpduList')])
     ## wifi-psdu.h (module 'wifi'): ns3::WifiMacHeader::QosAckPolicy ns3::WifiPsdu::GetAckPolicyForTid(uint8_t tid) const [member function]
     cls.add_method('GetAckPolicyForTid', 
@@ -11850,7 +11985,7 @@
                    'uint32_t', 
                    [], 
                    is_const=True)
-    ## wifi-psdu.h (module 'wifi'): std::set<unsigned char, std::less<unsigned char>, std::allocator<unsigned char> > ns3::WifiPsdu::GetTids() const [member function]
+    ## wifi-psdu.h (module 'wifi'): std::set<unsigned char, std::less<unsigned char>, std::allocator<unsigned char>> ns3::WifiPsdu::GetTids() const [member function]
     cls.add_method('GetTids', 
                    'std::set< unsigned char >', 
                    [], 
@@ -11883,21 +12018,21 @@
     cls.add_method('SetDuration', 
                    'void', 
                    [param('ns3::Time', 'duration')])
-    ## wifi-psdu.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > >::const_iterator ns3::WifiPsdu::begin() const [member function]
+    ## wifi-psdu.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem>>>::const_iterator ns3::WifiPsdu::begin() const [member function]
     cls.add_method('begin', 
                    'std::vector< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 
                    [], 
                    is_const=True)
-    ## wifi-psdu.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > >::iterator ns3::WifiPsdu::begin() [member function]
+    ## wifi-psdu.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem>>>::iterator ns3::WifiPsdu::begin() [member function]
     cls.add_method('begin', 
                    'std::vector< ns3::Ptr< ns3::WifiMacQueueItem > > iterator', 
                    [])
-    ## wifi-psdu.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > >::const_iterator ns3::WifiPsdu::end() const [member function]
+    ## wifi-psdu.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem>>>::const_iterator ns3::WifiPsdu::end() const [member function]
     cls.add_method('end', 
                    'std::vector< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 
                    [], 
                    is_const=True)
-    ## wifi-psdu.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > >::iterator ns3::WifiPsdu::end() [member function]
+    ## wifi-psdu.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem>>>::iterator ns3::WifiPsdu::end() [member function]
     cls.add_method('end', 
                    'std::vector< ns3::Ptr< ns3::WifiMacQueueItem > > iterator', 
                    [])
@@ -12878,7 +13013,7 @@
     cls.add_method('NotifyMissedAck', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')])
-    ## block-ack-manager.h (module 'wifi'): std::pair<unsigned short, unsigned short> ns3::BlockAckManager::NotifyGotBlockAck(ns3::CtrlBAckResponseHeader const & blockAck, ns3::Mac48Address recipient, std::set<unsigned char, std::less<unsigned char>, std::allocator<unsigned char> > const & tids, size_t index=0) [member function]
+    ## block-ack-manager.h (module 'wifi'): std::pair<unsigned short, unsigned short> ns3::BlockAckManager::NotifyGotBlockAck(ns3::CtrlBAckResponseHeader const & blockAck, ns3::Mac48Address recipient, std::set<unsigned char, std::less<unsigned char>, std::allocator<unsigned char>> const & tids, size_t index=0) [member function]
     cls.add_method('NotifyGotBlockAck', 
                    'std::pair< unsigned short, unsigned short >', 
                    [param('ns3::CtrlBAckResponseHeader const &', 'blockAck'), param('ns3::Mac48Address', 'recipient'), param('std::set< unsigned char > const &', 'tids'), param('size_t', 'index', default_value='0')])
@@ -13042,7 +13177,7 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## bsm-application.h (module 'wave'): void ns3::BsmApplication::Setup(ns3::Ipv4InterfaceContainer & i, int nodeId, ns3::Time totalTime, uint32_t wavePacketSize, ns3::Time waveInterval, double gpsAccuracyNs, std::vector<double, std::allocator<double> > rangesSq, ns3::Ptr<ns3::WaveBsmStats> waveBsmStats, std::vector<int, std::allocator<int> > * nodesMoving, int mode, ns3::Time txDelay) [member function]
+    ## bsm-application.h (module 'wave'): void ns3::BsmApplication::Setup(ns3::Ipv4InterfaceContainer & i, int nodeId, ns3::Time totalTime, uint32_t wavePacketSize, ns3::Time waveInterval, double gpsAccuracyNs, std::vector<double, std::allocator<double>> rangesSq, ns3::Ptr<ns3::WaveBsmStats> waveBsmStats, std::vector<int, std::allocator<int>> * nodesMoving, int mode, ns3::Time txDelay) [member function]
     cls.add_method('Setup', 
                    'void', 
                    [param('ns3::Ipv4InterfaceContainer &', 'i'), param('int', 'nodeId'), param('ns3::Time', 'totalTime'), param('uint32_t', 'wavePacketSize'), param('ns3::Time', 'waveInterval'), param('double', 'gpsAccuracyNs'), param('std::vector< double >', 'rangesSq'), param('ns3::Ptr< ns3::WaveBsmStats >', 'waveBsmStats'), param('std::vector< int > *', 'nodesMoving'), param('int', 'mode'), param('ns3::Time', 'txDelay')])
@@ -13096,17 +13231,12 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['void'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiMacQueueItem const> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::ObjectBase*'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::ObjectBase*'], visibility='protected')
+                   is_static=True, template_parameters=['void'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
@@ -13181,12 +13311,12 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['unsigned long'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::MobilityModel const> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['unsigned char'], visibility='protected')
+                   is_static=True, template_parameters=['unsigned long'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
@@ -13196,137 +13326,142 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Mac48Address'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Time'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Time'], visibility='protected')
+                   is_static=True, template_parameters=['WifiPhyState'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::OriginatorBlockAckAgreement::State'], visibility='protected')
+                   is_static=True, template_parameters=['double'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::WifiMacDropReason'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::WifiMode'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::WifiMacHeader const&'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::WifiPreamble'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiPsdu const> '], visibility='protected')
+                   is_static=True, template_parameters=['unsigned char'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['std::unordered_map<unsigned short', ' ns3::Ptr<ns3::WifiPsdu>', ' std::hash<unsigned short>', ' std::equal_to<unsigned short>', ' std::allocator<std::pair<unsigned short const', ' ns3::Ptr<ns3::WifiPsdu> > > >*'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiPsdu> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['std::set<ns3::Mac48Address', ' std::less<ns3::Mac48Address>', ' std::allocator<ns3::Mac48Address> > const*'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::RxSignalInfo'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::QueueDiscItem const> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::WifiTxVector'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiMac> '], visibility='protected')
+                   is_static=True, template_parameters=['std::vector<bool', ' std::allocator<bool> > '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::OrganizationIdentifier const&'], visibility='protected')
+                   is_static=True, template_parameters=['std::unordered_map<unsigned short', ' ns3::Ptr<ns3::WifiPsdu const>', ' std::hash<unsigned short>', ' std::equal_to<unsigned short>', ' std::allocator<std::pair<unsigned short const', ' ns3::Ptr<ns3::WifiPsdu const> > > > '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Address'], visibility='protected')
+                   is_static=True, template_parameters=['std::map<std::pair<unsigned int', ' unsigned int>', ' double', ' std::less<std::pair<unsigned int', ' unsigned int> >', ' std::allocator<std::pair<std::pair<unsigned int', ' unsigned int> const', ' double> > > '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::MobilityModel const> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::WifiPhyRxfailureReason'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiMacQueueItem> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::MpduInfo'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['WifiPhyState'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::SignalNoiseDbm'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['double'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Mac48Address'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::WifiMode'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::WifiMacHeader const&'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::WifiPreamble'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::WifiMacDropReason'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiPsdu> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiMacQueueItem const> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::RxSignalInfo'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiPsdu const> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::WifiTxVector'], visibility='protected')
+                   is_static=True, template_parameters=['std::unordered_map<unsigned short', ' ns3::Ptr<ns3::WifiPsdu>', ' std::hash<unsigned short>', ' std::equal_to<unsigned short>', ' std::allocator<std::pair<unsigned short const', ' ns3::Ptr<ns3::WifiPsdu> > > >*'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['std::vector<bool', ' std::allocator<bool> > '], visibility='protected')
+                   is_static=True, template_parameters=['std::set<ns3::Mac48Address', ' std::less<ns3::Mac48Address>', ' std::allocator<ns3::Mac48Address> > const*'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['std::unordered_map<unsigned short', ' ns3::Ptr<ns3::WifiPsdu const>', ' std::hash<unsigned short>', ' std::equal_to<unsigned short>', ' std::allocator<std::pair<unsigned short const', ' ns3::Ptr<ns3::WifiPsdu const> > > > '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::QueueDiscItem const> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['std::map<std::pair<unsigned int', ' unsigned int>', ' double', ' std::less<std::pair<unsigned int', ' unsigned int> >', ' std::allocator<std::pair<std::pair<unsigned int', ' unsigned int> const', ' double> > > '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiMac> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::WifiPhyRxfailureReason'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::OrganizationIdentifier const&'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::MpduInfo'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Address'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::SignalNoiseDbm'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::OriginatorBlockAckAgreement::State'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiMacQueueItem> '], visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -13701,7 +13836,7 @@
     cls.add_method('GetOperatingClass', 
                    'uint32_t', 
                    [param('uint32_t', 'channelNumber')])
-    ## channel-manager.h (module 'wave'): static std::vector<unsigned int, std::allocator<unsigned int> > ns3::ChannelManager::GetSchs() [member function]
+    ## channel-manager.h (module 'wave'): static std::vector<unsigned int, std::allocator<unsigned int>> ns3::ChannelManager::GetSchs() [member function]
     cls.add_method('GetSchs', 
                    'std::vector< unsigned int >', 
                    [], 
@@ -13711,7 +13846,7 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## channel-manager.h (module 'wave'): static std::vector<unsigned int, std::allocator<unsigned int> > ns3::ChannelManager::GetWaveChannels() [member function]
+    ## channel-manager.h (module 'wave'): static std::vector<unsigned int, std::allocator<unsigned int>> ns3::ChannelManager::GetWaveChannels() [member function]
     cls.add_method('GetWaveChannels', 
                    'std::vector< unsigned int >', 
                    [], 
@@ -13979,7 +14114,7 @@
                    'uint32_t', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_virtual=True)
-    ## ctrl-headers.h (module 'wifi'): std::vector<unsigned int, std::allocator<unsigned int> > ns3::CtrlBAckResponseHeader::FindPerAidTidInfoWithAid(uint16_t aid) const [member function]
+    ## ctrl-headers.h (module 'wifi'): std::vector<unsigned int, std::allocator<unsigned int>> ns3::CtrlBAckResponseHeader::FindPerAidTidInfoWithAid(uint16_t aid) const [member function]
     cls.add_method('FindPerAidTidInfoWithAid', 
                    'std::vector< unsigned int >', 
                    [param('uint16_t', 'aid')], 
@@ -13994,7 +14129,7 @@
                    'uint16_t', 
                    [param('std::size_t', 'index')], 
                    is_const=True)
-    ## ctrl-headers.h (module 'wifi'): std::vector<unsigned char, std::allocator<unsigned char> > const & ns3::CtrlBAckResponseHeader::GetBitmap(std::size_t index=0) const [member function]
+    ## ctrl-headers.h (module 'wifi'): std::vector<unsigned char, std::allocator<unsigned char>> const & ns3::CtrlBAckResponseHeader::GetBitmap(std::size_t index=0) const [member function]
     cls.add_method('GetBitmap', 
                    'std::vector< unsigned char > const &', 
                    [param('std::size_t', 'index', default_value='0')], 
@@ -15004,8 +15139,9 @@
     ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::NotifySwitchingStartNow(ns3::Time duration) [member function]
     cls.add_method('NotifySwitchingStartNow', 
                    'void', 
-                   [param('ns3::Time', 'duration')])
-    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::Receive(ns3::Ptr<ns3::WifiPsdu> psdu, ns3::RxSignalInfo rxSignalInfo, ns3::WifiTxVector txVector, std::vector<bool, std::allocator<bool> > perMpduStatus) [member function]
+                   [param('ns3::Time', 'duration')], 
+                   is_virtual=True)
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::Receive(ns3::Ptr<ns3::WifiPsdu> psdu, ns3::RxSignalInfo rxSignalInfo, ns3::WifiTxVector txVector, std::vector<bool, std::allocator<bool>> perMpduStatus) [member function]
     cls.add_method('Receive', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('ns3::RxSignalInfo', 'rxSignalInfo'), param('ns3::WifiTxVector', 'txVector'), param('std::vector< bool >', 'perMpduStatus')])
@@ -15062,10 +15198,10 @@
                    'void', 
                    [param('ns3::Ptr< ns3::WifiProtectionManager >', 'protectionManager')], 
                    is_virtual=True)
-    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SetWifiMac(ns3::Ptr<ns3::RegularWifiMac> const mac) [member function]
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SetWifiMac(ns3::Ptr<ns3::WifiMac> const mac) [member function]
     cls.add_method('SetWifiMac', 
                    'void', 
-                   [param('ns3::Ptr< ns3::RegularWifiMac > const', 'mac')], 
+                   [param('ns3::Ptr< ns3::WifiMac > const', 'mac')], 
                    is_virtual=True)
     ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SetWifiPhy(ns3::Ptr<ns3::WifiPhy> const phy) [member function]
     cls.add_method('SetWifiPhy', 
@@ -15087,6 +15223,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')], 
                    is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::DoCtsTimeout(ns3::Ptr<ns3::WifiPsdu> psdu) [member function]
+    cls.add_method('DoCtsTimeout', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu')], 
+                   visibility='protected')
     ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
@@ -15097,7 +15238,7 @@
                    'void', 
                    [param('ns3::WifiMacHeader const &', 'rtsHdr'), param('ns3::WifiTxVector &', 'ctsTxVector'), param('double', 'rtsSnr')], 
                    visibility='protected')
-    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::EndReceiveAmpdu(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::RxSignalInfo const & rxSignalInfo, ns3::WifiTxVector const & txVector, std::vector<bool, std::allocator<bool> > const & perMpduStatus) [member function]
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::EndReceiveAmpdu(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::RxSignalInfo const & rxSignalInfo, ns3::WifiTxVector const & txVector, std::vector<bool, std::allocator<bool>> const & perMpduStatus) [member function]
     cls.add_method('EndReceiveAmpdu', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::RxSignalInfo const &', 'rxSignalInfo'), param('ns3::WifiTxVector const &', 'txVector'), param('std::vector< bool > const &', 'perMpduStatus')], 
@@ -15127,6 +15268,11 @@
                    'ns3::Ptr< ns3::WifiMacQueueItem >', 
                    [], 
                    visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): uint32_t ns3::FrameExchangeManager::GetPsduSize(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetPsduSize', 
+                   'uint32_t', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True, visibility='protected')
     ## frame-exchange-manager.h (module 'wifi'): ns3::Time ns3::FrameExchangeManager::GetRtsDurationId(ns3::WifiTxVector const & rtsTxVector, ns3::Time txDuration, ns3::Time response) const [member function]
     cls.add_method('GetRtsDurationId', 
                    'ns3::Time', 
@@ -15172,13 +15318,13 @@
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiTxVector const &', 'ackTxVector'), param('ns3::RxSignalInfo const &', 'rxInfo'), param('double', 'snr')], 
                    is_virtual=True, visibility='protected')
-    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::RetransmitMpduAfterMissedAck(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) const [member function]
-    cls.add_method('RetransmitMpduAfterMissedAck', 
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::ReleaseSequenceNumber(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) const [member function]
+    cls.add_method('ReleaseSequenceNumber', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
                    is_const=True, is_virtual=True, visibility='protected')
-    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::RetransmitMpduAfterMissedCts(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) const [member function]
-    cls.add_method('RetransmitMpduAfterMissedCts', 
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::RetransmitMpduAfterMissedAck(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) const [member function]
+    cls.add_method('RetransmitMpduAfterMissedAck', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
                    is_const=True, is_virtual=True, visibility='protected')
@@ -15298,19 +15444,14 @@
                    'uint8_t', 
                    [], 
                    is_const=True)
-    ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetHeLtfAndGiForHePpdus() const [member function]
-    cls.add_method('GetHeLtfAndGiForHePpdus', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
     ## he-capabilities.h (module 'wifi'): uint32_t ns3::HeCapabilities::GetHeMacCapabilitiesInfo1() const [member function]
     cls.add_method('GetHeMacCapabilitiesInfo1', 
                    'uint32_t', 
                    [], 
                    is_const=True)
-    ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetHeMacCapabilitiesInfo2() const [member function]
+    ## he-capabilities.h (module 'wifi'): uint16_t ns3::HeCapabilities::GetHeMacCapabilitiesInfo2() const [member function]
     cls.add_method('GetHeMacCapabilitiesInfo2', 
-                   'uint8_t', 
+                   'uint16_t', 
                    [], 
                    is_const=True)
     ## he-capabilities.h (module 'wifi'): uint64_t ns3::HeCapabilities::GetHePhyCapabilitiesInfo1() const [member function]
@@ -15318,11 +15459,26 @@
                    'uint64_t', 
                    [], 
                    is_const=True)
-    ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetHePhyCapabilitiesInfo2() const [member function]
+    ## he-capabilities.h (module 'wifi'): uint16_t ns3::HeCapabilities::GetHePhyCapabilitiesInfo2() const [member function]
     cls.add_method('GetHePhyCapabilitiesInfo2', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetHePhyCapabilitiesInfo3() const [member function]
+    cls.add_method('GetHePhyCapabilitiesInfo3', 
                    'uint8_t', 
                    [], 
                    is_const=True)
+    ## he-capabilities.h (module 'wifi'): bool ns3::HeCapabilities::GetHePpdu4xHeLtf800nsGi() const [member function]
+    cls.add_method('GetHePpdu4xHeLtf800nsGi', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## he-capabilities.h (module 'wifi'): bool ns3::HeCapabilities::GetHeSuPpdu1xHeLtf800nsGi() const [member function]
+    cls.add_method('GetHeSuPpdu1xHeLtf800nsGi', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetHighestMcsSupported() const [member function]
     cls.add_method('GetHighestMcsSupported', 
                    'uint8_t', 
@@ -15382,18 +15538,22 @@
     cls.add_method('SetChannelWidthSet', 
                    'void', 
                    [param('uint8_t', 'channelWidthSet')])
-    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHeLtfAndGiForHePpdus(uint8_t heLtfAndGiForHePpdus) [member function]
-    cls.add_method('SetHeLtfAndGiForHePpdus', 
-                   'void', 
-                   [param('uint8_t', 'heLtfAndGiForHePpdus')])
-    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHeMacCapabilitiesInfo(uint32_t ctrl1, uint8_t ctrl2) [member function]
+    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHeMacCapabilitiesInfo(uint32_t ctrl1, uint16_t ctrl2) [member function]
     cls.add_method('SetHeMacCapabilitiesInfo', 
                    'void', 
-                   [param('uint32_t', 'ctrl1'), param('uint8_t', 'ctrl2')])
-    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHePhyCapabilitiesInfo(uint64_t ctrl1, uint8_t ctrl2) [member function]
+                   [param('uint32_t', 'ctrl1'), param('uint16_t', 'ctrl2')])
+    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHePhyCapabilitiesInfo(uint64_t ctrl1, uint16_t ctrl2, uint8_t ctrl3) [member function]
     cls.add_method('SetHePhyCapabilitiesInfo', 
                    'void', 
-                   [param('uint64_t', 'ctrl1'), param('uint8_t', 'ctrl2')])
+                   [param('uint64_t', 'ctrl1'), param('uint16_t', 'ctrl2'), param('uint8_t', 'ctrl3')])
+    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHePpdu4xHeLtf800nsGi(bool heSuPpdu4xHeLtf800nsGi) [member function]
+    cls.add_method('SetHePpdu4xHeLtf800nsGi', 
+                   'void', 
+                   [param('bool', 'heSuPpdu4xHeLtf800nsGi')])
+    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHeSuPpdu1xHeLtf800nsGi(bool heSuPpdu1xHeLtf800nsGi) [member function]
+    cls.add_method('SetHeSuPpdu1xHeLtf800nsGi', 
+                   'void', 
+                   [param('bool', 'heSuPpdu1xHeLtf800nsGi')])
     ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHeSupported(uint8_t heSupported) [member function]
     cls.add_method('SetHeSupported', 
                    'void', 
@@ -16174,7 +16334,7 @@
                    'ns3::Ipv4Address', 
                    [], 
                    is_const=True)
-    ## ipv4-route.h (module 'internet'): std::map<unsigned int, unsigned int, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, unsigned int> > > ns3::Ipv4MulticastRoute::GetOutputTtlMap() const [member function]
+    ## ipv4-route.h (module 'internet'): std::map<unsigned int, unsigned int, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, unsigned int>>> ns3::Ipv4MulticastRoute::GetOutputTtlMap() const [member function]
     cls.add_method('GetOutputTtlMap', 
                    'std::map< unsigned int, unsigned int >', 
                    [], 
@@ -16904,7 +17064,7 @@
     cls.add_constructor([param('ns3::ListErrorModel const &', 'arg0')])
     ## error-model.h (module 'network'): ns3::ListErrorModel::ListErrorModel() [constructor]
     cls.add_constructor([])
-    ## error-model.h (module 'network'): std::list<unsigned int, std::allocator<unsigned int> > ns3::ListErrorModel::GetList() const [member function]
+    ## error-model.h (module 'network'): std::list<unsigned int, std::allocator<unsigned int>> ns3::ListErrorModel::GetList() const [member function]
     cls.add_method('GetList', 
                    'std::list< unsigned int >', 
                    [], 
@@ -16914,7 +17074,7 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## error-model.h (module 'network'): void ns3::ListErrorModel::SetList(std::list<unsigned int, std::allocator<unsigned int> > const & packetlist) [member function]
+    ## error-model.h (module 'network'): void ns3::ListErrorModel::SetList(std::list<unsigned int, std::allocator<unsigned int>> const & packetlist) [member function]
     cls.add_method('SetList', 
                    'void', 
                    [param('std::list< unsigned int > const &', 'packetlist')])
@@ -17282,10 +17442,16 @@
     cls.add_method('ExtractNeighborIndex', 
                    'uint32_t', 
                    [param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetEpoch() const [member function]
+    cls.add_method('GetEpoch', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() const [member function]
     cls.add_method('GetRemainingBits', 
                    'uint32_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -17296,6 +17462,10 @@
                    'uint32_t', 
                    [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
+    ## nix-vector.h (module 'network'): void ns3::NixVector::SetEpoch(uint32_t epoch) [member function]
+    cls.add_method('SetEpoch', 
+                   'void', 
+                   [param('uint32_t', 'epoch')])
     return
 
 def register_Ns3Node_methods(root_module, cls):
@@ -17471,6 +17641,111 @@
                    [param('ns3::ObjectFactory const &', 'value')])
     return
 
+def register_Ns3OcbWifiMac_methods(root_module, cls):
+    ## ocb-wifi-mac.h (module 'wave'): static ns3::TypeId ns3::OcbWifiMac::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## ocb-wifi-mac.h (module 'wave'): ns3::OcbWifiMac::OcbWifiMac() [constructor]
+    cls.add_constructor([])
+    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::SendVsc(ns3::Ptr<ns3::Packet> vsc, ns3::Mac48Address peer, ns3::OrganizationIdentifier oi) [member function]
+    cls.add_method('SendVsc', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'vsc'), param('ns3::Mac48Address', 'peer'), param('ns3::OrganizationIdentifier', 'oi')])
+    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::AddReceiveVscCallback(ns3::OrganizationIdentifier oi, ns3::VscCallback cb) [member function]
+    cls.add_method('AddReceiveVscCallback', 
+                   'void', 
+                   [param('ns3::OrganizationIdentifier', 'oi'), param('ns3::Callback< bool, ns3::Ptr< ns3::WifiMac >, ns3::OrganizationIdentifier const &, ns3::Ptr< ns3::Packet const >, ns3::Address const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'cb')])
+    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::RemoveReceiveVscCallback(ns3::OrganizationIdentifier oi) [member function]
+    cls.add_method('RemoveReceiveVscCallback', 
+                   'void', 
+                   [param('ns3::OrganizationIdentifier', 'oi')])
+    ## ocb-wifi-mac.h (module 'wave'): ns3::Ssid ns3::OcbWifiMac::GetSsid() const [member function]
+    cls.add_method('GetSsid', 
+                   'ns3::Ssid', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::SetSsid(ns3::Ssid ssid) [member function]
+    cls.add_method('SetSsid', 
+                   'void', 
+                   [param('ns3::Ssid', 'ssid')], 
+                   is_virtual=True)
+    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::SetBssid(ns3::Mac48Address bssid) [member function]
+    cls.add_method('SetBssid', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'bssid')], 
+                   is_virtual=True)
+    ## ocb-wifi-mac.h (module 'wave'): ns3::Mac48Address ns3::OcbWifiMac::GetBssid() const [member function]
+    cls.add_method('GetBssid', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::SetLinkUpCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkUp) [member function]
+    cls.add_method('SetLinkUpCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkUp')], 
+                   is_virtual=True)
+    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::SetLinkDownCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkDown) [member function]
+    cls.add_method('SetLinkDownCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkDown')], 
+                   is_virtual=True)
+    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to) [member function]
+    cls.add_method('Enqueue', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to')], 
+                   is_virtual=True)
+    ## ocb-wifi-mac.h (module 'wave'): bool ns3::OcbWifiMac::CanForwardPacketsTo(ns3::Mac48Address to) const [member function]
+    cls.add_method('CanForwardPacketsTo', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'to')], 
+                   is_const=True, is_virtual=True)
+    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::ConfigureEdca(uint32_t cwmin, uint32_t cwmax, uint32_t aifsn, ns3::AcIndex ac) [member function]
+    cls.add_method('ConfigureEdca', 
+                   'void', 
+                   [param('uint32_t', 'cwmin'), param('uint32_t', 'cwmax'), param('uint32_t', 'aifsn'), param('ns3::AcIndex', 'ac')])
+    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::EnableForWave(ns3::Ptr<ns3::WaveNetDevice> device) [member function]
+    cls.add_method('EnableForWave', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WaveNetDevice >', 'device')])
+    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::Suspend() [member function]
+    cls.add_method('Suspend', 
+                   'void', 
+                   [])
+    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::Resume() [member function]
+    cls.add_method('Resume', 
+                   'void', 
+                   [])
+    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::MakeVirtualBusy(ns3::Time duration) [member function]
+    cls.add_method('MakeVirtualBusy', 
+                   'void', 
+                   [param('ns3::Time', 'duration')])
+    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::CancleTx(ns3::AcIndex ac) [member function]
+    cls.add_method('CancleTx', 
+                   'void', 
+                   [param('ns3::AcIndex', 'ac')])
+    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::Reset() [member function]
+    cls.add_method('Reset', 
+                   'void', 
+                   [])
+    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::ConfigureStandard(ns3::WifiStandard standard) [member function]
+    cls.add_method('ConfigureStandard', 
+                   'void', 
+                   [param('ns3::WifiStandard', 'standard')], 
+                   is_virtual=True)
+    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::Receive(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('Receive', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
+                   is_virtual=True, visibility='private')
+    return
+
 def register_Ns3OrganizationIdentifierChecker_methods(root_module, cls):
     ## vendor-specific-action.h (module 'wave'): ns3::OrganizationIdentifierChecker::OrganizationIdentifierChecker() [constructor]
     cls.add_constructor([])
@@ -17712,10 +17987,11 @@
                    'uint32_t', 
                    [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) const [member function]
     cls.add_method('SetNixVector', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')], 
+                   is_const=True)
     ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
     cls.add_method('ToString', 
                    'std::string', 
@@ -17924,12 +18200,12 @@
     cls.add_method('Transmit', 
                    'void', 
                    [param('ns3::Time', 'txDuration'), param('ns3::Ptr< ns3::WifiPpdu >', 'ppdu'), param('std::string', 'type')])
-    ## phy-entity.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> >::const_iterator ns3::PhyEntity::begin() const [member function]
+    ## phy-entity.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode>>::const_iterator ns3::PhyEntity::begin() const [member function]
     cls.add_method('begin', 
                    'std::list< ns3::WifiMode > const_iterator', 
                    [], 
                    is_const=True)
-    ## phy-entity.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> >::const_iterator ns3::PhyEntity::end() const [member function]
+    ## phy-entity.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode>>::const_iterator ns3::PhyEntity::end() const [member function]
     cls.add_method('end', 
                    'std::list< ns3::WifiMode > const_iterator', 
                    [], 
@@ -18014,7 +18290,7 @@
                    'uint16_t', 
                    [param('ns3::WifiTxVector const &', 'txVector')], 
                    is_const=True, visibility='protected')
-    ## phy-entity.h (module 'wifi'): std::pair<unsigned short, std::pair<unsigned int, unsigned int> > ns3::PhyEntity::GetChannelWidthAndBand(ns3::WifiTxVector const & txVector, uint16_t staId) const [member function]
+    ## phy-entity.h (module 'wifi'): std::pair<unsigned short, std::pair<unsigned int, unsigned int>> ns3::PhyEntity::GetChannelWidthAndBand(ns3::WifiTxVector const & txVector, uint16_t staId) const [member function]
     cls.add_method('GetChannelWidthAndBand', 
                    'std::pair< unsigned short, std::pair< unsigned int, unsigned int > >', 
                    [param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId')], 
@@ -18024,7 +18300,7 @@
                    'ns3::Ptr< ns3::Event const >', 
                    [], 
                    is_const=True, visibility='protected')
-    ## phy-entity.h (module 'wifi'): std::map<std::pair<unsigned long, ns3::WifiPreamble>, ns3::Ptr<ns3::Event>, std::less<std::pair<unsigned long, ns3::WifiPreamble> >, std::allocator<std::pair<const std::pair<unsigned long, ns3::WifiPreamble>, ns3::Ptr<ns3::Event> > > > const & ns3::PhyEntity::GetCurrentPreambleEvents() const [member function]
+    ## phy-entity.h (module 'wifi'): std::map<std::pair<unsigned long, ns3::WifiPreamble>, ns3::Ptr<ns3::Event>, std::less<std::pair<unsigned long, ns3::WifiPreamble>>, std::allocator<std::pair<const std::pair<unsigned long, ns3::WifiPreamble>, ns3::Ptr<ns3::Event>>>> const & ns3::PhyEntity::GetCurrentPreambleEvents() const [member function]
     cls.add_method('GetCurrentPreambleEvents', 
                    'std::map< std::pair< unsigned long, ns3::WifiPreamble >, ns3::Ptr< ns3::Event > > const &', 
                    [], 
@@ -18079,6 +18355,11 @@
                    'void', 
                    [param('bool', 'reset')], 
                    visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::NotifyPayloadBegin(ns3::WifiTxVector const & txVector, ns3::Time const & payloadDuration) [member function]
+    cls.add_method('NotifyPayloadBegin', 
+                   'void', 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time const &', 'payloadDuration')], 
+                   visibility='protected')
     ## phy-entity.h (module 'wifi'): uint64_t ns3::PhyEntity::ObtainNextUid(ns3::WifiTxVector const & txVector) [member function]
     cls.add_method('ObtainNextUid', 
                    'uint64_t', 
@@ -18435,18 +18716,14 @@
     cls.add_method('PeekNextSequenceNumberFor', 
                    'uint16_t', 
                    [param('ns3::WifiMacHeader const *', 'hdr')])
-    ## qos-txop.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::QosTxop::PeekNextMpdu(uint8_t tid=8, ns3::Mac48Address recipient=ns3::Mac48Address::GetBroadcast()) [member function]
-    cls.add_method('PeekNextMpdu', 
-                   'ns3::Ptr< ns3::WifiMacQueueItem const >', 
-                   [param('uint8_t', 'tid', default_value='8'), param('ns3::Mac48Address', 'recipient', default_value='ns3::Mac48Address::GetBroadcast()')])
-    ## qos-txop.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::QosTxop::PeekNextMpdu(ns3::WifiMacQueueItem::ConstIterator queueIt, uint8_t tid=8, ns3::Mac48Address recipient=ns3::Mac48Address::GetBroadcast()) [member function]
+    ## qos-txop.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::QosTxop::PeekNextMpdu(uint8_t tid=8, ns3::Mac48Address recipient=ns3::Mac48Address::GetBroadcast(), ns3::Ptr<const ns3::WifiMacQueueItem> item=nullptr) [member function]
     cls.add_method('PeekNextMpdu', 
                    'ns3::Ptr< ns3::WifiMacQueueItem const >', 
-                   [param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'queueIt'), param('uint8_t', 'tid', default_value='8'), param('ns3::Mac48Address', 'recipient', default_value='ns3::Mac48Address::GetBroadcast()')])
-    ## qos-txop.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::QosTxop::GetNextMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> peekedItem, ns3::WifiTxParameters & txParams, ns3::Time availableTime, bool initialFrame, ns3::WifiMacQueueItem::ConstIterator & queueIt) [member function]
+                   [param('uint8_t', 'tid', default_value='8'), param('ns3::Mac48Address', 'recipient', default_value='ns3::Mac48Address::GetBroadcast()'), param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'item', default_value='nullptr')])
+    ## qos-txop.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::QosTxop::GetNextMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> peekedItem, ns3::WifiTxParameters & txParams, ns3::Time availableTime, bool initialFrame) [member function]
     cls.add_method('GetNextMpdu', 
                    'ns3::Ptr< ns3::WifiMacQueueItem >', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'peekedItem'), param('ns3::WifiTxParameters &', 'txParams'), param('ns3::Time', 'availableTime'), param('bool', 'initialFrame'), param('ns3::WifiMacQueueItem::ConstIterator &', 'queueIt')])
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'peekedItem'), param('ns3::WifiTxParameters &', 'txParams'), param('ns3::Time', 'availableTime'), param('bool', 'initialFrame')])
     ## qos-txop.h (module 'wifi'): void ns3::QosTxop::AssignSequenceNumber(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) const [member function]
     cls.add_method('AssignSequenceNumber', 
                    'void', 
@@ -18948,7 +19225,7 @@
     cls.add_constructor([param('ns3::ReceiveListErrorModel const &', 'arg0')])
     ## error-model.h (module 'network'): ns3::ReceiveListErrorModel::ReceiveListErrorModel() [constructor]
     cls.add_constructor([])
-    ## error-model.h (module 'network'): std::list<unsigned int, std::allocator<unsigned int> > ns3::ReceiveListErrorModel::GetList() const [member function]
+    ## error-model.h (module 'network'): std::list<unsigned int, std::allocator<unsigned int>> ns3::ReceiveListErrorModel::GetList() const [member function]
     cls.add_method('GetList', 
                    'std::list< unsigned int >', 
                    [], 
@@ -18958,7 +19235,7 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## error-model.h (module 'network'): void ns3::ReceiveListErrorModel::SetList(std::list<unsigned int, std::allocator<unsigned int> > const & packetlist) [member function]
+    ## error-model.h (module 'network'): void ns3::ReceiveListErrorModel::SetList(std::list<unsigned int, std::allocator<unsigned int>> const & packetlist) [member function]
     cls.add_method('SetList', 
                    'void', 
                    [param('std::list< unsigned int > const &', 'packetlist')])
@@ -18974,289 +19251,6 @@
                    is_virtual=True, visibility='private')
     return
 
-def register_Ns3RegularWifiMac_methods(root_module, cls):
-    ## regular-wifi-mac.h (module 'wifi'): static ns3::TypeId ns3::RegularWifiMac::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::RegularWifiMac::RegularWifiMac() [constructor]
-    cls.add_constructor([])
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetShortSlotTimeSupported(bool enable) [member function]
-    cls.add_method('SetShortSlotTimeSupported', 
-                   'void', 
-                   [param('bool', 'enable')], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetSsid(ns3::Ssid ssid) [member function]
-    cls.add_method('SetSsid', 
-                   'void', 
-                   [param('ns3::Ssid', 'ssid')], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetAddress(ns3::Mac48Address address) [member function]
-    cls.add_method('SetAddress', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetPromisc() [member function]
-    cls.add_method('SetPromisc', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetShortSlotTimeSupported() const [member function]
-    cls.add_method('GetShortSlotTimeSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ssid ns3::RegularWifiMac::GetSsid() const [member function]
-    cls.add_method('GetSsid', 
-                   'ns3::Ssid', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Mac48Address ns3::RegularWifiMac::GetAddress() const [member function]
-    cls.add_method('GetAddress', 
-                   'ns3::Mac48Address', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Mac48Address ns3::RegularWifiMac::GetBssid() const [member function]
-    cls.add_method('GetBssid', 
-                   'ns3::Mac48Address', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to, ns3::Mac48Address from) [member function]
-    cls.add_method('Enqueue', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to'), param('ns3::Mac48Address', 'from')], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::SupportsSendFrom() const [member function]
-    cls.add_method('SupportsSendFrom', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetWifiPhy(ns3::Ptr<ns3::WifiPhy> const phy) [member function]
-    cls.add_method('SetWifiPhy', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiPhy > const', 'phy')], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiPhy> ns3::RegularWifiMac::GetWifiPhy() const [member function]
-    cls.add_method('GetWifiPhy', 
-                   'ns3::Ptr< ns3::WifiPhy >', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::ResetWifiPhy() [member function]
-    cls.add_method('ResetWifiPhy', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetWifiRemoteStationManager(ns3::Ptr<ns3::WifiRemoteStationManager> const stationManager) [member function]
-    cls.add_method('SetWifiRemoteStationManager', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiRemoteStationManager > const', 'stationManager')], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::ConfigureStandard(ns3::WifiStandard standard) [member function]
-    cls.add_method('ConfigureStandard', 
-                   'void', 
-                   [param('ns3::WifiStandard', 'standard')], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::TypeOfStation ns3::RegularWifiMac::GetTypeOfStation() const [member function]
-    cls.add_method('GetTypeOfStation', 
-                   'ns3::TypeOfStation', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetForwardUpCallback(ns3::WifiMac::ForwardUpCallback upCallback) [member function]
-    cls.add_method('SetForwardUpCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'upCallback')], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetLinkUpCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkUp) [member function]
-    cls.add_method('SetLinkUpCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkUp')], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetLinkDownCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkDown) [member function]
-    cls.add_method('SetLinkDownCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkDown')], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiRemoteStationManager> ns3::RegularWifiMac::GetWifiRemoteStationManager() const [member function]
-    cls.add_method('GetWifiRemoteStationManager', 
-                   'ns3::Ptr< ns3::WifiRemoteStationManager >', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to) [member function]
-    cls.add_method('Enqueue', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::FrameExchangeManager> ns3::RegularWifiMac::GetFrameExchangeManager() const [member function]
-    cls.add_method('GetFrameExchangeManager', 
-                   'ns3::Ptr< ns3::FrameExchangeManager >', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetCtsToSelfSupported(bool enable) [member function]
-    cls.add_method('SetCtsToSelfSupported', 
-                   'void', 
-                   [param('bool', 'enable')])
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetBssid(ns3::Mac48Address bssid) [member function]
-    cls.add_method('SetBssid', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'bssid')])
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::Txop> ns3::RegularWifiMac::GetTxop() const [member function]
-    cls.add_method('GetTxop', 
-                   'ns3::Ptr< ns3::Txop >', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::RegularWifiMac::GetQosTxop(ns3::AcIndex ac) const [member function]
-    cls.add_method('GetQosTxop', 
-                   'ns3::Ptr< ns3::QosTxop >', 
-                   [param('ns3::AcIndex', 'ac')], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::RegularWifiMac::GetQosTxop(uint8_t tid) const [member function]
-    cls.add_method('GetQosTxop', 
-                   'ns3::Ptr< ns3::QosTxop >', 
-                   [param('uint8_t', 'tid')], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueue> ns3::RegularWifiMac::GetTxopQueue(ns3::AcIndex ac) const [member function]
-    cls.add_method('GetTxopQueue', 
-                   'ns3::Ptr< ns3::WifiMacQueue >', 
-                   [param('ns3::AcIndex', 'ac')], 
-                   is_const=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetQosSupported() const [member function]
-    cls.add_method('GetQosSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetErpSupported() const [member function]
-    cls.add_method('GetErpSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetDsssSupported() const [member function]
-    cls.add_method('GetDsssSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetHtSupported() const [member function]
-    cls.add_method('GetHtSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetVhtSupported() const [member function]
-    cls.add_method('GetVhtSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetHeSupported() const [member function]
-    cls.add_method('GetHeSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::ExtendedCapabilities ns3::RegularWifiMac::GetExtendedCapabilities() const [member function]
-    cls.add_method('GetExtendedCapabilities', 
-                   'ns3::ExtendedCapabilities', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::HtCapabilities ns3::RegularWifiMac::GetHtCapabilities() const [member function]
-    cls.add_method('GetHtCapabilities', 
-                   'ns3::HtCapabilities', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::VhtCapabilities ns3::RegularWifiMac::GetVhtCapabilities() const [member function]
-    cls.add_method('GetVhtCapabilities', 
-                   'ns3::VhtCapabilities', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::HeCapabilities ns3::RegularWifiMac::GetHeCapabilities() const [member function]
-    cls.add_method('GetHeCapabilities', 
-                   'ns3::HeCapabilities', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): uint32_t ns3::RegularWifiMac::GetMaxAmpduSize(ns3::AcIndex ac) const [member function]
-    cls.add_method('GetMaxAmpduSize', 
-                   'uint32_t', 
-                   [param('ns3::AcIndex', 'ac')], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): uint16_t ns3::RegularWifiMac::GetMaxAmsduSize(ns3::AcIndex ac) const [member function]
-    cls.add_method('GetMaxAmsduSize', 
-                   'uint16_t', 
-                   [param('ns3::AcIndex', 'ac')], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::DoInitialize() [member function]
-    cls.add_method('DoInitialize', 
-                   'void', 
-                   [], 
-                   is_virtual=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::DoDispose() [member function]
-    cls.add_method('DoDispose', 
-                   'void', 
-                   [], 
-                   is_virtual=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetTypeOfStation(ns3::TypeOfStation type) [member function]
-    cls.add_method('SetTypeOfStation', 
-                   'void', 
-                   [param('ns3::TypeOfStation', 'type')], 
-                   is_virtual=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::RegularWifiMac::GetVOQueue() const [member function]
-    cls.add_method('GetVOQueue', 
-                   'ns3::Ptr< ns3::QosTxop >', 
-                   [], 
-                   is_const=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::RegularWifiMac::GetVIQueue() const [member function]
-    cls.add_method('GetVIQueue', 
-                   'ns3::Ptr< ns3::QosTxop >', 
-                   [], 
-                   is_const=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::RegularWifiMac::GetBEQueue() const [member function]
-    cls.add_method('GetBEQueue', 
-                   'ns3::Ptr< ns3::QosTxop >', 
-                   [], 
-                   is_const=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::RegularWifiMac::GetBKQueue() const [member function]
-    cls.add_method('GetBKQueue', 
-                   'ns3::Ptr< ns3::QosTxop >', 
-                   [], 
-                   is_const=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::ConfigureContentionWindow(uint32_t cwMin, uint32_t cwMax) [member function]
-    cls.add_method('ConfigureContentionWindow', 
-                   'void', 
-                   [param('uint32_t', 'cwMin'), param('uint32_t', 'cwMax')], 
-                   visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::Receive(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('Receive', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
-                   is_virtual=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::ForwardUp(ns3::Ptr<const ns3::Packet> packet, ns3::Mac48Address from, ns3::Mac48Address to) [member function]
-    cls.add_method('ForwardUp', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::Mac48Address', 'from'), param('ns3::Mac48Address', 'to')], 
-                   visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::DeaggregateAmsduAndForward(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('DeaggregateAmsduAndForward', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
-                   is_virtual=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetQosSupported(bool enable) [member function]
-    cls.add_method('SetQosSupported', 
-                   'void', 
-                   [param('bool', 'enable')], 
-                   is_virtual=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetupFrameExchangeManager() [member function]
-    cls.add_method('SetupFrameExchangeManager', 
-                   'void', 
-                   [], 
-                   visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetErpSupported(bool enable) [member function]
-    cls.add_method('SetErpSupported', 
-                   'void', 
-                   [param('bool', 'enable')], 
-                   visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetDsssSupported(bool enable) [member function]
-    cls.add_method('SetDsssSupported', 
-                   'void', 
-                   [param('bool', 'enable')], 
-                   visibility='protected')
-    return
-
 def register_Ns3Ssid_methods(root_module, cls):
     cls.add_output_stream_operator()
     ## ssid.h (module 'wifi'): ns3::Ssid::Ssid(ns3::Ssid const & arg0) [constructor]
@@ -19743,10 +19737,6 @@
     cls.add_method('PushFront', 
                    'bool', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'item')])
-    ## wifi-mac-queue.h (module 'wifi'): bool ns3::WifiMacQueue::Insert(ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos, ns3::Ptr<ns3::WifiMacQueueItem> item) [member function]
-    cls.add_method('Insert', 
-                   'bool', 
-                   [param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos'), param('ns3::Ptr< ns3::WifiMacQueueItem >', 'item')])
     ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::WifiMacQueue::Dequeue() [member function]
     cls.add_method('Dequeue', 
                    'ns3::Ptr< ns3::WifiMacQueueItem >', 
@@ -19761,39 +19751,39 @@
                    'ns3::Ptr< ns3::WifiMacQueueItem const >', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## wifi-mac-queue.h (module 'wifi'): ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator ns3::WifiMacQueue::PeekByAddress(ns3::Mac48Address dest, ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos=ns3::WifiMacQueue::EMPTY) const [member function]
+    ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::WifiMacQueue::PeekByAddress(ns3::Mac48Address dest, ns3::Ptr<const ns3::WifiMacQueueItem> item=nullptr) const [member function]
     cls.add_method('PeekByAddress', 
-                   'ns3::Queue< ns3::WifiMacQueueItem > ConstIterator', 
-                   [param('ns3::Mac48Address', 'dest'), param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos', default_value='ns3::WifiMacQueue::EMPTY')], 
+                   'ns3::Ptr< ns3::WifiMacQueueItem const >', 
+                   [param('ns3::Mac48Address', 'dest'), param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'item', default_value='nullptr')], 
                    is_const=True)
-    ## wifi-mac-queue.h (module 'wifi'): ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator ns3::WifiMacQueue::PeekByTid(uint8_t tid, ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos=ns3::WifiMacQueue::EMPTY) const [member function]
+    ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::WifiMacQueue::PeekByTid(uint8_t tid, ns3::Ptr<const ns3::WifiMacQueueItem> item=nullptr) const [member function]
     cls.add_method('PeekByTid', 
-                   'ns3::Queue< ns3::WifiMacQueueItem > ConstIterator', 
-                   [param('uint8_t', 'tid'), param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos', default_value='ns3::WifiMacQueue::EMPTY')], 
+                   'ns3::Ptr< ns3::WifiMacQueueItem const >', 
+                   [param('uint8_t', 'tid'), param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'item', default_value='nullptr')], 
                    is_const=True)
-    ## wifi-mac-queue.h (module 'wifi'): ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator ns3::WifiMacQueue::PeekByTidAndAddress(uint8_t tid, ns3::Mac48Address dest, ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos=ns3::WifiMacQueue::EMPTY) const [member function]
+    ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::WifiMacQueue::PeekByTidAndAddress(uint8_t tid, ns3::Mac48Address dest, ns3::Ptr<const ns3::WifiMacQueueItem> item=nullptr) const [member function]
     cls.add_method('PeekByTidAndAddress', 
-                   'ns3::Queue< ns3::WifiMacQueueItem > ConstIterator', 
-                   [param('uint8_t', 'tid'), param('ns3::Mac48Address', 'dest'), param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos', default_value='ns3::WifiMacQueue::EMPTY')], 
+                   'ns3::Ptr< ns3::WifiMacQueueItem const >', 
+                   [param('uint8_t', 'tid'), param('ns3::Mac48Address', 'dest'), param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'item', default_value='nullptr')], 
                    is_const=True)
-    ## wifi-mac-queue.h (module 'wifi'): ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator ns3::WifiMacQueue::PeekFirstAvailable(ns3::Ptr<ns3::QosBlockedDestinations> const blockedPackets=nullptr, ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos=ns3::WifiMacQueue::EMPTY) const [member function]
+    ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::WifiMacQueue::PeekFirstAvailable(ns3::Ptr<ns3::QosBlockedDestinations> const blockedPackets=nullptr, ns3::Ptr<const ns3::WifiMacQueueItem> item=nullptr) const [member function]
     cls.add_method('PeekFirstAvailable', 
-                   'ns3::Queue< ns3::WifiMacQueueItem > ConstIterator', 
-                   [param('ns3::Ptr< ns3::QosBlockedDestinations > const', 'blockedPackets', default_value='nullptr'), param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos', default_value='ns3::WifiMacQueue::EMPTY')], 
+                   'ns3::Ptr< ns3::WifiMacQueueItem const >', 
+                   [param('ns3::Ptr< ns3::QosBlockedDestinations > const', 'blockedPackets', default_value='nullptr'), param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'item', default_value='nullptr')], 
                    is_const=True)
     ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::WifiMacQueue::Remove() [member function]
     cls.add_method('Remove', 
                    'ns3::Ptr< ns3::WifiMacQueueItem >', 
                    [], 
                    is_virtual=True)
-    ## wifi-mac-queue.h (module 'wifi'): bool ns3::WifiMacQueue::Remove(ns3::Ptr<const ns3::Packet> packet) [member function]
+    ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::WifiMacQueue::Remove(ns3::Ptr<const ns3::WifiMacQueueItem> item, bool removeExpired=false) [member function]
     cls.add_method('Remove', 
-                   'bool', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
-    ## wifi-mac-queue.h (module 'wifi'): ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator ns3::WifiMacQueue::Remove(ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos, bool removeExpired=false) [member function]
-    cls.add_method('Remove', 
-                   'ns3::Queue< ns3::WifiMacQueueItem > ConstIterator', 
-                   [param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos'), param('bool', 'removeExpired', default_value='false')])
+                   'ns3::Ptr< ns3::WifiMacQueueItem const >', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'item'), param('bool', 'removeExpired', default_value='false')])
+    ## wifi-mac-queue.h (module 'wifi'): void ns3::WifiMacQueue::Replace(ns3::Ptr<const ns3::WifiMacQueueItem> currentItem, ns3::Ptr<ns3::WifiMacQueueItem> newItem) [member function]
+    cls.add_method('Replace', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'currentItem'), param('ns3::Ptr< ns3::WifiMacQueueItem >', 'newItem')])
     ## wifi-mac-queue.h (module 'wifi'): uint32_t ns3::WifiMacQueue::GetNPacketsByAddress(ns3::Mac48Address dest) [member function]
     cls.add_method('GetNPacketsByAddress', 
                    'uint32_t', 
@@ -19824,12 +19814,10 @@
     cls.add_method('GetNBytes', 
                    'uint32_t', 
                    [])
-    ## wifi-mac-queue.h (module 'wifi'): bool ns3::WifiMacQueue::TtlExceeded(ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator & it, ns3::Time const & now) [member function]
+    ## wifi-mac-queue.h (module 'wifi'): bool ns3::WifiMacQueue::TtlExceeded(ns3::Ptr<const ns3::WifiMacQueueItem> item, ns3::Time const & now) [member function]
     cls.add_method('TtlExceeded', 
                    'bool', 
-                   [param('ns3::Queue< ns3::WifiMacQueueItem > ConstIterator &', 'it'), param('ns3::Time const &', 'now')])
-    ## wifi-mac-queue.h (module 'wifi'): ns3::WifiMacQueue::EMPTY [variable]
-    cls.add_static_attribute('EMPTY', 'ns3::Queue< ns3::WifiMacQueueItem > ConstIterator const', is_const=True)
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'item'), param('ns3::Time const &', 'now')])
     ## wifi-mac-queue.h (module 'wifi'): ns3::WifiMacQueue::WifiMacQueue(ns3::WifiMacQueue const & arg0) [constructor]
     cls.add_constructor([param('ns3::WifiMacQueue const &', 'arg0')])
     return
@@ -19882,6 +19870,15 @@
                    is_static=True)
     ## wifi-net-device.h (module 'wifi'): ns3::WifiNetDevice::WifiNetDevice() [constructor]
     cls.add_constructor([])
+    ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::SetStandard(ns3::WifiStandard standard) [member function]
+    cls.add_method('SetStandard', 
+                   'void', 
+                   [param('ns3::WifiStandard', 'standard')])
+    ## wifi-net-device.h (module 'wifi'): ns3::WifiStandard ns3::WifiNetDevice::GetStandard() const [member function]
+    cls.add_method('GetStandard', 
+                   'ns3::WifiStandard', 
+                   [], 
+                   is_const=True)
     ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::SetMac(ns3::Ptr<ns3::WifiMac> const mac) [member function]
     cls.add_method('SetMac', 
                    'void', 
@@ -20221,6 +20218,28 @@
                    is_virtual=True, visibility='private')
     return
 
+def register_Ns3CallbackImpl__Bool_Const_ns3WifiTxVector___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< bool, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): bool ns3::CallbackImpl<bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::WifiTxVector const & arg0) [member operator]
+    cls.add_method('operator()', 
+                   'bool', 
+                   [param('ns3::WifiTxVector const &', 'arg0')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
 def register_Ns3CallbackImpl__Bool_Ns3Ptr__lt__const_ns3Packet__gt___Const_ns3Address___amp___Unsigned_int_Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
     ## callback.h (module 'core'): ns3::CallbackImpl<bool, ns3::Ptr<const ns3::Packet>, const ns3::Address &, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
@@ -20287,28 +20306,6 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3CallbackImpl__Bool_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): bool ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(short unsigned int arg0, unsigned char arg1) [member operator]
-    cls.add_method('operator()', 
-                   'bool', 
-                   [param('short unsigned int', 'arg0'), param('unsigned char', 'arg1')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
 def register_Ns3CallbackImpl__Ns3ObjectBase___star___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
     ## callback.h (module 'core'): ns3::CallbackImpl<ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
@@ -20375,28 +20372,6 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3CallbackImpl__Unsigned_long_Unsigned_short_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): long unsigned int ns3::CallbackImpl<unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(short unsigned int arg0, short unsigned int arg1, unsigned char arg2) [member operator]
-    cls.add_method('operator()', 
-                   'long unsigned int', 
-                   [param('short unsigned int', 'arg0'), param('short unsigned int', 'arg1'), param('unsigned char', 'arg2')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
 def register_Ns3CallbackImpl__Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
     ## callback.h (module 'core'): ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
@@ -20771,22 +20746,22 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___StdMap__lt__stdPair__lt__unsigned_int__unsigned_int__gt____double__stdLess__lt__stdPair__lt__unsigned_int__unsigned_int__gt_____gt____stdAllocator__lt__stdPair__lt__const_stdPair__lt__unsigned_int__unsigned_int__gt____double__gt_____gt_____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___StdMap__lt__stdPair__lt__unsigned_int__unsigned_int__gt____double__stdLess__lt__stdPair__lt__unsigned_int__unsigned_int__gt____gt____stdAllocator__lt__stdPair__lt__const_stdPair__lt__unsigned_int__unsigned_int__gt____double__gt____gt____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int>>, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double>>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int>>, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double>>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int>>, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double>>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
     cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::Packet const >, std::map< std::pair< unsigned int, unsigned int >, double >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int>>, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double>>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
     cls.add_method('DoGetTypeid', 
                    'std::string', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int>>, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double>>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
     cls.add_method('GetTypeid', 
                    'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::Packet> arg0, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > > arg1) [member operator]
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int>>, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double>>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::Packet> arg0, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int>>, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double>>> arg1) [member operator]
     cls.add_method('operator()', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet const >', 'arg0'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'arg1')], 
@@ -21014,22 +20989,22 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiPsdu__gt___Ns3RxSignalInfo_Ns3WifiTxVector_StdVector__lt__bool__stdAllocator__lt__bool__gt_____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiPsdu__gt___Ns3RxSignalInfo_Ns3WifiTxVector_StdVector__lt__bool__stdAllocator__lt__bool__gt____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
     cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::WifiPsdu >, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
     cls.add_method('DoGetTypeid', 
                    'std::string', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
     cls.add_method('GetTypeid', 
                    'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<ns3::WifiPsdu> arg0, ns3::RxSignalInfo arg1, ns3::WifiTxVector arg2, std::vector<bool, std::allocator<bool> > arg3) [member operator]
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<ns3::WifiPsdu> arg0, ns3::RxSignalInfo arg1, ns3::WifiTxVector arg2, std::vector<bool, std::allocator<bool>> arg3) [member operator]
     cls.add_method('operator()', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiPsdu >', 'arg0'), param('ns3::RxSignalInfo', 'arg1'), param('ns3::WifiTxVector', 'arg2'), param('std::vector< bool >', 'arg3')], 
@@ -21191,22 +21166,22 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3CallbackImpl__Void_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__const_ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__const_ns3WifiPsdu__gt_____gt_____gt_____gt___Ns3WifiTxVector_Double_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+def register_Ns3CallbackImpl__Void_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__const_ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__const_ns3WifiPsdu__gt____gt____gt____gt___Ns3WifiTxVector_Double_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu>>>>, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu>>>>, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu>>>>, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
     cls.add_constructor([param('ns3::CallbackImpl< void, std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu>>>>, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
     cls.add_method('DoGetTypeid', 
                    'std::string', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu>>>>, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
     cls.add_method('GetTypeid', 
                    'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > > arg0, ns3::WifiTxVector arg1, double arg2) [member operator]
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu>>>>, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu>>>> arg0, ns3::WifiTxVector arg1, double arg2) [member operator]
     cls.add_method('operator()', 
                    'void', 
                    [param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'arg0'), param('ns3::WifiTxVector', 'arg1'), param('double', 'arg2')], 
@@ -21258,22 +21233,22 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3CallbackImpl__Void_Unsigned_char_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt_____gt_____gt_____gt_____star___Const_stdSet__lt__ns3Mac48Address__stdLess__lt__ns3Mac48Address__gt____stdAllocator__lt__ns3Mac48Address__gt_____gt_____star___Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+def register_Ns3CallbackImpl__Void_Unsigned_char_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt____gt____gt____gt_____star___Const_stdSet__lt__ns3Mac48Address__stdLess__lt__ns3Mac48Address__gt____stdAllocator__lt__ns3Mac48Address__gt____gt_____star___Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
     cls.add_constructor([param('ns3::CallbackImpl< void, unsigned char, std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu >, std::hash< unsigned short >, std::equal_to< unsigned short >, std::allocator< std::pair< unsigned short const, ns3::Ptr< ns3::WifiPsdu > > > > *, std::set< ns3::Mac48Address, std::less< ns3::Mac48Address >, std::allocator< ns3::Mac48Address > > const, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
     cls.add_method('DoGetTypeid', 
                    'std::string', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
     cls.add_method('GetTypeid', 
                    'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(unsigned char arg0, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > * arg1, std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > const * arg2, long unsigned int arg3) [member operator]
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(unsigned char arg0, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> * arg1, std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> const * arg2, long unsigned int arg3) [member operator]
     cls.add_method('operator()', 
                    'void', 
                    [param('unsigned char', 'arg0'), param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > > *', 'arg1'), param('std::set< ns3::Mac48Address > const *', 'arg2'), param('long unsigned int', 'arg3')], 
@@ -21325,106 +21300,6 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3OcbWifiMac_methods(root_module, cls):
-    ## ocb-wifi-mac.h (module 'wave'): static ns3::TypeId ns3::OcbWifiMac::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## ocb-wifi-mac.h (module 'wave'): ns3::OcbWifiMac::OcbWifiMac() [constructor]
-    cls.add_constructor([])
-    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::SendVsc(ns3::Ptr<ns3::Packet> vsc, ns3::Mac48Address peer, ns3::OrganizationIdentifier oi) [member function]
-    cls.add_method('SendVsc', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'vsc'), param('ns3::Mac48Address', 'peer'), param('ns3::OrganizationIdentifier', 'oi')])
-    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::AddReceiveVscCallback(ns3::OrganizationIdentifier oi, ns3::VscCallback cb) [member function]
-    cls.add_method('AddReceiveVscCallback', 
-                   'void', 
-                   [param('ns3::OrganizationIdentifier', 'oi'), param('ns3::Callback< bool, ns3::Ptr< ns3::WifiMac >, ns3::OrganizationIdentifier const &, ns3::Ptr< ns3::Packet const >, ns3::Address const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'cb')])
-    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::RemoveReceiveVscCallback(ns3::OrganizationIdentifier oi) [member function]
-    cls.add_method('RemoveReceiveVscCallback', 
-                   'void', 
-                   [param('ns3::OrganizationIdentifier', 'oi')])
-    ## ocb-wifi-mac.h (module 'wave'): ns3::Ssid ns3::OcbWifiMac::GetSsid() const [member function]
-    cls.add_method('GetSsid', 
-                   'ns3::Ssid', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::SetSsid(ns3::Ssid ssid) [member function]
-    cls.add_method('SetSsid', 
-                   'void', 
-                   [param('ns3::Ssid', 'ssid')], 
-                   is_virtual=True)
-    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::SetBssid(ns3::Mac48Address bssid) [member function]
-    cls.add_method('SetBssid', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'bssid')], 
-                   is_virtual=True)
-    ## ocb-wifi-mac.h (module 'wave'): ns3::Mac48Address ns3::OcbWifiMac::GetBssid() const [member function]
-    cls.add_method('GetBssid', 
-                   'ns3::Mac48Address', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::SetLinkUpCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkUp) [member function]
-    cls.add_method('SetLinkUpCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkUp')], 
-                   is_virtual=True)
-    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::SetLinkDownCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkDown) [member function]
-    cls.add_method('SetLinkDownCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkDown')], 
-                   is_virtual=True)
-    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to) [member function]
-    cls.add_method('Enqueue', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to')], 
-                   is_virtual=True)
-    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::ConfigureEdca(uint32_t cwmin, uint32_t cwmax, uint32_t aifsn, ns3::AcIndex ac) [member function]
-    cls.add_method('ConfigureEdca', 
-                   'void', 
-                   [param('uint32_t', 'cwmin'), param('uint32_t', 'cwmax'), param('uint32_t', 'aifsn'), param('ns3::AcIndex', 'ac')])
-    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::EnableForWave(ns3::Ptr<ns3::WaveNetDevice> device) [member function]
-    cls.add_method('EnableForWave', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WaveNetDevice >', 'device')])
-    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::Suspend() [member function]
-    cls.add_method('Suspend', 
-                   'void', 
-                   [])
-    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::Resume() [member function]
-    cls.add_method('Resume', 
-                   'void', 
-                   [])
-    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::MakeVirtualBusy(ns3::Time duration) [member function]
-    cls.add_method('MakeVirtualBusy', 
-                   'void', 
-                   [param('ns3::Time', 'duration')])
-    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::CancleTx(ns3::AcIndex ac) [member function]
-    cls.add_method('CancleTx', 
-                   'void', 
-                   [param('ns3::AcIndex', 'ac')])
-    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::Reset() [member function]
-    cls.add_method('Reset', 
-                   'void', 
-                   [])
-    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::ConfigureStandard(ns3::WifiStandard standard) [member function]
-    cls.add_method('ConfigureStandard', 
-                   'void', 
-                   [param('ns3::WifiStandard', 'standard')], 
-                   is_virtual=True)
-    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::DoDispose() [member function]
-    cls.add_method('DoDispose', 
-                   'void', 
-                   [], 
-                   is_virtual=True, visibility='protected')
-    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::Receive(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('Receive', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
-                   is_virtual=True, visibility='private')
-    return
-
 def register_Ns3QueueDiscItem_methods(root_module, cls):
     ## queue-item.h (module 'network'): ns3::QueueDiscItem::QueueDiscItem(ns3::Ptr<ns3::Packet> p, ns3::Address const & addr, uint16_t protocol) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::Packet >', 'p'), param('ns3::Address const &', 'addr'), param('uint16_t', 'protocol')])
@@ -21495,7 +21370,7 @@
                    'ns3::Ptr< ns3::OcbWifiMac >', 
                    [param('uint32_t', 'channelNumber')], 
                    is_const=True)
-    ## wave-net-device.h (module 'wave'): std::map<unsigned int, ns3::Ptr<ns3::OcbWifiMac>, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, ns3::Ptr<ns3::OcbWifiMac> > > > ns3::WaveNetDevice::GetMacs() const [member function]
+    ## wave-net-device.h (module 'wave'): std::map<unsigned int, ns3::Ptr<ns3::OcbWifiMac>, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, ns3::Ptr<ns3::OcbWifiMac>>>> ns3::WaveNetDevice::GetMacs() const [member function]
     cls.add_method('GetMacs', 
                    'std::map< unsigned int, ns3::Ptr< ns3::OcbWifiMac > >', 
                    [], 
@@ -21509,7 +21384,7 @@
                    'ns3::Ptr< ns3::WifiPhy >', 
                    [param('uint32_t', 'index')], 
                    is_const=True)
-    ## wave-net-device.h (module 'wave'): std::vector<ns3::Ptr<ns3::WifiPhy>, std::allocator<ns3::Ptr<ns3::WifiPhy> > > ns3::WaveNetDevice::GetPhys() const [member function]
+    ## wave-net-device.h (module 'wave'): std::vector<ns3::Ptr<ns3::WifiPhy>, std::allocator<ns3::Ptr<ns3::WifiPhy>>> ns3::WaveNetDevice::GetPhys() const [member function]
     cls.add_method('GetPhys', 
                    'std::vector< ns3::Ptr< ns3::WifiPhy > >', 
                    [], 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wave/CMakeLists.txt ns-3.36/src/wave/CMakeLists.txt
--- ns-3.35/src/wave/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/wave/CMakeLists.txt	2022-04-30 18:23:58.186735200 -0700
@@ -0,0 +1,44 @@
+build_lib(
+  LIBNAME wave
+  SOURCE_FILES
+    helper/wave-bsm-helper.cc
+    helper/wave-bsm-stats.cc
+    helper/wave-helper.cc
+    helper/wave-mac-helper.cc
+    helper/wifi-80211p-helper.cc
+    model/bsm-application.cc
+    model/channel-coordinator.cc
+    model/channel-manager.cc
+    model/channel-scheduler.cc
+    model/default-channel-scheduler.cc
+    model/higher-tx-tag.cc
+    model/ocb-wifi-mac.cc
+    model/vendor-specific-action.cc
+    model/vsa-manager.cc
+    model/wave-frame-exchange-manager.cc
+    model/wave-net-device.cc
+  HEADER_FILES
+    helper/wave-bsm-helper.h
+    helper/wave-bsm-stats.h
+    helper/wave-helper.h
+    helper/wave-mac-helper.h
+    helper/wifi-80211p-helper.h
+    model/bsm-application.h
+    model/channel-coordinator.h
+    model/channel-manager.h
+    model/channel-scheduler.h
+    model/default-channel-scheduler.h
+    model/higher-tx-tag.h
+    model/ocb-wifi-mac.h
+    model/vendor-specific-action.h
+    model/vsa-manager.h
+    model/wave-frame-exchange-manager.h
+    model/wave-net-device.h
+  LIBRARIES_TO_LINK
+    ${libcore}
+    ${libpropagation}
+    ${libwifi}
+    ${libinternet}
+  TEST_SOURCES test/mac-extension-test-suite.cc
+               test/ocb-test-suite.cc
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wave/examples/CMakeLists.txt ns-3.36/src/wave/examples/CMakeLists.txt
--- ns-3.35/src/wave/examples/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/wave/examples/CMakeLists.txt	2022-04-30 18:23:58.190735000 -0700
@@ -0,0 +1,41 @@
+build_lib_example(
+  NAME wave-simple-80211p
+  SOURCE_FILES wave-simple-80211p.cc
+  LIBRARIES_TO_LINK
+    ${libcore}
+    ${libapplications}
+    ${libmobility}
+    ${libnetwork}
+    ${libwifi}
+    ${libwave}
+)
+
+build_lib_example(
+  NAME wave-simple-device
+  SOURCE_FILES wave-simple-device.cc
+  LIBRARIES_TO_LINK
+    ${libcore}
+    ${libapplications}
+    ${libmobility}
+    ${libnetwork}
+    ${libwifi}
+    ${libwave}
+)
+
+build_lib_example(
+  NAME vanet-routing-compare
+  SOURCE_FILES vanet-routing-compare.cc
+  LIBRARIES_TO_LINK
+    ${libcore}
+    ${libaodv}
+    ${libapplications}
+    ${libdsr}
+    ${libdsdv}
+    ${libflow-monitor}
+    ${libmobility}
+    ${libnetwork}
+    ${libolsr}
+    ${libpropagation}
+    ${libwifi}
+    ${libwave}
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wave/examples/vanet-routing-compare.cc ns-3.36/src/wave/examples/vanet-routing-compare.cc
--- ns-3.35/src/wave/examples/vanet-routing-compare.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wave/examples/vanet-routing-compare.cc	2022-04-30 18:23:58.190735000 -0700
@@ -81,10 +81,10 @@
  * several different simulation scenarios.
  * For example, to set up a scenario and save the configuration
  * as "scenario1.txt":
- *   ./waf --run "vanet-routing-compare --scenario=1 --saveconfig=scenario1.txt"
+ *   ./ns3 run "vanet-routing-compare --scenario=1 --saveconfig=scenario1.txt"
  * Then, to re-play the scenario using the save configuration
  * settings:
- *   ./waf --run "vanet-routing-compare --loadconfig=scenario1.txt"
+ *   ./ns3 run "vanet-routing-compare --loadconfig=scenario1.txt"
  *
  * Class Diagram:
  *   main()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wave/examples/wscript ns-3.36/src/wave/examples/wscript
--- ns-3.35/src/wave/examples/wscript	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wave/examples/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,14 +0,0 @@
-# -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    obj = bld.create_ns3_program('wave-simple-80211p',
-        ['core', 'applications', 'mobility', 'network', 'wifi','wave'])
-    obj.source = 'wave-simple-80211p.cc'
-    
-    obj = bld.create_ns3_program('wave-simple-device',
-        ['core', 'applications', 'mobility', 'network', 'wifi','wave'])
-    obj.source = 'wave-simple-device.cc'
-
-    obj = bld.create_ns3_program('vanet-routing-compare',
-        ['core', 'aodv', 'applications', 'dsr', 'dsdv', 'flow-monitor', 'mobility', 'network', 'olsr', 'propagation', 'wifi', 'wave'])
-    obj.source = 'vanet-routing-compare.cc'
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wave/helper/wave-helper.cc ns-3.36/src/wave/helper/wave-helper.cc
--- ns-3.35/src/wave/helper/wave-helper.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wave/helper/wave-helper.cc	2022-04-30 18:23:58.190735000 -0700
@@ -23,9 +23,9 @@
 #include "ns3/names.h"
 #include "ns3/abort.h"
 #include "ns3/wave-net-device.h"
+#include "ns3/qos-txop.h"
 #include "ns3/minstrel-wifi-manager.h"
 #include "ns3/radiotap-header.h"
-#include "ns3/unused.h"
 #include "wave-mac-helper.h"
 #include "wave-helper.h"
 
@@ -362,8 +362,7 @@
 {
   try
     {
-      const QosWaveMacHelper& qosMac = dynamic_cast<const QosWaveMacHelper&> (macHelper);
-      NS_UNUSED (qosMac);
+      [[maybe_unused]] const QosWaveMacHelper& qosMac = dynamic_cast<const QosWaveMacHelper&> (macHelper);
     }
   catch (const std::bad_cast &)
     {
@@ -384,8 +383,9 @@
       for (uint32_t j = 0; j != m_physNumber; ++j)
         {
           Ptr<WifiPhy> phy = phyHelper.Create (node, device);
-          phy->ConfigureStandardAndBand (WIFI_PHY_STANDARD_80211p, WIFI_PHY_BAND_5GHZ);
-          phy->SetChannelNumber (ChannelManager::GetCch ());
+          phy->ConfigureStandard (WIFI_STANDARD_80211p);
+          phy->SetOperatingChannel (WifiPhy::ChannelTuple {ChannelManager::GetCch (), 0,
+                                                           WIFI_PHY_BAND_5GHZ, 0});
           device->AddPhy (phy);
         }
 
@@ -459,10 +459,8 @@
           std::map<uint32_t, Ptr<OcbWifiMac> > macs = wave->GetMacs ();
           for ( std::map<uint32_t, Ptr<OcbWifiMac> >::iterator k = macs.begin (); k != macs.end (); ++k)
             {
-              Ptr<RegularWifiMac> rmac = DynamicCast<RegularWifiMac> (k->second);
-
               // Handle any random numbers in the station managers.
-              Ptr<WifiRemoteStationManager> manager = rmac->GetWifiRemoteStationManager ();
+              Ptr<WifiRemoteStationManager> manager = k->second->GetWifiRemoteStationManager ();
               Ptr<MinstrelWifiManager> minstrel = DynamicCast<MinstrelWifiManager> (manager);
               if (minstrel)
                 {
@@ -470,23 +468,23 @@
                 }
 
               PointerValue ptr;
-              rmac->GetAttribute ("Txop", ptr);
+              k->second->GetAttribute ("Txop", ptr);
               Ptr<Txop> txop = ptr.Get<Txop> ();
               currentStream += txop->AssignStreams (currentStream);
 
-              rmac->GetAttribute ("VO_Txop", ptr);
+              k->second->GetAttribute ("VO_Txop", ptr);
               Ptr<QosTxop> vo_txop = ptr.Get<QosTxop> ();
               currentStream += vo_txop->AssignStreams (currentStream);
 
-              rmac->GetAttribute ("VI_Txop", ptr);
+              k->second->GetAttribute ("VI_Txop", ptr);
               Ptr<QosTxop> vi_txop = ptr.Get<QosTxop> ();
               currentStream += vi_txop->AssignStreams (currentStream);
 
-              rmac->GetAttribute ("BE_Txop", ptr);
+              k->second->GetAttribute ("BE_Txop", ptr);
               Ptr<QosTxop> be_txop = ptr.Get<QosTxop> ();
               currentStream += be_txop->AssignStreams (currentStream);
 
-              rmac->GetAttribute ("BK_Txop", ptr);
+              k->second->GetAttribute ("BK_Txop", ptr);
               Ptr<QosTxop> bk_txop = ptr.Get<QosTxop> ();
               currentStream += bk_txop->AssignStreams (currentStream);
             }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wave/helper/wifi-80211p-helper.cc ns-3.36/src/wave/helper/wifi-80211p-helper.cc
--- ns-3.35/src/wave/helper/wifi-80211p-helper.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wave/helper/wifi-80211p-helper.cc	2022-04-30 18:23:58.190735000 -0700
@@ -26,7 +26,6 @@
 #include <typeinfo>
 #include "wave-mac-helper.h"
 #include "wifi-80211p-helper.h"
-#include "ns3/unused.h"
 
 namespace ns3 {
 
@@ -75,19 +74,17 @@
 NetDeviceContainer
 Wifi80211pHelper::Install (const WifiPhyHelper &phyHelper, const WifiMacHelper &macHelper, NodeContainer c) const
 {
-  QosWaveMacHelper const * qosMac = dynamic_cast <QosWaveMacHelper const *> (&macHelper);
+  [[maybe_unused]] QosWaveMacHelper const * qosMac = dynamic_cast <QosWaveMacHelper const *> (&macHelper);
   if (qosMac == 0)
     {
-      NqosWaveMacHelper const * nqosMac = dynamic_cast <NqosWaveMacHelper const *> (&macHelper);
+      [[maybe_unused]] NqosWaveMacHelper const * nqosMac = dynamic_cast <NqosWaveMacHelper const *> (&macHelper);
       if (nqosMac == 0)
         {
           NS_FATAL_ERROR ("the macHelper should be either QosWaveMacHelper or NqosWaveMacHelper"
                           ", or should be the subclass of QosWaveMacHelper or NqosWaveMacHelper");
         }
-      NS_UNUSED (nqosMac);
     }
 
-  NS_UNUSED (qosMac);
   return WifiHelper::Install (phyHelper, macHelper, c);
 }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wave/model/default-channel-scheduler.cc ns-3.36/src/wave/model/default-channel-scheduler.cc
--- ns-3.35/src/wave/model/default-channel-scheduler.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wave/model/default-channel-scheduler.cc	2022-04-30 18:23:58.190735000 -0700
@@ -342,7 +342,7 @@
   Ptr<OcbWifiMac> cchMacEntity = m_device->GetMac (CCH);
   if (Now ().GetMilliSeconds() != 0)
     {
-	  m_phy->SetChannelNumber (CCH);
+	  m_phy->SetOperatingChannel (WifiPhy::ChannelTuple {CCH, 0, WIFI_PHY_BAND_5GHZ, 0});
 	  Time switchTime = m_phy->GetChannelSwitchDelay ();
 	  cchMacEntity->MakeVirtualBusy (switchTime);
     }
@@ -371,7 +371,7 @@
   // second unattached current MAC entity from single PHY device
   curMacEntity->ResetWifiPhy ();
   // third switch PHY device from current channel to next channel;
-  m_phy->SetChannelNumber (nextChannelNumber);
+  m_phy->SetOperatingChannel (WifiPhy::ChannelTuple {nextChannelNumber, 0, WIFI_PHY_BAND_5GHZ, 0});
   // four attach next MAC entity to single PHY device
   nextMacEntity->SetWifiPhy (m_phy);
   // Here channel switch time is required to notify next MAC entity
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wave/model/ocb-wifi-mac.cc ns-3.36/src/wave/model/ocb-wifi-mac.cc
--- ns-3.35/src/wave/model/ocb-wifi-mac.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wave/model/ocb-wifi-mac.cc	2022-04-30 18:23:58.190735000 -0700
@@ -46,7 +46,7 @@
 OcbWifiMac::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::OcbWifiMac")
-    .SetParent<RegularWifiMac> ()
+    .SetParent<WifiMac> ()
     .SetGroupName ("Wave")
     .AddConstructor<OcbWifiMac> ()
   ;
@@ -59,7 +59,7 @@
   // Let the lower layers know that we are acting as an OCB node
   SetTypeOfStation (OCB);
   // BSSID is still needed in the low part of MAC
-  RegularWifiMac::SetBssid (WILDCARD_BSSID);
+  WifiMac::SetBssid (WILDCARD_BSSID);
 }
 
 OcbWifiMac::~OcbWifiMac (void)
@@ -86,11 +86,11 @@
     {
       uint8_t tid = QosUtilsGetTidForPacket (vsc);
       tid = tid > 7 ? 0 : tid;
-      m_edca[QosUtilsMapTidToAc (tid)]->Queue (vsc, hdr);
+      GetQosTxop (tid)->Queue (vsc, hdr);
     }
   else
     {
-      m_txop->Queue (vsc, hdr);
+      GetTxop ()->Queue (vsc, hdr);
     }
 }
 
@@ -119,7 +119,7 @@
 {
   NS_LOG_WARN ("in OCB mode we should not call GetSsid");
   // we really do not want to return ssid, however we have to provide
-  return RegularWifiMac::GetSsid ();
+  return WifiMac::GetSsid ();
 }
 
 
@@ -140,7 +140,7 @@
 OcbWifiMac::SetLinkUpCallback (Callback<void> linkUp)
 {
   NS_LOG_FUNCTION (this << &linkUp);
-  RegularWifiMac::SetLinkUpCallback (linkUp);
+  WifiMac::SetLinkUpCallback (linkUp);
 
   // The approach taken here is that, from the point of view of a STA
   // in OCB mode, the link is always up, so we immediately invoke the
@@ -152,29 +152,35 @@
 OcbWifiMac::SetLinkDownCallback (Callback<void> linkDown)
 {
   NS_LOG_FUNCTION (this << &linkDown);
-  RegularWifiMac::SetLinkDownCallback (linkDown);
+  WifiMac::SetLinkDownCallback (linkDown);
   NS_LOG_WARN ("in OCB mode the like will never down, so linkDown will never be called");
 }
 
+bool
+OcbWifiMac::CanForwardPacketsTo (Mac48Address to) const
+{
+  return true;
+}
+
 void
 OcbWifiMac::Enqueue (Ptr<Packet> packet, Mac48Address to)
 {
   NS_LOG_FUNCTION (this << packet << to);
-  if (m_stationManager->IsBrandNew (to))
+  if (GetWifiRemoteStationManager ()->IsBrandNew (to))
     {
       //In ad hoc mode, we assume that every destination supports all
       //the rates we support.
       if (GetHtSupported () || GetVhtSupported ())
         {
-          m_stationManager->AddAllSupportedMcs (to);
-          m_stationManager->AddStationHtCapabilities (to, GetHtCapabilities());
+          GetWifiRemoteStationManager ()->AddAllSupportedMcs (to);
+          GetWifiRemoteStationManager ()->AddStationHtCapabilities (to, GetHtCapabilities());
         }
       if (GetVhtSupported ())
         {
-          m_stationManager->AddStationVhtCapabilities (to, GetVhtCapabilities());
+          GetWifiRemoteStationManager ()->AddStationVhtCapabilities (to, GetVhtCapabilities());
         }
-      m_stationManager->AddAllSupportedModes (to);
-      m_stationManager->RecordDisassociated (to);
+      GetWifiRemoteStationManager ()->AddAllSupportedModes (to);
+      GetWifiRemoteStationManager ()->RecordDisassociated (to);
     }
 
   WifiMacHeader hdr;
@@ -226,11 +232,11 @@
     {
       // Sanity check that the TID is valid
       NS_ASSERT (tid < 8);
-      m_edca[QosUtilsMapTidToAc (tid)]->Queue (packet, hdr);
+      GetQosTxop (tid)->Queue (packet, hdr);
     }
   else
     {
-      m_txop->Queue (packet, hdr);
+      GetTxop ()->Queue (packet, hdr);
     }
 }
 
@@ -252,21 +258,21 @@
   Mac48Address from = hdr->GetAddr2 ();
   Mac48Address to = hdr->GetAddr1 ();
 
-  if (m_stationManager->IsBrandNew (from))
+  if (GetWifiRemoteStationManager ()->IsBrandNew (from))
     {
       //In ad hoc mode, we assume that every destination supports all
       //the rates we support.
       if (GetHtSupported () || GetVhtSupported ())
         {
-          m_stationManager->AddAllSupportedMcs (from);
-          m_stationManager->AddStationHtCapabilities (from, GetHtCapabilities());
+          GetWifiRemoteStationManager ()->AddAllSupportedMcs (from);
+          GetWifiRemoteStationManager ()->AddStationHtCapabilities (from, GetHtCapabilities());
         }
       if (GetVhtSupported ())
         {
-          m_stationManager->AddStationVhtCapabilities (from, GetVhtCapabilities());
+          GetWifiRemoteStationManager ()->AddStationVhtCapabilities (from, GetVhtCapabilities());
         }
-      m_stationManager->AddAllSupportedModes (from);
-      m_stationManager->RecordDisassociated (from);
+      GetWifiRemoteStationManager ()->AddAllSupportedModes (from);
+      GetWifiRemoteStationManager ()->RecordDisassociated (from);
     }
 
   if (hdr->IsData ())
@@ -297,7 +303,7 @@
   if (hdr->IsMgt () && hdr->IsAction ())
     {
       // yes, we only care about VendorSpecificAction frame in OCB mode
-      // other management frames will be handled by RegularWifiMac::Receive
+      // other management frames will be handled by WifiMac::Receive
       VendorSpecificActionHeader vsaHdr;
       packet->PeekHeader (vsaHdr);
       if (vsaHdr.GetCategory () == CATEGORY_OF_VSA)
@@ -325,7 +331,7 @@
   // Invoke the receive handler of our parent class to deal with any
   // other frames. Specifically, this will handle Block Ack-related
   // Management Action frames.
-  RegularWifiMac::Receive (Create<WifiMacQueueItem> (packet, *hdr));
+  WifiMac::Receive (Create<WifiMacQueueItem> (packet, *hdr));
 }
 
 void
@@ -336,31 +342,31 @@
   switch (ac)
     {
     case AC_VO:
-      dcf = RegularWifiMac::GetVOQueue ();
+      dcf = WifiMac::GetVOQueue ();
       dcf->SetMinCw ((cwmin + 1) / 4 - 1);
       dcf->SetMaxCw ((cwmin + 1) / 2 - 1);
       dcf->SetAifsn (aifsn);
       break;
     case AC_VI:
-      dcf = RegularWifiMac::GetVIQueue ();
+      dcf = WifiMac::GetVIQueue ();
       dcf->SetMinCw ((cwmin + 1) / 2 - 1);
       dcf->SetMaxCw (cwmin);
       dcf->SetAifsn (aifsn);
       break;
     case AC_BE:
-      dcf = RegularWifiMac::GetBEQueue ();
+      dcf = WifiMac::GetBEQueue ();
       dcf->SetMinCw (cwmin);
       dcf->SetMaxCw (cwmax);
       dcf->SetAifsn (aifsn);
       break;
     case AC_BK:
-      dcf = RegularWifiMac::GetBKQueue ();
+      dcf = WifiMac::GetBKQueue ();
       dcf->SetMinCw (cwmin);
       dcf->SetMaxCw (cwmax);
       dcf->SetAifsn (aifsn);
       break;
     case AC_BE_NQOS:
-      dcf = RegularWifiMac::GetTxop ();
+      dcf = WifiMac::GetTxop ();
       dcf->SetMinCw (cwmin);
       dcf->SetMaxCw (cwmax);
       dcf->SetAifsn (aifsn);
@@ -383,17 +389,22 @@
   uint32_t cwmin = 15;
   uint32_t cwmax = 1023;
 
-  // The special value of AC_BE_NQOS which exists in the Access
-  // Category enumeration allows us to configure plain old DCF.
-  ConfigureEdca (cwmin, cwmax, 2, AC_BE_NQOS);
-
-  // Now we configure the EDCA functions
-  // see IEEE802.11p-2010 section 7.3.2.29
-  // Wave CCH and SCHs set default 802.11p EDCA
-  ConfigureEdca (cwmin, cwmax, 2, AC_VO);
-  ConfigureEdca (cwmin, cwmax, 3, AC_VI);
-  ConfigureEdca (cwmin, cwmax, 6, AC_BE);
-  ConfigureEdca (cwmin, cwmax, 9, AC_BK);
+  if (!GetQosSupported ())
+    {
+      // The special value of AC_BE_NQOS which exists in the Access
+      // Category enumeration allows us to configure plain old DCF.
+      ConfigureEdca (cwmin, cwmax, 2, AC_BE_NQOS);
+    }
+  else
+    {
+      // Now we configure the EDCA functions
+      // see IEEE802.11p-2010 section 7.3.2.29
+      // Wave CCH and SCHs set default 802.11p EDCA
+      ConfigureEdca (cwmin, cwmax, 2, AC_VO);
+      ConfigureEdca (cwmin, cwmax, 3, AC_VI);
+      ConfigureEdca (cwmin, cwmax, 6, AC_BE);
+      ConfigureEdca (cwmin, cwmax, 9, AC_BK);
+    }
 
   // Setup FrameExchangeManager
   m_feManager = CreateObject<WaveFrameExchangeManager> ();
@@ -404,9 +415,9 @@
   m_channelAccessManager->SetupFrameExchangeManager (m_feManager);
   if (GetQosSupported ())
     {
-      for (const auto& pair : m_edca)
+      for (auto& ac : {AC_BE, AC_BK, AC_VI, AC_VO})
         {
-          pair.second->SetQosFrameExchangeManager (DynamicCast<QosFrameExchangeManager> (m_feManager));
+          GetQosTxop (ac)->SetQosFrameExchangeManager (DynamicCast<QosFrameExchangeManager> (m_feManager));
         }
     }
 }
@@ -439,10 +450,10 @@
 OcbWifiMac::CancleTx (enum AcIndex ac)
 {
   NS_LOG_FUNCTION (this << ac);
-  Ptr<QosTxop> queue = m_edca.find (ac)->second;
+  Ptr<QosTxop> queue = GetQosTxop (ac);
   NS_ASSERT (queue != 0);
   // reset and flush queue
-  queue->NotifyChannelSwitching ();
+  queue->GetWifiMacQueue ()->Flush ();
 }
 
 void
@@ -466,7 +477,7 @@
 OcbWifiMac::DoDispose (void)
 {
   NS_LOG_FUNCTION (this);
-  RegularWifiMac::DoDispose ();
+  WifiMac::DoDispose ();
 }
 
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wave/model/ocb-wifi-mac.h ns-3.36/src/wave/model/ocb-wifi-mac.h
--- ns-3.35/src/wave/model/ocb-wifi-mac.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wave/model/ocb-wifi-mac.h	2022-04-30 18:23:58.190735000 -0700
@@ -23,7 +23,7 @@
 #define OCB_WIFI_MAC_H
 
 #include "ns3/object-factory.h"
-#include "ns3/regular-wifi-mac.h"
+#include "ns3/wifi-mac.h"
 #include "ns3/wifi-mac-queue.h"
 #include "vendor-specific-action.h"
 #include "wave-net-device.h"
@@ -46,7 +46,7 @@
  * However in simulation nodes are supposed to have GPS synchronization ability,
  * so we will not implement this feature.
  */
-class OcbWifiMac : public RegularWifiMac
+class OcbWifiMac : public WifiMac
 {
 public:
   /**
@@ -126,6 +126,7 @@
    * access is granted to this MAC.
    */
   virtual void Enqueue (Ptr<Packet> packet, Mac48Address to);
+  virtual bool CanForwardPacketsTo (Mac48Address to) const;
   /**
     * \param cwmin the min contention window
     * \param cwmax the max contention window
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wave/model/wave-frame-exchange-manager.cc ns-3.36/src/wave/model/wave-frame-exchange-manager.cc
--- ns-3.35/src/wave/model/wave-frame-exchange-manager.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wave/model/wave-frame-exchange-manager.cc	2022-04-30 18:23:58.190735000 -0700
@@ -133,7 +133,7 @@
     }
 
   m_dcf->NotifyChannelAccessed ();
-  Ptr<WifiMacQueueItem> mpdu = *queue->Peek ()->GetQueueIterator ();
+  Ptr<WifiMacQueueItem> mpdu = queue->Peek ()->GetItem ();
   NS_ASSERT (mpdu != 0);
 
   // assign a sequence number if this is not a fragment nor a retransmission
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wave/test/ocb-test-suite.cc ns-3.36/src/wave/test/ocb-test-suite.cc
--- ns-3.35/src/wave/test/ocb-test-suite.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wave/test/ocb-test-suite.cc	2022-04-30 18:23:58.194735000 -0700
@@ -29,6 +29,7 @@
 #include "ns3/mobility-model.h"
 #include "ns3/yans-wifi-helper.h"
 #include "ns3/sta-wifi-mac.h"
+#include "ns3/qos-txop.h"
 #include "ns3/position-allocator.h"
 #include "ns3/packet-socket-helper.h"
 #include "ns3/mobility-helper.h"
@@ -46,27 +47,28 @@
 AssignWifiRandomStreams (Ptr<WifiMac> mac, int64_t stream)
 {
   int64_t currentStream = stream;
-  Ptr<RegularWifiMac> rmac = DynamicCast<RegularWifiMac> (mac);
-  if (rmac)
+  PointerValue ptr;
+  if (!mac->GetQosSupported ())
     {
-      PointerValue ptr;
-      rmac->GetAttribute ("Txop", ptr);
+      mac->GetAttribute ("Txop", ptr);
       Ptr<Txop> txop = ptr.Get<Txop> ();
       currentStream += txop->AssignStreams (currentStream);
-
-      rmac->GetAttribute ("VO_Txop", ptr);
+    }
+  else
+    {
+      mac->GetAttribute ("VO_Txop", ptr);
       Ptr<QosTxop> vo_txop = ptr.Get<QosTxop> ();
       currentStream += vo_txop->AssignStreams (currentStream);
 
-      rmac->GetAttribute ("VI_Txop", ptr);
+      mac->GetAttribute ("VI_Txop", ptr);
       Ptr<QosTxop> vi_txop = ptr.Get<QosTxop> ();
       currentStream += vi_txop->AssignStreams (currentStream);
 
-      rmac->GetAttribute ("BE_Txop", ptr);
+      mac->GetAttribute ("BE_Txop", ptr);
       Ptr<QosTxop> be_txop = ptr.Get<QosTxop> ();
       currentStream += be_txop->AssignStreams (currentStream);
 
-      rmac->GetAttribute ("BK_Txop", ptr);
+      mac->GetAttribute ("BK_Txop", ptr);
       Ptr<QosTxop> bk_txop = ptr.Get<QosTxop> ();
       currentStream += bk_txop->AssignStreams (currentStream);
     }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wave/wscript ns-3.36/src/wave/wscript
--- ns-3.35/src/wave/wscript	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wave/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,67 +0,0 @@
-# -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-# def options(opt):
-#     pass
-
-# def configure(conf):
-#     conf.check_nonfatal(header_name='stdint.h', define_name='HAVE_STDINT_H')
-
-def build(bld):
-    module = bld.create_ns3_module('wave', ['core','wifi', 'propagation', 'internet'])
-    module.source = [
-        'model/wave-frame-exchange-manager.cc',
-        'model/ocb-wifi-mac.cc',
-        'model/vendor-specific-action.cc',
-        'model/channel-coordinator.cc',
-        'model/channel-scheduler.cc',
-        'model/default-channel-scheduler.cc',
-        'model/channel-manager.cc',
-        'model/vsa-manager.cc',
-        'model/bsm-application.cc',
-        'model/higher-tx-tag.cc',
-        'model/wave-net-device.cc',
-        'helper/wave-bsm-stats.cc',
-        'helper/wave-mac-helper.cc',
-        'helper/wave-helper.cc',
-        'helper/wifi-80211p-helper.cc',
-        'helper/wave-bsm-helper.cc'
-        ]
-
-    module_test = bld.create_ns3_module_test_library('wave')
-    module_test.source = [
-        'test/mac-extension-test-suite.cc',
-        'test/ocb-test-suite.cc',
-        ]
-
-    # Tests encapsulating example programs should be listed here
-    if (bld.env['ENABLE_EXAMPLES']):
-        module_test.source.extend([
-        #   'test/wave-examples-test-suite.cc',
-            ])
-    
-    headers = bld(features='ns3header')
-    headers.module = 'wave'
-    headers.source = [
-        'model/wave-frame-exchange-manager.h',
-        'model/ocb-wifi-mac.h',
-        'model/vendor-specific-action.h',
-        'model/channel-coordinator.h',
-        'model/channel-manager.h',
-        'model/channel-scheduler.h',
-        'model/default-channel-scheduler.h',
-        'model/vsa-manager.h',
-        'model/higher-tx-tag.h',
-        'model/wave-net-device.h',
-        'model/bsm-application.h',
-        'helper/wave-bsm-stats.h',
-        'helper/wave-mac-helper.h',
-        'helper/wave-helper.h',
-        'helper/wifi-80211p-helper.h',
-        'helper/wave-bsm-helper.h',
-        ]
-
-    if bld.env.ENABLE_EXAMPLES:
-        bld.recurse('examples')
-
-    bld.ns3_python_bindings()
-
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/bindings/callbacks_list.py ns-3.36/src/wifi/bindings/callbacks_list.py
--- ns-3.35/src/wifi/bindings/callbacks_list.py	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/bindings/callbacks_list.py	2022-04-30 18:23:58.194735000 -0700
@@ -1,51 +1,53 @@
 callback_classes = [
     ['ns3::ObjectBase *', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['unsigned long', 'unsigned short', 'unsigned short', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['unsigned long', 'const ns3::WifiTxVector &', 'unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['unsigned long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['bool', 'unsigned short', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Mac48Address', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'unsigned long', 'unsigned long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['bool', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'const ns3::Address &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['bool', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'const ns3::Address &', 'const ns3::Address &', 'ns3::NetDevice::PacketType', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::Mac48Address', 'ns3::Mac48Address', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'const ns3::Address &', 'const ns3::Address &', 'ns3::NetDevice::PacketType', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Mac48Address', 'unsigned char', 'bool', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Mac48Address', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Ptr<const ns3::WifiMacQueueItem>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Time', 'ns3::Mac48Address', 'unsigned char', 'ns3::OriginatorBlockAckAgreement::State', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::WifiMacDropReason', 'ns3::Ptr<const ns3::WifiMacQueueItem>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'unsigned int', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Time', 'ns3::Time', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'const ns3::WifiMacHeader &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'unsigned char', 'ns3::Ptr<const ns3::WifiMacQueueItem>', 'const ns3::WifiTxVector &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'unsigned char', 'ns3::Ptr<const ns3::WifiPsdu>', 'const ns3::WifiTxVector &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'unsigned char', 'std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *', 'const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *', 'unsigned long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'unsigned short', 'ns3::Mac48Address', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'double', 'double', 'ns3::Mac48Address', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::DataRate', 'ns3::DataRate', 'ns3::Mac48Address', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'unsigned char', 'double', 'bool', 'double', 'double', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Ptr<ns3::WifiMacQueueItem>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Ptr<ns3::WifiPsdu>', 'ns3::RxSignalInfo', 'ns3::WifiTxVector', 'std::vector<bool, std::allocator<bool> >', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'std::basic_string<char>', 'ns3::Ptr<const ns3::Packet>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['unsigned long', 'const ns3::WifiTxVector &', 'unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['unsigned long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['bool', 'const ns3::WifiTxVector &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Ptr<ns3::WifiPsdu>', 'ns3::RxSignalInfo', 'ns3::WifiTxVector', 'std::vector<bool, std::allocator<bool>>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<ns3::WifiPsdu>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Time', 'ns3::Time', 'WifiPhyState', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::Packet>', 'double', 'ns3::WifiMode', 'ns3::WifiPreamble', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::Packet>', 'double', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::WifiMode', 'ns3::WifiPreamble', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >', 'ns3::WifiTxVector', 'double', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Ptr<const ns3::Packet>', 'std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu>>>>', 'ns3::WifiTxVector', 'double', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Ptr<const ns3::Packet>', 'std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int>>, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double>>>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::WifiTxVector', 'ns3::Time', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::WifiPhyRxfailureReason', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'ns3::WifiTxVector', 'ns3::MpduInfo', 'ns3::SignalNoiseDbm', 'unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'ns3::WifiTxVector', 'ns3::MpduInfo', 'unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'double', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'double', 'double', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Mac48Address', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::Mac48Address', 'ns3::Mac48Address', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'const ns3::WifiMacHeader &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::WifiMacDropReason', 'ns3::Ptr<const ns3::WifiMacQueueItem>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Ptr<const ns3::WifiMacQueueItem>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'unsigned char', 'ns3::Ptr<const ns3::WifiMacQueueItem>', 'const ns3::WifiTxVector &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'unsigned char', 'ns3::Ptr<const ns3::WifiPsdu>', 'const ns3::WifiTxVector &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'unsigned char', 'std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *', 'const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *', 'unsigned long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'unsigned short', 'ns3::Mac48Address', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Mac48Address', 'unsigned char', 'bool', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Mac48Address', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Time', 'ns3::Mac48Address', 'unsigned char', 'ns3::OriginatorBlockAckAgreement::State', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'unsigned int', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Time', 'ns3::Time', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Ptr<ns3::WifiMacQueueItem>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'unsigned char', 'double', 'bool', 'double', 'double', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::HeSigAParameters', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::QueueDiscItem>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'const ns3::Address &', 'const ns3::Address &', 'ns3::NetDevice::PacketType', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'std::basic_string<char>', 'ns3::Ptr<const ns3::Packet>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'unsigned long', 'unsigned long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'double', 'double', 'ns3::Mac48Address', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::DataRate', 'ns3::DataRate', 'ns3::Mac48Address', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::MobilityModel>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::SpectrumPhy>', 'ns3::Ptr<const ns3::SpectrumPhy>', 'double', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::MobilityModel>', 'ns3::Ptr<const ns3::MobilityModel>', 'double', 'double', 'double', 'double', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
@@ -53,7 +55,4 @@
     ['void', 'bool', 'unsigned int', 'double', 'ns3::Time', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Time', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::Mac48Address', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'double', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'double', 'double', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
 ]
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/bindings/modulegen__gcc_ILP32.py ns-3.36/src/wifi/bindings/modulegen__gcc_ILP32.py
--- ns-3.35/src/wifi/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/bindings/modulegen__gcc_ILP32.py	2022-04-30 18:23:58.194735000 -0700
@@ -24,34 +24,28 @@
     module.add_enum('EnvironmentType', ['UrbanEnvironment', 'SubUrbanEnvironment', 'OpenAreasEnvironment'], import_from_module='ns.propagation')
     ## propagation-environment.h (module 'propagation'): ns3::CitySize [enumeration]
     module.add_enum('CitySize', ['SmallCity', 'MediumCity', 'LargeCity'], import_from_module='ns.propagation')
-    ## queue-size.h (module 'network'): ns3::QueueSizeUnit [enumeration]
-    module.add_enum('QueueSizeUnit', ['PACKETS', 'BYTES'], import_from_module='ns.network')
     ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::McsGroupType [enumeration]
     module.add_enum('McsGroupType', ['GROUP_HT', 'GROUP_VHT', 'GROUP_HE'])
     ## ht-operation.h (module 'wifi'): ns3::HtProtectionType [enumeration]
     module.add_enum('HtProtectionType', ['NO_PROTECTION', 'NON_MEMBER_PROTECTION', 'TWENTY_MHZ_PROTECTION', 'MIXED_MODE_PROTECTION'])
+    ## queue-size.h (module 'network'): ns3::QueueSizeUnit [enumeration]
+    module.add_enum('QueueSizeUnit', ['PACKETS', 'BYTES'], import_from_module='ns.network')
     ## ofdm-phy.h (module 'wifi'): ns3::OfdmPhyVariant [enumeration]
     module.add_enum('OfdmPhyVariant', ['OFDM_PHY_DEFAULT', 'OFDM_PHY_10_MHZ', 'OFDM_PHY_5_MHZ'])
-    ## wifi-mpdu-type.h (module 'wifi'): ns3::MpduType [enumeration]
-    module.add_enum('MpduType', ['NORMAL_MPDU', 'SINGLE_MPDU', 'FIRST_MPDU_IN_AGGREGATE', 'MIDDLE_MPDU_IN_AGGREGATE', 'LAST_MPDU_IN_AGGREGATE'])
+    ## wifi-mac.h (module 'wifi'): ns3::WifiMacDropReason [enumeration]
+    module.add_enum('WifiMacDropReason', ['WIFI_MAC_DROP_FAILED_ENQUEUE', 'WIFI_MAC_DROP_EXPIRED_LIFETIME', 'WIFI_MAC_DROP_REACHED_RETRY_LIMIT', 'WIFI_MAC_DROP_QOS_OLD_PACKET'])
     ## qos-utils.h (module 'wifi'): ns3::AcIndex [enumeration]
     module.add_enum('AcIndex', ['AC_BE', 'AC_BK', 'AC_VI', 'AC_VO', 'AC_BE_NQOS', 'AC_BEACON', 'AC_UNDEF'])
     ## ctrl-headers.h (module 'wifi'): ns3::TriggerFrameType [enumeration]
     module.add_enum('TriggerFrameType', ['BASIC_TRIGGER', 'BFRP_TRIGGER', 'MU_BAR_TRIGGER', 'MU_RTS_TRIGGER', 'BSRP_TRIGGER', 'GCR_MU_BAR_TRIGGER', 'BQRP_TRIGGER', 'NFRP_TRIGGER'])
-    ## regular-wifi-mac.h (module 'wifi'): ns3::WifiTxTimerReason [enumeration]
-    module.add_enum('WifiTxTimerReason', [])
-    ## wifi-mac.h (module 'wifi'): ns3::WifiMacDropReason [enumeration]
-    module.add_enum('WifiMacDropReason', ['WIFI_MAC_DROP_FAILED_ENQUEUE', 'WIFI_MAC_DROP_EXPIRED_LIFETIME', 'WIFI_MAC_DROP_REACHED_RETRY_LIMIT', 'WIFI_MAC_DROP_QOS_OLD_PACKET'])
     ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacType [enumeration]
     module.add_enum('WifiMacType', ['WIFI_MAC_CTL_TRIGGER', 'WIFI_MAC_CTL_CTLWRAPPER', 'WIFI_MAC_CTL_RTS', 'WIFI_MAC_CTL_CTS', 'WIFI_MAC_CTL_ACK', 'WIFI_MAC_CTL_BACKREQ', 'WIFI_MAC_CTL_BACKRESP', 'WIFI_MAC_CTL_END', 'WIFI_MAC_CTL_END_ACK', 'WIFI_MAC_MGT_BEACON', 'WIFI_MAC_MGT_ASSOCIATION_REQUEST', 'WIFI_MAC_MGT_ASSOCIATION_RESPONSE', 'WIFI_MAC_MGT_DISASSOCIATION', 'WIFI_MAC_MGT_REASSOCIATION_REQUEST', 'WIFI_MAC_MGT_REASSOCIATION_RESPONSE', 'WIFI_MAC_MGT_PROBE_REQUEST', 'WIFI_MAC_MGT_PROBE_RESPONSE', 'WIFI_MAC_MGT_AUTHENTICATION', 'WIFI_MAC_MGT_DEAUTHENTICATION', 'WIFI_MAC_MGT_ACTION', 'WIFI_MAC_MGT_ACTION_NO_ACK', 'WIFI_MAC_MGT_MULTIHOP_ACTION', 'WIFI_MAC_DATA', 'WIFI_MAC_DATA_CFACK', 'WIFI_MAC_DATA_CFPOLL', 'WIFI_MAC_DATA_CFACK_CFPOLL', 'WIFI_MAC_DATA_NULL', 'WIFI_MAC_DATA_NULL_CFACK', 'WIFI_MAC_DATA_NULL_CFPOLL', 'WIFI_MAC_DATA_NULL_CFACK_CFPOLL', 'WIFI_MAC_QOSDATA', 'WIFI_MAC_QOSDATA_CFACK', 'WIFI_MAC_QOSDATA_CFPOLL', 'WIFI_MAC_QOSDATA_CFACK_CFPOLL', 'WIFI_MAC_QOSDATA_NULL', 'WIFI_MAC_QOSDATA_NULL_CFPOLL', 'WIFI_MAC_QOSDATA_NULL_CFACK_CFPOLL'])
     ## wifi-mac.h (module 'wifi'): ns3::TypeOfStation [enumeration]
     module.add_enum('TypeOfStation', ['STA', 'AP', 'ADHOC_STA', 'MESH', 'OCB'])
-    ## wifi-standards.h (module 'wifi'): ns3::WifiPhyStandard [enumeration]
-    module.add_enum('WifiPhyStandard', ['WIFI_PHY_STANDARD_80211a', 'WIFI_PHY_STANDARD_80211b', 'WIFI_PHY_STANDARD_80211g', 'WIFI_PHY_STANDARD_80211p', 'WIFI_PHY_STANDARD_80211n', 'WIFI_PHY_STANDARD_80211ac', 'WIFI_PHY_STANDARD_80211ax', 'WIFI_PHY_STANDARD_UNSPECIFIED'])
-    ## wifi-standards.h (module 'wifi'): ns3::WifiMacStandard [enumeration]
-    module.add_enum('WifiMacStandard', ['WIFI_MAC_STANDARD_80211', 'WIFI_MAC_STANDARD_80211n', 'WIFI_MAC_STANDARD_80211ac', 'WIFI_MAC_STANDARD_80211ax'])
+    ## wifi-mpdu-type.h (module 'wifi'): ns3::MpduType [enumeration]
+    module.add_enum('MpduType', ['NORMAL_MPDU', 'SINGLE_MPDU', 'FIRST_MPDU_IN_AGGREGATE', 'MIDDLE_MPDU_IN_AGGREGATE', 'LAST_MPDU_IN_AGGREGATE'])
     ## wifi-standards.h (module 'wifi'): ns3::WifiStandard [enumeration]
-    module.add_enum('WifiStandard', ['WIFI_STANDARD_80211a', 'WIFI_STANDARD_80211b', 'WIFI_STANDARD_80211g', 'WIFI_STANDARD_80211p', 'WIFI_STANDARD_80211n_2_4GHZ', 'WIFI_STANDARD_80211n_5GHZ', 'WIFI_STANDARD_80211ac', 'WIFI_STANDARD_80211ax_2_4GHZ', 'WIFI_STANDARD_80211ax_5GHZ', 'WIFI_STANDARD_80211ax_6GHZ'])
+    module.add_enum('WifiStandard', ['WIFI_STANDARD_UNSPECIFIED', 'WIFI_STANDARD_80211a', 'WIFI_STANDARD_80211b', 'WIFI_STANDARD_80211g', 'WIFI_STANDARD_80211p', 'WIFI_STANDARD_80211n', 'WIFI_STANDARD_80211ac', 'WIFI_STANDARD_80211ax'])
     ## wifi-standards.h (module 'wifi'): ns3::FrequencyChannelType [enumeration]
     module.add_enum('FrequencyChannelType', ['WIFI_PHY_DSSS_CHANNEL', 'WIFI_PHY_OFDM_CHANNEL', 'WIFI_PHY_80211p_CHANNEL'])
     ## wifi-phy-band.h (module 'wifi'): ns3::WifiPhyBand [enumeration]
@@ -65,7 +59,7 @@
     ## wifi-phy-common.h (module 'wifi'): ns3::WifiPpduType [enumeration]
     module.add_enum('WifiPpduType', ['WIFI_PPDU_TYPE_SU', 'WIFI_PPDU_TYPE_DL_MU', 'WIFI_PPDU_TYPE_UL_MU'])
     ## wifi-phy-common.h (module 'wifi'): ns3::WifiPhyRxfailureReason [enumeration]
-    module.add_enum('WifiPhyRxfailureReason', ['UNKNOWN', 'UNSUPPORTED_SETTINGS', 'CHANNEL_SWITCHING', 'RXING', 'TXING', 'SLEEPING', 'BUSY_DECODING_PREAMBLE', 'PREAMBLE_DETECT_FAILURE', 'RECEPTION_ABORTED_BY_TX', 'L_SIG_FAILURE', 'HT_SIG_FAILURE', 'SIG_A_FAILURE', 'SIG_B_FAILURE', 'PREAMBLE_DETECTION_PACKET_SWITCH', 'FRAME_CAPTURE_PACKET_SWITCH', 'OBSS_PD_CCA_RESET', 'HE_TB_PPDU_TOO_LATE', 'FILTERED'])
+    module.add_enum('WifiPhyRxfailureReason', ['UNKNOWN', 'UNSUPPORTED_SETTINGS', 'CHANNEL_SWITCHING', 'RXING', 'TXING', 'SLEEPING', 'POWERED_OFF', 'TRUNCATED_TX', 'BUSY_DECODING_PREAMBLE', 'PREAMBLE_DETECT_FAILURE', 'RECEPTION_ABORTED_BY_TX', 'L_SIG_FAILURE', 'HT_SIG_FAILURE', 'SIG_A_FAILURE', 'SIG_B_FAILURE', 'PREAMBLE_DETECTION_PACKET_SWITCH', 'FRAME_CAPTURE_PACKET_SWITCH', 'OBSS_PD_CCA_RESET', 'HE_TB_PPDU_TOO_LATE', 'FILTERED'])
     ## log.h (module 'core'): ns3::LogLevel [enumeration]
     module.add_enum('LogLevel', ['LOG_NONE', 'LOG_ERROR', 'LOG_LEVEL_ERROR', 'LOG_WARN', 'LOG_LEVEL_WARN', 'LOG_DEBUG', 'LOG_LEVEL_DEBUG', 'LOG_INFO', 'LOG_LEVEL_INFO', 'LOG_FUNCTION', 'LOG_LEVEL_FUNCTION', 'LOG_LOGIC', 'LOG_LEVEL_LOGIC', 'LOG_ALL', 'LOG_LEVEL_ALL', 'LOG_PREFIX_FUNC', 'LOG_PREFIX_TIME', 'LOG_PREFIX_NODE', 'LOG_PREFIX_LEVEL', 'LOG_PREFIX_ALL'], import_from_module='ns.core')
     ## address.h (module 'network'): ns3::Address [class]
@@ -186,6 +180,8 @@
     module.add_class('EnergySourceHelper', allow_subclassing=True, import_from_module='ns.energy')
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'], import_from_module='ns.core')
     ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::GroupInfo [struct]
     module.add_class('GroupInfo')
     ## hash.h (module 'core'): ns3::Hasher [class]
@@ -401,24 +397,18 @@
     typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::ConstellationSizeCallback')
     typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::ConstellationSizeCallback*')
     typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::ConstellationSizeCallback&')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::PhyRateCallback')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::PhyRateCallback*')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::PhyRateCallback&')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::PhyRateFromTxVectorCallback')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::PhyRateFromTxVectorCallback*')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::PhyRateFromTxVectorCallback&')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::DataRateCallback')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::DataRateCallback*')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::DataRateCallback&')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::DataRateFromTxVectorCallback')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::DataRateFromTxVectorCallback*')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::DataRateFromTxVectorCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::PhyRateCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::PhyRateCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::PhyRateCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::DataRateCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::DataRateCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::DataRateCallback&')
     typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::NonHtReferenceRateCallback')
     typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::NonHtReferenceRateCallback*')
     typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::NonHtReferenceRateCallback&')
-    typehandlers.add_type_alias('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::ModeAllowedCallback')
-    typehandlers.add_type_alias('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::ModeAllowedCallback*')
-    typehandlers.add_type_alias('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::ModeAllowedCallback&')
+    typehandlers.add_type_alias('ns3::Callback< bool, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::AllowedCallback')
+    typehandlers.add_type_alias('ns3::Callback< bool, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::AllowedCallback*')
+    typehandlers.add_type_alias('ns3::Callback< bool, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::AllowedCallback&')
     ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiNoAck [struct]
     module.add_class('WifiNoAck', parent=root_module['ns3::WifiAcknowledgment'])
     ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiNormalAck [struct]
@@ -431,6 +421,9 @@
     module.add_class('WifiPhyListener', allow_subclassing=True)
     ## wifi-phy-operating-channel.h (module 'wifi'): ns3::WifiPhyOperatingChannel [class]
     module.add_class('WifiPhyOperatingChannel')
+    typehandlers.add_type_alias('std::set< std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand > > const_iterator', 'ns3::WifiPhyOperatingChannel::ConstIterator')
+    typehandlers.add_type_alias('std::set< std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand > > const_iterator*', 'ns3::WifiPhyOperatingChannel::ConstIterator*')
+    typehandlers.add_type_alias('std::set< std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand > > const_iterator&', 'ns3::WifiPhyOperatingChannel::ConstIterator&')
     ## wifi-protection.h (module 'wifi'): ns3::WifiProtection [struct]
     module.add_class('WifiProtection', allow_subclassing=True)
     ## wifi-protection.h (module 'wifi'): ns3::WifiProtection::Method [enumeration]
@@ -460,8 +453,6 @@
     module.add_class('WifiSpectrumValue5MhzFactory', allow_subclassing=True, import_from_module='ns.spectrum')
     ## wifi-spectrum-value-helper.h (module 'spectrum'): ns3::WifiSpectrumValueHelper [class]
     module.add_class('WifiSpectrumValueHelper', import_from_module='ns.spectrum')
-    ## wifi-standards.h (module 'wifi'): ns3::WifiStandardInfo [struct]
-    module.add_class('WifiStandardInfo')
     ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters [class]
     module.add_class('WifiTxParameters')
     ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters::PsduInfo [struct]
@@ -536,6 +527,13 @@
     typehandlers.add_type_alias('void ( * ) ( uint8_t, double, bool, double, double )&', 'ns3::ObssPdAlgorithm::ResetTracedCallback&')
     ## pcap-file-wrapper.h (module 'network'): ns3::PcapFileWrapper [class]
     module.add_class('PcapFileWrapper', import_from_module='ns.network', parent=root_module['ns3::Object'])
+    ## phased-array-model.h (module 'antenna'): ns3::PhasedArrayModel [class]
+    module.add_class('PhasedArrayModel', import_from_module='ns.antenna', parent=root_module['ns3::Object'])
+    typehandlers.add_type_alias('std::vector< std::complex< double > >', 'ns3::PhasedArrayModel::ComplexVector')
+    typehandlers.add_type_alias('std::vector< std::complex< double > >*', 'ns3::PhasedArrayModel::ComplexVector*')
+    typehandlers.add_type_alias('std::vector< std::complex< double > >&', 'ns3::PhasedArrayModel::ComplexVector&')
+    ## phased-array-spectrum-propagation-loss-model.h (module 'spectrum'): ns3::PhasedArraySpectrumPropagationLossModel [class]
+    module.add_class('PhasedArraySpectrumPropagationLossModel', import_from_module='ns.spectrum', parent=root_module['ns3::Object'])
     ## preamble-detection-model.h (module 'wifi'): ns3::PreambleDetectionModel [class]
     module.add_class('PreambleDetectionModel', parent=root_module['ns3::Object'])
     ## propagation-delay-model.h (module 'propagation'): ns3::PropagationDelayModel [class]
@@ -554,51 +552,51 @@
     module.add_class('RangePropagationLossModel', import_from_module='ns.propagation', parent=root_module['ns3::PropagationLossModel'])
     ## random-variable-stream.h (module 'core'): ns3::SequentialRandomVariable [class]
     module.add_class('SequentialRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Event, ns3::empty, ns3::DefaultDeleter<ns3::Event> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Event, ns3::empty, ns3::DefaultDeleter<ns3::Event>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Event', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Event>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MacRxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacRxMiddle> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MacRxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacRxMiddle>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::MacRxMiddle', 'ns3::empty', 'ns3::DefaultDeleter<ns3::MacRxMiddle>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MacTxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacTxMiddle> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MacTxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacTxMiddle>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::MacTxMiddle', 'ns3::empty', 'ns3::DefaultDeleter<ns3::MacTxMiddle>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::OutputStreamWrapper', 'ns3::empty', 'ns3::DefaultDeleter<ns3::OutputStreamWrapper>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::PhyEntity', 'ns3::empty', 'ns3::DefaultDeleter<ns3::PhyEntity>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QosBlockedDestinations, ns3::empty, ns3::DefaultDeleter<ns3::QosBlockedDestinations> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QosBlockedDestinations, ns3::empty, ns3::DefaultDeleter<ns3::QosBlockedDestinations>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::QosBlockedDestinations', 'ns3::empty', 'ns3::DefaultDeleter<ns3::QosBlockedDestinations>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::QueueItem', 'ns3::empty', 'ns3::DefaultDeleter<ns3::QueueItem>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::SpectrumModel', 'ns3::empty', 'ns3::DefaultDeleter<ns3::SpectrumModel>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::SpectrumSignalParameters', 'ns3::empty', 'ns3::DefaultDeleter<ns3::SpectrumSignalParameters>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::SpectrumValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::SpectrumValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::WifiInformationElement', 'ns3::empty', 'ns3::DefaultDeleter<ns3::WifiInformationElement>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiMacQueueItem, ns3::empty, ns3::DefaultDeleter<ns3::WifiMacQueueItem> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiMacQueueItem, ns3::empty, ns3::DefaultDeleter<ns3::WifiMacQueueItem>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::WifiMacQueueItem', 'ns3::empty', 'ns3::DefaultDeleter<ns3::WifiMacQueueItem>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiPpdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPpdu> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiPpdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPpdu>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::WifiPpdu', 'ns3::empty', 'ns3::DefaultDeleter<ns3::WifiPpdu>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiPsdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPsdu> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiPsdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPsdu>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::WifiPsdu', 'ns3::empty', 'ns3::DefaultDeleter<ns3::WifiPsdu>'])
     ## snr-tag.h (module 'wifi'): ns3::SnrTag [class]
     module.add_class('SnrTag', parent=root_module['ns3::Tag'])
@@ -734,6 +732,9 @@
     typehandlers.add_type_alias('void ( * ) ( ns3::WifiTxVector, ns3::Time )', 'ns3::WifiPhy::PhyRxPayloadBeginTracedCallback')
     typehandlers.add_type_alias('void ( * ) ( ns3::WifiTxVector, ns3::Time )*', 'ns3::WifiPhy::PhyRxPayloadBeginTracedCallback*')
     typehandlers.add_type_alias('void ( * ) ( ns3::WifiTxVector, ns3::Time )&', 'ns3::WifiPhy::PhyRxPayloadBeginTracedCallback&')
+    typehandlers.add_type_alias('std::tuple< unsigned char, unsigned short, int, unsigned char >', 'ns3::WifiPhy::ChannelTuple')
+    typehandlers.add_type_alias('std::tuple< unsigned char, unsigned short, int, unsigned char >*', 'ns3::WifiPhy::ChannelTuple*')
+    typehandlers.add_type_alias('std::tuple< unsigned char, unsigned short, int, unsigned char >&', 'ns3::WifiPhy::ChannelTuple&')
     ## wifi-phy-state-helper.h (module 'wifi'): ns3::WifiPhyStateHelper [class]
     module.add_class('WifiPhyStateHelper', parent=root_module['ns3::Object'])
     typehandlers.add_type_alias('void ( * ) ( ns3::Time, ns3::Time, WifiPhyState )', 'ns3::WifiPhyStateHelper::StateTracedCallback')
@@ -786,6 +787,8 @@
     module.add_class('AarfWifiManager', parent=root_module['ns3::WifiRemoteStationManager'])
     ## aarfcd-wifi-manager.h (module 'wifi'): ns3::AarfcdWifiManager [class]
     module.add_class('AarfcdWifiManager', parent=root_module['ns3::WifiRemoteStationManager'])
+    ## adhoc-wifi-mac.h (module 'wifi'): ns3::AdhocWifiMac [class]
+    module.add_class('AdhocWifiMac', parent=root_module['ns3::WifiMac'])
     ## ampdu-subframe-header.h (module 'wifi'): ns3::AmpduSubframeHeader [class]
     module.add_class('AmpduSubframeHeader', parent=root_module['ns3::Header'])
     ## amrr-wifi-manager.h (module 'wifi'): ns3::AmrrWifiManager [class]
@@ -794,6 +797,8 @@
     module.add_class('AmsduSubframeHeader', parent=root_module['ns3::Header'])
     ## antenna-model.h (module 'antenna'): ns3::AntennaModel [class]
     module.add_class('AntennaModel', import_from_module='ns.antenna', parent=root_module['ns3::Object'])
+    ## ap-wifi-mac.h (module 'wifi'): ns3::ApWifiMac [class]
+    module.add_class('ApWifiMac', parent=root_module['ns3::WifiMac'])
     ## aparf-wifi-manager.h (module 'wifi'): ns3::AparfWifiManager [class]
     module.add_class('AparfWifiManager', parent=root_module['ns3::WifiRemoteStationManager'])
     ## aparf-wifi-manager.h (module 'wifi'): ns3::AparfWifiManager::State [enumeration]
@@ -1166,8 +1171,6 @@
     module.add_enum('ErrorUnit', ['ERROR_UNIT_BIT', 'ERROR_UNIT_BYTE', 'ERROR_UNIT_PACKET'], outer_class=root_module['ns3::RateErrorModel'], import_from_module='ns.network')
     ## error-model.h (module 'network'): ns3::ReceiveListErrorModel [class]
     module.add_class('ReceiveListErrorModel', import_from_module='ns.network', parent=root_module['ns3::ErrorModel'])
-    ## regular-wifi-mac.h (module 'wifi'): ns3::RegularWifiMac [class]
-    module.add_class('RegularWifiMac', parent=root_module['ns3::WifiMac'])
     ## rr-multi-user-scheduler.h (module 'wifi'): ns3::RrMultiUserScheduler [class]
     module.add_class('RrMultiUserScheduler', parent=root_module['ns3::MultiUserScheduler'])
     ## rraa-wifi-manager.h (module 'wifi'): ns3::RraaWifiManager [class]
@@ -1199,7 +1202,7 @@
     ## ssid.h (module 'wifi'): ns3::SsidValue [class]
     module.add_class('SsidValue', parent=root_module['ns3::AttributeValue'])
     ## sta-wifi-mac.h (module 'wifi'): ns3::StaWifiMac [class]
-    module.add_class('StaWifiMac', parent=root_module['ns3::RegularWifiMac'])
+    module.add_class('StaWifiMac', parent=root_module['ns3::WifiMac'])
     ## supported-rates.h (module 'wifi'): ns3::SupportedRates [class]
     module.add_class('SupportedRates', parent=root_module['ns3::WifiInformationElement'])
     ## table-based-error-rate-model.h (module 'wifi'): ns3::TableBasedErrorRateModel [class]
@@ -1274,26 +1277,20 @@
     module.add_class('AddressChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
     ## address.h (module 'network'): ns3::AddressValue [class]
     module.add_class('AddressValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
-    ## adhoc-wifi-mac.h (module 'wifi'): ns3::AdhocWifiMac [class]
-    module.add_class('AdhocWifiMac', parent=root_module['ns3::RegularWifiMac'])
     ## channel-condition-model.h (module 'propagation'): ns3::AlwaysLosChannelConditionModel [class]
     module.add_class('AlwaysLosChannelConditionModel', import_from_module='ns.propagation', parent=root_module['ns3::ChannelConditionModel'])
-    ## ap-wifi-mac.h (module 'wifi'): ns3::ApWifiMac [class]
-    module.add_class('ApWifiMac', parent=root_module['ns3::RegularWifiMac'])
     ## error-model.h (module 'network'): ns3::BinaryErrorModel [class]
     module.add_class('BinaryErrorModel', import_from_module='ns.network', parent=root_module['ns3::ErrorModel'])
     ## error-model.h (module 'network'): ns3::BurstErrorModel [class]
     module.add_class('BurstErrorModel', import_from_module='ns.network', parent=root_module['ns3::ErrorModel'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['bool', 'unsigned short', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['bool', 'const ns3::WifiTxVector &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['ns3::ObjectBase *', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned long long', 'const ns3::WifiTxVector &', 'unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned long long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned long long', 'unsigned short', 'unsigned short', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, bool, unsigned int, double, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
@@ -1330,8 +1327,8 @@
     module.add_class('CallbackImpl', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::WifiPhyRxfailureReason', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<const ns3::Packet>', 'std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int>>, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double>>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<const ns3::Packet>', 'std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int>>, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double>>>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, ns3::SignalNoiseDbm, unsigned short, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'ns3::WifiTxVector', 'ns3::MpduInfo', 'ns3::SignalNoiseDbm', 'unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
@@ -1350,8 +1347,8 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::SpectrumSignalParameters>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::WifiMacQueueItem>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::WifiPsdu>', 'ns3::RxSignalInfo', 'ns3::WifiTxVector', 'std::vector<bool, std::allocator<bool> >', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::WifiPsdu>', 'ns3::RxSignalInfo', 'ns3::WifiTxVector', 'std::vector<bool, std::allocator<bool>>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::WifiPsdu>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::Mac48Address, unsigned char, ns3::OriginatorBlockAckAgreement::State, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
@@ -1368,16 +1365,16 @@
     module.add_class('CallbackImpl', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::WifiTxVector', 'ns3::Time', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >', 'ns3::WifiTxVector', 'double', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu>>>>, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu>>>>', 'ns3::WifiTxVector', 'double', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, double, bool, double, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned char', 'double', 'bool', 'double', 'double', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned char', 'ns3::Ptr<const ns3::WifiMacQueueItem>', 'const ns3::WifiTxVector &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned char', 'ns3::Ptr<const ns3::WifiPsdu>', 'const ns3::WifiTxVector &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned char', 'std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *', 'const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *', 'unsigned long long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned char', 'std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *', 'const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *', 'unsigned long long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
@@ -1434,13 +1431,14 @@
     module.add_container('ns3::HeRu::SubcarrierGroup', 'std::pair< short, short >', container_type='vector')
     module.add_container('std::map< std::pair< unsigned char, ns3::HeRu::RuType >, std::vector< std::vector< std::pair< short, short > > > >', ('std::pair< unsigned char, ns3::HeRu::RuType >', 'std::vector< std::vector< std::pair< short, short > > >'), container_type='map')
     module.add_container('std::map< std::pair< unsigned int, unsigned int >, double >', ('std::pair< unsigned int, unsigned int >', 'double'), container_type='map')
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     module.add_container('ns3::TxTime', ('ns3::WifiMode', 'ns3::Time'), container_type='map')
     module.add_container('std::map< ns3::Mac48Address, ns3::WifiDlMuAggregateTf::BlockAckInfo >', ('ns3::Mac48Address', 'ns3::WifiDlMuAggregateTf::BlockAckInfo'), container_type='map')
     module.add_container('std::map< ns3::Mac48Address, ns3::WifiDlMuBarBaSequence::AckInfo >', ('ns3::Mac48Address', 'ns3::WifiDlMuBarBaSequence::AckInfo'), container_type='map')
     module.add_container('std::map< ns3::Mac48Address, ns3::WifiDlMuBarBaSequence::BlockAckInfo >', ('ns3::Mac48Address', 'ns3::WifiDlMuBarBaSequence::BlockAckInfo'), container_type='map')
     module.add_container('std::map< ns3::Mac48Address, ns3::WifiDlMuBarBaSequence::BlockAckReqInfo >', ('ns3::Mac48Address', 'ns3::WifiDlMuBarBaSequence::BlockAckReqInfo'), container_type='map')
     module.add_container('std::map< ns3::Mac48Address, ns3::WifiDlMuTfMuBar::BlockAckInfo >', ('ns3::Mac48Address', 'ns3::WifiDlMuTfMuBar::BlockAckInfo'), container_type='map')
+    module.add_container('std::set< std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand > >', 'std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand >', container_type='set')
     module.add_container('ns3::WifiModeList', 'ns3::WifiMode', container_type='vector')
     module.add_container('std::vector< std::pair< unsigned int, unsigned int > >', 'std::pair< unsigned int, unsigned int >', container_type='vector')
     module.add_container('std::map< unsigned char, std::set< unsigned short > >', ('unsigned char', 'std::set< unsigned short >'), container_type='map')
@@ -1449,9 +1447,10 @@
     module.add_container('std::map< std::pair< ns3::Mac48Address, unsigned char >, unsigned long long >', ('std::pair< ns3::Mac48Address, unsigned char >', 'long unsigned int'), container_type='map')
     module.add_container('ns3::MinstrelRate', 'ns3::RateInfo', container_type='vector')
     module.add_container('ns3::SampleRate', 'std::vector< unsigned char >', container_type='vector')
+    module.add_container('std::vector< std::complex< double > >', 'std::complex< double >', container_type='vector')
+    module.add_container('ns3::PhasedArrayModel::ComplexVector', 'std::complex< double >', container_type='vector')
     module.add_container('std::vector< ns3::BandInfo >', 'ns3::BandInfo', container_type='vector')
     module.add_container('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > >', 'std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader >', container_type='list')
-    module.add_container('std::set< std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand > >', 'std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand >', container_type='set')
     module.add_container('ns3::WifiConstPsduMap', ('short unsigned int', 'ns3::Ptr< ns3::WifiPsdu const >'), container_type='map')
     module.add_container('std::list< ns3::WifiMode >', 'ns3::WifiMode', container_type='list')
     module.add_container('std::list< unsigned char >', 'unsigned char', container_type='list')
@@ -1462,6 +1461,7 @@
     module.add_container('std::set< unsigned char >', 'unsigned char', container_type='set')
     module.add_container('std::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStation *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStation * > > >', ('ns3::Mac48Address', 'ns3::WifiRemoteStation *'), container_type='map')
     module.add_container('std::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStationState *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStationState * > > >', ('ns3::Mac48Address', 'ns3::WifiRemoteStationState *'), container_type='map')
+    module.add_container('std::map< unsigned short, ns3::Mac48Address >', ('short unsigned int', 'ns3::Mac48Address'), container_type='map')
     module.add_container('std::vector< unsigned int >', 'unsigned int', container_type='vector')
     module.add_container('std::list< unsigned int >', 'unsigned int', container_type='list')
     module.add_container('std::map< ns3::AcIndex, ns3::Ptr< ns3::QosTxop > >', ('ns3::AcIndex', 'ns3::Ptr< ns3::QosTxop >'), container_type='map')
@@ -1469,7 +1469,6 @@
     module.add_container('ns3::WifiPsduMap', ('short unsigned int', 'ns3::Ptr< ns3::WifiPsdu >'), container_type='map')
     module.add_container('std::map< ns3::WifiPpduField, std::pair< std::pair< ns3::Time, ns3::Time >, ns3::WifiMode > >', ('ns3::WifiPpduField', 'std::pair< std::pair< ns3::Time, ns3::Time >, ns3::WifiMode >'), container_type='map')
     module.add_container('ns3::PhyEntity::PhyHeaderSections', ('ns3::WifiPpduField', 'std::pair< std::pair< ns3::Time, ns3::Time >, ns3::WifiMode >'), container_type='map')
-    module.add_container('std::map< unsigned short, ns3::Mac48Address >', ('short unsigned int', 'ns3::Mac48Address'), container_type='map')
     module.add_container('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > >', ('short unsigned int', 'ns3::Ptr< ns3::WifiPsdu >'), container_type='map')
     module.add_container('std::set< ns3::Mac48Address >', 'ns3::Mac48Address', container_type='set')
     module.add_container('std::map< ns3::WifiPreamble, std::vector< ns3::WifiPpduField > >', ('ns3::WifiPreamble', 'std::vector< ns3::WifiPpduField >'), container_type='map')
@@ -1485,6 +1484,9 @@
     typehandlers.add_type_alias('ns3::Vector3DChecker*', 'ns3::VectorChecker*')
     typehandlers.add_type_alias('ns3::Vector3DChecker&', 'ns3::VectorChecker&')
     module.add_typedef(root_module['ns3::Vector3DChecker'], 'VectorChecker')
+    typehandlers.add_type_alias('std::vector< std::pair< double, double > >', 'ns3::SnrPerTable')
+    typehandlers.add_type_alias('std::vector< std::pair< double, double > >*', 'ns3::SnrPerTable*')
+    typehandlers.add_type_alias('std::vector< std::pair< double, double > >&', 'ns3::SnrPerTable&')
     typehandlers.add_type_alias('std::vector< std::pair< ns3::WifiRrpaaThresholds, ns3::WifiMode > >', 'ns3::RrpaaThresholdsTable')
     typehandlers.add_type_alias('std::vector< std::pair< ns3::WifiRrpaaThresholds, ns3::WifiMode > >*', 'ns3::RrpaaThresholdsTable*')
     typehandlers.add_type_alias('std::vector< std::pair< ns3::WifiRrpaaThresholds, ns3::WifiMode > >&', 'ns3::RrpaaThresholdsTable&')
@@ -1494,9 +1496,6 @@
     typehandlers.add_type_alias('std::vector< std::pair< ns3::WifiRraaThresholds, ns3::WifiMode > >', 'ns3::RraaThresholdsTable')
     typehandlers.add_type_alias('std::vector< std::pair< ns3::WifiRraaThresholds, ns3::WifiMode > >*', 'ns3::RraaThresholdsTable*')
     typehandlers.add_type_alias('std::vector< std::pair< ns3::WifiRraaThresholds, ns3::WifiMode > >&', 'ns3::RraaThresholdsTable&')
-    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > >', 'ns3::WifiPsduMap')
-    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > >*', 'ns3::WifiPsduMap*')
-    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > >&', 'ns3::WifiPsduMap&')
     typehandlers.add_type_alias('std::map< ns3::WifiMode, ns3::Time >', 'ns3::TxTime')
     typehandlers.add_type_alias('std::map< ns3::WifiMode, ns3::Time >*', 'ns3::TxTime*')
     typehandlers.add_type_alias('std::map< ns3::WifiMode, ns3::Time >&', 'ns3::TxTime&')
@@ -1515,9 +1514,18 @@
     typehandlers.add_type_alias('std::vector< std::vector< unsigned char > >', 'ns3::SampleRate')
     typehandlers.add_type_alias('std::vector< std::vector< unsigned char > >*', 'ns3::SampleRate*')
     typehandlers.add_type_alias('std::vector< std::vector< unsigned char > >&', 'ns3::SampleRate&')
+    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > >', 'ns3::WifiPsduMap')
+    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > >*', 'ns3::WifiPsduMap*')
+    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > >&', 'ns3::WifiPsduMap&')
     typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'ns3::WifiConstPsduMap')
     typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >*', 'ns3::WifiConstPsduMap*')
     typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >&', 'ns3::WifiConstPsduMap&')
+    typehandlers.add_type_alias('uint8_t', 'ns3::WifiInformationElementId')
+    typehandlers.add_type_alias('uint8_t*', 'ns3::WifiInformationElementId*')
+    typehandlers.add_type_alias('uint8_t&', 'ns3::WifiInformationElementId&')
+    typehandlers.add_type_alias('std::pair< ns3::Mac48Address, unsigned char >', 'ns3::WifiAddressTidPair')
+    typehandlers.add_type_alias('std::pair< ns3::Mac48Address, unsigned char >*', 'ns3::WifiAddressTidPair*')
+    typehandlers.add_type_alias('std::pair< ns3::Mac48Address, unsigned char >&', 'ns3::WifiAddressTidPair&')
     typehandlers.add_type_alias('std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand >', 'ns3::FrequencyChannelInfo')
     typehandlers.add_type_alias('std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand >*', 'ns3::FrequencyChannelInfo*')
     typehandlers.add_type_alias('std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand >&', 'ns3::FrequencyChannelInfo&')
@@ -1527,9 +1535,6 @@
     typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::RxErrorCallback')
     typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::RxErrorCallback*')
     typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::RxErrorCallback&')
-    typehandlers.add_type_alias('std::vector< std::pair< double, double > >', 'ns3::SnrPerTable')
-    typehandlers.add_type_alias('std::vector< std::pair< double, double > >*', 'ns3::SnrPerTable*')
-    typehandlers.add_type_alias('std::vector< std::pair< double, double > >&', 'ns3::SnrPerTable&')
     typehandlers.add_type_alias('std::map< std::pair< unsigned int, unsigned int >, double >', 'ns3::RxPowerWattPerChannelBand')
     typehandlers.add_type_alias('std::map< std::pair< unsigned int, unsigned int >, double >*', 'ns3::RxPowerWattPerChannelBand*')
     typehandlers.add_type_alias('std::map< std::pair< unsigned int, unsigned int >, double >&', 'ns3::RxPowerWattPerChannelBand&')
@@ -1545,12 +1550,6 @@
     typehandlers.add_type_alias('uint32_t', 'ns3::SpectrumModelUid_t')
     typehandlers.add_type_alias('uint32_t*', 'ns3::SpectrumModelUid_t*')
     typehandlers.add_type_alias('uint32_t&', 'ns3::SpectrumModelUid_t&')
-    typehandlers.add_type_alias('uint8_t', 'ns3::WifiInformationElementId')
-    typehandlers.add_type_alias('uint8_t*', 'ns3::WifiInformationElementId*')
-    typehandlers.add_type_alias('uint8_t&', 'ns3::WifiInformationElementId&')
-    typehandlers.add_type_alias('std::pair< ns3::Mac48Address, unsigned char >', 'ns3::WifiAddressTidPair')
-    typehandlers.add_type_alias('std::pair< ns3::Mac48Address, unsigned char >*', 'ns3::WifiAddressTidPair*')
-    typehandlers.add_type_alias('std::pair< ns3::Mac48Address, unsigned char >&', 'ns3::WifiAddressTidPair&')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode >', 'ns3::WifiModeList')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode >*', 'ns3::WifiModeList*')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode >&', 'ns3::WifiModeList&')
@@ -1628,6 +1627,12 @@
 def register_types_ns3_TracedValueCallback(module):
     root_module = module.get_root()
     
+    typehandlers.add_type_alias('void ( * ) ( ns3::Time, ns3::Time )', 'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Time, ns3::Time )*', 'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Time, ns3::Time )&', 'ns3::TracedValueCallback::Time&')
+    typehandlers.add_type_alias('void ( * ) ( ns3::DataRate, ns3::DataRate )', 'ns3::TracedValueCallback::DataRate')
+    typehandlers.add_type_alias('void ( * ) ( ns3::DataRate, ns3::DataRate )*', 'ns3::TracedValueCallback::DataRate*')
+    typehandlers.add_type_alias('void ( * ) ( ns3::DataRate, ns3::DataRate )&', 'ns3::TracedValueCallback::DataRate&')
     typehandlers.add_type_alias('void ( * ) ( bool, bool )', 'ns3::TracedValueCallback::Bool')
     typehandlers.add_type_alias('void ( * ) ( bool, bool )*', 'ns3::TracedValueCallback::Bool*')
     typehandlers.add_type_alias('void ( * ) ( bool, bool )&', 'ns3::TracedValueCallback::Bool&')
@@ -1661,12 +1666,6 @@
     typehandlers.add_type_alias('void ( * ) (  )', 'ns3::TracedValueCallback::Void')
     typehandlers.add_type_alias('void ( * ) (  )*', 'ns3::TracedValueCallback::Void*')
     typehandlers.add_type_alias('void ( * ) (  )&', 'ns3::TracedValueCallback::Void&')
-    typehandlers.add_type_alias('void ( * ) ( ns3::DataRate, ns3::DataRate )', 'ns3::TracedValueCallback::DataRate')
-    typehandlers.add_type_alias('void ( * ) ( ns3::DataRate, ns3::DataRate )*', 'ns3::TracedValueCallback::DataRate*')
-    typehandlers.add_type_alias('void ( * ) ( ns3::DataRate, ns3::DataRate )&', 'ns3::TracedValueCallback::DataRate&')
-    typehandlers.add_type_alias('void ( * ) ( ns3::Time, ns3::Time )', 'ns3::TracedValueCallback::Time')
-    typehandlers.add_type_alias('void ( * ) ( ns3::Time, ns3::Time )*', 'ns3::TracedValueCallback::Time*')
-    typehandlers.add_type_alias('void ( * ) ( ns3::Time, ns3::Time )&', 'ns3::TracedValueCallback::Time&')
 
 def register_types_ns3_internal(module):
     root_module = module.get_root()
@@ -1817,7 +1816,6 @@
     register_Ns3WifiRtsCtsProtection_methods(root_module, root_module['ns3::WifiRtsCtsProtection'])
     register_Ns3WifiSpectrumValue5MhzFactory_methods(root_module, root_module['ns3::WifiSpectrumValue5MhzFactory'])
     register_Ns3WifiSpectrumValueHelper_methods(root_module, root_module['ns3::WifiSpectrumValueHelper'])
-    register_Ns3WifiStandardInfo_methods(root_module, root_module['ns3::WifiStandardInfo'])
     register_Ns3WifiTxParameters_methods(root_module, root_module['ns3::WifiTxParameters'])
     register_Ns3WifiTxParametersPsduInfo_methods(root_module, root_module['ns3::WifiTxParameters::PsduInfo'])
     register_Ns3WifiTxTimer_methods(root_module, root_module['ns3::WifiTxTimer'])
@@ -1844,6 +1842,8 @@
     register_Ns3ObjectAggregateIterator_methods(root_module, root_module['ns3::Object::AggregateIterator'])
     register_Ns3ObssPdAlgorithm_methods(root_module, root_module['ns3::ObssPdAlgorithm'])
     register_Ns3PcapFileWrapper_methods(root_module, root_module['ns3::PcapFileWrapper'])
+    register_Ns3PhasedArrayModel_methods(root_module, root_module['ns3::PhasedArrayModel'])
+    register_Ns3PhasedArraySpectrumPropagationLossModel_methods(root_module, root_module['ns3::PhasedArraySpectrumPropagationLossModel'])
     register_Ns3PreambleDetectionModel_methods(root_module, root_module['ns3::PreambleDetectionModel'])
     register_Ns3PropagationDelayModel_methods(root_module, root_module['ns3::PropagationDelayModel'])
     register_Ns3PropagationLossModel_methods(root_module, root_module['ns3::PropagationLossModel'])
@@ -1925,10 +1925,12 @@
     register_Ns3ZipfRandomVariable_methods(root_module, root_module['ns3::ZipfRandomVariable'])
     register_Ns3AarfWifiManager_methods(root_module, root_module['ns3::AarfWifiManager'])
     register_Ns3AarfcdWifiManager_methods(root_module, root_module['ns3::AarfcdWifiManager'])
+    register_Ns3AdhocWifiMac_methods(root_module, root_module['ns3::AdhocWifiMac'])
     register_Ns3AmpduSubframeHeader_methods(root_module, root_module['ns3::AmpduSubframeHeader'])
     register_Ns3AmrrWifiManager_methods(root_module, root_module['ns3::AmrrWifiManager'])
     register_Ns3AmsduSubframeHeader_methods(root_module, root_module['ns3::AmsduSubframeHeader'])
     register_Ns3AntennaModel_methods(root_module, root_module['ns3::AntennaModel'])
+    register_Ns3ApWifiMac_methods(root_module, root_module['ns3::ApWifiMac'])
     register_Ns3AparfWifiManager_methods(root_module, root_module['ns3::AparfWifiManager'])
     register_Ns3ArfWifiManager_methods(root_module, root_module['ns3::ArfWifiManager'])
     register_Ns3AthstatsWifiTraceSink_methods(root_module, root_module['ns3::AthstatsWifiTraceSink'])
@@ -2058,7 +2060,6 @@
     register_Ns3QueueSizeValue_methods(root_module, root_module['ns3::QueueSizeValue'])
     register_Ns3RateErrorModel_methods(root_module, root_module['ns3::RateErrorModel'])
     register_Ns3ReceiveListErrorModel_methods(root_module, root_module['ns3::ReceiveListErrorModel'])
-    register_Ns3RegularWifiMac_methods(root_module, root_module['ns3::RegularWifiMac'])
     register_Ns3RrMultiUserScheduler_methods(root_module, root_module['ns3::RrMultiUserScheduler'])
     register_Ns3RraaWifiManager_methods(root_module, root_module['ns3::RraaWifiManager'])
     register_Ns3RrpaaWifiManager_methods(root_module, root_module['ns3::RrpaaWifiManager'])
@@ -2102,16 +2103,13 @@
     register_Ns3YansWifiChannel_methods(root_module, root_module['ns3::YansWifiChannel'])
     register_Ns3AddressChecker_methods(root_module, root_module['ns3::AddressChecker'])
     register_Ns3AddressValue_methods(root_module, root_module['ns3::AddressValue'])
-    register_Ns3AdhocWifiMac_methods(root_module, root_module['ns3::AdhocWifiMac'])
     register_Ns3AlwaysLosChannelConditionModel_methods(root_module, root_module['ns3::AlwaysLosChannelConditionModel'])
-    register_Ns3ApWifiMac_methods(root_module, root_module['ns3::ApWifiMac'])
     register_Ns3BinaryErrorModel_methods(root_module, root_module['ns3::BinaryErrorModel'])
     register_Ns3BurstErrorModel_methods(root_module, root_module['ns3::BurstErrorModel'])
-    register_Ns3CallbackImpl__Bool_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Bool_Const_ns3WifiTxVector___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Ns3ObjectBase___star___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Unsigned_long_Const_ns3WifiTxVector___amp___Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned long long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3CallbackImpl__Unsigned_long_Unsigned_short_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Bool_Unsigned_int_Double_Ns3Time_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, bool, unsigned int, double, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Const_ns3WifiMacHeader___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, const ns3::WifiMacHeader &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
@@ -2130,7 +2128,7 @@
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Ns3WifiMode_Ns3WifiPreamble_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::Packet>, ns3::WifiMode, ns3::WifiPreamble, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Ns3WifiPhyRxfailureReason_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::Packet>, ns3::WifiPhyRxfailureReason, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::Packet>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___StdMap__lt__stdPair__lt__unsigned_int__unsigned_int__gt____double__stdLess__lt__stdPair__lt__unsigned_int__unsigned_int__gt_____gt____stdAllocator__lt__stdPair__lt__const_stdPair__lt__unsigned_int__unsigned_int__gt____double__gt_____gt_____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___StdMap__lt__stdPair__lt__unsigned_int__unsigned_int__gt____double__stdLess__lt__stdPair__lt__unsigned_int__unsigned_int__gt____gt____stdAllocator__lt__stdPair__lt__const_stdPair__lt__unsigned_int__unsigned_int__gt____double__gt____gt____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int>>, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double>>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_short_Ns3WifiTxVector_Ns3MpduInfo_Ns3SignalNoiseDbm_Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, ns3::SignalNoiseDbm, unsigned short, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_short_Ns3WifiTxVector_Ns3MpduInfo_Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3QueueDiscItem__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::QueueDiscItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
@@ -2140,7 +2138,7 @@
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3NetDevice__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::NetDevice>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3SpectrumSignalParameters__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::SpectrumSignalParameters>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiMacQueueItem__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiPsdu__gt___Ns3RxSignalInfo_Ns3WifiTxVector_StdVector__lt__bool__stdAllocator__lt__bool__gt_____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiPsdu__gt___Ns3RxSignalInfo_Ns3WifiTxVector_StdVector__lt__bool__stdAllocator__lt__bool__gt____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiPsdu__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::WifiPsdu>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Time_Ns3Mac48Address_Unsigned_char_Ns3OriginatorBlockAckAgreementState_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Time, ns3::Mac48Address, unsigned char, ns3::OriginatorBlockAckAgreement::State, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Time_Ns3Time_WifiPhyState_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Time, ns3::Time, WifiPhyState, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
@@ -2149,11 +2147,11 @@
     register_Ns3CallbackImpl__Void_Ns3WifiMacDropReason_Ns3Ptr__lt__const_ns3WifiMacQueueItem__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3WifiTxVector_Ns3Time_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::WifiTxVector, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3CallbackImpl__Void_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__const_ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__const_ns3WifiPsdu__gt_____gt_____gt_____gt___Ns3WifiTxVector_Double_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__const_ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__const_ns3WifiPsdu__gt____gt____gt____gt___Ns3WifiTxVector_Double_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu>>>>, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Unsigned_char_Double_Bool_Double_Double_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned char, double, bool, double, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Unsigned_char_Ns3Ptr__lt__const_ns3WifiMacQueueItem__gt___Const_ns3WifiTxVector___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Unsigned_char_Ns3Ptr__lt__const_ns3WifiPsdu__gt___Const_ns3WifiTxVector___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3CallbackImpl__Void_Unsigned_char_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt_____gt_____gt_____gt_____star___Const_stdSet__lt__ns3Mac48Address__stdLess__lt__ns3Mac48Address__gt____stdAllocator__lt__ns3Mac48Address__gt_____gt_____star___Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Unsigned_char_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt____gt____gt____gt_____star___Const_stdSet__lt__ns3Mac48Address__stdLess__lt__ns3Mac48Address__gt____stdAllocator__lt__ns3Mac48Address__gt____gt_____star___Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Unsigned_int_Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Unsigned_long_Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned long long, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
@@ -2640,7 +2638,7 @@
     cls.add_constructor([])
     ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::BlockAckType(ns3::BlockAckType::Variant v) [constructor]
     cls.add_constructor([param('ns3::BlockAckType::Variant', 'v')])
-    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::BlockAckType(ns3::BlockAckType::Variant v, std::vector<unsigned char, std::allocator<unsigned char> > l) [constructor]
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::BlockAckType(ns3::BlockAckType::Variant v, std::vector<unsigned char, std::allocator<unsigned char>> l) [constructor]
     cls.add_constructor([param('ns3::BlockAckType::Variant', 'v'), param('std::vector< unsigned char >', 'l')])
     ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::m_bitmapLen [variable]
     cls.add_instance_attribute('m_bitmapLen', 'std::vector< unsigned char >', is_const=False)
@@ -2657,11 +2655,11 @@
     cls.add_method('Advance', 
                    'void', 
                    [param('std::size_t', 'count')])
-    ## block-ack-window.h (module 'wifi'): std::vector<bool, std::allocator<bool> >::reference ns3::BlockAckWindow::At(std::size_t distance) [member function]
+    ## block-ack-window.h (module 'wifi'): std::vector<bool, std::allocator<bool>>::reference ns3::BlockAckWindow::At(std::size_t distance) [member function]
     cls.add_method('At', 
                    'std::vector< bool > reference', 
                    [param('std::size_t', 'distance')])
-    ## block-ack-window.h (module 'wifi'): std::vector<bool, std::allocator<bool> >::const_reference ns3::BlockAckWindow::At(std::size_t distance) const [member function]
+    ## block-ack-window.h (module 'wifi'): std::vector<bool, std::allocator<bool>>::const_reference ns3::BlockAckWindow::At(std::size_t distance) const [member function]
     cls.add_method('At', 
                    'std::vector< bool > const_reference', 
                    [param('std::size_t', 'distance')], 
@@ -3860,6 +3858,8 @@
     return
 
 def register_Ns3HeMuUserInfo_methods(root_module, cls):
+    cls.add_binary_comparison_operator('==')
+    cls.add_binary_comparison_operator('!=')
     ## wifi-tx-vector.h (module 'wifi'): ns3::HeMuUserInfo::HeMuUserInfo() [constructor]
     cls.add_constructor([])
     ## wifi-tx-vector.h (module 'wifi'): ns3::HeMuUserInfo::HeMuUserInfo(ns3::HeMuUserInfo const & arg0) [constructor]
@@ -3877,7 +3877,7 @@
     cls.add_constructor([])
     ## he-ru.h (module 'wifi'): ns3::HeRu::HeRu(ns3::HeRu const & arg0) [constructor]
     cls.add_constructor([param('ns3::HeRu const &', 'arg0')])
-    ## he-ru.h (module 'wifi'): static bool ns3::HeRu::DoesOverlap(uint16_t bw, ns3::HeRu::RuSpec ru, std::vector<ns3::HeRu::RuSpec, std::allocator<ns3::HeRu::RuSpec> > const & v) [member function]
+    ## he-ru.h (module 'wifi'): static bool ns3::HeRu::DoesOverlap(uint16_t bw, ns3::HeRu::RuSpec ru, std::vector<ns3::HeRu::RuSpec, std::allocator<ns3::HeRu::RuSpec>> const & v) [member function]
     cls.add_method('DoesOverlap', 
                    'bool', 
                    [param('uint16_t', 'bw'), param('ns3::HeRu::RuSpec', 'ru'), param('std::vector< ns3::HeRu::RuSpec > const &', 'v')], 
@@ -3897,7 +3897,7 @@
                    'uint16_t', 
                    [param('ns3::HeRu::RuType', 'ruType')], 
                    is_static=True)
-    ## he-ru.h (module 'wifi'): static std::vector<ns3::HeRu::RuSpec, std::allocator<ns3::HeRu::RuSpec> > ns3::HeRu::GetCentral26TonesRus(uint16_t bw, ns3::HeRu::RuType ruType) [member function]
+    ## he-ru.h (module 'wifi'): static std::vector<ns3::HeRu::RuSpec, std::allocator<ns3::HeRu::RuSpec>> ns3::HeRu::GetCentral26TonesRus(uint16_t bw, ns3::HeRu::RuType ruType) [member function]
     cls.add_method('GetCentral26TonesRus', 
                    'std::vector< ns3::HeRu::RuSpec >', 
                    [param('uint16_t', 'bw'), param('ns3::HeRu::RuType', 'ruType')], 
@@ -3917,7 +3917,7 @@
                    'ns3::HeRu::RuType', 
                    [param('uint16_t', 'bandwidth')], 
                    is_static=True)
-    ## he-ru.h (module 'wifi'): static std::vector<ns3::HeRu::RuSpec, std::allocator<ns3::HeRu::RuSpec> > ns3::HeRu::GetRusOfType(uint16_t bw, ns3::HeRu::RuType ruType) [member function]
+    ## he-ru.h (module 'wifi'): static std::vector<ns3::HeRu::RuSpec, std::allocator<ns3::HeRu::RuSpec>> ns3::HeRu::GetRusOfType(uint16_t bw, ns3::HeRu::RuType ruType) [member function]
     cls.add_method('GetRusOfType', 
                    'std::vector< ns3::HeRu::RuSpec >', 
                    [param('uint16_t', 'bw'), param('ns3::HeRu::RuType', 'ruType')], 
@@ -3933,6 +3933,8 @@
 
 def register_Ns3HeRuRuSpec_methods(root_module, cls):
     cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('!=')
+    cls.add_binary_comparison_operator('==')
     ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec::RuSpec(ns3::HeRu::RuSpec const & arg0) [constructor]
     cls.add_constructor([param('ns3::HeRu::RuSpec const &', 'arg0')])
     ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec::RuSpec() [constructor]
@@ -4998,6 +5000,8 @@
     cls.add_constructor([param('ns3::ObjectFactory const &', 'arg0')])
     ## object-factory.h (module 'core'): ns3::ObjectFactory::ObjectFactory() [constructor]
     cls.add_constructor([])
+    ## object-factory.h (module 'core'): ns3::ObjectFactory::ObjectFactory(std::string const & typeId) [constructor]
+    cls.add_constructor([param('std::string const &', 'typeId')])
     ## object-factory.h (module 'core'): ns3::Ptr<ns3::Object> ns3::ObjectFactory::Create() const [member function]
     cls.add_method('Create', 
                    'ns3::Ptr< ns3::Object >', 
@@ -6138,8 +6142,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -6441,7 +6445,7 @@
 def register_Ns3WifiAcknowledgment_methods(root_module, cls):
     ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiAcknowledgment::WifiAcknowledgment(ns3::WifiAcknowledgment::Method m) [constructor]
     cls.add_constructor([param('ns3::WifiAcknowledgment::Method', 'm')])
-    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiAcknowledgment::Copy() const [member function]
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment>> ns3::WifiAcknowledgment::Copy() const [member function]
     cls.add_method('Copy', 
                    'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
                    [], 
@@ -6500,7 +6504,7 @@
 def register_Ns3WifiBarBlockAck_methods(root_module, cls):
     ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiBarBlockAck::WifiBarBlockAck() [constructor]
     cls.add_constructor([])
-    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiBarBlockAck::Copy() const [member function]
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment>> ns3::WifiBarBlockAck::Copy() const [member function]
     cls.add_method('Copy', 
                    'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
                    [], 
@@ -6530,7 +6534,7 @@
 def register_Ns3WifiBlockAck_methods(root_module, cls):
     ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiBlockAck::WifiBlockAck() [constructor]
     cls.add_constructor([])
-    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiBlockAck::Copy() const [member function]
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment>> ns3::WifiBlockAck::Copy() const [member function]
     cls.add_method('Copy', 
                    'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
                    [], 
@@ -6563,7 +6567,7 @@
                    'bool', 
                    [param('ns3::Mac48Address', 'receiver'), param('uint8_t', 'tid'), param('ns3::WifiMacHeader::QosAckPolicy', 'ackPolicy')], 
                    is_const=True, is_virtual=True)
-    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiDlMuAggregateTf::Copy() const [member function]
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment>> ns3::WifiDlMuAggregateTf::Copy() const [member function]
     cls.add_method('Copy', 
                    'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
                    [], 
@@ -6604,7 +6608,7 @@
                    'bool', 
                    [param('ns3::Mac48Address', 'receiver'), param('uint8_t', 'tid'), param('ns3::WifiMacHeader::QosAckPolicy', 'ackPolicy')], 
                    is_const=True, is_virtual=True)
-    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiDlMuBarBaSequence::Copy() const [member function]
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment>> ns3::WifiDlMuBarBaSequence::Copy() const [member function]
     cls.add_method('Copy', 
                    'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
                    [], 
@@ -6667,7 +6671,7 @@
                    'bool', 
                    [param('ns3::Mac48Address', 'receiver'), param('uint8_t', 'tid'), param('ns3::WifiMacHeader::QosAckPolicy', 'ackPolicy')], 
                    is_const=True, is_virtual=True)
-    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiDlMuTfMuBar::Copy() const [member function]
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment>> ns3::WifiDlMuTfMuBar::Copy() const [member function]
     cls.add_method('Copy', 
                    'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
                    [], 
@@ -6709,6 +6713,10 @@
     cls.add_method('AssignStreams', 
                    'int64_t', 
                    [param('ns3::NetDeviceContainer', 'c'), param('int64_t', 'stream')])
+    ## wifi-helper.h (module 'wifi'): void ns3::WifiHelper::DisableFlowControl() [member function]
+    cls.add_method('DisableFlowControl', 
+                   'void', 
+                   [])
     ## wifi-helper.h (module 'wifi'): static void ns3::WifiHelper::EnableLogComponents() [member function]
     cls.add_method('EnableLogComponents', 
                    'void', 
@@ -6758,10 +6766,10 @@
     cls.add_constructor([param('ns3::WifiMacHelper const &', 'arg0')])
     ## wifi-mac-helper.h (module 'wifi'): ns3::WifiMacHelper::WifiMacHelper() [constructor]
     cls.add_constructor([])
-    ## wifi-mac-helper.h (module 'wifi'): ns3::Ptr<ns3::WifiMac> ns3::WifiMacHelper::Create(ns3::Ptr<ns3::NetDevice> device, ns3::WifiStandard standard) const [member function]
+    ## wifi-mac-helper.h (module 'wifi'): ns3::Ptr<ns3::WifiMac> ns3::WifiMacHelper::Create(ns3::Ptr<ns3::WifiNetDevice> device, ns3::WifiStandard standard) const [member function]
     cls.add_method('Create', 
                    'ns3::Ptr< ns3::WifiMac >', 
-                   [param('ns3::Ptr< ns3::NetDevice >', 'device'), param('ns3::WifiStandard', 'standard')], 
+                   [param('ns3::Ptr< ns3::WifiNetDevice >', 'device'), param('ns3::WifiStandard', 'standard')], 
                    is_const=True, is_virtual=True)
     return
 
@@ -6846,6 +6854,11 @@
                    'bool', 
                    [param('uint16_t', 'channelWidth'), param('uint8_t', 'nss')], 
                    is_const=True)
+    ## wifi-mode.h (module 'wifi'): bool ns3::WifiMode::IsAllowed(ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('IsAllowed', 
+                   'bool', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True)
     ## wifi-mode.h (module 'wifi'): bool ns3::WifiMode::IsHigherCodeRate(ns3::WifiMode mode) const [member function]
     cls.add_method('IsHigherCodeRate', 
                    'bool', 
@@ -6866,22 +6879,22 @@
 def register_Ns3WifiModeFactory_methods(root_module, cls):
     ## wifi-mode.h (module 'wifi'): ns3::WifiModeFactory::WifiModeFactory(ns3::WifiModeFactory const & arg0) [constructor]
     cls.add_constructor([param('ns3::WifiModeFactory const &', 'arg0')])
-    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMcs(std::string uniqueName, uint8_t mcsValue, ns3::WifiModulationClass modClass, ns3::WifiModeFactory::CodeRateCallback codeRateCallback, ns3::WifiModeFactory::ConstellationSizeCallback constellationSizeCallback, ns3::WifiModeFactory::PhyRateCallback phyRateCallback, ns3::WifiModeFactory::PhyRateFromTxVectorCallback phyRateFromTxVectorCallback, ns3::WifiModeFactory::DataRateCallback dataRateCallback, ns3::WifiModeFactory::DataRateFromTxVectorCallback dataRateFromTxVectorCallback, ns3::WifiModeFactory::NonHtReferenceRateCallback nonHtReferenceRateCallback, ns3::WifiModeFactory::ModeAllowedCallback isModeAllowedCallback) [member function]
+    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMcs(std::string uniqueName, uint8_t mcsValue, ns3::WifiModulationClass modClass, bool isMandatory, ns3::WifiModeFactory::CodeRateCallback codeRateCallback, ns3::WifiModeFactory::ConstellationSizeCallback constellationSizeCallback, ns3::WifiModeFactory::PhyRateCallback phyRateCallback, ns3::WifiModeFactory::DataRateCallback dataRateCallback, ns3::WifiModeFactory::NonHtReferenceRateCallback nonHtReferenceRateCallback, ns3::WifiModeFactory::AllowedCallback isAllowedCallback) [member function]
     cls.add_method('CreateWifiMcs', 
                    'ns3::WifiMode', 
-                   [param('std::string', 'uniqueName'), param('uint8_t', 'mcsValue'), param('ns3::WifiModulationClass', 'modClass'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'codeRateCallback'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'constellationSizeCallback'), param('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateCallback'), param('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateFromTxVectorCallback'), param('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateCallback'), param('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateFromTxVectorCallback'), param('ns3::Callback< unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'nonHtReferenceRateCallback'), param('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'isModeAllowedCallback')], 
+                   [param('std::string', 'uniqueName'), param('uint8_t', 'mcsValue'), param('ns3::WifiModulationClass', 'modClass'), param('bool', 'isMandatory'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'codeRateCallback'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'constellationSizeCallback'), param('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateCallback'), param('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateCallback'), param('ns3::Callback< unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'nonHtReferenceRateCallback'), param('ns3::Callback< bool, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'isAllowedCallback')], 
                    is_static=True)
-    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMode(std::string uniqueName, ns3::WifiModulationClass modClass, bool isMandatory, ns3::WifiModeFactory::CodeRateCallback codeRateCallback, ns3::WifiModeFactory::ConstellationSizeCallback constellationSizeCallback, ns3::WifiModeFactory::PhyRateCallback phyRateCallback, ns3::WifiModeFactory::PhyRateFromTxVectorCallback phyRateFromTxVectorCallback, ns3::WifiModeFactory::DataRateCallback dataRateCallback, ns3::WifiModeFactory::DataRateFromTxVectorCallback dataRateFromTxVectorCallback, ns3::WifiModeFactory::ModeAllowedCallback isModeAllowedCallback) [member function]
+    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMode(std::string uniqueName, ns3::WifiModulationClass modClass, bool isMandatory, ns3::WifiModeFactory::CodeRateCallback codeRateCallback, ns3::WifiModeFactory::ConstellationSizeCallback constellationSizeCallback, ns3::WifiModeFactory::PhyRateCallback phyRateCallback, ns3::WifiModeFactory::DataRateCallback dataRateCallback, ns3::WifiModeFactory::AllowedCallback isAllowedCallback) [member function]
     cls.add_method('CreateWifiMode', 
                    'ns3::WifiMode', 
-                   [param('std::string', 'uniqueName'), param('ns3::WifiModulationClass', 'modClass'), param('bool', 'isMandatory'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'codeRateCallback'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'constellationSizeCallback'), param('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateCallback'), param('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateFromTxVectorCallback'), param('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateCallback'), param('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateFromTxVectorCallback'), param('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'isModeAllowedCallback')], 
+                   [param('std::string', 'uniqueName'), param('ns3::WifiModulationClass', 'modClass'), param('bool', 'isMandatory'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'codeRateCallback'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'constellationSizeCallback'), param('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateCallback'), param('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateCallback'), param('ns3::Callback< bool, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'isAllowedCallback')], 
                    is_static=True)
     return
 
 def register_Ns3WifiNoAck_methods(root_module, cls):
     ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiNoAck::WifiNoAck() [constructor]
     cls.add_constructor([])
-    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiNoAck::Copy() const [member function]
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment>> ns3::WifiNoAck::Copy() const [member function]
     cls.add_method('Copy', 
                    'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
                    [], 
@@ -6903,7 +6916,7 @@
 def register_Ns3WifiNormalAck_methods(root_module, cls):
     ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiNormalAck::WifiNormalAck() [constructor]
     cls.add_constructor([])
-    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiNormalAck::Copy() const [member function]
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment>> ns3::WifiNormalAck::Copy() const [member function]
     cls.add_method('Copy', 
                    'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
                    [], 
@@ -6929,10 +6942,10 @@
     cls.add_constructor([param('ns3::WifiPhyHelper const &', 'arg0')])
     ## wifi-helper.h (module 'wifi'): ns3::WifiPhyHelper::WifiPhyHelper() [constructor]
     cls.add_constructor([])
-    ## wifi-helper.h (module 'wifi'): ns3::Ptr<ns3::WifiPhy> ns3::WifiPhyHelper::Create(ns3::Ptr<ns3::Node> node, ns3::Ptr<ns3::NetDevice> device) const [member function]
+    ## wifi-helper.h (module 'wifi'): ns3::Ptr<ns3::WifiPhy> ns3::WifiPhyHelper::Create(ns3::Ptr<ns3::Node> node, ns3::Ptr<ns3::WifiNetDevice> device) const [member function]
     cls.add_method('Create', 
                    'ns3::Ptr< ns3::WifiPhy >', 
-                   [param('ns3::Ptr< ns3::Node >', 'node'), param('ns3::Ptr< ns3::NetDevice >', 'device')], 
+                   [param('ns3::Ptr< ns3::Node >', 'node'), param('ns3::Ptr< ns3::WifiNetDevice >', 'device')], 
                    is_const=True, is_pure_virtual=True, is_virtual=True)
     ## wifi-helper.h (module 'wifi'): void ns3::WifiPhyHelper::DisablePreambleDetectionModel() [member function]
     cls.add_method('DisablePreambleDetectionModel', 
@@ -7047,6 +7060,16 @@
     cls.add_constructor([param('ns3::WifiPhyOperatingChannel const &', 'arg0')])
     ## wifi-phy-operating-channel.h (module 'wifi'): ns3::WifiPhyOperatingChannel::WifiPhyOperatingChannel() [constructor]
     cls.add_constructor([])
+    ## wifi-phy-operating-channel.h (module 'wifi'): static ns3::WifiPhyOperatingChannel::ConstIterator ns3::WifiPhyOperatingChannel::FindFirst(uint8_t number, uint16_t frequency, uint16_t width, ns3::WifiStandard standard, ns3::WifiPhyBand band, ns3::WifiPhyOperatingChannel::ConstIterator start=ns3::WifiPhyOperatingChannel::m_frequencyChannels.begin()) [member function]
+    cls.add_method('FindFirst', 
+                   'ns3::WifiPhyOperatingChannel::ConstIterator', 
+                   [param('uint8_t', 'number'), param('uint16_t', 'frequency'), param('uint16_t', 'width'), param('ns3::WifiStandard', 'standard'), param('ns3::WifiPhyBand', 'band'), param('std::set< std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand > > const_iterator', 'start', default_value='ns3::WifiPhyOperatingChannel::m_frequencyChannels.begin()')], 
+                   is_static=True)
+    ## wifi-phy-operating-channel.h (module 'wifi'): static uint8_t ns3::WifiPhyOperatingChannel::GetDefaultChannelNumber(uint16_t width, ns3::WifiStandard standard, ns3::WifiPhyBand band) [member function]
+    cls.add_method('GetDefaultChannelNumber', 
+                   'uint8_t', 
+                   [param('uint16_t', 'width'), param('ns3::WifiStandard', 'standard'), param('ns3::WifiPhyBand', 'band')], 
+                   is_static=True)
     ## wifi-phy-operating-channel.h (module 'wifi'): uint16_t ns3::WifiPhyOperatingChannel::GetFrequency() const [member function]
     cls.add_method('GetFrequency', 
                    'uint16_t', 
@@ -7067,6 +7090,11 @@
                    'uint8_t', 
                    [param('uint16_t', 'primaryChannelWidth')], 
                    is_const=True)
+    ## wifi-phy-operating-channel.h (module 'wifi'): uint8_t ns3::WifiPhyOperatingChannel::GetPrimaryChannelNumber(uint16_t primaryChannelWidth, ns3::WifiStandard standard) const [member function]
+    cls.add_method('GetPrimaryChannelNumber', 
+                   'uint8_t', 
+                   [param('uint16_t', 'primaryChannelWidth'), param('ns3::WifiStandard', 'standard')], 
+                   is_const=True)
     ## wifi-phy-operating-channel.h (module 'wifi'): uint16_t ns3::WifiPhyOperatingChannel::GetWidth() const [member function]
     cls.add_method('GetWidth', 
                    'uint16_t', 
@@ -7077,24 +7105,26 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## wifi-phy-operating-channel.h (module 'wifi'): void ns3::WifiPhyOperatingChannel::Set(uint8_t number, uint16_t frequency, uint16_t width, ns3::WifiPhyStandard standard, ns3::WifiPhyBand band) [member function]
+    ## wifi-phy-operating-channel.h (module 'wifi'): void ns3::WifiPhyOperatingChannel::Set(uint8_t number, uint16_t frequency, uint16_t width, ns3::WifiStandard standard, ns3::WifiPhyBand band) [member function]
     cls.add_method('Set', 
                    'void', 
-                   [param('uint8_t', 'number'), param('uint16_t', 'frequency'), param('uint16_t', 'width'), param('ns3::WifiPhyStandard', 'standard'), param('ns3::WifiPhyBand', 'band')])
-    ## wifi-phy-operating-channel.h (module 'wifi'): void ns3::WifiPhyOperatingChannel::SetDefault(uint16_t width, ns3::WifiPhyStandard standard, ns3::WifiPhyBand band) [member function]
+                   [param('uint8_t', 'number'), param('uint16_t', 'frequency'), param('uint16_t', 'width'), param('ns3::WifiStandard', 'standard'), param('ns3::WifiPhyBand', 'band')])
+    ## wifi-phy-operating-channel.h (module 'wifi'): void ns3::WifiPhyOperatingChannel::SetDefault(uint16_t width, ns3::WifiStandard standard, ns3::WifiPhyBand band) [member function]
     cls.add_method('SetDefault', 
                    'void', 
-                   [param('uint16_t', 'width'), param('ns3::WifiPhyStandard', 'standard'), param('ns3::WifiPhyBand', 'band')])
+                   [param('uint16_t', 'width'), param('ns3::WifiStandard', 'standard'), param('ns3::WifiPhyBand', 'band')])
     ## wifi-phy-operating-channel.h (module 'wifi'): void ns3::WifiPhyOperatingChannel::SetPrimary20Index(uint8_t index) [member function]
     cls.add_method('SetPrimary20Index', 
                    'void', 
                    [param('uint8_t', 'index')])
+    ## wifi-phy-operating-channel.h (module 'wifi'): ns3::WifiPhyOperatingChannel::m_frequencyChannels [variable]
+    cls.add_static_attribute('m_frequencyChannels', 'std::set< std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand > > const', is_const=True)
     return
 
 def register_Ns3WifiProtection_methods(root_module, cls):
     ## wifi-protection.h (module 'wifi'): ns3::WifiProtection::WifiProtection(ns3::WifiProtection::Method m) [constructor]
     cls.add_constructor([param('ns3::WifiProtection::Method', 'm')])
-    ## wifi-protection.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection> > ns3::WifiProtection::Copy() const [member function]
+    ## wifi-protection.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection>> ns3::WifiProtection::Copy() const [member function]
     cls.add_method('Copy', 
                    'std::unique_ptr< ns3::WifiProtection, std::default_delete< ns3::WifiProtection > >', 
                    [], 
@@ -7309,7 +7339,7 @@
 def register_Ns3WifiRtsCtsProtection_methods(root_module, cls):
     ## wifi-protection.h (module 'wifi'): ns3::WifiRtsCtsProtection::WifiRtsCtsProtection() [constructor]
     cls.add_constructor([])
-    ## wifi-protection.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection> > ns3::WifiRtsCtsProtection::Copy() const [member function]
+    ## wifi-protection.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection>> ns3::WifiRtsCtsProtection::Copy() const [member function]
     cls.add_method('Copy', 
                    'std::unique_ptr< ns3::WifiProtection, std::default_delete< ns3::WifiProtection > >', 
                    [], 
@@ -7394,7 +7424,7 @@
                    'ns3::Ptr< ns3::SpectrumValue >', 
                    [param('uint32_t', 'centerFrequency'), param('uint16_t', 'totalChannelWidth'), param('uint32_t', 'bandBandwidth'), param('uint16_t', 'guardBandwidth'), param('std::pair< unsigned int, unsigned int >', 'band')], 
                    is_static=True)
-    ## wifi-spectrum-value-helper.h (module 'spectrum'): static void ns3::WifiSpectrumValueHelper::CreateSpectrumMaskForOfdm(ns3::Ptr<ns3::SpectrumValue> c, std::vector<std::pair<unsigned int, unsigned int>, std::allocator<std::pair<unsigned int, unsigned int> > > allocatedSubBands, ns3::WifiSpectrumBand maskBand, double txPowerPerBandW, uint32_t nGuardBands, uint32_t innerSlopeWidth, double minInnerBandDbr, double minOuterbandDbr, double lowestPointDbr) [member function]
+    ## wifi-spectrum-value-helper.h (module 'spectrum'): static void ns3::WifiSpectrumValueHelper::CreateSpectrumMaskForOfdm(ns3::Ptr<ns3::SpectrumValue> c, std::vector<std::pair<unsigned int, unsigned int>, std::allocator<std::pair<unsigned int, unsigned int>>> allocatedSubBands, ns3::WifiSpectrumBand maskBand, double txPowerPerBandW, uint32_t nGuardBands, uint32_t innerSlopeWidth, double minInnerBandDbr, double minOuterbandDbr, double lowestPointDbr) [member function]
     cls.add_method('CreateSpectrumMaskForOfdm', 
                    'void', 
                    [param('ns3::Ptr< ns3::SpectrumValue >', 'c'), param('std::vector< std::pair< unsigned int, unsigned int > >', 'allocatedSubBands'), param('std::pair< unsigned int, unsigned int >', 'maskBand'), param('double', 'txPowerPerBandW'), param('uint32_t', 'nGuardBands'), param('uint32_t', 'innerSlopeWidth'), param('double', 'minInnerBandDbr'), param('double', 'minOuterbandDbr'), param('double', 'lowestPointDbr')], 
@@ -7421,19 +7451,6 @@
                    is_static=True)
     return
 
-def register_Ns3WifiStandardInfo_methods(root_module, cls):
-    ## wifi-standards.h (module 'wifi'): ns3::WifiStandardInfo::WifiStandardInfo() [constructor]
-    cls.add_constructor([])
-    ## wifi-standards.h (module 'wifi'): ns3::WifiStandardInfo::WifiStandardInfo(ns3::WifiStandardInfo const & arg0) [constructor]
-    cls.add_constructor([param('ns3::WifiStandardInfo const &', 'arg0')])
-    ## wifi-standards.h (module 'wifi'): ns3::WifiStandardInfo::macStandard [variable]
-    cls.add_instance_attribute('macStandard', 'ns3::WifiMacStandard', is_const=False)
-    ## wifi-standards.h (module 'wifi'): ns3::WifiStandardInfo::phyBand [variable]
-    cls.add_instance_attribute('phyBand', 'ns3::WifiPhyBand', is_const=False)
-    ## wifi-standards.h (module 'wifi'): ns3::WifiStandardInfo::phyStandard [variable]
-    cls.add_instance_attribute('phyStandard', 'ns3::WifiPhyStandard', is_const=False)
-    return
-
 def register_Ns3WifiTxParameters_methods(root_module, cls):
     ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters::WifiTxParameters() [constructor]
     cls.add_constructor([])
@@ -7761,7 +7778,7 @@
 def register_Ns3WifiUlMuMultiStaBa_methods(root_module, cls):
     ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiUlMuMultiStaBa::WifiUlMuMultiStaBa() [constructor]
     cls.add_constructor([])
-    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiUlMuMultiStaBa::Copy() const [member function]
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment>> ns3::WifiUlMuMultiStaBa::Copy() const [member function]
     cls.add_method('Copy', 
                    'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
                    [], 
@@ -7830,10 +7847,10 @@
     cls.add_method('SetChannel', 
                    'void', 
                    [param('std::string', 'channelName')])
-    ## yans-wifi-helper.h (module 'wifi'): ns3::Ptr<ns3::WifiPhy> ns3::YansWifiPhyHelper::Create(ns3::Ptr<ns3::Node> node, ns3::Ptr<ns3::NetDevice> device) const [member function]
+    ## yans-wifi-helper.h (module 'wifi'): ns3::Ptr<ns3::WifiPhy> ns3::YansWifiPhyHelper::Create(ns3::Ptr<ns3::Node> node, ns3::Ptr<ns3::WifiNetDevice> device) const [member function]
     cls.add_method('Create', 
                    'ns3::Ptr< ns3::WifiPhy >', 
-                   [param('ns3::Ptr< ns3::Node >', 'node'), param('ns3::Ptr< ns3::NetDevice >', 'device')], 
+                   [param('ns3::Ptr< ns3::Node >', 'node'), param('ns3::Ptr< ns3::WifiNetDevice >', 'device')], 
                    is_const=True, is_virtual=True, visibility='private')
     return
 
@@ -7854,14 +7871,14 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('>=')
     cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_unary_numeric_operator('-')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
     cls.add_constructor([])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(double const value) [constructor]
@@ -7880,6 +7897,8 @@
     cls.add_constructor([param('long unsigned int const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int const v) [constructor]
     cls.add_constructor([param('long long unsigned int const', 'v')])
+    ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int128_t const v) [constructor]
+    cls.add_constructor([param('int128_t const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t const hi, uint64_t const lo) [constructor]
     cls.add_constructor([param('int64_t const', 'hi'), param('uint64_t const', 'lo')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [constructor]
@@ -9230,6 +9249,102 @@
                    [])
     return
 
+def register_Ns3PhasedArrayModel_methods(root_module, cls):
+    ## phased-array-model.h (module 'antenna'): ns3::PhasedArrayModel::PhasedArrayModel(ns3::PhasedArrayModel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::PhasedArrayModel const &', 'arg0')])
+    ## phased-array-model.h (module 'antenna'): ns3::PhasedArrayModel::PhasedArrayModel() [constructor]
+    cls.add_constructor([])
+    ## phased-array-model.h (module 'antenna'): ns3::Ptr<const ns3::AntennaModel> ns3::PhasedArrayModel::GetAntennaElement() const [member function]
+    cls.add_method('GetAntennaElement', 
+                   'ns3::Ptr< ns3::AntennaModel const >', 
+                   [], 
+                   is_const=True)
+    ## phased-array-model.h (module 'antenna'): ns3::PhasedArrayModel::ComplexVector ns3::PhasedArrayModel::GetBeamformingVector() const [member function]
+    cls.add_method('GetBeamformingVector', 
+                   'ns3::PhasedArrayModel::ComplexVector', 
+                   [], 
+                   is_const=True)
+    ## phased-array-model.h (module 'antenna'): ns3::PhasedArrayModel::ComplexVector ns3::PhasedArrayModel::GetBeamformingVector(ns3::Angles a) const [member function]
+    cls.add_method('GetBeamformingVector', 
+                   'ns3::PhasedArrayModel::ComplexVector', 
+                   [param('ns3::Angles', 'a')], 
+                   is_const=True)
+    ## phased-array-model.h (module 'antenna'): std::pair<double, double> ns3::PhasedArrayModel::GetElementFieldPattern(ns3::Angles a) const [member function]
+    cls.add_method('GetElementFieldPattern', 
+                   'std::pair< double, double >', 
+                   [param('ns3::Angles', 'a')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## phased-array-model.h (module 'antenna'): ns3::Vector ns3::PhasedArrayModel::GetElementLocation(uint64_t index) const [member function]
+    cls.add_method('GetElementLocation', 
+                   'ns3::Vector', 
+                   [param('uint64_t', 'index')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## phased-array-model.h (module 'antenna'): uint32_t ns3::PhasedArrayModel::GetId() const [member function]
+    cls.add_method('GetId', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## phased-array-model.h (module 'antenna'): uint64_t ns3::PhasedArrayModel::GetNumberOfElements() const [member function]
+    cls.add_method('GetNumberOfElements', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## phased-array-model.h (module 'antenna'): ns3::PhasedArrayModel::ComplexVector ns3::PhasedArrayModel::GetSteeringVector(ns3::Angles a) const [member function]
+    cls.add_method('GetSteeringVector', 
+                   'ns3::PhasedArrayModel::ComplexVector', 
+                   [param('ns3::Angles', 'a')], 
+                   is_const=True)
+    ## phased-array-model.h (module 'antenna'): static ns3::TypeId ns3::PhasedArrayModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## phased-array-model.h (module 'antenna'): void ns3::PhasedArrayModel::SetAntennaElement(ns3::Ptr<ns3::AntennaModel> antennaElement) [member function]
+    cls.add_method('SetAntennaElement', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::AntennaModel >', 'antennaElement')])
+    ## phased-array-model.h (module 'antenna'): void ns3::PhasedArrayModel::SetBeamformingVector(ns3::PhasedArrayModel::ComplexVector const & beamformingVector) [member function]
+    cls.add_method('SetBeamformingVector', 
+                   'void', 
+                   [param('ns3::PhasedArrayModel::ComplexVector const &', 'beamformingVector')])
+    ## phased-array-model.h (module 'antenna'): static double ns3::PhasedArrayModel::ComputeNorm(ns3::PhasedArrayModel::ComplexVector const & vector) [member function]
+    cls.add_method('ComputeNorm', 
+                   'double', 
+                   [param('ns3::PhasedArrayModel::ComplexVector const &', 'vector')], 
+                   is_static=True, visibility='protected')
+    return
+
+def register_Ns3PhasedArraySpectrumPropagationLossModel_methods(root_module, cls):
+    ## phased-array-spectrum-propagation-loss-model.h (module 'spectrum'): ns3::PhasedArraySpectrumPropagationLossModel::PhasedArraySpectrumPropagationLossModel(ns3::PhasedArraySpectrumPropagationLossModel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::PhasedArraySpectrumPropagationLossModel const &', 'arg0')])
+    ## phased-array-spectrum-propagation-loss-model.h (module 'spectrum'): ns3::PhasedArraySpectrumPropagationLossModel::PhasedArraySpectrumPropagationLossModel() [constructor]
+    cls.add_constructor([])
+    ## phased-array-spectrum-propagation-loss-model.h (module 'spectrum'): ns3::Ptr<ns3::SpectrumValue> ns3::PhasedArraySpectrumPropagationLossModel::CalcRxPowerSpectralDensity(ns3::Ptr<const ns3::SpectrumValue> txPsd, ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b, ns3::Ptr<const ns3::PhasedArrayModel> aPhasedArrayModel, ns3::Ptr<const ns3::PhasedArrayModel> bPhasedArrayModel) const [member function]
+    cls.add_method('CalcRxPowerSpectralDensity', 
+                   'ns3::Ptr< ns3::SpectrumValue >', 
+                   [param('ns3::Ptr< ns3::SpectrumValue const >', 'txPsd'), param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b'), param('ns3::Ptr< ns3::PhasedArrayModel const >', 'aPhasedArrayModel'), param('ns3::Ptr< ns3::PhasedArrayModel const >', 'bPhasedArrayModel')], 
+                   is_const=True)
+    ## phased-array-spectrum-propagation-loss-model.h (module 'spectrum'): static ns3::TypeId ns3::PhasedArraySpectrumPropagationLossModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## phased-array-spectrum-propagation-loss-model.h (module 'spectrum'): void ns3::PhasedArraySpectrumPropagationLossModel::SetNext(ns3::Ptr<ns3::PhasedArraySpectrumPropagationLossModel> next) [member function]
+    cls.add_method('SetNext', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::PhasedArraySpectrumPropagationLossModel >', 'next')])
+    ## phased-array-spectrum-propagation-loss-model.h (module 'spectrum'): void ns3::PhasedArraySpectrumPropagationLossModel::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## phased-array-spectrum-propagation-loss-model.h (module 'spectrum'): ns3::Ptr<ns3::SpectrumValue> ns3::PhasedArraySpectrumPropagationLossModel::DoCalcRxPowerSpectralDensity(ns3::Ptr<const ns3::SpectrumValue> txPsd, ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b, ns3::Ptr<const ns3::PhasedArrayModel> aPhasedArrayModel, ns3::Ptr<const ns3::PhasedArrayModel> bPhasedArrayModel) const [member function]
+    cls.add_method('DoCalcRxPowerSpectralDensity', 
+                   'ns3::Ptr< ns3::SpectrumValue >', 
+                   [param('ns3::Ptr< ns3::SpectrumValue const >', 'txPsd'), param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b'), param('ns3::Ptr< ns3::PhasedArrayModel const >', 'aPhasedArrayModel'), param('ns3::Ptr< ns3::PhasedArrayModel const >', 'bPhasedArrayModel')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
+    return
+
 def register_Ns3PreambleDetectionModel_methods(root_module, cls):
     ## preamble-detection-model.h (module 'wifi'): ns3::PreambleDetectionModel::PreambleDetectionModel() [constructor]
     cls.add_constructor([])
@@ -9270,7 +9385,7 @@
     cls.add_method('DoAssignStreams', 
                    'int64_t', 
                    [param('int64_t', 'stream')], 
-                   is_pure_virtual=True, is_virtual=True, visibility='private')
+                   is_pure_virtual=True, is_virtual=True, visibility='protected')
     return
 
 def register_Ns3PropagationLossModel_methods(root_module, cls):
@@ -9298,16 +9413,16 @@
     cls.add_method('AssignStreams', 
                    'int64_t', 
                    [param('int64_t', 'stream')])
+    ## propagation-loss-model.h (module 'propagation'): int64_t ns3::PropagationLossModel::DoAssignStreams(int64_t stream) [member function]
+    cls.add_method('DoAssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')], 
+                   is_pure_virtual=True, is_virtual=True, visibility='protected')
     ## propagation-loss-model.h (module 'propagation'): double ns3::PropagationLossModel::DoCalcRxPower(double txPowerDbm, ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
     cls.add_method('DoCalcRxPower', 
                    'double', 
                    [param('double', 'txPowerDbm'), param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
                    is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
-    ## propagation-loss-model.h (module 'propagation'): int64_t ns3::PropagationLossModel::DoAssignStreams(int64_t stream) [member function]
-    cls.add_method('DoAssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'stream')], 
-                   is_pure_virtual=True, is_virtual=True, visibility='private')
     return
 
 def register_Ns3QueueBase_methods(root_module, cls):
@@ -9398,6 +9513,11 @@
     cls.add_method('SetMaxSize', 
                    'void', 
                    [param('ns3::QueueSize', 'size')])
+    ## queue.h (module 'network'): bool ns3::QueueBase::WouldOverflow(uint32_t nPackets, uint32_t nBytes) const [member function]
+    cls.add_method('WouldOverflow', 
+                   'bool', 
+                   [param('uint32_t', 'nPackets'), param('uint32_t', 'nBytes')], 
+                   is_const=True)
     return
 
 def register_Ns3RandomPropagationDelayModel_methods(root_module, cls):
@@ -9546,163 +9666,163 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Event_Ns3Empty_Ns3DefaultDeleter__lt__ns3Event__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Event, ns3::empty, ns3::DefaultDeleter<ns3::Event> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Event, ns3::empty, ns3::DefaultDeleter<ns3::Event>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Event, ns3::empty, ns3::DefaultDeleter<ns3::Event> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Event, ns3::empty, ns3::DefaultDeleter<ns3::Event> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Event, ns3::empty, ns3::DefaultDeleter<ns3::Event>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Event, ns3::empty, ns3::DefaultDeleter<ns3::Event>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Event, ns3::empty, ns3::DefaultDeleter< ns3::Event > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3MacRxMiddle_Ns3Empty_Ns3DefaultDeleter__lt__ns3MacRxMiddle__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MacRxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacRxMiddle> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MacRxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacRxMiddle>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MacRxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacRxMiddle> >::SimpleRefCount(ns3::SimpleRefCount<ns3::MacRxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacRxMiddle> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MacRxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacRxMiddle>>::SimpleRefCount(ns3::SimpleRefCount<ns3::MacRxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacRxMiddle>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::MacRxMiddle, ns3::empty, ns3::DefaultDeleter< ns3::MacRxMiddle > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3MacTxMiddle_Ns3Empty_Ns3DefaultDeleter__lt__ns3MacTxMiddle__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MacTxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacTxMiddle> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MacTxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacTxMiddle>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MacTxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacTxMiddle> >::SimpleRefCount(ns3::SimpleRefCount<ns3::MacTxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacTxMiddle> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MacTxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacTxMiddle>>::SimpleRefCount(ns3::SimpleRefCount<ns3::MacTxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacTxMiddle>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::MacTxMiddle, ns3::empty, ns3::DefaultDeleter< ns3::MacTxMiddle > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3OutputStreamWrapper_Ns3Empty_Ns3DefaultDeleter__lt__ns3OutputStreamWrapper__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter< ns3::OutputStreamWrapper > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3PhyEntity_Ns3Empty_Ns3DefaultDeleter__lt__ns3PhyEntity__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity> >::SimpleRefCount(ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity>>::SimpleRefCount(ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter< ns3::PhyEntity > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3QosBlockedDestinations_Ns3Empty_Ns3DefaultDeleter__lt__ns3QosBlockedDestinations__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QosBlockedDestinations, ns3::empty, ns3::DefaultDeleter<ns3::QosBlockedDestinations> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QosBlockedDestinations, ns3::empty, ns3::DefaultDeleter<ns3::QosBlockedDestinations>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QosBlockedDestinations, ns3::empty, ns3::DefaultDeleter<ns3::QosBlockedDestinations> >::SimpleRefCount(ns3::SimpleRefCount<ns3::QosBlockedDestinations, ns3::empty, ns3::DefaultDeleter<ns3::QosBlockedDestinations> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QosBlockedDestinations, ns3::empty, ns3::DefaultDeleter<ns3::QosBlockedDestinations>>::SimpleRefCount(ns3::SimpleRefCount<ns3::QosBlockedDestinations, ns3::empty, ns3::DefaultDeleter<ns3::QosBlockedDestinations>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::QosBlockedDestinations, ns3::empty, ns3::DefaultDeleter< ns3::QosBlockedDestinations > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3QueueItem_Ns3Empty_Ns3DefaultDeleter__lt__ns3QueueItem__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> >::SimpleRefCount(ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>>::SimpleRefCount(ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::QueueItem, ns3::empty, ns3::DefaultDeleter< ns3::QueueItem > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3SpectrumModel_Ns3Empty_Ns3DefaultDeleter__lt__ns3SpectrumModel__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel> >::SimpleRefCount(ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel>>::SimpleRefCount(ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter< ns3::SpectrumModel > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3SpectrumSignalParameters_Ns3Empty_Ns3DefaultDeleter__lt__ns3SpectrumSignalParameters__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters> >::SimpleRefCount(ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters>>::SimpleRefCount(ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter< ns3::SpectrumSignalParameters > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3SpectrumValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3SpectrumValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter< ns3::SpectrumValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3WifiInformationElement_Ns3Empty_Ns3DefaultDeleter__lt__ns3WifiInformationElement__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement> >::SimpleRefCount(ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement>>::SimpleRefCount(ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter< ns3::WifiInformationElement > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3WifiMacQueueItem_Ns3Empty_Ns3DefaultDeleter__lt__ns3WifiMacQueueItem__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiMacQueueItem, ns3::empty, ns3::DefaultDeleter<ns3::WifiMacQueueItem> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiMacQueueItem, ns3::empty, ns3::DefaultDeleter<ns3::WifiMacQueueItem>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiMacQueueItem, ns3::empty, ns3::DefaultDeleter<ns3::WifiMacQueueItem> >::SimpleRefCount(ns3::SimpleRefCount<ns3::WifiMacQueueItem, ns3::empty, ns3::DefaultDeleter<ns3::WifiMacQueueItem> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiMacQueueItem, ns3::empty, ns3::DefaultDeleter<ns3::WifiMacQueueItem>>::SimpleRefCount(ns3::SimpleRefCount<ns3::WifiMacQueueItem, ns3::empty, ns3::DefaultDeleter<ns3::WifiMacQueueItem>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::WifiMacQueueItem, ns3::empty, ns3::DefaultDeleter< ns3::WifiMacQueueItem > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3WifiPpdu_Ns3Empty_Ns3DefaultDeleter__lt__ns3WifiPpdu__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiPpdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPpdu> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiPpdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPpdu>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiPpdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPpdu> >::SimpleRefCount(ns3::SimpleRefCount<ns3::WifiPpdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPpdu> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiPpdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPpdu>>::SimpleRefCount(ns3::SimpleRefCount<ns3::WifiPpdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPpdu>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::WifiPpdu, ns3::empty, ns3::DefaultDeleter< ns3::WifiPpdu > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3WifiPsdu_Ns3Empty_Ns3DefaultDeleter__lt__ns3WifiPsdu__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiPsdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPsdu> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiPsdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPsdu>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiPsdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPsdu> >::SimpleRefCount(ns3::SimpleRefCount<ns3::WifiPsdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPsdu> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiPsdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPsdu>>::SimpleRefCount(ns3::SimpleRefCount<ns3::WifiPsdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPsdu>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::WifiPsdu, ns3::empty, ns3::DefaultDeleter< ns3::WifiPsdu > > const &', 'o')])
     return
 
@@ -9756,16 +9876,16 @@
     cls.add_binary_comparison_operator('==')
     ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(ns3::SpectrumModel const & arg0) [constructor]
     cls.add_constructor([param('ns3::SpectrumModel const &', 'arg0')])
-    ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(std::vector<double, std::allocator<double> > const & centerFreqs) [constructor]
+    ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(std::vector<double, std::allocator<double>> const & centerFreqs) [constructor]
     cls.add_constructor([param('std::vector< double > const &', 'centerFreqs')])
     ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(ns3::Bands const & bands) [constructor]
     cls.add_constructor([param('ns3::Bands const &', 'bands')])
-    ## spectrum-model.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo> >::const_iterator ns3::SpectrumModel::Begin() const [member function]
+    ## spectrum-model.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo>>::const_iterator ns3::SpectrumModel::Begin() const [member function]
     cls.add_method('Begin', 
                    'std::vector< ns3::BandInfo > const_iterator', 
                    [], 
                    is_const=True)
-    ## spectrum-model.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo> >::const_iterator ns3::SpectrumModel::End() const [member function]
+    ## spectrum-model.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo>>::const_iterator ns3::SpectrumModel::End() const [member function]
     cls.add_method('End', 
                    'std::vector< ns3::BandInfo > const_iterator', 
                    [], 
@@ -9825,9 +9945,9 @@
                    'ns3::Ptr< ns3::SpectrumModel const >', 
                    [], 
                    is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::AntennaModel> ns3::SpectrumPhy::GetRxAntenna() const [member function]
-    cls.add_method('GetRxAntenna', 
-                   'ns3::Ptr< ns3::AntennaModel >', 
+    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::Object> ns3::SpectrumPhy::GetAntenna() const [member function]
+    cls.add_method('GetAntenna', 
+                   'ns3::Ptr< ns3::Object >', 
                    [], 
                    is_const=True, is_pure_virtual=True, is_virtual=True)
     ## spectrum-phy.h (module 'spectrum'): void ns3::SpectrumPhy::StartRx(ns3::Ptr<ns3::SpectrumSignalParameters> params) [member function]
@@ -9913,22 +10033,22 @@
     cls.add_constructor([param('ns3::Ptr< ns3::SpectrumModel const >', 'sm')])
     ## spectrum-value.h (module 'spectrum'): ns3::SpectrumValue::SpectrumValue() [constructor]
     cls.add_constructor([])
-    ## spectrum-value.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo> >::const_iterator ns3::SpectrumValue::ConstBandsBegin() const [member function]
+    ## spectrum-value.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo>>::const_iterator ns3::SpectrumValue::ConstBandsBegin() const [member function]
     cls.add_method('ConstBandsBegin', 
                    'std::vector< ns3::BandInfo > const_iterator', 
                    [], 
                    is_const=True)
-    ## spectrum-value.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo> >::const_iterator ns3::SpectrumValue::ConstBandsEnd() const [member function]
+    ## spectrum-value.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo>>::const_iterator ns3::SpectrumValue::ConstBandsEnd() const [member function]
     cls.add_method('ConstBandsEnd', 
                    'std::vector< ns3::BandInfo > const_iterator', 
                    [], 
                    is_const=True)
-    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double> >::const_iterator ns3::SpectrumValue::ConstValuesBegin() const [member function]
+    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double>>::const_iterator ns3::SpectrumValue::ConstValuesBegin() const [member function]
     cls.add_method('ConstValuesBegin', 
                    'std::vector< double > const_iterator', 
                    [], 
                    is_const=True)
-    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double> >::const_iterator ns3::SpectrumValue::ConstValuesEnd() const [member function]
+    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double>>::const_iterator ns3::SpectrumValue::ConstValuesEnd() const [member function]
     cls.add_method('ConstValuesEnd', 
                    'std::vector< double > const_iterator', 
                    [], 
@@ -9958,11 +10078,11 @@
                    'double const &', 
                    [param('uint32_t', 'pos')], 
                    is_const=True)
-    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double> >::iterator ns3::SpectrumValue::ValuesBegin() [member function]
+    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double>>::iterator ns3::SpectrumValue::ValuesBegin() [member function]
     cls.add_method('ValuesBegin', 
                    'std::vector< double > iterator', 
                    [])
-    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double> >::iterator ns3::SpectrumValue::ValuesEnd() [member function]
+    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double>>::iterator ns3::SpectrumValue::ValuesEnd() [member function]
     cls.add_method('ValuesEnd', 
                    'std::vector< double > iterator', 
                    [])
@@ -9981,10 +10101,10 @@
     cls.add_method('SetChannel', 
                    'void', 
                    [param('std::string', 'channelName')])
-    ## spectrum-wifi-helper.h (module 'wifi'): ns3::Ptr<ns3::WifiPhy> ns3::SpectrumWifiPhyHelper::Create(ns3::Ptr<ns3::Node> node, ns3::Ptr<ns3::NetDevice> device) const [member function]
+    ## spectrum-wifi-helper.h (module 'wifi'): ns3::Ptr<ns3::WifiPhy> ns3::SpectrumWifiPhyHelper::Create(ns3::Ptr<ns3::Node> node, ns3::Ptr<ns3::WifiNetDevice> device) const [member function]
     cls.add_method('Create', 
                    'ns3::Ptr< ns3::WifiPhy >', 
-                   [param('ns3::Ptr< ns3::Node >', 'node'), param('ns3::Ptr< ns3::NetDevice >', 'device')], 
+                   [param('ns3::Ptr< ns3::Node >', 'node'), param('ns3::Ptr< ns3::WifiNetDevice >', 'device')], 
                    is_const=True, is_virtual=True, visibility='private')
     return
 
@@ -10458,11 +10578,6 @@
                    'void', 
                    [], 
                    is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::NotifyChannelSwitching() [member function]
-    cls.add_method('NotifyChannelSwitching', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
     ## txop.h (module 'wifi'): void ns3::Txop::NotifyOff() [member function]
     cls.add_method('NotifyOff', 
                    'void', 
@@ -10521,10 +10636,10 @@
     cls.add_method('SetTxopLimit', 
                    'void', 
                    [param('ns3::Time', 'txopLimit')])
-    ## txop.h (module 'wifi'): void ns3::Txop::SetWifiMac(ns3::Ptr<ns3::RegularWifiMac> const mac) [member function]
+    ## txop.h (module 'wifi'): void ns3::Txop::SetWifiMac(ns3::Ptr<ns3::WifiMac> const mac) [member function]
     cls.add_method('SetWifiMac', 
                    'void', 
-                   [param('ns3::Ptr< ns3::RegularWifiMac > const', 'mac')], 
+                   [param('ns3::Ptr< ns3::WifiMac > const', 'mac')], 
                    is_virtual=True)
     ## txop.h (module 'wifi'): void ns3::Txop::StartBackoffNow(uint32_t nSlots) [member function]
     cls.add_method('StartBackoffNow', 
@@ -10687,7 +10802,7 @@
 def register_Ns3WifiAckAfterTbPpdu_methods(root_module, cls):
     ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiAckAfterTbPpdu::WifiAckAfterTbPpdu() [constructor]
     cls.add_constructor([])
-    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiAckAfterTbPpdu::Copy() const [member function]
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment>> ns3::WifiAckAfterTbPpdu::Copy() const [member function]
     cls.add_method('Copy', 
                    'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
                    [], 
@@ -10726,16 +10841,16 @@
                    'void', 
                    [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('ns3::WifiAcknowledgment const *', 'acknowledgment')], 
                    is_static=True)
-    ## wifi-ack-manager.h (module 'wifi'): void ns3::WifiAckManager::SetWifiMac(ns3::Ptr<ns3::RegularWifiMac> mac) [member function]
+    ## wifi-ack-manager.h (module 'wifi'): void ns3::WifiAckManager::SetWifiMac(ns3::Ptr<ns3::WifiMac> mac) [member function]
     cls.add_method('SetWifiMac', 
                    'void', 
-                   [param('ns3::Ptr< ns3::RegularWifiMac >', 'mac')])
-    ## wifi-ack-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiAckManager::TryAddMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters const & txParams) [member function]
+                   [param('ns3::Ptr< ns3::WifiMac >', 'mac')])
+    ## wifi-ack-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment>> ns3::WifiAckManager::TryAddMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters const & txParams) [member function]
     cls.add_method('TryAddMpdu', 
                    'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::WifiTxParameters const &', 'txParams')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## wifi-ack-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiAckManager::TryAggregateMsdu(ns3::Ptr<const ns3::WifiMacQueueItem> msdu, ns3::WifiTxParameters const & txParams) [member function]
+    ## wifi-ack-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment>> ns3::WifiAckManager::TryAggregateMsdu(ns3::Ptr<const ns3::WifiMacQueueItem> msdu, ns3::WifiTxParameters const & txParams) [member function]
     cls.add_method('TryAggregateMsdu', 
                    'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'msdu'), param('ns3::WifiTxParameters const &', 'txParams')], 
@@ -10814,7 +10929,7 @@
 def register_Ns3WifiCtsToSelfProtection_methods(root_module, cls):
     ## wifi-protection.h (module 'wifi'): ns3::WifiCtsToSelfProtection::WifiCtsToSelfProtection() [constructor]
     cls.add_constructor([])
-    ## wifi-protection.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection> > ns3::WifiCtsToSelfProtection::Copy() const [member function]
+    ## wifi-protection.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection>> ns3::WifiCtsToSelfProtection::Copy() const [member function]
     cls.add_method('Copy', 
                    'std::unique_ptr< ns3::WifiProtection, std::default_delete< ns3::WifiProtection > >', 
                    [], 
@@ -10845,12 +10960,12 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## wifi-default-ack-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiDefaultAckManager::TryAddMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters const & txParams) [member function]
+    ## wifi-default-ack-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment>> ns3::WifiDefaultAckManager::TryAddMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters const & txParams) [member function]
     cls.add_method('TryAddMpdu', 
                    'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::WifiTxParameters const &', 'txParams')], 
                    is_virtual=True)
-    ## wifi-default-ack-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiDefaultAckManager::TryAggregateMsdu(ns3::Ptr<const ns3::WifiMacQueueItem> msdu, ns3::WifiTxParameters const & txParams) [member function]
+    ## wifi-default-ack-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment>> ns3::WifiDefaultAckManager::TryAggregateMsdu(ns3::Ptr<const ns3::WifiMacQueueItem> msdu, ns3::WifiTxParameters const & txParams) [member function]
     cls.add_method('TryAggregateMsdu', 
                    'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'msdu'), param('ns3::WifiTxParameters const &', 'txParams')], 
@@ -10860,22 +10975,22 @@
                    'bool', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::WifiTxParameters const &', 'txParams')], 
                    is_const=True, visibility='protected')
-    ## wifi-default-ack-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiDefaultAckManager::GetAckInfoIfAggregatedMuBar(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters const & txParams) [member function]
+    ## wifi-default-ack-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment>> ns3::WifiDefaultAckManager::GetAckInfoIfAggregatedMuBar(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters const & txParams) [member function]
     cls.add_method('GetAckInfoIfAggregatedMuBar', 
                    'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::WifiTxParameters const &', 'txParams')], 
                    is_virtual=True, visibility='private')
-    ## wifi-default-ack-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiDefaultAckManager::GetAckInfoIfBarBaSequence(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters const & txParams) [member function]
+    ## wifi-default-ack-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment>> ns3::WifiDefaultAckManager::GetAckInfoIfBarBaSequence(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters const & txParams) [member function]
     cls.add_method('GetAckInfoIfBarBaSequence', 
                    'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::WifiTxParameters const &', 'txParams')], 
                    is_virtual=True, visibility='private')
-    ## wifi-default-ack-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiDefaultAckManager::GetAckInfoIfTfMuBar(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters const & txParams) [member function]
+    ## wifi-default-ack-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment>> ns3::WifiDefaultAckManager::GetAckInfoIfTfMuBar(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters const & txParams) [member function]
     cls.add_method('GetAckInfoIfTfMuBar', 
                    'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::WifiTxParameters const &', 'txParams')], 
                    is_virtual=True, visibility='private')
-    ## wifi-default-ack-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiDefaultAckManager::TryUlMuTransmission(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters const & txParams) [member function]
+    ## wifi-default-ack-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment>> ns3::WifiDefaultAckManager::TryUlMuTransmission(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters const & txParams) [member function]
     cls.add_method('TryUlMuTransmission', 
                    'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::WifiTxParameters const &', 'txParams')], 
@@ -11009,102 +11124,153 @@
     return
 
 def register_Ns3WifiMac_methods(root_module, cls):
+    ## wifi-mac.h (module 'wifi'): static ns3::TypeId ns3::WifiMac::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## wifi-mac.h (module 'wifi'): ns3::WifiMac::WifiMac() [constructor]
     cls.add_constructor([])
-    ## wifi-mac.h (module 'wifi'): ns3::WifiMac::WifiMac(ns3::WifiMac const & arg0) [constructor]
-    cls.add_constructor([param('ns3::WifiMac const &', 'arg0')])
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::ConfigureStandard(ns3::WifiStandard standard) [member function]
-    cls.add_method('ConfigureStandard', 
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetDevice(ns3::Ptr<ns3::WifiNetDevice> const device) [member function]
+    cls.add_method('SetDevice', 
                    'void', 
-                   [param('ns3::WifiStandard', 'standard')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::DoDispose() [member function]
-    cls.add_method('DoDispose', 
+                   [param('ns3::Ptr< ns3::WifiNetDevice > const', 'device')])
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiNetDevice> ns3::WifiMac::GetDevice() const [member function]
+    cls.add_method('GetDevice', 
+                   'ns3::Ptr< ns3::WifiNetDevice >', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::FrameExchangeManager> ns3::WifiMac::GetFrameExchangeManager() const [member function]
+    cls.add_method('GetFrameExchangeManager', 
+                   'ns3::Ptr< ns3::FrameExchangeManager >', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::Txop> ns3::WifiMac::GetTxop() const [member function]
+    cls.add_method('GetTxop', 
+                   'ns3::Ptr< ns3::Txop >', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::WifiMac::GetQosTxop(ns3::AcIndex ac) const [member function]
+    cls.add_method('GetQosTxop', 
+                   'ns3::Ptr< ns3::QosTxop >', 
+                   [param('ns3::AcIndex', 'ac')], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::WifiMac::GetQosTxop(uint8_t tid) const [member function]
+    cls.add_method('GetQosTxop', 
+                   'ns3::Ptr< ns3::QosTxop >', 
+                   [param('uint8_t', 'tid')], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueue> ns3::WifiMac::GetTxopQueue(ns3::AcIndex ac) const [member function]
+    cls.add_method('GetTxopQueue', 
+                   'ns3::Ptr< ns3::WifiMacQueue >', 
+                   [param('ns3::AcIndex', 'ac')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetTypeOfStation(ns3::TypeOfStation type) [member function]
+    cls.add_method('SetTypeOfStation', 
                    'void', 
+                   [param('ns3::TypeOfStation', 'type')])
+    ## wifi-mac.h (module 'wifi'): ns3::TypeOfStation ns3::WifiMac::GetTypeOfStation() const [member function]
+    cls.add_method('GetTypeOfStation', 
+                   'ns3::TypeOfStation', 
                    [], 
-                   is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to, ns3::Mac48Address from) [member function]
-    cls.add_method('Enqueue', 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetSsid(ns3::Ssid ssid) [member function]
+    cls.add_method('SetSsid', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to'), param('ns3::Mac48Address', 'from')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to) [member function]
-    cls.add_method('Enqueue', 
+                   [param('ns3::Ssid', 'ssid')])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetPromisc() [member function]
+    cls.add_method('SetPromisc', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to')], 
-                   is_pure_virtual=True, is_virtual=True)
+                   [])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetCtsToSelfSupported(bool enable) [member function]
+    cls.add_method('SetCtsToSelfSupported', 
+                   'void', 
+                   [param('bool', 'enable')])
     ## wifi-mac.h (module 'wifi'): ns3::Mac48Address ns3::WifiMac::GetAddress() const [member function]
     cls.add_method('GetAddress', 
                    'ns3::Mac48Address', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): ns3::Mac48Address ns3::WifiMac::GetBssid() const [member function]
-    cls.add_method('GetBssid', 
-                   'ns3::Mac48Address', 
-                   [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::NetDevice> ns3::WifiMac::GetDevice() const [member function]
-    cls.add_method('GetDevice', 
-                   'ns3::Ptr< ns3::NetDevice >', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::HeConfiguration> ns3::WifiMac::GetHeConfiguration() const [member function]
-    cls.add_method('GetHeConfiguration', 
-                   'ns3::Ptr< ns3::HeConfiguration >', 
-                   [], 
                    is_const=True)
-    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::HtConfiguration> ns3::WifiMac::GetHtConfiguration() const [member function]
-    cls.add_method('GetHtConfiguration', 
-                   'ns3::Ptr< ns3::HtConfiguration >', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::GetShortSlotTimeSupported() const [member function]
-    cls.add_method('GetShortSlotTimeSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## wifi-mac.h (module 'wifi'): ns3::Ssid ns3::WifiMac::GetSsid() const [member function]
     cls.add_method('GetSsid', 
                    'ns3::Ssid', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): static ns3::TypeId ns3::WifiMac::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## wifi-mac.h (module 'wifi'): ns3::TypeOfStation ns3::WifiMac::GetTypeOfStation() const [member function]
-    cls.add_method('GetTypeOfStation', 
-                   'ns3::TypeOfStation', 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetAddress(ns3::Mac48Address address) [member function]
+    cls.add_method('SetAddress', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Mac48Address ns3::WifiMac::GetBssid() const [member function]
+    cls.add_method('GetBssid', 
+                   'ns3::Mac48Address', 
                    [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetBssid(ns3::Mac48Address bssid) [member function]
+    cls.add_method('SetBssid', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'bssid')])
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::CanForwardPacketsTo(ns3::Mac48Address to) const [member function]
+    cls.add_method('CanForwardPacketsTo', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'to')], 
                    is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::VhtConfiguration> ns3::WifiMac::GetVhtConfiguration() const [member function]
-    cls.add_method('GetVhtConfiguration', 
-                   'ns3::Ptr< ns3::VhtConfiguration >', 
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to, ns3::Mac48Address from) [member function]
+    cls.add_method('Enqueue', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to'), param('ns3::Mac48Address', 'from')], 
+                   is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to) [member function]
+    cls.add_method('Enqueue', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::SupportsSendFrom() const [member function]
+    cls.add_method('SupportsSendFrom', 
+                   'bool', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetWifiPhy(ns3::Ptr<ns3::WifiPhy> phy) [member function]
+    cls.add_method('SetWifiPhy', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPhy >', 'phy')], 
+                   is_virtual=True)
     ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiPhy> ns3::WifiMac::GetWifiPhy() const [member function]
     cls.add_method('GetWifiPhy', 
                    'ns3::Ptr< ns3::WifiPhy >', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::ResetWifiPhy() [member function]
+    cls.add_method('ResetWifiPhy', 
+                   'void', 
+                   [])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetWifiRemoteStationManager(ns3::Ptr<ns3::WifiRemoteStationManager> stationManager) [member function]
+    cls.add_method('SetWifiRemoteStationManager', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiRemoteStationManager >', 'stationManager')])
     ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiRemoteStationManager> ns3::WifiMac::GetWifiRemoteStationManager() const [member function]
     cls.add_method('GetWifiRemoteStationManager', 
                    'ns3::Ptr< ns3::WifiRemoteStationManager >', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyPromiscRx(ns3::Ptr<const ns3::Packet> packet) [member function]
-    cls.add_method('NotifyPromiscRx', 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetForwardUpCallback(ns3::WifiMac::ForwardUpCallback upCallback) [member function]
+    cls.add_method('SetForwardUpCallback', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyRx(ns3::Ptr<const ns3::Packet> packet) [member function]
-    cls.add_method('NotifyRx', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'upCallback')])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetLinkUpCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkUp) [member function]
+    cls.add_method('SetLinkUpCallback', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyRxDrop(ns3::Ptr<const ns3::Packet> packet) [member function]
-    cls.add_method('NotifyRxDrop', 
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkUp')], 
+                   is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetLinkDownCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkDown) [member function]
+    cls.add_method('SetLinkDownCallback', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkDown')])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyChannelSwitching() [member function]
+    cls.add_method('NotifyChannelSwitching', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
     ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyTx(ns3::Ptr<const ns3::Packet> packet) [member function]
     cls.add_method('NotifyTx', 
                    'void', 
@@ -11113,75 +11279,163 @@
     cls.add_method('NotifyTxDrop', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet const >', 'packet')])
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::ResetWifiPhy() [member function]
-    cls.add_method('ResetWifiPhy', 
-                   'void', 
-                   [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetAddress(ns3::Mac48Address address) [member function]
-    cls.add_method('SetAddress', 
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyRx(ns3::Ptr<const ns3::Packet> packet) [member function]
+    cls.add_method('NotifyRx', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetDevice(ns3::Ptr<ns3::NetDevice> const device) [member function]
-    cls.add_method('SetDevice', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyPromiscRx(ns3::Ptr<const ns3::Packet> packet) [member function]
+    cls.add_method('NotifyPromiscRx', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NetDevice > const', 'device')])
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetForwardUpCallback(ns3::WifiMac::ForwardUpCallback upCallback) [member function]
-    cls.add_method('SetForwardUpCallback', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyRxDrop(ns3::Ptr<const ns3::Packet> packet) [member function]
+    cls.add_method('NotifyRxDrop', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'upCallback')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetLinkDownCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkDown) [member function]
-    cls.add_method('SetLinkDownCallback', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::ConfigureStandard(ns3::WifiStandard standard) [member function]
+    cls.add_method('ConfigureStandard', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkDown')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetLinkUpCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkUp) [member function]
-    cls.add_method('SetLinkUpCallback', 
+                   [param('ns3::WifiStandard', 'standard')], 
+                   is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::HtConfiguration> ns3::WifiMac::GetHtConfiguration() const [member function]
+    cls.add_method('GetHtConfiguration', 
+                   'ns3::Ptr< ns3::HtConfiguration >', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::VhtConfiguration> ns3::WifiMac::GetVhtConfiguration() const [member function]
+    cls.add_method('GetVhtConfiguration', 
+                   'ns3::Ptr< ns3::VhtConfiguration >', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::HeConfiguration> ns3::WifiMac::GetHeConfiguration() const [member function]
+    cls.add_method('GetHeConfiguration', 
+                   'ns3::Ptr< ns3::HeConfiguration >', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::ExtendedCapabilities ns3::WifiMac::GetExtendedCapabilities() const [member function]
+    cls.add_method('GetExtendedCapabilities', 
+                   'ns3::ExtendedCapabilities', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::HtCapabilities ns3::WifiMac::GetHtCapabilities() const [member function]
+    cls.add_method('GetHtCapabilities', 
+                   'ns3::HtCapabilities', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::VhtCapabilities ns3::WifiMac::GetVhtCapabilities() const [member function]
+    cls.add_method('GetVhtCapabilities', 
+                   'ns3::VhtCapabilities', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::HeCapabilities ns3::WifiMac::GetHeCapabilities() const [member function]
+    cls.add_method('GetHeCapabilities', 
+                   'ns3::HeCapabilities', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::GetQosSupported() const [member function]
+    cls.add_method('GetQosSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::GetErpSupported() const [member function]
+    cls.add_method('GetErpSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::GetDsssSupported() const [member function]
+    cls.add_method('GetDsssSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::GetHtSupported() const [member function]
+    cls.add_method('GetHtSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::GetVhtSupported() const [member function]
+    cls.add_method('GetVhtSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::GetHeSupported() const [member function]
+    cls.add_method('GetHeSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): uint32_t ns3::WifiMac::GetMaxAmpduSize(ns3::AcIndex ac) const [member function]
+    cls.add_method('GetMaxAmpduSize', 
+                   'uint32_t', 
+                   [param('ns3::AcIndex', 'ac')], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): uint16_t ns3::WifiMac::GetMaxAmsduSize(ns3::AcIndex ac) const [member function]
+    cls.add_method('GetMaxAmsduSize', 
+                   'uint16_t', 
+                   [param('ns3::AcIndex', 'ac')], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkUp')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetPromisc() [member function]
-    cls.add_method('SetPromisc', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::DoDispose() [member function]
+    cls.add_method('DoDispose', 
                    'void', 
                    [], 
-                   is_pure_virtual=True, is_virtual=True)
+                   is_virtual=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::ConfigureContentionWindow(uint32_t cwMin, uint32_t cwMax) [member function]
+    cls.add_method('ConfigureContentionWindow', 
+                   'void', 
+                   [param('uint32_t', 'cwMin'), param('uint32_t', 'cwMax')], 
+                   is_virtual=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetQosSupported(bool enable) [member function]
+    cls.add_method('SetQosSupported', 
+                   'void', 
+                   [param('bool', 'enable')], 
+                   visibility='protected')
     ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetShortSlotTimeSupported(bool enable) [member function]
     cls.add_method('SetShortSlotTimeSupported', 
                    'void', 
                    [param('bool', 'enable')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetSsid(ns3::Ssid ssid) [member function]
-    cls.add_method('SetSsid', 
-                   'void', 
-                   [param('ns3::Ssid', 'ssid')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetTypeOfStation(ns3::TypeOfStation type) [member function]
-    cls.add_method('SetTypeOfStation', 
-                   'void', 
-                   [param('ns3::TypeOfStation', 'type')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetWifiPhy(ns3::Ptr<ns3::WifiPhy> phy) [member function]
-    cls.add_method('SetWifiPhy', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiPhy >', 'phy')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetWifiRemoteStationManager(ns3::Ptr<ns3::WifiRemoteStationManager> stationManager) [member function]
-    cls.add_method('SetWifiRemoteStationManager', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiRemoteStationManager >', 'stationManager')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::SupportsSendFrom() const [member function]
-    cls.add_method('SupportsSendFrom', 
+                   visibility='protected')
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::GetShortSlotTimeSupported() const [member function]
+    cls.add_method('GetShortSlotTimeSupported', 
                    'bool', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::ConfigureDcf(ns3::Ptr<ns3::Txop> dcf, uint32_t cwmin, uint32_t cwmax, bool isDsss, ns3::AcIndex ac) [member function]
-    cls.add_method('ConfigureDcf', 
+                   is_const=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::WifiMac::GetVOQueue() const [member function]
+    cls.add_method('GetVOQueue', 
+                   'ns3::Ptr< ns3::QosTxop >', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::WifiMac::GetVIQueue() const [member function]
+    cls.add_method('GetVIQueue', 
+                   'ns3::Ptr< ns3::QosTxop >', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::WifiMac::GetBEQueue() const [member function]
+    cls.add_method('GetBEQueue', 
+                   'ns3::Ptr< ns3::QosTxop >', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::WifiMac::GetBKQueue() const [member function]
+    cls.add_method('GetBKQueue', 
+                   'ns3::Ptr< ns3::QosTxop >', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::Receive(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('Receive', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
+                   is_virtual=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::ForwardUp(ns3::Ptr<const ns3::Packet> packet, ns3::Mac48Address from, ns3::Mac48Address to) [member function]
+    cls.add_method('ForwardUp', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Txop >', 'dcf'), param('uint32_t', 'cwmin'), param('uint32_t', 'cwmax'), param('bool', 'isDsss'), param('ns3::AcIndex', 'ac')], 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::Mac48Address', 'from'), param('ns3::Mac48Address', 'to')], 
                    visibility='protected')
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::DeaggregateAmsduAndForward(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('DeaggregateAmsduAndForward', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
+                   is_virtual=True, visibility='protected')
     return
 
 def register_Ns3WifiMacHeader_methods(root_module, cls):
@@ -11619,6 +11873,11 @@
     cls.add_method('GetHeader', 
                    'ns3::WifiMacHeader &', 
                    [])
+    ## wifi-mac-queue-item.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::WifiMacQueueItem::GetItem() const [member function]
+    cls.add_method('GetItem', 
+                   'ns3::Ptr< ns3::WifiMacQueueItem >', 
+                   [], 
+                   is_const=True)
     ## wifi-mac-queue-item.h (module 'wifi'): ns3::Ptr<const ns3::Packet> ns3::WifiMacQueueItem::GetPacket() const [member function]
     cls.add_method('GetPacket', 
                    'ns3::Ptr< ns3::Packet const >', 
@@ -11639,11 +11898,6 @@
                    'ns3::AcIndex', 
                    [], 
                    is_const=True)
-    ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem::ConstIterator ns3::WifiMacQueueItem::GetQueueIterator() const [member function]
-    cls.add_method('GetQueueIterator', 
-                   'ns3::WifiMacQueueItem::ConstIterator', 
-                   [], 
-                   is_const=True)
     ## wifi-mac-queue-item.h (module 'wifi'): uint32_t ns3::WifiMacQueueItem::GetSize() const [member function]
     cls.add_method('GetSize', 
                    'uint32_t', 
@@ -11732,7 +11986,7 @@
 def register_Ns3WifiNoProtection_methods(root_module, cls):
     ## wifi-protection.h (module 'wifi'): ns3::WifiNoProtection::WifiNoProtection() [constructor]
     cls.add_constructor([])
-    ## wifi-protection.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection> > ns3::WifiNoProtection::Copy() const [member function]
+    ## wifi-protection.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection>> ns3::WifiNoProtection::Copy() const [member function]
     cls.add_method('Copy', 
                    'std::unique_ptr< ns3::WifiProtection, std::default_delete< ns3::WifiProtection > >', 
                    [], 
@@ -11790,10 +12044,10 @@
                    'ns3::Time', 
                    [param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'psduMap'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiPhyBand', 'band')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::ConfigureStandardAndBand(ns3::WifiPhyStandard standard, ns3::WifiPhyBand band) [member function]
-    cls.add_method('ConfigureStandardAndBand', 
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::ConfigureStandard(ns3::WifiStandard standard) [member function]
+    cls.add_method('ConfigureStandard', 
                    'void', 
-                   [param('ns3::WifiPhyStandard', 'standard'), param('ns3::WifiPhyBand', 'band')], 
+                   [param('ns3::WifiStandard', 'standard')], 
                    is_virtual=True)
     ## wifi-phy.h (module 'wifi'): ns3::WifiSpectrumBand ns3::WifiPhy::ConvertHeRuSubcarriers(uint16_t bandWidth, uint16_t guardBandwidth, ns3::HeRu::SubcarrierRange range, uint8_t bandIndex=0) const [member function]
     cls.add_method('ConvertHeRuSubcarriers', 
@@ -11814,7 +12068,7 @@
                    'ns3::Time', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): std::list<unsigned char, std::allocator<unsigned char> > ns3::WifiPhy::GetBssMembershipSelectorList() const [member function]
+    ## wifi-phy.h (module 'wifi'): std::list<unsigned char, std::allocator<unsigned char>> ns3::WifiPhy::GetBssMembershipSelectorList() const [member function]
     cls.add_method('GetBssMembershipSelectorList', 
                    'std::list< unsigned char >', 
                    [], 
@@ -11853,9 +12107,9 @@
     cls.add_method('GetDelayUntilIdle', 
                    'ns3::Time', 
                    [])
-    ## wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::NetDevice> ns3::WifiPhy::GetDevice() const [member function]
+    ## wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::WifiNetDevice> ns3::WifiPhy::GetDevice() const [member function]
     cls.add_method('GetDevice', 
-                   'ns3::Ptr< ns3::NetDevice >', 
+                   'ns3::Ptr< ns3::WifiNetDevice >', 
                    [], 
                    is_const=True)
     ## wifi-phy.h (module 'wifi'): uint16_t ns3::WifiPhy::GetFrequency() const [member function]
@@ -11898,12 +12152,12 @@
                    'ns3::WifiMode', 
                    [param('ns3::WifiModulationClass', 'modulation'), param('uint8_t', 'mcs')], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> > ns3::WifiPhy::GetMcsList() const [member function]
+    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode>> ns3::WifiPhy::GetMcsList() const [member function]
     cls.add_method('GetMcsList', 
                    'std::list< ns3::WifiMode >', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> > ns3::WifiPhy::GetMcsList(ns3::WifiModulationClass modulation) const [member function]
+    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode>> ns3::WifiPhy::GetMcsList(ns3::WifiModulationClass modulation) const [member function]
     cls.add_method('GetMcsList', 
                    'std::list< ns3::WifiMode >', 
                    [param('ns3::WifiModulationClass', 'modulation')], 
@@ -11913,12 +12167,12 @@
                    'ns3::Ptr< ns3::MobilityModel >', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> > ns3::WifiPhy::GetModeList() const [member function]
+    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode>> ns3::WifiPhy::GetModeList() const [member function]
     cls.add_method('GetModeList', 
                    'std::list< ns3::WifiMode >', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> > ns3::WifiPhy::GetModeList(ns3::WifiModulationClass modulation) const [member function]
+    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode>> ns3::WifiPhy::GetModeList(ns3::WifiModulationClass modulation) const [member function]
     cls.add_method('GetModeList', 
                    'std::list< ns3::WifiMode >', 
                    [param('ns3::WifiModulationClass', 'modulation')], 
@@ -11963,11 +12217,6 @@
                    'ns3::Ptr< ns3::PhyEntity >', 
                    [param('ns3::WifiModulationClass', 'modulation')], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): ns3::WifiPhyStandard ns3::WifiPhy::GetPhyStandard() const [member function]
-    cls.add_method('GetPhyStandard', 
-                   'ns3::WifiPhyStandard', 
-                   [], 
-                   is_const=True)
     ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetPifs() const [member function]
     cls.add_method('GetPifs', 
                    'ns3::Time', 
@@ -11988,6 +12237,16 @@
                    'uint64_t', 
                    [], 
                    is_const=True)
+    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetPrimary20Index() const [member function]
+    cls.add_method('GetPrimary20Index', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetPrimaryChannelNumber(uint16_t primaryChannelWidth) const [member function]
+    cls.add_method('GetPrimaryChannelNumber', 
+                   'uint8_t', 
+                   [param('uint16_t', 'primaryChannelWidth')], 
+                   is_const=True)
     ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetRxGain() const [member function]
     cls.add_method('GetRxGain', 
                    'double', 
@@ -12013,6 +12272,11 @@
                    'ns3::Time', 
                    [], 
                    is_const=True)
+    ## wifi-phy.h (module 'wifi'): ns3::WifiStandard ns3::WifiPhy::GetStandard() const [member function]
+    cls.add_method('GetStandard', 
+                   'ns3::WifiStandard', 
+                   [], 
+                   is_const=True)
     ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetStartOfPacketDuration(ns3::WifiTxVector const & txVector) [member function]
     cls.add_method('GetStartOfPacketDuration', 
                    'ns3::Time', 
@@ -12028,7 +12292,7 @@
                    'ns3::Ptr< ns3::PhyEntity const > const', 
                    [param('ns3::WifiModulationClass', 'modulation')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): std::vector<unsigned short, std::allocator<unsigned short> > ns3::WifiPhy::GetSupportedChannelWidthSet() const [member function]
+    ## wifi-phy.h (module 'wifi'): std::vector<unsigned short, std::allocator<unsigned short>> ns3::WifiPhy::GetSupportedChannelWidthSet() const [member function]
     cls.add_method('GetSupportedChannelWidthSet', 
                    'std::vector< unsigned short >', 
                    [], 
@@ -12117,7 +12381,7 @@
     cls.add_method('NotifyChannelAccessRequested', 
                    'void', 
                    [])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyMonitorSniffRx(ns3::Ptr<const ns3::WifiPsdu> psdu, uint16_t channelFreqMhz, ns3::WifiTxVector txVector, ns3::SignalNoiseDbm signalNoise, std::vector<bool, std::allocator<bool> > statusPerMpdu, uint16_t staId=65535) [member function]
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyMonitorSniffRx(ns3::Ptr<const ns3::WifiPsdu> psdu, uint16_t channelFreqMhz, ns3::WifiTxVector txVector, ns3::SignalNoiseDbm signalNoise, std::vector<bool, std::allocator<bool>> statusPerMpdu, uint16_t staId=65535) [member function]
     cls.add_method('NotifyMonitorSniffRx', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('uint16_t', 'channelFreqMhz'), param('ns3::WifiTxVector', 'txVector'), param('ns3::SignalNoiseDbm', 'signalNoise'), param('std::vector< bool >', 'statusPerMpdu'), param('uint16_t', 'staId', default_value='65535')])
@@ -12173,10 +12437,10 @@
     cls.add_method('Send', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::Send(ns3::WifiConstPsduMap psdus, ns3::WifiTxVector txVector) [member function]
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::Send(ns3::WifiConstPsduMap psdus, ns3::WifiTxVector const & txVector) [member function]
     cls.add_method('Send', 
                    'void', 
-                   [param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'psdus'), param('ns3::WifiTxVector', 'txVector')])
+                   [param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'psdus'), param('ns3::WifiTxVector const &', 'txVector')])
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetCapabilitiesChangedCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
     cls.add_method('SetCapabilitiesChangedCallback', 
                    'void', 
@@ -12185,20 +12449,10 @@
     cls.add_method('SetCcaEdThreshold', 
                    'void', 
                    [param('double', 'threshold')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetChannelNumber(uint8_t id) [member function]
-    cls.add_method('SetChannelNumber', 
-                   'void', 
-                   [param('uint8_t', 'id')], 
-                   is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetChannelWidth(uint16_t channelWidth) [member function]
-    cls.add_method('SetChannelWidth', 
-                   'void', 
-                   [param('uint16_t', 'channelWidth')], 
-                   is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetDevice(ns3::Ptr<ns3::NetDevice> const device) [member function]
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetDevice(ns3::Ptr<ns3::WifiNetDevice> const device) [member function]
     cls.add_method('SetDevice', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NetDevice > const', 'device')])
+                   [param('ns3::Ptr< ns3::WifiNetDevice > const', 'device')])
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetErrorRateModel(ns3::Ptr<ns3::ErrorRateModel> const rate) [member function]
     cls.add_method('SetErrorRateModel', 
                    'void', 
@@ -12207,11 +12461,6 @@
     cls.add_method('SetFrameCaptureModel', 
                    'void', 
                    [param('ns3::Ptr< ns3::FrameCaptureModel > const', 'frameCaptureModel')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetFrequency(uint16_t freq) [member function]
-    cls.add_method('SetFrequency', 
-                   'void', 
-                   [param('uint16_t', 'freq')], 
-                   is_virtual=True)
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetMaxSupportedRxSpatialStreams(uint8_t streams) [member function]
     cls.add_method('SetMaxSupportedRxSpatialStreams', 
                    'void', 
@@ -12236,10 +12485,10 @@
     cls.add_method('SetOffMode', 
                    'void', 
                    [])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetOperatingChannel(uint8_t number, uint16_t frequency, uint16_t width) [member function]
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetOperatingChannel(ns3::WifiPhy::ChannelTuple const & channelTuple) [member function]
     cls.add_method('SetOperatingChannel', 
                    'void', 
-                   [param('uint8_t', 'number'), param('uint16_t', 'frequency'), param('uint16_t', 'width')])
+                   [param('ns3::WifiPhy::ChannelTuple const &', 'channelTuple')])
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetPifs(ns3::Time pifs) [member function]
     cls.add_method('SetPifs', 
                    'void', 
@@ -12252,10 +12501,6 @@
     cls.add_method('SetPreambleDetectionModel', 
                    'void', 
                    [param('ns3::Ptr< ns3::PreambleDetectionModel > const', 'preambleDetectionModel')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetPrimary20Index(uint8_t index) [member function]
-    cls.add_method('SetPrimary20Index', 
-                   'void', 
-                   [param('uint8_t', 'index')])
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetReceiveErrorCallback(ns3::RxErrorCallback callback) [member function]
     cls.add_method('SetReceiveErrorCallback', 
                    'void', 
@@ -12321,18 +12566,16 @@
     cls.add_method('UnregisterListener', 
                    'void', 
                    [param('ns3::WifiPhyListener *', 'listener')])
-    ## wifi-phy.h (module 'wifi'): ns3::WifiPhy::m_frequencyChannels [variable]
-    cls.add_static_attribute('m_frequencyChannels', 'std::set< std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand > > const', is_const=True)
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::AddPhyEntity(ns3::WifiModulationClass modulation, ns3::Ptr<ns3::PhyEntity> phyEntity) [member function]
     cls.add_method('AddPhyEntity', 
                    'void', 
                    [param('ns3::WifiModulationClass', 'modulation'), param('ns3::Ptr< ns3::PhyEntity >', 'phyEntity')], 
                    visibility='protected')
-    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::DoChannelSwitch() [member function]
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::DoChannelSwitch() [member function]
     cls.add_method('DoChannelSwitch', 
-                   'ns3::Time', 
+                   'void', 
                    [], 
-                   visibility='protected')
+                   is_virtual=True, visibility='protected')
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
@@ -12343,6 +12586,11 @@
                    'ns3::WifiSpectrumBand', 
                    [param('uint16_t', 'bandWidth'), param('uint8_t', 'bandIndex', default_value='0')], 
                    is_virtual=True, visibility='protected')
+    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetDelayUntilChannelSwitch() [member function]
+    cls.add_method('GetDelayUntilChannelSwitch', 
+                   'ns3::Time', 
+                   [], 
+                   visibility='protected')
     ## wifi-phy.h (module 'wifi'): uint16_t ns3::WifiPhy::GetMeasurementChannelWidth(ns3::Ptr<const ns3::WifiPpdu> const ppdu) const [member function]
     cls.add_method('GetMeasurementChannelWidth', 
                    'uint16_t', 
@@ -12458,7 +12706,7 @@
     cls.add_method('SwitchFromRxEndError', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('double', 'snr')])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchFromRxEndOk(ns3::Ptr<ns3::WifiPsdu> psdu, ns3::RxSignalInfo rxSignalInfo, ns3::WifiTxVector txVector, uint16_t staId, std::vector<bool, std::allocator<bool> > statusPerMpdu) [member function]
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchFromRxEndOk(ns3::Ptr<ns3::WifiPsdu> psdu, ns3::RxSignalInfo rxSignalInfo, ns3::WifiTxVector txVector, uint16_t staId, std::vector<bool, std::allocator<bool>> statusPerMpdu) [member function]
     cls.add_method('SwitchFromRxEndOk', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('ns3::RxSignalInfo', 'rxSignalInfo'), param('ns3::WifiTxVector', 'txVector'), param('uint16_t', 'staId'), param('std::vector< bool >', 'statusPerMpdu')])
@@ -12594,16 +12842,16 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## wifi-protection-manager.h (module 'wifi'): void ns3::WifiProtectionManager::SetWifiMac(ns3::Ptr<ns3::RegularWifiMac> mac) [member function]
+    ## wifi-protection-manager.h (module 'wifi'): void ns3::WifiProtectionManager::SetWifiMac(ns3::Ptr<ns3::WifiMac> mac) [member function]
     cls.add_method('SetWifiMac', 
                    'void', 
-                   [param('ns3::Ptr< ns3::RegularWifiMac >', 'mac')])
-    ## wifi-protection-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection> > ns3::WifiProtectionManager::TryAddMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters const & txParams) [member function]
+                   [param('ns3::Ptr< ns3::WifiMac >', 'mac')])
+    ## wifi-protection-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection>> ns3::WifiProtectionManager::TryAddMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters const & txParams) [member function]
     cls.add_method('TryAddMpdu', 
                    'std::unique_ptr< ns3::WifiProtection, std::default_delete< ns3::WifiProtection > >', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::WifiTxParameters const &', 'txParams')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## wifi-protection-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection> > ns3::WifiProtectionManager::TryAggregateMsdu(ns3::Ptr<const ns3::WifiMacQueueItem> msdu, ns3::WifiTxParameters const & txParams) [member function]
+    ## wifi-protection-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection>> ns3::WifiProtectionManager::TryAggregateMsdu(ns3::Ptr<const ns3::WifiMacQueueItem> msdu, ns3::WifiTxParameters const & txParams) [member function]
     cls.add_method('TryAggregateMsdu', 
                    'std::unique_ptr< ns3::WifiProtection, std::default_delete< ns3::WifiProtection > >', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'msdu'), param('ns3::WifiTxParameters const &', 'txParams')], 
@@ -12625,7 +12873,7 @@
     cls.add_constructor([param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('bool', 'isSingle')])
     ## wifi-psdu.h (module 'wifi'): ns3::WifiPsdu::WifiPsdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, bool isSingle) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('bool', 'isSingle')])
-    ## wifi-psdu.h (module 'wifi'): ns3::WifiPsdu::WifiPsdu(std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > > mpduList) [constructor]
+    ## wifi-psdu.h (module 'wifi'): ns3::WifiPsdu::WifiPsdu(std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem>>> mpduList) [constructor]
     cls.add_constructor([param('std::vector< ns3::Ptr< ns3::WifiMacQueueItem > >', 'mpduList')])
     ## wifi-psdu.h (module 'wifi'): ns3::WifiMacHeader::QosAckPolicy ns3::WifiPsdu::GetAckPolicyForTid(uint8_t tid) const [member function]
     cls.add_method('GetAckPolicyForTid', 
@@ -12691,7 +12939,7 @@
                    'uint32_t', 
                    [], 
                    is_const=True)
-    ## wifi-psdu.h (module 'wifi'): std::set<unsigned char, std::less<unsigned char>, std::allocator<unsigned char> > ns3::WifiPsdu::GetTids() const [member function]
+    ## wifi-psdu.h (module 'wifi'): std::set<unsigned char, std::less<unsigned char>, std::allocator<unsigned char>> ns3::WifiPsdu::GetTids() const [member function]
     cls.add_method('GetTids', 
                    'std::set< unsigned char >', 
                    [], 
@@ -12724,21 +12972,21 @@
     cls.add_method('SetDuration', 
                    'void', 
                    [param('ns3::Time', 'duration')])
-    ## wifi-psdu.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > >::const_iterator ns3::WifiPsdu::begin() const [member function]
+    ## wifi-psdu.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem>>>::const_iterator ns3::WifiPsdu::begin() const [member function]
     cls.add_method('begin', 
                    'std::vector< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 
                    [], 
                    is_const=True)
-    ## wifi-psdu.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > >::iterator ns3::WifiPsdu::begin() [member function]
+    ## wifi-psdu.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem>>>::iterator ns3::WifiPsdu::begin() [member function]
     cls.add_method('begin', 
                    'std::vector< ns3::Ptr< ns3::WifiMacQueueItem > > iterator', 
                    [])
-    ## wifi-psdu.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > >::const_iterator ns3::WifiPsdu::end() const [member function]
+    ## wifi-psdu.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem>>>::const_iterator ns3::WifiPsdu::end() const [member function]
     cls.add_method('end', 
                    'std::vector< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 
                    [], 
                    is_const=True)
-    ## wifi-psdu.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > >::iterator ns3::WifiPsdu::end() [member function]
+    ## wifi-psdu.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem>>>::iterator ns3::WifiPsdu::end() [member function]
     cls.add_method('end', 
                    'std::vector< ns3::Ptr< ns3::WifiMacQueueItem > > iterator', 
                    [])
@@ -13418,9 +13666,9 @@
                    'ns3::Ptr< ns3::SpectrumModel const >', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## wifi-spectrum-phy-interface.h (module 'wifi'): ns3::Ptr<ns3::AntennaModel> ns3::WifiSpectrumPhyInterface::GetRxAntenna() const [member function]
-    cls.add_method('GetRxAntenna', 
-                   'ns3::Ptr< ns3::AntennaModel >', 
+    ## wifi-spectrum-phy-interface.h (module 'wifi'): ns3::Ptr<ns3::Object> ns3::WifiSpectrumPhyInterface::GetAntenna() const [member function]
+    cls.add_method('GetAntenna', 
+                   'ns3::Ptr< ns3::Object >', 
                    [], 
                    is_const=True, is_virtual=True)
     ## wifi-spectrum-phy-interface.h (module 'wifi'): void ns3::WifiSpectrumPhyInterface::StartRx(ns3::Ptr<ns3::SpectrumSignalParameters> params) [member function]
@@ -13447,6 +13695,8 @@
                    is_virtual=True)
     ## wifi-spectrum-signal-parameters.h (module 'wifi'): ns3::WifiSpectrumSignalParameters::ppdu [variable]
     cls.add_instance_attribute('ppdu', 'ns3::Ptr< ns3::WifiPpdu >', is_const=False)
+    ## wifi-spectrum-signal-parameters.h (module 'wifi'): ns3::WifiSpectrumSignalParameters::txCenterFreq [variable]
+    cls.add_instance_attribute('txCenterFreq', 'uint16_t', is_const=False)
     return
 
 def register_Ns3WifiTxCurrentModel_methods(root_module, cls):
@@ -13717,6 +13967,41 @@
                    is_virtual=True, visibility='private')
     return
 
+def register_Ns3AdhocWifiMac_methods(root_module, cls):
+    ## adhoc-wifi-mac.h (module 'wifi'): static ns3::TypeId ns3::AdhocWifiMac::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## adhoc-wifi-mac.h (module 'wifi'): ns3::AdhocWifiMac::AdhocWifiMac() [constructor]
+    cls.add_constructor([])
+    ## adhoc-wifi-mac.h (module 'wifi'): void ns3::AdhocWifiMac::SetAddress(ns3::Mac48Address address) [member function]
+    cls.add_method('SetAddress', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_virtual=True)
+    ## adhoc-wifi-mac.h (module 'wifi'): void ns3::AdhocWifiMac::SetLinkUpCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkUp) [member function]
+    cls.add_method('SetLinkUpCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkUp')], 
+                   is_virtual=True)
+    ## adhoc-wifi-mac.h (module 'wifi'): void ns3::AdhocWifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to) [member function]
+    cls.add_method('Enqueue', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to')], 
+                   is_virtual=True)
+    ## adhoc-wifi-mac.h (module 'wifi'): bool ns3::AdhocWifiMac::CanForwardPacketsTo(ns3::Mac48Address to) const [member function]
+    cls.add_method('CanForwardPacketsTo', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'to')], 
+                   is_const=True, is_virtual=True)
+    ## adhoc-wifi-mac.h (module 'wifi'): void ns3::AdhocWifiMac::Receive(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('Receive', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
+                   is_virtual=True, visibility='private')
+    return
+
 def register_Ns3AmpduSubframeHeader_methods(root_module, cls):
     ## ampdu-subframe-header.h (module 'wifi'): ns3::AmpduSubframeHeader::AmpduSubframeHeader(ns3::AmpduSubframeHeader const & arg0) [constructor]
     cls.add_constructor([param('ns3::AmpduSubframeHeader const &', 'arg0')])
@@ -13925,6 +14210,113 @@
                    is_static=True)
     return
 
+def register_Ns3ApWifiMac_methods(root_module, cls):
+    ## ap-wifi-mac.h (module 'wifi'): ns3::ApWifiMac::ApWifiMac() [constructor]
+    cls.add_constructor([])
+    ## ap-wifi-mac.h (module 'wifi'): int64_t ns3::ApWifiMac::AssignStreams(int64_t stream) [member function]
+    cls.add_method('AssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')])
+    ## ap-wifi-mac.h (module 'wifi'): bool ns3::ApWifiMac::CanForwardPacketsTo(ns3::Mac48Address to) const [member function]
+    cls.add_method('CanForwardPacketsTo', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'to')], 
+                   is_const=True, is_virtual=True)
+    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to) [member function]
+    cls.add_method('Enqueue', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to')], 
+                   is_virtual=True)
+    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to, ns3::Mac48Address from) [member function]
+    cls.add_method('Enqueue', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to'), param('ns3::Mac48Address', 'from')], 
+                   is_virtual=True)
+    ## ap-wifi-mac.h (module 'wifi'): uint16_t ns3::ApWifiMac::GetAssociationId(ns3::Mac48Address addr) const [member function]
+    cls.add_method('GetAssociationId', 
+                   'uint16_t', 
+                   [param('ns3::Mac48Address', 'addr')], 
+                   is_const=True)
+    ## ap-wifi-mac.h (module 'wifi'): ns3::Time ns3::ApWifiMac::GetBeaconInterval() const [member function]
+    cls.add_method('GetBeaconInterval', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## ap-wifi-mac.h (module 'wifi'): uint8_t ns3::ApWifiMac::GetBufferStatus(uint8_t tid, ns3::Mac48Address address) const [member function]
+    cls.add_method('GetBufferStatus', 
+                   'uint8_t', 
+                   [param('uint8_t', 'tid'), param('ns3::Mac48Address', 'address')], 
+                   is_const=True)
+    ## ap-wifi-mac.h (module 'wifi'): uint8_t ns3::ApWifiMac::GetMaxBufferStatus(ns3::Mac48Address address) const [member function]
+    cls.add_method('GetMaxBufferStatus', 
+                   'uint8_t', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_const=True)
+    ## ap-wifi-mac.h (module 'wifi'): std::map<unsigned short, ns3::Mac48Address, std::less<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Mac48Address>>> const & ns3::ApWifiMac::GetStaList() const [member function]
+    cls.add_method('GetStaList', 
+                   'std::map< unsigned short, ns3::Mac48Address > const &', 
+                   [], 
+                   is_const=True)
+    ## ap-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueue> ns3::ApWifiMac::GetTxopQueue(ns3::AcIndex ac) const [member function]
+    cls.add_method('GetTxopQueue', 
+                   'ns3::Ptr< ns3::WifiMacQueue >', 
+                   [param('ns3::AcIndex', 'ac')], 
+                   is_const=True, is_virtual=True)
+    ## ap-wifi-mac.h (module 'wifi'): static ns3::TypeId ns3::ApWifiMac::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## ap-wifi-mac.h (module 'wifi'): uint16_t ns3::ApWifiMac::GetVhtOperationalChannelWidth() const [member function]
+    cls.add_method('GetVhtOperationalChannelWidth', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::SetAddress(ns3::Mac48Address address) [member function]
+    cls.add_method('SetAddress', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_virtual=True)
+    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::SetBeaconInterval(ns3::Time interval) [member function]
+    cls.add_method('SetBeaconInterval', 
+                   'void', 
+                   [param('ns3::Time', 'interval')])
+    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::SetBufferStatus(uint8_t tid, ns3::Mac48Address address, uint8_t size) [member function]
+    cls.add_method('SetBufferStatus', 
+                   'void', 
+                   [param('uint8_t', 'tid'), param('ns3::Mac48Address', 'address'), param('uint8_t', 'size')])
+    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::SetLinkUpCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkUp) [member function]
+    cls.add_method('SetLinkUpCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkUp')], 
+                   is_virtual=True)
+    ## ap-wifi-mac.h (module 'wifi'): bool ns3::ApWifiMac::SupportsSendFrom() const [member function]
+    cls.add_method('SupportsSendFrom', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::DeaggregateAmsduAndForward(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('DeaggregateAmsduAndForward', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
+                   is_virtual=True, visibility='private')
+    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='private')
+    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='private')
+    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::Receive(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('Receive', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
+                   is_virtual=True, visibility='private')
+    return
+
 def register_Ns3AparfWifiManager_methods(root_module, cls):
     ## aparf-wifi-manager.h (module 'wifi'): ns3::AparfWifiManager::AparfWifiManager(ns3::AparfWifiManager const & arg0) [constructor]
     cls.add_constructor([param('ns3::AparfWifiManager const &', 'arg0')])
@@ -14257,7 +14649,7 @@
     cls.add_method('NotifyMissedAck', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')])
-    ## block-ack-manager.h (module 'wifi'): std::pair<unsigned short, unsigned short> ns3::BlockAckManager::NotifyGotBlockAck(ns3::CtrlBAckResponseHeader const & blockAck, ns3::Mac48Address recipient, std::set<unsigned char, std::less<unsigned char>, std::allocator<unsigned char> > const & tids, size_t index=0) [member function]
+    ## block-ack-manager.h (module 'wifi'): std::pair<unsigned short, unsigned short> ns3::BlockAckManager::NotifyGotBlockAck(ns3::CtrlBAckResponseHeader const & blockAck, ns3::Mac48Address recipient, std::set<unsigned char, std::less<unsigned char>, std::allocator<unsigned char>> const & tids, size_t index=0) [member function]
     cls.add_method('NotifyGotBlockAck', 
                    'std::pair< unsigned short, unsigned short >', 
                    [param('ns3::CtrlBAckResponseHeader const &', 'blockAck'), param('ns3::Mac48Address', 'recipient'), param('std::set< unsigned char > const &', 'tids'), param('size_t', 'index', default_value='0')])
@@ -14438,17 +14830,22 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
+                   is_static=True, template_parameters=['ns3::ObjectBase*'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
                    is_static=True, template_parameters=['void'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiMacQueueItem const> '], visibility='protected')
+                   is_static=True, template_parameters=['double'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::ObjectBase*'], visibility='protected')
+                   is_static=True, template_parameters=['unsigned int'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
@@ -14458,12 +14855,12 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['unsigned int'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::NetDevice> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['double'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::Packet const> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
@@ -14473,157 +14870,157 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['unsigned char'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Address const&'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::WifiTxVector const&'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::NetDevice::PacketType'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['bool'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::WifiTxVector const&'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Mac48Address'], visibility='protected')
+                   is_static=True, template_parameters=['bool'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::Packet const> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Time'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Time'], visibility='protected')
+                   is_static=True, template_parameters=['WifiPhyState'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::OriginatorBlockAckAgreement::State'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::WifiMode'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::WifiMacDropReason'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::WifiPreamble'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::WifiMacHeader const&'], visibility='protected')
+                   is_static=True, template_parameters=['unsigned char'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiPsdu const> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiPsdu> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['std::unordered_map<unsigned short', ' ns3::Ptr<ns3::WifiPsdu>', ' std::hash<unsigned short>', ' std::equal_to<unsigned short>', ' std::allocator<std::pair<unsigned short const', ' ns3::Ptr<ns3::WifiPsdu> > > >*'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::RxSignalInfo'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['std::set<ns3::Mac48Address', ' std::less<ns3::Mac48Address>', ' std::allocator<ns3::Mac48Address> > const*'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::WifiTxVector'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::DataRate'], visibility='protected')
+                   is_static=True, template_parameters=['std::vector<bool', ' std::allocator<bool> > '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiMacQueueItem> '], visibility='protected')
+                   is_static=True, template_parameters=['std::unordered_map<unsigned short', ' ns3::Ptr<ns3::WifiPsdu const>', ' std::hash<unsigned short>', ' std::equal_to<unsigned short>', ' std::allocator<std::pair<unsigned short const', ' ns3::Ptr<ns3::WifiPsdu const> > > > '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['WifiPhyState'], visibility='protected')
+                   is_static=True, template_parameters=['std::map<std::pair<unsigned int', ' unsigned int>', ' double', ' std::less<std::pair<unsigned int', ' unsigned int> >', ' std::allocator<std::pair<std::pair<unsigned int', ' unsigned int> const', ' double> > > '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::WifiMode'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::WifiPhyRxfailureReason'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::WifiPreamble'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::MpduInfo'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiPsdu> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::SignalNoiseDbm'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::RxSignalInfo'], visibility='protected')
+                   is_static=True, template_parameters=['int'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::WifiTxVector'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Mac48Address'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['std::vector<bool', ' std::allocator<bool> > '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::WifiMacHeader const&'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['std::unordered_map<unsigned short', ' ns3::Ptr<ns3::WifiPsdu const>', ' std::hash<unsigned short>', ' std::equal_to<unsigned short>', ' std::allocator<std::pair<unsigned short const', ' ns3::Ptr<ns3::WifiPsdu const> > > > '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::WifiMacDropReason'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['std::map<std::pair<unsigned int', ' unsigned int>', ' double', ' std::less<std::pair<unsigned int', ' unsigned int> >', ' std::allocator<std::pair<std::pair<unsigned int', ' unsigned int> const', ' double> > > '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiMacQueueItem const> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::WifiPhyRxfailureReason'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiPsdu const> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::MpduInfo'], visibility='protected')
+                   is_static=True, template_parameters=['std::unordered_map<unsigned short', ' ns3::Ptr<ns3::WifiPsdu>', ' std::hash<unsigned short>', ' std::equal_to<unsigned short>', ' std::allocator<std::pair<unsigned short const', ' ns3::Ptr<ns3::WifiPsdu> > > >*'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::SignalNoiseDbm'], visibility='protected')
+                   is_static=True, template_parameters=['std::set<ns3::Mac48Address', ' std::less<ns3::Mac48Address>', ' std::allocator<ns3::Mac48Address> > const*'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::HeSigAParameters'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::OriginatorBlockAckAgreement::State'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::QueueDiscItem const> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiMacQueueItem> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::NetDevice> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::HeSigAParameters'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Address const&'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::QueueDiscItem const> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::NetDevice::PacketType'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::DataRate'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
@@ -14639,11 +15036,6 @@
                    'std::string', 
                    [], 
                    is_static=True, template_parameters=['ns3::Ptr<ns3::SpectrumSignalParameters> '], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True, template_parameters=['int'], visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -14924,10 +15316,10 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## channel-condition-model.h (module 'propagation'): bool ns3::ChannelCondition::IsEqual(ns3::Ptr<const ns3::ChannelCondition> otherCondition) const [member function]
+    ## channel-condition-model.h (module 'propagation'): bool ns3::ChannelCondition::IsEqual(ns3::ChannelCondition::LosConditionValue losCondition, ns3::ChannelCondition::O2iConditionValue o2iCondition) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
-                   [param('ns3::Ptr< ns3::ChannelCondition const >', 'otherCondition')], 
+                   [param('ns3::ChannelCondition::LosConditionValue', 'losCondition'), param('ns3::ChannelCondition::O2iConditionValue', 'o2iCondition')], 
                    is_const=True)
     ## channel-condition-model.h (module 'propagation'): bool ns3::ChannelCondition::IsI2i() const [member function]
     cls.add_method('IsI2i', 
@@ -15318,7 +15710,7 @@
                    'uint32_t', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_virtual=True)
-    ## ctrl-headers.h (module 'wifi'): std::vector<unsigned int, std::allocator<unsigned int> > ns3::CtrlBAckResponseHeader::FindPerAidTidInfoWithAid(uint16_t aid) const [member function]
+    ## ctrl-headers.h (module 'wifi'): std::vector<unsigned int, std::allocator<unsigned int>> ns3::CtrlBAckResponseHeader::FindPerAidTidInfoWithAid(uint16_t aid) const [member function]
     cls.add_method('FindPerAidTidInfoWithAid', 
                    'std::vector< unsigned int >', 
                    [param('uint16_t', 'aid')], 
@@ -15333,7 +15725,7 @@
                    'uint16_t', 
                    [param('std::size_t', 'index')], 
                    is_const=True)
-    ## ctrl-headers.h (module 'wifi'): std::vector<unsigned char, std::allocator<unsigned char> > const & ns3::CtrlBAckResponseHeader::GetBitmap(std::size_t index=0) const [member function]
+    ## ctrl-headers.h (module 'wifi'): std::vector<unsigned char, std::allocator<unsigned char>> const & ns3::CtrlBAckResponseHeader::GetBitmap(std::size_t index=0) const [member function]
     cls.add_method('GetBitmap', 
                    'std::vector< unsigned char > const &', 
                    [param('std::size_t', 'index', default_value='0')], 
@@ -17181,8 +17573,9 @@
     ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::NotifySwitchingStartNow(ns3::Time duration) [member function]
     cls.add_method('NotifySwitchingStartNow', 
                    'void', 
-                   [param('ns3::Time', 'duration')])
-    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::Receive(ns3::Ptr<ns3::WifiPsdu> psdu, ns3::RxSignalInfo rxSignalInfo, ns3::WifiTxVector txVector, std::vector<bool, std::allocator<bool> > perMpduStatus) [member function]
+                   [param('ns3::Time', 'duration')], 
+                   is_virtual=True)
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::Receive(ns3::Ptr<ns3::WifiPsdu> psdu, ns3::RxSignalInfo rxSignalInfo, ns3::WifiTxVector txVector, std::vector<bool, std::allocator<bool>> perMpduStatus) [member function]
     cls.add_method('Receive', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('ns3::RxSignalInfo', 'rxSignalInfo'), param('ns3::WifiTxVector', 'txVector'), param('std::vector< bool >', 'perMpduStatus')])
@@ -17239,10 +17632,10 @@
                    'void', 
                    [param('ns3::Ptr< ns3::WifiProtectionManager >', 'protectionManager')], 
                    is_virtual=True)
-    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SetWifiMac(ns3::Ptr<ns3::RegularWifiMac> const mac) [member function]
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SetWifiMac(ns3::Ptr<ns3::WifiMac> const mac) [member function]
     cls.add_method('SetWifiMac', 
                    'void', 
-                   [param('ns3::Ptr< ns3::RegularWifiMac > const', 'mac')], 
+                   [param('ns3::Ptr< ns3::WifiMac > const', 'mac')], 
                    is_virtual=True)
     ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SetWifiPhy(ns3::Ptr<ns3::WifiPhy> const phy) [member function]
     cls.add_method('SetWifiPhy', 
@@ -17264,6 +17657,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')], 
                    is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::DoCtsTimeout(ns3::Ptr<ns3::WifiPsdu> psdu) [member function]
+    cls.add_method('DoCtsTimeout', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu')], 
+                   visibility='protected')
     ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
@@ -17274,7 +17672,7 @@
                    'void', 
                    [param('ns3::WifiMacHeader const &', 'rtsHdr'), param('ns3::WifiTxVector &', 'ctsTxVector'), param('double', 'rtsSnr')], 
                    visibility='protected')
-    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::EndReceiveAmpdu(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::RxSignalInfo const & rxSignalInfo, ns3::WifiTxVector const & txVector, std::vector<bool, std::allocator<bool> > const & perMpduStatus) [member function]
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::EndReceiveAmpdu(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::RxSignalInfo const & rxSignalInfo, ns3::WifiTxVector const & txVector, std::vector<bool, std::allocator<bool>> const & perMpduStatus) [member function]
     cls.add_method('EndReceiveAmpdu', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::RxSignalInfo const &', 'rxSignalInfo'), param('ns3::WifiTxVector const &', 'txVector'), param('std::vector< bool > const &', 'perMpduStatus')], 
@@ -17304,6 +17702,11 @@
                    'ns3::Ptr< ns3::WifiMacQueueItem >', 
                    [], 
                    visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): uint32_t ns3::FrameExchangeManager::GetPsduSize(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetPsduSize', 
+                   'uint32_t', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True, visibility='protected')
     ## frame-exchange-manager.h (module 'wifi'): ns3::Time ns3::FrameExchangeManager::GetRtsDurationId(ns3::WifiTxVector const & rtsTxVector, ns3::Time txDuration, ns3::Time response) const [member function]
     cls.add_method('GetRtsDurationId', 
                    'ns3::Time', 
@@ -17323,7 +17726,7 @@
     cls.add_method('NormalAckTimeout', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('ns3::WifiTxVector const &', 'txVector')], 
-                   visibility='protected')
+                   is_virtual=True, visibility='protected')
     ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::NotifyPacketDiscarded(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
     cls.add_method('NotifyPacketDiscarded', 
                    'void', 
@@ -17349,13 +17752,13 @@
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiTxVector const &', 'ackTxVector'), param('ns3::RxSignalInfo const &', 'rxInfo'), param('double', 'snr')], 
                    is_virtual=True, visibility='protected')
-    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::RetransmitMpduAfterMissedAck(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) const [member function]
-    cls.add_method('RetransmitMpduAfterMissedAck', 
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::ReleaseSequenceNumber(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) const [member function]
+    cls.add_method('ReleaseSequenceNumber', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
                    is_const=True, is_virtual=True, visibility='protected')
-    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::RetransmitMpduAfterMissedCts(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) const [member function]
-    cls.add_method('RetransmitMpduAfterMissedCts', 
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::RetransmitMpduAfterMissedAck(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) const [member function]
+    cls.add_method('RetransmitMpduAfterMissedAck', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
                    is_const=True, is_virtual=True, visibility='protected')
@@ -17522,19 +17925,14 @@
                    'uint8_t', 
                    [], 
                    is_const=True)
-    ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetHeLtfAndGiForHePpdus() const [member function]
-    cls.add_method('GetHeLtfAndGiForHePpdus', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
     ## he-capabilities.h (module 'wifi'): uint32_t ns3::HeCapabilities::GetHeMacCapabilitiesInfo1() const [member function]
     cls.add_method('GetHeMacCapabilitiesInfo1', 
                    'uint32_t', 
                    [], 
                    is_const=True)
-    ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetHeMacCapabilitiesInfo2() const [member function]
+    ## he-capabilities.h (module 'wifi'): uint16_t ns3::HeCapabilities::GetHeMacCapabilitiesInfo2() const [member function]
     cls.add_method('GetHeMacCapabilitiesInfo2', 
-                   'uint8_t', 
+                   'uint16_t', 
                    [], 
                    is_const=True)
     ## he-capabilities.h (module 'wifi'): uint64_t ns3::HeCapabilities::GetHePhyCapabilitiesInfo1() const [member function]
@@ -17542,11 +17940,26 @@
                    'uint64_t', 
                    [], 
                    is_const=True)
-    ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetHePhyCapabilitiesInfo2() const [member function]
+    ## he-capabilities.h (module 'wifi'): uint16_t ns3::HeCapabilities::GetHePhyCapabilitiesInfo2() const [member function]
     cls.add_method('GetHePhyCapabilitiesInfo2', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetHePhyCapabilitiesInfo3() const [member function]
+    cls.add_method('GetHePhyCapabilitiesInfo3', 
                    'uint8_t', 
                    [], 
                    is_const=True)
+    ## he-capabilities.h (module 'wifi'): bool ns3::HeCapabilities::GetHePpdu4xHeLtf800nsGi() const [member function]
+    cls.add_method('GetHePpdu4xHeLtf800nsGi', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## he-capabilities.h (module 'wifi'): bool ns3::HeCapabilities::GetHeSuPpdu1xHeLtf800nsGi() const [member function]
+    cls.add_method('GetHeSuPpdu1xHeLtf800nsGi', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetHighestMcsSupported() const [member function]
     cls.add_method('GetHighestMcsSupported', 
                    'uint8_t', 
@@ -17606,18 +18019,22 @@
     cls.add_method('SetChannelWidthSet', 
                    'void', 
                    [param('uint8_t', 'channelWidthSet')])
-    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHeLtfAndGiForHePpdus(uint8_t heLtfAndGiForHePpdus) [member function]
-    cls.add_method('SetHeLtfAndGiForHePpdus', 
-                   'void', 
-                   [param('uint8_t', 'heLtfAndGiForHePpdus')])
-    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHeMacCapabilitiesInfo(uint32_t ctrl1, uint8_t ctrl2) [member function]
+    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHeMacCapabilitiesInfo(uint32_t ctrl1, uint16_t ctrl2) [member function]
     cls.add_method('SetHeMacCapabilitiesInfo', 
                    'void', 
-                   [param('uint32_t', 'ctrl1'), param('uint8_t', 'ctrl2')])
-    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHePhyCapabilitiesInfo(uint64_t ctrl1, uint8_t ctrl2) [member function]
+                   [param('uint32_t', 'ctrl1'), param('uint16_t', 'ctrl2')])
+    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHePhyCapabilitiesInfo(uint64_t ctrl1, uint16_t ctrl2, uint8_t ctrl3) [member function]
     cls.add_method('SetHePhyCapabilitiesInfo', 
                    'void', 
-                   [param('uint64_t', 'ctrl1'), param('uint8_t', 'ctrl2')])
+                   [param('uint64_t', 'ctrl1'), param('uint16_t', 'ctrl2'), param('uint8_t', 'ctrl3')])
+    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHePpdu4xHeLtf800nsGi(bool heSuPpdu4xHeLtf800nsGi) [member function]
+    cls.add_method('SetHePpdu4xHeLtf800nsGi', 
+                   'void', 
+                   [param('bool', 'heSuPpdu4xHeLtf800nsGi')])
+    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHeSuPpdu1xHeLtf800nsGi(bool heSuPpdu1xHeLtf800nsGi) [member function]
+    cls.add_method('SetHeSuPpdu1xHeLtf800nsGi', 
+                   'void', 
+                   [param('bool', 'heSuPpdu1xHeLtf800nsGi')])
     ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHeSupported(uint8_t heSupported) [member function]
     cls.add_method('SetHeSupported', 
                    'void', 
@@ -18655,7 +19072,7 @@
     cls.add_constructor([param('ns3::ListErrorModel const &', 'arg0')])
     ## error-model.h (module 'network'): ns3::ListErrorModel::ListErrorModel() [constructor]
     cls.add_constructor([])
-    ## error-model.h (module 'network'): std::list<unsigned int, std::allocator<unsigned int> > ns3::ListErrorModel::GetList() const [member function]
+    ## error-model.h (module 'network'): std::list<unsigned int, std::allocator<unsigned int>> ns3::ListErrorModel::GetList() const [member function]
     cls.add_method('GetList', 
                    'std::list< unsigned int >', 
                    [], 
@@ -18665,7 +19082,7 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## error-model.h (module 'network'): void ns3::ListErrorModel::SetList(std::list<unsigned int, std::allocator<unsigned int> > const & packetlist) [member function]
+    ## error-model.h (module 'network'): void ns3::ListErrorModel::SetList(std::list<unsigned int, std::allocator<unsigned int>> const & packetlist) [member function]
     cls.add_method('SetList', 
                    'void', 
                    [param('std::list< unsigned int > const &', 'packetlist')])
@@ -19190,10 +19607,10 @@
                    'uint32_t', 
                    [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid'), param('ns3::WifiModulationClass', 'modulation')], 
                    is_const=True)
-    ## mpdu-aggregator.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > > ns3::MpduAggregator::GetNextAmpdu(ns3::Ptr<ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters & txParams, ns3::Time availableTime, ns3::WifiMacQueueItem::ConstIterator queueIt) const [member function]
+    ## mpdu-aggregator.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem>>> ns3::MpduAggregator::GetNextAmpdu(ns3::Ptr<ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters & txParams, ns3::Time availableTime) const [member function]
     cls.add_method('GetNextAmpdu', 
                    'std::vector< ns3::Ptr< ns3::WifiMacQueueItem > >', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('ns3::WifiTxParameters &', 'txParams'), param('ns3::Time', 'availableTime'), param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'queueIt')], 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('ns3::WifiTxParameters &', 'txParams'), param('ns3::Time', 'availableTime')], 
                    is_const=True)
     ## mpdu-aggregator.h (module 'wifi'): static uint32_t ns3::MpduAggregator::GetSizeIfAggregated(uint32_t mpduSize, uint32_t ampduSize) [member function]
     cls.add_method('GetSizeIfAggregated', 
@@ -19205,10 +19622,10 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## mpdu-aggregator.h (module 'wifi'): void ns3::MpduAggregator::SetWifiMac(ns3::Ptr<ns3::RegularWifiMac> const mac) [member function]
+    ## mpdu-aggregator.h (module 'wifi'): void ns3::MpduAggregator::SetWifiMac(ns3::Ptr<ns3::WifiMac> const mac) [member function]
     cls.add_method('SetWifiMac', 
                    'void', 
-                   [param('ns3::Ptr< ns3::RegularWifiMac > const', 'mac')])
+                   [param('ns3::Ptr< ns3::WifiMac > const', 'mac')])
     ## mpdu-aggregator.h (module 'wifi'): void ns3::MpduAggregator::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
@@ -19236,10 +19653,10 @@
                    'uint16_t', 
                    [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid'), param('ns3::WifiModulationClass', 'modulation')], 
                    is_const=True)
-    ## msdu-aggregator.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::MsduAggregator::GetNextAmsdu(ns3::Ptr<const ns3::WifiMacQueueItem> peekedItem, ns3::WifiTxParameters & txParams, ns3::Time availableTime, ns3::WifiMacQueueItem::ConstIterator & queueIt) const [member function]
+    ## msdu-aggregator.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::MsduAggregator::GetNextAmsdu(ns3::Ptr<const ns3::WifiMacQueueItem> peekedItem, ns3::WifiTxParameters & txParams, ns3::Time availableTime) const [member function]
     cls.add_method('GetNextAmsdu', 
                    'ns3::Ptr< ns3::WifiMacQueueItem >', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'peekedItem'), param('ns3::WifiTxParameters &', 'txParams'), param('ns3::Time', 'availableTime'), param('ns3::WifiMacQueueItem::ConstIterator &', 'queueIt')], 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'peekedItem'), param('ns3::WifiTxParameters &', 'txParams'), param('ns3::Time', 'availableTime')], 
                    is_const=True)
     ## msdu-aggregator.h (module 'wifi'): static uint16_t ns3::MsduAggregator::GetSizeIfAggregated(uint16_t msduSize, uint16_t amsduSize) [member function]
     cls.add_method('GetSizeIfAggregated', 
@@ -19251,10 +19668,10 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## msdu-aggregator.h (module 'wifi'): void ns3::MsduAggregator::SetWifiMac(ns3::Ptr<ns3::RegularWifiMac> const mac) [member function]
+    ## msdu-aggregator.h (module 'wifi'): void ns3::MsduAggregator::SetWifiMac(ns3::Ptr<ns3::WifiMac> const mac) [member function]
     cls.add_method('SetWifiMac', 
                    'void', 
-                   [param('ns3::Ptr< ns3::RegularWifiMac > const', 'mac')])
+                   [param('ns3::Ptr< ns3::WifiMac > const', 'mac')])
     ## msdu-aggregator.h (module 'wifi'): void ns3::MsduAggregator::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
@@ -19434,10 +19851,10 @@
     cls.add_constructor([])
     ## multi-user-scheduler.h (module 'wifi'): ns3::MultiUserScheduler::UlMuInfo::UlMuInfo(ns3::MultiUserScheduler::UlMuInfo const & arg0) [constructor]
     cls.add_constructor([param('ns3::MultiUserScheduler::UlMuInfo const &', 'arg0')])
-    ## multi-user-scheduler.h (module 'wifi'): ns3::MultiUserScheduler::UlMuInfo::tbPpduDuration [variable]
-    cls.add_instance_attribute('tbPpduDuration', 'ns3::Time', is_const=False)
+    ## multi-user-scheduler.h (module 'wifi'): ns3::MultiUserScheduler::UlMuInfo::macHdr [variable]
+    cls.add_instance_attribute('macHdr', 'ns3::WifiMacHeader', is_const=False)
     ## multi-user-scheduler.h (module 'wifi'): ns3::MultiUserScheduler::UlMuInfo::trigger [variable]
-    cls.add_instance_attribute('trigger', 'ns3::Ptr< ns3::WifiMacQueueItem >', is_const=False)
+    cls.add_instance_attribute('trigger', 'ns3::CtrlTriggerHeader', is_const=False)
     ## multi-user-scheduler.h (module 'wifi'): ns3::MultiUserScheduler::UlMuInfo::txParams [variable]
     cls.add_instance_attribute('txParams', 'ns3::WifiTxParameters', is_const=False)
     return
@@ -19679,10 +20096,16 @@
     cls.add_method('ExtractNeighborIndex', 
                    'uint32_t', 
                    [param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetEpoch() const [member function]
+    cls.add_method('GetEpoch', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() const [member function]
     cls.add_method('GetRemainingBits', 
                    'uint32_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -19693,6 +20116,10 @@
                    'uint32_t', 
                    [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
+    ## nix-vector.h (module 'network'): void ns3::NixVector::SetEpoch(uint32_t epoch) [member function]
+    cls.add_method('SetEpoch', 
+                   'void', 
+                   [param('uint32_t', 'epoch')])
     return
 
 def register_Ns3Node_methods(root_module, cls):
@@ -20238,10 +20665,11 @@
                    'uint32_t', 
                    [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) const [member function]
     cls.add_method('SetNixVector', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')], 
+                   is_const=True)
     ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
     cls.add_method('ToString', 
                    'std::string', 
@@ -20522,12 +20950,12 @@
     cls.add_method('Transmit', 
                    'void', 
                    [param('ns3::Time', 'txDuration'), param('ns3::Ptr< ns3::WifiPpdu >', 'ppdu'), param('std::string', 'type')])
-    ## phy-entity.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> >::const_iterator ns3::PhyEntity::begin() const [member function]
+    ## phy-entity.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode>>::const_iterator ns3::PhyEntity::begin() const [member function]
     cls.add_method('begin', 
                    'std::list< ns3::WifiMode > const_iterator', 
                    [], 
                    is_const=True)
-    ## phy-entity.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> >::const_iterator ns3::PhyEntity::end() const [member function]
+    ## phy-entity.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode>>::const_iterator ns3::PhyEntity::end() const [member function]
     cls.add_method('end', 
                    'std::list< ns3::WifiMode > const_iterator', 
                    [], 
@@ -20612,7 +21040,7 @@
                    'uint16_t', 
                    [param('ns3::WifiTxVector const &', 'txVector')], 
                    is_const=True, visibility='protected')
-    ## phy-entity.h (module 'wifi'): std::pair<unsigned short, std::pair<unsigned int, unsigned int> > ns3::PhyEntity::GetChannelWidthAndBand(ns3::WifiTxVector const & txVector, uint16_t staId) const [member function]
+    ## phy-entity.h (module 'wifi'): std::pair<unsigned short, std::pair<unsigned int, unsigned int>> ns3::PhyEntity::GetChannelWidthAndBand(ns3::WifiTxVector const & txVector, uint16_t staId) const [member function]
     cls.add_method('GetChannelWidthAndBand', 
                    'std::pair< unsigned short, std::pair< unsigned int, unsigned int > >', 
                    [param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId')], 
@@ -20622,7 +21050,7 @@
                    'ns3::Ptr< ns3::Event const >', 
                    [], 
                    is_const=True, visibility='protected')
-    ## phy-entity.h (module 'wifi'): std::map<std::pair<unsigned long long, ns3::WifiPreamble>, ns3::Ptr<ns3::Event>, std::less<std::pair<unsigned long long, ns3::WifiPreamble> >, std::allocator<std::pair<const std::pair<unsigned long long, ns3::WifiPreamble>, ns3::Ptr<ns3::Event> > > > const & ns3::PhyEntity::GetCurrentPreambleEvents() const [member function]
+    ## phy-entity.h (module 'wifi'): std::map<std::pair<unsigned long long, ns3::WifiPreamble>, ns3::Ptr<ns3::Event>, std::less<std::pair<unsigned long long, ns3::WifiPreamble>>, std::allocator<std::pair<const std::pair<unsigned long long, ns3::WifiPreamble>, ns3::Ptr<ns3::Event>>>> const & ns3::PhyEntity::GetCurrentPreambleEvents() const [member function]
     cls.add_method('GetCurrentPreambleEvents', 
                    'std::map< std::pair< unsigned long long, ns3::WifiPreamble >, ns3::Ptr< ns3::Event > > const &', 
                    [], 
@@ -20677,6 +21105,11 @@
                    'void', 
                    [param('bool', 'reset')], 
                    visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::NotifyPayloadBegin(ns3::WifiTxVector const & txVector, ns3::Time const & payloadDuration) [member function]
+    cls.add_method('NotifyPayloadBegin', 
+                   'void', 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time const &', 'payloadDuration')], 
+                   visibility='protected')
     ## phy-entity.h (module 'wifi'): uint64_t ns3::PhyEntity::ObtainNextUid(ns3::WifiTxVector const & txVector) [member function]
     cls.add_method('ObtainNextUid', 
                    'uint64_t', 
@@ -20947,10 +21380,10 @@
                    'uint32_t', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## qos-txop.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::QosTxop::GetNextMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> peekedItem, ns3::WifiTxParameters & txParams, ns3::Time availableTime, bool initialFrame, ns3::WifiMacQueueItem::ConstIterator & queueIt) [member function]
+    ## qos-txop.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::QosTxop::GetNextMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> peekedItem, ns3::WifiTxParameters & txParams, ns3::Time availableTime, bool initialFrame) [member function]
     cls.add_method('GetNextMpdu', 
                    'ns3::Ptr< ns3::WifiMacQueueItem >', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'peekedItem'), param('ns3::WifiTxParameters &', 'txParams'), param('ns3::Time', 'availableTime'), param('bool', 'initialFrame'), param('ns3::WifiMacQueueItem::ConstIterator &', 'queueIt')])
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'peekedItem'), param('ns3::WifiTxParameters &', 'txParams'), param('ns3::Time', 'availableTime'), param('bool', 'initialFrame')])
     ## qos-txop.h (module 'wifi'): uint16_t ns3::QosTxop::GetNextSequenceNumberFor(ns3::WifiMacHeader const * hdr) [member function]
     cls.add_method('GetNextSequenceNumberFor', 
                    'uint16_t', 
@@ -21008,14 +21441,10 @@
                    'void', 
                    [], 
                    is_virtual=True)
-    ## qos-txop.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::QosTxop::PeekNextMpdu(uint8_t tid=8, ns3::Mac48Address recipient=ns3::Mac48Address::GetBroadcast()) [member function]
+    ## qos-txop.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::QosTxop::PeekNextMpdu(uint8_t tid=8, ns3::Mac48Address recipient=ns3::Mac48Address::GetBroadcast(), ns3::Ptr<const ns3::WifiMacQueueItem> item=nullptr) [member function]
     cls.add_method('PeekNextMpdu', 
                    'ns3::Ptr< ns3::WifiMacQueueItem const >', 
-                   [param('uint8_t', 'tid', default_value='8'), param('ns3::Mac48Address', 'recipient', default_value='ns3::Mac48Address::GetBroadcast()')])
-    ## qos-txop.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::QosTxop::PeekNextMpdu(ns3::WifiMacQueueItem::ConstIterator queueIt, uint8_t tid=8, ns3::Mac48Address recipient=ns3::Mac48Address::GetBroadcast()) [member function]
-    cls.add_method('PeekNextMpdu', 
-                   'ns3::Ptr< ns3::WifiMacQueueItem const >', 
-                   [param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'queueIt'), param('uint8_t', 'tid', default_value='8'), param('ns3::Mac48Address', 'recipient', default_value='ns3::Mac48Address::GetBroadcast()')])
+                   [param('uint8_t', 'tid', default_value='8'), param('ns3::Mac48Address', 'recipient', default_value='ns3::Mac48Address::GetBroadcast()'), param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'item', default_value='nullptr')])
     ## qos-txop.h (module 'wifi'): uint16_t ns3::QosTxop::PeekNextSequenceNumberFor(ns3::WifiMacHeader const * hdr) [member function]
     cls.add_method('PeekNextSequenceNumberFor', 
                    'uint16_t', 
@@ -21521,7 +21950,7 @@
     cls.add_constructor([param('ns3::ReceiveListErrorModel const &', 'arg0')])
     ## error-model.h (module 'network'): ns3::ReceiveListErrorModel::ReceiveListErrorModel() [constructor]
     cls.add_constructor([])
-    ## error-model.h (module 'network'): std::list<unsigned int, std::allocator<unsigned int> > ns3::ReceiveListErrorModel::GetList() const [member function]
+    ## error-model.h (module 'network'): std::list<unsigned int, std::allocator<unsigned int>> ns3::ReceiveListErrorModel::GetList() const [member function]
     cls.add_method('GetList', 
                    'std::list< unsigned int >', 
                    [], 
@@ -21531,7 +21960,7 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## error-model.h (module 'network'): void ns3::ReceiveListErrorModel::SetList(std::list<unsigned int, std::allocator<unsigned int> > const & packetlist) [member function]
+    ## error-model.h (module 'network'): void ns3::ReceiveListErrorModel::SetList(std::list<unsigned int, std::allocator<unsigned int>> const & packetlist) [member function]
     cls.add_method('SetList', 
                    'void', 
                    [param('std::list< unsigned int > const &', 'packetlist')])
@@ -21547,289 +21976,6 @@
                    is_virtual=True, visibility='private')
     return
 
-def register_Ns3RegularWifiMac_methods(root_module, cls):
-    ## regular-wifi-mac.h (module 'wifi'): static ns3::TypeId ns3::RegularWifiMac::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::RegularWifiMac::RegularWifiMac() [constructor]
-    cls.add_constructor([])
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetShortSlotTimeSupported(bool enable) [member function]
-    cls.add_method('SetShortSlotTimeSupported', 
-                   'void', 
-                   [param('bool', 'enable')], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetSsid(ns3::Ssid ssid) [member function]
-    cls.add_method('SetSsid', 
-                   'void', 
-                   [param('ns3::Ssid', 'ssid')], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetAddress(ns3::Mac48Address address) [member function]
-    cls.add_method('SetAddress', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetPromisc() [member function]
-    cls.add_method('SetPromisc', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetShortSlotTimeSupported() const [member function]
-    cls.add_method('GetShortSlotTimeSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ssid ns3::RegularWifiMac::GetSsid() const [member function]
-    cls.add_method('GetSsid', 
-                   'ns3::Ssid', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Mac48Address ns3::RegularWifiMac::GetAddress() const [member function]
-    cls.add_method('GetAddress', 
-                   'ns3::Mac48Address', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Mac48Address ns3::RegularWifiMac::GetBssid() const [member function]
-    cls.add_method('GetBssid', 
-                   'ns3::Mac48Address', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to, ns3::Mac48Address from) [member function]
-    cls.add_method('Enqueue', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to'), param('ns3::Mac48Address', 'from')], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::SupportsSendFrom() const [member function]
-    cls.add_method('SupportsSendFrom', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetWifiPhy(ns3::Ptr<ns3::WifiPhy> const phy) [member function]
-    cls.add_method('SetWifiPhy', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiPhy > const', 'phy')], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiPhy> ns3::RegularWifiMac::GetWifiPhy() const [member function]
-    cls.add_method('GetWifiPhy', 
-                   'ns3::Ptr< ns3::WifiPhy >', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::ResetWifiPhy() [member function]
-    cls.add_method('ResetWifiPhy', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetWifiRemoteStationManager(ns3::Ptr<ns3::WifiRemoteStationManager> const stationManager) [member function]
-    cls.add_method('SetWifiRemoteStationManager', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiRemoteStationManager > const', 'stationManager')], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::ConfigureStandard(ns3::WifiStandard standard) [member function]
-    cls.add_method('ConfigureStandard', 
-                   'void', 
-                   [param('ns3::WifiStandard', 'standard')], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::TypeOfStation ns3::RegularWifiMac::GetTypeOfStation() const [member function]
-    cls.add_method('GetTypeOfStation', 
-                   'ns3::TypeOfStation', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetForwardUpCallback(ns3::WifiMac::ForwardUpCallback upCallback) [member function]
-    cls.add_method('SetForwardUpCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'upCallback')], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetLinkUpCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkUp) [member function]
-    cls.add_method('SetLinkUpCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkUp')], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetLinkDownCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkDown) [member function]
-    cls.add_method('SetLinkDownCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkDown')], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiRemoteStationManager> ns3::RegularWifiMac::GetWifiRemoteStationManager() const [member function]
-    cls.add_method('GetWifiRemoteStationManager', 
-                   'ns3::Ptr< ns3::WifiRemoteStationManager >', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to) [member function]
-    cls.add_method('Enqueue', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::FrameExchangeManager> ns3::RegularWifiMac::GetFrameExchangeManager() const [member function]
-    cls.add_method('GetFrameExchangeManager', 
-                   'ns3::Ptr< ns3::FrameExchangeManager >', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetCtsToSelfSupported(bool enable) [member function]
-    cls.add_method('SetCtsToSelfSupported', 
-                   'void', 
-                   [param('bool', 'enable')])
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetBssid(ns3::Mac48Address bssid) [member function]
-    cls.add_method('SetBssid', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'bssid')])
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::Txop> ns3::RegularWifiMac::GetTxop() const [member function]
-    cls.add_method('GetTxop', 
-                   'ns3::Ptr< ns3::Txop >', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::RegularWifiMac::GetQosTxop(ns3::AcIndex ac) const [member function]
-    cls.add_method('GetQosTxop', 
-                   'ns3::Ptr< ns3::QosTxop >', 
-                   [param('ns3::AcIndex', 'ac')], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::RegularWifiMac::GetQosTxop(uint8_t tid) const [member function]
-    cls.add_method('GetQosTxop', 
-                   'ns3::Ptr< ns3::QosTxop >', 
-                   [param('uint8_t', 'tid')], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueue> ns3::RegularWifiMac::GetTxopQueue(ns3::AcIndex ac) const [member function]
-    cls.add_method('GetTxopQueue', 
-                   'ns3::Ptr< ns3::WifiMacQueue >', 
-                   [param('ns3::AcIndex', 'ac')], 
-                   is_const=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetQosSupported() const [member function]
-    cls.add_method('GetQosSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetErpSupported() const [member function]
-    cls.add_method('GetErpSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetDsssSupported() const [member function]
-    cls.add_method('GetDsssSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetHtSupported() const [member function]
-    cls.add_method('GetHtSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetVhtSupported() const [member function]
-    cls.add_method('GetVhtSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetHeSupported() const [member function]
-    cls.add_method('GetHeSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::ExtendedCapabilities ns3::RegularWifiMac::GetExtendedCapabilities() const [member function]
-    cls.add_method('GetExtendedCapabilities', 
-                   'ns3::ExtendedCapabilities', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::HtCapabilities ns3::RegularWifiMac::GetHtCapabilities() const [member function]
-    cls.add_method('GetHtCapabilities', 
-                   'ns3::HtCapabilities', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::VhtCapabilities ns3::RegularWifiMac::GetVhtCapabilities() const [member function]
-    cls.add_method('GetVhtCapabilities', 
-                   'ns3::VhtCapabilities', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::HeCapabilities ns3::RegularWifiMac::GetHeCapabilities() const [member function]
-    cls.add_method('GetHeCapabilities', 
-                   'ns3::HeCapabilities', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): uint32_t ns3::RegularWifiMac::GetMaxAmpduSize(ns3::AcIndex ac) const [member function]
-    cls.add_method('GetMaxAmpduSize', 
-                   'uint32_t', 
-                   [param('ns3::AcIndex', 'ac')], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): uint16_t ns3::RegularWifiMac::GetMaxAmsduSize(ns3::AcIndex ac) const [member function]
-    cls.add_method('GetMaxAmsduSize', 
-                   'uint16_t', 
-                   [param('ns3::AcIndex', 'ac')], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::DoInitialize() [member function]
-    cls.add_method('DoInitialize', 
-                   'void', 
-                   [], 
-                   is_virtual=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::DoDispose() [member function]
-    cls.add_method('DoDispose', 
-                   'void', 
-                   [], 
-                   is_virtual=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetTypeOfStation(ns3::TypeOfStation type) [member function]
-    cls.add_method('SetTypeOfStation', 
-                   'void', 
-                   [param('ns3::TypeOfStation', 'type')], 
-                   is_virtual=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::RegularWifiMac::GetVOQueue() const [member function]
-    cls.add_method('GetVOQueue', 
-                   'ns3::Ptr< ns3::QosTxop >', 
-                   [], 
-                   is_const=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::RegularWifiMac::GetVIQueue() const [member function]
-    cls.add_method('GetVIQueue', 
-                   'ns3::Ptr< ns3::QosTxop >', 
-                   [], 
-                   is_const=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::RegularWifiMac::GetBEQueue() const [member function]
-    cls.add_method('GetBEQueue', 
-                   'ns3::Ptr< ns3::QosTxop >', 
-                   [], 
-                   is_const=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::RegularWifiMac::GetBKQueue() const [member function]
-    cls.add_method('GetBKQueue', 
-                   'ns3::Ptr< ns3::QosTxop >', 
-                   [], 
-                   is_const=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::ConfigureContentionWindow(uint32_t cwMin, uint32_t cwMax) [member function]
-    cls.add_method('ConfigureContentionWindow', 
-                   'void', 
-                   [param('uint32_t', 'cwMin'), param('uint32_t', 'cwMax')], 
-                   visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::Receive(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('Receive', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
-                   is_virtual=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::ForwardUp(ns3::Ptr<const ns3::Packet> packet, ns3::Mac48Address from, ns3::Mac48Address to) [member function]
-    cls.add_method('ForwardUp', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::Mac48Address', 'from'), param('ns3::Mac48Address', 'to')], 
-                   visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::DeaggregateAmsduAndForward(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('DeaggregateAmsduAndForward', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
-                   is_virtual=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetQosSupported(bool enable) [member function]
-    cls.add_method('SetQosSupported', 
-                   'void', 
-                   [param('bool', 'enable')], 
-                   is_virtual=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetupFrameExchangeManager() [member function]
-    cls.add_method('SetupFrameExchangeManager', 
-                   'void', 
-                   [], 
-                   visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetErpSupported(bool enable) [member function]
-    cls.add_method('SetErpSupported', 
-                   'void', 
-                   [param('bool', 'enable')], 
-                   visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetDsssSupported(bool enable) [member function]
-    cls.add_method('SetDsssSupported', 
-                   'void', 
-                   [param('bool', 'enable')], 
-                   visibility='protected')
-    return
-
 def register_Ns3RrMultiUserScheduler_methods(root_module, cls):
     ## rr-multi-user-scheduler.h (module 'wifi'): ns3::RrMultiUserScheduler::RrMultiUserScheduler(ns3::RrMultiUserScheduler const & arg0) [constructor]
     cls.add_constructor([param('ns3::RrMultiUserScheduler const &', 'arg0')])
@@ -22082,6 +22228,10 @@
     cls.add_constructor([param('ns3::SpectrumChannel const &', 'arg0')])
     ## spectrum-channel.h (module 'spectrum'): ns3::SpectrumChannel::SpectrumChannel() [constructor]
     cls.add_constructor([])
+    ## spectrum-channel.h (module 'spectrum'): void ns3::SpectrumChannel::AddPhasedArraySpectrumPropagationLossModel(ns3::Ptr<ns3::PhasedArraySpectrumPropagationLossModel> loss) [member function]
+    cls.add_method('AddPhasedArraySpectrumPropagationLossModel', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::PhasedArraySpectrumPropagationLossModel >', 'loss')])
     ## spectrum-channel.h (module 'spectrum'): void ns3::SpectrumChannel::AddPropagationLossModel(ns3::Ptr<ns3::PropagationLossModel> loss) [member function]
     cls.add_method('AddPropagationLossModel', 
                    'void', 
@@ -22100,6 +22250,10 @@
                    'void', 
                    [], 
                    is_virtual=True)
+    ## spectrum-channel.h (module 'spectrum'): ns3::Ptr<ns3::PhasedArraySpectrumPropagationLossModel> ns3::SpectrumChannel::GetPhasedArraySpectrumPropagationLossModel() [member function]
+    cls.add_method('GetPhasedArraySpectrumPropagationLossModel', 
+                   'ns3::Ptr< ns3::PhasedArraySpectrumPropagationLossModel >', 
+                   [])
     ## spectrum-channel.h (module 'spectrum'): ns3::Ptr<ns3::PropagationLossModel> ns3::SpectrumChannel::GetPropagationLossModel() [member function]
     cls.add_method('GetPropagationLossModel', 
                    'ns3::Ptr< ns3::PropagationLossModel >', 
@@ -22113,6 +22267,11 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## spectrum-channel.h (module 'spectrum'): void ns3::SpectrumChannel::RemoveRx(ns3::Ptr<ns3::SpectrumPhy> phy) [member function]
+    cls.add_method('RemoveRx', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::SpectrumPhy >', 'phy')], 
+                   is_pure_virtual=True, is_virtual=True)
     ## spectrum-channel.h (module 'spectrum'): void ns3::SpectrumChannel::SetPropagationDelayModel(ns3::Ptr<ns3::PropagationDelayModel> delay) [member function]
     cls.add_method('SetPropagationDelayModel', 
                    'void', 
@@ -22129,15 +22288,20 @@
     cls.add_constructor([param('ns3::SpectrumWifiPhy const &', 'arg0')])
     ## spectrum-wifi-phy.h (module 'wifi'): ns3::SpectrumWifiPhy::SpectrumWifiPhy() [constructor]
     cls.add_constructor([])
-    ## spectrum-wifi-phy.h (module 'wifi'): void ns3::SpectrumWifiPhy::ConfigureStandardAndBand(ns3::WifiPhyStandard standard, ns3::WifiPhyBand band) [member function]
-    cls.add_method('ConfigureStandardAndBand', 
-                   'void', 
-                   [param('ns3::WifiPhyStandard', 'standard'), param('ns3::WifiPhyBand', 'band')], 
-                   is_virtual=True)
     ## spectrum-wifi-phy.h (module 'wifi'): void ns3::SpectrumWifiPhy::CreateWifiSpectrumPhyInterface(ns3::Ptr<ns3::NetDevice> device) [member function]
     cls.add_method('CreateWifiSpectrumPhyInterface', 
                    'void', 
                    [param('ns3::Ptr< ns3::NetDevice >', 'device')])
+    ## spectrum-wifi-phy.h (module 'wifi'): void ns3::SpectrumWifiPhy::DoChannelSwitch() [member function]
+    cls.add_method('DoChannelSwitch', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    ## spectrum-wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::Object> ns3::SpectrumWifiPhy::GetAntenna() const [member function]
+    cls.add_method('GetAntenna', 
+                   'ns3::Ptr< ns3::Object >', 
+                   [], 
+                   is_const=True)
     ## spectrum-wifi-phy.h (module 'wifi'): uint32_t ns3::SpectrumWifiPhy::GetBandBandwidth() const [member function]
     cls.add_method('GetBandBandwidth', 
                    'uint32_t', 
@@ -22153,11 +22317,6 @@
                    'uint16_t', 
                    [param('uint16_t', 'currentChannelWidth')], 
                    is_const=True, is_virtual=True)
-    ## spectrum-wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::AntennaModel> ns3::SpectrumWifiPhy::GetRxAntenna() const [member function]
-    cls.add_method('GetRxAntenna', 
-                   'ns3::Ptr< ns3::AntennaModel >', 
-                   [], 
-                   is_const=True)
     ## spectrum-wifi-phy.h (module 'wifi'): ns3::Ptr<const ns3::SpectrumModel> ns3::SpectrumWifiPhy::GetRxSpectrumModel() [member function]
     cls.add_method('GetRxSpectrumModel', 
                    'ns3::Ptr< ns3::SpectrumModel const >', 
@@ -22180,21 +22339,6 @@
     cls.add_method('SetChannel', 
                    'void', 
                    [param('ns3::Ptr< ns3::SpectrumChannel > const', 'channel')])
-    ## spectrum-wifi-phy.h (module 'wifi'): void ns3::SpectrumWifiPhy::SetChannelNumber(uint8_t id) [member function]
-    cls.add_method('SetChannelNumber', 
-                   'void', 
-                   [param('uint8_t', 'id')], 
-                   is_virtual=True)
-    ## spectrum-wifi-phy.h (module 'wifi'): void ns3::SpectrumWifiPhy::SetChannelWidth(uint16_t channelwidth) [member function]
-    cls.add_method('SetChannelWidth', 
-                   'void', 
-                   [param('uint16_t', 'channelwidth')], 
-                   is_virtual=True)
-    ## spectrum-wifi-phy.h (module 'wifi'): void ns3::SpectrumWifiPhy::SetFrequency(uint16_t freq) [member function]
-    cls.add_method('SetFrequency', 
-                   'void', 
-                   [param('uint16_t', 'freq')], 
-                   is_virtual=True)
     ## spectrum-wifi-phy.h (module 'wifi'): void ns3::SpectrumWifiPhy::StartRx(ns3::Ptr<ns3::SpectrumSignalParameters> rxParams) [member function]
     cls.add_method('StartRx', 
                    'void', 
@@ -22328,6 +22472,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to')], 
                    is_virtual=True)
+    ## sta-wifi-mac.h (module 'wifi'): bool ns3::StaWifiMac::CanForwardPacketsTo(ns3::Mac48Address to) const [member function]
+    cls.add_method('CanForwardPacketsTo', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'to')], 
+                   is_const=True, is_virtual=True)
     ## sta-wifi-mac.h (module 'wifi'): void ns3::StaWifiMac::SetWifiPhy(ns3::Ptr<ns3::WifiPhy> const phy) [member function]
     cls.add_method('SetWifiPhy', 
                    'void', 
@@ -22343,6 +22492,11 @@
                    'uint16_t', 
                    [], 
                    is_const=True)
+    ## sta-wifi-mac.h (module 'wifi'): void ns3::StaWifiMac::NotifyChannelSwitching() [member function]
+    cls.add_method('NotifyChannelSwitching', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
     ## sta-wifi-mac.h (module 'wifi'): void ns3::StaWifiMac::Receive(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
     cls.add_method('Receive', 
                    'void', 
@@ -22429,9 +22583,9 @@
     cls.add_constructor([param('ns3::TableBasedErrorRateModel const &', 'arg0')])
     ## table-based-error-rate-model.h (module 'wifi'): ns3::TableBasedErrorRateModel::TableBasedErrorRateModel() [constructor]
     cls.add_constructor([])
-    ## table-based-error-rate-model.h (module 'wifi'): static uint8_t ns3::TableBasedErrorRateModel::GetMcsForMode(ns3::WifiMode mode) [member function]
+    ## table-based-error-rate-model.h (module 'wifi'): static std::optional<unsigned char> ns3::TableBasedErrorRateModel::GetMcsForMode(ns3::WifiMode mode) [member function]
     cls.add_method('GetMcsForMode', 
-                   'uint8_t', 
+                   'std::optional< unsigned char >', 
                    [param('ns3::WifiMode', 'mode')], 
                    is_static=True)
     ## table-based-error-rate-model.h (module 'wifi'): static ns3::TypeId ns3::TableBasedErrorRateModel::GetTypeId() [member function]
@@ -23227,17 +23381,17 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## wifi-default-protection-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection> > ns3::WifiDefaultProtectionManager::TryAddMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters const & txParams) [member function]
+    ## wifi-default-protection-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection>> ns3::WifiDefaultProtectionManager::TryAddMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters const & txParams) [member function]
     cls.add_method('TryAddMpdu', 
                    'std::unique_ptr< ns3::WifiProtection, std::default_delete< ns3::WifiProtection > >', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::WifiTxParameters const &', 'txParams')], 
                    is_virtual=True)
-    ## wifi-default-protection-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection> > ns3::WifiDefaultProtectionManager::TryAggregateMsdu(ns3::Ptr<const ns3::WifiMacQueueItem> msdu, ns3::WifiTxParameters const & txParams) [member function]
+    ## wifi-default-protection-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection>> ns3::WifiDefaultProtectionManager::TryAggregateMsdu(ns3::Ptr<const ns3::WifiMacQueueItem> msdu, ns3::WifiTxParameters const & txParams) [member function]
     cls.add_method('TryAggregateMsdu', 
                    'std::unique_ptr< ns3::WifiProtection, std::default_delete< ns3::WifiProtection > >', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'msdu'), param('ns3::WifiTxParameters const &', 'txParams')], 
                    is_virtual=True)
-    ## wifi-default-protection-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection> > ns3::WifiDefaultProtectionManager::GetPsduProtection(ns3::WifiMacHeader const & hdr, uint32_t size, ns3::WifiTxVector const & txVector) const [member function]
+    ## wifi-default-protection-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection>> ns3::WifiDefaultProtectionManager::GetPsduProtection(ns3::WifiMacHeader const & hdr, uint32_t size, ns3::WifiTxVector const & txVector) const [member function]
     cls.add_method('GetPsduProtection', 
                    'std::unique_ptr< ns3::WifiProtection, std::default_delete< ns3::WifiProtection > >', 
                    [param('ns3::WifiMacHeader const &', 'hdr'), param('uint32_t', 'size'), param('ns3::WifiTxVector const &', 'txVector')], 
@@ -23270,10 +23424,6 @@
     cls.add_method('PushFront', 
                    'bool', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'item')])
-    ## wifi-mac-queue.h (module 'wifi'): bool ns3::WifiMacQueue::Insert(ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos, ns3::Ptr<ns3::WifiMacQueueItem> item) [member function]
-    cls.add_method('Insert', 
-                   'bool', 
-                   [param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos'), param('ns3::Ptr< ns3::WifiMacQueueItem >', 'item')])
     ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::WifiMacQueue::Dequeue() [member function]
     cls.add_method('Dequeue', 
                    'ns3::Ptr< ns3::WifiMacQueueItem >', 
@@ -23288,39 +23438,39 @@
                    'ns3::Ptr< ns3::WifiMacQueueItem const >', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## wifi-mac-queue.h (module 'wifi'): ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator ns3::WifiMacQueue::PeekByAddress(ns3::Mac48Address dest, ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos=ns3::WifiMacQueue::EMPTY) const [member function]
+    ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::WifiMacQueue::PeekByAddress(ns3::Mac48Address dest, ns3::Ptr<const ns3::WifiMacQueueItem> item=nullptr) const [member function]
     cls.add_method('PeekByAddress', 
-                   'ns3::Queue< ns3::WifiMacQueueItem > ConstIterator', 
-                   [param('ns3::Mac48Address', 'dest'), param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos', default_value='ns3::WifiMacQueue::EMPTY')], 
+                   'ns3::Ptr< ns3::WifiMacQueueItem const >', 
+                   [param('ns3::Mac48Address', 'dest'), param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'item', default_value='nullptr')], 
                    is_const=True)
-    ## wifi-mac-queue.h (module 'wifi'): ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator ns3::WifiMacQueue::PeekByTid(uint8_t tid, ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos=ns3::WifiMacQueue::EMPTY) const [member function]
+    ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::WifiMacQueue::PeekByTid(uint8_t tid, ns3::Ptr<const ns3::WifiMacQueueItem> item=nullptr) const [member function]
     cls.add_method('PeekByTid', 
-                   'ns3::Queue< ns3::WifiMacQueueItem > ConstIterator', 
-                   [param('uint8_t', 'tid'), param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos', default_value='ns3::WifiMacQueue::EMPTY')], 
+                   'ns3::Ptr< ns3::WifiMacQueueItem const >', 
+                   [param('uint8_t', 'tid'), param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'item', default_value='nullptr')], 
                    is_const=True)
-    ## wifi-mac-queue.h (module 'wifi'): ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator ns3::WifiMacQueue::PeekByTidAndAddress(uint8_t tid, ns3::Mac48Address dest, ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos=ns3::WifiMacQueue::EMPTY) const [member function]
+    ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::WifiMacQueue::PeekByTidAndAddress(uint8_t tid, ns3::Mac48Address dest, ns3::Ptr<const ns3::WifiMacQueueItem> item=nullptr) const [member function]
     cls.add_method('PeekByTidAndAddress', 
-                   'ns3::Queue< ns3::WifiMacQueueItem > ConstIterator', 
-                   [param('uint8_t', 'tid'), param('ns3::Mac48Address', 'dest'), param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos', default_value='ns3::WifiMacQueue::EMPTY')], 
+                   'ns3::Ptr< ns3::WifiMacQueueItem const >', 
+                   [param('uint8_t', 'tid'), param('ns3::Mac48Address', 'dest'), param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'item', default_value='nullptr')], 
                    is_const=True)
-    ## wifi-mac-queue.h (module 'wifi'): ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator ns3::WifiMacQueue::PeekFirstAvailable(ns3::Ptr<ns3::QosBlockedDestinations> const blockedPackets=nullptr, ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos=ns3::WifiMacQueue::EMPTY) const [member function]
+    ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::WifiMacQueue::PeekFirstAvailable(ns3::Ptr<ns3::QosBlockedDestinations> const blockedPackets=nullptr, ns3::Ptr<const ns3::WifiMacQueueItem> item=nullptr) const [member function]
     cls.add_method('PeekFirstAvailable', 
-                   'ns3::Queue< ns3::WifiMacQueueItem > ConstIterator', 
-                   [param('ns3::Ptr< ns3::QosBlockedDestinations > const', 'blockedPackets', default_value='nullptr'), param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos', default_value='ns3::WifiMacQueue::EMPTY')], 
+                   'ns3::Ptr< ns3::WifiMacQueueItem const >', 
+                   [param('ns3::Ptr< ns3::QosBlockedDestinations > const', 'blockedPackets', default_value='nullptr'), param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'item', default_value='nullptr')], 
                    is_const=True)
     ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::WifiMacQueue::Remove() [member function]
     cls.add_method('Remove', 
                    'ns3::Ptr< ns3::WifiMacQueueItem >', 
                    [], 
                    is_virtual=True)
-    ## wifi-mac-queue.h (module 'wifi'): bool ns3::WifiMacQueue::Remove(ns3::Ptr<const ns3::Packet> packet) [member function]
-    cls.add_method('Remove', 
-                   'bool', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
-    ## wifi-mac-queue.h (module 'wifi'): ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator ns3::WifiMacQueue::Remove(ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos, bool removeExpired=false) [member function]
+    ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::WifiMacQueue::Remove(ns3::Ptr<const ns3::WifiMacQueueItem> item, bool removeExpired=false) [member function]
     cls.add_method('Remove', 
-                   'ns3::Queue< ns3::WifiMacQueueItem > ConstIterator', 
-                   [param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos'), param('bool', 'removeExpired', default_value='false')])
+                   'ns3::Ptr< ns3::WifiMacQueueItem const >', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'item'), param('bool', 'removeExpired', default_value='false')])
+    ## wifi-mac-queue.h (module 'wifi'): void ns3::WifiMacQueue::Replace(ns3::Ptr<const ns3::WifiMacQueueItem> currentItem, ns3::Ptr<ns3::WifiMacQueueItem> newItem) [member function]
+    cls.add_method('Replace', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'currentItem'), param('ns3::Ptr< ns3::WifiMacQueueItem >', 'newItem')])
     ## wifi-mac-queue.h (module 'wifi'): uint32_t ns3::WifiMacQueue::GetNPacketsByAddress(ns3::Mac48Address dest) [member function]
     cls.add_method('GetNPacketsByAddress', 
                    'uint32_t', 
@@ -23351,12 +23501,10 @@
     cls.add_method('GetNBytes', 
                    'uint32_t', 
                    [])
-    ## wifi-mac-queue.h (module 'wifi'): bool ns3::WifiMacQueue::TtlExceeded(ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator & it, ns3::Time const & now) [member function]
+    ## wifi-mac-queue.h (module 'wifi'): bool ns3::WifiMacQueue::TtlExceeded(ns3::Ptr<const ns3::WifiMacQueueItem> item, ns3::Time const & now) [member function]
     cls.add_method('TtlExceeded', 
                    'bool', 
-                   [param('ns3::Queue< ns3::WifiMacQueueItem > ConstIterator &', 'it'), param('ns3::Time const &', 'now')])
-    ## wifi-mac-queue.h (module 'wifi'): ns3::WifiMacQueue::EMPTY [variable]
-    cls.add_static_attribute('EMPTY', 'ns3::Queue< ns3::WifiMacQueueItem > ConstIterator const', is_const=True)
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'item'), param('ns3::Time const &', 'now')])
     ## wifi-mac-queue.h (module 'wifi'): ns3::WifiMacQueue::WifiMacQueue(ns3::WifiMacQueue const & arg0) [constructor]
     cls.add_constructor([param('ns3::WifiMacQueue const &', 'arg0')])
     return
@@ -23409,6 +23557,15 @@
                    is_static=True)
     ## wifi-net-device.h (module 'wifi'): ns3::WifiNetDevice::WifiNetDevice() [constructor]
     cls.add_constructor([])
+    ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::SetStandard(ns3::WifiStandard standard) [member function]
+    cls.add_method('SetStandard', 
+                   'void', 
+                   [param('ns3::WifiStandard', 'standard')])
+    ## wifi-net-device.h (module 'wifi'): ns3::WifiStandard ns3::WifiNetDevice::GetStandard() const [member function]
+    cls.add_method('GetStandard', 
+                   'ns3::WifiStandard', 
+                   [], 
+                   is_const=True)
     ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::SetMac(ns3::Ptr<ns3::WifiMac> const mac) [member function]
     cls.add_method('SetMac', 
                    'void', 
@@ -23836,36 +23993,6 @@
                    [param('ns3::Address const &', 'value')])
     return
 
-def register_Ns3AdhocWifiMac_methods(root_module, cls):
-    ## adhoc-wifi-mac.h (module 'wifi'): static ns3::TypeId ns3::AdhocWifiMac::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## adhoc-wifi-mac.h (module 'wifi'): ns3::AdhocWifiMac::AdhocWifiMac() [constructor]
-    cls.add_constructor([])
-    ## adhoc-wifi-mac.h (module 'wifi'): void ns3::AdhocWifiMac::SetAddress(ns3::Mac48Address address) [member function]
-    cls.add_method('SetAddress', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_virtual=True)
-    ## adhoc-wifi-mac.h (module 'wifi'): void ns3::AdhocWifiMac::SetLinkUpCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkUp) [member function]
-    cls.add_method('SetLinkUpCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkUp')], 
-                   is_virtual=True)
-    ## adhoc-wifi-mac.h (module 'wifi'): void ns3::AdhocWifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to) [member function]
-    cls.add_method('Enqueue', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to')], 
-                   is_virtual=True)
-    ## adhoc-wifi-mac.h (module 'wifi'): void ns3::AdhocWifiMac::Receive(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('Receive', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
-                   is_virtual=True, visibility='private')
-    return
-
 def register_Ns3AlwaysLosChannelConditionModel_methods(root_module, cls):
     ## channel-condition-model.h (module 'propagation'): static ns3::TypeId ns3::AlwaysLosChannelConditionModel::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
@@ -23886,108 +24013,6 @@
                    is_virtual=True)
     return
 
-def register_Ns3ApWifiMac_methods(root_module, cls):
-    ## ap-wifi-mac.h (module 'wifi'): ns3::ApWifiMac::ApWifiMac() [constructor]
-    cls.add_constructor([])
-    ## ap-wifi-mac.h (module 'wifi'): int64_t ns3::ApWifiMac::AssignStreams(int64_t stream) [member function]
-    cls.add_method('AssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'stream')])
-    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to) [member function]
-    cls.add_method('Enqueue', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to')], 
-                   is_virtual=True)
-    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to, ns3::Mac48Address from) [member function]
-    cls.add_method('Enqueue', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to'), param('ns3::Mac48Address', 'from')], 
-                   is_virtual=True)
-    ## ap-wifi-mac.h (module 'wifi'): uint16_t ns3::ApWifiMac::GetAssociationId(ns3::Mac48Address addr) const [member function]
-    cls.add_method('GetAssociationId', 
-                   'uint16_t', 
-                   [param('ns3::Mac48Address', 'addr')], 
-                   is_const=True)
-    ## ap-wifi-mac.h (module 'wifi'): ns3::Time ns3::ApWifiMac::GetBeaconInterval() const [member function]
-    cls.add_method('GetBeaconInterval', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True)
-    ## ap-wifi-mac.h (module 'wifi'): uint8_t ns3::ApWifiMac::GetBufferStatus(uint8_t tid, ns3::Mac48Address address) const [member function]
-    cls.add_method('GetBufferStatus', 
-                   'uint8_t', 
-                   [param('uint8_t', 'tid'), param('ns3::Mac48Address', 'address')], 
-                   is_const=True)
-    ## ap-wifi-mac.h (module 'wifi'): uint8_t ns3::ApWifiMac::GetMaxBufferStatus(ns3::Mac48Address address) const [member function]
-    cls.add_method('GetMaxBufferStatus', 
-                   'uint8_t', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_const=True)
-    ## ap-wifi-mac.h (module 'wifi'): std::map<unsigned short, ns3::Mac48Address, std::less<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Mac48Address> > > const & ns3::ApWifiMac::GetStaList() const [member function]
-    cls.add_method('GetStaList', 
-                   'std::map< unsigned short, ns3::Mac48Address > const &', 
-                   [], 
-                   is_const=True)
-    ## ap-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueue> ns3::ApWifiMac::GetTxopQueue(ns3::AcIndex ac) const [member function]
-    cls.add_method('GetTxopQueue', 
-                   'ns3::Ptr< ns3::WifiMacQueue >', 
-                   [param('ns3::AcIndex', 'ac')], 
-                   is_const=True, is_virtual=True)
-    ## ap-wifi-mac.h (module 'wifi'): static ns3::TypeId ns3::ApWifiMac::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## ap-wifi-mac.h (module 'wifi'): uint16_t ns3::ApWifiMac::GetVhtOperationalChannelWidth() const [member function]
-    cls.add_method('GetVhtOperationalChannelWidth', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::SetAddress(ns3::Mac48Address address) [member function]
-    cls.add_method('SetAddress', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_virtual=True)
-    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::SetBeaconInterval(ns3::Time interval) [member function]
-    cls.add_method('SetBeaconInterval', 
-                   'void', 
-                   [param('ns3::Time', 'interval')])
-    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::SetBufferStatus(uint8_t tid, ns3::Mac48Address address, uint8_t size) [member function]
-    cls.add_method('SetBufferStatus', 
-                   'void', 
-                   [param('uint8_t', 'tid'), param('ns3::Mac48Address', 'address'), param('uint8_t', 'size')])
-    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::SetLinkUpCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkUp) [member function]
-    cls.add_method('SetLinkUpCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkUp')], 
-                   is_virtual=True)
-    ## ap-wifi-mac.h (module 'wifi'): bool ns3::ApWifiMac::SupportsSendFrom() const [member function]
-    cls.add_method('SupportsSendFrom', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::DeaggregateAmsduAndForward(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('DeaggregateAmsduAndForward', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
-                   is_virtual=True, visibility='private')
-    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::DoDispose() [member function]
-    cls.add_method('DoDispose', 
-                   'void', 
-                   [], 
-                   is_virtual=True, visibility='private')
-    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::DoInitialize() [member function]
-    cls.add_method('DoInitialize', 
-                   'void', 
-                   [], 
-                   is_virtual=True, visibility='private')
-    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::Receive(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('Receive', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
-                   is_virtual=True, visibility='private')
-    return
-
 def register_Ns3BinaryErrorModel_methods(root_module, cls):
     ## error-model.h (module 'network'): ns3::BinaryErrorModel::BinaryErrorModel(ns3::BinaryErrorModel const & arg0) [constructor]
     cls.add_constructor([param('ns3::BinaryErrorModel const &', 'arg0')])
@@ -24053,25 +24078,25 @@
                    is_virtual=True, visibility='private')
     return
 
-def register_Ns3CallbackImpl__Bool_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+def register_Ns3CallbackImpl__Bool_Const_ns3WifiTxVector___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    ## callback.h (module 'core'): ns3::CallbackImpl<bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< bool, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
     cls.add_method('DoGetTypeid', 
                    'std::string', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
     cls.add_method('GetTypeid', 
                    'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): bool ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(short unsigned int arg0, unsigned char arg1) [member operator]
+    ## callback.h (module 'core'): bool ns3::CallbackImpl<bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::WifiTxVector const & arg0) [member operator]
     cls.add_method('operator()', 
                    'bool', 
-                   [param('short unsigned int', 'arg0'), param('unsigned char', 'arg1')], 
+                   [param('ns3::WifiTxVector const &', 'arg0')], 
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
@@ -24141,28 +24166,6 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3CallbackImpl__Unsigned_long_Unsigned_short_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): long unsigned int ns3::CallbackImpl<unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(short unsigned int arg0, short unsigned int arg1, unsigned char arg2) [member operator]
-    cls.add_method('operator()', 
-                   'long unsigned int', 
-                   [param('short unsigned int', 'arg0'), param('short unsigned int', 'arg1'), param('unsigned char', 'arg2')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
 def register_Ns3CallbackImpl__Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
     ## callback.h (module 'core'): ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
@@ -24559,22 +24562,22 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___StdMap__lt__stdPair__lt__unsigned_int__unsigned_int__gt____double__stdLess__lt__stdPair__lt__unsigned_int__unsigned_int__gt_____gt____stdAllocator__lt__stdPair__lt__const_stdPair__lt__unsigned_int__unsigned_int__gt____double__gt_____gt_____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___StdMap__lt__stdPair__lt__unsigned_int__unsigned_int__gt____double__stdLess__lt__stdPair__lt__unsigned_int__unsigned_int__gt____gt____stdAllocator__lt__stdPair__lt__const_stdPair__lt__unsigned_int__unsigned_int__gt____double__gt____gt____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int>>, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double>>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int>>, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double>>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int>>, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double>>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
     cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::Packet const >, std::map< std::pair< unsigned int, unsigned int >, double >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int>>, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double>>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
     cls.add_method('DoGetTypeid', 
                    'std::string', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int>>, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double>>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
     cls.add_method('GetTypeid', 
                    'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::Packet> arg0, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > > arg1) [member operator]
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int>>, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double>>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::Packet> arg0, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int>>, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double>>> arg1) [member operator]
     cls.add_method('operator()', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet const >', 'arg0'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'arg1')], 
@@ -24780,22 +24783,22 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiPsdu__gt___Ns3RxSignalInfo_Ns3WifiTxVector_StdVector__lt__bool__stdAllocator__lt__bool__gt_____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiPsdu__gt___Ns3RxSignalInfo_Ns3WifiTxVector_StdVector__lt__bool__stdAllocator__lt__bool__gt____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
     cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::WifiPsdu >, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
     cls.add_method('DoGetTypeid', 
                    'std::string', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
     cls.add_method('GetTypeid', 
                    'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<ns3::WifiPsdu> arg0, ns3::RxSignalInfo arg1, ns3::WifiTxVector arg2, std::vector<bool, std::allocator<bool> > arg3) [member operator]
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<ns3::WifiPsdu> arg0, ns3::RxSignalInfo arg1, ns3::WifiTxVector arg2, std::vector<bool, std::allocator<bool>> arg3) [member operator]
     cls.add_method('operator()', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiPsdu >', 'arg0'), param('ns3::RxSignalInfo', 'arg1'), param('ns3::WifiTxVector', 'arg2'), param('std::vector< bool >', 'arg3')], 
@@ -24979,22 +24982,22 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3CallbackImpl__Void_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__const_ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__const_ns3WifiPsdu__gt_____gt_____gt_____gt___Ns3WifiTxVector_Double_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+def register_Ns3CallbackImpl__Void_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__const_ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__const_ns3WifiPsdu__gt____gt____gt____gt___Ns3WifiTxVector_Double_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu>>>>, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu>>>>, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu>>>>, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
     cls.add_constructor([param('ns3::CallbackImpl< void, std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu>>>>, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
     cls.add_method('DoGetTypeid', 
                    'std::string', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu>>>>, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
     cls.add_method('GetTypeid', 
                    'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > > arg0, ns3::WifiTxVector arg1, double arg2) [member operator]
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu>>>>, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu>>>> arg0, ns3::WifiTxVector arg1, double arg2) [member operator]
     cls.add_method('operator()', 
                    'void', 
                    [param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'arg0'), param('ns3::WifiTxVector', 'arg1'), param('double', 'arg2')], 
@@ -25068,22 +25071,22 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3CallbackImpl__Void_Unsigned_char_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt_____gt_____gt_____gt_____star___Const_stdSet__lt__ns3Mac48Address__stdLess__lt__ns3Mac48Address__gt____stdAllocator__lt__ns3Mac48Address__gt_____gt_____star___Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+def register_Ns3CallbackImpl__Void_Unsigned_char_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt____gt____gt____gt_____star___Const_stdSet__lt__ns3Mac48Address__stdLess__lt__ns3Mac48Address__gt____stdAllocator__lt__ns3Mac48Address__gt____gt_____star___Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
     cls.add_constructor([param('ns3::CallbackImpl< void, unsigned char, std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu >, std::hash< unsigned short >, std::equal_to< unsigned short >, std::allocator< std::pair< unsigned short const, ns3::Ptr< ns3::WifiPsdu > > > > *, std::set< ns3::Mac48Address, std::less< ns3::Mac48Address >, std::allocator< ns3::Mac48Address > > const, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
     cls.add_method('DoGetTypeid', 
                    'std::string', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
     cls.add_method('GetTypeid', 
                    'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(unsigned char arg0, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > * arg1, std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > const * arg2, long unsigned int arg3) [member operator]
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(unsigned char arg0, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> * arg1, std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> const * arg2, long unsigned int arg3) [member operator]
     cls.add_method('operator()', 
                    'void', 
                    [param('unsigned char', 'arg0'), param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > > *', 'arg1'), param('std::set< ns3::Mac48Address > const *', 'arg2'), param('long unsigned int', 'arg3')], 
@@ -25199,10 +25202,10 @@
                    'uint16_t', 
                    [param('std::string const &', 'name')], 
                    is_static=True)
-    ## dsss-phy.h (module 'wifi'): static uint64_t ns3::DsssPhy::GetDataRate(std::string const & name, ns3::WifiModulationClass modClass, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss) [member function]
+    ## dsss-phy.h (module 'wifi'): static uint64_t ns3::DsssPhy::GetDataRate(std::string const & name, ns3::WifiModulationClass modClass) [member function]
     cls.add_method('GetDataRate', 
                    'uint64_t', 
-                   [param('std::string const &', 'name'), param('ns3::WifiModulationClass', 'modClass'), param('uint16_t', 'channelWidth'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nss')], 
+                   [param('std::string const &', 'name'), param('ns3::WifiModulationClass', 'modClass')], 
                    is_static=True)
     ## dsss-phy.h (module 'wifi'): static uint64_t ns3::DsssPhy::GetDataRateFromTxVector(ns3::WifiTxVector const & txVector, uint16_t staId) [member function]
     cls.add_method('GetDataRateFromTxVector', 
@@ -25264,10 +25267,10 @@
                    'void', 
                    [], 
                    is_static=True)
-    ## dsss-phy.h (module 'wifi'): static bool ns3::DsssPhy::IsModeAllowed(uint16_t channelWidth, uint8_t nss) [member function]
-    cls.add_method('IsModeAllowed', 
+    ## dsss-phy.h (module 'wifi'): static bool ns3::DsssPhy::IsAllowed(ns3::WifiTxVector const & txVector) [member function]
+    cls.add_method('IsAllowed', 
                    'bool', 
-                   [param('uint16_t', 'channelWidth'), param('uint8_t', 'nss')], 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
                    is_static=True)
     ## dsss-phy.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus ns3::DsssPhy::DoEndReceiveField(ns3::WifiPpduField field, ns3::Ptr<ns3::Event> event) [member function]
     cls.add_method('DoEndReceiveField', 
@@ -25308,8 +25311,8 @@
     cls.add_constructor([param('ns3::HePpdu const &', 'arg0')])
     ## he-ppdu.h (module 'wifi'): ns3::HePpdu::HePpdu(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector, ns3::Time ppduDuration, ns3::WifiPhyBand band, uint64_t uid) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time', 'ppduDuration'), param('ns3::WifiPhyBand', 'band'), param('uint64_t', 'uid')])
-    ## he-ppdu.h (module 'wifi'): ns3::HePpdu::HePpdu(ns3::WifiConstPsduMap const & psdus, ns3::WifiTxVector const & txVector, ns3::Time ppduDuration, ns3::WifiPhyBand band, uint64_t uid, ns3::HePpdu::TxPsdFlag flag) [constructor]
-    cls.add_constructor([param('ns3::WifiConstPsduMap const &', 'psdus'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time', 'ppduDuration'), param('ns3::WifiPhyBand', 'band'), param('uint64_t', 'uid'), param('ns3::HePpdu::TxPsdFlag', 'flag')])
+    ## he-ppdu.h (module 'wifi'): ns3::HePpdu::HePpdu(ns3::WifiConstPsduMap const & psdus, ns3::WifiTxVector const & txVector, ns3::Time ppduDuration, ns3::WifiPhyBand band, uint64_t uid, ns3::HePpdu::TxPsdFlag flag, uint8_t p20Index) [constructor]
+    cls.add_constructor([param('ns3::WifiConstPsduMap const &', 'psdus'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time', 'ppduDuration'), param('ns3::WifiPhyBand', 'band'), param('uint64_t', 'uid'), param('ns3::HePpdu::TxPsdFlag', 'flag'), param('uint8_t', 'p20Index')])
     ## he-ppdu.h (module 'wifi'): bool ns3::HePpdu::CanBeReceived(uint16_t txCenterFreq, uint16_t p20MinFreq, uint16_t p20MaxFreq) const [member function]
     cls.add_method('CanBeReceived', 
                    'bool', 
@@ -25534,10 +25537,14 @@
     cls.add_method('SendAddBaResponse', 
                    'void', 
                    [param('ns3::MgtAddBaRequestHeader const *', 'reqHdr'), param('ns3::Mac48Address', 'originator')])
-    ## ht-frame-exchange-manager.h (module 'wifi'): void ns3::HtFrameExchangeManager::SetWifiMac(ns3::Ptr<ns3::RegularWifiMac> const mac) [member function]
+    ## ht-frame-exchange-manager.h (module 'wifi'): void ns3::HtFrameExchangeManager::SendDelbaFrame(ns3::Mac48Address addr, uint8_t tid, bool byOriginator) [member function]
+    cls.add_method('SendDelbaFrame', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'addr'), param('uint8_t', 'tid'), param('bool', 'byOriginator')])
+    ## ht-frame-exchange-manager.h (module 'wifi'): void ns3::HtFrameExchangeManager::SetWifiMac(ns3::Ptr<ns3::WifiMac> const mac) [member function]
     cls.add_method('SetWifiMac', 
                    'void', 
-                   [param('ns3::Ptr< ns3::RegularWifiMac > const', 'mac')], 
+                   [param('ns3::Ptr< ns3::WifiMac > const', 'mac')], 
                    is_virtual=True)
     ## ht-frame-exchange-manager.h (module 'wifi'): bool ns3::HtFrameExchangeManager::StartFrameExchange(ns3::Ptr<ns3::QosTxop> edca, ns3::Time availableTime, bool initialFrame) [member function]
     cls.add_method('StartFrameExchange', 
@@ -25569,7 +25576,7 @@
                    'void', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## ht-frame-exchange-manager.h (module 'wifi'): void ns3::HtFrameExchangeManager::EndReceiveAmpdu(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::RxSignalInfo const & rxSignalInfo, ns3::WifiTxVector const & txVector, std::vector<bool, std::allocator<bool> > const & perMpduStatus) [member function]
+    ## ht-frame-exchange-manager.h (module 'wifi'): void ns3::HtFrameExchangeManager::EndReceiveAmpdu(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::RxSignalInfo const & rxSignalInfo, ns3::WifiTxVector const & txVector, std::vector<bool, std::allocator<bool>> const & perMpduStatus) [member function]
     cls.add_method('EndReceiveAmpdu', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::RxSignalInfo const &', 'rxSignalInfo'), param('ns3::WifiTxVector const &', 'txVector'), param('std::vector< bool > const &', 'perMpduStatus')], 
@@ -25629,13 +25636,13 @@
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('ns3::RxSignalInfo', 'rxSignalInfo'), param('ns3::WifiTxVector const &', 'txVector'), param('bool', 'inAmpdu')], 
                    is_virtual=True, visibility='protected')
-    ## ht-frame-exchange-manager.h (module 'wifi'): void ns3::HtFrameExchangeManager::RetransmitMpduAfterMissedAck(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) const [member function]
-    cls.add_method('RetransmitMpduAfterMissedAck', 
+    ## ht-frame-exchange-manager.h (module 'wifi'): void ns3::HtFrameExchangeManager::ReleaseSequenceNumber(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) const [member function]
+    cls.add_method('ReleaseSequenceNumber', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
                    is_const=True, is_virtual=True, visibility='protected')
-    ## ht-frame-exchange-manager.h (module 'wifi'): void ns3::HtFrameExchangeManager::RetransmitMpduAfterMissedCts(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) const [member function]
-    cls.add_method('RetransmitMpduAfterMissedCts', 
+    ## ht-frame-exchange-manager.h (module 'wifi'): void ns3::HtFrameExchangeManager::RetransmitMpduAfterMissedAck(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) const [member function]
+    cls.add_method('RetransmitMpduAfterMissedAck', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
                    is_const=True, is_virtual=True, visibility='protected')
@@ -25654,11 +25661,6 @@
                    'bool', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'peekedItem'), param('ns3::Time', 'availableTime'), param('bool', 'initialFrame')], 
                    is_virtual=True, visibility='protected')
-    ## ht-frame-exchange-manager.h (module 'wifi'): void ns3::HtFrameExchangeManager::SendDelbaFrame(ns3::Mac48Address addr, uint8_t tid, bool byOriginator) [member function]
-    cls.add_method('SendDelbaFrame', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'addr'), param('uint8_t', 'tid'), param('bool', 'byOriginator')], 
-                   visibility='protected')
     ## ht-frame-exchange-manager.h (module 'wifi'): bool ns3::HtFrameExchangeManager::SendMpduFromBaManager(ns3::Ptr<ns3::QosTxop> edca, ns3::Time availableTime, bool initialFrame) [member function]
     cls.add_method('SendMpduFromBaManager', 
                    'bool', 
@@ -25800,10 +25802,10 @@
                    'uint16_t', 
                    [param('std::string const &', 'name')], 
                    is_static=True)
-    ## ofdm-phy.h (module 'wifi'): static uint64_t ns3::OfdmPhy::GetDataRate(std::string const & name, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss) [member function]
+    ## ofdm-phy.h (module 'wifi'): static uint64_t ns3::OfdmPhy::GetDataRate(std::string const & name, uint16_t channelWidth) [member function]
     cls.add_method('GetDataRate', 
                    'uint64_t', 
-                   [param('std::string const &', 'name'), param('uint16_t', 'channelWidth'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nss')], 
+                   [param('std::string const &', 'name'), param('uint16_t', 'channelWidth')], 
                    is_static=True)
     ## ofdm-phy.h (module 'wifi'): static uint64_t ns3::OfdmPhy::GetDataRateFromTxVector(ns3::WifiTxVector const & txVector, uint16_t staId) [member function]
     cls.add_method('GetDataRateFromTxVector', 
@@ -25945,10 +25947,10 @@
                    'ns3::Time', 
                    [param('uint32_t', 'size'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiPhyBand', 'band'), param('ns3::MpduType', 'mpdutype'), param('bool', 'incFlag'), param('uint32_t &', 'totalAmpduSize'), param('double &', 'totalAmpduNumSymbols'), param('uint16_t', 'staId')], 
                    is_const=True, is_virtual=True)
-    ## ofdm-phy.h (module 'wifi'): static uint64_t ns3::OfdmPhy::GetPhyRate(std::string const & name, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss) [member function]
+    ## ofdm-phy.h (module 'wifi'): static uint64_t ns3::OfdmPhy::GetPhyRate(std::string const & name, uint16_t channelWidth) [member function]
     cls.add_method('GetPhyRate', 
                    'uint64_t', 
-                   [param('std::string const &', 'name'), param('uint16_t', 'channelWidth'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nss')], 
+                   [param('std::string const &', 'name'), param('uint16_t', 'channelWidth')], 
                    is_static=True)
     ## ofdm-phy.h (module 'wifi'): static uint64_t ns3::OfdmPhy::GetPhyRateFromTxVector(ns3::WifiTxVector const & txVector, uint16_t staId) [member function]
     cls.add_method('GetPhyRateFromTxVector', 
@@ -25970,15 +25972,15 @@
                    'void', 
                    [], 
                    is_static=True)
-    ## ofdm-phy.h (module 'wifi'): static bool ns3::OfdmPhy::IsModeAllowed(uint16_t channelWidth, uint8_t nss) [member function]
-    cls.add_method('IsModeAllowed', 
+    ## ofdm-phy.h (module 'wifi'): static bool ns3::OfdmPhy::IsAllowed(ns3::WifiTxVector const & txVector) [member function]
+    cls.add_method('IsAllowed', 
                    'bool', 
-                   [param('uint16_t', 'channelWidth'), param('uint8_t', 'nss')], 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
                    is_static=True)
-    ## ofdm-phy.h (module 'wifi'): static uint64_t ns3::OfdmPhy::CalculateDataRate(ns3::WifiCodeRate codeRate, uint16_t constellationSize, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss) [member function]
+    ## ofdm-phy.h (module 'wifi'): static uint64_t ns3::OfdmPhy::CalculateDataRate(ns3::WifiCodeRate codeRate, uint16_t constellationSize, uint16_t channelWidth) [member function]
     cls.add_method('CalculateDataRate', 
                    'uint64_t', 
-                   [param('uint16_t', 'codeRate'), param('uint16_t', 'constellationSize'), param('uint16_t', 'channelWidth'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nss')], 
+                   [param('uint16_t', 'codeRate'), param('uint16_t', 'constellationSize'), param('uint16_t', 'channelWidth')], 
                    is_static=True, visibility='protected')
     ## ofdm-phy.h (module 'wifi'): static uint64_t ns3::OfdmPhy::CalculateDataRate(double symbolDuration, uint16_t guardInterval, uint16_t usableSubCarriers, uint16_t numberOfBitsPerSubcarrier, double codingRate) [member function]
     cls.add_method('CalculateDataRate', 
@@ -26155,6 +26157,11 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## vht-frame-exchange-manager.h (module 'wifi'): uint32_t ns3::VhtFrameExchangeManager::GetPsduSize(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetPsduSize', 
+                   'uint32_t', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True, visibility='protected')
     ## vht-frame-exchange-manager.h (module 'wifi'): ns3::Ptr<ns3::WifiPsdu> ns3::VhtFrameExchangeManager::GetWifiPsdu(ns3::Ptr<ns3::WifiMacQueueItem> mpdu, ns3::WifiTxVector const & txVector) const [member function]
     cls.add_method('GetWifiPsdu', 
                    'ns3::Ptr< ns3::WifiPsdu >', 
@@ -26182,10 +26189,10 @@
                    'uint16_t', 
                    [param('std::string const &', 'name')], 
                    is_static=True)
-    ## erp-ofdm-phy.h (module 'wifi'): static uint64_t ns3::ErpOfdmPhy::GetDataRate(std::string const & name, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss) [member function]
+    ## erp-ofdm-phy.h (module 'wifi'): static uint64_t ns3::ErpOfdmPhy::GetDataRate(std::string const & name, uint16_t channelWidth) [member function]
     cls.add_method('GetDataRate', 
                    'uint64_t', 
-                   [param('std::string const &', 'name'), param('uint16_t', 'channelWidth'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nss')], 
+                   [param('std::string const &', 'name'), param('uint16_t', 'channelWidth')], 
                    is_static=True)
     ## erp-ofdm-phy.h (module 'wifi'): static uint64_t ns3::ErpOfdmPhy::GetDataRateFromTxVector(ns3::WifiTxVector const & txVector, uint16_t staId) [member function]
     cls.add_method('GetDataRateFromTxVector', 
@@ -26242,10 +26249,10 @@
                    'uint32_t', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## erp-ofdm-phy.h (module 'wifi'): static uint64_t ns3::ErpOfdmPhy::GetPhyRate(std::string const & name, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss) [member function]
+    ## erp-ofdm-phy.h (module 'wifi'): static uint64_t ns3::ErpOfdmPhy::GetPhyRate(std::string const & name, uint16_t channelWidth) [member function]
     cls.add_method('GetPhyRate', 
                    'uint64_t', 
-                   [param('std::string const &', 'name'), param('uint16_t', 'channelWidth'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nss')], 
+                   [param('std::string const &', 'name'), param('uint16_t', 'channelWidth')], 
                    is_static=True)
     ## erp-ofdm-phy.h (module 'wifi'): static uint64_t ns3::ErpOfdmPhy::GetPhyRateFromTxVector(ns3::WifiTxVector const & txVector, uint16_t staId) [member function]
     cls.add_method('GetPhyRateFromTxVector', 
@@ -26257,10 +26264,10 @@
                    'void', 
                    [], 
                    is_static=True)
-    ## erp-ofdm-phy.h (module 'wifi'): static bool ns3::ErpOfdmPhy::IsModeAllowed(uint16_t channelWidth, uint8_t nss) [member function]
-    cls.add_method('IsModeAllowed', 
+    ## erp-ofdm-phy.h (module 'wifi'): static bool ns3::ErpOfdmPhy::IsAllowed(ns3::WifiTxVector const & txVector) [member function]
+    cls.add_method('IsAllowed', 
                    'bool', 
-                   [param('uint16_t', 'channelWidth'), param('uint8_t', 'nss')], 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
                    is_static=True)
     ## erp-ofdm-phy.h (module 'wifi'): ns3::Time ns3::ErpOfdmPhy::GetHeaderDuration(ns3::WifiTxVector const & txVector) const [member function]
     cls.add_method('GetHeaderDuration', 
@@ -26313,10 +26320,15 @@
                    'void', 
                    [param('ns3::CtrlTriggerHeader &', 'trigger')], 
                    is_const=True, is_virtual=True)
-    ## he-frame-exchange-manager.h (module 'wifi'): void ns3::HeFrameExchangeManager::SetWifiMac(ns3::Ptr<ns3::RegularWifiMac> const mac) [member function]
+    ## he-frame-exchange-manager.h (module 'wifi'): void ns3::HeFrameExchangeManager::SetTxopHolder(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector) [member function]
+    cls.add_method('SetTxopHolder', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_virtual=True)
+    ## he-frame-exchange-manager.h (module 'wifi'): void ns3::HeFrameExchangeManager::SetWifiMac(ns3::Ptr<ns3::WifiMac> const mac) [member function]
     cls.add_method('SetWifiMac', 
                    'void', 
-                   [param('ns3::Ptr< ns3::RegularWifiMac > const', 'mac')], 
+                   [param('ns3::Ptr< ns3::WifiMac > const', 'mac')], 
                    is_virtual=True)
     ## he-frame-exchange-manager.h (module 'wifi'): bool ns3::HeFrameExchangeManager::StartFrameExchange(ns3::Ptr<ns3::QosTxop> edca, ns3::Time availableTime, bool initialFrame) [member function]
     cls.add_method('StartFrameExchange', 
@@ -26328,17 +26340,27 @@
                    'void', 
                    [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector')], 
                    is_virtual=True, visibility='protected')
-    ## he-frame-exchange-manager.h (module 'wifi'): void ns3::HeFrameExchangeManager::BlockAcksInTbPpduTimeout(ns3::WifiPsduMap * psduMap, std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > const * staMissedBlockAckFrom, std::size_t nSolicitedStations) [member function]
+    ## he-frame-exchange-manager.h (module 'wifi'): void ns3::HeFrameExchangeManager::BlockAckTimeout(ns3::Ptr<ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector) [member function]
+    cls.add_method('BlockAckTimeout', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_virtual=True, visibility='protected')
+    ## he-frame-exchange-manager.h (module 'wifi'): void ns3::HeFrameExchangeManager::BlockAcksInTbPpduTimeout(ns3::WifiPsduMap * psduMap, std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> const * staMissedBlockAckFrom, std::size_t nSolicitedStations) [member function]
     cls.add_method('BlockAcksInTbPpduTimeout', 
                    'void', 
                    [param('ns3::WifiPsduMap *', 'psduMap'), param('std::set< ns3::Mac48Address > const *', 'staMissedBlockAckFrom'), param('std::size_t', 'nSolicitedStations')], 
                    is_virtual=True, visibility='protected')
+    ## he-frame-exchange-manager.h (module 'wifi'): void ns3::HeFrameExchangeManager::CtsTimeout(ns3::Ptr<ns3::WifiMacQueueItem> rts, ns3::WifiTxVector const & txVector) [member function]
+    cls.add_method('CtsTimeout', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'rts'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_virtual=True, visibility='protected')
     ## he-frame-exchange-manager.h (module 'wifi'): void ns3::HeFrameExchangeManager::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## he-frame-exchange-manager.h (module 'wifi'): void ns3::HeFrameExchangeManager::EndReceiveAmpdu(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::RxSignalInfo const & rxSignalInfo, ns3::WifiTxVector const & txVector, std::vector<bool, std::allocator<bool> > const & perMpduStatus) [member function]
+    ## he-frame-exchange-manager.h (module 'wifi'): void ns3::HeFrameExchangeManager::EndReceiveAmpdu(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::RxSignalInfo const & rxSignalInfo, ns3::WifiTxVector const & txVector, std::vector<bool, std::allocator<bool>> const & perMpduStatus) [member function]
     cls.add_method('EndReceiveAmpdu', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::RxSignalInfo const &', 'rxSignalInfo'), param('ns3::WifiTxVector const &', 'txVector'), param('std::vector< bool > const &', 'perMpduStatus')], 
@@ -26353,12 +26375,22 @@
                    'ns3::WifiTxVector', 
                    [param('ns3::CtrlTriggerHeader', 'trigger'), param('ns3::Mac48Address', 'triggerSender')], 
                    is_const=True, visibility='protected')
+    ## he-frame-exchange-manager.h (module 'wifi'): ns3::WifiTxVector ns3::HeFrameExchangeManager::GetTrigVector(ns3::CtrlTriggerHeader const & trigger) const [member function]
+    cls.add_method('GetTrigVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::CtrlTriggerHeader const &', 'trigger')], 
+                   is_const=True, visibility='protected')
     ## he-frame-exchange-manager.h (module 'wifi'): ns3::Time ns3::HeFrameExchangeManager::GetTxDuration(uint32_t ppduPayloadSize, ns3::Mac48Address receiver, ns3::WifiTxParameters const & txParams) const [member function]
     cls.add_method('GetTxDuration', 
                    'ns3::Time', 
                    [param('uint32_t', 'ppduPayloadSize'), param('ns3::Mac48Address', 'receiver'), param('ns3::WifiTxParameters const &', 'txParams')], 
                    is_const=True, is_virtual=True, visibility='protected')
-    ## he-frame-exchange-manager.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::HeFrameExchangeManager::PrepareMuBar(ns3::WifiTxVector const & responseTxVector, std::map<unsigned short, ns3::CtrlBAckRequestHeader, std::less<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::CtrlBAckRequestHeader> > > recipients) const [member function]
+    ## he-frame-exchange-manager.h (module 'wifi'): void ns3::HeFrameExchangeManager::NormalAckTimeout(ns3::Ptr<ns3::WifiMacQueueItem> mpdu, ns3::WifiTxVector const & txVector) [member function]
+    cls.add_method('NormalAckTimeout', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_virtual=True, visibility='protected')
+    ## he-frame-exchange-manager.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::HeFrameExchangeManager::PrepareMuBar(ns3::WifiTxVector const & responseTxVector, std::map<unsigned short, ns3::CtrlBAckRequestHeader, std::less<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::CtrlBAckRequestHeader>>> recipients) const [member function]
     cls.add_method('PrepareMuBar', 
                    'ns3::Ptr< ns3::WifiMacQueueItem >', 
                    [param('ns3::WifiTxVector const &', 'responseTxVector'), param('std::map< unsigned short, ns3::CtrlBAckRequestHeader >', 'recipients')], 
@@ -26388,7 +26420,7 @@
                    'void', 
                    [param('ns3::CtrlTriggerHeader const &', 'trigger'), param('ns3::WifiMacHeader const &', 'hdr')], 
                    visibility='protected')
-    ## he-frame-exchange-manager.h (module 'wifi'): void ns3::HeFrameExchangeManager::TbPpduTimeout(ns3::WifiPsduMap * psduMap, std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > const * staMissedTbPpduFrom, std::size_t nSolicitedStations) [member function]
+    ## he-frame-exchange-manager.h (module 'wifi'): void ns3::HeFrameExchangeManager::TbPpduTimeout(ns3::WifiPsduMap * psduMap, std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> const * staMissedTbPpduFrom, std::size_t nSolicitedStations) [member function]
     cls.add_method('TbPpduTimeout', 
                    'void', 
                    [param('ns3::WifiPsduMap *', 'psduMap'), param('std::set< ns3::Mac48Address > const *', 'staMissedTbPpduFrom'), param('std::size_t', 'nSolicitedStations')], 
@@ -26685,16 +26717,16 @@
                    'void', 
                    [], 
                    is_static=True)
+    ## ht-phy.h (module 'wifi'): static bool ns3::HtPhy::IsAllowed(ns3::WifiTxVector const & txVector) [member function]
+    cls.add_method('IsAllowed', 
+                   'bool', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_static=True)
     ## ht-phy.h (module 'wifi'): bool ns3::HtPhy::IsMcsSupported(uint8_t index) const [member function]
     cls.add_method('IsMcsSupported', 
                    'bool', 
                    [param('uint8_t', 'index')], 
                    is_const=True, is_virtual=True)
-    ## ht-phy.h (module 'wifi'): static bool ns3::HtPhy::IsModeAllowed(uint16_t channelWidth, uint8_t nss) [member function]
-    cls.add_method('IsModeAllowed', 
-                   'bool', 
-                   [param('uint16_t', 'channelWidth'), param('uint8_t', 'nss')], 
-                   is_static=True)
     ## ht-phy.h (module 'wifi'): void ns3::HtPhy::SetMaxSupportedMcsIndexPerSs(uint8_t maxIndex) [member function]
     cls.add_method('SetMaxSupportedMcsIndexPerSs', 
                    'void', 
@@ -26920,8 +26952,13 @@
                    'void', 
                    [], 
                    is_static=True)
-    ## vht-phy.h (module 'wifi'): static bool ns3::VhtPhy::IsModeAllowed(uint8_t mcsValue, uint16_t channelWidth, uint8_t nss) [member function]
-    cls.add_method('IsModeAllowed', 
+    ## vht-phy.h (module 'wifi'): static bool ns3::VhtPhy::IsAllowed(ns3::WifiTxVector const & txVector) [member function]
+    cls.add_method('IsAllowed', 
+                   'bool', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_static=True)
+    ## vht-phy.h (module 'wifi'): static bool ns3::VhtPhy::IsCombinationAllowed(uint8_t mcsValue, uint16_t channelWidth, uint8_t nss) [member function]
+    cls.add_method('IsCombinationAllowed', 
                    'bool', 
                    [param('uint8_t', 'mcsValue'), param('uint16_t', 'channelWidth'), param('uint8_t', 'nss')], 
                    is_static=True)
@@ -27017,10 +27054,10 @@
                    'void', 
                    [], 
                    is_virtual=True)
-    ## he-phy.h (module 'wifi'): static uint16_t ns3::HePhy::ConvertHeTbPpduDurationToLSigLength(ns3::Time ppduDuration, ns3::WifiPhyBand band) [member function]
+    ## he-phy.h (module 'wifi'): static std::pair<unsigned short, ns3::Time> ns3::HePhy::ConvertHeTbPpduDurationToLSigLength(ns3::Time ppduDuration, ns3::WifiTxVector const & txVector, ns3::WifiPhyBand band) [member function]
     cls.add_method('ConvertHeTbPpduDurationToLSigLength', 
-                   'uint16_t', 
-                   [param('ns3::Time', 'ppduDuration'), param('ns3::WifiPhyBand', 'band')], 
+                   'std::pair< unsigned short, ns3::Time >', 
+                   [param('ns3::Time', 'ppduDuration'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiPhyBand', 'band')], 
                    is_static=True)
     ## he-phy.h (module 'wifi'): static ns3::Time ns3::HePhy::ConvertLSigLengthToHeTbPpduDuration(uint16_t length, ns3::WifiTxVector const & txVector, ns3::WifiPhyBand band) [member function]
     cls.add_method('ConvertLSigLengthToHeTbPpduDuration', 
@@ -27222,10 +27259,10 @@
                    'void', 
                    [], 
                    is_static=True)
-    ## he-phy.h (module 'wifi'): static bool ns3::HePhy::IsModeAllowed(uint16_t channelWidth, uint8_t nss) [member function]
-    cls.add_method('IsModeAllowed', 
+    ## he-phy.h (module 'wifi'): static bool ns3::HePhy::IsAllowed(ns3::WifiTxVector const & txVector) [member function]
+    cls.add_method('IsAllowed', 
                    'bool', 
-                   [param('uint16_t', 'channelWidth'), param('uint8_t', 'nss')], 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
                    is_static=True)
     ## he-phy.h (module 'wifi'): void ns3::HePhy::NotifyEndOfHeSigA(ns3::HeSigAParameters params) [member function]
     cls.add_method('NotifyEndOfHeSigA', 
@@ -27235,6 +27272,10 @@
     cls.add_method('SetEndOfHeSigACallback', 
                    'void', 
                    [param('ns3::Callback< void, ns3::HeSigAParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    ## he-phy.h (module 'wifi'): void ns3::HePhy::SetTrigVector(ns3::WifiTxVector const & trigVector, ns3::Time validity) [member function]
+    cls.add_method('SetTrigVector', 
+                   'void', 
+                   [param('ns3::WifiTxVector const &', 'trigVector'), param('ns3::Time', 'validity')])
     ## he-phy.h (module 'wifi'): void ns3::HePhy::StartReceivePreamble(ns3::Ptr<ns3::WifiPpdu> ppdu, ns3::RxPowerWattPerChannelBand & rxPowersW, ns3::Time rxDuration) [member function]
     cls.add_method('StartReceivePreamble', 
                    'void', 
@@ -27275,7 +27316,7 @@
                    'void', 
                    [param('ns3::Ptr< ns3::Event >', 'event')], 
                    is_virtual=True, visibility='protected')
-    ## he-phy.h (module 'wifi'): std::pair<unsigned short, std::pair<unsigned int, unsigned int> > ns3::HePhy::GetChannelWidthAndBand(ns3::WifiTxVector const & txVector, uint16_t staId) const [member function]
+    ## he-phy.h (module 'wifi'): std::pair<unsigned short, std::pair<unsigned int, unsigned int>> ns3::HePhy::GetChannelWidthAndBand(ns3::WifiTxVector const & txVector, uint16_t staId) const [member function]
     cls.add_method('GetChannelWidthAndBand', 
                    'std::pair< unsigned short, std::pair< unsigned int, unsigned int > >', 
                    [param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId')], 
@@ -27489,19 +27530,23 @@
     module.add_function('GetCtsSize', 
                         'uint32_t', 
                         [])
-    ## wifi-standards.h (module 'wifi'): uint16_t ns3::GetDefaultChannelWidth(ns3::WifiPhyStandard standard, ns3::WifiPhyBand band) [free function]
+    ## wifi-standards.h (module 'wifi'): uint16_t ns3::GetDefaultChannelWidth(ns3::WifiStandard standard, ns3::WifiPhyBand band) [free function]
     module.add_function('GetDefaultChannelWidth', 
                         'uint16_t', 
-                        [param('ns3::WifiPhyStandard', 'standard'), param('ns3::WifiPhyBand', 'band')])
-    ## wifi-standards.h (module 'wifi'): ns3::FrequencyChannelType ns3::GetFrequencyChannelType(ns3::WifiPhyStandard standard) [free function]
+                        [param('ns3::WifiStandard', 'standard'), param('ns3::WifiPhyBand', 'band')])
+    ## wifi-standards.h (module 'wifi'): ns3::WifiPhyBand ns3::GetDefaultPhyBand(ns3::WifiStandard standard) [free function]
+    module.add_function('GetDefaultPhyBand', 
+                        'ns3::WifiPhyBand', 
+                        [param('ns3::WifiStandard', 'standard')])
+    ## wifi-standards.h (module 'wifi'): ns3::FrequencyChannelType ns3::GetFrequencyChannelType(ns3::WifiStandard standard) [free function]
     module.add_function('GetFrequencyChannelType', 
                         'ns3::FrequencyChannelType', 
-                        [param('ns3::WifiPhyStandard', 'standard')])
-    ## wifi-standards.h (module 'wifi'): uint16_t ns3::GetMaximumChannelWidth(ns3::WifiPhyStandard standard) [free function]
+                        [param('ns3::WifiStandard', 'standard')])
+    ## wifi-standards.h (module 'wifi'): uint16_t ns3::GetMaximumChannelWidth(ns3::WifiStandard standard) [free function]
     module.add_function('GetMaximumChannelWidth', 
                         'uint16_t', 
-                        [param('ns3::WifiPhyStandard', 'standard')])
-    ## wifi-utils.h (module 'wifi'): uint32_t ns3::GetMuBarSize(std::list<ns3::BlockAckReqType, std::allocator<ns3::BlockAckReqType> > types) [free function]
+                        [param('ns3::WifiStandard', 'standard')])
+    ## wifi-utils.h (module 'wifi'): uint32_t ns3::GetMuBarSize(std::list<ns3::BlockAckReqType, std::allocator<ns3::BlockAckReqType>> types) [free function]
     module.add_function('GetMuBarSize', 
                         'uint32_t', 
                         [param('std::list< ns3::BlockAckReqType >', 'types')])
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/bindings/modulegen__gcc_LP64.py ns-3.36/src/wifi/bindings/modulegen__gcc_LP64.py
--- ns-3.35/src/wifi/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/bindings/modulegen__gcc_LP64.py	2022-04-30 18:23:58.194735000 -0700
@@ -24,34 +24,28 @@
     module.add_enum('EnvironmentType', ['UrbanEnvironment', 'SubUrbanEnvironment', 'OpenAreasEnvironment'], import_from_module='ns.propagation')
     ## propagation-environment.h (module 'propagation'): ns3::CitySize [enumeration]
     module.add_enum('CitySize', ['SmallCity', 'MediumCity', 'LargeCity'], import_from_module='ns.propagation')
-    ## queue-size.h (module 'network'): ns3::QueueSizeUnit [enumeration]
-    module.add_enum('QueueSizeUnit', ['PACKETS', 'BYTES'], import_from_module='ns.network')
     ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::McsGroupType [enumeration]
     module.add_enum('McsGroupType', ['GROUP_HT', 'GROUP_VHT', 'GROUP_HE'])
     ## ht-operation.h (module 'wifi'): ns3::HtProtectionType [enumeration]
     module.add_enum('HtProtectionType', ['NO_PROTECTION', 'NON_MEMBER_PROTECTION', 'TWENTY_MHZ_PROTECTION', 'MIXED_MODE_PROTECTION'])
+    ## queue-size.h (module 'network'): ns3::QueueSizeUnit [enumeration]
+    module.add_enum('QueueSizeUnit', ['PACKETS', 'BYTES'], import_from_module='ns.network')
     ## ofdm-phy.h (module 'wifi'): ns3::OfdmPhyVariant [enumeration]
     module.add_enum('OfdmPhyVariant', ['OFDM_PHY_DEFAULT', 'OFDM_PHY_10_MHZ', 'OFDM_PHY_5_MHZ'])
-    ## wifi-mpdu-type.h (module 'wifi'): ns3::MpduType [enumeration]
-    module.add_enum('MpduType', ['NORMAL_MPDU', 'SINGLE_MPDU', 'FIRST_MPDU_IN_AGGREGATE', 'MIDDLE_MPDU_IN_AGGREGATE', 'LAST_MPDU_IN_AGGREGATE'])
+    ## wifi-mac.h (module 'wifi'): ns3::WifiMacDropReason [enumeration]
+    module.add_enum('WifiMacDropReason', ['WIFI_MAC_DROP_FAILED_ENQUEUE', 'WIFI_MAC_DROP_EXPIRED_LIFETIME', 'WIFI_MAC_DROP_REACHED_RETRY_LIMIT', 'WIFI_MAC_DROP_QOS_OLD_PACKET'])
     ## qos-utils.h (module 'wifi'): ns3::AcIndex [enumeration]
     module.add_enum('AcIndex', ['AC_BE', 'AC_BK', 'AC_VI', 'AC_VO', 'AC_BE_NQOS', 'AC_BEACON', 'AC_UNDEF'])
     ## ctrl-headers.h (module 'wifi'): ns3::TriggerFrameType [enumeration]
     module.add_enum('TriggerFrameType', ['BASIC_TRIGGER', 'BFRP_TRIGGER', 'MU_BAR_TRIGGER', 'MU_RTS_TRIGGER', 'BSRP_TRIGGER', 'GCR_MU_BAR_TRIGGER', 'BQRP_TRIGGER', 'NFRP_TRIGGER'])
-    ## regular-wifi-mac.h (module 'wifi'): ns3::WifiTxTimerReason [enumeration]
-    module.add_enum('WifiTxTimerReason', [])
-    ## wifi-mac.h (module 'wifi'): ns3::WifiMacDropReason [enumeration]
-    module.add_enum('WifiMacDropReason', ['WIFI_MAC_DROP_FAILED_ENQUEUE', 'WIFI_MAC_DROP_EXPIRED_LIFETIME', 'WIFI_MAC_DROP_REACHED_RETRY_LIMIT', 'WIFI_MAC_DROP_QOS_OLD_PACKET'])
     ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacType [enumeration]
     module.add_enum('WifiMacType', ['WIFI_MAC_CTL_TRIGGER', 'WIFI_MAC_CTL_CTLWRAPPER', 'WIFI_MAC_CTL_RTS', 'WIFI_MAC_CTL_CTS', 'WIFI_MAC_CTL_ACK', 'WIFI_MAC_CTL_BACKREQ', 'WIFI_MAC_CTL_BACKRESP', 'WIFI_MAC_CTL_END', 'WIFI_MAC_CTL_END_ACK', 'WIFI_MAC_MGT_BEACON', 'WIFI_MAC_MGT_ASSOCIATION_REQUEST', 'WIFI_MAC_MGT_ASSOCIATION_RESPONSE', 'WIFI_MAC_MGT_DISASSOCIATION', 'WIFI_MAC_MGT_REASSOCIATION_REQUEST', 'WIFI_MAC_MGT_REASSOCIATION_RESPONSE', 'WIFI_MAC_MGT_PROBE_REQUEST', 'WIFI_MAC_MGT_PROBE_RESPONSE', 'WIFI_MAC_MGT_AUTHENTICATION', 'WIFI_MAC_MGT_DEAUTHENTICATION', 'WIFI_MAC_MGT_ACTION', 'WIFI_MAC_MGT_ACTION_NO_ACK', 'WIFI_MAC_MGT_MULTIHOP_ACTION', 'WIFI_MAC_DATA', 'WIFI_MAC_DATA_CFACK', 'WIFI_MAC_DATA_CFPOLL', 'WIFI_MAC_DATA_CFACK_CFPOLL', 'WIFI_MAC_DATA_NULL', 'WIFI_MAC_DATA_NULL_CFACK', 'WIFI_MAC_DATA_NULL_CFPOLL', 'WIFI_MAC_DATA_NULL_CFACK_CFPOLL', 'WIFI_MAC_QOSDATA', 'WIFI_MAC_QOSDATA_CFACK', 'WIFI_MAC_QOSDATA_CFPOLL', 'WIFI_MAC_QOSDATA_CFACK_CFPOLL', 'WIFI_MAC_QOSDATA_NULL', 'WIFI_MAC_QOSDATA_NULL_CFPOLL', 'WIFI_MAC_QOSDATA_NULL_CFACK_CFPOLL'])
     ## wifi-mac.h (module 'wifi'): ns3::TypeOfStation [enumeration]
     module.add_enum('TypeOfStation', ['STA', 'AP', 'ADHOC_STA', 'MESH', 'OCB'])
-    ## wifi-standards.h (module 'wifi'): ns3::WifiPhyStandard [enumeration]
-    module.add_enum('WifiPhyStandard', ['WIFI_PHY_STANDARD_80211a', 'WIFI_PHY_STANDARD_80211b', 'WIFI_PHY_STANDARD_80211g', 'WIFI_PHY_STANDARD_80211p', 'WIFI_PHY_STANDARD_80211n', 'WIFI_PHY_STANDARD_80211ac', 'WIFI_PHY_STANDARD_80211ax', 'WIFI_PHY_STANDARD_UNSPECIFIED'])
-    ## wifi-standards.h (module 'wifi'): ns3::WifiMacStandard [enumeration]
-    module.add_enum('WifiMacStandard', ['WIFI_MAC_STANDARD_80211', 'WIFI_MAC_STANDARD_80211n', 'WIFI_MAC_STANDARD_80211ac', 'WIFI_MAC_STANDARD_80211ax'])
+    ## wifi-mpdu-type.h (module 'wifi'): ns3::MpduType [enumeration]
+    module.add_enum('MpduType', ['NORMAL_MPDU', 'SINGLE_MPDU', 'FIRST_MPDU_IN_AGGREGATE', 'MIDDLE_MPDU_IN_AGGREGATE', 'LAST_MPDU_IN_AGGREGATE'])
     ## wifi-standards.h (module 'wifi'): ns3::WifiStandard [enumeration]
-    module.add_enum('WifiStandard', ['WIFI_STANDARD_80211a', 'WIFI_STANDARD_80211b', 'WIFI_STANDARD_80211g', 'WIFI_STANDARD_80211p', 'WIFI_STANDARD_80211n_2_4GHZ', 'WIFI_STANDARD_80211n_5GHZ', 'WIFI_STANDARD_80211ac', 'WIFI_STANDARD_80211ax_2_4GHZ', 'WIFI_STANDARD_80211ax_5GHZ', 'WIFI_STANDARD_80211ax_6GHZ'])
+    module.add_enum('WifiStandard', ['WIFI_STANDARD_UNSPECIFIED', 'WIFI_STANDARD_80211a', 'WIFI_STANDARD_80211b', 'WIFI_STANDARD_80211g', 'WIFI_STANDARD_80211p', 'WIFI_STANDARD_80211n', 'WIFI_STANDARD_80211ac', 'WIFI_STANDARD_80211ax'])
     ## wifi-standards.h (module 'wifi'): ns3::FrequencyChannelType [enumeration]
     module.add_enum('FrequencyChannelType', ['WIFI_PHY_DSSS_CHANNEL', 'WIFI_PHY_OFDM_CHANNEL', 'WIFI_PHY_80211p_CHANNEL'])
     ## wifi-phy-band.h (module 'wifi'): ns3::WifiPhyBand [enumeration]
@@ -65,7 +59,7 @@
     ## wifi-phy-common.h (module 'wifi'): ns3::WifiPpduType [enumeration]
     module.add_enum('WifiPpduType', ['WIFI_PPDU_TYPE_SU', 'WIFI_PPDU_TYPE_DL_MU', 'WIFI_PPDU_TYPE_UL_MU'])
     ## wifi-phy-common.h (module 'wifi'): ns3::WifiPhyRxfailureReason [enumeration]
-    module.add_enum('WifiPhyRxfailureReason', ['UNKNOWN', 'UNSUPPORTED_SETTINGS', 'CHANNEL_SWITCHING', 'RXING', 'TXING', 'SLEEPING', 'BUSY_DECODING_PREAMBLE', 'PREAMBLE_DETECT_FAILURE', 'RECEPTION_ABORTED_BY_TX', 'L_SIG_FAILURE', 'HT_SIG_FAILURE', 'SIG_A_FAILURE', 'SIG_B_FAILURE', 'PREAMBLE_DETECTION_PACKET_SWITCH', 'FRAME_CAPTURE_PACKET_SWITCH', 'OBSS_PD_CCA_RESET', 'HE_TB_PPDU_TOO_LATE', 'FILTERED'])
+    module.add_enum('WifiPhyRxfailureReason', ['UNKNOWN', 'UNSUPPORTED_SETTINGS', 'CHANNEL_SWITCHING', 'RXING', 'TXING', 'SLEEPING', 'POWERED_OFF', 'TRUNCATED_TX', 'BUSY_DECODING_PREAMBLE', 'PREAMBLE_DETECT_FAILURE', 'RECEPTION_ABORTED_BY_TX', 'L_SIG_FAILURE', 'HT_SIG_FAILURE', 'SIG_A_FAILURE', 'SIG_B_FAILURE', 'PREAMBLE_DETECTION_PACKET_SWITCH', 'FRAME_CAPTURE_PACKET_SWITCH', 'OBSS_PD_CCA_RESET', 'HE_TB_PPDU_TOO_LATE', 'FILTERED'])
     ## log.h (module 'core'): ns3::LogLevel [enumeration]
     module.add_enum('LogLevel', ['LOG_NONE', 'LOG_ERROR', 'LOG_LEVEL_ERROR', 'LOG_WARN', 'LOG_LEVEL_WARN', 'LOG_DEBUG', 'LOG_LEVEL_DEBUG', 'LOG_INFO', 'LOG_LEVEL_INFO', 'LOG_FUNCTION', 'LOG_LEVEL_FUNCTION', 'LOG_LOGIC', 'LOG_LEVEL_LOGIC', 'LOG_ALL', 'LOG_LEVEL_ALL', 'LOG_PREFIX_FUNC', 'LOG_PREFIX_TIME', 'LOG_PREFIX_NODE', 'LOG_PREFIX_LEVEL', 'LOG_PREFIX_ALL'], import_from_module='ns.core')
     ## address.h (module 'network'): ns3::Address [class]
@@ -186,6 +180,8 @@
     module.add_class('EnergySourceHelper', allow_subclassing=True, import_from_module='ns.energy')
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'], import_from_module='ns.core')
     ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::GroupInfo [struct]
     module.add_class('GroupInfo')
     ## hash.h (module 'core'): ns3::Hasher [class]
@@ -401,24 +397,18 @@
     typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::ConstellationSizeCallback')
     typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::ConstellationSizeCallback*')
     typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::ConstellationSizeCallback&')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::PhyRateCallback')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::PhyRateCallback*')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::PhyRateCallback&')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::PhyRateFromTxVectorCallback')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::PhyRateFromTxVectorCallback*')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::PhyRateFromTxVectorCallback&')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::DataRateCallback')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::DataRateCallback*')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::DataRateCallback&')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::DataRateFromTxVectorCallback')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::DataRateFromTxVectorCallback*')
-    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::DataRateFromTxVectorCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::PhyRateCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::PhyRateCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::PhyRateCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::DataRateCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::DataRateCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::DataRateCallback&')
     typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::NonHtReferenceRateCallback')
     typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::NonHtReferenceRateCallback*')
     typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::NonHtReferenceRateCallback&')
-    typehandlers.add_type_alias('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::ModeAllowedCallback')
-    typehandlers.add_type_alias('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::ModeAllowedCallback*')
-    typehandlers.add_type_alias('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::ModeAllowedCallback&')
+    typehandlers.add_type_alias('ns3::Callback< bool, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::AllowedCallback')
+    typehandlers.add_type_alias('ns3::Callback< bool, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::AllowedCallback*')
+    typehandlers.add_type_alias('ns3::Callback< bool, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::AllowedCallback&')
     ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiNoAck [struct]
     module.add_class('WifiNoAck', parent=root_module['ns3::WifiAcknowledgment'])
     ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiNormalAck [struct]
@@ -431,6 +421,9 @@
     module.add_class('WifiPhyListener', allow_subclassing=True)
     ## wifi-phy-operating-channel.h (module 'wifi'): ns3::WifiPhyOperatingChannel [class]
     module.add_class('WifiPhyOperatingChannel')
+    typehandlers.add_type_alias('std::set< std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand > > const_iterator', 'ns3::WifiPhyOperatingChannel::ConstIterator')
+    typehandlers.add_type_alias('std::set< std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand > > const_iterator*', 'ns3::WifiPhyOperatingChannel::ConstIterator*')
+    typehandlers.add_type_alias('std::set< std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand > > const_iterator&', 'ns3::WifiPhyOperatingChannel::ConstIterator&')
     ## wifi-protection.h (module 'wifi'): ns3::WifiProtection [struct]
     module.add_class('WifiProtection', allow_subclassing=True)
     ## wifi-protection.h (module 'wifi'): ns3::WifiProtection::Method [enumeration]
@@ -460,8 +453,6 @@
     module.add_class('WifiSpectrumValue5MhzFactory', allow_subclassing=True, import_from_module='ns.spectrum')
     ## wifi-spectrum-value-helper.h (module 'spectrum'): ns3::WifiSpectrumValueHelper [class]
     module.add_class('WifiSpectrumValueHelper', import_from_module='ns.spectrum')
-    ## wifi-standards.h (module 'wifi'): ns3::WifiStandardInfo [struct]
-    module.add_class('WifiStandardInfo')
     ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters [class]
     module.add_class('WifiTxParameters')
     ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters::PsduInfo [struct]
@@ -536,6 +527,13 @@
     typehandlers.add_type_alias('void ( * ) ( uint8_t, double, bool, double, double )&', 'ns3::ObssPdAlgorithm::ResetTracedCallback&')
     ## pcap-file-wrapper.h (module 'network'): ns3::PcapFileWrapper [class]
     module.add_class('PcapFileWrapper', import_from_module='ns.network', parent=root_module['ns3::Object'])
+    ## phased-array-model.h (module 'antenna'): ns3::PhasedArrayModel [class]
+    module.add_class('PhasedArrayModel', import_from_module='ns.antenna', parent=root_module['ns3::Object'])
+    typehandlers.add_type_alias('std::vector< std::complex< double > >', 'ns3::PhasedArrayModel::ComplexVector')
+    typehandlers.add_type_alias('std::vector< std::complex< double > >*', 'ns3::PhasedArrayModel::ComplexVector*')
+    typehandlers.add_type_alias('std::vector< std::complex< double > >&', 'ns3::PhasedArrayModel::ComplexVector&')
+    ## phased-array-spectrum-propagation-loss-model.h (module 'spectrum'): ns3::PhasedArraySpectrumPropagationLossModel [class]
+    module.add_class('PhasedArraySpectrumPropagationLossModel', import_from_module='ns.spectrum', parent=root_module['ns3::Object'])
     ## preamble-detection-model.h (module 'wifi'): ns3::PreambleDetectionModel [class]
     module.add_class('PreambleDetectionModel', parent=root_module['ns3::Object'])
     ## propagation-delay-model.h (module 'propagation'): ns3::PropagationDelayModel [class]
@@ -554,51 +552,51 @@
     module.add_class('RangePropagationLossModel', import_from_module='ns.propagation', parent=root_module['ns3::PropagationLossModel'])
     ## random-variable-stream.h (module 'core'): ns3::SequentialRandomVariable [class]
     module.add_class('SequentialRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Event, ns3::empty, ns3::DefaultDeleter<ns3::Event> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Event, ns3::empty, ns3::DefaultDeleter<ns3::Event>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Event', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Event>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MacRxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacRxMiddle> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MacRxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacRxMiddle>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::MacRxMiddle', 'ns3::empty', 'ns3::DefaultDeleter<ns3::MacRxMiddle>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MacTxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacTxMiddle> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MacTxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacTxMiddle>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::MacTxMiddle', 'ns3::empty', 'ns3::DefaultDeleter<ns3::MacTxMiddle>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::OutputStreamWrapper', 'ns3::empty', 'ns3::DefaultDeleter<ns3::OutputStreamWrapper>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::PhyEntity', 'ns3::empty', 'ns3::DefaultDeleter<ns3::PhyEntity>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QosBlockedDestinations, ns3::empty, ns3::DefaultDeleter<ns3::QosBlockedDestinations> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QosBlockedDestinations, ns3::empty, ns3::DefaultDeleter<ns3::QosBlockedDestinations>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::QosBlockedDestinations', 'ns3::empty', 'ns3::DefaultDeleter<ns3::QosBlockedDestinations>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::QueueItem', 'ns3::empty', 'ns3::DefaultDeleter<ns3::QueueItem>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::SpectrumModel', 'ns3::empty', 'ns3::DefaultDeleter<ns3::SpectrumModel>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::SpectrumSignalParameters', 'ns3::empty', 'ns3::DefaultDeleter<ns3::SpectrumSignalParameters>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::SpectrumValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::SpectrumValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::WifiInformationElement', 'ns3::empty', 'ns3::DefaultDeleter<ns3::WifiInformationElement>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiMacQueueItem, ns3::empty, ns3::DefaultDeleter<ns3::WifiMacQueueItem> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiMacQueueItem, ns3::empty, ns3::DefaultDeleter<ns3::WifiMacQueueItem>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::WifiMacQueueItem', 'ns3::empty', 'ns3::DefaultDeleter<ns3::WifiMacQueueItem>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiPpdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPpdu> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiPpdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPpdu>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::WifiPpdu', 'ns3::empty', 'ns3::DefaultDeleter<ns3::WifiPpdu>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiPsdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPsdu> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiPsdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPsdu>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::WifiPsdu', 'ns3::empty', 'ns3::DefaultDeleter<ns3::WifiPsdu>'])
     ## snr-tag.h (module 'wifi'): ns3::SnrTag [class]
     module.add_class('SnrTag', parent=root_module['ns3::Tag'])
@@ -734,6 +732,9 @@
     typehandlers.add_type_alias('void ( * ) ( ns3::WifiTxVector, ns3::Time )', 'ns3::WifiPhy::PhyRxPayloadBeginTracedCallback')
     typehandlers.add_type_alias('void ( * ) ( ns3::WifiTxVector, ns3::Time )*', 'ns3::WifiPhy::PhyRxPayloadBeginTracedCallback*')
     typehandlers.add_type_alias('void ( * ) ( ns3::WifiTxVector, ns3::Time )&', 'ns3::WifiPhy::PhyRxPayloadBeginTracedCallback&')
+    typehandlers.add_type_alias('std::tuple< unsigned char, unsigned short, int, unsigned char >', 'ns3::WifiPhy::ChannelTuple')
+    typehandlers.add_type_alias('std::tuple< unsigned char, unsigned short, int, unsigned char >*', 'ns3::WifiPhy::ChannelTuple*')
+    typehandlers.add_type_alias('std::tuple< unsigned char, unsigned short, int, unsigned char >&', 'ns3::WifiPhy::ChannelTuple&')
     ## wifi-phy-state-helper.h (module 'wifi'): ns3::WifiPhyStateHelper [class]
     module.add_class('WifiPhyStateHelper', parent=root_module['ns3::Object'])
     typehandlers.add_type_alias('void ( * ) ( ns3::Time, ns3::Time, WifiPhyState )', 'ns3::WifiPhyStateHelper::StateTracedCallback')
@@ -786,6 +787,8 @@
     module.add_class('AarfWifiManager', parent=root_module['ns3::WifiRemoteStationManager'])
     ## aarfcd-wifi-manager.h (module 'wifi'): ns3::AarfcdWifiManager [class]
     module.add_class('AarfcdWifiManager', parent=root_module['ns3::WifiRemoteStationManager'])
+    ## adhoc-wifi-mac.h (module 'wifi'): ns3::AdhocWifiMac [class]
+    module.add_class('AdhocWifiMac', parent=root_module['ns3::WifiMac'])
     ## ampdu-subframe-header.h (module 'wifi'): ns3::AmpduSubframeHeader [class]
     module.add_class('AmpduSubframeHeader', parent=root_module['ns3::Header'])
     ## amrr-wifi-manager.h (module 'wifi'): ns3::AmrrWifiManager [class]
@@ -794,6 +797,8 @@
     module.add_class('AmsduSubframeHeader', parent=root_module['ns3::Header'])
     ## antenna-model.h (module 'antenna'): ns3::AntennaModel [class]
     module.add_class('AntennaModel', import_from_module='ns.antenna', parent=root_module['ns3::Object'])
+    ## ap-wifi-mac.h (module 'wifi'): ns3::ApWifiMac [class]
+    module.add_class('ApWifiMac', parent=root_module['ns3::WifiMac'])
     ## aparf-wifi-manager.h (module 'wifi'): ns3::AparfWifiManager [class]
     module.add_class('AparfWifiManager', parent=root_module['ns3::WifiRemoteStationManager'])
     ## aparf-wifi-manager.h (module 'wifi'): ns3::AparfWifiManager::State [enumeration]
@@ -1166,8 +1171,6 @@
     module.add_enum('ErrorUnit', ['ERROR_UNIT_BIT', 'ERROR_UNIT_BYTE', 'ERROR_UNIT_PACKET'], outer_class=root_module['ns3::RateErrorModel'], import_from_module='ns.network')
     ## error-model.h (module 'network'): ns3::ReceiveListErrorModel [class]
     module.add_class('ReceiveListErrorModel', import_from_module='ns.network', parent=root_module['ns3::ErrorModel'])
-    ## regular-wifi-mac.h (module 'wifi'): ns3::RegularWifiMac [class]
-    module.add_class('RegularWifiMac', parent=root_module['ns3::WifiMac'])
     ## rr-multi-user-scheduler.h (module 'wifi'): ns3::RrMultiUserScheduler [class]
     module.add_class('RrMultiUserScheduler', parent=root_module['ns3::MultiUserScheduler'])
     ## rraa-wifi-manager.h (module 'wifi'): ns3::RraaWifiManager [class]
@@ -1199,7 +1202,7 @@
     ## ssid.h (module 'wifi'): ns3::SsidValue [class]
     module.add_class('SsidValue', parent=root_module['ns3::AttributeValue'])
     ## sta-wifi-mac.h (module 'wifi'): ns3::StaWifiMac [class]
-    module.add_class('StaWifiMac', parent=root_module['ns3::RegularWifiMac'])
+    module.add_class('StaWifiMac', parent=root_module['ns3::WifiMac'])
     ## supported-rates.h (module 'wifi'): ns3::SupportedRates [class]
     module.add_class('SupportedRates', parent=root_module['ns3::WifiInformationElement'])
     ## table-based-error-rate-model.h (module 'wifi'): ns3::TableBasedErrorRateModel [class]
@@ -1274,26 +1277,20 @@
     module.add_class('AddressChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
     ## address.h (module 'network'): ns3::AddressValue [class]
     module.add_class('AddressValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
-    ## adhoc-wifi-mac.h (module 'wifi'): ns3::AdhocWifiMac [class]
-    module.add_class('AdhocWifiMac', parent=root_module['ns3::RegularWifiMac'])
     ## channel-condition-model.h (module 'propagation'): ns3::AlwaysLosChannelConditionModel [class]
     module.add_class('AlwaysLosChannelConditionModel', import_from_module='ns.propagation', parent=root_module['ns3::ChannelConditionModel'])
-    ## ap-wifi-mac.h (module 'wifi'): ns3::ApWifiMac [class]
-    module.add_class('ApWifiMac', parent=root_module['ns3::RegularWifiMac'])
     ## error-model.h (module 'network'): ns3::BinaryErrorModel [class]
     module.add_class('BinaryErrorModel', import_from_module='ns.network', parent=root_module['ns3::ErrorModel'])
     ## error-model.h (module 'network'): ns3::BurstErrorModel [class]
     module.add_class('BurstErrorModel', import_from_module='ns.network', parent=root_module['ns3::ErrorModel'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['bool', 'unsigned short', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['bool', 'const ns3::WifiTxVector &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['ns3::ObjectBase *', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned long', 'const ns3::WifiTxVector &', 'unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned long', 'unsigned short', 'unsigned short', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, bool, unsigned int, double, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
@@ -1330,8 +1327,8 @@
     module.add_class('CallbackImpl', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::WifiPhyRxfailureReason', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<const ns3::Packet>', 'std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int>>, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double>>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<const ns3::Packet>', 'std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int>>, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double>>>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, ns3::SignalNoiseDbm, unsigned short, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'ns3::WifiTxVector', 'ns3::MpduInfo', 'ns3::SignalNoiseDbm', 'unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
@@ -1350,8 +1347,8 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::SpectrumSignalParameters>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::WifiMacQueueItem>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::WifiPsdu>', 'ns3::RxSignalInfo', 'ns3::WifiTxVector', 'std::vector<bool, std::allocator<bool> >', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::WifiPsdu>', 'ns3::RxSignalInfo', 'ns3::WifiTxVector', 'std::vector<bool, std::allocator<bool>>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::WifiPsdu>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::Mac48Address, unsigned char, ns3::OriginatorBlockAckAgreement::State, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
@@ -1368,16 +1365,16 @@
     module.add_class('CallbackImpl', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::WifiTxVector', 'ns3::Time', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >', 'ns3::WifiTxVector', 'double', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu>>>>, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu>>>>', 'ns3::WifiTxVector', 'double', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, double, bool, double, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned char', 'double', 'bool', 'double', 'double', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned char', 'ns3::Ptr<const ns3::WifiMacQueueItem>', 'const ns3::WifiTxVector &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned char', 'ns3::Ptr<const ns3::WifiPsdu>', 'const ns3::WifiTxVector &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned char', 'std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *', 'const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *', 'unsigned long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned char', 'std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *', 'const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *', 'unsigned long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
@@ -1434,13 +1431,14 @@
     module.add_container('ns3::HeRu::SubcarrierGroup', 'std::pair< short, short >', container_type='vector')
     module.add_container('std::map< std::pair< unsigned char, ns3::HeRu::RuType >, std::vector< std::vector< std::pair< short, short > > > >', ('std::pair< unsigned char, ns3::HeRu::RuType >', 'std::vector< std::vector< std::pair< short, short > > >'), container_type='map')
     module.add_container('std::map< std::pair< unsigned int, unsigned int >, double >', ('std::pair< unsigned int, unsigned int >', 'double'), container_type='map')
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     module.add_container('ns3::TxTime', ('ns3::WifiMode', 'ns3::Time'), container_type='map')
     module.add_container('std::map< ns3::Mac48Address, ns3::WifiDlMuAggregateTf::BlockAckInfo >', ('ns3::Mac48Address', 'ns3::WifiDlMuAggregateTf::BlockAckInfo'), container_type='map')
     module.add_container('std::map< ns3::Mac48Address, ns3::WifiDlMuBarBaSequence::AckInfo >', ('ns3::Mac48Address', 'ns3::WifiDlMuBarBaSequence::AckInfo'), container_type='map')
     module.add_container('std::map< ns3::Mac48Address, ns3::WifiDlMuBarBaSequence::BlockAckInfo >', ('ns3::Mac48Address', 'ns3::WifiDlMuBarBaSequence::BlockAckInfo'), container_type='map')
     module.add_container('std::map< ns3::Mac48Address, ns3::WifiDlMuBarBaSequence::BlockAckReqInfo >', ('ns3::Mac48Address', 'ns3::WifiDlMuBarBaSequence::BlockAckReqInfo'), container_type='map')
     module.add_container('std::map< ns3::Mac48Address, ns3::WifiDlMuTfMuBar::BlockAckInfo >', ('ns3::Mac48Address', 'ns3::WifiDlMuTfMuBar::BlockAckInfo'), container_type='map')
+    module.add_container('std::set< std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand > >', 'std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand >', container_type='set')
     module.add_container('ns3::WifiModeList', 'ns3::WifiMode', container_type='vector')
     module.add_container('std::vector< std::pair< unsigned int, unsigned int > >', 'std::pair< unsigned int, unsigned int >', container_type='vector')
     module.add_container('std::map< unsigned char, std::set< unsigned short > >', ('unsigned char', 'std::set< unsigned short >'), container_type='map')
@@ -1449,9 +1447,10 @@
     module.add_container('std::map< std::pair< ns3::Mac48Address, unsigned char >, unsigned long >', ('std::pair< ns3::Mac48Address, unsigned char >', 'long unsigned int'), container_type='map')
     module.add_container('ns3::MinstrelRate', 'ns3::RateInfo', container_type='vector')
     module.add_container('ns3::SampleRate', 'std::vector< unsigned char >', container_type='vector')
+    module.add_container('std::vector< std::complex< double > >', 'std::complex< double >', container_type='vector')
+    module.add_container('ns3::PhasedArrayModel::ComplexVector', 'std::complex< double >', container_type='vector')
     module.add_container('std::vector< ns3::BandInfo >', 'ns3::BandInfo', container_type='vector')
     module.add_container('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > >', 'std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader >', container_type='list')
-    module.add_container('std::set< std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand > >', 'std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand >', container_type='set')
     module.add_container('ns3::WifiConstPsduMap', ('short unsigned int', 'ns3::Ptr< ns3::WifiPsdu const >'), container_type='map')
     module.add_container('std::list< ns3::WifiMode >', 'ns3::WifiMode', container_type='list')
     module.add_container('std::list< unsigned char >', 'unsigned char', container_type='list')
@@ -1462,6 +1461,7 @@
     module.add_container('std::set< unsigned char >', 'unsigned char', container_type='set')
     module.add_container('std::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStation *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStation * > > >', ('ns3::Mac48Address', 'ns3::WifiRemoteStation *'), container_type='map')
     module.add_container('std::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStationState *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStationState * > > >', ('ns3::Mac48Address', 'ns3::WifiRemoteStationState *'), container_type='map')
+    module.add_container('std::map< unsigned short, ns3::Mac48Address >', ('short unsigned int', 'ns3::Mac48Address'), container_type='map')
     module.add_container('std::vector< unsigned int >', 'unsigned int', container_type='vector')
     module.add_container('std::list< unsigned int >', 'unsigned int', container_type='list')
     module.add_container('std::map< ns3::AcIndex, ns3::Ptr< ns3::QosTxop > >', ('ns3::AcIndex', 'ns3::Ptr< ns3::QosTxop >'), container_type='map')
@@ -1469,7 +1469,6 @@
     module.add_container('ns3::WifiPsduMap', ('short unsigned int', 'ns3::Ptr< ns3::WifiPsdu >'), container_type='map')
     module.add_container('std::map< ns3::WifiPpduField, std::pair< std::pair< ns3::Time, ns3::Time >, ns3::WifiMode > >', ('ns3::WifiPpduField', 'std::pair< std::pair< ns3::Time, ns3::Time >, ns3::WifiMode >'), container_type='map')
     module.add_container('ns3::PhyEntity::PhyHeaderSections', ('ns3::WifiPpduField', 'std::pair< std::pair< ns3::Time, ns3::Time >, ns3::WifiMode >'), container_type='map')
-    module.add_container('std::map< unsigned short, ns3::Mac48Address >', ('short unsigned int', 'ns3::Mac48Address'), container_type='map')
     module.add_container('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > >', ('short unsigned int', 'ns3::Ptr< ns3::WifiPsdu >'), container_type='map')
     module.add_container('std::set< ns3::Mac48Address >', 'ns3::Mac48Address', container_type='set')
     module.add_container('std::map< ns3::WifiPreamble, std::vector< ns3::WifiPpduField > >', ('ns3::WifiPreamble', 'std::vector< ns3::WifiPpduField >'), container_type='map')
@@ -1485,6 +1484,9 @@
     typehandlers.add_type_alias('ns3::Vector3DChecker*', 'ns3::VectorChecker*')
     typehandlers.add_type_alias('ns3::Vector3DChecker&', 'ns3::VectorChecker&')
     module.add_typedef(root_module['ns3::Vector3DChecker'], 'VectorChecker')
+    typehandlers.add_type_alias('std::vector< std::pair< double, double > >', 'ns3::SnrPerTable')
+    typehandlers.add_type_alias('std::vector< std::pair< double, double > >*', 'ns3::SnrPerTable*')
+    typehandlers.add_type_alias('std::vector< std::pair< double, double > >&', 'ns3::SnrPerTable&')
     typehandlers.add_type_alias('std::vector< std::pair< ns3::WifiRrpaaThresholds, ns3::WifiMode > >', 'ns3::RrpaaThresholdsTable')
     typehandlers.add_type_alias('std::vector< std::pair< ns3::WifiRrpaaThresholds, ns3::WifiMode > >*', 'ns3::RrpaaThresholdsTable*')
     typehandlers.add_type_alias('std::vector< std::pair< ns3::WifiRrpaaThresholds, ns3::WifiMode > >&', 'ns3::RrpaaThresholdsTable&')
@@ -1494,9 +1496,6 @@
     typehandlers.add_type_alias('std::vector< std::pair< ns3::WifiRraaThresholds, ns3::WifiMode > >', 'ns3::RraaThresholdsTable')
     typehandlers.add_type_alias('std::vector< std::pair< ns3::WifiRraaThresholds, ns3::WifiMode > >*', 'ns3::RraaThresholdsTable*')
     typehandlers.add_type_alias('std::vector< std::pair< ns3::WifiRraaThresholds, ns3::WifiMode > >&', 'ns3::RraaThresholdsTable&')
-    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > >', 'ns3::WifiPsduMap')
-    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > >*', 'ns3::WifiPsduMap*')
-    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > >&', 'ns3::WifiPsduMap&')
     typehandlers.add_type_alias('std::map< ns3::WifiMode, ns3::Time >', 'ns3::TxTime')
     typehandlers.add_type_alias('std::map< ns3::WifiMode, ns3::Time >*', 'ns3::TxTime*')
     typehandlers.add_type_alias('std::map< ns3::WifiMode, ns3::Time >&', 'ns3::TxTime&')
@@ -1515,9 +1514,18 @@
     typehandlers.add_type_alias('std::vector< std::vector< unsigned char > >', 'ns3::SampleRate')
     typehandlers.add_type_alias('std::vector< std::vector< unsigned char > >*', 'ns3::SampleRate*')
     typehandlers.add_type_alias('std::vector< std::vector< unsigned char > >&', 'ns3::SampleRate&')
+    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > >', 'ns3::WifiPsduMap')
+    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > >*', 'ns3::WifiPsduMap*')
+    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > >&', 'ns3::WifiPsduMap&')
     typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'ns3::WifiConstPsduMap')
     typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >*', 'ns3::WifiConstPsduMap*')
     typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >&', 'ns3::WifiConstPsduMap&')
+    typehandlers.add_type_alias('uint8_t', 'ns3::WifiInformationElementId')
+    typehandlers.add_type_alias('uint8_t*', 'ns3::WifiInformationElementId*')
+    typehandlers.add_type_alias('uint8_t&', 'ns3::WifiInformationElementId&')
+    typehandlers.add_type_alias('std::pair< ns3::Mac48Address, unsigned char >', 'ns3::WifiAddressTidPair')
+    typehandlers.add_type_alias('std::pair< ns3::Mac48Address, unsigned char >*', 'ns3::WifiAddressTidPair*')
+    typehandlers.add_type_alias('std::pair< ns3::Mac48Address, unsigned char >&', 'ns3::WifiAddressTidPair&')
     typehandlers.add_type_alias('std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand >', 'ns3::FrequencyChannelInfo')
     typehandlers.add_type_alias('std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand >*', 'ns3::FrequencyChannelInfo*')
     typehandlers.add_type_alias('std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand >&', 'ns3::FrequencyChannelInfo&')
@@ -1527,9 +1535,6 @@
     typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::RxErrorCallback')
     typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::RxErrorCallback*')
     typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::RxErrorCallback&')
-    typehandlers.add_type_alias('std::vector< std::pair< double, double > >', 'ns3::SnrPerTable')
-    typehandlers.add_type_alias('std::vector< std::pair< double, double > >*', 'ns3::SnrPerTable*')
-    typehandlers.add_type_alias('std::vector< std::pair< double, double > >&', 'ns3::SnrPerTable&')
     typehandlers.add_type_alias('std::map< std::pair< unsigned int, unsigned int >, double >', 'ns3::RxPowerWattPerChannelBand')
     typehandlers.add_type_alias('std::map< std::pair< unsigned int, unsigned int >, double >*', 'ns3::RxPowerWattPerChannelBand*')
     typehandlers.add_type_alias('std::map< std::pair< unsigned int, unsigned int >, double >&', 'ns3::RxPowerWattPerChannelBand&')
@@ -1545,12 +1550,6 @@
     typehandlers.add_type_alias('uint32_t', 'ns3::SpectrumModelUid_t')
     typehandlers.add_type_alias('uint32_t*', 'ns3::SpectrumModelUid_t*')
     typehandlers.add_type_alias('uint32_t&', 'ns3::SpectrumModelUid_t&')
-    typehandlers.add_type_alias('uint8_t', 'ns3::WifiInformationElementId')
-    typehandlers.add_type_alias('uint8_t*', 'ns3::WifiInformationElementId*')
-    typehandlers.add_type_alias('uint8_t&', 'ns3::WifiInformationElementId&')
-    typehandlers.add_type_alias('std::pair< ns3::Mac48Address, unsigned char >', 'ns3::WifiAddressTidPair')
-    typehandlers.add_type_alias('std::pair< ns3::Mac48Address, unsigned char >*', 'ns3::WifiAddressTidPair*')
-    typehandlers.add_type_alias('std::pair< ns3::Mac48Address, unsigned char >&', 'ns3::WifiAddressTidPair&')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode >', 'ns3::WifiModeList')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode >*', 'ns3::WifiModeList*')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode >&', 'ns3::WifiModeList&')
@@ -1628,6 +1627,12 @@
 def register_types_ns3_TracedValueCallback(module):
     root_module = module.get_root()
     
+    typehandlers.add_type_alias('void ( * ) ( ns3::Time, ns3::Time )', 'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Time, ns3::Time )*', 'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Time, ns3::Time )&', 'ns3::TracedValueCallback::Time&')
+    typehandlers.add_type_alias('void ( * ) ( ns3::DataRate, ns3::DataRate )', 'ns3::TracedValueCallback::DataRate')
+    typehandlers.add_type_alias('void ( * ) ( ns3::DataRate, ns3::DataRate )*', 'ns3::TracedValueCallback::DataRate*')
+    typehandlers.add_type_alias('void ( * ) ( ns3::DataRate, ns3::DataRate )&', 'ns3::TracedValueCallback::DataRate&')
     typehandlers.add_type_alias('void ( * ) ( bool, bool )', 'ns3::TracedValueCallback::Bool')
     typehandlers.add_type_alias('void ( * ) ( bool, bool )*', 'ns3::TracedValueCallback::Bool*')
     typehandlers.add_type_alias('void ( * ) ( bool, bool )&', 'ns3::TracedValueCallback::Bool&')
@@ -1661,12 +1666,6 @@
     typehandlers.add_type_alias('void ( * ) (  )', 'ns3::TracedValueCallback::Void')
     typehandlers.add_type_alias('void ( * ) (  )*', 'ns3::TracedValueCallback::Void*')
     typehandlers.add_type_alias('void ( * ) (  )&', 'ns3::TracedValueCallback::Void&')
-    typehandlers.add_type_alias('void ( * ) ( ns3::DataRate, ns3::DataRate )', 'ns3::TracedValueCallback::DataRate')
-    typehandlers.add_type_alias('void ( * ) ( ns3::DataRate, ns3::DataRate )*', 'ns3::TracedValueCallback::DataRate*')
-    typehandlers.add_type_alias('void ( * ) ( ns3::DataRate, ns3::DataRate )&', 'ns3::TracedValueCallback::DataRate&')
-    typehandlers.add_type_alias('void ( * ) ( ns3::Time, ns3::Time )', 'ns3::TracedValueCallback::Time')
-    typehandlers.add_type_alias('void ( * ) ( ns3::Time, ns3::Time )*', 'ns3::TracedValueCallback::Time*')
-    typehandlers.add_type_alias('void ( * ) ( ns3::Time, ns3::Time )&', 'ns3::TracedValueCallback::Time&')
 
 def register_types_ns3_internal(module):
     root_module = module.get_root()
@@ -1817,7 +1816,6 @@
     register_Ns3WifiRtsCtsProtection_methods(root_module, root_module['ns3::WifiRtsCtsProtection'])
     register_Ns3WifiSpectrumValue5MhzFactory_methods(root_module, root_module['ns3::WifiSpectrumValue5MhzFactory'])
     register_Ns3WifiSpectrumValueHelper_methods(root_module, root_module['ns3::WifiSpectrumValueHelper'])
-    register_Ns3WifiStandardInfo_methods(root_module, root_module['ns3::WifiStandardInfo'])
     register_Ns3WifiTxParameters_methods(root_module, root_module['ns3::WifiTxParameters'])
     register_Ns3WifiTxParametersPsduInfo_methods(root_module, root_module['ns3::WifiTxParameters::PsduInfo'])
     register_Ns3WifiTxTimer_methods(root_module, root_module['ns3::WifiTxTimer'])
@@ -1844,6 +1842,8 @@
     register_Ns3ObjectAggregateIterator_methods(root_module, root_module['ns3::Object::AggregateIterator'])
     register_Ns3ObssPdAlgorithm_methods(root_module, root_module['ns3::ObssPdAlgorithm'])
     register_Ns3PcapFileWrapper_methods(root_module, root_module['ns3::PcapFileWrapper'])
+    register_Ns3PhasedArrayModel_methods(root_module, root_module['ns3::PhasedArrayModel'])
+    register_Ns3PhasedArraySpectrumPropagationLossModel_methods(root_module, root_module['ns3::PhasedArraySpectrumPropagationLossModel'])
     register_Ns3PreambleDetectionModel_methods(root_module, root_module['ns3::PreambleDetectionModel'])
     register_Ns3PropagationDelayModel_methods(root_module, root_module['ns3::PropagationDelayModel'])
     register_Ns3PropagationLossModel_methods(root_module, root_module['ns3::PropagationLossModel'])
@@ -1925,10 +1925,12 @@
     register_Ns3ZipfRandomVariable_methods(root_module, root_module['ns3::ZipfRandomVariable'])
     register_Ns3AarfWifiManager_methods(root_module, root_module['ns3::AarfWifiManager'])
     register_Ns3AarfcdWifiManager_methods(root_module, root_module['ns3::AarfcdWifiManager'])
+    register_Ns3AdhocWifiMac_methods(root_module, root_module['ns3::AdhocWifiMac'])
     register_Ns3AmpduSubframeHeader_methods(root_module, root_module['ns3::AmpduSubframeHeader'])
     register_Ns3AmrrWifiManager_methods(root_module, root_module['ns3::AmrrWifiManager'])
     register_Ns3AmsduSubframeHeader_methods(root_module, root_module['ns3::AmsduSubframeHeader'])
     register_Ns3AntennaModel_methods(root_module, root_module['ns3::AntennaModel'])
+    register_Ns3ApWifiMac_methods(root_module, root_module['ns3::ApWifiMac'])
     register_Ns3AparfWifiManager_methods(root_module, root_module['ns3::AparfWifiManager'])
     register_Ns3ArfWifiManager_methods(root_module, root_module['ns3::ArfWifiManager'])
     register_Ns3AthstatsWifiTraceSink_methods(root_module, root_module['ns3::AthstatsWifiTraceSink'])
@@ -2058,7 +2060,6 @@
     register_Ns3QueueSizeValue_methods(root_module, root_module['ns3::QueueSizeValue'])
     register_Ns3RateErrorModel_methods(root_module, root_module['ns3::RateErrorModel'])
     register_Ns3ReceiveListErrorModel_methods(root_module, root_module['ns3::ReceiveListErrorModel'])
-    register_Ns3RegularWifiMac_methods(root_module, root_module['ns3::RegularWifiMac'])
     register_Ns3RrMultiUserScheduler_methods(root_module, root_module['ns3::RrMultiUserScheduler'])
     register_Ns3RraaWifiManager_methods(root_module, root_module['ns3::RraaWifiManager'])
     register_Ns3RrpaaWifiManager_methods(root_module, root_module['ns3::RrpaaWifiManager'])
@@ -2102,16 +2103,13 @@
     register_Ns3YansWifiChannel_methods(root_module, root_module['ns3::YansWifiChannel'])
     register_Ns3AddressChecker_methods(root_module, root_module['ns3::AddressChecker'])
     register_Ns3AddressValue_methods(root_module, root_module['ns3::AddressValue'])
-    register_Ns3AdhocWifiMac_methods(root_module, root_module['ns3::AdhocWifiMac'])
     register_Ns3AlwaysLosChannelConditionModel_methods(root_module, root_module['ns3::AlwaysLosChannelConditionModel'])
-    register_Ns3ApWifiMac_methods(root_module, root_module['ns3::ApWifiMac'])
     register_Ns3BinaryErrorModel_methods(root_module, root_module['ns3::BinaryErrorModel'])
     register_Ns3BurstErrorModel_methods(root_module, root_module['ns3::BurstErrorModel'])
-    register_Ns3CallbackImpl__Bool_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Bool_Const_ns3WifiTxVector___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Ns3ObjectBase___star___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Unsigned_long_Const_ns3WifiTxVector___amp___Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3CallbackImpl__Unsigned_long_Unsigned_short_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Bool_Unsigned_int_Double_Ns3Time_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, bool, unsigned int, double, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Const_ns3WifiMacHeader___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, const ns3::WifiMacHeader &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
@@ -2130,7 +2128,7 @@
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Ns3WifiMode_Ns3WifiPreamble_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::Packet>, ns3::WifiMode, ns3::WifiPreamble, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Ns3WifiPhyRxfailureReason_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::Packet>, ns3::WifiPhyRxfailureReason, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::Packet>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___StdMap__lt__stdPair__lt__unsigned_int__unsigned_int__gt____double__stdLess__lt__stdPair__lt__unsigned_int__unsigned_int__gt_____gt____stdAllocator__lt__stdPair__lt__const_stdPair__lt__unsigned_int__unsigned_int__gt____double__gt_____gt_____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___StdMap__lt__stdPair__lt__unsigned_int__unsigned_int__gt____double__stdLess__lt__stdPair__lt__unsigned_int__unsigned_int__gt____gt____stdAllocator__lt__stdPair__lt__const_stdPair__lt__unsigned_int__unsigned_int__gt____double__gt____gt____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int>>, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double>>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_short_Ns3WifiTxVector_Ns3MpduInfo_Ns3SignalNoiseDbm_Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, ns3::SignalNoiseDbm, unsigned short, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_short_Ns3WifiTxVector_Ns3MpduInfo_Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3QueueDiscItem__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::QueueDiscItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
@@ -2140,7 +2138,7 @@
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3NetDevice__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::NetDevice>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3SpectrumSignalParameters__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::SpectrumSignalParameters>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiMacQueueItem__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiPsdu__gt___Ns3RxSignalInfo_Ns3WifiTxVector_StdVector__lt__bool__stdAllocator__lt__bool__gt_____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiPsdu__gt___Ns3RxSignalInfo_Ns3WifiTxVector_StdVector__lt__bool__stdAllocator__lt__bool__gt____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiPsdu__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::WifiPsdu>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Time_Ns3Mac48Address_Unsigned_char_Ns3OriginatorBlockAckAgreementState_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Time, ns3::Mac48Address, unsigned char, ns3::OriginatorBlockAckAgreement::State, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Time_Ns3Time_WifiPhyState_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Time, ns3::Time, WifiPhyState, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
@@ -2149,11 +2147,11 @@
     register_Ns3CallbackImpl__Void_Ns3WifiMacDropReason_Ns3Ptr__lt__const_ns3WifiMacQueueItem__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3WifiTxVector_Ns3Time_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::WifiTxVector, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3CallbackImpl__Void_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__const_ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__const_ns3WifiPsdu__gt_____gt_____gt_____gt___Ns3WifiTxVector_Double_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__const_ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__const_ns3WifiPsdu__gt____gt____gt____gt___Ns3WifiTxVector_Double_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu>>>>, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Unsigned_char_Double_Bool_Double_Double_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned char, double, bool, double, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Unsigned_char_Ns3Ptr__lt__const_ns3WifiMacQueueItem__gt___Const_ns3WifiTxVector___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Unsigned_char_Ns3Ptr__lt__const_ns3WifiPsdu__gt___Const_ns3WifiTxVector___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3CallbackImpl__Void_Unsigned_char_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt_____gt_____gt_____gt_____star___Const_stdSet__lt__ns3Mac48Address__stdLess__lt__ns3Mac48Address__gt____stdAllocator__lt__ns3Mac48Address__gt_____gt_____star___Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Unsigned_char_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt____gt____gt____gt_____star___Const_stdSet__lt__ns3Mac48Address__stdLess__lt__ns3Mac48Address__gt____stdAllocator__lt__ns3Mac48Address__gt____gt_____star___Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Unsigned_int_Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Unsigned_long_Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned long, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
@@ -2640,7 +2638,7 @@
     cls.add_constructor([])
     ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::BlockAckType(ns3::BlockAckType::Variant v) [constructor]
     cls.add_constructor([param('ns3::BlockAckType::Variant', 'v')])
-    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::BlockAckType(ns3::BlockAckType::Variant v, std::vector<unsigned char, std::allocator<unsigned char> > l) [constructor]
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::BlockAckType(ns3::BlockAckType::Variant v, std::vector<unsigned char, std::allocator<unsigned char>> l) [constructor]
     cls.add_constructor([param('ns3::BlockAckType::Variant', 'v'), param('std::vector< unsigned char >', 'l')])
     ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::m_bitmapLen [variable]
     cls.add_instance_attribute('m_bitmapLen', 'std::vector< unsigned char >', is_const=False)
@@ -2657,11 +2655,11 @@
     cls.add_method('Advance', 
                    'void', 
                    [param('std::size_t', 'count')])
-    ## block-ack-window.h (module 'wifi'): std::vector<bool, std::allocator<bool> >::reference ns3::BlockAckWindow::At(std::size_t distance) [member function]
+    ## block-ack-window.h (module 'wifi'): std::vector<bool, std::allocator<bool>>::reference ns3::BlockAckWindow::At(std::size_t distance) [member function]
     cls.add_method('At', 
                    'std::vector< bool > reference', 
                    [param('std::size_t', 'distance')])
-    ## block-ack-window.h (module 'wifi'): std::vector<bool, std::allocator<bool> >::const_reference ns3::BlockAckWindow::At(std::size_t distance) const [member function]
+    ## block-ack-window.h (module 'wifi'): std::vector<bool, std::allocator<bool>>::const_reference ns3::BlockAckWindow::At(std::size_t distance) const [member function]
     cls.add_method('At', 
                    'std::vector< bool > const_reference', 
                    [param('std::size_t', 'distance')], 
@@ -3860,6 +3858,8 @@
     return
 
 def register_Ns3HeMuUserInfo_methods(root_module, cls):
+    cls.add_binary_comparison_operator('==')
+    cls.add_binary_comparison_operator('!=')
     ## wifi-tx-vector.h (module 'wifi'): ns3::HeMuUserInfo::HeMuUserInfo() [constructor]
     cls.add_constructor([])
     ## wifi-tx-vector.h (module 'wifi'): ns3::HeMuUserInfo::HeMuUserInfo(ns3::HeMuUserInfo const & arg0) [constructor]
@@ -3877,7 +3877,7 @@
     cls.add_constructor([])
     ## he-ru.h (module 'wifi'): ns3::HeRu::HeRu(ns3::HeRu const & arg0) [constructor]
     cls.add_constructor([param('ns3::HeRu const &', 'arg0')])
-    ## he-ru.h (module 'wifi'): static bool ns3::HeRu::DoesOverlap(uint16_t bw, ns3::HeRu::RuSpec ru, std::vector<ns3::HeRu::RuSpec, std::allocator<ns3::HeRu::RuSpec> > const & v) [member function]
+    ## he-ru.h (module 'wifi'): static bool ns3::HeRu::DoesOverlap(uint16_t bw, ns3::HeRu::RuSpec ru, std::vector<ns3::HeRu::RuSpec, std::allocator<ns3::HeRu::RuSpec>> const & v) [member function]
     cls.add_method('DoesOverlap', 
                    'bool', 
                    [param('uint16_t', 'bw'), param('ns3::HeRu::RuSpec', 'ru'), param('std::vector< ns3::HeRu::RuSpec > const &', 'v')], 
@@ -3897,7 +3897,7 @@
                    'uint16_t', 
                    [param('ns3::HeRu::RuType', 'ruType')], 
                    is_static=True)
-    ## he-ru.h (module 'wifi'): static std::vector<ns3::HeRu::RuSpec, std::allocator<ns3::HeRu::RuSpec> > ns3::HeRu::GetCentral26TonesRus(uint16_t bw, ns3::HeRu::RuType ruType) [member function]
+    ## he-ru.h (module 'wifi'): static std::vector<ns3::HeRu::RuSpec, std::allocator<ns3::HeRu::RuSpec>> ns3::HeRu::GetCentral26TonesRus(uint16_t bw, ns3::HeRu::RuType ruType) [member function]
     cls.add_method('GetCentral26TonesRus', 
                    'std::vector< ns3::HeRu::RuSpec >', 
                    [param('uint16_t', 'bw'), param('ns3::HeRu::RuType', 'ruType')], 
@@ -3917,7 +3917,7 @@
                    'ns3::HeRu::RuType', 
                    [param('uint16_t', 'bandwidth')], 
                    is_static=True)
-    ## he-ru.h (module 'wifi'): static std::vector<ns3::HeRu::RuSpec, std::allocator<ns3::HeRu::RuSpec> > ns3::HeRu::GetRusOfType(uint16_t bw, ns3::HeRu::RuType ruType) [member function]
+    ## he-ru.h (module 'wifi'): static std::vector<ns3::HeRu::RuSpec, std::allocator<ns3::HeRu::RuSpec>> ns3::HeRu::GetRusOfType(uint16_t bw, ns3::HeRu::RuType ruType) [member function]
     cls.add_method('GetRusOfType', 
                    'std::vector< ns3::HeRu::RuSpec >', 
                    [param('uint16_t', 'bw'), param('ns3::HeRu::RuType', 'ruType')], 
@@ -3933,6 +3933,8 @@
 
 def register_Ns3HeRuRuSpec_methods(root_module, cls):
     cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('!=')
+    cls.add_binary_comparison_operator('==')
     ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec::RuSpec(ns3::HeRu::RuSpec const & arg0) [constructor]
     cls.add_constructor([param('ns3::HeRu::RuSpec const &', 'arg0')])
     ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec::RuSpec() [constructor]
@@ -4998,6 +5000,8 @@
     cls.add_constructor([param('ns3::ObjectFactory const &', 'arg0')])
     ## object-factory.h (module 'core'): ns3::ObjectFactory::ObjectFactory() [constructor]
     cls.add_constructor([])
+    ## object-factory.h (module 'core'): ns3::ObjectFactory::ObjectFactory(std::string const & typeId) [constructor]
+    cls.add_constructor([param('std::string const &', 'typeId')])
     ## object-factory.h (module 'core'): ns3::Ptr<ns3::Object> ns3::ObjectFactory::Create() const [member function]
     cls.add_method('Create', 
                    'ns3::Ptr< ns3::Object >', 
@@ -6138,8 +6142,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -6441,7 +6445,7 @@
 def register_Ns3WifiAcknowledgment_methods(root_module, cls):
     ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiAcknowledgment::WifiAcknowledgment(ns3::WifiAcknowledgment::Method m) [constructor]
     cls.add_constructor([param('ns3::WifiAcknowledgment::Method', 'm')])
-    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiAcknowledgment::Copy() const [member function]
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment>> ns3::WifiAcknowledgment::Copy() const [member function]
     cls.add_method('Copy', 
                    'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
                    [], 
@@ -6500,7 +6504,7 @@
 def register_Ns3WifiBarBlockAck_methods(root_module, cls):
     ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiBarBlockAck::WifiBarBlockAck() [constructor]
     cls.add_constructor([])
-    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiBarBlockAck::Copy() const [member function]
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment>> ns3::WifiBarBlockAck::Copy() const [member function]
     cls.add_method('Copy', 
                    'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
                    [], 
@@ -6530,7 +6534,7 @@
 def register_Ns3WifiBlockAck_methods(root_module, cls):
     ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiBlockAck::WifiBlockAck() [constructor]
     cls.add_constructor([])
-    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiBlockAck::Copy() const [member function]
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment>> ns3::WifiBlockAck::Copy() const [member function]
     cls.add_method('Copy', 
                    'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
                    [], 
@@ -6563,7 +6567,7 @@
                    'bool', 
                    [param('ns3::Mac48Address', 'receiver'), param('uint8_t', 'tid'), param('ns3::WifiMacHeader::QosAckPolicy', 'ackPolicy')], 
                    is_const=True, is_virtual=True)
-    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiDlMuAggregateTf::Copy() const [member function]
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment>> ns3::WifiDlMuAggregateTf::Copy() const [member function]
     cls.add_method('Copy', 
                    'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
                    [], 
@@ -6604,7 +6608,7 @@
                    'bool', 
                    [param('ns3::Mac48Address', 'receiver'), param('uint8_t', 'tid'), param('ns3::WifiMacHeader::QosAckPolicy', 'ackPolicy')], 
                    is_const=True, is_virtual=True)
-    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiDlMuBarBaSequence::Copy() const [member function]
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment>> ns3::WifiDlMuBarBaSequence::Copy() const [member function]
     cls.add_method('Copy', 
                    'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
                    [], 
@@ -6667,7 +6671,7 @@
                    'bool', 
                    [param('ns3::Mac48Address', 'receiver'), param('uint8_t', 'tid'), param('ns3::WifiMacHeader::QosAckPolicy', 'ackPolicy')], 
                    is_const=True, is_virtual=True)
-    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiDlMuTfMuBar::Copy() const [member function]
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment>> ns3::WifiDlMuTfMuBar::Copy() const [member function]
     cls.add_method('Copy', 
                    'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
                    [], 
@@ -6709,6 +6713,10 @@
     cls.add_method('AssignStreams', 
                    'int64_t', 
                    [param('ns3::NetDeviceContainer', 'c'), param('int64_t', 'stream')])
+    ## wifi-helper.h (module 'wifi'): void ns3::WifiHelper::DisableFlowControl() [member function]
+    cls.add_method('DisableFlowControl', 
+                   'void', 
+                   [])
     ## wifi-helper.h (module 'wifi'): static void ns3::WifiHelper::EnableLogComponents() [member function]
     cls.add_method('EnableLogComponents', 
                    'void', 
@@ -6758,10 +6766,10 @@
     cls.add_constructor([param('ns3::WifiMacHelper const &', 'arg0')])
     ## wifi-mac-helper.h (module 'wifi'): ns3::WifiMacHelper::WifiMacHelper() [constructor]
     cls.add_constructor([])
-    ## wifi-mac-helper.h (module 'wifi'): ns3::Ptr<ns3::WifiMac> ns3::WifiMacHelper::Create(ns3::Ptr<ns3::NetDevice> device, ns3::WifiStandard standard) const [member function]
+    ## wifi-mac-helper.h (module 'wifi'): ns3::Ptr<ns3::WifiMac> ns3::WifiMacHelper::Create(ns3::Ptr<ns3::WifiNetDevice> device, ns3::WifiStandard standard) const [member function]
     cls.add_method('Create', 
                    'ns3::Ptr< ns3::WifiMac >', 
-                   [param('ns3::Ptr< ns3::NetDevice >', 'device'), param('ns3::WifiStandard', 'standard')], 
+                   [param('ns3::Ptr< ns3::WifiNetDevice >', 'device'), param('ns3::WifiStandard', 'standard')], 
                    is_const=True, is_virtual=True)
     return
 
@@ -6846,6 +6854,11 @@
                    'bool', 
                    [param('uint16_t', 'channelWidth'), param('uint8_t', 'nss')], 
                    is_const=True)
+    ## wifi-mode.h (module 'wifi'): bool ns3::WifiMode::IsAllowed(ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('IsAllowed', 
+                   'bool', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True)
     ## wifi-mode.h (module 'wifi'): bool ns3::WifiMode::IsHigherCodeRate(ns3::WifiMode mode) const [member function]
     cls.add_method('IsHigherCodeRate', 
                    'bool', 
@@ -6866,22 +6879,22 @@
 def register_Ns3WifiModeFactory_methods(root_module, cls):
     ## wifi-mode.h (module 'wifi'): ns3::WifiModeFactory::WifiModeFactory(ns3::WifiModeFactory const & arg0) [constructor]
     cls.add_constructor([param('ns3::WifiModeFactory const &', 'arg0')])
-    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMcs(std::string uniqueName, uint8_t mcsValue, ns3::WifiModulationClass modClass, ns3::WifiModeFactory::CodeRateCallback codeRateCallback, ns3::WifiModeFactory::ConstellationSizeCallback constellationSizeCallback, ns3::WifiModeFactory::PhyRateCallback phyRateCallback, ns3::WifiModeFactory::PhyRateFromTxVectorCallback phyRateFromTxVectorCallback, ns3::WifiModeFactory::DataRateCallback dataRateCallback, ns3::WifiModeFactory::DataRateFromTxVectorCallback dataRateFromTxVectorCallback, ns3::WifiModeFactory::NonHtReferenceRateCallback nonHtReferenceRateCallback, ns3::WifiModeFactory::ModeAllowedCallback isModeAllowedCallback) [member function]
+    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMcs(std::string uniqueName, uint8_t mcsValue, ns3::WifiModulationClass modClass, bool isMandatory, ns3::WifiModeFactory::CodeRateCallback codeRateCallback, ns3::WifiModeFactory::ConstellationSizeCallback constellationSizeCallback, ns3::WifiModeFactory::PhyRateCallback phyRateCallback, ns3::WifiModeFactory::DataRateCallback dataRateCallback, ns3::WifiModeFactory::NonHtReferenceRateCallback nonHtReferenceRateCallback, ns3::WifiModeFactory::AllowedCallback isAllowedCallback) [member function]
     cls.add_method('CreateWifiMcs', 
                    'ns3::WifiMode', 
-                   [param('std::string', 'uniqueName'), param('uint8_t', 'mcsValue'), param('ns3::WifiModulationClass', 'modClass'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'codeRateCallback'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'constellationSizeCallback'), param('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateCallback'), param('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateFromTxVectorCallback'), param('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateCallback'), param('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateFromTxVectorCallback'), param('ns3::Callback< unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'nonHtReferenceRateCallback'), param('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'isModeAllowedCallback')], 
+                   [param('std::string', 'uniqueName'), param('uint8_t', 'mcsValue'), param('ns3::WifiModulationClass', 'modClass'), param('bool', 'isMandatory'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'codeRateCallback'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'constellationSizeCallback'), param('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateCallback'), param('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateCallback'), param('ns3::Callback< unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'nonHtReferenceRateCallback'), param('ns3::Callback< bool, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'isAllowedCallback')], 
                    is_static=True)
-    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMode(std::string uniqueName, ns3::WifiModulationClass modClass, bool isMandatory, ns3::WifiModeFactory::CodeRateCallback codeRateCallback, ns3::WifiModeFactory::ConstellationSizeCallback constellationSizeCallback, ns3::WifiModeFactory::PhyRateCallback phyRateCallback, ns3::WifiModeFactory::PhyRateFromTxVectorCallback phyRateFromTxVectorCallback, ns3::WifiModeFactory::DataRateCallback dataRateCallback, ns3::WifiModeFactory::DataRateFromTxVectorCallback dataRateFromTxVectorCallback, ns3::WifiModeFactory::ModeAllowedCallback isModeAllowedCallback) [member function]
+    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMode(std::string uniqueName, ns3::WifiModulationClass modClass, bool isMandatory, ns3::WifiModeFactory::CodeRateCallback codeRateCallback, ns3::WifiModeFactory::ConstellationSizeCallback constellationSizeCallback, ns3::WifiModeFactory::PhyRateCallback phyRateCallback, ns3::WifiModeFactory::DataRateCallback dataRateCallback, ns3::WifiModeFactory::AllowedCallback isAllowedCallback) [member function]
     cls.add_method('CreateWifiMode', 
                    'ns3::WifiMode', 
-                   [param('std::string', 'uniqueName'), param('ns3::WifiModulationClass', 'modClass'), param('bool', 'isMandatory'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'codeRateCallback'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'constellationSizeCallback'), param('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateCallback'), param('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateFromTxVectorCallback'), param('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateCallback'), param('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateFromTxVectorCallback'), param('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'isModeAllowedCallback')], 
+                   [param('std::string', 'uniqueName'), param('ns3::WifiModulationClass', 'modClass'), param('bool', 'isMandatory'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'codeRateCallback'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'constellationSizeCallback'), param('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateCallback'), param('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateCallback'), param('ns3::Callback< bool, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'isAllowedCallback')], 
                    is_static=True)
     return
 
 def register_Ns3WifiNoAck_methods(root_module, cls):
     ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiNoAck::WifiNoAck() [constructor]
     cls.add_constructor([])
-    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiNoAck::Copy() const [member function]
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment>> ns3::WifiNoAck::Copy() const [member function]
     cls.add_method('Copy', 
                    'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
                    [], 
@@ -6903,7 +6916,7 @@
 def register_Ns3WifiNormalAck_methods(root_module, cls):
     ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiNormalAck::WifiNormalAck() [constructor]
     cls.add_constructor([])
-    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiNormalAck::Copy() const [member function]
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment>> ns3::WifiNormalAck::Copy() const [member function]
     cls.add_method('Copy', 
                    'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
                    [], 
@@ -6929,10 +6942,10 @@
     cls.add_constructor([param('ns3::WifiPhyHelper const &', 'arg0')])
     ## wifi-helper.h (module 'wifi'): ns3::WifiPhyHelper::WifiPhyHelper() [constructor]
     cls.add_constructor([])
-    ## wifi-helper.h (module 'wifi'): ns3::Ptr<ns3::WifiPhy> ns3::WifiPhyHelper::Create(ns3::Ptr<ns3::Node> node, ns3::Ptr<ns3::NetDevice> device) const [member function]
+    ## wifi-helper.h (module 'wifi'): ns3::Ptr<ns3::WifiPhy> ns3::WifiPhyHelper::Create(ns3::Ptr<ns3::Node> node, ns3::Ptr<ns3::WifiNetDevice> device) const [member function]
     cls.add_method('Create', 
                    'ns3::Ptr< ns3::WifiPhy >', 
-                   [param('ns3::Ptr< ns3::Node >', 'node'), param('ns3::Ptr< ns3::NetDevice >', 'device')], 
+                   [param('ns3::Ptr< ns3::Node >', 'node'), param('ns3::Ptr< ns3::WifiNetDevice >', 'device')], 
                    is_const=True, is_pure_virtual=True, is_virtual=True)
     ## wifi-helper.h (module 'wifi'): void ns3::WifiPhyHelper::DisablePreambleDetectionModel() [member function]
     cls.add_method('DisablePreambleDetectionModel', 
@@ -7047,6 +7060,16 @@
     cls.add_constructor([param('ns3::WifiPhyOperatingChannel const &', 'arg0')])
     ## wifi-phy-operating-channel.h (module 'wifi'): ns3::WifiPhyOperatingChannel::WifiPhyOperatingChannel() [constructor]
     cls.add_constructor([])
+    ## wifi-phy-operating-channel.h (module 'wifi'): static ns3::WifiPhyOperatingChannel::ConstIterator ns3::WifiPhyOperatingChannel::FindFirst(uint8_t number, uint16_t frequency, uint16_t width, ns3::WifiStandard standard, ns3::WifiPhyBand band, ns3::WifiPhyOperatingChannel::ConstIterator start=ns3::WifiPhyOperatingChannel::m_frequencyChannels.begin()) [member function]
+    cls.add_method('FindFirst', 
+                   'ns3::WifiPhyOperatingChannel::ConstIterator', 
+                   [param('uint8_t', 'number'), param('uint16_t', 'frequency'), param('uint16_t', 'width'), param('ns3::WifiStandard', 'standard'), param('ns3::WifiPhyBand', 'band'), param('std::set< std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand > > const_iterator', 'start', default_value='ns3::WifiPhyOperatingChannel::m_frequencyChannels.begin()')], 
+                   is_static=True)
+    ## wifi-phy-operating-channel.h (module 'wifi'): static uint8_t ns3::WifiPhyOperatingChannel::GetDefaultChannelNumber(uint16_t width, ns3::WifiStandard standard, ns3::WifiPhyBand band) [member function]
+    cls.add_method('GetDefaultChannelNumber', 
+                   'uint8_t', 
+                   [param('uint16_t', 'width'), param('ns3::WifiStandard', 'standard'), param('ns3::WifiPhyBand', 'band')], 
+                   is_static=True)
     ## wifi-phy-operating-channel.h (module 'wifi'): uint16_t ns3::WifiPhyOperatingChannel::GetFrequency() const [member function]
     cls.add_method('GetFrequency', 
                    'uint16_t', 
@@ -7067,6 +7090,11 @@
                    'uint8_t', 
                    [param('uint16_t', 'primaryChannelWidth')], 
                    is_const=True)
+    ## wifi-phy-operating-channel.h (module 'wifi'): uint8_t ns3::WifiPhyOperatingChannel::GetPrimaryChannelNumber(uint16_t primaryChannelWidth, ns3::WifiStandard standard) const [member function]
+    cls.add_method('GetPrimaryChannelNumber', 
+                   'uint8_t', 
+                   [param('uint16_t', 'primaryChannelWidth'), param('ns3::WifiStandard', 'standard')], 
+                   is_const=True)
     ## wifi-phy-operating-channel.h (module 'wifi'): uint16_t ns3::WifiPhyOperatingChannel::GetWidth() const [member function]
     cls.add_method('GetWidth', 
                    'uint16_t', 
@@ -7077,24 +7105,26 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## wifi-phy-operating-channel.h (module 'wifi'): void ns3::WifiPhyOperatingChannel::Set(uint8_t number, uint16_t frequency, uint16_t width, ns3::WifiPhyStandard standard, ns3::WifiPhyBand band) [member function]
+    ## wifi-phy-operating-channel.h (module 'wifi'): void ns3::WifiPhyOperatingChannel::Set(uint8_t number, uint16_t frequency, uint16_t width, ns3::WifiStandard standard, ns3::WifiPhyBand band) [member function]
     cls.add_method('Set', 
                    'void', 
-                   [param('uint8_t', 'number'), param('uint16_t', 'frequency'), param('uint16_t', 'width'), param('ns3::WifiPhyStandard', 'standard'), param('ns3::WifiPhyBand', 'band')])
-    ## wifi-phy-operating-channel.h (module 'wifi'): void ns3::WifiPhyOperatingChannel::SetDefault(uint16_t width, ns3::WifiPhyStandard standard, ns3::WifiPhyBand band) [member function]
+                   [param('uint8_t', 'number'), param('uint16_t', 'frequency'), param('uint16_t', 'width'), param('ns3::WifiStandard', 'standard'), param('ns3::WifiPhyBand', 'band')])
+    ## wifi-phy-operating-channel.h (module 'wifi'): void ns3::WifiPhyOperatingChannel::SetDefault(uint16_t width, ns3::WifiStandard standard, ns3::WifiPhyBand band) [member function]
     cls.add_method('SetDefault', 
                    'void', 
-                   [param('uint16_t', 'width'), param('ns3::WifiPhyStandard', 'standard'), param('ns3::WifiPhyBand', 'band')])
+                   [param('uint16_t', 'width'), param('ns3::WifiStandard', 'standard'), param('ns3::WifiPhyBand', 'band')])
     ## wifi-phy-operating-channel.h (module 'wifi'): void ns3::WifiPhyOperatingChannel::SetPrimary20Index(uint8_t index) [member function]
     cls.add_method('SetPrimary20Index', 
                    'void', 
                    [param('uint8_t', 'index')])
+    ## wifi-phy-operating-channel.h (module 'wifi'): ns3::WifiPhyOperatingChannel::m_frequencyChannels [variable]
+    cls.add_static_attribute('m_frequencyChannels', 'std::set< std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand > > const', is_const=True)
     return
 
 def register_Ns3WifiProtection_methods(root_module, cls):
     ## wifi-protection.h (module 'wifi'): ns3::WifiProtection::WifiProtection(ns3::WifiProtection::Method m) [constructor]
     cls.add_constructor([param('ns3::WifiProtection::Method', 'm')])
-    ## wifi-protection.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection> > ns3::WifiProtection::Copy() const [member function]
+    ## wifi-protection.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection>> ns3::WifiProtection::Copy() const [member function]
     cls.add_method('Copy', 
                    'std::unique_ptr< ns3::WifiProtection, std::default_delete< ns3::WifiProtection > >', 
                    [], 
@@ -7309,7 +7339,7 @@
 def register_Ns3WifiRtsCtsProtection_methods(root_module, cls):
     ## wifi-protection.h (module 'wifi'): ns3::WifiRtsCtsProtection::WifiRtsCtsProtection() [constructor]
     cls.add_constructor([])
-    ## wifi-protection.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection> > ns3::WifiRtsCtsProtection::Copy() const [member function]
+    ## wifi-protection.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection>> ns3::WifiRtsCtsProtection::Copy() const [member function]
     cls.add_method('Copy', 
                    'std::unique_ptr< ns3::WifiProtection, std::default_delete< ns3::WifiProtection > >', 
                    [], 
@@ -7394,7 +7424,7 @@
                    'ns3::Ptr< ns3::SpectrumValue >', 
                    [param('uint32_t', 'centerFrequency'), param('uint16_t', 'totalChannelWidth'), param('uint32_t', 'bandBandwidth'), param('uint16_t', 'guardBandwidth'), param('std::pair< unsigned int, unsigned int >', 'band')], 
                    is_static=True)
-    ## wifi-spectrum-value-helper.h (module 'spectrum'): static void ns3::WifiSpectrumValueHelper::CreateSpectrumMaskForOfdm(ns3::Ptr<ns3::SpectrumValue> c, std::vector<std::pair<unsigned int, unsigned int>, std::allocator<std::pair<unsigned int, unsigned int> > > allocatedSubBands, ns3::WifiSpectrumBand maskBand, double txPowerPerBandW, uint32_t nGuardBands, uint32_t innerSlopeWidth, double minInnerBandDbr, double minOuterbandDbr, double lowestPointDbr) [member function]
+    ## wifi-spectrum-value-helper.h (module 'spectrum'): static void ns3::WifiSpectrumValueHelper::CreateSpectrumMaskForOfdm(ns3::Ptr<ns3::SpectrumValue> c, std::vector<std::pair<unsigned int, unsigned int>, std::allocator<std::pair<unsigned int, unsigned int>>> allocatedSubBands, ns3::WifiSpectrumBand maskBand, double txPowerPerBandW, uint32_t nGuardBands, uint32_t innerSlopeWidth, double minInnerBandDbr, double minOuterbandDbr, double lowestPointDbr) [member function]
     cls.add_method('CreateSpectrumMaskForOfdm', 
                    'void', 
                    [param('ns3::Ptr< ns3::SpectrumValue >', 'c'), param('std::vector< std::pair< unsigned int, unsigned int > >', 'allocatedSubBands'), param('std::pair< unsigned int, unsigned int >', 'maskBand'), param('double', 'txPowerPerBandW'), param('uint32_t', 'nGuardBands'), param('uint32_t', 'innerSlopeWidth'), param('double', 'minInnerBandDbr'), param('double', 'minOuterbandDbr'), param('double', 'lowestPointDbr')], 
@@ -7421,19 +7451,6 @@
                    is_static=True)
     return
 
-def register_Ns3WifiStandardInfo_methods(root_module, cls):
-    ## wifi-standards.h (module 'wifi'): ns3::WifiStandardInfo::WifiStandardInfo() [constructor]
-    cls.add_constructor([])
-    ## wifi-standards.h (module 'wifi'): ns3::WifiStandardInfo::WifiStandardInfo(ns3::WifiStandardInfo const & arg0) [constructor]
-    cls.add_constructor([param('ns3::WifiStandardInfo const &', 'arg0')])
-    ## wifi-standards.h (module 'wifi'): ns3::WifiStandardInfo::macStandard [variable]
-    cls.add_instance_attribute('macStandard', 'ns3::WifiMacStandard', is_const=False)
-    ## wifi-standards.h (module 'wifi'): ns3::WifiStandardInfo::phyBand [variable]
-    cls.add_instance_attribute('phyBand', 'ns3::WifiPhyBand', is_const=False)
-    ## wifi-standards.h (module 'wifi'): ns3::WifiStandardInfo::phyStandard [variable]
-    cls.add_instance_attribute('phyStandard', 'ns3::WifiPhyStandard', is_const=False)
-    return
-
 def register_Ns3WifiTxParameters_methods(root_module, cls):
     ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters::WifiTxParameters() [constructor]
     cls.add_constructor([])
@@ -7761,7 +7778,7 @@
 def register_Ns3WifiUlMuMultiStaBa_methods(root_module, cls):
     ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiUlMuMultiStaBa::WifiUlMuMultiStaBa() [constructor]
     cls.add_constructor([])
-    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiUlMuMultiStaBa::Copy() const [member function]
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment>> ns3::WifiUlMuMultiStaBa::Copy() const [member function]
     cls.add_method('Copy', 
                    'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
                    [], 
@@ -7830,10 +7847,10 @@
     cls.add_method('SetChannel', 
                    'void', 
                    [param('std::string', 'channelName')])
-    ## yans-wifi-helper.h (module 'wifi'): ns3::Ptr<ns3::WifiPhy> ns3::YansWifiPhyHelper::Create(ns3::Ptr<ns3::Node> node, ns3::Ptr<ns3::NetDevice> device) const [member function]
+    ## yans-wifi-helper.h (module 'wifi'): ns3::Ptr<ns3::WifiPhy> ns3::YansWifiPhyHelper::Create(ns3::Ptr<ns3::Node> node, ns3::Ptr<ns3::WifiNetDevice> device) const [member function]
     cls.add_method('Create', 
                    'ns3::Ptr< ns3::WifiPhy >', 
-                   [param('ns3::Ptr< ns3::Node >', 'node'), param('ns3::Ptr< ns3::NetDevice >', 'device')], 
+                   [param('ns3::Ptr< ns3::Node >', 'node'), param('ns3::Ptr< ns3::WifiNetDevice >', 'device')], 
                    is_const=True, is_virtual=True, visibility='private')
     return
 
@@ -7854,14 +7871,14 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('>=')
     cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_unary_numeric_operator('-')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
     cls.add_constructor([])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(double const value) [constructor]
@@ -7880,6 +7897,8 @@
     cls.add_constructor([param('long unsigned int const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int const v) [constructor]
     cls.add_constructor([param('long long unsigned int const', 'v')])
+    ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int128_t const v) [constructor]
+    cls.add_constructor([param('int128_t const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t const hi, uint64_t const lo) [constructor]
     cls.add_constructor([param('int64_t const', 'hi'), param('uint64_t const', 'lo')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [constructor]
@@ -9230,6 +9249,102 @@
                    [])
     return
 
+def register_Ns3PhasedArrayModel_methods(root_module, cls):
+    ## phased-array-model.h (module 'antenna'): ns3::PhasedArrayModel::PhasedArrayModel(ns3::PhasedArrayModel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::PhasedArrayModel const &', 'arg0')])
+    ## phased-array-model.h (module 'antenna'): ns3::PhasedArrayModel::PhasedArrayModel() [constructor]
+    cls.add_constructor([])
+    ## phased-array-model.h (module 'antenna'): ns3::Ptr<const ns3::AntennaModel> ns3::PhasedArrayModel::GetAntennaElement() const [member function]
+    cls.add_method('GetAntennaElement', 
+                   'ns3::Ptr< ns3::AntennaModel const >', 
+                   [], 
+                   is_const=True)
+    ## phased-array-model.h (module 'antenna'): ns3::PhasedArrayModel::ComplexVector ns3::PhasedArrayModel::GetBeamformingVector() const [member function]
+    cls.add_method('GetBeamformingVector', 
+                   'ns3::PhasedArrayModel::ComplexVector', 
+                   [], 
+                   is_const=True)
+    ## phased-array-model.h (module 'antenna'): ns3::PhasedArrayModel::ComplexVector ns3::PhasedArrayModel::GetBeamformingVector(ns3::Angles a) const [member function]
+    cls.add_method('GetBeamformingVector', 
+                   'ns3::PhasedArrayModel::ComplexVector', 
+                   [param('ns3::Angles', 'a')], 
+                   is_const=True)
+    ## phased-array-model.h (module 'antenna'): std::pair<double, double> ns3::PhasedArrayModel::GetElementFieldPattern(ns3::Angles a) const [member function]
+    cls.add_method('GetElementFieldPattern', 
+                   'std::pair< double, double >', 
+                   [param('ns3::Angles', 'a')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## phased-array-model.h (module 'antenna'): ns3::Vector ns3::PhasedArrayModel::GetElementLocation(uint64_t index) const [member function]
+    cls.add_method('GetElementLocation', 
+                   'ns3::Vector', 
+                   [param('uint64_t', 'index')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## phased-array-model.h (module 'antenna'): uint32_t ns3::PhasedArrayModel::GetId() const [member function]
+    cls.add_method('GetId', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## phased-array-model.h (module 'antenna'): uint64_t ns3::PhasedArrayModel::GetNumberOfElements() const [member function]
+    cls.add_method('GetNumberOfElements', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## phased-array-model.h (module 'antenna'): ns3::PhasedArrayModel::ComplexVector ns3::PhasedArrayModel::GetSteeringVector(ns3::Angles a) const [member function]
+    cls.add_method('GetSteeringVector', 
+                   'ns3::PhasedArrayModel::ComplexVector', 
+                   [param('ns3::Angles', 'a')], 
+                   is_const=True)
+    ## phased-array-model.h (module 'antenna'): static ns3::TypeId ns3::PhasedArrayModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## phased-array-model.h (module 'antenna'): void ns3::PhasedArrayModel::SetAntennaElement(ns3::Ptr<ns3::AntennaModel> antennaElement) [member function]
+    cls.add_method('SetAntennaElement', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::AntennaModel >', 'antennaElement')])
+    ## phased-array-model.h (module 'antenna'): void ns3::PhasedArrayModel::SetBeamformingVector(ns3::PhasedArrayModel::ComplexVector const & beamformingVector) [member function]
+    cls.add_method('SetBeamformingVector', 
+                   'void', 
+                   [param('ns3::PhasedArrayModel::ComplexVector const &', 'beamformingVector')])
+    ## phased-array-model.h (module 'antenna'): static double ns3::PhasedArrayModel::ComputeNorm(ns3::PhasedArrayModel::ComplexVector const & vector) [member function]
+    cls.add_method('ComputeNorm', 
+                   'double', 
+                   [param('ns3::PhasedArrayModel::ComplexVector const &', 'vector')], 
+                   is_static=True, visibility='protected')
+    return
+
+def register_Ns3PhasedArraySpectrumPropagationLossModel_methods(root_module, cls):
+    ## phased-array-spectrum-propagation-loss-model.h (module 'spectrum'): ns3::PhasedArraySpectrumPropagationLossModel::PhasedArraySpectrumPropagationLossModel(ns3::PhasedArraySpectrumPropagationLossModel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::PhasedArraySpectrumPropagationLossModel const &', 'arg0')])
+    ## phased-array-spectrum-propagation-loss-model.h (module 'spectrum'): ns3::PhasedArraySpectrumPropagationLossModel::PhasedArraySpectrumPropagationLossModel() [constructor]
+    cls.add_constructor([])
+    ## phased-array-spectrum-propagation-loss-model.h (module 'spectrum'): ns3::Ptr<ns3::SpectrumValue> ns3::PhasedArraySpectrumPropagationLossModel::CalcRxPowerSpectralDensity(ns3::Ptr<const ns3::SpectrumValue> txPsd, ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b, ns3::Ptr<const ns3::PhasedArrayModel> aPhasedArrayModel, ns3::Ptr<const ns3::PhasedArrayModel> bPhasedArrayModel) const [member function]
+    cls.add_method('CalcRxPowerSpectralDensity', 
+                   'ns3::Ptr< ns3::SpectrumValue >', 
+                   [param('ns3::Ptr< ns3::SpectrumValue const >', 'txPsd'), param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b'), param('ns3::Ptr< ns3::PhasedArrayModel const >', 'aPhasedArrayModel'), param('ns3::Ptr< ns3::PhasedArrayModel const >', 'bPhasedArrayModel')], 
+                   is_const=True)
+    ## phased-array-spectrum-propagation-loss-model.h (module 'spectrum'): static ns3::TypeId ns3::PhasedArraySpectrumPropagationLossModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## phased-array-spectrum-propagation-loss-model.h (module 'spectrum'): void ns3::PhasedArraySpectrumPropagationLossModel::SetNext(ns3::Ptr<ns3::PhasedArraySpectrumPropagationLossModel> next) [member function]
+    cls.add_method('SetNext', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::PhasedArraySpectrumPropagationLossModel >', 'next')])
+    ## phased-array-spectrum-propagation-loss-model.h (module 'spectrum'): void ns3::PhasedArraySpectrumPropagationLossModel::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## phased-array-spectrum-propagation-loss-model.h (module 'spectrum'): ns3::Ptr<ns3::SpectrumValue> ns3::PhasedArraySpectrumPropagationLossModel::DoCalcRxPowerSpectralDensity(ns3::Ptr<const ns3::SpectrumValue> txPsd, ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b, ns3::Ptr<const ns3::PhasedArrayModel> aPhasedArrayModel, ns3::Ptr<const ns3::PhasedArrayModel> bPhasedArrayModel) const [member function]
+    cls.add_method('DoCalcRxPowerSpectralDensity', 
+                   'ns3::Ptr< ns3::SpectrumValue >', 
+                   [param('ns3::Ptr< ns3::SpectrumValue const >', 'txPsd'), param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b'), param('ns3::Ptr< ns3::PhasedArrayModel const >', 'aPhasedArrayModel'), param('ns3::Ptr< ns3::PhasedArrayModel const >', 'bPhasedArrayModel')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
+    return
+
 def register_Ns3PreambleDetectionModel_methods(root_module, cls):
     ## preamble-detection-model.h (module 'wifi'): ns3::PreambleDetectionModel::PreambleDetectionModel() [constructor]
     cls.add_constructor([])
@@ -9270,7 +9385,7 @@
     cls.add_method('DoAssignStreams', 
                    'int64_t', 
                    [param('int64_t', 'stream')], 
-                   is_pure_virtual=True, is_virtual=True, visibility='private')
+                   is_pure_virtual=True, is_virtual=True, visibility='protected')
     return
 
 def register_Ns3PropagationLossModel_methods(root_module, cls):
@@ -9298,16 +9413,16 @@
     cls.add_method('AssignStreams', 
                    'int64_t', 
                    [param('int64_t', 'stream')])
+    ## propagation-loss-model.h (module 'propagation'): int64_t ns3::PropagationLossModel::DoAssignStreams(int64_t stream) [member function]
+    cls.add_method('DoAssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')], 
+                   is_pure_virtual=True, is_virtual=True, visibility='protected')
     ## propagation-loss-model.h (module 'propagation'): double ns3::PropagationLossModel::DoCalcRxPower(double txPowerDbm, ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
     cls.add_method('DoCalcRxPower', 
                    'double', 
                    [param('double', 'txPowerDbm'), param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
                    is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
-    ## propagation-loss-model.h (module 'propagation'): int64_t ns3::PropagationLossModel::DoAssignStreams(int64_t stream) [member function]
-    cls.add_method('DoAssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'stream')], 
-                   is_pure_virtual=True, is_virtual=True, visibility='private')
     return
 
 def register_Ns3QueueBase_methods(root_module, cls):
@@ -9398,6 +9513,11 @@
     cls.add_method('SetMaxSize', 
                    'void', 
                    [param('ns3::QueueSize', 'size')])
+    ## queue.h (module 'network'): bool ns3::QueueBase::WouldOverflow(uint32_t nPackets, uint32_t nBytes) const [member function]
+    cls.add_method('WouldOverflow', 
+                   'bool', 
+                   [param('uint32_t', 'nPackets'), param('uint32_t', 'nBytes')], 
+                   is_const=True)
     return
 
 def register_Ns3RandomPropagationDelayModel_methods(root_module, cls):
@@ -9546,163 +9666,163 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Event_Ns3Empty_Ns3DefaultDeleter__lt__ns3Event__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Event, ns3::empty, ns3::DefaultDeleter<ns3::Event> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Event, ns3::empty, ns3::DefaultDeleter<ns3::Event>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Event, ns3::empty, ns3::DefaultDeleter<ns3::Event> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Event, ns3::empty, ns3::DefaultDeleter<ns3::Event> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Event, ns3::empty, ns3::DefaultDeleter<ns3::Event>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Event, ns3::empty, ns3::DefaultDeleter<ns3::Event>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Event, ns3::empty, ns3::DefaultDeleter< ns3::Event > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3MacRxMiddle_Ns3Empty_Ns3DefaultDeleter__lt__ns3MacRxMiddle__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MacRxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacRxMiddle> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MacRxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacRxMiddle>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MacRxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacRxMiddle> >::SimpleRefCount(ns3::SimpleRefCount<ns3::MacRxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacRxMiddle> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MacRxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacRxMiddle>>::SimpleRefCount(ns3::SimpleRefCount<ns3::MacRxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacRxMiddle>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::MacRxMiddle, ns3::empty, ns3::DefaultDeleter< ns3::MacRxMiddle > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3MacTxMiddle_Ns3Empty_Ns3DefaultDeleter__lt__ns3MacTxMiddle__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MacTxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacTxMiddle> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MacTxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacTxMiddle>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MacTxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacTxMiddle> >::SimpleRefCount(ns3::SimpleRefCount<ns3::MacTxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacTxMiddle> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MacTxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacTxMiddle>>::SimpleRefCount(ns3::SimpleRefCount<ns3::MacTxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacTxMiddle>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::MacTxMiddle, ns3::empty, ns3::DefaultDeleter< ns3::MacTxMiddle > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3OutputStreamWrapper_Ns3Empty_Ns3DefaultDeleter__lt__ns3OutputStreamWrapper__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter< ns3::OutputStreamWrapper > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3PhyEntity_Ns3Empty_Ns3DefaultDeleter__lt__ns3PhyEntity__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity> >::SimpleRefCount(ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity>>::SimpleRefCount(ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter< ns3::PhyEntity > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3QosBlockedDestinations_Ns3Empty_Ns3DefaultDeleter__lt__ns3QosBlockedDestinations__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QosBlockedDestinations, ns3::empty, ns3::DefaultDeleter<ns3::QosBlockedDestinations> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QosBlockedDestinations, ns3::empty, ns3::DefaultDeleter<ns3::QosBlockedDestinations>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QosBlockedDestinations, ns3::empty, ns3::DefaultDeleter<ns3::QosBlockedDestinations> >::SimpleRefCount(ns3::SimpleRefCount<ns3::QosBlockedDestinations, ns3::empty, ns3::DefaultDeleter<ns3::QosBlockedDestinations> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QosBlockedDestinations, ns3::empty, ns3::DefaultDeleter<ns3::QosBlockedDestinations>>::SimpleRefCount(ns3::SimpleRefCount<ns3::QosBlockedDestinations, ns3::empty, ns3::DefaultDeleter<ns3::QosBlockedDestinations>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::QosBlockedDestinations, ns3::empty, ns3::DefaultDeleter< ns3::QosBlockedDestinations > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3QueueItem_Ns3Empty_Ns3DefaultDeleter__lt__ns3QueueItem__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> >::SimpleRefCount(ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>>::SimpleRefCount(ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::QueueItem, ns3::empty, ns3::DefaultDeleter< ns3::QueueItem > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3SpectrumModel_Ns3Empty_Ns3DefaultDeleter__lt__ns3SpectrumModel__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel> >::SimpleRefCount(ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel>>::SimpleRefCount(ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter< ns3::SpectrumModel > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3SpectrumSignalParameters_Ns3Empty_Ns3DefaultDeleter__lt__ns3SpectrumSignalParameters__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters> >::SimpleRefCount(ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters>>::SimpleRefCount(ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter< ns3::SpectrumSignalParameters > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3SpectrumValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3SpectrumValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter< ns3::SpectrumValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3WifiInformationElement_Ns3Empty_Ns3DefaultDeleter__lt__ns3WifiInformationElement__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement> >::SimpleRefCount(ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement>>::SimpleRefCount(ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter< ns3::WifiInformationElement > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3WifiMacQueueItem_Ns3Empty_Ns3DefaultDeleter__lt__ns3WifiMacQueueItem__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiMacQueueItem, ns3::empty, ns3::DefaultDeleter<ns3::WifiMacQueueItem> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiMacQueueItem, ns3::empty, ns3::DefaultDeleter<ns3::WifiMacQueueItem>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiMacQueueItem, ns3::empty, ns3::DefaultDeleter<ns3::WifiMacQueueItem> >::SimpleRefCount(ns3::SimpleRefCount<ns3::WifiMacQueueItem, ns3::empty, ns3::DefaultDeleter<ns3::WifiMacQueueItem> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiMacQueueItem, ns3::empty, ns3::DefaultDeleter<ns3::WifiMacQueueItem>>::SimpleRefCount(ns3::SimpleRefCount<ns3::WifiMacQueueItem, ns3::empty, ns3::DefaultDeleter<ns3::WifiMacQueueItem>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::WifiMacQueueItem, ns3::empty, ns3::DefaultDeleter< ns3::WifiMacQueueItem > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3WifiPpdu_Ns3Empty_Ns3DefaultDeleter__lt__ns3WifiPpdu__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiPpdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPpdu> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiPpdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPpdu>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiPpdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPpdu> >::SimpleRefCount(ns3::SimpleRefCount<ns3::WifiPpdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPpdu> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiPpdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPpdu>>::SimpleRefCount(ns3::SimpleRefCount<ns3::WifiPpdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPpdu>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::WifiPpdu, ns3::empty, ns3::DefaultDeleter< ns3::WifiPpdu > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3WifiPsdu_Ns3Empty_Ns3DefaultDeleter__lt__ns3WifiPsdu__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiPsdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPsdu> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiPsdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPsdu>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiPsdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPsdu> >::SimpleRefCount(ns3::SimpleRefCount<ns3::WifiPsdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPsdu> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiPsdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPsdu>>::SimpleRefCount(ns3::SimpleRefCount<ns3::WifiPsdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPsdu>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::WifiPsdu, ns3::empty, ns3::DefaultDeleter< ns3::WifiPsdu > > const &', 'o')])
     return
 
@@ -9756,16 +9876,16 @@
     cls.add_binary_comparison_operator('==')
     ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(ns3::SpectrumModel const & arg0) [constructor]
     cls.add_constructor([param('ns3::SpectrumModel const &', 'arg0')])
-    ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(std::vector<double, std::allocator<double> > const & centerFreqs) [constructor]
+    ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(std::vector<double, std::allocator<double>> const & centerFreqs) [constructor]
     cls.add_constructor([param('std::vector< double > const &', 'centerFreqs')])
     ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(ns3::Bands const & bands) [constructor]
     cls.add_constructor([param('ns3::Bands const &', 'bands')])
-    ## spectrum-model.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo> >::const_iterator ns3::SpectrumModel::Begin() const [member function]
+    ## spectrum-model.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo>>::const_iterator ns3::SpectrumModel::Begin() const [member function]
     cls.add_method('Begin', 
                    'std::vector< ns3::BandInfo > const_iterator', 
                    [], 
                    is_const=True)
-    ## spectrum-model.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo> >::const_iterator ns3::SpectrumModel::End() const [member function]
+    ## spectrum-model.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo>>::const_iterator ns3::SpectrumModel::End() const [member function]
     cls.add_method('End', 
                    'std::vector< ns3::BandInfo > const_iterator', 
                    [], 
@@ -9825,9 +9945,9 @@
                    'ns3::Ptr< ns3::SpectrumModel const >', 
                    [], 
                    is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::AntennaModel> ns3::SpectrumPhy::GetRxAntenna() const [member function]
-    cls.add_method('GetRxAntenna', 
-                   'ns3::Ptr< ns3::AntennaModel >', 
+    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::Object> ns3::SpectrumPhy::GetAntenna() const [member function]
+    cls.add_method('GetAntenna', 
+                   'ns3::Ptr< ns3::Object >', 
                    [], 
                    is_const=True, is_pure_virtual=True, is_virtual=True)
     ## spectrum-phy.h (module 'spectrum'): void ns3::SpectrumPhy::StartRx(ns3::Ptr<ns3::SpectrumSignalParameters> params) [member function]
@@ -9913,22 +10033,22 @@
     cls.add_constructor([param('ns3::Ptr< ns3::SpectrumModel const >', 'sm')])
     ## spectrum-value.h (module 'spectrum'): ns3::SpectrumValue::SpectrumValue() [constructor]
     cls.add_constructor([])
-    ## spectrum-value.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo> >::const_iterator ns3::SpectrumValue::ConstBandsBegin() const [member function]
+    ## spectrum-value.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo>>::const_iterator ns3::SpectrumValue::ConstBandsBegin() const [member function]
     cls.add_method('ConstBandsBegin', 
                    'std::vector< ns3::BandInfo > const_iterator', 
                    [], 
                    is_const=True)
-    ## spectrum-value.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo> >::const_iterator ns3::SpectrumValue::ConstBandsEnd() const [member function]
+    ## spectrum-value.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo>>::const_iterator ns3::SpectrumValue::ConstBandsEnd() const [member function]
     cls.add_method('ConstBandsEnd', 
                    'std::vector< ns3::BandInfo > const_iterator', 
                    [], 
                    is_const=True)
-    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double> >::const_iterator ns3::SpectrumValue::ConstValuesBegin() const [member function]
+    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double>>::const_iterator ns3::SpectrumValue::ConstValuesBegin() const [member function]
     cls.add_method('ConstValuesBegin', 
                    'std::vector< double > const_iterator', 
                    [], 
                    is_const=True)
-    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double> >::const_iterator ns3::SpectrumValue::ConstValuesEnd() const [member function]
+    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double>>::const_iterator ns3::SpectrumValue::ConstValuesEnd() const [member function]
     cls.add_method('ConstValuesEnd', 
                    'std::vector< double > const_iterator', 
                    [], 
@@ -9958,11 +10078,11 @@
                    'double const &', 
                    [param('uint32_t', 'pos')], 
                    is_const=True)
-    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double> >::iterator ns3::SpectrumValue::ValuesBegin() [member function]
+    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double>>::iterator ns3::SpectrumValue::ValuesBegin() [member function]
     cls.add_method('ValuesBegin', 
                    'std::vector< double > iterator', 
                    [])
-    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double> >::iterator ns3::SpectrumValue::ValuesEnd() [member function]
+    ## spectrum-value.h (module 'spectrum'): std::vector<double, std::allocator<double>>::iterator ns3::SpectrumValue::ValuesEnd() [member function]
     cls.add_method('ValuesEnd', 
                    'std::vector< double > iterator', 
                    [])
@@ -9981,10 +10101,10 @@
     cls.add_method('SetChannel', 
                    'void', 
                    [param('std::string', 'channelName')])
-    ## spectrum-wifi-helper.h (module 'wifi'): ns3::Ptr<ns3::WifiPhy> ns3::SpectrumWifiPhyHelper::Create(ns3::Ptr<ns3::Node> node, ns3::Ptr<ns3::NetDevice> device) const [member function]
+    ## spectrum-wifi-helper.h (module 'wifi'): ns3::Ptr<ns3::WifiPhy> ns3::SpectrumWifiPhyHelper::Create(ns3::Ptr<ns3::Node> node, ns3::Ptr<ns3::WifiNetDevice> device) const [member function]
     cls.add_method('Create', 
                    'ns3::Ptr< ns3::WifiPhy >', 
-                   [param('ns3::Ptr< ns3::Node >', 'node'), param('ns3::Ptr< ns3::NetDevice >', 'device')], 
+                   [param('ns3::Ptr< ns3::Node >', 'node'), param('ns3::Ptr< ns3::WifiNetDevice >', 'device')], 
                    is_const=True, is_virtual=True, visibility='private')
     return
 
@@ -10458,11 +10578,6 @@
                    'void', 
                    [], 
                    is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::NotifyChannelSwitching() [member function]
-    cls.add_method('NotifyChannelSwitching', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
     ## txop.h (module 'wifi'): void ns3::Txop::NotifyOff() [member function]
     cls.add_method('NotifyOff', 
                    'void', 
@@ -10521,10 +10636,10 @@
     cls.add_method('SetTxopLimit', 
                    'void', 
                    [param('ns3::Time', 'txopLimit')])
-    ## txop.h (module 'wifi'): void ns3::Txop::SetWifiMac(ns3::Ptr<ns3::RegularWifiMac> const mac) [member function]
+    ## txop.h (module 'wifi'): void ns3::Txop::SetWifiMac(ns3::Ptr<ns3::WifiMac> const mac) [member function]
     cls.add_method('SetWifiMac', 
                    'void', 
-                   [param('ns3::Ptr< ns3::RegularWifiMac > const', 'mac')], 
+                   [param('ns3::Ptr< ns3::WifiMac > const', 'mac')], 
                    is_virtual=True)
     ## txop.h (module 'wifi'): void ns3::Txop::StartBackoffNow(uint32_t nSlots) [member function]
     cls.add_method('StartBackoffNow', 
@@ -10687,7 +10802,7 @@
 def register_Ns3WifiAckAfterTbPpdu_methods(root_module, cls):
     ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiAckAfterTbPpdu::WifiAckAfterTbPpdu() [constructor]
     cls.add_constructor([])
-    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiAckAfterTbPpdu::Copy() const [member function]
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment>> ns3::WifiAckAfterTbPpdu::Copy() const [member function]
     cls.add_method('Copy', 
                    'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
                    [], 
@@ -10726,16 +10841,16 @@
                    'void', 
                    [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('ns3::WifiAcknowledgment const *', 'acknowledgment')], 
                    is_static=True)
-    ## wifi-ack-manager.h (module 'wifi'): void ns3::WifiAckManager::SetWifiMac(ns3::Ptr<ns3::RegularWifiMac> mac) [member function]
+    ## wifi-ack-manager.h (module 'wifi'): void ns3::WifiAckManager::SetWifiMac(ns3::Ptr<ns3::WifiMac> mac) [member function]
     cls.add_method('SetWifiMac', 
                    'void', 
-                   [param('ns3::Ptr< ns3::RegularWifiMac >', 'mac')])
-    ## wifi-ack-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiAckManager::TryAddMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters const & txParams) [member function]
+                   [param('ns3::Ptr< ns3::WifiMac >', 'mac')])
+    ## wifi-ack-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment>> ns3::WifiAckManager::TryAddMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters const & txParams) [member function]
     cls.add_method('TryAddMpdu', 
                    'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::WifiTxParameters const &', 'txParams')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## wifi-ack-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiAckManager::TryAggregateMsdu(ns3::Ptr<const ns3::WifiMacQueueItem> msdu, ns3::WifiTxParameters const & txParams) [member function]
+    ## wifi-ack-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment>> ns3::WifiAckManager::TryAggregateMsdu(ns3::Ptr<const ns3::WifiMacQueueItem> msdu, ns3::WifiTxParameters const & txParams) [member function]
     cls.add_method('TryAggregateMsdu', 
                    'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'msdu'), param('ns3::WifiTxParameters const &', 'txParams')], 
@@ -10814,7 +10929,7 @@
 def register_Ns3WifiCtsToSelfProtection_methods(root_module, cls):
     ## wifi-protection.h (module 'wifi'): ns3::WifiCtsToSelfProtection::WifiCtsToSelfProtection() [constructor]
     cls.add_constructor([])
-    ## wifi-protection.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection> > ns3::WifiCtsToSelfProtection::Copy() const [member function]
+    ## wifi-protection.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection>> ns3::WifiCtsToSelfProtection::Copy() const [member function]
     cls.add_method('Copy', 
                    'std::unique_ptr< ns3::WifiProtection, std::default_delete< ns3::WifiProtection > >', 
                    [], 
@@ -10845,12 +10960,12 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## wifi-default-ack-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiDefaultAckManager::TryAddMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters const & txParams) [member function]
+    ## wifi-default-ack-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment>> ns3::WifiDefaultAckManager::TryAddMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters const & txParams) [member function]
     cls.add_method('TryAddMpdu', 
                    'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::WifiTxParameters const &', 'txParams')], 
                    is_virtual=True)
-    ## wifi-default-ack-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiDefaultAckManager::TryAggregateMsdu(ns3::Ptr<const ns3::WifiMacQueueItem> msdu, ns3::WifiTxParameters const & txParams) [member function]
+    ## wifi-default-ack-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment>> ns3::WifiDefaultAckManager::TryAggregateMsdu(ns3::Ptr<const ns3::WifiMacQueueItem> msdu, ns3::WifiTxParameters const & txParams) [member function]
     cls.add_method('TryAggregateMsdu', 
                    'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'msdu'), param('ns3::WifiTxParameters const &', 'txParams')], 
@@ -10860,22 +10975,22 @@
                    'bool', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::WifiTxParameters const &', 'txParams')], 
                    is_const=True, visibility='protected')
-    ## wifi-default-ack-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiDefaultAckManager::GetAckInfoIfAggregatedMuBar(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters const & txParams) [member function]
+    ## wifi-default-ack-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment>> ns3::WifiDefaultAckManager::GetAckInfoIfAggregatedMuBar(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters const & txParams) [member function]
     cls.add_method('GetAckInfoIfAggregatedMuBar', 
                    'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::WifiTxParameters const &', 'txParams')], 
                    is_virtual=True, visibility='private')
-    ## wifi-default-ack-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiDefaultAckManager::GetAckInfoIfBarBaSequence(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters const & txParams) [member function]
+    ## wifi-default-ack-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment>> ns3::WifiDefaultAckManager::GetAckInfoIfBarBaSequence(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters const & txParams) [member function]
     cls.add_method('GetAckInfoIfBarBaSequence', 
                    'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::WifiTxParameters const &', 'txParams')], 
                    is_virtual=True, visibility='private')
-    ## wifi-default-ack-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiDefaultAckManager::GetAckInfoIfTfMuBar(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters const & txParams) [member function]
+    ## wifi-default-ack-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment>> ns3::WifiDefaultAckManager::GetAckInfoIfTfMuBar(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters const & txParams) [member function]
     cls.add_method('GetAckInfoIfTfMuBar', 
                    'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::WifiTxParameters const &', 'txParams')], 
                    is_virtual=True, visibility='private')
-    ## wifi-default-ack-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiDefaultAckManager::TryUlMuTransmission(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters const & txParams) [member function]
+    ## wifi-default-ack-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment>> ns3::WifiDefaultAckManager::TryUlMuTransmission(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters const & txParams) [member function]
     cls.add_method('TryUlMuTransmission', 
                    'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::WifiTxParameters const &', 'txParams')], 
@@ -11009,102 +11124,153 @@
     return
 
 def register_Ns3WifiMac_methods(root_module, cls):
+    ## wifi-mac.h (module 'wifi'): static ns3::TypeId ns3::WifiMac::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## wifi-mac.h (module 'wifi'): ns3::WifiMac::WifiMac() [constructor]
     cls.add_constructor([])
-    ## wifi-mac.h (module 'wifi'): ns3::WifiMac::WifiMac(ns3::WifiMac const & arg0) [constructor]
-    cls.add_constructor([param('ns3::WifiMac const &', 'arg0')])
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::ConfigureStandard(ns3::WifiStandard standard) [member function]
-    cls.add_method('ConfigureStandard', 
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetDevice(ns3::Ptr<ns3::WifiNetDevice> const device) [member function]
+    cls.add_method('SetDevice', 
                    'void', 
-                   [param('ns3::WifiStandard', 'standard')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::DoDispose() [member function]
-    cls.add_method('DoDispose', 
+                   [param('ns3::Ptr< ns3::WifiNetDevice > const', 'device')])
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiNetDevice> ns3::WifiMac::GetDevice() const [member function]
+    cls.add_method('GetDevice', 
+                   'ns3::Ptr< ns3::WifiNetDevice >', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::FrameExchangeManager> ns3::WifiMac::GetFrameExchangeManager() const [member function]
+    cls.add_method('GetFrameExchangeManager', 
+                   'ns3::Ptr< ns3::FrameExchangeManager >', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::Txop> ns3::WifiMac::GetTxop() const [member function]
+    cls.add_method('GetTxop', 
+                   'ns3::Ptr< ns3::Txop >', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::WifiMac::GetQosTxop(ns3::AcIndex ac) const [member function]
+    cls.add_method('GetQosTxop', 
+                   'ns3::Ptr< ns3::QosTxop >', 
+                   [param('ns3::AcIndex', 'ac')], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::WifiMac::GetQosTxop(uint8_t tid) const [member function]
+    cls.add_method('GetQosTxop', 
+                   'ns3::Ptr< ns3::QosTxop >', 
+                   [param('uint8_t', 'tid')], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueue> ns3::WifiMac::GetTxopQueue(ns3::AcIndex ac) const [member function]
+    cls.add_method('GetTxopQueue', 
+                   'ns3::Ptr< ns3::WifiMacQueue >', 
+                   [param('ns3::AcIndex', 'ac')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetTypeOfStation(ns3::TypeOfStation type) [member function]
+    cls.add_method('SetTypeOfStation', 
                    'void', 
+                   [param('ns3::TypeOfStation', 'type')])
+    ## wifi-mac.h (module 'wifi'): ns3::TypeOfStation ns3::WifiMac::GetTypeOfStation() const [member function]
+    cls.add_method('GetTypeOfStation', 
+                   'ns3::TypeOfStation', 
                    [], 
-                   is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to, ns3::Mac48Address from) [member function]
-    cls.add_method('Enqueue', 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetSsid(ns3::Ssid ssid) [member function]
+    cls.add_method('SetSsid', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to'), param('ns3::Mac48Address', 'from')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to) [member function]
-    cls.add_method('Enqueue', 
+                   [param('ns3::Ssid', 'ssid')])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetPromisc() [member function]
+    cls.add_method('SetPromisc', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to')], 
-                   is_pure_virtual=True, is_virtual=True)
+                   [])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetCtsToSelfSupported(bool enable) [member function]
+    cls.add_method('SetCtsToSelfSupported', 
+                   'void', 
+                   [param('bool', 'enable')])
     ## wifi-mac.h (module 'wifi'): ns3::Mac48Address ns3::WifiMac::GetAddress() const [member function]
     cls.add_method('GetAddress', 
                    'ns3::Mac48Address', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): ns3::Mac48Address ns3::WifiMac::GetBssid() const [member function]
-    cls.add_method('GetBssid', 
-                   'ns3::Mac48Address', 
-                   [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::NetDevice> ns3::WifiMac::GetDevice() const [member function]
-    cls.add_method('GetDevice', 
-                   'ns3::Ptr< ns3::NetDevice >', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::HeConfiguration> ns3::WifiMac::GetHeConfiguration() const [member function]
-    cls.add_method('GetHeConfiguration', 
-                   'ns3::Ptr< ns3::HeConfiguration >', 
-                   [], 
                    is_const=True)
-    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::HtConfiguration> ns3::WifiMac::GetHtConfiguration() const [member function]
-    cls.add_method('GetHtConfiguration', 
-                   'ns3::Ptr< ns3::HtConfiguration >', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::GetShortSlotTimeSupported() const [member function]
-    cls.add_method('GetShortSlotTimeSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## wifi-mac.h (module 'wifi'): ns3::Ssid ns3::WifiMac::GetSsid() const [member function]
     cls.add_method('GetSsid', 
                    'ns3::Ssid', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): static ns3::TypeId ns3::WifiMac::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## wifi-mac.h (module 'wifi'): ns3::TypeOfStation ns3::WifiMac::GetTypeOfStation() const [member function]
-    cls.add_method('GetTypeOfStation', 
-                   'ns3::TypeOfStation', 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetAddress(ns3::Mac48Address address) [member function]
+    cls.add_method('SetAddress', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Mac48Address ns3::WifiMac::GetBssid() const [member function]
+    cls.add_method('GetBssid', 
+                   'ns3::Mac48Address', 
                    [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetBssid(ns3::Mac48Address bssid) [member function]
+    cls.add_method('SetBssid', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'bssid')])
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::CanForwardPacketsTo(ns3::Mac48Address to) const [member function]
+    cls.add_method('CanForwardPacketsTo', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'to')], 
                    is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::VhtConfiguration> ns3::WifiMac::GetVhtConfiguration() const [member function]
-    cls.add_method('GetVhtConfiguration', 
-                   'ns3::Ptr< ns3::VhtConfiguration >', 
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to, ns3::Mac48Address from) [member function]
+    cls.add_method('Enqueue', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to'), param('ns3::Mac48Address', 'from')], 
+                   is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to) [member function]
+    cls.add_method('Enqueue', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::SupportsSendFrom() const [member function]
+    cls.add_method('SupportsSendFrom', 
+                   'bool', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetWifiPhy(ns3::Ptr<ns3::WifiPhy> phy) [member function]
+    cls.add_method('SetWifiPhy', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPhy >', 'phy')], 
+                   is_virtual=True)
     ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiPhy> ns3::WifiMac::GetWifiPhy() const [member function]
     cls.add_method('GetWifiPhy', 
                    'ns3::Ptr< ns3::WifiPhy >', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::ResetWifiPhy() [member function]
+    cls.add_method('ResetWifiPhy', 
+                   'void', 
+                   [])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetWifiRemoteStationManager(ns3::Ptr<ns3::WifiRemoteStationManager> stationManager) [member function]
+    cls.add_method('SetWifiRemoteStationManager', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiRemoteStationManager >', 'stationManager')])
     ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiRemoteStationManager> ns3::WifiMac::GetWifiRemoteStationManager() const [member function]
     cls.add_method('GetWifiRemoteStationManager', 
                    'ns3::Ptr< ns3::WifiRemoteStationManager >', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyPromiscRx(ns3::Ptr<const ns3::Packet> packet) [member function]
-    cls.add_method('NotifyPromiscRx', 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetForwardUpCallback(ns3::WifiMac::ForwardUpCallback upCallback) [member function]
+    cls.add_method('SetForwardUpCallback', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyRx(ns3::Ptr<const ns3::Packet> packet) [member function]
-    cls.add_method('NotifyRx', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'upCallback')])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetLinkUpCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkUp) [member function]
+    cls.add_method('SetLinkUpCallback', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyRxDrop(ns3::Ptr<const ns3::Packet> packet) [member function]
-    cls.add_method('NotifyRxDrop', 
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkUp')], 
+                   is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetLinkDownCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkDown) [member function]
+    cls.add_method('SetLinkDownCallback', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkDown')])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyChannelSwitching() [member function]
+    cls.add_method('NotifyChannelSwitching', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
     ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyTx(ns3::Ptr<const ns3::Packet> packet) [member function]
     cls.add_method('NotifyTx', 
                    'void', 
@@ -11113,75 +11279,163 @@
     cls.add_method('NotifyTxDrop', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet const >', 'packet')])
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::ResetWifiPhy() [member function]
-    cls.add_method('ResetWifiPhy', 
-                   'void', 
-                   [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetAddress(ns3::Mac48Address address) [member function]
-    cls.add_method('SetAddress', 
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyRx(ns3::Ptr<const ns3::Packet> packet) [member function]
+    cls.add_method('NotifyRx', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetDevice(ns3::Ptr<ns3::NetDevice> const device) [member function]
-    cls.add_method('SetDevice', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyPromiscRx(ns3::Ptr<const ns3::Packet> packet) [member function]
+    cls.add_method('NotifyPromiscRx', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NetDevice > const', 'device')])
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetForwardUpCallback(ns3::WifiMac::ForwardUpCallback upCallback) [member function]
-    cls.add_method('SetForwardUpCallback', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyRxDrop(ns3::Ptr<const ns3::Packet> packet) [member function]
+    cls.add_method('NotifyRxDrop', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'upCallback')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetLinkDownCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkDown) [member function]
-    cls.add_method('SetLinkDownCallback', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::ConfigureStandard(ns3::WifiStandard standard) [member function]
+    cls.add_method('ConfigureStandard', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkDown')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetLinkUpCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkUp) [member function]
-    cls.add_method('SetLinkUpCallback', 
+                   [param('ns3::WifiStandard', 'standard')], 
+                   is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::HtConfiguration> ns3::WifiMac::GetHtConfiguration() const [member function]
+    cls.add_method('GetHtConfiguration', 
+                   'ns3::Ptr< ns3::HtConfiguration >', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::VhtConfiguration> ns3::WifiMac::GetVhtConfiguration() const [member function]
+    cls.add_method('GetVhtConfiguration', 
+                   'ns3::Ptr< ns3::VhtConfiguration >', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::HeConfiguration> ns3::WifiMac::GetHeConfiguration() const [member function]
+    cls.add_method('GetHeConfiguration', 
+                   'ns3::Ptr< ns3::HeConfiguration >', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::ExtendedCapabilities ns3::WifiMac::GetExtendedCapabilities() const [member function]
+    cls.add_method('GetExtendedCapabilities', 
+                   'ns3::ExtendedCapabilities', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::HtCapabilities ns3::WifiMac::GetHtCapabilities() const [member function]
+    cls.add_method('GetHtCapabilities', 
+                   'ns3::HtCapabilities', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::VhtCapabilities ns3::WifiMac::GetVhtCapabilities() const [member function]
+    cls.add_method('GetVhtCapabilities', 
+                   'ns3::VhtCapabilities', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::HeCapabilities ns3::WifiMac::GetHeCapabilities() const [member function]
+    cls.add_method('GetHeCapabilities', 
+                   'ns3::HeCapabilities', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::GetQosSupported() const [member function]
+    cls.add_method('GetQosSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::GetErpSupported() const [member function]
+    cls.add_method('GetErpSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::GetDsssSupported() const [member function]
+    cls.add_method('GetDsssSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::GetHtSupported() const [member function]
+    cls.add_method('GetHtSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::GetVhtSupported() const [member function]
+    cls.add_method('GetVhtSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::GetHeSupported() const [member function]
+    cls.add_method('GetHeSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): uint32_t ns3::WifiMac::GetMaxAmpduSize(ns3::AcIndex ac) const [member function]
+    cls.add_method('GetMaxAmpduSize', 
+                   'uint32_t', 
+                   [param('ns3::AcIndex', 'ac')], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): uint16_t ns3::WifiMac::GetMaxAmsduSize(ns3::AcIndex ac) const [member function]
+    cls.add_method('GetMaxAmsduSize', 
+                   'uint16_t', 
+                   [param('ns3::AcIndex', 'ac')], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkUp')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetPromisc() [member function]
-    cls.add_method('SetPromisc', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::DoDispose() [member function]
+    cls.add_method('DoDispose', 
                    'void', 
                    [], 
-                   is_pure_virtual=True, is_virtual=True)
+                   is_virtual=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::ConfigureContentionWindow(uint32_t cwMin, uint32_t cwMax) [member function]
+    cls.add_method('ConfigureContentionWindow', 
+                   'void', 
+                   [param('uint32_t', 'cwMin'), param('uint32_t', 'cwMax')], 
+                   is_virtual=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetQosSupported(bool enable) [member function]
+    cls.add_method('SetQosSupported', 
+                   'void', 
+                   [param('bool', 'enable')], 
+                   visibility='protected')
     ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetShortSlotTimeSupported(bool enable) [member function]
     cls.add_method('SetShortSlotTimeSupported', 
                    'void', 
                    [param('bool', 'enable')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetSsid(ns3::Ssid ssid) [member function]
-    cls.add_method('SetSsid', 
-                   'void', 
-                   [param('ns3::Ssid', 'ssid')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetTypeOfStation(ns3::TypeOfStation type) [member function]
-    cls.add_method('SetTypeOfStation', 
-                   'void', 
-                   [param('ns3::TypeOfStation', 'type')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetWifiPhy(ns3::Ptr<ns3::WifiPhy> phy) [member function]
-    cls.add_method('SetWifiPhy', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiPhy >', 'phy')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetWifiRemoteStationManager(ns3::Ptr<ns3::WifiRemoteStationManager> stationManager) [member function]
-    cls.add_method('SetWifiRemoteStationManager', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiRemoteStationManager >', 'stationManager')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::SupportsSendFrom() const [member function]
-    cls.add_method('SupportsSendFrom', 
+                   visibility='protected')
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::GetShortSlotTimeSupported() const [member function]
+    cls.add_method('GetShortSlotTimeSupported', 
                    'bool', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::ConfigureDcf(ns3::Ptr<ns3::Txop> dcf, uint32_t cwmin, uint32_t cwmax, bool isDsss, ns3::AcIndex ac) [member function]
-    cls.add_method('ConfigureDcf', 
+                   is_const=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::WifiMac::GetVOQueue() const [member function]
+    cls.add_method('GetVOQueue', 
+                   'ns3::Ptr< ns3::QosTxop >', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::WifiMac::GetVIQueue() const [member function]
+    cls.add_method('GetVIQueue', 
+                   'ns3::Ptr< ns3::QosTxop >', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::WifiMac::GetBEQueue() const [member function]
+    cls.add_method('GetBEQueue', 
+                   'ns3::Ptr< ns3::QosTxop >', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::WifiMac::GetBKQueue() const [member function]
+    cls.add_method('GetBKQueue', 
+                   'ns3::Ptr< ns3::QosTxop >', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::Receive(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('Receive', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
+                   is_virtual=True, visibility='protected')
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::ForwardUp(ns3::Ptr<const ns3::Packet> packet, ns3::Mac48Address from, ns3::Mac48Address to) [member function]
+    cls.add_method('ForwardUp', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Txop >', 'dcf'), param('uint32_t', 'cwmin'), param('uint32_t', 'cwmax'), param('bool', 'isDsss'), param('ns3::AcIndex', 'ac')], 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::Mac48Address', 'from'), param('ns3::Mac48Address', 'to')], 
                    visibility='protected')
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::DeaggregateAmsduAndForward(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('DeaggregateAmsduAndForward', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
+                   is_virtual=True, visibility='protected')
     return
 
 def register_Ns3WifiMacHeader_methods(root_module, cls):
@@ -11619,6 +11873,11 @@
     cls.add_method('GetHeader', 
                    'ns3::WifiMacHeader &', 
                    [])
+    ## wifi-mac-queue-item.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::WifiMacQueueItem::GetItem() const [member function]
+    cls.add_method('GetItem', 
+                   'ns3::Ptr< ns3::WifiMacQueueItem >', 
+                   [], 
+                   is_const=True)
     ## wifi-mac-queue-item.h (module 'wifi'): ns3::Ptr<const ns3::Packet> ns3::WifiMacQueueItem::GetPacket() const [member function]
     cls.add_method('GetPacket', 
                    'ns3::Ptr< ns3::Packet const >', 
@@ -11639,11 +11898,6 @@
                    'ns3::AcIndex', 
                    [], 
                    is_const=True)
-    ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem::ConstIterator ns3::WifiMacQueueItem::GetQueueIterator() const [member function]
-    cls.add_method('GetQueueIterator', 
-                   'ns3::WifiMacQueueItem::ConstIterator', 
-                   [], 
-                   is_const=True)
     ## wifi-mac-queue-item.h (module 'wifi'): uint32_t ns3::WifiMacQueueItem::GetSize() const [member function]
     cls.add_method('GetSize', 
                    'uint32_t', 
@@ -11732,7 +11986,7 @@
 def register_Ns3WifiNoProtection_methods(root_module, cls):
     ## wifi-protection.h (module 'wifi'): ns3::WifiNoProtection::WifiNoProtection() [constructor]
     cls.add_constructor([])
-    ## wifi-protection.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection> > ns3::WifiNoProtection::Copy() const [member function]
+    ## wifi-protection.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection>> ns3::WifiNoProtection::Copy() const [member function]
     cls.add_method('Copy', 
                    'std::unique_ptr< ns3::WifiProtection, std::default_delete< ns3::WifiProtection > >', 
                    [], 
@@ -11790,10 +12044,10 @@
                    'ns3::Time', 
                    [param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'psduMap'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiPhyBand', 'band')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::ConfigureStandardAndBand(ns3::WifiPhyStandard standard, ns3::WifiPhyBand band) [member function]
-    cls.add_method('ConfigureStandardAndBand', 
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::ConfigureStandard(ns3::WifiStandard standard) [member function]
+    cls.add_method('ConfigureStandard', 
                    'void', 
-                   [param('ns3::WifiPhyStandard', 'standard'), param('ns3::WifiPhyBand', 'band')], 
+                   [param('ns3::WifiStandard', 'standard')], 
                    is_virtual=True)
     ## wifi-phy.h (module 'wifi'): ns3::WifiSpectrumBand ns3::WifiPhy::ConvertHeRuSubcarriers(uint16_t bandWidth, uint16_t guardBandwidth, ns3::HeRu::SubcarrierRange range, uint8_t bandIndex=0) const [member function]
     cls.add_method('ConvertHeRuSubcarriers', 
@@ -11814,7 +12068,7 @@
                    'ns3::Time', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): std::list<unsigned char, std::allocator<unsigned char> > ns3::WifiPhy::GetBssMembershipSelectorList() const [member function]
+    ## wifi-phy.h (module 'wifi'): std::list<unsigned char, std::allocator<unsigned char>> ns3::WifiPhy::GetBssMembershipSelectorList() const [member function]
     cls.add_method('GetBssMembershipSelectorList', 
                    'std::list< unsigned char >', 
                    [], 
@@ -11853,9 +12107,9 @@
     cls.add_method('GetDelayUntilIdle', 
                    'ns3::Time', 
                    [])
-    ## wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::NetDevice> ns3::WifiPhy::GetDevice() const [member function]
+    ## wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::WifiNetDevice> ns3::WifiPhy::GetDevice() const [member function]
     cls.add_method('GetDevice', 
-                   'ns3::Ptr< ns3::NetDevice >', 
+                   'ns3::Ptr< ns3::WifiNetDevice >', 
                    [], 
                    is_const=True)
     ## wifi-phy.h (module 'wifi'): uint16_t ns3::WifiPhy::GetFrequency() const [member function]
@@ -11898,12 +12152,12 @@
                    'ns3::WifiMode', 
                    [param('ns3::WifiModulationClass', 'modulation'), param('uint8_t', 'mcs')], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> > ns3::WifiPhy::GetMcsList() const [member function]
+    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode>> ns3::WifiPhy::GetMcsList() const [member function]
     cls.add_method('GetMcsList', 
                    'std::list< ns3::WifiMode >', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> > ns3::WifiPhy::GetMcsList(ns3::WifiModulationClass modulation) const [member function]
+    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode>> ns3::WifiPhy::GetMcsList(ns3::WifiModulationClass modulation) const [member function]
     cls.add_method('GetMcsList', 
                    'std::list< ns3::WifiMode >', 
                    [param('ns3::WifiModulationClass', 'modulation')], 
@@ -11913,12 +12167,12 @@
                    'ns3::Ptr< ns3::MobilityModel >', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> > ns3::WifiPhy::GetModeList() const [member function]
+    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode>> ns3::WifiPhy::GetModeList() const [member function]
     cls.add_method('GetModeList', 
                    'std::list< ns3::WifiMode >', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> > ns3::WifiPhy::GetModeList(ns3::WifiModulationClass modulation) const [member function]
+    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode>> ns3::WifiPhy::GetModeList(ns3::WifiModulationClass modulation) const [member function]
     cls.add_method('GetModeList', 
                    'std::list< ns3::WifiMode >', 
                    [param('ns3::WifiModulationClass', 'modulation')], 
@@ -11963,11 +12217,6 @@
                    'ns3::Ptr< ns3::PhyEntity >', 
                    [param('ns3::WifiModulationClass', 'modulation')], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): ns3::WifiPhyStandard ns3::WifiPhy::GetPhyStandard() const [member function]
-    cls.add_method('GetPhyStandard', 
-                   'ns3::WifiPhyStandard', 
-                   [], 
-                   is_const=True)
     ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetPifs() const [member function]
     cls.add_method('GetPifs', 
                    'ns3::Time', 
@@ -11988,6 +12237,16 @@
                    'uint64_t', 
                    [], 
                    is_const=True)
+    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetPrimary20Index() const [member function]
+    cls.add_method('GetPrimary20Index', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetPrimaryChannelNumber(uint16_t primaryChannelWidth) const [member function]
+    cls.add_method('GetPrimaryChannelNumber', 
+                   'uint8_t', 
+                   [param('uint16_t', 'primaryChannelWidth')], 
+                   is_const=True)
     ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetRxGain() const [member function]
     cls.add_method('GetRxGain', 
                    'double', 
@@ -12013,6 +12272,11 @@
                    'ns3::Time', 
                    [], 
                    is_const=True)
+    ## wifi-phy.h (module 'wifi'): ns3::WifiStandard ns3::WifiPhy::GetStandard() const [member function]
+    cls.add_method('GetStandard', 
+                   'ns3::WifiStandard', 
+                   [], 
+                   is_const=True)
     ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetStartOfPacketDuration(ns3::WifiTxVector const & txVector) [member function]
     cls.add_method('GetStartOfPacketDuration', 
                    'ns3::Time', 
@@ -12028,7 +12292,7 @@
                    'ns3::Ptr< ns3::PhyEntity const > const', 
                    [param('ns3::WifiModulationClass', 'modulation')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): std::vector<unsigned short, std::allocator<unsigned short> > ns3::WifiPhy::GetSupportedChannelWidthSet() const [member function]
+    ## wifi-phy.h (module 'wifi'): std::vector<unsigned short, std::allocator<unsigned short>> ns3::WifiPhy::GetSupportedChannelWidthSet() const [member function]
     cls.add_method('GetSupportedChannelWidthSet', 
                    'std::vector< unsigned short >', 
                    [], 
@@ -12117,7 +12381,7 @@
     cls.add_method('NotifyChannelAccessRequested', 
                    'void', 
                    [])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyMonitorSniffRx(ns3::Ptr<const ns3::WifiPsdu> psdu, uint16_t channelFreqMhz, ns3::WifiTxVector txVector, ns3::SignalNoiseDbm signalNoise, std::vector<bool, std::allocator<bool> > statusPerMpdu, uint16_t staId=65535) [member function]
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyMonitorSniffRx(ns3::Ptr<const ns3::WifiPsdu> psdu, uint16_t channelFreqMhz, ns3::WifiTxVector txVector, ns3::SignalNoiseDbm signalNoise, std::vector<bool, std::allocator<bool>> statusPerMpdu, uint16_t staId=65535) [member function]
     cls.add_method('NotifyMonitorSniffRx', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('uint16_t', 'channelFreqMhz'), param('ns3::WifiTxVector', 'txVector'), param('ns3::SignalNoiseDbm', 'signalNoise'), param('std::vector< bool >', 'statusPerMpdu'), param('uint16_t', 'staId', default_value='65535')])
@@ -12173,10 +12437,10 @@
     cls.add_method('Send', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::Send(ns3::WifiConstPsduMap psdus, ns3::WifiTxVector txVector) [member function]
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::Send(ns3::WifiConstPsduMap psdus, ns3::WifiTxVector const & txVector) [member function]
     cls.add_method('Send', 
                    'void', 
-                   [param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'psdus'), param('ns3::WifiTxVector', 'txVector')])
+                   [param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'psdus'), param('ns3::WifiTxVector const &', 'txVector')])
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetCapabilitiesChangedCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
     cls.add_method('SetCapabilitiesChangedCallback', 
                    'void', 
@@ -12185,20 +12449,10 @@
     cls.add_method('SetCcaEdThreshold', 
                    'void', 
                    [param('double', 'threshold')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetChannelNumber(uint8_t id) [member function]
-    cls.add_method('SetChannelNumber', 
-                   'void', 
-                   [param('uint8_t', 'id')], 
-                   is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetChannelWidth(uint16_t channelWidth) [member function]
-    cls.add_method('SetChannelWidth', 
-                   'void', 
-                   [param('uint16_t', 'channelWidth')], 
-                   is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetDevice(ns3::Ptr<ns3::NetDevice> const device) [member function]
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetDevice(ns3::Ptr<ns3::WifiNetDevice> const device) [member function]
     cls.add_method('SetDevice', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NetDevice > const', 'device')])
+                   [param('ns3::Ptr< ns3::WifiNetDevice > const', 'device')])
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetErrorRateModel(ns3::Ptr<ns3::ErrorRateModel> const rate) [member function]
     cls.add_method('SetErrorRateModel', 
                    'void', 
@@ -12207,11 +12461,6 @@
     cls.add_method('SetFrameCaptureModel', 
                    'void', 
                    [param('ns3::Ptr< ns3::FrameCaptureModel > const', 'frameCaptureModel')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetFrequency(uint16_t freq) [member function]
-    cls.add_method('SetFrequency', 
-                   'void', 
-                   [param('uint16_t', 'freq')], 
-                   is_virtual=True)
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetMaxSupportedRxSpatialStreams(uint8_t streams) [member function]
     cls.add_method('SetMaxSupportedRxSpatialStreams', 
                    'void', 
@@ -12236,10 +12485,10 @@
     cls.add_method('SetOffMode', 
                    'void', 
                    [])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetOperatingChannel(uint8_t number, uint16_t frequency, uint16_t width) [member function]
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetOperatingChannel(ns3::WifiPhy::ChannelTuple const & channelTuple) [member function]
     cls.add_method('SetOperatingChannel', 
                    'void', 
-                   [param('uint8_t', 'number'), param('uint16_t', 'frequency'), param('uint16_t', 'width')])
+                   [param('ns3::WifiPhy::ChannelTuple const &', 'channelTuple')])
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetPifs(ns3::Time pifs) [member function]
     cls.add_method('SetPifs', 
                    'void', 
@@ -12252,10 +12501,6 @@
     cls.add_method('SetPreambleDetectionModel', 
                    'void', 
                    [param('ns3::Ptr< ns3::PreambleDetectionModel > const', 'preambleDetectionModel')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetPrimary20Index(uint8_t index) [member function]
-    cls.add_method('SetPrimary20Index', 
-                   'void', 
-                   [param('uint8_t', 'index')])
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetReceiveErrorCallback(ns3::RxErrorCallback callback) [member function]
     cls.add_method('SetReceiveErrorCallback', 
                    'void', 
@@ -12321,18 +12566,16 @@
     cls.add_method('UnregisterListener', 
                    'void', 
                    [param('ns3::WifiPhyListener *', 'listener')])
-    ## wifi-phy.h (module 'wifi'): ns3::WifiPhy::m_frequencyChannels [variable]
-    cls.add_static_attribute('m_frequencyChannels', 'std::set< std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand > > const', is_const=True)
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::AddPhyEntity(ns3::WifiModulationClass modulation, ns3::Ptr<ns3::PhyEntity> phyEntity) [member function]
     cls.add_method('AddPhyEntity', 
                    'void', 
                    [param('ns3::WifiModulationClass', 'modulation'), param('ns3::Ptr< ns3::PhyEntity >', 'phyEntity')], 
                    visibility='protected')
-    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::DoChannelSwitch() [member function]
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::DoChannelSwitch() [member function]
     cls.add_method('DoChannelSwitch', 
-                   'ns3::Time', 
+                   'void', 
                    [], 
-                   visibility='protected')
+                   is_virtual=True, visibility='protected')
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
@@ -12343,6 +12586,11 @@
                    'ns3::WifiSpectrumBand', 
                    [param('uint16_t', 'bandWidth'), param('uint8_t', 'bandIndex', default_value='0')], 
                    is_virtual=True, visibility='protected')
+    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetDelayUntilChannelSwitch() [member function]
+    cls.add_method('GetDelayUntilChannelSwitch', 
+                   'ns3::Time', 
+                   [], 
+                   visibility='protected')
     ## wifi-phy.h (module 'wifi'): uint16_t ns3::WifiPhy::GetMeasurementChannelWidth(ns3::Ptr<const ns3::WifiPpdu> const ppdu) const [member function]
     cls.add_method('GetMeasurementChannelWidth', 
                    'uint16_t', 
@@ -12458,7 +12706,7 @@
     cls.add_method('SwitchFromRxEndError', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('double', 'snr')])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchFromRxEndOk(ns3::Ptr<ns3::WifiPsdu> psdu, ns3::RxSignalInfo rxSignalInfo, ns3::WifiTxVector txVector, uint16_t staId, std::vector<bool, std::allocator<bool> > statusPerMpdu) [member function]
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchFromRxEndOk(ns3::Ptr<ns3::WifiPsdu> psdu, ns3::RxSignalInfo rxSignalInfo, ns3::WifiTxVector txVector, uint16_t staId, std::vector<bool, std::allocator<bool>> statusPerMpdu) [member function]
     cls.add_method('SwitchFromRxEndOk', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('ns3::RxSignalInfo', 'rxSignalInfo'), param('ns3::WifiTxVector', 'txVector'), param('uint16_t', 'staId'), param('std::vector< bool >', 'statusPerMpdu')])
@@ -12594,16 +12842,16 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## wifi-protection-manager.h (module 'wifi'): void ns3::WifiProtectionManager::SetWifiMac(ns3::Ptr<ns3::RegularWifiMac> mac) [member function]
+    ## wifi-protection-manager.h (module 'wifi'): void ns3::WifiProtectionManager::SetWifiMac(ns3::Ptr<ns3::WifiMac> mac) [member function]
     cls.add_method('SetWifiMac', 
                    'void', 
-                   [param('ns3::Ptr< ns3::RegularWifiMac >', 'mac')])
-    ## wifi-protection-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection> > ns3::WifiProtectionManager::TryAddMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters const & txParams) [member function]
+                   [param('ns3::Ptr< ns3::WifiMac >', 'mac')])
+    ## wifi-protection-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection>> ns3::WifiProtectionManager::TryAddMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters const & txParams) [member function]
     cls.add_method('TryAddMpdu', 
                    'std::unique_ptr< ns3::WifiProtection, std::default_delete< ns3::WifiProtection > >', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::WifiTxParameters const &', 'txParams')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## wifi-protection-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection> > ns3::WifiProtectionManager::TryAggregateMsdu(ns3::Ptr<const ns3::WifiMacQueueItem> msdu, ns3::WifiTxParameters const & txParams) [member function]
+    ## wifi-protection-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection>> ns3::WifiProtectionManager::TryAggregateMsdu(ns3::Ptr<const ns3::WifiMacQueueItem> msdu, ns3::WifiTxParameters const & txParams) [member function]
     cls.add_method('TryAggregateMsdu', 
                    'std::unique_ptr< ns3::WifiProtection, std::default_delete< ns3::WifiProtection > >', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'msdu'), param('ns3::WifiTxParameters const &', 'txParams')], 
@@ -12625,7 +12873,7 @@
     cls.add_constructor([param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('bool', 'isSingle')])
     ## wifi-psdu.h (module 'wifi'): ns3::WifiPsdu::WifiPsdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, bool isSingle) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('bool', 'isSingle')])
-    ## wifi-psdu.h (module 'wifi'): ns3::WifiPsdu::WifiPsdu(std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > > mpduList) [constructor]
+    ## wifi-psdu.h (module 'wifi'): ns3::WifiPsdu::WifiPsdu(std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem>>> mpduList) [constructor]
     cls.add_constructor([param('std::vector< ns3::Ptr< ns3::WifiMacQueueItem > >', 'mpduList')])
     ## wifi-psdu.h (module 'wifi'): ns3::WifiMacHeader::QosAckPolicy ns3::WifiPsdu::GetAckPolicyForTid(uint8_t tid) const [member function]
     cls.add_method('GetAckPolicyForTid', 
@@ -12691,7 +12939,7 @@
                    'uint32_t', 
                    [], 
                    is_const=True)
-    ## wifi-psdu.h (module 'wifi'): std::set<unsigned char, std::less<unsigned char>, std::allocator<unsigned char> > ns3::WifiPsdu::GetTids() const [member function]
+    ## wifi-psdu.h (module 'wifi'): std::set<unsigned char, std::less<unsigned char>, std::allocator<unsigned char>> ns3::WifiPsdu::GetTids() const [member function]
     cls.add_method('GetTids', 
                    'std::set< unsigned char >', 
                    [], 
@@ -12724,21 +12972,21 @@
     cls.add_method('SetDuration', 
                    'void', 
                    [param('ns3::Time', 'duration')])
-    ## wifi-psdu.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > >::const_iterator ns3::WifiPsdu::begin() const [member function]
+    ## wifi-psdu.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem>>>::const_iterator ns3::WifiPsdu::begin() const [member function]
     cls.add_method('begin', 
                    'std::vector< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 
                    [], 
                    is_const=True)
-    ## wifi-psdu.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > >::iterator ns3::WifiPsdu::begin() [member function]
+    ## wifi-psdu.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem>>>::iterator ns3::WifiPsdu::begin() [member function]
     cls.add_method('begin', 
                    'std::vector< ns3::Ptr< ns3::WifiMacQueueItem > > iterator', 
                    [])
-    ## wifi-psdu.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > >::const_iterator ns3::WifiPsdu::end() const [member function]
+    ## wifi-psdu.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem>>>::const_iterator ns3::WifiPsdu::end() const [member function]
     cls.add_method('end', 
                    'std::vector< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 
                    [], 
                    is_const=True)
-    ## wifi-psdu.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > >::iterator ns3::WifiPsdu::end() [member function]
+    ## wifi-psdu.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem>>>::iterator ns3::WifiPsdu::end() [member function]
     cls.add_method('end', 
                    'std::vector< ns3::Ptr< ns3::WifiMacQueueItem > > iterator', 
                    [])
@@ -13418,9 +13666,9 @@
                    'ns3::Ptr< ns3::SpectrumModel const >', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## wifi-spectrum-phy-interface.h (module 'wifi'): ns3::Ptr<ns3::AntennaModel> ns3::WifiSpectrumPhyInterface::GetRxAntenna() const [member function]
-    cls.add_method('GetRxAntenna', 
-                   'ns3::Ptr< ns3::AntennaModel >', 
+    ## wifi-spectrum-phy-interface.h (module 'wifi'): ns3::Ptr<ns3::Object> ns3::WifiSpectrumPhyInterface::GetAntenna() const [member function]
+    cls.add_method('GetAntenna', 
+                   'ns3::Ptr< ns3::Object >', 
                    [], 
                    is_const=True, is_virtual=True)
     ## wifi-spectrum-phy-interface.h (module 'wifi'): void ns3::WifiSpectrumPhyInterface::StartRx(ns3::Ptr<ns3::SpectrumSignalParameters> params) [member function]
@@ -13447,6 +13695,8 @@
                    is_virtual=True)
     ## wifi-spectrum-signal-parameters.h (module 'wifi'): ns3::WifiSpectrumSignalParameters::ppdu [variable]
     cls.add_instance_attribute('ppdu', 'ns3::Ptr< ns3::WifiPpdu >', is_const=False)
+    ## wifi-spectrum-signal-parameters.h (module 'wifi'): ns3::WifiSpectrumSignalParameters::txCenterFreq [variable]
+    cls.add_instance_attribute('txCenterFreq', 'uint16_t', is_const=False)
     return
 
 def register_Ns3WifiTxCurrentModel_methods(root_module, cls):
@@ -13717,6 +13967,41 @@
                    is_virtual=True, visibility='private')
     return
 
+def register_Ns3AdhocWifiMac_methods(root_module, cls):
+    ## adhoc-wifi-mac.h (module 'wifi'): static ns3::TypeId ns3::AdhocWifiMac::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## adhoc-wifi-mac.h (module 'wifi'): ns3::AdhocWifiMac::AdhocWifiMac() [constructor]
+    cls.add_constructor([])
+    ## adhoc-wifi-mac.h (module 'wifi'): void ns3::AdhocWifiMac::SetAddress(ns3::Mac48Address address) [member function]
+    cls.add_method('SetAddress', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_virtual=True)
+    ## adhoc-wifi-mac.h (module 'wifi'): void ns3::AdhocWifiMac::SetLinkUpCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkUp) [member function]
+    cls.add_method('SetLinkUpCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkUp')], 
+                   is_virtual=True)
+    ## adhoc-wifi-mac.h (module 'wifi'): void ns3::AdhocWifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to) [member function]
+    cls.add_method('Enqueue', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to')], 
+                   is_virtual=True)
+    ## adhoc-wifi-mac.h (module 'wifi'): bool ns3::AdhocWifiMac::CanForwardPacketsTo(ns3::Mac48Address to) const [member function]
+    cls.add_method('CanForwardPacketsTo', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'to')], 
+                   is_const=True, is_virtual=True)
+    ## adhoc-wifi-mac.h (module 'wifi'): void ns3::AdhocWifiMac::Receive(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('Receive', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
+                   is_virtual=True, visibility='private')
+    return
+
 def register_Ns3AmpduSubframeHeader_methods(root_module, cls):
     ## ampdu-subframe-header.h (module 'wifi'): ns3::AmpduSubframeHeader::AmpduSubframeHeader(ns3::AmpduSubframeHeader const & arg0) [constructor]
     cls.add_constructor([param('ns3::AmpduSubframeHeader const &', 'arg0')])
@@ -13925,6 +14210,113 @@
                    is_static=True)
     return
 
+def register_Ns3ApWifiMac_methods(root_module, cls):
+    ## ap-wifi-mac.h (module 'wifi'): ns3::ApWifiMac::ApWifiMac() [constructor]
+    cls.add_constructor([])
+    ## ap-wifi-mac.h (module 'wifi'): int64_t ns3::ApWifiMac::AssignStreams(int64_t stream) [member function]
+    cls.add_method('AssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')])
+    ## ap-wifi-mac.h (module 'wifi'): bool ns3::ApWifiMac::CanForwardPacketsTo(ns3::Mac48Address to) const [member function]
+    cls.add_method('CanForwardPacketsTo', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'to')], 
+                   is_const=True, is_virtual=True)
+    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to) [member function]
+    cls.add_method('Enqueue', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to')], 
+                   is_virtual=True)
+    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to, ns3::Mac48Address from) [member function]
+    cls.add_method('Enqueue', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to'), param('ns3::Mac48Address', 'from')], 
+                   is_virtual=True)
+    ## ap-wifi-mac.h (module 'wifi'): uint16_t ns3::ApWifiMac::GetAssociationId(ns3::Mac48Address addr) const [member function]
+    cls.add_method('GetAssociationId', 
+                   'uint16_t', 
+                   [param('ns3::Mac48Address', 'addr')], 
+                   is_const=True)
+    ## ap-wifi-mac.h (module 'wifi'): ns3::Time ns3::ApWifiMac::GetBeaconInterval() const [member function]
+    cls.add_method('GetBeaconInterval', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## ap-wifi-mac.h (module 'wifi'): uint8_t ns3::ApWifiMac::GetBufferStatus(uint8_t tid, ns3::Mac48Address address) const [member function]
+    cls.add_method('GetBufferStatus', 
+                   'uint8_t', 
+                   [param('uint8_t', 'tid'), param('ns3::Mac48Address', 'address')], 
+                   is_const=True)
+    ## ap-wifi-mac.h (module 'wifi'): uint8_t ns3::ApWifiMac::GetMaxBufferStatus(ns3::Mac48Address address) const [member function]
+    cls.add_method('GetMaxBufferStatus', 
+                   'uint8_t', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_const=True)
+    ## ap-wifi-mac.h (module 'wifi'): std::map<unsigned short, ns3::Mac48Address, std::less<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Mac48Address>>> const & ns3::ApWifiMac::GetStaList() const [member function]
+    cls.add_method('GetStaList', 
+                   'std::map< unsigned short, ns3::Mac48Address > const &', 
+                   [], 
+                   is_const=True)
+    ## ap-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueue> ns3::ApWifiMac::GetTxopQueue(ns3::AcIndex ac) const [member function]
+    cls.add_method('GetTxopQueue', 
+                   'ns3::Ptr< ns3::WifiMacQueue >', 
+                   [param('ns3::AcIndex', 'ac')], 
+                   is_const=True, is_virtual=True)
+    ## ap-wifi-mac.h (module 'wifi'): static ns3::TypeId ns3::ApWifiMac::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## ap-wifi-mac.h (module 'wifi'): uint16_t ns3::ApWifiMac::GetVhtOperationalChannelWidth() const [member function]
+    cls.add_method('GetVhtOperationalChannelWidth', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::SetAddress(ns3::Mac48Address address) [member function]
+    cls.add_method('SetAddress', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_virtual=True)
+    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::SetBeaconInterval(ns3::Time interval) [member function]
+    cls.add_method('SetBeaconInterval', 
+                   'void', 
+                   [param('ns3::Time', 'interval')])
+    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::SetBufferStatus(uint8_t tid, ns3::Mac48Address address, uint8_t size) [member function]
+    cls.add_method('SetBufferStatus', 
+                   'void', 
+                   [param('uint8_t', 'tid'), param('ns3::Mac48Address', 'address'), param('uint8_t', 'size')])
+    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::SetLinkUpCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkUp) [member function]
+    cls.add_method('SetLinkUpCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkUp')], 
+                   is_virtual=True)
+    ## ap-wifi-mac.h (module 'wifi'): bool ns3::ApWifiMac::SupportsSendFrom() const [member function]
+    cls.add_method('SupportsSendFrom', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::DeaggregateAmsduAndForward(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('DeaggregateAmsduAndForward', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
+                   is_virtual=True, visibility='private')
+    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='private')
+    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='private')
+    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::Receive(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('Receive', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
+                   is_virtual=True, visibility='private')
+    return
+
 def register_Ns3AparfWifiManager_methods(root_module, cls):
     ## aparf-wifi-manager.h (module 'wifi'): ns3::AparfWifiManager::AparfWifiManager(ns3::AparfWifiManager const & arg0) [constructor]
     cls.add_constructor([param('ns3::AparfWifiManager const &', 'arg0')])
@@ -14257,7 +14649,7 @@
     cls.add_method('NotifyMissedAck', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')])
-    ## block-ack-manager.h (module 'wifi'): std::pair<unsigned short, unsigned short> ns3::BlockAckManager::NotifyGotBlockAck(ns3::CtrlBAckResponseHeader const & blockAck, ns3::Mac48Address recipient, std::set<unsigned char, std::less<unsigned char>, std::allocator<unsigned char> > const & tids, size_t index=0) [member function]
+    ## block-ack-manager.h (module 'wifi'): std::pair<unsigned short, unsigned short> ns3::BlockAckManager::NotifyGotBlockAck(ns3::CtrlBAckResponseHeader const & blockAck, ns3::Mac48Address recipient, std::set<unsigned char, std::less<unsigned char>, std::allocator<unsigned char>> const & tids, size_t index=0) [member function]
     cls.add_method('NotifyGotBlockAck', 
                    'std::pair< unsigned short, unsigned short >', 
                    [param('ns3::CtrlBAckResponseHeader const &', 'blockAck'), param('ns3::Mac48Address', 'recipient'), param('std::set< unsigned char > const &', 'tids'), param('size_t', 'index', default_value='0')])
@@ -14438,17 +14830,22 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
+                   is_static=True, template_parameters=['ns3::ObjectBase*'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
                    is_static=True, template_parameters=['void'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiMacQueueItem const> '], visibility='protected')
+                   is_static=True, template_parameters=['double'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::ObjectBase*'], visibility='protected')
+                   is_static=True, template_parameters=['unsigned int'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
@@ -14458,12 +14855,12 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['unsigned int'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::NetDevice> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['double'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::Packet const> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
@@ -14473,157 +14870,157 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['unsigned char'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Address const&'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::WifiTxVector const&'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::NetDevice::PacketType'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['bool'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::WifiTxVector const&'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Mac48Address'], visibility='protected')
+                   is_static=True, template_parameters=['bool'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::Packet const> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Time'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Time'], visibility='protected')
+                   is_static=True, template_parameters=['WifiPhyState'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::OriginatorBlockAckAgreement::State'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::WifiMode'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::WifiMacDropReason'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::WifiPreamble'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::WifiMacHeader const&'], visibility='protected')
+                   is_static=True, template_parameters=['unsigned char'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiPsdu const> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiPsdu> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['std::unordered_map<unsigned short', ' ns3::Ptr<ns3::WifiPsdu>', ' std::hash<unsigned short>', ' std::equal_to<unsigned short>', ' std::allocator<std::pair<unsigned short const', ' ns3::Ptr<ns3::WifiPsdu> > > >*'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::RxSignalInfo'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['std::set<ns3::Mac48Address', ' std::less<ns3::Mac48Address>', ' std::allocator<ns3::Mac48Address> > const*'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::WifiTxVector'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::DataRate'], visibility='protected')
+                   is_static=True, template_parameters=['std::vector<bool', ' std::allocator<bool> > '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiMacQueueItem> '], visibility='protected')
+                   is_static=True, template_parameters=['std::unordered_map<unsigned short', ' ns3::Ptr<ns3::WifiPsdu const>', ' std::hash<unsigned short>', ' std::equal_to<unsigned short>', ' std::allocator<std::pair<unsigned short const', ' ns3::Ptr<ns3::WifiPsdu const> > > > '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['WifiPhyState'], visibility='protected')
+                   is_static=True, template_parameters=['std::map<std::pair<unsigned int', ' unsigned int>', ' double', ' std::less<std::pair<unsigned int', ' unsigned int> >', ' std::allocator<std::pair<std::pair<unsigned int', ' unsigned int> const', ' double> > > '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::WifiMode'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::WifiPhyRxfailureReason'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::WifiPreamble'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::MpduInfo'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiPsdu> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::SignalNoiseDbm'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::RxSignalInfo'], visibility='protected')
+                   is_static=True, template_parameters=['int'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::WifiTxVector'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Mac48Address'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['std::vector<bool', ' std::allocator<bool> > '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::WifiMacHeader const&'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['std::unordered_map<unsigned short', ' ns3::Ptr<ns3::WifiPsdu const>', ' std::hash<unsigned short>', ' std::equal_to<unsigned short>', ' std::allocator<std::pair<unsigned short const', ' ns3::Ptr<ns3::WifiPsdu const> > > > '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::WifiMacDropReason'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['std::map<std::pair<unsigned int', ' unsigned int>', ' double', ' std::less<std::pair<unsigned int', ' unsigned int> >', ' std::allocator<std::pair<std::pair<unsigned int', ' unsigned int> const', ' double> > > '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiMacQueueItem const> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::WifiPhyRxfailureReason'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiPsdu const> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::MpduInfo'], visibility='protected')
+                   is_static=True, template_parameters=['std::unordered_map<unsigned short', ' ns3::Ptr<ns3::WifiPsdu>', ' std::hash<unsigned short>', ' std::equal_to<unsigned short>', ' std::allocator<std::pair<unsigned short const', ' ns3::Ptr<ns3::WifiPsdu> > > >*'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::SignalNoiseDbm'], visibility='protected')
+                   is_static=True, template_parameters=['std::set<ns3::Mac48Address', ' std::less<ns3::Mac48Address>', ' std::allocator<ns3::Mac48Address> > const*'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::HeSigAParameters'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::OriginatorBlockAckAgreement::State'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::QueueDiscItem const> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiMacQueueItem> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::NetDevice> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::HeSigAParameters'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Address const&'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::QueueDiscItem const> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::NetDevice::PacketType'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::DataRate'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
@@ -14639,11 +15036,6 @@
                    'std::string', 
                    [], 
                    is_static=True, template_parameters=['ns3::Ptr<ns3::SpectrumSignalParameters> '], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True, template_parameters=['int'], visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -14924,10 +15316,10 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## channel-condition-model.h (module 'propagation'): bool ns3::ChannelCondition::IsEqual(ns3::Ptr<const ns3::ChannelCondition> otherCondition) const [member function]
+    ## channel-condition-model.h (module 'propagation'): bool ns3::ChannelCondition::IsEqual(ns3::ChannelCondition::LosConditionValue losCondition, ns3::ChannelCondition::O2iConditionValue o2iCondition) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
-                   [param('ns3::Ptr< ns3::ChannelCondition const >', 'otherCondition')], 
+                   [param('ns3::ChannelCondition::LosConditionValue', 'losCondition'), param('ns3::ChannelCondition::O2iConditionValue', 'o2iCondition')], 
                    is_const=True)
     ## channel-condition-model.h (module 'propagation'): bool ns3::ChannelCondition::IsI2i() const [member function]
     cls.add_method('IsI2i', 
@@ -15318,7 +15710,7 @@
                    'uint32_t', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_virtual=True)
-    ## ctrl-headers.h (module 'wifi'): std::vector<unsigned int, std::allocator<unsigned int> > ns3::CtrlBAckResponseHeader::FindPerAidTidInfoWithAid(uint16_t aid) const [member function]
+    ## ctrl-headers.h (module 'wifi'): std::vector<unsigned int, std::allocator<unsigned int>> ns3::CtrlBAckResponseHeader::FindPerAidTidInfoWithAid(uint16_t aid) const [member function]
     cls.add_method('FindPerAidTidInfoWithAid', 
                    'std::vector< unsigned int >', 
                    [param('uint16_t', 'aid')], 
@@ -15333,7 +15725,7 @@
                    'uint16_t', 
                    [param('std::size_t', 'index')], 
                    is_const=True)
-    ## ctrl-headers.h (module 'wifi'): std::vector<unsigned char, std::allocator<unsigned char> > const & ns3::CtrlBAckResponseHeader::GetBitmap(std::size_t index=0) const [member function]
+    ## ctrl-headers.h (module 'wifi'): std::vector<unsigned char, std::allocator<unsigned char>> const & ns3::CtrlBAckResponseHeader::GetBitmap(std::size_t index=0) const [member function]
     cls.add_method('GetBitmap', 
                    'std::vector< unsigned char > const &', 
                    [param('std::size_t', 'index', default_value='0')], 
@@ -17181,8 +17573,9 @@
     ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::NotifySwitchingStartNow(ns3::Time duration) [member function]
     cls.add_method('NotifySwitchingStartNow', 
                    'void', 
-                   [param('ns3::Time', 'duration')])
-    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::Receive(ns3::Ptr<ns3::WifiPsdu> psdu, ns3::RxSignalInfo rxSignalInfo, ns3::WifiTxVector txVector, std::vector<bool, std::allocator<bool> > perMpduStatus) [member function]
+                   [param('ns3::Time', 'duration')], 
+                   is_virtual=True)
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::Receive(ns3::Ptr<ns3::WifiPsdu> psdu, ns3::RxSignalInfo rxSignalInfo, ns3::WifiTxVector txVector, std::vector<bool, std::allocator<bool>> perMpduStatus) [member function]
     cls.add_method('Receive', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('ns3::RxSignalInfo', 'rxSignalInfo'), param('ns3::WifiTxVector', 'txVector'), param('std::vector< bool >', 'perMpduStatus')])
@@ -17239,10 +17632,10 @@
                    'void', 
                    [param('ns3::Ptr< ns3::WifiProtectionManager >', 'protectionManager')], 
                    is_virtual=True)
-    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SetWifiMac(ns3::Ptr<ns3::RegularWifiMac> const mac) [member function]
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SetWifiMac(ns3::Ptr<ns3::WifiMac> const mac) [member function]
     cls.add_method('SetWifiMac', 
                    'void', 
-                   [param('ns3::Ptr< ns3::RegularWifiMac > const', 'mac')], 
+                   [param('ns3::Ptr< ns3::WifiMac > const', 'mac')], 
                    is_virtual=True)
     ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SetWifiPhy(ns3::Ptr<ns3::WifiPhy> const phy) [member function]
     cls.add_method('SetWifiPhy', 
@@ -17264,6 +17657,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')], 
                    is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::DoCtsTimeout(ns3::Ptr<ns3::WifiPsdu> psdu) [member function]
+    cls.add_method('DoCtsTimeout', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu')], 
+                   visibility='protected')
     ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
@@ -17274,7 +17672,7 @@
                    'void', 
                    [param('ns3::WifiMacHeader const &', 'rtsHdr'), param('ns3::WifiTxVector &', 'ctsTxVector'), param('double', 'rtsSnr')], 
                    visibility='protected')
-    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::EndReceiveAmpdu(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::RxSignalInfo const & rxSignalInfo, ns3::WifiTxVector const & txVector, std::vector<bool, std::allocator<bool> > const & perMpduStatus) [member function]
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::EndReceiveAmpdu(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::RxSignalInfo const & rxSignalInfo, ns3::WifiTxVector const & txVector, std::vector<bool, std::allocator<bool>> const & perMpduStatus) [member function]
     cls.add_method('EndReceiveAmpdu', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::RxSignalInfo const &', 'rxSignalInfo'), param('ns3::WifiTxVector const &', 'txVector'), param('std::vector< bool > const &', 'perMpduStatus')], 
@@ -17304,6 +17702,11 @@
                    'ns3::Ptr< ns3::WifiMacQueueItem >', 
                    [], 
                    visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): uint32_t ns3::FrameExchangeManager::GetPsduSize(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetPsduSize', 
+                   'uint32_t', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True, visibility='protected')
     ## frame-exchange-manager.h (module 'wifi'): ns3::Time ns3::FrameExchangeManager::GetRtsDurationId(ns3::WifiTxVector const & rtsTxVector, ns3::Time txDuration, ns3::Time response) const [member function]
     cls.add_method('GetRtsDurationId', 
                    'ns3::Time', 
@@ -17323,7 +17726,7 @@
     cls.add_method('NormalAckTimeout', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('ns3::WifiTxVector const &', 'txVector')], 
-                   visibility='protected')
+                   is_virtual=True, visibility='protected')
     ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::NotifyPacketDiscarded(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
     cls.add_method('NotifyPacketDiscarded', 
                    'void', 
@@ -17349,13 +17752,13 @@
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiTxVector const &', 'ackTxVector'), param('ns3::RxSignalInfo const &', 'rxInfo'), param('double', 'snr')], 
                    is_virtual=True, visibility='protected')
-    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::RetransmitMpduAfterMissedAck(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) const [member function]
-    cls.add_method('RetransmitMpduAfterMissedAck', 
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::ReleaseSequenceNumber(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) const [member function]
+    cls.add_method('ReleaseSequenceNumber', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
                    is_const=True, is_virtual=True, visibility='protected')
-    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::RetransmitMpduAfterMissedCts(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) const [member function]
-    cls.add_method('RetransmitMpduAfterMissedCts', 
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::RetransmitMpduAfterMissedAck(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) const [member function]
+    cls.add_method('RetransmitMpduAfterMissedAck', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
                    is_const=True, is_virtual=True, visibility='protected')
@@ -17522,19 +17925,14 @@
                    'uint8_t', 
                    [], 
                    is_const=True)
-    ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetHeLtfAndGiForHePpdus() const [member function]
-    cls.add_method('GetHeLtfAndGiForHePpdus', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
     ## he-capabilities.h (module 'wifi'): uint32_t ns3::HeCapabilities::GetHeMacCapabilitiesInfo1() const [member function]
     cls.add_method('GetHeMacCapabilitiesInfo1', 
                    'uint32_t', 
                    [], 
                    is_const=True)
-    ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetHeMacCapabilitiesInfo2() const [member function]
+    ## he-capabilities.h (module 'wifi'): uint16_t ns3::HeCapabilities::GetHeMacCapabilitiesInfo2() const [member function]
     cls.add_method('GetHeMacCapabilitiesInfo2', 
-                   'uint8_t', 
+                   'uint16_t', 
                    [], 
                    is_const=True)
     ## he-capabilities.h (module 'wifi'): uint64_t ns3::HeCapabilities::GetHePhyCapabilitiesInfo1() const [member function]
@@ -17542,11 +17940,26 @@
                    'uint64_t', 
                    [], 
                    is_const=True)
-    ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetHePhyCapabilitiesInfo2() const [member function]
+    ## he-capabilities.h (module 'wifi'): uint16_t ns3::HeCapabilities::GetHePhyCapabilitiesInfo2() const [member function]
     cls.add_method('GetHePhyCapabilitiesInfo2', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetHePhyCapabilitiesInfo3() const [member function]
+    cls.add_method('GetHePhyCapabilitiesInfo3', 
                    'uint8_t', 
                    [], 
                    is_const=True)
+    ## he-capabilities.h (module 'wifi'): bool ns3::HeCapabilities::GetHePpdu4xHeLtf800nsGi() const [member function]
+    cls.add_method('GetHePpdu4xHeLtf800nsGi', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## he-capabilities.h (module 'wifi'): bool ns3::HeCapabilities::GetHeSuPpdu1xHeLtf800nsGi() const [member function]
+    cls.add_method('GetHeSuPpdu1xHeLtf800nsGi', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetHighestMcsSupported() const [member function]
     cls.add_method('GetHighestMcsSupported', 
                    'uint8_t', 
@@ -17606,18 +18019,22 @@
     cls.add_method('SetChannelWidthSet', 
                    'void', 
                    [param('uint8_t', 'channelWidthSet')])
-    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHeLtfAndGiForHePpdus(uint8_t heLtfAndGiForHePpdus) [member function]
-    cls.add_method('SetHeLtfAndGiForHePpdus', 
-                   'void', 
-                   [param('uint8_t', 'heLtfAndGiForHePpdus')])
-    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHeMacCapabilitiesInfo(uint32_t ctrl1, uint8_t ctrl2) [member function]
+    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHeMacCapabilitiesInfo(uint32_t ctrl1, uint16_t ctrl2) [member function]
     cls.add_method('SetHeMacCapabilitiesInfo', 
                    'void', 
-                   [param('uint32_t', 'ctrl1'), param('uint8_t', 'ctrl2')])
-    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHePhyCapabilitiesInfo(uint64_t ctrl1, uint8_t ctrl2) [member function]
+                   [param('uint32_t', 'ctrl1'), param('uint16_t', 'ctrl2')])
+    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHePhyCapabilitiesInfo(uint64_t ctrl1, uint16_t ctrl2, uint8_t ctrl3) [member function]
     cls.add_method('SetHePhyCapabilitiesInfo', 
                    'void', 
-                   [param('uint64_t', 'ctrl1'), param('uint8_t', 'ctrl2')])
+                   [param('uint64_t', 'ctrl1'), param('uint16_t', 'ctrl2'), param('uint8_t', 'ctrl3')])
+    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHePpdu4xHeLtf800nsGi(bool heSuPpdu4xHeLtf800nsGi) [member function]
+    cls.add_method('SetHePpdu4xHeLtf800nsGi', 
+                   'void', 
+                   [param('bool', 'heSuPpdu4xHeLtf800nsGi')])
+    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHeSuPpdu1xHeLtf800nsGi(bool heSuPpdu1xHeLtf800nsGi) [member function]
+    cls.add_method('SetHeSuPpdu1xHeLtf800nsGi', 
+                   'void', 
+                   [param('bool', 'heSuPpdu1xHeLtf800nsGi')])
     ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHeSupported(uint8_t heSupported) [member function]
     cls.add_method('SetHeSupported', 
                    'void', 
@@ -18655,7 +19072,7 @@
     cls.add_constructor([param('ns3::ListErrorModel const &', 'arg0')])
     ## error-model.h (module 'network'): ns3::ListErrorModel::ListErrorModel() [constructor]
     cls.add_constructor([])
-    ## error-model.h (module 'network'): std::list<unsigned int, std::allocator<unsigned int> > ns3::ListErrorModel::GetList() const [member function]
+    ## error-model.h (module 'network'): std::list<unsigned int, std::allocator<unsigned int>> ns3::ListErrorModel::GetList() const [member function]
     cls.add_method('GetList', 
                    'std::list< unsigned int >', 
                    [], 
@@ -18665,7 +19082,7 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## error-model.h (module 'network'): void ns3::ListErrorModel::SetList(std::list<unsigned int, std::allocator<unsigned int> > const & packetlist) [member function]
+    ## error-model.h (module 'network'): void ns3::ListErrorModel::SetList(std::list<unsigned int, std::allocator<unsigned int>> const & packetlist) [member function]
     cls.add_method('SetList', 
                    'void', 
                    [param('std::list< unsigned int > const &', 'packetlist')])
@@ -19190,10 +19607,10 @@
                    'uint32_t', 
                    [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid'), param('ns3::WifiModulationClass', 'modulation')], 
                    is_const=True)
-    ## mpdu-aggregator.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > > ns3::MpduAggregator::GetNextAmpdu(ns3::Ptr<ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters & txParams, ns3::Time availableTime, ns3::WifiMacQueueItem::ConstIterator queueIt) const [member function]
+    ## mpdu-aggregator.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem>>> ns3::MpduAggregator::GetNextAmpdu(ns3::Ptr<ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters & txParams, ns3::Time availableTime) const [member function]
     cls.add_method('GetNextAmpdu', 
                    'std::vector< ns3::Ptr< ns3::WifiMacQueueItem > >', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('ns3::WifiTxParameters &', 'txParams'), param('ns3::Time', 'availableTime'), param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'queueIt')], 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('ns3::WifiTxParameters &', 'txParams'), param('ns3::Time', 'availableTime')], 
                    is_const=True)
     ## mpdu-aggregator.h (module 'wifi'): static uint32_t ns3::MpduAggregator::GetSizeIfAggregated(uint32_t mpduSize, uint32_t ampduSize) [member function]
     cls.add_method('GetSizeIfAggregated', 
@@ -19205,10 +19622,10 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## mpdu-aggregator.h (module 'wifi'): void ns3::MpduAggregator::SetWifiMac(ns3::Ptr<ns3::RegularWifiMac> const mac) [member function]
+    ## mpdu-aggregator.h (module 'wifi'): void ns3::MpduAggregator::SetWifiMac(ns3::Ptr<ns3::WifiMac> const mac) [member function]
     cls.add_method('SetWifiMac', 
                    'void', 
-                   [param('ns3::Ptr< ns3::RegularWifiMac > const', 'mac')])
+                   [param('ns3::Ptr< ns3::WifiMac > const', 'mac')])
     ## mpdu-aggregator.h (module 'wifi'): void ns3::MpduAggregator::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
@@ -19236,10 +19653,10 @@
                    'uint16_t', 
                    [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid'), param('ns3::WifiModulationClass', 'modulation')], 
                    is_const=True)
-    ## msdu-aggregator.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::MsduAggregator::GetNextAmsdu(ns3::Ptr<const ns3::WifiMacQueueItem> peekedItem, ns3::WifiTxParameters & txParams, ns3::Time availableTime, ns3::WifiMacQueueItem::ConstIterator & queueIt) const [member function]
+    ## msdu-aggregator.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::MsduAggregator::GetNextAmsdu(ns3::Ptr<const ns3::WifiMacQueueItem> peekedItem, ns3::WifiTxParameters & txParams, ns3::Time availableTime) const [member function]
     cls.add_method('GetNextAmsdu', 
                    'ns3::Ptr< ns3::WifiMacQueueItem >', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'peekedItem'), param('ns3::WifiTxParameters &', 'txParams'), param('ns3::Time', 'availableTime'), param('ns3::WifiMacQueueItem::ConstIterator &', 'queueIt')], 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'peekedItem'), param('ns3::WifiTxParameters &', 'txParams'), param('ns3::Time', 'availableTime')], 
                    is_const=True)
     ## msdu-aggregator.h (module 'wifi'): static uint16_t ns3::MsduAggregator::GetSizeIfAggregated(uint16_t msduSize, uint16_t amsduSize) [member function]
     cls.add_method('GetSizeIfAggregated', 
@@ -19251,10 +19668,10 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## msdu-aggregator.h (module 'wifi'): void ns3::MsduAggregator::SetWifiMac(ns3::Ptr<ns3::RegularWifiMac> const mac) [member function]
+    ## msdu-aggregator.h (module 'wifi'): void ns3::MsduAggregator::SetWifiMac(ns3::Ptr<ns3::WifiMac> const mac) [member function]
     cls.add_method('SetWifiMac', 
                    'void', 
-                   [param('ns3::Ptr< ns3::RegularWifiMac > const', 'mac')])
+                   [param('ns3::Ptr< ns3::WifiMac > const', 'mac')])
     ## msdu-aggregator.h (module 'wifi'): void ns3::MsduAggregator::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
@@ -19434,10 +19851,10 @@
     cls.add_constructor([])
     ## multi-user-scheduler.h (module 'wifi'): ns3::MultiUserScheduler::UlMuInfo::UlMuInfo(ns3::MultiUserScheduler::UlMuInfo const & arg0) [constructor]
     cls.add_constructor([param('ns3::MultiUserScheduler::UlMuInfo const &', 'arg0')])
-    ## multi-user-scheduler.h (module 'wifi'): ns3::MultiUserScheduler::UlMuInfo::tbPpduDuration [variable]
-    cls.add_instance_attribute('tbPpduDuration', 'ns3::Time', is_const=False)
+    ## multi-user-scheduler.h (module 'wifi'): ns3::MultiUserScheduler::UlMuInfo::macHdr [variable]
+    cls.add_instance_attribute('macHdr', 'ns3::WifiMacHeader', is_const=False)
     ## multi-user-scheduler.h (module 'wifi'): ns3::MultiUserScheduler::UlMuInfo::trigger [variable]
-    cls.add_instance_attribute('trigger', 'ns3::Ptr< ns3::WifiMacQueueItem >', is_const=False)
+    cls.add_instance_attribute('trigger', 'ns3::CtrlTriggerHeader', is_const=False)
     ## multi-user-scheduler.h (module 'wifi'): ns3::MultiUserScheduler::UlMuInfo::txParams [variable]
     cls.add_instance_attribute('txParams', 'ns3::WifiTxParameters', is_const=False)
     return
@@ -19679,10 +20096,16 @@
     cls.add_method('ExtractNeighborIndex', 
                    'uint32_t', 
                    [param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetEpoch() const [member function]
+    cls.add_method('GetEpoch', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() const [member function]
     cls.add_method('GetRemainingBits', 
                    'uint32_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -19693,6 +20116,10 @@
                    'uint32_t', 
                    [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
+    ## nix-vector.h (module 'network'): void ns3::NixVector::SetEpoch(uint32_t epoch) [member function]
+    cls.add_method('SetEpoch', 
+                   'void', 
+                   [param('uint32_t', 'epoch')])
     return
 
 def register_Ns3Node_methods(root_module, cls):
@@ -20238,10 +20665,11 @@
                    'uint32_t', 
                    [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) const [member function]
     cls.add_method('SetNixVector', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')], 
+                   is_const=True)
     ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
     cls.add_method('ToString', 
                    'std::string', 
@@ -20522,12 +20950,12 @@
     cls.add_method('Transmit', 
                    'void', 
                    [param('ns3::Time', 'txDuration'), param('ns3::Ptr< ns3::WifiPpdu >', 'ppdu'), param('std::string', 'type')])
-    ## phy-entity.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> >::const_iterator ns3::PhyEntity::begin() const [member function]
+    ## phy-entity.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode>>::const_iterator ns3::PhyEntity::begin() const [member function]
     cls.add_method('begin', 
                    'std::list< ns3::WifiMode > const_iterator', 
                    [], 
                    is_const=True)
-    ## phy-entity.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> >::const_iterator ns3::PhyEntity::end() const [member function]
+    ## phy-entity.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode>>::const_iterator ns3::PhyEntity::end() const [member function]
     cls.add_method('end', 
                    'std::list< ns3::WifiMode > const_iterator', 
                    [], 
@@ -20612,7 +21040,7 @@
                    'uint16_t', 
                    [param('ns3::WifiTxVector const &', 'txVector')], 
                    is_const=True, visibility='protected')
-    ## phy-entity.h (module 'wifi'): std::pair<unsigned short, std::pair<unsigned int, unsigned int> > ns3::PhyEntity::GetChannelWidthAndBand(ns3::WifiTxVector const & txVector, uint16_t staId) const [member function]
+    ## phy-entity.h (module 'wifi'): std::pair<unsigned short, std::pair<unsigned int, unsigned int>> ns3::PhyEntity::GetChannelWidthAndBand(ns3::WifiTxVector const & txVector, uint16_t staId) const [member function]
     cls.add_method('GetChannelWidthAndBand', 
                    'std::pair< unsigned short, std::pair< unsigned int, unsigned int > >', 
                    [param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId')], 
@@ -20622,7 +21050,7 @@
                    'ns3::Ptr< ns3::Event const >', 
                    [], 
                    is_const=True, visibility='protected')
-    ## phy-entity.h (module 'wifi'): std::map<std::pair<unsigned long, ns3::WifiPreamble>, ns3::Ptr<ns3::Event>, std::less<std::pair<unsigned long, ns3::WifiPreamble> >, std::allocator<std::pair<const std::pair<unsigned long, ns3::WifiPreamble>, ns3::Ptr<ns3::Event> > > > const & ns3::PhyEntity::GetCurrentPreambleEvents() const [member function]
+    ## phy-entity.h (module 'wifi'): std::map<std::pair<unsigned long, ns3::WifiPreamble>, ns3::Ptr<ns3::Event>, std::less<std::pair<unsigned long, ns3::WifiPreamble>>, std::allocator<std::pair<const std::pair<unsigned long, ns3::WifiPreamble>, ns3::Ptr<ns3::Event>>>> const & ns3::PhyEntity::GetCurrentPreambleEvents() const [member function]
     cls.add_method('GetCurrentPreambleEvents', 
                    'std::map< std::pair< unsigned long, ns3::WifiPreamble >, ns3::Ptr< ns3::Event > > const &', 
                    [], 
@@ -20677,6 +21105,11 @@
                    'void', 
                    [param('bool', 'reset')], 
                    visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::NotifyPayloadBegin(ns3::WifiTxVector const & txVector, ns3::Time const & payloadDuration) [member function]
+    cls.add_method('NotifyPayloadBegin', 
+                   'void', 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time const &', 'payloadDuration')], 
+                   visibility='protected')
     ## phy-entity.h (module 'wifi'): uint64_t ns3::PhyEntity::ObtainNextUid(ns3::WifiTxVector const & txVector) [member function]
     cls.add_method('ObtainNextUid', 
                    'uint64_t', 
@@ -20947,10 +21380,10 @@
                    'uint32_t', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## qos-txop.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::QosTxop::GetNextMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> peekedItem, ns3::WifiTxParameters & txParams, ns3::Time availableTime, bool initialFrame, ns3::WifiMacQueueItem::ConstIterator & queueIt) [member function]
+    ## qos-txop.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::QosTxop::GetNextMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> peekedItem, ns3::WifiTxParameters & txParams, ns3::Time availableTime, bool initialFrame) [member function]
     cls.add_method('GetNextMpdu', 
                    'ns3::Ptr< ns3::WifiMacQueueItem >', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'peekedItem'), param('ns3::WifiTxParameters &', 'txParams'), param('ns3::Time', 'availableTime'), param('bool', 'initialFrame'), param('ns3::WifiMacQueueItem::ConstIterator &', 'queueIt')])
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'peekedItem'), param('ns3::WifiTxParameters &', 'txParams'), param('ns3::Time', 'availableTime'), param('bool', 'initialFrame')])
     ## qos-txop.h (module 'wifi'): uint16_t ns3::QosTxop::GetNextSequenceNumberFor(ns3::WifiMacHeader const * hdr) [member function]
     cls.add_method('GetNextSequenceNumberFor', 
                    'uint16_t', 
@@ -21008,14 +21441,10 @@
                    'void', 
                    [], 
                    is_virtual=True)
-    ## qos-txop.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::QosTxop::PeekNextMpdu(uint8_t tid=8, ns3::Mac48Address recipient=ns3::Mac48Address::GetBroadcast()) [member function]
+    ## qos-txop.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::QosTxop::PeekNextMpdu(uint8_t tid=8, ns3::Mac48Address recipient=ns3::Mac48Address::GetBroadcast(), ns3::Ptr<const ns3::WifiMacQueueItem> item=nullptr) [member function]
     cls.add_method('PeekNextMpdu', 
                    'ns3::Ptr< ns3::WifiMacQueueItem const >', 
-                   [param('uint8_t', 'tid', default_value='8'), param('ns3::Mac48Address', 'recipient', default_value='ns3::Mac48Address::GetBroadcast()')])
-    ## qos-txop.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::QosTxop::PeekNextMpdu(ns3::WifiMacQueueItem::ConstIterator queueIt, uint8_t tid=8, ns3::Mac48Address recipient=ns3::Mac48Address::GetBroadcast()) [member function]
-    cls.add_method('PeekNextMpdu', 
-                   'ns3::Ptr< ns3::WifiMacQueueItem const >', 
-                   [param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'queueIt'), param('uint8_t', 'tid', default_value='8'), param('ns3::Mac48Address', 'recipient', default_value='ns3::Mac48Address::GetBroadcast()')])
+                   [param('uint8_t', 'tid', default_value='8'), param('ns3::Mac48Address', 'recipient', default_value='ns3::Mac48Address::GetBroadcast()'), param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'item', default_value='nullptr')])
     ## qos-txop.h (module 'wifi'): uint16_t ns3::QosTxop::PeekNextSequenceNumberFor(ns3::WifiMacHeader const * hdr) [member function]
     cls.add_method('PeekNextSequenceNumberFor', 
                    'uint16_t', 
@@ -21521,7 +21950,7 @@
     cls.add_constructor([param('ns3::ReceiveListErrorModel const &', 'arg0')])
     ## error-model.h (module 'network'): ns3::ReceiveListErrorModel::ReceiveListErrorModel() [constructor]
     cls.add_constructor([])
-    ## error-model.h (module 'network'): std::list<unsigned int, std::allocator<unsigned int> > ns3::ReceiveListErrorModel::GetList() const [member function]
+    ## error-model.h (module 'network'): std::list<unsigned int, std::allocator<unsigned int>> ns3::ReceiveListErrorModel::GetList() const [member function]
     cls.add_method('GetList', 
                    'std::list< unsigned int >', 
                    [], 
@@ -21531,7 +21960,7 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## error-model.h (module 'network'): void ns3::ReceiveListErrorModel::SetList(std::list<unsigned int, std::allocator<unsigned int> > const & packetlist) [member function]
+    ## error-model.h (module 'network'): void ns3::ReceiveListErrorModel::SetList(std::list<unsigned int, std::allocator<unsigned int>> const & packetlist) [member function]
     cls.add_method('SetList', 
                    'void', 
                    [param('std::list< unsigned int > const &', 'packetlist')])
@@ -21547,289 +21976,6 @@
                    is_virtual=True, visibility='private')
     return
 
-def register_Ns3RegularWifiMac_methods(root_module, cls):
-    ## regular-wifi-mac.h (module 'wifi'): static ns3::TypeId ns3::RegularWifiMac::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::RegularWifiMac::RegularWifiMac() [constructor]
-    cls.add_constructor([])
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetShortSlotTimeSupported(bool enable) [member function]
-    cls.add_method('SetShortSlotTimeSupported', 
-                   'void', 
-                   [param('bool', 'enable')], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetSsid(ns3::Ssid ssid) [member function]
-    cls.add_method('SetSsid', 
-                   'void', 
-                   [param('ns3::Ssid', 'ssid')], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetAddress(ns3::Mac48Address address) [member function]
-    cls.add_method('SetAddress', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetPromisc() [member function]
-    cls.add_method('SetPromisc', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetShortSlotTimeSupported() const [member function]
-    cls.add_method('GetShortSlotTimeSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ssid ns3::RegularWifiMac::GetSsid() const [member function]
-    cls.add_method('GetSsid', 
-                   'ns3::Ssid', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Mac48Address ns3::RegularWifiMac::GetAddress() const [member function]
-    cls.add_method('GetAddress', 
-                   'ns3::Mac48Address', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Mac48Address ns3::RegularWifiMac::GetBssid() const [member function]
-    cls.add_method('GetBssid', 
-                   'ns3::Mac48Address', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to, ns3::Mac48Address from) [member function]
-    cls.add_method('Enqueue', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to'), param('ns3::Mac48Address', 'from')], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::SupportsSendFrom() const [member function]
-    cls.add_method('SupportsSendFrom', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetWifiPhy(ns3::Ptr<ns3::WifiPhy> const phy) [member function]
-    cls.add_method('SetWifiPhy', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiPhy > const', 'phy')], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiPhy> ns3::RegularWifiMac::GetWifiPhy() const [member function]
-    cls.add_method('GetWifiPhy', 
-                   'ns3::Ptr< ns3::WifiPhy >', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::ResetWifiPhy() [member function]
-    cls.add_method('ResetWifiPhy', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetWifiRemoteStationManager(ns3::Ptr<ns3::WifiRemoteStationManager> const stationManager) [member function]
-    cls.add_method('SetWifiRemoteStationManager', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiRemoteStationManager > const', 'stationManager')], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::ConfigureStandard(ns3::WifiStandard standard) [member function]
-    cls.add_method('ConfigureStandard', 
-                   'void', 
-                   [param('ns3::WifiStandard', 'standard')], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::TypeOfStation ns3::RegularWifiMac::GetTypeOfStation() const [member function]
-    cls.add_method('GetTypeOfStation', 
-                   'ns3::TypeOfStation', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetForwardUpCallback(ns3::WifiMac::ForwardUpCallback upCallback) [member function]
-    cls.add_method('SetForwardUpCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'upCallback')], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetLinkUpCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkUp) [member function]
-    cls.add_method('SetLinkUpCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkUp')], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetLinkDownCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkDown) [member function]
-    cls.add_method('SetLinkDownCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkDown')], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiRemoteStationManager> ns3::RegularWifiMac::GetWifiRemoteStationManager() const [member function]
-    cls.add_method('GetWifiRemoteStationManager', 
-                   'ns3::Ptr< ns3::WifiRemoteStationManager >', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to) [member function]
-    cls.add_method('Enqueue', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::FrameExchangeManager> ns3::RegularWifiMac::GetFrameExchangeManager() const [member function]
-    cls.add_method('GetFrameExchangeManager', 
-                   'ns3::Ptr< ns3::FrameExchangeManager >', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetCtsToSelfSupported(bool enable) [member function]
-    cls.add_method('SetCtsToSelfSupported', 
-                   'void', 
-                   [param('bool', 'enable')])
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetBssid(ns3::Mac48Address bssid) [member function]
-    cls.add_method('SetBssid', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'bssid')])
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::Txop> ns3::RegularWifiMac::GetTxop() const [member function]
-    cls.add_method('GetTxop', 
-                   'ns3::Ptr< ns3::Txop >', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::RegularWifiMac::GetQosTxop(ns3::AcIndex ac) const [member function]
-    cls.add_method('GetQosTxop', 
-                   'ns3::Ptr< ns3::QosTxop >', 
-                   [param('ns3::AcIndex', 'ac')], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::RegularWifiMac::GetQosTxop(uint8_t tid) const [member function]
-    cls.add_method('GetQosTxop', 
-                   'ns3::Ptr< ns3::QosTxop >', 
-                   [param('uint8_t', 'tid')], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueue> ns3::RegularWifiMac::GetTxopQueue(ns3::AcIndex ac) const [member function]
-    cls.add_method('GetTxopQueue', 
-                   'ns3::Ptr< ns3::WifiMacQueue >', 
-                   [param('ns3::AcIndex', 'ac')], 
-                   is_const=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetQosSupported() const [member function]
-    cls.add_method('GetQosSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetErpSupported() const [member function]
-    cls.add_method('GetErpSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetDsssSupported() const [member function]
-    cls.add_method('GetDsssSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetHtSupported() const [member function]
-    cls.add_method('GetHtSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetVhtSupported() const [member function]
-    cls.add_method('GetVhtSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetHeSupported() const [member function]
-    cls.add_method('GetHeSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::ExtendedCapabilities ns3::RegularWifiMac::GetExtendedCapabilities() const [member function]
-    cls.add_method('GetExtendedCapabilities', 
-                   'ns3::ExtendedCapabilities', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::HtCapabilities ns3::RegularWifiMac::GetHtCapabilities() const [member function]
-    cls.add_method('GetHtCapabilities', 
-                   'ns3::HtCapabilities', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::VhtCapabilities ns3::RegularWifiMac::GetVhtCapabilities() const [member function]
-    cls.add_method('GetVhtCapabilities', 
-                   'ns3::VhtCapabilities', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::HeCapabilities ns3::RegularWifiMac::GetHeCapabilities() const [member function]
-    cls.add_method('GetHeCapabilities', 
-                   'ns3::HeCapabilities', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): uint32_t ns3::RegularWifiMac::GetMaxAmpduSize(ns3::AcIndex ac) const [member function]
-    cls.add_method('GetMaxAmpduSize', 
-                   'uint32_t', 
-                   [param('ns3::AcIndex', 'ac')], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): uint16_t ns3::RegularWifiMac::GetMaxAmsduSize(ns3::AcIndex ac) const [member function]
-    cls.add_method('GetMaxAmsduSize', 
-                   'uint16_t', 
-                   [param('ns3::AcIndex', 'ac')], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::DoInitialize() [member function]
-    cls.add_method('DoInitialize', 
-                   'void', 
-                   [], 
-                   is_virtual=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::DoDispose() [member function]
-    cls.add_method('DoDispose', 
-                   'void', 
-                   [], 
-                   is_virtual=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetTypeOfStation(ns3::TypeOfStation type) [member function]
-    cls.add_method('SetTypeOfStation', 
-                   'void', 
-                   [param('ns3::TypeOfStation', 'type')], 
-                   is_virtual=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::RegularWifiMac::GetVOQueue() const [member function]
-    cls.add_method('GetVOQueue', 
-                   'ns3::Ptr< ns3::QosTxop >', 
-                   [], 
-                   is_const=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::RegularWifiMac::GetVIQueue() const [member function]
-    cls.add_method('GetVIQueue', 
-                   'ns3::Ptr< ns3::QosTxop >', 
-                   [], 
-                   is_const=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::RegularWifiMac::GetBEQueue() const [member function]
-    cls.add_method('GetBEQueue', 
-                   'ns3::Ptr< ns3::QosTxop >', 
-                   [], 
-                   is_const=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::RegularWifiMac::GetBKQueue() const [member function]
-    cls.add_method('GetBKQueue', 
-                   'ns3::Ptr< ns3::QosTxop >', 
-                   [], 
-                   is_const=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::ConfigureContentionWindow(uint32_t cwMin, uint32_t cwMax) [member function]
-    cls.add_method('ConfigureContentionWindow', 
-                   'void', 
-                   [param('uint32_t', 'cwMin'), param('uint32_t', 'cwMax')], 
-                   visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::Receive(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('Receive', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
-                   is_virtual=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::ForwardUp(ns3::Ptr<const ns3::Packet> packet, ns3::Mac48Address from, ns3::Mac48Address to) [member function]
-    cls.add_method('ForwardUp', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::Mac48Address', 'from'), param('ns3::Mac48Address', 'to')], 
-                   visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::DeaggregateAmsduAndForward(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('DeaggregateAmsduAndForward', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
-                   is_virtual=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetQosSupported(bool enable) [member function]
-    cls.add_method('SetQosSupported', 
-                   'void', 
-                   [param('bool', 'enable')], 
-                   is_virtual=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetupFrameExchangeManager() [member function]
-    cls.add_method('SetupFrameExchangeManager', 
-                   'void', 
-                   [], 
-                   visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetErpSupported(bool enable) [member function]
-    cls.add_method('SetErpSupported', 
-                   'void', 
-                   [param('bool', 'enable')], 
-                   visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetDsssSupported(bool enable) [member function]
-    cls.add_method('SetDsssSupported', 
-                   'void', 
-                   [param('bool', 'enable')], 
-                   visibility='protected')
-    return
-
 def register_Ns3RrMultiUserScheduler_methods(root_module, cls):
     ## rr-multi-user-scheduler.h (module 'wifi'): ns3::RrMultiUserScheduler::RrMultiUserScheduler(ns3::RrMultiUserScheduler const & arg0) [constructor]
     cls.add_constructor([param('ns3::RrMultiUserScheduler const &', 'arg0')])
@@ -22082,6 +22228,10 @@
     cls.add_constructor([param('ns3::SpectrumChannel const &', 'arg0')])
     ## spectrum-channel.h (module 'spectrum'): ns3::SpectrumChannel::SpectrumChannel() [constructor]
     cls.add_constructor([])
+    ## spectrum-channel.h (module 'spectrum'): void ns3::SpectrumChannel::AddPhasedArraySpectrumPropagationLossModel(ns3::Ptr<ns3::PhasedArraySpectrumPropagationLossModel> loss) [member function]
+    cls.add_method('AddPhasedArraySpectrumPropagationLossModel', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::PhasedArraySpectrumPropagationLossModel >', 'loss')])
     ## spectrum-channel.h (module 'spectrum'): void ns3::SpectrumChannel::AddPropagationLossModel(ns3::Ptr<ns3::PropagationLossModel> loss) [member function]
     cls.add_method('AddPropagationLossModel', 
                    'void', 
@@ -22100,6 +22250,10 @@
                    'void', 
                    [], 
                    is_virtual=True)
+    ## spectrum-channel.h (module 'spectrum'): ns3::Ptr<ns3::PhasedArraySpectrumPropagationLossModel> ns3::SpectrumChannel::GetPhasedArraySpectrumPropagationLossModel() [member function]
+    cls.add_method('GetPhasedArraySpectrumPropagationLossModel', 
+                   'ns3::Ptr< ns3::PhasedArraySpectrumPropagationLossModel >', 
+                   [])
     ## spectrum-channel.h (module 'spectrum'): ns3::Ptr<ns3::PropagationLossModel> ns3::SpectrumChannel::GetPropagationLossModel() [member function]
     cls.add_method('GetPropagationLossModel', 
                    'ns3::Ptr< ns3::PropagationLossModel >', 
@@ -22113,6 +22267,11 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## spectrum-channel.h (module 'spectrum'): void ns3::SpectrumChannel::RemoveRx(ns3::Ptr<ns3::SpectrumPhy> phy) [member function]
+    cls.add_method('RemoveRx', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::SpectrumPhy >', 'phy')], 
+                   is_pure_virtual=True, is_virtual=True)
     ## spectrum-channel.h (module 'spectrum'): void ns3::SpectrumChannel::SetPropagationDelayModel(ns3::Ptr<ns3::PropagationDelayModel> delay) [member function]
     cls.add_method('SetPropagationDelayModel', 
                    'void', 
@@ -22129,15 +22288,20 @@
     cls.add_constructor([param('ns3::SpectrumWifiPhy const &', 'arg0')])
     ## spectrum-wifi-phy.h (module 'wifi'): ns3::SpectrumWifiPhy::SpectrumWifiPhy() [constructor]
     cls.add_constructor([])
-    ## spectrum-wifi-phy.h (module 'wifi'): void ns3::SpectrumWifiPhy::ConfigureStandardAndBand(ns3::WifiPhyStandard standard, ns3::WifiPhyBand band) [member function]
-    cls.add_method('ConfigureStandardAndBand', 
-                   'void', 
-                   [param('ns3::WifiPhyStandard', 'standard'), param('ns3::WifiPhyBand', 'band')], 
-                   is_virtual=True)
     ## spectrum-wifi-phy.h (module 'wifi'): void ns3::SpectrumWifiPhy::CreateWifiSpectrumPhyInterface(ns3::Ptr<ns3::NetDevice> device) [member function]
     cls.add_method('CreateWifiSpectrumPhyInterface', 
                    'void', 
                    [param('ns3::Ptr< ns3::NetDevice >', 'device')])
+    ## spectrum-wifi-phy.h (module 'wifi'): void ns3::SpectrumWifiPhy::DoChannelSwitch() [member function]
+    cls.add_method('DoChannelSwitch', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    ## spectrum-wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::Object> ns3::SpectrumWifiPhy::GetAntenna() const [member function]
+    cls.add_method('GetAntenna', 
+                   'ns3::Ptr< ns3::Object >', 
+                   [], 
+                   is_const=True)
     ## spectrum-wifi-phy.h (module 'wifi'): uint32_t ns3::SpectrumWifiPhy::GetBandBandwidth() const [member function]
     cls.add_method('GetBandBandwidth', 
                    'uint32_t', 
@@ -22153,11 +22317,6 @@
                    'uint16_t', 
                    [param('uint16_t', 'currentChannelWidth')], 
                    is_const=True, is_virtual=True)
-    ## spectrum-wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::AntennaModel> ns3::SpectrumWifiPhy::GetRxAntenna() const [member function]
-    cls.add_method('GetRxAntenna', 
-                   'ns3::Ptr< ns3::AntennaModel >', 
-                   [], 
-                   is_const=True)
     ## spectrum-wifi-phy.h (module 'wifi'): ns3::Ptr<const ns3::SpectrumModel> ns3::SpectrumWifiPhy::GetRxSpectrumModel() [member function]
     cls.add_method('GetRxSpectrumModel', 
                    'ns3::Ptr< ns3::SpectrumModel const >', 
@@ -22180,21 +22339,6 @@
     cls.add_method('SetChannel', 
                    'void', 
                    [param('ns3::Ptr< ns3::SpectrumChannel > const', 'channel')])
-    ## spectrum-wifi-phy.h (module 'wifi'): void ns3::SpectrumWifiPhy::SetChannelNumber(uint8_t id) [member function]
-    cls.add_method('SetChannelNumber', 
-                   'void', 
-                   [param('uint8_t', 'id')], 
-                   is_virtual=True)
-    ## spectrum-wifi-phy.h (module 'wifi'): void ns3::SpectrumWifiPhy::SetChannelWidth(uint16_t channelwidth) [member function]
-    cls.add_method('SetChannelWidth', 
-                   'void', 
-                   [param('uint16_t', 'channelwidth')], 
-                   is_virtual=True)
-    ## spectrum-wifi-phy.h (module 'wifi'): void ns3::SpectrumWifiPhy::SetFrequency(uint16_t freq) [member function]
-    cls.add_method('SetFrequency', 
-                   'void', 
-                   [param('uint16_t', 'freq')], 
-                   is_virtual=True)
     ## spectrum-wifi-phy.h (module 'wifi'): void ns3::SpectrumWifiPhy::StartRx(ns3::Ptr<ns3::SpectrumSignalParameters> rxParams) [member function]
     cls.add_method('StartRx', 
                    'void', 
@@ -22328,6 +22472,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to')], 
                    is_virtual=True)
+    ## sta-wifi-mac.h (module 'wifi'): bool ns3::StaWifiMac::CanForwardPacketsTo(ns3::Mac48Address to) const [member function]
+    cls.add_method('CanForwardPacketsTo', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'to')], 
+                   is_const=True, is_virtual=True)
     ## sta-wifi-mac.h (module 'wifi'): void ns3::StaWifiMac::SetWifiPhy(ns3::Ptr<ns3::WifiPhy> const phy) [member function]
     cls.add_method('SetWifiPhy', 
                    'void', 
@@ -22343,6 +22492,11 @@
                    'uint16_t', 
                    [], 
                    is_const=True)
+    ## sta-wifi-mac.h (module 'wifi'): void ns3::StaWifiMac::NotifyChannelSwitching() [member function]
+    cls.add_method('NotifyChannelSwitching', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
     ## sta-wifi-mac.h (module 'wifi'): void ns3::StaWifiMac::Receive(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
     cls.add_method('Receive', 
                    'void', 
@@ -22429,9 +22583,9 @@
     cls.add_constructor([param('ns3::TableBasedErrorRateModel const &', 'arg0')])
     ## table-based-error-rate-model.h (module 'wifi'): ns3::TableBasedErrorRateModel::TableBasedErrorRateModel() [constructor]
     cls.add_constructor([])
-    ## table-based-error-rate-model.h (module 'wifi'): static uint8_t ns3::TableBasedErrorRateModel::GetMcsForMode(ns3::WifiMode mode) [member function]
+    ## table-based-error-rate-model.h (module 'wifi'): static std::optional<unsigned char> ns3::TableBasedErrorRateModel::GetMcsForMode(ns3::WifiMode mode) [member function]
     cls.add_method('GetMcsForMode', 
-                   'uint8_t', 
+                   'std::optional< unsigned char >', 
                    [param('ns3::WifiMode', 'mode')], 
                    is_static=True)
     ## table-based-error-rate-model.h (module 'wifi'): static ns3::TypeId ns3::TableBasedErrorRateModel::GetTypeId() [member function]
@@ -23227,17 +23381,17 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## wifi-default-protection-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection> > ns3::WifiDefaultProtectionManager::TryAddMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters const & txParams) [member function]
+    ## wifi-default-protection-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection>> ns3::WifiDefaultProtectionManager::TryAddMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters const & txParams) [member function]
     cls.add_method('TryAddMpdu', 
                    'std::unique_ptr< ns3::WifiProtection, std::default_delete< ns3::WifiProtection > >', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::WifiTxParameters const &', 'txParams')], 
                    is_virtual=True)
-    ## wifi-default-protection-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection> > ns3::WifiDefaultProtectionManager::TryAggregateMsdu(ns3::Ptr<const ns3::WifiMacQueueItem> msdu, ns3::WifiTxParameters const & txParams) [member function]
+    ## wifi-default-protection-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection>> ns3::WifiDefaultProtectionManager::TryAggregateMsdu(ns3::Ptr<const ns3::WifiMacQueueItem> msdu, ns3::WifiTxParameters const & txParams) [member function]
     cls.add_method('TryAggregateMsdu', 
                    'std::unique_ptr< ns3::WifiProtection, std::default_delete< ns3::WifiProtection > >', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'msdu'), param('ns3::WifiTxParameters const &', 'txParams')], 
                    is_virtual=True)
-    ## wifi-default-protection-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection> > ns3::WifiDefaultProtectionManager::GetPsduProtection(ns3::WifiMacHeader const & hdr, uint32_t size, ns3::WifiTxVector const & txVector) const [member function]
+    ## wifi-default-protection-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection>> ns3::WifiDefaultProtectionManager::GetPsduProtection(ns3::WifiMacHeader const & hdr, uint32_t size, ns3::WifiTxVector const & txVector) const [member function]
     cls.add_method('GetPsduProtection', 
                    'std::unique_ptr< ns3::WifiProtection, std::default_delete< ns3::WifiProtection > >', 
                    [param('ns3::WifiMacHeader const &', 'hdr'), param('uint32_t', 'size'), param('ns3::WifiTxVector const &', 'txVector')], 
@@ -23270,10 +23424,6 @@
     cls.add_method('PushFront', 
                    'bool', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'item')])
-    ## wifi-mac-queue.h (module 'wifi'): bool ns3::WifiMacQueue::Insert(ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos, ns3::Ptr<ns3::WifiMacQueueItem> item) [member function]
-    cls.add_method('Insert', 
-                   'bool', 
-                   [param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos'), param('ns3::Ptr< ns3::WifiMacQueueItem >', 'item')])
     ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::WifiMacQueue::Dequeue() [member function]
     cls.add_method('Dequeue', 
                    'ns3::Ptr< ns3::WifiMacQueueItem >', 
@@ -23288,39 +23438,39 @@
                    'ns3::Ptr< ns3::WifiMacQueueItem const >', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## wifi-mac-queue.h (module 'wifi'): ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator ns3::WifiMacQueue::PeekByAddress(ns3::Mac48Address dest, ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos=ns3::WifiMacQueue::EMPTY) const [member function]
+    ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::WifiMacQueue::PeekByAddress(ns3::Mac48Address dest, ns3::Ptr<const ns3::WifiMacQueueItem> item=nullptr) const [member function]
     cls.add_method('PeekByAddress', 
-                   'ns3::Queue< ns3::WifiMacQueueItem > ConstIterator', 
-                   [param('ns3::Mac48Address', 'dest'), param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos', default_value='ns3::WifiMacQueue::EMPTY')], 
+                   'ns3::Ptr< ns3::WifiMacQueueItem const >', 
+                   [param('ns3::Mac48Address', 'dest'), param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'item', default_value='nullptr')], 
                    is_const=True)
-    ## wifi-mac-queue.h (module 'wifi'): ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator ns3::WifiMacQueue::PeekByTid(uint8_t tid, ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos=ns3::WifiMacQueue::EMPTY) const [member function]
+    ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::WifiMacQueue::PeekByTid(uint8_t tid, ns3::Ptr<const ns3::WifiMacQueueItem> item=nullptr) const [member function]
     cls.add_method('PeekByTid', 
-                   'ns3::Queue< ns3::WifiMacQueueItem > ConstIterator', 
-                   [param('uint8_t', 'tid'), param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos', default_value='ns3::WifiMacQueue::EMPTY')], 
+                   'ns3::Ptr< ns3::WifiMacQueueItem const >', 
+                   [param('uint8_t', 'tid'), param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'item', default_value='nullptr')], 
                    is_const=True)
-    ## wifi-mac-queue.h (module 'wifi'): ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator ns3::WifiMacQueue::PeekByTidAndAddress(uint8_t tid, ns3::Mac48Address dest, ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos=ns3::WifiMacQueue::EMPTY) const [member function]
+    ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::WifiMacQueue::PeekByTidAndAddress(uint8_t tid, ns3::Mac48Address dest, ns3::Ptr<const ns3::WifiMacQueueItem> item=nullptr) const [member function]
     cls.add_method('PeekByTidAndAddress', 
-                   'ns3::Queue< ns3::WifiMacQueueItem > ConstIterator', 
-                   [param('uint8_t', 'tid'), param('ns3::Mac48Address', 'dest'), param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos', default_value='ns3::WifiMacQueue::EMPTY')], 
+                   'ns3::Ptr< ns3::WifiMacQueueItem const >', 
+                   [param('uint8_t', 'tid'), param('ns3::Mac48Address', 'dest'), param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'item', default_value='nullptr')], 
                    is_const=True)
-    ## wifi-mac-queue.h (module 'wifi'): ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator ns3::WifiMacQueue::PeekFirstAvailable(ns3::Ptr<ns3::QosBlockedDestinations> const blockedPackets=nullptr, ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos=ns3::WifiMacQueue::EMPTY) const [member function]
+    ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::WifiMacQueue::PeekFirstAvailable(ns3::Ptr<ns3::QosBlockedDestinations> const blockedPackets=nullptr, ns3::Ptr<const ns3::WifiMacQueueItem> item=nullptr) const [member function]
     cls.add_method('PeekFirstAvailable', 
-                   'ns3::Queue< ns3::WifiMacQueueItem > ConstIterator', 
-                   [param('ns3::Ptr< ns3::QosBlockedDestinations > const', 'blockedPackets', default_value='nullptr'), param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos', default_value='ns3::WifiMacQueue::EMPTY')], 
+                   'ns3::Ptr< ns3::WifiMacQueueItem const >', 
+                   [param('ns3::Ptr< ns3::QosBlockedDestinations > const', 'blockedPackets', default_value='nullptr'), param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'item', default_value='nullptr')], 
                    is_const=True)
     ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::WifiMacQueue::Remove() [member function]
     cls.add_method('Remove', 
                    'ns3::Ptr< ns3::WifiMacQueueItem >', 
                    [], 
                    is_virtual=True)
-    ## wifi-mac-queue.h (module 'wifi'): bool ns3::WifiMacQueue::Remove(ns3::Ptr<const ns3::Packet> packet) [member function]
-    cls.add_method('Remove', 
-                   'bool', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
-    ## wifi-mac-queue.h (module 'wifi'): ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator ns3::WifiMacQueue::Remove(ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos, bool removeExpired=false) [member function]
+    ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::WifiMacQueue::Remove(ns3::Ptr<const ns3::WifiMacQueueItem> item, bool removeExpired=false) [member function]
     cls.add_method('Remove', 
-                   'ns3::Queue< ns3::WifiMacQueueItem > ConstIterator', 
-                   [param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos'), param('bool', 'removeExpired', default_value='false')])
+                   'ns3::Ptr< ns3::WifiMacQueueItem const >', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'item'), param('bool', 'removeExpired', default_value='false')])
+    ## wifi-mac-queue.h (module 'wifi'): void ns3::WifiMacQueue::Replace(ns3::Ptr<const ns3::WifiMacQueueItem> currentItem, ns3::Ptr<ns3::WifiMacQueueItem> newItem) [member function]
+    cls.add_method('Replace', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'currentItem'), param('ns3::Ptr< ns3::WifiMacQueueItem >', 'newItem')])
     ## wifi-mac-queue.h (module 'wifi'): uint32_t ns3::WifiMacQueue::GetNPacketsByAddress(ns3::Mac48Address dest) [member function]
     cls.add_method('GetNPacketsByAddress', 
                    'uint32_t', 
@@ -23351,12 +23501,10 @@
     cls.add_method('GetNBytes', 
                    'uint32_t', 
                    [])
-    ## wifi-mac-queue.h (module 'wifi'): bool ns3::WifiMacQueue::TtlExceeded(ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator & it, ns3::Time const & now) [member function]
+    ## wifi-mac-queue.h (module 'wifi'): bool ns3::WifiMacQueue::TtlExceeded(ns3::Ptr<const ns3::WifiMacQueueItem> item, ns3::Time const & now) [member function]
     cls.add_method('TtlExceeded', 
                    'bool', 
-                   [param('ns3::Queue< ns3::WifiMacQueueItem > ConstIterator &', 'it'), param('ns3::Time const &', 'now')])
-    ## wifi-mac-queue.h (module 'wifi'): ns3::WifiMacQueue::EMPTY [variable]
-    cls.add_static_attribute('EMPTY', 'ns3::Queue< ns3::WifiMacQueueItem > ConstIterator const', is_const=True)
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'item'), param('ns3::Time const &', 'now')])
     ## wifi-mac-queue.h (module 'wifi'): ns3::WifiMacQueue::WifiMacQueue(ns3::WifiMacQueue const & arg0) [constructor]
     cls.add_constructor([param('ns3::WifiMacQueue const &', 'arg0')])
     return
@@ -23409,6 +23557,15 @@
                    is_static=True)
     ## wifi-net-device.h (module 'wifi'): ns3::WifiNetDevice::WifiNetDevice() [constructor]
     cls.add_constructor([])
+    ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::SetStandard(ns3::WifiStandard standard) [member function]
+    cls.add_method('SetStandard', 
+                   'void', 
+                   [param('ns3::WifiStandard', 'standard')])
+    ## wifi-net-device.h (module 'wifi'): ns3::WifiStandard ns3::WifiNetDevice::GetStandard() const [member function]
+    cls.add_method('GetStandard', 
+                   'ns3::WifiStandard', 
+                   [], 
+                   is_const=True)
     ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::SetMac(ns3::Ptr<ns3::WifiMac> const mac) [member function]
     cls.add_method('SetMac', 
                    'void', 
@@ -23836,36 +23993,6 @@
                    [param('ns3::Address const &', 'value')])
     return
 
-def register_Ns3AdhocWifiMac_methods(root_module, cls):
-    ## adhoc-wifi-mac.h (module 'wifi'): static ns3::TypeId ns3::AdhocWifiMac::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## adhoc-wifi-mac.h (module 'wifi'): ns3::AdhocWifiMac::AdhocWifiMac() [constructor]
-    cls.add_constructor([])
-    ## adhoc-wifi-mac.h (module 'wifi'): void ns3::AdhocWifiMac::SetAddress(ns3::Mac48Address address) [member function]
-    cls.add_method('SetAddress', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_virtual=True)
-    ## adhoc-wifi-mac.h (module 'wifi'): void ns3::AdhocWifiMac::SetLinkUpCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkUp) [member function]
-    cls.add_method('SetLinkUpCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkUp')], 
-                   is_virtual=True)
-    ## adhoc-wifi-mac.h (module 'wifi'): void ns3::AdhocWifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to) [member function]
-    cls.add_method('Enqueue', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to')], 
-                   is_virtual=True)
-    ## adhoc-wifi-mac.h (module 'wifi'): void ns3::AdhocWifiMac::Receive(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('Receive', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
-                   is_virtual=True, visibility='private')
-    return
-
 def register_Ns3AlwaysLosChannelConditionModel_methods(root_module, cls):
     ## channel-condition-model.h (module 'propagation'): static ns3::TypeId ns3::AlwaysLosChannelConditionModel::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
@@ -23886,108 +24013,6 @@
                    is_virtual=True)
     return
 
-def register_Ns3ApWifiMac_methods(root_module, cls):
-    ## ap-wifi-mac.h (module 'wifi'): ns3::ApWifiMac::ApWifiMac() [constructor]
-    cls.add_constructor([])
-    ## ap-wifi-mac.h (module 'wifi'): int64_t ns3::ApWifiMac::AssignStreams(int64_t stream) [member function]
-    cls.add_method('AssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'stream')])
-    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to) [member function]
-    cls.add_method('Enqueue', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to')], 
-                   is_virtual=True)
-    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to, ns3::Mac48Address from) [member function]
-    cls.add_method('Enqueue', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to'), param('ns3::Mac48Address', 'from')], 
-                   is_virtual=True)
-    ## ap-wifi-mac.h (module 'wifi'): uint16_t ns3::ApWifiMac::GetAssociationId(ns3::Mac48Address addr) const [member function]
-    cls.add_method('GetAssociationId', 
-                   'uint16_t', 
-                   [param('ns3::Mac48Address', 'addr')], 
-                   is_const=True)
-    ## ap-wifi-mac.h (module 'wifi'): ns3::Time ns3::ApWifiMac::GetBeaconInterval() const [member function]
-    cls.add_method('GetBeaconInterval', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True)
-    ## ap-wifi-mac.h (module 'wifi'): uint8_t ns3::ApWifiMac::GetBufferStatus(uint8_t tid, ns3::Mac48Address address) const [member function]
-    cls.add_method('GetBufferStatus', 
-                   'uint8_t', 
-                   [param('uint8_t', 'tid'), param('ns3::Mac48Address', 'address')], 
-                   is_const=True)
-    ## ap-wifi-mac.h (module 'wifi'): uint8_t ns3::ApWifiMac::GetMaxBufferStatus(ns3::Mac48Address address) const [member function]
-    cls.add_method('GetMaxBufferStatus', 
-                   'uint8_t', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_const=True)
-    ## ap-wifi-mac.h (module 'wifi'): std::map<unsigned short, ns3::Mac48Address, std::less<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Mac48Address> > > const & ns3::ApWifiMac::GetStaList() const [member function]
-    cls.add_method('GetStaList', 
-                   'std::map< unsigned short, ns3::Mac48Address > const &', 
-                   [], 
-                   is_const=True)
-    ## ap-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueue> ns3::ApWifiMac::GetTxopQueue(ns3::AcIndex ac) const [member function]
-    cls.add_method('GetTxopQueue', 
-                   'ns3::Ptr< ns3::WifiMacQueue >', 
-                   [param('ns3::AcIndex', 'ac')], 
-                   is_const=True, is_virtual=True)
-    ## ap-wifi-mac.h (module 'wifi'): static ns3::TypeId ns3::ApWifiMac::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## ap-wifi-mac.h (module 'wifi'): uint16_t ns3::ApWifiMac::GetVhtOperationalChannelWidth() const [member function]
-    cls.add_method('GetVhtOperationalChannelWidth', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::SetAddress(ns3::Mac48Address address) [member function]
-    cls.add_method('SetAddress', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_virtual=True)
-    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::SetBeaconInterval(ns3::Time interval) [member function]
-    cls.add_method('SetBeaconInterval', 
-                   'void', 
-                   [param('ns3::Time', 'interval')])
-    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::SetBufferStatus(uint8_t tid, ns3::Mac48Address address, uint8_t size) [member function]
-    cls.add_method('SetBufferStatus', 
-                   'void', 
-                   [param('uint8_t', 'tid'), param('ns3::Mac48Address', 'address'), param('uint8_t', 'size')])
-    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::SetLinkUpCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkUp) [member function]
-    cls.add_method('SetLinkUpCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkUp')], 
-                   is_virtual=True)
-    ## ap-wifi-mac.h (module 'wifi'): bool ns3::ApWifiMac::SupportsSendFrom() const [member function]
-    cls.add_method('SupportsSendFrom', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::DeaggregateAmsduAndForward(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('DeaggregateAmsduAndForward', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
-                   is_virtual=True, visibility='private')
-    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::DoDispose() [member function]
-    cls.add_method('DoDispose', 
-                   'void', 
-                   [], 
-                   is_virtual=True, visibility='private')
-    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::DoInitialize() [member function]
-    cls.add_method('DoInitialize', 
-                   'void', 
-                   [], 
-                   is_virtual=True, visibility='private')
-    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::Receive(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('Receive', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
-                   is_virtual=True, visibility='private')
-    return
-
 def register_Ns3BinaryErrorModel_methods(root_module, cls):
     ## error-model.h (module 'network'): ns3::BinaryErrorModel::BinaryErrorModel(ns3::BinaryErrorModel const & arg0) [constructor]
     cls.add_constructor([param('ns3::BinaryErrorModel const &', 'arg0')])
@@ -24053,25 +24078,25 @@
                    is_virtual=True, visibility='private')
     return
 
-def register_Ns3CallbackImpl__Bool_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+def register_Ns3CallbackImpl__Bool_Const_ns3WifiTxVector___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    ## callback.h (module 'core'): ns3::CallbackImpl<bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< bool, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
     cls.add_method('DoGetTypeid', 
                    'std::string', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
     cls.add_method('GetTypeid', 
                    'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): bool ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(short unsigned int arg0, unsigned char arg1) [member operator]
+    ## callback.h (module 'core'): bool ns3::CallbackImpl<bool, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::WifiTxVector const & arg0) [member operator]
     cls.add_method('operator()', 
                    'bool', 
-                   [param('short unsigned int', 'arg0'), param('unsigned char', 'arg1')], 
+                   [param('ns3::WifiTxVector const &', 'arg0')], 
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
@@ -24141,28 +24166,6 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3CallbackImpl__Unsigned_long_Unsigned_short_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): long unsigned int ns3::CallbackImpl<unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(short unsigned int arg0, short unsigned int arg1, unsigned char arg2) [member operator]
-    cls.add_method('operator()', 
-                   'long unsigned int', 
-                   [param('short unsigned int', 'arg0'), param('short unsigned int', 'arg1'), param('unsigned char', 'arg2')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
 def register_Ns3CallbackImpl__Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
     ## callback.h (module 'core'): ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
@@ -24559,22 +24562,22 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___StdMap__lt__stdPair__lt__unsigned_int__unsigned_int__gt____double__stdLess__lt__stdPair__lt__unsigned_int__unsigned_int__gt_____gt____stdAllocator__lt__stdPair__lt__const_stdPair__lt__unsigned_int__unsigned_int__gt____double__gt_____gt_____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___StdMap__lt__stdPair__lt__unsigned_int__unsigned_int__gt____double__stdLess__lt__stdPair__lt__unsigned_int__unsigned_int__gt____gt____stdAllocator__lt__stdPair__lt__const_stdPair__lt__unsigned_int__unsigned_int__gt____double__gt____gt____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int>>, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double>>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int>>, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double>>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int>>, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double>>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
     cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::Packet const >, std::map< std::pair< unsigned int, unsigned int >, double >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int>>, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double>>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
     cls.add_method('DoGetTypeid', 
                    'std::string', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int>>, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double>>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
     cls.add_method('GetTypeid', 
                    'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::Packet> arg0, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > > arg1) [member operator]
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int>>, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double>>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::Packet> arg0, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int>>, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double>>> arg1) [member operator]
     cls.add_method('operator()', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet const >', 'arg0'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'arg1')], 
@@ -24780,22 +24783,22 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiPsdu__gt___Ns3RxSignalInfo_Ns3WifiTxVector_StdVector__lt__bool__stdAllocator__lt__bool__gt_____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiPsdu__gt___Ns3RxSignalInfo_Ns3WifiTxVector_StdVector__lt__bool__stdAllocator__lt__bool__gt____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
     cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::WifiPsdu >, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
     cls.add_method('DoGetTypeid', 
                    'std::string', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
     cls.add_method('GetTypeid', 
                    'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<ns3::WifiPsdu> arg0, ns3::RxSignalInfo arg1, ns3::WifiTxVector arg2, std::vector<bool, std::allocator<bool> > arg3) [member operator]
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool>>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<ns3::WifiPsdu> arg0, ns3::RxSignalInfo arg1, ns3::WifiTxVector arg2, std::vector<bool, std::allocator<bool>> arg3) [member operator]
     cls.add_method('operator()', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiPsdu >', 'arg0'), param('ns3::RxSignalInfo', 'arg1'), param('ns3::WifiTxVector', 'arg2'), param('std::vector< bool >', 'arg3')], 
@@ -24979,22 +24982,22 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3CallbackImpl__Void_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__const_ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__const_ns3WifiPsdu__gt_____gt_____gt_____gt___Ns3WifiTxVector_Double_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+def register_Ns3CallbackImpl__Void_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__const_ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__const_ns3WifiPsdu__gt____gt____gt____gt___Ns3WifiTxVector_Double_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu>>>>, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu>>>>, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu>>>>, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
     cls.add_constructor([param('ns3::CallbackImpl< void, std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu>>>>, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
     cls.add_method('DoGetTypeid', 
                    'std::string', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu>>>>, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
     cls.add_method('GetTypeid', 
                    'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > > arg0, ns3::WifiTxVector arg1, double arg2) [member operator]
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu>>>>, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu>>>> arg0, ns3::WifiTxVector arg1, double arg2) [member operator]
     cls.add_method('operator()', 
                    'void', 
                    [param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'arg0'), param('ns3::WifiTxVector', 'arg1'), param('double', 'arg2')], 
@@ -25068,22 +25071,22 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3CallbackImpl__Void_Unsigned_char_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt_____gt_____gt_____gt_____star___Const_stdSet__lt__ns3Mac48Address__stdLess__lt__ns3Mac48Address__gt____stdAllocator__lt__ns3Mac48Address__gt_____gt_____star___Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+def register_Ns3CallbackImpl__Void_Unsigned_char_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt____gt____gt____gt_____star___Const_stdSet__lt__ns3Mac48Address__stdLess__lt__ns3Mac48Address__gt____stdAllocator__lt__ns3Mac48Address__gt____gt_____star___Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
     cls.add_constructor([param('ns3::CallbackImpl< void, unsigned char, std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu >, std::hash< unsigned short >, std::equal_to< unsigned short >, std::allocator< std::pair< unsigned short const, ns3::Ptr< ns3::WifiPsdu > > > > *, std::set< ns3::Mac48Address, std::less< ns3::Mac48Address >, std::allocator< ns3::Mac48Address > > const, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
     cls.add_method('DoGetTypeid', 
                    'std::string', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
     cls.add_method('GetTypeid', 
                    'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(unsigned char arg0, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > * arg1, std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > const * arg2, long unsigned int arg3) [member operator]
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(unsigned char arg0, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu>>>> * arg1, std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> const * arg2, long unsigned int arg3) [member operator]
     cls.add_method('operator()', 
                    'void', 
                    [param('unsigned char', 'arg0'), param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > > *', 'arg1'), param('std::set< ns3::Mac48Address > const *', 'arg2'), param('long unsigned int', 'arg3')], 
@@ -25199,10 +25202,10 @@
                    'uint16_t', 
                    [param('std::string const &', 'name')], 
                    is_static=True)
-    ## dsss-phy.h (module 'wifi'): static uint64_t ns3::DsssPhy::GetDataRate(std::string const & name, ns3::WifiModulationClass modClass, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss) [member function]
+    ## dsss-phy.h (module 'wifi'): static uint64_t ns3::DsssPhy::GetDataRate(std::string const & name, ns3::WifiModulationClass modClass) [member function]
     cls.add_method('GetDataRate', 
                    'uint64_t', 
-                   [param('std::string const &', 'name'), param('ns3::WifiModulationClass', 'modClass'), param('uint16_t', 'channelWidth'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nss')], 
+                   [param('std::string const &', 'name'), param('ns3::WifiModulationClass', 'modClass')], 
                    is_static=True)
     ## dsss-phy.h (module 'wifi'): static uint64_t ns3::DsssPhy::GetDataRateFromTxVector(ns3::WifiTxVector const & txVector, uint16_t staId) [member function]
     cls.add_method('GetDataRateFromTxVector', 
@@ -25264,10 +25267,10 @@
                    'void', 
                    [], 
                    is_static=True)
-    ## dsss-phy.h (module 'wifi'): static bool ns3::DsssPhy::IsModeAllowed(uint16_t channelWidth, uint8_t nss) [member function]
-    cls.add_method('IsModeAllowed', 
+    ## dsss-phy.h (module 'wifi'): static bool ns3::DsssPhy::IsAllowed(ns3::WifiTxVector const & txVector) [member function]
+    cls.add_method('IsAllowed', 
                    'bool', 
-                   [param('uint16_t', 'channelWidth'), param('uint8_t', 'nss')], 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
                    is_static=True)
     ## dsss-phy.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus ns3::DsssPhy::DoEndReceiveField(ns3::WifiPpduField field, ns3::Ptr<ns3::Event> event) [member function]
     cls.add_method('DoEndReceiveField', 
@@ -25308,8 +25311,8 @@
     cls.add_constructor([param('ns3::HePpdu const &', 'arg0')])
     ## he-ppdu.h (module 'wifi'): ns3::HePpdu::HePpdu(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector, ns3::Time ppduDuration, ns3::WifiPhyBand band, uint64_t uid) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time', 'ppduDuration'), param('ns3::WifiPhyBand', 'band'), param('uint64_t', 'uid')])
-    ## he-ppdu.h (module 'wifi'): ns3::HePpdu::HePpdu(ns3::WifiConstPsduMap const & psdus, ns3::WifiTxVector const & txVector, ns3::Time ppduDuration, ns3::WifiPhyBand band, uint64_t uid, ns3::HePpdu::TxPsdFlag flag) [constructor]
-    cls.add_constructor([param('ns3::WifiConstPsduMap const &', 'psdus'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time', 'ppduDuration'), param('ns3::WifiPhyBand', 'band'), param('uint64_t', 'uid'), param('ns3::HePpdu::TxPsdFlag', 'flag')])
+    ## he-ppdu.h (module 'wifi'): ns3::HePpdu::HePpdu(ns3::WifiConstPsduMap const & psdus, ns3::WifiTxVector const & txVector, ns3::Time ppduDuration, ns3::WifiPhyBand band, uint64_t uid, ns3::HePpdu::TxPsdFlag flag, uint8_t p20Index) [constructor]
+    cls.add_constructor([param('ns3::WifiConstPsduMap const &', 'psdus'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time', 'ppduDuration'), param('ns3::WifiPhyBand', 'band'), param('uint64_t', 'uid'), param('ns3::HePpdu::TxPsdFlag', 'flag'), param('uint8_t', 'p20Index')])
     ## he-ppdu.h (module 'wifi'): bool ns3::HePpdu::CanBeReceived(uint16_t txCenterFreq, uint16_t p20MinFreq, uint16_t p20MaxFreq) const [member function]
     cls.add_method('CanBeReceived', 
                    'bool', 
@@ -25534,10 +25537,14 @@
     cls.add_method('SendAddBaResponse', 
                    'void', 
                    [param('ns3::MgtAddBaRequestHeader const *', 'reqHdr'), param('ns3::Mac48Address', 'originator')])
-    ## ht-frame-exchange-manager.h (module 'wifi'): void ns3::HtFrameExchangeManager::SetWifiMac(ns3::Ptr<ns3::RegularWifiMac> const mac) [member function]
+    ## ht-frame-exchange-manager.h (module 'wifi'): void ns3::HtFrameExchangeManager::SendDelbaFrame(ns3::Mac48Address addr, uint8_t tid, bool byOriginator) [member function]
+    cls.add_method('SendDelbaFrame', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'addr'), param('uint8_t', 'tid'), param('bool', 'byOriginator')])
+    ## ht-frame-exchange-manager.h (module 'wifi'): void ns3::HtFrameExchangeManager::SetWifiMac(ns3::Ptr<ns3::WifiMac> const mac) [member function]
     cls.add_method('SetWifiMac', 
                    'void', 
-                   [param('ns3::Ptr< ns3::RegularWifiMac > const', 'mac')], 
+                   [param('ns3::Ptr< ns3::WifiMac > const', 'mac')], 
                    is_virtual=True)
     ## ht-frame-exchange-manager.h (module 'wifi'): bool ns3::HtFrameExchangeManager::StartFrameExchange(ns3::Ptr<ns3::QosTxop> edca, ns3::Time availableTime, bool initialFrame) [member function]
     cls.add_method('StartFrameExchange', 
@@ -25569,7 +25576,7 @@
                    'void', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## ht-frame-exchange-manager.h (module 'wifi'): void ns3::HtFrameExchangeManager::EndReceiveAmpdu(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::RxSignalInfo const & rxSignalInfo, ns3::WifiTxVector const & txVector, std::vector<bool, std::allocator<bool> > const & perMpduStatus) [member function]
+    ## ht-frame-exchange-manager.h (module 'wifi'): void ns3::HtFrameExchangeManager::EndReceiveAmpdu(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::RxSignalInfo const & rxSignalInfo, ns3::WifiTxVector const & txVector, std::vector<bool, std::allocator<bool>> const & perMpduStatus) [member function]
     cls.add_method('EndReceiveAmpdu', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::RxSignalInfo const &', 'rxSignalInfo'), param('ns3::WifiTxVector const &', 'txVector'), param('std::vector< bool > const &', 'perMpduStatus')], 
@@ -25629,13 +25636,13 @@
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('ns3::RxSignalInfo', 'rxSignalInfo'), param('ns3::WifiTxVector const &', 'txVector'), param('bool', 'inAmpdu')], 
                    is_virtual=True, visibility='protected')
-    ## ht-frame-exchange-manager.h (module 'wifi'): void ns3::HtFrameExchangeManager::RetransmitMpduAfterMissedAck(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) const [member function]
-    cls.add_method('RetransmitMpduAfterMissedAck', 
+    ## ht-frame-exchange-manager.h (module 'wifi'): void ns3::HtFrameExchangeManager::ReleaseSequenceNumber(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) const [member function]
+    cls.add_method('ReleaseSequenceNumber', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
                    is_const=True, is_virtual=True, visibility='protected')
-    ## ht-frame-exchange-manager.h (module 'wifi'): void ns3::HtFrameExchangeManager::RetransmitMpduAfterMissedCts(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) const [member function]
-    cls.add_method('RetransmitMpduAfterMissedCts', 
+    ## ht-frame-exchange-manager.h (module 'wifi'): void ns3::HtFrameExchangeManager::RetransmitMpduAfterMissedAck(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) const [member function]
+    cls.add_method('RetransmitMpduAfterMissedAck', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
                    is_const=True, is_virtual=True, visibility='protected')
@@ -25654,11 +25661,6 @@
                    'bool', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'peekedItem'), param('ns3::Time', 'availableTime'), param('bool', 'initialFrame')], 
                    is_virtual=True, visibility='protected')
-    ## ht-frame-exchange-manager.h (module 'wifi'): void ns3::HtFrameExchangeManager::SendDelbaFrame(ns3::Mac48Address addr, uint8_t tid, bool byOriginator) [member function]
-    cls.add_method('SendDelbaFrame', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'addr'), param('uint8_t', 'tid'), param('bool', 'byOriginator')], 
-                   visibility='protected')
     ## ht-frame-exchange-manager.h (module 'wifi'): bool ns3::HtFrameExchangeManager::SendMpduFromBaManager(ns3::Ptr<ns3::QosTxop> edca, ns3::Time availableTime, bool initialFrame) [member function]
     cls.add_method('SendMpduFromBaManager', 
                    'bool', 
@@ -25800,10 +25802,10 @@
                    'uint16_t', 
                    [param('std::string const &', 'name')], 
                    is_static=True)
-    ## ofdm-phy.h (module 'wifi'): static uint64_t ns3::OfdmPhy::GetDataRate(std::string const & name, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss) [member function]
+    ## ofdm-phy.h (module 'wifi'): static uint64_t ns3::OfdmPhy::GetDataRate(std::string const & name, uint16_t channelWidth) [member function]
     cls.add_method('GetDataRate', 
                    'uint64_t', 
-                   [param('std::string const &', 'name'), param('uint16_t', 'channelWidth'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nss')], 
+                   [param('std::string const &', 'name'), param('uint16_t', 'channelWidth')], 
                    is_static=True)
     ## ofdm-phy.h (module 'wifi'): static uint64_t ns3::OfdmPhy::GetDataRateFromTxVector(ns3::WifiTxVector const & txVector, uint16_t staId) [member function]
     cls.add_method('GetDataRateFromTxVector', 
@@ -25945,10 +25947,10 @@
                    'ns3::Time', 
                    [param('uint32_t', 'size'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiPhyBand', 'band'), param('ns3::MpduType', 'mpdutype'), param('bool', 'incFlag'), param('uint32_t &', 'totalAmpduSize'), param('double &', 'totalAmpduNumSymbols'), param('uint16_t', 'staId')], 
                    is_const=True, is_virtual=True)
-    ## ofdm-phy.h (module 'wifi'): static uint64_t ns3::OfdmPhy::GetPhyRate(std::string const & name, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss) [member function]
+    ## ofdm-phy.h (module 'wifi'): static uint64_t ns3::OfdmPhy::GetPhyRate(std::string const & name, uint16_t channelWidth) [member function]
     cls.add_method('GetPhyRate', 
                    'uint64_t', 
-                   [param('std::string const &', 'name'), param('uint16_t', 'channelWidth'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nss')], 
+                   [param('std::string const &', 'name'), param('uint16_t', 'channelWidth')], 
                    is_static=True)
     ## ofdm-phy.h (module 'wifi'): static uint64_t ns3::OfdmPhy::GetPhyRateFromTxVector(ns3::WifiTxVector const & txVector, uint16_t staId) [member function]
     cls.add_method('GetPhyRateFromTxVector', 
@@ -25970,15 +25972,15 @@
                    'void', 
                    [], 
                    is_static=True)
-    ## ofdm-phy.h (module 'wifi'): static bool ns3::OfdmPhy::IsModeAllowed(uint16_t channelWidth, uint8_t nss) [member function]
-    cls.add_method('IsModeAllowed', 
+    ## ofdm-phy.h (module 'wifi'): static bool ns3::OfdmPhy::IsAllowed(ns3::WifiTxVector const & txVector) [member function]
+    cls.add_method('IsAllowed', 
                    'bool', 
-                   [param('uint16_t', 'channelWidth'), param('uint8_t', 'nss')], 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
                    is_static=True)
-    ## ofdm-phy.h (module 'wifi'): static uint64_t ns3::OfdmPhy::CalculateDataRate(ns3::WifiCodeRate codeRate, uint16_t constellationSize, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss) [member function]
+    ## ofdm-phy.h (module 'wifi'): static uint64_t ns3::OfdmPhy::CalculateDataRate(ns3::WifiCodeRate codeRate, uint16_t constellationSize, uint16_t channelWidth) [member function]
     cls.add_method('CalculateDataRate', 
                    'uint64_t', 
-                   [param('uint16_t', 'codeRate'), param('uint16_t', 'constellationSize'), param('uint16_t', 'channelWidth'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nss')], 
+                   [param('uint16_t', 'codeRate'), param('uint16_t', 'constellationSize'), param('uint16_t', 'channelWidth')], 
                    is_static=True, visibility='protected')
     ## ofdm-phy.h (module 'wifi'): static uint64_t ns3::OfdmPhy::CalculateDataRate(double symbolDuration, uint16_t guardInterval, uint16_t usableSubCarriers, uint16_t numberOfBitsPerSubcarrier, double codingRate) [member function]
     cls.add_method('CalculateDataRate', 
@@ -26155,6 +26157,11 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## vht-frame-exchange-manager.h (module 'wifi'): uint32_t ns3::VhtFrameExchangeManager::GetPsduSize(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetPsduSize', 
+                   'uint32_t', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True, visibility='protected')
     ## vht-frame-exchange-manager.h (module 'wifi'): ns3::Ptr<ns3::WifiPsdu> ns3::VhtFrameExchangeManager::GetWifiPsdu(ns3::Ptr<ns3::WifiMacQueueItem> mpdu, ns3::WifiTxVector const & txVector) const [member function]
     cls.add_method('GetWifiPsdu', 
                    'ns3::Ptr< ns3::WifiPsdu >', 
@@ -26182,10 +26189,10 @@
                    'uint16_t', 
                    [param('std::string const &', 'name')], 
                    is_static=True)
-    ## erp-ofdm-phy.h (module 'wifi'): static uint64_t ns3::ErpOfdmPhy::GetDataRate(std::string const & name, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss) [member function]
+    ## erp-ofdm-phy.h (module 'wifi'): static uint64_t ns3::ErpOfdmPhy::GetDataRate(std::string const & name, uint16_t channelWidth) [member function]
     cls.add_method('GetDataRate', 
                    'uint64_t', 
-                   [param('std::string const &', 'name'), param('uint16_t', 'channelWidth'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nss')], 
+                   [param('std::string const &', 'name'), param('uint16_t', 'channelWidth')], 
                    is_static=True)
     ## erp-ofdm-phy.h (module 'wifi'): static uint64_t ns3::ErpOfdmPhy::GetDataRateFromTxVector(ns3::WifiTxVector const & txVector, uint16_t staId) [member function]
     cls.add_method('GetDataRateFromTxVector', 
@@ -26242,10 +26249,10 @@
                    'uint32_t', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## erp-ofdm-phy.h (module 'wifi'): static uint64_t ns3::ErpOfdmPhy::GetPhyRate(std::string const & name, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss) [member function]
+    ## erp-ofdm-phy.h (module 'wifi'): static uint64_t ns3::ErpOfdmPhy::GetPhyRate(std::string const & name, uint16_t channelWidth) [member function]
     cls.add_method('GetPhyRate', 
                    'uint64_t', 
-                   [param('std::string const &', 'name'), param('uint16_t', 'channelWidth'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nss')], 
+                   [param('std::string const &', 'name'), param('uint16_t', 'channelWidth')], 
                    is_static=True)
     ## erp-ofdm-phy.h (module 'wifi'): static uint64_t ns3::ErpOfdmPhy::GetPhyRateFromTxVector(ns3::WifiTxVector const & txVector, uint16_t staId) [member function]
     cls.add_method('GetPhyRateFromTxVector', 
@@ -26257,10 +26264,10 @@
                    'void', 
                    [], 
                    is_static=True)
-    ## erp-ofdm-phy.h (module 'wifi'): static bool ns3::ErpOfdmPhy::IsModeAllowed(uint16_t channelWidth, uint8_t nss) [member function]
-    cls.add_method('IsModeAllowed', 
+    ## erp-ofdm-phy.h (module 'wifi'): static bool ns3::ErpOfdmPhy::IsAllowed(ns3::WifiTxVector const & txVector) [member function]
+    cls.add_method('IsAllowed', 
                    'bool', 
-                   [param('uint16_t', 'channelWidth'), param('uint8_t', 'nss')], 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
                    is_static=True)
     ## erp-ofdm-phy.h (module 'wifi'): ns3::Time ns3::ErpOfdmPhy::GetHeaderDuration(ns3::WifiTxVector const & txVector) const [member function]
     cls.add_method('GetHeaderDuration', 
@@ -26313,10 +26320,15 @@
                    'void', 
                    [param('ns3::CtrlTriggerHeader &', 'trigger')], 
                    is_const=True, is_virtual=True)
-    ## he-frame-exchange-manager.h (module 'wifi'): void ns3::HeFrameExchangeManager::SetWifiMac(ns3::Ptr<ns3::RegularWifiMac> const mac) [member function]
+    ## he-frame-exchange-manager.h (module 'wifi'): void ns3::HeFrameExchangeManager::SetTxopHolder(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector) [member function]
+    cls.add_method('SetTxopHolder', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_virtual=True)
+    ## he-frame-exchange-manager.h (module 'wifi'): void ns3::HeFrameExchangeManager::SetWifiMac(ns3::Ptr<ns3::WifiMac> const mac) [member function]
     cls.add_method('SetWifiMac', 
                    'void', 
-                   [param('ns3::Ptr< ns3::RegularWifiMac > const', 'mac')], 
+                   [param('ns3::Ptr< ns3::WifiMac > const', 'mac')], 
                    is_virtual=True)
     ## he-frame-exchange-manager.h (module 'wifi'): bool ns3::HeFrameExchangeManager::StartFrameExchange(ns3::Ptr<ns3::QosTxop> edca, ns3::Time availableTime, bool initialFrame) [member function]
     cls.add_method('StartFrameExchange', 
@@ -26328,17 +26340,27 @@
                    'void', 
                    [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector')], 
                    is_virtual=True, visibility='protected')
-    ## he-frame-exchange-manager.h (module 'wifi'): void ns3::HeFrameExchangeManager::BlockAcksInTbPpduTimeout(ns3::WifiPsduMap * psduMap, std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > const * staMissedBlockAckFrom, std::size_t nSolicitedStations) [member function]
+    ## he-frame-exchange-manager.h (module 'wifi'): void ns3::HeFrameExchangeManager::BlockAckTimeout(ns3::Ptr<ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector) [member function]
+    cls.add_method('BlockAckTimeout', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_virtual=True, visibility='protected')
+    ## he-frame-exchange-manager.h (module 'wifi'): void ns3::HeFrameExchangeManager::BlockAcksInTbPpduTimeout(ns3::WifiPsduMap * psduMap, std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> const * staMissedBlockAckFrom, std::size_t nSolicitedStations) [member function]
     cls.add_method('BlockAcksInTbPpduTimeout', 
                    'void', 
                    [param('ns3::WifiPsduMap *', 'psduMap'), param('std::set< ns3::Mac48Address > const *', 'staMissedBlockAckFrom'), param('std::size_t', 'nSolicitedStations')], 
                    is_virtual=True, visibility='protected')
+    ## he-frame-exchange-manager.h (module 'wifi'): void ns3::HeFrameExchangeManager::CtsTimeout(ns3::Ptr<ns3::WifiMacQueueItem> rts, ns3::WifiTxVector const & txVector) [member function]
+    cls.add_method('CtsTimeout', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'rts'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_virtual=True, visibility='protected')
     ## he-frame-exchange-manager.h (module 'wifi'): void ns3::HeFrameExchangeManager::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## he-frame-exchange-manager.h (module 'wifi'): void ns3::HeFrameExchangeManager::EndReceiveAmpdu(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::RxSignalInfo const & rxSignalInfo, ns3::WifiTxVector const & txVector, std::vector<bool, std::allocator<bool> > const & perMpduStatus) [member function]
+    ## he-frame-exchange-manager.h (module 'wifi'): void ns3::HeFrameExchangeManager::EndReceiveAmpdu(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::RxSignalInfo const & rxSignalInfo, ns3::WifiTxVector const & txVector, std::vector<bool, std::allocator<bool>> const & perMpduStatus) [member function]
     cls.add_method('EndReceiveAmpdu', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::RxSignalInfo const &', 'rxSignalInfo'), param('ns3::WifiTxVector const &', 'txVector'), param('std::vector< bool > const &', 'perMpduStatus')], 
@@ -26353,12 +26375,22 @@
                    'ns3::WifiTxVector', 
                    [param('ns3::CtrlTriggerHeader', 'trigger'), param('ns3::Mac48Address', 'triggerSender')], 
                    is_const=True, visibility='protected')
+    ## he-frame-exchange-manager.h (module 'wifi'): ns3::WifiTxVector ns3::HeFrameExchangeManager::GetTrigVector(ns3::CtrlTriggerHeader const & trigger) const [member function]
+    cls.add_method('GetTrigVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::CtrlTriggerHeader const &', 'trigger')], 
+                   is_const=True, visibility='protected')
     ## he-frame-exchange-manager.h (module 'wifi'): ns3::Time ns3::HeFrameExchangeManager::GetTxDuration(uint32_t ppduPayloadSize, ns3::Mac48Address receiver, ns3::WifiTxParameters const & txParams) const [member function]
     cls.add_method('GetTxDuration', 
                    'ns3::Time', 
                    [param('uint32_t', 'ppduPayloadSize'), param('ns3::Mac48Address', 'receiver'), param('ns3::WifiTxParameters const &', 'txParams')], 
                    is_const=True, is_virtual=True, visibility='protected')
-    ## he-frame-exchange-manager.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::HeFrameExchangeManager::PrepareMuBar(ns3::WifiTxVector const & responseTxVector, std::map<unsigned short, ns3::CtrlBAckRequestHeader, std::less<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::CtrlBAckRequestHeader> > > recipients) const [member function]
+    ## he-frame-exchange-manager.h (module 'wifi'): void ns3::HeFrameExchangeManager::NormalAckTimeout(ns3::Ptr<ns3::WifiMacQueueItem> mpdu, ns3::WifiTxVector const & txVector) [member function]
+    cls.add_method('NormalAckTimeout', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_virtual=True, visibility='protected')
+    ## he-frame-exchange-manager.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::HeFrameExchangeManager::PrepareMuBar(ns3::WifiTxVector const & responseTxVector, std::map<unsigned short, ns3::CtrlBAckRequestHeader, std::less<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::CtrlBAckRequestHeader>>> recipients) const [member function]
     cls.add_method('PrepareMuBar', 
                    'ns3::Ptr< ns3::WifiMacQueueItem >', 
                    [param('ns3::WifiTxVector const &', 'responseTxVector'), param('std::map< unsigned short, ns3::CtrlBAckRequestHeader >', 'recipients')], 
@@ -26388,7 +26420,7 @@
                    'void', 
                    [param('ns3::CtrlTriggerHeader const &', 'trigger'), param('ns3::WifiMacHeader const &', 'hdr')], 
                    visibility='protected')
-    ## he-frame-exchange-manager.h (module 'wifi'): void ns3::HeFrameExchangeManager::TbPpduTimeout(ns3::WifiPsduMap * psduMap, std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > const * staMissedTbPpduFrom, std::size_t nSolicitedStations) [member function]
+    ## he-frame-exchange-manager.h (module 'wifi'): void ns3::HeFrameExchangeManager::TbPpduTimeout(ns3::WifiPsduMap * psduMap, std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address>> const * staMissedTbPpduFrom, std::size_t nSolicitedStations) [member function]
     cls.add_method('TbPpduTimeout', 
                    'void', 
                    [param('ns3::WifiPsduMap *', 'psduMap'), param('std::set< ns3::Mac48Address > const *', 'staMissedTbPpduFrom'), param('std::size_t', 'nSolicitedStations')], 
@@ -26685,16 +26717,16 @@
                    'void', 
                    [], 
                    is_static=True)
+    ## ht-phy.h (module 'wifi'): static bool ns3::HtPhy::IsAllowed(ns3::WifiTxVector const & txVector) [member function]
+    cls.add_method('IsAllowed', 
+                   'bool', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_static=True)
     ## ht-phy.h (module 'wifi'): bool ns3::HtPhy::IsMcsSupported(uint8_t index) const [member function]
     cls.add_method('IsMcsSupported', 
                    'bool', 
                    [param('uint8_t', 'index')], 
                    is_const=True, is_virtual=True)
-    ## ht-phy.h (module 'wifi'): static bool ns3::HtPhy::IsModeAllowed(uint16_t channelWidth, uint8_t nss) [member function]
-    cls.add_method('IsModeAllowed', 
-                   'bool', 
-                   [param('uint16_t', 'channelWidth'), param('uint8_t', 'nss')], 
-                   is_static=True)
     ## ht-phy.h (module 'wifi'): void ns3::HtPhy::SetMaxSupportedMcsIndexPerSs(uint8_t maxIndex) [member function]
     cls.add_method('SetMaxSupportedMcsIndexPerSs', 
                    'void', 
@@ -26920,8 +26952,13 @@
                    'void', 
                    [], 
                    is_static=True)
-    ## vht-phy.h (module 'wifi'): static bool ns3::VhtPhy::IsModeAllowed(uint8_t mcsValue, uint16_t channelWidth, uint8_t nss) [member function]
-    cls.add_method('IsModeAllowed', 
+    ## vht-phy.h (module 'wifi'): static bool ns3::VhtPhy::IsAllowed(ns3::WifiTxVector const & txVector) [member function]
+    cls.add_method('IsAllowed', 
+                   'bool', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_static=True)
+    ## vht-phy.h (module 'wifi'): static bool ns3::VhtPhy::IsCombinationAllowed(uint8_t mcsValue, uint16_t channelWidth, uint8_t nss) [member function]
+    cls.add_method('IsCombinationAllowed', 
                    'bool', 
                    [param('uint8_t', 'mcsValue'), param('uint16_t', 'channelWidth'), param('uint8_t', 'nss')], 
                    is_static=True)
@@ -27017,10 +27054,10 @@
                    'void', 
                    [], 
                    is_virtual=True)
-    ## he-phy.h (module 'wifi'): static uint16_t ns3::HePhy::ConvertHeTbPpduDurationToLSigLength(ns3::Time ppduDuration, ns3::WifiPhyBand band) [member function]
+    ## he-phy.h (module 'wifi'): static std::pair<unsigned short, ns3::Time> ns3::HePhy::ConvertHeTbPpduDurationToLSigLength(ns3::Time ppduDuration, ns3::WifiTxVector const & txVector, ns3::WifiPhyBand band) [member function]
     cls.add_method('ConvertHeTbPpduDurationToLSigLength', 
-                   'uint16_t', 
-                   [param('ns3::Time', 'ppduDuration'), param('ns3::WifiPhyBand', 'band')], 
+                   'std::pair< unsigned short, ns3::Time >', 
+                   [param('ns3::Time', 'ppduDuration'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiPhyBand', 'band')], 
                    is_static=True)
     ## he-phy.h (module 'wifi'): static ns3::Time ns3::HePhy::ConvertLSigLengthToHeTbPpduDuration(uint16_t length, ns3::WifiTxVector const & txVector, ns3::WifiPhyBand band) [member function]
     cls.add_method('ConvertLSigLengthToHeTbPpduDuration', 
@@ -27222,10 +27259,10 @@
                    'void', 
                    [], 
                    is_static=True)
-    ## he-phy.h (module 'wifi'): static bool ns3::HePhy::IsModeAllowed(uint16_t channelWidth, uint8_t nss) [member function]
-    cls.add_method('IsModeAllowed', 
+    ## he-phy.h (module 'wifi'): static bool ns3::HePhy::IsAllowed(ns3::WifiTxVector const & txVector) [member function]
+    cls.add_method('IsAllowed', 
                    'bool', 
-                   [param('uint16_t', 'channelWidth'), param('uint8_t', 'nss')], 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
                    is_static=True)
     ## he-phy.h (module 'wifi'): void ns3::HePhy::NotifyEndOfHeSigA(ns3::HeSigAParameters params) [member function]
     cls.add_method('NotifyEndOfHeSigA', 
@@ -27235,6 +27272,10 @@
     cls.add_method('SetEndOfHeSigACallback', 
                    'void', 
                    [param('ns3::Callback< void, ns3::HeSigAParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    ## he-phy.h (module 'wifi'): void ns3::HePhy::SetTrigVector(ns3::WifiTxVector const & trigVector, ns3::Time validity) [member function]
+    cls.add_method('SetTrigVector', 
+                   'void', 
+                   [param('ns3::WifiTxVector const &', 'trigVector'), param('ns3::Time', 'validity')])
     ## he-phy.h (module 'wifi'): void ns3::HePhy::StartReceivePreamble(ns3::Ptr<ns3::WifiPpdu> ppdu, ns3::RxPowerWattPerChannelBand & rxPowersW, ns3::Time rxDuration) [member function]
     cls.add_method('StartReceivePreamble', 
                    'void', 
@@ -27275,7 +27316,7 @@
                    'void', 
                    [param('ns3::Ptr< ns3::Event >', 'event')], 
                    is_virtual=True, visibility='protected')
-    ## he-phy.h (module 'wifi'): std::pair<unsigned short, std::pair<unsigned int, unsigned int> > ns3::HePhy::GetChannelWidthAndBand(ns3::WifiTxVector const & txVector, uint16_t staId) const [member function]
+    ## he-phy.h (module 'wifi'): std::pair<unsigned short, std::pair<unsigned int, unsigned int>> ns3::HePhy::GetChannelWidthAndBand(ns3::WifiTxVector const & txVector, uint16_t staId) const [member function]
     cls.add_method('GetChannelWidthAndBand', 
                    'std::pair< unsigned short, std::pair< unsigned int, unsigned int > >', 
                    [param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId')], 
@@ -27489,19 +27530,23 @@
     module.add_function('GetCtsSize', 
                         'uint32_t', 
                         [])
-    ## wifi-standards.h (module 'wifi'): uint16_t ns3::GetDefaultChannelWidth(ns3::WifiPhyStandard standard, ns3::WifiPhyBand band) [free function]
+    ## wifi-standards.h (module 'wifi'): uint16_t ns3::GetDefaultChannelWidth(ns3::WifiStandard standard, ns3::WifiPhyBand band) [free function]
     module.add_function('GetDefaultChannelWidth', 
                         'uint16_t', 
-                        [param('ns3::WifiPhyStandard', 'standard'), param('ns3::WifiPhyBand', 'band')])
-    ## wifi-standards.h (module 'wifi'): ns3::FrequencyChannelType ns3::GetFrequencyChannelType(ns3::WifiPhyStandard standard) [free function]
+                        [param('ns3::WifiStandard', 'standard'), param('ns3::WifiPhyBand', 'band')])
+    ## wifi-standards.h (module 'wifi'): ns3::WifiPhyBand ns3::GetDefaultPhyBand(ns3::WifiStandard standard) [free function]
+    module.add_function('GetDefaultPhyBand', 
+                        'ns3::WifiPhyBand', 
+                        [param('ns3::WifiStandard', 'standard')])
+    ## wifi-standards.h (module 'wifi'): ns3::FrequencyChannelType ns3::GetFrequencyChannelType(ns3::WifiStandard standard) [free function]
     module.add_function('GetFrequencyChannelType', 
                         'ns3::FrequencyChannelType', 
-                        [param('ns3::WifiPhyStandard', 'standard')])
-    ## wifi-standards.h (module 'wifi'): uint16_t ns3::GetMaximumChannelWidth(ns3::WifiPhyStandard standard) [free function]
+                        [param('ns3::WifiStandard', 'standard')])
+    ## wifi-standards.h (module 'wifi'): uint16_t ns3::GetMaximumChannelWidth(ns3::WifiStandard standard) [free function]
     module.add_function('GetMaximumChannelWidth', 
                         'uint16_t', 
-                        [param('ns3::WifiPhyStandard', 'standard')])
-    ## wifi-utils.h (module 'wifi'): uint32_t ns3::GetMuBarSize(std::list<ns3::BlockAckReqType, std::allocator<ns3::BlockAckReqType> > types) [free function]
+                        [param('ns3::WifiStandard', 'standard')])
+    ## wifi-utils.h (module 'wifi'): uint32_t ns3::GetMuBarSize(std::list<ns3::BlockAckReqType, std::allocator<ns3::BlockAckReqType>> types) [free function]
     module.add_function('GetMuBarSize', 
                         'uint32_t', 
                         [param('std::list< ns3::BlockAckReqType >', 'types')])
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/CMakeLists.txt ns-3.36/src/wifi/CMakeLists.txt
--- ns-3.35/src/wifi/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/wifi/CMakeLists.txt	2022-04-30 18:23:58.194735000 -0700
@@ -0,0 +1,314 @@
+set(gsl_libraries)
+if(${GSL_FOUND})
+  include_directories(${GSL_INCLUDE_DIRS})
+  set(gsl_libraries
+      ${GSL_LIBRARIES}
+  )
+endif()
+
+set(source_files
+    helper/athstats-helper.cc
+    helper/spectrum-wifi-helper.cc
+    helper/wifi-helper.cc
+    helper/wifi-mac-helper.cc
+    helper/wifi-radio-energy-model-helper.cc
+    helper/yans-wifi-helper.cc
+    model/adhoc-wifi-mac.cc
+    model/ampdu-subframe-header.cc
+    model/ampdu-tag.cc
+    model/amsdu-subframe-header.cc
+    model/ap-wifi-mac.cc
+    model/block-ack-agreement.cc
+    model/block-ack-manager.cc
+    model/block-ack-type.cc
+    model/block-ack-window.cc
+    model/capability-information.cc
+    model/channel-access-manager.cc
+    model/ctrl-headers.cc
+    model/edca-parameter-set.cc
+    model/error-rate-model.cc
+    model/extended-capabilities.cc
+    model/frame-capture-model.cc
+    model/frame-exchange-manager.cc
+    model/he/constant-obss-pd-algorithm.cc
+    model/he/he-capabilities.cc
+    model/he/he-configuration.cc
+    model/he/he-frame-exchange-manager.cc
+    model/he/he-operation.cc
+    model/he/he-phy.cc
+    model/he/he-ppdu.cc
+    model/he/he-ru.cc
+    model/he/mu-edca-parameter-set.cc
+    model/he/mu-snr-tag.cc
+    model/he/multi-user-scheduler.cc
+    model/he/obss-pd-algorithm.cc
+    model/he/rr-multi-user-scheduler.cc
+    model/ht/ht-capabilities.cc
+    model/ht/ht-configuration.cc
+    model/ht/ht-frame-exchange-manager.cc
+    model/ht/ht-operation.cc
+    model/ht/ht-phy.cc
+    model/ht/ht-ppdu.cc
+    model/interference-helper.cc
+    model/mac-rx-middle.cc
+    model/mac-tx-middle.cc
+    model/mgt-headers.cc
+    model/mpdu-aggregator.cc
+    model/msdu-aggregator.cc
+    model/nist-error-rate-model.cc
+    model/non-ht/dsss-error-rate-model.cc
+    model/non-ht/dsss-parameter-set.cc
+    model/non-ht/dsss-phy.cc
+    model/non-ht/dsss-ppdu.cc
+    model/non-ht/erp-information.cc
+    model/non-ht/erp-ofdm-phy.cc
+    model/non-ht/erp-ofdm-ppdu.cc
+    model/non-ht/ofdm-phy.cc
+    model/non-ht/ofdm-ppdu.cc
+    model/originator-block-ack-agreement.cc
+    model/phy-entity.cc
+    model/preamble-detection-model.cc
+    model/qos-blocked-destinations.cc
+    model/qos-frame-exchange-manager.cc
+    model/qos-txop.cc
+    model/qos-utils.cc
+    model/rate-control/aarf-wifi-manager.cc
+    model/rate-control/aarfcd-wifi-manager.cc
+    model/rate-control/amrr-wifi-manager.cc
+    model/rate-control/aparf-wifi-manager.cc
+    model/rate-control/arf-wifi-manager.cc
+    model/rate-control/cara-wifi-manager.cc
+    model/rate-control/constant-rate-wifi-manager.cc
+    model/rate-control/ideal-wifi-manager.cc
+    model/rate-control/minstrel-ht-wifi-manager.cc
+    model/rate-control/minstrel-wifi-manager.cc
+    model/rate-control/onoe-wifi-manager.cc
+    model/rate-control/parf-wifi-manager.cc
+    model/rate-control/rraa-wifi-manager.cc
+    model/rate-control/rrpaa-wifi-manager.cc
+    model/rate-control/thompson-sampling-wifi-manager.cc
+    model/recipient-block-ack-agreement.cc
+    model/simple-frame-capture-model.cc
+    model/snr-tag.cc
+    model/spectrum-wifi-phy.cc
+    model/ssid.cc
+    model/sta-wifi-mac.cc
+    model/status-code.cc
+    model/supported-rates.cc
+    model/table-based-error-rate-model.cc
+    model/threshold-preamble-detection-model.cc
+    model/txop.cc
+    model/vht/vht-capabilities.cc
+    model/vht/vht-configuration.cc
+    model/vht/vht-frame-exchange-manager.cc
+    model/vht/vht-operation.cc
+    model/vht/vht-phy.cc
+    model/vht/vht-ppdu.cc
+    model/wifi-ack-manager.cc
+    model/wifi-acknowledgment.cc
+    model/wifi-default-ack-manager.cc
+    model/wifi-default-protection-manager.cc
+    model/wifi-information-element-vector.cc
+    model/wifi-information-element.cc
+    model/wifi-mac-header.cc
+    model/wifi-mac-queue-item.cc
+    model/wifi-mac-queue.cc
+    model/wifi-mac-trailer.cc
+    model/wifi-mac.cc
+    model/wifi-mode.cc
+    model/wifi-net-device.cc
+    model/wifi-phy.cc
+    model/wifi-phy-common.cc
+    model/wifi-phy-operating-channel.cc
+    model/wifi-phy-state-helper.cc
+    model/wifi-ppdu.cc
+    model/wifi-protection-manager.cc
+    model/wifi-protection.cc
+    model/wifi-psdu.cc
+    model/wifi-radio-energy-model.cc
+    model/wifi-remote-station-info.cc
+    model/wifi-remote-station-manager.cc
+    model/wifi-spectrum-phy-interface.cc
+    model/wifi-spectrum-signal-parameters.cc
+    model/wifi-tx-current-model.cc
+    model/wifi-tx-parameters.cc
+    model/wifi-tx-timer.cc
+    model/wifi-tx-vector.cc
+    model/wifi-utils.cc
+    model/yans-error-rate-model.cc
+    model/yans-wifi-channel.cc
+    model/yans-wifi-phy.cc
+)
+
+set(header_files
+    helper/athstats-helper.h
+    helper/spectrum-wifi-helper.h
+    helper/wifi-helper.h
+    helper/wifi-mac-helper.h
+    helper/wifi-radio-energy-model-helper.h
+    helper/yans-wifi-helper.h
+    model/adhoc-wifi-mac.h
+    model/ampdu-subframe-header.h
+    model/ampdu-tag.h
+    model/amsdu-subframe-header.h
+    model/ap-wifi-mac.h
+    model/block-ack-agreement.h
+    model/block-ack-manager.h
+    model/block-ack-type.h
+    model/block-ack-window.h
+    model/capability-information.h
+    model/channel-access-manager.h
+    model/ctrl-headers.h
+    model/edca-parameter-set.h
+    model/error-rate-model.h
+    model/extended-capabilities.h
+    model/frame-capture-model.h
+    model/frame-exchange-manager.h
+    model/he/constant-obss-pd-algorithm.h
+    model/he/he-capabilities.h
+    model/he/he-configuration.h
+    model/he/he-frame-exchange-manager.h
+    model/he/he-operation.h
+    model/he/he-phy.h
+    model/he/he-ppdu.h
+    model/he/he-ru.h
+    model/he/mu-edca-parameter-set.h
+    model/he/mu-snr-tag.h
+    model/he/multi-user-scheduler.h
+    model/he/obss-pd-algorithm.h
+    model/he/rr-multi-user-scheduler.h
+    model/ht/ht-capabilities.h
+    model/ht/ht-configuration.h
+    model/ht/ht-frame-exchange-manager.h
+    model/ht/ht-operation.h
+    model/ht/ht-phy.h
+    model/ht/ht-ppdu.h
+    model/interference-helper.h
+    model/mac-rx-middle.h
+    model/mac-tx-middle.h
+    model/mgt-headers.h
+    model/mpdu-aggregator.h
+    model/msdu-aggregator.h
+    model/nist-error-rate-model.h
+    model/non-ht/dsss-error-rate-model.h
+    model/non-ht/dsss-parameter-set.h
+    model/non-ht/dsss-phy.h
+    model/non-ht/dsss-ppdu.h
+    model/non-ht/erp-information.h
+    model/non-ht/erp-ofdm-phy.h
+    model/non-ht/erp-ofdm-ppdu.h
+    model/non-ht/ofdm-phy.h
+    model/non-ht/ofdm-ppdu.h
+    model/originator-block-ack-agreement.h
+    model/phy-entity.h
+    model/preamble-detection-model.h
+    model/qos-blocked-destinations.h
+    model/qos-frame-exchange-manager.h
+    model/qos-txop.h
+    model/qos-utils.h
+    model/rate-control/aarf-wifi-manager.h
+    model/rate-control/aarfcd-wifi-manager.h
+    model/rate-control/amrr-wifi-manager.h
+    model/rate-control/aparf-wifi-manager.h
+    model/rate-control/arf-wifi-manager.h
+    model/rate-control/cara-wifi-manager.h
+    model/rate-control/constant-rate-wifi-manager.h
+    model/rate-control/ideal-wifi-manager.h
+    model/rate-control/minstrel-ht-wifi-manager.h
+    model/rate-control/minstrel-wifi-manager.h
+    model/rate-control/onoe-wifi-manager.h
+    model/rate-control/parf-wifi-manager.h
+    model/rate-control/rraa-wifi-manager.h
+    model/rate-control/rrpaa-wifi-manager.h
+    model/rate-control/thompson-sampling-wifi-manager.h
+    model/recipient-block-ack-agreement.h
+    model/reference/error-rate-tables.h
+    model/simple-frame-capture-model.h
+    model/snr-tag.h
+    model/spectrum-wifi-phy.h
+    model/ssid.h
+    model/sta-wifi-mac.h
+    model/status-code.h
+    model/supported-rates.h
+    model/table-based-error-rate-model.h
+    model/threshold-preamble-detection-model.h
+    model/txop.h
+    model/vht/vht-capabilities.h
+    model/vht/vht-configuration.h
+    model/vht/vht-frame-exchange-manager.h
+    model/vht/vht-operation.h
+    model/vht/vht-phy.h
+    model/vht/vht-ppdu.h
+    model/wifi-ack-manager.h
+    model/wifi-acknowledgment.h
+    model/wifi-default-ack-manager.h
+    model/wifi-default-protection-manager.h
+    model/wifi-information-element-vector.h
+    model/wifi-information-element.h
+    model/wifi-mac-header.h
+    model/wifi-mac-queue-item.h
+    model/wifi-mac-queue.h
+    model/wifi-mac-trailer.h
+    model/wifi-mac.h
+    model/wifi-mode.h
+    model/wifi-mpdu-type.h
+    model/wifi-net-device.h
+    model/wifi-phy-band.h
+    model/wifi-phy-common.h
+    model/wifi-phy-listener.h
+    model/wifi-phy-operating-channel.h
+    model/wifi-phy-state-helper.h
+    model/wifi-phy-state.h
+    model/wifi-phy.h
+    model/wifi-ppdu.h
+    model/wifi-protection-manager.h
+    model/wifi-protection.h
+    model/wifi-psdu.h
+    model/wifi-radio-energy-model.h
+    model/wifi-remote-station-info.h
+    model/wifi-remote-station-manager.h
+    model/wifi-spectrum-phy-interface.h
+    model/wifi-spectrum-signal-parameters.h
+    model/wifi-standards.h
+    model/wifi-tx-current-model.h
+    model/wifi-tx-parameters.h
+    model/wifi-tx-timer.h
+    model/wifi-tx-vector.h
+    model/wifi-utils.h
+    model/yans-error-rate-model.h
+    model/yans-wifi-channel.h
+    model/yans-wifi-phy.h
+)
+
+build_lib(
+  LIBNAME wifi
+  SOURCE_FILES ${source_files}
+  HEADER_FILES ${header_files}
+  LIBRARIES_TO_LINK
+    ${libnetwork}
+    ${libpropagation}
+    ${libenergy}
+    ${libspectrum}
+    ${libantenna}
+    ${libmobility}
+    ${gsl_libraries}
+  TEST_SOURCES
+    test/block-ack-test-suite.cc
+    test/channel-access-manager-test.cc
+    test/inter-bss-test-suite.cc
+    test/power-rate-adaptation-test.cc
+    test/spectrum-wifi-phy-test.cc
+    test/tx-duration-test.cc
+    test/wifi-aggregation-test.cc
+    test/wifi-error-rate-models-test.cc
+    test/wifi-mac-ofdma-test.cc
+    test/wifi-mac-queue-test.cc
+    test/wifi-phy-ofdma-test.cc
+    test/wifi-phy-reception-test.cc
+    test/wifi-phy-thresholds-test.cc
+    test/wifi-primary-channels-test.cc
+    test/wifi-channel-switching-test.cc
+    test/wifi-test.cc
+    test/wifi-transmit-mask-test.cc
+    test/wifi-txop-test.cc
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/doc/source/conf.py ns-3.36/src/wifi/doc/source/conf.py
--- ns-3.35/src/wifi/doc/source/conf.py	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/doc/source/conf.py	2022-04-30 18:23:58.194735000 -0700
@@ -25,7 +25,7 @@
 
 # Add any Sphinx extension module names here, as strings. They can be extensions
 # coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
-extensions = ['sphinx.ext.pngmath']
+extensions = ['sphinx.ext.imgmath']
 
 # Add any paths that contain templates here, relative to this directory.
 templates_path = ['_templates']
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/doc/source/wifi-changelog.rst ns-3.36/src/wifi/doc/source/wifi-changelog.rst
--- ns-3.35/src/wifi/doc/source/wifi-changelog.rst	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/wifi/doc/source/wifi-changelog.rst	2022-04-30 18:23:58.198735200 -0700
@@ -0,0 +1,35 @@
+.. include:: replace.txt
+.. highlight:: cpp
+
+.. _sec-wifi-changelog-doc:
+
+++++++++++++++++++++++++++++++++++++++++
+API and behavior changes across releases
+++++++++++++++++++++++++++++++++++++++++
+
+This page tracks the most relevant changes to the API and behavior of the wifi
+module occurred across the various releases of |ns3|.
+
+ChannelSettings attribute
++++++++++++++++++++++++++
+
+Prior to ns-3.36, channels, channel widths, and operating bands were set
+separately.  As of ns-3.36, a new tuple object that we call ChannelSettings has
+consolidated all of these settings.  Users should specify the channel number,
+channel width, frequency band, and primary channel index as a tuple (and
+continue to set the Wi-Fi standard separately).
+
+For instance, where pre-ns-3.36 code may have said::
+
+    WifiPhyHelper phy;
+    phy.Set("ChannelNumber", UintegerValue (36));
+
+the equivalent new code is::
+
+    WifiPhyHelper phy;
+    phy.Set ("ChannelSettings", StringValue ("{36, 20, BAND_5GHZ, 0}"));
+
+which denotes that channel 36 is used on a 20 MHz channel in the 5GHz band,
+and because a larger channel width greater than 20 MHz is not being used, there
+is no need to indicate the primary 20 MHz channel so it is set to zero in the
+last argument. Users can read :ref:`Channel-settings` for more details.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/doc/source/wifi-design.rst ns-3.36/src/wifi/doc/source/wifi-design.rst
--- ns-3.35/src/wifi/doc/source/wifi-design.rst	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/doc/source/wifi-design.rst	2022-04-30 18:23:58.198735200 -0700
@@ -35,7 +35,7 @@
 
 The set of 802.11 models provided in |ns3| attempts to provide an accurate
 MAC-level implementation of the 802.11 specification and to provide a
-packet-level abstraction of the PHY-level for different PHYs, corresponding to 
+packet-level abstraction of the PHY-level for different PHYs, corresponding to
 802.11a/b/e/g/n/ac/ax specifications.
 
 In |ns3|, nodes can have multiple WifiNetDevices on separate channels, and the
@@ -56,18 +56,18 @@
   In |ns3|, the lower-level MAC is comprised of a **Frame Exchange Manager** hierarchy,
   a **Channel Access Manager** and a **MAC middle** entity.
 * the so-called **MAC high models**: they implement non-time-critical processes
-  in Wifi such as the MAC-level beacon generation, probing, and association 
+  in Wifi such as the MAC-level beacon generation, probing, and association
   state machines, and a set of **Rate control algorithms**.  In the literature,
-  this sublayer is sometimes called the **upper MAC** and consists of more 
-  software-oriented implementations vs. time-critical hardware implementations. 
+  this sublayer is sometimes called the **upper MAC** and consists of more
+  software-oriented implementations vs. time-critical hardware implementations.
 
-Next, we provide an design overview of each layer, shown in 
+Next, we provide an design overview of each layer, shown in
 Figure :ref:`wifi-architecture`.
 
 .. _wifi-architecture:
 
 .. figure:: figures/WifiArchitecture.*
-   
+
    *WifiNetDevice architecture*
 
 MAC high models
@@ -75,8 +75,8 @@
 
 There are presently three **MAC high models** that provide for the three
 (non-mesh; the mesh equivalent, which is a sibling of these with common
-parent ``ns3::RegularWifiMac``, is not discussed here) Wi-Fi topological
-elements - Access Point (AP) (``ns3::ApWifiMac``), 
+parent ``ns3::WifiMac``, is not discussed here) Wi-Fi topological
+elements - Access Point (AP) (``ns3::ApWifiMac``),
 non-AP Station (STA) (``ns3::StaWifiMac``), and STA in an Independent
 Basic Service Set (IBSS) - also commonly referred to as an ad hoc
 network (``ns3::AdhocWifiMac``).
@@ -90,12 +90,12 @@
 beacons, and that accepts every attempt to associate.
 
 These three MAC high models share a common parent in
-``ns3::RegularWifiMac``, which exposes, among other MAC
+``ns3::WifiMac``, which exposes, among other MAC
 configuration, an attribute ``QosSupported`` that allows
 configuration of 802.11e/WMM-style QoS support.
 
 There are also several **rate control algorithms** that can be used by the
-MAC low layer.  A complete list of available rate control algorithms is 
+MAC low layer.  A complete list of available rate control algorithms is
 provided in a separate section.
 
 MAC low layer
@@ -111,13 +111,13 @@
 #. ``ns3::Txop`` and ``ns3::QosTxop`` which handle the packet queue.
    The ``ns3::Txop`` object is used by high MACs that are not QoS-enabled,
    and for transmission of frames (e.g., of type Management)
-   that the standard says should access the medium using the DCF. 
+   that the standard says should access the medium using the DCF.
    ``ns3::QosTxop`` is used by QoS-enabled high MACs.
 
 PHY layer models
 ================
 
-In short, the physical layer models are mainly responsible for modeling 
+In short, the physical layer models are mainly responsible for modeling
 the reception of packets and for tracking energy consumption.  There
 are typically three main components to packet reception:
 
@@ -146,10 +146,10 @@
 Scope and Limitations
 *********************
 
-The IEEE 802.11 standard [ieee80211]_ is a large specification, 
-and not all aspects are covered by |ns3|; the documentation of |ns3|'s 
-conformance by itself would lead to a very long document.  This section 
-attempts to summarize compliance with the standard and with behavior 
+The IEEE 802.11 standard [ieee80211]_ is a large specification,
+and not all aspects are covered by |ns3|; the documentation of |ns3|'s
+conformance by itself would lead to a very long document.  This section
+attempts to summarize compliance with the standard and with behavior
 found in practice.
 
 The physical layer and channel models operate on a per-packet basis, with
@@ -169,6 +169,7 @@
 * 802.11n/ac/ax beamforming is not supported
 * 802.11n RIFS is not supported
 * 802.11 PCF/HCF/HCCA are not implemented
+* Channel Switch Announcement is not supported
 * Authentication and encryption are missing
 * Processing delays are not modeled
 * Channel bonding implementation only supports the use of the configured channel width
@@ -198,7 +199,7 @@
 layering, by describing the channel and PHY models first, followed by
 the MAC models.
 
-We focus first on the choice between physical layer frameworks.  |ns3| 
+We focus first on the choice between physical layer frameworks.  |ns3|
 contains support for a Wi-Fi-only physical layer model called YansWifiPhy
 that offers no frequency-level decomposition of the signal.  For simulations
 that involve only Wi-Fi signals on the Wi-Fi channel, and that do not
@@ -211,12 +212,12 @@
 The SpectrumWifiPhy framework uses the :ref:`sec-spectrum-module` channel
 framework.
 
-The YansWifiChannel is the only concrete channel model class in 
-the |ns3| wifi module.  The 
-``ns3::YansWifiChannel`` implementation uses the propagation loss and 
+The YansWifiChannel is the only concrete channel model class in
+the |ns3| wifi module.  The
+``ns3::YansWifiChannel`` implementation uses the propagation loss and
 delay models provided within the |ns3| :ref:`Propagation` module.
 In particular, a number of propagation models can be added (chained together,
-if multiple loss models are added) to the channel object, and a propagation 
+if multiple loss models are added) to the channel object, and a propagation
 delay model also added. Packets sent from a ``ns3::YansWifiPhy`` object
 onto the channel with a particular signal power, are copied to all of the
 other ``ns3::YansWifiPhy`` objects after the signal power is reduced due
@@ -225,11 +226,11 @@
 any channel propagation delay model (typically due to speed-of-light
 delay between the positions of the devices).
 
-Only objects of ``ns3::YansWifiPhy`` may be attached to a 
-``ns3::YansWifiChannel``; therefore, objects modeling other 
+Only objects of ``ns3::YansWifiPhy`` may be attached to a
+``ns3::YansWifiChannel``; therefore, objects modeling other
 (interfering) technologies such as LTE are not allowed. Furthermore,
 packets from different channels do not interact; if a channel is logically
-configured for e.g. channels 5 and 6, the packets do not cause 
+configured for e.g. channels 5 and 6, the packets do not cause
 adjacent channel interference (even if their channel numbers overlap).
 
 WifiPhy and related models
@@ -247,7 +248,7 @@
 object in the WifiNetDevice.
 
 There are currently two implementations of the ``WifiPhy``: the
-``ns3::YansWifiPhy`` and the ``ns3::SpectrumWifiPhy``.  They each work in 
+``ns3::YansWifiPhy`` and the ``ns3::SpectrumWifiPhy``.  They each work in
 conjunction with five other objects:
 
 * **PhyEntity**: Contains the amendment-specific part of the PHY processing
@@ -348,14 +349,14 @@
 it from the MAC (the ``ns3::FrameExchangeManager`` object) and sending them onto the
 ``ns3::YansWifiChannel`` to which it is attached.  It is also responsible
 to receive packets from that channel, and, if reception is deemed to have
-been successful, to pass them up to the MAC. 
+been successful, to pass them up to the MAC.
 
-The energy of the signal intended to be received is 
+The energy of the signal intended to be received is
 calculated from the transmission power and adjusted based on the Tx gain
 of the transmitter, Rx gain of the receiver, and any path loss propagation
 model in effect.
 
-Class ``ns3::WifiPhyStateHelper`` manages the state machine of the PHY 
+Class ``ns3::WifiPhyStateHelper`` manages the state machine of the PHY
 layer, and allows other objects to hook as *listeners* to monitor PHY
 state.  The main use of listeners is for the MAC layer to know when
 the PHY is busy or not (for transmission and collision avoidance).
@@ -390,7 +391,7 @@
 raising this threshold; namely, that all packets with power below this
 threshold will be discarded upon reception.
 
-In ``StartReceivePreamble ()``, the packet is immediately added 
+In ``StartReceivePreamble ()``, the packet is immediately added
 to the interference helper for signal-to-noise
 tracking, and then further reception steps are decided upon the state of
 the PHY.  In the case that the PHY is transmitting, for instance, the
@@ -411,13 +412,13 @@
 preamble and the PHY is put into the CCA_BUSY state. Currently, there is only a
 simple threshold-based preamble detection model in ns-3,
 called ``ThresholdPreambleDetectionModel``.  If there is no preamble detection
-model, the preamble is assumed to have been detected.  
+model, the preamble is assumed to have been detected.
 It is important to note that, starting with the ns-3.30 release, the default
 in the WifiPhyHelper is to add the ``ThresholdPreambleDetectionModel`` with
 a threshold RSSI of -82 dBm, and a threshold SNR of 4 dB.  Both the RSSI
 and SNR must be above these respective values for the preamble to be
 successfully detected.  The default sensitivity has been reduced in ns-3.30
-compared with that of previous releases, so some packet receptions that were 
+compared with that of previous releases, so some packet receptions that were
 previously successful will now fail on this check.  More details on the
 modeling behind this change are provided in [lanante2019]_.
 
@@ -436,7 +437,7 @@
 based on the observed SNR.  The InterferenceHelper object returns a value
 for "probability of error (PER)" for this header based on the SNR that has
 been tracked by the InterferenceHelper.  The ``PhyEntity`` then draws
-a random number from a uniform distribution and compares it against the 
+a random number from a uniform distribution and compares it against the
 PER and decides success or failure.
 
 This is iteratively performed up to the beginning of the data field
@@ -449,8 +450,8 @@
 the PHY being in a state in which it cannot receive a packet, the packet
 is added to the interference helper, and the aggregate of the energy of
 all such signals is compared against an energy detection threshold to
-determine whether the PHY should enter a CCA_BUSY state. 
-The ``WifiPhy::CcaEdThreshold`` attribute 
+determine whether the PHY should enter a CCA_BUSY state.
+The ``WifiPhy::CcaEdThreshold`` attribute
 corresponds to what the standard calls the "ED threshold" for CCA Mode 1.
 In section 16.4.8.5 in the 802.11-2012 standard: "CCA Mode 1: Energy above
 threshold. CCA shall report a busy medium upon detection of any energy above
@@ -490,12 +491,12 @@
 .. _snir:
 
 .. figure:: figures/snir.*
-   
+
    *SNIR function over time*
 
-From the SNIR function we can derive the Bit Error Rate (BER) and Packet 
+From the SNIR function we can derive the Bit Error Rate (BER) and Packet
 Error Rate (PER) for
-the modulation and coding scheme being used for the transmission.  
+the modulation and coding scheme being used for the transmission.
 
 If MIMO is used and the number of spatial streams is lower than the number
 of active antennas at the receiver, then a gain is applied to the calculated
@@ -606,16 +607,16 @@
 
 .. figure:: figures/default-table-based-error-model-validation.*
    :scale: 75%
-  
+
    *Comparison of table-based OFDM Error Model with TGax results.*
 
 Legacy ErrorRateModels
 ######################
 
 The original error rate model was called the ``ns3::YansErrorRateModel`` and
-was based on analytical results.  For 802.11b modulations, the 1 Mbps mode 
+was based on analytical results.  For 802.11b modulations, the 1 Mbps mode
 is based on DBPSK. BER is from equation 5.2-69 from [proakis2001]_.
-The 2 Mbps model is based on DQPSK. Equation 8 of [ferrari2004]_.  
+The 2 Mbps model is based on DQPSK. Equation 8 of [ferrari2004]_.
 More details are provided in [lacage2006yans]_.
 
 The ``ns3::NistErrorRateModel`` was later added.
@@ -633,7 +634,7 @@
 model was added, into a new model called DsssErrorRateModel.
 
 Furthermore, the 5.5 Mbps and 11 Mbps models for 802.11b rely on library
-methods implemented in the GNU Scientific Library (GSL).  The Waf build
+methods implemented in the GNU Scientific Library (GSL).  The ns3 build
 system tries to detect whether the host platform has GSL installed; if so,
 it compiles in the newer models from [pursley2009]_ for 5.5 Mbps and 11 Mbps;
 if not, it uses a backup model derived from MATLAB simulations.
@@ -665,7 +666,7 @@
 
 * ``wifi-spectrum-value-helper.{cc,h}``
 
-The current ``SpectrumWifiPhy`` class 
+The current ``SpectrumWifiPhy`` class
 reuses the existing interference manager and error rate models originally
 built for ``YansWifiPhy``, but allows, as a first step, foreign (non Wi-Fi)
 signals to be treated as additive noise.
@@ -694,7 +695,7 @@
 spectrum framework and spread their energy across the bands. The
 spectrum is sub-divided into sub-bands (the width of an OFDM
 subcarrier, which depends on the technology). The power allocated to a particular channel
-is spread across the sub-bands roughly according to how power would 
+is spread across the sub-bands roughly according to how power would
 be allocated to sub-carriers. Adjacent channels are models by the use of
 OFDM transmit spectrum masks as defined in the standards.
 
@@ -788,11 +789,11 @@
 The backoff procedure of DCF is described in section 10.3.4.3 of [ieee80211-2016]_.
 
 *  â€œA STA shall invoke the backoff procedure to transfer a frame
-   when finding the medium busy as indicated by either the physical or 
+   when finding the medium busy as indicated by either the physical or
    virtual CS mechanism.â€�
-*  â€œA backoff procedure shall be performed immediately after the end of 
-   every transmission with the More Fragments bit set to 0 of an MPDU of 
-   type Data, Management, or Control with subtype PS-Poll, even if no 
+*  â€œA backoff procedure shall be performed immediately after the end of
+   every transmission with the More Fragments bit set to 0 of an MPDU of
+   type Data, Management, or Control with subtype PS-Poll, even if no
    additional transmissions are currently queued.â€�
 
 The EDCA backoff procedure is slightly different than the DCF backoff procedure
@@ -1025,7 +1026,7 @@
 
 Algorithms found in real devices:
 
-* ``ArfWifiManager`` (default for ``WifiHelper``)
+* ``ArfWifiManager``
 * ``OnoeWifiManager``
 * ``ConstantRateWifiManager``
 * ``MinstrelWifiManager``
@@ -1033,7 +1034,7 @@
 
 Algorithms in literature:
 
-* ``IdealWifiManager``
+* ``IdealWifiManager``  (default for ``WifiHelper``)
 * ``AarfWifiManager`` [lacage2004aarfamrr]_
 * ``AmrrWifiManager`` [lacage2004aarfamrr]_
 * ``CaraWifiManager`` [kim2006cara]_
@@ -1204,11 +1205,11 @@
 
 * Creating or modifying the default Wi-Fi frames/headers by making changes to ``wifi-mac-header.*``.
 * MAC low modification. For example, handling new/modified control frames (think RTS/CTS/ACK/Block ACK),
-  making changes to two-way transaction/four-way transaction.  Users usually make changes to 
+  making changes to two-way transaction/four-way transaction.  Users usually make changes to
   ``frame-exchange-manager.*`` or its subclasses to accomplish this.
   Handling of control frames is performed in ``FrameExchangeManager::ReceiveMpdu``.
-* MAC high modification. For example, handling new management frames (think beacon/probe), 
-  beacon/probe generation.  Users usually make changes to ``regular-wifi-mac.*``,``sta-wifi-mac.*``, ``ap-wifi-mac.*``, or ``adhoc-wifi-mac.*`` to accomplish this.
+* MAC high modification. For example, handling new management frames (think beacon/probe),
+  beacon/probe generation.  Users usually make changes to ``wifi-mac.*``,``sta-wifi-mac.*``, ``ap-wifi-mac.*``, or ``adhoc-wifi-mac.*`` to accomplish this.
 * Wi-Fi queue management.  The files ``txop.*`` and ``qos-txop.*`` are of interest for this task.
 * Channel access management.  Users should modify the files ``channel-access-manager.*``, which grant access to
   ``Txop`` and ``QosTxop``.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/doc/source/wifi.rst ns-3.36/src/wifi/doc/source/wifi.rst
--- ns-3.35/src/wifi/doc/source/wifi.rst	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/doc/source/wifi.rst	2022-04-30 18:23:58.198735200 -0700
@@ -7,4 +7,5 @@
     wifi-design
     wifi-user
     wifi-testing
+    wifi-changelog
     wifi-references
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/doc/source/wifi-testing.rst ns-3.36/src/wifi/doc/source/wifi-testing.rst
--- ns-3.35/src/wifi/doc/source/wifi-testing.rst	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/doc/source/wifi-testing.rst	2022-04-30 18:23:58.198735200 -0700
@@ -141,7 +141,7 @@
 short guard first disabled then enabled (cases 17-32).  Cases 33-64 repeat
 the same configurations but for two spatial streams (MIMO abstraction).
 
-When run with the legacy YansWifiPhy, as in ``./waf --run "wifi-spectrum-saturation-example --wifiType=ns3::YansWifiPhy"``, the same output is observed:
+When run with the legacy YansWifiPhy, as in ``./ns3 run "wifi-spectrum-saturation-example --wifiType=ns3::YansWifiPhy"``, the same output is observed:
 
 ::
 
@@ -204,7 +204,7 @@
 
 ::
 
-  ./waf --run "wifi-spectrum-per-interference"
+  ./ns3 run "wifi-spectrum-per-interference"
 
   wifiType: ns3::SpectrumWifiPhy distance: 50m; time: 10; TxPower: 16 dBm (40 mW)
   index   MCS  Rate (Mb/s) Tput (Mb/s) Received Signal (dBm)Noi+Inf(dBm) SNR (dB)
@@ -223,7 +223,7 @@
 
 ::
 
-  ./waf --run "wifi-spectrum-per-interference --waveformPower=0.001"
+  ./ns3 run "wifi-spectrum-per-interference --waveformPower=0.001"
 
   wifiType: ns3::SpectrumWifiPhy distance: 50m; sent: 1000 TxPower: 16 dBm (40 mW)
   index   MCS Rate (Mb/s) Tput (Mb/s) Received Signal (dBm)Noi+Inf(dBm)  SNR (dB)
@@ -266,7 +266,7 @@
 
 ::
 
-  ./waf --run "wifi-bianchi"
+  ./ns3 run "wifi-bianchi"
 
 .. _fig-wifi-bianchi-11a-54-adhoc:
 
@@ -283,7 +283,7 @@
 
 ::
 
-  ./waf --run "wifi-bianchi --standard=11g --phyRate=6 --duration=500 --infra"
+  ./ns3 run "wifi-bianchi --standard=11g --phyRate=6 --duration=500 --infra"
 
 .. _fig-wifi-bianchi-11g-6-infra:
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/doc/source/wifi-user.rst ns-3.36/src/wifi/doc/source/wifi-user.rst
--- ns-3.35/src/wifi/doc/source/wifi-user.rst	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/doc/source/wifi-user.rst	2022-04-30 18:23:58.198735200 -0700
@@ -35,15 +35,15 @@
 
 To create a WifiNetDevice, users need to follow these steps:
 
-* Decide on which physical layer framework, the ``SpectrumWifiPhy`` or 
-  ``YansWifiPhy``, to use.  This will affect which Channel and Phy type to use. 
+* Decide on which physical layer framework, the ``SpectrumWifiPhy`` or
+  ``YansWifiPhy``, to use.  This will affect which Channel and Phy type to use.
 * Configure the Channel: Channel takes care of getting signal
   from one device to other devices on the same Wi-Fi channel.
   The main configurations of WifiChannel are propagation loss model and propagation delay model.
 * Configure the WifiPhy: WifiPhy takes care of actually sending and receiving wireless
   signal from Channel.  Here, WifiPhy decides whether each frame will be successfully
   decoded or not depending on the received signal strength and noise.  Thus, the main
-  configuration of WifiPhy is the error rate model, which is the one that actually 
+  configuration of WifiPhy is the error rate model, which is the one that actually
   calculates the probability of successfully decoding the frame based on the signal.
 * Configure WifiMac: this step is more related to the architecture and device level.
   The users configure the wifi architecture (i.e. ad-hoc or ap-sta) and whether QoS (802.11e),
@@ -74,7 +74,7 @@
   // and install Wifi devices.  Configure a Wifi standard to use, which
   // will align various parameters in the Phy and Mac to standard defaults.
   WifiHelper wifi;
-  wifi.SetStandard (WIFI_STANDARD_80211n_5GHZ);
+  wifi.SetStandard (WIFI_STANDARD_80211n);
   // Declare NetDeviceContainers to hold the container returned by the helper
   NetDeviceContainer wifiStaDevices;
   NetDeviceContainer wifiApDevice;
@@ -85,8 +85,8 @@
   mac.SetType ("ns3::ApWifiMac");
   wifiApDevice = wifi.Install (phy, mac, wifiApNode);
 
-At this point, the 11 nodes have Wi-Fi devices configured, attached to a 
-common channel.  The rest of this section describes how additional 
+At this point, the 11 nodes have Wi-Fi devices configured, attached to a
+common channel.  The rest of this section describes how additional
 configuration may be performed.
 
 YansWifiChannelHelper
@@ -194,36 +194,50 @@
   NetDeviceContainer apDevice;
   apDevice = wifi.Install (phy, mac, wifiApNode);
 
-Channel, frequency, and channel width configuration
-===================================================
+.. _Channel-settings:
 
-There are a few ``ns3::WifiPhy`` parameters that are related, and cannot
-be set completely independently, concerning the frequency and channel width
-that the device is tuned to.  These are:
-
-* ``WifiPhyStandard``:  For example, 802.11b, 802.11n, etc.
-* ``Frequency``
-* ``ChannelWidth``
-* ``ChannelNumber``
-
-It is possible to set the above to incompatible combinations (e.g. channel
-number 1 with 40 MHz channel width on frequency 4915 MHz).  In addition,
-the latter three values above are attributes; it is possible to set them
-in a number of ways:
+Channel, frequency, channel width, and band configuration
+=========================================================
+
+There is a unique ``ns3::WifiPhy`` attribute, named ``ChannelSettings``, that
+enables to set channel number, channel width, frequency band and primary20 index
+all together, in order to eliminate the possibility of inconsistent settings.
+The ``ChannelSettings`` attribute can be set in a number of ways (see below) by
+providing either a StringValue object or a TupleValue object:
+
+* Defining a StringValue object to set the ``ChannelSettings`` attribute
+
+::
+
+  StringValue value ("{38, 40, BAND_5GHZ, 0}"));
+
+* Defining a TupleValue object to set the ``ChannelSettings`` attribute
+
+::
+
+  TupleValue<UintegerValue, UintegerValue, EnumValue, UintegerValue> value;
+  value.Set (WifiPhy::ChannelTuple {38, 40, WIFI_PHY_BAND_5GHZ, 0});
+
+In both cases, the operating channel will be channel 38 in the 5 GHz band, which
+has a width of 40 MHz, and the primary20 channel will be the 20 MHz subchannel
+with the lowest center frequency (index 0).
+
+The operating channel settings can then be configured in a number of ways:
 
 * by setting global configuration default; e.g.
 
 ::
 
-  Config::SetDefault ("ns3::WifiPhy::ChannelNumber", UintegerValue (3));
+  Config::SetDefault ("ns3::WifiPhy::ChannelSettings", StringValue ("{38, 40, BAND_5GHZ, 0}"));
 
 * by setting an attribute value in the helper; e.g.
 
 ::
 
+  TupleValue<UintegerValue, UintegerValue, EnumValue, UintegerValue> value;
+  value.Set (WifiPhy::ChannelTuple {38, 40, WIFI_PHY_BAND_5GHZ, 0});
   YansWifiPhyHelper wifiPhyHelper = YansWifiPhyHelper::Default ();
-  wifiPhyHelper.Set ("ChannelNumber", UintegerValue (3));
-
+  wifiPhyHelper.Set ("ChannelSettings", value);
 
 * by setting the WifiHelper::SetStandard (enum WifiStandard) method; and
 
@@ -232,20 +246,19 @@
 
 ::
 
-  Config::Set ("/NodeList/0/DeviceList/*/$ns3::WifiNetDevice/Phy/$ns3::WifiPhy/ChannelNumber",
-               UintegerValue (3));
+  Config::Set ("/NodeList/0/DeviceList/*/$ns3::WifiNetDevice/Phy/$ns3::WifiPhy/ChannelSettings",
+               StringValue ("{38, 40, BAND_5GHZ, 0}"));
 
-This section provides guidance on how to configure these settings in
-a coherent manner, and what happens if non-standard values are chosen.
+This section provides guidance on how to properly configure these settings.
 
 WifiHelper::SetStandard()
 +++++++++++++++++++++++++
 
-``WifiHelper::SetStandard ()`` is a method to set various parameters
-in the Mac and Phy to standard values and some reasonable defaults.
-For example, ``SetStandard (WIFI_STANDARD_80211a)`` will set the
-WifiPhy to Channel 36 in the 5 GHz band, among other settings appropriate
-for 802.11a.
+``WifiHelper::SetStandard ()`` is a method required to set various parameters
+in the Mac and Phy to standard values, but also to check that the channel
+settings as described above are allowed. For instance, a channel in the 2.4 GHz
+band cannot be configured if the standard is 802.11ac, or a channel in the 6 GHz
+band can only be configured if the standard is 802.11ax (or beyond).
 
 The following values for WifiStandard are defined in
 ``src/wifi/model/wifi-standards.h``:
@@ -256,46 +269,93 @@
   WIFI_STANDARD_80211b,
   WIFI_STANDARD_80211g,
   WIFI_STANDARD_80211p,
-  WIFI_STANDARD_80211n_2_4GHZ,
-  WIFI_STANDARD_80211n_5GHZ,
+  WIFI_STANDARD_80211n,
   WIFI_STANDARD_80211ac,
-  WIFI_STANDARD_80211ax_2_4GHZ,
-  WIFI_STANDARD_80211ax_5GHZ,
-  WIFI_STANDARD_80211ax_6GHZ
+  WIFI_STANDARD_80211ax
 
 By default, the WifiHelper (the typical use case for WifiPhy creation) will
-configure the WIFI_STANDARD_80211a standard by default.  Other values
+configure the WIFI_STANDARD_80211ax standard by default.  Other values
 for standards should be passed explicitly to the WifiHelper object.
 
-If user has not already separately configured Frequency or ChannelNumber
-when SetStandard is called, the user obtains default values, in addition
-(e.g. channel 1 for 802.11b/g, or channel 36 for a/n), in addition to
-an appropriate ChannelWidth value for the standard (typically, 20 MHz, but
-80 MHz for 802.11ac/ax).
-
-WifiPhy attribute interactions
-++++++++++++++++++++++++++++++
-
-Users should keep in mind that the two attributes that matter most
-within the model code are ``WifiPhy::Frequency`` and 
-``WifiPhy::ChannelWidth``; these are the ones directly used to set
-transmission parameters.  ``WifiPhy::ChannelNumber`` and 
-``WifiHelper::SetStandard ()`` are convenience shorthands for setting
-frequency and channel width.  The ``ns3::WifiPhy`` contains code to
-keep these values aligned and to generate runtime errors in some cases
-if users set these attributes to incompatible values.
-
-The pair (WifiPhyStandard, ChannelNumber) is an alias for a pair of 
-(Frequency/ChannelWidth) items.  Valid combinations are stored in 
-a map within WifiPhy that is populated with well-known values but that
-can be dynamically extended at runtime.  
+If user has not already configured ChannelSettings when SetStandard is called,
+the user obtains default values, as described next.
+
+Default settings for the operating channel
+++++++++++++++++++++++++++++++++++++++++++
+
+Not all the parameters in the channel settings have to be set to a valid value,
+but they can be left unspecified, in which case default values are substituted
+as soon as the WifiStandard is set. Here are the rules (applied in the given order):
+
+* If the band is unspecified (i.e., it is set to WIFI_PHY_BAND_UNSPECIFIED or
+  "BAND_UNSPECIFIED"), the default band for the configured standard is set
+  (5 GHz band for 802.11{a, ac, ax, p} and 2.4 GHz band for all the others).
+
+* If both the channel width and the channel number are unspecified (i.e., they
+  are set to zero), the default channel width for the configured standard and
+  band is set (22 MHz for 802.11b, 10 MHz for 802.11p, 80 MHz for 802.11ac and
+  for 802.11ax if the band is 5 GHz, and 20 MHz for all other cases).
+
+* If the channel width is unspecified but the channel number is valid, the settings
+  are valid only if there exists a unique channel with the given number for the
+  configured standard and band, in which case the channel width is set to the width
+  of such unique channel. Otherwise, the simulation aborts.
+
+* If the channel number is unspecified (i.e., it is set to zero), the default
+  channel number for the configured standard, band and channel width is used
+  (the default channel number is the first one in the list of channels that can
+  be used with the configured standard, band and channel width)
+
+Following are a few examples to clarify these rules:
+
+::
+
+  WifiHelper wifi;
+  wifi.SetStandard (WIFI_STANDARD_80211ac);
+  YansWifiPhyHelper phyHelper;
+  phyHelper.Set ("ChannelSettings", StringValue ("{58, 0, WIFI_PHY_BAND_5GHZ, 0}"));
+  // channel width unspecified
+  // -> it is set to 80 MHz (width of channel 58)
+
+::
+
+  WifiHelper wifi;
+  wifi.SetStandard (WIFI_STANDARD_80211n);
+  YansWifiPhyHelper phyHelper;
+  phyHelper.Set ("ChannelSettings", StringValue ("{0, 40, WIFI_PHY_BAND_5GHZ, 0}"));
+  // channel number unspecified
+  // -> it is set to channel 38 (first 40 MHz channel in the 5GHz band)
+
+::
+
+  WifiHelper wifi;
+  wifi.SetStandard (WIFI_STANDARD_80211ax);
+  YansWifiPhyHelper phyHelper;
+  phyHelper.Set ("ChannelSettings", StringValue ("{0, 0, WIFI_PHY_BAND_2_4GHZ, 0}"));
+  // both channel number and width unspecified
+  // -> width set to 20 MHz (default width for 802.11ax in the 2.4 GHZ band)
+  // -> channel number set to 1 (first 20 MHz channel in the 2.4 GHz band)
+
+::
+
+  WifiHelper wifi;
+  wifi.SetStandard (WIFI_STANDARD_80211a);
+  YansWifiPhyHelper phyHelper;
+  phyHelper.Set ("ChannelSettings", StringValue ("{0, 0, WIFI_PHY_BAND_UNSPECIFIED, 0}"));
+  // band, channel number and width unspecified
+  // -> band is set to WIFI_PHY_BAND_5GHZ (default band for 802.11a)
+  // -> width set to 20 MHz (default width for 802.11a in the 5 GHZ band)
+  // -> channel number set to 36 (first 20 MHz channel in the 5 GHz band)
+
+
+The default value for the ChannelSettings attribute leaves all the parameters
+unspecified, except for the primary20 index, which is equal to zero.
 
 WifiPhy::Frequency
 ++++++++++++++++++
 
-The WifiPhy channel center frequency is set by the attribute ``Frequency``
-in the class ``WifiPhy``.  It is expressed in units of MHz.  By default,
-this attribute is set to the value 0 to indicate that no value is configured.
+The configured WifiPhy channel center frequency can be got via the attribute
+``Frequency`` in the class ``WifiPhy``.  It is expressed in units of MHz.
 
 Note that this is a change in definition from ns-3.25 and earlier releases,
 where this attribute referred to the start of the overall frequency band
@@ -304,10 +364,8 @@
 WifiPhy::ChannelWidth
 +++++++++++++++++++++
 
-The WifiPhy channel width is set by the attribute ``ChannelWidth``
-in the class ``WifiPhy``.  It is expressed in units of MHz.  By default,
-this attribute is set to the value 20.  Allowable values are 5, 10, 20,
-22, 40, 80, or 160 (MHz).
+The configured WifiPhy channel width can be got via the attribute ``ChannelWidth``
+in the class ``WifiPhy``.  It is expressed in units of MHz.
 
 WifiPhy::ChannelNumber
 ++++++++++++++++++++++
@@ -316,9 +374,8 @@
 valid channel numbers vary by geographical region around the world, and
 there is some overlap between the different standards.
 
-In |ns3|, the class ``WifiPhy`` contains an attribute ``ChannelNumber`` that
-is, by default, set to the value 0.  The value 0 indicates that no
-channel number has been set by the user.
+The configured WifiPhy channel number can be got via the attribute ``ChannelNumber``
+in the class ``WifiPhy``.
 
 In |ns3|, a ChannelNumber may be defined or unknown.  These terms
 are not found in the code; they are just used to describe behavior herein.
@@ -328,10 +385,10 @@
 known for that channel in practice.  For example:
 
 * Channel 1, when IEEE 802.11b is configured, corresponds to a channel
-  width of 22 MHz and a center frequency of 2412 MHz.  
+  width of 22 MHz and a center frequency of 2412 MHz.
 
-* Channel 36, when IEEE 802.11n is configured at 5 GHz, corresponds to 
-  a channel width of 20 MHz and a center frequency of 5180 MHz.  
+* Channel 36, when IEEE 802.11n is configured at 5 GHz, corresponds to
+  a channel width of 20 MHz and a center frequency of 5180 MHz.
 
 The following channel numbers are well-defined for 2.4 GHz standards:
 
@@ -393,7 +450,7 @@
 
 
 The channel number may be set either before or after creation of the
-WifiPhy object.  
+WifiPhy object.
 
 If an unknown channel number (other than zero) is configured, the
 simulator will exit with an error; for instance, such as:
@@ -401,12 +458,11 @@
 ::
 
   Ptr<WifiPhy> wifiPhy = ...;
-  wifiPhy->SetAttribute ("ChannelNumber", UintegerValue (1321));
+  wifiPhy->SetAttribute ("ChannelSettings", StringValue ("{1321, 20, BAND_5GHZ, 0}"));
 
 The known channel numbers are defined in the implementation file
-``src/wifi/model/wifi-phy.cc``.  Of course, this file may be edited
-by users to extend to additional channel numbers.  Below, we describe 
-how new channel numbers may be defined dynamically at run-time.
+``src/wifi/model/wifi-phy-operating-channel.cc``. Of course, this file may be edited
+by users to extend to additional channel numbers.
 
 If a known channel number is configured against an incorrect value
 of the WifiPhyStandard, the simulator will exit with an error; for instance,
@@ -415,103 +471,32 @@
 ::
 
   WifiHelper wifi;
-  wifi.SetStandard (WIFI_STANDARD_80211n_5GHZ);
+  wifi.SetStandard (WIFI_STANDARD_80211n);
   ...
   Ptr<WifiPhy> wifiPhy = ...;
-  wifiPhy->SetAttribute ("ChannelNumber", UintegerValue (14));
+  wifiPhy->SetAttribute ("ChannelSettings", StringValue ("{14, 20, BAND_5GHZ, 0}"));
 
 In the above, while channel number 14 is well-defined in practice for 802.11b
 only, it is for 2.4 GHz band, not 5 GHz band.
 
-Defining a new channel number
-+++++++++++++++++++++++++++++
-
-Users may define their own channel number so that they can later refer to
-the channel by number.  
-
-The method is ``WifiPhy::DefineChannelNumber ()`` and it takes the following
-arguments:
-
-* uint16_t channelNumber
-* enum WifiPhyStandard standard
-* uint32_t frequency
-* uint32_t channelWidth
-
-The pair of (channelNumber, standard) are used as an index to a map that
-returns a Frequency and ChannelWidth.  By calling this method, one can
-dynamically add members to the map.  For instance, let's suppose that you
-previously configured WIFI_PHY_STANDARD_80211a, and wanted to define a new
-channel number '34' of width 20 MHz and at center frequency 5160 MHz.
-
-If you try to simply configure ChannelNumber to the value 34, it will fail,
-since 34 is undefined.  However, you can use DefineChannelNumber as follows:
-
-::
-
-  Ptr<WifiPhy> wifiPhy = ...;
-  wifiPhy->DefineChannelNumber (34, WIFI_PHY_STANDARD_80211a, 5160, 20);
-
-and then later you can refer to channel number 34 in your program, which
-will configure a center operating frequency of 5160 MHz and a width of
-20 MHz.
-
-The steps can be repeated to explicitly configure the same channel for
-multiple standards:
-
-::
+WifiPhy::Primary20MHzIndex
+++++++++++++++++++++++++++
 
-  wifiPhy->DefineChannelNumber (34, WIFI_PHY_STANDARD_80211a, 5160, 20);
-  wifiPhy->DefineChannelNumber (34, WIFI_PHY_STANDARD_80211n_5GHZ, 5160, 20);
-
-or for a wildcard, unspecified standard:
-
-::
-
-  wifiPhy->DefineChannelNumber (34, WIFI_PHY_STANDARD_UNSPECIFIED, 5160, 20);
+The configured WifiPhy primary 20MHz channel index can be got via the attribute
+``Primary20MHzIndex`` in the class ``WifiPhy``.
 
 Order of operation issues
 +++++++++++++++++++++++++
 
-Depending on the default values used and the order of operation in setting
-the values for the standard, channel width, frequency, and channel number,
-different configurations can be obtained.   Below are some common use cases.
-
-* **(accepting the standard defaults):**  If a user has not already 
-  separately configured frequency or channel number when 
-  ``WifiHelper::SetStandard ()`` is called, the user gets default values 
-  (e.g. channel 1 for 802.11b/g/n, channel 36 for a/n with 20 MHz
-  channel widths and channel 42 for ac/ax with 80 MHz channel widths)
-
-* **(overwriting the standard channel):**  If the user has previously 
-  configured (e.g. via SetDefault) either frequency or channel number when 
-  SetStandard is called, and the frequency or channel number are appropriate 
-  for the standard being configured, they are not overwritten
-
-* **(changing the standard channel after Install):**  The user may also call
-  ``WifiHelper::SetStandard ()`` after ``Install ()`` and either configure
-  the frequency to something different, or configure the channel number
-  to something different.  Note that if the channel number is undefined
-  for the standard that was previously set, an error will occur.  
-
-* **(changing to non-standard frequency):**  If the user configures a 
-  frequency outside the standardized frequency range for the current 
-  WifiPhyStandard, this is OK.  This allows users to experiment with 
-  wifi on e.g. whitespace frequencies but still use SetStandard to set 
-  all of the other configuration details.
-
-* **(interaction between channel number and frequency):**  If the user 
-  sets Frequency to a different value than the currently configured
-  ChannelNumber (or if ChannelNumber is zero), then the ChannelNumber is 
-  set to a new channel number if known, or to zero if unknown. 
-
-  * *example:*  ChannelNumber previously set to 36, user sets Frequency to 5200, then ChannelNumber gets automatically set to 40
-  * *example:*  ChannelNumber set to 36, user later sets Frequency to 5185, ChannelNumber gets reset to 0
-
-In summary, ChannelNumber and Frequency follow each other. ChannelNumber
-sets both Frequency and ChannelWidth if the channel number has been defined
-for the standard.  Setting ChannelWidth has no effect on Frequency or
-ChannelNumber. Setting Frequency will set ChannelNumber to either the
-defined value for that Wi-Fi standard, or to the value 0 if undefined.
+Channel settings can be configured either before or after the wifi standard.
+If the channel settings are configured before the wifi standard, the channel
+settings are stored and applied when the wifi standard is configured.
+Otherwise, they are applied immediately.
+
+The wifi standard can be configured only once, i.e., it is not possible to
+change standard during a simulation. It is instead possible to change the
+channel settings at any time.
+
 
 SpectrumWifiPhyHelper
 =====================
@@ -589,7 +574,7 @@
 in an infrastructure network where the AP has SSID ``ns-3-ssid``::
 
     WifiHelper wifi;
-    wifi.SetStandard (WIFI_STANDARD_80211n_5GHZ);
+    wifi.SetStandard (WIFI_STANDARD_80211n);
 
     WifiMacHelper wifiMacHelper;
     Ssid ssid = Ssid ("ns-3-ssid");
@@ -650,7 +635,7 @@
 ===  ===============
 
 TOS and DSCP values map onto user priorities and access categories according
-to the following table.  
+to the following table.
 
 ============  ============  ==  ===============
 DiffServ PHB  TOS (binary)  UP  Access Category
@@ -683,7 +668,7 @@
     destAddress.SetTos (0xc0);
 
 will map to CS6, User Priority 6, and Access Category AC_VO.
-Also, the ns3-wifi-ac-mapping test suite (defined in 
+Also, the ns3-wifi-ac-mapping test suite (defined in
 src/test/ns3wifi/wifi-ac-mapping-test-suite.cc) can provide additional
 useful information.
 
@@ -721,7 +706,7 @@
 In order to change parameters that are overwritten by ``WifiHelper::SetStandard``, this should be done post-install using ``Config::Set``::
 
   WifiHelper wifi;
-  wifi.SetStandard (WIFI_STANDARD_80211n_2_4GHZ);
+  wifi.SetStandard (WIFI_STANDARD_80211n);
   wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager", "DataMode", StringValue("HtMcs7"), "ControlMode", StringValue("HtMcs0"));
 
   //Install PHY and MAC
@@ -775,7 +760,7 @@
 standard.  Once the ``ns3::WifiHelper::Install`` has been called and the
 user sets the standard to a variant that supports HT capabilities (802.11n,
 802.11ac, or 802.11ax), an HT configuration object will automatically be
-created for the device.  The configuration object is used to store and 
+created for the device.  The configuration object is used to store and
 manage HT-specific attributes.
 
 802.11n/ac PHY layer can use either long (800 ns) or short (400 ns) OFDM guard intervals. To configure this parameter for a given device, the following lines of code could be used (in this example, it enables the support of a short guard interval for the first station)::
@@ -803,7 +788,7 @@
 HE configuration
 ================
 
-IEEE 802.11ax is also known as High Efficiency (HE).  Once the ``ns3::WifiHelper::Install`` has been called and IEEE 802.11ax configured as the standard, an 
+IEEE 802.11ax is also known as High Efficiency (HE).  Once the ``ns3::WifiHelper::Install`` has been called and IEEE 802.11ax configured as the standard, an
 HE configuration object will automatically be created to manage HE-specific
 attributes for 802.11ax devices.
 
@@ -857,7 +842,7 @@
 
   YansWifiPhyHelper wifiPhy =  YansWifiPhyHelper::Default ();
   // ns-3 supports RadioTap and Prism tracing extensions for 802.11
-  wifiPhy.SetPcapDataLinkType (WifiPhyHelper::DLT_IEEE802_11_RADIO); 
+  wifiPhy.SetPcapDataLinkType (WifiPhyHelper::DLT_IEEE802_11_RADIO);
 
   YansWifiChannelHelper wifiChannel;
   wifiChannel.SetPropagationDelay ("ns3::ConstantSpeedPropagationDelayModel");
@@ -885,7 +870,7 @@
 
   // other set up (e.g. InternetStack, Application)
 
-Infrastructure (access point and clients) WifiNetDevice configuration 
+Infrastructure (access point and clients) WifiNetDevice configuration
 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
 This is a typical example of how a user might configure an access point and a set of clients.
@@ -902,9 +887,9 @@
   WifiHelper wifi;
   wifi.SetStandard (WIFI_STANDARD_80211b);
 
-  YansWifiPhyHelper wifiPhy =  YansWifiPhyHelper::Default (); 
+  YansWifiPhyHelper wifiPhy =  YansWifiPhyHelper::Default ();
   // ns-3 supports RadioTap and Prism tracing extensions for 802.11
-  wifiPhy.SetPcapDataLinkType (WifiPhyHelper::DLT_IEEE802_11_RADIO); 
+  wifiPhy.SetPcapDataLinkType (WifiPhyHelper::DLT_IEEE802_11_RADIO);
 
   YansWifiChannelHelper wifiChannel;
   // reference loss must be changed since 802.11b is operating at 2.4GHz
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/examples/CMakeLists.txt ns-3.36/src/wifi/examples/CMakeLists.txt
--- ns-3.35/src/wifi/examples/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/wifi/examples/CMakeLists.txt	2022-04-30 18:23:58.198735200 -0700
@@ -0,0 +1,59 @@
+build_lib_example(
+  NAME wifi-phy-test
+  SOURCE_FILES wifi-phy-test.cc
+  LIBRARIES_TO_LINK
+    ${libcore}
+    ${libmobility}
+    ${libnetwork}
+    ${libwifi}
+)
+
+build_lib_example(
+  NAME wifi-test-interference-helper
+  SOURCE_FILES wifi-test-interference-helper.cc
+  LIBRARIES_TO_LINK
+    ${libcore}
+    ${libmobility}
+    ${libnetwork}
+    ${libwifi}
+)
+
+build_lib_example(
+  NAME wifi-manager-example
+  SOURCE_FILES wifi-manager-example.cc
+  LIBRARIES_TO_LINK
+    ${libcore}
+    ${libnetwork}
+    ${libwifi}
+    ${libstats}
+    ${libmobility}
+    ${libpropagation}
+)
+
+build_lib_example(
+  NAME wifi-trans-example
+  SOURCE_FILES wifi-trans-example.cc
+  LIBRARIES_TO_LINK
+    ${libcore}
+    ${libnetwork}
+    ${libwifi}
+    ${libstats}
+    ${libmobility}
+    ${libpropagation}
+)
+
+build_lib_example(
+  NAME wifi-phy-configuration
+  SOURCE_FILES wifi-phy-configuration.cc
+  LIBRARIES_TO_LINK ${libwifi}
+                    ${libconfig-store}
+)
+
+build_lib_example(
+  NAME wifi-bianchi
+  SOURCE_FILES wifi-bianchi.cc
+  LIBRARIES_TO_LINK
+    ${libwifi}
+    ${libapplications}
+    ${libinternet-apps}
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/examples/wifi-bianchi.cc ns-3.36/src/wifi/examples/wifi-bianchi.cc
--- ns-3.35/src/wifi/examples/wifi-bianchi.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/examples/wifi-bianchi.cc	2022-04-30 18:23:58.198735200 -0700
@@ -21,8 +21,11 @@
  */
 
 // This program conducts a Bianchi analysis of a wifi network.
-// It currently only supports 11a/b/g, and will be later extended
-// to support 11n/ac/ax, including frame aggregation settings.
+// Bianchi analysis involves saturating the network and observing how
+// the maximum achievable throughput is governed by the DCF or ECDA
+// channel access mechanisms.  This program offers many configurable
+// options, traces, and a validation option; the main output is a Gnuplot
+// plot file plotting throughput vs. number of nodes.
 
 #include <fstream>
 #include "ns3/log.h"
@@ -571,7 +574,7 @@
   packet->PeekHeader (hdr);
   // hdr.GetAddr1() is the receiving MAC address
   if (hdr.GetAddr1 () != ContextToMac (context))
-    { 
+    {
       return;
     }
   // hdr.GetAddr2() is the sending MAC address
@@ -877,6 +880,9 @@
                  uint32_t trialNumber, uint32_t networkSize, Time duration, bool pcap, bool infra, uint16_t guardIntervalNs,
                  double distance, double apTxPowerDbm, double staTxPowerDbm, Time pktInterval)
 {
+  RngSeedManager::SetSeed (10);
+  RngSeedManager::SetRun (10);
+
   NodeContainer wifiNodes;
   if (infra)
     {
@@ -884,7 +890,7 @@
     }
   else
     {
-      wifiNodes.Create (networkSize); 
+      wifiNodes.Create (networkSize);
     }
 
   YansWifiPhyHelper phy = wifiPhy;
@@ -903,14 +909,14 @@
       mac.SetType ("ns3::ApWifiMac",
                    "BeaconInterval", TimeValue (MicroSeconds (beaconInterval)),
                    "Ssid", SsidValue (ssid));
-      phy.Set ("TxPowerStart", DoubleValue (apTxPowerDbm)); 
+      phy.Set ("TxPowerStart", DoubleValue (apTxPowerDbm));
       phy.Set ("TxPowerEnd", DoubleValue (apTxPowerDbm));
       devices = wifi.Install (phy, mac, wifiNodes.Get (0));
 
       mac.SetType ("ns3::StaWifiMac",
                    "MaxMissedBeacons", UintegerValue (std::numeric_limits<uint32_t>::max ()),
                    "Ssid", SsidValue (ssid));
-      phy.Set ("TxPowerStart", DoubleValue (staTxPowerDbm)); 
+      phy.Set ("TxPowerStart", DoubleValue (staTxPowerDbm));
       phy.Set ("TxPowerEnd", DoubleValue (staTxPowerDbm));
       for (uint32_t i = 1; i < nNodes; ++i)
         {
@@ -927,7 +933,7 @@
 
   wifi.AssignStreams (devices, trialNumber);
 
-  Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/HtConfiguration/ShortGuardIntervalSupported", BooleanValue (guardIntervalNs == 400 ? true : false));
+  Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/HtConfiguration/ShortGuardIntervalSupported", BooleanValue (guardIntervalNs == 400));
   Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/HeConfiguration/GuardInterval", TimeValue (NanoSeconds (guardIntervalNs)));
 
   // Configure aggregation
@@ -959,7 +965,7 @@
 
   PacketSocketHelper packetSocket;
   packetSocket.Install (wifiNodes);
-  
+
   ApplicationContainer apps;
   Ptr<UniformRandomVariable> startTime = CreateObject<UniformRandomVariable> ();
   startTime->SetAttribute ("Stream", IntegerValue (trialNumber));
@@ -1000,9 +1006,9 @@
     }
 
   // Trace CW evolution
-  Config::Connect ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Mac/$ns3::RegularWifiMac/Txop/CwTrace", MakeCallback (&CwTrace));
+  Config::Connect ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Mac/$ns3::WifiMac/Txop/CwTrace", MakeCallback (&CwTrace));
   // Trace backoff evolution
-  Config::Connect ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Mac/$ns3::RegularWifiMac/Txop/BackoffTrace", MakeCallback (&BackoffTrace));
+  Config::Connect ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Mac/$ns3::WifiMac/Txop/BackoffTrace", MakeCallback (&BackoffTrace));
   // Trace PHY Tx start events
   Config::Connect ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/$ns3::WifiPhy/PhyTxBegin", MakeCallback (&PhyTxTrace));
   // Trace PHY Tx end events
@@ -1046,7 +1052,7 @@
       macRxTraceFile.flush ();
       socketSendTraceFile.flush ();
     }
-  
+
   return 0;
 }
 
@@ -1170,7 +1176,6 @@
       WifiHelper::EnableLogComponents ();
     }
 
-  Config::SetDefault ("ns3::WifiPhy::ChannelWidth", UintegerValue (channelWidth));
   std::stringstream phyModeStr;
   phyModeStr << phyMode;
   if (phyMode.find ("Mcs") != std::string::npos)
@@ -1208,11 +1213,11 @@
     {
       if (frequency == 2.4)
         {
-          wifiStandard = WIFI_STANDARD_80211n_2_4GHZ;
+          wifiStandard = WIFI_STANDARD_80211n;
         }
       else if (frequency == 5)
         {
-          wifiStandard = WIFI_STANDARD_80211n_5GHZ;
+          wifiStandard = WIFI_STANDARD_80211n;
         }
       else
         {
@@ -1228,15 +1233,15 @@
     {
       if (frequency == 2.4)
         {
-          wifiStandard = WIFI_STANDARD_80211ax_2_4GHZ;
+          wifiStandard = WIFI_STANDARD_80211ax;
         }
       else if (frequency == 5)
         {
-          wifiStandard = WIFI_STANDARD_80211ax_5GHZ;
+          wifiStandard = WIFI_STANDARD_80211ax;
         }
       else if (frequency == 6)
         {
-          wifiStandard = WIFI_STANDARD_80211ax_6GHZ;
+          wifiStandard = WIFI_STANDARD_80211ax;
         }
       else
         {
@@ -1248,6 +1253,11 @@
       NS_FATAL_ERROR ("Unsupported standard: " << standard);
     }
 
+  std::string channelStr = "{0, " + std::to_string (channelWidth) + ", BAND_"
+                           + (frequency == 2.4 ? "2_4" : (frequency == 5 ? "5" : "6"))
+                           + "GHZ, 0}";
+  Config::SetDefault ("ns3::WifiPhy::ChannelSettings", StringValue (channelStr));
+
   YansWifiPhyHelper wifiPhy;
   wifiPhy.DisablePreambleDetectionModel ();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/examples/wifi-manager-example.cc ns-3.36/src/wifi/examples/wifi-manager-example.cc
--- ns-3.35/src/wifi/examples/wifi-manager-example.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/examples/wifi-manager-example.cc	2022-04-30 18:23:58.198735200 -0700
@@ -42,6 +42,8 @@
 #include "ns3/uinteger.h"
 #include "ns3/boolean.h"
 #include "ns3/double.h"
+#include "ns3/enum.h"
+#include "ns3/tuple.h"
 #include "ns3/gnuplot.h"
 #include "ns3/command-line.h"
 #include "ns3/yans-wifi-helper.h"
@@ -100,6 +102,7 @@
    *
    * \param name reference name
    * \param standard wifi standard
+   * \param band PHY band
    * \param width channel width
    * \param snrLow SNR low
    * \param snrHigh SNR high
@@ -107,9 +110,10 @@
    * \param xMax x maximum
    * \param yMax y maximum
    */
-  StandardInfo (std::string name, WifiStandard standard, uint16_t width, double snrLow, double snrHigh, double xMin, double xMax, double yMax)
+  StandardInfo (std::string name, WifiStandard standard, WifiPhyBand band, uint16_t width, double snrLow, double snrHigh, double xMin, double xMax, double yMax)
     : m_name (name),
       m_standard (standard),
+      m_band (band),
       m_width (width),
       m_snrLow (snrLow),
       m_snrHigh (snrHigh),
@@ -120,6 +124,7 @@
   }
   std::string m_name; ///< name
   WifiStandard m_standard; ///< standard
+  WifiPhyBand m_band; ///< PHY band
   uint16_t m_width; ///< channel width
   double m_snrLow; ///< lowest SNR
   double m_snrHigh; ///< highest SNR
@@ -207,13 +212,13 @@
     {
       if (serverChannelWidth == 0)
         {
-          serverChannelWidth = GetDefaultChannelWidth (WIFI_PHY_STANDARD_80211b, WIFI_PHY_BAND_2_4GHZ);
+          serverChannelWidth = GetDefaultChannelWidth (WIFI_STANDARD_80211b, WIFI_PHY_BAND_2_4GHZ);
         }
       NS_ABORT_MSG_IF (serverChannelWidth != 22 && serverChannelWidth != 22, "Invalid channel width for standard " << standard);
       NS_ABORT_MSG_IF (serverNss != 1, "Invalid nss for standard " << standard);
       if (clientChannelWidth == 0)
         {
-          clientChannelWidth = GetDefaultChannelWidth (WIFI_PHY_STANDARD_80211b, WIFI_PHY_BAND_2_4GHZ);
+          clientChannelWidth = GetDefaultChannelWidth (WIFI_STANDARD_80211b, WIFI_PHY_BAND_2_4GHZ);
         }
       NS_ABORT_MSG_IF (clientChannelWidth != 22 && clientChannelWidth != 22, "Invalid channel width for standard " << standard);
       NS_ABORT_MSG_IF (clientNss != 1, "Invalid nss for standard " << standard);
@@ -222,13 +227,13 @@
     {
       if (serverChannelWidth == 0)
         {
-          serverChannelWidth = GetDefaultChannelWidth (WIFI_PHY_STANDARD_80211g, WIFI_PHY_BAND_2_4GHZ);
+          serverChannelWidth = GetDefaultChannelWidth (WIFI_STANDARD_80211g, WIFI_PHY_BAND_2_4GHZ);
         }
       NS_ABORT_MSG_IF (serverChannelWidth != 20, "Invalid channel width for standard " << standard);
       NS_ABORT_MSG_IF (serverNss != 1, "Invalid nss for standard " << standard);
       if (clientChannelWidth == 0)
         {
-          clientChannelWidth = GetDefaultChannelWidth (WIFI_PHY_STANDARD_80211g, WIFI_PHY_BAND_2_4GHZ);
+          clientChannelWidth = GetDefaultChannelWidth (WIFI_STANDARD_80211g, WIFI_PHY_BAND_2_4GHZ);
         }
       NS_ABORT_MSG_IF (clientChannelWidth != 20, "Invalid channel width for standard " << standard);
       NS_ABORT_MSG_IF (clientNss != 1, "Invalid nss for standard " << standard);
@@ -238,13 +243,13 @@
       WifiPhyBand band = (standard == "802.11n-2.4GHz" ? WIFI_PHY_BAND_2_4GHZ : WIFI_PHY_BAND_5GHZ);
       if (serverChannelWidth == 0)
         {
-          serverChannelWidth = GetDefaultChannelWidth (WIFI_PHY_STANDARD_80211n, band);
+          serverChannelWidth = GetDefaultChannelWidth (WIFI_STANDARD_80211n, band);
         }
       NS_ABORT_MSG_IF (serverChannelWidth != 20 && serverChannelWidth != 40, "Invalid channel width for standard " << standard);
       NS_ABORT_MSG_IF (serverNss == 0 || serverNss > 4, "Invalid nss " << serverNss << " for standard " << standard);
       if (clientChannelWidth == 0)
         {
-          clientChannelWidth = GetDefaultChannelWidth (WIFI_PHY_STANDARD_80211n, band);
+          clientChannelWidth = GetDefaultChannelWidth (WIFI_STANDARD_80211n, band);
         }
       NS_ABORT_MSG_IF (clientChannelWidth != 20 && clientChannelWidth != 40, "Invalid channel width for standard " << standard);
       NS_ABORT_MSG_IF (clientNss == 0 || clientNss > 4, "Invalid nss " << clientNss << " for standard " << standard);
@@ -253,13 +258,13 @@
     {
       if (serverChannelWidth == 0)
         {
-          serverChannelWidth = GetDefaultChannelWidth (WIFI_PHY_STANDARD_80211ac, WIFI_PHY_BAND_5GHZ);
+          serverChannelWidth = GetDefaultChannelWidth (WIFI_STANDARD_80211ac, WIFI_PHY_BAND_5GHZ);
         }
       NS_ABORT_MSG_IF (serverChannelWidth != 20 && serverChannelWidth != 40 && serverChannelWidth != 80 && serverChannelWidth != 160, "Invalid channel width for standard " << standard);
       NS_ABORT_MSG_IF (serverNss == 0 || serverNss > 4, "Invalid nss " << serverNss << " for standard " << standard);
       if (clientChannelWidth == 0)
         {
-          clientChannelWidth = GetDefaultChannelWidth (WIFI_PHY_STANDARD_80211ac, WIFI_PHY_BAND_5GHZ);
+          clientChannelWidth = GetDefaultChannelWidth (WIFI_STANDARD_80211ac, WIFI_PHY_BAND_5GHZ);
         }
       NS_ABORT_MSG_IF (clientChannelWidth != 20 && clientChannelWidth != 40 && clientChannelWidth != 80 && clientChannelWidth != 160, "Invalid channel width for standard " << standard);
       NS_ABORT_MSG_IF (clientNss == 0 || clientNss > 4, "Invalid nss " << clientNss << " for standard " << standard);
@@ -269,13 +274,13 @@
       WifiPhyBand band = (standard == "802.11ax-2.4GHz" ? WIFI_PHY_BAND_2_4GHZ : standard == "802.11ax-6GHz" ? WIFI_PHY_BAND_6GHZ : WIFI_PHY_BAND_5GHZ);
       if (serverChannelWidth == 0)
         {
-          serverChannelWidth = GetDefaultChannelWidth (WIFI_PHY_STANDARD_80211ax, band);
+          serverChannelWidth = GetDefaultChannelWidth (WIFI_STANDARD_80211ax, band);
         }
       NS_ABORT_MSG_IF (serverChannelWidth != 20 && serverChannelWidth != 40 && serverChannelWidth != 80 && serverChannelWidth != 160, "Invalid channel width for standard " << standard);
       NS_ABORT_MSG_IF (serverNss == 0 || serverNss > 4, "Invalid nss " << serverNss << " for standard " << standard);
       if (clientChannelWidth == 0)
         {
-          clientChannelWidth = GetDefaultChannelWidth (WIFI_PHY_STANDARD_80211ax, band);
+          clientChannelWidth = GetDefaultChannelWidth (WIFI_STANDARD_80211ax, band);
         }
       NS_ABORT_MSG_IF (clientChannelWidth != 20 && clientChannelWidth != 40 && clientChannelWidth != 80 && clientChannelWidth != 160, "Invalid channel width for standard " << standard);
       NS_ABORT_MSG_IF (clientNss == 0 || clientNss > 4, "Invalid nss " << clientNss << " for standard " << standard);
@@ -288,29 +293,29 @@
   // The first number is channel width, second is minimum SNR, third is maximum
   // SNR, fourth and fifth provide xrange axis limits, and sixth the yaxis
   // maximum
-  serverStandards.push_back (StandardInfo ("802.11a", WIFI_STANDARD_80211a, 20, 3, 27, 0, 30, 60));
-  serverStandards.push_back (StandardInfo ("802.11b", WIFI_STANDARD_80211b, 22, -5, 11, -6, 15, 15));
-  serverStandards.push_back (StandardInfo ("802.11g", WIFI_STANDARD_80211g, 20, -5, 27, -6, 30, 60));
-  serverStandards.push_back (StandardInfo ("802.11n-5GHz", WIFI_STANDARD_80211n_5GHZ, serverChannelWidth, 3, 30, 0, 35, 80 * channelRateFactor));
-  serverStandards.push_back (StandardInfo ("802.11n-2.4GHz", WIFI_STANDARD_80211n_2_4GHZ, serverChannelWidth, 3, 30, 0, 35, 80 * channelRateFactor));
-  serverStandards.push_back (StandardInfo ("802.11ac", WIFI_STANDARD_80211ac, serverChannelWidth, 5, 50, 0, 55, 120 * channelRateFactor));
-  serverStandards.push_back (StandardInfo ("802.11p-10MHz", WIFI_STANDARD_80211p, 10, 3, 27, 0, 30, 60));
-  serverStandards.push_back (StandardInfo ("802.11p-5MHz", WIFI_STANDARD_80211p, 5, 3, 27, 0, 30, 60));
-  serverStandards.push_back (StandardInfo ("802.11ax-6GHz", WIFI_STANDARD_80211ax_6GHZ, serverChannelWidth, 5, 55, 0, 60, 120 * channelRateFactor));
-  serverStandards.push_back (StandardInfo ("802.11ax-5GHz", WIFI_STANDARD_80211ax_5GHZ, serverChannelWidth, 5, 55, 0, 60, 120 * channelRateFactor));
-  serverStandards.push_back (StandardInfo ("802.11ax-2.4GHz", WIFI_STANDARD_80211ax_2_4GHZ, serverChannelWidth, 5, 55, 0, 60, 120 * channelRateFactor));
-
-  clientStandards.push_back (StandardInfo ("802.11a", WIFI_STANDARD_80211a, 20, 3, 27, 0, 30, 60));
-  clientStandards.push_back (StandardInfo ("802.11b", WIFI_STANDARD_80211b, 22, -5, 11, -6, 15, 15));
-  clientStandards.push_back (StandardInfo ("802.11g", WIFI_STANDARD_80211g, 20, -5, 27, -6, 30, 60));
-  clientStandards.push_back (StandardInfo ("802.11n-5GHz", WIFI_STANDARD_80211n_5GHZ, clientChannelWidth, 3, 30, 0, 35, 80 * channelRateFactor));
-  clientStandards.push_back (StandardInfo ("802.11n-2.4GHz", WIFI_STANDARD_80211n_2_4GHZ, clientChannelWidth, 3, 30, 0, 35, 80 * channelRateFactor));
-  clientStandards.push_back (StandardInfo ("802.11ac", WIFI_STANDARD_80211ac, clientChannelWidth, 5, 50, 0, 55, 120 * channelRateFactor));
-  clientStandards.push_back (StandardInfo ("802.11p-10MHz", WIFI_STANDARD_80211p, 10, 3, 27, 0, 30, 60));
-  clientStandards.push_back (StandardInfo ("802.11p-5MHz", WIFI_STANDARD_80211p, 5, 3, 27, 0, 30, 60));
-  clientStandards.push_back (StandardInfo ("802.11ax-6GHz", WIFI_STANDARD_80211ax_6GHZ, clientChannelWidth, 5, 55, 0, 60, 160 * channelRateFactor));
-  clientStandards.push_back (StandardInfo ("802.11ax-5GHz", WIFI_STANDARD_80211ax_5GHZ, clientChannelWidth, 5, 55, 0, 60, 160 * channelRateFactor));
-  clientStandards.push_back (StandardInfo ("802.11ax-2.4GHz", WIFI_STANDARD_80211ax_2_4GHZ, clientChannelWidth, 5, 55, 0, 60, 160 * channelRateFactor));
+  serverStandards.push_back (StandardInfo ("802.11a", WIFI_STANDARD_80211a, WIFI_PHY_BAND_5GHZ, 20, 3, 27, 0, 30, 60));
+  serverStandards.push_back (StandardInfo ("802.11b", WIFI_STANDARD_80211b, WIFI_PHY_BAND_2_4GHZ, 22, -5, 11, -6, 15, 15));
+  serverStandards.push_back (StandardInfo ("802.11g", WIFI_STANDARD_80211g, WIFI_PHY_BAND_2_4GHZ, 20, -5, 27, -6, 30, 60));
+  serverStandards.push_back (StandardInfo ("802.11n-5GHz", WIFI_STANDARD_80211n, WIFI_PHY_BAND_5GHZ,  serverChannelWidth, 3, 30, 0, 35, 80 * channelRateFactor));
+  serverStandards.push_back (StandardInfo ("802.11n-2.4GHz", WIFI_STANDARD_80211n, WIFI_PHY_BAND_2_4GHZ, serverChannelWidth, 3, 30, 0, 35, 80 * channelRateFactor));
+  serverStandards.push_back (StandardInfo ("802.11ac", WIFI_STANDARD_80211ac, WIFI_PHY_BAND_5GHZ, serverChannelWidth, 5, 50, 0, 55, 120 * channelRateFactor));
+  serverStandards.push_back (StandardInfo ("802.11p-10MHz", WIFI_STANDARD_80211p, WIFI_PHY_BAND_5GHZ, 10, 3, 27, 0, 30, 60));
+  serverStandards.push_back (StandardInfo ("802.11p-5MHz", WIFI_STANDARD_80211p, WIFI_PHY_BAND_5GHZ, 5, 3, 27, 0, 30, 60));
+  serverStandards.push_back (StandardInfo ("802.11ax-6GHz", WIFI_STANDARD_80211ax, WIFI_PHY_BAND_6GHZ, serverChannelWidth, 5, 55, 0, 60, 120 * channelRateFactor));
+  serverStandards.push_back (StandardInfo ("802.11ax-5GHz", WIFI_STANDARD_80211ax, WIFI_PHY_BAND_5GHZ, serverChannelWidth, 5, 55, 0, 60, 120 * channelRateFactor));
+  serverStandards.push_back (StandardInfo ("802.11ax-2.4GHz", WIFI_STANDARD_80211ax, WIFI_PHY_BAND_2_4GHZ, serverChannelWidth, 5, 55, 0, 60, 120 * channelRateFactor));
+
+  clientStandards.push_back (StandardInfo ("802.11a", WIFI_STANDARD_80211a, WIFI_PHY_BAND_5GHZ, 20, 3, 27, 0, 30, 60));
+  clientStandards.push_back (StandardInfo ("802.11b", WIFI_STANDARD_80211b, WIFI_PHY_BAND_2_4GHZ, 22, -5, 11, -6, 15, 15));
+  clientStandards.push_back (StandardInfo ("802.11g", WIFI_STANDARD_80211g, WIFI_PHY_BAND_2_4GHZ, 20, -5, 27, -6, 30, 60));
+  clientStandards.push_back (StandardInfo ("802.11n-5GHz", WIFI_STANDARD_80211n, WIFI_PHY_BAND_5GHZ,  clientChannelWidth, 3, 30, 0, 35, 80 * channelRateFactor));
+  clientStandards.push_back (StandardInfo ("802.11n-2.4GHz", WIFI_STANDARD_80211n, WIFI_PHY_BAND_2_4GHZ, clientChannelWidth, 3, 30, 0, 35, 80 * channelRateFactor));
+  clientStandards.push_back (StandardInfo ("802.11ac", WIFI_STANDARD_80211ac, WIFI_PHY_BAND_5GHZ, clientChannelWidth, 5, 50, 0, 55, 120 * channelRateFactor));
+  clientStandards.push_back (StandardInfo ("802.11p-10MHz", WIFI_STANDARD_80211p, WIFI_PHY_BAND_5GHZ, 10, 3, 27, 0, 30, 60));
+  clientStandards.push_back (StandardInfo ("802.11p-5MHz", WIFI_STANDARD_80211p, WIFI_PHY_BAND_5GHZ, 5, 3, 27, 0, 30, 60));
+  clientStandards.push_back (StandardInfo ("802.11ax-6GHz", WIFI_STANDARD_80211ax, WIFI_PHY_BAND_6GHZ, clientChannelWidth, 5, 55, 0, 60, 160 * channelRateFactor));
+  clientStandards.push_back (StandardInfo ("802.11ax-5GHz", WIFI_STANDARD_80211ax, WIFI_PHY_BAND_5GHZ, clientChannelWidth, 5, 55, 0, 60, 160 * channelRateFactor));
+  clientStandards.push_back (StandardInfo ("802.11ax-2.4GHz", WIFI_STANDARD_80211ax, WIFI_PHY_BAND_2_4GHZ, clientChannelWidth, 5, 55, 0, 60, 160 * channelRateFactor));
 
   for (std::vector<StandardInfo>::size_type i = 0; i != serverStandards.size (); i++)
     {
@@ -391,25 +396,35 @@
   NetDeviceContainer serverDevice;
   NetDeviceContainer clientDevice;
 
+  TupleValue<UintegerValue, UintegerValue, EnumValue, UintegerValue> channelValue;
+
   WifiMacHelper wifiMac;
   if (infrastructure)
     {
       Ssid ssid = Ssid ("ns-3-ssid");
       wifiMac.SetType ("ns3::StaWifiMac",
                        "Ssid", SsidValue (ssid));
-      wifiPhy.Set ("ChannelWidth", UintegerValue (serverSelectedStandard.m_width));
+      channelValue.Set (WifiPhy::ChannelTuple {0, serverSelectedStandard.m_width,
+                                               serverSelectedStandard.m_band, 0});
+      wifiPhy.Set ("ChannelSettings", channelValue);
       serverDevice = wifi.Install (wifiPhy, wifiMac, serverNode);
+
       wifiMac.SetType ("ns3::ApWifiMac",
                        "Ssid", SsidValue (ssid));
-      wifiPhy.Set ("ChannelWidth", UintegerValue (clientSelectedStandard.m_width));
+      channelValue.Set (WifiPhy::ChannelTuple {0, clientSelectedStandard.m_width,
+                                               clientSelectedStandard.m_band, 0});
       clientDevice = wifi.Install (wifiPhy, wifiMac, clientNode);
     }
   else
     {
       wifiMac.SetType ("ns3::AdhocWifiMac");
-      wifiPhy.Set ("ChannelWidth", UintegerValue (serverSelectedStandard.m_width));
+      channelValue.Set (WifiPhy::ChannelTuple {0, serverSelectedStandard.m_width,
+                                               serverSelectedStandard.m_band, 0});
+      wifiPhy.Set ("ChannelSettings", channelValue);
       serverDevice = wifi.Install (wifiPhy, wifiMac, serverNode);
-      wifiPhy.Set ("ChannelWidth", UintegerValue (clientSelectedStandard.m_width));
+
+      channelValue.Set (WifiPhy::ChannelTuple {0, clientSelectedStandard.m_width,
+                                               clientSelectedStandard.m_band, 0});
       clientDevice = wifi.Install (wifiPhy, wifiMac, clientNode);
     }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/examples/wifi-phy-configuration.cc ns-3.36/src/wifi/examples/wifi-phy-configuration.cc
--- ns-3.35/src/wifi/examples/wifi-phy-configuration.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/examples/wifi-phy-configuration.cc	2022-04-30 18:23:58.198735200 -0700
@@ -112,7 +112,7 @@
     // i.e. without further channel number/width/frequency configuration
 
     case 1:
-      // By default, WifiHelper will use WIFI_STANDARD_80211a
+      wifi.SetStandard (WIFI_STANDARD_80211a);
       staDevice = wifi.Install (phy, macSta, wifiStaNode.Get (0));
       apDevice = wifi.Install (phy, macAp, wifiApNode.Get (0));
       phySta = GetYansWifiPhyPtr (staDevice);
@@ -145,7 +145,8 @@
       PrintAttributesIfEnabled (printAttributes);
       break;
     case 4:
-      wifi.SetStandard (WIFI_STANDARD_80211n_5GHZ);
+      wifi.SetStandard (WIFI_STANDARD_80211n);
+      phy.Set ("ChannelSettings", StringValue ("{0, 0, BAND_5GHZ, 0}"));
       staDevice = wifi.Install (phy, macSta, wifiStaNode.Get (0));
       apDevice = wifi.Install (phy, macAp, wifiApNode.Get (0));
       phySta = GetYansWifiPhyPtr (staDevice);
@@ -156,7 +157,7 @@
       PrintAttributesIfEnabled (printAttributes);
       break;
     case 5:
-      wifi.SetStandard (WIFI_STANDARD_80211n_2_4GHZ);
+      wifi.SetStandard (WIFI_STANDARD_80211n);
       staDevice = wifi.Install (phy, macSta, wifiStaNode.Get (0));
       apDevice = wifi.Install (phy, macAp, wifiApNode.Get (0));
       phySta = GetYansWifiPhyPtr (staDevice);
@@ -178,7 +179,9 @@
       PrintAttributesIfEnabled (printAttributes);
       break;
     case 7:
-      wifi.SetStandard (WIFI_STANDARD_80211ax_2_4GHZ);
+      // By default, WifiHelper will use WIFI_STANDARD_80211ax
+      wifi.SetStandard (WIFI_STANDARD_80211ax);
+      phy.Set ("ChannelSettings", StringValue ("{0, 0, BAND_2_4GHZ, 0}"));
       staDevice = wifi.Install (phy, macSta, wifiStaNode.Get (0));
       apDevice = wifi.Install (phy, macAp, wifiApNode.Get (0));
       phySta = GetYansWifiPhyPtr (staDevice);
@@ -189,7 +192,7 @@
       PrintAttributesIfEnabled (printAttributes);
       break;
     case 8:
-      wifi.SetStandard (WIFI_STANDARD_80211ax_5GHZ);
+      wifi.SetStandard (WIFI_STANDARD_80211ax);
       staDevice = wifi.Install (phy, macSta, wifiStaNode.Get (0));
       apDevice = wifi.Install (phy, macAp, wifiApNode.Get (0));
       phySta = GetYansWifiPhyPtr (staDevice);
@@ -200,7 +203,8 @@
       PrintAttributesIfEnabled (printAttributes);
       break;
     case 9:
-      wifi.SetStandard (WIFI_STANDARD_80211ax_6GHZ);
+      wifi.SetStandard (WIFI_STANDARD_80211ax);
+      phy.Set ("ChannelSettings", StringValue ("{0, 0, BAND_6GHZ, 0}"));
       staDevice = wifi.Install (phy, macSta, wifiStaNode.Get (0));
       apDevice = wifi.Install (phy, macAp, wifiApNode.Get (0));
       phySta = GetYansWifiPhyPtr (staDevice);
@@ -212,7 +216,7 @@
       break;
     case 10:
       wifi.SetStandard (WIFI_STANDARD_80211p);
-      phy.Set ("ChannelWidth", UintegerValue (10));
+      phy.Set ("ChannelSettings", StringValue ("{0, 10, BAND_5GHZ, 0}"));
       staDevice = wifi.Install (phy, macSta, wifiStaNode.Get (0));
       apDevice = wifi.Install (phy, macAp, wifiApNode.Get (0));
       phySta = GetYansWifiPhyPtr (staDevice);
@@ -224,7 +228,7 @@
       break;
     case 11:
       wifi.SetStandard (WIFI_STANDARD_80211p);
-      phy.Set ("ChannelWidth", UintegerValue (5));
+      phy.Set ("ChannelSettings", StringValue ("{0, 5, BAND_5GHZ, 0}"));
       staDevice = wifi.Install (phy, macSta, wifiStaNode.Get (0));
       apDevice = wifi.Install (phy, macAp, wifiApNode.Get (0));
       phySta = GetYansWifiPhyPtr (staDevice);
@@ -235,8 +239,8 @@
       PrintAttributesIfEnabled (printAttributes);
       break;
     case 12:
-      wifi.SetStandard (WIFI_STANDARD_80211n_5GHZ);
-      phy.Set ("ChannelNumber", UintegerValue (44));
+      wifi.SetStandard (WIFI_STANDARD_80211n);
+      phy.Set ("ChannelSettings", StringValue ("{44, 20, BAND_5GHZ, 0}"));
       staDevice = wifi.Install (phy, macSta, wifiStaNode.Get (0));
       apDevice = wifi.Install (phy, macAp, wifiApNode.Get (0));
       phySta = GetYansWifiPhyPtr (staDevice);
@@ -247,14 +251,14 @@
       PrintAttributesIfEnabled (printAttributes);
       break;
     case 13:
-      wifi.SetStandard (WIFI_STANDARD_80211n_5GHZ);
-      phy.Set ("ChannelNumber", UintegerValue (44));
+      wifi.SetStandard (WIFI_STANDARD_80211n);
+      phy.Set ("ChannelSettings", StringValue ("{44, 0, BAND_5GHZ, 0}"));
       staDevice = wifi.Install (phy, macSta, wifiStaNode.Get (0));
       apDevice = wifi.Install (phy, macAp, wifiApNode.Get (0));
       phySta = GetYansWifiPhyPtr (staDevice);
       // Post-install reconfiguration to channel number 40
-      Config::Set ("/NodeList/0/DeviceList/*/$ns3::WifiNetDevice/Phy/$ns3::YansWifiPhy/ChannelNumber", UintegerValue (40));
-      Config::Set ("/NodeList/1/DeviceList/*/$ns3::WifiNetDevice/Phy/$ns3::YansWifiPhy/ChannelNumber", UintegerValue (40));
+      Config::Set ("/NodeList/0/DeviceList/*/$ns3::WifiNetDevice/Phy/$ns3::YansWifiPhy/ChannelSettings", StringValue ("{40, 0, BAND_5GHZ, 0}"));
+      Config::Set ("/NodeList/1/DeviceList/*/$ns3::WifiNetDevice/Phy/$ns3::YansWifiPhy/ChannelSettings", StringValue ("{40, 0, BAND_5GHZ, 0}"));
       // We expect channel 40, width 20, frequency 5200
       NS_ASSERT (phySta->GetChannelNumber () == 40);
       NS_ASSERT (phySta->GetChannelWidth () == 20);
@@ -262,37 +266,37 @@
       PrintAttributesIfEnabled (printAttributes);
       break;
     case 14:
-      wifi.SetStandard (WIFI_STANDARD_80211n_5GHZ);
-      phy.Set ("ChannelNumber", UintegerValue (44));
+      wifi.SetStandard (WIFI_STANDARD_80211n);
+      phy.Set ("ChannelSettings", StringValue ("{44, 0, BAND_5GHZ, 0}"));
       staDevice = wifi.Install (phy, macSta, wifiStaNode.Get (0));
       apDevice = wifi.Install (phy, macAp, wifiApNode.Get (0));
       phySta = GetYansWifiPhyPtr (staDevice);
       // Post-install reconfiguration to a 40 MHz channel
-      Config::Set ("/NodeList/0/DeviceList/*/$ns3::WifiNetDevice/Phy/$ns3::YansWifiPhy/ChannelNumber", UintegerValue (46));
-      Config::Set ("/NodeList/1/DeviceList/*/$ns3::WifiNetDevice/Phy/$ns3::YansWifiPhy/ChannelNumber", UintegerValue (46));
+      Config::Set ("/NodeList/0/DeviceList/*/$ns3::WifiNetDevice/Phy/$ns3::YansWifiPhy/ChannelSettings", StringValue ("{46, 0, BAND_5GHZ, 0}"));
+      Config::Set ("/NodeList/1/DeviceList/*/$ns3::WifiNetDevice/Phy/$ns3::YansWifiPhy/ChannelSettings", StringValue ("{46, 0, BAND_5GHZ, 0}"));
       NS_ASSERT (phySta->GetChannelNumber () == 46);
       NS_ASSERT (phySta->GetChannelWidth () == 40);
       NS_ASSERT (phySta->GetFrequency () == 5230);
       PrintAttributesIfEnabled (printAttributes);
       break;
     case 15:
-      Config::SetDefault ("ns3::WifiPhy::ChannelNumber", UintegerValue (44));
-      wifi.SetStandard (WIFI_STANDARD_80211n_5GHZ);
+      Config::SetDefault ("ns3::WifiPhy::ChannelSettings", StringValue ("{44, 0, BAND_5GHZ, 0}"));
+      wifi.SetStandard (WIFI_STANDARD_80211n);
       staDevice = wifi.Install (phy, macSta, wifiStaNode.Get (0));
       apDevice = wifi.Install (phy, macAp, wifiApNode.Get (0));
       phySta = GetYansWifiPhyPtr (staDevice);
       // Post-install reconfiguration to a 40 MHz channel
-      Config::Set ("/NodeList/0/DeviceList/*/$ns3::WifiNetDevice/Phy/$ns3::YansWifiPhy/ChannelNumber", UintegerValue (46));
-      Config::Set ("/NodeList/1/DeviceList/*/$ns3::WifiNetDevice/Phy/$ns3::YansWifiPhy/ChannelNumber", UintegerValue (46));
+      Config::Set ("/NodeList/0/DeviceList/*/$ns3::WifiNetDevice/Phy/$ns3::YansWifiPhy/ChannelSettings", StringValue ("{46, 0, BAND_5GHZ, 0}"));
+      Config::Set ("/NodeList/1/DeviceList/*/$ns3::WifiNetDevice/Phy/$ns3::YansWifiPhy/ChannelSettings", StringValue ("{46, 0, BAND_5GHZ, 0}"));
       NS_ASSERT (phySta->GetChannelNumber () == 46);
       NS_ASSERT (phySta->GetChannelWidth () == 40);
       NS_ASSERT (phySta->GetFrequency () == 5230);
       PrintAttributesIfEnabled (printAttributes);
       break;
     case 16:
-      // Test that setting Frequency to a non-standard value will throw an exception
-      Config::SetDefault ("ns3::WifiPhy::Frequency", UintegerValue (5281));
-      wifi.SetStandard (WIFI_STANDARD_80211n_5GHZ);
+      // Test that setting channel number to a non-standard value will throw an exception
+      Config::SetDefault ("ns3::WifiPhy::ChannelSettings", StringValue ("{45, 0, BAND_5GHZ, 0}"));
+      wifi.SetStandard (WIFI_STANDARD_80211n);
       exceptionThrown = false;
       try
         {
@@ -318,8 +322,8 @@
     case 17:
       // Test that setting Frequency to a standard value will set the
       // channel number correctly
-      Config::SetDefault ("ns3::WifiPhy::Frequency", UintegerValue (5500));
-      wifi.SetStandard (WIFI_STANDARD_80211n_5GHZ);
+      Config::SetDefault ("ns3::WifiPhy::ChannelSettings", StringValue ("{100, 0, BAND_5GHZ, 0}"));
+      wifi.SetStandard (WIFI_STANDARD_80211n);
       staDevice = wifi.Install (phy, macSta, wifiStaNode.Get (0));
       apDevice = wifi.Install (phy, macAp, wifiApNode.Get (0));
       phySta = GetYansWifiPhyPtr (staDevice);
@@ -331,14 +335,14 @@
       break;
     case 18:
       // Set a wrong channel after initialization
-      wifi.SetStandard (WIFI_STANDARD_80211n_5GHZ);
+      wifi.SetStandard (WIFI_STANDARD_80211n);
       staDevice = wifi.Install (phy, macSta, wifiStaNode.Get (0));
       apDevice = wifi.Install (phy, macAp, wifiApNode.Get (0));
       phySta = GetYansWifiPhyPtr (staDevice);
       exceptionThrown = false;
       try
         {
-          phySta->SetOperatingChannel (99, 5185, 40);
+          phySta->SetOperatingChannel (WifiPhy::ChannelTuple {99, 40, WIFI_PHY_BAND_5GHZ, 0});
         }
       catch (const std::runtime_error&)
         {
@@ -349,22 +353,23 @@
       break;
     case 19:
       // Test how channel number behaves when frequency is non-standard
-      wifi.SetStandard (WIFI_STANDARD_80211n_5GHZ);
+      wifi.SetStandard (WIFI_STANDARD_80211n);
+      phy.Set ("ChannelSettings", StringValue ("{44, 0, BAND_5GHZ, 0}"));
       staDevice = wifi.Install (phy, macSta, wifiStaNode.Get (0));
       apDevice = wifi.Install (phy, macAp, wifiApNode.Get (0));
       phySta = GetYansWifiPhyPtr (staDevice);
       exceptionThrown = false;
       try
         {
-          phySta->SetAttribute ("Frequency", UintegerValue (5181));
+          phySta->SetAttribute ("ChannelSettings", StringValue ("{45, 0, BAND_5GHZ, 0}"));
         }
       catch (const std::runtime_error&)
         {
           exceptionThrown = true;
         }
-      // We expect that an exception is thrown due to unknown center frequency 5181
+      // We expect that an exception is thrown due to unknown channel number 45
       NS_ASSERT (exceptionThrown);
-      phySta->SetAttribute ("Frequency", UintegerValue (5180));
+      phySta->SetAttribute ("ChannelSettings", StringValue ("{36, 0, BAND_5GHZ, 0}"));
       // We expect channel number to be 36 due to known center frequency 5180
       NS_ASSERT (phySta->GetChannelNumber () == 36);
       NS_ASSERT (phySta->GetChannelWidth () == 20);
@@ -372,15 +377,15 @@
       exceptionThrown = false;
       try
         {
-          phySta->SetAttribute ("Frequency", UintegerValue (5179));
+          phySta->SetAttribute ("ChannelSettings", StringValue ("{43, 0, BAND_5GHZ, 0}"));
         }
       catch (const std::runtime_error&)
         {
           exceptionThrown = true;
         }
-      // We expect that an exception is thrown due to unknown center frequency 5179
+      // We expect that an exception is thrown due to unknown channel number 43
       NS_ASSERT (exceptionThrown);
-      phySta->SetAttribute ("ChannelNumber", UintegerValue (36));
+      phySta->SetAttribute ("ChannelSettings", StringValue ("{36, 0, BAND_5GHZ, 0}"));
       NS_ASSERT (phySta->GetChannelNumber () == 36);
       NS_ASSERT (phySta->GetChannelWidth () == 20);
       NS_ASSERT (phySta->GetFrequency () == 5180);
@@ -388,9 +393,8 @@
       break;
     case 20:
       // Set both channel and frequency to consistent values before initialization
-      Config::SetDefault ("ns3::WifiPhy::Frequency", UintegerValue (5200));
-      Config::SetDefault ("ns3::WifiPhy::ChannelNumber", UintegerValue (40));
-      wifi.SetStandard (WIFI_STANDARD_80211n_5GHZ);
+      Config::SetDefault ("ns3::WifiPhy::ChannelSettings", StringValue ("{40, 0, BAND_5GHZ, 0}"));
+      wifi.SetStandard (WIFI_STANDARD_80211n);
       staDevice = wifi.Install (phy, macSta, wifiStaNode.Get (0));
       apDevice = wifi.Install (phy, macAp, wifiApNode.Get (0));
       phySta = GetYansWifiPhyPtr (staDevice);
@@ -398,48 +402,34 @@
       NS_ASSERT (phySta->GetChannelWidth () == 20);
       NS_ASSERT (phySta->GetFrequency () == 5200);
       // Set both channel and frequency to consistent values after initialization
-      wifi.SetStandard (WIFI_STANDARD_80211n_5GHZ);
+      wifi.SetStandard (WIFI_STANDARD_80211n);
       staDevice = wifi.Install (phy, macSta, wifiStaNode.Get (0));
       apDevice = wifi.Install (phy, macAp, wifiApNode.Get (0));
       phySta = GetYansWifiPhyPtr (staDevice);
-      phySta->SetAttribute ("Frequency", UintegerValue (5200));
-      phySta->SetAttribute ("ChannelNumber", UintegerValue (40));
-      NS_ASSERT (phySta->GetChannelNumber () == 40);
-      NS_ASSERT (phySta->GetChannelWidth () == 20);
-      NS_ASSERT (phySta->GetFrequency () == 5200);
-      // Set both channel and frequency to inconsistent values
-      phySta->SetAttribute ("Frequency", UintegerValue (5200));
-      phySta->SetAttribute ("ChannelNumber", UintegerValue (36));
-      // We expect channel number to be 36
-      NS_ASSERT (phySta->GetChannelNumber () == 36);
-      NS_ASSERT (phySta->GetChannelWidth () == 20);
-      NS_ASSERT (phySta->GetFrequency () == 5180);
-      phySta->SetAttribute ("ChannelNumber", UintegerValue (36));
-      phySta->SetAttribute ("Frequency", UintegerValue (5200));
-      // We expect channel number to be 40
+      phySta->SetAttribute ("ChannelSettings", StringValue ("{40, 0, BAND_5GHZ, 0}"));
       NS_ASSERT (phySta->GetChannelNumber () == 40);
       NS_ASSERT (phySta->GetChannelWidth () == 20);
       NS_ASSERT (phySta->GetFrequency () == 5200);
       exceptionThrown = false;
       try
         {
-          phySta->SetAttribute ("Frequency", UintegerValue (5179));
+          phySta->SetAttribute ("ChannelSettings", StringValue ("{45, 0, BAND_5GHZ, 0}"));
         }
       catch (const std::runtime_error&)
         {
           exceptionThrown = true;
         }
-      phySta->SetAttribute ("ChannelNumber", UintegerValue (36));
+      phySta->SetAttribute ("ChannelSettings", StringValue ("{36, 0, BAND_5GHZ, 0}"));
       // We expect channel number to be 36 and an exception to be thrown
       NS_ASSERT (phySta->GetChannelNumber () == 36);
       NS_ASSERT (phySta->GetChannelWidth () == 20);
       NS_ASSERT (phySta->GetFrequency () == 5180);
       NS_ASSERT (exceptionThrown);
-      phySta->SetAttribute ("ChannelNumber", UintegerValue (36));
+      phySta->SetAttribute ("ChannelSettings", StringValue ("{36, 0, BAND_5GHZ, 0}"));
       exceptionThrown = false;
       try
         {
-          phySta->SetAttribute ("Frequency", UintegerValue (5179));
+          phySta->SetAttribute ("ChannelSettings", StringValue ("{43, 0, BAND_5GHZ, 0}"));
         }
       catch (const std::runtime_error&)
         {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/examples/wifi-phy-test.cc ns-3.36/src/wifi/examples/wifi-phy-test.cc
--- ns-3.35/src/wifi/examples/wifi-phy-test.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/examples/wifi-phy-test.cc	2022-04-30 18:23:58.198735200 -0700
@@ -134,8 +134,8 @@
   tx->SetMobility (posTx);
   rx->SetMobility (posRx);
 
-  tx->ConfigureStandardAndBand (WIFI_PHY_STANDARD_80211a, WIFI_PHY_BAND_5GHZ);
-  rx->ConfigureStandardAndBand (WIFI_PHY_STANDARD_80211a, WIFI_PHY_BAND_5GHZ);
+  tx->ConfigureStandard (WIFI_STANDARD_80211a);
+  rx->ConfigureStandard (WIFI_STANDARD_80211a);
 
   rx->SetReceiveOkCallback (MakeCallback (&PsrExperiment::Receive, this));
 
@@ -300,9 +300,9 @@
   txB->SetMobility (posTxB);
   rx->SetMobility (posRx);
 
-  txA->ConfigureStandardAndBand (WIFI_PHY_STANDARD_80211a, WIFI_PHY_BAND_5GHZ);
-  txB->ConfigureStandardAndBand (WIFI_PHY_STANDARD_80211a, WIFI_PHY_BAND_5GHZ);
-  rx->ConfigureStandardAndBand (WIFI_PHY_STANDARD_80211a, WIFI_PHY_BAND_5GHZ);
+  txA->ConfigureStandard (WIFI_STANDARD_80211a);
+  txB->ConfigureStandard (WIFI_STANDARD_80211a);
+  rx->ConfigureStandard (WIFI_STANDARD_80211a);
 
   rx->SetReceiveOkCallback (MakeCallback (&CollisionExperiment::Receive, this));
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/examples/wifi-test-interference-helper.cc ns-3.36/src/wifi/examples/wifi-test-interference-helper.cc
--- ns-3.35/src/wifi/examples/wifi-test-interference-helper.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/examples/wifi-test-interference-helper.cc	2022-04-30 18:23:58.198735200 -0700
@@ -96,7 +96,7 @@
     uint16_t channelB; ///< channel number B
     uint16_t widthA; ///< channel width A
     uint16_t widthB; ///< channel width B
-    WifiPhyStandard standard; ///< standard
+    WifiStandard standard; ///< standard
     WifiPhyBand band; ///< band
     WifiPreamble preamble; ///< preamble
     bool captureEnabled; ///< whether physical layer capture is enabled
@@ -202,7 +202,7 @@
     channelB (36),
     widthA (20),
     widthB (20),
-    standard (WIFI_PHY_STANDARD_80211a),
+    standard (WIFI_STANDARD_80211a),
     band (WIFI_PHY_BAND_5GHZ),
     preamble (WIFI_PREAMBLE_LONG),
     captureEnabled (false),
@@ -269,9 +269,9 @@
       rx->SetFrameCaptureModel (frameCaptureModel);
     }
 
-  m_txA->ConfigureStandardAndBand (input.standard, input.band);
-  m_txB->ConfigureStandardAndBand (input.standard, input.band);
-  rx->ConfigureStandardAndBand (input.standard, input.band);
+  m_txA->ConfigureStandard (input.standard);
+  m_txB->ConfigureStandard (input.standard);
+  rx->ConfigureStandard (input.standard);
 
   devA->SetPhy (m_txA);
   nodeA->AddDevice (devA);
@@ -280,9 +280,10 @@
   devRx->SetPhy (rx);
   nodeRx->AddDevice (devRx);
 
-  m_txA->SetChannelNumber (input.channelA);
-  m_txB->SetChannelNumber (input.channelB);
-  rx->SetChannelNumber (std::max (input.channelA, input.channelB));
+  m_txA->SetOperatingChannel (WifiPhy::ChannelTuple {input.channelA, 0, (int)(input.band), 0});
+  m_txB->SetOperatingChannel (WifiPhy::ChannelTuple {input.channelB, 0, (int)(input.band), 0});
+  rx->SetOperatingChannel (WifiPhy::ChannelTuple {std::max (input.channelA, input.channelB), 0,
+                                                  (int)(input.band), 0});
 
   rx->TraceConnectWithoutContext ("PhyRxDrop", MakeCallback (&InterferenceExperiment::PacketDropped, this));
 
@@ -342,62 +343,62 @@
 
   if (str_standard == "WIFI_PHY_STANDARD_80211a")
     {
-      input.standard = WIFI_PHY_STANDARD_80211a;
+      input.standard = WIFI_STANDARD_80211a;
       input.band = WIFI_PHY_BAND_5GHZ;
     }
   else if (str_standard == "WIFI_PHY_STANDARD_80211b")
     {
-      input.standard = WIFI_PHY_STANDARD_80211b;
+      input.standard = WIFI_STANDARD_80211b;
       input.band = WIFI_PHY_BAND_2_4GHZ;
     }
   else if (str_standard == "WIFI_PHY_STANDARD_80211g")
     {
-      input.standard = WIFI_PHY_STANDARD_80211g;
+      input.standard = WIFI_STANDARD_80211g;
       input.band = WIFI_PHY_BAND_2_4GHZ;
     }
   else if (str_standard == "WIFI_PHY_STANDARD_80211n_2_4GHZ")
     {
-      input.standard = WIFI_PHY_STANDARD_80211n;
+      input.standard = WIFI_STANDARD_80211n;
       input.band = WIFI_PHY_BAND_2_4GHZ;
     }
   else if (str_standard == "WIFI_PHY_STANDARD_80211n_5GHZ")
     {
-      input.standard = WIFI_PHY_STANDARD_80211n;
+      input.standard = WIFI_STANDARD_80211n;
       input.band = WIFI_PHY_BAND_5GHZ;
     }
   else if (str_standard == "WIFI_PHY_STANDARD_80211ac")
     {
-      input.standard = WIFI_PHY_STANDARD_80211ac;
+      input.standard = WIFI_STANDARD_80211ac;
       input.band = WIFI_PHY_BAND_5GHZ;
     }
   else if (str_standard == "WIFI_PHY_STANDARD_80211ax_2_4GHZ")
     {
-      input.standard = WIFI_PHY_STANDARD_80211ax;
+      input.standard = WIFI_STANDARD_80211ax;
       input.band = WIFI_PHY_BAND_2_4GHZ;
     }
   else if (str_standard == "WIFI_PHY_STANDARD_80211ax_5GHZ")
     {
-      input.standard = WIFI_PHY_STANDARD_80211ax;
+      input.standard = WIFI_STANDARD_80211ax;
       input.band = WIFI_PHY_BAND_5GHZ;
     }
 
-  if (str_preamble == "WIFI_PREAMBLE_LONG" && (input.standard == WIFI_PHY_STANDARD_80211a || input.standard == WIFI_PHY_STANDARD_80211b || input.standard == WIFI_PHY_STANDARD_80211g))
+  if (str_preamble == "WIFI_PREAMBLE_LONG" && (input.standard == WIFI_STANDARD_80211a || input.standard == WIFI_STANDARD_80211b || input.standard == WIFI_STANDARD_80211g))
     {
       input.preamble = WIFI_PREAMBLE_LONG;
     }
-  else if (str_preamble == "WIFI_PREAMBLE_SHORT" && (input.standard == WIFI_PHY_STANDARD_80211b || input.standard == WIFI_PHY_STANDARD_80211g))
+  else if (str_preamble == "WIFI_PREAMBLE_SHORT" && (input.standard == WIFI_STANDARD_80211b || input.standard == WIFI_STANDARD_80211g))
     {
       input.preamble = WIFI_PREAMBLE_SHORT;
     }
-  else if (str_preamble == "WIFI_PREAMBLE_HT_MF" && input.standard == WIFI_PHY_STANDARD_80211n)
+  else if (str_preamble == "WIFI_PREAMBLE_HT_MF" && input.standard == WIFI_STANDARD_80211n)
     {
       input.preamble = WIFI_PREAMBLE_HT_MF;
     }
-  else if (str_preamble == "WIFI_PREAMBLE_VHT_SU" && input.standard == WIFI_PHY_STANDARD_80211ac)
+  else if (str_preamble == "WIFI_PREAMBLE_VHT_SU" && input.standard == WIFI_STANDARD_80211ac)
     {
       input.preamble = WIFI_PREAMBLE_VHT_SU;
     }
-  else if (str_preamble == "WIFI_PREAMBLE_HE_SU" && input.standard == WIFI_PHY_STANDARD_80211ax)
+  else if (str_preamble == "WIFI_PREAMBLE_HE_SU" && input.standard == WIFI_STANDARD_80211ax)
     {
       input.preamble = WIFI_PREAMBLE_HE_SU;
     }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/examples/wifi-trans-example.cc ns-3.36/src/wifi/examples/wifi-trans-example.cc
--- ns-3.35/src/wifi/examples/wifi-trans-example.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/examples/wifi-trans-example.cc	2022-04-30 18:23:58.198735200 -0700
@@ -114,7 +114,7 @@
     }
   else if (standard == "11n_2_4GHZ")
     {
-      wifi.SetStandard (WIFI_STANDARD_80211n_2_4GHZ);
+      wifi.SetStandard (WIFI_STANDARD_80211n);
       ssid = Ssid ("ns380211n_2_4GHZ");
       dataRate = "HtMcs0";
       freq = 2402 + (bw / 2); //so as to have 2412/2422 for 20/40
@@ -128,7 +128,7 @@
     }
   else if (standard == "11n_5GHZ")
     {
-      wifi.SetStandard (WIFI_STANDARD_80211n_5GHZ);
+      wifi.SetStandard (WIFI_STANDARD_80211n);
       ssid = Ssid ("ns380211n_5GHZ");
       dataRate = "HtMcs0";
       freq = 5170 + (bw / 2); //so as to have 5180/5190 for 20/40
@@ -155,7 +155,7 @@
     }
   else if (standard == "11ax_2_4GHZ")
     {
-      wifi.SetStandard (WIFI_STANDARD_80211ax_2_4GHZ);
+      wifi.SetStandard (WIFI_STANDARD_80211ax);
       ssid = Ssid ("ns380211ax_2_4GHZ");
       dataRate = "HeMcs0";
       freq = 2402 + (bw / 2); //so as to have 2412/2422/2442 for 20/40/80
@@ -169,7 +169,7 @@
     }
   else if (standard == "11ax_5GHZ")
     {
-      wifi.SetStandard (WIFI_STANDARD_80211ax_5GHZ);
+      wifi.SetStandard (WIFI_STANDARD_80211ax);
       ssid = Ssid ("ns380211ax_5GHZ");
       dataRate = "HeMcs0";
       freq = 5170 + (bw / 2); //so as to have 5180/5190/5210/5250 for 20/40/80/160
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/examples/wifi-trans-example.sh ns-3.36/src/wifi/examples/wifi-trans-example.sh
--- ns-3.35/src/wifi/examples/wifi-trans-example.sh	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/examples/wifi-trans-example.sh	2022-04-30 18:23:58.198735200 -0700
@@ -32,14 +32,14 @@
 }
 trap control_c SIGINT
 
-#Save waf and script locations. Have to be run from where they are (otherwise won't find executables)
+#Save ns3 and script locations. Have to be run from where they are (otherwise won't find executables)
 scriptDir=`pwd`
 cd ../../../
-wafDir=`pwd`
+ns3Dir=`pwd`
 cd $scriptDir
 
 #Test where script is run from
-if test ! -f ${wafDir}/waf ; then
+if test ! -f ${ns3Dir}/ns3 ; then
   echo "Please run this script from within the directory `dirname $0`, like this:"
   echo "cd `dirname $0`"
   echo "./`basename $0`"
@@ -75,8 +75,8 @@
     bw=${bw_leg[${i}]}
     echo "==============================================="
     echo "Run for wifi-trans-example for ${std} and ${bw} MHz"
-    cd $wafDir
-    ./waf --run "wifi-trans-example --standard=$std --bw=$bw"
+    cd $ns3Dir
+    ./ns3 run "wifi-trans-example --standard=$std --bw=$bw"
     echo "Generate PSD using ${file}.tr"
     file="${pre}${std}-${bw}MHz${suf}"
     gnuplot ${file}.plt
@@ -98,8 +98,8 @@
   do
     echo "==============================================="
     echo "Run for wifi-trans-example for ${std} and ${bw} MHz"
-    cd $wafDir
-    ./waf --run "wifi-trans-example --standard=$std --bw=$bw"
+    cd $ns3Dir
+    ./ns3 run "wifi-trans-example --standard=$std --bw=$bw"
     echo "Generate PSD using ${file}.tr"
     file="${pre}${std}-${bw}MHz${suf}"
     gnuplot ${file}.plt
@@ -125,8 +125,8 @@
     #for all other combinations continue
     echo "==============================================="
     echo "Run for wifi-trans-example for ${std} and ${bw} MHz"
-    cd $wafDir
-    ./waf --run "wifi-trans-example --standard=$std --bw=$bw"
+    cd $ns3Dir
+    ./ns3 run "wifi-trans-example --standard=$std --bw=$bw"
     echo "Generate PSD using ${file}.tr"
     file="${pre}${std}-${bw}MHz${suf}"
     gnuplot ${file}.plt
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/examples/wscript ns-3.36/src/wifi/examples/wscript
--- ns-3.35/src/wifi/examples/wscript	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/examples/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,29 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    if not bld.env['ENABLE_EXAMPLES']:
-        return;
-
-    obj = bld.create_ns3_program('wifi-phy-test',
-        ['wifi'])
-    obj.source = 'wifi-phy-test.cc'
-
-    obj = bld.create_ns3_program('wifi-test-interference-helper',
-        ['wifi'])
-    obj.source = 'wifi-test-interference-helper.cc'
-
-    obj = bld.create_ns3_program('wifi-manager-example',
-        ['wifi'])
-    obj.source = 'wifi-manager-example.cc'
-
-    obj = bld.create_ns3_program('wifi-trans-example',
-        ['wifi'])
-    obj.source = 'wifi-trans-example.cc'
-
-    obj = bld.create_ns3_program('wifi-phy-configuration',
-        ['wifi', 'config-store'])
-    obj.source = 'wifi-phy-configuration.cc'
-
-    obj = bld.create_ns3_program('wifi-bianchi',
-        ['wifi', 'applications', 'internet-apps' ])
-    obj.source = 'wifi-bianchi.cc'
\ No newline at end of file
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/helper/athstats-helper.h ns-3.36/src/wifi/helper/athstats-helper.h
--- ns-3.35/src/wifi/helper/athstats-helper.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/helper/athstats-helper.h	2022-04-30 18:23:58.198735200 -0700
@@ -21,6 +21,13 @@
 #ifndef ATHSTATS_HELPER_H
 #define ATHSTATS_HELPER_H
 
+#include <stdint.h>
+#include <iosfwd>
+#include <string>
+#include "ns3/nstime.h"
+#include "ns3/object.h"
+#include "ns3/ptr.h"
+#include "ns3/type-id.h"
 #include "ns3/wifi-phy-state.h"
 #include "ns3/wifi-phy-common.h"
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/helper/spectrum-wifi-helper.cc ns-3.36/src/wifi/helper/spectrum-wifi-helper.cc
--- ns-3.35/src/wifi/helper/spectrum-wifi-helper.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/helper/spectrum-wifi-helper.cc	2022-04-30 18:23:58.198735200 -0700
@@ -26,6 +26,7 @@
 #include "ns3/frame-capture-model.h"
 #include "ns3/preamble-detection-model.h"
 #include "ns3/mobility-model.h"
+#include "ns3/wifi-net-device.h"
 #include "spectrum-wifi-helper.h"
 
 namespace ns3 {
@@ -53,7 +54,7 @@
 }
 
 Ptr<WifiPhy>
-SpectrumWifiPhyHelper::Create (Ptr<Node> node, Ptr<NetDevice> device) const
+SpectrumWifiPhyHelper::Create (Ptr<Node> node, Ptr<WifiNetDevice> device) const
 {
   Ptr<SpectrumWifiPhy> phy = m_phy.Create<SpectrumWifiPhy> ();
   phy->CreateWifiSpectrumPhyInterface (device);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/helper/spectrum-wifi-helper.h ns-3.36/src/wifi/helper/spectrum-wifi-helper.h
--- ns-3.35/src/wifi/helper/spectrum-wifi-helper.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/helper/spectrum-wifi-helper.h	2022-04-30 18:23:58.198735200 -0700
@@ -63,7 +63,7 @@
    *
    * This method implements the pure virtual method defined in \ref ns3::WifiPhyHelper.
    */
-  Ptr<WifiPhy> Create (Ptr<Node> node, Ptr<NetDevice> device) const override;
+  Ptr<WifiPhy> Create (Ptr<Node> node, Ptr<WifiNetDevice> device) const override;
 
   Ptr<SpectrumChannel> m_channel; ///< the channel
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/helper/wifi-helper.cc ns-3.36/src/wifi/helper/wifi-helper.cc
--- ns-3.35/src/wifi/helper/wifi-helper.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/helper/wifi-helper.cc	2022-04-30 18:23:58.198735200 -0700
@@ -32,6 +32,7 @@
 #include "ns3/net-device-queue-interface.h"
 #include "ns3/wifi-mac-queue.h"
 #include "ns3/qos-utils.h"
+#include "ns3/qos-txop.h"
 #include "ns3/ht-configuration.h"
 #include "ns3/vht-configuration.h"
 #include "ns3/he-configuration.h"
@@ -103,7 +104,7 @@
   WifiPreamble preamble)
 {
   NS_LOG_FUNCTION (stream << context << p << snr << mode << preamble);
-  *stream->GetStream () << "r " << Simulator::Now ().GetSeconds () << " " << mode << "" << context << " " << *p << std::endl;
+  *stream->GetStream () << "r " << Simulator::Now ().GetSeconds () << " " << mode << " " << context << " " << *p << std::endl;
 }
 
 /**
@@ -711,10 +712,11 @@
 }
 
 WifiHelper::WifiHelper ()
-  : m_standard (WIFI_STANDARD_80211a),
-    m_selectQueueCallback (&SelectQueueByDSField)
+  : m_standard (WIFI_STANDARD_80211ax),
+    m_selectQueueCallback (&SelectQueueByDSField),
+    m_enableFlowControl (true)
 {
-  SetRemoteStationManager ("ns3::ArfWifiManager");
+  SetRemoteStationManager ("ns3::IdealWifiManager");
 }
 
 void
@@ -770,6 +772,12 @@
 }
 
 void
+WifiHelper::DisableFlowControl (void)
+{
+  m_enableFlowControl = false;
+}
+
+void
 WifiHelper::SetSelectQueueCallback (SelectQueueCallback f)
 {
   m_selectQueueCallback = f;
@@ -786,36 +794,41 @@
     {
       Ptr<Node> node = *i;
       Ptr<WifiNetDevice> device = CreateObject<WifiNetDevice> ();
-      auto it = wifiStandards.find (m_standard);
-      if (it == wifiStandards.end ())
+      device->SetStandard (m_standard);
+      if (m_standard == WIFI_STANDARD_UNSPECIFIED)
         {
-          NS_FATAL_ERROR ("Selected standard is not defined!");
+          NS_FATAL_ERROR ("No standard specified!");
           return devices;
         }
-      if (it->second.phyStandard >= WIFI_PHY_STANDARD_80211n)
+      if (m_standard >= WIFI_STANDARD_80211n)
         {
           Ptr<HtConfiguration> htConfiguration = CreateObject<HtConfiguration> ();
           device->SetHtConfiguration (htConfiguration);
         }
-      if ((it->second.phyStandard >= WIFI_PHY_STANDARD_80211ac) && (it->second.phyBand != WIFI_PHY_BAND_2_4GHZ))
+      if (m_standard >= WIFI_STANDARD_80211ac)
         {
+          // Create the VHT Configuration object even if the PHY band is 2.4GHz
+          // (WifiNetDevice::GetVhtConfiguration() checks the PHY band being used).
+          // This approach allows us not to worry about deleting this object when
+          // the PHY band is switched from 5GHz to 2.4GHz and creating this object
+          // when the PHY band is switched from 2.4GHz to 5GHz.
           Ptr<VhtConfiguration> vhtConfiguration = CreateObject<VhtConfiguration> ();
           device->SetVhtConfiguration (vhtConfiguration);
         }
-      if (it->second.phyStandard >= WIFI_PHY_STANDARD_80211ax)
+      if (m_standard >= WIFI_STANDARD_80211ax)
         {
           Ptr<HeConfiguration> heConfiguration = CreateObject<HeConfiguration> ();
           device->SetHeConfiguration (heConfiguration);
         }
       Ptr<WifiRemoteStationManager> manager = m_stationManager.Create<WifiRemoteStationManager> ();
       Ptr<WifiPhy> phy = phyHelper.Create (node, device);
-      phy->ConfigureStandardAndBand (it->second.phyStandard, it->second.phyBand);
+      phy->ConfigureStandard (m_standard);
       device->SetPhy (phy);
       Ptr<WifiMac> mac = macHelper.Create (device, m_standard);
       device->SetMac (mac);
       device->SetRemoteStationManager (manager);
       node->AddDevice (device);
-      if ((it->second.phyStandard >= WIFI_PHY_STANDARD_80211ax) && (m_obssPdAlgorithm.IsTypeIdSet ()))
+      if ((m_standard >= WIFI_STANDARD_80211ax) && (m_obssPdAlgorithm.IsTypeIdSet ()))
         {
           Ptr<ObssPdAlgorithm> obssPdAlgorithm = m_obssPdAlgorithm.Create<ObssPdAlgorithm> ();
           device->AggregateObject (obssPdAlgorithm);
@@ -823,22 +836,20 @@
         }
       devices.Add (device);
       NS_LOG_DEBUG ("node=" << node << ", mob=" << node->GetObject<MobilityModel> ());
-      // Aggregate a NetDeviceQueueInterface object if a RegularWifiMac is installed
-      Ptr<RegularWifiMac> rmac = DynamicCast<RegularWifiMac> (mac);
-      if (rmac)
+      if (m_enableFlowControl)
         {
           Ptr<NetDeviceQueueInterface> ndqi;
           BooleanValue qosSupported;
           Ptr<WifiMacQueue> wmq;
 
-          rmac->GetAttributeFailSafe ("QosSupported", qosSupported);
+          mac->GetAttributeFailSafe ("QosSupported", qosSupported);
           if (qosSupported.Get ())
             {
               ndqi = CreateObjectWithAttributes<NetDeviceQueueInterface> ("NTxQueues",
                                                                           UintegerValue (4));
               for (auto& ac : {AC_BE, AC_BK, AC_VI, AC_VO})
                 {
-                  Ptr<QosTxop> qosTxop = rmac->GetQosTxop (ac);
+                  Ptr<QosTxop> qosTxop = mac->GetQosTxop (ac);
                   wmq = qosTxop->GetWifiMacQueue ();
                   ndqi->GetTxQueue (static_cast<std::size_t> (ac))->ConnectQueueTraces (wmq);
                 }
@@ -848,7 +859,7 @@
             {
               ndqi = CreateObject<NetDeviceQueueInterface> ();
 
-              wmq = rmac->GetTxop ()->GetWifiMacQueue ();
+              wmq = mac->GetTxop ()->GetWifiMacQueue ();
               ndqi->GetTxQueue (0)->ConnectQueueTraces (wmq);
             }
           device->AggregateObject (ndqi);
@@ -933,7 +944,6 @@
   LogComponentEnable ("PhyEntity", LOG_LEVEL_ALL);
   LogComponentEnable ("QosFrameExchangeManager", LOG_LEVEL_ALL);
   LogComponentEnable ("QosTxop", LOG_LEVEL_ALL);
-  LogComponentEnable ("RegularWifiMac", LOG_LEVEL_ALL);
   LogComponentEnable ("RraaWifiManager", LOG_LEVEL_ALL);
   LogComponentEnable ("RrMultiUserScheduler", LOG_LEVEL_ALL);
   LogComponentEnable ("RrpaaWifiManager", LOG_LEVEL_ALL);
@@ -996,36 +1006,37 @@
 
           //Handle any random numbers in the MAC objects.
           Ptr<WifiMac> mac = wifi->GetMac ();
-          Ptr<RegularWifiMac> rmac = DynamicCast<RegularWifiMac> (mac);
-          if (rmac)
+          PointerValue ptr;
+          if (!mac->GetQosSupported ())
             {
-              PointerValue ptr;
-              rmac->GetAttribute ("Txop", ptr);
+              mac->GetAttribute ("Txop", ptr);
               Ptr<Txop> txop = ptr.Get<Txop> ();
               currentStream += txop->AssignStreams (currentStream);
-
-              rmac->GetAttribute ("VO_Txop", ptr);
+            }
+          else
+            {
+              mac->GetAttribute ("VO_Txop", ptr);
               Ptr<QosTxop> vo_txop = ptr.Get<QosTxop> ();
               currentStream += vo_txop->AssignStreams (currentStream);
 
-              rmac->GetAttribute ("VI_Txop", ptr);
+              mac->GetAttribute ("VI_Txop", ptr);
               Ptr<QosTxop> vi_txop = ptr.Get<QosTxop> ();
               currentStream += vi_txop->AssignStreams (currentStream);
 
-              rmac->GetAttribute ("BE_Txop", ptr);
+              mac->GetAttribute ("BE_Txop", ptr);
               Ptr<QosTxop> be_txop = ptr.Get<QosTxop> ();
               currentStream += be_txop->AssignStreams (currentStream);
 
-              rmac->GetAttribute ("BK_Txop", ptr);
+              mac->GetAttribute ("BK_Txop", ptr);
               Ptr<QosTxop> bk_txop = ptr.Get<QosTxop> ();
               currentStream += bk_txop->AssignStreams (currentStream);
+            }
 
-              //if an AP, handle any beacon jitter
-              Ptr<ApWifiMac> apmac = DynamicCast<ApWifiMac> (rmac);
-              if (apmac)
-                {
-                  currentStream += apmac->AssignStreams (currentStream);
-                }
+          //if an AP, handle any beacon jitter
+          Ptr<ApWifiMac> apmac = DynamicCast<ApWifiMac> (mac);
+          if (apmac)
+            {
+              currentStream += apmac->AssignStreams (currentStream);
             }
         }
     }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/helper/wifi-helper.h ns-3.36/src/wifi/helper/wifi-helper.h
--- ns-3.35/src/wifi/helper/wifi-helper.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/helper/wifi-helper.h	2022-04-30 18:23:58.198735200 -0700
@@ -58,12 +58,8 @@
    *
    * Subclasses must implement this method to allow the ns3::WifiHelper class
    * to create PHY objects from ns3::WifiHelper::Install.
-   *
-   * Typically the device type will be of class WifiNetDevice but the
-   * type of the pointer is generalized so that this method may be used
-   * by other Wifi device variants such as WaveNetDevice.
    */
-  virtual Ptr<WifiPhy> Create (Ptr<Node> node, Ptr<NetDevice> device) const = 0;
+  virtual Ptr<WifiPhy> Create (Ptr<Node> node, Ptr<WifiNetDevice> device) const = 0;
 
   /**
    * \param name the name of the attribute to set
@@ -409,9 +405,20 @@
    * \param f the select queue callback
    *
    * Set the select queue callback to set on the NetDevice queue interface aggregated
-   * to the WifiNetDevice, in case RegularWifiMac with QoS enabled is used
+   * to the WifiNetDevice, in case WifiMac with QoS enabled is used
    */
   void SetSelectQueueCallback (SelectQueueCallback f);
+
+  /**
+   * Disable flow control only if you know what you are doing. By disabling
+   * flow control, this NetDevice will be sent packets even if there is no
+   * room for them (such packets will be likely dropped by this NetDevice).
+   * Also, any queue disc installed on this NetDevice will have no effect,
+   * as every packet enqueued to the traffic control layer queue disc will
+   * be immediately dequeued.
+   */
+  void DisableFlowControl (void);
+
   /**
    * \param phy the PHY helper to create PHY objects
    * \param mac the MAC helper to create MAC objects
@@ -502,6 +509,7 @@
   WifiStandard m_standard;                   ///< wifi standard
   SelectQueueCallback m_selectQueueCallback; ///< select queue callback
   ObjectFactory m_obssPdAlgorithm;           ///< OBSS_PD algorithm
+  bool m_enableFlowControl;                  //!< whether to enable flow control
 };
 
 } //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/helper/wifi-mac-helper.cc ns-3.36/src/wifi/helper/wifi-mac-helper.cc
--- ns-3.35/src/wifi/helper/wifi-mac-helper.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/helper/wifi-mac-helper.cc	2022-04-30 18:23:58.198735200 -0700
@@ -18,7 +18,7 @@
  * Author: SÃ©bastien Deronne <sebastien.deronne@gmail.com>
  */
 
-#include "ns3/net-device.h"
+#include "ns3/wifi-net-device.h"
 #include "wifi-mac-helper.h"
 #include "ns3/frame-exchange-manager.h"
 #include "ns3/wifi-protection-manager.h"
@@ -30,9 +30,8 @@
 
 WifiMacHelper::WifiMacHelper ()
 {
-  //By default, we create an AdHoc MAC layer without QoS.
-  SetType ("ns3::AdhocWifiMac",
-           "QosSupported", BooleanValue (false));
+  //By default, we create an AdHoc MAC layer (without QoS).
+  SetType ("ns3::AdhocWifiMac");
 
   m_protectionManager.SetTypeId ("ns3::WifiDefaultProtectionManager");
   m_ackManager.SetTypeId ("ns3::WifiDefaultAckManager");
@@ -43,32 +42,37 @@
 }
 
 Ptr<WifiMac>
-WifiMacHelper::Create (Ptr<NetDevice> device, WifiStandard standard) const
+WifiMacHelper::Create (Ptr<WifiNetDevice> device, WifiStandard standard) const
 {
-  auto standardIt = wifiStandards.find (standard);
-  NS_ABORT_MSG_IF (standardIt == wifiStandards.end (), "Selected standard is not defined!");
+  NS_ABORT_MSG_IF (standard == WIFI_STANDARD_UNSPECIFIED, "No standard specified!");
 
-  Ptr<WifiMac> mac = m_mac.Create<WifiMac> ();
+  // this is a const method, but we need to force the correct QoS setting
+  ObjectFactory macObjectFactory = m_mac;
+  if (standard >= WIFI_STANDARD_80211n)
+    {
+      macObjectFactory.Set ("QosSupported", BooleanValue (true));
+    }
+
+  Ptr<WifiMac> mac = macObjectFactory.Create<WifiMac> ();
   mac->SetDevice (device);
   mac->SetAddress (Mac48Address::Allocate ());
   mac->ConfigureStandard (standard);
 
-  Ptr<RegularWifiMac> wifiMac = DynamicCast<RegularWifiMac> (mac);
-  Ptr<FrameExchangeManager> fem;
+  Ptr<FrameExchangeManager> fem = mac->GetFrameExchangeManager ();
 
-  if (wifiMac != 0 && (fem = wifiMac->GetFrameExchangeManager ()) != 0)
+  if (fem != nullptr)
     {
       Ptr<WifiProtectionManager> protectionManager = m_protectionManager.Create<WifiProtectionManager> ();
-      protectionManager->SetWifiMac (wifiMac);
+      protectionManager->SetWifiMac (mac);
       fem->SetProtectionManager (protectionManager);
 
       Ptr<WifiAckManager> ackManager = m_ackManager.Create<WifiAckManager> ();
-      ackManager->SetWifiMac (wifiMac);
+      ackManager->SetWifiMac (mac);
       fem->SetAckManager (ackManager);
 
       // create and install the Multi User Scheduler if this is an HE AP
       Ptr<ApWifiMac> apMac = DynamicCast<ApWifiMac> (mac);
-      if (apMac != nullptr && standardIt->second.macStandard >= WIFI_MAC_STANDARD_80211ax
+      if (apMac != nullptr && standard >= WIFI_STANDARD_80211ax
           && m_muScheduler.IsTypeIdSet ())
         {
           Ptr<MultiUserScheduler> muScheduler = m_muScheduler.Create<MultiUserScheduler> ();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/helper/wifi-mac-helper.h ns-3.36/src/wifi/helper/wifi-mac-helper.h
--- ns-3.35/src/wifi/helper/wifi-mac-helper.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/helper/wifi-mac-helper.h	2022-04-30 18:23:58.198735200 -0700
@@ -27,7 +27,7 @@
 namespace ns3 {
 
 class WifiMac;
-class NetDevice;
+class WifiNetDevice;
 
 /**
  * \brief create MAC layers for a ns3::WifiNetDevice.
@@ -106,7 +106,7 @@
    *
    * This allows the ns3::WifiHelper class to create MAC objects from ns3::WifiHelper::Install.
    */
-  virtual Ptr<WifiMac> Create (Ptr<NetDevice> device, WifiStandard standard) const;
+  virtual Ptr<WifiMac> Create (Ptr<WifiNetDevice> device, WifiStandard standard) const;
 
 
 protected:
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/helper/yans-wifi-helper.cc ns-3.36/src/wifi/helper/yans-wifi-helper.cc
--- ns-3.35/src/wifi/helper/yans-wifi-helper.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/helper/yans-wifi-helper.cc	2022-04-30 18:23:58.198735200 -0700
@@ -27,6 +27,7 @@
 #include "ns3/frame-capture-model.h"
 #include "ns3/preamble-detection-model.h"
 #include "ns3/yans-wifi-phy.h"
+#include "ns3/wifi-net-device.h"
 #include "yans-wifi-helper.h"
 
 namespace ns3 {
@@ -144,7 +145,7 @@
 }
 
 Ptr<WifiPhy>
-YansWifiPhyHelper::Create (Ptr<Node> node, Ptr<NetDevice> device) const
+YansWifiPhyHelper::Create (Ptr<Node> node, Ptr<WifiNetDevice> device) const
 {
   Ptr<YansWifiPhy> phy = m_phy.Create<YansWifiPhy> ();
   Ptr<ErrorRateModel> error = m_errorRateModel.Create<ErrorRateModel> ();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/helper/yans-wifi-helper.h ns-3.36/src/wifi/helper/yans-wifi-helper.h
--- ns-3.35/src/wifi/helper/yans-wifi-helper.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/helper/yans-wifi-helper.h	2022-04-30 18:23:58.198735200 -0700
@@ -31,7 +31,7 @@
  *
  * The intent of this class is to make it easy to create a channel object
  * which implements the YANS channel model. The YANS channel model is described
- * in "Yet Another Network Simulator", http://cutebugs.net/files/wns2-yans.pdf
+ * in "Yet Another Network Simulator"; an author-prepared version of this paper  * is at: https://hal.inria.fr/file/index/docid/78318/filename/yans-rr.pdf
  */
 class YansWifiChannelHelper
 {
@@ -151,7 +151,8 @@
  * \brief Make it easy to create and manage PHY objects for the YANS model.
  *
  * The YANS PHY model is described in "Yet Another Network Simulator",
- * http://cutebugs.net/files/wns2-yans.pdf
+ * published in WNS2 2006; an author-prepared version of this paper
+ * is at: https://hal.inria.fr/file/index/docid/78318/filename/yans-rr.pdf
  *
  * The Pcap and ASCII traces generated by the EnableAscii and EnablePcap methods defined
  * in this class correspond to PHY-level traces and come to us via WifiPhyHelper
@@ -186,7 +187,7 @@
    *
    * This method implements the pure virtual method defined in \ref ns3::WifiPhyHelper.
    */
-  Ptr<WifiPhy> Create (Ptr<Node> node, Ptr<NetDevice> device) const override;
+  Ptr<WifiPhy> Create (Ptr<Node> node, Ptr<WifiNetDevice> device) const override;
 
   Ptr<YansWifiChannel> m_channel; ///< YANS wifi channel
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/adhoc-wifi-mac.cc ns-3.36/src/wifi/model/adhoc-wifi-mac.cc
--- ns-3.35/src/wifi/model/adhoc-wifi-mac.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/adhoc-wifi-mac.cc	2022-04-30 18:23:58.198735200 -0700
@@ -23,6 +23,7 @@
 #include "ns3/log.h"
 #include "ns3/packet.h"
 #include "adhoc-wifi-mac.h"
+#include "qos-txop.h"
 #include "ns3/ht-capabilities.h"
 #include "ns3/vht-capabilities.h"
 #include "ns3/he-capabilities.h"
@@ -37,7 +38,7 @@
 AdhocWifiMac::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::AdhocWifiMac")
-    .SetParent<RegularWifiMac> ()
+    .SetParent<WifiMac> ()
     .SetGroupName ("Wifi")
     .AddConstructor<AdhocWifiMac> ()
   ;
@@ -66,32 +67,38 @@
   //transmitted by each STA set to that STA's address.
   //
   //This is why we're overriding this method.
-  RegularWifiMac::SetAddress (address);
-  RegularWifiMac::SetBssid (address);
+  WifiMac::SetAddress (address);
+  WifiMac::SetBssid (address);
+}
+
+bool
+AdhocWifiMac::CanForwardPacketsTo (Mac48Address to) const
+{
+  return true;
 }
 
 void
 AdhocWifiMac::Enqueue (Ptr<Packet> packet, Mac48Address to)
 {
   NS_LOG_FUNCTION (this << packet << to);
-  if (m_stationManager->IsBrandNew (to))
+  if (GetWifiRemoteStationManager ()->IsBrandNew (to))
     {
       //In ad hoc mode, we assume that every destination supports all the rates we support.
       if (GetHtSupported ())
         {
-          m_stationManager->AddAllSupportedMcs (to);
-          m_stationManager->AddStationHtCapabilities (to, GetHtCapabilities ());
+          GetWifiRemoteStationManager ()->AddAllSupportedMcs (to);
+          GetWifiRemoteStationManager ()->AddStationHtCapabilities (to, GetHtCapabilities ());
         }
       if (GetVhtSupported ())
         {
-          m_stationManager->AddStationVhtCapabilities (to, GetVhtCapabilities ());
+          GetWifiRemoteStationManager ()->AddStationVhtCapabilities (to, GetVhtCapabilities ());
         }
       if (GetHeSupported ())
         {
-          m_stationManager->AddStationHeCapabilities (to, GetHeCapabilities ());
+          GetWifiRemoteStationManager ()->AddStationHeCapabilities (to, GetHeCapabilities ());
         }
-      m_stationManager->AddAllSupportedModes (to);
-      m_stationManager->RecordDisassociated (to);
+      GetWifiRemoteStationManager ()->AddAllSupportedModes (to);
+      GetWifiRemoteStationManager ()->RecordDisassociated (to);
     }
 
   WifiMacHeader hdr;
@@ -146,11 +153,11 @@
     {
       //Sanity check that the TID is valid
       NS_ASSERT (tid < 8);
-      m_edca[QosUtilsMapTidToAc (tid)]->Queue (packet, hdr);
+      GetQosTxop (tid)->Queue (packet, hdr);
     }
   else
     {
-      m_txop->Queue (packet, hdr);
+      GetTxop ()->Queue (packet, hdr);
     }
 }
 
@@ -158,7 +165,7 @@
 AdhocWifiMac::SetLinkUpCallback (Callback<void> linkUp)
 {
   NS_LOG_FUNCTION (this << &linkUp);
-  RegularWifiMac::SetLinkUpCallback (linkUp);
+  WifiMac::SetLinkUpCallback (linkUp);
 
   //The approach taken here is that, from the point of view of a STA
   //in IBSS mode, the link is always up, so we immediately invoke the
@@ -174,24 +181,24 @@
   NS_ASSERT (!hdr->IsCtl ());
   Mac48Address from = hdr->GetAddr2 ();
   Mac48Address to = hdr->GetAddr1 ();
-  if (m_stationManager->IsBrandNew (from))
+  if (GetWifiRemoteStationManager ()->IsBrandNew (from))
     {
       //In ad hoc mode, we assume that every destination supports all the rates we support.
       if (GetHtSupported ())
         {
-          m_stationManager->AddAllSupportedMcs (from);
-          m_stationManager->AddStationHtCapabilities (from, GetHtCapabilities ());
+          GetWifiRemoteStationManager ()->AddAllSupportedMcs (from);
+          GetWifiRemoteStationManager ()->AddStationHtCapabilities (from, GetHtCapabilities ());
         }
       if (GetVhtSupported ())
         {
-          m_stationManager->AddStationVhtCapabilities (from, GetVhtCapabilities ());
+          GetWifiRemoteStationManager ()->AddStationVhtCapabilities (from, GetVhtCapabilities ());
         }
       if (GetHeSupported ())
         {
-          m_stationManager->AddStationHeCapabilities (from, GetHeCapabilities ());
+          GetWifiRemoteStationManager ()->AddStationHeCapabilities (from, GetHeCapabilities ());
         }
-      m_stationManager->AddAllSupportedModes (from);
-      m_stationManager->RecordDisassociated (from);
+      GetWifiRemoteStationManager ()->AddAllSupportedModes (from);
+      GetWifiRemoteStationManager ()->RecordDisassociated (from);
     }
   if (hdr->IsData ())
     {
@@ -210,7 +217,7 @@
   //Invoke the receive handler of our parent class to deal with any
   //other frames. Specifically, this will handle Block Ack-related
   //Management Action frames.
-  RegularWifiMac::Receive (mpdu);
+  WifiMac::Receive (mpdu);
 }
 
 } //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/adhoc-wifi-mac.h ns-3.36/src/wifi/model/adhoc-wifi-mac.h
--- ns-3.35/src/wifi/model/adhoc-wifi-mac.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/adhoc-wifi-mac.h	2022-04-30 18:23:58.198735200 -0700
@@ -23,7 +23,7 @@
 #ifndef ADHOC_WIFI_MAC_H
 #define ADHOC_WIFI_MAC_H
 
-#include "regular-wifi-mac.h"
+#include "wifi-mac.h"
 
 namespace ns3 {
 
@@ -32,7 +32,7 @@
  *
  * \brief Wifi MAC high model for an ad-hoc Wifi MAC
  */
-class AdhocWifiMac : public RegularWifiMac
+class AdhocWifiMac : public WifiMac
 {
 public:
   /**
@@ -47,6 +47,7 @@
   void SetAddress (Mac48Address address) override;
   void SetLinkUpCallback (Callback<void> linkUp) override;
   void Enqueue (Ptr<Packet> packet, Mac48Address to) override;
+  bool CanForwardPacketsTo (Mac48Address to) const override;
 
 private:
   void Receive (Ptr<WifiMacQueueItem> mpdu) override;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/ap-wifi-mac.cc ns-3.36/src/wifi/model/ap-wifi-mac.cc
--- ns-3.35/src/wifi/model/ap-wifi-mac.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/ap-wifi-mac.cc	2022-04-30 18:23:58.202735200 -0700
@@ -38,6 +38,7 @@
 #include "wifi-mac-queue.h"
 #include "ns3/ht-configuration.h"
 #include "ns3/he-configuration.h"
+#include "qos-txop.h"
 
 namespace ns3 {
 
@@ -49,7 +50,7 @@
 ApWifiMac::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::ApWifiMac")
-    .SetParent<RegularWifiMac> ()
+    .SetParent<WifiMac> ()
     .SetGroupName ("Wifi")
     .AddConstructor<ApWifiMac> ()
     .AddAttribute ("BeaconInterval",
@@ -130,7 +131,7 @@
   m_beaconTxop = 0;
   m_enableBeaconGeneration = false;
   m_beaconEvent.Cancel ();
-  RegularWifiMac::DoDispose ();
+  WifiMac::DoDispose ();
 }
 
 void
@@ -139,8 +140,8 @@
   NS_LOG_FUNCTION (this << address);
   //As an AP, our MAC address is also the BSSID. Hence we are
   //overriding this function and setting both in our parent class.
-  RegularWifiMac::SetAddress (address);
-  RegularWifiMac::SetBssid (address);
+  WifiMac::SetAddress (address);
+  WifiMac::SetBssid (address);
 }
 
 Ptr<WifiMacQueue>
@@ -150,7 +151,7 @@
     {
       return m_beaconTxop->GetWifiMacQueue ();
     }
-  return RegularWifiMac::GetTxopQueue (ac);
+  return WifiMac::GetTxopQueue (ac);
 }
 
 void
@@ -179,7 +180,7 @@
 ApWifiMac::SetLinkUpCallback (Callback<void> linkUp)
 {
   NS_LOG_FUNCTION (this << &linkUp);
-  RegularWifiMac::SetLinkUpCallback (linkUp);
+  WifiMac::SetLinkUpCallback (linkUp);
 
   //The approach taken here is that, from the point of view of an AP,
   //the link is always up, so we immediately invoke the callback if
@@ -218,7 +219,7 @@
     {
       for (const auto& sta : m_staList)
         {
-          if (!m_stationManager->GetShortSlotTimeSupported (sta.second))
+          if (!GetWifiRemoteStationManager ()->GetShortSlotTimeSupported (sta.second))
             {
               m_shortSlotTimeEnabled = false;
               return;
@@ -236,12 +237,12 @@
 ApWifiMac::UpdateShortPreambleEnabled (void)
 {
   NS_LOG_FUNCTION (this);
-  if (GetErpSupported () && m_phy->GetShortPhyPreambleSupported ())
+  if (GetErpSupported () && GetWifiPhy ()->GetShortPhyPreambleSupported ())
     {
       for (const auto& sta : m_staList)
         {
-          if (!m_stationManager->GetErpOfdmSupported (sta.second) ||
-              !m_stationManager->GetShortPreambleSupported (sta.second))
+          if (!GetWifiRemoteStationManager ()->GetErpOfdmSupported (sta.second) ||
+              !GetWifiRemoteStationManager ()->GetShortPreambleSupported (sta.second))
             {
               m_shortPreambleEnabled = false;
               return;
@@ -258,14 +259,14 @@
 uint16_t
 ApWifiMac::GetVhtOperationalChannelWidth (void) const
 {
-  uint16_t channelWidth = m_phy->GetChannelWidth ();
+  uint16_t channelWidth = GetWifiPhy ()->GetChannelWidth ();
   for (const auto& sta : m_staList)
     {
-      if (m_stationManager->GetVhtSupported (sta.second))
+      if (GetWifiRemoteStationManager ()->GetVhtSupported (sta.second))
         {
-          if (m_stationManager->GetChannelWidthSupported (sta.second) < channelWidth)
+          if (GetWifiRemoteStationManager ()->GetChannelWidthSupported (sta.second) < channelWidth)
             {
-              channelWidth = m_stationManager->GetChannelWidthSupported (sta.second);
+              channelWidth = GetWifiRemoteStationManager ()->GetChannelWidthSupported (sta.second);
             }
         }
     }
@@ -340,19 +341,25 @@
     {
       //Sanity check that the TID is valid
       NS_ASSERT (tid < 8);
-      m_edca[QosUtilsMapTidToAc (tid)]->Queue (packet, hdr);
+      GetQosTxop (tid)->Queue (packet, hdr);
     }
   else
     {
-      m_txop->Queue (packet, hdr);
+      GetTxop ()->Queue (packet, hdr);
     }
 }
 
+bool
+ApWifiMac::CanForwardPacketsTo (Mac48Address to) const
+{
+  return (to.IsGroup () || GetWifiRemoteStationManager ()->IsAssociated (to));
+}
+
 void
 ApWifiMac::Enqueue (Ptr<Packet> packet, Mac48Address to, Mac48Address from)
 {
   NS_LOG_FUNCTION (this << packet << to << from);
-  if (to.IsGroup () || m_stationManager->IsAssociated (to))
+  if (CanForwardPacketsTo (to))
     {
       ForwardDown (packet, from, to);
     }
@@ -386,9 +393,9 @@
   SupportedRates rates;
   //Send the set of supported rates and make sure that we indicate
   //the Basic Rate set in this set of supported rates.
-  for (const auto & mode : m_phy->GetModeList ())
+  for (const auto & mode : GetWifiPhy ()->GetModeList ())
     {
-      uint64_t modeDataRate = mode.GetDataRate (m_phy->GetChannelWidth ());
+      uint64_t modeDataRate = mode.GetDataRate (GetWifiPhy ()->GetChannelWidth ());
       NS_LOG_DEBUG ("Adding supported rate of " << modeDataRate);
       rates.AddSupportedRate (modeDataRate);
       //Add rates that are part of the BSSBasicRateSet (manufacturer dependent!)
@@ -397,14 +404,14 @@
       if (mode.IsMandatory () && (mode.GetModulationClass () != WIFI_MOD_CLASS_HR_DSSS))
         {
           NS_LOG_DEBUG ("Adding basic mode " << mode.GetUniqueName ());
-          m_stationManager->AddBasicMode (mode);
+          GetWifiRemoteStationManager ()->AddBasicMode (mode);
         }
     }
   //set the basic rates
-  for (uint8_t j = 0; j < m_stationManager->GetNBasicModes (); j++)
+  for (uint8_t j = 0; j < GetWifiRemoteStationManager ()->GetNBasicModes (); j++)
     {
-      WifiMode mode = m_stationManager->GetBasicMode (j);
-      uint64_t modeDataRate = mode.GetDataRate (m_phy->GetChannelWidth ());
+      WifiMode mode = GetWifiRemoteStationManager ()->GetBasicMode (j);
+      uint64_t modeDataRate = mode.GetDataRate (GetWifiPhy ()->GetChannelWidth ());
       NS_LOG_DEBUG ("Setting basic rate " << mode.GetUniqueName ());
       rates.SetBasicRate (modeDataRate);
     }
@@ -414,7 +421,7 @@
   //Also the standard mentioned that at least 1 element should be included in the SupportedRates the rest can be in the ExtendedSupportedRates
   if (GetHtSupported ())
     {
-      for (const auto & selector : m_phy->GetBssMembershipSelectorList ())
+      for (const auto & selector : GetWifiPhy ()->GetBssMembershipSelectorList ())
         {
           rates.AddBssMembershipSelectorRate (selector);
         }
@@ -430,7 +437,7 @@
   if (GetDsssSupported ())
     {
       dsssParameters.SetDsssSupported (1);
-      dsssParameters.SetCurrentChannel (m_phy->GetChannelNumber ());
+      dsssParameters.SetCurrentChannel (GetWifiPhy ()->GetChannelNumber ());
     }
   return dsssParameters;
 }
@@ -479,7 +486,7 @@
       Ptr<QosTxop> edca;
       Time txopLimit;
 
-      edca = m_edca.find (AC_BE)->second;
+      edca = GetQosTxop (AC_BE);
       txopLimit = edca->GetTxopLimit ();
       edcaParameters.SetBeAci (0);
       edcaParameters.SetBeCWmin (edca->GetMinCw ());
@@ -487,7 +494,7 @@
       edcaParameters.SetBeAifsn (edca->GetAifsn ());
       edcaParameters.SetBeTxopLimit (static_cast<uint16_t> (txopLimit.GetMicroSeconds () / 32));
 
-      edca = m_edca.find (AC_BK)->second;
+      edca = GetQosTxop (AC_BK);
       txopLimit = edca->GetTxopLimit ();
       edcaParameters.SetBkAci (1);
       edcaParameters.SetBkCWmin (edca->GetMinCw ());
@@ -495,7 +502,7 @@
       edcaParameters.SetBkAifsn (edca->GetAifsn ());
       edcaParameters.SetBkTxopLimit (static_cast<uint16_t> (txopLimit.GetMicroSeconds () / 32));
 
-      edca = m_edca.find (AC_VI)->second;
+      edca = GetQosTxop (AC_VI);
       txopLimit = edca->GetTxopLimit ();
       edcaParameters.SetViAci (2);
       edcaParameters.SetViCWmin (edca->GetMinCw ());
@@ -503,7 +510,7 @@
       edcaParameters.SetViAifsn (edca->GetAifsn ());
       edcaParameters.SetViTxopLimit (static_cast<uint16_t> (txopLimit.GetMicroSeconds () / 32));
 
-      edca = m_edca.find (AC_VO)->second;
+      edca = GetQosTxop (AC_VO);
       txopLimit = edca->GetTxopLimit ();
       edcaParameters.SetVoAci (3);
       edcaParameters.SetVoCWmin (edca->GetMinCw ());
@@ -578,10 +585,10 @@
   if (GetHtSupported ())
     {
       operation.SetHtSupported (1);
-      operation.SetPrimaryChannel (m_phy->GetChannelNumber ());
+      operation.SetPrimaryChannel (GetWifiPhy ()->GetPrimaryChannelNumber (20));
       operation.SetRifsMode (false);
       operation.SetNonGfHtStasPresent (true);
-      if (m_phy->GetChannelWidth () > 20)
+      if (GetWifiPhy ()->GetChannelWidth () > 20)
         {
           operation.SetSecondaryChannelOffset (1);
           operation.SetStaChannelWidth (1);
@@ -595,33 +602,33 @@
           operation.SetHtProtection (MIXED_MODE_PROTECTION);
         }
       uint64_t maxSupportedRate = 0; //in bit/s
-      for (const auto & mcs : m_phy->GetMcsList (WIFI_MOD_CLASS_HT))
+      for (const auto & mcs : GetWifiPhy ()->GetMcsList (WIFI_MOD_CLASS_HT))
         {
           uint8_t nss = (mcs.GetMcsValue () / 8) + 1;
           NS_ASSERT (nss > 0 && nss < 5);
-          uint64_t dataRate = mcs.GetDataRate (m_phy->GetChannelWidth (), GetHtConfiguration ()->GetShortGuardIntervalSupported () ? 400 : 800, nss);
+          uint64_t dataRate = mcs.GetDataRate (GetWifiPhy ()->GetChannelWidth (), GetHtConfiguration ()->GetShortGuardIntervalSupported () ? 400 : 800, nss);
           if (dataRate > maxSupportedRate)
             {
               maxSupportedRate = dataRate;
               NS_LOG_DEBUG ("Updating maxSupportedRate to " << maxSupportedRate);
             }
         }
-      uint8_t maxSpatialStream = m_phy->GetMaxSupportedTxSpatialStreams ();
-      auto mcsList = m_phy->GetMcsList (WIFI_MOD_CLASS_HT);
+      uint8_t maxSpatialStream = GetWifiPhy ()->GetMaxSupportedTxSpatialStreams ();
+      auto mcsList = GetWifiPhy ()->GetMcsList (WIFI_MOD_CLASS_HT);
       uint8_t nMcs = mcsList.size ();
       for (const auto& sta : m_staList)
         {
-          if (m_stationManager->GetHtSupported (sta.second))
+          if (GetWifiRemoteStationManager ()->GetHtSupported (sta.second))
             {
               uint64_t maxSupportedRateByHtSta = 0; //in bit/s
               auto itMcs = mcsList.begin ();
-              for (uint8_t j = 0; j < (std::min (nMcs, m_stationManager->GetNMcsSupported (sta.second))); j++)
+              for (uint8_t j = 0; j < (std::min (nMcs, GetWifiRemoteStationManager ()->GetNMcsSupported (sta.second))); j++)
                 {
                   WifiMode mcs = *itMcs++;
                   uint8_t nss = (mcs.GetMcsValue () / 8) + 1;
                   NS_ASSERT (nss > 0 && nss < 5);
-                  uint64_t dataRate = mcs.GetDataRate (m_stationManager->GetChannelWidthSupported (sta.second),
-                                                       m_stationManager->GetShortGuardIntervalSupported (sta.second) ? 400 : 800, nss);
+                  uint64_t dataRate = mcs.GetDataRate (GetWifiRemoteStationManager ()->GetChannelWidthSupported (sta.second),
+                                                       GetWifiRemoteStationManager ()->GetShortGuardIntervalSupported (sta.second) ? 400 : 800, nss);
                   if (dataRate > maxSupportedRateByHtSta)
                     {
                       maxSupportedRateByHtSta = dataRate;
@@ -631,13 +638,13 @@
                 {
                   maxSupportedRate = maxSupportedRateByHtSta;
                 }
-              if (m_stationManager->GetNMcsSupported (sta.second) < nMcs)
+              if (GetWifiRemoteStationManager ()->GetNMcsSupported (sta.second) < nMcs)
                 {
-                  nMcs = m_stationManager->GetNMcsSupported (sta.second);
+                  nMcs = GetWifiRemoteStationManager ()->GetNMcsSupported (sta.second);
                 }
-              if (m_stationManager->GetNumberOfSupportedStreams (sta.second) < maxSpatialStream)
+              if (GetWifiRemoteStationManager ()->GetNumberOfSupportedStreams (sta.second) < maxSpatialStream)
                 {
-                  maxSpatialStream = m_stationManager->GetNumberOfSupportedStreams (sta.second);
+                  maxSpatialStream = GetWifiRemoteStationManager ()->GetNumberOfSupportedStreams (sta.second);
                 }
             }
         }
@@ -680,14 +687,14 @@
         {
           operation.SetChannelWidth (0);
         }
-      uint8_t maxSpatialStream = m_phy->GetMaxSupportedRxSpatialStreams ();
+      uint8_t maxSpatialStream = GetWifiPhy ()->GetMaxSupportedRxSpatialStreams ();
       for (const auto& sta : m_staList)
         {
-          if (m_stationManager->GetVhtSupported (sta.second))
+          if (GetWifiRemoteStationManager ()->GetVhtSupported (sta.second))
             {
-              if (m_stationManager->GetNumberOfSupportedStreams (sta.second) < maxSpatialStream)
+              if (GetWifiRemoteStationManager ()->GetNumberOfSupportedStreams (sta.second) < maxSpatialStream)
                 {
-                  maxSpatialStream = m_stationManager->GetNumberOfSupportedStreams (sta.second);
+                  maxSpatialStream = GetWifiRemoteStationManager ()->GetNumberOfSupportedStreams (sta.second);
                 }
             }
         }
@@ -708,14 +715,14 @@
   if (GetHeSupported ())
     {
       operation.SetHeSupported (1);
-      uint8_t maxSpatialStream = m_phy->GetMaxSupportedRxSpatialStreams ();
+      uint8_t maxSpatialStream = GetWifiPhy ()->GetMaxSupportedRxSpatialStreams ();
       for (const auto& sta : m_staList)
         {
-          if (m_stationManager->GetHeSupported (sta.second))
+          if (GetWifiRemoteStationManager ()->GetHeSupported (sta.second))
             {
-              if (m_stationManager->GetNumberOfSupportedStreams (sta.second) < maxSpatialStream)
+              if (GetWifiRemoteStationManager ()->GetNumberOfSupportedStreams (sta.second) < maxSpatialStream)
                 {
-                  maxSpatialStream = m_stationManager->GetNumberOfSupportedStreams (sta.second);
+                  maxSpatialStream = GetWifiRemoteStationManager ()->GetNumberOfSupportedStreams (sta.second);
                 }
             }
         }
@@ -745,8 +752,8 @@
   probe.SetSupportedRates (GetSupportedRates ());
   probe.SetBeaconIntervalUs (GetBeaconInterval ().GetMicroSeconds ());
   probe.SetCapabilities (GetCapabilities ());
-  m_stationManager->SetShortPreambleEnabled (m_shortPreambleEnabled);
-  m_stationManager->SetShortSlotTimeEnabled (m_shortSlotTimeEnabled);
+  GetWifiRemoteStationManager ()->SetShortPreambleEnabled (m_shortPreambleEnabled);
+  GetWifiRemoteStationManager ()->SetShortSlotTimeEnabled (m_shortSlotTimeEnabled);
   if (GetDsssSupported ())
     {
       probe.SetDsssParameterSet (GetDsssParameterSet ());
@@ -778,11 +785,25 @@
     }
   packet->AddHeader (probe);
 
-  //The standard is not clear on the correct queue for management
-  //frames if we are a QoS AP. The approach taken here is to always
-  //use the DCF for these regardless of whether we have a QoS
-  //association or not.
-  m_txop->Queue (packet, hdr);
+  if (!GetQosSupported ())
+    {
+      GetTxop ()->Queue (packet, hdr);
+    }
+  // "A QoS STA that transmits a Management frame determines access category used
+  // for medium access in transmission of the Management frame as follows
+  // (If dot11QMFActivated is false or not present)
+  // â€” If the Management frame is individually addressed to a non-QoS STA, category
+  //   AC_BE should be selected.
+  // â€” If category AC_BE was not selected by the previous step, category AC_VO
+  //   shall be selected." (Sec. 10.2.3.2 of 802.11-2020)
+  else if (!GetWifiRemoteStationManager ()->GetQosSupported (to))
+    {
+      GetBEQueue ()->Queue (packet, hdr);
+    }
+  else
+    {
+      GetVOQueue ()->Queue (packet, hdr);
+    }
 }
 
 void
@@ -821,12 +842,12 @@
           aid = GetNextAssociationId ();
           m_staList.insert (std::make_pair (aid, to));
           m_assocLogger (aid, to);
-          m_stationManager->SetAssociationId (to, aid);
-          if (m_stationManager->GetDsssSupported (to) && !m_stationManager->GetErpOfdmSupported (to))
+          GetWifiRemoteStationManager ()->SetAssociationId (to, aid);
+          if (GetWifiRemoteStationManager ()->GetDsssSupported (to) && !GetWifiRemoteStationManager ()->GetErpOfdmSupported (to))
             {
               m_numNonErpStations++;
             }
-          if (!m_stationManager->GetHtSupported (to))
+          if (!GetWifiRemoteStationManager ()->GetHtSupported (to))
             {
               m_numNonHtStations++;
             }
@@ -869,11 +890,25 @@
     }
   packet->AddHeader (assoc);
 
-  //The standard is not clear on the correct queue for management
-  //frames if we are a QoS AP. The approach taken here is to always
-  //use the DCF for these regardless of whether we have a QoS
-  //association or not.
-  m_txop->Queue (packet, hdr);
+  if (!GetQosSupported ())
+    {
+      GetTxop ()->Queue (packet, hdr);
+    }
+  // "A QoS STA that transmits a Management frame determines access category used
+  // for medium access in transmission of the Management frame as follows
+  // (If dot11QMFActivated is false or not present)
+  // â€” If the Management frame is individually addressed to a non-QoS STA, category
+  //   AC_BE should be selected.
+  // â€” If category AC_BE was not selected by the previous step, category AC_VO
+  //   shall be selected." (Sec. 10.2.3.2 of 802.11-2020)
+  else if (!GetWifiRemoteStationManager ()->GetQosSupported (to))
+    {
+      GetBEQueue ()->Queue (packet, hdr);
+    }
+  else
+    {
+      GetVOQueue ()->Queue (packet, hdr);
+    }
 }
 
 void
@@ -893,8 +928,8 @@
   beacon.SetSupportedRates (GetSupportedRates ());
   beacon.SetBeaconIntervalUs (GetBeaconInterval ().GetMicroSeconds ());
   beacon.SetCapabilities (GetCapabilities ());
-  m_stationManager->SetShortPreambleEnabled (m_shortPreambleEnabled);
-  m_stationManager->SetShortSlotTimeEnabled (m_shortSlotTimeEnabled);
+  GetWifiRemoteStationManager ()->SetShortPreambleEnabled (m_shortPreambleEnabled);
+  GetWifiRemoteStationManager ()->SetShortSlotTimeEnabled (m_shortSlotTimeEnabled);
   if (GetDsssSupported ())
     {
       beacon.SetDsssParameterSet (GetDsssParameterSet ());
@@ -938,12 +973,12 @@
       if (m_shortSlotTimeEnabled)
         {
           //Enable short slot time
-          m_phy->SetSlot (MicroSeconds (9));
+          GetWifiPhy ()->SetSlot (MicroSeconds (9));
         }
       else
         {
           //Disable short slot time
-          m_phy->SetSlot (MicroSeconds (20));
+          GetWifiPhy ()->SetSlot (MicroSeconds (20));
         }
     }
 }
@@ -954,24 +989,24 @@
   NS_LOG_FUNCTION (this << *mpdu);
   const WifiMacHeader& hdr = mpdu->GetHeader ();
   if ((hdr.IsAssocResp () || hdr.IsReassocResp ())
-      && m_stationManager->IsWaitAssocTxOk (hdr.GetAddr1 ()))
+      && GetWifiRemoteStationManager ()->IsWaitAssocTxOk (hdr.GetAddr1 ()))
     {
       NS_LOG_DEBUG ("associated with sta=" << hdr.GetAddr1 ());
-      m_stationManager->RecordGotAssocTxOk (hdr.GetAddr1 ());
+      GetWifiRemoteStationManager ()->RecordGotAssocTxOk (hdr.GetAddr1 ());
     }
 }
 
 void
-ApWifiMac::TxFailed (uint8_t timeoutReason, Ptr<const WifiMacQueueItem> mpdu, const WifiTxVector& txVector)
+ApWifiMac::TxFailed (WifiMacDropReason timeoutReason, Ptr<const WifiMacQueueItem> mpdu)
 {
-  NS_LOG_FUNCTION (this << +timeoutReason << *mpdu << txVector);
+  NS_LOG_FUNCTION (this << +timeoutReason << *mpdu);
   const WifiMacHeader& hdr = mpdu->GetHeader ();
 
   if ((hdr.IsAssocResp () || hdr.IsReassocResp ())
-      && m_stationManager->IsWaitAssocTxOk (hdr.GetAddr1 ()))
+      && GetWifiRemoteStationManager ()->IsWaitAssocTxOk (hdr.GetAddr1 ()))
     {
       NS_LOG_DEBUG ("association failed with sta=" << hdr.GetAddr1 ());
-      m_stationManager->RecordGotAssocTxFailed (hdr.GetAddr1 ());
+      GetWifiRemoteStationManager ()->RecordGotAssocTxFailed (hdr.GetAddr1 ());
     }
 }
 
@@ -988,7 +1023,7 @@
       if (!hdr->IsFromDs ()
           && hdr->IsToDs ()
           && bssid == GetAddress ()
-          && m_stationManager->IsAssociated (from))
+          && GetWifiRemoteStationManager ()->IsAssociated (from))
         {
           Mac48Address to = hdr->GetAddr3 ();
           if (to == GetAddress ())
@@ -1013,7 +1048,7 @@
                 }
             }
           else if (to.IsGroup ()
-                   || m_stationManager->IsAssociated (to))
+                   || GetWifiRemoteStationManager ()->IsAssociated (to))
             {
               NS_LOG_DEBUG ("forwarding frame from=" << from << ", to=" << to);
               Ptr<Packet> copy = packet->Copy ();
@@ -1053,9 +1088,19 @@
     }
   else if (hdr->IsMgt ())
     {
-      if (hdr->IsProbeReq ())
+      if (hdr->IsProbeReq ()
+          && (hdr->GetAddr1 ().IsGroup () || hdr->GetAddr1 () == GetAddress ()))
         {
-          NS_ASSERT (hdr->GetAddr1 ().IsBroadcast ());
+          // In the case where the Address 1 field contains a group address, the
+          // Address 3 field also is validated to verify that the group addressed
+          // frame originated from a STA in the BSS of which the receiving STA is
+          // a member (Section 9.3.3.1 of 802.11-2020)
+          if (hdr->GetAddr1 ().IsGroup ()
+              && !hdr->GetAddr3 ().IsBroadcast () && hdr->GetAddr3 () != GetAddress ())
+            {
+              // not addressed to us
+              return;
+            }
           MgtProbeRequestHeader probeRequestHeader;
           packet->PeekHeader (probeRequestHeader);
           Ssid ssid = probeRequestHeader.GetSsid ();
@@ -1076,7 +1121,7 @@
               MgtAssocRequestHeader assocReq;
               packet->PeekHeader (assocReq);
               CapabilityInformation capabilities = assocReq.GetCapabilities ();
-              m_stationManager->AddSupportedPhyPreamble (from, capabilities.IsShortPreamble ());
+              GetWifiRemoteStationManager ()->AddSupportedPhyPreamble (from, capabilities.IsShortPreamble ());
               SupportedRates rates = assocReq.GetSupportedRates ();
               bool problem = false;
               if (rates.GetNRates () == 0)
@@ -1089,9 +1134,9 @@
                   HtCapabilities htcapabilities = assocReq.GetHtCapabilities ();
                   if (htcapabilities.IsSupportedMcs (0))
                     {
-                      for (uint8_t i = 0; i < m_stationManager->GetNBasicMcs (); i++)
+                      for (uint8_t i = 0; i < GetWifiRemoteStationManager ()->GetNBasicMcs (); i++)
                         {
-                          WifiMode mcs = m_stationManager->GetBasicMcs (i);
+                          WifiMode mcs = GetWifiRemoteStationManager ()->GetBasicMcs (i);
                           if (!htcapabilities.IsSupportedMcs (mcs.GetMcsValue ()))
                             {
                               problem = true;
@@ -1106,9 +1151,9 @@
                   VhtCapabilities vhtcapabilities = assocReq.GetVhtCapabilities ();
                   if (vhtcapabilities.GetVhtCapabilitiesInfo () != 0)
                     {
-                      for (uint8_t i = 0; i < m_stationManager->GetNBasicMcs (); i++)
+                      for (uint8_t i = 0; i < GetWifiRemoteStationManager ()->GetNBasicMcs (); i++)
                         {
-                          WifiMode mcs = m_stationManager->GetBasicMcs (i);
+                          WifiMode mcs = GetWifiRemoteStationManager ()->GetBasicMcs (i);
                           if (!vhtcapabilities.IsSupportedTxMcs (mcs.GetMcsValue ()))
                             {
                               problem = true;
@@ -1123,9 +1168,9 @@
                   HeCapabilities hecapabilities = assocReq.GetHeCapabilities ();
                   if (hecapabilities.GetSupportedMcsAndNss () != 0)
                     {
-                      for (uint8_t i = 0; i < m_stationManager->GetNBasicMcs (); i++)
+                      for (uint8_t i = 0; i < GetWifiRemoteStationManager ()->GetNBasicMcs (); i++)
                         {
-                          WifiMode mcs = m_stationManager->GetBasicMcs (i);
+                          WifiMode mcs = GetWifiRemoteStationManager ()->GetBasicMcs (i);
                           if (!hecapabilities.IsSupportedTxMcs (mcs.GetMcsValue ()))
                             {
                               problem = true;
@@ -1143,23 +1188,23 @@
                 {
                   NS_LOG_DEBUG ("The Basic Rate set modes are supported by the station");
                   //record all its supported modes in its associated WifiRemoteStation
-                  for (const auto & mode : m_phy->GetModeList ())
+                  for (const auto & mode : GetWifiPhy ()->GetModeList ())
                     {
-                      if (rates.IsSupportedRate (mode.GetDataRate (m_phy->GetChannelWidth ())))
+                      if (rates.IsSupportedRate (mode.GetDataRate (GetWifiPhy ()->GetChannelWidth ())))
                         {
-                          m_stationManager->AddSupportedMode (from, mode);
+                          GetWifiRemoteStationManager ()->AddSupportedMode (from, mode);
                         }
                     }
-                  if (GetErpSupported () && m_stationManager->GetErpOfdmSupported (from) && capabilities.IsShortSlotTime ())
+                  if (GetErpSupported () && GetWifiRemoteStationManager ()->GetErpOfdmSupported (from) && capabilities.IsShortSlotTime ())
                     {
-                      m_stationManager->AddSupportedErpSlotTime (from, true);
+                      GetWifiRemoteStationManager ()->AddSupportedErpSlotTime (from, true);
                     }
                   if (GetHtSupported ())
                     {
                       HtCapabilities htCapabilities = assocReq.GetHtCapabilities ();
                       if (htCapabilities.IsSupportedMcs (0))
                         {
-                          m_stationManager->AddStationHtCapabilities (from, htCapabilities);
+                          GetWifiRemoteStationManager ()->AddStationHtCapabilities (from, htCapabilities);
                         }
                     }
                   if (GetVhtSupported ())
@@ -1168,12 +1213,12 @@
                       //we will always fill in RxHighestSupportedLgiDataRate field at TX, so this can be used to check whether it supports VHT
                       if (vhtCapabilities.GetRxHighestSupportedLgiDataRate () > 0)
                         {
-                          m_stationManager->AddStationVhtCapabilities (from, vhtCapabilities);
-                          for (const auto & mcs : m_phy->GetMcsList (WIFI_MOD_CLASS_VHT))
+                          GetWifiRemoteStationManager ()->AddStationVhtCapabilities (from, vhtCapabilities);
+                          for (const auto & mcs : GetWifiPhy ()->GetMcsList (WIFI_MOD_CLASS_VHT))
                             {
                               if (vhtCapabilities.IsSupportedTxMcs (mcs.GetMcsValue ()))
                                 {
-                                  m_stationManager->AddSupportedMcs (hdr->GetAddr2 (), mcs);
+                                  GetWifiRemoteStationManager ()->AddSupportedMcs (hdr->GetAddr2 (), mcs);
                                   //here should add a control to add basic MCS when it is implemented
                                 }
                             }
@@ -1189,18 +1234,18 @@
                       HeCapabilities heCapabilities = assocReq.GetHeCapabilities ();
                       if (heCapabilities.GetSupportedMcsAndNss () != 0)
                         {
-                          m_stationManager->AddStationHeCapabilities (from, heCapabilities);
-                          for (const auto & mcs : m_phy->GetMcsList (WIFI_MOD_CLASS_HE))
+                          GetWifiRemoteStationManager ()->AddStationHeCapabilities (from, heCapabilities);
+                          for (const auto & mcs : GetWifiPhy ()->GetMcsList (WIFI_MOD_CLASS_HE))
                             {
                               if (heCapabilities.IsSupportedTxMcs (mcs.GetMcsValue ()))
                                 {
-                                  m_stationManager->AddSupportedMcs (hdr->GetAddr2 (), mcs);
+                                  GetWifiRemoteStationManager ()->AddSupportedMcs (hdr->GetAddr2 (), mcs);
                                   //here should add a control to add basic MCS when it is implemented
                                 }
                             }
                         }
                     }
-                  m_stationManager->RecordWaitAssocTxOk (from);
+                  GetWifiRemoteStationManager ()->RecordWaitAssocTxOk (from);
                   NS_LOG_DEBUG ("Send association response with success status");
                   SendAssocResp (hdr->GetAddr2 (), true, false);
                 }
@@ -1214,7 +1259,7 @@
               MgtReassocRequestHeader reassocReq;
               packet->PeekHeader (reassocReq);
               CapabilityInformation capabilities = reassocReq.GetCapabilities ();
-              m_stationManager->AddSupportedPhyPreamble (from, capabilities.IsShortPreamble ());
+              GetWifiRemoteStationManager ()->AddSupportedPhyPreamble (from, capabilities.IsShortPreamble ());
               SupportedRates rates = reassocReq.GetSupportedRates ();
               bool problem = false;
               if (rates.GetNRates () == 0)
@@ -1227,9 +1272,9 @@
                   HtCapabilities htcapabilities = reassocReq.GetHtCapabilities ();
                   if (htcapabilities.IsSupportedMcs (0))
                     {
-                      for (uint8_t i = 0; i < m_stationManager->GetNBasicMcs (); i++)
+                      for (uint8_t i = 0; i < GetWifiRemoteStationManager ()->GetNBasicMcs (); i++)
                         {
-                          WifiMode mcs = m_stationManager->GetBasicMcs (i);
+                          WifiMode mcs = GetWifiRemoteStationManager ()->GetBasicMcs (i);
                           if (!htcapabilities.IsSupportedMcs (mcs.GetMcsValue ()))
                             {
                               problem = true;
@@ -1244,9 +1289,9 @@
                   VhtCapabilities vhtcapabilities = reassocReq.GetVhtCapabilities ();
                   if (vhtcapabilities.GetVhtCapabilitiesInfo () != 0)
                     {
-                      for (uint8_t i = 0; i < m_stationManager->GetNBasicMcs (); i++)
+                      for (uint8_t i = 0; i < GetWifiRemoteStationManager ()->GetNBasicMcs (); i++)
                         {
-                          WifiMode mcs = m_stationManager->GetBasicMcs (i);
+                          WifiMode mcs = GetWifiRemoteStationManager ()->GetBasicMcs (i);
                           if (!vhtcapabilities.IsSupportedTxMcs (mcs.GetMcsValue ()))
                             {
                               problem = true;
@@ -1261,9 +1306,9 @@
                   HeCapabilities hecapabilities = reassocReq.GetHeCapabilities ();
                   if (hecapabilities.GetSupportedMcsAndNss () != 0)
                     {
-                      for (uint8_t i = 0; i < m_stationManager->GetNBasicMcs (); i++)
+                      for (uint8_t i = 0; i < GetWifiRemoteStationManager ()->GetNBasicMcs (); i++)
                         {
-                          WifiMode mcs = m_stationManager->GetBasicMcs (i);
+                          WifiMode mcs = GetWifiRemoteStationManager ()->GetBasicMcs (i);
                           if (!hecapabilities.IsSupportedTxMcs (mcs.GetMcsValue ()))
                             {
                               problem = true;
@@ -1281,23 +1326,23 @@
                 {
                   NS_LOG_DEBUG ("The Basic Rate set modes are supported by the station");
                   //update all its supported modes in its associated WifiRemoteStation
-                  for (const auto & mode : m_phy->GetModeList ())
+                  for (const auto & mode : GetWifiPhy ()->GetModeList ())
                     {
-                      if (rates.IsSupportedRate (mode.GetDataRate (m_phy->GetChannelWidth ())))
+                      if (rates.IsSupportedRate (mode.GetDataRate (GetWifiPhy ()->GetChannelWidth ())))
                         {
-                          m_stationManager->AddSupportedMode (from, mode);
+                          GetWifiRemoteStationManager ()->AddSupportedMode (from, mode);
                         }
                     }
-                  if (GetErpSupported () && m_stationManager->GetErpOfdmSupported (from) && capabilities.IsShortSlotTime ())
+                  if (GetErpSupported () && GetWifiRemoteStationManager ()->GetErpOfdmSupported (from) && capabilities.IsShortSlotTime ())
                     {
-                      m_stationManager->AddSupportedErpSlotTime (from, true);
+                      GetWifiRemoteStationManager ()->AddSupportedErpSlotTime (from, true);
                     }
                   if (GetHtSupported ())
                     {
                       HtCapabilities htCapabilities = reassocReq.GetHtCapabilities ();
                       if (htCapabilities.IsSupportedMcs (0))
                         {
-                          m_stationManager->AddStationHtCapabilities (from, htCapabilities);
+                          GetWifiRemoteStationManager ()->AddStationHtCapabilities (from, htCapabilities);
                         }
                     }
                   if (GetVhtSupported ())
@@ -1306,12 +1351,12 @@
                       //we will always fill in RxHighestSupportedLgiDataRate field at TX, so this can be used to check whether it supports VHT
                       if (vhtCapabilities.GetRxHighestSupportedLgiDataRate () > 0)
                         {
-                          m_stationManager->AddStationVhtCapabilities (from, vhtCapabilities);
-                          for (const auto & mcs : m_phy->GetMcsList (WIFI_MOD_CLASS_VHT))
+                          GetWifiRemoteStationManager ()->AddStationVhtCapabilities (from, vhtCapabilities);
+                          for (const auto & mcs : GetWifiPhy ()->GetMcsList (WIFI_MOD_CLASS_VHT))
                             {
                               if (vhtCapabilities.IsSupportedTxMcs (mcs.GetMcsValue ()))
                                 {
-                                  m_stationManager->AddSupportedMcs (hdr->GetAddr2 (), mcs);
+                                  GetWifiRemoteStationManager ()->AddSupportedMcs (hdr->GetAddr2 (), mcs);
                                   //here should add a control to add basic MCS when it is implemented
                                 }
                             }
@@ -1327,18 +1372,18 @@
                       HeCapabilities heCapabilities = reassocReq.GetHeCapabilities ();
                       if (heCapabilities.GetSupportedMcsAndNss () != 0)
                         {
-                          m_stationManager->AddStationHeCapabilities (from, heCapabilities);
-                          for (const auto & mcs : m_phy->GetMcsList (WIFI_MOD_CLASS_HE))
+                          GetWifiRemoteStationManager ()->AddStationHeCapabilities (from, heCapabilities);
+                          for (const auto & mcs : GetWifiPhy ()->GetMcsList (WIFI_MOD_CLASS_HE))
                             {
                               if (heCapabilities.IsSupportedTxMcs (mcs.GetMcsValue ()))
                                 {
-                                  m_stationManager->AddSupportedMcs (hdr->GetAddr2 (), mcs);
+                                  GetWifiRemoteStationManager ()->AddSupportedMcs (hdr->GetAddr2 (), mcs);
                                   //here should add a control to add basic MCS when it is implemented
                                 }
                             }
                         }
                     }
-                  m_stationManager->RecordWaitAssocTxOk (from);
+                  GetWifiRemoteStationManager ()->RecordWaitAssocTxOk (from);
                   NS_LOG_DEBUG ("Send reassociation response with success status");
                   SendAssocResp (hdr->GetAddr2 (), true, true);
                 }
@@ -1347,18 +1392,18 @@
           else if (hdr->IsDisassociation ())
             {
               NS_LOG_DEBUG ("Disassociation received from " << from);
-              m_stationManager->RecordDisassociated (from);
+              GetWifiRemoteStationManager ()->RecordDisassociated (from);
               for (auto it = m_staList.begin (); it != m_staList.end (); ++it)
                 {
                   if (it->second == from)
                     {
                       m_staList.erase (it);
                       m_deAssocLogger (it->first, it->second);
-                      if (m_stationManager->GetDsssSupported (from) && !m_stationManager->GetErpOfdmSupported (from))
+                      if (GetWifiRemoteStationManager ()->GetDsssSupported (from) && !GetWifiRemoteStationManager ()->GetErpOfdmSupported (from))
                         {
                           m_numNonErpStations--;
                         }
-                      if (!m_stationManager->GetHtSupported (from))
+                      if (!GetWifiRemoteStationManager ()->GetHtSupported (from))
                         {
                           m_numNonHtStations--;
                         }
@@ -1375,7 +1420,7 @@
   //Invoke the receive handler of our parent class to deal with any
   //other frames. Specifically, this will handle Block Ack-related
   //Management Action frames.
-  RegularWifiMac::Receive (Create<WifiMacQueueItem> (packet, *hdr));
+  WifiMac::Receive (Create<WifiMacQueueItem> (packet, *hdr));
 }
 
 void
@@ -1420,8 +1465,8 @@
         }
     }
   NS_ABORT_IF (!TraceConnectWithoutContext ("AckedMpdu", MakeCallback (&ApWifiMac::TxOk, this)));
-  NS_ABORT_IF (!TraceConnectWithoutContext ("MpduResponseTimeout", MakeCallback (&ApWifiMac::TxFailed, this)));
-  RegularWifiMac::DoInitialize ();
+  NS_ABORT_IF (!TraceConnectWithoutContext ("DroppedMpdu", MakeCallback (&ApWifiMac::TxFailed, this)));
+  WifiMac::DoInitialize ();
   UpdateShortSlotTimeEnabled ();
   UpdateShortPreambleEnabled ();
 }
@@ -1430,7 +1475,7 @@
 ApWifiMac::GetUseNonErpProtection (void) const
 {
   bool useProtection = (m_numNonErpStations > 0) && m_enableNonErpProtection;
-  m_stationManager->SetUseNonErpProtection (useProtection);
+  GetWifiRemoteStationManager ()->SetUseNonErpProtection (useProtection);
   return useProtection;
 }
 
@@ -1458,7 +1503,7 @@
 uint16_t
 ApWifiMac::GetAssociationId (Mac48Address addr) const
 {
-  return m_stationManager->GetAssociationId (addr);
+  return GetWifiRemoteStationManager ()->GetAssociationId (addr);
 }
 
 uint8_t
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/ap-wifi-mac.h ns-3.36/src/wifi/model/ap-wifi-mac.h
--- ns-3.35/src/wifi/model/ap-wifi-mac.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/ap-wifi-mac.h	2022-04-30 18:23:58.202735200 -0700
@@ -23,7 +23,7 @@
 #ifndef AP_WIFI_MAC_H
 #define AP_WIFI_MAC_H
 
-#include "regular-wifi-mac.h"
+#include "wifi-mac.h"
 #include <unordered_map>
 
 namespace ns3 {
@@ -38,6 +38,7 @@
 class VhtOperation;
 class HeOperation;
 class CfParameterSet;
+class UniformRandomVariable;
 
 /**
  * \brief Wi-Fi AP state machine
@@ -46,7 +47,7 @@
  * Handle association, dis-association and authentication,
  * of STAs within an infrastructure BSS.
  */
-class ApWifiMac : public RegularWifiMac
+class ApWifiMac : public WifiMac
 {
 public:
   /**
@@ -59,6 +60,7 @@
   virtual ~ApWifiMac ();
 
   void SetLinkUpCallback (Callback<void> linkUp) override;
+  bool CanForwardPacketsTo (Mac48Address to) const override;
   void Enqueue (Ptr<Packet> packet, Mac48Address to) override;
   void Enqueue (Ptr<Packet> packet, Mac48Address to, Mac48Address from) override;
   bool SupportsSendFrom (void) const override;
@@ -162,9 +164,8 @@
    *
    * \param timeoutReason the reason why the TX timer was started (\see WifiTxTimer::Reason)
    * \param mpdu the MPDU that we failed to sent
-   * \param txVector the TX vector used to send the MPDU
    */
-  void TxFailed (uint8_t timeoutReason, Ptr<const WifiMacQueueItem> mpdu, const WifiTxVector& txVector);
+  void TxFailed (WifiMacDropReason timeoutReason, Ptr<const WifiMacQueueItem> mpdu);
 
   /**
    * This method is called to de-aggregate an A-MSDU and forward the
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/block-ack-agreement.cc ns-3.36/src/wifi/model/block-ack-agreement.cc
--- ns-3.35/src/wifi/model/block-ack-agreement.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/block-ack-agreement.cc	2022-04-30 18:23:58.202735200 -0700
@@ -137,13 +137,13 @@
 bool
 BlockAckAgreement::IsImmediateBlockAck (void) const
 {
-  return (m_blockAckPolicy == 1);
+  return m_blockAckPolicy == 1;
 }
 
 bool
 BlockAckAgreement::IsAmsduSupported (void) const
 {
-  return (m_amsduSupported == 1) ? true : false;
+  return m_amsduSupported == 1;
 }
 
 uint16_t
@@ -162,7 +162,7 @@
 bool
 BlockAckAgreement::IsHtSupported (void) const
 {
-  return (m_htSupported == 1) ? true : false;
+  return m_htSupported == 1;
 }
 
 BlockAckType
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/block-ack-manager.cc ns-3.36/src/wifi/model/block-ack-manager.cc
--- ns-3.35/src/wifi/model/block-ack-manager.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/block-ack-manager.cc	2022-04-30 18:23:58.202735200 -0700
@@ -27,6 +27,7 @@
 #include "wifi-mac-queue.h"
 #include "qos-utils.h"
 #include "wifi-tx-vector.h"
+#include <optional>
 
 namespace ns3 {
 
@@ -184,7 +185,7 @@
   if (it != m_agreements.end ())
     {
       OriginatorBlockAckAgreement& agreement = it->second.first;
-      agreement.SetBufferSize (respHdr->GetBufferSize () + 1);
+      agreement.SetBufferSize (respHdr->GetBufferSize ());
       agreement.SetTimeout (respHdr->GetTimeout ());
       agreement.SetAmsduSupport (respHdr->IsAmsduSupported ());
       agreement.SetStartingSequence (startingSeq);
@@ -236,8 +237,8 @@
 
   // store the packet and keep the list sorted in increasing order of sequence number
   // with respect to the starting sequence number
-  PacketQueueI it = agreementIt->second.second.begin ();
-  while (it != agreementIt->second.second.end ())
+  auto it = agreementIt->second.second.rbegin ();
+  while (it != agreementIt->second.second.rend ())
     {
       if (mpdu->GetHeader ().GetSequenceControl () == (*it)->GetHeader ().GetSequenceControl ())
         {
@@ -247,15 +248,15 @@
 
       uint16_t dist = agreementIt->second.first.GetDistance ((*it)->GetHeader ().GetSequenceNumber ());
 
-      if (mpduDist < dist ||
-          (mpduDist == dist && mpdu->GetHeader ().GetFragmentNumber () < (*it)->GetHeader ().GetFragmentNumber ()))
+      if (mpduDist > dist ||
+          (mpduDist == dist && mpdu->GetHeader ().GetFragmentNumber () > (*it)->GetHeader ().GetFragmentNumber ()))
         {
           break;
         }
 
       it++;
     }
-  agreementIt->second.second.insert (it, mpdu);
+  agreementIt->second.second.insert (it.base (), mpdu);
   agreementIt->second.first.NotifyTransmittedMpdu (mpdu);
   mpdu->SetInFlight ();
 }
@@ -293,7 +294,7 @@
               continue;
             }
           if (nextBar->skipIfNoDataQueued
-              && m_queue->PeekByTidAndAddress (nextBar->tid, recipient) == m_queue->end ())
+              && m_queue->PeekByTidAndAddress (nextBar->tid, recipient) == nullptr)
             {
               // skip this BAR as there is no data queued
               nextBar++;
@@ -309,8 +310,6 @@
                   continue;
                 }
 
-              WifiMacQueue::ConstIterator queueIt = (*mpduIt)->GetQueueIterator ();
-
               if ((*mpduIt)->GetTimeStamp () + m_queue->GetMaxDelay () <= now)
                 {
                   // MPDU expired
@@ -319,7 +318,7 @@
                   // consequent call to NotifyDiscardedMpdu does nothing (in particular,
                   // does not schedule a BAR) because we have advanced the transmit window
                   // and hence this MPDU became an old packet
-                  m_queue->TtlExceeded (queueIt, now);
+                  m_queue->TtlExceeded (*mpduIt, now);
                   mpduIt = it->second.second.erase (mpduIt);
                 }
               else
@@ -391,7 +390,6 @@
     }
 
   WifiMacHeader& hdr = (*mpduIt)->GetHeader ();
-  WifiMacQueue::ConstIterator queueIt = (*mpduIt)->GetQueueIterator ();
 
   NS_ASSERT (hdr.GetAddr1 () == it->first.first);
   NS_ASSERT (hdr.IsQosData () && hdr.GetQosTid () == it->first.second);
@@ -401,21 +399,25 @@
       NS_LOG_DEBUG ("Old packet. Remove from the EDCA queue, too");
       if (!m_droppedOldMpduCallback.IsNull ())
         {
-          m_droppedOldMpduCallback (*queueIt);
+          m_droppedOldMpduCallback (*mpduIt);
         }
-      m_queue->Remove (queueIt);
+      m_queue->Remove (*mpduIt, false);
       return it->second.second.erase (mpduIt);
     }
 
-  auto nextIt = std::next (mpduIt);
+  std::optional<PacketQueueI> prevIt;
+  if (mpduIt != it->second.second.begin ())
+    {
+      prevIt = std::prev (mpduIt);
+    }
 
-  if (m_queue->TtlExceeded (queueIt, now))
+  if (m_queue->TtlExceeded (*mpduIt, now))
     {
       // WifiMacQueue::TtlExceeded() has removed the MPDU from the EDCA queue
       // and fired the Expired trace source, which called NotifyDiscardedMpdu,
-      // which removed this MPDU from the in flight queue as well
+      // which removed this MPDU (and possibly others) from the in flight queue as well
       NS_LOG_DEBUG ("MSDU lifetime expired, drop MPDU");
-      return nextIt;
+      return (prevIt.has_value () ? std::next (prevIt.value ()) : it->second.second.begin ());
     }
 
   if (status == STAY_INFLIGHT)
@@ -444,6 +446,8 @@
   AgreementsI it = m_agreements.find (std::make_pair (recipient, tid));
   NS_ASSERT (it != m_agreements.end ());
 
+  it->second.first.NotifyAckedMpdu (mpdu);
+
   // remove the acknowledged frame from the queue of outstanding packets
   for (auto queueIt = it->second.second.begin (); queueIt != it->second.second.end (); ++queueIt)
     {
@@ -453,8 +457,6 @@
           break;
         }
     }
-
-  it->second.first.NotifyAckedMpdu (mpdu);
 }
 
 void
@@ -547,7 +549,7 @@
     }
   return {nSuccessfulMpdus, nFailedMpdus};
 }
-  
+
 void
 BlockAckManager::NotifyMissedBlockAck (Mac48Address recipient, uint8_t tid)
 {
@@ -608,6 +610,7 @@
     {
       if (it->second.first.GetDistance ((*mpduIt)->GetHeader ().GetSequenceNumber ()) >= SEQNO_SPACE_HALF_SIZE)
         {
+          NS_LOG_DEBUG ("Dropping old MPDU: " << **mpduIt);
           m_queue->DequeueIfQueued (*mpduIt);
           if (!m_droppedOldMpduCallback.IsNull ())
             {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/channel-access-manager.cc ns-3.36/src/wifi/model/channel-access-manager.cc
--- ns-3.35/src/wifi/model/channel-access-manager.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/channel-access-manager.cc	2022-04-30 18:23:58.202735200 -0700
@@ -660,6 +660,9 @@
       m_accessTimeout.Cancel ();
     }
 
+  // Notify the FEM, which will in turn notify the MAC
+  m_feManager->NotifySwitchingStartNow (duration);
+
   //Reset backoffs
   for (auto txop : m_txops)
     {
@@ -671,7 +674,6 @@
         }
       txop->ResetCw ();
       txop->m_access = Txop::NOT_REQUESTED;
-      txop->NotifyChannelSwitching ();
     }
 
   NS_LOG_DEBUG ("switching start for " << duration);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/ctrl-headers.cc ns-3.36/src/wifi/model/ctrl-headers.cc
--- ns-3.35/src/wifi/model/ctrl-headers.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/ctrl-headers.cc	2022-04-30 18:23:58.202735200 -0700
@@ -160,7 +160,7 @@
 void
 CtrlBAckRequestHeader::SetBarControl (uint16_t bar)
 {
-  m_barAckPolicy = ((bar & 0x01) == 1) ? true : false;
+  m_barAckPolicy = ((bar & 0x01) == 1);
   if (((bar >> 1) & 0x0f) == 0x03)
     {
       m_barType.m_variant = BlockAckReqType::MULTI_TID;
@@ -244,25 +244,25 @@
 bool
 CtrlBAckRequestHeader::IsBasic (void) const
 {
-  return (m_barType.m_variant == BlockAckReqType::BASIC) ? true : false;
+  return m_barType.m_variant == BlockAckReqType::BASIC;
 }
 
 bool
 CtrlBAckRequestHeader::IsCompressed (void) const
 {
-  return (m_barType.m_variant == BlockAckReqType::COMPRESSED) ? true : false;
+  return m_barType.m_variant == BlockAckReqType::COMPRESSED;
 }
 
 bool
 CtrlBAckRequestHeader::IsExtendedCompressed (void) const
 {
-  return (m_barType.m_variant == BlockAckReqType::EXTENDED_COMPRESSED) ? true : false;
+  return m_barType.m_variant == BlockAckReqType::EXTENDED_COMPRESSED;
 }
 
 bool
 CtrlBAckRequestHeader::IsMultiTid (void) const
 {
-  return (m_barType.m_variant == BlockAckReqType::MULTI_TID) ? true : false;
+  return m_barType.m_variant == BlockAckReqType::MULTI_TID;
 }
 
 
@@ -503,7 +503,7 @@
 bool
 CtrlBAckResponseHeader::MustSendHtImmediateAck (void) const
 {
-  return (m_baAckPolicy) ? true : false;
+  return m_baAckPolicy;
 }
 
 uint8_t
@@ -539,31 +539,31 @@
 bool
 CtrlBAckResponseHeader::IsBasic (void) const
 {
-  return (m_baType.m_variant == BlockAckType::BASIC) ? true : false;
+  return m_baType.m_variant == BlockAckType::BASIC;
 }
 
 bool
 CtrlBAckResponseHeader::IsCompressed (void) const
 {
-  return (m_baType.m_variant == BlockAckType::COMPRESSED) ? true : false;
+  return m_baType.m_variant == BlockAckType::COMPRESSED;
 }
 
 bool
 CtrlBAckResponseHeader::IsExtendedCompressed (void) const
 {
-  return (m_baType.m_variant == BlockAckType::EXTENDED_COMPRESSED) ? true : false;
+  return m_baType.m_variant == BlockAckType::EXTENDED_COMPRESSED;
 }
 
 bool
 CtrlBAckResponseHeader::IsMultiTid (void) const
 {
-  return (m_baType.m_variant == BlockAckType::MULTI_TID) ? true : false;
+  return m_baType.m_variant == BlockAckType::MULTI_TID;
 }
 
 bool
 CtrlBAckResponseHeader::IsMultiSta (void) const
 {
-  return (m_baType.m_variant == BlockAckType::MULTI_STA) ? true : false;
+  return m_baType.m_variant == BlockAckType::MULTI_STA;
 }
 
 void
@@ -679,7 +679,7 @@
 void
 CtrlBAckResponseHeader::SetBaControl (uint16_t ba)
 {
-  m_baAckPolicy = ((ba & 0x01) == 1) ? true : false;
+  m_baAckPolicy = ((ba & 0x01) == 1);
   if (((ba >> 1) & 0x0f) == 0x03)
     {
       SetType (BlockAckType::MULTI_TID);
@@ -963,7 +963,7 @@
         {
           uint16_t i = IndexInBitmap (seq, index);
           uint8_t mask = uint8_t (0x01) << (i % 8);
-          return ((m_baInfo[index].m_bitmap[i / 8] & mask) != 0) ? true : false;
+          return (m_baInfo[index].m_bitmap[i / 8] & mask) != 0;
         }
       case BlockAckType::MULTI_TID:
         NS_FATAL_ERROR ("Multi-tid block ack is not supported.");
@@ -986,7 +986,7 @@
   switch (m_baType.m_variant)
     {
       case BlockAckType::BASIC:
-        return ((m_baInfo[0].m_bitmap[IndexInBitmap (seq) * 2 + frag / 8] & (0x01 << (frag % 8))) != 0) ? true : false;
+        return (m_baInfo[0].m_bitmap[IndexInBitmap (seq) * 2 + frag / 8] & (0x01 << (frag % 8))) != 0;
       case BlockAckType::COMPRESSED:
       case BlockAckType::EXTENDED_COMPRESSED:
       case BlockAckType::MULTI_STA:
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/frame-exchange-manager.cc ns-3.36/src/wifi/model/frame-exchange-manager.cc
--- ns-3.35/src/wifi/model/frame-exchange-manager.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/frame-exchange-manager.cc	2022-04-30 18:23:58.206735100 -0700
@@ -127,7 +127,7 @@
 }
 
 void
-FrameExchangeManager::SetWifiMac (Ptr<RegularWifiMac> mac)
+FrameExchangeManager::SetWifiMac (Ptr<WifiMac> mac)
 {
   NS_LOG_FUNCTION (this << mac);
   m_mac = mac;
@@ -281,7 +281,7 @@
     }
 
   m_dcf->NotifyChannelAccessed ();
-  Ptr<WifiMacQueueItem> mpdu = *queue->Peek ()->GetQueueIterator ();
+  Ptr<WifiMacQueueItem> mpdu = queue->Peek ()->GetItem ();
   NS_ASSERT (mpdu != 0);
   NS_ASSERT (mpdu->GetHeader ().IsData () || mpdu->GetHeader ().IsMgt ());
 
@@ -327,15 +327,12 @@
     {
       NS_LOG_DEBUG ("Fragmenting the MSDU");
       m_fragmentedPacket = mpdu->GetPacket ()->Copy ();
-      AcIndex ac = mpdu->GetQueueAc ();
-      // dequeue the MSDU
-      DequeueMpdu (mpdu);
       // create the first fragment
-      mpdu->GetHeader ().SetMoreFragments ();
       Ptr<Packet> fragment = m_fragmentedPacket->CreateFragment (0, m_mac->GetWifiRemoteStationManager ()->GetFragmentSize (mpdu, 0));
       // enqueue the first fragment
       Ptr<WifiMacQueueItem> item = Create<WifiMacQueueItem> (fragment, mpdu->GetHeader (), mpdu->GetTimeStamp ());
-      m_mac->GetTxopQueue (ac)->PushFront (item);
+      item->GetHeader ().SetMoreFragments ();
+      m_mac->GetTxopQueue (mpdu->GetQueueAc ())->Replace (mpdu, item);
       return item;
     }
   return mpdu;
@@ -388,7 +385,8 @@
 {
   NS_LOG_FUNCTION (this);
 
-  Time txDuration = m_phy->CalculateTxDuration (m_mpdu->GetSize (), m_txParams.m_txVector, m_phy->GetPhyBand ());
+  Time txDuration = m_phy->CalculateTxDuration (GetPsduSize (m_mpdu, m_txParams.m_txVector),
+                                                m_txParams.m_txVector, m_phy->GetPhyBand ());
 
   NS_ASSERT (m_txParams.m_acknowledgment);
 
@@ -405,7 +403,8 @@
     }
   else if (m_txParams.m_acknowledgment->method == WifiAcknowledgment::NORMAL_ACK)
     {
-      m_mpdu->GetHeader ().SetDuration (GetFrameDurationId (m_mpdu->GetHeader (), m_mpdu->GetSize (),
+      m_mpdu->GetHeader ().SetDuration (GetFrameDurationId (m_mpdu->GetHeader (),
+                                                            GetPsduSize (m_mpdu, m_txParams.m_txVector),
                                                             m_txParams, m_fragmentedPacket));
 
       // the timeout duration is "aSIFSTime + aSlotTime + aRxPHYStartDelay, starting
@@ -457,6 +456,12 @@
     }
 }
 
+uint32_t
+FrameExchangeManager::GetPsduSize (Ptr<const WifiMacQueueItem> mpdu, const WifiTxVector& txVector) const
+{
+  return mpdu->GetSize ();
+}
+
 void
 FrameExchangeManager::CalculateProtectionTime (WifiProtection* protection) const
 {
@@ -805,29 +810,47 @@
 {
   NS_LOG_FUNCTION (this << *rts << txVector);
 
-  m_mac->GetWifiRemoteStationManager ()->ReportRtsFailed (m_mpdu->GetHeader ());
+  DoCtsTimeout (Create<WifiPsdu> (m_mpdu, true));
+  m_mpdu = nullptr;
+}
+
+void
+FrameExchangeManager::DoCtsTimeout (Ptr<WifiPsdu> psdu)
+{
+  NS_LOG_FUNCTION (this << *psdu);
+
+  m_mac->GetWifiRemoteStationManager ()->ReportRtsFailed (psdu->GetHeader (0));
 
-  if (!m_mac->GetWifiRemoteStationManager ()->NeedRetransmission (m_mpdu))
+  if (!m_mac->GetWifiRemoteStationManager ()->NeedRetransmission (*psdu->begin ()))
     {
-      NS_LOG_DEBUG ("Missed CTS, discard MPDU");
-      // Dequeue the MPDU if it is stored in a queue
-      DequeueMpdu (m_mpdu);
-      NotifyPacketDiscarded (m_mpdu);
-      m_mac->GetWifiRemoteStationManager ()->ReportFinalRtsFailed (m_mpdu->GetHeader ());
+      NS_LOG_DEBUG ("Missed CTS, discard MPDU(s)");
+      m_mac->GetWifiRemoteStationManager ()->ReportFinalRtsFailed (psdu->GetHeader (0));
+      for (const auto& mpdu : *PeekPointer (psdu))
+        {
+          // Dequeue the MPDU if it is stored in a queue
+          DequeueMpdu (mpdu);
+          NotifyPacketDiscarded (mpdu);
+        }
       m_dcf->ResetCw ();
     }
   else
     {
-      NS_LOG_DEBUG ("Missed CTS, retransmit RTS");
-      RetransmitMpduAfterMissedCts (m_mpdu);
+      NS_LOG_DEBUG ("Missed CTS, retransmit MPDU(s)");
       m_dcf->UpdateFailedCw ();
     }
-  m_mpdu = 0;
+  // Make the sequence numbers of the MPDUs available again if the MPDUs have never
+  // been transmitted, both in case the MPDUs have been discarded and in case the
+  // MPDUs have to be transmitted (because a new sequence number is assigned to
+  // MPDUs that have never been transmitted and are selected for transmission)
+  for (const auto& mpdu : *PeekPointer (psdu))
+    {
+      ReleaseSequenceNumber (mpdu);
+    }
   TransmissionFailed ();
 }
 
 void
-FrameExchangeManager::RetransmitMpduAfterMissedCts (Ptr<WifiMacQueueItem> mpdu) const
+FrameExchangeManager::ReleaseSequenceNumber (Ptr<WifiMacQueueItem> mpdu) const
 {
   NS_LOG_FUNCTION (this << *mpdu);
 
@@ -859,7 +882,11 @@
 
   if (mpdu != nullptr)
     {
-      m_mac->GetWifiRemoteStationManager ()->ReportDataFailed (mpdu);
+      if (mpdu->GetHeader ().HasData ()
+          && !mpdu->GetHeader ().GetAddr1 ().IsGroup ())
+        {
+          m_mac->GetWifiRemoteStationManager ()->ReportDataFailed (mpdu);
+        }
 
       if (!mpdu->GetHeader ().GetAddr1 ().IsGroup ()
           && !m_mac->GetWifiRemoteStationManager ()->NeedRetransmission (mpdu))
@@ -884,8 +911,15 @@
 FrameExchangeManager::NotifySwitchingStartNow (Time duration)
 {
   NS_LOG_DEBUG ("Switching channel. Cancelling MAC pending events");
-  m_mac->GetWifiRemoteStationManager ()->Reset ();
-  Reset ();
+  m_mac->NotifyChannelSwitching ();
+  if (m_txTimer.IsRunning ())
+    {
+      // we were transmitting something before channel switching. Since we will
+      // not be able to receive the response, have the timer expire now, so that
+      // we perform the actions required in case of missing response
+      m_txTimer.Reschedule (Seconds (0));
+    }
+  Simulator::ScheduleNow (&FrameExchangeManager::Reset, this);
 }
 
 void
@@ -1142,16 +1176,17 @@
   // a frame containing all or part of an MSDU or MMPDU (sec. 10.3.3 of 802.11-2016)
   m_dcf->ResetCw ();
 
-  // The MPDU has been acknowledged, we can now dequeue it if it is stored in a queue
-  DequeueMpdu (mpdu);
-
   if (mpdu->GetHeader ().IsMoreFragments ())
     {
-      // enqueue the next fragment
-      Ptr<WifiMacQueueItem> next = GetNextFragment ();
-      m_dcf->GetWifiMacQueue ()->PushFront (next);
+      // replace the current fragment with the next one
+      m_dcf->GetWifiMacQueue ()->Replace (mpdu, GetNextFragment ());
       m_moreFragments = true;
     }
+  else
+    {
+      // the MPDU has been acknowledged, we can now dequeue it if it is stored in a queue
+      DequeueMpdu (mpdu);
+    }
 
   TransmissionSucceeded ();
 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/frame-exchange-manager.h ns-3.36/src/wifi/model/frame-exchange-manager.h
--- ns-3.35/src/wifi/model/frame-exchange-manager.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/frame-exchange-manager.h	2022-04-30 18:23:58.206735100 -0700
@@ -25,7 +25,7 @@
 #include "qos-txop.h"
 #include "wifi-tx-vector.h"
 #include "wifi-psdu.h"
-#include "regular-wifi-mac.h"
+#include "wifi-mac.h"
 #include "mac-rx-middle.h"
 #include "mac-tx-middle.h"
 #include "wifi-phy.h"
@@ -96,7 +96,7 @@
    *
    * \param mac the MAC layer to use
    */
-  virtual void SetWifiMac (const Ptr<RegularWifiMac> mac);
+  virtual void SetWifiMac (const Ptr<WifiMac> mac);
   /**
    * Set the MAC TX Middle to use.
    *
@@ -226,7 +226,7 @@
    * the MAC layer that a channel switching occurred. When a channel switching
    * occurs, pending MAC transmissions (RTS, CTS, Data and Ack) are cancelled.
    */
-  void NotifySwitchingStartNow (Time duration);
+  virtual void NotifySwitchingStartNow (Time duration);
 
   /**
    * This method is typically invoked by the PhyListener to notify
@@ -329,11 +329,12 @@
   virtual void RetransmitMpduAfterMissedAck (Ptr<WifiMacQueueItem> mpdu) const;
 
   /**
-   * Retransmit an MPDU that was not sent because a CTS was not received.
+   * Make the sequence number of the given MPDU available again if the MPDU has
+   * never been transmitted.
    *
-   * \param mpdu the MPDU to retransmit
+   * \param mpdu the given MPDU
    */
-  virtual void RetransmitMpduAfterMissedCts (Ptr<WifiMacQueueItem> mpdu) const;
+  virtual void ReleaseSequenceNumber (Ptr<WifiMacQueueItem> mpdu) const;
 
   /**
    * Pass the given MPDU, discarded because of the max retry limit was reached,
@@ -375,10 +376,21 @@
    */
   void UpdateTxDuration (Mac48Address receiver, WifiTxParameters& txParams) const;
 
+  /**
+   * Get the size in bytes of the given MPDU, which is to be transmitted with the
+   * given TXVECTOR. The purpose of this method is that it can be overridden to
+   * compute the size of an S-MPDU.
+   *
+   * \param mpdu the given MPDU
+   * \param txVector the given TXVECTOR
+   * \return the size of the MPDU
+   */
+  virtual uint32_t GetPsduSize (Ptr<const WifiMacQueueItem> mpdu, const WifiTxVector& txVector) const;
+
   Ptr<Txop> m_dcf;                                  //!< the DCF/EDCAF that gained channel access
   WifiTxTimer m_txTimer;                            //!< the timer set upon frame transmission
   EventId m_navResetEvent;                          //!< the event to reset the NAV after an RTS
-  Ptr<RegularWifiMac> m_mac;                        //!< the MAC layer on this station
+  Ptr<WifiMac> m_mac;                               //!< the MAC layer on this station
   Ptr<MacTxMiddle> m_txMiddle;                      //!< the MAC TX Middle on this station
   Ptr<MacRxMiddle> m_rxMiddle;                      //!< the MAC RX Middle on this station
   Ptr<ChannelAccessManager> m_channelAccessManager; //!< the channel access manager
@@ -510,7 +522,7 @@
    * \param mpdu the MPDU that solicited a Normal Ack response
    * \param txVector the TXVECTOR used to transmit the frame soliciting the Normal Ack
    */
-  void NormalAckTimeout (Ptr<WifiMacQueueItem> mpdu, const WifiTxVector& txVector);
+  virtual void NormalAckTimeout (Ptr<WifiMacQueueItem> mpdu, const WifiTxVector& txVector);
 
   /**
    * Called when the CTS timeout expires.
@@ -519,6 +531,13 @@
    * \param txVector the TXVECTOR used to transmit the RTS frame
    */
   virtual void CtsTimeout (Ptr<WifiMacQueueItem> rts, const WifiTxVector& txVector);
+  /**
+   * Take required actions when the CTS timer fired after sending an RTS to
+   * protect the given PSDU expires.
+   *
+   * \param psdu the PSDU protected by the failed RTS
+   */
+  void DoCtsTimeout (Ptr<WifiPsdu> psdu);
 
 private:
   /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/he/he-capabilities.cc ns-3.36/src/wifi/model/he/he-capabilities.cc
--- ns-3.35/src/wifi/model/he/he-capabilities.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/he/he-capabilities.cc	2022-04-30 18:23:58.206735100 -0700
@@ -31,58 +31,91 @@
     m_maximumNumberOfFragmentedMsdus (0),
     m_minimumFragmentSize (0),
     m_triggerFrameMacPaddingDuration (0),
-    m_multiTidAggregationSupport (0),
+    m_multiTidAggregationRxSupport (0),
     m_heLinkAdaptation (0),
     m_allAckSupport (0),
-    m_ulMuResponseSchedulingSupport (0),
-    m_aBsrSupport (0),
+    m_trsSupport (0),
+    m_bsrSupport (0),
     m_broadcastTwtSupport (0),
     m_32bitBaBitmapSupport (0),
     m_muCascadeSupport (0),
-    m_ackEnabledMultiTidAggregationSupport (0),
-    m_groupAddressedMultiStaBlockAckInDlMuSupport (0),
+    m_ackEnabledAggregationSupport (0),
     m_omControlSupport (0),
     m_ofdmaRaSupport (0),
     m_maxAmpduLengthExponent (0),
     m_amsduFragmentationSupport (0),
     m_flexibleTwtScheduleSupport (0),
     m_rxControlFrameToMultiBss (0),
-    m_bsrpAmpduAggregation (0),
+    m_bsrpBqrpAmpduAggregation (0),
     m_qtpSupport (0),
-    m_aBqrSupport (0),
-    m_dualBandSupport (0),
+    m_bqrSupport (0),
+    m_psrResponder (0),
+    m_ndpFeedbackReportSupport (0),
+    m_opsSupport (0),
+    m_amsduNotUnderBaInAmpduSupport (0),
+    m_multiTidAggregationTxSupport (0),
+    m_heSubchannelSelectiveTxSupport (0),
+    m_ul2x996ToneRuSupport (0),
+    m_omControlUlMuDataDisableRxSupport (0),
+    m_heDynamicSmPowerSave (0),
+    m_puncturedSoundingSupport (0),
+    m_heVhtTriggerFrameRxSupport (0),
     m_channelWidthSet (0),
-    m_preamblePuncturingRx (0),
+    m_puncturedPreambleRx (0),
     m_deviceClass (0),
     m_ldpcCodingInPayload (0),
-    m_heLtfAndGiForHePpdus (0),
-    m_heLtfAndGiForNdp (0),
-    m_stbcTxAndRx (0),
-    m_doppler (0),
-    m_ulMu (0),
-    m_dcmEncodingTx (0),
-    m_dcmEncodingRx (0),
-    m_ulHeMuPpduPayloadSupport (0),
+    m_heSuPpdu1xHeLtf800nsGi (0),
+    m_midambleRxMaxNsts (0),
+    m_ndp4xHeLtfAnd32msGi (0),
+    m_stbcTxLeq80MHz (0),
+    m_stbcRxLeq80MHz (0),
+    m_dopplerTx (0),
+    m_dopplerRx (0),
+    m_fullBwUlMuMimo (0),
+    m_partialBwUlMuMimo (0),
+    m_dcmMaxConstellationTx (0),
+    m_dcmMaxNssTx (0),
+    m_dcmMaxConstellationRx (0),
+    m_dcmMaxNssRx (0),
+    m_rxPartialBwSuInHeMu (0),
     m_suBeamformer (0),
     m_suBeamformee (0),
     m_muBeamformer (0),
     m_beamformeeStsForSmallerOrEqualThan80Mhz (0),
-    m_nstsTotalForSmallerOrEqualThan80Mhz (0),
     m_beamformeeStsForLargerThan80Mhz (0),
-    m_nstsTotalForLargerThan80Mhz (0),
     m_numberOfSoundingDimensionsForSmallerOrEqualThan80Mhz (0),
     m_numberOfSoundingDimensionsForLargerThan80Mhz (0),
     m_ngEqual16ForSuFeedbackSupport (0),
     m_ngEqual16ForMuFeedbackSupport (0),
-    m_codebookSize42ForSuSupport (0),
-    m_codebookSize75ForSuSupport (0),
-    m_beamformingFeedbackWithTriggerFrame (0),
-    m_heErSuPpduPayload (0),
+    m_codebookSize42SuFeedback (0),
+    m_codebookSize75MuFeedback (0),
+    m_triggeredSuBfFeedback (0),
+    m_triggeredMuBfFeedback (0),
+    m_triggeredCqiFeedback (0),
+    m_erPartialBandwidth (0),
     m_dlMuMimoOnPartialBandwidth (0),
     m_ppeThresholdPresent (0),
-    m_srpBasedSrSupport (0),
+    m_psrBasedSrSupport (0),
     m_powerBoostFactorAlphaSupport (0),
-    m_4TimesHeLtfAnd800NsGiSupportForHePpdus (0),
+    m_hePpdu4xHeLtf800nsGi (0),
+    m_maxNc (0),
+    m_stbcTxGt80MHz (0),
+    m_stbcRxGt80MHz (0),
+    m_heErSuPpdu4xHeLtf08sGi (0),
+    m_hePpdu20MHzIn40MHz24GHz (0),
+    m_hePpdu20MHzIn160MHz (0),
+    m_hePpdu80MHzIn160MHz (0),
+    m_heErSuPpdu1xHeLtf08Gi (0),
+    m_midamble2xAnd1xHeLtf (0),
+    m_dcmMaxRu (0),
+    m_longerThan16HeSigbOfdm (0),
+    m_nonTriggeredCqiFeedback (0),
+    m_tx1024QamLt242Ru (0),
+    m_rx1024QamLt242Ru (0),
+    m_rxFullBwSuInHeMuCompressedSigB (0),
+    m_rxFullBwSuInHeMuNonCompressedSigB (0),
+    m_nominalPacketPadding (0),
+    m_maxHeLtfRxInHeMuMoreThanOneRu (0),
     m_highestNssSupportedM1 (0),
     m_highestMcsSupported (0),
     m_heSupported (0)
@@ -114,7 +147,12 @@
 {
   //we should not be here if HE is not supported
   NS_ASSERT (m_heSupported > 0);
-  return 19; //todo: variable length!
+  // IEEE 802.11ax-2021 9.4.2.248 HE Capabilities element
+  // Element ID Extension (1) + HE MAC Capabilities Information (6)
+  // + HE PHY Capabilities Information (11) + Supported HE-MCS And NSS Set (4)
+  // TODO: Supported HE-MCS And NSS Set field has variable length (4, 8 or 12)
+  // TODO: PPE Thresholds field (optional) is not implemented
+  return 22;
 }
 
 Buffer::Iterator
@@ -144,12 +182,13 @@
     {
       //write the corresponding value for each bit
       start.WriteHtolsbU32 (GetHeMacCapabilitiesInfo1 ());
-      start.WriteU8 (GetHeMacCapabilitiesInfo2 ());
+      start.WriteU16 (GetHeMacCapabilitiesInfo2 ());
       start.WriteHtolsbU64 (GetHePhyCapabilitiesInfo1 ());
-      start.WriteU8 (GetHePhyCapabilitiesInfo2 ());
+      start.WriteHtolsbU16 (GetHePhyCapabilitiesInfo2 ());
+      start.WriteU8 (GetHePhyCapabilitiesInfo3 ());
       start.WriteHtolsbU32 (GetSupportedMcsAndNss ());
-      //todo: add another 32-bits field if 160 MHz channel is supported (variable length)
-      //todo: optional PPE Threshold field (variable length)
+      // TODO: add another 32-bits field if 160 MHz channel is supported (variable length)
+      // TODO: optional PPE Threshold field (variable length)
     }
 }
 
@@ -158,20 +197,21 @@
 {
   Buffer::Iterator i = start;
   uint32_t macCapabilities1 = i.ReadLsbtohU32 ();
-  uint8_t macCapabilities2 = i.ReadU8 ();
+  uint16_t macCapabilities2 = i.ReadLsbtohU16 ();
   uint64_t phyCapabilities1 = i.ReadLsbtohU64 ();
-  uint8_t phyCapabilities2 = i.ReadU8 ();
+  uint64_t phyCapabilities2 = i.ReadLsbtohU16 ();
+  uint8_t phyCapabilities3 = i.ReadU8 ();
   uint32_t mcsset = i.ReadU32 ();
   SetHeMacCapabilitiesInfo (macCapabilities1, macCapabilities2);
-  SetHePhyCapabilitiesInfo (phyCapabilities1, phyCapabilities2);
+  SetHePhyCapabilitiesInfo (phyCapabilities1, phyCapabilities2, phyCapabilities3);
   SetSupportedMcsAndNss (mcsset);
-  //todo: add another 32-bits field if 160 MHz channel is supported (variable length)
-  //todo: optional PPE Threshold field (variable length)
+  // TODO: add another 32-bits field if 160 MHz channel is supported (variable length)
+  // TODO: optional PPE Threshold field (variable length)
   return length;
 }
 
 void
-HeCapabilities::SetHeMacCapabilitiesInfo (uint32_t ctrl1, uint8_t ctrl2)
+HeCapabilities::SetHeMacCapabilitiesInfo (uint32_t ctrl1, uint16_t ctrl2)
 {
   m_plusHtcHeSupport = ctrl1 & 0x01;
   m_twtRequesterSupport = (ctrl1 >> 1) & 0x01;
@@ -180,25 +220,37 @@
   m_maximumNumberOfFragmentedMsdus = (ctrl1 >> 5) & 0x07;
   m_minimumFragmentSize = (ctrl1 >> 8) & 0x03;
   m_triggerFrameMacPaddingDuration = (ctrl1 >> 10) & 0x03;
-  m_multiTidAggregationSupport = (ctrl1 >> 12) & 0x07;
+  m_multiTidAggregationRxSupport = (ctrl1 >> 12) & 0x07;
   m_heLinkAdaptation = (ctrl1 >> 15) & 0x03;
   m_allAckSupport = (ctrl1 >> 17) & 0x01;
-  m_ulMuResponseSchedulingSupport = (ctrl1 >> 18) & 0x01;
-  m_aBsrSupport = (ctrl1 >> 19) & 0x01;
+  m_trsSupport = (ctrl1 >> 18) & 0x01;
+  m_bsrSupport = (ctrl1 >> 19) & 0x01;
   m_broadcastTwtSupport = (ctrl1 >> 20) & 0x01;
   m_32bitBaBitmapSupport = (ctrl1 >> 21) & 0x01;
   m_muCascadeSupport = (ctrl1 >> 22) & 0x01;
-  m_ackEnabledMultiTidAggregationSupport = (ctrl1 >> 23) & 0x01;
-  m_groupAddressedMultiStaBlockAckInDlMuSupport = (ctrl1 >> 24) & 0x01;
-  m_omControlSupport = (ctrl1 >> 25) & 0x03;
+  m_ackEnabledAggregationSupport = (ctrl1 >> 23) & 0x01;
+  // IEEE 802.11ax-2021 9.4.2.248.2 HE MAC Capabilities
+  // Bit 24 is reserved
+  m_omControlSupport = (ctrl1 >> 25) & 0x01;
   m_ofdmaRaSupport = (ctrl1 >> 26) & 0x01;
   m_maxAmpduLengthExponent = (ctrl1 >> 27) & 0x03;
   m_amsduFragmentationSupport = (ctrl1 >> 29) & 0x01;
   m_flexibleTwtScheduleSupport = (ctrl1 >> 30) & 0x01;
   m_rxControlFrameToMultiBss = (ctrl1 >> 31) & 0x01;
-  m_bsrpAmpduAggregation = ctrl2 & 0x01;
+  m_bsrpBqrpAmpduAggregation = ctrl2 & 0x01;
   m_qtpSupport = (ctrl2 >> 1) & 0x01;
-  m_aBqrSupport = (ctrl2 >> 2) & 0x01;
+  m_bqrSupport = (ctrl2 >> 2) & 0x01;
+  m_psrResponder = (ctrl2 >> 3) & 0x01;
+  m_ndpFeedbackReportSupport = (ctrl2 >> 4) & 0x01;
+  m_opsSupport = (ctrl2 >> 5) & 0x01;
+  m_amsduNotUnderBaInAmpduSupport = (ctrl2 >> 6) & 0x01;
+  m_multiTidAggregationTxSupport = (ctrl2 >> 7) & 0x07;
+  m_heSubchannelSelectiveTxSupport = (ctrl2 >> 10) & 0x01;
+  m_ul2x996ToneRuSupport = (ctrl2 >> 11) & 0x01;
+  m_omControlUlMuDataDisableRxSupport = (ctrl2 >> 12) & 0x01;
+  m_heDynamicSmPowerSave = (ctrl2 >> 13) & 0x01;
+  m_puncturedSoundingSupport = (ctrl2 >> 14) & 0x01;
+  m_heVhtTriggerFrameRxSupport = (ctrl2 >> 15) & 0x01;
 }
 
 uint32_t
@@ -212,17 +264,18 @@
   val |= (m_maximumNumberOfFragmentedMsdus & 0x07) << 5;
   val |= (m_minimumFragmentSize & 0x03) << 8;
   val |= (m_triggerFrameMacPaddingDuration & 0x03) << 10;
-  val |= (m_multiTidAggregationSupport & 0x07) << 12;
+  val |= (m_multiTidAggregationRxSupport & 0x07) << 12;
   val |= (m_heLinkAdaptation & 0x03) << 15;
   val |= (m_allAckSupport & 0x01) << 17;
-  val |= (m_ulMuResponseSchedulingSupport & 0x01) << 18;
-  val |= (m_aBsrSupport & 0x01) << 19;
+  val |= (m_trsSupport & 0x01) << 18;
+  val |= (m_bsrSupport & 0x01) << 19;
   val |= (m_broadcastTwtSupport & 0x01) << 20;
   val |= (m_32bitBaBitmapSupport & 0x01) << 21;
   val |= (m_muCascadeSupport & 0x01) << 22;
-  val |= (m_ackEnabledMultiTidAggregationSupport & 0x01) << 23;
-  val |= (m_groupAddressedMultiStaBlockAckInDlMuSupport & 0x01) << 24;
-  val |= (m_omControlSupport & 0x03) << 25;
+  val |= (m_ackEnabledAggregationSupport & 0x01) << 23;
+  // IEEE 802.11ax-2021 9.4.2.248.2 HE MAC Capabilities
+  // Bit 24 is reserved
+  val |= (m_omControlSupport & 0x01) << 25;
   val |= (m_ofdmaRaSupport & 0x01) << 26;
   val |= (m_maxAmpduLengthExponent & 0x03) << 27;
   val |= (m_amsduFragmentationSupport & 0x01) << 29;
@@ -231,98 +284,170 @@
   return val;
 }
 
-uint8_t
+uint16_t
 HeCapabilities::GetHeMacCapabilitiesInfo2 () const
 {
-  uint8_t val = 0;
-  val |= m_bsrpAmpduAggregation & 0x01;
+  uint16_t val = 0;
+  val |= m_bsrpBqrpAmpduAggregation & 0x01;
   val |= (m_qtpSupport & 0x01) << 1;
-  val |= (m_aBqrSupport & 0x01) << 2;
+  val |= (m_bqrSupport & 0x01) << 2;
+  val |= (m_psrResponder & 0x01) << 3;
+  val |= (m_ndpFeedbackReportSupport & 0x01) << 4;
+  val |= (m_opsSupport & 0x01) << 5;
+  val |= (m_amsduNotUnderBaInAmpduSupport & 0x01) << 6;
+  val |= (m_multiTidAggregationTxSupport & 0x07) << 7;
+  val |= (m_heSubchannelSelectiveTxSupport & 0x01) << 10;
+  val |= (m_ul2x996ToneRuSupport & 0x01) << 11;
+  val |= (m_omControlUlMuDataDisableRxSupport & 0x01) << 12;
+  val |= (m_heDynamicSmPowerSave & 0x01) << 13;
+  val |= (m_puncturedSoundingSupport & 0x01) << 14;
+  val |= (m_heVhtTriggerFrameRxSupport & 0x01) << 15;
   return val;
 }
 
 void
-HeCapabilities::SetHePhyCapabilitiesInfo (uint64_t ctrl1, uint8_t ctrl2)
+HeCapabilities::SetHePhyCapabilitiesInfo (uint64_t ctrl1, uint16_t ctrl2, uint8_t ctrl3)
 {
-  m_dualBandSupport = ctrl1 & 0x01;
+  // IEEE 802.11ax-2021 9.4.2.248.2 HE MAC Capabilities
+  // Bit 0 is reserved
   m_channelWidthSet = (ctrl1 >> 1) & 0x7f;
-  m_preamblePuncturingRx = (ctrl1 >> 8) & 0x0f;
+  m_puncturedPreambleRx = (ctrl1 >> 8) & 0x0f;
   m_deviceClass = (ctrl1 >> 12) & 0x01;
   m_ldpcCodingInPayload = (ctrl1 >> 13) & 0x01;
-  m_heLtfAndGiForHePpdus = (ctrl1 >> 14) & 0x03;
-  m_heLtfAndGiForNdp = (ctrl1 >> 16) & 0x03;
-  m_stbcTxAndRx = (ctrl1 >> 18) & 0x03;
-  m_doppler = (ctrl1 >> 20) & 0x03;
-  m_ulMu = (ctrl1 >> 22) & 0x03;
-  m_dcmEncodingTx = (ctrl1 >> 24) & 0x0f;
-  m_dcmEncodingRx = (ctrl1 >> 27) & 0x0f;
-  m_ulHeMuPpduPayloadSupport = (ctrl1 >> 30) & 0x01;
+  m_heSuPpdu1xHeLtf800nsGi = (ctrl1 >> 14) & 0x01;
+  m_midambleRxMaxNsts = (ctrl1 >> 15) & 0x03;
+  m_ndp4xHeLtfAnd32msGi = (ctrl1 >> 17) & 0x01;
+  m_stbcTxLeq80MHz = (ctrl1 >> 18) & 0x01;
+  m_stbcRxLeq80MHz = (ctrl1 >> 19) & 0x01;
+  m_dopplerTx = (ctrl1 >> 20) & 0x01;
+  m_dopplerRx = (ctrl1 >> 21) & 0x01;
+  m_fullBwUlMuMimo = (ctrl1 >> 22) & 0x01;
+  m_partialBwUlMuMimo = (ctrl1 >> 23) & 0x01;
+  m_dcmMaxConstellationTx = (ctrl1 >> 24) & 0x03;
+  m_dcmMaxNssTx = (ctrl1 >> 26) & 0x01;
+  m_dcmMaxConstellationRx = (ctrl1 >> 27) & 0x03;
+  m_dcmMaxNssRx = (ctrl1 >> 29) & 0x01;
+  m_rxPartialBwSuInHeMu = (ctrl1 >> 30) & 0x01;
   m_suBeamformer = (ctrl1 >> 31) & 0x01;
   m_suBeamformee = (ctrl1 >> 32) & 0x01;
   m_muBeamformer = (ctrl1 >> 33) & 0x01;
   m_beamformeeStsForSmallerOrEqualThan80Mhz = (ctrl1 >> 34) & 0x07;
-  m_nstsTotalForSmallerOrEqualThan80Mhz = (ctrl1 >> 37) & 0x07;
-  m_beamformeeStsForLargerThan80Mhz = (ctrl1 >> 40) & 0x07;
-  m_nstsTotalForLargerThan80Mhz = (ctrl1 >> 43) & 0x07;
-  m_numberOfSoundingDimensionsForSmallerOrEqualThan80Mhz = (ctrl1 >> 46) & 0x07;
-  m_numberOfSoundingDimensionsForLargerThan80Mhz = (ctrl1 >> 49) & 0x07;
-  m_ngEqual16ForSuFeedbackSupport = (ctrl1 >> 52) & 0x01;
-  m_ngEqual16ForMuFeedbackSupport = (ctrl1 >> 53) & 0x01;
-  m_codebookSize42ForSuSupport = (ctrl1 >> 54) & 0x01;
-  m_codebookSize75ForSuSupport = (ctrl1 >> 55) & 0x01;
-  m_beamformingFeedbackWithTriggerFrame = (ctrl1 >> 56) & 0x07;
-  m_heErSuPpduPayload = (ctrl1 >> 59) & 0x01;
-  m_dlMuMimoOnPartialBandwidth = (ctrl1 >> 60) & 0x01;
-  m_ppeThresholdPresent = (ctrl1 >> 61) & 0x01;
-  m_srpBasedSrSupport = (ctrl1 >> 62) & 0x01;
-  m_powerBoostFactorAlphaSupport = (ctrl1 >> 63) & 0x01;
-  m_4TimesHeLtfAnd800NsGiSupportForHePpdus = ctrl2 & 0x01;
+  m_beamformeeStsForLargerThan80Mhz = (ctrl1 >> 37) & 0x07;
+  m_numberOfSoundingDimensionsForSmallerOrEqualThan80Mhz = (ctrl1 >> 40) & 0x07;
+  m_numberOfSoundingDimensionsForLargerThan80Mhz = (ctrl1 >> 43) & 0x07;
+  m_ngEqual16ForSuFeedbackSupport = (ctrl1 >> 46) & 0x01;
+  m_ngEqual16ForMuFeedbackSupport = (ctrl1 >> 47) & 0x01;
+  m_codebookSize42SuFeedback = (ctrl1 >> 48) & 0x01;
+  m_codebookSize75MuFeedback = (ctrl1 >> 49) & 0x01;
+  m_triggeredSuBfFeedback = (ctrl1 >> 50) & 0x01;
+  m_triggeredMuBfFeedback = (ctrl1 >> 51) & 0x01;
+  m_triggeredCqiFeedback = (ctrl1 >> 52) & 0x01;
+  m_erPartialBandwidth = (ctrl1 >> 53) & 0x01;
+  m_dlMuMimoOnPartialBandwidth = (ctrl1 >> 54) & 0x01;
+  m_ppeThresholdPresent = (ctrl1 >> 55) & 0x01;
+  m_psrBasedSrSupport = (ctrl1 >> 56) & 0x01;
+  m_powerBoostFactorAlphaSupport = (ctrl1 >> 57) & 0x01;
+  m_hePpdu4xHeLtf800nsGi = ctrl2 & 0x01;
+  m_maxNc = (ctrl1 >> 59) & 0x07;
+  m_stbcTxGt80MHz = (ctrl1 >> 62) & 0x01;
+  m_stbcRxGt80MHz = (ctrl1 >> 63) & 0x01;
+  m_heErSuPpdu4xHeLtf08sGi = ctrl2 & 0x01;
+  m_hePpdu20MHzIn40MHz24GHz = (ctrl2 >> 1) & 0x01;
+  m_hePpdu20MHzIn160MHz = (ctrl2 >> 2) & 0x01;
+  m_hePpdu80MHzIn160MHz = (ctrl2 >> 3) & 0x01;
+  m_heErSuPpdu1xHeLtf08Gi = (ctrl2 >> 4) & 0x01;
+  m_midamble2xAnd1xHeLtf = (ctrl2 >> 5) & 0x01;
+  m_dcmMaxRu = (ctrl2 >> 6) & 0x03;
+  m_longerThan16HeSigbOfdm = (ctrl2 >> 8) & 0x01;
+  m_nonTriggeredCqiFeedback = (ctrl2 >> 9) & 0x01;
+  m_tx1024QamLt242Ru = (ctrl2 >> 10) & 0x01;
+  m_rx1024QamLt242Ru = (ctrl2 >> 11) & 0x01;
+  m_rxFullBwSuInHeMuCompressedSigB = (ctrl2 >> 12) & 0x01;
+  m_rxFullBwSuInHeMuNonCompressedSigB = (ctrl2 >> 13) & 0x01;
+  m_nominalPacketPadding = (ctrl2 >> 14) & 0x03;
+  m_maxHeLtfRxInHeMuMoreThanOneRu = ctrl3 & 0x01;
+  // IEEE 802.11ax-2021 9.4.2.248.2 HE MAC Capabilities
+  // Bits 81-87 are reserved
 }
 
 uint64_t
 HeCapabilities::GetHePhyCapabilitiesInfo1 () const
 {
   uint64_t val = 0;
-  val |= m_dualBandSupport & 0x01;
+  // IEEE 802.11ax-2021 9.4.2.248.2 HE MAC Capabilities
+  // Bit 0 is reserved
   val |= (m_channelWidthSet & 0x7f) << 1;
-  val |= (m_preamblePuncturingRx & 0x0f) << 8;
+  val |= (m_puncturedPreambleRx & 0x0f) << 8;
   val |= (m_deviceClass & 0x01) << 12;
   val |= (m_ldpcCodingInPayload & 0x01) << 13;
-  val |= (m_heLtfAndGiForHePpdus & 0x03) << 14;
-  val |= (m_heLtfAndGiForNdp & 0x03) << 16;
-  val |= (m_stbcTxAndRx & 0x03) << 18;
-  val |= (m_doppler & 0x03) << 20;
-  val |= (m_ulMu & 0x03) << 22;
-  val |= (m_dcmEncodingTx & 0x0f) << 24;
-  val |= (m_dcmEncodingRx & 0x0f) << 27;
-  val |= (m_ulHeMuPpduPayloadSupport & 0x01) << 30;
+  val |= (m_heSuPpdu1xHeLtf800nsGi & 0x01) << 14;
+  val |= (m_midambleRxMaxNsts & 0x03) << 15;
+  val |= (m_ndp4xHeLtfAnd32msGi & 0x01) << 17;
+  val |= (m_stbcTxLeq80MHz & 0x01) << 18;
+  val |= (m_stbcRxLeq80MHz & 0x01) << 19;
+  val |= (m_dopplerTx & 0x01) << 20;
+  val |= (m_dopplerRx & 0x01) << 21;
+  val |= (m_fullBwUlMuMimo & 0x01) << 22;
+  val |= (m_partialBwUlMuMimo & 0x01) << 23;
+  val |= (m_dcmMaxConstellationTx & 0x03) << 24;
+  val |= (m_dcmMaxNssTx & 0x01) << 26;
+  val |= (m_dcmMaxConstellationRx & 0x03) << 27;
+  val |= (m_dcmMaxNssRx & 0x01) << 29;
+  val |= (m_rxPartialBwSuInHeMu & 0x01) << 30;
   val |= (m_suBeamformer & 0x01) << 31;
   val |= (static_cast<uint64_t> (m_suBeamformee) & 0x01) << 32;
   val |= (static_cast<uint64_t> (m_muBeamformer) & 0x01) << 33;
   val |= (static_cast<uint64_t> (m_beamformeeStsForSmallerOrEqualThan80Mhz) & 0x07) << 34;
-  val |= (static_cast<uint64_t> (m_nstsTotalForSmallerOrEqualThan80Mhz) & 0x07) << 37;
-  val |= (static_cast<uint64_t> (m_beamformeeStsForLargerThan80Mhz) & 0x07) << 40;
-  val |= (static_cast<uint64_t> (m_nstsTotalForLargerThan80Mhz) & 0x07) << 43;
-  val |= (static_cast<uint64_t> (m_numberOfSoundingDimensionsForSmallerOrEqualThan80Mhz) & 0x07) << 46;
-  val |= (static_cast<uint64_t> (m_numberOfSoundingDimensionsForLargerThan80Mhz) & 0x07) << 49;
-  val |= (static_cast<uint64_t> (m_ngEqual16ForSuFeedbackSupport) & 0x01) << 52;
-  val |= (static_cast<uint64_t> (m_ngEqual16ForMuFeedbackSupport) & 0x01) << 53;
-  val |= (static_cast<uint64_t> (m_codebookSize42ForSuSupport) & 0x01) << 54;
-  val |= (static_cast<uint64_t> (m_codebookSize75ForSuSupport) & 0x01) << 55;
-  val |= (static_cast<uint64_t> (m_beamformingFeedbackWithTriggerFrame) & 0x07) << 56;
-  val |= (static_cast<uint64_t> (m_heErSuPpduPayload) & 0x01) << 59;
-  val |= (static_cast<uint64_t> (m_dlMuMimoOnPartialBandwidth) & 0x01) << 60;
-  val |= (static_cast<uint64_t> (m_ppeThresholdPresent) & 0x01) << 61;
-  val |= (static_cast<uint64_t> (m_srpBasedSrSupport) & 0x01) << 62;
-  val |= (static_cast<uint64_t> (m_powerBoostFactorAlphaSupport) & 0x01) << 63;
+  val |= (static_cast<uint64_t> (m_beamformeeStsForLargerThan80Mhz) & 0x07) << 37;
+  val |= (static_cast<uint64_t> (m_numberOfSoundingDimensionsForSmallerOrEqualThan80Mhz) & 0x07) << 40;
+  val |= (static_cast<uint64_t> (m_numberOfSoundingDimensionsForLargerThan80Mhz) & 0x07) << 43;
+  val |= (static_cast<uint64_t> (m_ngEqual16ForSuFeedbackSupport) & 0x01) << 46;
+  val |= (static_cast<uint64_t> (m_ngEqual16ForMuFeedbackSupport) & 0x01) << 47;
+  val |= (static_cast<uint64_t> (m_codebookSize42SuFeedback) & 0x01) << 48;
+  val |= (static_cast<uint64_t> (m_codebookSize75MuFeedback) & 0x01) << 49;
+  val |= (static_cast<uint64_t> (m_triggeredSuBfFeedback) & 0x01) << 50;
+  val |= (static_cast<uint64_t> (m_triggeredMuBfFeedback) & 0x01) << 51;
+  val |= (static_cast<uint64_t> (m_triggeredCqiFeedback) & 0x01) << 52;
+  val |= (static_cast<uint64_t> (m_erPartialBandwidth) & 0x01) << 53;
+  val |= (static_cast<uint64_t> (m_dlMuMimoOnPartialBandwidth) & 0x01) << 54;
+  val |= (static_cast<uint64_t> (m_ppeThresholdPresent) & 0x01) << 55;
+  val |= (static_cast<uint64_t> (m_psrBasedSrSupport) & 0x01) << 56;
+  val |= (static_cast<uint64_t> (m_powerBoostFactorAlphaSupport) & 0x01) << 57;
+  val |= (static_cast<uint64_t> (m_hePpdu4xHeLtf800nsGi) & 0x01) << 58;
+  val |= (static_cast<uint64_t> (m_maxNc) & 0x07) << 59;
+  val |= (static_cast<uint64_t> (m_stbcTxGt80MHz) & 0x01) << 62;
+  val |= (static_cast<uint64_t> (m_stbcRxGt80MHz) & 0x01) << 63;
   return val;
 }
 
-uint8_t
+uint16_t
 HeCapabilities::GetHePhyCapabilitiesInfo2 () const
 {
+  uint16_t val = 0;
+  val |= m_heErSuPpdu4xHeLtf08sGi & 0x01;
+  val |= (m_hePpdu20MHzIn40MHz24GHz & 0x01) << 1;
+  val |= (m_hePpdu20MHzIn160MHz & 0x01) << 2;
+  val |= (m_hePpdu80MHzIn160MHz & 0x01) << 3;
+  val |= (m_heErSuPpdu1xHeLtf08Gi & 0x01) << 4;
+  val |= (m_midamble2xAnd1xHeLtf & 0x01) << 5;
+  val |= (m_dcmMaxRu & 0x03) << 6;
+  val |= (m_longerThan16HeSigbOfdm & 0x01) << 8;
+  val |= (m_nonTriggeredCqiFeedback & 0x01) << 9;
+  val |= (m_tx1024QamLt242Ru & 0x01) << 10;
+  val |= (m_rx1024QamLt242Ru & 0x01) << 11;
+  val |= (m_rxFullBwSuInHeMuCompressedSigB & 0x01) << 12;
+  val |= (m_rxFullBwSuInHeMuNonCompressedSigB & 0x01) << 13;
+  val |= (m_nominalPacketPadding & 0x03) << 14;
+  return val;
+}
+
+uint8_t
+HeCapabilities::GetHePhyCapabilitiesInfo3 () const
+{
   uint8_t val = 0;
-  val |= m_4TimesHeLtfAnd800NsGiSupportForHePpdus & 0x01;
+  val |= m_maxHeLtfRxInHeMuMoreThanOneRu & 0x01;
+  // IEEE 802.11ax-2021 9.4.2.248.2 HE MAC Capabilities
+  // Bits 81-87 are reserved
   return val;
 }
 
@@ -341,7 +466,7 @@
     {
       m_rxBwMap[i] = (ctrl >> (11 + i)) & 0x01;
     }
-  //todo: MCS NSS Descriptors
+  // TODO: MCS NSS Descriptors
 }
 
 uint16_t
@@ -359,11 +484,11 @@
     {
       val |= (m_rxBwMap[i] & 0x01) << (11 + 1);
     }
-  //todo: MCS NSS Descriptors
+  // TODO: MCS NSS Descriptors
   return val;
 }
 
-//todo: PPE threshold
+// TODO: PPE threshold
 
 bool
 HeCapabilities::IsSupportedTxMcs (uint8_t mcs) const
@@ -433,10 +558,15 @@
 }
 
 void
-HeCapabilities::SetHeLtfAndGiForHePpdus (uint8_t heLtfAndGiForHePpdus)
+HeCapabilities::SetHeSuPpdu1xHeLtf800nsGi (bool heSuPpdu1xHeLtf800nsGi)
 {
-  NS_ASSERT (heLtfAndGiForHePpdus <= 0x03);
-  m_heLtfAndGiForHePpdus = heLtfAndGiForHePpdus;
+  m_heSuPpdu1xHeLtf800nsGi = (heSuPpdu1xHeLtf800nsGi ? 1 : 0);
+}
+
+void
+HeCapabilities::SetHePpdu4xHeLtf800nsGi (bool hePpdu4xHeLtf800nsGi)
+{
+  m_hePpdu4xHeLtf800nsGi = (hePpdu4xHeLtf800nsGi ? 1 : 0);
 }
 
 void
@@ -479,12 +609,19 @@
   return m_ldpcCodingInPayload;
 }
 
-uint8_t
-HeCapabilities::GetHeLtfAndGiForHePpdus (void) const
+bool
+HeCapabilities::GetHeSuPpdu1xHeLtf800nsGi (void) const
 {
-  return m_heLtfAndGiForHePpdus;
+  return (m_heSuPpdu1xHeLtf800nsGi == 1);
 }
 
+bool
+HeCapabilities::GetHePpdu4xHeLtf800nsGi (void) const
+{
+  return (m_hePpdu4xHeLtf800nsGi == 1);
+}
+
+
 uint8_t
 HeCapabilities::GetHighestMcsSupported (void) const
 {
@@ -509,7 +646,8 @@
   os << HeCapabilities.GetHeMacCapabilitiesInfo1 () << "|"
      << +HeCapabilities.GetHeMacCapabilitiesInfo2 () << "|"
      << HeCapabilities.GetHePhyCapabilitiesInfo1 () << "|"
-     << +HeCapabilities.GetHePhyCapabilitiesInfo2 () << "|"
+     << HeCapabilities.GetHePhyCapabilitiesInfo2 () << "|"
+     << +HeCapabilities.GetHePhyCapabilitiesInfo3 () << "|"
      << HeCapabilities.GetSupportedMcsAndNss ();
   return os;
 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/he/he-capabilities.h ns-3.36/src/wifi/model/he/he-capabilities.h
--- ns-3.35/src/wifi/model/he/he-capabilities.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/he/he-capabilities.h	2022-04-30 18:23:58.206735100 -0700
@@ -60,14 +60,15 @@
    * \param ctrl1 the HE MAC Capabilities Info field 1 in the HE Capabilities information element
    * \param ctrl2 the HE MAC Capabilities Info field 2 in the HE Capabilities information element
    */
-  void SetHeMacCapabilitiesInfo (uint32_t ctrl1, uint8_t ctrl2);
+  void SetHeMacCapabilitiesInfo (uint32_t ctrl1, uint16_t ctrl2);
   /**
    * Set the HE PHY Capabilities Info field in the HE Capabilities information element.
    *
    * \param ctrl1 the HE PHY Capabilities Info field 1 in the HE Capabilities information element
    * \param ctrl2 the HE PHY Capabilities Info field 2 in the HE Capabilities information element
+   * \param ctrl3 the HE PHY Capabilities Info field 3 in the HE Capabilities information element
    */
-  void SetHePhyCapabilitiesInfo (uint64_t ctrl1, uint8_t ctrl2);
+  void SetHePhyCapabilitiesInfo (uint64_t ctrl1, uint16_t ctrl2, uint8_t ctrl3);
   /**
    * Set the MCS and NSS field in the HE Capabilities information element.
    *
@@ -82,11 +83,11 @@
    */
   uint32_t GetHeMacCapabilitiesInfo1 () const;
   /**
-   * Return the last octet of the HE MAC Capabilities Info field in the HE Capabilities information element.
+   * Return the last 2 octets of the HE MAC Capabilities Info field in the HE Capabilities information element.
    *
-   * \return the last octet of the HE MAC Capabilities Info field in the HE Capabilities information element
+   * \return the last 2 octets of the HE MAC Capabilities Info field in the HE Capabilities information element
    */
-  uint8_t GetHeMacCapabilitiesInfo2 () const;
+  uint16_t GetHeMacCapabilitiesInfo2 () const;
   /**
    * Return the 8 first octets of the HE PHY Capabilities Info field in the HE Capabilities information element.
    *
@@ -94,11 +95,17 @@
    */
   uint64_t GetHePhyCapabilitiesInfo1 () const;
   /**
+   * Return the octets 9-10 of the HE PHY Capabilities Info field in the HE Capabilities information element.
+   *
+   * \return the octets 9-10 of the HE PHY Capabilities Info field in the HE Capabilities information element
+   */
+  uint16_t GetHePhyCapabilitiesInfo2 () const;
+  /**
    * Return the last octet of the HE PHY Capabilities Info field in the HE Capabilities information element.
    *
    * \return the last octet of the HE PHY Capabilities Info field in the HE Capabilities information element
    */
-  uint8_t GetHePhyCapabilitiesInfo2 () const;
+  uint8_t GetHePhyCapabilitiesInfo3 () const;
   /**
    * Return the MCS and NSS field in the HE Capabilities information element.
    *
@@ -120,11 +127,17 @@
    */
   void SetLdpcCodingInPayload (uint8_t ldpcCodingInPayload);
   /**
-   * Set HE LTF and GI for HE PDPUs.
+   * Set 1xHE-LTF and 800ns GI in HE SU PPDU reception support
+   *
+   * \param heSuPpdu1xHeLtf800nsGi 1xHE-LTF and 800ns GI in HE SU PPDU reception support
+   */
+  void SetHeSuPpdu1xHeLtf800nsGi (bool heSuPpdu1xHeLtf800nsGi);
+  /**
+   * Set 4xHE-LTF and 800ns GI in HE SU PPDU and HE MU PPDU reception support
    *
-   * \param heLtfAndGiForHePpdus the HE LTF and GI
+   * \param heSuPpdu4xHeLtf800nsGi 4xHE-LTF and 800ns GI in HE SU PPDU and HE MU PPDU reception support
    */
-  void SetHeLtfAndGiForHePpdus (uint8_t heLtfAndGiForHePpdus);
+  void SetHePpdu4xHeLtf800nsGi (bool heSuPpdu4xHeLtf800nsGi);
   /**
    * Get channel width set.
    *
@@ -138,11 +151,18 @@
    */
   uint8_t GetLdpcCodingInPayload (void) const;
   /**
-   * Get HE LTF and GI for HE PDPUs.
+   * Get 1xHE-LTF and 800ns GI in HE SU PPDU reception support
    *
-   * \returns the HE LTF and GI
+   * \returns true if 1xHE-LTF and 800ns GI in HE SU PPDU reception is supported, false otherwise
    */
-  uint8_t GetHeLtfAndGiForHePpdus (void) const;
+  bool GetHeSuPpdu1xHeLtf800nsGi (void) const;
+  /**
+   * Get 4xHE-LTF and 800ns GI in HE SU PPDU and HE MU PPDU reception support
+   *
+   * \returns true if 4xHE-LTF and 800ns GI in HE SU PPDU and HE MU PPDU reception is supported,
+   *          false otherwise
+   */
+  bool GetHePpdu4xHeLtf800nsGi (void) const;
   /**
    * Get highest MCS supported.
    *
@@ -202,7 +222,8 @@
 
 
 private:
-  //MAC Capabilities Info fields
+  // MAC Capabilities Info fields
+  // IEEE 802.11ax-2021 9.4.2.248.2 HE MAC Capabilities Information field
   uint8_t m_plusHtcHeSupport;                            //!< HTC HE support
   uint8_t m_twtRequesterSupport;                         //!< TWT requester support
   uint8_t m_twtResponderSupport;                         //!< TWT responder support
@@ -210,60 +231,94 @@
   uint8_t m_maximumNumberOfFragmentedMsdus;              //!< maximum number of fragmentation MSDUs
   uint8_t m_minimumFragmentSize;                         //!< minimum fragment size
   uint8_t m_triggerFrameMacPaddingDuration;              //!< trigger frame MAC padding duration
-  uint8_t m_multiTidAggregationSupport;                  //!< multi-TID aggregation support
+  uint8_t m_multiTidAggregationRxSupport;                //!< multi-TID aggregation Rx support
   uint8_t m_heLinkAdaptation;                            //!< HE link adaptation
   uint8_t m_allAckSupport;                               //!< all Ack support
-  uint8_t m_ulMuResponseSchedulingSupport;               //!< UL MU response scheduling support
-  uint8_t m_aBsrSupport;                                 //!< BSR support
+  uint8_t m_trsSupport;                                  //!< TRS support
+  uint8_t m_bsrSupport;                                  //!< BSR support
   uint8_t m_broadcastTwtSupport;                         //!< broadcast TXT support
   uint8_t m_32bitBaBitmapSupport;                        //!< 32-bit BA bitmap support
   uint8_t m_muCascadeSupport;                            //!< MU cascade support
-  uint8_t m_ackEnabledMultiTidAggregationSupport;        //!< ack enabled multi-TID aggregation support
-  uint8_t m_groupAddressedMultiStaBlockAckInDlMuSupport; //!< group addressed multi-STA BlockAck in DL support
+  uint8_t m_ackEnabledAggregationSupport;                //!< ack enabled aggregation support
   uint8_t m_omControlSupport;                            //!< operation mode control support
   uint8_t m_ofdmaRaSupport;                              //!< OFDMA RA support
-  uint8_t m_maxAmpduLengthExponent;                      //!< maximum A-MPDU length exponent
+  uint8_t m_maxAmpduLengthExponent;                      //!< maximum A-MPDU length exponent extension
   uint8_t m_amsduFragmentationSupport;                   //!< A-MSDU fragmentation support
   uint8_t m_flexibleTwtScheduleSupport;                  //!< flexible TWT schedule support
   uint8_t m_rxControlFrameToMultiBss;                    //!< receive control frame to multi-BSS
-  uint8_t m_bsrpAmpduAggregation;                        //!< BSRP A-MPDU aggregation
+  uint8_t m_bsrpBqrpAmpduAggregation;                    //!< BSRP BQRP A-MPDU aggregation
   uint8_t m_qtpSupport;                                  //!< QTP support
-  uint8_t m_aBqrSupport;                                 //!< ABQR support
+  uint8_t m_bqrSupport;                                  //!< BQR support
+  uint8_t m_psrResponder;                                //!< PSR responder
+  uint8_t m_ndpFeedbackReportSupport;                    //!< NDP feedback report support
+  uint8_t m_opsSupport;                                  //!< OPS support
+  uint8_t m_amsduNotUnderBaInAmpduSupport;               //!< AMSDU not under BA in Ack enabled A-MPDU support
+  uint8_t m_multiTidAggregationTxSupport;                //!< Multi-TID aggregation TX support
+  uint8_t m_heSubchannelSelectiveTxSupport;              //!< HE subchannel selective transmission support
+  uint8_t m_ul2x996ToneRuSupport;                        //!< UL 2x996 tone RU support
+  uint8_t m_omControlUlMuDataDisableRxSupport;           //!< OM control UL MU data disable RX support
+  uint8_t m_heDynamicSmPowerSave;                        //!< HE dynamic SM power save
+  uint8_t m_puncturedSoundingSupport;                    //!< punctured sounding support
+  uint8_t m_heVhtTriggerFrameRxSupport;                  //!< HE and VHT trigger frame RX support
 
-  //PHY Capabilities Info fields
-  uint8_t m_dualBandSupport;                         //!< dual band support
+  // PHY Capabilities Info fields
+  // IEEE 802.11ax-2021 9.4.2.248.3 HE PHY Capabilities Information field
   uint8_t m_channelWidthSet;                         //!< channel width set
-  uint8_t m_preamblePuncturingRx;                    //!< preamble puncturing receive
+  uint8_t m_puncturedPreambleRx;                     //!< Punctured preamble Rx
   uint8_t m_deviceClass;                             //!< device class
   uint8_t m_ldpcCodingInPayload;                     //!< LDPC coding in payload
-  uint8_t m_heLtfAndGiForHePpdus;                    //!< HE-LTF and GI for HE-PPDUs
-  uint8_t m_heLtfAndGiForNdp;                        //!< HE-LTF and GI for NDP
-  uint8_t m_stbcTxAndRx;                             //!< STBC transmit and receive
-  uint8_t m_doppler;                                 //!< Doppler
-  uint8_t m_ulMu;                                    //!< UL MU
-  uint8_t m_dcmEncodingTx;                           //!< DCM encoding transmit
-  uint8_t m_dcmEncodingRx;                           //!< DCM encoding receive
-  uint8_t m_ulHeMuPpduPayloadSupport;                //!< UL HE-MU-PDPU payload support
+  uint8_t m_heSuPpdu1xHeLtf800nsGi;                  //!< HE SU PPDU with 1x HE LTF and 0.8us GI
+  uint8_t m_midambleRxMaxNsts;                       //!< Midamble TX/RX max NSTS
+  uint8_t m_ndp4xHeLtfAnd32msGi;                     //!< NDP with 4x HE-LTF and 3.2us GI
+  uint8_t m_stbcTxLeq80MHz;                          //!< STBC TX <= 80MHz
+  uint8_t m_stbcRxLeq80MHz;                          //!< STBC RX <= 80Mhz
+  uint8_t m_dopplerTx;                               //!< Doppler Tx
+  uint8_t m_dopplerRx;                               //!< Doppler Rx
+  uint8_t m_fullBwUlMuMimo;                          //!< Full Bandwidth UL MU-MIMO
+  uint8_t m_partialBwUlMuMimo;                       //!< Partial Bandwidth UL MU-MIMO
+  uint8_t m_dcmMaxConstellationTx;                   //!< DCM Max Constellation Tx
+  uint8_t m_dcmMaxNssTx;                             //!< DCM Max NSS Tx
+  uint8_t m_dcmMaxConstellationRx;                   //!< DCM Max Constellation Rx
+  uint8_t m_dcmMaxNssRx;                             //!< DCM Max NSS Rx
+  uint8_t m_rxPartialBwSuInHeMu;                     //!< Rx Partial BW SU in 20 MHz HE MU PPDU
   uint8_t m_suBeamformer;                            //!< SU beamformer
   uint8_t m_suBeamformee;                            //!< SU beamformee
   uint8_t m_muBeamformer;                            //!< MU beamformer
   uint8_t m_beamformeeStsForSmallerOrEqualThan80Mhz; //!< beam formee STS for < 80 MHz
-  uint8_t m_nstsTotalForSmallerOrEqualThan80Mhz;     //!< STS total for < 80 MHz
   uint8_t m_beamformeeStsForLargerThan80Mhz;         //!< beamformee STS for > 80MHz
-  uint8_t m_nstsTotalForLargerThan80Mhz;             //!< STS total for > 80 MHz
   uint8_t m_numberOfSoundingDimensionsForSmallerOrEqualThan80Mhz; //!< # of sounding dimensions for < 80 MHz
   uint8_t m_numberOfSoundingDimensionsForLargerThan80Mhz;         //!< # of sounding dimensions for > 80 MHz
   uint8_t m_ngEqual16ForSuFeedbackSupport;          //!< equal 16 for SU feedback
   uint8_t m_ngEqual16ForMuFeedbackSupport;          //!< equal 16 for MU feedback
-  uint8_t m_codebookSize42ForSuSupport;             //!< codebook size 42 for SU
-  uint8_t m_codebookSize75ForSuSupport;             //!< codebook size 75 for SU
-  uint8_t m_beamformingFeedbackWithTriggerFrame;    //!< beamforming feedback with trigger frame
-  uint8_t m_heErSuPpduPayload;                      //!< HE-ER-SU-PPDU payload
+  uint8_t m_codebookSize42SuFeedback;               //!< Codebook Size = {4, 2} SU feedback
+  uint8_t m_codebookSize75MuFeedback;               //!< Codebook Size = {7, 5} MU feedback
+  uint8_t m_triggeredSuBfFeedback;                  //!< Triggered SU beamforming feedback
+  uint8_t m_triggeredMuBfFeedback;                  //!< Triggered MU beamforming feedback
+  uint8_t m_triggeredCqiFeedback;                   //!< Triggered CQI feedback
+  uint8_t m_erPartialBandwidth;                     //!< Extended range partial bandwidth
   uint8_t m_dlMuMimoOnPartialBandwidth;             //!< DL MU-MIMO on partial bandwidth
   uint8_t m_ppeThresholdPresent;                    //!< PPE threshold present
-  uint8_t m_srpBasedSrSupport;                      //!< SRP based SR support
+  uint8_t m_psrBasedSrSupport;                      //!< PSR based SR support
   uint8_t m_powerBoostFactorAlphaSupport;           //!< power boost factor alpha support
-  uint8_t m_4TimesHeLtfAnd800NsGiSupportForHePpdus; //!< 4 times HE-LFT and 800ns GI support for HE-PPDUs
+  uint8_t m_hePpdu4xHeLtf800nsGi;                   //!< 4 times HE-LFT and 800ns GI support for HE-PPDUs
+  uint8_t m_maxNc;                                  //!< Max Nc for HE compressed beamforming/CQI report
+  uint8_t m_stbcTxGt80MHz;                          //!< STBC Tx > 80MHz
+  uint8_t m_stbcRxGt80MHz;                          //!< STBC RX > 80MHz
+  uint8_t m_heErSuPpdu4xHeLtf08sGi;                 //!< HE ER SU PPDU with 4x HE LTF and 0.8us GI
+  uint8_t m_hePpdu20MHzIn40MHz24GHz;                //!< 20MHz in 40MHz HE PPDU in 2.4GHz band
+  uint8_t m_hePpdu20MHzIn160MHz;                    //!< 20MHz in 160/80+80MHz HE PPDU
+  uint8_t m_hePpdu80MHzIn160MHz;                    //!< 80MHz in 160/80+80MHz HE PPDU
+  uint8_t m_heErSuPpdu1xHeLtf08Gi;                  //!< HE ER SU PPDU with 1x HE LTF and 0.8us GI
+  uint8_t m_midamble2xAnd1xHeLtf;                   //!< Midamble TX/RX 2x and 1x HE-LTF
+  uint8_t m_dcmMaxRu;                               //!< DCM Max RU
+  uint8_t m_longerThan16HeSigbOfdm;                 //!< Longer than 16 HE SIG-=B OFDM symbols support
+  uint8_t m_nonTriggeredCqiFeedback;                //!< Non-Triggered CQI feedback
+  uint8_t m_tx1024QamLt242Ru;                       //!< TX 1024 QAM < 242 =-tone RU support
+  uint8_t m_rx1024QamLt242Ru;                       //!< TX 1024 QAM < 242 =-tone RU support
+  uint8_t m_rxFullBwSuInHeMuCompressedSigB;         //!< RX full BW SU using HE MU PPDU with compressed SIGB
+  uint8_t m_rxFullBwSuInHeMuNonCompressedSigB;      //!< RX full BW SU using HE MU PPDU with non-compressed SIGB
+  uint8_t m_nominalPacketPadding;                   //!< Nominal packet padding
+  uint8_t m_maxHeLtfRxInHeMuMoreThanOneRu;          ///< max HE-LTF symbols STA can Rx in HE MU PPDU with more than one RU
 
   //MCS and NSS field information
   uint8_t m_highestNssSupportedM1; //!< highest NSS support M1
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/he/he-frame-exchange-manager.cc ns-3.36/src/wifi/model/he/he-frame-exchange-manager.cc
--- ns-3.35/src/wifi/model/he/he-frame-exchange-manager.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/he/he-frame-exchange-manager.cc	2022-04-30 18:23:58.206735100 -0700
@@ -74,7 +74,7 @@
 }
 
 void
-HeFrameExchangeManager::SetWifiMac (const Ptr<RegularWifiMac> mac)
+HeFrameExchangeManager::SetWifiMac (const Ptr<WifiMac> mac)
 {
   m_apMac = DynamicCast<ApWifiMac> (mac);
   m_staMac = DynamicCast<StaWifiMac> (mac);
@@ -150,14 +150,10 @@
 
   if (txFormat == MultiUserScheduler::UL_MU_TX)
     {
-      if (m_muScheduler->GetUlMuInfo ().trigger == nullptr)
-        {
-          NS_LOG_DEBUG ("The Multi-user Scheduler returned UL_MU_TX with empty Trigger Frame, do not transmit");
-          return false;
-        }
-
-      NS_ASSERT (m_muScheduler->GetUlMuInfo ().trigger->GetHeader ().IsTrigger ());
-      SendPsduMapWithProtection (WifiPsduMap {{SU_STA_ID, GetWifiPsdu (m_muScheduler->GetUlMuInfo ().trigger,
+      auto packet = Create<Packet> ();
+      packet->AddHeader (m_muScheduler->GetUlMuInfo ().trigger);
+      auto trigger = Create<WifiMacQueueItem> (packet, m_muScheduler->GetUlMuInfo ().macHdr);
+      SendPsduMapWithProtection (WifiPsduMap {{SU_STA_ID, GetWifiPsdu (trigger,
                                                                        m_muScheduler->GetUlMuInfo ().txParams.m_txVector)}},
                                  m_muScheduler->GetUlMuInfo ().txParams);
       return true;
@@ -231,7 +227,12 @@
       WifiAckManager::SetQosAckPolicy (psdu.second, m_txParams.m_acknowledgment.get ());
     }
 
-  if (m_txParams.m_protection->method == WifiProtection::NONE)
+  if (m_txParams.m_protection->method == WifiProtection::RTS_CTS)
+    {
+      NS_ABORT_MSG_IF (m_psduMap.size () > 1, "Cannot use RTS/CTS with MU PPDUs");
+      SendRts (m_txParams);
+    }
+  else if (m_txParams.m_protection->method == WifiProtection::NONE)
     {
       SendPsduMap ();
     }
@@ -255,6 +256,24 @@
 }
 
 void
+HeFrameExchangeManager::CtsTimeout (Ptr<WifiMacQueueItem> rts, const WifiTxVector& txVector)
+{
+  NS_LOG_FUNCTION (this << *rts << txVector);
+
+  if (m_psduMap.empty ())
+    {
+      // A CTS Timeout occurred when protecting a single PSDU that is not included
+      // in a DL MU PPDU is handled by the parent classes
+      VhtFrameExchangeManager::CtsTimeout (rts, txVector);
+      return;
+    }
+
+  NS_ABORT_MSG_IF (m_psduMap.size () > 1, "RTS/CTS cannot be used to protect an MU PPDU");
+  DoCtsTimeout (m_psduMap.begin ()->second);
+  m_psduMap.clear ();
+}
+
+void
 HeFrameExchangeManager::SendPsduMap (void)
 {
   NS_LOG_FUNCTION (this);
@@ -289,7 +308,7 @@
               uint8_t tid = *tids.begin ();
 
               NS_ASSERT (m_edca != 0);
-              m_edca->ScheduleBar (m_edca->PrepareBlockAckRequest (psdu.second->GetAddr1 (), tid));
+              m_edca->ScheduleBar (m_mac->GetQosTxop (tid)->PrepareBlockAckRequest (psdu.second->GetAddr1 (), tid));
             }
         }
 
@@ -322,28 +341,28 @@
         {
           // we are transmitting the DL MU PPDU and have to schedule the
           // transmission of a MU-BAR Trigger Frame.
-          // Create a TXVECTOR by "merging" all the BlockAck TXVECTORs
+          // Create a TRIGVECTOR by "merging" all the BlockAck TXVECTORs
           std::map<uint16_t, CtrlBAckRequestHeader> recipients;
 
           NS_ASSERT (!acknowledgment->stationsReplyingWithBlockAck.empty ());
           auto staIt = acknowledgment->stationsReplyingWithBlockAck.begin ();
-          WifiTxVector txVector = staIt->second.blockAckTxVector;
+          m_trigVector = staIt->second.blockAckTxVector;
           while (staIt != acknowledgment->stationsReplyingWithBlockAck.end ())
             {
               NS_ASSERT (m_apMac != 0);
               uint16_t staId = m_apMac->GetAssociationId (staIt->first);
 
-              txVector.SetHeMuUserInfo (staId, staIt->second.blockAckTxVector.GetHeMuUserInfo (staId));
+              m_trigVector.SetHeMuUserInfo (staId, staIt->second.blockAckTxVector.GetHeMuUserInfo (staId));
               recipients.emplace (staId, staIt->second.barHeader);
 
               staIt++;
             }
           // set the Length field of the response TXVECTOR, which is needed to correctly
           // set the UL Length field of the MU-BAR Trigger Frame
-          txVector.SetLength (acknowledgment->ulLength);
+          m_trigVector.SetLength (acknowledgment->ulLength);
 
           NS_ASSERT (m_edca != 0);
-          m_edca->ScheduleBar (PrepareMuBar (txVector, recipients));
+          m_edca->ScheduleBar (PrepareMuBar (m_trigVector, recipients));
         }
       else
         {
@@ -356,7 +375,8 @@
               m_staExpectTbPpduFrom.insert (station.first);
             }
 
-          Time txDuration = m_phy->CalculateTxDuration (m_triggerFrame->GetSize (),
+          Ptr<WifiPsdu> triggerPsdu = GetWifiPsdu (m_triggerFrame, acknowledgment->muBarTxVector);
+          Time txDuration = m_phy->CalculateTxDuration (triggerPsdu->GetSize (),
                                                         acknowledgment->muBarTxVector,
                                                         m_phy->GetPhyBand ());
           // update acknowledgmentTime to correctly set the Duration/ID
@@ -372,7 +392,12 @@
                          &m_staExpectTbPpduFrom, m_staExpectTbPpduFrom.size ());
           m_channelAccessManager->NotifyAckTimeoutStartNow (timeout);
 
-          ForwardMpduDown (m_triggerFrame, acknowledgment->muBarTxVector);
+          ForwardPsduDown (triggerPsdu, acknowledgment->muBarTxVector);
+
+          // Pass TRIGVECTOR to HE PHY (equivalent to PHY-TRIGGER.request primitive)
+          auto hePhy = StaticCast<HePhy> (m_phy->GetPhyEntity (WIFI_MOD_CLASS_HE));
+          hePhy->SetTrigVector (m_trigVector, timeout);
+
           return;
         }
     }
@@ -386,6 +411,8 @@
       // record the set of stations expected to send a BlockAck frame
       m_staExpectTbPpduFrom.clear ();
 
+      m_trigVector = acknowledgment->stationsReplyingWithBlockAck.begin ()->second.blockAckTxVector;
+
       for (auto& station : acknowledgment->stationsReplyingWithBlockAck)
         {
           m_staExpectTbPpduFrom.insert (station.first);
@@ -405,10 +432,13 @@
           mpduList.push_back (PrepareMuBar (station.second.blockAckTxVector,
                                             {{psduMapIt->first, station.second.barHeader}}));
           psduMapIt->second = Create<WifiPsdu> (std::move (mpduList));
+          m_trigVector.SetHeMuUserInfo (psduMapIt->first,
+                                        station.second.blockAckTxVector.GetHeMuUserInfo (psduMapIt->first));
         }
 
       timerType = WifiTxTimer::WAIT_BLOCK_ACKS_IN_TB_PPDU;
       responseTxVector = &acknowledgment->stationsReplyingWithBlockAck.begin ()->second.blockAckTxVector;
+      m_trigVector.SetLength (acknowledgment->ulLength);
     }
   /*
    * Basic Trigger Frame starting an UL MU transmission
@@ -437,11 +467,15 @@
       // Add a SIFS and the TB PPDU duration to the acknowledgment time of the
       // Trigger Frame, so that its Duration/ID is correctly computed
       NS_ASSERT (m_muScheduler != 0);
+      Time tbPpduDuration = HePhy::ConvertLSigLengthToHeTbPpduDuration (m_muScheduler->GetUlMuInfo ().trigger.GetUlLength (),
+                                                                        acknowledgment->tbPpduTxVector,
+                                                                        m_phy->GetPhyBand ());
       acknowledgment->acknowledgmentTime += m_mac->GetWifiPhy ()->GetSifs ()
-                                            + m_muScheduler->GetUlMuInfo ().tbPpduDuration;
+                                            + tbPpduDuration;
 
       timerType = WifiTxTimer::WAIT_TB_PPDU_AFTER_BASIC_TF;
       responseTxVector = &acknowledgment->tbPpduTxVector;
+      m_trigVector = GetTrigVector (m_muScheduler->GetUlMuInfo ().trigger);
     }
   /*
    * BSRP Trigger Frame
@@ -449,10 +483,9 @@
   else if (m_txParams.m_acknowledgment->method == WifiAcknowledgment::NONE
            && !m_txParams.m_txVector.IsUlMu ()
            && m_psduMap.size () == 1 && m_psduMap.begin ()->first == SU_STA_ID
-           && (mpdu = *m_psduMap.begin ()->second->begin ())->GetHeader ().IsTrigger ())
+           && (*m_psduMap.begin ()->second->begin ())->GetHeader ().IsTrigger ())
     {
-      CtrlTriggerHeader trigger;
-      mpdu->GetPacket ()->PeekHeader (trigger);
+      CtrlTriggerHeader& trigger = m_muScheduler->GetUlMuInfo ().trigger;
       NS_ASSERT (trigger.IsBsrp ());
       NS_ASSERT (m_apMac != 0);
 
@@ -477,6 +510,7 @@
 
       timerType = WifiTxTimer::WAIT_QOS_NULL_AFTER_BSRP_TF;
       responseTxVector = &txVector;
+      m_trigVector = GetTrigVector (m_muScheduler->GetUlMuInfo ().trigger);
     }
   /*
    * TB PPDU solicited by a Basic Trigger Frame
@@ -578,6 +612,21 @@
 
   // transmit the map of PSDUs
   ForwardPsduMapDown (psduMap, m_txParams.m_txVector);
+
+  if (timerType == WifiTxTimer::WAIT_BLOCK_ACKS_IN_TB_PPDU
+      || timerType == WifiTxTimer::WAIT_TB_PPDU_AFTER_BASIC_TF
+      || timerType == WifiTxTimer::WAIT_QOS_NULL_AFTER_BSRP_TF)
+    {
+      // Pass TRIGVECTOR to HE PHY (equivalent to PHY-TRIGGER.request primitive)
+      auto hePhy = StaticCast<HePhy> (m_phy->GetPhyEntity (WIFI_MOD_CLASS_HE));
+      hePhy->SetTrigVector (m_trigVector, m_txTimer.GetDelayLeft ());
+    }
+  else if (timerType == WifiTxTimer::NOT_RUNNING
+           && m_txParams.m_txVector.IsUlMu ())
+    {
+      // clear m_psduMap after sending QoS Null frames following a BSRP Trigger Frame
+      Simulator::Schedule (txDuration, &WifiPsduMap::clear, &m_psduMap);
+    }
 }
 
 void
@@ -587,7 +636,7 @@
 
   for (const auto& psdu : psduMap)
     {
-      NS_LOG_DEBUG ("Transmitting: [STAID=" << psdu.first << ", " << *psdu.second << "]"); 
+      NS_LOG_DEBUG ("Transmitting: [STAID=" << psdu.first << ", " << *psdu.second << "]");
     }
   NS_LOG_DEBUG ("TXVECTOR: " << txVector);
   for (const auto& psdu : psduMap)
@@ -612,7 +661,9 @@
 
   CtrlTriggerHeader muBar (TriggerFrameType::MU_BAR_TRIGGER, responseTxVector);
   SetTargetRssi (muBar);
-  Mac48Address rxAddress;
+  // Set the CS Required subfield to true, unless the UL Length subfield is less
+  // than or equal to 418 (see Section 26.5.2.5 of 802.11ax-2021)
+  muBar.SetCsRequired (muBar.GetUlLength () > 418);
 
   // Add the Trigger Dependent User Info subfield to every User Info field
   for (auto& userInfo : muBar)
@@ -626,6 +677,7 @@
 
   Ptr<Packet> bar = Create<Packet> ();
   bar->AddHeader (muBar);
+  Mac48Address rxAddress;
   // "If the Trigger frame has one User Info field and the AID12 subfield of the
   // User Info contains the AID of a STA, then the RA field is set to the address
   // of that STA". Otherwise, it is set to the broadcast address (Sec. 9.3.1.23 -
@@ -727,12 +779,15 @@
 
       // The computed duration may not be coded exactly in the L-SIG length, hence determine
       // the exact duration corresponding to the value that will be coded in this field.
-      dlMuTfMuBarAcknowledgment->ulLength = HePhy::ConvertHeTbPpduDurationToLSigLength (duration, m_phy->GetPhyBand ());
       WifiTxVector& txVector = dlMuTfMuBarAcknowledgment->stationsReplyingWithBlockAck.begin ()->second.blockAckTxVector;
-      duration = HePhy::ConvertLSigLengthToHeTbPpduDuration (dlMuTfMuBarAcknowledgment->ulLength,
-                                                             txVector, m_phy->GetPhyBand ());
+      std::tie (dlMuTfMuBarAcknowledgment->ulLength, duration) = HePhy::ConvertHeTbPpduDurationToLSigLength (duration, txVector, m_phy->GetPhyBand ());
 
       uint32_t muBarSize = GetMuBarSize (dlMuTfMuBarAcknowledgment->barTypes);
+      if (dlMuTfMuBarAcknowledgment->muBarTxVector.GetModulationClass () >= WIFI_MOD_CLASS_VHT)
+        {
+          // MU-BAR TF will be sent as an S-MPDU
+          muBarSize = MpduAggregator::GetSizeIfAggregated (muBarSize, 0);
+        }
       dlMuTfMuBarAcknowledgment->acknowledgmentTime = m_phy->GetSifs ()
                                                       + m_phy->CalculateTxDuration (muBarSize,
                                                                                     dlMuTfMuBarAcknowledgment->muBarTxVector,
@@ -767,11 +822,8 @@
 
       // The computed duration may not be coded exactly in the L-SIG length, hence determine
       // the exact duration corresponding to the value that will be coded in this field.
-      dlMuAggrTfAcknowledgment->ulLength = HePhy::ConvertHeTbPpduDurationToLSigLength (duration, m_phy->GetPhyBand ());
       WifiTxVector& txVector = dlMuAggrTfAcknowledgment->stationsReplyingWithBlockAck.begin ()->second.blockAckTxVector;
-      duration = HePhy::ConvertLSigLengthToHeTbPpduDuration (dlMuAggrTfAcknowledgment->ulLength,
-                                                             txVector, m_phy->GetPhyBand ());
-
+      std::tie (dlMuAggrTfAcknowledgment->ulLength, duration) = HePhy::ConvertHeTbPpduDurationToLSigLength (duration, txVector, m_phy->GetPhyBand ());
       dlMuAggrTfAcknowledgment->acknowledgmentTime = m_phy->GetSifs () + duration;
     }
   /*
@@ -953,6 +1005,70 @@
   m_psduMap.clear ();
 }
 
+void
+HeFrameExchangeManager::NormalAckTimeout (Ptr<WifiMacQueueItem> mpdu, const WifiTxVector& txVector)
+{
+  NS_LOG_FUNCTION (this << *mpdu << txVector);
+
+  VhtFrameExchangeManager::NormalAckTimeout (mpdu, txVector);
+
+  // If a Normal Ack is missed in response to a DL MU PPDU requiring acknowledgment
+  // in SU format, we have to set the Retry flag for all transmitted MPDUs that have
+  // not been acknowledged nor discarded and clear m_psduMap since the transmission failed.
+  for (auto& psdu : m_psduMap)
+    {
+      for (auto& mpdu : *PeekPointer (psdu.second))
+        {
+          if (mpdu->IsQueued ())
+            {
+              mpdu->GetHeader ().SetRetry ();
+            }
+        }
+    }
+  m_psduMap.clear ();
+}
+
+void
+HeFrameExchangeManager::BlockAckTimeout (Ptr<WifiPsdu> psdu, const WifiTxVector& txVector)
+{
+  NS_LOG_FUNCTION (this << *psdu << txVector);
+
+  VhtFrameExchangeManager::BlockAckTimeout (psdu, txVector);
+
+  // If a Block Ack is missed in response to a DL MU PPDU requiring acknowledgment
+  // in SU format, we have to set the Retry flag for all transmitted MPDUs that have
+  // not been acknowledged nor discarded and clear m_psduMap since the transmission failed.
+  for (auto& psdu : m_psduMap)
+    {
+      for (auto& mpdu : *PeekPointer (psdu.second))
+        {
+          if (mpdu->IsQueued ())
+            {
+              mpdu->GetHeader ().SetRetry ();
+            }
+        }
+    }
+  m_psduMap.clear ();
+}
+
+WifiTxVector
+HeFrameExchangeManager::GetTrigVector (const CtrlTriggerHeader& trigger) const
+{
+  WifiTxVector v;
+  v.SetPreambleType (WifiPreamble::WIFI_PREAMBLE_HE_TB);
+  v.SetChannelWidth (trigger.GetUlBandwidth ());
+  v.SetGuardInterval (trigger.GetGuardInterval ());
+  v.SetLength (trigger.GetUlLength ());
+  for (const auto& userInfoField : trigger)
+    {
+      v.SetHeMuUserInfo (userInfoField.GetAid12 (),
+                         {userInfoField.GetRuAllocation (),
+                          HePhy::GetHeMcs (userInfoField.GetUlMcs ()),
+                          userInfoField.GetNss ()});
+    }
+  return v;
+}
+
 WifiTxVector
 HeFrameExchangeManager::GetHeTbTxVector (CtrlTriggerHeader trigger, Mac48Address triggerSender) const
 {
@@ -1191,15 +1307,13 @@
       // otherwise, check if a suitable data frame is available
       if ((mpdu = edca->PeekNextMpdu (tid, hdr.GetAddr2 ())) != 0)
         {
-          WifiMacQueueItem::ConstIterator queueIt;
-          Ptr<WifiMacQueueItem> item = edca->GetNextMpdu (mpdu, txParams, ppduDuration, false, queueIt);
+          Ptr<WifiMacQueueItem> item = edca->GetNextMpdu (mpdu, txParams, ppduDuration, false);
 
           if (item != 0)
             {
               // try A-MPDU aggregation
               std::vector<Ptr<WifiMacQueueItem>> mpduList = m_mpduAggregator->GetNextAmpdu (item, txParams,
-                                                                                            ppduDuration,
-                                                                                            queueIt);
+                                                                                            ppduDuration);
               psdu = (mpduList.size () > 1 ? Create<WifiPsdu> (std::move (mpduList))
                                            : Create<WifiPsdu> (item, true));
               break;
@@ -1230,7 +1344,9 @@
 
   if (trigger.GetCsRequired () && hdr.GetAddr2 () != m_txopHolder && m_navEnd > Simulator::Now ())
     {
-      NS_LOG_DEBUG ("Carrier Sensing required and channel busy, do nothing");
+      NS_LOG_DEBUG ("Carrier Sensing required and channel busy (TA=" << hdr.GetAddr2 ()
+                    << ", TxopHolder=" << m_txopHolder << ", NAV end=" << m_navEnd.As (Time::S)
+                    << "), do nothing");
       return;
     }
 
@@ -1293,11 +1409,26 @@
 }
 
 void
+HeFrameExchangeManager::SetTxopHolder (Ptr<const WifiPsdu> psdu, const WifiTxVector& txVector)
+{
+  NS_LOG_FUNCTION (this << psdu << txVector);
+
+  if (psdu->GetHeader (0).IsTrigger ())
+    {
+      m_txopHolder = psdu->GetAddr2 ();
+    }
+  else if (!txVector.IsUlMu ())  // the sender of a TB PPDU is not the TXOP holder
+    {
+      VhtFrameExchangeManager::SetTxopHolder (psdu, txVector);
+    }
+}
+
+void
 HeFrameExchangeManager::ReceiveMpdu (Ptr<WifiMacQueueItem> mpdu, RxSignalInfo rxSignalInfo,
                                      const WifiTxVector& txVector, bool inAmpdu)
 {
   // The received MPDU is either broadcast or addressed to this station
-  NS_ASSERT (mpdu->GetHeader ().GetAddr1 ().IsBroadcast ()
+  NS_ASSERT (mpdu->GetHeader ().GetAddr1 ().IsGroup ()
              || mpdu->GetHeader ().GetAddr1 () == m_self);
 
   const WifiMacHeader& hdr = mpdu->GetHeader ();
@@ -1394,7 +1525,26 @@
 
   if (hdr.IsCtl ())
     {
-      if (hdr.IsAck () && m_txTimer.IsRunning ()
+      if (hdr.IsCts () && m_txTimer.IsRunning () && m_txTimer.GetReason () == WifiTxTimer::WAIT_CTS
+          && m_psduMap.size () == 1)
+        {
+          NS_ABORT_MSG_IF (inAmpdu, "Received CTS as part of an A-MPDU");
+          NS_ASSERT (hdr.GetAddr1 () == m_self);
+
+          Mac48Address sender = m_psduMap.begin ()->second->GetAddr1 ();
+          NS_LOG_DEBUG ("Received CTS from=" << sender);
+
+          SnrTag tag;
+          mpdu->GetPacket ()->PeekPacketTag (tag);
+          m_mac->GetWifiRemoteStationManager ()->ReportRxOk (sender, rxSignalInfo, txVector);
+          m_mac->GetWifiRemoteStationManager ()->ReportRtsOk (m_psduMap.begin ()->second->GetHeader (0),
+                                                              rxSignalInfo.snr, txVector.GetMode (), tag.Get ());
+
+          m_txTimer.Cancel ();
+          m_channelAccessManager->NotifyCtsTimeoutResetNow ();
+          Simulator::Schedule (m_phy->GetSifs (), &HeFrameExchangeManager::SendPsduMap, this);
+        }
+      else if (hdr.IsAck () && m_txTimer.IsRunning ()
           && m_txTimer.GetReason () == WifiTxTimer::WAIT_NORMAL_ACK_AFTER_DL_MU_PPDU)
         {
           NS_ASSERT (hdr.GetAddr1 () == m_self);
@@ -1411,8 +1561,15 @@
           SnrTag tag;
           mpdu->GetPacket ()->PeekPacketTag (tag);
           ReceivedNormalAck (*it->second->begin (), m_txParams.m_txVector, txVector, rxSignalInfo, tag.Get ());
+          m_psduMap.clear ();
         }
-      else if (hdr.IsBlockAck () && m_txTimer.IsRunning ()
+      // TODO the PHY should not pass us a non-TB PPDU if we are waiting for a
+      // TB PPDU. However, processing the PHY header is done by the PHY entity
+      // corresponding to the modulation class of the PPDU being received, hence
+      // it is not possible to check if a valid TRIGVECTOR is stored when receiving
+      // PPDUs of older modulation classes. Therefore, we check here that we are
+      // actually receiving a TB PPDU.
+      else if (hdr.IsBlockAck () && txVector.IsUlMu () && m_txTimer.IsRunning ()
                && m_txTimer.GetReason () == WifiTxTimer::WAIT_BLOCK_ACKS_IN_TB_PPDU)
         {
           Mac48Address sender = hdr.GetAddr2 ();
@@ -1460,6 +1617,12 @@
           NS_LOG_DEBUG ("Received a Multi-STA BlockAck from=" << hdr.GetAddr2 ());
 
           NS_ASSERT (m_staMac != nullptr && m_staMac->IsAssociated ());
+          if (hdr.GetAddr2 () != m_bssid)
+            {
+              NS_LOG_DEBUG ("The sender is not the AP we are associated with");
+              return;
+            }
+
           uint16_t staId = m_staMac->GetAssociationId ();
           std::vector<uint32_t> indices = blockAck.FindPerAidTidInfoWithAid (staId);
 
@@ -1525,6 +1688,15 @@
           m_channelAccessManager->NotifyAckTimeoutResetNow ();
           m_psduMap.clear ();
         }
+      else if (hdr.IsBlockAck () && m_txTimer.IsRunning ()
+               && m_txTimer.GetReason () == WifiTxTimer::WAIT_BLOCK_ACK)
+        {
+          // this BlockAck frame may have been sent in response to a DL MU PPDU with
+          // acknowledgment in SU format or one of the consequent BlockAckReq frames.
+          // We clear the PSDU map and let parent classes continue processing this frame.
+          m_psduMap.clear ();
+          VhtFrameExchangeManager::ReceiveMpdu (mpdu, rxSignalInfo, txVector, inAmpdu);
+        }
       else if (hdr.IsTrigger ())
         {
           // Trigger Frames are only processed by STAs
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/he/he-frame-exchange-manager.h ns-3.36/src/wifi/model/he/he-frame-exchange-manager.h
--- ns-3.35/src/wifi/model/he/he-frame-exchange-manager.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/he/he-frame-exchange-manager.h	2022-04-30 18:23:58.206735100 -0700
@@ -61,8 +61,9 @@
 
   uint16_t GetSupportedBaBufferSize (void) const override;
   bool StartFrameExchange (Ptr<QosTxop> edca, Time availableTime, bool initialFrame) override;
-  void SetWifiMac (const Ptr<RegularWifiMac> mac) override;
+  void SetWifiMac (const Ptr<WifiMac> mac) override;
   void CalculateAcknowledgmentTime (WifiAcknowledgment* acknowledgment) const override;
+  void SetTxopHolder (Ptr<const WifiPsdu> psdu, const WifiTxVector& txVector) override;
 
   /**
    * Set the Multi-user Scheduler associated with this Frame Exchange Manager.
@@ -100,6 +101,9 @@
   Time GetTxDuration (uint32_t ppduPayloadSize, Mac48Address receiver,
                       const WifiTxParameters& txParams) const override;
   bool SendMpduFromBaManager (Ptr<QosTxop> edca, Time availableTime, bool initialFrame) override;
+  void NormalAckTimeout (Ptr<WifiMacQueueItem> mpdu, const WifiTxVector& txVector) override;
+  void BlockAckTimeout (Ptr<WifiPsdu> psdu, const WifiTxVector& txVector) override;
+  void CtsTimeout (Ptr<WifiMacQueueItem> rts, const WifiTxVector& txVector) override;
 
   /**
    * Send a map of PSDUs as a DL MU PPDU.
@@ -155,6 +159,15 @@
   virtual void BlockAckAfterTbPpduTimeout (Ptr<WifiPsdu> psdu, const WifiTxVector& txVector);
 
   /**
+   * Get the TRIGVECTOR that the MAC has to pass to the PHY when transmitting
+   * the given Trigger Frame.
+   *
+   * \param trigger the given Trigger Frame
+   * \return the TRIGVECTOR
+   */
+  WifiTxVector GetTrigVector (const CtrlTriggerHeader& trigger) const;
+
+  /**
    * Return a TXVECTOR for the UL frame that the station will send in response to
    * the given Trigger frame, configured with the BSS color and transmit power
    * level to use for the consequent HE TB PPDU.
@@ -200,6 +213,7 @@
 
   Ptr<ApWifiMac> m_apMac;                             //!< MAC pointer (null if not an AP)
   Ptr<StaWifiMac> m_staMac;                           //!< MAC pointer (null if not a STA)
+  WifiTxVector m_trigVector;                          //!< the TRIGVECTOR
 
 private:
   /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/he/he-phy.cc ns-3.36/src/wifi/model/he/he-phy.cc
--- ns-3.35/src/wifi/model/he/he-phy.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/he/he-phy.cc	2022-04-30 18:23:58.206735100 -0700
@@ -68,7 +68,8 @@
 /* *NS_CHECK_STYLE_ON* */
 
 HePhy::HePhy (bool buildModeList /* = true */)
-  : VhtPhy (false) //don't add VHT modes to list
+  : VhtPhy (false), //don't add VHT modes to list
+    m_trigVectorExpirationTime (Seconds (0))
 {
   NS_LOG_FUNCTION (this << buildModeList);
   m_bssMembershipSelector = HE_PHY;
@@ -257,36 +258,39 @@
     }
 }
 
-uint16_t
-HePhy::ConvertHeTbPpduDurationToLSigLength (Time ppduDuration, WifiPhyBand band)
+Time
+HePhy::GetValidPpduDuration (Time ppduDuration, const WifiTxVector& txVector,
+                             WifiPhyBand band)
 {
-  uint8_t sigExtension = 0;
-  if (band == WIFI_PHY_BAND_2_4GHZ)
-    {
-      sigExtension = 6;
-    }
+  Time tSymbol = NanoSeconds (12800 + txVector.GetGuardInterval ());
+  Time preambleDuration = WifiPhy::GetStaticPhyEntity (WIFI_MOD_CLASS_HE)->CalculatePhyPreambleAndHeaderDuration (txVector); //this is quite convoluted but only way of keeping the method static
+  uint8_t sigExtension = (band == WIFI_PHY_BAND_2_4GHZ ? 6 : 0);
+  uint32_t nSymbols = floor (static_cast<double> ((ppduDuration - preambleDuration).GetNanoSeconds () - (sigExtension * 1000)) / tSymbol.GetNanoSeconds ());
+  return preambleDuration + (nSymbols * tSymbol) + MicroSeconds (sigExtension);
+}
+
+std::pair<uint16_t, Time>
+HePhy::ConvertHeTbPpduDurationToLSigLength (Time ppduDuration, const WifiTxVector& txVector,
+                                            WifiPhyBand band)
+{
+  NS_ABORT_IF (!txVector.IsUlMu () || (txVector.GetModulationClass () != WIFI_MOD_CLASS_HE));
+  // update ppduDuration so that it is a valid PPDU duration
+  ppduDuration = GetValidPpduDuration (ppduDuration, txVector, band);
+  uint8_t sigExtension = (band == WIFI_PHY_BAND_2_4GHZ ? 6 : 0);
   uint8_t m = 2; //HE TB PPDU so m is set to 2
   uint16_t length = ((ceil ((static_cast<double> (ppduDuration.GetNanoSeconds () - (20 * 1000) - (sigExtension * 1000)) / 1000) / 4.0) * 3) - 3 - m);
-  return length;
+  return {length, ppduDuration};
 }
 
 Time
 HePhy::ConvertLSigLengthToHeTbPpduDuration (uint16_t length, const WifiTxVector& txVector, WifiPhyBand band)
 {
   NS_ABORT_IF (!txVector.IsUlMu () || (txVector.GetModulationClass () != WIFI_MOD_CLASS_HE));
-  Time tSymbol = NanoSeconds (12800 + txVector.GetGuardInterval ());
-  Time preambleDuration = WifiPhy::GetStaticPhyEntity (WIFI_MOD_CLASS_HE)->CalculatePhyPreambleAndHeaderDuration (txVector); //this is quite convoluted but only way of keeping the method static
-  uint8_t sigExtension = 0;
-  if (band == WIFI_PHY_BAND_2_4GHZ)
-    {
-      sigExtension = 6;
-    }
+  uint8_t sigExtension = (band == WIFI_PHY_BAND_2_4GHZ ? 6 : 0);
   uint8_t m = 2; //HE TB PPDU so m is set to 2
   //Equation 27-11 of IEEE P802.11ax/D4.0
   Time calculatedDuration = MicroSeconds (((ceil (static_cast<double> (length + 3 + m) / 3)) * 4) + 20 + sigExtension);
-  uint32_t nSymbols = floor (static_cast<double> ((calculatedDuration - preambleDuration).GetNanoSeconds () - (sigExtension * 1000)) / tSymbol.GetNanoSeconds ());
-  Time ppduDuration = preambleDuration + (nSymbols * tSymbol) + MicroSeconds (sigExtension);
-  return ppduDuration;
+  return GetValidPpduDuration (calculatedDuration, txVector, band);
 }
 
 Time
@@ -313,6 +317,14 @@
   return NanoSeconds (12800 + gi);
 }
 
+void
+HePhy::SetTrigVector (const WifiTxVector& trigVector, Time validity)
+{
+  m_trigVector = trigVector;
+  m_trigVectorExpirationTime = Simulator::Now () + validity;
+  NS_LOG_FUNCTION (this << m_trigVector << m_trigVectorExpirationTime.As (Time::US));
+}
+
 Ptr<WifiPpdu>
 HePhy::BuildPpdu (const WifiConstPsduMap & psdus, const WifiTxVector& txVector, Time ppduDuration)
 {
@@ -328,7 +340,8 @@
       flag = HePpdu::PSD_NON_HE_TB;
     }
   return Create<HePpdu> (psdus, txVector, ppduDuration, m_wifiPhy->GetPhyBand (),
-                         ObtainNextUid (txVector), flag);
+                         ObtainNextUid (txVector), flag,
+                         m_wifiPhy->GetOperatingChannel ().GetPrimaryChannelIndex (20));
 }
 
 void
@@ -434,23 +447,10 @@
         {
           NS_LOG_DEBUG ("Received another HE TB PPDU for UID " << ppdu->GetUid () << " from STA-ID " << ppdu->GetStaId () << " and BSS color " << +txVector.GetBssColor ());
           event = it->second;
-          if (Simulator::Now () - event->GetStartTime () > NanoSeconds (400))
-            {
-              //Section 27.3.14.3 from 802.11ax Draft 4.0: Pre-correction accuracy requirements.
-              //A STA that transmits an HE TB PPDU, non-HT PPDU, or non-HT duplicate PPDU in response to a triggering PPDU
-              //shall ensure that the transmission start time of the HE TB PPDU, non-HT PPDU, or non-HT duplicate PPDU is
-              //within Â±0.4 Âµs + 16 Âµs from the end, at the STAâ€™s antenna connector, of the last OFDM symbol of the triggering
-              //PPDU (if it contains no PE field) or of the PE field of the triggering PPDU (if the PE field is present).
-              //As a result, if an HE TB PPDU arrives later than 0.4 Âµs, it is added as an interference but PPDU is dropped.
-              event = CreateInterferenceEvent (ppdu, txVector, rxDuration, rxPowersW);
-              NS_LOG_DEBUG ("Drop packet because not received within the 400ns window");
-              m_wifiPhy->NotifyRxDrop (GetAddressedPsduInPpdu (ppdu), HE_TB_PPDU_TOO_LATE);
-            }
-          else
-            {
-              //Update received power of the event associated to that UL MU transmission
-              UpdateInterferenceEvent (event, rxPowersW);
-            }
+
+          //Update received power of the event associated to that UL MU transmission
+          UpdateInterferenceEvent (event, rxPowersW);
+
           if ((GetCurrentEvent () != 0) && (GetCurrentEvent ()->GetPpdu ()->GetUid () != ppdu->GetUid ()))
             {
               NS_LOG_DEBUG ("Drop packet because already receiving another HE TB PPDU");
@@ -488,10 +488,9 @@
 HePhy::GetBssColor (void) const
 {
   uint8_t bssColor = 0;
-  Ptr<WifiNetDevice> device = DynamicCast<WifiNetDevice> (m_wifiPhy->GetDevice ());
-  if (device)
+  if (m_wifiPhy->GetDevice () != nullptr)
     {
-      Ptr<HeConfiguration> heConfiguration = device->GetHeConfiguration ();
+      Ptr<HeConfiguration> heConfiguration = m_wifiPhy->GetDevice ()->GetHeConfiguration ();
       if (heConfiguration)
         {
           bssColor = heConfiguration->GetBssColor ();
@@ -509,14 +508,10 @@
     }
   else if (ppdu->GetType () == WIFI_PPDU_TYPE_DL_MU)
     {
-      Ptr<WifiNetDevice> device = DynamicCast<WifiNetDevice> (m_wifiPhy->GetDevice ());
-      if (device)
+      Ptr<StaWifiMac> mac = DynamicCast<StaWifiMac> (m_wifiPhy->GetDevice ()->GetMac ());
+      if (mac && mac->IsAssociated ())
         {
-          Ptr<StaWifiMac> mac = DynamicCast<StaWifiMac> (device->GetMac ());
-          if (mac && mac->IsAssociated ())
-            {
-              return mac->GetAssociationId ();
-            }
+          return mac->GetAssociationId ();
         }
     }
   return PhyEntity::GetStaId (ppdu);
@@ -544,10 +539,49 @@
           return PhyFieldRxStatus (false, FILTERED, DROP);
         }
 
+      // When SIG-A is decoded, we know the type of frame being received. If we stored a
+      // valid TRIGVECTOR and we are not receiving a TB PPDU, we drop the frame.
+      if (m_trigVectorExpirationTime >= Simulator::Now () && !txVector.IsUlMu ())
+        {
+          NS_LOG_DEBUG ("Expected an HE TB PPDU, receiving a " << txVector.GetPreambleType ());
+          return PhyFieldRxStatus (false, FILTERED, DROP);
+        }
+
       Ptr<const WifiPpdu> ppdu = event->GetPpdu ();
       if (txVector.IsUlMu ())
         {
           NS_ASSERT (txVector.GetModulationClass () == WIFI_MOD_CLASS_HE);
+          // check that the stored TRIGVECTOR is still valid
+          if (m_trigVectorExpirationTime < Simulator::Now ())
+            {
+              NS_LOG_DEBUG ("No valid TRIGVECTOR, the PHY was not expecting a TB PPDU");
+              return PhyFieldRxStatus (false, FILTERED, DROP);
+            }
+          // We expected a TB PPDU and we are receiving a TB PPDU. However, despite
+          // the previous check on BSS Color, we may be receiving a TB PPDU from an
+          // OBSS, as BSS Colors are not guaranteed to be different for all APs in
+          // range (an example is when BSS Color is 0). We can detect this situation
+          // by comparing the TRIGVECTOR with the TXVECTOR of the TB PPDU being received
+          if (m_trigVector.GetChannelWidth () != txVector.GetChannelWidth ())
+            {
+              NS_LOG_DEBUG ("Received channel width different than in TRIGVECTOR");
+              return PhyFieldRxStatus (false, FILTERED, DROP);
+            }
+          if (m_trigVector.GetLength () != txVector.GetLength ())
+            {
+              NS_LOG_DEBUG ("Received UL Length (" << txVector.GetLength () <<
+                            ") different than in TRIGVECTOR (" << m_trigVector.GetLength ()
+                            << ")");
+              return PhyFieldRxStatus (false, FILTERED, DROP);
+            }
+          uint16_t staId = ppdu->GetStaId ();
+          if (m_trigVector.GetHeMuUserInfoMap ().find (staId) == m_trigVector.GetHeMuUserInfoMap ().end ()
+              || m_trigVector.GetHeMuUserInfo (staId) != txVector.GetHeMuUserInfo (staId))
+            {
+              NS_LOG_DEBUG ("User Info map of TB PPDU being received differs from that of TRIGVECTOR");
+              return PhyFieldRxStatus (false, FILTERED, DROP);
+            }
+
           m_currentHeTbPpduUid = ppdu->GetUid (); //to be able to correctly schedule start of OFDMA payload
         }
 
@@ -634,8 +668,7 @@
   if (txVector.IsUlMu ())
     {
       NS_ASSERT (txVector.GetModulationClass () == WIFI_MOD_CLASS_HE);
-      Ptr<WifiNetDevice> device = DynamicCast<WifiNetDevice> (m_wifiPhy->GetDevice ());
-      bool isAp = device != 0 && (DynamicCast<ApWifiMac> (device->GetMac ()) != 0);
+      bool isAp = (DynamicCast<ApWifiMac> (m_wifiPhy->GetDevice ()->GetMac ()) != 0);
       if (!isAp)
         {
           NS_LOG_DEBUG ("Ignore HE TB PPDU payload received by STA but keep state in Rx");
@@ -733,6 +766,8 @@
   m_endRxPayloadEvents.push_back (Simulator::Schedule (payloadDuration, &PhyEntity::EndReceivePayload, this, event));
   m_signalNoiseMap.insert ({std::make_pair (ppdu->GetUid (), ppdu->GetStaId ()), SignalNoiseDbm ()});
   m_statusPerMpduMap.insert ({std::make_pair (ppdu->GetUid (), ppdu->GetStaId ()), std::vector<bool> ()});
+  // Notify the MAC about the start of a new HE TB PPDU, so that it can reschedule the timeout
+  NotifyPayloadBegin (ppdu->GetTxVector (), payloadDuration);
 }
 
 std::pair<uint16_t, WifiSpectrumBand>
@@ -1032,14 +1067,13 @@
   return WifiModeFactory::CreateWifiMcs ("HeMcs" + std::to_string (index),
                                          index,
                                          WIFI_MOD_CLASS_HE,
+                                         false,
                                          MakeBoundCallback (&GetCodeRate, index),
                                          MakeBoundCallback (&GetConstellationSize, index),
-                                         MakeBoundCallback (&GetPhyRate, index),
                                          MakeCallback (&GetPhyRateFromTxVector),
-                                         MakeBoundCallback (&GetDataRate, index),
                                          MakeCallback (&GetDataRateFromTxVector),
                                          MakeBoundCallback (&GetNonHtReferenceRate, index),
-                                         MakeCallback (&IsModeAllowed));
+                                         MakeCallback (&IsAllowed));
 }
 
 WifiCodeRate
@@ -1170,7 +1204,7 @@
 }
 
 bool
-HePhy::IsModeAllowed (uint16_t /* channelWidth */, uint8_t /* nss */)
+HePhy::IsAllowed (const WifiTxVector& /*txVector*/)
 {
   return true;
 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/he/he-phy.h ns-3.36/src/wifi/model/he/he-phy.h
--- ns-3.35/src/wifi/model/he/he-phy.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/he/he-phy.h	2022-04-30 18:23:58.206735100 -0700
@@ -108,12 +108,19 @@
   uint8_t GetBssColor (void) const;
 
   /**
+   * Compute the L-SIG length value corresponding to the given HE TB PPDU duration.
+   * If the latter is not a feasible duration (considering the selected guard interval),
+   * a proper duration is computed and returned along with the L-SIG length value.
+   *
    * \param ppduDuration the duration of the HE TB PPDU
+   * \param txVector the TXVECTOR used for the transmission of this HE TB PPDU
    * \param band the frequency band being used
    *
-   * \return the L-SIG length value corresponding to that HE TB PPDU duration.
+   * \return the L-SIG length value and the adjusted HE TB PPDU duration.
    */
-  static uint16_t ConvertHeTbPpduDurationToLSigLength (Time ppduDuration, WifiPhyBand band);
+  static std::pair<uint16_t, Time> ConvertHeTbPpduDurationToLSigLength (Time ppduDuration,
+                                                                        const WifiTxVector& txVector,
+                                                                        WifiPhyBand band);
   /**
    * \param length the L-SIG length value
    * \param txVector the TXVECTOR used for the transmission of this HE TB PPDU
@@ -172,6 +179,15 @@
   uint64_t GetCurrentHeTbPpduUid (void) const;
 
   /**
+   * Set the TRIGVECTOR and the associated expiration time. A TRIGVECTOR shall expire
+   * when the TX timer associated with the transmission of the Trigger Frame expires.
+   *
+   * \param trigVector the TRIGVECTOR
+   * \param validity the amount of time (from now) until expiration of the TRIGVECTOR
+   */
+  void SetTrigVector (const WifiTxVector& trigVector, Time validity);
+
+  /**
    * Get the center frequency of the non-OFDMA part of the current TxVector for the
    * given STA-ID.
    * Note this method is only to be used for UL MU.
@@ -357,15 +373,13 @@
    */
   static uint64_t GetNonHtReferenceRate (uint8_t mcsValue);
   /**
-   * Check whether the combination of <MCS, channel width, NSS> is allowed.
-   * This function is used as a callback for WifiMode operation, and always
-   * returns true since there is no limitation for any MCS in HePhy.
+   * Check whether the combination in TXVECTOR is allowed.
+   * This function is used as a callback for WifiMode operation.
    *
-   * \param channelWidth the considered channel width in MHz
-   * \param nss the considered number of streams
-   * \returns true.
+   * \param txVector the TXVECTOR
+   * \returns true if this combination is allowed, false otherwise.
    */
-  static bool IsModeAllowed (uint16_t channelWidth, uint8_t nss);
+  static bool IsAllowed (const WifiTxVector& txVector);
 
 protected:
   PhyFieldRxStatus ProcessSigA (Ptr<Event> event, PhyFieldRxStatus status) override;
@@ -416,6 +430,8 @@
   std::map <uint16_t /* STA-ID */, EventId> m_beginOfdmaPayloadRxEvents; //!< the beginning of the OFDMA payload reception events (indexed by STA-ID)
 
   EndOfHeSigACallback m_endOfHeSigACallback; //!< end of HE-SIG-A callback
+  WifiTxVector m_trigVector;                 //!< the TRIGVECTOR
+  Time m_trigVectorExpirationTime;           //!< expiration time of the TRIGVECTOR
 
 private:
   void BuildModeList (void) override;
@@ -432,6 +448,19 @@
    */
   static WifiMode CreateHeMcs (uint8_t index);
 
+  /**
+   * Given a PPDU duration value, the TXVECTOR used to transmit the PPDU and
+   * the PHY band, compute a valid PPDU duration considering the number and
+   * duration of symbols, the preamble duration and the guard interval.
+   *
+   * \param ppduDuration the given PPDU duration
+   * \param txVector the given TXVECTOR
+   * \param band the PHY band
+   * \return a valid PPDU duration
+   */
+  static Time GetValidPpduDuration (Time ppduDuration, const WifiTxVector& txVector,
+                                    WifiPhyBand band);
+
   static const PpduFormats m_hePpduFormats; //!< HE PPDU formats
 }; //class HePhy
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/he/he-ppdu.cc ns-3.36/src/wifi/model/he/he-ppdu.cc
--- ns-3.35/src/wifi/model/he/he-ppdu.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/he/he-ppdu.cc	2022-04-30 18:23:58.206735100 -0700
@@ -48,7 +48,7 @@
 }
 
 HePpdu::HePpdu (const WifiConstPsduMap & psdus, const WifiTxVector& txVector, Time ppduDuration,
-                WifiPhyBand band, uint64_t uid, TxPsdFlag flag)
+                WifiPhyBand band, uint64_t uid, TxPsdFlag flag, uint8_t p20Index)
   : OfdmPpdu (psdus.begin ()->second, txVector, band, uid, false) //don't instantiate LSigHeader of OfdmPpdu
 {
   NS_LOG_FUNCTION (this << psdus << txVector << ppduDuration << band << uid << flag);
@@ -59,7 +59,13 @@
   m_psdus = psdus;
   if (IsMu ())
     {
-      m_muUserInfos = txVector.GetHeMuUserInfoMap ();
+      for (auto heMuUserInfo : txVector.GetHeMuUserInfoMap ())
+        {
+          // Set RU PHY index
+          heMuUserInfo.second.ru.SetPhyIndex (txVector.GetChannelWidth (), p20Index);
+          auto [it, ret] = m_muUserInfos.emplace (heMuUserInfo);
+          NS_ABORT_MSG_IF (!ret, "STA-ID " << heMuUserInfo.first << " already present");
+        }
     }
 
   SetPhyHeaders (txVector, ppduDuration);
@@ -128,6 +134,7 @@
   txVector.SetNss (m_heSig.GetNStreams ());
   txVector.SetGuardInterval (m_heSig.GetGuardInterval ());
   txVector.SetBssColor (m_heSig.GetBssColor ());
+  txVector.SetLength (m_lSig.GetLength ());
   txVector.SetAggregation (m_psdus.size () > 1 || m_psdus.begin ()->second->IsAggregate ());
   for (auto const& muUserInfo : m_muUserInfos)
     {
@@ -159,7 +166,7 @@
 Ptr<WifiPpdu>
 HePpdu::Copy (void) const
 {
-  return Create<HePpdu> (m_psdus, GetTxVector (), GetTxDuration (), m_band, m_uid, m_txPsdFlag);
+  return ns3::Copy (Ptr (this));
 }
 
 WifiPpduType
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/he/he-ppdu.h ns-3.36/src/wifi/model/he/he-ppdu.h
--- ns-3.35/src/wifi/model/he/he-ppdu.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/he/he-ppdu.h	2022-04-30 18:23:58.206735100 -0700
@@ -184,9 +184,10 @@
    * \param band the WifiPhyBand used for the transmission of this PPDU
    * \param uid the unique ID of this PPDU or of the triggering PPDU if this is an HE TB PPDU
    * \param flag the flag indicating the type of Tx PSD to build
+   * \param p20Index the index of the primary 20 MHz channel
    */
   HePpdu (const WifiConstPsduMap & psdus, const WifiTxVector& txVector, Time ppduDuration,
-          WifiPhyBand band, uint64_t uid, TxPsdFlag flag);
+          WifiPhyBand band, uint64_t uid, TxPsdFlag flag, uint8_t p20Index);
   /**
    * Destructor for HePpdu.
    */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/he/he-ru.cc ns-3.36/src/wifi/model/he/he-ru.cc
--- ns-3.35/src/wifi/model/he/he-ru.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/he/he-ru.cc	2022-04-30 18:23:58.206735100 -0700
@@ -598,5 +598,21 @@
   return ruType;
 }
 
+bool
+HeRu::RuSpec::operator== (const RuSpec& other) const
+{
+  // we do not compare the RU PHY indices because they may be uninitialized for
+  // one of the compared RUs. This event should not cause the comparison to evaluate
+  // to false
+  return m_ruType == other.m_ruType
+         && m_index == other.m_index
+         && m_primary80MHz == other.m_primary80MHz;
+}
+
+bool
+HeRu::RuSpec::operator!= (const RuSpec& other) const
+{
+  return !(*this == other);
+}
 
 } //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/he/he-ru.h ns-3.36/src/wifi/model/he/he-ru.h
--- ns-3.35/src/wifi/model/he/he-ru.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/he/he-ru.h	2022-04-30 18:23:58.206735100 -0700
@@ -118,6 +118,21 @@
      */
     std::size_t GetPhyIndex (void) const;
 
+    /**
+     * Compare this RU to the given RU.
+     *
+     * \param other the given RU
+     * \return true if this RU compares equal to the given RU, false otherwise
+     */
+    bool operator== (const RuSpec& other) const;
+    /**
+     * Compare this RU to the given RU.
+     *
+     * \param other the given RU
+     * \return true if this RU differs from the given RU, false otherwise
+     */
+    bool operator!= (const RuSpec& other) const;
+
   private:
     RuType m_ruType;         //!< RU type
     std::size_t m_index;     /**< RU index (starting at 1) as defined by Tables 27-7
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/he/multi-user-scheduler.cc ns-3.36/src/wifi/model/he/multi-user-scheduler.cc
--- ns-3.35/src/wifi/model/he/multi-user-scheduler.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/he/multi-user-scheduler.cc	2022-04-30 18:23:58.206735100 -0700
@@ -63,7 +63,6 @@
   m_dlInfo.psduMap.clear ();
   m_dlInfo.txParams.Clear ();
   m_ulInfo.txParams.Clear ();
-  m_ulInfo.trigger = 0;
   Object::DoDispose ();
 }
 
@@ -142,6 +141,7 @@
     {
       NS_ABORT_MSG_IF (m_heFem == 0, "UL MU PPDUs are only supported by HE APs");
       m_ulInfo = ComputeUlMuInfo ();
+      CheckTriggerFrame ();
     }
 
   if (txFormat != NO_TX)
@@ -182,4 +182,16 @@
   return m_ulInfo;
 }
 
+void
+MultiUserScheduler::CheckTriggerFrame (void)
+{
+  NS_LOG_FUNCTION (this);
+
+  // Set the CS Required subfield to true, unless the UL Length subfield is less
+  // than or equal to 76 (see Section 26.5.2.5 of 802.11ax-2021)
+  m_ulInfo.trigger.SetCsRequired (m_ulInfo.trigger.GetUlLength () > 76);
+
+  m_heFem->SetTargetRssi (m_ulInfo.trigger);
+}
+
 } //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/he/multi-user-scheduler.h ns-3.36/src/wifi/model/he/multi-user-scheduler.h
--- ns-3.35/src/wifi/model/he/multi-user-scheduler.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/he/multi-user-scheduler.h	2022-04-30 18:23:58.206735100 -0700
@@ -77,8 +77,8 @@
   /// Information to be provided in case of UL MU transmission
   struct UlMuInfo
   {
-    Ptr<WifiMacQueueItem> trigger;  //!< the Trigger frame used to solicit TB PPDUs
-    Time tbPpduDuration;            //!< the duration of the solicited TB PPDU
+    CtrlTriggerHeader trigger;      //!< the Trigger Frame used to solicit TB PPDUs
+    WifiMacHeader macHdr;           //!< the MAC header for the Trigger Frame
     WifiTxParameters txParams;      //!< the transmission parameters for the Trigger Frame
   };
 
@@ -168,6 +168,13 @@
    */
   virtual UlMuInfo ComputeUlMuInfo (void) = 0;
 
+  /**
+   * Ensure that the Trigger Frame returned in case of UL MU transmission is
+   * correct. Currently, this method sets the CS Required, the AP Tx Power and
+   * the UL Target Receive Power subfields.
+   */
+  void CheckTriggerFrame (void);
+
   TxFormat m_lastTxFormat {NO_TX};       //!< the format of last transmission
   DlMuInfo m_dlInfo;                     //!< information required to perform a DL MU transmission
   UlMuInfo m_ulInfo;                     //!< information required to solicit an UL MU transmission
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/he/rr-multi-user-scheduler.cc ns-3.36/src/wifi/model/he/rr-multi-user-scheduler.cc
--- ns-3.35/src/wifi/model/he/rr-multi-user-scheduler.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/he/rr-multi-user-scheduler.cc	2022-04-30 18:23:58.206735100 -0700
@@ -91,7 +91,6 @@
 }
 
 RrMultiUserScheduler::RrMultiUserScheduler ()
-  : m_ulTriggerType (TriggerFrameType::BASIC_TRIGGER)
 {
   NS_LOG_FUNCTION (this);
 }
@@ -123,7 +122,6 @@
   NS_LOG_FUNCTION (this);
   m_staList.clear ();
   m_candidates.clear ();
-  m_trigger = nullptr;
   m_txParams.Clear ();
   m_apMac->TraceDisconnectWithoutContext ("AssociatedSta",
                                           MakeCallback (&RrMultiUserScheduler::NotifyStationAssociated, this));
@@ -150,7 +148,7 @@
     }
 
   if (m_enableUlOfdma && (GetLastTxFormat () == DL_MU_TX
-                          || m_ulTriggerType == TriggerFrameType::BSRP_TRIGGER))
+                          || m_trigger.GetType () == TriggerFrameType::BSRP_TRIGGER))
     {
       TxFormat txFormat = TrySendingBasicTf ();
 
@@ -168,28 +166,28 @@
 {
   NS_LOG_FUNCTION (this);
 
-  CtrlTriggerHeader trigger (TriggerFrameType::BSRP_TRIGGER, GetDlMuInfo ().txParams.m_txVector);
+  m_trigger = CtrlTriggerHeader (TriggerFrameType::BSRP_TRIGGER, GetDlMuInfo ().txParams.m_txVector);
 
   WifiTxVector txVector = GetDlMuInfo ().txParams.m_txVector;
-  txVector.SetGuardInterval (trigger.GetGuardInterval ());
+  txVector.SetGuardInterval (m_trigger.GetGuardInterval ());
 
   Ptr<Packet> packet = Create<Packet> ();
-  packet->AddHeader (trigger);
+  packet->AddHeader (m_trigger);
 
   Mac48Address receiver = Mac48Address::GetBroadcast ();
-  if (trigger.GetNUserInfoFields () == 1)
+  if (m_trigger.GetNUserInfoFields () == 1)
     {
-      NS_ASSERT (m_apMac->GetStaList ().find (trigger.begin ()->GetAid12 ()) != m_apMac->GetStaList ().end ());
-      receiver = m_apMac->GetStaList ().at (trigger.begin ()->GetAid12 ());
+      NS_ASSERT (m_apMac->GetStaList ().find (m_trigger.begin ()->GetAid12 ()) != m_apMac->GetStaList ().end ());
+      receiver = m_apMac->GetStaList ().at (m_trigger.begin ()->GetAid12 ());
     }
 
-  WifiMacHeader hdr (WIFI_MAC_CTL_TRIGGER);
-  hdr.SetAddr1 (receiver);
-  hdr.SetAddr2 (m_apMac->GetAddress ());
-  hdr.SetDsNotTo ();
-  hdr.SetDsNotFrom ();
+  m_triggerMacHdr = WifiMacHeader (WIFI_MAC_CTL_TRIGGER);
+  m_triggerMacHdr.SetAddr1 (receiver);
+  m_triggerMacHdr.SetAddr2 (m_apMac->GetAddress ());
+  m_triggerMacHdr.SetDsNotTo ();
+  m_triggerMacHdr.SetDsNotFrom ();
 
-  Ptr<WifiMacQueueItem> item = Create<WifiMacQueueItem> (packet, hdr);
+  Ptr<WifiMacQueueItem> item = Create<WifiMacQueueItem> (packet, m_triggerMacHdr);
 
   m_txParams.Clear ();
   // set the TXVECTOR used to send the Trigger Frame
@@ -206,7 +204,7 @@
 
   // Compute the time taken by each station to transmit 8 QoS Null frames
   Time qosNullTxDuration = Seconds (0);
-  for (const auto& userInfo : trigger)
+  for (const auto& userInfo : m_trigger)
     {
       Time duration = WifiPhy::CalculateTxDuration (m_sizeOf8QosNull, txVector,
                                                     m_apMac->GetWifiPhy ()->GetPhyBand (),
@@ -232,18 +230,12 @@
         }
     }
 
+  uint16_t ulLength;
+  std::tie (ulLength, qosNullTxDuration) = HePhy::ConvertHeTbPpduDurationToLSigLength (qosNullTxDuration,
+                                                                                       m_trigger.GetHeTbTxVector (m_trigger.begin ()->GetAid12 ()),
+                                                                                       m_apMac->GetWifiPhy ()->GetPhyBand ());
   NS_LOG_DEBUG ("Duration of QoS Null frames: " << qosNullTxDuration.As (Time::MS));
-  trigger.SetUlLength (HePhy::ConvertHeTbPpduDurationToLSigLength (qosNullTxDuration,
-                                                                    m_apMac->GetWifiPhy ()->GetPhyBand ()));
-  trigger.SetCsRequired (true);
-  m_heFem->SetTargetRssi (trigger);
-
-  packet = Create<Packet> ();
-  packet->AddHeader (trigger);
-  m_trigger = Create<WifiMacQueueItem> (packet, hdr);
-
-  m_ulTriggerType = TriggerFrameType::BSRP_TRIGGER;
-  m_tbPpduDuration = qosNullTxDuration;
+  m_trigger.SetUlLength (ulLength);
 
   return UL_MU_TX;
 }
@@ -327,18 +319,15 @@
         }
       else
         {
-          CtrlTriggerHeader trigger;
-          GetUlMuInfo ().trigger->GetPacket ()->PeekHeader (trigger);
-
-          txVector.SetChannelWidth (trigger.GetUlBandwidth ());
-          txVector.SetGuardInterval (trigger.GetGuardInterval ());
+          txVector.SetChannelWidth (GetUlMuInfo ().trigger.GetUlBandwidth ());
+          txVector.SetGuardInterval (GetUlMuInfo ().trigger.GetGuardInterval ());
 
           for (std::size_t i = 0; i < count + nCentral26TonesRus; i++)
             {
               NS_ASSERT (candidateIt != ulCandidates.end ());
               uint16_t staId = candidateIt->second.first->aid;
-              auto userInfoIt = trigger.FindUserInfoWithAid (staId);
-              NS_ASSERT (userInfoIt != trigger.end ());
+              auto userInfoIt = GetUlMuInfo ().trigger.FindUserInfoWithAid (staId);
+              NS_ASSERT (userInfoIt != GetUlMuInfo ().trigger.end ());
               // AssignRuIndices will be called below to set RuSpec
               txVector.SetHeMuUserInfo (staId,
                                         {{(i < count ? ruType : HeRu::RU_26_TONE), 1, false},
@@ -353,9 +342,9 @@
       ulCandidates.erase (candidateIt, ulCandidates.end ());
       AssignRuIndices (txVector);
 
-      CtrlTriggerHeader trigger (TriggerFrameType::BASIC_TRIGGER, txVector);
+      m_trigger = CtrlTriggerHeader (TriggerFrameType::BASIC_TRIGGER, txVector);
       Ptr<Packet> packet = Create<Packet> ();
-      packet->AddHeader (trigger);
+      packet->AddHeader (m_trigger);
 
       Mac48Address receiver = Mac48Address::GetBroadcast ();
       if (ulCandidates.size () == 1)
@@ -363,13 +352,13 @@
           receiver = ulCandidates.begin ()->second.first->address;
         }
 
-      WifiMacHeader hdr (WIFI_MAC_CTL_TRIGGER);
-      hdr.SetAddr1 (receiver);
-      hdr.SetAddr2 (m_apMac->GetAddress ());
-      hdr.SetDsNotTo ();
-      hdr.SetDsNotFrom ();
+      m_triggerMacHdr = WifiMacHeader (WIFI_MAC_CTL_TRIGGER);
+      m_triggerMacHdr.SetAddr1 (receiver);
+      m_triggerMacHdr.SetAddr2 (m_apMac->GetAddress ());
+      m_triggerMacHdr.SetDsNotTo ();
+      m_triggerMacHdr.SetDsNotFrom ();
 
-      Ptr<WifiMacQueueItem> item = Create<WifiMacQueueItem> (packet, hdr);
+      Ptr<WifiMacQueueItem> item = Create<WifiMacQueueItem> (packet, m_triggerMacHdr);
 
       // compute the maximum amount of time that can be granted to stations.
       // This value is limited by the max PPDU duration
@@ -409,7 +398,7 @@
 
       // Compute the time taken by each station to transmit a frame of maxBufferSize size
       Time bufferTxTime = Seconds (0);
-      for (const auto& userInfo : trigger)
+      for (const auto& userInfo : m_trigger)
         {
           Time duration = WifiPhy::CalculateTxDuration (maxBufferSize, txVector,
                                                         m_apMac->GetWifiPhy ()->GetPhyBand (),
@@ -427,7 +416,7 @@
           // maxDuration may be a too short time. If it does not allow any station to
           // transmit at least m_ulPsduSize bytes, give up the UL MU transmission for now
           Time minDuration = Seconds (0);
-          for (const auto& userInfo : trigger)
+          for (const auto& userInfo : m_trigger)
             {
               Time duration = WifiPhy::CalculateTxDuration (m_ulPsduSize, txVector,
                                                             m_apMac->GetWifiPhy ()->GetPhyBand (),
@@ -446,24 +435,18 @@
         }
 
       // maxDuration is the time to grant to the stations. Finalize the Trigger Frame
+      uint16_t ulLength;
+      std::tie (ulLength, maxDuration) = HePhy::ConvertHeTbPpduDurationToLSigLength (maxDuration,
+                                                                                     txVector,
+                                                                                     m_apMac->GetWifiPhy ()->GetPhyBand ());
       NS_LOG_DEBUG ("TB PPDU duration: " << maxDuration.As (Time::MS));
-      trigger.SetUlLength (HePhy::ConvertHeTbPpduDurationToLSigLength (maxDuration,
-                                                                       m_apMac->GetWifiPhy ()->GetPhyBand ()));
-      trigger.SetCsRequired (true);
-      m_heFem->SetTargetRssi (trigger);
+      m_trigger.SetUlLength (ulLength);
       // set Preferred AC to the AC that gained channel access
-      for (auto& userInfo : trigger)
+      for (auto& userInfo : m_trigger)
         {
           userInfo.SetBasicTriggerDepUserInfo (0, 0, m_edca->GetAccessCategory ());
         }
 
-      packet = Create<Packet> ();
-      packet->AddHeader (trigger);
-      m_trigger = Create<WifiMacQueueItem> (packet, hdr);
-
-      m_ulTriggerType = TriggerFrameType::BASIC_TRIGGER;
-      m_tbPpduDuration = maxDuration;
-
       return UL_MU_TX;
     }
   return DL_MU_TX;
@@ -708,8 +691,7 @@
       mpdu = candidate.second;
       NS_ASSERT (mpdu != nullptr);
 
-      bool ret = m_heFem->TryAddMpdu (mpdu, dlMuInfo.txParams, actualAvailableTime);
-      NS_UNUSED (ret);
+      [[maybe_unused]] bool ret = m_heFem->TryAddMpdu (mpdu, dlMuInfo.txParams, actualAvailableTime);
       NS_ASSERT_MSG (ret, "Weird that an MPDU does not meet constraints when "
                           "transmitted over a larger RU");
     }
@@ -728,26 +710,24 @@
       NS_ASSERT (receiver == candidate.first->address);
 
       NS_ASSERT (mpdu->IsQueued ());
-      WifiMacQueueItem::ConstIterator queueIt = mpdu->GetQueueIterator ();
-      Ptr<WifiMacQueueItem> item = *queueIt;
-      queueIt++;
+      Ptr<WifiMacQueueItem> item = mpdu->GetItem ();
 
       if (!mpdu->GetHeader ().IsRetry ())
         {
           // this MPDU must have been dequeued from the AC queue and we can try
           // A-MSDU aggregation
-          item = m_heFem->GetMsduAggregator ()->GetNextAmsdu (mpdu, dlMuInfo.txParams, m_availableTime, queueIt);
+          item = m_heFem->GetMsduAggregator ()->GetNextAmsdu (mpdu, dlMuInfo.txParams, m_availableTime);
 
           if (item == nullptr)
             {
               // A-MSDU aggregation failed or disabled
-              item = *mpdu->GetQueueIterator ();
+              item = mpdu->GetItem ();
             }
           m_apMac->GetQosTxop (QosUtilsMapTidToAc (tid))->AssignSequenceNumber (item);
         }
 
       // Now, let's try A-MPDU aggregation if possible
-      std::vector<Ptr<WifiMacQueueItem>> mpduList = m_heFem->GetMpduAggregator ()->GetNextAmpdu (item, dlMuInfo.txParams, m_availableTime, queueIt);
+      std::vector<Ptr<WifiMacQueueItem>> mpduList = m_heFem->GetMpduAggregator ()->GetNextAmpdu (item, dlMuInfo.txParams, m_availableTime);
 
       if (mpduList.size () > 1)
         {
@@ -852,7 +832,7 @@
 MultiUserScheduler::UlMuInfo
 RrMultiUserScheduler::ComputeUlMuInfo (void)
 {
-  return UlMuInfo {m_trigger, m_tbPpduDuration, std::move (m_txParams)};
+  return UlMuInfo {m_trigger, m_triggerMacHdr, std::move (m_txParams)};
 }
 
 } //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/he/rr-multi-user-scheduler.h ns-3.36/src/wifi/model/he/rr-multi-user-scheduler.h
--- ns-3.35/src/wifi/model/he/rr-multi-user-scheduler.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/he/rr-multi-user-scheduler.h	2022-04-30 18:23:58.206735100 -0700
@@ -134,10 +134,9 @@
   std::map<AcIndex, std::list<MasterInfo>> m_staList;   //!< Per-AC list of stations (next to serve first)
   std::list<CandidateInfo> m_candidates;                //!< Candidate stations for MU TX
   Time m_maxCredits;                                    //!< Max amount of credits a station can have
-  Ptr<WifiMacQueueItem> m_trigger;                      //!< Trigger Frame to send
-  Time m_tbPpduDuration;                                //!< Duration of the solicited TB PPDUs
+  CtrlTriggerHeader m_trigger;                          //!< Trigger Frame to send
+  WifiMacHeader m_triggerMacHdr;                        //!< MAC header for Trigger Frame
   WifiTxParameters m_txParams;                          //!< TX parameters
-  TriggerFrameType m_ulTriggerType;                     //!< Trigger Frame type for UL MU
 };
 
 } //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/ht/ht-frame-exchange-manager.cc ns-3.36/src/wifi/model/ht/ht-frame-exchange-manager.cc
--- ns-3.35/src/wifi/model/ht/ht-frame-exchange-manager.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/ht/ht-frame-exchange-manager.cc	2022-04-30 18:23:58.206735100 -0700
@@ -75,7 +75,7 @@
 }
 
 void
-HtFrameExchangeManager::SetWifiMac (const Ptr<RegularWifiMac> mac)
+HtFrameExchangeManager::SetWifiMac (const Ptr<WifiMac> mac)
 {
   m_msduAggregator->SetWifiMac (mac);
   m_mpduAggregator->SetWifiMac (mac);
@@ -185,7 +185,12 @@
   txParams.m_acknowledgment = GetAckManager ()->TryAddMpdu (mpdu, txParams);
 
   // Push the MPDU to the front of the queue and transmit it
-  m_mac->GetQosTxop (tid)->GetWifiMacQueue ()->PushFront (mpdu);
+  auto queue = m_mac->GetQosTxop (tid)->GetWifiMacQueue ();
+  if (!queue->PushFront (mpdu))
+    {
+      NS_LOG_DEBUG ("Queue is full, replace the oldest frame with the ADDBA Request frame");
+      queue->Replace (queue->Peek (), mpdu);
+    }
   SendMpduWithProtection (mpdu, txParams);
 }
 
@@ -219,7 +224,7 @@
     }
   respHdr.SetTid (reqHdr->GetTid ());
 
-  respHdr.SetBufferSize (GetSupportedBaBufferSize () - 1);
+  respHdr.SetBufferSize (GetSupportedBaBufferSize ());
   respHdr.SetTimeout (reqHdr->GetTimeout ());
 
   WifiActionHeader actionHdr;
@@ -288,9 +293,9 @@
 {
   NS_LOG_FUNCTION (this << *respHdr << originator << startingSeq);
   uint8_t tid = respHdr->GetTid ();
-  
+
   RecipientBlockAckAgreement agreement (originator, respHdr->IsAmsduSupported (), tid,
-                                        respHdr->GetBufferSize () + 1, respHdr->GetTimeout (),
+                                        respHdr->GetBufferSize (), respHdr->GetTimeout (),
                                         startingSeq,
                                         m_mac->GetWifiRemoteStationManager ()->GetHtSupported ()
                                         && m_mac->GetWifiRemoteStationManager ()->GetHtSupported (originator));
@@ -313,7 +318,6 @@
     }
 
   m_agreements.insert ({{originator, tid}, agreement});
-  GetBaManager (tid)->SetBlockAckInactivityCallback (MakeCallback (&HtFrameExchangeManager::SendDelbaFrame, this));
 }
 
 void
@@ -431,7 +435,7 @@
 
   // we can transmit the BlockAckReq frame
   Ptr<const WifiMacQueueItem> mpdu = edca->GetBaManager ()->GetBar ();
-  SendPsduWithProtection (Create<WifiPsdu> (mpdu, false), txParams);
+  SendPsduWithProtection (GetWifiPsdu (Copy (mpdu), txParams.m_txVector), txParams);
   return true;
 }
 
@@ -447,8 +451,7 @@
   Ptr<QosTxop> edca = m_mac->GetQosTxop (peekedItem->GetHeader ().GetQosTid ());
   WifiTxParameters txParams;
   txParams.m_txVector = m_mac->GetWifiRemoteStationManager ()->GetDataTxVector (peekedItem->GetHeader ());
-  WifiMacQueueItem::ConstIterator queueIt;
-  Ptr<WifiMacQueueItem> mpdu = edca->GetNextMpdu (peekedItem, txParams, availableTime, initialFrame, queueIt);
+  Ptr<WifiMacQueueItem> mpdu = edca->GetNextMpdu (peekedItem, txParams, availableTime, initialFrame);
 
   if (mpdu == nullptr)
     {
@@ -458,7 +461,7 @@
 
   // try A-MPDU aggregation
   std::vector<Ptr<WifiMacQueueItem>> mpduList = m_mpduAggregator->GetNextAmpdu (mpdu, txParams,
-                                                                                availableTime, queueIt);
+                                                                                availableTime);
   NS_ASSERT (txParams.m_acknowledgment);
 
   if (mpduList.size () > 1)
@@ -650,7 +653,7 @@
 }
 
 void
-HtFrameExchangeManager::RetransmitMpduAfterMissedCts (Ptr<WifiMacQueueItem> mpdu) const
+HtFrameExchangeManager::ReleaseSequenceNumber (Ptr<WifiMacQueueItem> mpdu) const
 {
   NS_LOG_FUNCTION (this << *mpdu);
 
@@ -679,7 +682,7 @@
           return;
         }
     }
-  QosFrameExchangeManager::RetransmitMpduAfterMissedCts (mpdu);
+  QosFrameExchangeManager::ReleaseSequenceNumber (mpdu);
 }
 
 Time
@@ -765,32 +768,8 @@
       return;
     }
 
-  NS_ASSERT (m_psdu->GetNMpdus () > 1);
-  m_mac->GetWifiRemoteStationManager ()->ReportRtsFailed (m_psdu->GetHeader (0));
-
-  if (!m_mac->GetWifiRemoteStationManager ()->NeedRetransmission (*m_psdu->begin ()))
-    {
-      NS_LOG_DEBUG ("Missed CTS, discard MPDUs");
-      m_mac->GetWifiRemoteStationManager ()->ReportFinalRtsFailed (m_psdu->GetHeader (0));
-      // Dequeue the MPDUs if they are stored in a queue
-      DequeuePsdu (m_psdu);
-      for (const auto& mpdu : *PeekPointer (m_psdu))
-        {
-          NotifyPacketDiscarded (mpdu);
-        }
-      m_edca->ResetCw ();
-    }
-  else
-    {
-      NS_LOG_DEBUG ("Missed CTS, retransmit MPDUs");
-      for (const auto& mpdu : *PeekPointer (m_psdu))
-        {
-          RetransmitMpduAfterMissedCts (mpdu);
-        }
-      m_edca->UpdateFailedCw ();
-    }
-  m_psdu = 0;
-  TransmissionFailed ();
+  DoCtsTimeout (m_psdu);
+  m_psdu = nullptr;
 }
 
 void
@@ -942,7 +921,7 @@
 {
   NS_ASSERT (mpdu != 0);
   NS_LOG_FUNCTION (this << *mpdu << &txParams << ppduDurationLimit);
-  
+
   Mac48Address receiver = mpdu->GetHeader ().GetAddr1 ();
   uint32_t ampduSize = txParams.GetSizeIfAddMpdu (mpdu);
 
@@ -1362,7 +1341,7 @@
           mpdu->GetPacket ()->PeekHeader (blockAckReq);
           NS_ABORT_MSG_IF (blockAckReq.IsMultiTid (), "Multi-TID BlockAckReq not supported");
           uint8_t tid = blockAckReq.GetTidInfo ();
-          
+
           auto agreementIt = m_agreements.find ({sender, tid});
 
           if (agreementIt == m_agreements.end ())
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/ht/ht-frame-exchange-manager.h ns-3.36/src/wifi/model/ht/ht-frame-exchange-manager.h
--- ns-3.35/src/wifi/model/ht/ht-frame-exchange-manager.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/ht/ht-frame-exchange-manager.h	2022-04-30 18:23:58.206735100 -0700
@@ -60,7 +60,7 @@
   virtual ~HtFrameExchangeManager ();
 
   bool StartFrameExchange (Ptr<QosTxop> edca, Time availableTime, bool initialFrame) override;
-  void SetWifiMac (const Ptr<RegularWifiMac> mac) override;
+  void SetWifiMac (const Ptr<WifiMac> mac) override;
   void CalculateAcknowledgmentTime (WifiAcknowledgment* acknowledgment) const override;
 
   /**
@@ -145,7 +145,7 @@
    * \param startingSeq Sequence number of the first MPDU of all
    *        packets for which block ack was negotiated.
    *
-   * This function is typically invoked only by ns3::RegularWifiMac
+   * This function is typically invoked only by ns3::WifiMac
    * when the STA (which may be non-AP in ESS, or in an IBSS) has
    * received an ADDBA Request frame and is transmitting an ADDBA
    * Response frame. At this point the frame exchange manager must
@@ -198,6 +198,16 @@
    */
   BlockAckType GetBlockAckType (Mac48Address originator, uint8_t tid) const;
 
+  /**
+   * Sends DELBA frame to cancel a block ack agreement with STA
+   * addressed by <i>addr</i> for TID <i>tid</i>.
+   *
+   * \param addr address of the recipient.
+   * \param tid traffic ID.
+   * \param byOriginator flag to indicate whether this is set by the originator.
+   */
+  void SendDelbaFrame (Mac48Address addr, uint8_t tid, bool byOriginator);
+
 protected:
   void DoDispose () override;
 
@@ -208,7 +218,7 @@
   void NotifyReceivedNormalAck (Ptr<WifiMacQueueItem> mpdu) override;
   void NotifyPacketDiscarded (Ptr<const WifiMacQueueItem> mpdu) override;
   void RetransmitMpduAfterMissedAck (Ptr<WifiMacQueueItem> mpdu) const override;
-  void RetransmitMpduAfterMissedCts (Ptr<WifiMacQueueItem> mpdu) const override;
+  void ReleaseSequenceNumber (Ptr<WifiMacQueueItem> mpdu) const override;
   void ForwardMpduDown (Ptr<WifiMacQueueItem> mpdu, WifiTxVector& txVector) override;
   void CtsTimeout (Ptr<WifiMacQueueItem> rts, const WifiTxVector& txVector) override;
   void TransmissionSucceeded (void) override;
@@ -335,16 +345,6 @@
                          uint16_t timeout, bool immediateBAck);
 
   /**
-   * Sends DELBA frame to cancel a block ack agreement with STA
-   * addressed by <i>addr</i> for TID <i>tid</i>.
-   *
-   * \param addr address of the recipient.
-   * \param tid traffic ID.
-   * \param byOriginator flag to indicate whether this is set by the originator.
-   */
-  void SendDelbaFrame (Mac48Address addr, uint8_t tid, bool byOriginator);
-
-  /**
    * Create a BlockAck frame with header equal to <i>blockAck</i> and start its transmission.
    *
    * \param agreement the agreement the Block Ack response belongs to
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/ht/ht-phy.cc ns-3.36/src/wifi/model/ht/ht-phy.cc
--- ns-3.35/src/wifi/model/ht/ht-phy.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/ht/ht-phy.cc	2022-04-30 18:23:58.206735100 -0700
@@ -549,14 +549,13 @@
   return WifiModeFactory::CreateWifiMcs ("HtMcs" + std::to_string (index),
                                          index,
                                          WIFI_MOD_CLASS_HT,
+                                         false,
                                          MakeBoundCallback (&GetHtCodeRate, index),
                                          MakeBoundCallback (&GetHtConstellationSize, index),
-                                         MakeBoundCallback (&GetPhyRate, index),
                                          MakeCallback (&GetPhyRateFromTxVector),
-                                         MakeBoundCallback (&GetDataRate, index),
                                          MakeCallback (&GetDataRateFromTxVector),
                                          MakeBoundCallback (&GetNonHtReferenceRate, index),
-                                         MakeCallback (&IsModeAllowed));
+                                         MakeCallback (&IsAllowed));
 }
 
 WifiCodeRate
@@ -763,7 +762,7 @@
 }
 
 bool
-HtPhy::IsModeAllowed (uint16_t /* channelWidth */, uint8_t /* nss */)
+HtPhy::IsAllowed (const WifiTxVector& /*txVector*/)
 {
   return true;
 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/ht/ht-phy.h ns-3.36/src/wifi/model/ht/ht-phy.h
--- ns-3.35/src/wifi/model/ht/ht-phy.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/ht/ht-phy.h	2022-04-30 18:23:58.206735100 -0700
@@ -437,15 +437,13 @@
    */
   static uint64_t GetNonHtReferenceRate (uint8_t mcsValue);
   /**
-   * Check whether the combination of <MCS, channel width, NSS> is allowed.
-   * This function is used as a callback for WifiMode operation, and always
-   * returns true since there is no limitation for any MCS in HtPhy.
+   * Check whether the combination in TXVECTOR is allowed.
+   * This function is used as a callback for WifiMode operation.
    *
-   * \param channelWidth the considered channel width in MHz
-   * \param nss the considered number of streams
-   * \returns true.
+   * \param txVector the TXVECTOR
+   * \returns true if this combination is allowed, false otherwise.
    */
-  static bool IsModeAllowed (uint16_t channelWidth, uint8_t nss);
+  static bool IsAllowed (const WifiTxVector& txVector);
 
 protected:
   PhyFieldRxStatus DoEndReceiveField (WifiPpduField field, Ptr<Event> event) override;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/ht/ht-ppdu.cc ns-3.36/src/wifi/model/ht/ht-ppdu.cc
--- ns-3.35/src/wifi/model/ht/ht-ppdu.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/ht/ht-ppdu.cc	2022-04-30 18:23:58.206735100 -0700
@@ -174,7 +174,7 @@
 bool
 HtPpdu::HtSigHeader::GetAggregation (void) const
 {
-  return m_aggregation ? true : false;
+  return m_aggregation;
 }
 
 void
@@ -186,7 +186,7 @@
 bool
 HtPpdu::HtSigHeader::GetShortGuardInterval (void) const
 {
-  return m_sgi ? true : false;
+  return m_sgi;
 }
 
 void
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/interference-helper.cc ns-3.36/src/wifi/model/interference-helper.cc
--- ns-3.35/src/wifi/model/interference-helper.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/interference-helper.cc	2022-04-30 18:23:58.206735100 -0700
@@ -422,8 +422,8 @@
 {
   NS_LOG_FUNCTION (this << channelWidth << band.first << band.second << staId << window.first << window.second);
   double psr = 1.0; /* Packet Success Rate */
-  auto niIt = nis->find (band)->second;
-  auto j = niIt.begin ();
+  const auto& niIt = nis->find (band)->second;
+  auto j = niIt.cbegin ();
   Time previous = j->first;
   WifiMode payloadMode = event->GetTxVector ().GetMode (staId);
   Time phyPayloadStart = j->first;
@@ -435,7 +435,7 @@
   Time windowEnd = phyPayloadStart + window.second;
   double noiseInterferenceW = m_firstPowerPerBand.find (band)->second;
   double powerW = event->GetRxPowerW (band);
-  while (++j != niIt.end ())
+  while (++j != niIt.cend ())
     {
       Time current = j->first;
       NS_LOG_DEBUG ("previous= " << previous << ", current=" << current);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/mgt-headers.cc ns-3.36/src/wifi/model/mgt-headers.cc
--- ns-3.35/src/wifi/model/mgt-headers.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/mgt-headers.cc	2022-04-30 18:23:58.206735100 -0700
@@ -1581,7 +1581,7 @@
 bool
 MgtAddBaRequestHeader::IsImmediateBlockAck (void) const
 {
-  return (m_policy == 1) ? true : false;
+  return m_policy == 1;
 }
 
 uint16_t
@@ -1599,7 +1599,7 @@
 bool
 MgtAddBaRequestHeader::IsAmsduSupported (void) const
 {
-  return (m_amsduSupport == 1) ? true : false;
+  return m_amsduSupport == 1;
 }
 
 uint16_t
@@ -1761,7 +1761,7 @@
 bool
 MgtAddBaResponseHeader::IsImmediateBlockAck (void) const
 {
-  return (m_policy == 1) ? true : false;
+  return m_policy == 1;
 }
 
 uint16_t
@@ -1779,7 +1779,7 @@
 bool
 MgtAddBaResponseHeader::IsAmsduSupported (void) const
 {
-  return (m_amsduSupport == 1) ? true : false;
+  return m_amsduSupport == 1;
 }
 
 uint16_t
@@ -1865,7 +1865,7 @@
 bool
 MgtDelBaHeader::IsByOriginator (void) const
 {
-  return (m_initiator == 1) ? true : false;
+  return m_initiator == 1;
 }
 
 uint8_t
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/mpdu-aggregator.cc ns-3.36/src/wifi/model/mpdu-aggregator.cc
--- ns-3.35/src/wifi/model/mpdu-aggregator.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/mpdu-aggregator.cc	2022-04-30 18:23:58.210735000 -0700
@@ -33,7 +33,8 @@
 #include "ns3/ht-capabilities.h"
 #include "ns3/vht-capabilities.h"
 #include "ns3/he-capabilities.h"
-#include "regular-wifi-mac.h"
+#include "wifi-mac.h"
+#include "qos-txop.h"
 #include "ctrl-headers.h"
 #include "wifi-mac-trailer.h"
 #include "wifi-tx-parameters.h"
@@ -71,7 +72,7 @@
 }
 
 void
-MpduAggregator::SetWifiMac (const Ptr<RegularWifiMac> mac)
+MpduAggregator::SetWifiMac (const Ptr<WifiMac> mac)
 {
   NS_LOG_FUNCTION (this << mac);
   m_mac = mac;
@@ -192,7 +193,7 @@
 
 std::vector<Ptr<WifiMacQueueItem>>
 MpduAggregator::GetNextAmpdu (Ptr<WifiMacQueueItem> mpdu, WifiTxParameters& txParams,
-                              Time availableTime, WifiMacQueueItem::ConstIterator queueIt) const
+                              Time availableTime) const
 {
   NS_LOG_FUNCTION (this << *mpdu << &txParams << availableTime);
 
@@ -222,10 +223,10 @@
           mpduList.push_back (nextMpdu);
 
           // If allowed by the BA agreement, get the next MPDU
+          Ptr<const WifiMacQueueItem> peekedMpdu;
+          peekedMpdu = qosTxop->PeekNextMpdu (tid, recipient, nextMpdu);
           nextMpdu = 0;
 
-          Ptr<const WifiMacQueueItem> peekedMpdu;
-          peekedMpdu = qosTxop->PeekNextMpdu (queueIt, tid, recipient);
           if (peekedMpdu != 0)
             {
               // PeekNextMpdu() does not return an MPDU that is beyond the transmit window
@@ -237,7 +238,7 @@
               // and duration limit are met. Note that the returned MPDU differs from
               // the peeked MPDU if A-MSDU aggregation is enabled.
               NS_LOG_DEBUG ("Trying to aggregate another MPDU");
-              nextMpdu = qosTxop->GetNextMpdu (peekedMpdu, txParams, availableTime, false, queueIt);
+              nextMpdu = qosTxop->GetNextMpdu (peekedMpdu, txParams, availableTime, false);
             }
         }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/mpdu-aggregator.h ns-3.36/src/wifi/model/mpdu-aggregator.h
--- ns-3.35/src/wifi/model/mpdu-aggregator.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/mpdu-aggregator.h	2022-04-30 18:23:58.210735000 -0700
@@ -23,7 +23,7 @@
 
 #include "ns3/object.h"
 #include "wifi-mode.h"
-#include "qos-txop.h"
+#include "wifi-mac-queue-item.h"
 #include "ns3/nstime.h"
 #include <vector>
 
@@ -31,9 +31,9 @@
 
 class AmpduSubframeHeader;
 class WifiTxVector;
+class QosTxop;
 class Packet;
-class WifiMacQueueItem;
-class RegularWifiMac;
+class WifiMac;
 class WifiTxParameters;
 
 /**
@@ -118,21 +118,18 @@
    * \param mpdu the given MPDU.
    * \param txParams the TX parameters used to transmit the frame
    * \param availableTime the time available for the frame exchange
-   * \param queueIt the QueueIteratorPair pointing to the queue item from which the
-   *                search for an MPDU starts, if the QueueIteratorPair is valid
    * \return the resulting A-MPDU, if aggregation is possible.
    */
   std::vector<Ptr<WifiMacQueueItem>> GetNextAmpdu (Ptr<WifiMacQueueItem> mpdu,
                                                    WifiTxParameters& txParams,
-                                                   Time availableTime,
-                                                   WifiMacQueueItem::ConstIterator queueIt) const;
+                                                   Time availableTime) const;
 
   /**
    * Set the MAC layer to use.
    *
    * \param mac the MAC layer to use
    */
-  void SetWifiMac (const Ptr<RegularWifiMac> mac);
+  void SetWifiMac (const Ptr<WifiMac> mac);
 
   /**
    * \param ampduSize the size of the A-MPDU that needs to be padded in bytes
@@ -158,7 +155,7 @@
   void DoDispose () override;
 
 private:
-  Ptr<RegularWifiMac> m_mac;   //!< the MAC of this station
+  Ptr<WifiMac> m_mac;   //!< the MAC of this station
 };
 
 }  //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/msdu-aggregator.cc ns-3.36/src/wifi/model/msdu-aggregator.cc
--- ns-3.35/src/wifi/model/msdu-aggregator.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/msdu-aggregator.cc	2022-04-30 18:23:58.210735000 -0700
@@ -25,7 +25,7 @@
 #include "qos-txop.h"
 #include "wifi-remote-station-manager.h"
 #include "ns3/ht-capabilities.h"
-#include "regular-wifi-mac.h"
+#include "wifi-mac.h"
 #include "wifi-mac-queue.h"
 #include "wifi-mac-trailer.h"
 #include "ns3/ht-frame-exchange-manager.h"
@@ -66,7 +66,7 @@
 }
 
 void
-MsduAggregator::SetWifiMac (const Ptr<RegularWifiMac> mac)
+MsduAggregator::SetWifiMac (const Ptr<WifiMac> mac)
 {
   NS_LOG_FUNCTION (this << mac);
   m_mac = mac;
@@ -84,13 +84,11 @@
 
 Ptr<WifiMacQueueItem>
 MsduAggregator::GetNextAmsdu (Ptr<const WifiMacQueueItem> peekedItem, WifiTxParameters& txParams,
-                              Time availableTime, WifiMacQueueItem::ConstIterator& queueIt) const
+                              Time availableTime) const
 {
   NS_LOG_FUNCTION (this << *peekedItem << &txParams << availableTime);
 
   Ptr<WifiMacQueue> queue = m_mac->GetTxopQueue (peekedItem->GetQueueAc ());
-  auto it = peekedItem->GetQueueIterator ();
-  NS_ASSERT ((*it)->GetPacket () == peekedItem->GetPacket ());
 
   uint8_t tid = peekedItem->GetHeader ().GetQosTid ();
   Mac48Address recipient = peekedItem->GetHeader ().GetAddr1 ();
@@ -119,27 +117,23 @@
       return nullptr;
     }
 
-  Ptr<WifiMacQueueItem> amsdu = *it;  // amsdu points to the peeked MPDU, but it's non-const
+  Ptr<WifiMacQueueItem> amsdu = peekedItem->GetItem ();  // amsdu points to the peeked MPDU, but it's non-const
   uint8_t nMsdu = 1;
+  peekedItem = queue->PeekByTidAndAddress (tid, recipient, peekedItem);
 
-  it++;
-
-  while ((it = queue->PeekByTidAndAddress (tid, recipient, it)) != queue->end ()
-         && m_htFem->TryAggregateMsdu (*it, txParams, availableTime))
+  while (peekedItem != nullptr
+         && m_htFem->TryAggregateMsdu (peekedItem, txParams, availableTime))
     {
-      // dequeue the MSDU being aggregated and advance the current iterator
-      // before it is invalidated
-      Ptr<WifiMacQueueItem> msdu = *it++;
+      // find the next MPDU before dequeuing the current one
+      Ptr<const WifiMacQueueItem> msdu = peekedItem;
+      peekedItem = queue->PeekByTidAndAddress (tid, recipient, peekedItem);
       queue->DequeueIfQueued (msdu);
 
-      auto pos = std::next (amsdu->GetQueueIterator ());
-      queue->DequeueIfQueued (amsdu);
-
-      amsdu->Aggregate (msdu);
-      bool ret = queue->Insert (pos, amsdu);
-      // The size of a WifiMacQueue is measured as number of packets. We dequeued
-      // two packets, so there is certainly room for inserting one packet
-      NS_ABORT_IF (!ret);
+      // perform A-MSDU aggregation
+      queue->Transform (amsdu, [&msdu](Ptr<WifiMacQueueItem> amsdu)
+                               {
+                                 amsdu->Aggregate (msdu);
+                               });
 
       nMsdu++;
     }
@@ -151,8 +145,6 @@
     }
 
   // Aggregation succeeded
-  queueIt = it;
-
   return amsdu;
 }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/msdu-aggregator.h ns-3.36/src/wifi/model/msdu-aggregator.h
--- ns-3.35/src/wifi/model/msdu-aggregator.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/msdu-aggregator.h	2022-04-30 18:23:58.210735000 -0700
@@ -33,7 +33,7 @@
 class Packet;
 class QosTxop;
 class WifiTxVector;
-class RegularWifiMac;
+class WifiMac;
 class HtFrameExchangeManager;
 class WifiTxParameters;
 
@@ -96,13 +96,10 @@
    * \param peekedItem the MSDU which we attempt to aggregate other MSDUs to
    * \param txParams the TX parameters for the current frame
    * \param availableTime the time available for the frame exchange
-   * \param[out] queueIt a queue iterator pointing to the queue item following the
-   *                     last item used to prepare the returned A-MSDU, if any; otherwise,
-   *                     its value is unchanged
    * \return the resulting A-MSDU, if aggregation is possible, a null pointer otherwise.
    */
   Ptr<WifiMacQueueItem> GetNextAmsdu (Ptr<const WifiMacQueueItem> peekedItem, WifiTxParameters& txParams,
-                                      Time availableTime, WifiMacQueueItem::ConstIterator& queueIt) const;
+                                      Time availableTime) const;
 
   /**
    * Determine the maximum size for an A-MSDU of the given TID that can be sent
@@ -128,7 +125,7 @@
    *
    * \param mac the MAC layer to use
    */
-  void SetWifiMac (const Ptr<RegularWifiMac> mac);
+  void SetWifiMac (const Ptr<WifiMac> mac);
 
   /**
    * Calculate how much padding must be added to the end of an A-MSDU of the
@@ -145,7 +142,7 @@
   void DoDispose () override;
 
 private:
-  Ptr<RegularWifiMac> m_mac;            //!< the MAC of this station
+  Ptr<WifiMac> m_mac;                   //!< the MAC of this station
   Ptr<HtFrameExchangeManager> m_htFem;  //!< the HT Frame Exchange Manager of this station
 };
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/non-ht/dsss-phy.cc ns-3.36/src/wifi/model/non-ht/dsss-phy.cc
--- ns-3.35/src/wifi/model/non-ht/dsss-phy.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/non-ht/dsss-phy.cc	2022-04-30 18:23:58.210735000 -0700
@@ -306,11 +306,9 @@
                                           true,
                                           MakeBoundCallback (&GetCodeRate, uniqueName),
                                           MakeBoundCallback (&GetConstellationSize, uniqueName),
-                                          MakeBoundCallback (&GetDataRate, uniqueName, modClass), //PhyRate is equivalent to DataRate
                                           MakeCallback (&GetDataRateFromTxVector), //PhyRate is equivalent to DataRate
-                                          MakeBoundCallback (&GetDataRate, uniqueName, modClass),
                                           MakeCallback (&GetDataRateFromTxVector),
-                                          MakeCallback (&IsModeAllowed));
+                                          MakeCallback (&IsAllowed));
 }
 
 WifiCodeRate
@@ -330,12 +328,11 @@
 {
   WifiMode mode = txVector.GetMode ();
   return DsssPhy::GetDataRate (mode.GetUniqueName (),
-                               mode.GetModulationClass (),
-                               22, 0, 1); //dummy values since unused
+                               mode.GetModulationClass ());
 }
 
 uint64_t
-DsssPhy::GetDataRate (const std::string& name, WifiModulationClass modClass, uint16_t /* channelWidth */, uint16_t /* guardInterval */, uint8_t /* nss */)
+DsssPhy::GetDataRate (const std::string& name, WifiModulationClass modClass)
 {
   uint16_t constellationSize = GetConstellationSize (name);
   uint16_t divisor = 0;
@@ -357,7 +354,7 @@
 }
 
 bool
-DsssPhy::IsModeAllowed (uint16_t /* channelWidth */, uint8_t /* nss */)
+DsssPhy::IsAllowed (const WifiTxVector& /*txVector*/)
 {
   return true;
 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/non-ht/dsss-phy.h ns-3.36/src/wifi/model/non-ht/dsss-phy.h
--- ns-3.35/src/wifi/model/non-ht/dsss-phy.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/non-ht/dsss-phy.h	2022-04-30 18:23:58.210735000 -0700
@@ -136,23 +136,18 @@
    *
    * \param name the unique name of the DSSS or HR/DSSS mode
    * \param modClass the modulation class, must be either WIFI_MOD_CLASS_DSSS or WIFI_MOD_CLASS_HR_DSSS
-   * \param channelWidth the considered channel width in MHz
-   * \param guardInterval the considered guard interval duration in nanoseconds
-   * \param nss the considered number of streams
    *
    * \return the data bit rate of this signal in bps.
    */
-  static uint64_t GetDataRate (const std::string& name, WifiModulationClass modClass, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss);
+  static uint64_t GetDataRate (const std::string& name, WifiModulationClass modClass);
   /**
-   * Check whether the combination of <WifiMode, channel width, NSS> is allowed.
-   * This function is used as a callback for WifiMode operation, and always
-   * returns true since there is no limitation for any mode in DsssPhy.
+   * Check whether the combination in TXVECTOR is allowed.
+   * This function is used as a callback for WifiMode operation.
    *
-   * \param channelWidth the considered channel width in MHz
-   * \param nss the considered number of streams
-   * \returns true.
+   * \param txVector the TXVECTOR
+   * \returns true if this combination is allowed, false otherwise.
    */
-  static bool IsModeAllowed (uint16_t channelWidth, uint8_t nss);
+  static bool IsAllowed (const WifiTxVector& txVector);
 
 private:
   PhyFieldRxStatus DoEndReceiveField (WifiPpduField field, Ptr<Event> event) override;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/non-ht/erp-ofdm-phy.cc ns-3.36/src/wifi/model/non-ht/erp-ofdm-phy.cc
--- ns-3.35/src/wifi/model/non-ht/erp-ofdm-phy.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/non-ht/erp-ofdm-phy.cc	2022-04-30 18:23:58.210735000 -0700
@@ -176,11 +176,9 @@
                                           isMandatory,
                                           MakeBoundCallback (&GetCodeRate, uniqueName),
                                           MakeBoundCallback (&GetConstellationSize, uniqueName),
-                                          MakeBoundCallback (&GetPhyRate, uniqueName),
                                           MakeCallback (&GetPhyRateFromTxVector),
-                                          MakeBoundCallback (&GetDataRate, uniqueName),
                                           MakeCallback (&GetDataRateFromTxVector),
-                                          MakeCallback (&IsModeAllowed));
+                                          MakeCallback (&IsAllowed));
 }
 
 WifiCodeRate
@@ -196,11 +194,11 @@
 }
 
 uint64_t
-ErpOfdmPhy::GetPhyRate (const std::string& name, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss)
+ErpOfdmPhy::GetPhyRate (const std::string& name, uint16_t channelWidth)
 {
   WifiCodeRate codeRate = GetCodeRate (name);
   uint16_t constellationSize = GetConstellationSize (name);
-  uint64_t dataRate = OfdmPhy::CalculateDataRate (codeRate, constellationSize, channelWidth, guardInterval, nss);
+  uint64_t dataRate = OfdmPhy::CalculateDataRate (codeRate, constellationSize, channelWidth);
   return OfdmPhy::CalculatePhyRate (codeRate, dataRate);
 }
 
@@ -208,30 +206,26 @@
 ErpOfdmPhy::GetPhyRateFromTxVector (const WifiTxVector& txVector, uint16_t /* staId */)
 {
   return GetPhyRate (txVector.GetMode ().GetUniqueName (),
-                     txVector.GetChannelWidth (),
-                     txVector.GetGuardInterval (),
-                     txVector.GetNss ());
+                     txVector.GetChannelWidth ());
 }
 
 uint64_t
 ErpOfdmPhy::GetDataRateFromTxVector (const WifiTxVector& txVector, uint16_t /* staId */)
 {
   return GetDataRate (txVector.GetMode ().GetUniqueName (),
-                      txVector.GetChannelWidth (),
-                      txVector.GetGuardInterval (),
-                      txVector.GetNss ());
+                      txVector.GetChannelWidth ());
 }
 
 uint64_t
-ErpOfdmPhy::GetDataRate (const std::string& name, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss)
+ErpOfdmPhy::GetDataRate (const std::string& name, uint16_t channelWidth)
 {
   WifiCodeRate codeRate = GetCodeRate (name);
   uint16_t constellationSize = GetConstellationSize (name);
-  return OfdmPhy::CalculateDataRate (codeRate, constellationSize, channelWidth, guardInterval, nss);
+  return OfdmPhy::CalculateDataRate (codeRate, constellationSize, channelWidth);
 }
 
 bool
-ErpOfdmPhy::IsModeAllowed (uint16_t /* channelWidth */, uint8_t /* nss */)
+ErpOfdmPhy::IsAllowed (const WifiTxVector& /*txVector*/)
 {
   return true;
 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/non-ht/erp-ofdm-phy.h ns-3.36/src/wifi/model/non-ht/erp-ofdm-phy.h
--- ns-3.35/src/wifi/model/non-ht/erp-ofdm-phy.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/non-ht/erp-ofdm-phy.h	2022-04-30 18:23:58.210735000 -0700
@@ -144,12 +144,10 @@
    *
    * \param name the unique name of the ERP-OFDM mode
    * \param channelWidth the considered channel width in MHz
-   * \param guardInterval the considered guard interval duration in nanoseconds
-   * \param nss the considered number of streams
    *
    * \return the physical bit rate of this signal in bps.
    */
-  static uint64_t GetPhyRate (const std::string& name, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss);
+  static uint64_t GetPhyRate (const std::string& name, uint16_t channelWidth);
   /**
    * Return the PHY rate corresponding to
    * the supplied TXVECTOR.
@@ -179,22 +177,18 @@
    *
    * \param name the unique name of the ERP-OFDM mode
    * \param channelWidth the considered channel width in MHz
-   * \param guardInterval the considered guard interval duration in nanoseconds
-   * \param nss the considered number of streams
    *
    * \return the data bit rate of this signal in bps.
    */
-  static uint64_t GetDataRate (const std::string& name, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss);
+  static uint64_t GetDataRate (const std::string& name, uint16_t channelWidth);
   /**
-   * Check whether the combination of <WifiMode, channel width, NSS> is allowed.
-   * This function is used as a callback for WifiMode operation, and always
-   * returns true since there is no limitation for any mode in ErpOfdmPhy.
+   * Check whether the combination in TXVECTOR is allowed.
+   * This function is used as a callback for WifiMode operation.
    *
-   * \param channelWidth the considered channel width in MHz
-   * \param nss the considered number of streams
-   * \returns true.
+   * \param txVector the TXVECTOR
+   * \returns true if this combination is allowed, false otherwise.
    */
-  static bool IsModeAllowed (uint16_t channelWidth, uint8_t nss);
+  static bool IsAllowed (const WifiTxVector& txVector);
 
 private:
   WifiMode GetHeaderMode (const WifiTxVector& txVector) const override;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/non-ht/ofdm-phy.cc ns-3.36/src/wifi/model/non-ht/ofdm-phy.cc
--- ns-3.35/src/wifi/model/non-ht/ofdm-phy.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/non-ht/ofdm-phy.cc	2022-04-30 18:23:58.210735000 -0700
@@ -492,11 +492,9 @@
                                           isMandatory,
                                           MakeBoundCallback (&GetCodeRate, uniqueName),
                                           MakeBoundCallback (&GetConstellationSize, uniqueName),
-                                          MakeBoundCallback (&GetPhyRate, uniqueName),
                                           MakeCallback (&GetPhyRateFromTxVector),
-                                          MakeBoundCallback (&GetDataRate, uniqueName),
                                           MakeCallback (&GetDataRateFromTxVector),
-                                          MakeCallback (&IsModeAllowed));
+                                          MakeCallback (&IsAllowed));
 }
 
 WifiCodeRate
@@ -512,10 +510,10 @@
 }
 
 uint64_t
-OfdmPhy::GetPhyRate (const std::string& name, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss)
+OfdmPhy::GetPhyRate (const std::string& name, uint16_t channelWidth)
 {
   WifiCodeRate codeRate = GetCodeRate (name);
-  uint64_t dataRate = GetDataRate (name, channelWidth, guardInterval, nss);
+  uint64_t dataRate = GetDataRate (name, channelWidth);
   return CalculatePhyRate (codeRate, dataRate);
 }
 
@@ -529,9 +527,7 @@
 OfdmPhy::GetPhyRateFromTxVector (const WifiTxVector& txVector, uint16_t /* staId */)
 {
   return GetPhyRate (txVector.GetMode ().GetUniqueName (),
-                     txVector.GetChannelWidth (),
-                     txVector.GetGuardInterval (),
-                     txVector.GetNss ());
+                     txVector.GetChannelWidth ());
 }
 
 double
@@ -556,21 +552,19 @@
 OfdmPhy::GetDataRateFromTxVector (const WifiTxVector& txVector, uint16_t /* staId */)
 {
   return GetDataRate (txVector.GetMode ().GetUniqueName (),
-                      txVector.GetChannelWidth (),
-                      txVector.GetGuardInterval (),
-                      txVector.GetNss ());
+                      txVector.GetChannelWidth ());
 }
 
 uint64_t
-OfdmPhy::GetDataRate (const std::string& name, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss)
+OfdmPhy::GetDataRate (const std::string& name, uint16_t channelWidth)
 {
   WifiCodeRate codeRate = GetCodeRate (name);
   uint16_t constellationSize = GetConstellationSize (name);
-  return CalculateDataRate (codeRate, constellationSize, channelWidth, guardInterval, nss);
+  return CalculateDataRate (codeRate, constellationSize, channelWidth);
 }
 
 uint64_t
-OfdmPhy::CalculateDataRate (WifiCodeRate codeRate, uint16_t constellationSize, uint16_t channelWidth, uint16_t /* guardInterval */, uint8_t /* nss */)
+OfdmPhy::CalculateDataRate (WifiCodeRate codeRate, uint16_t constellationSize, uint16_t channelWidth)
 {
   double symbolDuration = 3.2; //in us
   uint16_t guardInterval = 800; //in ns
@@ -599,7 +593,7 @@
 }
 
 bool
-OfdmPhy::IsModeAllowed (uint16_t /* channelWidth */, uint8_t /* nss */)
+OfdmPhy::IsAllowed (const WifiTxVector& /*txVector*/)
 {
   return true;
 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/non-ht/ofdm-phy.h ns-3.36/src/wifi/model/non-ht/ofdm-phy.h
--- ns-3.35/src/wifi/model/non-ht/ofdm-phy.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/non-ht/ofdm-phy.h	2022-04-30 18:23:58.210735000 -0700
@@ -265,12 +265,10 @@
    *
    * \param name the unique name of the OFDM mode
    * \param channelWidth the considered channel width in MHz
-   * \param guardInterval the considered guard interval duration in nanoseconds
-   * \param nss the considered number of streams
    *
    * \return the physical bit rate of this signal in bps.
    */
-  static uint64_t GetPhyRate (const std::string& name, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss);
+  static uint64_t GetPhyRate (const std::string& name, uint16_t channelWidth);
 
   /**
    * Return the PHY rate corresponding to
@@ -301,22 +299,18 @@
    *
    * \param name the unique name of the OFDM mode
    * \param channelWidth the considered channel width in MHz
-   * \param guardInterval the considered guard interval duration in nanoseconds
-   * \param nss the considered number of streams
    *
    * \return the data bit rate of this signal in bps.
    */
-  static uint64_t GetDataRate (const std::string& name, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss);
+  static uint64_t GetDataRate (const std::string& name, uint16_t channelWidth);
   /**
-   * Check whether the combination of <WifiMode, channel width, NSS> is allowed.
-   * This function is used as a callback for WifiMode operation, and always
-   * returns true since there is no limitation for any mode in OfdmPhy.
+   * Check whether the combination in TXVECTOR is allowed.
+   * This function is used as a callback for WifiMode operation.
    *
-   * \param channelWidth the considered channel width in MHz
-   * \param nss the considered number of streams
-   * \returns true.
+   * \param txVector the TXVECTOR
+   * \returns true if this combination is allowed, false otherwise.
    */
-  static bool IsModeAllowed (uint16_t channelWidth, uint8_t nss);
+  static bool IsAllowed (const WifiTxVector& txVector);
 
 protected:
   PhyFieldRxStatus DoEndReceiveField (WifiPpduField field, Ptr<Event> event) override;
@@ -399,13 +393,10 @@
    * \param codeRate the code rate of the mode
    * \param constellationSize the size of modulation constellation
    * \param channelWidth the considered channel width in MHz
-   * \param guardInterval the considered guard interval duration in nanoseconds
-   * \param nss the considered number of streams
    *
    * \return the data bit rate of this signal in bps.
    */
-  static uint64_t CalculateDataRate (WifiCodeRate codeRate, uint16_t constellationSize, uint16_t channelWidth,
-                                     uint16_t guardInterval, uint8_t nss);
+  static uint64_t CalculateDataRate (WifiCodeRate codeRate, uint16_t constellationSize, uint16_t channelWidth);
   /**
    * Calculates data rate from the supplied parameters.
    *
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/originator-block-ack-agreement.cc ns-3.36/src/wifi/model/originator-block-ack-agreement.cc
--- ns-3.35/src/wifi/model/originator-block-ack-agreement.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/originator-block-ack-agreement.cc	2022-04-30 18:23:58.210735000 -0700
@@ -47,31 +47,31 @@
 bool
 OriginatorBlockAckAgreement::IsPending (void) const
 {
-  return (m_state == PENDING) ? true : false;
+  return m_state == PENDING;
 }
 
 bool
 OriginatorBlockAckAgreement::IsEstablished (void) const
 {
-  return (m_state == ESTABLISHED) ? true : false;
+  return m_state == ESTABLISHED;
 }
 
 bool
 OriginatorBlockAckAgreement::IsRejected (void) const
 {
-  return (m_state == REJECTED) ? true : false;
+  return m_state == REJECTED;
 }
 
 bool
 OriginatorBlockAckAgreement::IsNoReply (void) const
 {
-  return (m_state == NO_REPLY) ? true : false;
+  return m_state == NO_REPLY;
 }
 
 bool
 OriginatorBlockAckAgreement::IsReset (void) const
 {
-  return (m_state == RESET) ? true : false;
+  return m_state == RESET;
 }
 
 uint16_t
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/phy-entity.cc ns-3.36/src/wifi/model/phy-entity.cc
--- ns-3.35/src/wifi/model/phy-entity.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/phy-entity.cc	2022-04-30 18:23:58.210735000 -0700
@@ -385,6 +385,7 @@
         {
           m_wifiPhy->SwitchMaybeToCcaBusy (m_wifiPhy->GetMeasurementChannelWidth (nullptr));
         }
+      DropPreambleEvent (ppdu, WifiPhyRxfailureReason::POWERED_OFF, endRx, m_wifiPhy->GetMeasurementChannelWidth (ppdu));
       return;
     }
 
@@ -395,6 +396,7 @@
         {
           m_wifiPhy->SwitchMaybeToCcaBusy (GetMeasurementChannelWidth (ppdu));
         }
+      DropPreambleEvent (ppdu, WifiPhyRxfailureReason::TRUNCATED_TX, endRx, m_wifiPhy->GetMeasurementChannelWidth (ppdu));
       return;
     }
 
@@ -921,6 +923,11 @@
       endRxPayloadEvent.Cancel ();
     }
   m_endRxPayloadEvents.clear ();
+  for (auto & endMpduEvent : m_endOfMpduEvents)
+    {
+      endMpduEvent.Cancel ();
+    }
+  m_endOfMpduEvents.clear ();
 }
 
 bool
@@ -1031,6 +1038,12 @@
 }
 
 void
+PhyEntity::NotifyPayloadBegin (const WifiTxVector& txVector, const Time& payloadDuration)
+{
+  m_wifiPhy->m_phyRxPayloadBeginTrace (txVector, payloadDuration);
+}
+
+void
 PhyEntity::StartTx (Ptr<WifiPpdu> ppdu)
 {
   NS_LOG_FUNCTION (this << ppdu);
@@ -1048,6 +1061,7 @@
   txParams->duration = txDuration;
   txParams->psd = txPowerSpectrum;
   txParams->ppdu = ppdu;
+  txParams->txCenterFreq = GetCenterFrequencyForChannelWidth (ppdu->GetTxVector ());
   NS_LOG_DEBUG ("Starting " << type << " with power " << WToDbm (txPowerWatts) << " dBm on channel " << +m_wifiPhy->GetChannelNumber () << " for " << txParams->duration.As (Time::MS));
   NS_LOG_DEBUG ("Starting " << type << " with integrated spectrum power " << WToDbm (Integral (*txPowerSpectrum)) << " dBm; spectrum model Uid: " << txPowerSpectrum->GetSpectrumModel ()->GetUid ());
   auto spectrumWifiPhy = DynamicCast<SpectrumWifiPhy> (m_wifiPhy);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/phy-entity.h ns-3.36/src/wifi/model/phy-entity.h
--- ns-3.35/src/wifi/model/phy-entity.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/phy-entity.h	2022-04-30 18:23:58.210735000 -0700
@@ -763,6 +763,14 @@
   uint16_t GetCenterFrequencyForChannelWidth (const WifiTxVector& txVector) const;
 
   /**
+   * Fire the trace indicating that the PHY is starting to receive the payload of a PPDU.
+   *
+   * \param txVector the TXVECTOR used to transmit the PPDU
+   * \param payloadDuration the TX duration of the PPDU payload
+   */
+  void NotifyPayloadBegin (const WifiTxVector& txVector, const Time& payloadDuration);
+
+  /**
    * \param currentChannelWidth channel width of the current transmission (MHz)
    * \return the width of the guard band (MHz)
    *
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/qos-frame-exchange-manager.cc ns-3.36/src/wifi/model/qos-frame-exchange-manager.cc
--- ns-3.35/src/wifi/model/qos-frame-exchange-manager.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/qos-frame-exchange-manager.cc	2022-04-30 18:23:58.210735000 -0700
@@ -277,8 +277,7 @@
   WifiTxParameters txParams;
   txParams.m_txVector = m_mac->GetWifiRemoteStationManager ()->GetDataTxVector (mpdu->GetHeader ());
 
-  WifiMacQueueItem::ConstIterator queueIt;
-  Ptr<WifiMacQueueItem> item = edca->GetNextMpdu (mpdu, txParams, availableTime, initialFrame, queueIt);
+  Ptr<WifiMacQueueItem> item = edca->GetNextMpdu (mpdu, txParams, availableTime, initialFrame);
 
   if (item == nullptr)
     {
@@ -456,13 +455,15 @@
       return FrameExchangeManager::GetFrameDurationId (header, size, txParams, fragmentedPacket);
     }
 
+  NS_ASSERT (txParams.m_acknowledgment && txParams.m_acknowledgment->acknowledgmentTime != Time::Min ());
+
   // under multiple protection settings, if the TXOP limit is not null, Duration/ID
   // is set to cover the remaining TXOP time (Sec. 9.2.5.2 of 802.11-2016).
   // The TXOP holder may exceed the TXOP limit in some situations (Sec. 10.22.2.8
   // of 802.11-2016)
   return std::max (m_edca->GetRemainingTxop ()
                    - m_phy->CalculateTxDuration (size, txParams.m_txVector, m_phy->GetPhyBand ()),
-                   Seconds (0));
+                   txParams.m_acknowledgment->acknowledgmentTime);
 }
 
 Time
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/qos-txop.cc ns-3.36/src/wifi/model/qos-txop.cc
--- ns-3.35/src/wifi/model/qos-txop.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/qos-txop.cc	2022-04-30 18:23:58.210735000 -0700
@@ -308,7 +308,7 @@
   // TODO Add a WifiMacQueue method that serves this purpose; IsEmpty () can
   // then reuse such method.
   m_queue->IsEmpty ();
-  bool queueIsNotEmpty = (m_queue->PeekFirstAvailable (m_qosBlockedDestinations) != m_queue->end ());
+  bool queueIsNotEmpty = (m_queue->PeekFirstAvailable (m_qosBlockedDestinations) != nullptr);
 
   bool ret = (baManagerHasPackets || queueIsNotEmpty);
   NS_LOG_FUNCTION (this << baManagerHasPackets << queueIsNotEmpty);
@@ -354,61 +354,61 @@
 }
 
 Ptr<const WifiMacQueueItem>
-QosTxop::PeekNextMpdu (uint8_t tid, Mac48Address recipient)
+QosTxop::PeekNextMpdu (uint8_t tid, Mac48Address recipient, Ptr<const WifiMacQueueItem> item)
 {
-  return PeekNextMpdu (WifiMacQueue::EMPTY, tid, recipient);
-}
-
-Ptr<const WifiMacQueueItem>
-QosTxop::PeekNextMpdu (WifiMacQueueItem::ConstIterator queueIt, uint8_t tid, Mac48Address recipient)
-{
-  NS_LOG_FUNCTION (this << +tid << recipient);
+  NS_LOG_FUNCTION (this << +tid << recipient << item);
 
   // lambda to peek the next frame
-  auto peek = [this, &tid, &recipient, &queueIt] () -> WifiMacQueue::ConstIterator
+  auto peek = [this, &tid, &recipient, &item] () -> Ptr<const WifiMacQueueItem>
     {
       if (tid == 8 && recipient.IsBroadcast ())  // undefined TID and recipient
         {
-          return m_queue->PeekFirstAvailable (m_qosBlockedDestinations, queueIt);
+          return m_queue->PeekFirstAvailable (m_qosBlockedDestinations, item);
         }
       if (m_qosBlockedDestinations->IsBlocked (recipient, tid))
         {
-          return m_queue->end ();
+          return nullptr;
         }
-      return m_queue->PeekByTidAndAddress (tid, recipient, queueIt);
+      return m_queue->PeekByTidAndAddress (tid, recipient, item);
     };
 
-  queueIt = peek ();
+  item = peek ();
   // remove old packets (must be retransmissions or in flight, otherwise they did
   // not get a sequence number assigned)
-  while (queueIt != m_queue->end () && !(*queueIt)->IsFragment ())
+  while (item != nullptr && !item->IsFragment ())
     {
-      if (((*queueIt)->GetHeader ().IsRetry () || (*queueIt)->IsInFlight ())
-          && IsQosOldPacket (*queueIt))
+      if ((item->GetHeader ().IsRetry () || item->IsInFlight ())
+          && IsQosOldPacket (item))
         {
-          NS_LOG_DEBUG ("Removing an old packet from EDCA queue: " << **queueIt);
+          NS_LOG_DEBUG ("Removing an old packet from EDCA queue: " << *item);
           if (!m_droppedMpduCallback.IsNull ())
             {
-              m_droppedMpduCallback (WIFI_MAC_DROP_QOS_OLD_PACKET, *queueIt);
+              m_droppedMpduCallback (WIFI_MAC_DROP_QOS_OLD_PACKET, item);
             }
-          queueIt = m_queue->Remove (queueIt);
-          queueIt = peek ();
+          auto oldItem = item;
+          item = peek ();
+          m_queue->Remove (oldItem);
+        }
+      else if (item->IsInFlight ())
+        {
+          NS_LOG_DEBUG ("Skipping in flight MPDU: " << *item);
+          item = peek ();
         }
-      else if ((*queueIt)->IsInFlight ())
+      else if (item->GetHeader ().HasData ()
+               && !m_mac->CanForwardPacketsTo (item->GetHeader ().GetAddr1 ()))
         {
-          NS_LOG_DEBUG ("Skipping in flight MPDU: " << **queueIt);
-          ++queueIt;
-          queueIt = peek ();
+          NS_LOG_DEBUG ("Skipping frame that cannot be forwarded: " << *item);
+          item = peek ();
         }
       else
         {
           break;
         }
     }
-  if (queueIt != m_queue->end ())
+  if (item != nullptr)
     {
-      NS_ASSERT (!(*queueIt)->IsInFlight ());
-      WifiMacHeader& hdr = (*queueIt)->GetHeader ();
+      NS_ASSERT (!item->IsInFlight ());
+      WifiMacHeader& hdr = item->GetItem ()->GetHeader ();
 
       // peek the next sequence number and check if it is within the transmit window
       // in case of QoS data frame
@@ -423,25 +423,25 @@
               && !IsInWindow (sequence, GetBaStartingSequence (recipient, tid), GetBaBufferSize (recipient, tid)))
             {
               NS_LOG_DEBUG ("Packet beyond the end of the current transmit window");
-              return 0;
+              return nullptr;
             }
         }
 
       // Assign a sequence number if this is not a fragment nor a retransmission
-      if (!(*queueIt)->IsFragment () && !hdr.IsRetry ())
+      if (!item->IsFragment () && !hdr.IsRetry ())
         {
           hdr.SetSequenceNumber (sequence);
         }
-      NS_LOG_DEBUG ("Packet peeked from EDCA queue: " << **queueIt);
-      return *queueIt;
+      NS_LOG_DEBUG ("Packet peeked from EDCA queue: " << *item);
+      return item;
     }
 
-  return 0;
+  return nullptr;
 }
 
 Ptr<WifiMacQueueItem>
 QosTxop::GetNextMpdu (Ptr<const WifiMacQueueItem> peekedItem, WifiTxParameters& txParams,
-                      Time availableTime, bool initialFrame, WifiMacQueueItem::ConstIterator& queueIt)
+                      Time availableTime, bool initialFrame)
 {
   NS_ASSERT (peekedItem != 0);
   NS_ASSERT (m_qosFem != 0);
@@ -461,9 +461,6 @@
     }
 
   NS_ASSERT (peekedItem->IsQueued ());
-  WifiMacQueueItem::ConstIterator peekedIt = peekedItem->GetQueueIterator ();
-  NS_ASSERT ((*peekedIt)->GetPacket () == peekedItem->GetPacket ());
-  NS_ASSERT ((*peekedIt)->GetQueueAc () == m_ac);
   Ptr<WifiMacQueueItem> mpdu;
 
   // If it is a non-broadcast QoS Data frame and it is not a retransmission nor a fragment,
@@ -486,7 +483,7 @@
           && !peekedItem->IsInFlight ())
         {
           Ptr<HtFrameExchangeManager> htFem = StaticCast<HtFrameExchangeManager> (m_qosFem);
-          mpdu = htFem->GetMsduAggregator ()->GetNextAmsdu (peekedItem, txParams, availableTime, peekedIt);
+          mpdu = htFem->GetMsduAggregator ()->GetNextAmsdu (peekedItem, txParams, availableTime);
         }
 
       if (mpdu != 0)
@@ -498,14 +495,12 @@
 
   if (mpdu == 0)
     {
-      mpdu = *peekedIt;
-      peekedIt++;
+      mpdu = peekedItem->GetItem ();
     }
 
   // Assign a sequence number if this is not a fragment nor a retransmission
   AssignSequenceNumber (mpdu);
   NS_LOG_DEBUG ("Got MPDU from EDCA queue: " << *mpdu);
-  queueIt = peekedIt;
 
   return mpdu;
 }
@@ -608,10 +603,10 @@
       // Add BA Response is received. In this case, the starting sequence number
       // shall be set equal to the sequence number of such packet.
       uint16_t startingSeq = m_txMiddle->GetNextSeqNumberByTidAndAddress (tid, recipient);
-      WifiMacQueue::ConstIterator peekedIt = m_queue->PeekByTidAndAddress (tid, recipient);
-      if (peekedIt != m_queue->end () && (*peekedIt)->GetHeader ().IsRetry ())
+      auto peekedItem = m_queue->PeekByTidAndAddress (tid, recipient);
+      if (peekedItem != nullptr && peekedItem->GetHeader ().IsRetry ())
         {
-          startingSeq = (*peekedIt)->GetHeader ().GetSequenceNumber ();
+          startingSeq = peekedItem->GetHeader ().GetSequenceNumber ();
         }
       m_baManager->UpdateAgreement (respHdr, recipient, startingSeq);
     }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/qos-txop.h ns-3.36/src/wifi/model/qos-txop.h
--- ns-3.35/src/wifi/model/qos-txop.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/qos-txop.h	2022-04-30 18:23:58.210735000 -0700
@@ -303,38 +303,22 @@
    */
   uint16_t PeekNextSequenceNumberFor (const WifiMacHeader *hdr);
   /**
-   * Peek the next frame to transmit to the given receiver and of the given
-   * TID from the block ack manager retransmit queue first and, if not found, from
-   * the EDCA queue. If <i>tid</i> is equal to 8 (invalid value) and <i>recipient</i>
-   * is the broadcast address, the first available frame is returned.
-   * Note that A-MSDU aggregation is never attempted (this is relevant if the
-   * frame is peeked from the EDCA queue). If the frame is peeked from the EDCA
-   * queue, it is assigned a sequence number peeked from MacTxMiddle.
+   * Peek the next frame to transmit to the given receiver and of the given TID
+   * from the EDCA queue. If <i>tid</i> is equal to 8 (invalid value) and <i>recipient</i>
+   * is the broadcast address, the first available frame is returned. If <i>item</i>
+   * is not a null pointer, the search starts from the packet following <i>item</i>
+   * in the queue; otherwise, the search starts from the head of the queue.
+   * Note that A-MSDU aggregation is never attempted. If the frame has never been
+   * transmitted, it is assigned a sequence number peeked from MacTxMiddle.
    *
    * \param tid traffic ID.
    * \param recipient the receiver station address.
+   * \param item the item after which the search starts from
    * \returns the peeked frame.
    */
   Ptr<const WifiMacQueueItem> PeekNextMpdu (uint8_t tid = 8,
-                                            Mac48Address recipient = Mac48Address::GetBroadcast ());
-  /**
-   * Peek the next frame to transmit to the given receiver and of the given
-   * TID from the block ack manager retransmit queue first and, if not found, from
-   * the EDCA queue. If <i>tid</i> is equal to 8 (invalid value) and <i>recipient</i>
-   * is the broadcast address, the first available frame is returned.
-   * Note that A-MSDU aggregation is never attempted (this is relevant if the
-   * frame is peeked from the EDCA queue). If the frame is peeked from the EDCA
-   * queue, it is assigned a sequence number peeked from MacTxMiddle.
-   *
-   * \param queueIt the QueueIteratorPair pointing to the queue item from which the
-   *                search for an MPDU starts, if the QueueIteratorPair is valid
-   * \param tid traffic ID.
-   * \param recipient the receiver station address.
-   * \returns the peeked frame.
-   */
-  Ptr<const WifiMacQueueItem> PeekNextMpdu (WifiMacQueueItem::ConstIterator queueIt,
-                                            uint8_t tid = 8,
-                                            Mac48Address recipient = Mac48Address::GetBroadcast ());
+                                            Mac48Address recipient = Mac48Address::GetBroadcast (),
+                                            Ptr<const WifiMacQueueItem> item = nullptr);
   /**
    * Prepare the frame to transmit starting from the MPDU that has been previously
    * peeked by calling PeekNextMpdu. A frame is only returned if it meets the
@@ -351,14 +335,10 @@
                           (including protection and acknowledgment); a value of
    *                      Time::Min() indicates no time constraint
    * \param initialFrame true if the frame is the initial PPDU of a TXOP
-   * \param[out] queueIt a queue iterator pointing to the queue item following the
-   *                     last item used to prepare the returned MPDU, if any; if no MPDU
-   *                     is returned, its value is unchanged
    * \return the frame to transmit or a null pointer if no frame meets the time constraints
    */
   Ptr<WifiMacQueueItem> GetNextMpdu (Ptr<const WifiMacQueueItem> peekedItem, WifiTxParameters& txParams,
-                                     Time availableTime, bool initialFrame,
-                                     WifiMacQueueItem::ConstIterator& queueIt);
+                                     Time availableTime, bool initialFrame);
 
   /**
    * Assign a sequence number to the given MPDU, if it is not a fragment
@@ -486,7 +466,6 @@
   uint8_t m_blockAckThreshold;                          /**< the block ack threshold (use BA mechanism if number of packets in queue reaches
                                                              this value. If this value is 0, block ack is never used. When A-MPDU is enabled,
                                                              block ack mechanism is used regardless of this value) */
-  Time m_currentPacketTimestamp;                        //!< the current packet timestamp
   uint16_t m_blockAckInactivityTimeout;                 //!< the BlockAck inactivity timeout value (in TUs, i.e. blocks of 1024 microseconds)
   Time m_startTxop;                                     //!< the start TXOP time
   Time m_txopDuration;                                  //!< the duration of a TXOP
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/rate-control/aarfcd-wifi-manager.cc ns-3.36/src/wifi/model/rate-control/aarfcd-wifi-manager.cc
--- ns-3.35/src/wifi/model/rate-control/aarfcd-wifi-manager.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/rate-control/aarfcd-wifi-manager.cc	2022-04-30 18:23:58.210735000 -0700
@@ -325,10 +325,11 @@
       channelWidth = 20;
     }
   WifiMode mode = GetSupported (station, station->m_rate);
-  if (m_currentRate != mode.GetDataRate (channelWidth))
+  uint64_t rate = mode.GetDataRate (channelWidth);
+  if (m_currentRate != rate)
     {
-      NS_LOG_DEBUG ("New datarate: " << mode.GetDataRate (channelWidth));
-      m_currentRate = mode.GetDataRate (channelWidth);
+      NS_LOG_DEBUG ("New datarate: " << rate);
+      m_currentRate = rate;
     }
   return WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled ()), 800, 1, 1, 0, channelWidth, GetAggregation (station));
 }
@@ -345,7 +346,6 @@
     {
       channelWidth = 20;
     }
-  WifiTxVector rtsTxVector;
   WifiMode mode;
   if (GetUseNonErpProtection () == false)
     {
@@ -355,8 +355,7 @@
     {
       mode = GetNonErpSupported (station, 0);
     }
-  rtsTxVector = WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled ()), 800, 1, 1, 0, channelWidth, GetAggregation (station));
-  return rtsTxVector;
+  return WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled ()), 800, 1, 1, 0, channelWidth, GetAggregation (station));
 }
 
 bool
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/rate-control/aarf-wifi-manager.cc ns-3.36/src/wifi/model/rate-control/aarf-wifi-manager.cc
--- ns-3.35/src/wifi/model/rate-control/aarf-wifi-manager.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/rate-control/aarf-wifi-manager.cc	2022-04-30 18:23:58.210735000 -0700
@@ -257,10 +257,11 @@
       channelWidth = 20;
     }
   WifiMode mode = GetSupported (station, station->m_rate);
-  if (m_currentRate != mode.GetDataRate (channelWidth))
+  uint64_t rate = mode.GetDataRate (channelWidth);
+  if (m_currentRate != rate)
     {
-      NS_LOG_DEBUG ("New datarate: " << mode.GetDataRate (channelWidth));
-      m_currentRate = mode.GetDataRate (channelWidth);
+      NS_LOG_DEBUG ("New datarate: " << rate);
+      m_currentRate = rate;
     }
   return WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled ()), 800, 1, 1, 0, channelWidth, GetAggregation (station));
 }
@@ -277,7 +278,6 @@
     {
       channelWidth = 20;
     }
-  WifiTxVector rtsTxVector;
   WifiMode mode;
   if (GetUseNonErpProtection () == false)
     {
@@ -287,8 +287,7 @@
     {
       mode = GetNonErpSupported (station, 0);
     }
-  rtsTxVector = WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled ()), 800, 1, 1, 0, channelWidth, GetAggregation (station));
-  return rtsTxVector;
+  return WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled ()), 800, 1, 1, 0, channelWidth, GetAggregation (station));
 }
 
 } //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/rate-control/amrr-wifi-manager.cc ns-3.36/src/wifi/model/rate-control/amrr-wifi-manager.cc
--- ns-3.35/src/wifi/model/rate-control/amrr-wifi-manager.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/rate-control/amrr-wifi-manager.cc	2022-04-30 18:23:58.210735000 -0700
@@ -369,10 +369,11 @@
       channelWidth = 20;
     }
   WifiMode mode = GetSupported (station, rateIndex);
-  if (m_currentRate != mode.GetDataRate (channelWidth))
+  uint64_t rate = mode.GetDataRate (channelWidth);
+  if (m_currentRate != rate)
     {
-      NS_LOG_DEBUG ("New datarate: " << mode.GetDataRate (channelWidth));
-      m_currentRate = mode.GetDataRate (channelWidth);
+      NS_LOG_DEBUG ("New datarate: " << rate);
+      m_currentRate = rate;
     }
   return WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled ()), 800, 1, 1, 0, channelWidth, GetAggregation (station));
 }
@@ -388,7 +389,6 @@
       channelWidth = 20;
     }
   UpdateMode (station);
-  WifiTxVector rtsTxVector;
   WifiMode mode;
   if (GetUseNonErpProtection () == false)
     {
@@ -398,8 +398,7 @@
     {
       mode = GetNonErpSupported (station, 0);
     }
-  rtsTxVector = WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled ()), 800, 1, 1, 0, channelWidth, GetAggregation (station));
-  return rtsTxVector;
+  return WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled ()), 800, 1, 1, 0, channelWidth, GetAggregation (station));
 }
 
 } //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/rate-control/aparf-wifi-manager.cc ns-3.36/src/wifi/model/rate-control/aparf-wifi-manager.cc
--- ns-3.35/src/wifi/model/rate-control/aparf-wifi-manager.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/rate-control/aparf-wifi-manager.cc	2022-04-30 18:23:58.210735000 -0700
@@ -376,7 +376,6 @@
     {
       channelWidth = 20;
     }
-  WifiTxVector rtsTxVector;
   WifiMode mode;
   if (GetUseNonErpProtection () == false)
     {
@@ -386,8 +385,7 @@
     {
       mode = GetNonErpSupported (station, 0);
     }
-  rtsTxVector = WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled ()), 800, 1, 1, 0, channelWidth, GetAggregation (station));
-  return rtsTxVector;
+  return WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled ()), 800, 1, 1, 0, channelWidth, GetAggregation (station));
 }
 
 } //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/rate-control/arf-wifi-manager.cc ns-3.36/src/wifi/model/rate-control/arf-wifi-manager.cc
--- ns-3.35/src/wifi/model/rate-control/arf-wifi-manager.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/rate-control/arf-wifi-manager.cc	2022-04-30 18:23:58.210735000 -0700
@@ -234,10 +234,11 @@
       channelWidth = 20;
     }
   WifiMode mode = GetSupported (station, station->m_rate);
-  if (m_currentRate != mode.GetDataRate (channelWidth))
+  uint64_t rate = mode.GetDataRate (channelWidth);
+  if (m_currentRate != rate)
     {
-      NS_LOG_DEBUG ("New datarate: " << mode.GetDataRate (channelWidth));
-      m_currentRate = mode.GetDataRate (channelWidth);
+      NS_LOG_DEBUG ("New datarate: " << rate);
+      m_currentRate = rate;
     }
   return WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled ()), 800, 1, 1, 0, channelWidth, GetAggregation (station));
 }
@@ -254,7 +255,6 @@
     {
       channelWidth = 20;
     }
-  WifiTxVector rtsTxVector;
   WifiMode mode;
   if (GetUseNonErpProtection () == false)
     {
@@ -264,8 +264,7 @@
     {
       mode = GetNonErpSupported (station, 0);
     }
-  rtsTxVector = WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled ()), 800, 1, 1, 0, channelWidth, GetAggregation (station));
-  return rtsTxVector;
+  return WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled ()), 800, 1, 1, 0, channelWidth, GetAggregation (station));
 }
 
 } //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/rate-control/cara-wifi-manager.cc ns-3.36/src/wifi/model/rate-control/cara-wifi-manager.cc
--- ns-3.35/src/wifi/model/rate-control/cara-wifi-manager.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/rate-control/cara-wifi-manager.cc	2022-04-30 18:23:58.210735000 -0700
@@ -207,10 +207,11 @@
       channelWidth = 20;
     }
   WifiMode mode = GetSupported (station, station->m_rate);
-  if (m_currentRate != mode.GetDataRate (channelWidth))
+  uint64_t rate = mode.GetDataRate (channelWidth);
+  if (m_currentRate != rate)
     {
-      NS_LOG_DEBUG ("New datarate: " << mode.GetDataRate (channelWidth));
-      m_currentRate = mode.GetDataRate (channelWidth);
+      NS_LOG_DEBUG ("New datarate: " << rate);
+      m_currentRate = rate;
     }
   return WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled ()), 800, 1, 1, 0, channelWidth, GetAggregation (station));
 }
@@ -227,7 +228,6 @@
     {
       channelWidth = 20;
     }
-  WifiTxVector rtsTxVector;
   WifiMode mode;
   if (GetUseNonErpProtection () == false)
     {
@@ -237,8 +237,7 @@
     {
       mode = GetNonErpSupported (station, 0);
     }
-  rtsTxVector = WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled ()), 800, 1, 1, 0, channelWidth, GetAggregation (station));
-  return rtsTxVector;
+  return WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled ()), 800, 1, 1, 0, channelWidth, GetAggregation (station));
 }
 
 bool
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/rate-control/ideal-wifi-manager.cc ns-3.36/src/wifi/model/rate-control/ideal-wifi-manager.cc
--- ns-3.35/src/wifi/model/rate-control/ideal-wifi-manager.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/rate-control/ideal-wifi-manager.cc	2022-04-30 18:23:58.210735000 -0700
@@ -525,12 +525,14 @@
     {
       guardInterval = 800;
     }
-  if (m_currentRate != maxMode.GetDataRate (channelWidth, guardInterval, selectedNss))
+  WifiTxVector bestTxVector {maxMode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (maxMode.GetModulationClass (), GetShortPreambleEnabled ()), guardInterval, GetNumberOfAntennas (), selectedNss, 0, GetChannelWidthForTransmission (maxMode, channelWidth), GetAggregation (station)};
+  uint64_t maxDataRate = maxMode.GetDataRate (bestTxVector);
+  if (m_currentRate != maxDataRate)
     {
-      NS_LOG_DEBUG ("New datarate: " << maxMode.GetDataRate (channelWidth, guardInterval, selectedNss));
-      m_currentRate = maxMode.GetDataRate (channelWidth, guardInterval, selectedNss);
+      NS_LOG_DEBUG ("New datarate: " << maxDataRate);
+      m_currentRate = maxDataRate;
     }
-  return WifiTxVector (maxMode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (maxMode.GetModulationClass (), GetShortPreambleEnabled ()), guardInterval, GetNumberOfAntennas (), selectedNss, 0, GetChannelWidthForTransmission (maxMode, channelWidth), GetAggregation (station));
+  return bestTxVector;
 }
 
 WifiTxVector
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/rate-control/minstrel-ht-wifi-manager.cc ns-3.36/src/wifi/model/rate-control/minstrel-ht-wifi-manager.cc
--- ns-3.35/src/wifi/model/rate-control/minstrel-ht-wifi-manager.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/rate-control/minstrel-ht-wifi-manager.cc	2022-04-30 18:23:58.210735000 -0700
@@ -908,13 +908,14 @@
                          "," << GetChannelWidth (station) << ")");
         }
       WifiMode mode = GetMcsSupported (station, mcsIndex);
-      uint64_t dataRate = mode.GetDataRate (group.chWidth, group.gi, group.streams);
+      WifiTxVector txVector {mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled ()), group.gi, GetNumberOfAntennas (), group.streams, GetNess (station), GetChannelWidthForTransmission (mode, group.chWidth), GetAggregation (station) && !station->m_isSampling};
+      uint64_t dataRate = mode.GetDataRate (txVector);
       if (m_currentRate != dataRate && !station->m_isSampling)
         {
           NS_LOG_DEBUG ("New datarate: " << dataRate);
           m_currentRate = dataRate;
         }
-      return WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled ()), group.gi, GetNumberOfAntennas (), group.streams, GetNess (station), GetChannelWidthForTransmission (mode, group.chWidth), GetAggregation (station) && !station->m_isSampling);
+      return txVector;
     }
 }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/rate-control/minstrel-wifi-manager.cc ns-3.36/src/wifi/model/rate-control/minstrel-wifi-manager.cc
--- ns-3.35/src/wifi/model/rate-control/minstrel-wifi-manager.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/rate-control/minstrel-wifi-manager.cc	2022-04-30 18:23:58.210735000 -0700
@@ -374,10 +374,11 @@
       CheckInit (station);
     }
   WifiMode mode = GetSupported (station, station->m_txrate);
-  if (m_currentRate != mode.GetDataRate (channelWidth) && !station->m_isSampling)
+  uint64_t rate = mode.GetDataRate (channelWidth);
+  if (m_currentRate != rate && !station->m_isSampling)
     {
-      NS_LOG_DEBUG ("New datarate: " << mode.GetDataRate (channelWidth));
-      m_currentRate = mode.GetDataRate (channelWidth);
+      NS_LOG_DEBUG ("New datarate: " << rate);
+      m_currentRate = rate;
     }
   return WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled ()), 800, 1, 1, 0, channelWidth, GetAggregation (station));
 }
@@ -392,7 +393,6 @@
     {
       channelWidth = 20;
     }
-  WifiTxVector rtsTxVector;
   WifiMode mode;
   if (GetUseNonErpProtection () == false)
     {
@@ -402,8 +402,7 @@
     {
       mode = GetNonErpSupported (station, 0);
     }
-  rtsTxVector = WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled ()), 800, 1, 1, 0, channelWidth, GetAggregation (station));
-  return rtsTxVector;
+  return WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled ()), 800, 1, 1, 0, channelWidth, GetAggregation (station));
 }
 
 uint32_t
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/rate-control/onoe-wifi-manager.cc ns-3.36/src/wifi/model/rate-control/onoe-wifi-manager.cc
--- ns-3.35/src/wifi/model/rate-control/onoe-wifi-manager.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/rate-control/onoe-wifi-manager.cc	2022-04-30 18:23:58.210735000 -0700
@@ -331,10 +331,11 @@
       channelWidth = 20;
     }
   WifiMode mode = GetSupported (station, rateIndex);
-  if (m_currentRate != mode.GetDataRate (channelWidth))
+  uint64_t rate = mode.GetDataRate (channelWidth);
+  if (m_currentRate != rate)
     {
-      NS_LOG_DEBUG ("New datarate: " << mode.GetDataRate (channelWidth));
-      m_currentRate = mode.GetDataRate (channelWidth);
+      NS_LOG_DEBUG ("New datarate: " << rate);
+      m_currentRate = rate;
     }
   return WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled ()), 800, 1, 1, 0, channelWidth, GetAggregation (station));
 }
@@ -350,7 +351,6 @@
       channelWidth = 20;
     }
   UpdateMode (station);
-  WifiTxVector rtsTxVector;
   WifiMode mode;
   if (GetUseNonErpProtection () == false)
     {
@@ -360,8 +360,7 @@
     {
       mode = GetNonErpSupported (station, 0);
     }
-  rtsTxVector = WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled ()), 800, 1, 1, 0, channelWidth, GetAggregation (station));
-  return rtsTxVector;
+  return WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled ()), 800, 1, 1, 0, channelWidth, GetAggregation (station));
 }
 
 } //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/rate-control/parf-wifi-manager.cc ns-3.36/src/wifi/model/rate-control/parf-wifi-manager.cc
--- ns-3.35/src/wifi/model/rate-control/parf-wifi-manager.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/rate-control/parf-wifi-manager.cc	2022-04-30 18:23:58.210735000 -0700
@@ -348,7 +348,6 @@
     {
       channelWidth = 20;
     }
-  WifiTxVector rtsTxVector;
   WifiMode mode;
   if (GetUseNonErpProtection () == false)
     {
@@ -358,8 +357,7 @@
     {
       mode = GetNonErpSupported (station, 0);
     }
-  rtsTxVector = WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled ()), 800, 1, 1, 0, channelWidth, GetAggregation (station));
-  return rtsTxVector;
+  return WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled ()), 800, 1, 1, 0, channelWidth, GetAggregation (station));
 }
 
 } //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/rate-control/rraa-wifi-manager.cc ns-3.36/src/wifi/model/rate-control/rraa-wifi-manager.cc
--- ns-3.35/src/wifi/model/rate-control/rraa-wifi-manager.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/rate-control/rraa-wifi-manager.cc	2022-04-30 18:23:58.210735000 -0700
@@ -356,10 +356,11 @@
     }
   CheckInit (station);
   WifiMode mode = GetSupported (station, station->m_rateIndex);
-  if (m_currentRate != mode.GetDataRate (channelWidth))
+  uint64_t rate = mode.GetDataRate (channelWidth);
+  if (m_currentRate != rate)
     {
-      NS_LOG_DEBUG ("New datarate: " << mode.GetDataRate (channelWidth));
-      m_currentRate = mode.GetDataRate (channelWidth);
+      NS_LOG_DEBUG ("New datarate: " << rate);
+      m_currentRate = rate;
     }
   return WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled ()), 800, 1, 1, 0, channelWidth, GetAggregation (station));
 }
@@ -374,7 +375,6 @@
     {
       channelWidth = 20;
     }
-  WifiTxVector rtsTxVector;
   WifiMode mode;
   if (GetUseNonErpProtection () == false)
     {
@@ -384,8 +384,7 @@
     {
       mode = GetNonErpSupported (station, 0);
     }
-  rtsTxVector = WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled ()), 800, 1, 1, 0, channelWidth, GetAggregation (station));
-  return rtsTxVector;
+  return WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled ()), 800, 1, 1, 0, channelWidth, GetAggregation (station));
 }
 
 bool
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/rate-control/rrpaa-wifi-manager.cc ns-3.36/src/wifi/model/rate-control/rrpaa-wifi-manager.cc
--- ns-3.35/src/wifi/model/rate-control/rrpaa-wifi-manager.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/rate-control/rrpaa-wifi-manager.cc	2022-04-30 18:23:58.210735000 -0700
@@ -424,7 +424,6 @@
     {
       channelWidth = 20;
     }
-  WifiTxVector rtsTxVector;
   WifiMode mode;
   if (GetUseNonErpProtection () == false)
     {
@@ -434,8 +433,7 @@
     {
       mode = GetNonErpSupported (station, 0);
     }
-  rtsTxVector = WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled ()), 800, 1, 1, 0, channelWidth, GetAggregation (station));
-  return rtsTxVector;
+  return WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled ()), 800, 1, 1, 0, channelWidth, GetAggregation (station));
 }
 
 bool
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/reference/error-rate-tables.h ns-3.36/src/wifi/model/reference/error-rate-tables.h
--- ns-3.35/src/wifi/model/reference/error-rate-tables.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/reference/error-rate-tables.h	2022-04-30 18:23:58.210735000 -0700
@@ -31,14 +31,14 @@
 const uint16_t ERROR_TABLE_BCC_SMALL_FRAME_SIZE = 32;   //!< reference size (bytes) of small frames for BCC
 const uint16_t ERROR_TABLE_BCC_LARGE_FRAME_SIZE = 1458; //!< reference size (bytes) of large frames for BCC
 const uint16_t ERROR_TABLE_LDPC_FRAME_SIZE = 1458;      //!< reference size (bytes) for LDPC
-const uint8_t ERROR_TABLE_BCC_MAX_NUM_MCS = 9;          //!< maximum number of MCSs for BCC
-const uint8_t ERROR_TABLE_LDPC_MAX_NUM_MCS = 11;        //!< maximum number of MCSs for LDPC
+const uint8_t ERROR_TABLE_BCC_MAX_NUM_MCS = 10;         //!< maximum number of MCSs for BCC
+const uint8_t ERROR_TABLE_LDPC_MAX_NUM_MCS = 12;        //!< maximum number of MCSs for LDPC
 
 /// Table of SNR (dB) and PER pairs
 typedef std::vector<std::pair<double /* SNR (dB) */, double /* PER */> > SnrPerTable;
 
 /// AWGN error table for BCC with reference size of 32 bytes
-static const SnrPerTable AwgnErrorTableBcc32 [ERROR_TABLE_BCC_MAX_NUM_MCS + 1] = {
+static const SnrPerTable AwgnErrorTableBcc32 [ERROR_TABLE_BCC_MAX_NUM_MCS] = {
   // MCS-0
   {
     {-3.50000, 1.00000}, {-3.00000, 0.99500}, {-2.50000, 0.94080}, {-2.00000, 0.82590},
@@ -116,7 +116,7 @@
 };
 
 /// AWGN error table for BCC with reference size of 1458 bytes
-static const SnrPerTable AwgnErrorTableBcc1458 [ERROR_TABLE_BCC_MAX_NUM_MCS + 1] = {
+static const SnrPerTable AwgnErrorTableBcc1458 [ERROR_TABLE_BCC_MAX_NUM_MCS] = {
   // MCS-0
   {
     {-1.00000, 1.00000}, {-0.50000, 0.99400}, {0.00000, 0.81850}, {0.50000, 0.29080},
@@ -183,7 +183,7 @@
 };
 
 /// AWGN error table for LDPC with reference size of 1458 bytes
-static const SnrPerTable AwgnErrorTableLdpc1458 [ERROR_TABLE_LDPC_MAX_NUM_MCS + 1] = {
+static const SnrPerTable AwgnErrorTableLdpc1458 [ERROR_TABLE_LDPC_MAX_NUM_MCS] = {
   // MCS-0
   {
     {-1.50000, 1.00000}, {-1.25000, 0.97950}, {-1.00000, 0.60480}, {-0.75000, 0.17050},
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/regular-wifi-mac.cc ns-3.36/src/wifi/model/regular-wifi-mac.cc
--- ns-3.35/src/wifi/model/regular-wifi-mac.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/regular-wifi-mac.cc	1969-12-31 16:00:00.000000000 -0800
@@ -1,1213 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2008 INRIA
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
- */
-
-#include "ns3/log.h"
-#include "ns3/pointer.h"
-#include "ns3/packet.h"
-#include "regular-wifi-mac.h"
-#include "wifi-phy.h"
-#include "mac-rx-middle.h"
-#include "mac-tx-middle.h"
-#include "msdu-aggregator.h"
-#include "mpdu-aggregator.h"
-#include "mgt-headers.h"
-#include "amsdu-subframe-header.h"
-#include "wifi-net-device.h"
-#include "ns3/ht-configuration.h"
-#include "ns3/vht-configuration.h"
-#include "ns3/he-configuration.h"
-#include <algorithm>
-#include <cmath>
-#include "ns3/he-frame-exchange-manager.h"
-#include "channel-access-manager.h"
-#include "wifi-mac-queue.h"
-
-namespace ns3 {
-
-NS_LOG_COMPONENT_DEFINE ("RegularWifiMac");
-
-NS_OBJECT_ENSURE_REGISTERED (RegularWifiMac);
-
-RegularWifiMac::RegularWifiMac ()
-  : m_qosSupported (0),
-    m_erpSupported (0),
-    m_dsssSupported (0)
-{
-  NS_LOG_FUNCTION (this);
-  m_rxMiddle = Create<MacRxMiddle> ();
-  m_rxMiddle->SetForwardCallback (MakeCallback (&RegularWifiMac::Receive, this));
-
-  m_txMiddle = Create<MacTxMiddle> ();
-
-  m_channelAccessManager = CreateObject<ChannelAccessManager> ();
-
-  m_txop = CreateObject<Txop> ();
-  m_txop->SetChannelAccessManager (m_channelAccessManager);
-  m_txop->SetWifiMac (this);
-  m_txop->SetTxMiddle (m_txMiddle);
-  m_txop->SetDroppedMpduCallback (MakeCallback (&DroppedMpduTracedCallback::operator(),
-                                                &m_droppedMpduCallback));
-
-  //Construct the EDCAFs. The ordering is important - highest
-  //priority (Table 9-1 UP-to-AC mapping; IEEE 802.11-2012) must be created
-  //first.
-  SetupEdcaQueue (AC_VO);
-  SetupEdcaQueue (AC_VI);
-  SetupEdcaQueue (AC_BE);
-  SetupEdcaQueue (AC_BK);
-}
-
-RegularWifiMac::~RegularWifiMac ()
-{
-  NS_LOG_FUNCTION (this);
-}
-
-void
-RegularWifiMac::DoInitialize ()
-{
-  NS_LOG_FUNCTION (this);
-  m_txop->Initialize ();
-
-  for (EdcaQueues::const_iterator i = m_edca.begin (); i != m_edca.end (); ++i)
-    {
-      i->second->Initialize ();
-    }
-}
-
-void
-RegularWifiMac::DoDispose ()
-{
-  NS_LOG_FUNCTION (this);
-
-  m_rxMiddle = 0;
-  m_txMiddle = 0;
-
-  m_phy = 0;
-  m_stationManager = 0;
-  if (m_feManager != 0)
-    {
-      m_feManager->Dispose ();
-    }
-  m_feManager = 0;
-
-  m_txop->Dispose ();
-  m_txop = 0;
-
-  for (EdcaQueues::iterator i = m_edca.begin (); i != m_edca.end (); ++i)
-    {
-      i->second->Dispose ();
-      i->second = 0;
-    }
-
-  m_channelAccessManager->Dispose ();
-  m_channelAccessManager = 0;
-  
-  WifiMac::DoDispose ();
-}
-
-void
-RegularWifiMac::SetupFrameExchangeManager (void)
-{
-  NS_LOG_FUNCTION (this);
-
-  if (GetHeSupported ())
-    {
-      m_feManager = CreateObject<HeFrameExchangeManager> ();
-    }
-  else if (GetVhtSupported ())
-    {
-      m_feManager = CreateObject<VhtFrameExchangeManager> ();
-    }
-  else if (GetHtSupported ())
-    {
-      m_feManager = CreateObject<HtFrameExchangeManager> ();
-    }
-  else if (GetQosSupported ())
-    {
-      m_feManager = CreateObject<QosFrameExchangeManager> ();
-    }
-  else
-    {
-      m_feManager = CreateObject<FrameExchangeManager> ();
-    }
-
-  m_feManager->SetWifiMac (this);
-  m_feManager->SetMacTxMiddle (m_txMiddle);
-  m_feManager->SetMacRxMiddle (m_rxMiddle);
-  m_feManager->SetAddress (GetAddress ());
-  m_feManager->SetBssid (GetBssid ());
-  m_feManager->GetWifiTxTimer ().SetMpduResponseTimeoutCallback (MakeCallback (&MpduResponseTimeoutTracedCallback::operator(),
-                                                                               &m_mpduResponseTimeoutCallback));
-  m_feManager->GetWifiTxTimer ().SetPsduResponseTimeoutCallback (MakeCallback (&PsduResponseTimeoutTracedCallback::operator(),
-                                                                               &m_psduResponseTimeoutCallback));
-  m_feManager->GetWifiTxTimer ().SetPsduMapResponseTimeoutCallback (MakeCallback (&PsduMapResponseTimeoutTracedCallback::operator(),
-                                                                                  &m_psduMapResponseTimeoutCallback));
-  m_feManager->SetDroppedMpduCallback (MakeCallback (&DroppedMpduTracedCallback::operator(),
-                                                     &m_droppedMpduCallback));
-  m_feManager->SetAckedMpduCallback (MakeCallback (&MpduTracedCallback::operator(),
-                                                   &m_ackedMpduCallback));
-  m_channelAccessManager->SetupFrameExchangeManager (m_feManager);
-  if (GetQosSupported ())
-    {
-      for (const auto& pair : m_edca)
-        {
-          pair.second->SetQosFrameExchangeManager (DynamicCast<QosFrameExchangeManager> (m_feManager));
-        }
-    }
-}
-
-Ptr<FrameExchangeManager>
-RegularWifiMac::GetFrameExchangeManager (void) const
-{
-  return m_feManager;
-}
-
-void
-RegularWifiMac::SetWifiRemoteStationManager (const Ptr<WifiRemoteStationManager> stationManager)
-{
-  NS_LOG_FUNCTION (this << stationManager);
-  m_stationManager = stationManager;
-}
-
-Ptr<WifiRemoteStationManager>
-RegularWifiMac::GetWifiRemoteStationManager () const
-{
-  return m_stationManager;
-}
-
-ExtendedCapabilities
-RegularWifiMac::GetExtendedCapabilities (void) const
-{
-  NS_LOG_FUNCTION (this);
-  ExtendedCapabilities capabilities;
-  capabilities.SetHtSupported (GetHtSupported ());
-  capabilities.SetVhtSupported (GetVhtSupported ());
-  //TODO: to be completed
-  return capabilities;
-}
-
-HtCapabilities
-RegularWifiMac::GetHtCapabilities (void) const
-{
-  NS_LOG_FUNCTION (this);
-  HtCapabilities capabilities;
-  if (GetHtSupported ())
-    {
-      Ptr<HtConfiguration> htConfiguration = GetHtConfiguration ();
-      bool sgiSupported = htConfiguration->GetShortGuardIntervalSupported ();
-      capabilities.SetHtSupported (1);
-      capabilities.SetLdpc (htConfiguration->GetLdpcSupported ());
-      capabilities.SetSupportedChannelWidth (m_phy->GetChannelWidth () >= 40);
-      capabilities.SetShortGuardInterval20 (sgiSupported);
-      capabilities.SetShortGuardInterval40 (m_phy->GetChannelWidth () >= 40 && sgiSupported);
-      // Set Maximum A-MSDU Length subfield
-      uint16_t maxAmsduSize = std::max ({m_voMaxAmsduSize, m_viMaxAmsduSize,
-                                         m_beMaxAmsduSize, m_bkMaxAmsduSize});
-      if (maxAmsduSize <= 3839)
-        {
-          capabilities.SetMaxAmsduLength (3839);
-        }
-      else
-        {
-          capabilities.SetMaxAmsduLength (7935);
-        }
-      uint32_t maxAmpduLength = std::max ({m_voMaxAmpduSize, m_viMaxAmpduSize,
-                                           m_beMaxAmpduSize, m_bkMaxAmpduSize});
-      // round to the next power of two minus one
-      maxAmpduLength = (1ul << static_cast<uint32_t> (std::ceil (std::log2 (maxAmpduLength + 1)))) - 1;
-      // The maximum A-MPDU length in HT capabilities elements ranges from 2^13-1 to 2^16-1
-      capabilities.SetMaxAmpduLength (std::min (std::max (maxAmpduLength, 8191u), 65535u));
-
-      capabilities.SetLSigProtectionSupport (true);
-      uint64_t maxSupportedRate = 0; //in bit/s
-      for (const auto & mcs : m_phy->GetMcsList (WIFI_MOD_CLASS_HT))
-        {
-          capabilities.SetRxMcsBitmask (mcs.GetMcsValue ());
-          uint8_t nss = (mcs.GetMcsValue () / 8) + 1;
-          NS_ASSERT (nss > 0 && nss < 5);
-          uint64_t dataRate = mcs.GetDataRate (m_phy->GetChannelWidth (), sgiSupported ? 400 : 800, nss);
-          if (dataRate > maxSupportedRate)
-            {
-              maxSupportedRate = dataRate;
-              NS_LOG_DEBUG ("Updating maxSupportedRate to " << maxSupportedRate);
-            }
-        }
-      capabilities.SetRxHighestSupportedDataRate (static_cast<uint16_t> (maxSupportedRate / 1e6)); //in Mbit/s
-      capabilities.SetTxMcsSetDefined (m_phy->GetNMcs () > 0);
-      capabilities.SetTxMaxNSpatialStreams (m_phy->GetMaxSupportedTxSpatialStreams ());
-      //we do not support unequal modulations
-      capabilities.SetTxRxMcsSetUnequal (0);
-      capabilities.SetTxUnequalModulation (0);
-    }
-  return capabilities;
-}
-
-VhtCapabilities
-RegularWifiMac::GetVhtCapabilities (void) const
-{
-  NS_LOG_FUNCTION (this);
-  VhtCapabilities capabilities;
-  if (GetVhtSupported ())
-    {
-      Ptr<HtConfiguration> htConfiguration = GetHtConfiguration ();
-      Ptr<VhtConfiguration> vhtConfiguration = GetVhtConfiguration ();
-      bool sgiSupported = htConfiguration->GetShortGuardIntervalSupported ();
-      capabilities.SetVhtSupported (1);
-      if (m_phy->GetChannelWidth () == 160)
-        {
-          capabilities.SetSupportedChannelWidthSet (1);
-        }
-      else
-        {
-          capabilities.SetSupportedChannelWidthSet (0);
-        }
-      // Set Maximum MPDU Length subfield
-      uint16_t maxAmsduSize = std::max ({m_voMaxAmsduSize, m_viMaxAmsduSize,
-                                         m_beMaxAmsduSize, m_bkMaxAmsduSize});
-      if (maxAmsduSize <= 3839)
-        {
-          capabilities.SetMaxMpduLength (3895);
-        }
-      else if (maxAmsduSize <= 7935)
-        {
-          capabilities.SetMaxMpduLength (7991);
-        }
-      else
-        {
-          capabilities.SetMaxMpduLength (11454);
-        }
-      uint32_t maxAmpduLength = std::max ({m_voMaxAmpduSize, m_viMaxAmpduSize,
-                                           m_beMaxAmpduSize, m_bkMaxAmpduSize});
-      // round to the next power of two minus one
-      maxAmpduLength = (1ul << static_cast<uint32_t> (std::ceil (std::log2 (maxAmpduLength + 1)))) - 1;
-      // The maximum A-MPDU length in VHT capabilities elements ranges from 2^13-1 to 2^20-1
-      capabilities.SetMaxAmpduLength (std::min (std::max (maxAmpduLength, 8191u), 1048575u));
-
-      capabilities.SetRxLdpc (htConfiguration->GetLdpcSupported ());
-      capabilities.SetShortGuardIntervalFor80Mhz ((m_phy->GetChannelWidth () == 80) && sgiSupported);
-      capabilities.SetShortGuardIntervalFor160Mhz ((m_phy->GetChannelWidth () == 160) && sgiSupported);
-      uint8_t maxMcs = 0;
-      for (const auto & mcs : m_phy->GetMcsList (WIFI_MOD_CLASS_VHT))
-        {
-          if (mcs.GetMcsValue () > maxMcs)
-            {
-              maxMcs = mcs.GetMcsValue ();
-            }
-        }
-      // Support same MaxMCS for each spatial stream
-      for (uint8_t nss = 1; nss <= m_phy->GetMaxSupportedRxSpatialStreams (); nss++)
-        {
-          capabilities.SetRxMcsMap (maxMcs, nss);
-        }
-      for (uint8_t nss = 1; nss <= m_phy->GetMaxSupportedTxSpatialStreams (); nss++)
-        {
-          capabilities.SetTxMcsMap (maxMcs, nss);
-        }
-      uint64_t maxSupportedRateLGI = 0; //in bit/s
-      for (const auto & mcs : m_phy->GetMcsList (WIFI_MOD_CLASS_VHT))
-        {
-          if (!mcs.IsAllowed (m_phy->GetChannelWidth (), 1))
-            {
-              continue;
-            }
-          if (mcs.GetDataRate (m_phy->GetChannelWidth ()) > maxSupportedRateLGI)
-            {
-              maxSupportedRateLGI = mcs.GetDataRate (m_phy->GetChannelWidth ());
-              NS_LOG_DEBUG ("Updating maxSupportedRateLGI to " << maxSupportedRateLGI);
-            }
-        }
-      capabilities.SetRxHighestSupportedLgiDataRate (static_cast<uint16_t> (maxSupportedRateLGI / 1e6)); //in Mbit/s
-      capabilities.SetTxHighestSupportedLgiDataRate (static_cast<uint16_t> (maxSupportedRateLGI / 1e6)); //in Mbit/s
-      //To be filled in once supported
-      capabilities.SetRxStbc (0);
-      capabilities.SetTxStbc (0);
-    }
-  return capabilities;
-}
-
-HeCapabilities
-RegularWifiMac::GetHeCapabilities (void) const
-{
-  NS_LOG_FUNCTION (this);
-  HeCapabilities capabilities;
-  if (GetHeSupported ())
-    {
-      Ptr<HtConfiguration> htConfiguration = GetHtConfiguration ();
-      Ptr<HeConfiguration> heConfiguration = GetHeConfiguration ();
-      capabilities.SetHeSupported (1);
-      uint8_t channelWidthSet = 0;
-      if ((m_phy->GetChannelWidth () >= 40) && (m_phy->GetPhyBand () == WIFI_PHY_BAND_2_4GHZ))
-        {
-          channelWidthSet |= 0x01;
-        }
-      if ((m_phy->GetChannelWidth () >= 80) && ((m_phy->GetPhyBand () == WIFI_PHY_BAND_5GHZ) || (m_phy->GetPhyBand () == WIFI_PHY_BAND_6GHZ)))
-        {
-          channelWidthSet |= 0x02;
-        }
-      if ((m_phy->GetChannelWidth () >= 160) && ((m_phy->GetPhyBand () == WIFI_PHY_BAND_5GHZ) || (m_phy->GetPhyBand () == WIFI_PHY_BAND_6GHZ)))
-        {
-          channelWidthSet |= 0x04;
-        }
-      capabilities.SetChannelWidthSet (channelWidthSet);
-      capabilities.SetLdpcCodingInPayload (htConfiguration->GetLdpcSupported ());
-      uint8_t gi = 0;
-      if (heConfiguration->GetGuardInterval () <= NanoSeconds (1600))
-        {
-          //todo: We assume for now that if we support 800ns GI then 1600ns GI is supported as well
-          gi |= 0x01;
-        }
-      if (heConfiguration->GetGuardInterval () == NanoSeconds (800))
-        {
-          gi |= 0x02;
-        }
-      capabilities.SetHeLtfAndGiForHePpdus (gi);
-      uint32_t maxAmpduLength = std::max ({m_voMaxAmpduSize, m_viMaxAmpduSize,
-                                           m_beMaxAmpduSize, m_bkMaxAmpduSize});
-      // round to the next power of two minus one
-      maxAmpduLength = (1ul << static_cast<uint32_t> (std::ceil (std::log2 (maxAmpduLength + 1)))) - 1;
-      // The maximum A-MPDU length in HE capabilities elements ranges from 2^20-1 to 2^23-1
-      capabilities.SetMaxAmpduLength (std::min (std::max (maxAmpduLength, 1048575u), 8388607u));
-
-      uint8_t maxMcs = 0;
-      for (const auto & mcs : m_phy->GetMcsList (WIFI_MOD_CLASS_HE))
-        {
-          if (mcs.GetMcsValue () > maxMcs)
-            {
-              maxMcs = mcs.GetMcsValue ();
-            }
-        }
-      capabilities.SetHighestMcsSupported (maxMcs);
-      capabilities.SetHighestNssSupported (m_phy->GetMaxSupportedTxSpatialStreams ());
-    }
-  return capabilities;
-}
-
-void
-RegularWifiMac::SetVoBlockAckThreshold (uint8_t threshold)
-{
-  NS_LOG_FUNCTION (this << +threshold);
-  GetVOQueue ()->SetBlockAckThreshold (threshold);
-}
-
-void
-RegularWifiMac::SetViBlockAckThreshold (uint8_t threshold)
-{
-  NS_LOG_FUNCTION (this << +threshold);
-  GetVIQueue ()->SetBlockAckThreshold (threshold);
-}
-
-void
-RegularWifiMac::SetBeBlockAckThreshold (uint8_t threshold)
-{
-  NS_LOG_FUNCTION (this << +threshold);
-  GetBEQueue ()->SetBlockAckThreshold (threshold);
-}
-
-void
-RegularWifiMac::SetBkBlockAckThreshold (uint8_t threshold)
-{
-  NS_LOG_FUNCTION (this << +threshold);
-  GetBKQueue ()->SetBlockAckThreshold (threshold);
-}
-
-void
-RegularWifiMac::SetVoBlockAckInactivityTimeout (uint16_t timeout)
-{
-  NS_LOG_FUNCTION (this << timeout);
-  GetVOQueue ()->SetBlockAckInactivityTimeout (timeout);
-}
-
-void
-RegularWifiMac::SetViBlockAckInactivityTimeout (uint16_t timeout)
-{
-  NS_LOG_FUNCTION (this << timeout);
-  GetVIQueue ()->SetBlockAckInactivityTimeout (timeout);
-}
-
-void
-RegularWifiMac::SetBeBlockAckInactivityTimeout (uint16_t timeout)
-{
-  NS_LOG_FUNCTION (this << timeout);
-  GetBEQueue ()->SetBlockAckInactivityTimeout (timeout);
-}
-
-void
-RegularWifiMac::SetBkBlockAckInactivityTimeout (uint16_t timeout)
-{
-  NS_LOG_FUNCTION (this << timeout);
-  GetBKQueue ()->SetBlockAckInactivityTimeout (timeout);
-}
-
-void
-RegularWifiMac::SetupEdcaQueue (AcIndex ac)
-{
-  NS_LOG_FUNCTION (this << ac);
-
-  //Our caller shouldn't be attempting to setup a queue that is
-  //already configured.
-  NS_ASSERT (m_edca.find (ac) == m_edca.end ());
-
-  Ptr<QosTxop> edca = CreateObject<QosTxop> (ac);
-  edca->SetChannelAccessManager (m_channelAccessManager);
-  edca->SetWifiMac (this);
-  edca->SetTxMiddle (m_txMiddle);
-  edca->GetBaManager ()->SetTxOkCallback (MakeCallback (&MpduTracedCallback::operator(),
-                                                        &m_ackedMpduCallback));
-  edca->GetBaManager ()->SetTxFailedCallback (MakeCallback (&MpduTracedCallback::operator(),
-                                                            &m_nackedMpduCallback));
-  edca->SetDroppedMpduCallback (MakeCallback (&DroppedMpduTracedCallback::operator(),
-                                              &m_droppedMpduCallback));
-
-  m_edca.insert (std::make_pair (ac, edca));
-}
-
-void
-RegularWifiMac::SetTypeOfStation (TypeOfStation type)
-{
-  NS_LOG_FUNCTION (this << type);
-  m_typeOfStation = type;
-}
-
-TypeOfStation
-RegularWifiMac::GetTypeOfStation (void) const
-{
-  return m_typeOfStation;
-}
-
-Ptr<Txop>
-RegularWifiMac::GetTxop () const
-{
-  return m_txop;
-}
-
-Ptr<QosTxop>
-RegularWifiMac::GetQosTxop (AcIndex ac) const
-{
-  return m_edca.find (ac)->second;
-}
-
-Ptr<QosTxop>
-RegularWifiMac::GetQosTxop (uint8_t tid) const
-{
-  return GetQosTxop (QosUtilsMapTidToAc (tid));
-}
-
-Ptr<QosTxop>
-RegularWifiMac::GetVOQueue () const
-{
-  return m_edca.find (AC_VO)->second;
-}
-
-Ptr<QosTxop>
-RegularWifiMac::GetVIQueue () const
-{
-  return m_edca.find (AC_VI)->second;
-}
-
-Ptr<QosTxop>
-RegularWifiMac::GetBEQueue () const
-{
-  return m_edca.find (AC_BE)->second;
-}
-
-Ptr<QosTxop>
-RegularWifiMac::GetBKQueue () const
-{
-  return m_edca.find (AC_BK)->second;
-}
-
-Ptr<WifiMacQueue>
-RegularWifiMac::GetTxopQueue (AcIndex ac) const
-{
-  if (ac == AC_BE_NQOS)
-    {
-      return m_txop->GetWifiMacQueue ();
-    }
-  NS_ASSERT (ac == AC_BE || ac == AC_BK || ac == AC_VI || ac == AC_VO);
-  return m_edca.find (ac)->second->GetWifiMacQueue ();
-}
-
-void
-RegularWifiMac::SetWifiPhy (const Ptr<WifiPhy> phy)
-{
-  NS_LOG_FUNCTION (this << phy);
-  m_phy = phy;
-  m_channelAccessManager->SetupPhyListener (phy);
-  NS_ASSERT (m_feManager != 0);
-  m_feManager->SetWifiPhy (phy);
-}
-
-Ptr<WifiPhy>
-RegularWifiMac::GetWifiPhy (void) const
-{
-  NS_LOG_FUNCTION (this);
-  return m_phy;
-}
-
-void
-RegularWifiMac::ResetWifiPhy (void)
-{
-  NS_LOG_FUNCTION (this);
-  NS_ASSERT (m_feManager != 0);
-  m_feManager->ResetPhy ();
-  m_channelAccessManager->RemovePhyListener (m_phy);
-  m_phy = 0;
-}
-
-void
-RegularWifiMac::SetForwardUpCallback (ForwardUpCallback upCallback)
-{
-  NS_LOG_FUNCTION (this);
-  m_forwardUp = upCallback;
-}
-
-void
-RegularWifiMac::SetLinkUpCallback (Callback<void> linkUp)
-{
-  NS_LOG_FUNCTION (this);
-  m_linkUp = linkUp;
-}
-
-void
-RegularWifiMac::SetLinkDownCallback (Callback<void> linkDown)
-{
-  NS_LOG_FUNCTION (this);
-  m_linkDown = linkDown;
-}
-
-void
-RegularWifiMac::SetQosSupported (bool enable)
-{
-  NS_LOG_FUNCTION (this << enable);
-  m_qosSupported = enable;
-}
-
-bool
-RegularWifiMac::GetQosSupported () const
-{
-  return m_qosSupported;
-}
-
-bool
-RegularWifiMac::GetHtSupported () const
-{
-  if (GetHtConfiguration ())
-    {
-      return true;
-    }
-  return false;
-}
-
-bool
-RegularWifiMac::GetVhtSupported () const
-{
-  if (GetVhtConfiguration ())
-    {
-      return true;
-    }
-  return false;
-}
-
-bool
-RegularWifiMac::GetHeSupported () const
-{
-  if (GetHeConfiguration ())
-    {
-      return true;
-    }
-  return false;
-}
-
-bool
-RegularWifiMac::GetErpSupported () const
-{
-  return m_erpSupported;
-}
-
-void
-RegularWifiMac::SetErpSupported (bool enable)
-{
-  NS_LOG_FUNCTION (this);
-  if (enable)
-    {
-      SetDsssSupported (true);
-    }
-  m_erpSupported = enable;
-}
-
-void
-RegularWifiMac::SetDsssSupported (bool enable)
-{
-  NS_LOG_FUNCTION (this);
-  m_dsssSupported = enable;
-}
-
-bool
-RegularWifiMac::GetDsssSupported () const
-{
-  return m_dsssSupported;
-}
-
-void
-RegularWifiMac::SetCtsToSelfSupported (bool enable)
-{
-  NS_LOG_FUNCTION (this);
-  m_ctsToSelfSupported = enable;
-}
-
-void
-RegularWifiMac::SetAddress (Mac48Address address)
-{
-  NS_LOG_FUNCTION (this << address);
-  m_address = address;
-}
-
-Mac48Address
-RegularWifiMac::GetAddress (void) const
-{
-  return m_address;
-}
-
-void
-RegularWifiMac::SetSsid (Ssid ssid)
-{
-  NS_LOG_FUNCTION (this << ssid);
-  m_ssid = ssid;
-}
-
-Ssid
-RegularWifiMac::GetSsid (void) const
-{
-  return m_ssid;
-}
-
-void
-RegularWifiMac::SetBssid (Mac48Address bssid)
-{
-  NS_LOG_FUNCTION (this << bssid);
-  m_bssid = bssid;
-  if (m_feManager)
-    {
-      m_feManager->SetBssid (bssid);
-    }
-}
-
-Mac48Address
-RegularWifiMac::GetBssid (void) const
-{
-  return m_bssid;
-}
-
-void
-RegularWifiMac::SetPromisc (void)
-{
-  NS_ASSERT (m_feManager != 0);
-  m_feManager->SetPromisc ();
-}
-
-void
-RegularWifiMac::SetShortSlotTimeSupported (bool enable)
-{
-  NS_LOG_FUNCTION (this << enable);
-  m_shortSlotTimeSupported = enable;
-}
-
-bool
-RegularWifiMac::GetShortSlotTimeSupported (void) const
-{
-  return m_shortSlotTimeSupported;
-}
-
-void
-RegularWifiMac::Enqueue (Ptr<Packet> packet,
-                         Mac48Address to, Mac48Address from)
-{
-  //We expect RegularWifiMac subclasses which do support forwarding (e.g.,
-  //AP) to override this method. Therefore, we throw a fatal error if
-  //someone tries to invoke this method on a class which has not done
-  //this.
-  NS_FATAL_ERROR ("This MAC entity (" << this << ", " << GetAddress ()
-                                      << ") does not support Enqueue() with from address");
-}
-
-bool
-RegularWifiMac::SupportsSendFrom (void) const
-{
-  return false;
-}
-
-void
-RegularWifiMac::ForwardUp (Ptr<const Packet> packet, Mac48Address from, Mac48Address to)
-{
-  NS_LOG_FUNCTION (this << packet << from << to);
-  m_forwardUp (packet, from, to);
-}
-
-void
-RegularWifiMac::Receive (Ptr<WifiMacQueueItem> mpdu)
-{
-  NS_LOG_FUNCTION (this << *mpdu);
-
-  const WifiMacHeader* hdr = &mpdu->GetHeader ();
-  Ptr<Packet> packet = mpdu->GetPacket ()->Copy ();
-  Mac48Address to = hdr->GetAddr1 ();
-  Mac48Address from = hdr->GetAddr2 ();
-
-  //We don't know how to deal with any frame that is not addressed to
-  //us (and odds are there is nothing sensible we could do anyway),
-  //so we ignore such frames.
-  //
-  //The derived class may also do some such filtering, but it doesn't
-  //hurt to have it here too as a backstop.
-  if (to != GetAddress ())
-    {
-      return;
-    }
-
-  if (hdr->IsMgt () && hdr->IsAction ())
-    {
-      //There is currently only any reason for Management Action
-      //frames to be flying about if we are a QoS STA.
-      NS_ASSERT (m_qosSupported);
-
-      WifiActionHeader actionHdr;
-      packet->RemoveHeader (actionHdr);
-
-      switch (actionHdr.GetCategory ())
-        {
-        case WifiActionHeader::BLOCK_ACK:
-
-          switch (actionHdr.GetAction ().blockAck)
-            {
-            case WifiActionHeader::BLOCK_ACK_ADDBA_REQUEST:
-              {
-                MgtAddBaRequestHeader reqHdr;
-                packet->RemoveHeader (reqHdr);
-
-                //We've received an ADDBA Request. Our policy here is
-                //to automatically accept it, so we get the ADDBA
-                //Response on it's way immediately.
-                NS_ASSERT (m_feManager != 0);
-                Ptr<HtFrameExchangeManager> htFem = DynamicCast<HtFrameExchangeManager> (m_feManager);
-                if (htFem != 0)
-                  {
-                    htFem->SendAddBaResponse (&reqHdr, from);
-                  }
-                //This frame is now completely dealt with, so we're done.
-                return;
-              }
-            case WifiActionHeader::BLOCK_ACK_ADDBA_RESPONSE:
-              {
-                MgtAddBaResponseHeader respHdr;
-                packet->RemoveHeader (respHdr);
-
-                //We've received an ADDBA Response. We assume that it
-                //indicates success after an ADDBA Request we have
-                //sent (we could, in principle, check this, but it
-                //seems a waste given the level of the current model)
-                //and act by locally establishing the agreement on
-                //the appropriate queue.
-                AcIndex ac = QosUtilsMapTidToAc (respHdr.GetTid ());
-                m_edca[ac]->GotAddBaResponse (&respHdr, from);
-                //This frame is now completely dealt with, so we're done.
-                return;
-              }
-            case WifiActionHeader::BLOCK_ACK_DELBA:
-              {
-                MgtDelBaHeader delBaHdr;
-                packet->RemoveHeader (delBaHdr);
-
-                if (delBaHdr.IsByOriginator ())
-                  {
-                    //This DELBA frame was sent by the originator, so
-                    //this means that an ingoing established
-                    //agreement exists in HtFrameExchangeManager and we need to
-                    //destroy it.
-                    NS_ASSERT (m_feManager != 0);
-                    Ptr<HtFrameExchangeManager> htFem = DynamicCast<HtFrameExchangeManager> (m_feManager);
-                    if (htFem != 0)
-                      {
-                        htFem->DestroyBlockAckAgreement (from, delBaHdr.GetTid ());
-                      }
-                  }
-                else
-                  {
-                    //We must have been the originator. We need to
-                    //tell the correct queue that the agreement has
-                    //been torn down
-                    AcIndex ac = QosUtilsMapTidToAc (delBaHdr.GetTid ());
-                    m_edca[ac]->GotDelBaFrame (&delBaHdr, from);
-                  }
-                //This frame is now completely dealt with, so we're done.
-                return;
-              }
-            default:
-              NS_FATAL_ERROR ("Unsupported Action field in Block Ack Action frame");
-              return;
-            }
-        default:
-          NS_FATAL_ERROR ("Unsupported Action frame received");
-          return;
-        }
-    }
-  NS_FATAL_ERROR ("Don't know how to handle frame (type=" << hdr->GetType ());
-}
-
-void
-RegularWifiMac::DeaggregateAmsduAndForward (Ptr<WifiMacQueueItem> mpdu)
-{
-  NS_LOG_FUNCTION (this << *mpdu);
-  for (auto& msduPair : *PeekPointer (mpdu))
-    {
-      ForwardUp (msduPair.first, msduPair.second.GetSourceAddr (),
-                 msduPair.second.GetDestinationAddr ());
-    }
-}
-
-TypeId
-RegularWifiMac::GetTypeId (void)
-{
-  static TypeId tid = TypeId ("ns3::RegularWifiMac")
-    .SetParent<WifiMac> ()
-    .SetGroupName ("Wifi")
-    .AddAttribute ("QosSupported",
-                   "This Boolean attribute is set to enable 802.11e/WMM-style QoS support at this STA.",
-                   BooleanValue (false),
-                   MakeBooleanAccessor (&RegularWifiMac::SetQosSupported,
-                                        &RegularWifiMac::GetQosSupported),
-                   MakeBooleanChecker ())
-    .AddAttribute ("CtsToSelfSupported",
-                   "Use CTS to Self when using a rate that is not in the basic rate set.",
-                   BooleanValue (false),
-                   MakeBooleanAccessor (&RegularWifiMac::SetCtsToSelfSupported),
-                   MakeBooleanChecker ())
-    .AddAttribute ("VO_MaxAmsduSize",
-                   "Maximum length in bytes of an A-MSDU for AC_VO access class "
-                   "(capped to 7935 for HT PPDUs and 11398 for VHT/HE PPDUs). "
-                   "Value 0 means A-MSDU aggregation is disabled for that AC.",
-                   UintegerValue (0),
-                   MakeUintegerAccessor (&RegularWifiMac::m_voMaxAmsduSize),
-                   MakeUintegerChecker<uint16_t> (0, 11398))
-    .AddAttribute ("VI_MaxAmsduSize",
-                   "Maximum length in bytes of an A-MSDU for AC_VI access class "
-                   "(capped to 7935 for HT PPDUs and 11398 for VHT/HE PPDUs). "
-                   "Value 0 means A-MSDU aggregation is disabled for that AC.",
-                   UintegerValue (0),
-                   MakeUintegerAccessor (&RegularWifiMac::m_viMaxAmsduSize),
-                   MakeUintegerChecker<uint16_t> (0, 11398))
-    .AddAttribute ("BE_MaxAmsduSize",
-                   "Maximum length in bytes of an A-MSDU for AC_BE access class "
-                   "(capped to 7935 for HT PPDUs and 11398 for VHT/HE PPDUs). "
-                   "Value 0 means A-MSDU aggregation is disabled for that AC.",
-                   UintegerValue (0),
-                   MakeUintegerAccessor (&RegularWifiMac::m_beMaxAmsduSize),
-                   MakeUintegerChecker<uint16_t> (0, 11398))
-    .AddAttribute ("BK_MaxAmsduSize",
-                   "Maximum length in bytes of an A-MSDU for AC_BK access class "
-                   "(capped to 7935 for HT PPDUs and 11398 for VHT/HE PPDUs). "
-                   "Value 0 means A-MSDU aggregation is disabled for that AC.",
-                   UintegerValue (0),
-                   MakeUintegerAccessor (&RegularWifiMac::m_bkMaxAmsduSize),
-                   MakeUintegerChecker<uint16_t> (0, 11398))
-    .AddAttribute ("VO_MaxAmpduSize",
-                   "Maximum length in bytes of an A-MPDU for AC_VO access class "
-                   "(capped to 65535 for HT PPDUs, 1048575 for VHT PPDUs, and 6500631 for HE PPDUs). "
-                   "Value 0 means A-MPDU aggregation is disabled for that AC.",
-                   UintegerValue (0),
-                   MakeUintegerAccessor (&RegularWifiMac::m_voMaxAmpduSize),
-                   MakeUintegerChecker<uint32_t> (0, 6500631))
-    .AddAttribute ("VI_MaxAmpduSize",
-                   "Maximum length in bytes of an A-MPDU for AC_VI access class "
-                   "(capped to 65535 for HT PPDUs, 1048575 for VHT PPDUs, and 6500631 for HE PPDUs). "
-                   "Value 0 means A-MPDU aggregation is disabled for that AC.",
-                   UintegerValue (65535),
-                   MakeUintegerAccessor (&RegularWifiMac::m_viMaxAmpduSize),
-                   MakeUintegerChecker<uint32_t> (0, 6500631))
-    .AddAttribute ("BE_MaxAmpduSize",
-                   "Maximum length in bytes of an A-MPDU for AC_BE access class "
-                   "(capped to 65535 for HT PPDUs, 1048575 for VHT PPDUs, and 6500631 for HE PPDUs). "
-                   "Value 0 means A-MPDU aggregation is disabled for that AC.",
-                   UintegerValue (65535),
-                   MakeUintegerAccessor (&RegularWifiMac::m_beMaxAmpduSize),
-                   MakeUintegerChecker<uint32_t> (0, 6500631))
-    .AddAttribute ("BK_MaxAmpduSize",
-                   "Maximum length in bytes of an A-MPDU for AC_BK access class "
-                   "(capped to 65535 for HT PPDUs, 1048575 for VHT PPDUs, and 6500631 for HE PPDUs). "
-                   "Value 0 means A-MPDU aggregation is disabled for that AC.",
-                   UintegerValue (0),
-                   MakeUintegerAccessor (&RegularWifiMac::m_bkMaxAmpduSize),
-                   MakeUintegerChecker<uint32_t> (0, 6500631))
-    .AddAttribute ("VO_BlockAckThreshold",
-                   "If number of packets in VO queue reaches this value, "
-                   "block ack mechanism is used. If this value is 0, block ack is never used."
-                   "When A-MPDU is enabled, block ack mechanism is used regardless of this value.",
-                   UintegerValue (0),
-                   MakeUintegerAccessor (&RegularWifiMac::SetVoBlockAckThreshold),
-                   MakeUintegerChecker<uint8_t> (0, 64))
-    .AddAttribute ("VI_BlockAckThreshold",
-                   "If number of packets in VI queue reaches this value, "
-                   "block ack mechanism is used. If this value is 0, block ack is never used."
-                   "When A-MPDU is enabled, block ack mechanism is used regardless of this value.",
-                   UintegerValue (0),
-                   MakeUintegerAccessor (&RegularWifiMac::SetViBlockAckThreshold),
-                   MakeUintegerChecker<uint8_t> (0, 64))
-    .AddAttribute ("BE_BlockAckThreshold",
-                   "If number of packets in BE queue reaches this value, "
-                   "block ack mechanism is used. If this value is 0, block ack is never used."
-                   "When A-MPDU is enabled, block ack mechanism is used regardless of this value.",
-                   UintegerValue (0),
-                   MakeUintegerAccessor (&RegularWifiMac::SetBeBlockAckThreshold),
-                   MakeUintegerChecker<uint8_t> (0, 64))
-    .AddAttribute ("BK_BlockAckThreshold",
-                   "If number of packets in BK queue reaches this value, "
-                   "block ack mechanism is used. If this value is 0, block ack is never used."
-                   "When A-MPDU is enabled, block ack mechanism is used regardless of this value.",
-                   UintegerValue (0),
-                   MakeUintegerAccessor (&RegularWifiMac::SetBkBlockAckThreshold),
-                   MakeUintegerChecker<uint8_t> (0, 64))
-    .AddAttribute ("VO_BlockAckInactivityTimeout",
-                   "Represents max time (blocks of 1024 microseconds) allowed for block ack"
-                   "inactivity for AC_VO. If this value isn't equal to 0 a timer start after that a"
-                   "block ack setup is completed and will be reset every time that a block ack"
-                   "frame is received. If this value is 0, block ack inactivity timeout won't be used.",
-                   UintegerValue (0),
-                   MakeUintegerAccessor (&RegularWifiMac::SetVoBlockAckInactivityTimeout),
-                   MakeUintegerChecker<uint16_t> ())
-    .AddAttribute ("VI_BlockAckInactivityTimeout",
-                   "Represents max time (blocks of 1024 microseconds) allowed for block ack"
-                   "inactivity for AC_VI. If this value isn't equal to 0 a timer start after that a"
-                   "block ack setup is completed and will be reset every time that a block ack"
-                   "frame is received. If this value is 0, block ack inactivity timeout won't be used.",
-                   UintegerValue (0),
-                   MakeUintegerAccessor (&RegularWifiMac::SetViBlockAckInactivityTimeout),
-                   MakeUintegerChecker<uint16_t> ())
-    .AddAttribute ("BE_BlockAckInactivityTimeout",
-                   "Represents max time (blocks of 1024 microseconds) allowed for block ack"
-                   "inactivity for AC_BE. If this value isn't equal to 0 a timer start after that a"
-                   "block ack setup is completed and will be reset every time that a block ack"
-                   "frame is received. If this value is 0, block ack inactivity timeout won't be used.",
-                   UintegerValue (0),
-                   MakeUintegerAccessor (&RegularWifiMac::SetBeBlockAckInactivityTimeout),
-                   MakeUintegerChecker<uint16_t> ())
-    .AddAttribute ("BK_BlockAckInactivityTimeout",
-                   "Represents max time (blocks of 1024 microseconds) allowed for block ack"
-                   "inactivity for AC_BK. If this value isn't equal to 0 a timer start after that a"
-                   "block ack setup is completed and will be reset every time that a block ack"
-                   "frame is received. If this value is 0, block ack inactivity timeout won't be used.",
-                   UintegerValue (0),
-                   MakeUintegerAccessor (&RegularWifiMac::SetBkBlockAckInactivityTimeout),
-                   MakeUintegerChecker<uint16_t> ())
-    .AddAttribute ("ShortSlotTimeSupported",
-                   "Whether or not short slot time is supported (only used by ERP APs or STAs).",
-                   BooleanValue (true),
-                   MakeBooleanAccessor (&RegularWifiMac::SetShortSlotTimeSupported,
-                                        &RegularWifiMac::GetShortSlotTimeSupported),
-                   MakeBooleanChecker ())
-    .AddAttribute ("Txop",
-                   "The Txop object.",
-                   PointerValue (),
-                   MakePointerAccessor (&RegularWifiMac::GetTxop),
-                   MakePointerChecker<Txop> ())
-    .AddAttribute ("VO_Txop",
-                   "Queue that manages packets belonging to AC_VO access class.",
-                   PointerValue (),
-                   MakePointerAccessor (&RegularWifiMac::GetVOQueue),
-                   MakePointerChecker<QosTxop> ())
-    .AddAttribute ("VI_Txop",
-                   "Queue that manages packets belonging to AC_VI access class.",
-                   PointerValue (),
-                   MakePointerAccessor (&RegularWifiMac::GetVIQueue),
-                   MakePointerChecker<QosTxop> ())
-    .AddAttribute ("BE_Txop",
-                   "Queue that manages packets belonging to AC_BE access class.",
-                   PointerValue (),
-                   MakePointerAccessor (&RegularWifiMac::GetBEQueue),
-                   MakePointerChecker<QosTxop> ())
-    .AddAttribute ("BK_Txop",
-                   "Queue that manages packets belonging to AC_BK access class.",
-                   PointerValue (),
-                   MakePointerAccessor (&RegularWifiMac::GetBKQueue),
-                   MakePointerChecker<QosTxop> ())
-    .AddTraceSource ("TxOkHeader",
-                     "The header of successfully transmitted packet.",
-                     MakeTraceSourceAccessor (&RegularWifiMac::m_txOkCallback),
-                     "ns3::WifiMacHeader::TracedCallback",
-                     TypeId::OBSOLETE,
-                     "Use the AckedMpdu trace instead.")
-    .AddTraceSource ("TxErrHeader",
-                     "The header of unsuccessfully transmitted packet.",
-                     MakeTraceSourceAccessor (&RegularWifiMac::m_txErrCallback),
-                     "ns3::WifiMacHeader::TracedCallback",
-                     TypeId::OBSOLETE,
-                     "Depending on the failure type, use the NAckedMpdu trace, the "
-                     "DroppedMpdu trace or one of the traces associated with TX timeouts.")
-    .AddTraceSource ("AckedMpdu",
-                     "An MPDU that was successfully acknowledged, via either a "
-                     "Normal Ack or a Block Ack.",
-                     MakeTraceSourceAccessor (&RegularWifiMac::m_ackedMpduCallback),
-                     "ns3::WifiMacQueueItem::TracedCallback")
-    .AddTraceSource ("NAckedMpdu",
-                     "An MPDU that was negatively acknowledged via a Block Ack.",
-                     MakeTraceSourceAccessor (&RegularWifiMac::m_nackedMpduCallback),
-                     "ns3::WifiMacQueueItem::TracedCallback")
-    .AddTraceSource ("DroppedMpdu",
-                     "An MPDU that was dropped for the given reason (see WifiMacDropReason).",
-                     MakeTraceSourceAccessor (&RegularWifiMac::m_droppedMpduCallback),
-                     "ns3::RegularWifiMac::DroppedMpduCallback")
-    .AddTraceSource ("MpduResponseTimeout",
-                     "An MPDU whose response was not received before the timeout, along with "
-                     "an identifier of the type of timeout (see WifiTxTimer::Reason) and the "
-                     "TXVECTOR used to transmit the MPDU. This trace source is fired when a "
-                     "CTS is missing after an RTS or a Normal Ack is missing after an MPDU "
-                     "or after a DL MU PPDU acknowledged in SU format.",
-                     MakeTraceSourceAccessor (&RegularWifiMac::m_mpduResponseTimeoutCallback),
-                     "ns3::RegularWifiMac::MpduResponseTimeoutCallback")
-    .AddTraceSource ("PsduResponseTimeout",
-                     "A PSDU whose response was not received before the timeout, along with "
-                     "an identifier of the type of timeout (see WifiTxTimer::Reason) and the "
-                     "TXVECTOR used to transmit the PSDU. This trace source is fired when a "
-                     "BlockAck is missing after an A-MPDU, a BlockAckReq (possibly in the "
-                     "context of the acknowledgment of a DL MU PPDU in SU format) or a TB PPDU "
-                     "(in the latter case the missing BlockAck is a Multi-STA BlockAck).",
-                     MakeTraceSourceAccessor (&RegularWifiMac::m_psduResponseTimeoutCallback),
-                     "ns3::RegularWifiMac::PsduResponseTimeoutCallback")
-    .AddTraceSource ("PsduMapResponseTimeout",
-                     "A PSDU map for which not all the responses were received before the timeout, "
-                     "along with an identifier of the type of timeout (see WifiTxTimer::Reason), "
-                     "the set of MAC addresses of the stations that did not respond and the total "
-                     "number of stations that had to respond. This trace source is fired when not "
-                     "all the addressed stations responded to an MU-BAR Trigger frame (either sent as "
-                     "a SU frame or aggregated to PSDUs in the DL MU PPDU), a Basic Trigger Frame or "
-                     "a BSRP Trigger Frame.",
-                     MakeTraceSourceAccessor (&RegularWifiMac::m_psduMapResponseTimeoutCallback),
-                     "ns3::RegularWifiMac::PsduMapResponseTimeoutCallback")
-  ;
-  return tid;
-}
-
-void
-RegularWifiMac::ConfigureStandard (WifiStandard standard)
-{
-  NS_LOG_FUNCTION (this << standard);
-  uint32_t cwmin = 0;
-  uint32_t cwmax = 0;
-  switch (standard)
-    {
-    case WIFI_STANDARD_80211n_5GHZ:
-    case WIFI_STANDARD_80211ac:
-    case WIFI_STANDARD_80211ax_5GHZ:
-    case WIFI_STANDARD_80211ax_6GHZ:
-      {
-        SetQosSupported (true);
-        cwmin = 15;
-        cwmax = 1023;
-        break;
-      }
-    case WIFI_STANDARD_80211ax_2_4GHZ:
-    case WIFI_STANDARD_80211n_2_4GHZ:
-      {
-        SetQosSupported (true);
-      }
-    case WIFI_STANDARD_80211g:
-      SetErpSupported (true);
-    case WIFI_STANDARD_80211a:
-    case WIFI_STANDARD_80211p:
-      cwmin = 15;
-      cwmax = 1023;
-      break;
-    case WIFI_STANDARD_80211b:
-      SetDsssSupported (true);
-      cwmin = 31;
-      cwmax = 1023;
-      break;
-    default:
-      NS_FATAL_ERROR ("Unsupported WifiPhyStandard in RegularWifiMac::FinishConfigureStandard ()");
-    }
-
-  SetupFrameExchangeManager ();
-  ConfigureContentionWindow (cwmin, cwmax);
-}
-
-void
-RegularWifiMac::ConfigureContentionWindow (uint32_t cwMin, uint32_t cwMax)
-{
-  bool isDsssOnly = m_dsssSupported && !m_erpSupported;
-  //The special value of AC_BE_NQOS which exists in the Access
-  //Category enumeration allows us to configure plain old DCF.
-  ConfigureDcf (m_txop, cwMin, cwMax, isDsssOnly, AC_BE_NQOS);
-
-  //Now we configure the EDCA functions
-  for (EdcaQueues::const_iterator i = m_edca.begin (); i != m_edca.end (); ++i)
-    {
-      ConfigureDcf (i->second, cwMin, cwMax, isDsssOnly, i->first);
-    }
-}
-
-uint32_t
-RegularWifiMac::GetMaxAmpduSize (AcIndex ac) const
-{
-  uint32_t maxSize = 0;
-  switch (ac)
-    {
-      case AC_BE:
-        maxSize = m_beMaxAmpduSize;
-        break;
-      case AC_BK:
-        maxSize = m_bkMaxAmpduSize;
-        break;
-      case AC_VI:
-        maxSize = m_viMaxAmpduSize;
-        break;
-      case AC_VO:
-        maxSize = m_voMaxAmpduSize;
-        break;
-      default:
-        NS_ABORT_MSG ("Unknown AC " << ac);
-        return 0;
-    }
-  return maxSize;
-}
-
-uint16_t
-RegularWifiMac::GetMaxAmsduSize (AcIndex ac) const
-{
-  uint16_t maxSize = 0;
-  switch (ac)
-    {
-      case AC_BE:
-        maxSize = m_beMaxAmsduSize;
-        break;
-      case AC_BK:
-        maxSize = m_bkMaxAmsduSize;
-        break;
-      case AC_VI:
-        maxSize = m_viMaxAmsduSize;
-        break;
-      case AC_VO:
-        maxSize = m_voMaxAmsduSize;
-        break;
-      default:
-        NS_ABORT_MSG ("Unknown AC " << ac);
-        return 0;
-    }
-  return maxSize;
-}
-
-} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/regular-wifi-mac.h ns-3.36/src/wifi/model/regular-wifi-mac.h
--- ns-3.35/src/wifi/model/regular-wifi-mac.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/regular-wifi-mac.h	1969-12-31 16:00:00.000000000 -0800
@@ -1,535 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2008 INRIA
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
- */
-
-#ifndef REGULAR_WIFI_MAC_H
-#define REGULAR_WIFI_MAC_H
-
-#include "wifi-mac.h"
-#include "qos-txop.h"
-#include "ssid.h"
-#include <set>
-#include <unordered_map>
-
-namespace ns3 {
-
-class MacRxMiddle;
-class MacTxMiddle;
-class ChannelAccessManager;
-class ExtendedCapabilities;
-class FrameExchangeManager;
-class WifiPsdu;
-class WifiMacQueue;
-enum WifiTxTimerReason : uint8_t;
-
-typedef std::unordered_map <uint16_t /* staId */, Ptr<WifiPsdu> /* PSDU */> WifiPsduMap;
-
-/**
- * \brief base class for all MAC-level wifi objects.
- * \ingroup wifi
- *
- * This class encapsulates all the low-level MAC functionality and all the
- * high-level MAC functionality (association/disassociation state machines).
- *
- */
-class RegularWifiMac : public WifiMac
-{
-public:
-  /**
-   * \brief Get the type ID.
-   * \return the object TypeId
-   */
-  static TypeId GetTypeId (void);
-
-  RegularWifiMac ();
-  virtual ~RegularWifiMac ();
-
-  // Implementations of pure virtual methods.
-  void SetShortSlotTimeSupported (bool enable) override;
-  void SetSsid (Ssid ssid) override;
-  void SetAddress (Mac48Address address) override;
-  void SetPromisc (void) override;
-  bool GetShortSlotTimeSupported (void) const override;
-  Ssid GetSsid (void) const override;
-  Mac48Address GetAddress (void) const override;
-  Mac48Address GetBssid (void) const override;
-  void Enqueue (Ptr<Packet> packet, Mac48Address to, Mac48Address from) override;
-  bool SupportsSendFrom (void) const override;
-  void SetWifiPhy (const Ptr<WifiPhy> phy) override;
-  Ptr<WifiPhy> GetWifiPhy (void) const override;
-  void ResetWifiPhy (void) override;
-  void SetWifiRemoteStationManager (const Ptr<WifiRemoteStationManager> stationManager) override;
-  void ConfigureStandard (WifiStandard standard) override;
-  TypeOfStation GetTypeOfStation (void) const override;
-  void SetForwardUpCallback (ForwardUpCallback upCallback) override;
-  void SetLinkUpCallback (Callback<void> linkUp) override;
-  void SetLinkDownCallback (Callback<void> linkDown) override;
-  Ptr<WifiRemoteStationManager> GetWifiRemoteStationManager (void) const override;
-
-  // Should be implemented by child classes
-  void Enqueue (Ptr<Packet> packet, Mac48Address to) override = 0;
-
-  /**
-   * Get the Frame Exchange Manager
-   *
-   * \return the Frame Exchange Manager
-   */
-  Ptr<FrameExchangeManager> GetFrameExchangeManager (void) const;
-
-  /**
-   * Enable or disable CTS-to-self feature.
-   *
-   * \param enable true if CTS-to-self is to be supported,
-   *               false otherwise
-   */
-  void SetCtsToSelfSupported (bool enable);
-  /**
-   * \param bssid the BSSID of the network that this device belongs to.
-   */
-  void SetBssid (Mac48Address bssid);
-
-  /**
-   * Accessor for the DCF object
-   *
-   * \return a smart pointer to Txop
-   */
-  Ptr<Txop> GetTxop (void) const;
-  /**
-   * Accessor for a specified EDCA object
-   *
-   * \param ac the Access Category
-   * \return a smart pointer to a QosTxop
-   */
-  Ptr<QosTxop> GetQosTxop (AcIndex ac) const;
-  /**
-   * Accessor for a specified EDCA object
-   *
-   * \param tid the Traffic ID
-   * \return a smart pointer to a QosTxop
-   */
-  Ptr<QosTxop> GetQosTxop (uint8_t tid) const;
-  /**
-   * Get the wifi MAC queue of the (Qos)Txop associated with the given AC.
-   *
-   * \param ac the given Access Category
-   * \return the wifi MAC queue of the (Qos)Txop associated with the given AC
-   */
-  virtual Ptr<WifiMacQueue> GetTxopQueue (AcIndex ac) const;
-
-  /**
-   * Return whether the device supports QoS.
-   *
-   * \return true if QoS is supported, false otherwise
-   */
-  bool GetQosSupported () const;
-  /**
-   * Return whether the device supports ERP.
-   *
-   * \return true if ERP is supported, false otherwise
-   */
-  bool GetErpSupported () const;
-  /**
-   * Return whether the device supports DSSS.
-   *
-   * \return true if DSSS is supported, false otherwise
-   */
-  bool GetDsssSupported () const;
-  /**
-   * Return whether the device supports HT.
-   *
-   * \return true if HT is supported, false otherwise
-   */
-  bool GetHtSupported () const;
-  /**
-   * Return whether the device supports VHT.
-   *
-   * \return true if VHT is supported, false otherwise
-   */
-  bool GetVhtSupported () const;
-  /**
-   * Return whether the device supports HE.
-   *
-   * \return true if HE is supported, false otherwise
-   */
-  bool GetHeSupported () const;
-
-  /**
-   * Return the extended capabilities of the device.
-   *
-   * \return the extended capabilities that we support
-   */
-  ExtendedCapabilities GetExtendedCapabilities (void) const;
-  /**
-   * Return the HT capabilities of the device.
-   *
-   * \return the HT capabilities that we support
-   */
-  HtCapabilities GetHtCapabilities (void) const;
-  /**
-   * Return the VHT capabilities of the device.
-   *
-   * \return the VHT capabilities that we support
-   */
-  VhtCapabilities GetVhtCapabilities (void) const;
-  /**
-   * Return the HE capabilities of the device.
-   *
-   * \return the HE capabilities that we support
-   */
-  HeCapabilities GetHeCapabilities (void) const;
-
-  /**
-   * Return the maximum A-MPDU size of the given Access Category.
-   *
-   * \param ac Access Category index
-   * \return the maximum A-MPDU size
-   */
-  uint32_t GetMaxAmpduSize (AcIndex ac) const;
-  /**
-   * Return the maximum A-MSDU size of the given Access Category.
-   *
-   * \param ac Access Category index
-   * \return the maximum A-MSDU size
-   */
-  uint16_t GetMaxAmsduSize (AcIndex ac) const;
-
-protected:
-  void DoInitialize () override;
-  void DoDispose () override;
-  void SetTypeOfStation (TypeOfStation type) override;
-
-  Ptr<MacRxMiddle> m_rxMiddle;                      //!< RX middle (defragmentation etc.)
-  Ptr<MacTxMiddle> m_txMiddle;                      //!< TX middle (aggregation etc.)
-  Ptr<ChannelAccessManager> m_channelAccessManager; //!< channel access manager
-  Ptr<WifiPhy> m_phy;                               //!< Wifi PHY
-  Ptr<FrameExchangeManager> m_feManager;            //!< Frame Exchange Manager
-
-  Ptr<WifiRemoteStationManager> m_stationManager; //!< Remote station manager (rate control, RTS/CTS/fragmentation thresholds etc.)
-
-  ForwardUpCallback m_forwardUp; //!< Callback to forward packet up the stack
-  Callback<void> m_linkUp;       //!< Callback when a link is up
-  Callback<void> m_linkDown;     //!< Callback when a link is down
-
-  Ssid m_ssid; //!< Service Set ID (SSID)
-
-  /** This holds a pointer to the TXOP instance for this WifiMac - used
-  for transmission of frames to non-QoS peers. */
-  Ptr<Txop> m_txop;
-
-  /** This type defines a mapping between an Access Category index,
-  and a pointer to the corresponding channel access function */
-  typedef std::map<AcIndex, Ptr<QosTxop> > EdcaQueues;
-
-  /** This is a map from Access Category index to the corresponding
-  channel access function */
-  EdcaQueues m_edca;
-
-  /**
-   * Accessor for the AC_VO channel access function
-   *
-   * \return a smart pointer to QosTxop
-   */
-  Ptr<QosTxop> GetVOQueue (void) const;
-  /**
-   * Accessor for the AC_VI channel access function
-   *
-   * \return a smart pointer to QosTxop
-   */
-  Ptr<QosTxop> GetVIQueue (void) const;
-  /**
-   * Accessor for the AC_BE channel access function
-   *
-   * \return a smart pointer to QosTxop
-   */
-  Ptr<QosTxop> GetBEQueue (void) const;
-  /**
-   * Accessor for the AC_BK channel access function
-   *
-   * \return a smart pointer to QosTxop
-   */
-  Ptr<QosTxop> GetBKQueue (void) const;
-
-  /**
-   * \param cwMin the minimum contention window size
-   * \param cwMax the maximum contention window size
-   *
-   * This method is called to set the minimum and the maximum
-   * contention window size.
-   */
-  void ConfigureContentionWindow (uint32_t cwMin, uint32_t cwMax);
-
-  /**
-   * This method acts as the MacRxMiddle receive callback and is
-   * invoked to notify us that a frame has been received. The
-   * implementation is intended to capture logic that is going to be
-   * common to all (or most) derived classes. Specifically, handling
-   * of Block Ack management frames is dealt with here.
-   *
-   * This method will need, however, to be overridden by derived
-   * classes so that they can perform their data handling before
-   * invoking the base version.
-   *
-   * \param mpdu the MPDU that has been received.
-   */
-  virtual void Receive (Ptr<WifiMacQueueItem> mpdu);
-
-  /**
-   * Forward the packet up to the device.
-   *
-   * \param packet the packet that we are forwarding up to the device
-   * \param from the address of the source
-   * \param to the address of the destination
-   */
-  void ForwardUp (Ptr<const Packet> packet, Mac48Address from, Mac48Address to);
-
-  /**
-   * This method can be called to de-aggregate an A-MSDU and forward
-   * the constituent packets up the stack.
-   *
-   * \param mpdu the MPDU containing the A-MSDU.
-   */
-  virtual void DeaggregateAmsduAndForward (Ptr<WifiMacQueueItem> mpdu);
-
-  /**
-   * Enable or disable QoS support for the device.
-   *
-   * \param enable whether QoS is supported
-   */
-  virtual void SetQosSupported (bool enable);
-
-  /**
-   * Create a Frame Exchange Manager depending on the supported version
-   * of the standard.
-   */
-  void SetupFrameExchangeManager (void);
-
-  /**
-   * Enable or disable ERP support for the device.
-   *
-   * \param enable whether ERP is supported
-   */
-  void SetErpSupported (bool enable);
-
-  /**
-   * Enable or disable DSSS support for the device.
-   *
-   * \param enable whether DSSS is supported
-   */
-  void SetDsssSupported (bool enable);
-
-private:
-  /// type conversion operator
-  RegularWifiMac (const RegularWifiMac &);
-  /**
-   * assignment operator
-   *
-   * \param mac the RegularWifiMac to assign
-   * \returns the assigned value
-   */
-  RegularWifiMac & operator= (const RegularWifiMac & mac);
-
-  /**
-   * This method is a private utility invoked to configure the channel
-   * access function for the specified Access Category.
-   *
-   * \param ac the Access Category of the queue to initialise.
-   */
-  void SetupEdcaQueue (AcIndex ac);
-
-  /**
-   * Set the block ack threshold for AC_VO.
-   *
-   * \param threshold the block ack threshold for AC_VO.
-   */
-  void SetVoBlockAckThreshold (uint8_t threshold);
-  /**
-   * Set the block ack threshold for AC_VI.
-   *
-   * \param threshold the block ack threshold for AC_VI.
-   */
-  void SetViBlockAckThreshold (uint8_t threshold);
-  /**
-   * Set the block ack threshold for AC_BE.
-   *
-   * \param threshold the block ack threshold for AC_BE.
-   */
-  void SetBeBlockAckThreshold (uint8_t threshold);
-  /**
-   * Set the block ack threshold for AC_BK.
-   *
-   * \param threshold the block ack threshold for AC_BK.
-   */
-  void SetBkBlockAckThreshold (uint8_t threshold);
-
-  /**
-   * Set VO block ack inactivity timeout.
-   *
-   * \param timeout the VO block ack inactivity timeout.
-   */
-  void SetVoBlockAckInactivityTimeout (uint16_t timeout);
-  /**
-   * Set VI block ack inactivity timeout.
-   *
-   * \param timeout the VI block ack inactivity timeout.
-   */
-  void SetViBlockAckInactivityTimeout (uint16_t timeout);
-  /**
-   * Set BE block ack inactivity timeout.
-   *
-   * \param timeout the BE block ack inactivity timeout.
-   */
-  void SetBeBlockAckInactivityTimeout (uint16_t timeout);
-  /**
-   * Set BK block ack inactivity timeout.
-   *
-   * \param timeout the BK block ack inactivity timeout.
-   */
-  void SetBkBlockAckInactivityTimeout (uint16_t timeout);
-
-  TypeOfStation m_typeOfStation;                        //!< the type of station
-
-  /**
-   * This Boolean is set \c true iff this WifiMac is to model
-   * 802.11e/WMM style Quality of Service. It is exposed through the
-   * attribute system.
-   *
-   * At the moment, this flag is the sole selection between QoS and
-   * non-QoS operation for the STA (whether IBSS, AP, or
-   * non-AP). Ultimately, we will want a QoS-enabled STA to be able to
-   * fall back to non-QoS operation with a non-QoS peer. This'll
-   * require further intelligence - i.e., per-association QoS
-   * state. Having a big switch seems like a good intermediate stage,
-   * however.
-   */
-  bool m_qosSupported;
-  /**
-   * This Boolean is set \c true iff this WifiMac is to model
-   * 802.11g. It is exposed through the attribute system.
-   */
-  bool m_erpSupported;
-  /**
-   * This Boolean is set \c true iff this WifiMac is to model
-   * 802.11b. It is exposed through the attribute system.
-   */
-  bool m_dsssSupported;
-
-  Mac48Address m_address;   ///< MAC address of this station
-  Mac48Address m_bssid;     ///< the BSSID
-
-  uint16_t m_voMaxAmsduSize; ///< maximum A-MSDU size for AC_VO (in bytes)
-  uint16_t m_viMaxAmsduSize; ///< maximum A-MSDU size for AC_VI (in bytes)
-  uint16_t m_beMaxAmsduSize; ///< maximum A-MSDU size for AC_BE (in bytes)
-  uint16_t m_bkMaxAmsduSize; ///< maximum A-MSDU size for AC_BK (in bytes)
-
-  uint32_t m_voMaxAmpduSize; ///< maximum A-MPDU size for AC_VO (in bytes)
-  uint32_t m_viMaxAmpduSize; ///< maximum A-MPDU size for AC_VI (in bytes)
-  uint32_t m_beMaxAmpduSize; ///< maximum A-MPDU size for AC_BE (in bytes)
-  uint32_t m_bkMaxAmpduSize; ///< maximum A-MPDU size for AC_BK (in bytes)
-
-  TracedCallback<const WifiMacHeader &> m_txOkCallback; ///< transmit OK callback
-  TracedCallback<const WifiMacHeader &> m_txErrCallback; ///< transmit error callback
-
-  /// TracedCallback for acked/nacked MPDUs typedef
-  typedef TracedCallback<Ptr<const WifiMacQueueItem>> MpduTracedCallback;
-
-  MpduTracedCallback m_ackedMpduCallback;  ///< ack'ed MPDU callback
-  MpduTracedCallback m_nackedMpduCallback; ///< nack'ed MPDU callback
-
-  /**
-   * TracedCallback signature for MPDU drop events.
-   *
-   * \param reason the reason why the MPDU was dropped (\see WifiMacDropReason)
-   * \param mpdu the dropped MPDU
-   */
-  typedef void (* DroppedMpduCallback)(WifiMacDropReason reason, Ptr<const WifiMacQueueItem> mpdu);
-
-  /// TracedCallback for MPDU drop events typedef
-  typedef TracedCallback<WifiMacDropReason, Ptr<const WifiMacQueueItem>> DroppedMpduTracedCallback;
-
-  /**
-   * This trace indicates that an MPDU was dropped for the given reason.
-   */
-  DroppedMpduTracedCallback m_droppedMpduCallback;
-
-  /**
-   * TracedCallback signature for MPDU response timeout events.
-   *
-   * \param reason the reason why the timer was started
-   * \param mpdu the MPDU whose response was not received before the timeout
-   * \param txVector the TXVECTOR used to transmit the MPDU
-   */
-  typedef void (* MpduResponseTimeoutCallback)(uint8_t reason, Ptr<const WifiMacQueueItem> mpdu,
-                                               const WifiTxVector& txVector);
-
-  /// TracedCallback for MPDU response timeout events typedef
-  typedef TracedCallback<uint8_t, Ptr<const WifiMacQueueItem>, const WifiTxVector&> MpduResponseTimeoutTracedCallback;
-
-  /**
-   * MPDU response timeout traced callback.
-   * This trace source is fed by a WifiTxTimer object.
-   */
-  MpduResponseTimeoutTracedCallback m_mpduResponseTimeoutCallback;
-
-  /**
-   * TracedCallback signature for PSDU response timeout events.
-   *
-   * \param reason the reason why the timer was started
-   * \param psdu the PSDU whose response was not received before the timeout
-   * \param txVector the TXVECTOR used to transmit the PSDU
-   */
-  typedef void (* PsduResponseTimeoutCallback)(uint8_t reason, Ptr<const WifiPsdu> psdu,
-                                               const WifiTxVector& txVector);
-
-  /// TracedCallback for PSDU response timeout events typedef
-  typedef TracedCallback<uint8_t, Ptr<const WifiPsdu>, const WifiTxVector&> PsduResponseTimeoutTracedCallback;
-
-  /**
-   * PSDU response timeout traced callback.
-   * This trace source is fed by a WifiTxTimer object.
-   */
-  PsduResponseTimeoutTracedCallback m_psduResponseTimeoutCallback;
-
-  /**
-   * TracedCallback signature for PSDU map response timeout events.
-   *
-   * \param reason the reason why the timer was started
-   * \param psduMap the PSDU map for which not all responses were received before the timeout
-   * \param missingStations the MAC addresses of the stations that did not respond
-   * \param nTotalStations the total number of stations that had to respond
-   */
-  typedef void (* PsduMapResponseTimeoutCallback)(uint8_t reason, WifiPsduMap* psduMap,
-                                                  const std::set<Mac48Address>* missingStations,
-                                                  std::size_t nTotalStations);
-
-  /// TracedCallback for PSDU map response timeout events typedef
-  typedef TracedCallback<uint8_t, WifiPsduMap*, const std::set<Mac48Address>*, std::size_t> PsduMapResponseTimeoutTracedCallback;
-
-  /**
-   * PSDU map response timeout traced callback.
-   * This trace source is fed by a WifiTxTimer object.
-   */
-  PsduMapResponseTimeoutTracedCallback m_psduMapResponseTimeoutCallback;
-
-  bool m_shortSlotTimeSupported; ///< flag whether short slot time is supported
-  bool m_ctsToSelfSupported;     ///< flag indicating whether CTS-To-Self is supported
-};
-
-} //namespace ns3
-
-#endif /* REGULAR_WIFI_MAC_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/spectrum-wifi-phy.cc ns-3.36/src/wifi/model/spectrum-wifi-phy.cc
--- ns-3.35/src/wifi/model/spectrum-wifi-phy.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/spectrum-wifi-phy.cc	2022-04-30 18:23:58.214735300 -0700
@@ -161,7 +161,7 @@
             }
         }
     }
-  if (GetPhyStandard () >= WIFI_PHY_STANDARD_80211ax)
+  if (GetStandard () >= WIFI_STANDARD_80211ax)
     {
       // For a given RU type, some RUs over a channel occupy the same tones as
       // the corresponding RUs over a subchannel, while some others not. For instance,
@@ -236,43 +236,10 @@
 }
 
 void
-SpectrumWifiPhy::SetChannelNumber (uint8_t nch)
+SpectrumWifiPhy::DoChannelSwitch (void)
 {
-  NS_LOG_FUNCTION (this << +nch);
-  WifiPhy::SetChannelNumber (nch);
-  if (IsInitialized ())
-    {
-      ResetSpectrumModel ();
-    }
-}
-
-void
-SpectrumWifiPhy::SetFrequency (uint16_t freq)
-{
-  NS_LOG_FUNCTION (this << freq);
-  WifiPhy::SetFrequency (freq);
-  if (IsInitialized ())
-    {
-      ResetSpectrumModel ();
-    }
-}
-
-void
-SpectrumWifiPhy::SetChannelWidth (uint16_t channelwidth)
-{
-  NS_LOG_FUNCTION (this << channelwidth);
-  WifiPhy::SetChannelWidth (channelwidth);
-  if (IsInitialized ())
-    {
-      ResetSpectrumModel ();
-    }
-}
-
-void
-SpectrumWifiPhy::ConfigureStandardAndBand (WifiPhyStandard standard, WifiPhyBand band)
-{
-  NS_LOG_FUNCTION (this << standard << band);
-  WifiPhy::ConfigureStandardAndBand (standard, band);
+  NS_LOG_FUNCTION (this);
+  WifiPhy::DoChannelSwitch ();
   if (IsInitialized ())
     {
       ResetSpectrumModel ();
@@ -337,8 +304,8 @@
       rxPowerW.insert ({filteredBand, rxPowerPerBandW});
       NS_LOG_DEBUG ("Signal power received after antenna gain for 20 MHz channel band " << +i << ": " << rxPowerPerBandW << " W (" << WToDbm (rxPowerPerBandW) << " dBm)");
     }
-  
-  if (GetPhyStandard () >= WIFI_PHY_STANDARD_80211ax)
+
+  if (GetStandard () >= WIFI_STANDARD_80211ax)
     {
       NS_ASSERT (!m_ruBands[channelWidth].empty ());
       for (const auto& bandRuPair : m_ruBands[channelWidth])
@@ -356,7 +323,7 @@
   Ptr<WifiSpectrumSignalParameters> wifiRxParams = DynamicCast<WifiSpectrumSignalParameters> (rxParams);
 
   // Log the signal arrival to the trace source
-  m_signalCb (wifiRxParams ? true : false, senderNodeId, WToDbm (totalRxPowerW), rxDuration);
+  m_signalCb (wifiRxParams, senderNodeId, WToDbm (totalRxPowerW), rxDuration);
 
   if (wifiRxParams == 0)
     {
@@ -389,13 +356,6 @@
   // does not overlap with the receiver's primary20 channel
   if (wifiRxParams->txPhy != 0)
     {
-      Ptr<WifiNetDevice> dev = DynamicCast<WifiNetDevice> (rxParams->txPhy->GetDevice ());
-      NS_ASSERT (dev != 0);
-      Ptr<WifiPhy> txPhy = dev->GetPhy ();
-      NS_ASSERT (txPhy != 0);
-      uint16_t txChannelWidth = wifiRxParams->ppdu->GetTxVector ().GetChannelWidth ();
-      uint16_t txCenterFreq = txPhy->GetOperatingChannel ().GetPrimaryChannelCenterFrequency (txChannelWidth);
-
       // if the channel width is a multiple of 20 MHz, then we consider the primary20 channel
       uint16_t width = (GetChannelWidth () % 20 == 0 ? 20 : GetChannelWidth ());
       uint16_t p20MinFreq =
@@ -403,7 +363,7 @@
       uint16_t p20MaxFreq =
           GetOperatingChannel ().GetPrimaryChannelCenterFrequency (width) + width / 2;
 
-      if (!wifiRxParams->ppdu->CanBeReceived (txCenterFreq, p20MinFreq, p20MaxFreq))
+      if (!wifiRxParams->ppdu->CanBeReceived (wifiRxParams->txCenterFreq, p20MinFreq, p20MaxFreq))
         {
           NS_LOG_INFO ("Cannot receive the PPDU, consider it as interference");
           m_interference.Add (wifiRxParams->ppdu, wifiRxParams->ppdu->GetTxVector (),
@@ -418,8 +378,8 @@
   StartReceivePreamble (ppdu, rxPowerW, rxDuration);
 }
 
-Ptr<AntennaModel>
-SpectrumWifiPhy::GetRxAntenna (void) const
+Ptr<Object>
+SpectrumWifiPhy::GetAntenna (void) const
 {
   return m_antenna;
 }
@@ -464,17 +424,17 @@
 SpectrumWifiPhy::GetBandBandwidth (void) const
 {
   uint32_t bandBandwidth = 0;
-  switch (GetPhyStandard ())
+  switch (GetStandard ())
     {
-    case WIFI_PHY_STANDARD_80211a:
-    case WIFI_PHY_STANDARD_80211g:
-    case WIFI_PHY_STANDARD_80211b:
-    case WIFI_PHY_STANDARD_80211n:
-    case WIFI_PHY_STANDARD_80211ac:
+    case WIFI_STANDARD_80211a:
+    case WIFI_STANDARD_80211g:
+    case WIFI_STANDARD_80211b:
+    case WIFI_STANDARD_80211n:
+    case WIFI_STANDARD_80211ac:
       // Use OFDM subcarrier width of 312.5 KHz as band granularity
       bandBandwidth = 312500;
       break;
-    case WIFI_PHY_STANDARD_80211p:
+    case WIFI_STANDARD_80211p:
       if (GetChannelWidth () == 5)
         {
           // Use OFDM subcarrier width of 78.125 KHz as band granularity
@@ -486,12 +446,12 @@
           bandBandwidth = 156250;
         }
       break;
-    case WIFI_PHY_STANDARD_80211ax:
+    case WIFI_STANDARD_80211ax:
       // Use OFDM subcarrier width of 78.125 KHz as band granularity
       bandBandwidth = 78125;
       break;
     default:
-      NS_FATAL_ERROR ("Standard unknown: " << GetPhyStandard ());
+      NS_FATAL_ERROR ("Standard unknown: " << GetStandard ());
       break;
     }
   return bandBandwidth;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/spectrum-wifi-phy.h ns-3.36/src/wifi/model/spectrum-wifi-phy.h
--- ns-3.35/src/wifi/model/spectrum-wifi-phy.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/spectrum-wifi-phy.h	2022-04-30 18:23:58.214735300 -0700
@@ -100,7 +100,7 @@
    *                SpectrumSignalParameters (in case any objects downstream of the
    *                SpectrumWifiPhy wish to adjust signal properties based on the
    *                transmitted antenna model.  This antenna is also used when
-   *                the underlying WifiSpectrumPhyInterface::GetRxAntenna() method
+   *                the underlying WifiSpectrumPhyInterface::GetAntenna() method
    *                is called.
    *
    * Note:  this method may be split into separate SetTx and SetRx
@@ -112,7 +112,7 @@
    *
    * \return the AntennaModel used for reception
    */
-  Ptr<AntennaModel> GetRxAntenna (void) const;
+  Ptr<Object> GetAntenna (void) const;
   /**
    * \return the SpectrumModel that this SpectrumPhy expects to be used
    *         for all SpectrumValues that are passed to StartRx. If 0 is
@@ -135,12 +135,9 @@
    */
   typedef void (* SignalArrivalCallback) (bool signalType, uint32_t senderNodeId, double rxPower, Time duration);
 
-  // The following four methods call to the base WifiPhy class method
-  // but also generate a new SpectrumModel if called during runtime
-  void SetChannelNumber (uint8_t id) override;
-  void SetFrequency (uint16_t freq) override;
-  void SetChannelWidth (uint16_t channelwidth) override;
-  void ConfigureStandardAndBand (WifiPhyStandard standard, WifiPhyBand band) override;
+  // The following method calls the base WifiPhy class method
+  // but also generates a new SpectrumModel if called during runtime
+  void DoChannelSwitch (void) override;
 
   /**
    * This function is sending the signal to the Spectrum channel
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/sta-wifi-mac.cc ns-3.36/src/wifi/model/sta-wifi-mac.cc
--- ns-3.35/src/wifi/model/sta-wifi-mac.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/sta-wifi-mac.cc	2022-04-30 18:23:58.214735300 -0700
@@ -23,6 +23,7 @@
 #include "ns3/log.h"
 #include "ns3/packet.h"
 #include "ns3/simulator.h"
+#include "qos-txop.h"
 #include "sta-wifi-mac.h"
 #include "wifi-phy.h"
 #include "mgt-headers.h"
@@ -41,7 +42,7 @@
 StaWifiMac::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::StaWifiMac")
-    .SetParent<RegularWifiMac> ()
+    .SetParent<WifiMac> ()
     .SetGroupName ("Wifi")
     .AddConstructor<StaWifiMac> ()
     .AddAttribute ("ProbeRequestTimeout", "The duration to actively probe the channel.",
@@ -141,8 +142,8 @@
 StaWifiMac::SetWifiPhy (const Ptr<WifiPhy> phy)
 {
   NS_LOG_FUNCTION (this << phy);
-  RegularWifiMac::SetWifiPhy (phy);
-  m_phy->SetCapabilitiesChangedCallback (MakeCallback (&StaWifiMac::PhyCapabilitiesChanged, this));
+  WifiMac::SetWifiPhy (phy);
+  GetWifiPhy ()->SetCapabilitiesChangedCallback (MakeCallback (&StaWifiMac::PhyCapabilitiesChanged, this));
 }
 
 void
@@ -175,11 +176,21 @@
     }
   packet->AddHeader (probe);
 
-  //The standard is not clear on the correct queue for management
-  //frames if we are a QoS AP. The approach taken here is to always
-  //use the non-QoS for these regardless of whether we have a QoS
-  //association or not.
-  m_txop->Queue (packet, hdr);
+  if (!GetQosSupported ())
+    {
+      GetTxop ()->Queue (packet, hdr);
+    }
+  // "A QoS STA that transmits a Management frame determines access category used
+  // for medium access in transmission of the Management frame as follows
+  // (If dot11QMFActivated is false or not present)
+  // â€” If the Management frame is individually addressed to a non-QoS STA, category
+  //   AC_BE should be selected.
+  // â€” If category AC_BE was not selected by the previous step, category AC_VO
+  //   shall be selected." (Sec. 10.2.3.2 of 802.11-2020)
+  else
+    {
+      GetVOQueue ()->Queue (packet, hdr);
+    }
 }
 
 void
@@ -240,11 +251,25 @@
       packet->AddHeader (reassoc);
     }
 
-  //The standard is not clear on the correct queue for management
-  //frames if we are a QoS AP. The approach taken here is to always
-  //use the non-QoS for these regardless of whether we have a QoS
-  //association or not.
-  m_txop->Queue (packet, hdr);
+  if (!GetQosSupported ())
+    {
+      GetTxop ()->Queue (packet, hdr);
+    }
+  // "A QoS STA that transmits a Management frame determines access category used
+  // for medium access in transmission of the Management frame as follows
+  // (If dot11QMFActivated is false or not present)
+  // â€” If the Management frame is individually addressed to a non-QoS STA, category
+  //   AC_BE should be selected.
+  // â€” If category AC_BE was not selected by the previous step, category AC_VO
+  //   shall be selected." (Sec. 10.2.3.2 of 802.11-2020)
+  else if (!GetWifiRemoteStationManager ()->GetQosSupported (GetBssid ()))
+    {
+      GetBEQueue ()->Queue (packet, hdr);
+    }
+  else
+    {
+      GetVOQueue ()->Queue (packet, hdr);
+    }
 
   if (m_assocRequestEvent.IsRunning ())
     {
@@ -389,12 +414,20 @@
   // a frame, wait until the RX is completed (otherwise, crashes may occur if
   // we are receiving a MU frame because its reception requires the STA-ID)
   Time delay = Seconds (0);
-  if (m_phy->IsStateRx ())
+  if (GetWifiPhy ()->IsStateRx ())
     {
-      delay = m_phy->GetDelayUntilIdle ();
+      delay = GetWifiPhy ()->GetDelayUntilIdle ();
     }
-  Simulator::Schedule (delay, &StaWifiMac::SetState, this, UNASSOCIATED);
-  Simulator::Schedule (delay, &StaWifiMac::TryToEnsureAssociated, this);
+  Simulator::Schedule (delay, &StaWifiMac::Disassociated, this);
+}
+
+void
+StaWifiMac::Disassociated (void)
+{
+  NS_LOG_FUNCTION (this);
+  NS_LOG_DEBUG ("Set state to UNASSOCIATED and start scanning");
+  SetState (UNASSOCIATED);
+  TryToEnsureAssociated ();
 }
 
 void
@@ -422,11 +455,17 @@
   return m_state == WAIT_ASSOC_RESP;
 }
 
+bool
+StaWifiMac::CanForwardPacketsTo (Mac48Address to) const
+{
+  return (IsAssociated ());
+}
+
 void
 StaWifiMac::Enqueue (Ptr<Packet> packet, Mac48Address to)
 {
   NS_LOG_FUNCTION (this << packet << to);
-  if (!IsAssociated ())
+  if (!CanForwardPacketsTo (to))
     {
       NotifyTxDrop (packet);
       TryToEnsureAssociated ();
@@ -484,11 +523,11 @@
     {
       //Sanity check that the TID is valid
       NS_ASSERT (tid < 8);
-      m_edca[QosUtilsMapTidToAc (tid)]->Queue (packet, hdr);
+      GetQosTxop (tid)->Queue (packet, hdr);
     }
   else
     {
-      m_txop->Queue (packet, hdr);
+      GetTxop ()->Queue (packet, hdr);
     }
 }
 
@@ -575,7 +614,7 @@
         }
       SupportedRates rates = beacon.GetSupportedRates ();
       bool bssMembershipSelectorMatch = false;
-      auto selectorList = m_phy->GetBssMembershipSelectorList ();
+      auto selectorList = GetWifiPhy ()->GetBssMembershipSelectorList ();
       for (const auto & selector : selectorList)
         {
           if (rates.IsBssMembershipSelectorRate (selector))
@@ -690,7 +729,7 @@
   //Invoke the receive handler of our parent class to deal with any
   //other frames. Specifically, this will handle Block Ack-related
   //Management Action frames.
-  RegularWifiMac::Receive (Create<WifiMacQueueItem> (packet, *hdr));
+  WifiMac::Receive (Create<WifiMacQueueItem> (packet, *hdr));
 }
 
 void
@@ -726,11 +765,11 @@
   SetBssid (bssid);
   CapabilityInformation capabilities = beacon.GetCapabilities ();
   SupportedRates rates = beacon.GetSupportedRates ();
-  for (const auto & mode : m_phy->GetModeList ())
+  for (const auto & mode : GetWifiPhy ()->GetModeList ())
     {
-      if (rates.IsSupportedRate (mode.GetDataRate (m_phy->GetChannelWidth ())))
+      if (rates.IsSupportedRate (mode.GetDataRate (GetWifiPhy ()->GetChannelWidth ())))
         {
-          m_stationManager->AddSupportedMode (apAddr, mode);
+          GetWifiRemoteStationManager ()->AddSupportedMode (apAddr, mode);
         }
     }
   bool isShortPreambleEnabled = capabilities.IsShortPreamble ();
@@ -740,21 +779,21 @@
       isShortPreambleEnabled &= !erpInformation.GetBarkerPreambleMode ();
       if (erpInformation.GetUseProtection () != 0)
         {
-          m_stationManager->SetUseNonErpProtection (true);
+          GetWifiRemoteStationManager ()->SetUseNonErpProtection (true);
         }
       else
         {
-          m_stationManager->SetUseNonErpProtection (false);
+          GetWifiRemoteStationManager ()->SetUseNonErpProtection (false);
         }
       if (capabilities.IsShortSlotTime () == true)
         {
           //enable short slot time
-          m_phy->SetSlot (MicroSeconds (9));
+          GetWifiPhy ()->SetSlot (MicroSeconds (9));
         }
       else
         {
           //disable short slot time
-          m_phy->SetSlot (MicroSeconds (20));
+          GetWifiPhy ()->SetSlot (MicroSeconds (20));
         }
     }
   if (GetQosSupported ())
@@ -770,18 +809,18 @@
           SetEdcaParameters (AC_VI, edcaParameters.GetViCWmin (), edcaParameters.GetViCWmax (), edcaParameters.GetViAifsn (), 32 * MicroSeconds (edcaParameters.GetViTxopLimit ()));
           SetEdcaParameters (AC_VO, edcaParameters.GetVoCWmin (), edcaParameters.GetVoCWmax (), edcaParameters.GetVoAifsn (), 32 * MicroSeconds (edcaParameters.GetVoTxopLimit ()));
         }
-      m_stationManager->SetQosSupport (apAddr, qosSupported);
+      GetWifiRemoteStationManager ()->SetQosSupport (apAddr, qosSupported);
     }
   if (GetHtSupported ())
     {
       HtCapabilities htCapabilities = beacon.GetHtCapabilities ();
       if (!htCapabilities.IsSupportedMcs (0))
         {
-          m_stationManager->RemoveAllSupportedMcs (apAddr);
+          GetWifiRemoteStationManager ()->RemoveAllSupportedMcs (apAddr);
         }
       else
         {
-          m_stationManager->AddStationHtCapabilities (apAddr, htCapabilities);
+          GetWifiRemoteStationManager ()->AddStationHtCapabilities (apAddr, htCapabilities);
         }
     }
   if (GetVhtSupported ())
@@ -790,13 +829,13 @@
       //we will always fill in RxHighestSupportedLgiDataRate field at TX, so this can be used to check whether it supports VHT
       if (vhtCapabilities.GetRxHighestSupportedLgiDataRate () > 0)
         {
-          m_stationManager->AddStationVhtCapabilities (apAddr, vhtCapabilities);
+          GetWifiRemoteStationManager ()->AddStationVhtCapabilities (apAddr, vhtCapabilities);
           VhtOperation vhtOperation = beacon.GetVhtOperation ();
-          for (const auto & mcs : m_phy->GetMcsList (WIFI_MOD_CLASS_VHT))
+          for (const auto & mcs : GetWifiPhy ()->GetMcsList (WIFI_MOD_CLASS_VHT))
             {
               if (vhtCapabilities.IsSupportedRxMcs (mcs.GetMcsValue ()))
                 {
-                  m_stationManager->AddSupportedMcs (apAddr, mcs);
+                  GetWifiRemoteStationManager ()->AddSupportedMcs (apAddr, mcs);
                 }
             }
         }
@@ -811,13 +850,13 @@
       HeCapabilities heCapabilities = beacon.GetHeCapabilities ();
       if (heCapabilities.GetSupportedMcsAndNss () != 0)
         {
-          m_stationManager->AddStationHeCapabilities (apAddr, heCapabilities);
+          GetWifiRemoteStationManager ()->AddStationHeCapabilities (apAddr, heCapabilities);
           HeOperation heOperation = beacon.GetHeOperation ();
-          for (const auto & mcs : m_phy->GetMcsList (WIFI_MOD_CLASS_HE))
+          for (const auto & mcs : GetWifiPhy ()->GetMcsList (WIFI_MOD_CLASS_HE))
             {
               if (heCapabilities.IsSupportedRxMcs (mcs.GetMcsValue ()))
                 {
-                  m_stationManager->AddSupportedMcs (apAddr, mcs);
+                  GetWifiRemoteStationManager ()->AddSupportedMcs (apAddr, mcs);
                 }
             }
         }
@@ -835,8 +874,8 @@
                                muEdcaParameters.GetMuAifsn (AC_VO), muEdcaParameters.GetMuEdcaTimer (AC_VO));
         }
     }
-  m_stationManager->SetShortPreambleEnabled (isShortPreambleEnabled);
-  m_stationManager->SetShortSlotTimeEnabled (capabilities.IsShortSlotTime ());
+  GetWifiRemoteStationManager ()->SetShortPreambleEnabled (isShortPreambleEnabled);
+  GetWifiRemoteStationManager ()->SetShortSlotTimeEnabled (capabilities.IsShortSlotTime ());
 }
 
 void
@@ -845,7 +884,7 @@
   NS_LOG_FUNCTION (this << probeResp << apAddr << bssid);
   CapabilityInformation capabilities = probeResp.GetCapabilities ();
   SupportedRates rates = probeResp.GetSupportedRates ();
-  for (const auto & selector : m_phy->GetBssMembershipSelectorList ())
+  for (const auto & selector : GetWifiPhy ()->GetBssMembershipSelectorList ())
     {
       if (!rates.IsBssMembershipSelectorRate (selector))
         {
@@ -853,14 +892,14 @@
           return;
         }
     }
-  for (const auto & mode : m_phy->GetModeList ())
+  for (const auto & mode : GetWifiPhy ()->GetModeList ())
     {
-      if (rates.IsSupportedRate (mode.GetDataRate (m_phy->GetChannelWidth ())))
+      if (rates.IsSupportedRate (mode.GetDataRate (GetWifiPhy ()->GetChannelWidth ())))
         {
-          m_stationManager->AddSupportedMode (apAddr, mode);
-          if (rates.IsBasicRate (mode.GetDataRate (m_phy->GetChannelWidth ())))
+          GetWifiRemoteStationManager ()->AddSupportedMode (apAddr, mode);
+          if (rates.IsBasicRate (mode.GetDataRate (GetWifiPhy ()->GetChannelWidth ())))
             {
-              m_stationManager->AddBasicMode (mode);
+              GetWifiRemoteStationManager ()->AddBasicMode (mode);
             }
         }
     }
@@ -869,9 +908,9 @@
   if (GetErpSupported ())
     {
       bool isErpAllowed = false;
-      for (const auto & mode : m_phy->GetModeList (WIFI_MOD_CLASS_ERP_OFDM))
+      for (const auto & mode : GetWifiPhy ()->GetModeList (WIFI_MOD_CLASS_ERP_OFDM))
         {
-          if (rates.IsSupportedRate (mode.GetDataRate (m_phy->GetChannelWidth ())))
+          if (rates.IsSupportedRate (mode.GetDataRate (GetWifiPhy ()->GetChannelWidth ())))
             {
               isErpAllowed = true;
               break;
@@ -880,28 +919,28 @@
       if (!isErpAllowed)
         {
           //disable short slot time and set cwMin to 31
-          m_phy->SetSlot (MicroSeconds (20));
+          GetWifiPhy ()->SetSlot (MicroSeconds (20));
           ConfigureContentionWindow (31, 1023);
         }
       else
         {
           ErpInformation erpInformation = probeResp.GetErpInformation ();
           isShortPreambleEnabled &= !erpInformation.GetBarkerPreambleMode ();
-          if (m_stationManager->GetShortSlotTimeEnabled ())
+          if (GetWifiRemoteStationManager ()->GetShortSlotTimeEnabled ())
             {
               //enable short slot time
-              m_phy->SetSlot (MicroSeconds (9));
+              GetWifiPhy ()->SetSlot (MicroSeconds (9));
             }
           else
             {
               //disable short slot time
-              m_phy->SetSlot (MicroSeconds (20));
+              GetWifiPhy ()->SetSlot (MicroSeconds (20));
             }
           ConfigureContentionWindow (15, 1023);
         }
     }
-  m_stationManager->SetShortPreambleEnabled (isShortPreambleEnabled);
-  m_stationManager->SetShortSlotTimeEnabled (capabilities.IsShortSlotTime ());
+  GetWifiRemoteStationManager ()->SetShortPreambleEnabled (isShortPreambleEnabled);
+  GetWifiRemoteStationManager ()->SetShortSlotTimeEnabled (capabilities.IsShortSlotTime ());
   SetBssid (bssid);
 }
 
@@ -915,9 +954,9 @@
   if (GetErpSupported ())
     {
       bool isErpAllowed = false;
-      for (const auto & mode : m_phy->GetModeList (WIFI_MOD_CLASS_ERP_OFDM))
+      for (const auto & mode : GetWifiPhy ()->GetModeList (WIFI_MOD_CLASS_ERP_OFDM))
         {
-          if (rates.IsSupportedRate (mode.GetDataRate (m_phy->GetChannelWidth ())))
+          if (rates.IsSupportedRate (mode.GetDataRate (GetWifiPhy ()->GetChannelWidth ())))
             {
               isErpAllowed = true;
               break;
@@ -926,28 +965,28 @@
       if (!isErpAllowed)
         {
           //disable short slot time and set cwMin to 31
-          m_phy->SetSlot (MicroSeconds (20));
+          GetWifiPhy ()->SetSlot (MicroSeconds (20));
           ConfigureContentionWindow (31, 1023);
         }
       else
         {
           ErpInformation erpInformation = assocResp.GetErpInformation ();
           isShortPreambleEnabled &= !erpInformation.GetBarkerPreambleMode ();
-          if (m_stationManager->GetShortSlotTimeEnabled ())
+          if (GetWifiRemoteStationManager ()->GetShortSlotTimeEnabled ())
             {
               //enable short slot time
-              m_phy->SetSlot (MicroSeconds (9));
+              GetWifiPhy ()->SetSlot (MicroSeconds (9));
             }
           else
             {
               //disable short slot time
-              m_phy->SetSlot (MicroSeconds (20));
+              GetWifiPhy ()->SetSlot (MicroSeconds (20));
             }
           ConfigureContentionWindow (15, 1023);
         }
     }
-  m_stationManager->SetShortPreambleEnabled (isShortPreambleEnabled);
-  m_stationManager->SetShortSlotTimeEnabled (capabilities.IsShortSlotTime ());
+  GetWifiRemoteStationManager ()->SetShortPreambleEnabled (isShortPreambleEnabled);
+  GetWifiRemoteStationManager ()->SetShortSlotTimeEnabled (capabilities.IsShortSlotTime ());
   if (GetQosSupported ())
     {
       bool qosSupported = false;
@@ -961,18 +1000,18 @@
           SetEdcaParameters (AC_VI, edcaParameters.GetViCWmin (), edcaParameters.GetViCWmax (), edcaParameters.GetViAifsn (), 32 * MicroSeconds (edcaParameters.GetViTxopLimit ()));
           SetEdcaParameters (AC_VO, edcaParameters.GetVoCWmin (), edcaParameters.GetVoCWmax (), edcaParameters.GetVoAifsn (), 32 * MicroSeconds (edcaParameters.GetVoTxopLimit ()));
         }
-      m_stationManager->SetQosSupport (apAddr, qosSupported);
+      GetWifiRemoteStationManager ()->SetQosSupport (apAddr, qosSupported);
     }
   if (GetHtSupported ())
     {
       HtCapabilities htCapabilities = assocResp.GetHtCapabilities ();
       if (!htCapabilities.IsSupportedMcs (0))
         {
-          m_stationManager->RemoveAllSupportedMcs (apAddr);
+          GetWifiRemoteStationManager ()->RemoveAllSupportedMcs (apAddr);
         }
       else
         {
-          m_stationManager->AddStationHtCapabilities (apAddr, htCapabilities);
+          GetWifiRemoteStationManager ()->AddStationHtCapabilities (apAddr, htCapabilities);
         }
     }
   if (GetVhtSupported ())
@@ -981,7 +1020,7 @@
       //we will always fill in RxHighestSupportedLgiDataRate field at TX, so this can be used to check whether it supports VHT
       if (vhtCapabilities.GetRxHighestSupportedLgiDataRate () > 0)
         {
-          m_stationManager->AddStationVhtCapabilities (apAddr, vhtCapabilities);
+          GetWifiRemoteStationManager ()->AddStationVhtCapabilities (apAddr, vhtCapabilities);
           VhtOperation vhtOperation = assocResp.GetVhtOperation ();
         }
     }
@@ -990,7 +1029,7 @@
       HeCapabilities hecapabilities = assocResp.GetHeCapabilities ();
       if (hecapabilities.GetSupportedMcsAndNss () != 0)
         {
-          m_stationManager->AddStationHeCapabilities (apAddr, hecapabilities);
+          GetWifiRemoteStationManager ()->AddStationHeCapabilities (apAddr, hecapabilities);
           HeOperation heOperation = assocResp.GetHeOperation ();
           GetHeConfiguration ()->SetAttribute ("BssColor", UintegerValue (heOperation.GetBssColor ()));
         }
@@ -1008,25 +1047,25 @@
                                muEdcaParameters.GetMuAifsn (AC_VO), muEdcaParameters.GetMuEdcaTimer (AC_VO));
         }
     }
-  for (const auto & mode : m_phy->GetModeList ())
+  for (const auto & mode : GetWifiPhy ()->GetModeList ())
     {
-      if (rates.IsSupportedRate (mode.GetDataRate (m_phy->GetChannelWidth ())))
+      if (rates.IsSupportedRate (mode.GetDataRate (GetWifiPhy ()->GetChannelWidth ())))
         {
-          m_stationManager->AddSupportedMode (apAddr, mode);
-          if (rates.IsBasicRate (mode.GetDataRate (m_phy->GetChannelWidth ())))
+          GetWifiRemoteStationManager ()->AddSupportedMode (apAddr, mode);
+          if (rates.IsBasicRate (mode.GetDataRate (GetWifiPhy ()->GetChannelWidth ())))
             {
-              m_stationManager->AddBasicMode (mode);
+              GetWifiRemoteStationManager ()->AddBasicMode (mode);
             }
         }
     }
   if (GetHtSupported ())
     {
       HtCapabilities htCapabilities = assocResp.GetHtCapabilities ();
-      for (const auto & mcs : m_phy->GetMcsList (WIFI_MOD_CLASS_HT))
+      for (const auto & mcs : GetWifiPhy ()->GetMcsList (WIFI_MOD_CLASS_HT))
         {
           if (htCapabilities.IsSupportedMcs (mcs.GetMcsValue ()))
             {
-              m_stationManager->AddSupportedMcs (apAddr, mcs);
+              GetWifiRemoteStationManager ()->AddSupportedMcs (apAddr, mcs);
               //here should add a control to add basic MCS when it is implemented
             }
         }
@@ -1034,11 +1073,11 @@
   if (GetVhtSupported ())
     {
       VhtCapabilities vhtcapabilities = assocResp.GetVhtCapabilities ();
-      for (const auto & mcs : m_phy->GetMcsList (WIFI_MOD_CLASS_VHT))
+      for (const auto & mcs : GetWifiPhy ()->GetMcsList (WIFI_MOD_CLASS_VHT))
         {
           if (vhtcapabilities.IsSupportedRxMcs (mcs.GetMcsValue ()))
             {
-              m_stationManager->AddSupportedMcs (apAddr, mcs);
+              GetWifiRemoteStationManager ()->AddSupportedMcs (apAddr, mcs);
               //here should add a control to add basic MCS when it is implemented
             }
         }
@@ -1051,11 +1090,11 @@
   if (GetHeSupported ())
     {
       HeCapabilities heCapabilities = assocResp.GetHeCapabilities ();
-      for (const auto & mcs : m_phy->GetMcsList (WIFI_MOD_CLASS_HE))
+      for (const auto & mcs : GetWifiPhy ()->GetMcsList (WIFI_MOD_CLASS_HE))
         {
           if (heCapabilities.IsSupportedRxMcs (mcs.GetMcsValue ()))
             {
-              m_stationManager->AddSupportedMcs (apAddr, mcs);
+              GetWifiRemoteStationManager ()->AddSupportedMcs (apAddr, mcs);
               //here should add a control to add basic MCS when it is implemented
             }
         }
@@ -1066,15 +1105,15 @@
 StaWifiMac::GetSupportedRates (void) const
 {
   SupportedRates rates;
-  for (const auto & mode : m_phy->GetModeList ())
+  for (const auto & mode : GetWifiPhy ()->GetModeList ())
     {
-      uint64_t modeDataRate = mode.GetDataRate (m_phy->GetChannelWidth ());
+      uint64_t modeDataRate = mode.GetDataRate (GetWifiPhy ()->GetChannelWidth ());
       NS_LOG_DEBUG ("Adding supported rate of " << modeDataRate);
       rates.AddSupportedRate (modeDataRate);
     }
   if (GetHtSupported ())
     {
-      for (const auto & selector : m_phy->GetBssMembershipSelectorList ())
+      for (const auto & selector : GetWifiPhy ()->GetBssMembershipSelectorList ())
         {
           rates.AddBssMembershipSelectorRate (selector);
         }
@@ -1086,7 +1125,7 @@
 StaWifiMac::GetCapabilities (void) const
 {
   CapabilityInformation capabilities;
-  capabilities.SetShortPreamble (m_phy->GetShortPhyPreambleSupported () || GetErpSupported ());
+  capabilities.SetShortPreamble (GetWifiPhy ()->GetShortPhyPreambleSupported () || GetErpSupported ());
   capabilities.SetShortSlotTime (GetShortSlotTimeSupported () && GetErpSupported ());
   return capabilities;
 }
@@ -1139,4 +1178,17 @@
     }
 }
 
+void
+StaWifiMac::NotifyChannelSwitching (void)
+{
+  NS_LOG_FUNCTION (this);
+
+  WifiMac::NotifyChannelSwitching ();
+
+  if (IsInitialized ())
+    {
+      Disassociated ();
+    }
+}
+
 } //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/sta-wifi-mac.h ns-3.36/src/wifi/model/sta-wifi-mac.h
--- ns-3.35/src/wifi/model/sta-wifi-mac.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/sta-wifi-mac.h	2022-04-30 18:23:58.214735300 -0700
@@ -23,7 +23,7 @@
 #ifndef STA_WIFI_MAC_H
 #define STA_WIFI_MAC_H
 
-#include "regular-wifi-mac.h"
+#include "wifi-mac.h"
 #include "mgt-headers.h"
 
 class TwoLevelAggregationTest;
@@ -103,7 +103,7 @@
  * 7. The transition from Associated to Unassociated occurs if the number
  *    of missed beacons exceeds the threshold.
  */
-class StaWifiMac : public RegularWifiMac
+class StaWifiMac : public WifiMac
 {
 public:
   /// Allow test cases to access private members
@@ -130,6 +130,7 @@
    * access is granted to this MAC.
    */
   void Enqueue (Ptr<Packet> packet, Mac48Address to) override;
+  bool CanForwardPacketsTo (Mac48Address to) const override;
 
   /**
    * \param phy the physical layer attached to this MAC.
@@ -150,6 +151,8 @@
    */
   uint16_t GetAssociationId (void) const;
 
+  void NotifyChannelSwitching (void) override;
+
 private:
   /**
    * The current MAC state of the STA.
@@ -268,6 +271,10 @@
    */
   void RestartBeaconWatchdog (Time delay);
   /**
+   * Take actions after disassociation.
+   */
+  void Disassociated (void);
+  /**
    * Return an instance of SupportedRates that contains all rates that we support
    * including HT rates.
    *
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/table-based-error-rate-model.cc ns-3.36/src/wifi/model/table-based-error-rate-model.cc
--- ns-3.35/src/wifi/model/table-based-error-rate-model.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/table-based-error-rate-model.cc	2022-04-30 18:23:58.214735300 -0700
@@ -81,62 +81,65 @@
   return std::floor (snr * multiplier + 0.5) / multiplier;
 }
 
-uint8_t
+std::optional<uint8_t>
 TableBasedErrorRateModel::GetMcsForMode (WifiMode mode)
 {
-  uint8_t mcs = 0xff; // Initialize to invalid mcs
-  if (mode.GetModulationClass () == WIFI_MOD_CLASS_OFDM || mode.GetModulationClass () == WIFI_MOD_CLASS_ERP_OFDM)
+  std::optional<uint8_t> mcs;
+  WifiModulationClass modulationClass = mode.GetModulationClass ();
+  WifiCodeRate codeRate = mode.GetCodeRate ();
+  uint16_t constellationSize = mode.GetConstellationSize ();
+
+  if (modulationClass == WIFI_MOD_CLASS_OFDM || modulationClass == WIFI_MOD_CLASS_ERP_OFDM)
     {
-      if (mode.GetConstellationSize () == 2)
+      if (constellationSize == 2)    // BPSK
         {
-          if (mode.GetCodeRate () == WIFI_CODE_RATE_1_2)
+          if (codeRate == WIFI_CODE_RATE_1_2)
             {
               mcs = 0;
             }
-          if (mode.GetCodeRate () == WIFI_CODE_RATE_3_4)
+          if (codeRate == WIFI_CODE_RATE_3_4)
             {
-              mcs = 1;
+              // No MCS uses BPSK and a Coding Rate of 3/4
             }
         }
-      else if (mode.GetConstellationSize () == 4)
+      else if (constellationSize == 4)    // QPSK
         {
-          if (mode.GetCodeRate () == WIFI_CODE_RATE_1_2)
+          if (codeRate == WIFI_CODE_RATE_1_2)
             {
-              mcs = 2;
+              mcs = 1;
             }
-          else if (mode.GetCodeRate () == WIFI_CODE_RATE_3_4)
+          else if (codeRate == WIFI_CODE_RATE_3_4)
             {
-              mcs = 3;
+              mcs = 2;
             }
         }
-      else if (mode.GetConstellationSize () == 16)
+      else if (constellationSize == 16)    // 16-QAM
         {
-          if (mode.GetCodeRate () == WIFI_CODE_RATE_1_2)
+          if (codeRate == WIFI_CODE_RATE_1_2)
             {
-              mcs = 4;
+              mcs = 3;
             }
-          else if (mode.GetCodeRate () == WIFI_CODE_RATE_3_4)
+          else if (codeRate == WIFI_CODE_RATE_3_4)
             {
-              mcs = 5;
+              mcs = 4;
             }
         }
-      else if (mode.GetConstellationSize () == 64)
+      else if (constellationSize == 64)    // 64-QAM
         {
-          if (mode.GetCodeRate () == WIFI_CODE_RATE_2_3)
+          if (codeRate == WIFI_CODE_RATE_2_3)
             {
-              mcs = 6;
+              mcs = 5;
             }
-          else if (mode.GetCodeRate () == WIFI_CODE_RATE_3_4)
+          else if (codeRate == WIFI_CODE_RATE_3_4)
             {
-              mcs = 7;
+              mcs = 6;
             }
         }
     }
-  else if (mode.GetModulationClass () >= WIFI_MOD_CLASS_HT)
+  else if (modulationClass >= WIFI_MOD_CLASS_HT)
     {
       mcs = mode.GetMcsValue ();
     }
-  NS_ABORT_MSG_IF (mcs == 0xff, "Error, MCS value for mode not found");
   return mcs;
 }
 
@@ -146,32 +149,41 @@
   NS_LOG_FUNCTION (this << mode << txVector << snr << nbits << +numRxAntennas << field << staId);
   uint64_t size = std::max<uint64_t> (1, (nbits / 8));
   double roundedSnr = RoundSnr (RatioToDb (snr), SNR_PRECISION);
-  uint8_t mcs = GetMcsForMode (mode);
+  uint8_t mcs;
+  if (auto ret = GetMcsForMode (mode); ret.has_value ())
+    {
+      mcs = ret.value ();
+    }
+  else
+    {
+      NS_LOG_DEBUG ("No MCS found for mode " << mode << ": use fallback error rate model");
+      return m_fallbackErrorModel->GetChunkSuccessRate (mode, txVector, snr, nbits, staId);
+    }
   bool ldpc = txVector.IsLdpc ();
   NS_LOG_FUNCTION (this << +mcs << roundedSnr << size << ldpc);
 
-  // HT: for mcs greater than 7, use 0 - 7 curves for data rate
+  // HT: for MCS greater than 7, use 0 - 7 curves for data rate
   if (mode.GetModulationClass () == WIFI_MOD_CLASS_HT)
     {
       mcs = mcs % 8;
     }
 
-  if (mcs > (ldpc ? ERROR_TABLE_LDPC_MAX_NUM_MCS : ERROR_TABLE_BCC_MAX_NUM_MCS))
+  if (mcs >= (ldpc ? ERROR_TABLE_LDPC_MAX_NUM_MCS : ERROR_TABLE_BCC_MAX_NUM_MCS))
     {
       NS_LOG_WARN ("Table missing for MCS: " << +mcs << " in TableBasedErrorRateModel: use fallback error rate model");
       return m_fallbackErrorModel->GetChunkSuccessRate (mode, txVector, snr, nbits, staId);
     }
 
   auto errorTable = (ldpc ? AwgnErrorTableLdpc1458 : (size < m_threshold ? AwgnErrorTableBcc32 : AwgnErrorTableBcc1458));
-  auto itVector = errorTable[mcs];
-  auto itTable = std::find_if (itVector.begin(), itVector.end(),
+  const auto& itVector = errorTable[mcs];
+  auto itTable = std::find_if (itVector.cbegin (), itVector.cend (),
       [&roundedSnr](const std::pair<double, double>& element) {
           return element.first == roundedSnr;
       });
-  double minSnr = itVector.begin ()->first;
-  double maxSnr = (--itVector.end ())->first;
+  double minSnr = itVector.cbegin ()->first;
+  double maxSnr = (--itVector.cend ())->first;
   double per;
-  if (itTable == itVector.end ())
+  if (itTable == itVector.cend ())
     {
       if (roundedSnr < minSnr)
         {
@@ -184,7 +196,7 @@
       else
         {
           double a = 0.0, b = 0.0, previousSnr = 0.0, nextSnr = 0.0;
-          for (auto i = itVector.begin (); i != itVector.end (); ++i)
+          for (auto i = itVector.cbegin (); i != itVector.cend (); ++i)
             {
               if (i->first < roundedSnr)
                 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/table-based-error-rate-model.h ns-3.36/src/wifi/model/table-based-error-rate-model.h
--- ns-3.35/src/wifi/model/table-based-error-rate-model.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/table-based-error-rate-model.h	2022-04-30 18:23:58.214735300 -0700
@@ -25,6 +25,7 @@
 #include "ns3/error-rate-tables.h"
 #include "error-rate-model.h"
 #include "wifi-mode.h"
+#include <optional>
 
 namespace ns3 {
 
@@ -50,9 +51,9 @@
   /**
    * \brief Utility function to convert WifiMode to an MCS value
    * \param mode the WifiMode
-   * \return the MCS value
+   * \return the equivalent MCS value, if found
    */
-  static uint8_t GetMcsForMode (WifiMode mode);
+  static std::optional<uint8_t> GetMcsForMode (WifiMode mode);
 
 
 private:
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/txop.cc ns-3.36/src/wifi/model/txop.cc
--- ns-3.35/src/wifi/model/txop.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/txop.cc	2022-04-30 18:23:58.214735300 -0700
@@ -25,7 +25,7 @@
 #include "ns3/socket.h"
 #include "txop.h"
 #include "channel-access-manager.h"
-#include "regular-wifi-mac.h"
+#include "wifi-mac.h"
 #include "wifi-mac-queue.h"
 #include "mac-tx-middle.h"
 #include "wifi-mac-trailer.h"
@@ -133,7 +133,7 @@
 }
 
 void
-Txop::SetWifiMac (const Ptr<RegularWifiMac> mac)
+Txop::SetWifiMac (const Ptr<WifiMac> mac)
 {
   NS_LOG_FUNCTION (this << mac);
   m_mac = mac;
@@ -382,13 +382,6 @@
 }
 
 void
-Txop::NotifyChannelSwitching (void)
-{
-  NS_LOG_FUNCTION (this);
-  m_queue->Flush ();
-}
-
-void
 Txop::NotifySleep (void)
 {
   NS_LOG_FUNCTION (this);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/txop.h ns-3.36/src/wifi/model/txop.h
--- ns-3.35/src/wifi/model/txop.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/txop.h	2022-04-30 18:23:58.214735300 -0700
@@ -34,7 +34,7 @@
 class WifiMacQueueItem;
 class UniformRandomVariable;
 class CtrlBAckResponseHeader;
-class RegularWifiMac;
+class WifiMac;
 enum WifiMacDropReason : uint8_t;  // opaque enum declaration
 
 /**
@@ -114,7 +114,7 @@
    *
    * \param mac associated wifi MAC
    */
-  virtual void SetWifiMac (const Ptr<RegularWifiMac> mac);
+  virtual void SetWifiMac (const Ptr<WifiMac> mac);
   /**
    * Set MacTxMiddle this Txop is associated to.
    *
@@ -198,10 +198,6 @@
   void UpdateFailedCw (void);
 
   /**
-   * When a channel switching occurs, enqueued packets are removed.
-   */
-  virtual void NotifyChannelSwitching (void);
-  /**
    * When sleep operation occurs, if there is a pending packet transmission,
    * it will be reinserted to the front of the queue.
    */
@@ -326,7 +322,7 @@
   DroppedMpdu m_droppedMpduCallback;                //!< the dropped MPDU callback
   Ptr<WifiMacQueue> m_queue;                        //!< the wifi MAC queue
   Ptr<MacTxMiddle> m_txMiddle;                      //!< the MacTxMiddle
-  Ptr<RegularWifiMac> m_mac;                        //!< the wifi MAC
+  Ptr<WifiMac> m_mac;                               //!< the wifi MAC
   Ptr<UniformRandomVariable> m_rng;                 //!< the random stream
 
   uint32_t m_cwMin;              //!< the minimum contention window
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/vht/vht-frame-exchange-manager.cc ns-3.36/src/wifi/model/vht/vht-frame-exchange-manager.cc
--- ns-3.35/src/wifi/model/vht/vht-frame-exchange-manager.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/vht/vht-frame-exchange-manager.cc	2022-04-30 18:23:58.214735300 -0700
@@ -58,4 +58,12 @@
   return Create<WifiPsdu> (mpdu, txVector.GetModulationClass () >= WIFI_MOD_CLASS_VHT);
 }
 
+uint32_t
+VhtFrameExchangeManager::GetPsduSize (Ptr<const WifiMacQueueItem> mpdu, const WifiTxVector& txVector) const
+{
+  return (txVector.GetModulationClass () >= WIFI_MOD_CLASS_VHT
+          ? MpduAggregator::GetSizeIfAggregated (mpdu->GetSize (), 0)
+          : HtFrameExchangeManager::GetPsduSize (mpdu, txVector));
+}
+
 } //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/vht/vht-frame-exchange-manager.h ns-3.36/src/wifi/model/vht/vht-frame-exchange-manager.h
--- ns-3.35/src/wifi/model/vht/vht-frame-exchange-manager.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/vht/vht-frame-exchange-manager.h	2022-04-30 18:23:58.214735300 -0700
@@ -44,6 +44,7 @@
 
 protected:
   Ptr<WifiPsdu> GetWifiPsdu (Ptr<WifiMacQueueItem> mpdu, const WifiTxVector& txVector) const override;
+  uint32_t GetPsduSize (Ptr<const WifiMacQueueItem> mpdu, const WifiTxVector& txVector) const override;
 };
 
 } //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/vht/vht-phy.cc ns-3.36/src/wifi/model/vht/vht-phy.cc
--- ns-3.35/src/wifi/model/vht/vht-phy.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/vht/vht-phy.cc	2022-04-30 18:23:58.214735300 -0700
@@ -377,14 +377,13 @@
   return WifiModeFactory::CreateWifiMcs ("VhtMcs" + std::to_string (index),
                                          index,
                                          WIFI_MOD_CLASS_VHT,
+                                         false,
                                          MakeBoundCallback (&GetCodeRate, index),
                                          MakeBoundCallback (&GetConstellationSize, index),
-                                         MakeBoundCallback (&GetPhyRate, index),
                                          MakeCallback (&GetPhyRateFromTxVector),
-                                         MakeBoundCallback (&GetDataRate, index),
                                          MakeCallback (&GetDataRateFromTxVector),
                                          MakeBoundCallback (&GetNonHtReferenceRate, index),
-                                         MakeBoundCallback (&IsModeAllowed, index));
+                                         MakeCallback (&IsAllowed));
 }
 
 WifiCodeRate
@@ -445,7 +444,7 @@
 {
   NS_ASSERT (guardInterval == 800 || guardInterval == 400);
   NS_ASSERT (nss <= 8);
-  NS_ASSERT_MSG (IsModeAllowed (mcsValue, channelWidth, nss), "VHT MCS " << +mcsValue << " forbidden at " << channelWidth << " MHz when NSS is " << +nss);
+  NS_ASSERT_MSG (IsCombinationAllowed (mcsValue, channelWidth, nss), "VHT MCS " << +mcsValue << " forbidden at " << channelWidth << " MHz when NSS is " << +nss);
   return HtPhy::CalculateDataRate (3.2, guardInterval,
                                    GetUsableSubcarriers (channelWidth),
                                    static_cast<uint16_t> (log2 (GetConstellationSize (mcsValue))),
@@ -497,7 +496,15 @@
 }
 
 bool
-VhtPhy::IsModeAllowed (uint8_t mcsValue, uint16_t channelWidth, uint8_t nss)
+VhtPhy::IsAllowed (const WifiTxVector& txVector)
+{
+  return IsCombinationAllowed (txVector.GetMode ().GetMcsValue (),
+                               txVector.GetChannelWidth (),
+                               txVector.GetNss ());
+}
+
+bool
+VhtPhy::IsCombinationAllowed (uint8_t mcsValue, uint16_t channelWidth, uint8_t nss)
 {
   if (mcsValue == 9 && channelWidth == 20 && nss != 3)
     {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/vht/vht-phy.h ns-3.36/src/wifi/model/vht/vht-phy.h
--- ns-3.35/src/wifi/model/vht/vht-phy.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/vht/vht-phy.h	2022-04-30 18:23:58.214735300 -0700
@@ -253,7 +253,15 @@
    * \param nss the considered number of streams
    * \returns true if this <MCS, channel width, NSS> combination is allowed, false otherwise.
    */
-  static bool IsModeAllowed (uint8_t mcsValue, uint16_t channelWidth, uint8_t nss);
+  static bool IsCombinationAllowed (uint8_t mcsValue, uint16_t channelWidth, uint8_t nss);
+  /**
+   * Check whether the combination in TXVECTOR is allowed.
+   * This function is used as a callback for WifiMode operation.
+   *
+   * \param txVector the TXVECTOR
+   * \returns true if this combination is allowed, false otherwise.
+   */
+  static bool IsAllowed (const WifiTxVector& txVector);
 
 protected:
   WifiMode GetHtSigMode (void) const override;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/vht/vht-ppdu.cc ns-3.36/src/wifi/model/vht/vht-ppdu.cc
--- ns-3.35/src/wifi/model/vht/vht-ppdu.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/vht/vht-ppdu.cc	2022-04-30 18:23:58.214735300 -0700
@@ -219,7 +219,7 @@
 bool
 VhtPpdu::VhtSigHeader::GetShortGuardInterval (void) const
 {
-  return m_sgi ? true : false;
+  return m_sgi;
 }
 
 void
@@ -231,7 +231,7 @@
 bool
 VhtPpdu::VhtSigHeader::GetShortGuardIntervalDisambiguation (void) const
 {
-  return m_sgi_disambiguation ? true : false;
+  return m_sgi_disambiguation;
 }
 
 void
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/wifi-ack-manager.cc ns-3.36/src/wifi/model/wifi-ack-manager.cc
--- ns-3.35/src/wifi/model/wifi-ack-manager.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/wifi-ack-manager.cc	2022-04-30 18:23:58.214735300 -0700
@@ -21,7 +21,7 @@
 #include "ns3/log.h"
 #include "wifi-ack-manager.h"
 #include "wifi-psdu.h"
-#include "regular-wifi-mac.h"
+#include "wifi-mac.h"
 
 
 namespace ns3 {
@@ -54,7 +54,7 @@
 }
 
 void
-WifiAckManager::SetWifiMac (Ptr<RegularWifiMac> mac)
+WifiAckManager::SetWifiMac (Ptr<WifiMac> mac)
 {
   NS_LOG_FUNCTION (this << mac);
   m_mac = mac;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/wifi-ack-manager.h ns-3.36/src/wifi/model/wifi-ack-manager.h
--- ns-3.35/src/wifi/model/wifi-ack-manager.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/wifi-ack-manager.h	2022-04-30 18:23:58.214735300 -0700
@@ -31,7 +31,7 @@
 class WifiTxParameters;
 class WifiMacQueueItem;
 class WifiPsdu;
-class RegularWifiMac;
+class WifiMac;
 
 /**
  * \ingroup wifi
@@ -54,7 +54,7 @@
    *
    * \param mac a pointer to the MAC
    */
-  void SetWifiMac (Ptr<RegularWifiMac> mac);
+  void SetWifiMac (Ptr<WifiMac> mac);
 
   /**
    * Set the QoS Ack policy for the given MPDU, which must be a QoS data frame.
@@ -101,7 +101,7 @@
 protected:
   void DoDispose (void) override;
 
-  Ptr<RegularWifiMac> m_mac;     //!< MAC which is using this Acknowledgment Manager
+  Ptr<WifiMac> m_mac; //!< MAC which is using this Acknowledgment Manager
 };
 
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/wifi-acknowledgment.cc ns-3.36/src/wifi/model/wifi-acknowledgment.cc
--- ns-3.35/src/wifi/model/wifi-acknowledgment.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/wifi-acknowledgment.cc	2022-04-30 18:23:58.214735300 -0700
@@ -334,7 +334,8 @@
  */
 
 WifiUlMuMultiStaBa::WifiUlMuMultiStaBa ()
-  : WifiAcknowledgment (UL_MU_MULTI_STA_BA)
+  : WifiAcknowledgment (UL_MU_MULTI_STA_BA),
+    baType (BlockAckType::MULTI_STA)
 {
 }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/wifi-default-ack-manager.cc ns-3.36/src/wifi/model/wifi-default-ack-manager.cc
--- ns-3.35/src/wifi/model/wifi-default-ack-manager.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/wifi-default-ack-manager.cc	2022-04-30 18:23:58.214735300 -0700
@@ -654,7 +654,6 @@
     {
       // the only supported ack method for now is through a multi-STA BlockAck frame
       WifiUlMuMultiStaBa* acknowledgment = new WifiUlMuMultiStaBa;
-      acknowledgment->baType.m_variant = BlockAckType::MULTI_STA;
 
       for (const auto& userInfo : trigger)
         {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/wifi-default-protection-manager.cc ns-3.36/src/wifi/model/wifi-default-protection-manager.cc
--- ns-3.35/src/wifi/model/wifi-default-protection-manager.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/wifi-default-protection-manager.cc	2022-04-30 18:23:58.214735300 -0700
@@ -22,7 +22,7 @@
 #include "wifi-default-protection-manager.h"
 #include "wifi-tx-parameters.h"
 #include "wifi-mac-queue-item.h"
-#include "regular-wifi-mac.h"
+#include "wifi-mac.h"
 
 
 namespace ns3 {
@@ -58,6 +58,30 @@
 {
   NS_LOG_FUNCTION (this << *mpdu << &txParams);
 
+  // TB PPDUs need no protection (the soliciting Trigger Frame can be protected
+  // by an MU-RTS). Until MU-RTS is implemented, we disable protection also for:
+  // - Trigger Frames
+  // - DL MU PPDUs containing more than one PSDU
+  if (txParams.m_txVector.IsUlMu ()
+      || mpdu->GetHeader ().IsTrigger ()
+      || (txParams.m_txVector.IsDlMu () && txParams.GetPsduInfoMap ().size () > 1))
+    {
+      if (txParams.m_protection)
+        {
+          NS_ASSERT (txParams.m_protection->method == WifiProtection::NONE);
+          return nullptr;
+        }
+      return std::unique_ptr<WifiProtection> (new WifiNoProtection);
+    }
+
+  // If we are adding a second PSDU to a DL MU PPDU, switch to no protection
+  // (until MU-RTS is implemented)
+  if (txParams.m_txVector.IsDlMu () && txParams.GetPsduInfoMap ().size () == 1
+      && txParams.GetPsduInfo (mpdu->GetHeader ().GetAddr1 ()) == nullptr)
+    {
+      return std::unique_ptr<WifiProtection> (new WifiNoProtection);
+    }
+
   // if the current protection method (if any) is already RTS/CTS or CTS-to-Self,
   // it will not change by adding an MPDU
   if (txParams.m_protection
@@ -100,6 +124,12 @@
 
   NS_ASSERT (txParams.m_protection->method == WifiProtection::NONE);
 
+  // No protection for TB PPDUs
+  if (txParams.m_txVector.IsUlMu ())
+    {
+      return nullptr;
+    }
+
   std::unique_ptr<WifiProtection> protection;
   protection = GetPsduProtection (msdu->GetHeader (), txParams.GetSizeIfAggregateMsdu (msdu).second,
                                   txParams.m_txVector);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/wifi-mac.cc ns-3.36/src/wifi/model/wifi-mac.cc
--- ns-3.35/src/wifi/model/wifi-mac.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/wifi-mac.cc	2022-04-30 18:23:58.214735300 -0700
@@ -19,14 +19,22 @@
  */
 
 #include "ns3/log.h"
+#include "ns3/pointer.h"
 #include "ns3/packet.h"
 #include "wifi-mac.h"
-#include "txop.h"
+#include "qos-txop.h"
 #include "ssid.h"
+#include "mgt-headers.h"
 #include "wifi-net-device.h"
+#include "wifi-mac-queue.h"
+#include "mac-rx-middle.h"
+#include "mac-tx-middle.h"
+#include "channel-access-manager.h"
 #include "ns3/ht-configuration.h"
 #include "ns3/vht-configuration.h"
 #include "ns3/he-configuration.h"
+#include "ns3/he-frame-exchange-manager.h"
+#include "extended-capabilities.h"
 
 namespace ns3 {
 
@@ -34,6 +42,26 @@
 
 NS_OBJECT_ENSURE_REGISTERED (WifiMac);
 
+WifiMac::WifiMac ()
+  : m_qosSupported (false),
+    m_erpSupported (false),
+    m_dsssSupported (false)
+{
+  NS_LOG_FUNCTION (this);
+
+  m_rxMiddle = Create<MacRxMiddle> ();
+  m_rxMiddle->SetForwardCallback (MakeCallback (&WifiMac::Receive, this));
+
+  m_txMiddle = Create<MacTxMiddle> ();
+
+  m_channelAccessManager = CreateObject<ChannelAccessManager> ();
+}
+
+WifiMac::~WifiMac ()
+{
+  NS_LOG_FUNCTION (this);
+}
+
 TypeId
 WifiMac::GetTypeId (void)
 {
@@ -45,6 +73,165 @@
                    MakeSsidAccessor (&WifiMac::GetSsid,
                                      &WifiMac::SetSsid),
                    MakeSsidChecker ())
+    .AddAttribute ("QosSupported",
+                   "This Boolean attribute is set to enable 802.11e/WMM-style QoS support at this STA.",
+                   TypeId::ATTR_GET | TypeId::ATTR_CONSTRUCT,  // prevent setting after construction
+                   BooleanValue (false),
+                   MakeBooleanAccessor (&WifiMac::SetQosSupported,
+                                        &WifiMac::GetQosSupported),
+                   MakeBooleanChecker ())
+    .AddAttribute ("CtsToSelfSupported",
+                   "Use CTS to Self when using a rate that is not in the basic rate set.",
+                   BooleanValue (false),
+                   MakeBooleanAccessor (&WifiMac::SetCtsToSelfSupported),
+                   MakeBooleanChecker ())
+    .AddAttribute ("ShortSlotTimeSupported",
+                   "Whether or not short slot time is supported (only used by ERP APs or STAs).",
+                   BooleanValue (true),
+                   MakeBooleanAccessor (&WifiMac::SetShortSlotTimeSupported,
+                                        &WifiMac::GetShortSlotTimeSupported),
+                   MakeBooleanChecker ())
+    .AddAttribute ("Txop",
+                   "The Txop object.",
+                   PointerValue (),
+                   MakePointerAccessor (&WifiMac::GetTxop),
+                   MakePointerChecker<Txop> ())
+    .AddAttribute ("VO_Txop",
+                   "Queue that manages packets belonging to AC_VO access class.",
+                   PointerValue (),
+                   MakePointerAccessor (&WifiMac::GetVOQueue),
+                   MakePointerChecker<QosTxop> ())
+    .AddAttribute ("VI_Txop",
+                   "Queue that manages packets belonging to AC_VI access class.",
+                   PointerValue (),
+                   MakePointerAccessor (&WifiMac::GetVIQueue),
+                   MakePointerChecker<QosTxop> ())
+    .AddAttribute ("BE_Txop",
+                   "Queue that manages packets belonging to AC_BE access class.",
+                   PointerValue (),
+                   MakePointerAccessor (&WifiMac::GetBEQueue),
+                   MakePointerChecker<QosTxop> ())
+    .AddAttribute ("BK_Txop",
+                   "Queue that manages packets belonging to AC_BK access class.",
+                   PointerValue (),
+                   MakePointerAccessor (&WifiMac::GetBKQueue),
+                   MakePointerChecker<QosTxop> ())
+    .AddAttribute ("VO_MaxAmsduSize",
+                   "Maximum length in bytes of an A-MSDU for AC_VO access class "
+                   "(capped to 7935 for HT PPDUs and 11398 for VHT/HE PPDUs). "
+                   "Value 0 means A-MSDU aggregation is disabled for that AC.",
+                   UintegerValue (0),
+                   MakeUintegerAccessor (&WifiMac::m_voMaxAmsduSize),
+                   MakeUintegerChecker<uint16_t> (0, 11398))
+    .AddAttribute ("VI_MaxAmsduSize",
+                   "Maximum length in bytes of an A-MSDU for AC_VI access class "
+                   "(capped to 7935 for HT PPDUs and 11398 for VHT/HE PPDUs). "
+                   "Value 0 means A-MSDU aggregation is disabled for that AC.",
+                   UintegerValue (0),
+                   MakeUintegerAccessor (&WifiMac::m_viMaxAmsduSize),
+                   MakeUintegerChecker<uint16_t> (0, 11398))
+    .AddAttribute ("BE_MaxAmsduSize",
+                   "Maximum length in bytes of an A-MSDU for AC_BE access class "
+                   "(capped to 7935 for HT PPDUs and 11398 for VHT/HE PPDUs). "
+                   "Value 0 means A-MSDU aggregation is disabled for that AC.",
+                   UintegerValue (0),
+                   MakeUintegerAccessor (&WifiMac::m_beMaxAmsduSize),
+                   MakeUintegerChecker<uint16_t> (0, 11398))
+    .AddAttribute ("BK_MaxAmsduSize",
+                   "Maximum length in bytes of an A-MSDU for AC_BK access class "
+                   "(capped to 7935 for HT PPDUs and 11398 for VHT/HE PPDUs). "
+                   "Value 0 means A-MSDU aggregation is disabled for that AC.",
+                   UintegerValue (0),
+                   MakeUintegerAccessor (&WifiMac::m_bkMaxAmsduSize),
+                   MakeUintegerChecker<uint16_t> (0, 11398))
+    .AddAttribute ("VO_MaxAmpduSize",
+                   "Maximum length in bytes of an A-MPDU for AC_VO access class "
+                   "(capped to 65535 for HT PPDUs, 1048575 for VHT PPDUs, and 6500631 for HE PPDUs). "
+                   "Value 0 means A-MPDU aggregation is disabled for that AC.",
+                   UintegerValue (0),
+                   MakeUintegerAccessor (&WifiMac::m_voMaxAmpduSize),
+                   MakeUintegerChecker<uint32_t> (0, 6500631))
+    .AddAttribute ("VI_MaxAmpduSize",
+                   "Maximum length in bytes of an A-MPDU for AC_VI access class "
+                   "(capped to 65535 for HT PPDUs, 1048575 for VHT PPDUs, and 6500631 for HE PPDUs). "
+                   "Value 0 means A-MPDU aggregation is disabled for that AC.",
+                   UintegerValue (65535),
+                   MakeUintegerAccessor (&WifiMac::m_viMaxAmpduSize),
+                   MakeUintegerChecker<uint32_t> (0, 6500631))
+    .AddAttribute ("BE_MaxAmpduSize",
+                   "Maximum length in bytes of an A-MPDU for AC_BE access class "
+                   "(capped to 65535 for HT PPDUs, 1048575 for VHT PPDUs, and 6500631 for HE PPDUs). "
+                   "Value 0 means A-MPDU aggregation is disabled for that AC.",
+                   UintegerValue (65535),
+                   MakeUintegerAccessor (&WifiMac::m_beMaxAmpduSize),
+                   MakeUintegerChecker<uint32_t> (0, 6500631))
+    .AddAttribute ("BK_MaxAmpduSize",
+                   "Maximum length in bytes of an A-MPDU for AC_BK access class "
+                   "(capped to 65535 for HT PPDUs, 1048575 for VHT PPDUs, and 6500631 for HE PPDUs). "
+                   "Value 0 means A-MPDU aggregation is disabled for that AC.",
+                   UintegerValue (0),
+                   MakeUintegerAccessor (&WifiMac::m_bkMaxAmpduSize),
+                   MakeUintegerChecker<uint32_t> (0, 6500631))
+    .AddAttribute ("VO_BlockAckThreshold",
+                   "If number of packets in VO queue reaches this value, "
+                   "block ack mechanism is used. If this value is 0, block ack is never used."
+                   "When A-MPDU is enabled, block ack mechanism is used regardless of this value.",
+                   UintegerValue (0),
+                   MakeUintegerAccessor (&WifiMac::SetVoBlockAckThreshold),
+                   MakeUintegerChecker<uint8_t> (0, 64))
+    .AddAttribute ("VI_BlockAckThreshold",
+                   "If number of packets in VI queue reaches this value, "
+                   "block ack mechanism is used. If this value is 0, block ack is never used."
+                   "When A-MPDU is enabled, block ack mechanism is used regardless of this value.",
+                   UintegerValue (0),
+                   MakeUintegerAccessor (&WifiMac::SetViBlockAckThreshold),
+                   MakeUintegerChecker<uint8_t> (0, 64))
+    .AddAttribute ("BE_BlockAckThreshold",
+                   "If number of packets in BE queue reaches this value, "
+                   "block ack mechanism is used. If this value is 0, block ack is never used."
+                   "When A-MPDU is enabled, block ack mechanism is used regardless of this value.",
+                   UintegerValue (0),
+                   MakeUintegerAccessor (&WifiMac::SetBeBlockAckThreshold),
+                   MakeUintegerChecker<uint8_t> (0, 64))
+    .AddAttribute ("BK_BlockAckThreshold",
+                   "If number of packets in BK queue reaches this value, "
+                   "block ack mechanism is used. If this value is 0, block ack is never used."
+                   "When A-MPDU is enabled, block ack mechanism is used regardless of this value.",
+                   UintegerValue (0),
+                   MakeUintegerAccessor (&WifiMac::SetBkBlockAckThreshold),
+                   MakeUintegerChecker<uint8_t> (0, 64))
+    .AddAttribute ("VO_BlockAckInactivityTimeout",
+                   "Represents max time (blocks of 1024 microseconds) allowed for block ack"
+                   "inactivity for AC_VO. If this value isn't equal to 0 a timer start after that a"
+                   "block ack setup is completed and will be reset every time that a block ack"
+                   "frame is received. If this value is 0, block ack inactivity timeout won't be used.",
+                   UintegerValue (0),
+                   MakeUintegerAccessor (&WifiMac::SetVoBlockAckInactivityTimeout),
+                   MakeUintegerChecker<uint16_t> ())
+    .AddAttribute ("VI_BlockAckInactivityTimeout",
+                   "Represents max time (blocks of 1024 microseconds) allowed for block ack"
+                   "inactivity for AC_VI. If this value isn't equal to 0 a timer start after that a"
+                   "block ack setup is completed and will be reset every time that a block ack"
+                   "frame is received. If this value is 0, block ack inactivity timeout won't be used.",
+                   UintegerValue (0),
+                   MakeUintegerAccessor (&WifiMac::SetViBlockAckInactivityTimeout),
+                   MakeUintegerChecker<uint16_t> ())
+    .AddAttribute ("BE_BlockAckInactivityTimeout",
+                   "Represents max time (blocks of 1024 microseconds) allowed for block ack"
+                   "inactivity for AC_BE. If this value isn't equal to 0 a timer start after that a"
+                   "block ack setup is completed and will be reset every time that a block ack"
+                   "frame is received. If this value is 0, block ack inactivity timeout won't be used.",
+                   UintegerValue (0),
+                   MakeUintegerAccessor (&WifiMac::SetBeBlockAckInactivityTimeout),
+                   MakeUintegerChecker<uint16_t> ())
+    .AddAttribute ("BK_BlockAckInactivityTimeout",
+                   "Represents max time (blocks of 1024 microseconds) allowed for block ack"
+                   "inactivity for AC_BK. If this value isn't equal to 0 a timer start after that a"
+                   "block ack setup is completed and will be reset every time that a block ack"
+                   "frame is received. If this value is 0, block ack inactivity timeout won't be used.",
+                   UintegerValue (0),
+                   MakeUintegerAccessor (&WifiMac::SetBkBlockAckInactivityTimeout),
+                   MakeUintegerChecker<uint16_t> ())
     .AddTraceSource ("MacTx",
                      "A packet has been received from higher layers and is being processed in preparation for "
                      "queueing for transmission.",
@@ -71,29 +258,264 @@
                      "A packet has been dropped in the MAC layer after it has been passed up from the physical layer.",
                      MakeTraceSourceAccessor (&WifiMac::m_macRxDropTrace),
                      "ns3::Packet::TracedCallback")
+    .AddTraceSource ("TxOkHeader",
+                     "The header of successfully transmitted packet.",
+                     MakeTraceSourceAccessor (&WifiMac::m_txOkCallback),
+                     "ns3::WifiMacHeader::TracedCallback",
+                     TypeId::OBSOLETE,
+                     "Use the AckedMpdu trace instead.")
+    .AddTraceSource ("TxErrHeader",
+                     "The header of unsuccessfully transmitted packet.",
+                     MakeTraceSourceAccessor (&WifiMac::m_txErrCallback),
+                     "ns3::WifiMacHeader::TracedCallback",
+                     TypeId::OBSOLETE,
+                     "Depending on the failure type, use the NAckedMpdu trace, the "
+                     "DroppedMpdu trace or one of the traces associated with TX timeouts.")
+    .AddTraceSource ("AckedMpdu",
+                     "An MPDU that was successfully acknowledged, via either a "
+                     "Normal Ack or a Block Ack.",
+                     MakeTraceSourceAccessor (&WifiMac::m_ackedMpduCallback),
+                     "ns3::WifiMacQueueItem::TracedCallback")
+    .AddTraceSource ("NAckedMpdu",
+                     "An MPDU that was negatively acknowledged via a Block Ack.",
+                     MakeTraceSourceAccessor (&WifiMac::m_nackedMpduCallback),
+                     "ns3::WifiMacQueueItem::TracedCallback")
+    .AddTraceSource ("DroppedMpdu",
+                     "An MPDU that was dropped for the given reason (see WifiMacDropReason).",
+                     MakeTraceSourceAccessor (&WifiMac::m_droppedMpduCallback),
+                     "ns3::WifiMac::DroppedMpduCallback")
+    .AddTraceSource ("MpduResponseTimeout",
+                     "An MPDU whose response was not received before the timeout, along with "
+                     "an identifier of the type of timeout (see WifiTxTimer::Reason) and the "
+                     "TXVECTOR used to transmit the MPDU. This trace source is fired when a "
+                     "CTS is missing after an RTS or a Normal Ack is missing after an MPDU "
+                     "or after a DL MU PPDU acknowledged in SU format.",
+                     MakeTraceSourceAccessor (&WifiMac::m_mpduResponseTimeoutCallback),
+                     "ns3::WifiMac::MpduResponseTimeoutCallback")
+    .AddTraceSource ("PsduResponseTimeout",
+                     "A PSDU whose response was not received before the timeout, along with "
+                     "an identifier of the type of timeout (see WifiTxTimer::Reason) and the "
+                     "TXVECTOR used to transmit the PSDU. This trace source is fired when a "
+                     "BlockAck is missing after an A-MPDU, a BlockAckReq (possibly in the "
+                     "context of the acknowledgment of a DL MU PPDU in SU format) or a TB PPDU "
+                     "(in the latter case the missing BlockAck is a Multi-STA BlockAck).",
+                     MakeTraceSourceAccessor (&WifiMac::m_psduResponseTimeoutCallback),
+                     "ns3::WifiMac::PsduResponseTimeoutCallback")
+    .AddTraceSource ("PsduMapResponseTimeout",
+                     "A PSDU map for which not all the responses were received before the timeout, "
+                     "along with an identifier of the type of timeout (see WifiTxTimer::Reason), "
+                     "the set of MAC addresses of the stations that did not respond and the total "
+                     "number of stations that had to respond. This trace source is fired when not "
+                     "all the addressed stations responded to an MU-BAR Trigger frame (either sent as "
+                     "a SU frame or aggregated to PSDUs in the DL MU PPDU), a Basic Trigger Frame or "
+                     "a BSRP Trigger Frame.",
+                     MakeTraceSourceAccessor (&WifiMac::m_psduMapResponseTimeoutCallback),
+                     "ns3::WifiMac::PsduMapResponseTimeoutCallback")
   ;
   return tid;
 }
 
+
+void
+WifiMac::DoInitialize ()
+{
+  NS_LOG_FUNCTION (this);
+
+  if (m_txop != nullptr)
+    {
+      m_txop->Initialize ();
+    }
+
+  for (auto it = m_edca.begin (); it != m_edca.end (); ++it)
+    {
+      it->second->Initialize ();
+    }
+}
+
 void
 WifiMac::DoDispose ()
 {
+  NS_LOG_FUNCTION (this);
+
+  m_rxMiddle = 0;
+  m_txMiddle = 0;
+
+  m_channelAccessManager->Dispose ();
+  m_channelAccessManager = 0;
+
+  if (m_txop != nullptr)
+    {
+      m_txop->Dispose ();
+    }
+  m_txop = 0;
+
+  for (auto it = m_edca.begin (); it != m_edca.end (); ++it)
+    {
+      it->second->Dispose ();
+      it->second = 0;
+    }
+
+  if (m_feManager != 0)
+    {
+      m_feManager->Dispose ();
+    }
+  m_feManager = 0;
+
+  m_stationManager = 0;
+  m_phy = 0;
+
   m_device = 0;
 }
 
 void
-WifiMac::SetDevice (const Ptr<NetDevice> device)
+WifiMac::SetTypeOfStation (TypeOfStation type)
+{
+  NS_LOG_FUNCTION (this << type);
+  m_typeOfStation = type;
+}
+
+TypeOfStation
+WifiMac::GetTypeOfStation (void) const
+{
+  return m_typeOfStation;
+}
+
+void
+WifiMac::SetDevice (const Ptr<WifiNetDevice> device)
 {
   m_device = device;
 }
 
-Ptr<NetDevice>
+Ptr<WifiNetDevice>
 WifiMac::GetDevice (void) const
 {
   return m_device;
 }
 
 void
+WifiMac::SetAddress (Mac48Address address)
+{
+  NS_LOG_FUNCTION (this << address);
+  m_address = address;
+}
+
+Mac48Address
+WifiMac::GetAddress (void) const
+{
+  return m_address;
+}
+
+void
+WifiMac::SetSsid (Ssid ssid)
+{
+  NS_LOG_FUNCTION (this << ssid);
+  m_ssid = ssid;
+}
+
+Ssid
+WifiMac::GetSsid (void) const
+{
+  return m_ssid;
+}
+
+void
+WifiMac::SetBssid (Mac48Address bssid)
+{
+  NS_LOG_FUNCTION (this << bssid);
+  m_bssid = bssid;
+  if (m_feManager)
+    {
+      m_feManager->SetBssid (bssid);
+    }
+}
+
+Mac48Address
+WifiMac::GetBssid (void) const
+{
+  return m_bssid;
+}
+
+void
+WifiMac::SetPromisc (void)
+{
+  NS_ASSERT (m_feManager != 0);
+  m_feManager->SetPromisc ();
+}
+
+Ptr<Txop>
+WifiMac::GetTxop () const
+{
+  return m_txop;
+}
+
+Ptr<QosTxop>
+WifiMac::GetQosTxop (AcIndex ac) const
+{
+  // Use std::find_if() instead of std::map::find() because the latter compares
+  // the given AC index with the AC index of an element in the map by using the
+  // operator< defined for AcIndex, which aborts if an operand is not a QoS AC
+  // (the AC index passed to this method may not be a QoS AC).
+  // The performance penalty is limited because std::map::find() performs 3
+  // comparisons in the worst case, while std::find_if() performs 4 comparisons
+  // in the worst case.
+  const auto it = std::find_if (m_edca.cbegin (), m_edca.cend (),
+                                [ac](const auto& pair){ return pair.first == ac; });
+  return (it == m_edca.cend () ? nullptr : it->second);
+}
+
+Ptr<QosTxop>
+WifiMac::GetQosTxop (uint8_t tid) const
+{
+  return GetQosTxop (QosUtilsMapTidToAc (tid));
+}
+
+Ptr<QosTxop>
+WifiMac::GetVOQueue () const
+{
+  return (m_qosSupported ? GetQosTxop (AC_VO) : nullptr);
+}
+
+Ptr<QosTxop>
+WifiMac::GetVIQueue () const
+{
+  return (m_qosSupported ? GetQosTxop (AC_VI) : nullptr);
+}
+
+Ptr<QosTxop>
+WifiMac::GetBEQueue () const
+{
+  return (m_qosSupported ? GetQosTxop (AC_BE) : nullptr);
+}
+
+Ptr<QosTxop>
+WifiMac::GetBKQueue () const
+{
+  return (m_qosSupported ? GetQosTxop (AC_BK) : nullptr);
+}
+
+Ptr<WifiMacQueue>
+WifiMac::GetTxopQueue (AcIndex ac) const
+{
+  Ptr<Txop> txop = (ac == AC_BE_NQOS ? m_txop : StaticCast<Txop> (GetQosTxop (ac)));
+  return (txop != nullptr ? txop->GetWifiMacQueue () : nullptr);
+}
+
+void
+WifiMac::NotifyChannelSwitching (void)
+{
+  NS_LOG_FUNCTION (this);
+
+  // we may have changed PHY band, in which case it is necessary to re-configure
+  // the PHY dependent parameters. In any case, this makes no harm
+  ConfigurePhyDependentParameters ();
+
+  // SetupPhy not only resets the remote station manager, but also sets the
+  // default TX mode and MCS, which is required when switching to a channel
+  // in a different band
+  m_stationManager->SetupPhy (m_phy);
+}
+
+void
 WifiMac::NotifyTx (Ptr<const Packet> packet)
 {
   m_macTxTrace (packet);
@@ -124,9 +546,50 @@
 }
 
 void
+WifiMac::SetupEdcaQueue (AcIndex ac)
+{
+  NS_LOG_FUNCTION (this << ac);
+
+  //Our caller shouldn't be attempting to setup a queue that is
+  //already configured.
+  NS_ASSERT (m_edca.find (ac) == m_edca.end ());
+
+  Ptr<QosTxop> edca = CreateObject<QosTxop> (ac);
+  edca->SetChannelAccessManager (m_channelAccessManager);
+  edca->SetWifiMac (this);
+  edca->SetTxMiddle (m_txMiddle);
+  edca->GetBaManager ()->SetTxOkCallback (MakeCallback (&MpduTracedCallback::operator(),
+                                                        &m_ackedMpduCallback));
+  edca->GetBaManager ()->SetTxFailedCallback (MakeCallback (&MpduTracedCallback::operator(),
+                                                            &m_nackedMpduCallback));
+  edca->SetDroppedMpduCallback (MakeCallback (&DroppedMpduTracedCallback::operator(),
+                                              &m_droppedMpduCallback));
+
+  m_edca.insert (std::make_pair (ac, edca));
+}
+
+void
+WifiMac::ConfigureContentionWindow (uint32_t cwMin, uint32_t cwMax)
+{
+  bool isDsssOnly = GetDsssSupported () && !GetErpSupported ();
+  if (m_txop != nullptr)
+    {
+      //The special value of AC_BE_NQOS which exists in the Access
+      //Category enumeration allows us to configure plain old DCF.
+      ConfigureDcf (m_txop, cwMin, cwMax, isDsssOnly, AC_BE_NQOS);
+    }
+
+  //Now we configure the EDCA functions
+  for (auto it = m_edca.begin (); it!= m_edca.end (); ++it)
+    {
+      ConfigureDcf (it->second, cwMin, cwMax, isDsssOnly, it->first);
+    }
+}
+
+void
 WifiMac::ConfigureDcf (Ptr<Txop> dcf, uint32_t cwmin, uint32_t cwmax, bool isDsss, AcIndex ac)
 {
-  NS_LOG_FUNCTION (this << dcf << cwmin << cwmax << isDsss << ac);
+  NS_LOG_FUNCTION (this << dcf << cwmin << cwmax << isDsss << +ac);
   /* see IEEE 802.11 section 7.3.2.29 */
   switch (ac)
     {
@@ -183,25 +646,783 @@
     }
 }
 
+void
+WifiMac::ConfigureStandard (WifiStandard standard)
+{
+  NS_LOG_FUNCTION (this << standard);
+
+  NS_ABORT_IF (standard >= WIFI_STANDARD_80211n && !m_qosSupported);
+
+  SetupFrameExchangeManager (standard);
+}
+
+void
+WifiMac::ConfigurePhyDependentParameters (void)
+{
+  WifiPhyBand band = m_phy->GetPhyBand ();
+  NS_LOG_FUNCTION (this << band);
+
+  uint32_t cwmin = 0;
+  uint32_t cwmax = 0;
+
+  NS_ASSERT (m_phy != 0);
+  WifiStandard standard = m_phy->GetStandard ();
+
+  if (standard == WIFI_STANDARD_80211b)
+    {
+      SetDsssSupported (true);
+      cwmin = 31;
+      cwmax = 1023;
+    }
+  else
+    {
+      if (standard >= WIFI_STANDARD_80211g && band == WIFI_PHY_BAND_2_4GHZ)
+        {
+          SetErpSupported (true);
+        }
+
+      cwmin = 15;
+      cwmax = 1023;
+    }
+
+  ConfigureContentionWindow (cwmin, cwmax);
+}
+
+void
+WifiMac::SetupFrameExchangeManager (WifiStandard standard)
+{
+  NS_LOG_FUNCTION (this << standard);
+  NS_ABORT_MSG_IF (standard == WIFI_STANDARD_UNSPECIFIED, "Wifi standard not set");
+
+  if (standard >= WIFI_STANDARD_80211ax)
+    {
+      m_feManager = CreateObject<HeFrameExchangeManager> ();
+    }
+  else if (standard >= WIFI_STANDARD_80211ac)
+    {
+      m_feManager = CreateObject<VhtFrameExchangeManager> ();
+    }
+  else if (standard >= WIFI_STANDARD_80211n)
+    {
+      m_feManager = CreateObject<HtFrameExchangeManager> ();
+    }
+  else if (m_qosSupported)
+    {
+      m_feManager = CreateObject<QosFrameExchangeManager> ();
+    }
+  else
+    {
+      m_feManager = CreateObject<FrameExchangeManager> ();
+    }
+
+  m_feManager->SetWifiMac (this);
+  m_feManager->SetMacTxMiddle (m_txMiddle);
+  m_feManager->SetMacRxMiddle (m_rxMiddle);
+  m_feManager->SetAddress (GetAddress ());
+  m_feManager->SetBssid (GetBssid ());
+  m_feManager->GetWifiTxTimer ().SetMpduResponseTimeoutCallback (MakeCallback (&MpduResponseTimeoutTracedCallback::operator(),
+                                                                               &m_mpduResponseTimeoutCallback));
+  m_feManager->GetWifiTxTimer ().SetPsduResponseTimeoutCallback (MakeCallback (&PsduResponseTimeoutTracedCallback::operator(),
+                                                                               &m_psduResponseTimeoutCallback));
+  m_feManager->GetWifiTxTimer ().SetPsduMapResponseTimeoutCallback (MakeCallback (&PsduMapResponseTimeoutTracedCallback::operator(),
+                                                                                  &m_psduMapResponseTimeoutCallback));
+  m_feManager->SetDroppedMpduCallback (MakeCallback (&DroppedMpduTracedCallback::operator(),
+                                                     &m_droppedMpduCallback));
+  m_feManager->SetAckedMpduCallback (MakeCallback (&MpduTracedCallback::operator(),
+                                                   &m_ackedMpduCallback));
+  m_channelAccessManager->SetupFrameExchangeManager (m_feManager);
+  if (GetQosSupported ())
+    {
+      for (const auto& pair : m_edca)
+        {
+          pair.second->SetQosFrameExchangeManager (DynamicCast<QosFrameExchangeManager> (m_feManager));
+        }
+    }
+}
+
+Ptr<FrameExchangeManager>
+WifiMac::GetFrameExchangeManager (void) const
+{
+  return m_feManager;
+}
+
+void
+WifiMac::SetWifiRemoteStationManager (const Ptr<WifiRemoteStationManager> stationManager)
+{
+  NS_LOG_FUNCTION (this << stationManager);
+  m_stationManager = stationManager;
+}
+
+Ptr<WifiRemoteStationManager>
+WifiMac::GetWifiRemoteStationManager () const
+{
+  return m_stationManager;
+}
+
+void
+WifiMac::SetWifiPhy (const Ptr<WifiPhy> phy)
+{
+  NS_LOG_FUNCTION (this << phy);
+  m_phy = phy;
+  NS_ABORT_MSG_IF (!m_phy->GetOperatingChannel ().IsSet (),
+                   "PHY operating channel must have been set");
+  ConfigurePhyDependentParameters ();
+  m_channelAccessManager->SetupPhyListener (phy);
+  NS_ASSERT (m_feManager != 0);
+  m_feManager->SetWifiPhy (phy);
+}
+
+Ptr<WifiPhy>
+WifiMac::GetWifiPhy (void) const
+{
+  NS_LOG_FUNCTION (this);
+  return m_phy;
+}
+
+void
+WifiMac::ResetWifiPhy (void)
+{
+  NS_LOG_FUNCTION (this);
+  NS_ASSERT (m_feManager != 0);
+  m_feManager->ResetPhy ();
+  m_channelAccessManager->RemovePhyListener (m_phy);
+  m_phy = 0;
+}
+
+void
+WifiMac::SetQosSupported (bool enable)
+{
+  NS_LOG_FUNCTION (this << enable);
+  NS_ABORT_IF (IsInitialized ());
+  m_qosSupported = enable;
+
+  if (!m_qosSupported)
+    {
+      // create a non-QoS TXOP
+      m_txop = CreateObject<Txop> ();
+      m_txop->SetChannelAccessManager (m_channelAccessManager);
+      m_txop->SetWifiMac (this);
+      m_txop->SetTxMiddle (m_txMiddle);
+      m_txop->SetDroppedMpduCallback (MakeCallback (&DroppedMpduTracedCallback::operator(),
+                                                    &m_droppedMpduCallback));
+    }
+  else
+    {
+      //Construct the EDCAFs. The ordering is important - highest
+      //priority (Table 9-1 UP-to-AC mapping; IEEE 802.11-2012) must be created
+      //first.
+      SetupEdcaQueue (AC_VO);
+      SetupEdcaQueue (AC_VI);
+      SetupEdcaQueue (AC_BE);
+      SetupEdcaQueue (AC_BK);
+    }
+}
+
+bool
+WifiMac::GetQosSupported () const
+{
+  return m_qosSupported;
+}
+
+bool
+WifiMac::GetErpSupported () const
+{
+  return m_erpSupported;
+}
+
+void
+WifiMac::SetErpSupported (bool enable)
+{
+  NS_LOG_FUNCTION (this);
+  if (enable)
+    {
+      SetDsssSupported (true);
+    }
+  m_erpSupported = enable;
+}
+
+void
+WifiMac::SetDsssSupported (bool enable)
+{
+  NS_LOG_FUNCTION (this);
+  m_dsssSupported = enable;
+}
+
+bool
+WifiMac::GetDsssSupported () const
+{
+  return m_dsssSupported;
+}
+
+void
+WifiMac::SetCtsToSelfSupported (bool enable)
+{
+  NS_LOG_FUNCTION (this);
+  m_ctsToSelfSupported = enable;
+}
+
+void
+WifiMac::SetShortSlotTimeSupported (bool enable)
+{
+  NS_LOG_FUNCTION (this << enable);
+  m_shortSlotTimeSupported = enable;
+}
+
+bool
+WifiMac::GetShortSlotTimeSupported (void) const
+{
+  return m_shortSlotTimeSupported;
+}
+
+bool
+WifiMac::SupportsSendFrom (void) const
+{
+  return false;
+}
+
+void
+WifiMac::SetForwardUpCallback (ForwardUpCallback upCallback)
+{
+  NS_LOG_FUNCTION (this);
+  m_forwardUp = upCallback;
+}
+
+void
+WifiMac::SetLinkUpCallback (Callback<void> linkUp)
+{
+  NS_LOG_FUNCTION (this);
+  m_linkUp = linkUp;
+}
+
+void
+WifiMac::SetLinkDownCallback (Callback<void> linkDown)
+{
+  NS_LOG_FUNCTION (this);
+  m_linkDown = linkDown;
+}
+
+void
+WifiMac::Enqueue (Ptr<Packet> packet, Mac48Address to, Mac48Address from)
+{
+  //We expect WifiMac subclasses which do support forwarding (e.g.,
+  //AP) to override this method. Therefore, we throw a fatal error if
+  //someone tries to invoke this method on a class which has not done
+  //this.
+  NS_FATAL_ERROR ("This MAC entity (" << this << ", " << GetAddress ()
+                                      << ") does not support Enqueue() with from address");
+}
+
+void
+WifiMac::ForwardUp (Ptr<const Packet> packet, Mac48Address from, Mac48Address to)
+{
+  NS_LOG_FUNCTION (this << packet << from << to);
+  m_forwardUp (packet, from, to);
+}
+
+void
+WifiMac::Receive (Ptr<WifiMacQueueItem> mpdu)
+{
+  NS_LOG_FUNCTION (this << *mpdu);
+
+  const WifiMacHeader* hdr = &mpdu->GetHeader ();
+  Ptr<Packet> packet = mpdu->GetPacket ()->Copy ();
+  Mac48Address to = hdr->GetAddr1 ();
+  Mac48Address from = hdr->GetAddr2 ();
+
+  //We don't know how to deal with any frame that is not addressed to
+  //us (and odds are there is nothing sensible we could do anyway),
+  //so we ignore such frames.
+  //
+  //The derived class may also do some such filtering, but it doesn't
+  //hurt to have it here too as a backstop.
+  if (to != GetAddress ())
+    {
+      return;
+    }
+
+  if (hdr->IsMgt () && hdr->IsAction ())
+    {
+      //There is currently only any reason for Management Action
+      //frames to be flying about if we are a QoS STA.
+      NS_ASSERT (GetQosSupported ());
+
+      WifiActionHeader actionHdr;
+      packet->RemoveHeader (actionHdr);
+
+      switch (actionHdr.GetCategory ())
+        {
+        case WifiActionHeader::BLOCK_ACK:
+
+          switch (actionHdr.GetAction ().blockAck)
+            {
+            case WifiActionHeader::BLOCK_ACK_ADDBA_REQUEST:
+              {
+                MgtAddBaRequestHeader reqHdr;
+                packet->RemoveHeader (reqHdr);
+
+                //We've received an ADDBA Request. Our policy here is
+                //to automatically accept it, so we get the ADDBA
+                //Response on it's way immediately.
+                NS_ASSERT (m_feManager != 0);
+                Ptr<HtFrameExchangeManager> htFem = DynamicCast<HtFrameExchangeManager> (m_feManager);
+                if (htFem != 0)
+                  {
+                    htFem->SendAddBaResponse (&reqHdr, from);
+                  }
+                //This frame is now completely dealt with, so we're done.
+                return;
+              }
+            case WifiActionHeader::BLOCK_ACK_ADDBA_RESPONSE:
+              {
+                MgtAddBaResponseHeader respHdr;
+                packet->RemoveHeader (respHdr);
+
+                //We've received an ADDBA Response. We assume that it
+                //indicates success after an ADDBA Request we have
+                //sent (we could, in principle, check this, but it
+                //seems a waste given the level of the current model)
+                //and act by locally establishing the agreement on
+                //the appropriate queue.
+                GetQosTxop (respHdr.GetTid ())->GotAddBaResponse (&respHdr, from);
+                auto htFem = DynamicCast<HtFrameExchangeManager> (m_feManager);
+                if (htFem != 0)
+                  {
+                    GetQosTxop (respHdr.GetTid ())->GetBaManager ()->SetBlockAckInactivityCallback (MakeCallback (&HtFrameExchangeManager::SendDelbaFrame, htFem));
+                  }
+                //This frame is now completely dealt with, so we're done.
+                return;
+              }
+            case WifiActionHeader::BLOCK_ACK_DELBA:
+              {
+                MgtDelBaHeader delBaHdr;
+                packet->RemoveHeader (delBaHdr);
+
+                if (delBaHdr.IsByOriginator ())
+                  {
+                    //This DELBA frame was sent by the originator, so
+                    //this means that an ingoing established
+                    //agreement exists in HtFrameExchangeManager and we need to
+                    //destroy it.
+                    NS_ASSERT (m_feManager != 0);
+                    Ptr<HtFrameExchangeManager> htFem = DynamicCast<HtFrameExchangeManager> (m_feManager);
+                    if (htFem != 0)
+                      {
+                        htFem->DestroyBlockAckAgreement (from, delBaHdr.GetTid ());
+                      }
+                  }
+                else
+                  {
+                    //We must have been the originator. We need to
+                    //tell the correct queue that the agreement has
+                    //been torn down
+                    GetQosTxop (delBaHdr.GetTid ())->GotDelBaFrame (&delBaHdr, from);
+                  }
+                //This frame is now completely dealt with, so we're done.
+                return;
+              }
+            default:
+              NS_FATAL_ERROR ("Unsupported Action field in Block Ack Action frame");
+              return;
+            }
+        default:
+          NS_FATAL_ERROR ("Unsupported Action frame received");
+          return;
+        }
+    }
+  NS_FATAL_ERROR ("Don't know how to handle frame (type=" << hdr->GetType ());
+}
+
+void
+WifiMac::DeaggregateAmsduAndForward (Ptr<WifiMacQueueItem> mpdu)
+{
+  NS_LOG_FUNCTION (this << *mpdu);
+  for (auto& msduPair : *PeekPointer (mpdu))
+    {
+      ForwardUp (msduPair.first, msduPair.second.GetSourceAddr (),
+                 msduPair.second.GetDestinationAddr ());
+    }
+}
+
 Ptr<HtConfiguration>
 WifiMac::GetHtConfiguration (void) const
 {
-      Ptr<WifiNetDevice> device = DynamicCast<WifiNetDevice> (GetDevice ());
-      return device->GetHtConfiguration ();
+  return GetDevice ()->GetHtConfiguration ();
 }
 
 Ptr<VhtConfiguration>
 WifiMac::GetVhtConfiguration (void) const
 {
-      Ptr<WifiNetDevice> device = DynamicCast<WifiNetDevice> (GetDevice ());
-      return device->GetVhtConfiguration ();
+  return GetDevice ()->GetVhtConfiguration ();
 }
 
 Ptr<HeConfiguration>
 WifiMac::GetHeConfiguration (void) const
 {
-      Ptr<WifiNetDevice> device = DynamicCast<WifiNetDevice> (GetDevice ());
-      return device->GetHeConfiguration ();
+  return GetDevice ()->GetHeConfiguration ();
+}
+
+bool
+WifiMac::GetHtSupported () const
+{
+  if (GetHtConfiguration ())
+    {
+      return true;
+    }
+  return false;
+}
+
+bool
+WifiMac::GetVhtSupported () const
+{
+  if (GetVhtConfiguration ())
+    {
+      return true;
+    }
+  return false;
+}
+
+bool
+WifiMac::GetHeSupported () const
+{
+  if (GetHeConfiguration ())
+    {
+      return true;
+    }
+  return false;
+}
+
+void
+WifiMac::SetVoBlockAckThreshold (uint8_t threshold)
+{
+  NS_LOG_FUNCTION (this << +threshold);
+  if (m_qosSupported)
+    {
+      GetVOQueue ()->SetBlockAckThreshold (threshold);
+    }
+}
+
+void
+WifiMac::SetViBlockAckThreshold (uint8_t threshold)
+{
+  NS_LOG_FUNCTION (this << +threshold);
+  if (m_qosSupported)
+    {
+      GetVIQueue ()->SetBlockAckThreshold (threshold);
+    }
+}
+
+void
+WifiMac::SetBeBlockAckThreshold (uint8_t threshold)
+{
+  NS_LOG_FUNCTION (this << +threshold);
+  if (m_qosSupported)
+    {
+      GetBEQueue ()->SetBlockAckThreshold (threshold);
+    }
+}
+
+void
+WifiMac::SetBkBlockAckThreshold (uint8_t threshold)
+{
+  NS_LOG_FUNCTION (this << +threshold);
+  if (m_qosSupported)
+    {
+      GetBKQueue ()->SetBlockAckThreshold (threshold);
+    }
+}
+
+void
+WifiMac::SetVoBlockAckInactivityTimeout (uint16_t timeout)
+{
+  NS_LOG_FUNCTION (this << timeout);
+  if (m_qosSupported)
+    {
+      GetVOQueue ()->SetBlockAckInactivityTimeout (timeout);
+    }
+}
+
+void
+WifiMac::SetViBlockAckInactivityTimeout (uint16_t timeout)
+{
+  NS_LOG_FUNCTION (this << timeout);
+  if (m_qosSupported)
+    {
+      GetVIQueue ()->SetBlockAckInactivityTimeout (timeout);
+    }
+}
+
+void
+WifiMac::SetBeBlockAckInactivityTimeout (uint16_t timeout)
+{
+  NS_LOG_FUNCTION (this << timeout);
+  if (m_qosSupported)
+    {
+      GetBEQueue ()->SetBlockAckInactivityTimeout (timeout);
+    }
+}
+
+void
+WifiMac::SetBkBlockAckInactivityTimeout (uint16_t timeout)
+{
+  NS_LOG_FUNCTION (this << timeout);
+  if (m_qosSupported)
+    {
+      GetBKQueue ()->SetBlockAckInactivityTimeout (timeout);
+    }
+}
+
+ExtendedCapabilities
+WifiMac::GetExtendedCapabilities (void) const
+{
+  NS_LOG_FUNCTION (this);
+  ExtendedCapabilities capabilities;
+  capabilities.SetHtSupported (GetHtSupported ());
+  capabilities.SetVhtSupported (GetVhtSupported ());
+  //TODO: to be completed
+  return capabilities;
+}
+
+HtCapabilities
+WifiMac::GetHtCapabilities (void) const
+{
+  NS_LOG_FUNCTION (this);
+  HtCapabilities capabilities;
+  if (GetHtSupported ())
+    {
+      Ptr<HtConfiguration> htConfiguration = GetHtConfiguration ();
+      bool sgiSupported = htConfiguration->GetShortGuardIntervalSupported ();
+      capabilities.SetHtSupported (1);
+      capabilities.SetLdpc (htConfiguration->GetLdpcSupported ());
+      capabilities.SetSupportedChannelWidth (GetWifiPhy ()->GetChannelWidth () >= 40);
+      capabilities.SetShortGuardInterval20 (sgiSupported);
+      capabilities.SetShortGuardInterval40 (GetWifiPhy ()->GetChannelWidth () >= 40 && sgiSupported);
+      // Set Maximum A-MSDU Length subfield
+      uint16_t maxAmsduSize = std::max ({m_voMaxAmsduSize, m_viMaxAmsduSize,
+                                         m_beMaxAmsduSize, m_bkMaxAmsduSize});
+      if (maxAmsduSize <= 3839)
+        {
+          capabilities.SetMaxAmsduLength (3839);
+        }
+      else
+        {
+          capabilities.SetMaxAmsduLength (7935);
+        }
+      uint32_t maxAmpduLength = std::max ({m_voMaxAmpduSize, m_viMaxAmpduSize,
+                                           m_beMaxAmpduSize, m_bkMaxAmpduSize});
+      // round to the next power of two minus one
+      maxAmpduLength = (1ul << static_cast<uint32_t> (std::ceil (std::log2 (maxAmpduLength + 1)))) - 1;
+      // The maximum A-MPDU length in HT capabilities elements ranges from 2^13-1 to 2^16-1
+      capabilities.SetMaxAmpduLength (std::min (std::max (maxAmpduLength, 8191u), 65535u));
+
+      capabilities.SetLSigProtectionSupport (true);
+      uint64_t maxSupportedRate = 0; //in bit/s
+      for (const auto & mcs : GetWifiPhy ()->GetMcsList (WIFI_MOD_CLASS_HT))
+        {
+          capabilities.SetRxMcsBitmask (mcs.GetMcsValue ());
+          uint8_t nss = (mcs.GetMcsValue () / 8) + 1;
+          NS_ASSERT (nss > 0 && nss < 5);
+          uint64_t dataRate = mcs.GetDataRate (GetWifiPhy ()->GetChannelWidth (), sgiSupported ? 400 : 800, nss);
+          if (dataRate > maxSupportedRate)
+            {
+              maxSupportedRate = dataRate;
+              NS_LOG_DEBUG ("Updating maxSupportedRate to " << maxSupportedRate);
+            }
+        }
+      capabilities.SetRxHighestSupportedDataRate (static_cast<uint16_t> (maxSupportedRate / 1e6)); //in Mbit/s
+      capabilities.SetTxMcsSetDefined (GetWifiPhy ()->GetNMcs () > 0);
+      capabilities.SetTxMaxNSpatialStreams (GetWifiPhy ()->GetMaxSupportedTxSpatialStreams ());
+      //we do not support unequal modulations
+      capabilities.SetTxRxMcsSetUnequal (0);
+      capabilities.SetTxUnequalModulation (0);
+    }
+  return capabilities;
+}
+
+VhtCapabilities
+WifiMac::GetVhtCapabilities (void) const
+{
+  NS_LOG_FUNCTION (this);
+  VhtCapabilities capabilities;
+  if (GetVhtSupported ())
+    {
+      Ptr<HtConfiguration> htConfiguration = GetHtConfiguration ();
+      Ptr<VhtConfiguration> vhtConfiguration = GetVhtConfiguration ();
+      bool sgiSupported = htConfiguration->GetShortGuardIntervalSupported ();
+      capabilities.SetVhtSupported (1);
+      if (GetWifiPhy ()->GetChannelWidth () == 160)
+        {
+          capabilities.SetSupportedChannelWidthSet (1);
+        }
+      else
+        {
+          capabilities.SetSupportedChannelWidthSet (0);
+        }
+      // Set Maximum MPDU Length subfield
+      uint16_t maxAmsduSize = std::max ({m_voMaxAmsduSize, m_viMaxAmsduSize,
+                                         m_beMaxAmsduSize, m_bkMaxAmsduSize});
+      if (maxAmsduSize <= 3839)
+        {
+          capabilities.SetMaxMpduLength (3895);
+        }
+      else if (maxAmsduSize <= 7935)
+        {
+          capabilities.SetMaxMpduLength (7991);
+        }
+      else
+        {
+          capabilities.SetMaxMpduLength (11454);
+        }
+      uint32_t maxAmpduLength = std::max ({m_voMaxAmpduSize, m_viMaxAmpduSize,
+                                           m_beMaxAmpduSize, m_bkMaxAmpduSize});
+      // round to the next power of two minus one
+      maxAmpduLength = (1ul << static_cast<uint32_t> (std::ceil (std::log2 (maxAmpduLength + 1)))) - 1;
+      // The maximum A-MPDU length in VHT capabilities elements ranges from 2^13-1 to 2^20-1
+      capabilities.SetMaxAmpduLength (std::min (std::max (maxAmpduLength, 8191u), 1048575u));
+
+      capabilities.SetRxLdpc (htConfiguration->GetLdpcSupported ());
+      capabilities.SetShortGuardIntervalFor80Mhz ((GetWifiPhy ()->GetChannelWidth () == 80) && sgiSupported);
+      capabilities.SetShortGuardIntervalFor160Mhz ((GetWifiPhy ()->GetChannelWidth () == 160) && sgiSupported);
+      uint8_t maxMcs = 0;
+      for (const auto & mcs : GetWifiPhy ()->GetMcsList (WIFI_MOD_CLASS_VHT))
+        {
+          if (mcs.GetMcsValue () > maxMcs)
+            {
+              maxMcs = mcs.GetMcsValue ();
+            }
+        }
+      // Support same MaxMCS for each spatial stream
+      for (uint8_t nss = 1; nss <= GetWifiPhy ()->GetMaxSupportedRxSpatialStreams (); nss++)
+        {
+          capabilities.SetRxMcsMap (maxMcs, nss);
+        }
+      for (uint8_t nss = 1; nss <= GetWifiPhy ()->GetMaxSupportedTxSpatialStreams (); nss++)
+        {
+          capabilities.SetTxMcsMap (maxMcs, nss);
+        }
+      uint64_t maxSupportedRateLGI = 0; //in bit/s
+      for (const auto & mcs : GetWifiPhy ()->GetMcsList (WIFI_MOD_CLASS_VHT))
+        {
+          if (!mcs.IsAllowed (GetWifiPhy ()->GetChannelWidth (), 1))
+            {
+              continue;
+            }
+          if (mcs.GetDataRate (GetWifiPhy ()->GetChannelWidth ()) > maxSupportedRateLGI)
+            {
+              maxSupportedRateLGI = mcs.GetDataRate (GetWifiPhy ()->GetChannelWidth ());
+              NS_LOG_DEBUG ("Updating maxSupportedRateLGI to " << maxSupportedRateLGI);
+            }
+        }
+      capabilities.SetRxHighestSupportedLgiDataRate (static_cast<uint16_t> (maxSupportedRateLGI / 1e6)); //in Mbit/s
+      capabilities.SetTxHighestSupportedLgiDataRate (static_cast<uint16_t> (maxSupportedRateLGI / 1e6)); //in Mbit/s
+      //To be filled in once supported
+      capabilities.SetRxStbc (0);
+      capabilities.SetTxStbc (0);
+    }
+  return capabilities;
+}
+
+HeCapabilities
+WifiMac::GetHeCapabilities (void) const
+{
+  NS_LOG_FUNCTION (this);
+  HeCapabilities capabilities;
+  if (GetHeSupported ())
+    {
+      Ptr<HtConfiguration> htConfiguration = GetHtConfiguration ();
+      Ptr<HeConfiguration> heConfiguration = GetHeConfiguration ();
+      capabilities.SetHeSupported (1);
+      uint8_t channelWidthSet = 0;
+      if ((m_phy->GetChannelWidth () >= 40) && (m_phy->GetPhyBand () == WIFI_PHY_BAND_2_4GHZ))
+        {
+          channelWidthSet |= 0x01;
+        }
+      if ((m_phy->GetChannelWidth () >= 80) && ((m_phy->GetPhyBand () == WIFI_PHY_BAND_5GHZ) || (m_phy->GetPhyBand () == WIFI_PHY_BAND_6GHZ)))
+        {
+          channelWidthSet |= 0x02;
+        }
+      if ((m_phy->GetChannelWidth () >= 160) && ((m_phy->GetPhyBand () == WIFI_PHY_BAND_5GHZ) || (m_phy->GetPhyBand () == WIFI_PHY_BAND_6GHZ)))
+        {
+          channelWidthSet |= 0x04;
+        }
+      capabilities.SetChannelWidthSet (channelWidthSet);
+      capabilities.SetLdpcCodingInPayload (htConfiguration->GetLdpcSupported ());
+      if (heConfiguration->GetGuardInterval () == NanoSeconds (800))
+        {
+          //todo: We assume for now that if we support 800ns GI then 1600ns GI is supported as well
+          //todo: Assuming reception support for both 1x HE LTF and 4x HE LTF 800 ns
+          capabilities.SetHeSuPpdu1xHeLtf800nsGi (true);
+          capabilities.SetHePpdu4xHeLtf800nsGi (true);
+        }
+
+      uint32_t maxAmpduLength = std::max ({m_voMaxAmpduSize, m_viMaxAmpduSize,
+                                           m_beMaxAmpduSize, m_bkMaxAmpduSize});
+      // round to the next power of two minus one
+      maxAmpduLength = (1ul << static_cast<uint32_t> (std::ceil (std::log2 (maxAmpduLength + 1)))) - 1;
+      // The maximum A-MPDU length in HE capabilities elements ranges from 2^20-1 to 2^23-1
+      capabilities.SetMaxAmpduLength (std::min (std::max (maxAmpduLength, 1048575u), 8388607u));
+
+      uint8_t maxMcs = 0;
+      for (const auto & mcs : m_phy->GetMcsList (WIFI_MOD_CLASS_HE))
+        {
+          if (mcs.GetMcsValue () > maxMcs)
+            {
+              maxMcs = mcs.GetMcsValue ();
+            }
+        }
+      capabilities.SetHighestMcsSupported (maxMcs);
+      capabilities.SetHighestNssSupported (m_phy->GetMaxSupportedTxSpatialStreams ());
+    }
+  return capabilities;
+}
+
+uint32_t
+WifiMac::GetMaxAmpduSize (AcIndex ac) const
+{
+  uint32_t maxSize = 0;
+  switch (ac)
+    {
+      case AC_BE:
+        maxSize = m_beMaxAmpduSize;
+        break;
+      case AC_BK:
+        maxSize = m_bkMaxAmpduSize;
+        break;
+      case AC_VI:
+        maxSize = m_viMaxAmpduSize;
+        break;
+      case AC_VO:
+        maxSize = m_voMaxAmpduSize;
+        break;
+      default:
+        NS_ABORT_MSG ("Unknown AC " << ac);
+        return 0;
+    }
+  return maxSize;
+}
+
+uint16_t
+WifiMac::GetMaxAmsduSize (AcIndex ac) const
+{
+  uint16_t maxSize = 0;
+  switch (ac)
+    {
+      case AC_BE:
+        maxSize = m_beMaxAmsduSize;
+        break;
+      case AC_BK:
+        maxSize = m_bkMaxAmsduSize;
+        break;
+      case AC_VI:
+        maxSize = m_viMaxAmsduSize;
+        break;
+      case AC_VO:
+        maxSize = m_voMaxAmsduSize;
+        break;
+      default:
+        NS_ABORT_MSG ("Unknown AC " << ac);
+        return 0;
+    }
+  return maxSize;
 }
 
 } //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/wifi-mac.h ns-3.36/src/wifi/model/wifi-mac.h
--- ns-3.35/src/wifi/model/wifi-mac.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/wifi-mac.h	2022-04-30 18:23:58.214735300 -0700
@@ -21,18 +21,29 @@
 #ifndef WIFI_MAC_H
 #define WIFI_MAC_H
 
-#include "ns3/net-device.h"
+#include <set>
+#include <unordered_map>
 #include "wifi-standards.h"
 #include "wifi-remote-station-manager.h"
 #include "qos-utils.h"
+#include "ssid.h"
 
 namespace ns3 {
 
-class Ssid;
 class Txop;
+class WifiNetDevice;
+class QosTxop;
+class WifiPsdu;
+class MacRxMiddle;
+class MacTxMiddle;
+class WifiMacQueue;
+class WifiMacQueueItem;
 class HtConfiguration;
 class VhtConfiguration;
 class HeConfiguration;
+class FrameExchangeManager;
+class ChannelAccessManager;
+class ExtendedCapabilities;
 
 /**
  * Enumeration for type of station
@@ -59,6 +70,8 @@
   WIFI_MAC_DROP_QOS_OLD_PACKET
 };
 
+typedef std::unordered_map <uint16_t /* staId */, Ptr<WifiPsdu> /* PSDU */> WifiPsduMap;
+
 /**
  * \brief base class for all MAC-level wifi objects.
  * \ingroup wifi
@@ -71,26 +84,64 @@
 class WifiMac : public Object
 {
 public:
-  virtual void DoDispose ();
-
   /**
    * \brief Get the type ID.
    * \return the object TypeId
    */
   static TypeId GetTypeId (void);
 
+  WifiMac ();
+  virtual ~WifiMac ();
+
   /**
    * Sets the device this PHY is associated with.
    *
    * \param device the device this PHY is associated with
    */
-  void SetDevice (const Ptr<NetDevice> device);
+  void SetDevice (const Ptr<WifiNetDevice> device);
   /**
    * Return the device this PHY is associated with
    *
    * \return the device this PHY is associated with
    */
-  Ptr<NetDevice> GetDevice (void) const;
+  Ptr<WifiNetDevice> GetDevice (void) const;
+
+  /**
+   * Get the Frame Exchange Manager
+   *
+   * \return the Frame Exchange Manager
+   */
+  Ptr<FrameExchangeManager> GetFrameExchangeManager (void) const;
+
+  /**
+   * Accessor for the Txop object
+   *
+   * \return a smart pointer to Txop
+   */
+  Ptr<Txop> GetTxop (void) const;
+  /**
+   * Accessor for a specified EDCA object
+   *
+   * \param ac the Access Category
+   * \return a smart pointer to a QosTxop
+   */
+  Ptr<QosTxop> GetQosTxop (AcIndex ac) const;
+  /**
+   * Accessor for a specified EDCA object
+   *
+   * \param tid the Traffic ID
+   * \return a smart pointer to a QosTxop
+   */
+  Ptr<QosTxop> GetQosTxop (uint8_t tid) const;
+  /**
+   * Get the wifi MAC queue of the (Qos)Txop associated with the given AC,
+   * if such (Qos)Txop is installed, or a null pointer, otherwise.
+   *
+   * \param ac the given Access Category
+   * \return the wifi MAC queue of the (Qos)Txop associated with the given AC,
+   *         if such (Qos)Txop is installed, or a null pointer, otherwise
+   */
+  virtual Ptr<WifiMacQueue> GetTxopQueue (AcIndex ac) const;
 
    /**
    * This method is invoked by a subclass to specify what type of
@@ -99,25 +150,18 @@
    *
    * \param type the type of station.
    */
-  virtual void SetTypeOfStation (TypeOfStation type) = 0;
+  void SetTypeOfStation (TypeOfStation type);
   /**
    * Return the type of station.
    *
    * \return the type of station.
    */
-  virtual TypeOfStation GetTypeOfStation (void) const = 0;
+  TypeOfStation GetTypeOfStation (void) const;
 
  /**
    * \param ssid the current SSID of this MAC layer.
    */
-  virtual void SetSsid (Ssid ssid) = 0;
-  /**
-   * Enable or disable short slot time feature.
-   *
-   * \param enable true if short slot time is to be supported,
-   *               false otherwise
-   */
-  virtual void SetShortSlotTimeSupported (bool enable) = 0;
+  void SetSsid (Ssid ssid);
   /**
    * \brief Sets the interface in promiscuous mode.
    *
@@ -125,30 +169,45 @@
    * filtering on the incoming frame path may affect the overall
    * behavior.
    */
-  virtual void SetPromisc (void) = 0;
+  void SetPromisc (void);
+  /**
+   * Enable or disable CTS-to-self feature.
+   *
+   * \param enable true if CTS-to-self is to be supported,
+   *               false otherwise
+   */
+  void SetCtsToSelfSupported (bool enable);
 
   /**
    * \return the MAC address associated to this MAC layer.
    */
-  virtual Mac48Address GetAddress (void) const = 0;
+  Mac48Address GetAddress (void) const;
   /**
    * \return the SSID which this MAC layer is going to try to stay in.
    */
-  virtual Ssid GetSsid (void) const = 0;
+  Ssid GetSsid (void) const;
   /**
    * \param address the current address of this MAC layer.
    */
-  virtual void SetAddress (Mac48Address address) = 0;
+  virtual void SetAddress (Mac48Address address);
   /**
    * \return the BSSID of the network this device belongs to.
    */
-  virtual Mac48Address GetBssid (void) const = 0;
+  Mac48Address GetBssid (void) const;
   /**
-   * \return whether the device supports short slot time capability.
+   * \param bssid the BSSID of the network that this device belongs to.
    */
-  virtual bool GetShortSlotTimeSupported (void) const = 0;
+  void SetBssid (Mac48Address bssid);
 
   /**
+   * Return true if packets can be forwarded to the given destination,
+   * false otherwise.
+   *
+   * \param to the address to which the packet should be sent
+   * \return whether packets can be forwarded to the given destination
+   */
+  virtual bool CanForwardPacketsTo (Mac48Address to) const = 0;
+  /**
    * \param packet the packet to send.
    * \param to the address to which the packet should be sent.
    * \param from the address from which the packet should be sent.
@@ -159,7 +218,7 @@
    * this device to operate in a bridged mode, forwarding received
    * frames without altering the source address.
    */
-  virtual void Enqueue (Ptr<Packet> packet, Mac48Address to, Mac48Address from) = 0;
+  virtual void Enqueue (Ptr<Packet> packet, Mac48Address to, Mac48Address from);
   /**
    * \param packet the packet to send.
    * \param to the address to which the packet should be sent.
@@ -176,27 +235,29 @@
    * This function returns true if sending from arbitrary address is supported,
    * false otherwise.
    */
-  virtual bool SupportsSendFrom (void) const = 0;
+  virtual bool SupportsSendFrom (void) const;
+
   /**
    * \param phy the physical layer attached to this MAC.
    */
-  virtual void SetWifiPhy (Ptr<WifiPhy> phy) = 0;
+  virtual void SetWifiPhy (Ptr<WifiPhy> phy);
   /**
    * \return the physical layer attached to this MAC
    */
-  virtual Ptr<WifiPhy> GetWifiPhy (void) const = 0;
+  Ptr<WifiPhy> GetWifiPhy (void) const;
   /**
    * Remove currently attached WifiPhy device from this MAC.
    */
-  virtual void ResetWifiPhy (void) = 0;
+  void ResetWifiPhy (void);
+
   /**
    * \param stationManager the station manager attached to this MAC.
    */
-  virtual void SetWifiRemoteStationManager (Ptr<WifiRemoteStationManager> stationManager) = 0;
+  void SetWifiRemoteStationManager (Ptr<WifiRemoteStationManager> stationManager);
   /**
    * \return the station manager attached to this MAC.
    */
-  virtual Ptr<WifiRemoteStationManager> GetWifiRemoteStationManager (void) const = 0;
+  Ptr<WifiRemoteStationManager> GetWifiRemoteStationManager (void) const;
 
   /**
    * This type defines the callback of a higher layer that a
@@ -212,20 +273,25 @@
    * \param upCallback the callback to invoke when a packet must be
    *        forwarded up the stack.
    */
-  virtual void SetForwardUpCallback (ForwardUpCallback upCallback) = 0;
+  void SetForwardUpCallback (ForwardUpCallback upCallback);
   /**
    * \param linkUp the callback to invoke when the link becomes up.
    */
-  virtual void SetLinkUpCallback (Callback<void> linkUp) = 0;
+  virtual void SetLinkUpCallback (Callback<void> linkUp);
   /**
    * \param linkDown the callback to invoke when the link becomes down.
    */
-  virtual void SetLinkDownCallback (Callback<void> linkDown) = 0;
+  void SetLinkDownCallback (Callback<void> linkDown);
   /* Next functions are not pure virtual so non QoS WifiMacs are not
    * forced to implement them.
    */
 
   /**
+   * Notify that channel has been switched.
+   */
+  virtual void NotifyChannelSwitching (void);
+
+  /**
    * \param packet the packet being enqueued
    *
    * Public method used to fire a MacTx trace. Implemented for encapsulation purposes.
@@ -267,7 +333,7 @@
    * Subclasses should implement this method to configure their DCF queues
    * according to the requested standard.
    */
-  virtual void ConfigureStandard (WifiStandard standard) = 0;
+  virtual void ConfigureStandard (WifiStandard standard);
 
   /**
    * \return pointer to HtConfiguration if it exists
@@ -282,8 +348,195 @@
    */
   Ptr<HeConfiguration> GetHeConfiguration (void) const;
 
+  /**
+   * Return the extended capabilities of the device.
+   *
+   * \return the extended capabilities that we support
+   */
+  ExtendedCapabilities GetExtendedCapabilities (void) const;
+  /**
+   * Return the HT capabilities of the device.
+   *
+   * \return the HT capabilities that we support
+   */
+  HtCapabilities GetHtCapabilities (void) const;
+  /**
+   * Return the VHT capabilities of the device.
+   *
+   * \return the VHT capabilities that we support
+   */
+  VhtCapabilities GetVhtCapabilities (void) const;
+  /**
+   * Return the HE capabilities of the device.
+   *
+   * \return the HE capabilities that we support
+   */
+  HeCapabilities GetHeCapabilities (void) const;
+
+  /**
+   * Return whether the device supports QoS.
+   *
+   * \return true if QoS is supported, false otherwise
+   */
+  bool GetQosSupported () const;
+  /**
+   * Return whether the device supports ERP.
+   *
+   * \return true if ERP is supported, false otherwise
+   */
+  bool GetErpSupported () const;
+  /**
+   * Return whether the device supports DSSS.
+   *
+   * \return true if DSSS is supported, false otherwise
+   */
+  bool GetDsssSupported () const;
+  /**
+   * Return whether the device supports HT.
+   *
+   * \return true if HT is supported, false otherwise
+   */
+  bool GetHtSupported () const;
+  /**
+   * Return whether the device supports VHT.
+   *
+   * \return true if VHT is supported, false otherwise
+   */
+  bool GetVhtSupported () const;
+  /**
+   * Return whether the device supports HE.
+   *
+   * \return true if HE is supported, false otherwise
+   */
+  bool GetHeSupported () const;
+
+  /**
+   * Return the maximum A-MPDU size of the given Access Category.
+   *
+   * \param ac Access Category index
+   * \return the maximum A-MPDU size
+   */
+  uint32_t GetMaxAmpduSize (AcIndex ac) const;
+  /**
+   * Return the maximum A-MSDU size of the given Access Category.
+   *
+   * \param ac Access Category index
+   * \return the maximum A-MSDU size
+   */
+  uint16_t GetMaxAmsduSize (AcIndex ac) const;
+
 
 protected:
+  void DoInitialize () override;
+  void DoDispose () override;
+
+  /**
+   * \param cwMin the minimum contention window size
+   * \param cwMax the maximum contention window size
+   *
+   * This method is called to set the minimum and the maximum
+   * contention window size.
+   */
+  virtual void ConfigureContentionWindow (uint32_t cwMin, uint32_t cwMax);
+
+  /**
+   * Enable or disable QoS support for the device. Construct a Txop object
+   * or QosTxop objects accordingly. This method can only be called before
+   * initialization.
+   *
+   * \param enable whether QoS is supported
+   */
+  void SetQosSupported (bool enable);
+
+  /**
+   * Enable or disable short slot time feature.
+   *
+   * \param enable true if short slot time is to be supported,
+   *               false otherwise
+   */
+  void SetShortSlotTimeSupported (bool enable);
+  /**
+   * \return whether the device supports short slot time capability.
+   */
+  bool GetShortSlotTimeSupported (void) const;
+
+  /**
+   * Accessor for the AC_VO channel access function
+   *
+   * \return a smart pointer to QosTxop
+   */
+  Ptr<QosTxop> GetVOQueue (void) const;
+  /**
+   * Accessor for the AC_VI channel access function
+   *
+   * \return a smart pointer to QosTxop
+   */
+  Ptr<QosTxop> GetVIQueue (void) const;
+  /**
+   * Accessor for the AC_BE channel access function
+   *
+   * \return a smart pointer to QosTxop
+   */
+  Ptr<QosTxop> GetBEQueue (void) const;
+  /**
+   * Accessor for the AC_BK channel access function
+   *
+   * \return a smart pointer to QosTxop
+   */
+  Ptr<QosTxop> GetBKQueue (void) const;
+
+  /**
+   * This method acts as the MacRxMiddle receive callback and is
+   * invoked to notify us that a frame has been received. The
+   * implementation is intended to capture logic that is going to be
+   * common to all (or most) derived classes. Specifically, handling
+   * of Block Ack management frames is dealt with here.
+   *
+   * This method will need, however, to be overridden by derived
+   * classes so that they can perform their data handling before
+   * invoking the base version.
+   *
+   * \param mpdu the MPDU that has been received.
+   */
+  virtual void Receive (Ptr<WifiMacQueueItem> mpdu);
+  /**
+   * Forward the packet up to the device.
+   *
+   * \param packet the packet that we are forwarding up to the device
+   * \param from the address of the source
+   * \param to the address of the destination
+   */
+  void ForwardUp (Ptr<const Packet> packet, Mac48Address from, Mac48Address to);
+
+  /**
+   * This method can be called to de-aggregate an A-MSDU and forward
+   * the constituent packets up the stack.
+   *
+   * \param mpdu the MPDU containing the A-MSDU.
+   */
+  virtual void DeaggregateAmsduAndForward (Ptr<WifiMacQueueItem> mpdu);
+
+  Ptr<MacRxMiddle> m_rxMiddle;                      //!< RX middle (defragmentation etc.)
+  Ptr<MacTxMiddle> m_txMiddle;                      //!< TX middle (aggregation etc.)
+  Ptr<ChannelAccessManager> m_channelAccessManager; //!< channel access manager
+  Ptr<FrameExchangeManager> m_feManager;            //!< Frame Exchange Manager
+  Ptr<Txop> m_txop;                                 //!<  TXOP used for transmission of frames to non-QoS peers.
+
+  Callback<void> m_linkUp;       //!< Callback when a link is up
+  Callback<void> m_linkDown;     //!< Callback when a link is down
+
+
+private:
+  /// type conversion operator
+  WifiMac (const WifiMac&);
+  /**
+   * assignment operator
+   *
+   * \param mac the WifiMac to assign
+   * \returns the assigned value
+   */
+  WifiMac & operator= (const WifiMac& mac);
+
   /**
    * \param dcf the DCF to be configured
    * \param cwmin the minimum contention window for the DCF
@@ -295,9 +548,147 @@
    */
   void ConfigureDcf (Ptr<Txop> dcf, uint32_t cwmin, uint32_t cwmax, bool isDsss, AcIndex ac);
 
+  /**
+   * Configure PHY dependent parameters such as CWmin and CWmax.
+   */
+  void ConfigurePhyDependentParameters (void);
 
-private:
-  Ptr<NetDevice> m_device;    ///< Pointer to the device
+  /**
+   * This method is a private utility invoked to configure the channel
+   * access function for the specified Access Category.
+   *
+   * \param ac the Access Category of the queue to initialise.
+   */
+  void SetupEdcaQueue (AcIndex ac);
+
+  /**
+   * Create a Frame Exchange Manager depending on the supported version
+   * of the standard.
+   *
+   * \param standard the supported version of the standard
+   */
+  void SetupFrameExchangeManager (WifiStandard standard);
+
+  /**
+   * Enable or disable ERP support for the device.
+   *
+   * \param enable whether ERP is supported
+   */
+  void SetErpSupported (bool enable);
+  /**
+   * Enable or disable DSSS support for the device.
+   *
+   * \param enable whether DSSS is supported
+   */
+  void SetDsssSupported (bool enable);
+
+  /**
+   * Set the block ack threshold for AC_VO.
+   *
+   * \param threshold the block ack threshold for AC_VO.
+   */
+  void SetVoBlockAckThreshold (uint8_t threshold);
+  /**
+   * Set the block ack threshold for AC_VI.
+   *
+   * \param threshold the block ack threshold for AC_VI.
+   */
+  void SetViBlockAckThreshold (uint8_t threshold);
+  /**
+   * Set the block ack threshold for AC_BE.
+   *
+   * \param threshold the block ack threshold for AC_BE.
+   */
+  void SetBeBlockAckThreshold (uint8_t threshold);
+  /**
+   * Set the block ack threshold for AC_BK.
+   *
+   * \param threshold the block ack threshold for AC_BK.
+   */
+  void SetBkBlockAckThreshold (uint8_t threshold);
+
+  /**
+   * Set VO block ack inactivity timeout.
+   *
+   * \param timeout the VO block ack inactivity timeout.
+   */
+  void SetVoBlockAckInactivityTimeout (uint16_t timeout);
+  /**
+   * Set VI block ack inactivity timeout.
+   *
+   * \param timeout the VI block ack inactivity timeout.
+   */
+  void SetViBlockAckInactivityTimeout (uint16_t timeout);
+  /**
+   * Set BE block ack inactivity timeout.
+   *
+   * \param timeout the BE block ack inactivity timeout.
+   */
+  void SetBeBlockAckInactivityTimeout (uint16_t timeout);
+  /**
+   * Set BK block ack inactivity timeout.
+   *
+   * \param timeout the BK block ack inactivity timeout.
+   */
+  void SetBkBlockAckInactivityTimeout (uint16_t timeout);
+
+  /**
+   * This Boolean is set \c true iff this WifiMac is to model
+   * 802.11e/WMM style Quality of Service. It is exposed through the
+   * attribute system.
+   *
+   * At the moment, this flag is the sole selection between QoS and
+   * non-QoS operation for the STA (whether IBSS, AP, or
+   * non-AP). Ultimately, we will want a QoS-enabled STA to be able to
+   * fall back to non-QoS operation with a non-QoS peer. This'll
+   * require further intelligence - i.e., per-association QoS
+   * state. Having a big switch seems like a good intermediate stage,
+   * however.
+   */
+  bool m_qosSupported;
+  /**
+   * This Boolean is set \c true iff this WifiMac is to model
+   * 802.11g. It is exposed through the attribute system.
+   */
+  bool m_erpSupported;
+  /**
+   * This Boolean is set \c true iff this WifiMac is to model
+   * 802.11b. It is exposed through the attribute system.
+   */
+  bool m_dsssSupported;
+
+  bool m_shortSlotTimeSupported; ///< flag whether short slot time is supported
+  bool m_ctsToSelfSupported;     ///< flag indicating whether CTS-To-Self is supported
+
+  TypeOfStation m_typeOfStation; //!< the type of station
+
+  Ptr<WifiNetDevice> m_device;                    //!< Pointer to the device
+  Ptr<WifiPhy> m_phy;                             //!< Wifi PHY
+  Ptr<WifiRemoteStationManager> m_stationManager; //!< Remote station manager (rate control, RTS/CTS/fragmentation thresholds etc.)
+
+  Mac48Address m_address; //!< MAC address of this station
+  Ssid m_ssid;            //!< Service Set ID (SSID)
+  Mac48Address m_bssid;   //!< the BSSID
+
+  /** This type defines a mapping between an Access Category index,
+  and a pointer to the corresponding channel access function */
+  typedef std::map<AcIndex, Ptr<QosTxop> > EdcaQueues;
+
+  /** This is a map from Access Category index to the corresponding
+  channel access function */
+  EdcaQueues m_edca;
+
+  uint16_t m_voMaxAmsduSize; ///< maximum A-MSDU size for AC_VO (in bytes)
+  uint16_t m_viMaxAmsduSize; ///< maximum A-MSDU size for AC_VI (in bytes)
+  uint16_t m_beMaxAmsduSize; ///< maximum A-MSDU size for AC_BE (in bytes)
+  uint16_t m_bkMaxAmsduSize; ///< maximum A-MSDU size for AC_BK (in bytes)
+
+  uint32_t m_voMaxAmpduSize; ///< maximum A-MPDU size for AC_VO (in bytes)
+  uint32_t m_viMaxAmpduSize; ///< maximum A-MPDU size for AC_VI (in bytes)
+  uint32_t m_beMaxAmpduSize; ///< maximum A-MPDU size for AC_BE (in bytes)
+  uint32_t m_bkMaxAmpduSize; ///< maximum A-MPDU size for AC_BK (in bytes)
+
+  ForwardUpCallback m_forwardUp; //!< Callback to forward packet up the stack
 
   /**
    * The trace source fired when packets come into the "top" of the device
@@ -336,6 +727,90 @@
    * \see class CallBackTraceSource
    */
   TracedCallback<Ptr<const Packet> > m_macRxDropTrace;
+
+  TracedCallback<const WifiMacHeader &> m_txOkCallback;  ///< transmit OK callback
+  TracedCallback<const WifiMacHeader &> m_txErrCallback; ///< transmit error callback
+
+  /**
+   * TracedCallback signature for MPDU drop events.
+   *
+   * \param reason the reason why the MPDU was dropped (\see WifiMacDropReason)
+   * \param mpdu the dropped MPDU
+   */
+  typedef void (* DroppedMpduCallback)(WifiMacDropReason reason, Ptr<const WifiMacQueueItem> mpdu);
+
+  /// TracedCallback for MPDU drop events typedef
+  typedef TracedCallback<WifiMacDropReason, Ptr<const WifiMacQueueItem>> DroppedMpduTracedCallback;
+
+  /**
+   * This trace indicates that an MPDU was dropped for the given reason.
+   */
+  DroppedMpduTracedCallback m_droppedMpduCallback;
+
+  /// TracedCallback for acked/nacked MPDUs typedef
+  typedef TracedCallback<Ptr<const WifiMacQueueItem>> MpduTracedCallback;
+
+  MpduTracedCallback m_ackedMpduCallback;  ///< ack'ed MPDU callback
+  MpduTracedCallback m_nackedMpduCallback; ///< nack'ed MPDU callback
+
+  /**
+   * TracedCallback signature for MPDU response timeout events.
+   *
+   * \param reason the reason why the timer was started
+   * \param mpdu the MPDU whose response was not received before the timeout
+   * \param txVector the TXVECTOR used to transmit the MPDU
+   */
+  typedef void (* MpduResponseTimeoutCallback)(uint8_t reason, Ptr<const WifiMacQueueItem> mpdu,
+                                               const WifiTxVector& txVector);
+
+  /// TracedCallback for MPDU response timeout events typedef
+  typedef TracedCallback<uint8_t, Ptr<const WifiMacQueueItem>, const WifiTxVector&> MpduResponseTimeoutTracedCallback;
+
+  /**
+   * MPDU response timeout traced callback.
+   * This trace source is fed by a WifiTxTimer object.
+   */
+  MpduResponseTimeoutTracedCallback m_mpduResponseTimeoutCallback;
+
+  /**
+   * TracedCallback signature for PSDU response timeout events.
+   *
+   * \param reason the reason why the timer was started
+   * \param psdu the PSDU whose response was not received before the timeout
+   * \param txVector the TXVECTOR used to transmit the PSDU
+   */
+  typedef void (* PsduResponseTimeoutCallback)(uint8_t reason, Ptr<const WifiPsdu> psdu,
+                                               const WifiTxVector& txVector);
+
+  /// TracedCallback for PSDU response timeout events typedef
+  typedef TracedCallback<uint8_t, Ptr<const WifiPsdu>, const WifiTxVector&> PsduResponseTimeoutTracedCallback;
+
+  /**
+   * PSDU response timeout traced callback.
+   * This trace source is fed by a WifiTxTimer object.
+   */
+  PsduResponseTimeoutTracedCallback m_psduResponseTimeoutCallback;
+
+  /**
+   * TracedCallback signature for PSDU map response timeout events.
+   *
+   * \param reason the reason why the timer was started
+   * \param psduMap the PSDU map for which not all responses were received before the timeout
+   * \param missingStations the MAC addresses of the stations that did not respond
+   * \param nTotalStations the total number of stations that had to respond
+   */
+  typedef void (* PsduMapResponseTimeoutCallback)(uint8_t reason, WifiPsduMap* psduMap,
+                                                  const std::set<Mac48Address>* missingStations,
+                                                  std::size_t nTotalStations);
+
+  /// TracedCallback for PSDU map response timeout events typedef
+  typedef TracedCallback<uint8_t, WifiPsduMap*, const std::set<Mac48Address>*, std::size_t> PsduMapResponseTimeoutTracedCallback;
+
+  /**
+   * PSDU map response timeout traced callback.
+   * This trace source is fed by a WifiTxTimer object.
+   */
+  PsduMapResponseTimeoutTracedCallback m_psduMapResponseTimeoutCallback;
 };
 
 } //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/wifi-mac-header.cc ns-3.36/src/wifi/model/wifi-mac-header.cc
--- ns-3.35/src/wifi/model/wifi-mac-header.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/wifi-mac-header.cc	2022-04-30 18:23:58.214735300 -0700
@@ -740,19 +740,19 @@
 bool
 WifiMacHeader::IsBlockAckReq (void) const
 {
-  return (GetType () == WIFI_MAC_CTL_BACKREQ) ? true : false;
+  return (GetType () == WIFI_MAC_CTL_BACKREQ);
 }
 
 bool
 WifiMacHeader::IsBlockAck (void) const
 {
-  return (GetType () == WIFI_MAC_CTL_BACKRESP) ? true : false;
+  return (GetType () == WIFI_MAC_CTL_BACKRESP);
 }
 
 bool
 WifiMacHeader::IsTrigger (void) const
 {
-  return (GetType () == WIFI_MAC_CTL_TRIGGER) ? true : false;
+  return (GetType () == WIFI_MAC_CTL_TRIGGER);
 }
 
 uint16_t
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/wifi-mac-queue.cc ns-3.36/src/wifi/model/wifi-mac-queue.cc
--- ns-3.35/src/wifi/model/wifi-mac-queue.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/wifi-mac-queue.cc	2022-04-30 18:23:58.214735300 -0700
@@ -75,9 +75,27 @@
   m_nQueuedBytes.clear ();
 }
 
-static std::list<Ptr<WifiMacQueueItem>> g_emptyWifiMacQueue; //!< empty Wi-Fi MAC queue
+bool
+WifiMacQueue::TtlExceeded (ConstIterator &it, const Time& now)
+{
+  if (now > (*it)->GetTimeStamp () + m_maxDelay)
+    {
+      NS_LOG_DEBUG ("Removing packet that stayed in the queue for too long (" <<
+                    now - (*it)->GetTimeStamp () << ")");
+      auto curr = it++;
+      m_traceExpired (DoRemove (curr));
+      return true;
+    }
+  return false;
+}
 
-const WifiMacQueue::ConstIterator WifiMacQueue::EMPTY = g_emptyWifiMacQueue.end ();
+bool
+WifiMacQueue::TtlExceeded (Ptr<const WifiMacQueueItem> item, const Time& now)
+{
+  NS_ASSERT (item != nullptr && item->IsQueued ());
+  auto it = item->m_queueIt;
+  return TtlExceeded (it, now);
+}
 
 void
 WifiMacQueue::SetMaxDelay (Time delay)
@@ -204,11 +222,13 @@
   return 0;
 }
 
-WifiMacQueue::ConstIterator
-WifiMacQueue::PeekByAddress (Mac48Address dest, ConstIterator pos) const
+Ptr<const WifiMacQueueItem>
+WifiMacQueue::PeekByAddress (Mac48Address dest, Ptr<const WifiMacQueueItem> item) const
 {
-  NS_LOG_FUNCTION (this << dest);
-  ConstIterator it = (pos != EMPTY ? pos : begin ());
+  NS_LOG_FUNCTION (this << dest << item);
+  NS_ASSERT (item == nullptr || item->IsQueued ());
+
+  ConstIterator it = (item != nullptr ? std::next (item->m_queueIt) : begin ());
   const Time now = Simulator::Now ();
   while (it != end ())
     {
@@ -219,20 +239,22 @@
           if (((*it)->GetHeader ().IsData () || (*it)->GetHeader ().IsQosData ())
               && (*it)->GetDestinationAddress () == dest)
             {
-              return it;
+              return *it;
             }
         }
       it++;
     }
   NS_LOG_DEBUG ("The queue is empty");
-  return end ();
+  return nullptr;
 }
 
-WifiMacQueue::ConstIterator
-WifiMacQueue::PeekByTid (uint8_t tid, ConstIterator pos) const
+Ptr<const WifiMacQueueItem>
+WifiMacQueue::PeekByTid (uint8_t tid, Ptr<const WifiMacQueueItem> item) const
 {
-  NS_LOG_FUNCTION (this << +tid);
-  ConstIterator it = (pos != EMPTY ? pos : begin ());
+  NS_LOG_FUNCTION (this << +tid << item);
+  NS_ASSERT (item == nullptr || item->IsQueued ());
+
+  ConstIterator it = (item != nullptr ? std::next (item->m_queueIt) : begin ());
   const Time now = Simulator::Now ();
   while (it != end ())
     {
@@ -242,20 +264,22 @@
         {
           if ((*it)->GetHeader ().IsQosData () && (*it)->GetHeader ().GetQosTid () == tid)
             {
-              return it;
+              return *it;
             }
         }
       it++;
     }
   NS_LOG_DEBUG ("The queue is empty");
-  return end ();
+  return nullptr;
 }
 
-WifiMacQueue::ConstIterator
-WifiMacQueue::PeekByTidAndAddress (uint8_t tid, Mac48Address dest, ConstIterator pos) const
+Ptr<const WifiMacQueueItem>
+WifiMacQueue::PeekByTidAndAddress (uint8_t tid, Mac48Address dest, Ptr<const WifiMacQueueItem> item) const
 {
-  NS_LOG_FUNCTION (this << +tid << dest);
-  ConstIterator it = (pos != EMPTY ? pos : begin ());
+  NS_LOG_FUNCTION (this << +tid << dest << item);
+  NS_ASSERT (item == nullptr || item->IsQueued ());
+
+  ConstIterator it = (item != nullptr ? std::next (item->m_queueIt) : begin ());
   const Time now = Simulator::Now ();
   while (it != end ())
     {
@@ -266,20 +290,23 @@
           if ((*it)->GetHeader ().IsQosData () && (*it)->GetDestinationAddress () == dest
               && (*it)->GetHeader ().GetQosTid () == tid)
             {
-              return it;
+              return *it;
             }
         }
       it++;
     }
   NS_LOG_DEBUG ("The queue is empty");
-  return end ();
+  return nullptr;
 }
 
-WifiMacQueue::ConstIterator
-WifiMacQueue::PeekFirstAvailable (const Ptr<QosBlockedDestinations> blockedPackets, ConstIterator pos) const
+Ptr<const WifiMacQueueItem>
+WifiMacQueue::PeekFirstAvailable (const Ptr<QosBlockedDestinations> blockedPackets,
+                                  Ptr<const WifiMacQueueItem> item) const
 {
-  NS_LOG_FUNCTION (this);
-  ConstIterator it = (pos != EMPTY ? pos : begin ());
+  NS_LOG_FUNCTION (this << item);
+  NS_ASSERT (item == nullptr || item->IsQueued ());
+
+  ConstIterator it = (item != nullptr ? std::next (item->m_queueIt) : begin ());
   const Time now = Simulator::Now ();
   while (it != end ())
     {
@@ -290,13 +317,13 @@
           if (!(*it)->GetHeader ().IsQosData () || !blockedPackets
               || !blockedPackets->IsBlocked ((*it)->GetHeader ().GetAddr1 (), (*it)->GetHeader ().GetQosTid ()))
             {
-              return it;
+              return *it;
             }
         }
       it++;
     }
   NS_LOG_DEBUG ("The queue is empty");
-  return end ();
+  return nullptr;
 }
 
 Ptr<WifiMacQueueItem>
@@ -316,39 +343,17 @@
   return 0;
 }
 
-bool
-WifiMacQueue::Remove (Ptr<const Packet> packet)
-{
-  NS_LOG_FUNCTION (this << packet);
-
-  const Time now = Simulator::Now ();
-  for (ConstIterator it = begin (); it != end (); )
-    {
-      if (!TtlExceeded (it, now))
-        {
-          if ((*it)->GetPacket () == packet)
-            {
-              DoRemove (it);
-              return true;
-            }
-
-          it++;
-        }
-    }
-  NS_LOG_DEBUG ("Packet " << packet << " not found in the queue");
-  return false;
-}
-
-WifiMacQueue::ConstIterator
-WifiMacQueue::Remove (ConstIterator pos, bool removeExpired)
+Ptr<const WifiMacQueueItem>
+WifiMacQueue::Remove (Ptr<const WifiMacQueueItem> item, bool removeExpired)
 {
-  NS_LOG_FUNCTION (this);
+  NS_LOG_FUNCTION (this << item << removeExpired);
+  NS_ASSERT (item != 0 && item->IsQueued ());
 
   if (!removeExpired)
     {
-      ConstIterator curr = pos++;
-      DoRemove (curr);
-      return pos;
+      ConstIterator next = std::next (item->m_queueIt);
+      DoRemove (item->m_queueIt);
+      return (next == end () ? nullptr : *next);
     }
 
   const Time now = Simulator::Now ();
@@ -357,11 +362,11 @@
   ConstIterator it = begin ();
   while (it != end ())
     {
-      if (it == pos)
+      if (*it == item)
         {
-          ConstIterator curr = pos++;
-          DoRemove (curr);
-          return pos;
+          ConstIterator next = std::next (item->m_queueIt);
+          DoRemove (item->m_queueIt);
+          return (next == end () ? nullptr : *next);
         }
       else if (!TtlExceeded (it, now))
         {
@@ -369,7 +374,24 @@
         }
     }
   NS_LOG_DEBUG ("Invalid iterator");
-  return end ();
+  return nullptr;
+}
+
+void
+WifiMacQueue::Replace (Ptr<const WifiMacQueueItem> currentItem, Ptr<WifiMacQueueItem> newItem)
+{
+  NS_LOG_FUNCTION (this << *currentItem << *newItem);
+  NS_ASSERT (currentItem->IsQueued ());
+  NS_ASSERT (currentItem->m_queueAc == m_ac);
+  NS_ASSERT (*currentItem->m_queueIt == currentItem);
+  NS_ASSERT (!newItem->IsQueued ());
+
+  auto pos = std::next (currentItem->m_queueIt);
+  DoDequeue (currentItem->m_queueIt);
+  bool ret = Insert (pos, newItem);
+  // The size of a WifiMacQueue is measured as number of packets. We dequeued
+  // one packet, so there is certainly room for inserting one packet
+  NS_ABORT_IF (!ret);
 }
 
 uint32_t
@@ -528,12 +550,6 @@
 {
   NS_LOG_FUNCTION (this);
 
-  if (TtlExceeded (pos, Simulator::Now ()))
-    {
-      NS_LOG_DEBUG ("Packet lifetime expired");
-      return nullptr;
-    }
-
   Ptr<WifiMacQueueItem> item = Queue<WifiMacQueueItem>::DoDequeue (pos);
 
   if (item != 0 && item->GetHeader ().IsQosData ())
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/wifi-mac-queue.h ns-3.36/src/wifi/model/wifi-mac-queue.h
--- ns-3.35/src/wifi/model/wifi-mac-queue.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/wifi-mac-queue.h	2022-04-30 18:23:58.214735300 -0700
@@ -28,6 +28,7 @@
 #include "ns3/queue.h"
 #include <unordered_map>
 #include "qos-utils.h"
+#include <functional>
 
 namespace ns3 {
 
@@ -115,14 +116,6 @@
    */
   bool PushFront (Ptr<WifiMacQueueItem> item);
   /**
-   * Enqueue the given Wifi MAC queue item before the given position.
-   *
-   * \param pos the position before which the item is to be inserted
-   * \param item the Wifi MAC queue item to be enqueued
-   * \return true if success, false if the packet has been dropped
-   */
-  bool Insert (ConstIterator pos, Ptr<WifiMacQueueItem> item);
-  /**
    * Dequeue the packet in the front of the queue.
    *
    * \return the packet
@@ -143,53 +136,61 @@
   /**
    * Search and return, if present in the queue, the first packet (either Data
    * frame or QoS Data frame) having the receiver address equal to <i>addr</i>.
-   * If <i>pos</i> is a valid iterator, the search starts from the packet pointed
-   * to by the given iterator.
+   * If <i>item</i> is not a null pointer, the search starts from the packet following
+   * <i>item</i> in the queue; otherwise, the search starts from the head of the queue.
    * This method does not remove the packet from the queue.
    *
    * \param dest the given destination
-   * \param pos the iterator pointing to the packet the search starts from
+   * \param item the item after which the search starts from
    *
-   * \return an iterator pointing to the peeked packet
+   * \return the peeked packet or nullptr if no packet was found
    */
-  ConstIterator PeekByAddress (Mac48Address dest, ConstIterator pos = EMPTY) const;
+  Ptr<const WifiMacQueueItem> PeekByAddress (Mac48Address dest,
+                                             Ptr<const WifiMacQueueItem> item = nullptr) const;
   /**
    * Search and return, if present in the queue, the first packet having the
-   * TID equal to <i>tid</i>. If <i>pos</i> is a valid iterator, the search starts
-   * from the packet pointed to by the given iterator.
+   * TID equal to <i>tid</i>. If <i>item</i> is not a null pointer, the search
+   * starts from the packet following <i>item</i> in the queue; otherwise, the
+   * search starts from the head of the queue.
    * This method does not remove the packet from the queue.
    *
    * \param tid the given TID
-   * \param pos the iterator pointing to the packet the search starts from
+   * \param item the item after which the search starts from
    *
-   * \return an iterator pointing to the peeked packet
+   * \return the peeked packet or nullptr if no packet was found
    */
-  ConstIterator PeekByTid (uint8_t tid, ConstIterator pos = EMPTY) const;
+  Ptr<const WifiMacQueueItem> PeekByTid (uint8_t tid,
+                                         Ptr<const WifiMacQueueItem> item = nullptr) const;
   /**
    * Search and return, if present in the queue, the first packet having the
    * receiver address equal to <i>dest</i>, and TID equal to <i>tid</i>.
-   * If <i>pos</i> is a valid iterator, the search starts from the packet pointed
-   * to by the given iterator. This method does not remove the packet from the queue.
+   * If <i>item</i> is not a null pointer, the search starts from the packet
+   * following <i>item</i> in the queue; otherwise, the search starts from the
+   * head of the queue. This method does not remove the packet from the queue.
    * It is typically used by ns3::QosTxop in order to perform correct MSDU aggregation
    * (A-MSDU).
    *
    * \param tid the given TID
    * \param dest the given destination
-   * \param pos the iterator pointing to the packet the search starts from
+   * \param item the item after which the search starts from
    *
-   * \return an iterator pointing to the peeked packet
+   * \return the peeked packet or nullptr if no packet was found
    */
-  ConstIterator PeekByTidAndAddress (uint8_t tid, Mac48Address dest, ConstIterator pos = EMPTY) const;
+  Ptr<const WifiMacQueueItem> PeekByTidAndAddress (uint8_t tid, Mac48Address dest,
+                                                   Ptr<const WifiMacQueueItem> item = nullptr) const;
   /**
-   * Return first available packet for transmission. The packet is not removed from queue.
+   * Return first available packet for transmission. If <i>item</i> is not a null
+   * pointer, the search starts from the packet following <i>item</i> in the queue;
+   * otherwise, the search starts from the head of the queue.
+   * The packet is not removed from queue.
    *
    * \param blockedPackets the destination address & TID pairs that are waiting for a BlockAck response
-   * \param pos the iterator pointing to the packet the search starts from
+   * \param item the item after which the search starts from
    *
-   * \return an iterator pointing to the peeked packet
+   * \return the peeked packet or nullptr if no packet was found
    */
-  ConstIterator PeekFirstAvailable (const Ptr<QosBlockedDestinations> blockedPackets = nullptr,
-                                    ConstIterator pos = EMPTY) const;
+  Ptr<const WifiMacQueueItem> PeekFirstAvailable (const Ptr<QosBlockedDestinations> blockedPackets = nullptr,
+                                                  Ptr<const WifiMacQueueItem> item = nullptr) const;
   /**
    * Remove the packet in the front of the queue.
    *
@@ -197,26 +198,53 @@
    */
   Ptr<WifiMacQueueItem> Remove (void) override;
   /**
-   * If exists, removes <i>packet</i> from queue and returns true. Otherwise it
-   * takes no effects and return false. Deletion of the packet is
-   * performed in linear time (O(n)).
+   * Remove the given item from the queue and return the item following the
+   * removed one, if any, or a null pointer otherwise. If <i>removeExpired</i> is
+   * true, all the items in the queue from the head to the given position are
+   * removed if their lifetime expired.
    *
-   * \param packet the packet to be removed
+   * \param item the item to be removed
+   * \param removeExpired true to remove expired items
+   * \return the item following the removed one, if any, or a null pointer, otherwise
+   */
+  Ptr<const WifiMacQueueItem> Remove (Ptr<const WifiMacQueueItem> item, bool removeExpired = false);
+
+  /**
+   * Replace the given current item with the given new item. Actually, the current
+   * item is dequeued and the new item is enqueued in its place. In this way,
+   * statistics about queue size (in terms of bytes) are correctly updated.
    *
-   * \return true if the packet was removed, false otherwise
+   * \param currentItem the given current item
+   * \param newItem the given new item
    */
-  bool Remove (Ptr<const Packet> packet);
+  void Replace (Ptr<const WifiMacQueueItem> currentItem, Ptr<WifiMacQueueItem> newItem);
   /**
-   * Remove the item at position <i>pos</i> in the queue and return an iterator
-   * pointing to the item following the removed one. If <i>removeExpired</i> is
-   * true, all the items in the queue from the head to the given position are
-   * removed if their lifetime expired.
+   * Transform the given item by invoking the given function with the given item
+   * as parameter. The given function must be an object of a callable type
+   * and must have an argument of type pointer to WifiMacQueueItem.
+   * Actually, the given item is dequeued and the transformed item is enqueued in
+   * its place. In this way, statistics about queue size (in terms of bytes) are
+   * correctly updated.
    *
-   * \param pos the position of the item to be removed
-   * \param removeExpired true to remove expired items
-   * \return an iterator pointing to the item following the removed one
+   * \internal
+   * If this method needs to be overloaded, we can use SFINAE to help in overload
+   * resolution:
+   *
+   * \code
+   *   template <class CALLABLE,
+   *             std::invoke_result_t<CALLABLE, Ptr<WifiMacQueueItem>>* = nullptr>
+   *   void Transform (Ptr<const WifiMacQueueItem> item, CALLABLE func);
+   * \endcode
+   *
+   * Unfortunately, this will break python bindings scanning.
+   *
+   * \tparam CALLABLE \deduced The type of the given function object
+   * \param item the given item
+   * \param func the given function object
    */
-  ConstIterator Remove (ConstIterator pos, bool removeExpired = false);
+  template <class CALLABLE>
+  void Transform (Ptr<const WifiMacQueueItem> item, CALLABLE func);
+
   /**
    * Return the number of packets having destination address specified by
    * <i>dest</i>. The complexity is linear in the size of the queue.
@@ -285,6 +313,17 @@
   uint32_t GetNBytes (void);
 
   /**
+   * Remove the given item if it has been in the queue for too long. Return true
+   * if the item is removed, false otherwise.
+   *
+   * \param item the item whose lifetime is checked
+   * \param now a copy of Simulator::Now()
+   * \return true if the item is removed, false otherwise
+   */
+  bool TtlExceeded (Ptr<const WifiMacQueueItem> item, const Time& now);
+
+private:
+  /**
    * Remove the item pointed to by the iterator <i>it</i> if it has been in the
    * queue for too long. If the item is removed, the iterator is updated to
    * point to the item that followed the erased one.
@@ -295,10 +334,14 @@
    */
   inline bool TtlExceeded (ConstIterator &it, const Time& now);
 
-  static const ConstIterator EMPTY;         //!< Invalid iterator to signal an empty queue
-
-
-private:
+  /**
+   * Enqueue the given Wifi MAC queue item before the given position.
+   *
+   * \param pos the position before which the item is to be inserted
+   * \param item the Wifi MAC queue item to be enqueued
+   * \return true if success, false if the packet has been dropped
+   */
+  bool Insert (ConstIterator pos, Ptr<WifiMacQueueItem> item);
   /**
    * Wrapper for the DoEnqueue method provided by the base class that additionally
    * sets the iterator field of the item and updates internal statistics, if
@@ -343,23 +386,31 @@
   NS_LOG_TEMPLATE_DECLARE;                  //!< redefinition of the log component
 };
 
+} // namespace ns3
 
-/**
- * Implementation of inline functions
- */
 
-bool
-WifiMacQueue::TtlExceeded (ConstIterator &it, const Time& now)
+/***************************************************************
+ *  Implementation of the templates declared above.
+ ***************************************************************/
+
+namespace ns3 {
+
+template <class CALLABLE>
+void
+WifiMacQueue::Transform (Ptr<const WifiMacQueueItem> item, CALLABLE func)
 {
-  if (now > (*it)->GetTimeStamp () + m_maxDelay)
-    {
-      NS_LOG_DEBUG ("Removing packet that stayed in the queue for too long (" <<
-                    now - (*it)->GetTimeStamp () << ")");
-      auto curr = it++;
-      m_traceExpired (DoRemove (curr));
-      return true;
-    }
-  return false;
+  NS_ASSERT (item->IsQueued ());
+  NS_ASSERT (item->m_queueAc == m_ac);
+  NS_ASSERT (*item->m_queueIt == item);
+
+  auto pos = std::next (item->m_queueIt);
+  Ptr<WifiMacQueueItem> mpdu = DoDequeue (item->m_queueIt);
+  NS_ASSERT (mpdu != nullptr);
+  func (mpdu);     // python bindings scanning does not like std::invoke (func, mpdu);
+  bool ret = Insert (pos, mpdu);
+  // The size of a WifiMacQueue is measured as number of packets. We dequeued
+  // one packet, so there is certainly room for inserting one packet
+  NS_ABORT_IF (!ret);
 }
 
 } //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/wifi-mac-queue-item.cc ns-3.36/src/wifi/model/wifi-mac-queue-item.cc
--- ns-3.35/src/wifi/model/wifi-mac-queue-item.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/wifi-mac-queue-item.cc	2022-04-30 18:23:58.214735300 -0700
@@ -55,6 +55,13 @@
 {
 }
 
+Ptr<WifiMacQueueItem>
+WifiMacQueueItem::GetItem (void) const
+{
+  NS_ASSERT (IsQueued ());
+  return *m_queueIt;
+}
+
 Ptr<const Packet>
 WifiMacQueueItem::GetPacket (void) const
 {
@@ -214,13 +221,6 @@
   return m_queueAc;
 }
 
-WifiMacQueueItem::ConstIterator
-WifiMacQueueItem::GetQueueIterator (void) const
-{
-  NS_ASSERT (IsQueued ());
-  return m_queueIt;
-}
-
 void
 WifiMacQueueItem::SetInFlight (void)
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/wifi-mac-queue-item.h ns-3.36/src/wifi/model/wifi-mac-queue-item.h
--- ns-3.35/src/wifi/model/wifi-mac-queue-item.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/wifi-mac-queue-item.h	2022-04-30 18:23:58.214735300 -0700
@@ -25,6 +25,7 @@
 #define WIFI_MAC_QUEUE_ITEM_H
 
 #include "ns3/nstime.h"
+#include "ns3/packet.h"
 #include "wifi-mac-header.h"
 #include "amsdu-subframe-header.h"
 #include "qos-utils.h"
@@ -33,7 +34,6 @@
 namespace ns3 {
 
 class QosBlockedDestinations;
-class Packet;
 
 /**
  * \ingroup wifi
@@ -62,6 +62,15 @@
   virtual ~WifiMacQueueItem ();
 
   /**
+   * Get a pointer to this WifiMacQueueItem object. This method is useful to convert
+   * a pointer to const WifiMacQueueItem into a pointer to non-const WifiMacQueueItem.
+   * This method can only be called if this item is stored in a wifi MAC queue.
+   *
+   * \return a pointer to this WifiMacQueueItem object
+   */
+  Ptr<WifiMacQueueItem> GetItem (void) const;
+
+  /**
    * \brief Get the packet stored in this item
    * \return the packet stored in this item.
    */
@@ -156,13 +165,6 @@
    * \return the AC of the queue this item is stored into
    */
   AcIndex GetQueueAc (void) const;
-  /**
-   * Get a const iterator pointing to the position of the MPDU in the queue. This
-   * method should not be called if the MPDU is not stored in a queue.
-   *
-   * \return an iterator pointing to the position of the MPDU in the queue
-   */
-  ConstIterator GetQueueIterator (void) const;
 
   /**
    * \brief Get the MAC protocol data unit (MPDU) corresponding to this item
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/wifi-mode.cc ns-3.36/src/wifi/model/wifi-mode.cc
--- ns-3.35/src/wifi/model/wifi-mode.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/wifi-mode.cc	2022-04-30 18:23:58.214735300 -0700
@@ -59,8 +59,18 @@
 bool
 WifiMode::IsAllowed (uint16_t channelWidth, uint8_t nss) const
 {
+  WifiTxVector txVector;
+  txVector.SetMode (WifiMode (m_uid));
+  txVector.SetChannelWidth (channelWidth);
+  txVector.SetNss (nss);
+  return IsAllowed (txVector);
+}
+
+bool
+WifiMode::IsAllowed (const WifiTxVector& txVector) const
+{
   WifiModeFactory::WifiModeItem *item = WifiModeFactory::GetFactory ()->Get (m_uid);
-  return item->IsModeAllowedCallback (channelWidth, nss);
+  return item->IsAllowedCallback (txVector);
 }
 
 uint64_t
@@ -72,15 +82,19 @@
 uint64_t
 WifiMode::GetPhyRate (uint16_t channelWidth, uint16_t guardInterval, uint8_t nss) const
 {
-  WifiModeFactory::WifiModeItem *item = WifiModeFactory::GetFactory ()->Get (m_uid);
-  return item->GetPhyRateCallback (channelWidth, guardInterval, nss);
+  WifiTxVector txVector;
+  txVector.SetMode (WifiMode (m_uid));
+  txVector.SetChannelWidth (channelWidth);
+  txVector.SetGuardInterval (guardInterval);
+  txVector.SetNss (nss);
+  return GetPhyRate (txVector);
 }
 
 uint64_t
 WifiMode::GetPhyRate (const WifiTxVector& txVector, uint16_t staId) const
 {
   WifiModeFactory::WifiModeItem *item = WifiModeFactory::GetFactory ()->Get (m_uid);
-  return item->GetPhyRateFromTxVectorCallback (txVector, staId);
+  return item->GetPhyRateCallback (txVector, staId);
 }
 
 uint64_t
@@ -93,15 +107,19 @@
 WifiMode::GetDataRate (const WifiTxVector& txVector, uint16_t staId) const
 {
   WifiModeFactory::WifiModeItem *item = WifiModeFactory::GetFactory ()->Get (m_uid);
-  return item->GetDataRateFromTxVectorCallback (txVector, staId);
+  return item->GetDataRateCallback (txVector, staId);
 }
 
 uint64_t
 WifiMode::GetDataRate (uint16_t channelWidth, uint16_t guardInterval, uint8_t nss) const
 {
   NS_ASSERT (nss <= 8);
-  WifiModeFactory::WifiModeItem *item = WifiModeFactory::GetFactory ()->Get (m_uid);
-  return item->GetDataRateCallback (channelWidth, guardInterval, nss);
+  WifiTxVector txVector;
+  txVector.SetMode (WifiMode (m_uid));
+  txVector.SetChannelWidth (channelWidth);
+  txVector.SetGuardInterval (guardInterval);
+  txVector.SetNss (nss);
+  return GetDataRate (txVector);
 }
 
 WifiCodeRate
@@ -245,10 +263,8 @@
                                  CodeRateCallback codeRateCallback,
                                  ConstellationSizeCallback constellationSizeCallback,
                                  PhyRateCallback phyRateCallback,
-                                 PhyRateFromTxVectorCallback phyRateFromTxVectorCallback,
                                  DataRateCallback dataRateCallback,
-                                 DataRateFromTxVectorCallback dataRateFromTxVectorCallback,
-                                 ModeAllowedCallback isModeAllowedCallback)
+                                 AllowedCallback isAllowedCallback)
 {
   WifiModeFactory *factory = GetFactory ();
   uint32_t uid = factory->AllocateUid (uniqueName);
@@ -274,11 +290,9 @@
   item->GetCodeRateCallback = codeRateCallback;
   item->GetConstellationSizeCallback = constellationSizeCallback;
   item->GetPhyRateCallback = phyRateCallback;
-  item->GetPhyRateFromTxVectorCallback = phyRateFromTxVectorCallback;
   item->GetDataRateCallback = dataRateCallback;
-  item->GetDataRateFromTxVectorCallback = dataRateFromTxVectorCallback;
   item->GetNonHtReferenceRateCallback = MakeNullCallback<uint64_t> ();
-  item->IsModeAllowedCallback = isModeAllowedCallback;
+  item->IsAllowedCallback = isAllowedCallback;
 
   NS_ASSERT (modClass < WIFI_MOD_CLASS_HT);
   //fill unused MCS item with a dummy value
@@ -291,14 +305,13 @@
 WifiModeFactory::CreateWifiMcs (std::string uniqueName,
                                 uint8_t mcsValue,
                                 WifiModulationClass modClass,
+                                bool isMandatory,
                                 CodeRateCallback codeRateCallback,
                                 ConstellationSizeCallback constellationSizeCallback,
                                 PhyRateCallback phyRateCallback,
-                                PhyRateFromTxVectorCallback phyRateFromTxVectorCallback,
                                 DataRateCallback dataRateCallback,
-                                DataRateFromTxVectorCallback dataRateFromTxVectorCallback,
                                 NonHtReferenceRateCallback nonHtReferenceRateCallback,
-                                ModeAllowedCallback isModeAllowedCallback)
+                                AllowedCallback isAllowedCallback)
 {
   WifiModeFactory *factory = GetFactory ();
   uint32_t uid = factory->AllocateUid (uniqueName);
@@ -309,17 +322,13 @@
   NS_ASSERT (modClass >= WIFI_MOD_CLASS_HT);
 
   item->mcsValue = mcsValue;
+  item->isMandatory = isMandatory;
   item->GetCodeRateCallback = codeRateCallback;
   item->GetConstellationSizeCallback = constellationSizeCallback;
   item->GetPhyRateCallback = phyRateCallback;
-  item->GetPhyRateFromTxVectorCallback = phyRateFromTxVectorCallback;
   item->GetDataRateCallback = dataRateCallback;
-  item->GetDataRateFromTxVectorCallback = dataRateFromTxVectorCallback;
   item->GetNonHtReferenceRateCallback = nonHtReferenceRateCallback;
-  item->IsModeAllowedCallback = isModeAllowedCallback;
-
-  //fill unused items with dummy values
-  item->isMandatory = false;
+  item->IsAllowedCallback = isAllowedCallback;
 
   return WifiMode (uid);
 }
@@ -399,12 +408,10 @@
       item->mcsValue = 0;
       item->GetCodeRateCallback = MakeNullCallback<WifiCodeRate> ();
       item->GetConstellationSizeCallback = MakeNullCallback<uint16_t> ();
-      item->GetPhyRateCallback = MakeNullCallback<uint64_t, uint16_t, uint16_t, uint8_t> ();
-      item->GetPhyRateFromTxVectorCallback = MakeNullCallback<uint64_t, const WifiTxVector&, uint16_t> ();
-      item->GetDataRateCallback = MakeNullCallback<uint64_t, uint16_t, uint16_t, uint8_t> ();
-      item->GetDataRateFromTxVectorCallback = MakeNullCallback<uint64_t, const WifiTxVector&, uint16_t> ();
+      item->GetPhyRateCallback = MakeNullCallback<uint64_t, const WifiTxVector&, uint16_t> ();
+      item->GetDataRateCallback = MakeNullCallback<uint64_t, const WifiTxVector&, uint16_t> ();
       item->GetNonHtReferenceRateCallback = MakeNullCallback<uint64_t> ();
-      item->IsModeAllowedCallback = MakeNullCallback<bool, uint16_t, uint8_t> ();
+      item->IsAllowedCallback = MakeNullCallback<bool, const WifiTxVector&> ();
       isFirstTime = false;
     }
   return &factory;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/wifi-mode.h ns-3.36/src/wifi/model/wifi-mode.h
--- ns-3.35/src/wifi/model/wifi-mode.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/wifi-mode.h	2022-04-30 18:23:58.214735300 -0700
@@ -55,6 +55,12 @@
    */
   bool IsAllowed (uint16_t channelWidth, uint8_t nss) const;
   /**
+   * \returns true if this TXVECTOR combination is allowed, false otherwise.
+   *
+   * \param txVector the const WifiTxVector& of the signal
+   */
+  bool IsAllowed (const WifiTxVector& txVector) const;
+  /**
    *
    * \param channelWidth the considered channel width in MHz
    * \param guardInterval the considered guard interval duration in nanoseconds
@@ -279,42 +285,22 @@
   typedef Callback<uint16_t> ConstellationSizeCallback;
   /**
    * Typedef for callback used to calculate PHY rate of a WifiMode
-   *
-   * \param channelWidth the channel width in MHz
-   * \param guardInterval the guard interval duration in nanoseconds
-   * \param nss the number of streams
-   * \return the physical bit rate of the signal in bps.
-   */
-  typedef Callback<uint64_t, uint16_t /* channelWidth */, uint16_t /* guardInterval */, uint8_t /* nss */> PhyRateCallback;
-  /**
-   * Typedef for callback used to calculate PHY rate of a WifiMode
-   * from a TXVECTOR. This is mostly useful in HE or later amendments.
-   * For the others it's a simple wrapper of \see PhyRateCallback.
+   * from a TXVECTOR.
    *
    * \param txVector the TXVECTOR used for the transmission
    * \param staId the station ID
    * \return the physical bit rate of the signal in bps.
    */
-  typedef Callback<uint64_t, const WifiTxVector& /* txVector */, uint16_t /* staId */> PhyRateFromTxVectorCallback;
+  typedef Callback<uint64_t, const WifiTxVector& /* txVector */, uint16_t /* staId */> PhyRateCallback;
   /**
    * Typedef for callback used to calculate data rate of a WifiMode
-   *
-   * \param channelWidth the channel width in MHz
-   * \param guardInterval the guard interval duration in nanoseconds
-   * \param nss the number of streams
-   * \return the data rate of the signal in bps.
-   */
-  typedef Callback<uint64_t, uint16_t /* channelWidth */, uint16_t /* guardInterval */, uint8_t /* nss */> DataRateCallback;
-  /**
-   * Typedef for callback used to calculate data rate of a WifiMode
-   * from a TXVECTOR. This is mostly useful in HE or later amendments.
-   * For the others it's a simple wrapper of \see DataRateCallback.
+   * from a TXVECTOR.
    *
    * \param txVector the TXVECTOR used for the transmission
    * \param staId the station ID
    * \return the data rate of the signal in bps.
    */
-  typedef Callback<uint64_t, const WifiTxVector& /* txVector */, uint16_t /* staId */> DataRateFromTxVectorCallback;
+  typedef Callback<uint64_t, const WifiTxVector& /* txVector */, uint16_t /* staId */> DataRateCallback;
   /**
    * Typedef for callback used to calculate Non-HT Reference Rate of
    * an MCS defined in HT or later amendment. For Non-HT modes (DSSS, OFDM,
@@ -324,14 +310,12 @@
    */
   typedef Callback<uint64_t> NonHtReferenceRateCallback;
   /**
-   * Typedef for callback used to check whether the combination of <current
-   * WifiMode, channel width (in MHz), number of stream> is allowed
+   * Typedef for callback used to check whether a given combination is allowed
    *
-   * \param channelWidth the channel width in MHz
-   * \param nss the number of streams
-   * \return true if combination of current WifiMode and supplied parameters is allowed.
+   * \param txVector the TXVECTOR containing the combination to check
+   * \return true if combination of current WifiMode and TXVECTOR is allowed.
    */
-  typedef Callback<bool, uint16_t /* channelWidth */, uint8_t /* nss */> ModeAllowedCallback;
+  typedef Callback<bool, const WifiTxVector& /* txVector */> AllowedCallback;
 
   /**
    * \param uniqueName the name of the associated WifiMode. This name
@@ -347,15 +331,10 @@
    *        order of the constellation used.
    * \param phyRateCallback a callback function to calculate the PHY rate (in
    *        bps) of this WifiMode.
-   * \param phyRateFromTxVectorCallback a callback function to calculate the PHY rate
-   *        (in bps) of this WifiMode using a TXVECTOR as input.
    * \param dataRateCallback a callback function to calculate the data rate
    *        (in bps) of this WifiMode.
-   * \param dataRateFromTxVectorCallback a callback function to calculate the data rate
-   *        (in bps) of this WifiMode using a TXVECTOR as input.
-   * \param isModeAllowedCallback a callback function to check whether a
-   *        specific combination of this WifiMode, channel width (MHz), and
-   *        NSS are allowed.
+   * \param isAllowedCallback a callback function to check whether a
+   *        specific combination of this WifiMode is allowed.
    *
    * \return WifiMode
    *
@@ -367,33 +346,27 @@
                                   CodeRateCallback codeRateCallback,
                                   ConstellationSizeCallback constellationSizeCallback,
                                   PhyRateCallback phyRateCallback,
-                                  PhyRateFromTxVectorCallback phyRateFromTxVectorCallback,
                                   DataRateCallback dataRateCallback,
-                                  DataRateFromTxVectorCallback dataRateFromTxVectorCallback,
-                                  ModeAllowedCallback isModeAllowedCallback);
+                                  AllowedCallback isAllowedCallback);
 
   /**
    * \param uniqueName the name of the associated WifiMode. This name
    *        must be unique across _all_ instances.
    * \param mcsValue the MCS value
    * \param modClass the class of modulation
+   * \param isMandatory true if this WifiMode is mandatory, false otherwise.
    * \param codeRateCallback a callback function that returns the coding rate
    *        of this WifiMode.
    * \param constellationSizeCallback a callback function that returns the size
    *        of modulation constellation of this WifiMode.
    * \param phyRateCallback a callback function to calculate the PHY rate (in
    *        bps) of this WifiMode.
-   * \param phyRateFromTxVectorCallback a callback function to calculate the PHY rate
-   *        (in bps) of this WifiMode using a TXVECTOR as input.
    * \param dataRateCallback a callback function to calculate the data rate (in
    *        bps) of this WifiMode.
-   * \param dataRateFromTxVectorCallback a callback function to calculate the data rate
-   *        (in bps) of this WifiMode using a TXVECTOR as input.
    * \param nonHtReferenceRateCallback a callback function to calculate the rate
    *        (in bps) of the non-HT Reference Rate of this WifiMode.
-   * \param isModeAllowedCallback a callback function to calculate whether a
-   *        combination of <MCS index, channel width (MHz), number of spatial
-   *        stream> is allowed for this WifiMode.
+   * \param isAllowedCallback a callback function to calculate whether a given
+   *        combination of is allowed for this WifiMode.
    *
    * \return WifiMode
    *
@@ -402,14 +375,13 @@
   static WifiMode CreateWifiMcs (std::string uniqueName,
                                  uint8_t mcsValue,
                                  WifiModulationClass modClass,
+                                 bool isMandatory,
                                  CodeRateCallback codeRateCallback,
                                  ConstellationSizeCallback constellationSizeCallback,
                                  PhyRateCallback phyRateCallback,
-                                 PhyRateFromTxVectorCallback phyRateFromTxVectorCallback,
                                  DataRateCallback dataRateCallback,
-                                 DataRateFromTxVectorCallback dataRateFromTxVectorCallback,
                                  NonHtReferenceRateCallback nonHtReferenceRateCallback,
-                                 ModeAllowedCallback isModeAllowedCallback);
+                                 AllowedCallback isAllowedCallback);
 
 
 private:
@@ -439,11 +411,9 @@
     CodeRateCallback GetCodeRateCallback;                         ///< Callback to retrieve code rate of this WifiModeItem
     ConstellationSizeCallback GetConstellationSizeCallback;       ///< Callback to retrieve constellation size of this WifiModeItem
     PhyRateCallback GetPhyRateCallback;                           ///< Callback to calculate PHY rate in bps of this WifiModeItem
-    PhyRateFromTxVectorCallback GetPhyRateFromTxVectorCallback;   ///< Callback to calculate PHY rate in bps of this WifiModeItem using a TXVECTOR as input
     DataRateCallback GetDataRateCallback;                         ///< Callback to calculate data rate in bps of this WifiModeItem
-    DataRateFromTxVectorCallback GetDataRateFromTxVectorCallback; ///< Callback to calculate data rate in bps of this WifiModeItem using a TXVECTOR as input
     NonHtReferenceRateCallback GetNonHtReferenceRateCallback;     ///< Callback to calculate non-HT reference rate of this WifiModeItem
-    ModeAllowedCallback IsModeAllowedCallback;                    ///< Callback to check whether the combination of <MCS, channel width (MHz), NSS> is allowed
+    AllowedCallback IsAllowedCallback;                            ///< Callback to check whether a given combination of is allowed
   };
 
   /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/wifi-net-device.cc ns-3.36/src/wifi/model/wifi-net-device.cc
--- ns-3.35/src/wifi/model/wifi-net-device.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/wifi-net-device.cc	2022-04-30 18:23:58.218735200 -0700
@@ -88,7 +88,8 @@
 }
 
 WifiNetDevice::WifiNetDevice ()
-  : m_configComplete (false)
+  : m_standard (WIFI_STANDARD_UNSPECIFIED),
+    m_configComplete (false)
 {
   NS_LOG_FUNCTION_NOARGS ();
 }
@@ -177,6 +178,19 @@
 }
 
 void
+WifiNetDevice::SetStandard (WifiStandard standard)
+{
+  NS_ABORT_MSG_IF (m_standard != WIFI_STANDARD_UNSPECIFIED, "Wifi standard already set");
+  m_standard = standard;
+}
+
+WifiStandard
+WifiNetDevice::GetStandard (void) const
+{
+  return m_standard;
+}
+
+void
 WifiNetDevice::SetMac (const Ptr<WifiMac> mac)
 {
   m_mac = mac;
@@ -455,7 +469,7 @@
 Ptr<HtConfiguration>
 WifiNetDevice::GetHtConfiguration (void) const
 {
-  return m_htConfiguration;
+  return (m_standard >= WIFI_STANDARD_80211n ? m_htConfiguration : nullptr);
 }
 
 void
@@ -467,7 +481,8 @@
 Ptr<VhtConfiguration>
 WifiNetDevice::GetVhtConfiguration (void) const
 {
-  return m_vhtConfiguration;
+  return (m_standard >= WIFI_STANDARD_80211ac && m_phy->GetPhyBand () == WIFI_PHY_BAND_5GHZ
+          ? m_vhtConfiguration : nullptr);
 }
 
 void
@@ -479,7 +494,7 @@
 Ptr<HeConfiguration>
 WifiNetDevice::GetHeConfiguration (void) const
 {
-  return m_heConfiguration;
+  return (m_standard >= WIFI_STANDARD_80211ax ? m_heConfiguration : nullptr);
 }
 
 } //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/wifi-net-device.h ns-3.36/src/wifi/model/wifi-net-device.h
--- ns-3.35/src/wifi/model/wifi-net-device.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/wifi-net-device.h	2022-04-30 18:23:58.218735200 -0700
@@ -23,6 +23,7 @@
 
 #include "ns3/net-device.h"
 #include "ns3/traced-callback.h"
+#include "wifi-standards.h"
 
 namespace ns3 {
 
@@ -62,6 +63,23 @@
   WifiNetDevice ();
   virtual ~WifiNetDevice ();
 
+  // Delete copy constructor and assignment operator to avoid misuse
+  WifiNetDevice (const WifiNetDevice &o) = delete;
+  WifiNetDevice &operator = (const WifiNetDevice &) = delete;
+
+  /**
+   * Set the Wifi standard.
+   *
+   * \param standard the Wifi standard
+   */
+  void SetStandard (WifiStandard standard);
+  /**
+   * Get the Wifi standard.
+   *
+   * \return the Wifi standard
+   */
+  WifiStandard GetStandard (void) const;
+
   /**
    * \param mac the MAC layer to use.
    */
@@ -154,23 +172,6 @@
 
 private:
   /**
-   * \brief Copy constructor
-   * \param o object to copy
-   *
-   * Defined and unimplemented to avoid misuse
-   */
-  WifiNetDevice (const WifiNetDevice &o);
-
-  /**
-   * \brief Assignment operator
-   * \param o object to copy
-   * \returns the copied object
-   *
-   * Defined and unimplemented to avoid misuse
-   */
-  WifiNetDevice &operator = (const WifiNetDevice &o);
-
-  /**
    * Set that the link is up. A link is always up in ad-hoc mode.
    * For a STA, a link is up when the STA is associated with an AP.
    */
@@ -198,6 +199,7 @@
   TracedCallback<Ptr<const Packet>, Mac48Address> m_rxLogger; //!< receive trace callback
   TracedCallback<Ptr<const Packet>, Mac48Address> m_txLogger; //!< transmit trace callback
 
+  WifiStandard m_standard; //!< Wifi standard
   uint32_t m_ifIndex; //!< IF index
   bool m_linkUp; //!< link up
   TracedCallback<> m_linkChanges; //!< link change callback
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/wifi-phy.cc ns-3.36/src/wifi/model/wifi-phy.cc
--- ns-3.35/src/wifi/model/wifi-phy.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/wifi-phy.cc	2022-04-30 18:23:58.218735200 -0700
@@ -23,24 +23,21 @@
 #include "ns3/simulator.h"
 #include "ns3/log.h"
 #include "ns3/pointer.h"
+#include "ns3/string.h"
+#include "ns3/tuple.h"
 #include "ns3/mobility-model.h"
 #include "ns3/random-variable-stream.h"
 #include "ns3/error-model.h"
+#include "wifi-net-device.h"
 #include "wifi-phy.h"
-#include "ampdu-tag.h"
 #include "wifi-utils.h"
-#include "sta-wifi-mac.h"
 #include "frame-capture-model.h"
 #include "preamble-detection-model.h"
 #include "wifi-radio-energy-model.h"
 #include "error-rate-model.h"
 #include "wifi-net-device.h"
-#include "ns3/ht-configuration.h"
-#include "ns3/he-configuration.h"
-#include "mpdu-aggregator.h"
 #include "wifi-psdu.h"
 #include "wifi-ppdu.h"
-#include "ap-wifi-mac.h"
 #include "ns3/dsss-phy.h"
 #include "ns3/erp-ofdm-phy.h"
 #include "ns3/he-phy.h" //includes OFDM, HT, and VHT
@@ -55,308 +52,57 @@
 
 NS_OBJECT_ENSURE_REGISTERED (WifiPhy);
 
-const std::set<FrequencyChannelInfo> WifiPhy::m_frequencyChannels =
-{
-  //2.4 GHz channels
-  // 802.11b uses width of 22, while OFDM modes use width of 20
-  { std::make_tuple (1, 2412, 22, WIFI_PHY_DSSS_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
-  { std::make_tuple (1, 2412, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
-  { std::make_tuple (2, 2417, 22, WIFI_PHY_DSSS_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
-  { std::make_tuple (2, 2417, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
-  { std::make_tuple (3, 2422, 22, WIFI_PHY_DSSS_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
-  { std::make_tuple (3, 2422, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
-  { std::make_tuple (4, 2427, 22, WIFI_PHY_DSSS_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
-  { std::make_tuple (4, 2427, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
-  { std::make_tuple (5, 2432, 22, WIFI_PHY_DSSS_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
-  { std::make_tuple (5, 2432, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
-  { std::make_tuple (6, 2437, 22, WIFI_PHY_DSSS_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
-  { std::make_tuple (6, 2437, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
-  { std::make_tuple (7, 2442, 22, WIFI_PHY_DSSS_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
-  { std::make_tuple (7, 2442, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
-  { std::make_tuple (8, 2447, 22, WIFI_PHY_DSSS_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
-  { std::make_tuple (8, 2447, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
-  { std::make_tuple (9, 2452, 22, WIFI_PHY_DSSS_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
-  { std::make_tuple (9, 2452, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
-  { std::make_tuple (10, 2457, 22, WIFI_PHY_DSSS_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
-  { std::make_tuple (10, 2457, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
-  { std::make_tuple (11, 2462, 22, WIFI_PHY_DSSS_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
-  { std::make_tuple (11, 2462, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
-  { std::make_tuple (12, 2467, 22, WIFI_PHY_DSSS_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
-  { std::make_tuple (12, 2467, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
-  { std::make_tuple (13, 2472, 22, WIFI_PHY_DSSS_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
-  { std::make_tuple (13, 2472, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
-  // Only defined for 802.11b
-  { std::make_tuple (14, 2484, 22, WIFI_PHY_DSSS_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
-  // 40 MHz channels
-  { std::make_tuple (3, 2422, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
-  { std::make_tuple (4, 2427, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
-  { std::make_tuple (5, 2432, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
-  { std::make_tuple (6, 2437, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
-  { std::make_tuple (7, 2442, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
-  { std::make_tuple (8, 2447, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
-  { std::make_tuple (9, 2452, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
-  { std::make_tuple (10, 2457, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
-  { std::make_tuple (11, 2462, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
-
-  // Now the 5 GHz channels used for 802.11a/n/ac/ax
-  // 20 MHz channels
-  { std::make_tuple (36, 5180, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
-  { std::make_tuple (40, 5200, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
-  { std::make_tuple (44, 5220, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
-  { std::make_tuple (48, 5240, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
-  { std::make_tuple (52, 5260, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
-  { std::make_tuple (56, 5280, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
-  { std::make_tuple (60, 5300, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
-  { std::make_tuple (64, 5320, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
-  { std::make_tuple (100, 5500, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
-  { std::make_tuple (104, 5520, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
-  { std::make_tuple (108, 5540, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
-  { std::make_tuple (112, 5560, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
-  { std::make_tuple (116, 5580, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
-  { std::make_tuple (120, 5600, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
-  { std::make_tuple (124, 5620, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
-  { std::make_tuple (128, 5640, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
-  { std::make_tuple (132, 5660, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
-  { std::make_tuple (136, 5680, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
-  { std::make_tuple (140, 5700, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
-  { std::make_tuple (144, 5720, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
-  { std::make_tuple (149, 5745, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
-  { std::make_tuple (153, 5765, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
-  { std::make_tuple (157, 5785, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
-  { std::make_tuple (161, 5805, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
-  { std::make_tuple (165, 5825, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
-  { std::make_tuple (169, 5845, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
-  { std::make_tuple (173, 5865, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
-  { std::make_tuple (177, 5885, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
-  { std::make_tuple (181, 5905, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
-  // 40 MHz channels
-  { std::make_tuple (38, 5190, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
-  { std::make_tuple (46, 5230, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
-  { std::make_tuple (54, 5270, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
-  { std::make_tuple (62, 5310, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
-  { std::make_tuple (102, 5510, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
-  { std::make_tuple (110, 5550, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
-  { std::make_tuple (118, 5590, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
-  { std::make_tuple (126, 5630, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
-  { std::make_tuple (134, 5670, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
-  { std::make_tuple (142, 5710, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
-  { std::make_tuple (151, 5755, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
-  { std::make_tuple (159, 5795, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
-  { std::make_tuple (167, 5835, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
-  { std::make_tuple (175, 5875, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
-  // 80 MHz channels
-  { std::make_tuple (42, 5210, 80, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
-  { std::make_tuple (58, 5290, 80, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
-  { std::make_tuple (106, 5530, 80, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
-  { std::make_tuple (122, 5610, 80, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
-  { std::make_tuple (138, 5690, 80, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
-  { std::make_tuple (155, 5775, 80, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
-  { std::make_tuple (171, 5855, 80, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
-  // 160 MHz channels
-  { std::make_tuple (50, 5250, 160, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
-  { std::make_tuple (114, 5570, 160, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
-  { std::make_tuple (163, 5815, 160, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
-
-  // 802.11p 10 MHz channels at the 5.855-5.925 band
-  { std::make_tuple (172, 5860, 10, WIFI_PHY_80211p_CHANNEL, WIFI_PHY_BAND_5GHZ) },
-  { std::make_tuple (174, 5870, 10, WIFI_PHY_80211p_CHANNEL, WIFI_PHY_BAND_5GHZ) },
-  { std::make_tuple (176, 5880, 10, WIFI_PHY_80211p_CHANNEL, WIFI_PHY_BAND_5GHZ) },
-  { std::make_tuple (178, 5890, 10, WIFI_PHY_80211p_CHANNEL, WIFI_PHY_BAND_5GHZ) },
-  { std::make_tuple (180, 5900, 10, WIFI_PHY_80211p_CHANNEL, WIFI_PHY_BAND_5GHZ) },
-  { std::make_tuple (182, 5910, 10, WIFI_PHY_80211p_CHANNEL, WIFI_PHY_BAND_5GHZ) },
-  { std::make_tuple (184, 5920, 10, WIFI_PHY_80211p_CHANNEL, WIFI_PHY_BAND_5GHZ) },
-
-  // 802.11p 5 MHz channels at the 5.855-5.925 band (for simplification, we consider the same center frequencies as the 10 MHz channels)
-  { std::make_tuple (171, 5860, 5, WIFI_PHY_80211p_CHANNEL, WIFI_PHY_BAND_5GHZ) },
-  { std::make_tuple (173, 5870, 5, WIFI_PHY_80211p_CHANNEL, WIFI_PHY_BAND_5GHZ) },
-  { std::make_tuple (175, 5880, 5, WIFI_PHY_80211p_CHANNEL, WIFI_PHY_BAND_5GHZ) },
-  { std::make_tuple (177, 5890, 5, WIFI_PHY_80211p_CHANNEL, WIFI_PHY_BAND_5GHZ) },
-  { std::make_tuple (179, 5900, 5, WIFI_PHY_80211p_CHANNEL, WIFI_PHY_BAND_5GHZ) },
-  { std::make_tuple (181, 5910, 5, WIFI_PHY_80211p_CHANNEL, WIFI_PHY_BAND_5GHZ) },
-  { std::make_tuple (183, 5920, 5, WIFI_PHY_80211p_CHANNEL, WIFI_PHY_BAND_5GHZ) },
-
-  // Now the 6 GHz channels (802.11ax only)
-  // 20 MHz channels
-  { std::make_tuple (1, 5945, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (5, 5965, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (9, 5985, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (13, 6005, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (17, 6025, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (21, 6045, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (25, 6065, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (29, 6085, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (33, 6105, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (37, 6125, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (41, 6145, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (45, 6165, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (49, 6185, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (53, 6205, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (57, 6225, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (61, 6245, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (65, 6265, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (69, 6285, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (73, 6305, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (77, 6325, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (81, 6345, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (85, 6365, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (89, 6385, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (93, 6405, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (97, 6425, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (101, 6445, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (105, 6465, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (109, 6485, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (113, 6505, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (117, 6525, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (121, 6545, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (125, 6565, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (129, 6585, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (133, 6605, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (137, 6625, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (141, 6645, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (145, 6665, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (149, 6685, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (153, 6705, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (157, 6725, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (161, 6745, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (165, 6765, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (169, 6785, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (173, 6805, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (177, 6825, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (181, 6845, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (185, 6865, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (189, 6885, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (193, 6905, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (197, 6925, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (201, 6945, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (205, 6965, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (209, 6985, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (213, 7005, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (217, 7025, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (221, 7045, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (225, 7065, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (229, 7085, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (233, 7105, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  // 40 MHz channels
-  { std::make_tuple (3, 5955, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (11, 5995, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (19, 6035, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (27, 6075, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (35, 6115, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (43, 6155, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (51, 6195, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (59, 6235, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (67, 6275, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (75, 6315, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (83, 6355, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (91, 6395, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (99, 6435, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (107, 6475, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (115, 6515, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (123, 6555, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (131, 6595, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (139, 6635, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (147, 6675, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (155, 6715, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (163, 6755, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (171, 6795, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (179, 6835, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (187, 6875, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (195, 6915, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (203, 6955, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (211, 6995, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (219, 7035, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (227, 7075, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  // 80 MHz channels
-  { std::make_tuple (7, 5975, 80, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (23, 6055, 80, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (39, 6135, 80, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (55, 6215, 80, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (71, 6295, 80, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (87, 6375, 80, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (103, 6455, 80, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (119, 6535, 80, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (135, 6615, 80, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (151, 6695, 80, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (167, 6775, 80, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (183, 6855, 80, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (199, 6935, 80, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (215, 7015, 80, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  // 160 MHz channels
-  { std::make_tuple (15, 6015, 160, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (47, 6175, 160, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (79, 6335, 160, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (111, 6495, 160, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (143, 6655, 160, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (175, 6815, 160, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
-  { std::make_tuple (207, 6975, 160, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) }
-};
-
-std::map<WifiModulationClass, Ptr<PhyEntity> > WifiPhy::m_staticPhyEntities; //will be filled by g_constructor_XXX
-
 TypeId
 WifiPhy::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::WifiPhy")
     .SetParent<Object> ()
     .SetGroupName ("Wifi")
+    .AddAttribute ("ChannelSettings",
+                   "Tuple {channel number, channel width (MHz), PHY band, primary20 index} "
+                   "describing the settings of the operating channel. The primary20 index is "
+                   "the index of the primary 20 MHz channel within the operating channel "
+                   "(0 indicates the 20 MHz subchannel with the lowest center frequency) and "
+                   "is only valid if the width of the operating channel is a multiple of 20 MHz. "
+                   "If the standard for this object has not been set yet, the value of this "
+                   "attribute is saved and will be used to set the operating channel when the "
+                   "standard is configured. If the PHY band is left unspecified, the default "
+                   "band for the configured standard is used. If the channel width and the "
+                   "channel number are both 0, the default channel width for the configured "
+                   "standard and band are used. If the channel number is 0, the default "
+                   "channel number for the configured standard, band and channel width is used."
+                   "Note that the channel width can be left unspecified (0) if the channel "
+                   "number uniquely identify a frequency channel for the given standard and band. ",
+                   StringValue ("{0, 0, BAND_UNSPECIFIED, 0}"),
+                   MakeTupleAccessor <UintegerValue, UintegerValue, EnumValue, UintegerValue> ((void (WifiPhy::*) (const ChannelTuple&))(&WifiPhy::SetOperatingChannel)),
+                   MakeTupleChecker<UintegerValue, UintegerValue, EnumValue, UintegerValue>
+                     (MakeUintegerChecker<uint8_t> (0, 233),
+                      MakeUintegerChecker<uint16_t> (0, 160),
+                      MakeEnumChecker (WifiPhyBand::WIFI_PHY_BAND_2_4GHZ, "BAND_2_4GHZ",
+                                       WifiPhyBand::WIFI_PHY_BAND_5GHZ, "BAND_5GHZ",
+                                       WifiPhyBand::WIFI_PHY_BAND_6GHZ, "BAND_6GHZ",
+                                       WifiPhyBand::WIFI_PHY_BAND_UNSPECIFIED, "BAND_UNSPECIFIED"),
+                      MakeUintegerChecker<uint8_t> (0, 7)))
     .AddAttribute ("Frequency",
-                   "The center frequency (MHz) of the operating channel. "
-                   "If the operating channel for this object has not been set yet, the "
-                   "value of this attribute is saved and will be used, along with the channel "
-                   "number and width configured via other attributes, to set the operating "
-                   "channel when the standard and band are configured. The default value of "
-                   "this attribute is 0, which means unspecified center frequency. Note that "
-                   "if center frequency and channel number are both 0 when the standard and "
-                   "band are configured, a default channel (of the configured width, if any, "
-                   "or the default width for the current standard and band, otherwise) is set. "
-                   "If the operating channel for this object has been already set, the "
-                   "specified center frequency must uniquely identify a channel in the "
-                   "band being used.",
+                   "The center frequency (MHz) of the current operating channel.",
                    UintegerValue (0),
-                   MakeUintegerAccessor (&WifiPhy::GetFrequency,
-                                         &WifiPhy::SetFrequency),
+                   MakeUintegerAccessor (&WifiPhy::GetFrequency),
                    MakeUintegerChecker<uint16_t> ())
     .AddAttribute ("ChannelNumber",
-                   "The channel number of the operating channel. "
-                   "If the operating channel for this object has not been set yet, the "
-                   "value of this attribute is saved and will be used, along with the center "
-                   "frequency and width configured via other attributes, to set the operating "
-                   "channel when the standard and band are configured. The default value of "
-                   "this attribute is 0, which means unspecified channel number. Note that "
-                   "if center frequency and channel number are both 0 when the standard and "
-                   "band are configured, a default channel (of the configured width, if any, "
-                   "or the default width for the current standard and band, otherwise) is set. "
-                   "If the operating channel for this object has been already set, the "
-                   "specified channel number must uniquely identify a channel in the "
-                   "band being used.",
+                   "The channel number of the current operating channel.",
                    UintegerValue (0),
-                   MakeUintegerAccessor (&WifiPhy::SetChannelNumber,
-                                         &WifiPhy::GetChannelNumber),
+                   MakeUintegerAccessor (&WifiPhy::GetChannelNumber),
                    MakeUintegerChecker<uint8_t> (0, 233))
     .AddAttribute ("ChannelWidth",
-                   "The width in MHz of the operating channel (5, 10, 20, 22, 40, 80 or 160). "
-                   "If the operating channel for this object has not been set yet, the "
-                   "value of this attribute is saved and will be used, along with the center "
-                   "frequency and channel number configured via other attributes, to set the "
-                   "operating channel when the standard and band are configured. The default value "
-                   "of this attribute is 0, which means unspecified channel width. Note that "
-                   "if center frequency and channel number are both 0 when the standard and "
-                   "band are configured, a default channel (of the configured width, if any, "
-                   "or the default width for the current standard and band, otherwise) is set. "
-                   "Do not set this attribute when the standard and band of this object have "
-                   "been already configured, because it cannot uniquely identify a channel in "
-                   "the band being used.",
+                   "The width in MHz of the current operating channel (5, 10, 20, 22, 40, 80 or 160).",
                    UintegerValue (0),
-                   MakeUintegerAccessor (&WifiPhy::GetChannelWidth,
-                                         &WifiPhy::SetChannelWidth),
+                   MakeUintegerAccessor (&WifiPhy::GetChannelWidth),
                    MakeUintegerChecker<uint16_t> (5, 160))
     .AddAttribute ("Primary20MHzIndex",
-                   "The index of the primary 20 MHz channel within the operating channel "
-                   "(0 indicates the 20 MHz subchannel with the lowest center frequency). "
-                   "This attribute is only valid if the width of the operating channel is "
-                   "a multiple of 20 MHz.",
+                   "The index of the primary 20 MHz channel within the current operating channel "
+                   "(0 indicates the 20 MHz subchannel with the lowest center frequency).",
                    UintegerValue (0),
-                   MakeUintegerAccessor (&WifiPhy::SetPrimary20Index),
+                   MakeUintegerAccessor (&WifiPhy::GetPrimary20Index),
                    MakeUintegerChecker<uint8_t> (0, 7))
     .AddAttribute ("RxSensitivity",
                    "The energy of a received signal should be higher than "
@@ -564,12 +310,8 @@
     m_endTxEvent (),
     m_currentEvent (0),
     m_previouslyRxPpduUid (UINT64_MAX),
-    m_standard (WIFI_PHY_STANDARD_UNSPECIFIED),
+    m_standard (WIFI_STANDARD_UNSPECIFIED),
     m_band (WIFI_PHY_BAND_UNSPECIFIED),
-    m_initialFrequency (0),
-    m_initialChannelNumber (0),
-    m_initialChannelWidth (0),
-    m_initialPrimary20Index (0),
     m_sifs (Seconds (0)),
     m_slot (Seconds (0)),
     m_pifs (Seconds (0)),
@@ -625,6 +367,13 @@
   m_phyEntities.clear ();
 }
 
+std::map<WifiModulationClass, Ptr<PhyEntity> > &
+WifiPhy::GetStaticPhyEntities (void)
+{
+    static std::map<WifiModulationClass, Ptr<PhyEntity> > g_staticPhyEntities;
+    return g_staticPhyEntities;
+}
+
 Ptr<WifiPhyStateHelper>
 WifiPhy::GetState (void) const
 {
@@ -774,12 +523,12 @@
 }
 
 void
-WifiPhy::SetDevice (const Ptr<NetDevice> device)
+WifiPhy::SetDevice (const Ptr<WifiNetDevice> device)
 {
   m_device = device;
 }
 
-Ptr<NetDevice>
+Ptr<WifiNetDevice>
 WifiPhy::GetDevice (void) const
 {
   return m_device;
@@ -869,8 +618,8 @@
 const Ptr<const PhyEntity>
 WifiPhy::GetStaticPhyEntity (WifiModulationClass modulation)
 {
-  const auto it = m_staticPhyEntities.find (modulation);
-  NS_ABORT_MSG_IF (it == m_staticPhyEntities.end (), "Unimplemented Wi-Fi modulation class");
+  const auto it = GetStaticPhyEntities ().find (modulation);
+  NS_ABORT_MSG_IF (it == GetStaticPhyEntities ().end (), "Unimplemented Wi-Fi modulation class");
   return it->second;
 }
 
@@ -878,7 +627,7 @@
 WifiPhy::GetPhyEntity (WifiModulationClass modulation) const
 {
   const auto it = m_phyEntities.find (modulation);
-  NS_ABORT_MSG_IF (it == m_phyEntities.end (), "Unsupported Wi-Fi modulation class");
+  NS_ABORT_MSG_IF (it == m_phyEntities.end (), "Unsupported Wi-Fi modulation class " << modulation);
   return it->second;
 }
 
@@ -886,15 +635,15 @@
 WifiPhy::AddStaticPhyEntity (WifiModulationClass modulation, Ptr<PhyEntity> phyEntity)
 {
   NS_LOG_FUNCTION (modulation);
-  NS_ASSERT_MSG (m_staticPhyEntities.find (modulation) == m_staticPhyEntities.end (), "The PHY entity has already been added. The setting should only be done once per modulation class");
-  m_staticPhyEntities[modulation] = phyEntity;
+  NS_ASSERT_MSG (GetStaticPhyEntities ().find (modulation) == GetStaticPhyEntities ().end (), "The PHY entity has already been added. The setting should only be done once per modulation class");
+    GetStaticPhyEntities ()[modulation] = phyEntity;
 }
 
 void
 WifiPhy::AddPhyEntity (WifiModulationClass modulation, Ptr<PhyEntity> phyEntity)
 {
   NS_LOG_FUNCTION (this << modulation);
-  NS_ABORT_MSG_IF (m_staticPhyEntities.find (modulation) == m_staticPhyEntities.end (), "Cannot add an unimplemented PHY to supported list. Update the former first.");
+  NS_ABORT_MSG_IF (GetStaticPhyEntities ().find (modulation) == GetStaticPhyEntities ().end (), "Cannot add an unimplemented PHY to supported list. Update the former first.");
   NS_ASSERT_MSG (m_phyEntities.find (modulation) == m_phyEntities.end (), "The PHY entity has already been added. The setting should only be done once per modulation class");
   phyEntity->SetOwner (this);
   m_phyEntities[modulation] = phyEntity;
@@ -1066,54 +815,51 @@
 }
 
 void
-WifiPhy::ConfigureStandardAndBand (WifiPhyStandard standard, WifiPhyBand band)
+WifiPhy::ConfigureStandard (WifiStandard standard)
 {
-  NS_LOG_FUNCTION (this << standard << band);
-  m_standard = standard;
-  m_band = band;
+  NS_LOG_FUNCTION (this << standard);
 
-  if (m_initialFrequency == 0 && m_initialChannelNumber == 0)
-    {
-      // set a default channel if the user did not specify anything
-      if (m_initialChannelWidth == 0)
-        {
-          // set a default channel width
-          m_initialChannelWidth = GetDefaultChannelWidth (m_standard, m_band);
-        }
+  NS_ABORT_MSG_IF (m_standard != WIFI_STANDARD_UNSPECIFIED && standard != m_standard,
+                   "Cannot change standard");
 
-      m_operatingChannel.SetDefault (m_initialChannelWidth, m_standard, m_band);
-    }
-  else
+  m_standard = standard;
+
+  if (!m_operatingChannel.IsSet ())
     {
-      m_operatingChannel.Set (m_initialChannelNumber, m_initialFrequency, m_initialChannelWidth,
-                              m_standard, m_band);
+      NS_LOG_DEBUG ("Setting the operating channel first");
+      SetOperatingChannel (m_channelSettings);
+      // return because we are called back by SetOperatingChannel
+      return;
     }
-  m_operatingChannel.SetPrimary20Index (m_initialPrimary20Index);
+
+  // this function is called when changing PHY band, hence we have to delete
+  // the previous PHY entities
+  m_phyEntities.clear ();
 
   switch (standard)
     {
-    case WIFI_PHY_STANDARD_80211a:
+    case WIFI_STANDARD_80211a:
       Configure80211a ();
       break;
-    case WIFI_PHY_STANDARD_80211b:
+    case WIFI_STANDARD_80211b:
       Configure80211b ();
       break;
-    case WIFI_PHY_STANDARD_80211g:
+    case WIFI_STANDARD_80211g:
       Configure80211g ();
       break;
-    case WIFI_PHY_STANDARD_80211p:
+    case WIFI_STANDARD_80211p:
       Configure80211p ();
       break;
-    case WIFI_PHY_STANDARD_80211n:
+    case WIFI_STANDARD_80211n:
       Configure80211n ();
       break;
-    case WIFI_PHY_STANDARD_80211ac:
+    case WIFI_STANDARD_80211ac:
       Configure80211ac ();
       break;
-    case WIFI_PHY_STANDARD_80211ax:
+    case WIFI_STANDARD_80211ax:
       Configure80211ax ();
       break;
-    case WIFI_PHY_STANDARD_UNSPECIFIED:
+    case WIFI_STANDARD_UNSPECIFIED:
     default:
       NS_ASSERT_MSG (false, "Unsupported standard");
       break;
@@ -1127,8 +873,8 @@
 }
 
 
-WifiPhyStandard
-WifiPhy::GetPhyStandard (void) const
+WifiStandard
+WifiPhy::GetStandard (void) const
 {
   return m_standard;
 }
@@ -1139,127 +885,51 @@
   return m_operatingChannel;
 }
 
-void
-WifiPhy::SetFrequency (uint16_t frequency)
-{
-  NS_LOG_FUNCTION (this << frequency);
-
-  if (!m_operatingChannel.IsSet ())
-    {
-      // ConfigureStandardAndBand has not been called yet, so store the frequency
-      // into m_initialFrequency
-      NS_LOG_DEBUG ("Saving frequency configuration for initialization");
-      m_initialFrequency = frequency;
-      return;
-    }
-
-  if (GetFrequency () == frequency)
-    {
-      NS_LOG_DEBUG ("No frequency change requested");
-      return;
-    }
-
-  // if the frequency does not uniquely identify an operating channel,
-  // the simulation aborts
-  SetOperatingChannel (0, frequency, 0);
-}
-
 uint16_t
 WifiPhy::GetFrequency (void) const
 {
   return m_operatingChannel.GetFrequency ();
 }
 
-void
-WifiPhy::SetChannelNumber (uint8_t nch)
-{
-  NS_LOG_FUNCTION (this << +nch);
-
-  if (!m_operatingChannel.IsSet ())
-    {
-      // ConfigureStandardAndBand has not been called yet, so store the channel
-      // into m_initialChannelNumber
-      NS_LOG_DEBUG ("Saving channel number configuration for initialization");
-      m_initialChannelNumber = nch;
-      return;
-    }
-
-  if (GetChannelNumber () == nch)
-    {
-      NS_LOG_DEBUG ("No channel change requested");
-      return;
-    }
-
-  // if the channel number does not uniquely identify an operating channel,
-  // the simulation aborts
-  SetOperatingChannel (nch, 0, 0);
-}
-
 uint8_t
 WifiPhy::GetChannelNumber (void) const
 {
   return m_operatingChannel.GetNumber ();
 }
 
-void
-WifiPhy::SetChannelWidth (uint16_t channelWidth)
-{
-  NS_LOG_FUNCTION (this << channelWidth);
-
-  if (channelWidth != 0)
-    {
-      AddSupportedChannelWidth (channelWidth);
-    }
-
-  if (!m_operatingChannel.IsSet ())
-    {
-      // ConfigureStandardAndBand has not been called yet, so store the channel width
-      // into m_initialChannelWidth
-      NS_LOG_DEBUG ("Saving channel width configuration for initialization");
-      m_initialChannelWidth = channelWidth;
-      return;
-    }
-
-  if (GetChannelWidth () == channelWidth)
-    {
-      NS_LOG_DEBUG ("No channel width change requested");
-      return;
-    }
-
-  NS_ABORT_MSG ("The channel width does not uniquely identify an operating channel.");
-}
-
 uint16_t
 WifiPhy::GetChannelWidth (void) const
 {
   return m_operatingChannel.GetWidth ();
 }
 
+uint8_t
+WifiPhy::GetPrimary20Index (void) const
+{
+  return m_operatingChannel.GetPrimaryChannelIndex (20);
+}
+
 void
-WifiPhy::SetPrimary20Index (uint8_t index)
+WifiPhy::SetOperatingChannel (const ChannelTuple& channelTuple)
 {
-  NS_LOG_FUNCTION (this << +index);
+  // the generic operator<< for tuples does not give a pretty result
+  NS_LOG_FUNCTION (this << +std::get<0> (channelTuple) << std::get<1> (channelTuple)
+                   << static_cast<WifiPhyBand> (std::get<2> (channelTuple))
+                   << +std::get<3> (channelTuple));
 
-  if (!m_operatingChannel.IsSet ())
+  m_channelSettings = channelTuple;
+
+  if (m_standard == WIFI_STANDARD_UNSPECIFIED)
     {
-      // ConfigureStandardAndBand has not been called yet, so store the primary20
-      // index into m_initialPrimary20Index
-      NS_LOG_DEBUG ("Saving primary20 index configuration for initialization");
-      m_initialPrimary20Index = index;
+      NS_LOG_DEBUG ("Channel information will be applied when a standard is configured");
       return;
     }
 
-  m_operatingChannel.SetPrimary20Index (index);
-}
-
-void
-WifiPhy::SetOperatingChannel (uint8_t number, uint16_t frequency, uint16_t width)
-{
   Time delay = Seconds (0);
 
   if (IsInitialized ())
     {
-      delay = DoChannelSwitch ();
+      delay = GetDelayUntilChannelSwitch ();
     }
 
   if (delay.IsStrictlyNegative ())
@@ -1270,33 +940,17 @@
   if (delay.IsStrictlyPositive ())
     {
       // switching channel has been postponed
-      Simulator::Schedule (delay, &WifiPhy::SetOperatingChannel, this, number, frequency, width);
+      void (WifiPhy::*fp) (const ChannelTuple&) = &WifiPhy::SetOperatingChannel;
+      Simulator::Schedule (delay, fp, this, channelTuple);
       return;
     }
 
   // channel can be switched now.
-  uint16_t prevChannelWidth = 0;
-  if (m_operatingChannel.IsSet ())
-    {
-      prevChannelWidth = GetChannelWidth ();
-    }
-
-  m_operatingChannel.Set (number, frequency, width, m_standard, m_band);
-
-  if (GetChannelWidth () != prevChannelWidth)
-    {
-      AddSupportedChannelWidth (GetChannelWidth ());
-
-      // If channel width changed after initialization, invoke the capabilities changed callback
-      if (IsInitialized () && !m_capabilitiesChangedCallback.IsNull ())
-        {
-          m_capabilitiesChangedCallback ();
-        }
-    }
+  DoChannelSwitch ();
 }
 
 Time
-WifiPhy::DoChannelSwitch (void)
+WifiPhy::GetDelayUntilChannelSwitch (void)
 {
   m_powerRestricted = false;
   m_channelAccessRequested = false;
@@ -1328,6 +982,7 @@
       break;
     case WifiPhyState::CCA_BUSY:
     case WifiPhyState::IDLE:
+      m_endPhyRxEvent.Cancel ();
       for (auto & phyEntity : m_phyEntities)
         {
           phyEntity.second->CancelAllEvents ();
@@ -1342,10 +997,53 @@
       break;
     }
 
-  if (delay.IsZero ())
+  return delay;
+}
+
+void
+WifiPhy::DoChannelSwitch (void)
+{
+  NS_LOG_FUNCTION (this);
+
+  // Update unspecified parameters with default values
+  if (auto& [number, width, band, primary20] = m_channelSettings; true)
+    {
+      if (band == static_cast<int> (WIFI_PHY_BAND_UNSPECIFIED))
+        {
+          band = static_cast<int> (GetDefaultPhyBand (m_standard));
+        }
+      if (width == 0 && number == 0)
+        {
+          width = GetDefaultChannelWidth (m_standard, (WifiPhyBand)(band));
+        }
+      if (number == 0)
+        {
+          number = WifiPhyOperatingChannel::GetDefaultChannelNumber (width, m_standard, (WifiPhyBand)(band));
+        }
+    }
+
+  // We need to call SetStandard if this is the first time we set a channel or we
+  // are changing PHY band. Checking if the new PHY band is different than the
+  // previous one covers both cases because initially the PHY band is unspecified
+  bool changingPhyBand = (static_cast<WifiPhyBand> (std::get<2> (m_channelSettings)) != m_band);
+
+  m_band = static_cast<WifiPhyBand> (std::get<2> (m_channelSettings));
+
+  NS_LOG_DEBUG ("switching channel");
+  m_operatingChannel.Set (std::get<0> (m_channelSettings), 0, std::get<1> (m_channelSettings),
+                          m_standard, m_band);
+  m_operatingChannel.SetPrimary20Index (std::get<3> (m_channelSettings));
+
+  if (changingPhyBand)
+    {
+      ConfigureStandard (m_standard);
+    }
+
+  AddSupportedChannelWidth (GetChannelWidth ());
+
+  if (IsInitialized ())
     {
-      // channel switch can be done now
-      NS_LOG_DEBUG ("switching channel");
+      // notify channel switching
       m_state->SwitchToChannelSwitching (GetChannelSwitchDelay ());
       m_interference.EraseEvents ();
       /*
@@ -1356,8 +1054,6 @@
       * out the state of the medium after the switching.
       */
     }
-
-  return delay;
 }
 
 void
@@ -1793,7 +1489,7 @@
 }
 
 void
-WifiPhy::Send (WifiConstPsduMap psdus, WifiTxVector txVector)
+WifiPhy::Send (WifiConstPsduMap psdus, const WifiTxVector& txVector)
 {
   NS_LOG_FUNCTION (this << psdus << txVector);
   /* Transmission can happen if:
@@ -1819,16 +1515,6 @@
         }
       return;
     }
-  
-  // Set RU PHY indices
-  if (txVector.IsMu ())
-    {
-      for (auto& heMuUserInfo : txVector.GetHeMuUserInfoMap ())
-        {
-          heMuUserInfo.second.ru.SetPhyIndex (txVector.GetChannelWidth (),
-                                              m_operatingChannel.GetPrimaryChannelIndex (20));
-        }
-    }
 
   Time txDuration = CalculateTxDuration (psdus, txVector, GetPhyBand ());
 
@@ -2322,4 +2008,10 @@
   return os;
 }
 
+uint8_t
+WifiPhy::GetPrimaryChannelNumber (uint16_t primaryChannelWidth) const
+{
+  return m_operatingChannel.GetPrimaryChannelNumber (primaryChannelWidth, m_standard);
+}
+
 } //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/wifi-phy-common.h ns-3.36/src/wifi/model/wifi-phy-common.h
--- ns-3.35/src/wifi/model/wifi-phy-common.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/wifi-phy-common.h	2022-04-30 18:23:58.218735200 -0700
@@ -267,6 +267,8 @@
   RXING,
   TXING,
   SLEEPING,
+  POWERED_OFF,
+  TRUNCATED_TX,
   BUSY_DECODING_PREAMBLE,
   PREAMBLE_DETECT_FAILURE,
   RECEPTION_ABORTED_BY_TX,
@@ -302,6 +304,10 @@
         return (os << "TXING");
       case SLEEPING:
         return (os << "SLEEPING");
+      case POWERED_OFF:
+        return (os << "OFF");
+      case TRUNCATED_TX:
+        return (os << "TRUNCATED_TX");
       case BUSY_DECODING_PREAMBLE:
         return (os << "BUSY_DECODING_PREAMBLE");
       case PREAMBLE_DETECT_FAILURE:
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/wifi-phy.h ns-3.36/src/wifi/model/wifi-phy.h
--- ns-3.35/src/wifi/model/wifi-phy.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/wifi-phy.h	2022-04-30 18:23:58.218735200 -0700
@@ -32,7 +32,7 @@
 namespace ns3 {
 
 class Channel;
-class NetDevice;
+class WifiNetDevice;
 class MobilityModel;
 class WifiPhyStateHelper;
 class FrameCaptureModel;
@@ -58,8 +58,6 @@
   WifiPhy ();
   virtual ~WifiPhy ();
 
-  static const std::set<FrequencyChannelInfo> m_frequencyChannels;  //!< Available frequency channels
-
   /**
    * Return the WifiPhyStateHelper of this PHY
    *
@@ -149,7 +147,7 @@
    *        this PSDU, and txPowerLevel, a power level to use to send the whole PPDU. The real transmission
    *        power is calculated as txPowerMin + txPowerLevel * (txPowerMax - txPowerMin) / nTxLevels
    */
-  void Send (WifiConstPsduMap psdus, WifiTxVector txVector);
+  void Send (WifiConstPsduMap psdus, const WifiTxVector& txVector);
 
   /**
    * \param ppdu the PPDU to send
@@ -472,29 +470,6 @@
   WifiMode GetMcs (WifiModulationClass modulation, uint8_t mcs) const;
 
   /**
-   * \brief Set channel number.
-   *
-   * Channel center frequency = Channel starting frequency + 5 MHz * (nch - 1)
-   *
-   * where Starting channel frequency is standard-dependent,
-   * as defined in (Section 18.3.8.4.2 "Channel numbering"; IEEE Std 802.11-2012).
-   *
-   * If the operating channel for this object has not been set yet, the given
-   * channel number is saved and will be used, along with the center frequency and
-   * width that have been saved similarly, to set the operating channel when the
-   * standard and band are configured. Note that if center frequency and channel
-   * number are both 0 when the standard and band are configured, a default channel
-   * (of the configured width, if any, or the default width for the current standard
-   * and band, otherwise) is set.
-   * If the operating channel for this object has been already set, the specified
-   * channel number must uniquely identify a channel in the band being used. If so,
-   * this method may still fail to take action if the PHY model determines that
-   * the channel number cannot be switched for some reason (e.g. sleep state)
-   *
-   * \param id the channel number
-   */
-  virtual void SetChannelNumber (uint8_t id);
-  /**
    * Return current channel number.
    *
    * \return the current channel number
@@ -509,16 +484,15 @@
    * Configure the PHY-level parameters for different Wi-Fi standard.
    *
    * \param standard the Wi-Fi standard
-   * \param band the Wi-Fi band
    */
-  virtual void ConfigureStandardAndBand (WifiPhyStandard standard, WifiPhyBand band);
+  virtual void ConfigureStandard (WifiStandard standard);
 
   /**
    * Get the configured Wi-Fi standard
    *
    * \return the Wi-Fi standard that has been configured
    */
-  WifiPhyStandard GetPhyStandard (void) const;
+  WifiStandard GetStandard (void) const;
 
   /**
    * Get the configured Wi-Fi band
@@ -823,13 +797,13 @@
    *
    * \param device the device this PHY is associated with
    */
-  void SetDevice (const Ptr<NetDevice> device);
+  void SetDevice (const Ptr<WifiNetDevice> device);
   /**
    * Return the device this PHY is associated with
    *
    * \return the device this PHY is associated with
    */
-  Ptr<NetDevice> GetDevice (void) const;
+  Ptr<WifiNetDevice> GetDevice (void) const;
   /**
    * \brief assign a mobility model to this device
    *
@@ -852,44 +826,29 @@
    */
   Ptr<MobilityModel> GetMobility (void) const;
 
+  using ChannelTuple = std::tuple<uint8_t /* channel number */,
+                                  uint16_t /* channel width */,
+                                  int /* WifiPhyBand */,
+                                  uint8_t /* primary20 index*/>;  //!< Tuple identifying an operating channel
+
   /**
-   * Set the operating channel according to the specified parameters. If this object
-   * has been already initialized, setting the operating channel involves a channel
-   * switch, which might be suppressed (e.g., if this object is in sleep mode) or
-   * delayed (e.g., if this object is transmitting a frame).
-   *
-   * \param number the channel number (use 0 to leave it unspecified)
-   * \param frequency the channel center frequency in MHz (use 0 to leave it unspecified)
-   * \param width the channel width in MHz (use 0 to leave it unspecified)
-   */
-  void SetOperatingChannel (uint8_t number, uint16_t frequency, uint16_t width);
-  /**
-   * If the operating channel for this object has not been set yet, the given
-   * center frequency is saved and will be used, along with the channel number and
-   * width that have been saved similarly, to set the operating channel when the
-   * standard and band are configured. Note that if center frequency and
-   * channel number are both 0 when the standard and band are configured, a default
-   * channel (of the configured width, if any, or the default width for the current
-   * standard and band, otherwise) is set.
-   * If the operating channel for this object has been already set, the specified
-   * center frequency must uniquely identify a channel in the band being used. If so,
-   * this method may still fail to take action if the PHY model determines that
-   * the operating channel cannot be switched for some reason (e.g. sleep state)
+   * If the standard for this object has not been set yet, store the given channel
+   * settings. Otherwise, check if a channel switch can be performed now. If not,
+   * schedule another call to this method when channel switch can be performed.
+   * Otherwise, set the operating channel based on the given channel settings and
+   * call ConfigureStandard if the PHY band has changed.
    *
-   * \param freq the operating center frequency (MHz) on this node.
+   * \param channelTuple the given channel settings
    */
-  virtual void SetFrequency (uint16_t freq);
+  void SetOperatingChannel (const ChannelTuple& channelTuple);
   /**
    * \return the operating center frequency (MHz)
    */
   uint16_t GetFrequency (void) const;
   /**
-   * Set the index of the primary 20 MHz channel (0 indicates the 20 MHz subchannel
-   * with the lowest center frequency).
-   *
-   * \param index the index of the primary 20 MHz channel
+   * \return the index of the primary 20 MHz channel
    */
-  void SetPrimary20Index (uint8_t index);
+  uint8_t GetPrimary20Index (void) const;
   /**
    * \param antennas the number of antennas on this node.
    */
@@ -969,21 +928,6 @@
    */
   uint16_t GetChannelWidth (void) const;
   /**
-   * If the operating channel for this object has not been set yet, the given
-   * channel width is saved and will be used, along with the center frequency and
-   * channel number that have been saved similarly, to set the operating channel
-   * when the standard and band are configured. Note that if center frequency and
-   * channel number are both 0 when the standard and band are configured, a default
-   * channel (of the configured width, if any, or the default width for the current
-   * standard and band, otherwise) is set.
-   * Do not call this method when the standard and band of this object have been
-   * already configured, because it cannot uniquely identify a channel in the band
-   * being used.
-   *
-   * \param channelWidth the channel width (in MHz)
-   */
-  virtual void SetChannelWidth (uint16_t channelWidth);
-  /**
    * \param width the channel width (in MHz) to support
    */
   void AddSupportedChannelWidth (uint16_t width);
@@ -1101,6 +1045,14 @@
    */
   virtual std::tuple<double, double, double> GetTxMaskRejectionParams (void) const = 0;
 
+  /**
+   * Get channel number of the primary channel
+   * \param primaryChannelWidth the width of the primary channel (MHz)
+   *
+   * \return channel number of the primary channel
+   */
+  uint8_t GetPrimaryChannelNumber (uint16_t primaryChannelWidth) const;
+
 protected:
   virtual void DoDispose (void);
 
@@ -1118,7 +1070,11 @@
    *         be performed or a negative value indicating that channel switch is
    *         currently not possible (i.e., the radio is in sleep mode)
    */
-  Time DoChannelSwitch (void);
+  Time GetDelayUntilChannelSwitch (void);
+  /**
+   * Actually switch channel based on the stored channel settings.
+   */
+  virtual void DoChannelSwitch (void);
 
   /**
    * Check if PHY state should move to CCA busy state based on current
@@ -1167,7 +1123,7 @@
    * Add the PHY entity to the map of supported PHY entities for the
    * given modulation class for the WifiPhy instance.
    * This is a wrapper method used to check that the PHY entity is
-   * in the static map of implemented PHY entities (\see m_staticPhyEntities).
+   * in the static map of implemented PHY entities (\see GetStaticPhyEntities).
    * In addition, child classes can add their own PHY entities.
    *
    * \param modulation the modulation class
@@ -1376,20 +1332,17 @@
   TracedCallback<Ptr<const Packet>, uint16_t /* frequency (MHz) */, WifiTxVector, MpduInfo, uint16_t /* STA-ID*/> m_phyMonitorSniffTxTrace;
 
   /**
-   * Map of __implemented__ PHY entities. This is used to compute the different
+   * \return the map of __implemented__ PHY entities.
+   * This is used to compute the different
    * amendment-specific parameters in a static manner.
    * For PHY entities supported by a given WifiPhy instance,
    * \see m_phyEntities.
    */
-  static std::map<WifiModulationClass, Ptr<PhyEntity> > m_staticPhyEntities;
+  static std::map<WifiModulationClass, Ptr<PhyEntity> > & GetStaticPhyEntities (void);
 
-  WifiPhyStandard m_standard;               //!< WifiPhyStandard
+  WifiStandard m_standard;                  //!< WifiStandard
   WifiPhyBand m_band;                       //!< WifiPhyBand
-  uint16_t m_initialFrequency;              //!< Store frequency until initialization (MHz)
-  uint8_t m_initialChannelNumber;           //!< Store channel number until initialization
-  uint16_t m_initialChannelWidth;           //!< Store channel width (MHz) until initialization
-  uint8_t m_initialPrimary20Index;          //!< Store the index of primary20 until initialization
-
+  ChannelTuple m_channelSettings;           //!< Store operating channel settings until initialization
   WifiPhyOperatingChannel m_operatingChannel;       //!< Operating channel
   std::vector<uint16_t> m_supportedChannelWidthSet; //!< Supported channel width set (MHz)
 
@@ -1420,7 +1373,7 @@
 
   Time m_channelSwitchDelay;     //!< Time required to switch between channel
 
-  Ptr<NetDevice>     m_device;   //!< Pointer to the device
+  Ptr<WifiNetDevice> m_device;   //!< Pointer to the device
   Ptr<MobilityModel> m_mobility; //!< Pointer to the mobility model
 
   Ptr<FrameCaptureModel> m_frameCaptureModel;           //!< Frame capture model
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/wifi-phy-operating-channel.cc ns-3.36/src/wifi/model/wifi-phy-operating-channel.cc
--- ns-3.35/src/wifi/model/wifi-phy-operating-channel.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/wifi-phy-operating-channel.cc	2022-04-30 18:23:58.218735200 -0700
@@ -20,15 +20,252 @@
  */
 
 #include "ns3/log.h"
-#include "wifi-phy.h"
+#include "ns3/assert.h"
+#include "wifi-phy-operating-channel.h"
 #include <algorithm>
 
 namespace ns3 {
 
 NS_LOG_COMPONENT_DEFINE ("WifiPhyOperatingChannel");
 
+const std::set<FrequencyChannelInfo> WifiPhyOperatingChannel::m_frequencyChannels =
+{
+  //2.4 GHz channels
+  // 802.11b uses width of 22, while OFDM modes use width of 20
+  { std::make_tuple (1, 2412, 22, WIFI_PHY_DSSS_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
+  { std::make_tuple (1, 2412, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
+  { std::make_tuple (2, 2417, 22, WIFI_PHY_DSSS_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
+  { std::make_tuple (2, 2417, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
+  { std::make_tuple (3, 2422, 22, WIFI_PHY_DSSS_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
+  { std::make_tuple (3, 2422, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
+  { std::make_tuple (4, 2427, 22, WIFI_PHY_DSSS_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
+  { std::make_tuple (4, 2427, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
+  { std::make_tuple (5, 2432, 22, WIFI_PHY_DSSS_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
+  { std::make_tuple (5, 2432, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
+  { std::make_tuple (6, 2437, 22, WIFI_PHY_DSSS_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
+  { std::make_tuple (6, 2437, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
+  { std::make_tuple (7, 2442, 22, WIFI_PHY_DSSS_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
+  { std::make_tuple (7, 2442, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
+  { std::make_tuple (8, 2447, 22, WIFI_PHY_DSSS_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
+  { std::make_tuple (8, 2447, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
+  { std::make_tuple (9, 2452, 22, WIFI_PHY_DSSS_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
+  { std::make_tuple (9, 2452, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
+  { std::make_tuple (10, 2457, 22, WIFI_PHY_DSSS_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
+  { std::make_tuple (10, 2457, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
+  { std::make_tuple (11, 2462, 22, WIFI_PHY_DSSS_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
+  { std::make_tuple (11, 2462, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
+  { std::make_tuple (12, 2467, 22, WIFI_PHY_DSSS_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
+  { std::make_tuple (12, 2467, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
+  { std::make_tuple (13, 2472, 22, WIFI_PHY_DSSS_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
+  { std::make_tuple (13, 2472, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
+  // Only defined for 802.11b
+  { std::make_tuple (14, 2484, 22, WIFI_PHY_DSSS_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
+  // 40 MHz channels
+  { std::make_tuple (3, 2422, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
+  { std::make_tuple (4, 2427, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
+  { std::make_tuple (5, 2432, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
+  { std::make_tuple (6, 2437, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
+  { std::make_tuple (7, 2442, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
+  { std::make_tuple (8, 2447, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
+  { std::make_tuple (9, 2452, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
+  { std::make_tuple (10, 2457, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
+  { std::make_tuple (11, 2462, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
+
+  // Now the 5 GHz channels used for 802.11a/n/ac/ax
+  // 20 MHz channels
+  { std::make_tuple (36, 5180, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (40, 5200, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (44, 5220, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (48, 5240, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (52, 5260, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (56, 5280, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (60, 5300, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (64, 5320, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (100, 5500, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (104, 5520, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (108, 5540, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (112, 5560, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (116, 5580, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (120, 5600, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (124, 5620, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (128, 5640, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (132, 5660, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (136, 5680, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (140, 5700, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (144, 5720, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (149, 5745, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (153, 5765, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (157, 5785, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (161, 5805, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (165, 5825, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (169, 5845, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (173, 5865, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (177, 5885, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (181, 5905, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  // 40 MHz channels
+  { std::make_tuple (38, 5190, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (46, 5230, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (54, 5270, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (62, 5310, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (102, 5510, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (110, 5550, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (118, 5590, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (126, 5630, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (134, 5670, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (142, 5710, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (151, 5755, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (159, 5795, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (167, 5835, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (175, 5875, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  // 80 MHz channels
+  { std::make_tuple (42, 5210, 80, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (58, 5290, 80, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (106, 5530, 80, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (122, 5610, 80, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (138, 5690, 80, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (155, 5775, 80, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (171, 5855, 80, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  // 160 MHz channels
+  { std::make_tuple (50, 5250, 160, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (114, 5570, 160, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (163, 5815, 160, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+
+  // 802.11p 10 MHz channels at the 5.855-5.925 band
+  { std::make_tuple (172, 5860, 10, WIFI_PHY_80211p_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (174, 5870, 10, WIFI_PHY_80211p_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (176, 5880, 10, WIFI_PHY_80211p_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (178, 5890, 10, WIFI_PHY_80211p_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (180, 5900, 10, WIFI_PHY_80211p_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (182, 5910, 10, WIFI_PHY_80211p_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (184, 5920, 10, WIFI_PHY_80211p_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+
+  // 802.11p 5 MHz channels at the 5.855-5.925 band (for simplification, we consider the same center frequencies as the 10 MHz channels)
+  { std::make_tuple (171, 5860, 5, WIFI_PHY_80211p_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (173, 5870, 5, WIFI_PHY_80211p_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (175, 5880, 5, WIFI_PHY_80211p_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (177, 5890, 5, WIFI_PHY_80211p_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (179, 5900, 5, WIFI_PHY_80211p_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (181, 5910, 5, WIFI_PHY_80211p_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (183, 5920, 5, WIFI_PHY_80211p_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+
+  // Now the 6 GHz channels (802.11ax only)
+  // 20 MHz channels
+  { std::make_tuple (1, 5945, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (5, 5965, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (9, 5985, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (13, 6005, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (17, 6025, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (21, 6045, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (25, 6065, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (29, 6085, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (33, 6105, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (37, 6125, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (41, 6145, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (45, 6165, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (49, 6185, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (53, 6205, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (57, 6225, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (61, 6245, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (65, 6265, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (69, 6285, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (73, 6305, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (77, 6325, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (81, 6345, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (85, 6365, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (89, 6385, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (93, 6405, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (97, 6425, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (101, 6445, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (105, 6465, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (109, 6485, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (113, 6505, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (117, 6525, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (121, 6545, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (125, 6565, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (129, 6585, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (133, 6605, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (137, 6625, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (141, 6645, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (145, 6665, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (149, 6685, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (153, 6705, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (157, 6725, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (161, 6745, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (165, 6765, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (169, 6785, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (173, 6805, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (177, 6825, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (181, 6845, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (185, 6865, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (189, 6885, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (193, 6905, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (197, 6925, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (201, 6945, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (205, 6965, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (209, 6985, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (213, 7005, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (217, 7025, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (221, 7045, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (225, 7065, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (229, 7085, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (233, 7105, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  // 40 MHz channels
+  { std::make_tuple (3, 5955, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (11, 5995, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (19, 6035, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (27, 6075, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (35, 6115, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (43, 6155, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (51, 6195, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (59, 6235, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (67, 6275, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (75, 6315, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (83, 6355, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (91, 6395, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (99, 6435, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (107, 6475, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (115, 6515, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (123, 6555, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (131, 6595, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (139, 6635, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (147, 6675, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (155, 6715, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (163, 6755, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (171, 6795, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (179, 6835, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (187, 6875, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (195, 6915, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (203, 6955, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (211, 6995, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (219, 7035, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (227, 7075, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  // 80 MHz channels
+  { std::make_tuple (7, 5975, 80, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (23, 6055, 80, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (39, 6135, 80, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (55, 6215, 80, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (71, 6295, 80, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (87, 6375, 80, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (103, 6455, 80, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (119, 6535, 80, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (135, 6615, 80, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (151, 6695, 80, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (167, 6775, 80, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (183, 6855, 80, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (199, 6935, 80, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (215, 7015, 80, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  // 160 MHz channels
+  { std::make_tuple (15, 6015, 160, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (47, 6175, 160, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (79, 6335, 160, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (111, 6495, 160, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (143, 6655, 160, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (175, 6815, 160, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (207, 6975, 160, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) }
+};
+
 WifiPhyOperatingChannel::WifiPhyOperatingChannel ()
-  : m_channelIt (WifiPhy::m_frequencyChannels.end ()),
+  : m_channelIt (m_frequencyChannels.end ()),
     m_primary20Index (0)
 {
   NS_LOG_FUNCTION (this);
@@ -42,20 +279,20 @@
 bool
 WifiPhyOperatingChannel::IsSet (void) const
 {
-  return m_channelIt != WifiPhy::m_frequencyChannels.end ();
+  return m_channelIt != m_frequencyChannels.end ();
 }
 
 void
 WifiPhyOperatingChannel::Set (uint8_t number, uint16_t frequency, uint16_t width,
-                              WifiPhyStandard standard, WifiPhyBand band)
+                              WifiStandard standard, WifiPhyBand band)
 {
   NS_LOG_FUNCTION (this << +number << frequency << width << standard << band);
 
-  auto channelIt = FindFirst (number, frequency, width, standard, band, WifiPhy::m_frequencyChannels.begin ());
+  auto channelIt = FindFirst (number, frequency, width, standard, band);
 
-  if (channelIt != WifiPhy::m_frequencyChannels.end ()
+  if (channelIt != m_frequencyChannels.end ()
       && FindFirst (number, frequency, width, standard, band, std::next (channelIt))
-         == WifiPhy::m_frequencyChannels.end ())
+         == m_frequencyChannels.end ())
     {
       // a unique channel matches the specified criteria
       m_channelIt = channelIt;
@@ -68,18 +305,22 @@
 }
 
 void
-WifiPhyOperatingChannel::SetDefault (uint16_t width, WifiPhyStandard standard, WifiPhyBand band)
+WifiPhyOperatingChannel::SetDefault (uint16_t width, WifiStandard standard, WifiPhyBand band)
 {
   NS_LOG_FUNCTION (this << width << standard << band);
 
-  auto channelIt = FindFirst (0, 0, width, standard, band, WifiPhy::m_frequencyChannels.begin ());
+  Set (GetDefaultChannelNumber (width, standard, band), 0, width, standard, band);
+}
+
+uint8_t
+WifiPhyOperatingChannel::GetDefaultChannelNumber (uint16_t width, WifiStandard standard, WifiPhyBand band)
+{
+  auto channelIt = FindFirst (0, 0, width, standard, band);
 
-  if (channelIt != WifiPhy::m_frequencyChannels.end ())
+  if (channelIt != m_frequencyChannels.end ())
     {
       // a channel matches the specified criteria
-      m_channelIt = channelIt;
-      m_primary20Index = 0;
-      return;
+      return std::get<0> (*channelIt);
     }
 
   // if a default channel was not found, throw an exception (mainly for unit testing this code)
@@ -88,11 +329,9 @@
 
 WifiPhyOperatingChannel::ConstIterator
 WifiPhyOperatingChannel::FindFirst (uint8_t number, uint16_t frequency, uint16_t width,
-                                    WifiPhyStandard standard, WifiPhyBand band,
-                                    ConstIterator start) const
+                                    WifiStandard standard, WifiPhyBand band,
+                                    ConstIterator start)
 {
-  NS_LOG_FUNCTION (this << +number << frequency << width << standard << band);
-
   // lambda used to match channels against the specified criteria
   auto predicate = [&](const FrequencyChannelInfo& channel)
     {
@@ -123,7 +362,7 @@
       return true;
     };
 
-  return std::find_if (start, WifiPhy::m_frequencyChannels.end (), predicate);
+  return std::find_if (start, m_frequencyChannels.end (), predicate);
 }
 
 uint8_t
@@ -193,4 +432,14 @@
   return freq;
 }
 
+uint8_t
+WifiPhyOperatingChannel::GetPrimaryChannelNumber (uint16_t     primaryChannelWidth,
+                                                  WifiStandard standard) const
+{
+  auto frequency = GetPrimaryChannelCenterFrequency (primaryChannelWidth);
+  auto& [chanNumber, centerFreq, channelWidth, channelType, band] = *m_channelIt;
+  auto primaryChanIt = FindFirst (0, frequency, primaryChannelWidth, standard, band);
+  return std::get<0> (*primaryChanIt);
+}
+
 } //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/wifi-phy-operating-channel.h ns-3.36/src/wifi/model/wifi-phy-operating-channel.h
--- ns-3.35/src/wifi/model/wifi-phy-operating-channel.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/wifi-phy-operating-channel.h	2022-04-30 18:23:58.218735200 -0700
@@ -50,6 +50,8 @@
 
   virtual ~WifiPhyOperatingChannel ();
 
+  static const std::set<FrequencyChannelInfo> m_frequencyChannels;  //!< Available frequency channels
+
   /**
    * Return true if a valid channel has been set, false otherwise.
    *
@@ -66,21 +68,32 @@
    * \param number the channel number (use 0 to leave it unspecified)
    * \param frequency the channel center frequency in MHz (use 0 to leave it unspecified)
    * \param width the channel width in MHz (use 0 to leave it unspecified)
-   * \param standard the PHY standard
+   * \param standard the standard
    * \param band the PHY band
    */
   void Set (uint8_t number, uint16_t frequency, uint16_t width,
-            WifiPhyStandard standard, WifiPhyBand band);
+            WifiStandard standard, WifiPhyBand band);
   /**
-   * Set the default channel of the given width and for the given PHY standard and band.
+   * Set the default channel of the given width and for the given standard and band.
    * If the channel width is a multiple of 20 MHz, the primary 20 MHz channel
    * is set to the 20 MHz subchannel with the lowest center frequency.
    *
    * \param width the channel width in MHz
-   * \param standard the PHY standard
+   * \param standard the standard
+   * \param band the PHY band
+   */
+  void SetDefault (uint16_t width, WifiStandard standard, WifiPhyBand band);
+
+  /**
+   * Get the default channel number of the given width and for the given standard
+   * and band.
+   *
+   * \param width the channel width in MHz
+   * \param standard the standard
    * \param band the PHY band
+   * \return the default channel number
    */
-  void SetDefault (uint16_t width, WifiPhyStandard standard, WifiPhyBand band);
+  static uint8_t GetDefaultChannelNumber (uint16_t width, WifiStandard standard, WifiPhyBand band);
 
   /**
    * Return the channel number identifying the whole operating channel.
@@ -125,7 +138,6 @@
    */
   uint16_t GetPrimaryChannelCenterFrequency (uint16_t primaryChannelWidth) const;
 
-private:
   /// Typedef for a const iterator pointing to a channel in the set of available channels
   typedef std::set<FrequencyChannelInfo>::const_iterator ConstIterator;
 
@@ -135,16 +147,26 @@
    * \param number the channel number (use 0 to leave it unspecified)
    * \param frequency the channel center frequency in MHz (use 0 to leave it unspecified)
    * \param width the channel width in MHz (use 0 to leave it unspecified)
-   * \param standard the PHY standard
+   * \param standard the standard
    * \param band the PHY band
    * \param start an iterator pointing to the channel to start the search with
    * \return an iterator pointing to the found channel, if any, or to past-the-end
    *         of the set of available channels
    */
-  ConstIterator FindFirst (uint8_t number, uint16_t frequency, uint16_t width,
-                           WifiPhyStandard standard, WifiPhyBand band,
-                           ConstIterator start) const;
+  static ConstIterator FindFirst (uint8_t number, uint16_t frequency, uint16_t width,
+                                  WifiStandard standard, WifiPhyBand band,
+                                  ConstIterator start = m_frequencyChannels.begin ());
+
+  /**
+   * Get channel number of the primary channel
+   * \param primaryChannelWidth the width of the primary channel (MHz)
+   * \param standard the standard
+   *
+   * \return channel number of the primary channel
+   */
+  uint8_t GetPrimaryChannelNumber (uint16_t primaryChannelWidth, WifiStandard standard) const;
 
+private:
   ConstIterator m_channelIt;   //!< const iterator pointing to the configured frequency channel
   uint8_t m_primary20Index;    /**< index of the primary20 channel (0 indicates the 20 MHz
                                     subchannel with the lowest center frequency) */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/wifi-phy-tag.cc ns-3.36/src/wifi/model/wifi-phy-tag.cc
--- ns-3.35/src/wifi/model/wifi-phy-tag.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/wifi-phy-tag.cc	1969-12-31 16:00:00.000000000 -0800
@@ -1,97 +0,0 @@
-/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2009 CTTC
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Nicola Baldo <nbaldo@cttc.es>
- */
-
-#include "wifi-phy-tag.h"
-
-namespace ns3 {
-
-TypeId
-WifiPhyTag::GetTypeId (void)
-{
-  static TypeId tid = TypeId ("ns3::WifiPhyTag")
-    .SetParent<Tag> ()
-  ;
-  return tid;
-}
-
-TypeId
-WifiPhyTag::GetInstanceTypeId (void) const
-{
-  return GetTypeId ();
-}
-
-uint32_t
-WifiPhyTag::GetSerializedSize (void) const
-{
-  return 3;
-}
-
-void
-WifiPhyTag::Serialize (TagBuffer i) const
-{
-  i.WriteU8 (static_cast<uint8_t> (m_preamble));
-  i.WriteU8 (static_cast<uint8_t> (m_modulation));
-  i.WriteU8 (m_frameComplete);
-}
-
-void
-WifiPhyTag::Deserialize (TagBuffer i)
-{
-  m_preamble = static_cast<WifiPreamble> (i.ReadU8 ());
-  m_modulation = static_cast<WifiModulationClass> (i.ReadU8 ());
-  m_frameComplete = i.ReadU8 ();
-}
-
-void
-WifiPhyTag::Print (std::ostream &os) const
-{
-  os << +m_preamble << " " << +m_modulation << " " << m_frameComplete;
-}
-
-WifiPhyTag::WifiPhyTag ()
-{
-}
-
-WifiPhyTag::WifiPhyTag (WifiPreamble preamble, WifiModulationClass modulation, uint8_t frameComplete)
-  : m_preamble (preamble),
-    m_modulation (modulation),
-    m_frameComplete (frameComplete)
-{
-}
-
-WifiPreamble
-WifiPhyTag::GetPreambleType (void) const
-{
-  return m_preamble;
-}
-
-WifiModulationClass
-WifiPhyTag::GetModulation (void) const
-{
-  return m_modulation;
-}
-
-uint8_t
-WifiPhyTag::GetFrameComplete (void) const
-{
-  return m_frameComplete;
-}
-
-} // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/wifi-phy-tag.h ns-3.36/src/wifi/model/wifi-phy-tag.h
--- ns-3.35/src/wifi/model/wifi-phy-tag.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/wifi-phy-tag.h	1969-12-31 16:00:00.000000000 -0800
@@ -1,88 +0,0 @@
-/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2009 CTTC
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Nicola Baldo <nbaldo@cttc.es>
- */
-
-#ifndef WIFI_PHY_TAG_H
-#define WIFI_PHY_TAG_H
-
-#include "ns3/tag.h"
-#include "wifi-phy-common.h"
-#include "wifi-mode.h"
-
-namespace ns3 {
-
-/**
- * \ingroup wifi
- *
- * Tag for WifiTxVector and WifiPreamble information to be embedded in outgoing
- * transmissions as a PacketTag
- */
-class WifiPhyTag : public Tag
-{
-public:
-  /**
-   * \brief Get the type ID.
-   * \return the object TypeId
-   */
-  static TypeId GetTypeId (void);
-  TypeId GetInstanceTypeId (void) const;
-
-  /**
-   * Constructor
-   */
-  WifiPhyTag ();
-  /**
-   * Constructor
-   * \param preamble the preamble type
-   * \param modulation the modulation
-   * \param frameComplete the frameComplete
-   */
-  WifiPhyTag (WifiPreamble preamble, WifiModulationClass modulation, uint8_t frameComplete);
-  /**
-   * Getter for preamble parameter
-   * \return the preamble type
-   */
-  WifiPreamble GetPreambleType (void) const;
-  /**
-   * Getter for modulation parameter
-   * \return the modulation
-   */
-  WifiModulationClass GetModulation (void) const;
-  /**
-   * Getter for frameComplete parameter
-   * \return the frameComplete parameter, i.e. 0 if the frame is not complete, 1 otherwise.
-   */
-  uint8_t GetFrameComplete (void) const;
-
-  // From class Tag
-  uint32_t GetSerializedSize (void) const;
-  void Serialize (TagBuffer i) const;
-  void Deserialize (TagBuffer i);
-  void Print (std::ostream &os) const;
-
-
-private:
-  WifiPreamble m_preamble;          ///< preamble type
-  WifiModulationClass m_modulation; ///< modulation used for transmission
-  uint8_t m_frameComplete;          ///< Used to indicate that TX stopped sending before the end of the frame
-};
-
-} // namespace ns3
-
-#endif /* WIFI_PHY_TAG_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/wifi-ppdu.h ns-3.36/src/wifi/model/wifi-ppdu.h
--- ns-3.35/src/wifi/model/wifi-ppdu.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/wifi-ppdu.h	2022-04-30 18:23:58.218735200 -0700
@@ -107,7 +107,6 @@
    * Get the channel width over which the PPDU will effectively be
    * transmitted.
    *
-   * \param ppdu the PPDU to send
    * \return the effective channel width (in MHz) used for the tranmsission
    */
   virtual uint16_t GetTransmissionChannelWidth (void) const;
@@ -117,7 +116,6 @@
    * channel. Normally, a PPDU can be received if it is transmitted over a
    * channel that overlaps the primary20 channel of a PHY entity.
    *
-   * \param ppdu the given PPDU
    * \param txCenterFreq the center frequency (MHz) of the channel over which the
    *        PPDU is transmitted
    * \param p20MinFreq the minimum frequency (MHz) of the primary channel
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/wifi-protection-manager.cc ns-3.36/src/wifi/model/wifi-protection-manager.cc
--- ns-3.35/src/wifi/model/wifi-protection-manager.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/wifi-protection-manager.cc	2022-04-30 18:23:58.218735200 -0700
@@ -20,7 +20,7 @@
 
 #include "ns3/log.h"
 #include "wifi-protection-manager.h"
-#include "regular-wifi-mac.h"
+#include "wifi-mac.h"
 
 
 namespace ns3 {
@@ -53,7 +53,7 @@
 }
 
 void
-WifiProtectionManager::SetWifiMac (Ptr<RegularWifiMac> mac)
+WifiProtectionManager::SetWifiMac (Ptr<WifiMac> mac)
 {
   NS_LOG_FUNCTION (this << mac);
   m_mac = mac;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/wifi-protection-manager.h ns-3.36/src/wifi/model/wifi-protection-manager.h
--- ns-3.35/src/wifi/model/wifi-protection-manager.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/wifi-protection-manager.h	2022-04-30 18:23:58.218735200 -0700
@@ -30,7 +30,7 @@
 
 class WifiTxParameters;
 class WifiMacQueueItem;
-class RegularWifiMac;
+class WifiMac;
 
 /**
  * \ingroup wifi
@@ -53,7 +53,7 @@
    *
    * \param mac a pointer to the MAC
    */
-  void SetWifiMac (Ptr<RegularWifiMac> mac);
+  void SetWifiMac (Ptr<WifiMac> mac);
 
   /**
    * Determine the protection method to use if the given MPDU is added to the current
@@ -84,7 +84,7 @@
 protected:
   virtual void DoDispose (void);
 
-  Ptr<RegularWifiMac> m_mac;     //!< MAC which is using this Protection Manager
+  Ptr<WifiMac> m_mac; //!< MAC which is using this Protection Manager
 };
 
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/wifi-remote-station-manager.cc ns-3.36/src/wifi/model/wifi-remote-station-manager.cc
--- ns-3.35/src/wifi/model/wifi-remote-station-manager.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/wifi-remote-station-manager.cc	2022-04-30 18:23:58.218735200 -0700
@@ -231,37 +231,19 @@
 bool
 WifiRemoteStationManager::GetHtSupported (void) const
 {
-  Ptr<WifiNetDevice> device = DynamicCast<WifiNetDevice> (m_wifiPhy->GetDevice ());
-  Ptr<HtConfiguration> htConfiguration = device->GetHtConfiguration ();
-  if (htConfiguration)
-    {
-      return true;
-    }
-  return false;
+  return m_wifiPhy->GetDevice ()->GetHtConfiguration () != nullptr;
 }
 
 bool
 WifiRemoteStationManager::GetVhtSupported (void) const
 {
-  Ptr<WifiNetDevice> device = DynamicCast<WifiNetDevice> (m_wifiPhy->GetDevice ());
-  Ptr<VhtConfiguration> vhtConfiguration = device->GetVhtConfiguration ();
-  if (vhtConfiguration)
-    {
-      return true;
-    }
-  return false;
+  return m_wifiPhy->GetDevice ()->GetVhtConfiguration () != nullptr;
 }
 
 bool
 WifiRemoteStationManager::GetHeSupported (void) const
 {
-  Ptr<WifiNetDevice> device = DynamicCast<WifiNetDevice> (m_wifiPhy->GetDevice ());
-  Ptr<HeConfiguration> heConfiguration = device->GetHeConfiguration ();
-  if (heConfiguration)
-    {
-      return true;
-    }
-  return false;
+  return m_wifiPhy->GetDevice ()->GetHeConfiguration () != nullptr;
 }
 
 bool
@@ -269,8 +251,7 @@
 {
   if (GetHtSupported ())
     {
-      Ptr<WifiNetDevice> device = DynamicCast<WifiNetDevice> (m_wifiPhy->GetDevice ());
-      Ptr<HtConfiguration> htConfiguration = device->GetHtConfiguration ();
+      Ptr<HtConfiguration> htConfiguration = m_wifiPhy->GetDevice ()->GetHtConfiguration ();
       NS_ASSERT (htConfiguration); //If HT is supported, we should have a HT configuration attached
       return htConfiguration->GetLdpcSupported ();
     }
@@ -282,8 +263,7 @@
 {
   if (GetHtSupported ())
     {
-      Ptr<WifiNetDevice> device = DynamicCast<WifiNetDevice> (m_wifiPhy->GetDevice ());
-      Ptr<HtConfiguration> htConfiguration = device->GetHtConfiguration ();
+      Ptr<HtConfiguration> htConfiguration = m_wifiPhy->GetDevice ()->GetHtConfiguration ();
       NS_ASSERT (htConfiguration); //If HT is supported, we should have a HT configuration attached
       if (htConfiguration->GetShortGuardIntervalSupported ())
         {
@@ -299,8 +279,7 @@
   uint16_t gi = 0;
   if (GetHeSupported ())
     {
-      Ptr<WifiNetDevice> device = DynamicCast<WifiNetDevice> (m_wifiPhy->GetDevice ());
-      Ptr<HeConfiguration> heConfiguration = device->GetHeConfiguration ();
+      Ptr<HeConfiguration> heConfiguration = m_wifiPhy->GetDevice ()->GetHeConfiguration ();
       NS_ASSERT (heConfiguration); //If HE is supported, we should have a HE configuration attached
       gi = static_cast<uint16_t>(heConfiguration->GetGuardInterval ().GetNanoSeconds ());
     }
@@ -544,7 +523,7 @@
       v.SetPreambleType (GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled ()));
       v.SetTxPowerLevel (m_defaultTxPowerLevel);
       v.SetChannelWidth (GetChannelWidthForTransmission (mode, m_wifiPhy->GetChannelWidth ()));
-      v.SetGuardInterval (ConvertGuardIntervalToNanoSeconds (mode, DynamicCast<WifiNetDevice> (m_wifiPhy->GetDevice ())));
+      v.SetGuardInterval (ConvertGuardIntervalToNanoSeconds (mode, m_wifiPhy->GetDevice ()));
       v.SetNTx (GetNumberOfAntennas ());
       v.SetNss (1);
       v.SetNess (0);
@@ -567,15 +546,14 @@
       txVector.SetPreambleType (GetPreambleForTransmission (mgtMode.GetModulationClass (), GetShortPreambleEnabled ()));
       txVector.SetTxPowerLevel (m_defaultTxPowerLevel);
       txVector.SetChannelWidth (GetChannelWidthForTransmission (mgtMode, m_wifiPhy->GetChannelWidth ()));
-      txVector.SetGuardInterval (ConvertGuardIntervalToNanoSeconds (mgtMode, DynamicCast<WifiNetDevice> (m_wifiPhy->GetDevice ())));
+      txVector.SetGuardInterval (ConvertGuardIntervalToNanoSeconds (mgtMode, m_wifiPhy->GetDevice ()));
     }
   else
     {
       txVector = DoGetDataTxVector (Lookup (address));
       txVector.SetLdpc (txVector.GetMode ().GetModulationClass () < WIFI_MOD_CLASS_HT ? 0 : UseLdpcForDestination (address));
     }
-  Ptr<WifiNetDevice> device = DynamicCast<WifiNetDevice> (m_wifiPhy->GetDevice ());
-  Ptr<HeConfiguration> heConfiguration = device->GetHeConfiguration ();
+  Ptr<HeConfiguration> heConfiguration = m_wifiPhy->GetDevice ()->GetHeConfiguration ();
   if (heConfiguration)
     {
       txVector.SetBssColor (heConfiguration->GetBssColor ());
@@ -608,7 +586,7 @@
   return WifiTxVector (defaultMode,
                        GetDefaultTxPowerLevel (),
                        defaultPreamble,
-                       ConvertGuardIntervalToNanoSeconds (defaultMode, DynamicCast<WifiNetDevice> (m_wifiPhy->GetDevice ())),
+                       ConvertGuardIntervalToNanoSeconds (defaultMode, m_wifiPhy->GetDevice ()),
                        GetNumberOfAntennas (),
                        1,
                        0,
@@ -628,7 +606,7 @@
         v.SetPreambleType (GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled ()));
         v.SetTxPowerLevel (m_defaultTxPowerLevel);
         v.SetChannelWidth (GetChannelWidthForTransmission (mode, m_wifiPhy->GetChannelWidth ()));
-        v.SetGuardInterval (ConvertGuardIntervalToNanoSeconds (mode, DynamicCast<WifiNetDevice> (m_wifiPhy->GetDevice ())));
+        v.SetGuardInterval (ConvertGuardIntervalToNanoSeconds (mode, m_wifiPhy->GetDevice ()));
         v.SetNTx (GetNumberOfAntennas ());
         v.SetNss (1);
         v.SetNess (0);
@@ -647,7 +625,7 @@
   v.SetPreambleType (GetPreambleForTransmission (ctsMode.GetModulationClass (), GetShortPreambleEnabled ()));
   v.SetTxPowerLevel (GetDefaultTxPowerLevel ());
   v.SetChannelWidth (GetChannelWidthForTransmission (ctsMode, m_wifiPhy->GetChannelWidth ()));
-  uint16_t ctsTxGuardInterval = ConvertGuardIntervalToNanoSeconds (ctsMode, DynamicCast<WifiNetDevice> (m_wifiPhy->GetDevice ()));
+  uint16_t ctsTxGuardInterval = ConvertGuardIntervalToNanoSeconds (ctsMode, m_wifiPhy->GetDevice ());
   v.SetGuardInterval (ctsTxGuardInterval);
   v.SetNss (1);
   return v;
@@ -663,7 +641,7 @@
   v.SetPreambleType (GetPreambleForTransmission (ackMode.GetModulationClass (), GetShortPreambleEnabled ()));
   v.SetTxPowerLevel (GetDefaultTxPowerLevel ());
   v.SetChannelWidth (GetChannelWidthForTransmission (ackMode, m_wifiPhy->GetChannelWidth ()));
-  uint16_t ackTxGuardInterval = ConvertGuardIntervalToNanoSeconds (ackMode, DynamicCast<WifiNetDevice> (m_wifiPhy->GetDevice ()));
+  uint16_t ackTxGuardInterval = ConvertGuardIntervalToNanoSeconds (ackMode, m_wifiPhy->GetDevice ());
   v.SetGuardInterval (ackTxGuardInterval);
   v.SetNss (1);
   return v;
@@ -679,7 +657,7 @@
   v.SetPreambleType (GetPreambleForTransmission (blockAckMode.GetModulationClass (), GetShortPreambleEnabled ()));
   v.SetTxPowerLevel (GetDefaultTxPowerLevel ());
   v.SetChannelWidth (GetChannelWidthForTransmission (blockAckMode, m_wifiPhy->GetChannelWidth ()));
-  uint16_t blockAckTxGuardInterval = ConvertGuardIntervalToNanoSeconds (blockAckMode, DynamicCast<WifiNetDevice> (m_wifiPhy->GetDevice ()));
+  uint16_t blockAckTxGuardInterval = ConvertGuardIntervalToNanoSeconds (blockAckMode, m_wifiPhy->GetDevice ());
   v.SetGuardInterval (blockAckTxGuardInterval);
   v.SetNss (1);
   return v;
@@ -1387,16 +1365,13 @@
           state->m_channelWidth = 20;
         }
     }
-  if (heCapabilities.GetHeLtfAndGiForHePpdus () >= 2)
+  if (heCapabilities.GetHeSuPpdu1xHeLtf800nsGi () == 1)
     {
       state->m_guardInterval = 800;
     }
-  else if (heCapabilities.GetHeLtfAndGiForHePpdus () == 1)
-    {
-      state->m_guardInterval = 1600;
-    }
   else
     {
+      //todo: Using 3200ns, default value for HeConfiguration::GuardInterval
       state->m_guardInterval = 3200;
     }
   for (uint8_t i = 1; i <= m_wifiPhy->GetMaxSupportedTxSpatialStreams (); i++)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/wifi-spectrum-phy-interface.cc ns-3.36/src/wifi/model/wifi-spectrum-phy-interface.cc
--- ns-3.35/src/wifi/model/wifi-spectrum-phy-interface.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/wifi-spectrum-phy-interface.cc	2022-04-30 18:23:58.218735200 -0700
@@ -96,11 +96,11 @@
   return m_spectrumWifiPhy->GetRxSpectrumModel ();
 }
 
-Ptr<AntennaModel>
-WifiSpectrumPhyInterface::GetRxAntenna (void) const
+Ptr<Object>
+WifiSpectrumPhyInterface::GetAntenna (void) const
 {
   NS_LOG_FUNCTION (this);
-  return m_spectrumWifiPhy->GetRxAntenna ();
+  return m_spectrumWifiPhy->GetAntenna ();
 }
 
 void
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/wifi-spectrum-phy-interface.h ns-3.36/src/wifi/model/wifi-spectrum-phy-interface.h
--- ns-3.35/src/wifi/model/wifi-spectrum-phy-interface.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/wifi-spectrum-phy-interface.h	2022-04-30 18:23:58.218735200 -0700
@@ -59,7 +59,7 @@
   Ptr<MobilityModel> GetMobility () const override;
   void SetChannel (const Ptr<SpectrumChannel> c) override;
   Ptr<const SpectrumModel> GetRxSpectrumModel () const override;
-  Ptr<AntennaModel> GetRxAntenna () const override;
+  Ptr<Object> GetAntenna () const override;
   void StartRx (Ptr<SpectrumSignalParameters> params) override;
 
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/wifi-spectrum-signal-parameters.cc ns-3.36/src/wifi/model/wifi-spectrum-signal-parameters.cc
--- ns-3.35/src/wifi/model/wifi-spectrum-signal-parameters.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/wifi-spectrum-signal-parameters.cc	2022-04-30 18:23:58.218735200 -0700
@@ -28,6 +28,7 @@
 NS_LOG_COMPONENT_DEFINE ("WifiSpectrumSignalParameters");
 
 WifiSpectrumSignalParameters::WifiSpectrumSignalParameters ()
+  : txCenterFreq (0)
 {
   NS_LOG_FUNCTION (this);
 }
@@ -37,6 +38,7 @@
 {
   NS_LOG_FUNCTION (this << &p);
   ppdu = p.ppdu;
+  txCenterFreq = p.txCenterFreq;
 }
 
 Ptr<SpectrumSignalParameters>
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/wifi-spectrum-signal-parameters.h ns-3.36/src/wifi/model/wifi-spectrum-signal-parameters.h
--- ns-3.35/src/wifi/model/wifi-spectrum-signal-parameters.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/wifi-spectrum-signal-parameters.h	2022-04-30 18:23:58.218735200 -0700
@@ -51,6 +51,7 @@
   WifiSpectrumSignalParameters (const WifiSpectrumSignalParameters& p);
 
   Ptr<WifiPpdu> ppdu;                  ///< The PPDU being transmitted
+  uint16_t txCenterFreq;               ///< the center frequency of the transmitted signal in MHz
 };
 
 }  // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/wifi-standards.h ns-3.36/src/wifi/model/wifi-standards.h
--- ns-3.35/src/wifi/model/wifi-standards.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/wifi-standards.h	2022-04-30 18:23:58.218735200 -0700
@@ -22,6 +22,7 @@
 #define WIFI_STANDARD_H
 
 #include <map>
+#include <list>
 #include "wifi-phy-band.h"
 #include "ns3/abort.h"
 
@@ -29,111 +30,18 @@
 
 /**
  * \ingroup wifi
- * Identifies the PHY specification that a Wifi device is configured to use.
- */
-enum WifiPhyStandard
-{
-  /** OFDM PHY (Clause 17) */
-  WIFI_PHY_STANDARD_80211a,
-  /** DSSS PHY (Clause 15) and HR/DSSS PHY (Clause 18) */
-  WIFI_PHY_STANDARD_80211b,
-  /** ERP-OFDM PHY (Clause 19, Section 19.5) */
-  WIFI_PHY_STANDARD_80211g,
-  /** OFDM PHY (Clause 17 - amendment for 10 MHz and 5 MHz channels) */
-  WIFI_PHY_STANDARD_80211p,
-  /** HT PHY  (clause 20) */
-  WIFI_PHY_STANDARD_80211n,
-  /** VHT PHY (clause 22) */
-  WIFI_PHY_STANDARD_80211ac,
-  /** HE PHY (clause 26) */
-  WIFI_PHY_STANDARD_80211ax,
-  /** Unspecified */
-  WIFI_PHY_STANDARD_UNSPECIFIED
-};
-
-/**
-* \brief Stream insertion operator.
-*
-* \param os the stream
-* \param standard the PHY standard
-* \returns a reference to the stream
-*/
-inline std::ostream& operator<< (std::ostream& os, WifiPhyStandard standard)
-{
-  switch (standard)
-    {
-    case WIFI_PHY_STANDARD_80211a:
-      return (os << "802.11a");
-    case WIFI_PHY_STANDARD_80211b:
-      return (os << "802.11b");
-    case WIFI_PHY_STANDARD_80211g:
-      return (os << "802.11g");
-    case WIFI_PHY_STANDARD_80211p:
-      return (os << "802.11p");
-    case WIFI_PHY_STANDARD_80211n:
-      return (os << "802.11n");
-    case WIFI_PHY_STANDARD_80211ac:
-      return (os << "802.11ac");
-    case WIFI_PHY_STANDARD_80211ax:
-      return (os << "802.11ax");
-    case WIFI_PHY_STANDARD_UNSPECIFIED:
-    default:
-      return (os << "UNSPECIFIED");
-    }
-}
-
-/**
- * \ingroup wifi
- * Identifies the MAC specification that a Wifi device is configured to use.
- */
-enum WifiMacStandard
-{
-  WIFI_MAC_STANDARD_80211,
-  WIFI_MAC_STANDARD_80211n,
-  WIFI_MAC_STANDARD_80211ac,
-  WIFI_MAC_STANDARD_80211ax
-};
-
-/**
-* \brief Stream insertion operator.
-*
-* \param os the stream
-* \param standard the MAC standard
-* \returns a reference to the stream
-*/
-inline std::ostream& operator<< (std::ostream& os, WifiMacStandard standard)
-{
-  switch (standard)
-    {
-    case WIFI_MAC_STANDARD_80211:
-      return (os << "802.11");
-    case WIFI_MAC_STANDARD_80211n:
-      return (os << "802.11n");
-    case WIFI_MAC_STANDARD_80211ac:
-      return (os << "802.11ac");
-    case WIFI_MAC_STANDARD_80211ax:
-      return (os << "802.11ax");
-    default:
-      return (os << "UNSPECIFIED");
-    }
-}
-
-/**
- * \ingroup wifi
- * Identifies the allowed configurations that a Wifi device is configured to use.
+ * Identifies the IEEE 802.11 specifications that a Wifi device can be configured to use.
  */
 enum WifiStandard
 {
+  WIFI_STANDARD_UNSPECIFIED,
   WIFI_STANDARD_80211a,
   WIFI_STANDARD_80211b,
   WIFI_STANDARD_80211g,
   WIFI_STANDARD_80211p,
-  WIFI_STANDARD_80211n_2_4GHZ,
-  WIFI_STANDARD_80211n_5GHZ,
+  WIFI_STANDARD_80211n,
   WIFI_STANDARD_80211ac,
-  WIFI_STANDARD_80211ax_2_4GHZ,
-  WIFI_STANDARD_80211ax_5GHZ,
-  WIFI_STANDARD_80211ax_6GHZ
+  WIFI_STANDARD_80211ax
 };
 
 /**
@@ -155,48 +63,30 @@
       return (os << "802.11g");
     case WIFI_STANDARD_80211p:
       return (os << "802.11p");
-    case WIFI_STANDARD_80211n_2_4GHZ:
-      return (os << "802.11n-2.4GHz");
-    case WIFI_STANDARD_80211n_5GHZ:
-      return (os << "802.11n-5GHz");
+    case WIFI_STANDARD_80211n:
+      return (os << "802.11n");
     case WIFI_STANDARD_80211ac:
       return (os << "802.11ac");
-    case WIFI_STANDARD_80211ax_2_4GHZ:
-      return (os << "802.11ax-2.4GHz");
-    case WIFI_STANDARD_80211ax_5GHZ:
-      return (os << "802.11ax-5GHz");
-    case WIFI_STANDARD_80211ax_6GHZ:
-      return (os << "802.11ax-6GHz");
+    case WIFI_STANDARD_80211ax:
+      return (os << "802.11ax");
     default:
       return (os << "UNSPECIFIED");
     }
 }
 
-/**
- * \brief hold PHY and MAC information based on the selected standard.
- */
-struct WifiStandardInfo
-{
-  WifiPhyStandard phyStandard; //!< the PHY standard
-  WifiPhyBand phyBand;         //!< the PHY band
-  WifiMacStandard macStandard; //!< the MAC standard
-};
 
 /**
- * \brief map a given standard configured by the user to the corresponding WifiStandardInfo
+ * \brief map a given standard configured by the user to the allowed PHY bands
  */
-const std::map<WifiStandard, WifiStandardInfo> wifiStandards =
+const std::map<WifiStandard, std::list<WifiPhyBand>> wifiStandards =
 {
-  { WIFI_STANDARD_80211a, { WIFI_PHY_STANDARD_80211a, WIFI_PHY_BAND_5GHZ, WIFI_MAC_STANDARD_80211 } },
-  { WIFI_STANDARD_80211b, { WIFI_PHY_STANDARD_80211b, WIFI_PHY_BAND_2_4GHZ, WIFI_MAC_STANDARD_80211 } },
-  { WIFI_STANDARD_80211g, { WIFI_PHY_STANDARD_80211g, WIFI_PHY_BAND_2_4GHZ, WIFI_MAC_STANDARD_80211 } },
-  { WIFI_STANDARD_80211p, { WIFI_PHY_STANDARD_80211p, WIFI_PHY_BAND_5GHZ, WIFI_MAC_STANDARD_80211 } },
-  { WIFI_STANDARD_80211n_2_4GHZ, { WIFI_PHY_STANDARD_80211n, WIFI_PHY_BAND_2_4GHZ, WIFI_MAC_STANDARD_80211n } },
-  { WIFI_STANDARD_80211n_5GHZ, { WIFI_PHY_STANDARD_80211n, WIFI_PHY_BAND_5GHZ, WIFI_MAC_STANDARD_80211n } },
-  { WIFI_STANDARD_80211ac, { WIFI_PHY_STANDARD_80211ac, WIFI_PHY_BAND_5GHZ, WIFI_MAC_STANDARD_80211ac } },
-  { WIFI_STANDARD_80211ax_2_4GHZ, { WIFI_PHY_STANDARD_80211ax, WIFI_PHY_BAND_2_4GHZ, WIFI_MAC_STANDARD_80211ax } },
-  { WIFI_STANDARD_80211ax_5GHZ, { WIFI_PHY_STANDARD_80211ax, WIFI_PHY_BAND_5GHZ, WIFI_MAC_STANDARD_80211ax } },
-  { WIFI_STANDARD_80211ax_6GHZ, { WIFI_PHY_STANDARD_80211ax, WIFI_PHY_BAND_6GHZ, WIFI_MAC_STANDARD_80211ax } }
+  { WIFI_STANDARD_80211a, { WIFI_PHY_BAND_5GHZ } },
+  { WIFI_STANDARD_80211b, { WIFI_PHY_BAND_2_4GHZ } },
+  { WIFI_STANDARD_80211g, { WIFI_PHY_BAND_2_4GHZ } },
+  { WIFI_STANDARD_80211p, { WIFI_PHY_BAND_5GHZ } },
+  { WIFI_STANDARD_80211n, { WIFI_PHY_BAND_2_4GHZ, WIFI_PHY_BAND_5GHZ } },
+  { WIFI_STANDARD_80211ac, { WIFI_PHY_BAND_5GHZ } },
+  { WIFI_STANDARD_80211ax, { WIFI_PHY_BAND_2_4GHZ, WIFI_PHY_BAND_5GHZ, WIFI_PHY_BAND_6GHZ } }
 };
 
 /**
@@ -211,18 +101,18 @@
 };
 
 /**
- * Get the type of the frequency channel for the given PHY standard
+ * Get the type of the frequency channel for the given standard
  *
- * \param standard the PHY standard
- * \return the type of the frequency channel for the given PHY standard
+ * \param standard the standard
+ * \return the type of the frequency channel for the given standard
  */
-inline FrequencyChannelType GetFrequencyChannelType (WifiPhyStandard standard)
+inline FrequencyChannelType GetFrequencyChannelType (WifiStandard standard)
 {
   switch (standard)
     {
-      case WIFI_PHY_STANDARD_80211b:
+      case WIFI_STANDARD_80211b:
         return WIFI_PHY_DSSS_CHANNEL;
-      case WIFI_PHY_STANDARD_80211p:
+      case WIFI_STANDARD_80211p:
         return WIFI_PHY_80211p_CHANNEL;
       default:
         return WIFI_PHY_OFDM_CHANNEL;
@@ -230,26 +120,26 @@
 }
 
 /**
- * Get the maximum channel width in MHz allowed for the given PHY standard.
+ * Get the maximum channel width in MHz allowed for the given standard.
  *
- * \param standard the PHY standard
- * \return the maximum channel width in MHz allowed for the given PHY standard
+ * \param standard the standard
+ * \return the maximum channel width in MHz allowed for the given standard
  */
-inline uint16_t GetMaximumChannelWidth (WifiPhyStandard standard)
+inline uint16_t GetMaximumChannelWidth (WifiStandard standard)
 {
   switch (standard)
     {
-      case WIFI_PHY_STANDARD_80211b:
+      case WIFI_STANDARD_80211b:
         return 22;
-      case WIFI_PHY_STANDARD_80211p:
+      case WIFI_STANDARD_80211p:
         return 10;
-      case WIFI_PHY_STANDARD_80211a:
-      case WIFI_PHY_STANDARD_80211g:
+      case WIFI_STANDARD_80211a:
+      case WIFI_STANDARD_80211g:
         return 20;
-      case WIFI_PHY_STANDARD_80211n:
+      case WIFI_STANDARD_80211n:
         return 40;
-      case WIFI_PHY_STANDARD_80211ac:
-      case WIFI_PHY_STANDARD_80211ax:
+      case WIFI_STANDARD_80211ac:
+      case WIFI_STANDARD_80211ax:
         return 160;
       default:
         NS_ABORT_MSG ("Unknown standard: " << standard);
@@ -260,27 +150,47 @@
 /**
  * Get the default channel width for the given PHY standard and band.
  *
- * \param standard the given PHY standard
+ * \param standard the given standard
  * \param band the given PHY band
- * \return the default channel width (MHz) for the given PHY standard
+ * \return the default channel width (MHz) for the given standard
  */
-inline uint16_t GetDefaultChannelWidth (WifiPhyStandard standard, WifiPhyBand band)
+inline uint16_t GetDefaultChannelWidth (WifiStandard standard, WifiPhyBand band)
 {
   switch (standard)
     {
-    case WIFI_PHY_STANDARD_80211b:
+    case WIFI_STANDARD_80211b:
       return 22;
-    case WIFI_PHY_STANDARD_80211p:
+    case WIFI_STANDARD_80211p:
       return 10;
-    case WIFI_PHY_STANDARD_80211ac:
+    case WIFI_STANDARD_80211ac:
       return 80;
-    case WIFI_PHY_STANDARD_80211ax:
+    case WIFI_STANDARD_80211ax:
       return (band == WIFI_PHY_BAND_2_4GHZ ? 20 : 80);
     default:
       return 20;
     }
 }
 
+/**
+ * Get the default PHY band for the given standard.
+ *
+ * \param standard the given standard
+ * \return the default PHY band for the given standard
+ */
+inline WifiPhyBand GetDefaultPhyBand (WifiStandard standard)
+{
+  switch (standard)
+    {
+    case WIFI_STANDARD_80211p:
+    case WIFI_STANDARD_80211a:
+    case WIFI_STANDARD_80211ac:
+    case WIFI_STANDARD_80211ax:
+      return WIFI_PHY_BAND_5GHZ;
+    default:
+      return WIFI_PHY_BAND_2_4GHZ;
+    }
+}
+
 } //namespace ns3
 
 #endif /* WIFI_STANDARD_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/wifi-tx-timer.cc ns-3.36/src/wifi/model/wifi-tx-timer.cc
--- ns-3.35/src/wifi/model/wifi-tx-timer.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/wifi-tx-timer.cc	2022-04-30 18:23:58.218735200 -0700
@@ -30,15 +30,17 @@
 NS_LOG_COMPONENT_DEFINE ("WifiTxTimer");
 
 WifiTxTimer::WifiTxTimer ()
-  : m_reason (NOT_RUNNING),
-    m_rescheduled (false)
+  : m_timeoutEvent (),
+    m_reason (NOT_RUNNING),
+    m_impl (nullptr),
+    m_end (Seconds (0))
 {
 }
 
 WifiTxTimer::~WifiTxTimer ()
 {
   m_timeoutEvent.Cancel ();
-  m_endRxEvent = 0;
+  m_impl = 0;
 }
 
 void
@@ -46,13 +48,38 @@
 {
   NS_LOG_FUNCTION (this << delay);
 
-  if (m_timeoutEvent.IsRunning () && !m_rescheduled)
+  if (m_timeoutEvent.IsRunning ())
     {
       NS_LOG_DEBUG ("Rescheduling " << GetReasonString (m_reason) << " timeout in "
                     << delay.As (Time::US));
-      m_timeoutEvent.Cancel ();
-      m_timeoutEvent = Simulator::Schedule (delay, m_endRxEvent);
-      m_rescheduled = true;
+      Time end = Simulator::Now () + delay;
+      // If timer expiration is postponed, we have to do nothing but updating
+      // the timer expiration, because Expire() will reschedule itself to be
+      // executed at the correct time. If timer expiration is moved up, we
+      // have to reschedule Expire() (which would be executed too late otherwise)
+      if (end < m_end)
+        {
+          // timer expiration is moved up
+          m_timeoutEvent.Cancel ();
+          m_timeoutEvent = Simulator::Schedule (delay, &WifiTxTimer::Expire, this);
+        }
+      m_end = end;
+    }
+}
+
+void
+WifiTxTimer::Expire (void)
+{
+  NS_LOG_FUNCTION (this);
+  Time now = Simulator::Now ();
+
+  if (m_end == now)
+    {
+      m_impl->Invoke ();
+    }
+  else
+    {
+      m_timeoutEvent = Simulator::Schedule (m_end - now, &WifiTxTimer::Expire, this);
     }
 }
 
@@ -101,7 +128,7 @@
 {
   NS_LOG_FUNCTION (this << GetReasonString (m_reason));
   m_timeoutEvent.Cancel ();
-  m_endRxEvent = 0;
+  m_impl = 0;
 }
 
 Time
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/wifi-tx-timer.h ns-3.36/src/wifi/model/wifi-tx-timer.h
--- ns-3.35/src/wifi/model/wifi-tx-timer.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/wifi-tx-timer.h	2022-04-30 18:23:58.218735200 -0700
@@ -41,7 +41,7 @@
  * \ingroup wifi
  *
  * This class is used to handle the timer that a station starts when transmitting
- * a frame that solicits a response. The timeout can be rescheduled (only once)
+ * a frame that solicits a response. The timeout can be rescheduled (multiple times)
  * when the RXSTART.indication is received from the PHY.
  */
 class WifiTxTimer
@@ -88,8 +88,7 @@
 
   /**
    * Reschedule the timer to time out the given amount of time from the moment
-   * this function is called. Note that the timer must be running and must not
-   * have been already rescheduled.
+   * this function is called. Note that nothing is done if the timer is not running.
    *
    * \param delay the time to the expiration of the timer
    */
@@ -186,6 +185,11 @@
   void Timeout (MEM mem_ptr, OBJ obj, Args... args);
 
   /**
+   * Internal callback invoked when the timer expires.
+   */
+  void Expire (void);
+
+  /**
    * This method is called when the timer expires to feed the MPDU response
    * timeout callback.
    *
@@ -216,8 +220,9 @@
 
   EventId m_timeoutEvent;         //!< the timeout event after a missing response
   Reason m_reason;                //!< the reason why the timer was started
-  Ptr<EventImpl> m_endRxEvent;       //!< event to schedule upon RXSTART.indication
-  bool m_rescheduled;             //!< whether the timer has been already rescheduled
+  Ptr<EventImpl> m_impl;          /**< the timer implementation, which contains the bound
+                                       callback function and arguments */
+  Time m_end;                     //!< the absolute time when the timer will expire
 
   /// the MPDU response timeout callback
   mutable MpduResponseTimeout m_mpduResponseTimeoutCallback;
@@ -242,13 +247,13 @@
 {
   typedef void (WifiTxTimer::*TimeoutType)(MEM, OBJ, Args...);
 
-  m_timeoutEvent = Simulator::Schedule<TimeoutType> (delay, &WifiTxTimer::Timeout, this, mem_ptr, obj, args...);
+  m_timeoutEvent = Simulator::Schedule (delay, &WifiTxTimer::Expire, this);
   m_reason = reason;
-  m_rescheduled = false;
+  m_end = Simulator::Now () + delay;
 
-  // create an event to schedule if the PHY notifies the reception of a response
-  m_endRxEvent = Ptr<EventImpl> (MakeEvent<TimeoutType> (&WifiTxTimer::Timeout, this, mem_ptr, obj,
-                                                      std::forward<Args> (args)... ), false);
+  // create an event to invoke when the timer expires
+  m_impl = Ptr<EventImpl> (MakeEvent<TimeoutType> (&WifiTxTimer::Timeout, this, mem_ptr, obj,
+                                                   std::forward<Args> (args)... ), false);
 }
 
 template<typename MEM, typename OBJ, typename... Args>
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/wifi-tx-vector.cc ns-3.36/src/wifi/model/wifi-tx-vector.cc
--- ns-3.35/src/wifi/model/wifi-tx-vector.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/wifi-tx-vector.cc	2022-04-30 18:23:58.218735200 -0700
@@ -542,4 +542,18 @@
   return os;
 }
 
+bool
+HeMuUserInfo::operator== (const HeMuUserInfo& other) const
+{
+  return ru == other.ru
+         && mcs.GetMcsValue () == other.mcs.GetMcsValue ()
+         && nss == other.nss;
+}
+
+bool
+HeMuUserInfo::operator!= (const HeMuUserInfo& other) const
+{
+  return !(*this == other);
+}
+
 } //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/wifi-tx-vector.h ns-3.36/src/wifi/model/wifi-tx-vector.h
--- ns-3.35/src/wifi/model/wifi-tx-vector.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/wifi-tx-vector.h	2022-04-30 18:23:58.218735200 -0700
@@ -35,6 +35,21 @@
   HeRu::RuSpec ru; ///< RU specification
   WifiMode mcs;    ///< MCS
   uint8_t nss;     ///< number of spatial streams
+
+  /**
+    * Compare this user info to the given user info.
+    *
+    * \param other the given user info
+    * \return true if this user info compares equal to the given user info, false otherwise
+    */
+  bool operator== (const HeMuUserInfo& other) const;
+  /**
+    * Compare this user info to the given user info.
+    *
+    * \param other the given user info
+    * \return true if this user info differs from the given user info, false otherwise
+    */
+  bool operator!= (const HeMuUserInfo& other) const;
 };
 
 /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/yans-error-rate-model.cc ns-3.36/src/wifi/model/yans-error-rate-model.cc
--- ns-3.35/src/wifi/model/yans-error-rate-model.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/yans-error-rate-model.cc	2022-04-30 18:23:58.218735200 -0700
@@ -19,10 +19,11 @@
  *          SÃ©bastien Deronne <sebastien.deronne@gmail.com>
  */
 
+#include <cmath>
 #include "ns3/log.h"
 #include "yans-error-rate-model.h"
 #include "wifi-utils.h"
-#include "wifi-phy.h"
+#include "wifi-tx-vector.h"
 
 namespace ns3 {
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/yans-wifi-channel.cc ns-3.36/src/wifi/model/yans-wifi-channel.cc
--- ns-3.35/src/wifi/model/yans-wifi-channel.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/yans-wifi-channel.cc	2022-04-30 18:23:58.218735200 -0700
@@ -21,7 +21,7 @@
 #include "ns3/simulator.h"
 #include "ns3/log.h"
 #include "ns3/pointer.h"
-#include "ns3/net-device.h"
+#include "ns3/wifi-net-device.h"
 #include "ns3/node.h"
 #include "ns3/propagation-loss-model.h"
 #include "ns3/propagation-delay-model.h"
@@ -147,7 +147,7 @@
 Ptr<NetDevice>
 YansWifiChannel::GetDevice (std::size_t i) const
 {
-  return m_phyList[i]->GetDevice ()->GetObject<NetDevice> ();
+  return m_phyList[i]->GetDevice ();
 }
 
 void
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/model/yans-wifi-phy.h ns-3.36/src/wifi/model/yans-wifi-phy.h
--- ns-3.35/src/wifi/model/yans-wifi-phy.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/model/yans-wifi-phy.h	2022-04-30 18:23:58.218735200 -0700
@@ -35,9 +35,9 @@
  *
  * This PHY implements a model of 802.11a. The model
  * implemented here is based on the model described
- * in "Yet Another Network Simulator",
- * (http://cutebugs.net/files/wns2-yans.pdf).
- *
+ * in "Yet Another Network Simulator" published in WNS2 2006;
+ * an author-prepared version of this paper is at:
+ * https://hal.inria.fr/file/index/docid/78318/filename/yans-rr.pdf
  *
  * This PHY model depends on a channel loss and delay
  * model as provided by the ns3::PropagationLossModel
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/test/block-ack-test-suite.cc ns-3.36/src/wifi/test/block-ack-test-suite.cc
--- ns-3.35/src/wifi/test/block-ack-test-suite.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/test/block-ack-test-suite.cc	2022-04-30 18:23:58.218735200 -0700
@@ -19,6 +19,8 @@
  */
 
 #include "ns3/test.h"
+#include "ns3/double.h"
+#include "ns3/boolean.h"
 #include "ns3/string.h"
 #include "ns3/qos-utils.h"
 #include "ns3/ctrl-headers.h"
@@ -35,6 +37,9 @@
 #include "ns3/pointer.h"
 #include "ns3/recipient-block-ack-agreement.h"
 #include "ns3/mac-rx-middle.h"
+#include "ns3/qos-txop.h"
+#include "ns3/originator-block-ack-agreement.h"
+#include "ns3/wifi-mac-queue-item.h"
 #include <list>
 
 using namespace ns3;
@@ -1495,7 +1500,7 @@
   phy.SetChannel (channel.Create ());
 
   WifiHelper wifi;
-  wifi.SetStandard (WIFI_STANDARD_80211n_5GHZ);
+  wifi.SetStandard (WIFI_STANDARD_80211n);
   Config::SetDefault ("ns3::WifiDefaultAckManager::BaThreshold", DoubleValue (0.125));
   wifi.SetRemoteStationManager ("ns3::IdealWifiManager");
 
@@ -1546,9 +1551,7 @@
       ptr.Get<QosTxop> ()->TraceConnectWithoutContext ("TxopTrace", MakeCallback (&TxopDurationTracer::Trace, &txopTracer));
 
       // set the TXOP limit on BE AC
-      Ptr<RegularWifiMac> ap_mac = DynamicCast<RegularWifiMac> (ap_device->GetMac ());
-      NS_ASSERT (ap_mac);
-      ap_mac->GetAttribute ("BE_Txop", ptr);
+      ap_device->GetMac ()->GetAttribute ("BE_Txop", ptr);
       ptr.Get<QosTxop> ()->SetTxopLimit (MicroSeconds (4800));
     }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/test/channel-access-manager-test.cc ns-3.36/src/wifi/test/channel-access-manager-test.cc
--- ns-3.35/src/wifi/test/channel-access-manager-test.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/test/channel-access-manager-test.cc	2022-04-30 18:23:58.218735200 -0700
@@ -64,8 +64,6 @@
   void NotifyChannelAccessed (Time txopDuration = Seconds (0)) override;
   /// \copydoc ns3::Txop::HasFramesToTransmit
   bool HasFramesToTransmit (void) override;
-  /// \copydoc ns3::Txop::NotifyChannelSwitching
-  void NotifyChannelSwitching (void) override;
   /// \copydoc ns3::Txop::NotifySleep
   void NotifySleep (void) override;
   /// \copydoc ns3::Txop::NotifyWakeUp
@@ -193,6 +191,11 @@
   {
     m_test->NotifyInternalCollision (DynamicCast<TxopTest<TxopType>> (txop));
   }
+  /// \copydoc ns3::FrameExchangeManager::NotifySwitchingStartNow
+  void NotifySwitchingStartNow (Time duration) override
+  {
+    m_test->NotifyChannelSwitching ();
+  }
 
 private:
   ChannelAccessManagerTest<TxopType> *m_test; //!< the test DCF/EDCA manager
@@ -228,9 +231,8 @@
   void GenerateBackoff (uint32_t i);
   /**
    * Notify channel switching function
-   * \param i the index of the Txop
    */
-  void NotifyChannelSwitching (uint32_t i);
+  void NotifyChannelSwitching (void);
 
 
 private:
@@ -430,13 +432,6 @@
 
 template <typename TxopType>
 void
-TxopTest<TxopType>::NotifyChannelSwitching (void)
-{
-  m_test->NotifyChannelSwitching (m_i);
-}
-
-template <typename TxopType>
-void
 TxopTest<TxopType>::NotifySleep (void)
 {
 }
@@ -509,16 +504,18 @@
 
 template <typename TxopType>
 void
-ChannelAccessManagerTest<TxopType>::NotifyChannelSwitching (uint32_t i)
+ChannelAccessManagerTest<TxopType>::NotifyChannelSwitching (void)
 {
-  Ptr<TxopTest<TxopType>> state = m_txop[i];
-  if (!state->m_expectedGrants.empty ())
+  for (auto& state : m_txop)
     {
-      std::pair<uint64_t, uint64_t> expected = state->m_expectedGrants.front ();
-      state->m_expectedGrants.pop_front ();
-      NS_TEST_EXPECT_MSG_EQ (Simulator::Now (), MicroSeconds (expected.second), "Expected grant is now");
+      if (!state->m_expectedGrants.empty ())
+        {
+          std::pair<uint64_t, uint64_t> expected = state->m_expectedGrants.front ();
+          state->m_expectedGrants.pop_front ();
+          NS_TEST_EXPECT_MSG_EQ (Simulator::Now (), MicroSeconds (expected.second), "Expected grant is now");
+        }
+      state->Txop::m_access = Txop::NOT_REQUESTED;
     }
-  state->Txop::m_access = Txop::NOT_REQUESTED;
 }
 
 template <typename TxopType>
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/test/inter-bss-test-suite.cc ns-3.36/src/wifi/test/inter-bss-test-suite.cc
--- ns-3.35/src/wifi/test/inter-bss-test-suite.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/test/inter-bss-test-suite.cc	2022-04-30 18:23:58.218735200 -0700
@@ -281,25 +281,25 @@
   // AP2 sends a packet 0.5s later.
   Simulator::Schedule (Seconds (2.0), &TestInterBssConstantObssPdAlgo::ClearDropReasons, this);
   Simulator::Schedule (Seconds (2.0), &TestInterBssConstantObssPdAlgo::SendOnePacket, this, ap_device2, sta_device2, m_payloadSize2);
-  Simulator::Schedule (Seconds (2.0) + MicroSeconds (5), &TestInterBssConstantObssPdAlgo::CheckPhyState, this, ap_device2, WifiPhyState::TX);
+  Simulator::Schedule (Seconds (2.0) + MicroSeconds (10), &TestInterBssConstantObssPdAlgo::CheckPhyState, this, ap_device2, WifiPhyState::TX);
   // All other PHYs should have stay idle until 4us (preamble detection time).
-  Simulator::Schedule (Seconds (2.0) + MicroSeconds (6), &TestInterBssConstantObssPdAlgo::CheckPhyState, this, sta_device1, WifiPhyState::IDLE);
-  Simulator::Schedule (Seconds (2.0) + MicroSeconds (6), &TestInterBssConstantObssPdAlgo::CheckPhyState, this, sta_device2, WifiPhyState::IDLE);
-  Simulator::Schedule (Seconds (2.0) + MicroSeconds (6), &TestInterBssConstantObssPdAlgo::CheckPhyState, this, ap_device1, WifiPhyState::IDLE);
+  Simulator::Schedule (Seconds (2.0) + MicroSeconds (13), &TestInterBssConstantObssPdAlgo::CheckPhyState, this, sta_device1, WifiPhyState::IDLE);
+  Simulator::Schedule (Seconds (2.0) + MicroSeconds (13), &TestInterBssConstantObssPdAlgo::CheckPhyState, this, sta_device2, WifiPhyState::IDLE);
+  Simulator::Schedule (Seconds (2.0) + MicroSeconds (13), &TestInterBssConstantObssPdAlgo::CheckPhyState, this, ap_device1, WifiPhyState::IDLE);
   // All PHYs should be receiving the PHY header (i.e. PHY state is CCA_BUSY) if preamble has been detected (always the case in this test).
-  Simulator::Schedule (Seconds (2.0) + MicroSeconds (10), &TestInterBssConstantObssPdAlgo::CheckPhyState, this, sta_device1, WifiPhyState::CCA_BUSY);
-  Simulator::Schedule (Seconds (2.0) + MicroSeconds (10), &TestInterBssConstantObssPdAlgo::CheckPhyState, this, sta_device2, WifiPhyState::CCA_BUSY);
-  Simulator::Schedule (Seconds (2.0) + MicroSeconds (10), &TestInterBssConstantObssPdAlgo::CheckPhyState, this, ap_device1, WifiPhyState::CCA_BUSY);
+  Simulator::Schedule (Seconds (2.0) + MicroSeconds (14), &TestInterBssConstantObssPdAlgo::CheckPhyState, this, sta_device1, WifiPhyState::CCA_BUSY);
+  Simulator::Schedule (Seconds (2.0) + MicroSeconds (14), &TestInterBssConstantObssPdAlgo::CheckPhyState, this, sta_device2, WifiPhyState::CCA_BUSY);
+  Simulator::Schedule (Seconds (2.0) + MicroSeconds (14), &TestInterBssConstantObssPdAlgo::CheckPhyState, this, ap_device1, WifiPhyState::CCA_BUSY);
   // PHYs of AP1 and STA1 should be idle after HE-SIG-A if they were reset by OBSS_PD SR, otherwise they should be CCA_busy until beginning of payload.
-  Simulator::Schedule (Seconds (2.0) + MicroSeconds (35), &TestInterBssConstantObssPdAlgo::CheckPhyDropReasons, this, sta_device1, dropReasons);
-  Simulator::Schedule (Seconds (2.0) + MicroSeconds (35), &TestInterBssConstantObssPdAlgo::CheckPhyState, this, sta_device1, expectPhyReset ? WifiPhyState::IDLE : WifiPhyState::CCA_BUSY);
-  Simulator::Schedule (Seconds (2.0) + MicroSeconds (35), &TestInterBssConstantObssPdAlgo::CheckPhyDropReasons, this, ap_device1, dropReasons);
-  Simulator::Schedule (Seconds (2.0) + MicroSeconds (35), &TestInterBssConstantObssPdAlgo::CheckPhyState, this, ap_device1, expectPhyReset ? WifiPhyState::IDLE : WifiPhyState::CCA_BUSY);
+  Simulator::Schedule (Seconds (2.0) + MicroSeconds (43), &TestInterBssConstantObssPdAlgo::CheckPhyDropReasons, this, sta_device1, dropReasons);
+  Simulator::Schedule (Seconds (2.0) + MicroSeconds (43), &TestInterBssConstantObssPdAlgo::CheckPhyState, this, sta_device1, expectPhyReset ? WifiPhyState::IDLE : WifiPhyState::CCA_BUSY);
+  Simulator::Schedule (Seconds (2.0) + MicroSeconds (43), &TestInterBssConstantObssPdAlgo::CheckPhyDropReasons, this, ap_device1, dropReasons);
+  Simulator::Schedule (Seconds (2.0) + MicroSeconds (43), &TestInterBssConstantObssPdAlgo::CheckPhyState, this, ap_device1, expectPhyReset ? WifiPhyState::IDLE : WifiPhyState::CCA_BUSY);
   // PHYs of AP1 and STA1 should be idle if they were reset by OBSS_PD SR, otherwise they should be CCA_busy/Rx (since filtered/not filtered, resp.).
-  Simulator::Schedule (Seconds (2.0) + MicroSeconds (50), &TestInterBssConstantObssPdAlgo::CheckPhyState, this, sta_device1, expectPhyReset ? WifiPhyState::IDLE : stateDuringPayloadNeighboringBss);
-  Simulator::Schedule (Seconds (2.0) + MicroSeconds (50), &TestInterBssConstantObssPdAlgo::CheckPhyState, this, ap_device1, expectPhyReset ? WifiPhyState::IDLE : stateDuringPayloadNeighboringBss);
+  Simulator::Schedule (Seconds (2.0) + MicroSeconds (54), &TestInterBssConstantObssPdAlgo::CheckPhyState, this, sta_device1, expectPhyReset ? WifiPhyState::IDLE : stateDuringPayloadNeighboringBss);
+  Simulator::Schedule (Seconds (2.0) + MicroSeconds (54), &TestInterBssConstantObssPdAlgo::CheckPhyState, this, ap_device1, expectPhyReset ? WifiPhyState::IDLE : stateDuringPayloadNeighboringBss);
   // STA2 should be receiving
-  Simulator::Schedule (Seconds (2.0) + MicroSeconds (50), &TestInterBssConstantObssPdAlgo::CheckPhyState, this, sta_device2, WifiPhyState::RX);
+  Simulator::Schedule (Seconds (2.0) + MicroSeconds (54), &TestInterBssConstantObssPdAlgo::CheckPhyState, this, sta_device2, WifiPhyState::RX);
 
   // We test whether two networks can transmit simultaneously, and whether transmit power restrictions are applied.
 
@@ -544,8 +544,8 @@
 TestInterBssConstantObssPdAlgo::RunOne (void)
 {
   RngSeedManager::SetSeed (1);
-  RngSeedManager::SetRun (1);
-  int64_t streamNumber = 2;
+  RngSeedManager::SetRun (3);
+  int64_t streamNumber = 50;
   
   Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Mac/BE_MaxAmpduSize", UintegerValue (0));
 
@@ -569,10 +569,10 @@
   phy.SetChannel (channel);
   phy.Set ("TxPowerStart", DoubleValue (m_txPowerDbm));
   phy.Set ("TxPowerEnd", DoubleValue (m_txPowerDbm));
-  phy.Set ("ChannelWidth", UintegerValue (20));
+  phy.Set ("ChannelSettings", StringValue ("{36, 20, BAND_5GHZ, 0}"));
 
   WifiHelper wifi;
-  wifi.SetStandard (WIFI_STANDARD_80211ax_5GHZ);
+  wifi.SetStandard (WIFI_STANDARD_80211ax);
   wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager",
                                 "DataMode", StringValue ("HeMcs5"),
                                 "ControlMode", StringValue ("HeMcs0"));
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/test/power-rate-adaptation-test.cc ns-3.36/src/wifi/test/power-rate-adaptation-test.cc
--- ns-3.35/src/wifi/test/power-rate-adaptation-test.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/test/power-rate-adaptation-test.cc	2022-04-30 18:23:58.218735200 -0700
@@ -102,7 +102,7 @@
   phy->SetChannel (channel);
   phy->SetDevice (dev);
   phy->SetMobility (mobility);
-  phy->ConfigureStandardAndBand (WIFI_PHY_STANDARD_80211a, WIFI_PHY_BAND_5GHZ);
+  phy->ConfigureStandard (WIFI_STANDARD_80211a);
 
   /*
    * Configure power control parameters.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/test/spectrum-wifi-phy-test.cc ns-3.36/src/wifi/test/spectrum-wifi-phy-test.cc
--- ns-3.35/src/wifi/test/spectrum-wifi-phy-test.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/test/spectrum-wifi-phy-test.cc	2022-04-30 18:23:58.218735200 -0700
@@ -175,11 +175,10 @@
 SpectrumWifiPhyBasicTest::DoSetup (void)
 {
   m_phy = CreateObject<SpectrumWifiPhy> ();
-  m_phy->ConfigureStandardAndBand (WIFI_PHY_STANDARD_80211n, WIFI_PHY_BAND_5GHZ);
+  m_phy->SetOperatingChannel (WifiPhy::ChannelTuple {CHANNEL_NUMBER, 0, WIFI_PHY_BAND_5GHZ, 0});
+  m_phy->ConfigureStandard (WIFI_STANDARD_80211n);
   Ptr<ErrorRateModel> error = CreateObject<NistErrorRateModel> ();
   m_phy->SetErrorRateModel (error);
-  m_phy->SetChannelNumber (CHANNEL_NUMBER);
-  m_phy->SetFrequency (FREQUENCY);
   m_phy->SetReceiveOkCallback (MakeCallback (&SpectrumWifiPhyBasicTest::SpectrumWifiPhyRxSuccess, this));
   m_phy->SetReceiveErrorCallback (MakeCallback (&SpectrumWifiPhyBasicTest::SpectrumWifiPhyRxFailure, this));
 }
@@ -471,7 +470,7 @@
   Ptr<WifiNetDevice> txDev = CreateObject<WifiNetDevice> ();
   m_txPhy = CreateObject<ExtSpectrumWifiPhy> ();
   m_txPhy->CreateWifiSpectrumPhyInterface (txDev);
-  m_txPhy->ConfigureStandardAndBand (WIFI_PHY_STANDARD_80211ax, WIFI_PHY_BAND_5GHZ);
+  m_txPhy->ConfigureStandard (WIFI_STANDARD_80211ax);
   Ptr<ErrorRateModel> error = CreateObject<NistErrorRateModel> ();
   m_txPhy->SetErrorRateModel (error);
   m_txPhy->SetDevice (txDev);
@@ -486,7 +485,7 @@
   Ptr<WifiNetDevice> rxDev = CreateObject<WifiNetDevice> ();
   m_rxPhy = CreateObject<ExtSpectrumWifiPhy> ();
   m_rxPhy->CreateWifiSpectrumPhyInterface (rxDev);
-  m_rxPhy->ConfigureStandardAndBand (WIFI_PHY_STANDARD_80211ax, WIFI_PHY_BAND_5GHZ);
+  m_rxPhy->ConfigureStandard (WIFI_STANDARD_80211ax);
   m_rxPhy->SetErrorRateModel (error);
   m_rxPhy->SetChannel (spectrumChannel);
   Ptr<ConstantPositionMobilityModel> sta1Mobility = CreateObject<ConstantPositionMobilityModel> ();
@@ -526,7 +525,11 @@
       txFrequency = 5250;
       break;
     }
-  m_txPhy->SetFrequency (txFrequency);
+  auto txChannelNum = std::get<0> (*WifiPhyOperatingChannel::FindFirst (0, txFrequency, m_txChannelWidth,
+                                                                        WIFI_STANDARD_80211ax,
+                                                                        WIFI_PHY_BAND_5GHZ));
+  m_txPhy->SetOperatingChannel (WifiPhy::ChannelTuple {txChannelNum, m_txChannelWidth,
+                                                       (int)(WIFI_PHY_BAND_5GHZ), 0});
 
   uint16_t rxFrequency;
   switch (m_rxChannelWidth)
@@ -545,7 +548,11 @@
       rxFrequency = 5250;
       break;
     }
-  m_rxPhy->SetFrequency (rxFrequency);
+  auto rxChannelNum = std::get<0> (*WifiPhyOperatingChannel::FindFirst (0, rxFrequency, m_rxChannelWidth,
+                                                                        WIFI_STANDARD_80211ax,
+                                                                        WIFI_PHY_BAND_5GHZ));
+  m_rxPhy->SetOperatingChannel (WifiPhy::ChannelTuple {rxChannelNum, m_rxChannelWidth,
+                                                       (int)(WIFI_PHY_BAND_5GHZ), 0});
 
   m_ruBands.clear ();
   for (uint16_t bw = 160; bw >= 20; bw = bw / 2)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/test/wifi-aggregation-test.cc ns-3.36/src/wifi/test/wifi-aggregation-test.cc
--- ns-3.35/src/wifi/test/wifi-aggregation-test.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/test/wifi-aggregation-test.cc	2022-04-30 18:23:58.218735200 -0700
@@ -103,7 +103,7 @@
    */
   m_phy = CreateObject<YansWifiPhy> ();
   m_phy->SetDevice (m_device);
-  m_phy->ConfigureStandardAndBand (WIFI_PHY_STANDARD_80211n, WIFI_PHY_BAND_5GHZ);
+  m_phy->ConfigureStandard (WIFI_STANDARD_80211n);
   m_device->SetPhy (m_phy);
 
   /*
@@ -119,11 +119,11 @@
   /*
    * Create and configure mac layer.
    */
-  m_mac = CreateObject<StaWifiMac> ();
+  m_mac = CreateObjectWithAttributes<StaWifiMac> ("QosSupported", BooleanValue (true));
   m_mac->SetDevice (m_device);
   m_mac->SetWifiRemoteStationManager (m_manager);
   m_mac->SetAddress (Mac48Address ("00:00:00:00:00:01"));
-  m_mac->ConfigureStandard (WIFI_STANDARD_80211n_5GHZ);
+  m_mac->ConfigureStandard (WIFI_STANDARD_80211n);
   Ptr<FrameExchangeManager> fem = m_mac->GetFrameExchangeManager ();
   Ptr<WifiProtectionManager> protectionManager = CreateObject<WifiDefaultProtectionManager> ();
   protectionManager->SetWifiMac (m_mac);
@@ -133,6 +133,7 @@
   fem->SetAckManager (ackManager);
   m_mac->SetWifiPhy (m_phy);
   m_device->SetMac (m_mac);
+  m_mac->SetState (StaWifiMac::ASSOCIATED);
 
   /*
    * Configure MPDU aggregation.
@@ -175,7 +176,7 @@
   respHdr.SetAmsduSupport (reqHdr.IsAmsduSupported ());
   respHdr.SetImmediateBlockAck ();
   respHdr.SetTid (reqHdr.GetTid ());
-  respHdr.SetBufferSize (63);
+  respHdr.SetBufferSize (64);
   respHdr.SetTimeout (reqHdr.GetTimeout ());
   m_mac->GetBEQueue ()->GetBaManager ()->UpdateAgreement (&respHdr, hdr.GetAddr1 (), 0);
 
@@ -192,11 +193,9 @@
   Ptr<const WifiMacQueueItem> peeked = m_mac->GetBEQueue ()->PeekNextMpdu ();
   WifiTxParameters txParams;
   txParams.m_txVector = m_mac->GetWifiRemoteStationManager ()->GetDataTxVector (peeked->GetHeader ());
-  WifiMacQueueItem::ConstIterator queueIt;
-  Ptr<WifiMacQueueItem> item = m_mac->GetBEQueue ()->GetNextMpdu (peeked, txParams, Time::Min (),
-                                                                  true, queueIt);
+  Ptr<WifiMacQueueItem> item = m_mac->GetBEQueue ()->GetNextMpdu (peeked, txParams, Time::Min (), true);
 
-  auto mpduList = mpduAggregator->GetNextAmpdu (item, txParams, Time::Min (), queueIt);
+  auto mpduList = mpduAggregator->GetNextAmpdu (item, txParams, Time::Min ());
 
   NS_TEST_EXPECT_MSG_EQ (mpduList.empty (), true, "a single packet should not result in an A-MPDU");
 
@@ -225,8 +224,8 @@
   m_mac->GetBEQueue ()->GetWifiMacQueue ()->Enqueue (Create<WifiMacQueueItem> (pkt1, hdr1));
   m_mac->GetBEQueue ()->GetWifiMacQueue ()->Enqueue (Create<WifiMacQueueItem> (pkt2, hdr2));
 
-  item = m_mac->GetBEQueue ()->GetNextMpdu (peeked, txParams, Time::Min (), true, queueIt);
-  mpduList = mpduAggregator->GetNextAmpdu (item, txParams, Time::Min (), queueIt);
+  item = m_mac->GetBEQueue ()->GetNextMpdu (peeked, txParams, Time::Min (), true);
+  mpduList = mpduAggregator->GetNextAmpdu (item, txParams, Time::Min ());
 
   NS_TEST_EXPECT_MSG_EQ (mpduList.empty (), false, "MPDU aggregation failed");
 
@@ -276,10 +275,9 @@
   peeked = m_mac->GetBEQueue ()->PeekNextMpdu ();
   txParams.Clear ();
   txParams.m_txVector = m_mac->GetWifiRemoteStationManager ()->GetDataTxVector (peeked->GetHeader ());
-  queueIt = WifiMacQueue::EMPTY;  // reset queueIt
-  item = m_mac->GetBEQueue ()->GetNextMpdu (peeked, txParams, Time::Min (), true, queueIt);
+  item = m_mac->GetBEQueue ()->GetNextMpdu (peeked, txParams, Time::Min (), true);
 
-  mpduList = mpduAggregator->GetNextAmpdu (item, txParams, Time::Min (), queueIt);
+  mpduList = mpduAggregator->GetNextAmpdu (item, txParams, Time::Min ());
 
   NS_TEST_EXPECT_MSG_EQ (mpduList.empty (), true, "a single packet for this destination should not result in an A-MPDU");
   // dequeue the MPDU
@@ -288,10 +286,9 @@
   peeked = m_mac->GetBEQueue ()->PeekNextMpdu ();
   txParams.Clear ();
   txParams.m_txVector = m_mac->GetWifiRemoteStationManager ()->GetDataTxVector (peeked->GetHeader ());
-  queueIt = WifiMacQueue::EMPTY;  // reset queueIt
-  item = m_mac->GetBEQueue ()->GetNextMpdu (peeked, txParams, Time::Min (), true, queueIt);
+  item = m_mac->GetBEQueue ()->GetNextMpdu (peeked, txParams, Time::Min (), true);
 
-  mpduList = mpduAggregator->GetNextAmpdu (item, txParams, Time::Min (), queueIt);
+  mpduList = mpduAggregator->GetNextAmpdu (item, txParams, Time::Min ());
 
   NS_TEST_EXPECT_MSG_EQ (mpduList.empty (), true, "no MPDU aggregation should be performed if there is no agreement");
 
@@ -346,6 +343,7 @@
    * Create device and attach HT configuration.
    */
   m_device = CreateObject<WifiNetDevice> ();
+  m_device->SetStandard (WIFI_STANDARD_80211n);
   Ptr<HtConfiguration> htConfiguration = CreateObject<HtConfiguration> ();
   m_device->SetHtConfiguration (htConfiguration);
 
@@ -354,7 +352,7 @@
    */
   m_phy = CreateObject<YansWifiPhy> ();
   m_phy->SetDevice (m_device);
-  m_phy->ConfigureStandardAndBand (WIFI_PHY_STANDARD_80211n, WIFI_PHY_BAND_5GHZ);
+  m_phy->ConfigureStandard (WIFI_STANDARD_80211n);
   m_device->SetPhy (m_phy);
 
   /*
@@ -370,11 +368,11 @@
   /*
    * Create and configure mac layer.
    */
-  m_mac = CreateObject<StaWifiMac> ();
+  m_mac = CreateObjectWithAttributes<StaWifiMac> ("QosSupported", BooleanValue (true));
   m_mac->SetDevice (m_device);
   m_mac->SetWifiRemoteStationManager (m_manager);
   m_mac->SetAddress (Mac48Address ("00:00:00:00:00:01"));
-  m_mac->ConfigureStandard (WIFI_STANDARD_80211n_5GHZ);
+  m_mac->ConfigureStandard (WIFI_STANDARD_80211n);
   Ptr<FrameExchangeManager> fem = m_mac->GetFrameExchangeManager ();
   Ptr<WifiProtectionManager> protectionManager = CreateObject<WifiDefaultProtectionManager> ();
   protectionManager->SetWifiMac (m_mac);
@@ -384,6 +382,7 @@
   fem->SetAckManager (ackManager);
   m_mac->SetWifiPhy (m_phy);
   m_device->SetMac (m_mac);
+  m_mac->SetState (StaWifiMac::ASSOCIATED);
 
   /*
    * Configure aggregation.
@@ -424,8 +423,7 @@
   WifiTxParameters txParams;
   txParams.m_txVector = m_mac->GetWifiRemoteStationManager ()->GetDataTxVector (peeked->GetHeader ());
   htFem->TryAddMpdu (peeked, txParams, Time::Min ());
-  WifiMacQueueItem::ConstIterator queueIt;
-  Ptr<WifiMacQueueItem> item = msduAggregator->GetNextAmsdu (peeked, txParams, Time::Min (), queueIt);
+  Ptr<WifiMacQueueItem> item = msduAggregator->GetNextAmsdu (peeked, txParams, Time::Min ());
 
   bool result = (item != 0);
   NS_TEST_EXPECT_MSG_EQ (result, true, "aggregation failed");
@@ -447,11 +445,11 @@
   txParams.Clear ();
   txParams.m_txVector = m_mac->GetWifiRemoteStationManager ()->GetDataTxVector (peeked->GetHeader ());
   htFem->TryAddMpdu (peeked, txParams, Time::Min ());
-  item = msduAggregator->GetNextAmsdu (peeked, txParams, Time::Min (), queueIt);
+  item = msduAggregator->GetNextAmsdu (peeked, txParams, Time::Min ());
 
   NS_TEST_EXPECT_MSG_EQ ((item == 0), true, "A-MSDU aggregation did not fail");
 
-  htFem->DequeueMpdu (*peeked->GetQueueIterator ());
+  htFem->DequeueMpdu (peeked);
 
   NS_TEST_EXPECT_MSG_EQ (m_mac->GetBEQueue ()->GetWifiMacQueue ()->GetNPackets (), 0, "queue should be empty");
 
@@ -479,7 +477,7 @@
   respHdr.SetAmsduSupport (reqHdr.IsAmsduSupported ());
   respHdr.SetImmediateBlockAck ();
   respHdr.SetTid (reqHdr.GetTid ());
-  respHdr.SetBufferSize (63);
+  respHdr.SetBufferSize (64);
   respHdr.SetTimeout (reqHdr.GetTimeout ());
   m_mac->GetVIQueue ()->GetBaManager ()->UpdateAgreement (&respHdr, hdr.GetAddr1 (), 0);
 
@@ -502,12 +500,11 @@
 
   // Compute the first MPDU to be aggregated in an A-MPDU. It must contain an A-MSDU
   // aggregating two MSDUs
-  queueIt = WifiMacQueue::EMPTY;  // reset queueIt
-  item = m_mac->GetVIQueue ()->GetNextMpdu (peeked, txParams, txopLimit, true, queueIt);
+  item = m_mac->GetVIQueue ()->GetNextMpdu (peeked, txParams, txopLimit, true);
 
   NS_TEST_EXPECT_MSG_EQ (std::distance (item->begin (), item->end ()), 2, "There must be 2 MSDUs in the A-MSDU");
 
-  auto mpduList = mpduAggregator->GetNextAmpdu (item, txParams, txopLimit, queueIt);
+  auto mpduList = mpduAggregator->GetNextAmpdu (item, txParams, txopLimit);
 
   // The maximum number of bytes that can be transmitted in a TXOP is (approximately, as we
   // do not consider that the preamble is transmitted at a different rate):
@@ -526,7 +523,7 @@
 
   Ptr<WifiPsdu> psdu = Create<WifiPsdu> (mpduList);
   htFem->DequeuePsdu (psdu);
-  
+
   NS_TEST_EXPECT_MSG_EQ (m_mac->GetVIQueue ()->GetWifiMacQueue ()->GetNPackets (), 5,
                          "Unexpected number of MSDUs left in the EDCA queue");
 
@@ -589,7 +586,7 @@
    */
   m_phy = CreateObject<YansWifiPhy> ();
   m_phy->SetDevice (m_device);
-  m_phy->ConfigureStandardAndBand (WIFI_PHY_STANDARD_80211ax, WIFI_PHY_BAND_5GHZ);
+  m_phy->ConfigureStandard (WIFI_STANDARD_80211ax);
   m_device->SetPhy (m_phy);
 
   /*
@@ -605,11 +602,11 @@
   /*
    * Create and configure mac layer.
    */
-  m_mac = CreateObject<StaWifiMac> ();
+  m_mac = CreateObjectWithAttributes<StaWifiMac> ("QosSupported", BooleanValue (true));
   m_mac->SetDevice (m_device);
   m_mac->SetWifiRemoteStationManager (m_manager);
   m_mac->SetAddress (Mac48Address ("00:00:00:00:00:01"));
-  m_mac->ConfigureStandard (WIFI_STANDARD_80211ax_5GHZ);
+  m_mac->ConfigureStandard (WIFI_STANDARD_80211ax);
   Ptr<FrameExchangeManager> fem = m_mac->GetFrameExchangeManager ();
   Ptr<WifiProtectionManager> protectionManager = CreateObject<WifiDefaultProtectionManager> ();
   protectionManager->SetWifiMac (m_mac);
@@ -619,6 +616,7 @@
   fem->SetAckManager (ackManager);
   m_mac->SetWifiPhy (m_phy);
   m_device->SetMac (m_mac);
+  m_mac->SetState (StaWifiMac::ASSOCIATED);
 
   /*
    * Configure aggregation.
@@ -658,7 +656,7 @@
   respHdr.SetAmsduSupport (reqHdr.IsAmsduSupported ());
   respHdr.SetImmediateBlockAck ();
   respHdr.SetTid (reqHdr.GetTid ());
-  respHdr.SetBufferSize (bufferSize - 1);
+  respHdr.SetBufferSize (bufferSize);
   respHdr.SetTimeout (reqHdr.GetTimeout ());
   m_mac->GetBEQueue ()->GetBaManager ()->UpdateAgreement (&respHdr, hdr.GetAddr1 (), 0);
 
@@ -684,11 +682,9 @@
   Ptr<const WifiMacQueueItem> peeked = m_mac->GetBEQueue ()->PeekNextMpdu ();
   WifiTxParameters txParams;
   txParams.m_txVector = m_mac->GetWifiRemoteStationManager ()->GetDataTxVector (peeked->GetHeader ());
-  WifiMacQueueItem::ConstIterator queueIt;
-  Ptr<WifiMacQueueItem> item = m_mac->GetBEQueue ()->GetNextMpdu (peeked, txParams, Time::Min (),
-                                                                  true, queueIt);
-  
-  auto mpduList = mpduAggregator->GetNextAmpdu (item, txParams, Time::Min (), queueIt);
+  Ptr<WifiMacQueueItem> item = m_mac->GetBEQueue ()->GetNextMpdu (peeked, txParams, Time::Min (), true);
+
+  auto mpduList = mpduAggregator->GetNextAmpdu (item, txParams, Time::Min ());
   Ptr<WifiPsdu> psdu = Create<WifiPsdu> (mpduList);
   htFem->DequeuePsdu (psdu);
 
@@ -827,7 +823,7 @@
   phy.SetChannel (channel.Create ());
 
   WifiHelper wifi;
-  wifi.SetStandard (WIFI_STANDARD_80211n_5GHZ);
+  wifi.SetStandard (WIFI_STANDARD_80211n);
   wifi.SetRemoteStationManager ("ns3::IdealWifiManager");
 
   WifiMacHelper mac;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/test/wifi-channel-switching-test.cc ns-3.36/src/wifi/test/wifi-channel-switching-test.cc
--- ns-3.35/src/wifi/test/wifi-channel-switching-test.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/wifi/test/wifi-channel-switching-test.cc	2022-04-30 18:23:58.218735200 -0700
@@ -0,0 +1,314 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2021 2020 Universita' degli Studi di Napoli Federico II
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Stefano Avallone <stavallo@unina.it>
+ */
+
+#include "ns3/test.h"
+#include "ns3/string.h"
+#include "ns3/boolean.h"
+#include "ns3/qos-utils.h"
+#include "ns3/wifi-psdu.h"
+#include "ns3/wifi-net-device.h"
+#include "ns3/ap-wifi-mac.h"
+#include "ns3/mobility-helper.h"
+#include "ns3/spectrum-wifi-helper.h"
+#include "ns3/multi-model-spectrum-channel.h"
+#include "ns3/packet-socket-server.h"
+#include "ns3/packet-socket-client.h"
+#include "ns3/packet-socket-helper.h"
+#include "ns3/rng-seed-manager.h"
+#include "ns3/config.h"
+#include <array>
+
+using namespace ns3;
+
+NS_LOG_COMPONENT_DEFINE ("WifiChannelSwitchingTest");
+
+/**
+ * \ingroup wifi-test
+ * \ingroup tests
+ *
+ * This test verifies that communication between an AP and a STA resumes
+ * after that both switch channel and PHY band. The channel switch is
+ * scheduled to happen during the transmission of a frame sent by the AP
+ * to the STA. STA discards the frame, associates with the AP again and
+ * finally receives the frame successfully.
+ */
+class WifiChannelSwitchingTest : public TestCase
+{
+public:
+  /**
+   * \brief Constructor
+   */
+  WifiChannelSwitchingTest ();
+  virtual ~WifiChannelSwitchingTest ();
+
+  virtual void DoRun (void);
+
+  /**
+   * Callback invoked when a station associates with an AP. Tracks the number of
+   * times the association procedure is performed.
+   *
+   * \param bssid the BSSID
+   */
+  void Associated (Mac48Address bssid);
+  /**
+   * Callback invoked when PHY receives a PSDU to transmit from the MAC. Tracks the
+   * number of times a QoS data frame is transmitted by the AP.
+   *
+   * \param psduMap the PSDU map
+   * \param txVector the TX vector
+   * \param txPowerW the tx power in Watts
+   */
+  void Transmit (WifiConstPsduMap psduMap, WifiTxVector txVector, double txPowerW);
+  /**
+   * Function to trace packets received by the server application
+   *
+   * \param p the packet
+   * \param addr the address
+   */
+  void L7Receive (Ptr<const Packet> p, const Address &addr);
+  /**
+   * Send a packet from the AP to the STA through a packet socket
+   */
+  void SendPacket (void);
+  /**
+   * Request channel switch on both AP and STA
+   */
+  void ChannelSwitch (void);
+  /**
+   * Callback invoked when the PHY on the given node changes state.
+   *
+   * \param nodeId the given node ID
+   * \param start the time state changes
+   * \param duration the time the PHY will stay in the new state
+   * \param state the new PHY state
+   */
+  void StateChange (uint32_t nodeId, Time start, Time duration, WifiPhyState state);
+
+private:
+  NodeContainer m_apNode;             ///< AP node container
+  NodeContainer m_staNode;            ///< STA node container
+  NetDeviceContainer m_apDevice;      ///< AP device container
+  NetDeviceContainer m_staDevice;     ///< STA device container
+  uint8_t m_assocCount;               ///< count of completed Assoc Request procedures
+  uint8_t m_txCount;                  ///< count of transmissions
+  uint64_t m_rxBytes;                 ///< RX bytes
+  uint32_t m_payloadSize;             ///< payload size in bytes
+  std::array<uint8_t, 2> m_channelSwitchCount {0, 0}; ///< Per-node number of channel switch events
+};
+
+WifiChannelSwitchingTest::WifiChannelSwitchingTest ()
+  : TestCase ("Test case for resuming data transmission when the recipient moves back"),
+    m_assocCount (0),
+    m_txCount (0),
+    m_rxBytes (0),
+    m_payloadSize (2000)
+{
+}
+
+WifiChannelSwitchingTest::~WifiChannelSwitchingTest ()
+{
+}
+
+void
+WifiChannelSwitchingTest::Associated (Mac48Address bssid)
+{
+  m_assocCount++;
+}
+
+void
+WifiChannelSwitchingTest::Transmit (WifiConstPsduMap psduMap, WifiTxVector txVector, double txPowerW)
+{
+  for (const auto& psduPair : psduMap)
+    {
+      std::stringstream ss;
+      ss << " " << psduPair.second->GetHeader (0).GetTypeString ()
+         << " seq " << psduPair.second->GetHeader (0).GetSequenceNumber ()
+         << " from " << psduPair.second->GetAddr2 ()
+         << " to " << psduPair.second->GetAddr1 ();
+      NS_LOG_INFO (ss.str ());
+    }
+  NS_LOG_INFO (" TXVECTOR " << txVector << "\n");
+
+  if (psduMap.begin ()->second->GetHeader (0).IsQosData ())
+    {
+      m_txCount++;
+
+      if (!psduMap.begin ()->second->GetHeader (0).IsRetry ())
+        {
+          // packet transmitted after first association. Switch channel during its
+          // transmission
+          Time txDuration = WifiPhy::CalculateTxDuration (psduMap, txVector, WIFI_PHY_BAND_5GHZ);
+          Simulator::Schedule (txDuration / 2, &WifiChannelSwitchingTest::ChannelSwitch, this);
+        }
+    }
+}
+
+void
+WifiChannelSwitchingTest::L7Receive (Ptr<const Packet> p, const Address &addr)
+{
+  if (p->GetSize () == m_payloadSize)
+    {
+      m_rxBytes += m_payloadSize;
+    }
+}
+
+void
+WifiChannelSwitchingTest::SendPacket (void)
+{
+  PacketSocketAddress socket;
+  socket.SetSingleDevice (m_apDevice.Get (0)->GetIfIndex ());
+  socket.SetPhysicalAddress (m_staDevice.Get (0)->GetAddress ());
+  socket.SetProtocol (1);
+
+  // give packet socket powers to nodes.
+  PacketSocketHelper packetSocket;
+  packetSocket.Install (m_staNode);
+  packetSocket.Install (m_apNode);
+
+  Ptr<PacketSocketClient> client = CreateObject<PacketSocketClient> ();
+  client->SetAttribute ("PacketSize", UintegerValue (m_payloadSize));
+  client->SetAttribute ("MaxPackets", UintegerValue (1));
+  client->SetAttribute ("Interval", TimeValue (MicroSeconds (0)));
+  client->SetRemote (socket);
+  m_apNode.Get (0)->AddApplication (client);
+  client->SetStartTime (Seconds (0.5));
+  client->SetStopTime (Seconds (1.0));
+
+  Ptr<PacketSocketServer> server = CreateObject<PacketSocketServer> ();
+  server->SetLocal (socket);
+  m_staNode.Get (0)->AddApplication (server);
+  server->SetStartTime (Seconds (0.0));
+  server->SetStopTime (Seconds (1.0));
+}
+
+void
+WifiChannelSwitchingTest::ChannelSwitch (void)
+{
+  NS_LOG_INFO ("CHANNEL SWITCH\n");
+  Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/$ns3::WifiPhy/ChannelSettings",
+               StringValue ("{1, 20, BAND_2_4GHZ, 0}"));
+}
+
+void
+WifiChannelSwitchingTest::StateChange (uint32_t nodeId, ns3::Time start, ns3::Time duration,
+                                       WifiPhyState state)
+{
+  if (state == WifiPhyState::SWITCHING)
+    {
+      m_channelSwitchCount[nodeId]++;
+    }
+}
+
+void
+WifiChannelSwitchingTest::DoRun (void)
+{
+  Time simulationTime (Seconds (6.0));
+
+  RngSeedManager::SetSeed (1);
+  RngSeedManager::SetRun (40);
+  int64_t streamNumber = 100;
+
+  m_apNode.Create (1);
+  m_staNode.Create (1);
+
+  Ptr<MultiModelSpectrumChannel> spectrumChannel = CreateObject<MultiModelSpectrumChannel> ();
+  Ptr<FriisPropagationLossModel> lossModel = CreateObject<FriisPropagationLossModel> ();
+  spectrumChannel->AddPropagationLossModel (lossModel);
+  Ptr<ConstantSpeedPropagationDelayModel> delayModel = CreateObject<ConstantSpeedPropagationDelayModel> ();
+  spectrumChannel->SetPropagationDelayModel (delayModel);
+
+  SpectrumWifiPhyHelper phy;
+  phy.SetChannel (spectrumChannel);
+  phy.Set ("ChannelSettings", StringValue ("{36, 20, BAND_5GHZ, 0}"));
+
+  WifiHelper wifi;
+  wifi.SetStandard (WIFI_STANDARD_80211ax);
+  wifi.SetRemoteStationManager ("ns3::IdealWifiManager");
+
+  WifiMacHelper mac;
+  mac.SetType ("ns3::StaWifiMac",
+               "Ssid", SsidValue (Ssid ("channel-switching-test")));
+
+  m_staDevice = wifi.Install (phy, mac, m_staNode);
+
+  mac.SetType ("ns3::ApWifiMac",
+               "Ssid", SsidValue (Ssid ("channel-switching-test")),
+               "EnableBeaconJitter", BooleanValue (false));
+
+  m_apDevice = wifi.Install (phy, mac, m_apNode);
+
+  // Assign fixed streams to random variables in use
+  wifi.AssignStreams (m_apDevice, streamNumber);
+
+  MobilityHelper mobility;
+  Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator> ();
+
+  positionAlloc->Add (Vector (0.0, 0.0, 0.0));
+  positionAlloc->Add (Vector (5.0, 0.0, 0.0));
+  mobility.SetPositionAllocator (positionAlloc);
+
+  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
+  mobility.Install (m_apNode);
+  mobility.Install (m_staNode);
+
+  SendPacket ();
+
+  Config::ConnectWithoutContext ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Mac/$ns3::StaWifiMac/Assoc",
+                                 MakeCallback (&WifiChannelSwitchingTest::Associated, this));
+  Config::ConnectWithoutContext ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/PhyTxPsduBegin",
+                                 MakeCallback (&WifiChannelSwitchingTest::Transmit, this));
+  Config::ConnectWithoutContext ("/NodeList/*/ApplicationList/0/$ns3::PacketSocketServer/Rx",
+                                 MakeCallback (&WifiChannelSwitchingTest::L7Receive, this));
+  Config::ConnectWithoutContext ("/NodeList/0/DeviceList/*/$ns3::WifiNetDevice/Phy/State/State",
+                                 MakeCallback (&WifiChannelSwitchingTest::StateChange, this).Bind (0));
+  Config::ConnectWithoutContext ("/NodeList/1/DeviceList/*/$ns3::WifiNetDevice/Phy/State/State",
+                                 MakeCallback (&WifiChannelSwitchingTest::StateChange, this).Bind (1));
+
+  Simulator::Stop (Seconds (2));
+  Simulator::Run ();
+
+  NS_TEST_EXPECT_MSG_EQ (+m_assocCount, 2, "STA did not associate twice");
+  NS_TEST_EXPECT_MSG_EQ (+m_txCount, 2, "The QoS Data frame should have been transmitted twice by the AP");
+  NS_TEST_EXPECT_MSG_EQ (m_rxBytes, m_payloadSize, "The QoS Data frame should have been received once by the STA");
+  NS_TEST_EXPECT_MSG_EQ (+m_channelSwitchCount[0], 1, "AP had to perform one channel switch");
+  NS_TEST_EXPECT_MSG_EQ (+m_channelSwitchCount[1], 1, "STA had to perform one channel switch");
+
+  Simulator::Destroy ();
+}
+
+/**
+ * \ingroup wifi-test
+ * \ingroup tests
+ *
+ * \brief Block Ack Test Suite
+ */
+class WifiChannelSwitchingTestSuite : public TestSuite
+{
+public:
+  WifiChannelSwitchingTestSuite ();
+};
+
+WifiChannelSwitchingTestSuite::WifiChannelSwitchingTestSuite ()
+  : TestSuite ("wifi-channel-switching", UNIT)
+{
+  AddTestCase (new WifiChannelSwitchingTest, TestCase::QUICK);
+}
+
+static WifiChannelSwitchingTestSuite g_issue211TestSuite; ///< the test suite
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/test/wifi-mac-ofdma-test.cc ns-3.36/src/wifi/test/wifi-mac-ofdma-test.cc
--- ns-3.35/src/wifi/test/wifi-mac-ofdma-test.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/test/wifi-mac-ofdma-test.cc	2022-04-30 18:23:58.222735200 -0700
@@ -55,7 +55,7 @@
  * (when all BA agreements have been established). Afterwards, it cycles through UL_MU_TX
  * (with a BSRP Trigger Frame), UL_MU_TX (with a Basic Trigger Frame) and DL_MU_TX.
  * This scheduler requires that 4 stations are associated with the AP.
- * 
+ *
  */
 class TestMultiUserScheduler : public MultiUserScheduler
 {
@@ -81,8 +81,8 @@
 
   TxFormat m_txFormat;              //!< the format of next transmission
   TriggerFrameType m_ulTriggerType; //!< Trigger Frame type for UL MU
-  Ptr<WifiMacQueueItem> m_trigger;  //!< Trigger Frame to send
-  Time m_tbPpduDuration;            //!< Duration of the solicited TB PPDUs
+  CtrlTriggerHeader m_trigger;      //!< Trigger Frame to send
+  WifiMacHeader m_triggerHdr;       //!< MAC header for Trigger Frame
   WifiTxVector m_txVector;          //!< the TX vector for MU PPDUs
   WifiTxParameters m_txParams;      //!< TX parameters
   WifiPsduMap m_psduMap;            //!< the DL MU PPDU to transmit
@@ -136,10 +136,10 @@
                                         ? TriggerFrameType::BSRP_TRIGGER
                                         : TriggerFrameType::BASIC_TRIGGER);
 
-      CtrlTriggerHeader trigger (ulTriggerType, m_txVector);
+      m_trigger = CtrlTriggerHeader (ulTriggerType, m_txVector);
 
       WifiTxVector txVector = m_txVector;
-      txVector.SetGuardInterval (trigger.GetGuardInterval ());
+      txVector.SetGuardInterval (m_trigger.GetGuardInterval ());
 
       uint32_t ampduSize = (ulTriggerType == TriggerFrameType::BSRP_TRIGGER ? m_sizeOf8QosNull : 3500);
 
@@ -147,27 +147,28 @@
                                                     m_apMac->GetWifiPhy ()->GetPhyBand (),
                                                     m_apMac->GetStaList ().begin ()->first);
 
-      uint16_t length = HePhy::ConvertHeTbPpduDurationToLSigLength (duration,
-                                                                    m_apMac->GetWifiPhy ()->GetPhyBand ());
-      trigger.SetUlLength (length);
-      m_heFem->SetTargetRssi (trigger);
+      uint16_t length;
+      std::tie (length, duration) = HePhy::ConvertHeTbPpduDurationToLSigLength (duration,
+                                                                                m_trigger.GetHeTbTxVector (m_trigger.begin ()->GetAid12 ()),
+                                                                                m_apMac->GetWifiPhy ()->GetPhyBand ());
+      m_trigger.SetUlLength (length);
 
       Ptr<Packet> packet = Create<Packet> ();
-      packet->AddHeader (trigger);
+      packet->AddHeader (m_trigger);
 
-      WifiMacHeader hdr (WIFI_MAC_CTL_TRIGGER);
-      hdr.SetAddr1 (Mac48Address::GetBroadcast ());
-      hdr.SetAddr2 (m_apMac->GetAddress ());
-      hdr.SetDsNotTo ();
-      hdr.SetDsNotFrom ();
+      m_triggerHdr = WifiMacHeader (WIFI_MAC_CTL_TRIGGER);
+      m_triggerHdr.SetAddr1 (Mac48Address::GetBroadcast ());
+      m_triggerHdr.SetAddr2 (m_apMac->GetAddress ());
+      m_triggerHdr.SetDsNotTo ();
+      m_triggerHdr.SetDsNotFrom ();
 
-      m_trigger = Create<WifiMacQueueItem> (packet, hdr);
+      auto item = Create<WifiMacQueueItem> (packet, m_triggerHdr);
 
       m_txParams.Clear ();
       // set the TXVECTOR used to send the Trigger Frame
-      m_txParams.m_txVector = m_apMac->GetWifiRemoteStationManager ()->GetRtsTxVector (hdr.GetAddr1 ());
+      m_txParams.m_txVector = m_apMac->GetWifiRemoteStationManager ()->GetRtsTxVector (m_triggerHdr.GetAddr1 ());
 
-      if (!m_heFem->TryAddMpdu (m_trigger, m_txParams, m_availableTime)
+      if (!m_heFem->TryAddMpdu (item, m_txParams, m_availableTime)
           || (m_availableTime != Time::Min ()
               && m_txParams.m_protection->protectionTime
                  + m_txParams.m_txDuration     // TF tx time
@@ -182,7 +183,6 @@
 
       m_txFormat = UL_MU_TX;
       m_ulTriggerType = ulTriggerType;
-      m_tbPpduDuration = duration;
     }
   else if (m_txFormat == UL_MU_TX)
     {
@@ -205,10 +205,9 @@
               return SU_TX;
             }
 
-          WifiMacQueueItem::ConstIterator queueIt;
           Ptr<WifiMacQueueItem> mpdu = m_apMac->GetQosTxop (AC_BE)->GetNextMpdu (peeked, m_txParams,
                                                                                  m_availableTime,
-                                                                                 m_initialFrame, queueIt);
+                                                                                 m_initialFrame);
           if (mpdu == 0)
             {
               NS_LOG_DEBUG ("Not enough time to send frames to all the stations");
@@ -216,7 +215,7 @@
             }
 
           std::vector<Ptr<WifiMacQueueItem>> mpduList;
-          mpduList = m_heFem->GetMpduAggregator ()->GetNextAmpdu (mpdu, m_txParams, m_availableTime, queueIt);
+          mpduList = m_heFem->GetMpduAggregator ()->GetNextAmpdu (mpdu, m_txParams, m_availableTime);
 
           if (mpduList.size () > 1)
             {
@@ -250,7 +249,7 @@
 
   uint16_t bw = m_apMac->GetWifiPhy ()->GetChannelWidth ();
 
-  m_txVector.SetPreambleType (WIFI_PREAMBLE_HE_MU);  
+  m_txVector.SetPreambleType (WIFI_PREAMBLE_HE_MU);
   m_txVector.SetChannelWidth (bw);
   m_txVector.SetGuardInterval (m_apMac->GetHeConfiguration ()->GetGuardInterval ().GetNanoSeconds ());
   m_txVector.SetTxPowerLevel (GetWifiRemoteStationManager ()->GetDefaultTxPowerLevel ());
@@ -303,7 +302,7 @@
 TestMultiUserScheduler::ComputeUlMuInfo (void)
 {
   NS_LOG_FUNCTION (this);
-  return UlMuInfo {m_trigger, m_tbPpduDuration, std::move (m_txParams)};
+  return UlMuInfo {m_trigger, m_triggerHdr, std::move (m_txParams)};
 }
 
 
@@ -315,7 +314,7 @@
  *
  * Run this test with:
  *
- * NS_LOG="WifiMacOfdmaTestSuite=info|prefix_time|prefix_node" ./waf --run "test-runner --suite=wifi-mac-ofdma"
+ * NS_LOG="WifiMacOfdmaTestSuite=info|prefix_time|prefix_node" ./ns3 run "test-runner --suite=wifi-mac-ofdma"
  *
  * to print the list of transmitted frames only, along with the TX time and the
  * node prefix. Replace 'info' with 'debug' if you want to print the debug messages
@@ -479,14 +478,14 @@
   if (txVector.GetPreambleType () == WIFI_PREAMBLE_HE_MU)
     {
       auto dev = DynamicCast<WifiNetDevice> (m_apDevice);
-      Ptr<WifiMacQueue> queue = DynamicCast<RegularWifiMac> (dev->GetMac ())->GetQosTxop (AC_BE)->GetWifiMacQueue ();
+      Ptr<WifiMacQueue> queue = dev->GetMac ()->GetQosTxop (AC_BE)->GetWifiMacQueue ();
       m_flushed = 0;
       for (auto it = queue->begin (); it != queue->end (); )
         {
           auto tmp = it++;
           if (!(*tmp)->IsInFlight ())
             {
-              queue->Remove (tmp);
+              queue->Remove (*tmp, false);
               m_flushed++;
             }
         }
@@ -502,7 +501,7 @@
 
           if (dev->GetAddress () == sender)
             {
-              Ptr<QosTxop> qosTxop = DynamicCast<RegularWifiMac> (dev->GetMac ())->GetQosTxop (AC_BE);
+              Ptr<QosTxop> qosTxop = dev->GetMac ()->GetQosTxop (AC_BE);
 
               if (m_muEdcaParameterSet.muTimer > 0 && m_muEdcaParameterSet.muAifsn > 0)
                 {
@@ -589,11 +588,11 @@
       uint8_t tid = hdr.GetQosTid ();
       if (tid == 0)
         {
-          NS_TEST_EXPECT_MSG_GT (hdr.GetQosQueueSize (), 0, "Expected a non null queue size for TID " << +tid);
+          NS_TEST_EXPECT_MSG_GT (+hdr.GetQosQueueSize (), 0, "Expected a non null queue size for TID " << +tid);
         }
       else
         {
-          NS_TEST_EXPECT_MSG_EQ (hdr.GetQosQueueSize (), 0, "Expected a null queue size for TID " << +tid);
+          NS_TEST_EXPECT_MSG_EQ (+hdr.GetQosQueueSize (), 0, "Expected a null queue size for TID " << +tid);
         }
     }
   tEnd = m_txPsdus[0].endTx;
@@ -615,11 +614,11 @@
       uint8_t tid = hdr.GetQosTid ();
       if (tid == 0)
         {
-          NS_TEST_EXPECT_MSG_GT (hdr.GetQosQueueSize (), 0, "Expected a non null queue size for TID " << +tid);
+          NS_TEST_EXPECT_MSG_GT (+hdr.GetQosQueueSize (), 0, "Expected a non null queue size for TID " << +tid);
         }
       else
         {
-          NS_TEST_EXPECT_MSG_EQ (hdr.GetQosQueueSize (), 0, "Expected a null queue size for TID " << +tid);
+          NS_TEST_EXPECT_MSG_EQ (+hdr.GetQosQueueSize (), 0, "Expected a null queue size for TID " << +tid);
         }
     }
   tStart = m_txPsdus[2].startTx;
@@ -639,11 +638,11 @@
       uint8_t tid = hdr.GetQosTid ();
       if (tid == 0)
         {
-          NS_TEST_EXPECT_MSG_GT (hdr.GetQosQueueSize (), 0, "Expected a non null queue size for TID " << +tid);
+          NS_TEST_EXPECT_MSG_GT (+hdr.GetQosQueueSize (), 0, "Expected a non null queue size for TID " << +tid);
         }
       else
         {
-          NS_TEST_EXPECT_MSG_EQ (hdr.GetQosQueueSize (), 0, "Expected a null queue size for TID " << +tid);
+          NS_TEST_EXPECT_MSG_EQ (+hdr.GetQosQueueSize (), 0, "Expected a null queue size for TID " << +tid);
         }
     }
   tStart = m_txPsdus[3].startTx;
@@ -663,11 +662,11 @@
       uint8_t tid = hdr.GetQosTid ();
       if (tid == 0)
         {
-          NS_TEST_EXPECT_MSG_GT (hdr.GetQosQueueSize (), 0, "Expected a non null queue size for TID " << +tid);
+          NS_TEST_EXPECT_MSG_GT (+hdr.GetQosQueueSize (), 0, "Expected a non null queue size for TID " << +tid);
         }
       else
         {
-          NS_TEST_EXPECT_MSG_EQ (hdr.GetQosQueueSize (), 0, "Expected a null queue size for TID " << +tid);
+          NS_TEST_EXPECT_MSG_EQ (+hdr.GetQosQueueSize (), 0, "Expected a null queue size for TID " << +tid);
         }
     }
   tStart = m_txPsdus[4].startTx;
@@ -835,7 +834,7 @@
       tStart = m_txPsdus[13].startTx;
       NS_TEST_EXPECT_MSG_LT (tEnd + sifs, tStart, "First Block Ack Request sent too early");
       NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance, "First Block Ack Request sent too late");
-      
+
       // A second STA sends a Block Ack a SIFS after the reception of the Block Ack Request
       NS_TEST_EXPECT_MSG_EQ ((m_txPsdus[14].psduMap.size () == 1
                               && m_txPsdus[14].psduMap[SU_STA_ID]->GetHeader (0).IsBlockAck ()),
@@ -853,7 +852,7 @@
       tStart = m_txPsdus[15].startTx;
       NS_TEST_EXPECT_MSG_LT (tEnd + sifs, tStart, "Second Block Ack Request sent too early");
       NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance, "Second Block Ack Request sent too late");
-      
+
       // A third STA sends a Block Ack a SIFS after the reception of the Block Ack Request
       NS_TEST_EXPECT_MSG_EQ ((m_txPsdus[16].psduMap.size () == 1
                               && m_txPsdus[16].psduMap[SU_STA_ID]->GetHeader (0).IsBlockAck ()),
@@ -871,7 +870,7 @@
       tStart = m_txPsdus[17].startTx;
       NS_TEST_EXPECT_MSG_LT (tEnd + sifs, tStart, "Third Block Ack Request sent too early");
       NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance, "Third Block Ack Request sent too late");
-      
+
       // A fourth STA sends a Block Ack a SIFS after the reception of the Block Ack Request
       NS_TEST_EXPECT_MSG_EQ ((m_txPsdus[18].psduMap.size () == 1
                               && m_txPsdus[18].psduMap[SU_STA_ID]->GetHeader (0).IsBlockAck ()),
@@ -1092,8 +1091,8 @@
 OfdmaAckSequenceTest::DoRun (void)
 {
   RngSeedManager::SetSeed (1);
-  RngSeedManager::SetRun (2);
-  int64_t streamNumber = 100;
+  RngSeedManager::SetRun (1);
+  int64_t streamNumber = 20;
 
   NodeContainer wifiApNode;
   wifiApNode.Create (1);
@@ -1114,21 +1113,20 @@
   switch (m_channelWidth)
     {
       case 20:
-        phy.Set ("ChannelNumber", UintegerValue (36));
+        phy.Set ("ChannelSettings", StringValue ("{36, 20, BAND_5GHZ, 0}"));
         break;
       case 40:
-        phy.Set ("ChannelNumber", UintegerValue (38));
+        phy.Set ("ChannelSettings", StringValue ("{38, 40, BAND_5GHZ, 0}"));
         break;
       case 80:
-        phy.Set ("ChannelNumber", UintegerValue (42));
+        phy.Set ("ChannelSettings", StringValue ("{42, 80, BAND_5GHZ, 0}"));
         break;
       case 160:
-        phy.Set ("ChannelNumber", UintegerValue (50));
+        phy.Set ("ChannelSettings", StringValue ("{50, 160, BAND_5GHZ, 0}"));
         break;
       default:
         NS_ABORT_MSG ("Invalid channel bandwidth (must be 20, 40, 80 or 160)");
     }
-  phy.Set ("ChannelWidth", UintegerValue (m_channelWidth));
 
   Config::SetDefault ("ns3::HeConfiguration::MuBeAifsn",
                       UintegerValue (m_muEdcaParameterSet.muAifsn));
@@ -1150,7 +1148,7 @@
   Config::SetDefault ("ns3::WifiMacQueue::MaxDelay", TimeValue (Seconds (2)));
 
   WifiHelper wifi;
-  wifi.SetStandard (WIFI_STANDARD_80211ax_5GHZ);
+  wifi.SetStandard (WIFI_STANDARD_80211ax);
   wifi.SetRemoteStationManager ("ns3::IdealWifiManager");
 
   WifiMacHelper mac;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/test/wifi-phy-ofdma-test.cc ns-3.36/src/wifi/test/wifi-phy-ofdma-test.cc
--- ns-3.35/src/wifi/test/wifi-phy-ofdma-test.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/test/wifi-phy-ofdma-test.cc	2022-04-30 18:23:58.222735200 -0700
@@ -23,6 +23,8 @@
 #include "ns3/node.h"
 #include "ns3/pointer.h"
 #include "ns3/string.h"
+#include "ns3/double.h"
+#include "ns3/boolean.h"
 #include "ns3/simulator.h"
 #include "ns3/rng-seed-manager.h"
 #include "ns3/constant-position-mobility-model.h"
@@ -499,13 +501,13 @@
     {
       NS_ASSERT_MSG (false, "Unsupported channel width");
     }
-  
+
   HeRu::RuSpec ru1 (ruType, 1, true);
   txVector.SetRu (ru1, rxStaId1);
   txVector.SetMode (HePhy::GetHeMcs7 (), rxStaId1);
   txVector.SetNss (1, rxStaId1);
 
-  HeRu::RuSpec ru2 (ruType, (m_channelWidth == 160 ? 1 : 2), (m_channelWidth == 160 ? false : true));
+  HeRu::RuSpec ru2 (ruType, (m_channelWidth == 160 ? 1 : 2), m_channelWidth != 160);
   txVector.SetRu (ru2, rxStaId2);
   txVector.SetMode (HePhy::GetHeMcs9 (), rxStaId2);
   txVector.SetNss (1, rxStaId2);
@@ -650,12 +652,12 @@
   spectrumChannel->AddPropagationLossModel (lossModel);
   Ptr<ConstantSpeedPropagationDelayModel> delayModel = CreateObject<ConstantSpeedPropagationDelayModel> ();
   spectrumChannel->SetPropagationDelayModel (delayModel);
-  
+
   Ptr<Node> apNode = CreateObject<Node> ();
   Ptr<WifiNetDevice> apDev = CreateObject<WifiNetDevice> ();
   m_phyAp = CreateObject<SpectrumWifiPhy> ();
   m_phyAp->CreateWifiSpectrumPhyInterface (apDev);
-  m_phyAp->ConfigureStandardAndBand (WIFI_PHY_STANDARD_80211ax, WIFI_PHY_BAND_5GHZ);
+  m_phyAp->ConfigureStandard (WIFI_STANDARD_80211ax);
   Ptr<ErrorRateModel> error = CreateObject<NistErrorRateModel> ();
   m_phyAp->SetErrorRateModel (error);
   m_phyAp->SetDevice (apDev);
@@ -670,7 +672,7 @@
   Ptr<WifiNetDevice> sta1Dev = CreateObject<WifiNetDevice> ();
   m_phySta1 = CreateObject<OfdmaSpectrumWifiPhy> (1);
   m_phySta1->CreateWifiSpectrumPhyInterface (sta1Dev);
-  m_phySta1->ConfigureStandardAndBand (WIFI_PHY_STANDARD_80211ax, WIFI_PHY_BAND_5GHZ);
+  m_phySta1->ConfigureStandard (WIFI_STANDARD_80211ax);
   m_phySta1->SetErrorRateModel (error);
   m_phySta1->SetDevice (sta1Dev);
   m_phySta1->SetChannel (spectrumChannel);
@@ -686,7 +688,7 @@
   Ptr<WifiNetDevice> sta2Dev = CreateObject<WifiNetDevice> ();
   m_phySta2 = CreateObject<OfdmaSpectrumWifiPhy> (2);
   m_phySta2->CreateWifiSpectrumPhyInterface (sta2Dev);
-  m_phySta2->ConfigureStandardAndBand (WIFI_PHY_STANDARD_80211ax, WIFI_PHY_BAND_5GHZ);
+  m_phySta2->ConfigureStandard (WIFI_STANDARD_80211ax);
   m_phySta2->SetErrorRateModel (error);
   m_phySta2->SetDevice (sta2Dev);
   m_phySta2->SetChannel (spectrumChannel);
@@ -702,7 +704,7 @@
   Ptr<WifiNetDevice> sta3Dev = CreateObject<WifiNetDevice> ();
   m_phySta3 = CreateObject<OfdmaSpectrumWifiPhy> (3);
   m_phySta3->CreateWifiSpectrumPhyInterface (sta3Dev);
-  m_phySta3->ConfigureStandardAndBand (WIFI_PHY_STANDARD_80211ax, WIFI_PHY_BAND_5GHZ);
+  m_phySta3->ConfigureStandard (WIFI_STANDARD_80211ax);
   m_phySta3->SetErrorRateModel (error);
   m_phySta3->SetDevice (sta3Dev);
   m_phySta3->SetChannel (spectrumChannel);
@@ -749,17 +751,18 @@
   m_phySta2->AssignStreams (streamNumber);
   m_phySta3->AssignStreams (streamNumber);
 
-  m_phyAp->SetFrequency (m_frequency);
-  m_phyAp->SetChannelWidth (m_channelWidth);
-
-  m_phySta1->SetFrequency (m_frequency);
-  m_phySta1->SetChannelWidth (m_channelWidth);
-
-  m_phySta2->SetFrequency (m_frequency);
-  m_phySta2->SetChannelWidth (m_channelWidth);
-
-  m_phySta3->SetFrequency (m_frequency);
-  m_phySta3->SetChannelWidth (m_channelWidth);
+  auto channelNum = std::get<0> (*WifiPhyOperatingChannel::FindFirst (0, m_frequency, m_channelWidth,
+                                                                      WIFI_STANDARD_80211ax,
+                                                                      WIFI_PHY_BAND_5GHZ));
+
+  m_phyAp->SetOperatingChannel (WifiPhy::ChannelTuple {channelNum, m_channelWidth,
+                                                       (int)(WIFI_PHY_BAND_5GHZ), 0});
+  m_phySta1->SetOperatingChannel (WifiPhy::ChannelTuple {channelNum, m_channelWidth,
+                                                         (int)(WIFI_PHY_BAND_5GHZ), 0});
+  m_phySta2->SetOperatingChannel (WifiPhy::ChannelTuple {channelNum, m_channelWidth,
+                                                         (int)(WIFI_PHY_BAND_5GHZ), 0});
+  m_phySta3->SetOperatingChannel (WifiPhy::ChannelTuple {channelNum, m_channelWidth,
+                                                         (int)(WIFI_PHY_BAND_5GHZ), 0});
 
   Simulator::Schedule (Seconds (0.5), &TestDlOfdmaPhyTransmission::ResetResults, this);
 
@@ -1040,11 +1043,15 @@
   Ptr<WifiNetDevice> apDev = CreateObject<WifiNetDevice> ();
   m_phyAp = CreateObject<OfdmaSpectrumWifiPhy> (0);
   m_phyAp->CreateWifiSpectrumPhyInterface (apDev);
-  m_phyAp->ConfigureStandardAndBand (WIFI_PHY_STANDARD_80211ax, WIFI_PHY_BAND_5GHZ);
+  m_phyAp->ConfigureStandard (WIFI_STANDARD_80211ax);
   Ptr<ErrorRateModel> error = CreateObject<NistErrorRateModel> ();
   m_phyAp->SetErrorRateModel (error);
-  m_phyAp->SetFrequency (DEFAULT_FREQUENCY);
-  m_phyAp->SetChannelWidth (DEFAULT_CHANNEL_WIDTH);
+  auto channelNum = std::get<0> (*WifiPhyOperatingChannel::FindFirst (0, DEFAULT_FREQUENCY,
+                                                                      DEFAULT_CHANNEL_WIDTH,
+                                                                      WIFI_STANDARD_80211ax,
+                                                                      WIFI_PHY_BAND_5GHZ));
+  m_phyAp->SetOperatingChannel (WifiPhy::ChannelTuple {channelNum, DEFAULT_CHANNEL_WIDTH,
+                                                       (int)(WIFI_PHY_BAND_5GHZ), 0});
   m_phyAp->SetDevice (apDev);
   m_phyAp->SetChannel (spectrumChannel);
   m_phyAp->TraceConnectWithoutContext ("TxPpduUid", MakeCallback (&TestUlOfdmaPpduUid::TxPpduAp, this));
@@ -1058,10 +1065,10 @@
   Ptr<WifiNetDevice> sta1Dev = CreateObject<WifiNetDevice> ();
   m_phySta1 = CreateObject<OfdmaSpectrumWifiPhy> (1);
   m_phySta1->CreateWifiSpectrumPhyInterface (sta1Dev);
-  m_phySta1->ConfigureStandardAndBand (WIFI_PHY_STANDARD_80211ax, WIFI_PHY_BAND_5GHZ);
+  m_phySta1->ConfigureStandard (WIFI_STANDARD_80211ax);
   m_phySta1->SetErrorRateModel (error);
-  m_phySta1->SetFrequency (DEFAULT_FREQUENCY);
-  m_phySta1->SetChannelWidth (DEFAULT_CHANNEL_WIDTH);
+  m_phySta1->SetOperatingChannel (WifiPhy::ChannelTuple {channelNum, DEFAULT_CHANNEL_WIDTH,
+                                                         (int)(WIFI_PHY_BAND_5GHZ), 0});
   m_phySta1->SetDevice (sta1Dev);
   m_phySta1->SetChannel (spectrumChannel);
   m_phySta1->TraceConnectWithoutContext ("TxPpduUid", MakeCallback (&TestUlOfdmaPpduUid::TxPpduSta1, this));
@@ -1075,10 +1082,10 @@
   Ptr<WifiNetDevice> sta2Dev = CreateObject<WifiNetDevice> ();
   m_phySta2 = CreateObject<OfdmaSpectrumWifiPhy> (2);
   m_phySta2->CreateWifiSpectrumPhyInterface (sta2Dev);
-  m_phySta2->ConfigureStandardAndBand (WIFI_PHY_STANDARD_80211ax, WIFI_PHY_BAND_5GHZ);
+  m_phySta2->ConfigureStandard (WIFI_STANDARD_80211ax);
   m_phySta2->SetErrorRateModel (error);
-  m_phySta2->SetFrequency (DEFAULT_FREQUENCY);
-  m_phySta2->SetChannelWidth (DEFAULT_CHANNEL_WIDTH);
+  m_phySta2->SetOperatingChannel (WifiPhy::ChannelTuple {channelNum, DEFAULT_CHANNEL_WIDTH,
+                                                         (int)(WIFI_PHY_BAND_5GHZ), 0});
   m_phySta2->SetDevice (sta2Dev);
   m_phySta2->SetChannel (spectrumChannel);
   m_phySta2->TraceConnectWithoutContext ("TxPpduUid", MakeCallback (&TestUlOfdmaPpduUid::TxPpduSta2, this));
@@ -1237,8 +1244,8 @@
                                                      m_phySta1->GetPhyBand (), rxStaId2);
   Time txDuration = std::max (txDuration1, txDuration2);
 
-  txVector1.SetLength (HePhy::ConvertHeTbPpduDurationToLSigLength (txDuration, m_phySta1->GetPhyBand ()));
-  txVector2.SetLength (HePhy::ConvertHeTbPpduDurationToLSigLength (txDuration, m_phySta2->GetPhyBand ()));
+  txVector1.SetLength (HePhy::ConvertHeTbPpduDurationToLSigLength (txDuration, txVector1, m_phySta1->GetPhyBand ()).first);
+  txVector2.SetLength (HePhy::ConvertHeTbPpduDurationToLSigLength (txDuration, txVector2, m_phySta2->GetPhyBand ()).first);
 
   m_phySta1->Send (psdus1, txVector1);
   m_phySta2->Send (psdus2, txVector2);
@@ -1385,11 +1392,13 @@
   Ptr<OfdmaSpectrumWifiPhy> m_phy; ///< Phy
 
   uint64_t m_totalBytesDropped; ///< total number of dropped bytes
+  WifiTxVector m_trigVector;    ///< TRIGVECTOR
 };
 
 TestMultipleHeTbPreambles::TestMultipleHeTbPreambles ()
   : TestCase ("UL-OFDMA multiple RX events test"),
-    m_totalBytesDropped (0)
+    m_totalBytesDropped (0),
+    m_trigVector (HePhy::GetHeMcs7 (), 0, WIFI_PREAMBLE_HE_TB, 800, 1, 1, 0, DEFAULT_CHANNEL_WIDTH, false, false)
 {
 }
 
@@ -1404,6 +1413,7 @@
   m_totalBytesDropped = 0;
   //We have to reset PHY here since we do not trigger OFDMA payload RX event in this test
   m_phy->Reset ();
+  m_trigVector.GetHeMuUserInfoMap ().clear ();
 }
 
 void
@@ -1445,6 +1455,8 @@
   txVector.SetMode (HePhy::GetHeMcs7 (), staId);
   txVector.SetNss (1, staId);
 
+  m_trigVector.GetHeMuUserInfoMap ().insert ({staId, HeMuUserInfo {ru, HePhy::GetHeMcs7 (), 1}});
+
   Ptr<Packet> pkt = Create<Packet> (payloadSize);
   WifiMacHeader hdr;
   hdr.SetType (WIFI_MAC_QOSDATA);
@@ -1456,7 +1468,7 @@
 
   Time ppduDuration = m_phy->CalculateTxDuration (psdu->GetSize (), txVector, m_phy->GetPhyBand (), staId);
   Ptr<HePpdu> ppdu = Create<HePpdu> (psdus, txVector, ppduDuration, WIFI_PHY_BAND_5GHZ, uid,
-                                     HePpdu::PSD_HE_TB_NON_OFDMA_PORTION);
+                                     HePpdu::PSD_HE_TB_NON_OFDMA_PORTION, 0);
 
   //Send non-OFDMA part
   Time nonOfdmaDuration = m_phy->GetHePhy ()->CalculateNonOfdmaDurationForHeTb (txVector);
@@ -1470,6 +1482,12 @@
   rxParams->duration = nonOfdmaDuration;
   rxParams->ppdu = ppdu;
 
+  uint16_t length;
+  std::tie (length, ppduDuration) = HePhy::ConvertHeTbPpduDurationToLSigLength (ppduDuration, txVector, m_phy->GetPhyBand ());
+  txVector.SetLength (length);
+  m_trigVector.SetLength (length);
+  auto hePhy = DynamicCast<HePhy> (m_phy->GetPhyEntity (WIFI_MOD_CLASS_HE));
+  hePhy->SetTrigVector (m_trigVector, ppduDuration);
   m_phy->StartRx (rxParams);
 
   //Schedule OFDMA part
@@ -1504,15 +1522,14 @@
 {
   Ptr<WifiNetDevice> dev = CreateObject<WifiNetDevice> ();
   m_phy = CreateObject<OfdmaSpectrumWifiPhy> (0);
-  m_phy->ConfigureStandardAndBand (WIFI_PHY_STANDARD_80211ax, WIFI_PHY_BAND_5GHZ);
+  m_phy->ConfigureStandard (WIFI_STANDARD_80211ax);
   Ptr<ErrorRateModel> error = CreateObject<NistErrorRateModel> ();
   Ptr<ApWifiMac> mac = CreateObject<ApWifiMac> ();
   mac->SetAttribute ("BeaconGeneration", BooleanValue (false));
   dev->SetMac (mac);
   m_phy->SetErrorRateModel (error);
-  m_phy->SetChannelNumber (DEFAULT_CHANNEL_NUMBER);
-  m_phy->SetFrequency (DEFAULT_FREQUENCY);
-  m_phy->SetChannelWidth (DEFAULT_CHANNEL_WIDTH);
+  m_phy->SetOperatingChannel (WifiPhy::ChannelTuple {DEFAULT_CHANNEL_NUMBER, DEFAULT_CHANNEL_WIDTH,
+                                                     (int)(WIFI_PHY_BAND_5GHZ), 0});
   m_phy->TraceConnectWithoutContext ("PhyRxDrop", MakeCallback (&TestMultipleHeTbPreambles::RxDropped, this));
   m_phy->SetDevice (dev);
   Ptr<ThresholdPreambleDetectionModel> preambleDetectionModel = CreateObject<ThresholdPreambleDetectionModel> ();
@@ -1608,16 +1625,14 @@
 
   {
     //Verify the correct reception of a single UL MU transmission with two stations belonging to the same BSS,
-    //and the second PPDU arrives 500ns after the first PPDU, i.e. it exceeds the delay spread of 400ns
+    //and the second PPDU arrives 500ns after the first PPDU
     std::vector<uint64_t> uids {9};
     Simulator::Schedule (Seconds (6), &TestMultipleHeTbPreambles::RxHeTbPpdu, this, uids[0], 1, txPowerWatts, 1001);
     Simulator::Schedule (Seconds (6) + NanoSeconds (500), &TestMultipleHeTbPreambles::RxHeTbPpdu, this, uids[0], 2, txPowerWatts, 1002);
     //Check that we received a single UL MU transmission with the corresponding UID
     Simulator::Schedule (Seconds (6.0) + MicroSeconds (1), &TestMultipleHeTbPreambles::CheckHeTbPreambles, this, 1, uids);
-    //The first packet of 1001 bytes should be dropped because preamble is not detected after 4us (because the PPDU that arrived at 500ns is interfering):
-    //the second HE TB PPDU is acting as interference since it arrived after the maximum allowed 400ns.
-    //Obviously, that second packet of 1002 bytes is dropped as well.
-    Simulator::Schedule (Seconds (6.0) + MicroSeconds (5), &TestMultipleHeTbPreambles::CheckBytesDropped, this, 1001 + 1002);
+    //No packet is dropped (we check after 5us to verify that PD is successful)
+    Simulator::Schedule (Seconds (6.0) + MicroSeconds (5), &TestMultipleHeTbPreambles::CheckBytesDropped, this, 0);
     Simulator::Schedule (Seconds (6.5), &TestMultipleHeTbPreambles::Reset, this);
   }
 
@@ -1634,6 +1649,19 @@
 class TestUlOfdmaPhyTransmission : public TestCase
 {
 public:
+  /**
+   * Erroneous info included in a TRIGVECTOR
+   */
+  enum TrigVectorInfo
+  {
+    NONE = 0,
+    CHANNEL_WIDTH,
+    UL_LENGTH,
+    AID,
+    RU_TYPE,
+    MCS
+  };
+
   TestUlOfdmaPhyTransmission ();
   virtual ~TestUlOfdmaPhyTransmission ();
 
@@ -1651,6 +1679,13 @@
    */
   WifiTxVector GetTxVectorForHeTbPpdu (uint16_t txStaId, std::size_t index, uint8_t bssColor) const;
   /**
+   * Set TRIGVECTOR for HE TB PPDU
+   *
+   * \param bssColor the BSS color of the TX STA
+   * \param error the erroneous info (if any) in the TRIGVECTOR to set
+   */
+  void SetTrigVector (uint8_t bssColor, TrigVectorInfo error);
+  /**
    * Send HE TB PPDU function
    * \param txStaId the ID of the TX STA
    * \param index the RU index used for the transmission
@@ -1779,11 +1814,13 @@
    * \param expectedBytesFromSta2 the expected number of bytes from STA 2
    * \param scheduleTxSta1 flag indicating to schedule a HE TB PPDU from STA 1
    * \param expectedStateBeforeEnd the expected state of the PHY before the end of the transmission
+   * \param error the erroneous info (if any) in the TRIGVECTOR to set
    */
   void ScheduleTest (Time delay, bool solicited, WifiPhyState expectedStateAtEnd,
                      uint32_t expectedSuccessFromSta1, uint32_t expectedFailuresFromSta1, uint32_t expectedBytesFromSta1,
                      uint32_t expectedSuccessFromSta2, uint32_t expectedFailuresFromSta2, uint32_t expectedBytesFromSta2,
-                     bool scheduleTxSta1 = true, WifiPhyState expectedStateBeforeEnd = WifiPhyState::RX);
+                     bool scheduleTxSta1 = true, WifiPhyState expectedStateBeforeEnd = WifiPhyState::RX,
+                     TrigVectorInfo error = NONE);
 
   /**
    * Schedule power measurement related checks.
@@ -1919,6 +1956,69 @@
 }
 
 void
+TestUlOfdmaPhyTransmission::SetTrigVector (uint8_t bssColor, TrigVectorInfo error)
+{
+  uint16_t channelWidth = m_channelWidth;
+  if (error == CHANNEL_WIDTH)
+    {
+      channelWidth = (channelWidth == 160 ? 20 : channelWidth * 2);
+    }
+
+  WifiTxVector txVector (HePhy::GetHeMcs7 (), 0, WIFI_PREAMBLE_HE_TB, 800, 1, 1, 0,
+                         channelWidth, false, false, false, bssColor);
+
+  HeRu::RuType ruType = HeRu::RU_106_TONE;
+  if (channelWidth == 20)
+    {
+      ruType = (error == RU_TYPE ? HeRu::RU_52_TONE : HeRu::RU_106_TONE);
+    }
+  else if (channelWidth == 40)
+    {
+      ruType = (error == RU_TYPE ? HeRu::RU_106_TONE : HeRu::RU_242_TONE);
+    }
+  else if (channelWidth == 80)
+    {
+      ruType = (error == RU_TYPE ? HeRu::RU_242_TONE : HeRu::RU_484_TONE);
+    }
+  else if (channelWidth == 160)
+    {
+      ruType = (error == RU_TYPE ? HeRu::RU_484_TONE : HeRu::RU_996_TONE);
+    }
+  else
+    {
+      NS_ASSERT_MSG (false, "Unsupported channel width");
+    }
+
+  uint16_t aid1 = (error == AID ? 3 : 1);
+  uint16_t aid2 = (error == AID ? 4 : 2);
+
+  HeRu::RuSpec ru1 (ruType, 1, true);
+  ru1.SetPhyIndex (channelWidth, 0);
+  txVector.SetRu (ru1, aid1);
+  txVector.SetMode ((error == MCS ? HePhy::GetHeMcs5 () : HePhy::GetHeMcs7 ()), aid1);
+  txVector.SetNss (1, aid1);
+
+  HeRu::RuSpec ru2 (ruType, (channelWidth == 160 ? 1 : 2),
+                    (channelWidth == 160 ? false : true));
+  ru2.SetPhyIndex (channelWidth, 0);
+  txVector.SetRu (ru2, aid2);
+  txVector.SetMode ((error == MCS ? HePhy::GetHeMcs5 () : HePhy::GetHeMcs7 ()), aid2);
+  txVector.SetNss (1, aid2);
+
+  uint16_t length;
+  std::tie (length, m_expectedPpduDuration) = HePhy::ConvertHeTbPpduDurationToLSigLength (m_expectedPpduDuration,
+                                                                                          txVector,
+                                                                                          m_phyAp->GetPhyBand ());
+  if (error == UL_LENGTH)
+    {
+      ++length;
+    }
+  txVector.SetLength (length);
+  auto hePhyAp = DynamicCast<HePhy> (m_phyAp->GetPhyEntity (WIFI_MOD_CLASS_HE));
+  hePhyAp->SetTrigVector (txVector, m_expectedPpduDuration);
+}
+
+void
 TestUlOfdmaPhyTransmission::SendHeTbPpdu (uint16_t txStaId, std::size_t index, std::size_t payloadSize, uint64_t uid, uint8_t bssColor)
 {
   NS_LOG_FUNCTION (this << txStaId << index << payloadSize << uid << +bssColor);
@@ -1952,7 +2052,7 @@
     }
 
   Time txDuration = phy->CalculateTxDuration (psdu->GetSize (), txVector, phy->GetPhyBand (), txStaId);
-  txVector.SetLength (HePhy::ConvertHeTbPpduDurationToLSigLength (txDuration, phy->GetPhyBand ()));
+  txVector.SetLength (HePhy::ConvertHeTbPpduDurationToLSigLength (txDuration, txVector, phy->GetPhyBand ()).first);
 
   phy->SetPpduUid (uid);
   phy->Send (psdus, txVector);
@@ -2125,19 +2225,20 @@
   spectrumChannel->AddPropagationLossModel (lossModel);
   Ptr<ConstantSpeedPropagationDelayModel> delayModel = CreateObject<ConstantSpeedPropagationDelayModel> ();
   spectrumChannel->SetPropagationDelayModel (delayModel);
-  
+
   Ptr<ThresholdPreambleDetectionModel> preambleDetectionModel = CreateObject<ThresholdPreambleDetectionModel> ();
   preambleDetectionModel->SetAttribute ("MinimumRssi", DoubleValue (-8)); //to ensure that transmission in neighboring channel is ignored (16 dBm baseline)
   preambleDetectionModel->SetAttribute ("Threshold", DoubleValue (-100)); //no limit on SNR
 
   Ptr<Node> apNode = CreateObject<Node> ();
   Ptr<WifiNetDevice> apDev = CreateObject<WifiNetDevice> ();
+  apDev->SetStandard (WIFI_STANDARD_80211ax);
   Ptr<ApWifiMac> apMac = CreateObject<ApWifiMac> ();
   apMac->SetAttribute ("BeaconGeneration", BooleanValue (false));
   apDev->SetMac (apMac);
   m_phyAp = CreateObject<OfdmaSpectrumWifiPhy> (0);
   m_phyAp->CreateWifiSpectrumPhyInterface (apDev);
-  m_phyAp->ConfigureStandardAndBand (WIFI_PHY_STANDARD_80211ax, WIFI_PHY_BAND_5GHZ);
+  m_phyAp->ConfigureStandard (WIFI_STANDARD_80211ax);
   Ptr<HeConfiguration> heConfiguration = CreateObject<HeConfiguration> ();
   apDev->SetHeConfiguration (heConfiguration);
   Ptr<ErrorRateModel> error = CreateObject<NistErrorRateModel> ();
@@ -2157,7 +2258,7 @@
   Ptr<WifiNetDevice> sta1Dev = CreateObject<WifiNetDevice> ();
   m_phySta1 = CreateObject<OfdmaSpectrumWifiPhy> (1);
   m_phySta1->CreateWifiSpectrumPhyInterface (sta1Dev);
-  m_phySta1->ConfigureStandardAndBand (WIFI_PHY_STANDARD_80211ax, WIFI_PHY_BAND_5GHZ);
+  m_phySta1->ConfigureStandard (WIFI_STANDARD_80211ax);
   m_phySta1->SetErrorRateModel (error);
   m_phySta1->SetDevice (sta1Dev);
   m_phySta1->SetChannel (spectrumChannel);
@@ -2172,7 +2273,7 @@
   Ptr<WifiNetDevice> sta2Dev = CreateObject<WifiNetDevice> ();
   m_phySta2 = CreateObject<OfdmaSpectrumWifiPhy> (2);
   m_phySta2->CreateWifiSpectrumPhyInterface (sta2Dev);
-  m_phySta2->ConfigureStandardAndBand (WIFI_PHY_STANDARD_80211ax, WIFI_PHY_BAND_5GHZ);
+  m_phySta2->ConfigureStandard (WIFI_STANDARD_80211ax);
   m_phySta2->SetErrorRateModel (error);
   m_phySta2->SetDevice (sta2Dev);
   m_phySta2->SetChannel (spectrumChannel);
@@ -2187,7 +2288,7 @@
   Ptr<WifiNetDevice> sta3Dev = CreateObject<WifiNetDevice> ();
   m_phySta3 = CreateObject<OfdmaSpectrumWifiPhy> (3);
   m_phySta3->CreateWifiSpectrumPhyInterface (sta3Dev);
-  m_phySta3->ConfigureStandardAndBand (WIFI_PHY_STANDARD_80211ax, WIFI_PHY_BAND_5GHZ);
+  m_phySta3->ConfigureStandard (WIFI_STANDARD_80211ax);
   m_phySta3->SetErrorRateModel (error);
   m_phySta3->SetDevice (sta3Dev);
   m_phySta3->SetChannel (spectrumChannel);
@@ -2243,16 +2344,28 @@
 TestUlOfdmaPhyTransmission::ScheduleTest (Time delay, bool solicited, WifiPhyState expectedStateAtEnd,
                                           uint32_t expectedSuccessFromSta1, uint32_t expectedFailuresFromSta1, uint32_t expectedBytesFromSta1,
                                           uint32_t expectedSuccessFromSta2, uint32_t expectedFailuresFromSta2, uint32_t expectedBytesFromSta2,
-                                          bool scheduleTxSta1, WifiPhyState expectedStateBeforeEnd)
+                                          bool scheduleTxSta1, WifiPhyState expectedStateBeforeEnd,
+                                          TrigVectorInfo error)
 {
-  //AP send SU packet with UID = 0 (2) to mimic transmission of solicited (unsolicited) HE TB PPDUs
-  Simulator::Schedule (delay - MilliSeconds (10), &TestUlOfdmaPhyTransmission::SendHeSuPpdu, this, 0, 50, solicited ? 0 : 2, 0);
+  static uint64_t uid = 0;
+
+  //AP sends an SU packet preceding HE TB PPDUs
+  Simulator::Schedule (delay - MilliSeconds (10), &TestUlOfdmaPhyTransmission::SendHeSuPpdu, this, 0, 50, ++uid, 0);
+  if (!solicited)
+    {
+      // UID of TB PPDUs will be different than the one of the preceding frame
+      ++uid;
+    }
+  else
+    {
+      Simulator::Schedule (delay, &TestUlOfdmaPhyTransmission::SetTrigVector, this, 0, error);
+    }
   //STA1 and STA2 send MU UL PPDUs addressed to AP
   if (scheduleTxSta1)
     {
-      Simulator::Schedule (delay, &TestUlOfdmaPhyTransmission::SendHeTbPpdu, this, 1, 1, 1000, 0, 0);
+      Simulator::Schedule (delay, &TestUlOfdmaPhyTransmission::SendHeTbPpdu, this, 1, 1, 1000, uid, 0);
     }
-  Simulator::Schedule (delay, &TestUlOfdmaPhyTransmission::SendHeTbPpdu, this, 2, 2, 1001, 0, 0);
+  Simulator::Schedule (delay, &TestUlOfdmaPhyTransmission::SendHeTbPpdu, this, 2, 2, 1001, uid, 0);
 
   //Verify it takes m_expectedPpduDuration to transmit the PPDUs
   Simulator::Schedule (delay + m_expectedPpduDuration - NanoSeconds (1), &TestUlOfdmaPhyTransmission::CheckPhyState, this, m_phyAp, expectedStateBeforeEnd);
@@ -2366,17 +2479,18 @@
   m_phySta2->AssignStreams (streamNumber);
   m_phySta3->AssignStreams (streamNumber);
 
-  m_phyAp->SetFrequency (m_frequency);
-  m_phyAp->SetChannelWidth (m_channelWidth);
-
-  m_phySta1->SetFrequency (m_frequency);
-  m_phySta1->SetChannelWidth (m_channelWidth);
-
-  m_phySta2->SetFrequency (m_frequency);
-  m_phySta2->SetChannelWidth (m_channelWidth);
-
-  m_phySta3->SetFrequency (m_frequency);
-  m_phySta3->SetChannelWidth (m_channelWidth);
+  auto channelNum = std::get<0> (*WifiPhyOperatingChannel::FindFirst (0, m_frequency, m_channelWidth,
+                                                                      WIFI_STANDARD_80211ax,
+                                                                      WIFI_PHY_BAND_5GHZ));
+
+  m_phyAp->SetOperatingChannel (WifiPhy::ChannelTuple {channelNum, m_channelWidth,
+                                                       (int)(WIFI_PHY_BAND_5GHZ), 0});
+  m_phySta1->SetOperatingChannel (WifiPhy::ChannelTuple {channelNum, m_channelWidth,
+                                                         (int)(WIFI_PHY_BAND_5GHZ), 0});
+  m_phySta2->SetOperatingChannel (WifiPhy::ChannelTuple {channelNum, m_channelWidth,
+                                                         (int)(WIFI_PHY_BAND_5GHZ), 0});
+  m_phySta3->SetOperatingChannel (WifiPhy::ChannelTuple {channelNum, m_channelWidth,
+                                                         (int)(WIFI_PHY_BAND_5GHZ), 0});
 
   Time delay = Seconds (0.0);
   Simulator::Schedule (delay, &TestUlOfdmaPhyTransmission::Reset, this);
@@ -2401,13 +2515,69 @@
   delay += Seconds (1.0);
 
   //---------------------------------------------------------------------------
-  //Verify that both unsolicited HE TB PPDUs have been corrected received
+  //Verify that no unsolicited HE TB PPDU is received
   Simulator::Schedule (delay, &TestUlOfdmaPhyTransmission::LogScenario, this,
-                       "Reception of unsolicited HE TB PPDUs");
+                       "Dropping of unsolicited HE TB PPDUs");
   ScheduleTest (delay, false,
                 WifiPhyState::IDLE,
-                1, 0, 1000,  //One PSDU of 1000 bytes should have been successfully received from STA 1
-                1, 0, 1001); //One PSDU of 1001 bytes should have been successfully received from STA 2
+                0, 0, 0,  //PSDU from STA 1 is not received (no TRIGVECTOR)
+                0, 0, 0,  //PSDU from STA 2 is not received (no TRIGVECTOR)
+                true, WifiPhyState::CCA_BUSY);
+  delay += Seconds (1.0);
+
+  //---------------------------------------------------------------------------
+  //Verify that HE TB PPDUs with channel width differing from TRIGVECTOR are discarded
+  Simulator::Schedule (delay, &TestUlOfdmaPhyTransmission::LogScenario, this,
+                       "Dropping of HE TB PPDUs with channel width differing from TRIGVECTOR");
+  ScheduleTest (delay, true,
+                WifiPhyState::IDLE,
+                0, 0, 0,  //PSDU from STA 1 is not received (no TRIGVECTOR)
+                0, 0, 0,  //PSDU from STA 2 is not received (no TRIGVECTOR)
+                true, WifiPhyState::CCA_BUSY, CHANNEL_WIDTH);
+  delay += Seconds (1.0);
+
+  //---------------------------------------------------------------------------
+  //Verify that HE TB PPDUs with UL Length differing from TRIGVECTOR are discarded
+  Simulator::Schedule (delay, &TestUlOfdmaPhyTransmission::LogScenario, this,
+                       "Dropping of HE TB PPDUs with UL Length differing from TRIGVECTOR");
+  ScheduleTest (delay, true,
+                WifiPhyState::IDLE,
+                0, 0, 0,  //PSDU from STA 1 is not received (no TRIGVECTOR)
+                0, 0, 0,  //PSDU from STA 2 is not received (no TRIGVECTOR)
+                true, WifiPhyState::CCA_BUSY, UL_LENGTH);
+  delay += Seconds (1.0);
+
+  //---------------------------------------------------------------------------
+  //Verify that HE TB PPDUs with AIDs differing from TRIGVECTOR are discarded
+  Simulator::Schedule (delay, &TestUlOfdmaPhyTransmission::LogScenario, this,
+                       "Dropping of HE TB PPDUs with AIDs differing from TRIGVECTOR");
+  ScheduleTest (delay, true,
+                WifiPhyState::IDLE,
+                0, 0, 0,  //PSDU from STA 1 is not received (no TRIGVECTOR)
+                0, 0, 0,  //PSDU from STA 2 is not received (no TRIGVECTOR)
+                true, WifiPhyState::CCA_BUSY, AID);
+  delay += Seconds (1.0);
+
+  //---------------------------------------------------------------------------
+  //Verify that HE TB PPDUs with RU type differing from TRIGVECTOR are discarded
+  Simulator::Schedule (delay, &TestUlOfdmaPhyTransmission::LogScenario, this,
+                       "Dropping of HE TB PPDUs with RU type differing from TRIGVECTOR");
+  ScheduleTest (delay, true,
+                WifiPhyState::IDLE,
+                0, 0, 0,  //PSDU from STA 1 is not received (no TRIGVECTOR)
+                0, 0, 0,  //PSDU from STA 2 is not received (no TRIGVECTOR)
+                true, WifiPhyState::CCA_BUSY, RU_TYPE);
+  delay += Seconds (1.0);
+
+  //---------------------------------------------------------------------------
+  //Verify that HE TB PPDUs with MCS differing from TRIGVECTOR are discarded
+  Simulator::Schedule (delay, &TestUlOfdmaPhyTransmission::LogScenario, this,
+                       "Dropping of HE TB PPDUs with MCS differing from TRIGVECTOR");
+  ScheduleTest (delay, true,
+                WifiPhyState::IDLE,
+                0, 0, 0,  //PSDU from STA 1 is not received (no TRIGVECTOR)
+                0, 0, 0,  //PSDU from STA 2 is not received (no TRIGVECTOR)
+                true, WifiPhyState::CCA_BUSY, MCS);
   delay += Seconds (1.0);
 
   //---------------------------------------------------------------------------
@@ -2435,18 +2605,6 @@
   delay += Seconds (1.0);
 
   //---------------------------------------------------------------------------
-  //Generate an interference on RU 1 and verify that only STA 1's unsolicited HE TB PPDU has been impacted
-  Simulator::Schedule (delay, &TestUlOfdmaPhyTransmission::LogScenario, this,
-                       "Reception of unsolicited HE TB PPDUs with interference on RU 1 during PSDU reception");
-  //A strong non-wifi interference is generated on RU 1 during PSDU reception
-  Simulator::Schedule (delay + MicroSeconds (50), &TestUlOfdmaPhyTransmission::GenerateInterference, this, interferencePsdRu1, MilliSeconds (100));
-  ScheduleTest (delay, false,
-                WifiPhyState::CCA_BUSY, //PHY should move to CCA_BUSY instead of IDLE due to the interference (primary channel)
-                0, 1, 0,     //Reception of the PSDU from STA 1 should have failed (since interference occupies RU 1)
-                1, 0, 1001); //One PSDU of 1001 bytes should have been successfully received from STA 2
-  delay += Seconds (1.0);
-
-  //---------------------------------------------------------------------------
   //Generate an interference on RU 2 and verify that only STA 2's solicited HE TB PPDU has been impacted
   Simulator::Schedule (delay, &TestUlOfdmaPhyTransmission::LogScenario, this,
                        "Reception of solicited HE TB PPDUs with interference on RU 2 during PSDU reception");
@@ -2469,18 +2627,6 @@
   delay += Seconds (1.0);
 
   //---------------------------------------------------------------------------
-  //Generate an interference on RU 2 and verify that only STA 2's unsolicited HE TB PPDU has been impacted
-  Simulator::Schedule (delay, &TestUlOfdmaPhyTransmission::LogScenario, this,
-                       "Reception of unsolicited HE TB PPDUs with interference on RU 2 during PSDU reception");
-  //A strong non-wifi interference is generated on RU 2 during PSDU reception
-  Simulator::Schedule (delay + MicroSeconds (50), &TestUlOfdmaPhyTransmission::GenerateInterference, this, interferencePsdRu2, MilliSeconds (100));
-  ScheduleTest (delay, false,
-                (m_channelWidth >= 40) ? WifiPhyState::IDLE : WifiPhyState::CCA_BUSY, //PHY should move to CCA_BUSY instead of IDLE if interference on primary channel
-                1, 0, 1000, //One PSDU of 1000 bytes should have been successfully received from STA 1
-                0, 1, 0);   //Reception of the PSDU from STA 2 should have failed (since interference occupies RU 2)
-  delay += Seconds (1.0);
-
-  //---------------------------------------------------------------------------
   //Generate an interference on the full band and verify that both solicited HE TB PPDUs have been impacted
   Simulator::Schedule (delay, &TestUlOfdmaPhyTransmission::LogScenario, this,
                        "Reception of solicited HE TB PPDUs with interference on the full band during PSDU reception");
@@ -2503,18 +2649,6 @@
   delay += Seconds (1.0);
 
   //---------------------------------------------------------------------------
-  //Generate an interference on the full band and verify that both unsolicited HE TB PPDUs have been impacted
-  Simulator::Schedule (delay, &TestUlOfdmaPhyTransmission::LogScenario, this,
-                       "Reception of unsolicited HE TB PPDUs with interference on the full band during PSDU reception");
-  //A strong non-wifi interference is generated on the full band during PSDU reception
-  Simulator::Schedule (delay + MicroSeconds (50), &TestUlOfdmaPhyTransmission::GenerateInterference, this, interferencePsdAll, MilliSeconds (100));
-  ScheduleTest (delay, false,
-                WifiPhyState::CCA_BUSY, //PHY should move to CCA_BUSY instead of IDLE due to the interference
-                0, 1, 0,  //Reception of the PSDU from STA 1 should have failed (since interference occupies RU 1)
-                0, 1, 0); //Reception of the PSDU from STA 2 should have failed (since interference occupies RU 2)
-  delay += Seconds (1.0);
-
-  //---------------------------------------------------------------------------
   //Send another HE TB PPDU (of another UL MU transmission) on RU 1 and verify that both solicited HE TB PPDUs have been impacted if they are on the same
   // 20 MHz channel. Only STA 1's solicited HE TB PPDU is impacted otherwise.
   Simulator::Schedule (delay, &TestUlOfdmaPhyTransmission::LogScenario, this,
@@ -2544,19 +2678,6 @@
   delay += Seconds (1.0);
 
   //---------------------------------------------------------------------------
-  //Send another HE TB PPDU (of another UL MU transmission) on RU 1 and verify that both unsolicited HE TB PPDUs have been impacted if they are on the same
-  // 20 MHz channel. Only STA 1's unsolicited HE TB PPDU is impacted otherwise.
-  Simulator::Schedule (delay, &TestUlOfdmaPhyTransmission::LogScenario, this,
-                       "Reception of unsolicited HE TB PPDUs with another HE TB PPDU arriving on RU 1 during PSDU reception");
-  //Another HE TB PPDU arrives at AP on the same RU as STA 1 during PSDU reception
-  Simulator::Schedule (delay + MicroSeconds (50), &TestUlOfdmaPhyTransmission::SendHeTbPpdu, this, 3, 1, 1002, 1, 0);
-  ScheduleTest (delay, false,
-                WifiPhyState::CCA_BUSY, //PHY should move to CCA_BUSY instead of IDLE due to the interference on primary channel width
-                0, 1, 0,  //Reception of the PSDU from STA 1 should have failed (since interference from STA 3 on same 20 MHz channel)
-                succ, fail, bytes); //same as solicited case
-  delay += Seconds (1.0);
-
-  //---------------------------------------------------------------------------
   //Send another HE TB PPDU (of another UL MU transmission) on RU 2 and verify that both solicited HE TB PPDUs have been impacted if they are on the same
   // 20 MHz channel. Only STA 2's solicited HE TB PPDU is impacted otherwise.
   Simulator::Schedule (delay, &TestUlOfdmaPhyTransmission::LogScenario, this,
@@ -2585,19 +2706,6 @@
   delay += Seconds (1.0);
 
   //---------------------------------------------------------------------------
-  //Send another HE TB PPDU (of another UL MU transmission) on RU 2 and verify that both unsolicited HE TB PPDUs have been impacted if they are on the same
-  // 20 MHz channel. Only STA 2's unsolicited HE TB PPDU is impacted otherwise.
-  Simulator::Schedule (delay, &TestUlOfdmaPhyTransmission::LogScenario, this,
-                       "Reception of unsolicited HE TB PPDUs with another HE TB PPDU arriving on RU2 during payload reception");
-  //Another HE TB PPDU arrives at AP on the same RU as STA 2 during PSDU reception
-  Simulator::Schedule (delay + MicroSeconds (50), &TestUlOfdmaPhyTransmission::SendHeTbPpdu, this, 3, 2, 1002, 1, 0);
-  ScheduleTest (delay, false,
-                (m_channelWidth >= 40) ? WifiPhyState::IDLE : WifiPhyState::CCA_BUSY, //PHY should move to CCA_BUSY instead of IDLE if interference on primary channel
-                succ, fail, bytes, //same as solicited case
-                0, 1, 0); //Reception of the PSDU from STA 2 should have failed (since interference from STA 3 on same 20 MHz channel)
-  delay += Seconds (1.0);
-
-  //---------------------------------------------------------------------------
   //Send an HE SU PPDU during 400 ns window and verify that both solicited HE TB PPDUs have been impacted
   Simulator::Schedule (delay, &TestUlOfdmaPhyTransmission::LogScenario, this,
                        "Reception of solicited HE TB PPDUs with an HE SU PPDU arriving during the 400 ns window");
@@ -2610,24 +2718,12 @@
   delay += Seconds (1.0);
 
   //---------------------------------------------------------------------------
-  //Send an HE SU PPDU during 400 ns window and verify that both solicited HE TB PPDUs have been impacted
-  Simulator::Schedule (delay, &TestUlOfdmaPhyTransmission::LogScenario, this,
-                       "Reception of unsolicited HE TB PPDUs with an HE SU PPDU arriving during the 400 ns window");
-  //One HE SU arrives at AP during the 400ns window
-  Simulator::Schedule (delay + NanoSeconds (300), &TestUlOfdmaPhyTransmission::SendHeSuPpdu, this, 3, 1002, 1, 0);
-  ScheduleTest (delay, false,
-                WifiPhyState::IDLE,
-                0, 1, 0,  //Reception of the PSDU from STA 1 should have failed failed (since interference from STA 3)
-                0, 1, 0); //Reception of the PSDU from STA 2 should have failed failed (since interference from STA 3)
-  delay += Seconds (1.0);
-
-  //---------------------------------------------------------------------------
   //Only send a solicited HE TB PPDU from STA 2 on RU 2 and verify that it has been correctly received
   Simulator::Schedule (delay, &TestUlOfdmaPhyTransmission::LogScenario, this,
                        "Reception of solicited HE TB PPDU only on RU 2");
-  //Check that STA3 will correctly set its state to RX if in measurement channel or IDLE otherwise
+  //Check that STA3 will correctly set its state to CCA_BUSY if in measurement channel or IDLE otherwise
   Simulator::Schedule (delay + m_expectedPpduDuration - NanoSeconds (1), &TestUlOfdmaPhyTransmission::CheckPhyState, this, m_phySta3,
-                       (m_channelWidth >= 40) ? WifiPhyState::IDLE : WifiPhyState::RX); //PHY should move to RX instead of IDLE if HE TB PPDU on primary channel;
+                       (m_channelWidth >= 40) ? WifiPhyState::IDLE : WifiPhyState::CCA_BUSY); //PHY should move to CCA_BUSY instead of IDLE if HE TB PPDU on primary channel;
   ScheduleTest (delay, true,
                 WifiPhyState::IDLE,
                 0, 0, 0,    //No transmission scheduled for STA 1
@@ -2636,39 +2732,6 @@
   delay += Seconds (1.0);
 
   //---------------------------------------------------------------------------
-  //Only send an unsolicited HE TB PPDU from STA 2 on RU 2 and verify that it has been correctly received if it's in the
-  // correct measurement channel
-  Simulator::Schedule (delay, &TestUlOfdmaPhyTransmission::LogScenario, this,
-                       "Reception of unsolicited HE TB PPDUs only on RU 2");
-  //Check that STA3 will correctly set its state to RX if in measurement channel or IDLE otherwise
-  Simulator::Schedule (delay + m_expectedPpduDuration - NanoSeconds (1), &TestUlOfdmaPhyTransmission::CheckPhyState, this, m_phySta3,
-                       (m_channelWidth >= 40) ? WifiPhyState::IDLE : WifiPhyState::RX); //PHY should move to RX instead of IDLE if HE TB PPDU on primary channel;
-  //Expected figures from STA 2
-  WifiPhyState state;
-  if (m_channelWidth == 20)
-    {
-      //One PSDU of 1001 bytes should have been successfully received from STA 2 (since measurement channel is primary channel)
-      succ = 1;
-      fail = 0;
-      bytes = 1001;
-      state = WifiPhyState::RX;
-    }
-  else
-    {
-      //No PSDU should have been received from STA 2 (since measurement channel is primary channel)
-      succ = 0;
-      fail = 0;
-      bytes = 0;
-      state = WifiPhyState::IDLE;
-    }
-  ScheduleTest (delay, false,
-                WifiPhyState::IDLE,
-                0, 0, 0, //No transmission scheduled for STA 1
-                succ, fail, bytes,
-                false, state);
-  delay += Seconds (1.0);
-
-  //---------------------------------------------------------------------------
   //Measure the power of a solicited HE TB PPDU from STA 2 on RU 2
   Simulator::Schedule (delay, &TestUlOfdmaPhyTransmission::LogScenario, this,
                        "Measure power for reception of HE TB PPDU only on RU 2");
@@ -2799,6 +2862,12 @@
    * \param txDuration the duration of the PPDU
    */
   void SendHeTbPpdu (uint16_t txStaId, std::size_t index, std::size_t payloadSize, Time txDuration);
+  /**
+   * Set TRIGVECTOR for HE TB PPDU
+   *
+   * \param ppduDuration the duration of the HE TB PPDU
+   */
+  void SetTrigVector (Time ppduDuration);
 
   /**
    * Generate interference function
@@ -2925,7 +2994,7 @@
       phy = m_phySta2;
     }
 
-  txVector.SetLength (HePhy::ConvertHeTbPpduDurationToLSigLength (txDuration, phy->GetPhyBand ()));
+  txVector.SetLength (HePhy::ConvertHeTbPpduDurationToLSigLength (txDuration, txVector, phy->GetPhyBand ()).first);
 
   phy->SetPpduUid (0);
   phy->Send (psdus, txVector);
@@ -3054,7 +3123,7 @@
   apDev->SetMac (apMac);
   m_phyAp = CreateObject<OfdmaSpectrumWifiPhy> (0);
   m_phyAp->CreateWifiSpectrumPhyInterface (apDev);
-  m_phyAp->ConfigureStandardAndBand (WIFI_PHY_STANDARD_80211ax, WIFI_PHY_BAND_5GHZ);
+  m_phyAp->ConfigureStandard (WIFI_STANDARD_80211ax);
   Ptr<HeConfiguration> heConfiguration = CreateObject<HeConfiguration> ();
   apDev->SetHeConfiguration (heConfiguration);
   Ptr<ErrorRateModel> error = CreateObject<NistErrorRateModel> ();
@@ -3062,8 +3131,13 @@
   m_phyAp->SetDevice (apDev);
   m_phyAp->SetChannel (spectrumChannel);
   m_phyAp->AssignStreams (streamNumber);
-  m_phyAp->SetFrequency (DEFAULT_FREQUENCY);
-  m_phyAp->SetChannelWidth (DEFAULT_CHANNEL_WIDTH);
+  auto channelNum = std::get<0> (*WifiPhyOperatingChannel::FindFirst (0, DEFAULT_FREQUENCY,
+                                                                      DEFAULT_CHANNEL_WIDTH,
+                                                                      WIFI_STANDARD_80211ax,
+                                                                      WIFI_PHY_BAND_5GHZ));
+
+  m_phyAp->SetOperatingChannel (WifiPhy::ChannelTuple {channelNum, DEFAULT_CHANNEL_WIDTH,
+                                                       (int)(WIFI_PHY_BAND_5GHZ), 0});
   m_phyAp->SetReceiveOkCallback (MakeCallback (&TestPhyPaddingExclusion::RxSuccess, this));
   m_phyAp->SetReceiveErrorCallback (MakeCallback (&TestPhyPaddingExclusion::RxFailure, this));
   Ptr<ConstantPositionMobilityModel> apMobility = CreateObject<ConstantPositionMobilityModel> ();
@@ -3076,13 +3150,13 @@
   Ptr<WifiNetDevice> sta1Dev = CreateObject<WifiNetDevice> ();
   m_phySta1 = CreateObject<OfdmaSpectrumWifiPhy> (1);
   m_phySta1->CreateWifiSpectrumPhyInterface (sta1Dev);
-  m_phySta1->ConfigureStandardAndBand (WIFI_PHY_STANDARD_80211ax, WIFI_PHY_BAND_5GHZ);
+  m_phySta1->ConfigureStandard (WIFI_STANDARD_80211ax);
   m_phySta1->SetErrorRateModel (error);
   m_phySta1->SetDevice (sta1Dev);
   m_phySta1->SetChannel (spectrumChannel);
   m_phySta1->AssignStreams (streamNumber);
-  m_phySta1->SetFrequency (DEFAULT_FREQUENCY);
-  m_phySta1->SetChannelWidth (DEFAULT_CHANNEL_WIDTH);
+  m_phySta1->SetOperatingChannel (WifiPhy::ChannelTuple {channelNum, DEFAULT_CHANNEL_WIDTH,
+                                                         (int)(WIFI_PHY_BAND_5GHZ), 0});
   Ptr<ConstantPositionMobilityModel> sta1Mobility = CreateObject<ConstantPositionMobilityModel> ();
   m_phySta1->SetMobility (sta1Mobility);
   sta1Dev->SetPhy (m_phySta1);
@@ -3093,13 +3167,13 @@
   Ptr<WifiNetDevice> sta2Dev = CreateObject<WifiNetDevice> ();
   m_phySta2 = CreateObject<OfdmaSpectrumWifiPhy> (2);
   m_phySta2->CreateWifiSpectrumPhyInterface (sta2Dev);
-  m_phySta2->ConfigureStandardAndBand (WIFI_PHY_STANDARD_80211ax, WIFI_PHY_BAND_5GHZ);
+  m_phySta2->ConfigureStandard (WIFI_STANDARD_80211ax);
   m_phySta2->SetErrorRateModel (error);
   m_phySta2->SetDevice (sta2Dev);
   m_phySta2->SetChannel (spectrumChannel);
   m_phySta2->AssignStreams (streamNumber);
-  m_phySta2->SetFrequency (DEFAULT_FREQUENCY);
-  m_phySta2->SetChannelWidth (DEFAULT_CHANNEL_WIDTH);
+  m_phySta2->SetOperatingChannel (WifiPhy::ChannelTuple {channelNum, DEFAULT_CHANNEL_WIDTH,
+                                                         (int)(WIFI_PHY_BAND_5GHZ), 0});
   Ptr<ConstantPositionMobilityModel> sta2Mobility = CreateObject<ConstantPositionMobilityModel> ();
   m_phySta2->SetMobility (sta2Mobility);
   sta2Dev->SetPhy (m_phySta2);
@@ -3129,6 +3203,26 @@
 }
 
 void
+TestPhyPaddingExclusion::SetTrigVector (Time ppduDuration)
+{
+  WifiTxVector trigVector (HePhy::GetHeMcs7 (), 0, WIFI_PREAMBLE_HE_TB, 800, 1, 1, 0,
+                           DEFAULT_CHANNEL_WIDTH, false, false, 1);
+  trigVector.SetRu (HeRu::RuSpec (HeRu::RU_106_TONE, 1, false), 1);
+  trigVector.SetMode (HePhy::GetHeMcs7 (), 1);
+  trigVector.SetNss (1, 1);
+  trigVector.SetRu (HeRu::RuSpec (HeRu::RU_106_TONE, 2, false), 2);
+  trigVector.SetMode (HePhy::GetHeMcs7 (), 2);
+  trigVector.SetNss (1, 2);
+  uint16_t length;
+  std::tie (length, ppduDuration) = HePhy::ConvertHeTbPpduDurationToLSigLength (ppduDuration,
+                                                                                trigVector,
+                                                                                m_phyAp->GetPhyBand ());
+  trigVector.SetLength (length);
+  auto hePhyAp = DynamicCast<HePhy> (m_phyAp->GetPhyEntity (WIFI_MOD_CLASS_HE));
+  hePhyAp->SetTrigVector (trigVector, ppduDuration);
+}
+
+void
 TestPhyPaddingExclusion::DoRun (void)
 {
   Time expectedPpduDuration = NanoSeconds (279200);
@@ -3140,6 +3234,10 @@
   Simulator::Schedule (Seconds (1.0), &TestPhyPaddingExclusion::SendHeTbPpdu, this, 1, 1, 1000, ppduWithPaddingDuration);
   Simulator::Schedule (Seconds (1.0), &TestPhyPaddingExclusion::SendHeTbPpdu, this, 2, 2, 1001, ppduWithPaddingDuration);
 
+  // Set TRIGVECTOR on AP
+  Simulator::Schedule (Seconds (1.0), &TestPhyPaddingExclusion::SetTrigVector, this,
+                       ppduWithPaddingDuration);
+
   //Verify it takes expectedPpduDuration + padding to transmit the PPDUs
   Simulator::Schedule (Seconds (1.0) + ppduWithPaddingDuration - NanoSeconds (1), &TestPhyPaddingExclusion::CheckPhyState, this, m_phyAp, WifiPhyState::RX);
   Simulator::Schedule (Seconds (1.0) + ppduWithPaddingDuration, &TestPhyPaddingExclusion::CheckPhyState, this, m_phyAp, WifiPhyState::IDLE);
@@ -3158,6 +3256,10 @@
   Simulator::Schedule (Seconds (2.0), &TestPhyPaddingExclusion::SendHeTbPpdu, this, 1, 1, 1000, ppduWithPaddingDuration);
   Simulator::Schedule (Seconds (2.0), &TestPhyPaddingExclusion::SendHeTbPpdu, this, 2, 2, 1001, ppduWithPaddingDuration);
 
+  // Set TRIGVECTOR on AP
+  Simulator::Schedule (Seconds (2.0), &TestPhyPaddingExclusion::SetTrigVector, this,
+                       ppduWithPaddingDuration);
+
   //A strong non-wifi interference is generated on RU 1 during padding reception
   BandInfo bandInfo;
   bandInfo.fc = (DEFAULT_FREQUENCY - (DEFAULT_CHANNEL_WIDTH / 4)) * 1e6;
@@ -3310,7 +3412,6 @@
   //Build MU-BAR trigger frame
   CtrlTriggerHeader muBar;
   muBar.SetType (MU_BAR_TRIGGER);
-  muBar.SetUlLength (HePhy::ConvertHeTbPpduDurationToLSigLength (MicroSeconds (128), WIFI_PHY_BAND_5GHZ));
   muBar.SetMoreTF (true);
   muBar.SetCsRequired (true);
   muBar.SetUlBandwidth (DEFAULT_CHANNEL_WIDTH);
@@ -3353,6 +3454,9 @@
       ++index;
     }
 
+  WifiTxVector tbTxVector = muBar.GetHeTbTxVector (staIds.front ());
+  muBar.SetUlLength (HePhy::ConvertHeTbPpduDurationToLSigLength (MicroSeconds (128), tbTxVector, WIFI_PHY_BAND_5GHZ).first);
+
   WifiConstPsduMap psdus;
   WifiTxVector txVector = WifiTxVector (HePhy::GetHeMcs7 (), 0, WIFI_PREAMBLE_HE_SU, 800, 1, 1, 0,
                                         DEFAULT_CHANNEL_WIDTH, false, false, false, m_bssColor);
@@ -3388,7 +3492,7 @@
 
   Time nav = m_apDev->GetPhy ()->GetSifs ();
   uint16_t staId = staIds.front (); //either will do
-  nav += m_phyAp->CalculateTxDuration (GetBlockAckSize (BlockAckType::COMPRESSED), muBar.GetHeTbTxVector (staId), DEFAULT_WIFI_BAND, staId);
+  nav += m_phyAp->CalculateTxDuration (GetBlockAckSize (BlockAckType::COMPRESSED), tbTxVector, DEFAULT_WIFI_BAND, staId);
   psdu->SetDuration (nav);
   psdus.insert (std::make_pair (SU_STA_ID, psdu));
 
@@ -3441,11 +3545,10 @@
   SpectrumWifiPhyHelper spectrumPhy;
   spectrumPhy.SetChannel (spectrumChannel);
   spectrumPhy.SetErrorRateModel ("ns3::NistErrorRateModel");
-  spectrumPhy.Set ("Frequency", UintegerValue (DEFAULT_FREQUENCY));
-  spectrumPhy.Set ("ChannelWidth", UintegerValue (DEFAULT_CHANNEL_WIDTH));
+  spectrumPhy.Set ("ChannelSettings", StringValue ("{0, 0, BAND_5GHZ, 0}"));
 
   WifiHelper wifi;
-  wifi.SetStandard (WIFI_STANDARD_80211ax_5GHZ);
+  wifi.SetStandard (WIFI_STANDARD_80211ax);
   wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager",
                                 "DataMode", StringValue ("HeMcs7"),
                                 "ControlMode", StringValue ("HeMcs7"));
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/test/wifi-phy-reception-test.cc ns-3.36/src/wifi/test/wifi-phy-reception-test.cc
--- ns-3.35/src/wifi/test/wifi-phy-reception-test.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/test/wifi-phy-reception-test.cc	2022-04-30 18:23:58.222735200 -0700
@@ -29,6 +29,7 @@
 #include "ns3/packet-socket-server.h"
 #include "ns3/test.h"
 #include "ns3/double.h"
+#include "ns3/boolean.h"
 #include "ns3/pointer.h"
 #include "ns3/rng-seed-manager.h"
 #include "ns3/spectrum-wifi-helper.h"
@@ -203,11 +204,10 @@
 TestThresholdPreambleDetectionWithoutFrameCapture::DoSetup (void)
 {
   m_phy = CreateObject<SpectrumWifiPhy> ();
-  m_phy->ConfigureStandardAndBand (WIFI_PHY_STANDARD_80211ax, WIFI_PHY_BAND_5GHZ);
+  m_phy->ConfigureStandard (WIFI_STANDARD_80211ax);
   Ptr<ErrorRateModel> error = CreateObject<NistErrorRateModel> ();
   m_phy->SetErrorRateModel (error);
-  m_phy->SetChannelNumber (CHANNEL_NUMBER);
-  m_phy->SetFrequency (FREQUENCY);
+  m_phy->SetOperatingChannel (WifiPhy::ChannelTuple {CHANNEL_NUMBER, 0, WIFI_PHY_BAND_5GHZ, 0});
   m_phy->SetReceiveOkCallback (MakeCallback (&TestThresholdPreambleDetectionWithoutFrameCapture::RxSuccess, this));
   m_phy->SetReceiveErrorCallback (MakeCallback (&TestThresholdPreambleDetectionWithoutFrameCapture::RxFailure, this));
 
@@ -568,11 +568,10 @@
 TestThresholdPreambleDetectionWithFrameCapture::DoSetup (void)
 {
   m_phy = CreateObject<SpectrumWifiPhy> ();
-  m_phy->ConfigureStandardAndBand (WIFI_PHY_STANDARD_80211ax, WIFI_PHY_BAND_5GHZ);
+  m_phy->ConfigureStandard (WIFI_STANDARD_80211ax);
   Ptr<ErrorRateModel> error = CreateObject<NistErrorRateModel> ();
   m_phy->SetErrorRateModel (error);
-  m_phy->SetChannelNumber (CHANNEL_NUMBER);
-  m_phy->SetFrequency (FREQUENCY);
+  m_phy->SetOperatingChannel (WifiPhy::ChannelTuple {CHANNEL_NUMBER, 0, WIFI_PHY_BAND_5GHZ, 0});
   m_phy->SetReceiveOkCallback (MakeCallback (&TestThresholdPreambleDetectionWithFrameCapture::RxSuccess, this));
   m_phy->SetReceiveErrorCallback (MakeCallback (&TestThresholdPreambleDetectionWithFrameCapture::RxFailure, this));
 
@@ -1107,11 +1106,10 @@
 TestSimpleFrameCaptureModel::DoSetup (void)
 {
   m_phy = CreateObject<SpectrumWifiPhy> ();
-  m_phy->ConfigureStandardAndBand (WIFI_PHY_STANDARD_80211ax, WIFI_PHY_BAND_5GHZ);
+  m_phy->ConfigureStandard (WIFI_STANDARD_80211ax);
   Ptr<ErrorRateModel> error = CreateObject<NistErrorRateModel> ();
   m_phy->SetErrorRateModel (error);
-  m_phy->SetChannelNumber (CHANNEL_NUMBER);
-  m_phy->SetFrequency (FREQUENCY);
+  m_phy->SetOperatingChannel (WifiPhy::ChannelTuple {CHANNEL_NUMBER, 0, WIFI_PHY_BAND_5GHZ, 0});
 
   m_phy->SetReceiveOkCallback (MakeCallback (&TestSimpleFrameCaptureModel::RxSuccess, this));
   m_phy->TraceConnectWithoutContext ("PhyRxDrop", MakeCallback (&TestSimpleFrameCaptureModel::RxDropped, this));
@@ -1281,11 +1279,10 @@
 TestPhyHeadersReception::DoSetup (void)
 {
   m_phy = CreateObject<SpectrumWifiPhy> ();
-  m_phy->ConfigureStandardAndBand (WIFI_PHY_STANDARD_80211ax, WIFI_PHY_BAND_5GHZ);
+  m_phy->ConfigureStandard (WIFI_STANDARD_80211ax);
   Ptr<ErrorRateModel> error = CreateObject<NistErrorRateModel> ();
   m_phy->SetErrorRateModel (error);
-  m_phy->SetChannelNumber (CHANNEL_NUMBER);
-  m_phy->SetFrequency (FREQUENCY);
+  m_phy->SetOperatingChannel (WifiPhy::ChannelTuple {CHANNEL_NUMBER, 0, WIFI_PHY_BAND_5GHZ, 0});
 }
 
 void
@@ -1779,11 +1776,10 @@
 TestAmpduReception::DoSetup (void)
 {
   m_phy = CreateObject<SpectrumWifiPhy> ();
-  m_phy->ConfigureStandardAndBand (WIFI_PHY_STANDARD_80211ax, WIFI_PHY_BAND_5GHZ);
+  m_phy->ConfigureStandard (WIFI_STANDARD_80211ax);
   Ptr<ErrorRateModel> error = CreateObject<NistErrorRateModel> ();
   m_phy->SetErrorRateModel (error);
-  m_phy->SetChannelNumber (CHANNEL_NUMBER);
-  m_phy->SetFrequency (FREQUENCY);
+  m_phy->SetOperatingChannel (WifiPhy::ChannelTuple {CHANNEL_NUMBER, 0, WIFI_PHY_BAND_5GHZ, 0});
 
   m_phy->SetReceiveOkCallback (MakeCallback (&TestAmpduReception::RxSuccess, this));
   m_phy->SetReceiveErrorCallback (MakeCallback (&TestAmpduReception::RxFailure, this));
@@ -2454,12 +2450,12 @@
   mac.SetType ("ns3::StaWifiMac", "QosSupported", BooleanValue (true), "Ssid",
                SsidValue (Ssid ("non-existent-ssid")));
 
-  wifi.SetStandard (WIFI_STANDARD_80211ax_5GHZ);
+  wifi.SetStandard (WIFI_STANDARD_80211ax);
   m_staDevices.Add (wifi.Install (phy, mac, wifiStaNodes.Get (0)));
   wifi.SetStandard (WIFI_STANDARD_80211ac);
   m_staDevices.Add (wifi.Install (phy, mac, wifiStaNodes.Get (1)));
 
-  wifi.SetStandard (WIFI_STANDARD_80211ax_5GHZ);
+  wifi.SetStandard (WIFI_STANDARD_80211ax);
   mac.SetType ("ns3::ApWifiMac", "QosSupported", BooleanValue (true), "Ssid",
                SsidValue (Ssid ("wifi-backoff-ssid")), "BeaconInterval",
                TimeValue (MicroSeconds (102400)), "EnableBeaconJitter", BooleanValue (false));
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/test/wifi-phy-thresholds-test.cc ns-3.36/src/wifi/test/wifi-phy-thresholds-test.cc
--- ns-3.35/src/wifi/test/wifi-phy-thresholds-test.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/test/wifi-phy-thresholds-test.cc	2022-04-30 18:23:58.222735200 -0700
@@ -230,11 +230,10 @@
 WifiPhyThresholdsTest::DoSetup (void)
 {
   m_phy = CreateObject<SpectrumWifiPhy> ();
-  m_phy->ConfigureStandardAndBand (WIFI_PHY_STANDARD_80211ax, WIFI_PHY_BAND_5GHZ);
+  m_phy->ConfigureStandard (WIFI_STANDARD_80211ax);
   Ptr<ErrorRateModel> error = CreateObject<NistErrorRateModel> ();
   m_phy->SetErrorRateModel (error);
-  m_phy->SetChannelNumber (CHANNEL_NUMBER);
-  m_phy->SetFrequency (FREQUENCY);
+  m_phy->SetOperatingChannel (WifiPhy::ChannelTuple {CHANNEL_NUMBER, 0, WIFI_PHY_BAND_5GHZ, 0});
   m_phy->SetReceiveOkCallback (MakeCallback (&WifiPhyThresholdsTest::RxSuccess, this));
   m_phy->SetReceiveErrorCallback (MakeCallback (&WifiPhyThresholdsTest::RxFailure, this));
   m_phy->TraceConnectWithoutContext ("PhyRxDrop", MakeCallback (&WifiPhyThresholdsTest::RxDropped, this));
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/test/wifi-primary-channels-test.cc ns-3.36/src/wifi/test/wifi-primary-channels-test.cc
--- ns-3.35/src/wifi/test/wifi-primary-channels-test.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/test/wifi-primary-channels-test.cc	2022-04-30 18:23:58.222735200 -0700
@@ -18,6 +18,8 @@
  * Author: Stefano Avallone <stavallo@unina.it>
  */
 
+#include "ns3/boolean.h"
+#include "ns3/enum.h"
 #include "ns3/test.h"
 #include "ns3/wifi-net-device.h"
 #include "ns3/mobility-helper.h"
@@ -31,6 +33,7 @@
 #include "ns3/he-phy.h"
 #include "ns3/he-configuration.h"
 #include "ns3/ctrl-headers.h"
+#include "ns3/tuple.h"
 #include <bitset>
 #include <algorithm>
 #include <sstream>
@@ -265,14 +268,14 @@
                                     WifiTxVector txVector, std::vector<bool> perMpduStatus)
 {
   // if the BSS color is zero, this AP might receive the frame sent by another AP. Given that
-  // stations only send TB PPDUs, we discard this frame if the TX vector is UL MU.
+  // stations only send TB PPDUs, we ignore this frame if the TX vector is not UL MU.
   if (psdu->GetNMpdus () == 1 && psdu->GetHeader (0).IsQosData () && txVector.IsUlMu ())
     {
       auto dev = DynamicCast<WifiNetDevice> (m_apDevices.Get (bss));
 
       uint16_t staId = txVector.GetHeMuUserInfoMap ().begin ()->first;
       uint8_t station = staId - 1;
-      NS_LOG_INFO ("RECEIVED FROM BSS=" << +bss << " STA=" << +station
+      NS_LOG_INFO ("RECEIVED FROM BSSID=" << psdu->GetHeader (0).GetAddr3 () << " STA=" << +station
                    << "  " << *psdu);
       // the MAC received a PSDU containing a QoS data frame from the PHY
       NS_TEST_EXPECT_MSG_EQ (m_received[bss].test (station), false, "AP of BSS " << +bss
@@ -294,7 +297,7 @@
   RngSeedManager::SetSeed (1);
   RngSeedManager::SetRun (40);
   int64_t streamNumber = 100;
-  uint16_t frequency;
+  uint8_t channelNum;
 
   // we create as many stations per BSS as the number of 26-tone RUs in a channel
   // of the configured width
@@ -302,19 +305,19 @@
     {
       case 20:
         m_nStationsPerBss = 9;
-        frequency = 5180;
+        channelNum = 36;
         break;
       case 40:
         m_nStationsPerBss = 18;
-        frequency = 5190;
+        channelNum = 38;
         break;
       case 80:
         m_nStationsPerBss = 37;
-        frequency = 5210;
+        channelNum = 42;
         break;
       case 160:
         m_nStationsPerBss = 74;
-        frequency = 5250;
+        channelNum= 50;
         break;
       default:
         NS_ABORT_MSG ("Channel width (" << m_channelWidth << ") not allowed");
@@ -340,10 +343,9 @@
 
   SpectrumWifiPhyHelper phy;
   phy.SetChannel (spectrumChannel);
-  phy.Set ("Frequency", UintegerValue (frequency));  // same frequency for all BSSes
 
   WifiHelper wifi;
-  wifi.SetStandard (WIFI_STANDARD_80211ax_5GHZ);
+  wifi.SetStandard (WIFI_STANDARD_80211ax);
   wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager");
 
   WifiMacHelper mac;
@@ -351,17 +353,21 @@
                "Ssid", SsidValue (Ssid ("non-existent-ssid")),
                "WaitBeaconTimeout", TimeValue (MicroSeconds (102400))); // same as BeaconInterval
 
+  TupleValue<UintegerValue, UintegerValue, EnumValue, UintegerValue> channelValue;
+
   // Each BSS uses a distinct primary20 channel
   for (uint8_t bss = 0; bss < m_nBss; bss++)
     {
-      phy.Set ("Primary20MHzIndex", UintegerValue (bss));
+      channelValue.Set (WifiPhy::ChannelTuple {channelNum, m_channelWidth, WIFI_PHY_BAND_5GHZ, bss});
+      phy.Set ("ChannelSettings", channelValue);
 
       m_staDevices.push_back (wifi.Install (phy, mac, wifiStaNodes[bss]));
     }
 
   for (uint8_t bss = 0; bss < m_nBss; bss++)
     {
-      phy.Set ("Primary20MHzIndex", UintegerValue (bss));
+      channelValue.Set (WifiPhy::ChannelTuple {channelNum, m_channelWidth, WIFI_PHY_BAND_5GHZ, bss});
+      phy.Set ("ChannelSettings", channelValue);
 
       mac.SetType ("ns3::ApWifiMac",
                   "Ssid", SsidValue (Ssid ("wifi-ssid-" + std::to_string (bss))),
@@ -370,7 +376,7 @@
 
       m_apDevices.Add (wifi.Install (phy, mac, wifiApNodes.Get (bss)));
     }
-  
+
   // Assign fixed streams to random variables in use
   streamNumber = wifi.AssignStreams (m_apDevices, streamNumber);
   for (uint8_t bss = 0; bss < m_nBss; bss++)
@@ -611,7 +617,7 @@
     }
 
   /*
-   * Repeat the same scheme as before with DL MU transmissions. For each transmission
+   * Repeat the same scheme as before with UL MU transmissions. For each transmission
    * channel width, every round is repeated as many times as the number of ways in
    * which we can partition the transmission channel width in equal sized RUs.
    */
@@ -703,8 +709,8 @@
 
   for (std::size_t i = 1; i <= nRus; i++)
     {
-      std::size_t index = (txChannelWidth == 160 && i > nRus / 2 ? i - nRus / 2 : i);
-      bool primary80 = (txChannelWidth == 160 && i > nRus / 2 ? false : true);
+      bool primary80 = !(txChannelWidth == 160 && i > nRus / 2);
+      std::size_t index = (primary80 ? i : i - nRus / 2);
 
       auto staDev = DynamicCast<WifiNetDevice> (m_staDevices[bss].Get (i - 1));
       uint16_t staId = DynamicCast<StaWifiMac> (staDev->GetMac ())->GetAssociationId ();
@@ -747,20 +753,22 @@
 
   Time duration = Seconds (0);
   uint16_t length = 0;
+  WifiTxVector trigVector (HePhy::GetHeMcs8 (), 0, WIFI_PREAMBLE_HE_TB, 3200, 1, 1, 0, txChannelWidth, false, false, false, bssColor);
 
   for (std::size_t i = 1; i <= nRus; i++)
     {
       NS_LOG_INFO ("*** BSS " << +bss << " STA " << i - 1 << " transmits on primary "
                    << txChannelWidth << " MHz channel an HE TB PPDU (RU type: " << ruType << ")");
 
-      std::size_t index = (txChannelWidth == 160 && i > nRus / 2 ? i - nRus / 2 : i);
-      bool primary80 = (txChannelWidth == 160 && i > nRus / 2 ? false : true);
+      bool primary80 = !(txChannelWidth == 160 && i > nRus / 2);
+      std::size_t index = (primary80 ? i : i - nRus / 2);
 
       auto staDev = DynamicCast<WifiNetDevice> (m_staDevices[bss].Get (i - 1));
       uint16_t staId = DynamicCast<StaWifiMac> (staDev->GetMac ())->GetAssociationId ();
 
       WifiTxVector txVector (HePhy::GetHeMcs8 (), 0, WIFI_PREAMBLE_HE_TB, 3200, 1, 1, 0, txChannelWidth, false, false, false, bssColor);
       txVector.SetHeMuUserInfo (staId, {{ruType, index, primary80}, HePhy::GetHeMcs8 (), 1});
+      trigVector.SetHeMuUserInfo (staId, {{ruType, index, primary80}, HePhy::GetHeMcs8 (), 1});
 
       hdr.SetAddr2 (staDev->GetMac ()->GetAddress ());
       Ptr<const WifiPsdu> psdu = Create<const WifiPsdu> (Create<Packet> (1000), hdr);
@@ -770,13 +778,18 @@
           // calculate just once
           duration = WifiPhy::CalculateTxDuration (psdu->GetSize (), txVector,
                                                    staDev->GetMac ()->GetWifiPhy ()->GetPhyBand (), staId);
-          length = HePhy::ConvertHeTbPpduDurationToLSigLength (duration,
-                                                               staDev->GetMac ()->GetWifiPhy ()->GetPhyBand ());
+          std::tie (length, duration) = HePhy::ConvertHeTbPpduDurationToLSigLength (duration, txVector,
+                                                                                    staDev->GetMac ()->GetWifiPhy ()->GetPhyBand ());
         }
       txVector.SetLength (length);
 
       staDev->GetPhy ()->Send (WifiConstPsduMap {{staId, psdu}}, txVector);
     }
+
+  // AP's PHY expects to receive a TRIGVECTOR (just once)
+  trigVector.SetLength (length);
+  auto apHePhy = StaticCast<HePhy> (apDev->GetPhy ()->GetPhyEntity (WIFI_MOD_CLASS_HE));
+  apHePhy->SetTrigVector (trigVector, duration);
 }
 
 void
@@ -861,7 +874,9 @@
     {
       if (txBss.find (bss) != txBss.end ())
         {
-          // Due to AID filtering, only stations that are addressed by the MU PPDU do hear the frame
+          // There was a transmission in this BSS.
+          // [DL] Due to AID filtering, only stations that are addressed by the MU PPDU do hear the frame
+          // [UL] The AP hears a TB PPDU sent by all and only the solicited stations
           for (uint8_t sta = 0; sta < nRus; sta++)
             {
               NS_TEST_EXPECT_MSG_EQ (m_received[bss].test (sta), true,
@@ -879,7 +894,8 @@
                                      << (isDlMu ? "by" : "from") << " station [" << +bss << "]["
                                      << +sta << "]");
             }
-          // only the addressed stations actually processed the frames
+          // [DL] Only the addressed stations actually processed the frames
+          // [UL] The AP processed the frames sent by all and only the addressed stations
           for (uint8_t sta = 0; sta < nRus; sta++)
             {
               NS_TEST_EXPECT_MSG_EQ (m_processed[bss].test (sta), true,
@@ -900,10 +916,11 @@
         }
       else
         {
-          // There was no transmission in this BSS. If BSS Color filtering is enabled or no frame
-          // transmission overlaps with the primary20 channel of this BSS, stations in this BSS
-          // did not hear any frame.
-          if (m_useDistinctBssColors
+          // There was no transmission in this BSS.
+          // [DL] If BSS Color filtering is enabled or no frame transmission overlaps with
+          // the primary20 channel of this BSS, stations in this BSS did not hear any frame.
+          // [UL] The AP did not hear any TB PPDU because no TRIGVECTOR was passed to the PHY
+          if (!isDlMu || m_useDistinctBssColors
               || std::none_of (txBss.begin (), txBss.end (),
                                [&](const uint8_t& txAp)
                                {
@@ -925,7 +942,7 @@
             }
           else
             {
-              // stations having the same AID of the stations addressed by the MU PPDI received the frame
+              // [DL] Stations having the same AID of the stations addressed by the MU PPDU received the frame
               for (uint8_t sta = 0; sta < nRus; sta++)
                 {
                   NS_TEST_EXPECT_MSG_EQ (m_received[bss].test (sta), true,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/test/wifi-test.cc ns-3.36/src/wifi/test/wifi-test.cc
--- ns-3.35/src/wifi/test/wifi-test.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/test/wifi-test.cc	2022-04-30 18:23:58.222735200 -0700
@@ -61,27 +61,28 @@
 AssignWifiRandomStreams (Ptr<WifiMac> mac, int64_t stream)
 {
   int64_t currentStream = stream;
-  Ptr<RegularWifiMac> rmac = DynamicCast<RegularWifiMac> (mac);
-  if (rmac)
+  PointerValue ptr;
+  if (!mac->GetQosSupported ())
     {
-      PointerValue ptr;
-      rmac->GetAttribute ("Txop", ptr);
+      mac->GetAttribute ("Txop", ptr);
       Ptr<Txop> txop = ptr.Get<Txop> ();
       currentStream += txop->AssignStreams (currentStream);
-
-      rmac->GetAttribute ("VO_Txop", ptr);
+    }
+  else
+    {
+      mac->GetAttribute ("VO_Txop", ptr);
       Ptr<QosTxop> vo_txop = ptr.Get<QosTxop> ();
       currentStream += vo_txop->AssignStreams (currentStream);
 
-      rmac->GetAttribute ("VI_Txop", ptr);
+      mac->GetAttribute ("VI_Txop", ptr);
       Ptr<QosTxop> vi_txop = ptr.Get<QosTxop> ();
       currentStream += vi_txop->AssignStreams (currentStream);
 
-      rmac->GetAttribute ("BE_Txop", ptr);
+      mac->GetAttribute ("BE_Txop", ptr);
       Ptr<QosTxop> be_txop = ptr.Get<QosTxop> ();
       currentStream += be_txop->AssignStreams (currentStream);
 
-      rmac->GetAttribute ("BK_Txop", ptr);
+      mac->GetAttribute ("BK_Txop", ptr);
       Ptr<QosTxop> bk_txop = ptr.Get<QosTxop> ();
       bk_txop->AssignStreams (currentStream);
     }
@@ -139,7 +140,7 @@
   Ptr<Node> node = CreateObject<Node> ();
   Ptr<WifiNetDevice> dev = CreateObject<WifiNetDevice> ();
 
-  Ptr<RegularWifiMac> mac = m_mac.Create<RegularWifiMac> ();
+  Ptr<WifiMac> mac = m_mac.Create<WifiMac> ();
   mac->SetDevice (dev);
   mac->SetAddress (Mac48Address::Allocate ());
   mac->ConfigureStandard (WIFI_STANDARD_80211a);
@@ -157,7 +158,7 @@
   phy->SetErrorRateModel (error);
   phy->SetChannel (channel);
   phy->SetDevice (dev);
-  phy->ConfigureStandardAndBand (WIFI_PHY_STANDARD_80211a, WIFI_PHY_BAND_5GHZ);
+  phy->ConfigureStandard (WIFI_STANDARD_80211a);
   Ptr<WifiRemoteStationManager> manager = m_manager.Create<WifiRemoteStationManager> ();
 
   mobility->SetPosition (pos);
@@ -306,7 +307,7 @@
 InterferenceHelperSequenceTest::SwitchCh (Ptr<WifiNetDevice> dev)
 {
   Ptr<WifiPhy> p = dev->GetPhy ();
-  p->SetChannelNumber (40);
+  p->SetOperatingChannel (WifiPhy::ChannelTuple {40, 0, (int)(WIFI_PHY_BAND_5GHZ), 0});
 }
 
 Ptr<Node>
@@ -315,7 +316,7 @@
   Ptr<Node> node = CreateObject<Node> ();
   Ptr<WifiNetDevice> dev = CreateObject<WifiNetDevice> ();
 
-  Ptr<RegularWifiMac> mac = m_mac.Create<RegularWifiMac> ();
+  Ptr<WifiMac> mac = m_mac.Create<WifiMac> ();
   mac->SetDevice (dev);
   mac->SetAddress (Mac48Address::Allocate ());
   mac->ConfigureStandard (WIFI_STANDARD_80211a);
@@ -334,7 +335,7 @@
   phy->SetChannel (channel);
   phy->SetDevice (dev);
   phy->SetMobility (mobility);
-  phy->ConfigureStandardAndBand (WIFI_PHY_STANDARD_80211a, WIFI_PHY_BAND_5GHZ);
+  phy->ConfigureStandard (WIFI_STANDARD_80211a);
   Ptr<WifiRemoteStationManager> manager = m_manager.Create<WifiRemoteStationManager> ();
 
   mobility->SetPosition (pos);
@@ -517,7 +518,7 @@
 
   Ptr<Node> txNode = CreateObject<Node> ();
   Ptr<WifiNetDevice> txDev = CreateObject<WifiNetDevice> ();
-  Ptr<RegularWifiMac> txMac = m_mac.Create<RegularWifiMac> ();
+  Ptr<WifiMac> txMac = m_mac.Create<WifiMac> ();
   txMac->SetDevice (txDev);
   txMac->ConfigureStandard (WIFI_STANDARD_80211a);
   Ptr<FrameExchangeManager> fem = txMac->GetFrameExchangeManager ();
@@ -542,7 +543,7 @@
   txPhy->SetChannel (channel);
   txPhy->SetDevice (txDev);
   txPhy->SetMobility (txMobility);
-  txPhy->ConfigureStandardAndBand (WIFI_PHY_STANDARD_80211a, WIFI_PHY_BAND_5GHZ);
+  txPhy->ConfigureStandard (WIFI_STANDARD_80211a);
 
   txPhy->TraceConnectWithoutContext ("PhyTxBegin", MakeCallback (&DcfImmediateAccessBroadcastTestCase::NotifyPhyTxBegin, this));
 
@@ -806,7 +807,7 @@
   phy.SetChannel (channel.Create ());
 
   WifiHelper wifi;
-  wifi.SetStandard (WIFI_STANDARD_80211n_5GHZ);
+  wifi.SetStandard (WIFI_STANDARD_80211n);
   wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager",
                                 "DataMode", StringValue ("HtMcs7"));
 
@@ -841,10 +842,8 @@
   Ptr<WifiNetDevice> sta_device = DynamicCast<WifiNetDevice> (staDevices.Get (0));
 
   // set the TXOP limit on BE AC
-  Ptr<RegularWifiMac> sta_mac = DynamicCast<RegularWifiMac> (sta_device->GetMac ());
-  NS_ASSERT (sta_mac);
   PointerValue ptr;
-  sta_mac->GetAttribute ("BE_Txop", ptr);
+  sta_device->GetMac ()->GetAttribute ("BE_Txop", ptr);
   ptr.Get<QosTxop> ()->SetTxopLimit (MicroSeconds (3008));
 
   PacketSocketAddress socket;
@@ -955,7 +954,8 @@
   {
     // case 1:
     WifiHelper wifi;
-    // By default, WifiHelper will use WIFI_PHY_STANDARD_80211a
+    wifi.SetStandard (WIFI_STANDARD_80211a);
+    wifi.SetRemoteStationManager ("ns3::ArfWifiManager");
     staDevice = wifi.Install (phy, macSta, wifiStaNode.Get (0));
     phySta = GetYansWifiPhyPtr (staDevice);
     // We expect channel 36, width 20, frequency 5180
@@ -989,18 +989,20 @@
     // case 4:
     WifiHelper wifi;
     wifi.SetRemoteStationManager ("ns3::IdealWifiManager");
-    wifi.SetStandard (WIFI_STANDARD_80211n_5GHZ);
+    wifi.SetStandard (WIFI_STANDARD_80211n);
+    phy.Set ("ChannelSettings", StringValue ("{0, 0, BAND_5GHZ, 0}"));
     staDevice = wifi.Install (phy, macSta, wifiStaNode.Get (0));
     phySta = GetYansWifiPhyPtr (staDevice);
     NS_TEST_ASSERT_MSG_EQ (phySta->GetChannelNumber (), 36, "802.11n-5GHz configuration");
     NS_TEST_ASSERT_MSG_EQ (phySta->GetChannelWidth (), 20, "802.11n-5GHz configuration");
     NS_TEST_ASSERT_MSG_EQ (phySta->GetFrequency (), 5180, "802.11n-5GHz configuration");
+    phy.Set ("ChannelSettings", StringValue ("{0, 0, BAND_UNSPECIFIED, 0}")); // restore default
   }
   {
     // case 5:
     WifiHelper wifi;
     wifi.SetRemoteStationManager ("ns3::IdealWifiManager");
-    wifi.SetStandard (WIFI_STANDARD_80211n_2_4GHZ);
+    wifi.SetStandard (WIFI_STANDARD_80211n);
     staDevice = wifi.Install (phy, macSta, wifiStaNode.Get (0));
     phySta = GetYansWifiPhyPtr (staDevice);
     NS_TEST_ASSERT_MSG_EQ (phySta->GetChannelNumber (), 1, "802.11n-2.4GHz configuration");
@@ -1020,20 +1022,21 @@
   }
   {
     // case 7:
+    // By default, WifiHelper will use WIFI_PHY_STANDARD_80211ax
     WifiHelper wifi;
     wifi.SetRemoteStationManager ("ns3::IdealWifiManager");
-    wifi.SetStandard (WIFI_STANDARD_80211ax_2_4GHZ);
+    phy.Set ("ChannelSettings", StringValue ("{0, 0, BAND_2_4GHZ, 0}"));
     staDevice = wifi.Install (phy, macSta, wifiStaNode.Get (0));
     phySta = GetYansWifiPhyPtr (staDevice);
     NS_TEST_ASSERT_MSG_EQ (phySta->GetChannelNumber (), 1, "802.11ax-2.4GHz configuration");
     NS_TEST_ASSERT_MSG_EQ (phySta->GetChannelWidth (), 20, "802.11ax-2.4GHz configuration");
     NS_TEST_ASSERT_MSG_EQ (phySta->GetFrequency (), 2412, "802.11ax-2.4GHz configuration");
+    phy.Set ("ChannelSettings", StringValue ("{0, 0, BAND_UNSPECIFIED, 0}")); // restore default
   }
   {
     // case 8:
     WifiHelper wifi;
     wifi.SetRemoteStationManager ("ns3::IdealWifiManager");
-    wifi.SetStandard (WIFI_STANDARD_80211ax_5GHZ);
     staDevice = wifi.Install (phy, macSta, wifiStaNode.Get (0));
     phySta = GetYansWifiPhyPtr (staDevice);
     NS_TEST_ASSERT_MSG_EQ (phySta->GetChannelNumber (), 42, "802.11ax-5GHz configuration");
@@ -1044,112 +1047,120 @@
     // case 9:
     WifiHelper wifi;
     wifi.SetRemoteStationManager ("ns3::IdealWifiManager");
-    wifi.SetStandard (WIFI_STANDARD_80211ax_6GHZ);
+    phy.Set ("ChannelSettings", StringValue ("{0, 0, BAND_6GHZ, 0}"));
     staDevice = wifi.Install (phy, macSta, wifiStaNode.Get (0));
     phySta = GetYansWifiPhyPtr (staDevice);
     NS_TEST_ASSERT_MSG_EQ (phySta->GetChannelNumber (), 7, "802.11ax-6GHz configuration");
     NS_TEST_ASSERT_MSG_EQ (phySta->GetChannelWidth (), 80, "802.11ax-6GHz configuration");
     NS_TEST_ASSERT_MSG_EQ (phySta->GetFrequency (), 5975, "802.11ax-6GHz configuration");
+    phy.Set ("ChannelSettings", StringValue ("{0, 0, BAND_UNSPECIFIED, 0}")); // restore default
   }
   {
     // case 10:
     WifiHelper wifi;
     wifi.SetRemoteStationManager ("ns3::IdealWifiManager");
     wifi.SetStandard (WIFI_STANDARD_80211p);
-    phy.Set ("ChannelWidth", UintegerValue (10));
+    phy.Set ("ChannelSettings", StringValue ("{0, 10, BAND_5GHZ, 0}"));
     staDevice = wifi.Install (phy, macSta, wifiStaNode.Get (0));
     phySta = GetYansWifiPhyPtr (staDevice);
     NS_TEST_ASSERT_MSG_EQ (phySta->GetChannelNumber (), 172, "802.11p 10Mhz configuration");
     NS_TEST_ASSERT_MSG_EQ (phySta->GetChannelWidth (), 10, "802.11p 10Mhz configuration");
     NS_TEST_ASSERT_MSG_EQ (phySta->GetFrequency (), 5860, "802.11p 10Mhz configuration");
+    phy.Set ("ChannelSettings", StringValue ("{0, 0, BAND_UNSPECIFIED, 0}")); // restore default
   }
   {
     // case 11:
     WifiHelper wifi;
     wifi.SetRemoteStationManager ("ns3::IdealWifiManager");
     wifi.SetStandard (WIFI_STANDARD_80211p);
-    phy.Set ("ChannelWidth", UintegerValue (5));
+    phy.Set ("ChannelSettings", StringValue ("{0, 5, BAND_5GHZ, 0}"));
     staDevice = wifi.Install (phy, macSta, wifiStaNode.Get (0));
     phySta = GetYansWifiPhyPtr (staDevice);
     NS_TEST_ASSERT_MSG_EQ (phySta->GetChannelNumber (), 171, "802.11p 5Mhz configuration");
     NS_TEST_ASSERT_MSG_EQ (phySta->GetChannelWidth (), 5, "802.11p 5Mhz configuration");
     NS_TEST_ASSERT_MSG_EQ (phySta->GetFrequency (), 5860, "802.11p 5Mhz configuration");
+    phy.Set ("ChannelSettings", StringValue ("{0, 0, BAND_UNSPECIFIED, 0}")); // restore default
   }
   {
     // case 12:
     WifiHelper wifi;
     wifi.SetRemoteStationManager ("ns3::IdealWifiManager");
-    wifi.SetStandard (WIFI_STANDARD_80211n_5GHZ);
-    phy.Set ("ChannelWidth", UintegerValue (20)); // reset value after previous case
-    phy.Set ("ChannelNumber", UintegerValue (44));
+    wifi.SetStandard (WIFI_STANDARD_80211n);
+    phy.Set ("ChannelSettings", StringValue ("{44, 20, BAND_5GHZ, 0}"));
     staDevice = wifi.Install (phy, macSta, wifiStaNode.Get (0));
     phySta = GetYansWifiPhyPtr (staDevice);
     NS_TEST_ASSERT_MSG_EQ (phySta->GetChannelNumber (), 44, "802.11 5GHz configuration");
     NS_TEST_ASSERT_MSG_EQ (phySta->GetChannelWidth (), 20, "802.11 5GHz configuration");
     NS_TEST_ASSERT_MSG_EQ (phySta->GetFrequency (), 5220, "802.11 5GHz configuration");
+    phy.Set ("ChannelSettings", StringValue ("{0, 0, BAND_UNSPECIFIED, 0}")); // restore default
   }
   {
     // case 13:
     WifiHelper wifi;
     wifi.SetRemoteStationManager ("ns3::IdealWifiManager");
-    phy.Set ("ChannelNumber", UintegerValue (44));
+    phy.Set ("ChannelSettings", StringValue ("{44, 0, BAND_5GHZ, 0}"));
     staDevice = wifi.Install (phy, macSta, wifiStaNode.Get (0));
     phySta = GetYansWifiPhyPtr (staDevice);
     // Post-install reconfiguration to channel number 40
     std::ostringstream path;
-    path << "/NodeList/*/DeviceList/" << staDevice.Get(0)->GetIfIndex () << "/$ns3::WifiNetDevice/Phy/$ns3::YansWifiPhy/ChannelNumber";
-    Config::Set (path.str(), UintegerValue (40));
+    path << "/NodeList/*/DeviceList/" << staDevice.Get(0)->GetIfIndex () << "/$ns3::WifiNetDevice/Phy/$ns3::YansWifiPhy/ChannelSettings";
+    Config::Set (path.str(), StringValue ("{40, 0, BAND_5GHZ, 0}"));
     NS_TEST_ASSERT_MSG_EQ (phySta->GetChannelNumber (), 40, "802.11 5GHz configuration");
     NS_TEST_ASSERT_MSG_EQ (phySta->GetChannelWidth (), 20, "802.11 5GHz configuration");
     NS_TEST_ASSERT_MSG_EQ (phySta->GetFrequency (), 5200, "802.11 5GHz configuration");
+    phy.Set ("ChannelSettings", StringValue ("{0, 0, BAND_UNSPECIFIED, 0}")); // restore default
   }
   {
     // case 14:
     WifiHelper wifi;
     wifi.SetRemoteStationManager ("ns3::IdealWifiManager");
-    phy.Set ("ChannelNumber", UintegerValue (44));
+    phy.Set ("ChannelSettings", StringValue ("{44, 0, BAND_5GHZ, 0}"));
     staDevice = wifi.Install (phy, macSta, wifiStaNode.Get (0));
     phySta = GetYansWifiPhyPtr (staDevice);
     // Post-install reconfiguration to a 40 MHz channel
     std::ostringstream path;
-    path << "/NodeList/*/DeviceList/" << staDevice.Get(0)->GetIfIndex () << "/$ns3::WifiNetDevice/Phy/$ns3::YansWifiPhy/ChannelNumber";
-    Config::Set (path.str(), UintegerValue (46));
+    path << "/NodeList/*/DeviceList/" << staDevice.Get(0)->GetIfIndex () << "/$ns3::WifiNetDevice/Phy/$ns3::YansWifiPhy/ChannelSettings";
+    Config::Set (path.str(), StringValue ("{46, 0, BAND_5GHZ, 0}"));
     // Although channel 44 is configured originally for 20 MHz, we
     // allow it to be used for 40 MHz here
     NS_TEST_ASSERT_MSG_EQ (phySta->GetChannelNumber (), 46, "802.11 5GHz configuration");
     NS_TEST_ASSERT_MSG_EQ (phySta->GetChannelWidth (), 40, "802.11 5GHz configuration");
     NS_TEST_ASSERT_MSG_EQ (phySta->GetFrequency (), 5230, "802.11 5GHz configuration");
+    phy.Set ("ChannelSettings", StringValue ("{0, 0, BAND_UNSPECIFIED, 0}")); // restore default
   }
   {
     // case 15:
     WifiHelper wifi;
     wifi.SetRemoteStationManager ("ns3::IdealWifiManager");
-    wifi.SetStandard (WIFI_STANDARD_80211n_5GHZ);
+    wifi.SetStandard (WIFI_STANDARD_80211n);
     staDevice = wifi.Install (phy, macSta, wifiStaNode.Get (0));
     phySta = GetYansWifiPhyPtr (staDevice);
-    phySta->SetAttribute ("ChannelNumber", UintegerValue (44));
+    phySta->SetAttribute ("ChannelSettings", StringValue ("{3, 20, BAND_2_4GHZ, 0}"));
+    return;
     // Post-install reconfiguration to a 40 MHz channel
     std::ostringstream path;
-    path << "/NodeList/*/DeviceList/" << staDevice.Get(0)->GetIfIndex () << "/$ns3::WifiNetDevice/Phy/$ns3::YansWifiPhy/ChannelNumber";
-    Config::Set (path.str(), UintegerValue (46));
+    path << "/NodeList/*/DeviceList/" << staDevice.Get(0)->GetIfIndex () << "/$ns3::WifiNetDevice/Phy/$ns3::YansWifiPhy/ChannelSettings";
+    Config::Set (path.str(), StringValue ("{4, 40, BAND_2_4GHZ, 0}"));
     // Although channel 44 is configured originally for 20 MHz, we
     // allow it to be used for 40 MHz here
-    NS_TEST_ASSERT_MSG_EQ (phySta->GetChannelNumber (), 46, "802.11 5GHz configuration");
+    NS_TEST_ASSERT_MSG_EQ (phySta->GetChannelNumber (), 4, "802.11 5GHz configuration");
     NS_TEST_ASSERT_MSG_EQ (phySta->GetChannelWidth (), 40, "802.11 5GHz configuration");
-    NS_TEST_ASSERT_MSG_EQ (phySta->GetFrequency (), 5230, "802.11 5GHz configuration");
+    NS_TEST_ASSERT_MSG_EQ (phySta->GetFrequency (), 2427, "802.11 5GHz configuration");
+    phy.Set ("ChannelSettings", StringValue ("{0, 0, BAND_UNSPECIFIED, 0}")); // restore default
   }
   {
     // case 16:
     WifiHelper wifi;
     wifi.SetRemoteStationManager ("ns3::IdealWifiManager");
     // Test that setting Frequency to a non-standard value will throw an exception
-    wifi.SetStandard (WIFI_STANDARD_80211n_5GHZ);
+    wifi.SetStandard (WIFI_STANDARD_80211n);
+    phy.Set ("ChannelSettings", StringValue ("{44, 0, BAND_5GHZ, 0}"));
     staDevice = wifi.Install (phy, macSta, wifiStaNode.Get (0));
     phySta = GetYansWifiPhyPtr (staDevice);
     bool exceptionThrown = false;
     try
       {
-        phySta->SetAttribute ("Frequency", UintegerValue (5281));
+        phySta->SetAttribute ("ChannelSettings", StringValue ("{45, 0, BAND_5GHZ, 0}"));
       }
     catch (const std::runtime_error&)
       {
@@ -1162,13 +1173,14 @@
     // case 17:
     WifiHelper wifi;
     wifi.SetRemoteStationManager ("ns3::IdealWifiManager");
-    wifi.SetStandard (WIFI_STANDARD_80211n_5GHZ);
+    wifi.SetStandard (WIFI_STANDARD_80211n);
+    phy.Set ("ChannelSettings", StringValue ("{44, 0, BAND_5GHZ, 0}"));
     staDevice = wifi.Install (phy, macSta, wifiStaNode.Get (0));
     phySta = GetYansWifiPhyPtr (staDevice);
-    // Test that setting Frequency to a standard value will set the
-    // channel number correctly
-    phySta->SetAttribute ("Frequency", UintegerValue (5500));
-    // We expect channel number to be 100 due to frequency 5500
+    // Test that setting channel to a standard value will set the
+    // frequency correctly
+    phySta->SetAttribute ("ChannelSettings", StringValue ("{100, 0, BAND_5GHZ, 0}"));
+    // We expect frequency to be 5500 due to channel number being 100
     NS_TEST_ASSERT_MSG_EQ (phySta->GetChannelNumber (), 100, "802.11 5GHz configuration");
     NS_TEST_ASSERT_MSG_EQ (phySta->GetChannelWidth (), 20, "802.11 5GHz configuration");
     NS_TEST_ASSERT_MSG_EQ (phySta->GetFrequency (), 5500, "802.11 5GHz configuration");
@@ -1178,13 +1190,14 @@
     // Set a wrong channel after initialization
     WifiHelper wifi;
     wifi.SetRemoteStationManager ("ns3::IdealWifiManager");
-    wifi.SetStandard (WIFI_STANDARD_80211n_5GHZ);
+    wifi.SetStandard (WIFI_STANDARD_80211n);
+    phy.Set ("ChannelSettings", StringValue ("{44, 0, BAND_5GHZ, 0}"));
     staDevice = wifi.Install (phy, macSta, wifiStaNode.Get (0));
     phySta = GetYansWifiPhyPtr (staDevice);
     bool exceptionThrown = false;
     try
       {
-        phySta->SetOperatingChannel (99, 5185, 40);
+        phySta->SetOperatingChannel (WifiPhy::ChannelTuple {99, 40, WIFI_PHY_BAND_5GHZ, 0});
       }
     catch (const std::runtime_error&)
       {
@@ -1198,21 +1211,22 @@
     WifiHelper wifi;
     wifi.SetRemoteStationManager ("ns3::IdealWifiManager");
     // Test how channel number behaves when frequency is non-standard
-    wifi.SetStandard (WIFI_STANDARD_80211n_5GHZ);
+    wifi.SetStandard (WIFI_STANDARD_80211n);
+    phy.Set ("ChannelSettings", StringValue ("{44, 0, BAND_5GHZ, 0}"));
     staDevice = wifi.Install (phy, macSta, wifiStaNode.Get (0));
     phySta = GetYansWifiPhyPtr (staDevice);
     bool exceptionThrown = false;
     try
       {
-        phySta->SetAttribute ("Frequency", UintegerValue (5181));
+        phySta->SetAttribute ("ChannelSettings", StringValue ("{45, 0, BAND_5GHZ, 0}"));
       }
     catch (const std::runtime_error&)
       {
         exceptionThrown = true;
       }
-    // We expect that an exception is thrown due to unknown center frequency 5181
+    // We expect that an exception is thrown due to unknown channel number 45
     NS_TEST_ASSERT_MSG_EQ (exceptionThrown, true, "802.11 5GHz configuration");
-    phySta->SetAttribute ("Frequency", UintegerValue (5180));
+    phySta->SetAttribute ("ChannelSettings", StringValue ("{36, 0, BAND_5GHZ, 0}"));
     // We expect channel number to be 36 due to known center frequency 5180
     NS_TEST_ASSERT_MSG_EQ (phySta->GetChannelNumber (), 36, "802.11 5GHz configuration");
     NS_TEST_ASSERT_MSG_EQ (phySta->GetChannelWidth (), 20, "802.11 5GHz configuration");
@@ -1220,15 +1234,15 @@
     exceptionThrown = false;
     try
       {
-        phySta->SetAttribute ("Frequency", UintegerValue (5179));
+        phySta->SetAttribute ("ChannelSettings", StringValue ("{43, 0, BAND_5GHZ, 0}"));
       }
     catch (const std::runtime_error&)
       {
         exceptionThrown = true;
       }
-    // We expect that an exception is thrown due to unknown center frequency 5179
+    // We expect that an exception is thrown due to unknown channel number 43
     NS_TEST_ASSERT_MSG_EQ (exceptionThrown, true, "802.11 5GHz configuration");
-    phySta->SetAttribute ("ChannelNumber", UintegerValue (36));
+    phySta->SetAttribute ("ChannelSettings", StringValue ("{36, 0, BAND_5GHZ, 0}"));
     NS_TEST_ASSERT_MSG_EQ (phySta->GetChannelNumber (), 36, "802.11 5GHz configuration");
     NS_TEST_ASSERT_MSG_EQ (phySta->GetChannelWidth (), 20, "802.11 5GHz configuration");
     NS_TEST_ASSERT_MSG_EQ (phySta->GetFrequency (), 5180, "802.11 5GHz configuration");
@@ -1237,33 +1251,28 @@
     // case 20:
     WifiHelper wifi;
     wifi.SetRemoteStationManager ("ns3::IdealWifiManager");
-    // Set both channel and frequency to consistent values before initialization
-    phy.Set ("Frequency", UintegerValue (5200));
-    phy.Set ("ChannelNumber", UintegerValue (40));
-    wifi.SetStandard (WIFI_STANDARD_80211n_5GHZ);
+    phy.Set ("ChannelSettings", StringValue ("{40, 0, BAND_5GHZ, 0}"));
+    wifi.SetStandard (WIFI_STANDARD_80211n);
     staDevice = wifi.Install (phy, macSta, wifiStaNode.Get (0));
     phySta = GetYansWifiPhyPtr (staDevice);
     NS_TEST_ASSERT_MSG_EQ (phySta->GetChannelNumber (), 40, "802.11 5GHz configuration");
     NS_TEST_ASSERT_MSG_EQ (phySta->GetChannelWidth (), 20, "802.11 5GHz configuration");
     NS_TEST_ASSERT_MSG_EQ (phySta->GetFrequency (), 5200, "802.11 5GHz configuration");
     // Set both channel and frequency to consistent values after initialization
-    wifi.SetStandard (WIFI_STANDARD_80211n_5GHZ);
+    wifi.SetStandard (WIFI_STANDARD_80211n);
     staDevice = wifi.Install (phy, macSta, wifiStaNode.Get (0));
     phySta = GetYansWifiPhyPtr (staDevice);
-    phySta->SetAttribute ("Frequency", UintegerValue (5200));
-    phySta->SetAttribute ("ChannelNumber", UintegerValue (40));
+    phySta->SetAttribute ("ChannelSettings", StringValue ("{40, 0, BAND_5GHZ, 0}"));
     NS_TEST_ASSERT_MSG_EQ (phySta->GetChannelNumber (), 40, "802.11 5GHz configuration");
     NS_TEST_ASSERT_MSG_EQ (phySta->GetChannelWidth (), 20, "802.11 5GHz configuration");
     NS_TEST_ASSERT_MSG_EQ (phySta->GetFrequency (), 5200, "802.11 5GHz configuration");
-    // Set both channel and frequency to inconsistent values
-    phySta->SetAttribute ("Frequency", UintegerValue (5200));
-    phySta->SetAttribute ("ChannelNumber", UintegerValue (36));
+
+    phySta->SetAttribute ("ChannelSettings", StringValue ("{36, 0, BAND_5GHZ, 0}"));
     // We expect channel number to be 36
     NS_TEST_ASSERT_MSG_EQ (phySta->GetChannelNumber (), 36, "802.11 5GHz configuration");
     NS_TEST_ASSERT_MSG_EQ (phySta->GetChannelWidth (), 20, "802.11 5GHz configuration");
     NS_TEST_ASSERT_MSG_EQ (phySta->GetFrequency (), 5180, "802.11 5GHz configuration");
-    phySta->SetAttribute ("ChannelNumber", UintegerValue (36));
-    phySta->SetAttribute ("Frequency", UintegerValue (5200));
+    phySta->SetAttribute ("ChannelSettings", StringValue ("{40, 0, BAND_5GHZ, 0}"));
     // We expect channel number to be 40
     NS_TEST_ASSERT_MSG_EQ (phySta->GetChannelNumber (), 40, "802.11 5GHz configuration");
     NS_TEST_ASSERT_MSG_EQ (phySta->GetChannelWidth (), 20, "802.11 5GHz configuration");
@@ -1271,23 +1280,23 @@
     bool exceptionThrown = false;
     try
       {
-        phySta->SetAttribute ("Frequency", UintegerValue (5179));
+        phySta->SetAttribute ("ChannelSettings", StringValue ("{45, 0, BAND_5GHZ, 0}"));
       }
     catch (const std::runtime_error&)
       {
         exceptionThrown = true;
       }
-    phySta->SetAttribute ("ChannelNumber", UintegerValue (36));
+    phySta->SetAttribute ("ChannelSettings", StringValue ("{36, 0, BAND_5GHZ, 0}"));
     // We expect channel number to be 36 and an exception to be thrown
     NS_TEST_ASSERT_MSG_EQ (phySta->GetChannelNumber (), 36, "802.11 5GHz configuration");
     NS_TEST_ASSERT_MSG_EQ (phySta->GetChannelWidth (), 20, "802.11 5GHz configuration");
     NS_TEST_ASSERT_MSG_EQ (phySta->GetFrequency (), 5180, "802.11 5GHz configuration");
     NS_TEST_ASSERT_MSG_EQ (exceptionThrown, true, "802.11 5GHz configuration");
-    phySta->SetAttribute ("ChannelNumber", UintegerValue (36));
+    phySta->SetAttribute ("ChannelSettings", StringValue ("{36, 0, BAND_5GHZ, 0}"));
     exceptionThrown = false;
     try
       {
-        phySta->SetAttribute ("Frequency", UintegerValue (5179));
+        phySta->SetAttribute ("ChannelSettings", StringValue ("{43, 0, BAND_5GHZ, 0}"));
       }
     catch (const std::runtime_error&)
       {
@@ -1356,7 +1365,7 @@
   //Generate same backoff for AC_VI and AC_VO
   //The below combination will work
   RngSeedManager::SetSeed (1);
-  RngSeedManager::SetRun (16);
+  RngSeedManager::SetRun (1);
   int64_t streamNumber = 100;
 
   NodeContainer wifiNodes;
@@ -1556,8 +1565,7 @@
 
   spectrumPhy.SetChannel (spectrumChannel);
   spectrumPhy.SetErrorRateModel ("ns3::NistErrorRateModel");
-  spectrumPhy.Set ("Frequency", UintegerValue (5190));
-  spectrumPhy.Set ("ChannelWidth", UintegerValue (channelWidth));
+  spectrumPhy.Set ("ChannelSettings", StringValue ("{38, 40, BAND_5GHZ, 0}"));
   spectrumPhy.Set ("TxPowerStart", DoubleValue (10));
   spectrumPhy.Set ("TxPowerEnd", DoubleValue (10));
 
@@ -1619,7 +1627,7 @@
  * The scenario considers an access point and a station using a 20 MHz channel width.
  * After 1s, we change the channel width and the channel number to use a 40 MHz channel.
  * The tests checks the operational channel width sent in Beacon frames
- * and verify that a reassociation procedure is executed.
+ * and verify that the association procedure is executed twice.
  *
  * See \bugid{2831}
  */
@@ -1647,16 +1655,16 @@
   Ptr<YansWifiPhy> m_apPhy; ///< AP PHY
   Ptr<YansWifiPhy> m_staPhy; ///< STA PHY
 
-  uint16_t m_reassocReqCount; ///< count number of reassociation requests
-  uint16_t m_reassocRespCount; ///< count number of reassociation responses
+  uint16_t m_assocReqCount; ///< count number of association requests
+  uint16_t m_assocRespCount; ///< count number of association responses
   uint16_t m_countOperationalChannelWidth20; ///< count number of beacon frames announcing a 20 MHz operating channel width
   uint16_t m_countOperationalChannelWidth40; ///< count number of beacon frames announcing a 40 MHz operating channel width
 };
 
 Bug2831TestCase::Bug2831TestCase ()
   : TestCase ("Test case for Bug 2831"),
-    m_reassocReqCount (0),
-    m_reassocRespCount (0),
+    m_assocReqCount (0),
+    m_assocRespCount (0),
     m_countOperationalChannelWidth20 (0),
     m_countOperationalChannelWidth40 (0)
 {
@@ -1669,10 +1677,8 @@
 void
 Bug2831TestCase::ChangeSupportedChannelWidth ()
 {
-  m_apPhy->SetChannelNumber (38);
-  m_apPhy->SetChannelWidth (40);
-  m_staPhy->SetChannelNumber (38);
-  m_staPhy->SetChannelWidth (40);
+  m_apPhy->SetOperatingChannel (WifiPhy::ChannelTuple {38, 40, (int)(WIFI_PHY_BAND_5GHZ), 0});
+  m_staPhy->SetOperatingChannel (WifiPhy::ChannelTuple {38, 40, (int)(WIFI_PHY_BAND_5GHZ), 0});
 }
 
 void
@@ -1681,13 +1687,13 @@
   Ptr<Packet> packet = p->Copy ();
   WifiMacHeader hdr;
   packet->RemoveHeader (hdr);
-  if (hdr.IsReassocReq ())
+  if (hdr.IsAssocReq ())
     {
-      m_reassocReqCount++;
+      m_assocReqCount++;
     }
-  else if (hdr.IsReassocResp ())
+  else if (hdr.IsAssocResp ())
     {
-      m_reassocRespCount++;
+      m_assocRespCount++;
     }
   else if (hdr.IsBeacon ())
     {
@@ -1718,15 +1724,17 @@
 
   Ptr<Node> apNode = CreateObject<Node> ();
   Ptr<WifiNetDevice> apDev = CreateObject<WifiNetDevice> ();
+  apDev->SetStandard (WIFI_STANDARD_80211ax);
   Ptr<HtConfiguration> apHtConfiguration = CreateObject<HtConfiguration> ();
   apDev->SetHtConfiguration (apHtConfiguration);
   ObjectFactory mac;
   mac.SetTypeId ("ns3::ApWifiMac");
   mac.Set ("EnableBeaconJitter", BooleanValue (false));
-  Ptr<RegularWifiMac> apMac = mac.Create<RegularWifiMac> ();
+  mac.Set ("QosSupported", BooleanValue (true));
+  Ptr<WifiMac> apMac = mac.Create<WifiMac> ();
   apMac->SetDevice (apDev);
   apMac->SetAddress (Mac48Address::Allocate ());
-  apMac->ConfigureStandard (WIFI_STANDARD_80211ax_5GHZ);
+  apMac->ConfigureStandard (WIFI_STANDARD_80211ax);
   Ptr<FrameExchangeManager> fem = apMac->GetFrameExchangeManager ();
   Ptr<WifiProtectionManager> protectionManager = CreateObject<WifiDefaultProtectionManager> ();
   protectionManager->SetWifiMac (apMac);
@@ -1737,13 +1745,14 @@
 
   Ptr<Node> staNode = CreateObject<Node> ();
   Ptr<WifiNetDevice> staDev = CreateObject<WifiNetDevice> ();
+  staDev->SetStandard (WIFI_STANDARD_80211ax);
   Ptr<HtConfiguration> staHtConfiguration = CreateObject<HtConfiguration> ();
   staDev->SetHtConfiguration (staHtConfiguration);
   mac.SetTypeId ("ns3::StaWifiMac");
-  Ptr<RegularWifiMac> staMac = mac.Create<RegularWifiMac> ();
+  Ptr<WifiMac> staMac = mac.Create<WifiMac> ();
   staMac->SetDevice (staDev);
   staMac->SetAddress (Mac48Address::Allocate ());
-  staMac->ConfigureStandard (WIFI_STANDARD_80211ax_5GHZ);
+  staMac->ConfigureStandard (WIFI_STANDARD_80211ax);
   fem = staMac->GetFrameExchangeManager ();
   protectionManager = CreateObject<WifiDefaultProtectionManager> ();
   protectionManager->SetWifiMac (staMac);
@@ -1762,9 +1771,8 @@
   m_apPhy->SetChannel (channel);
   m_apPhy->SetMobility (apMobility);
   m_apPhy->SetDevice (apDev);
-  m_apPhy->ConfigureStandardAndBand (WIFI_PHY_STANDARD_80211ax, WIFI_PHY_BAND_5GHZ);
-  m_apPhy->SetChannelNumber (36);
-  m_apPhy->SetChannelWidth (20);
+  m_apPhy->ConfigureStandard (WIFI_STANDARD_80211ax);
+  m_apPhy->SetOperatingChannel (WifiPhy::ChannelTuple {36, 20, (int)(WIFI_PHY_BAND_5GHZ), 0});
 
   Ptr<ConstantPositionMobilityModel> staMobility = CreateObject<ConstantPositionMobilityModel> ();
   staMobility->SetPosition (Vector (1.0, 0.0, 0.0));
@@ -1775,9 +1783,8 @@
   m_staPhy->SetChannel (channel);
   m_staPhy->SetMobility (staMobility);
   m_staPhy->SetDevice (apDev);
-  m_staPhy->ConfigureStandardAndBand (WIFI_PHY_STANDARD_80211ax, WIFI_PHY_BAND_5GHZ);
-  m_staPhy->SetChannelNumber (36);
-  m_staPhy->SetChannelWidth (20);
+  m_staPhy->ConfigureStandard (WIFI_STANDARD_80211ax);
+  m_staPhy->SetOperatingChannel (WifiPhy::ChannelTuple {36, 20, (int)(WIFI_PHY_BAND_5GHZ), 0});
 
   apDev->SetMac (apMac);
   apDev->SetPhy (m_apPhy);
@@ -1799,8 +1806,8 @@
   Simulator::Run ();
   Simulator::Destroy ();
 
-  NS_TEST_ASSERT_MSG_EQ (m_reassocReqCount, 1, "Reassociation request not received");
-  NS_TEST_ASSERT_MSG_EQ (m_reassocRespCount, 1, "Reassociation response not received");
+  NS_TEST_ASSERT_MSG_EQ (m_assocReqCount, 2, "Second Association request not received");
+  NS_TEST_ASSERT_MSG_EQ (m_assocRespCount, 2, "Second Association response not received");
   NS_TEST_ASSERT_MSG_EQ (m_countOperationalChannelWidth20, 10, "Incorrect operational channel width before channel change");
   NS_TEST_ASSERT_MSG_EQ (m_countOperationalChannelWidth40, 20, "Incorrect operational channel width after channel change");
 }
@@ -1905,7 +1912,7 @@
   phy.SetChannel (channel.Create ());
 
   WifiHelper wifi;
-  wifi.SetStandard (WIFI_STANDARD_80211n_2_4GHZ);
+  wifi.SetStandard (WIFI_STANDARD_80211n);
   wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager");
 
   WifiMacHelper mac;
@@ -2170,7 +2177,7 @@
   phy.SetChannel (channel.Create ());
 
   WifiHelper wifi;
-  wifi.SetStandard (WIFI_STANDARD_80211n_5GHZ);
+  wifi.SetStandard (WIFI_STANDARD_80211n);
   wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager",
                                 "DataMode", StringValue ("HtMcs7"),
                                 "ControlMode", StringValue ("HtMcs7"));
@@ -2178,6 +2185,7 @@
   WifiMacHelper mac;
   NetDeviceContainer apDevice;
   phy.Set ("PostReceptionErrorModel", apErrorModel);
+  phy.Set ("ChannelSettings", StringValue ("{36, 20, BAND_5GHZ, 0}"));
   mac.SetType ("ns3::ApWifiMac", "EnableBeaconJitter", BooleanValue (false));
   apDevice = wifi.Install (phy, mac, wifiApNode);
 
@@ -2202,7 +2210,7 @@
 
   Config::Connect ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/$ns3::WifiPhy/MonitorSnifferRx", MakeCallback (&Bug2470TestCase::RxCallback, this));
   Config::Connect ("/NodeList/*/DeviceList/*/Phy/State/RxError", MakeCallback (&Bug2470TestCase::RxErrorCallback, this));
-  Config::Connect ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Mac/$ns3::RegularWifiMac/BE_Txop/BlockAckManager/AgreementState", MakeCallback (&Bug2470TestCase::AddbaStateChangedCallback, this));
+  Config::Connect ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Mac/$ns3::WifiMac/BE_Txop/BlockAckManager/AgreementState", MakeCallback (&Bug2470TestCase::AddbaStateChangedCallback, this));
 
   Simulator::Schedule (Seconds (0.5), &Bug2470TestCase::SendPacketBurst, this, 1, apDevice.Get (0), staDevice.Get (0)->GetAddress ());
   Simulator::Schedule (Seconds (0.5) + MicroSeconds (5), &Bug2470TestCase::SendPacketBurst, this, 4, apDevice.Get (0), staDevice.Get (0)->GetAddress ());
@@ -2224,12 +2232,12 @@
   Ptr<ReceiveListErrorModel> staPem = CreateObject<ReceiveListErrorModel> ();
   std::list<uint32_t> blackList;
   // Block ADDBA request 6 times (== maximum number of MAC frame transmissions in the ADDBA response timeout interval)
-  blackList.push_back (8);
   blackList.push_back (9);
   blackList.push_back (10);
   blackList.push_back (11);
   blackList.push_back (12);
   blackList.push_back (13);
+  blackList.push_back (14);
   staPem->SetList (blackList);
 
   {
@@ -2260,15 +2268,16 @@
 
   Ptr<ReceiveListErrorModel> apPem = CreateObject<ReceiveListErrorModel> ();
   blackList.clear ();
-  // Block ADDBA request 3 times (== maximum number of MAC frame transmissions in the ADDBA response timeout interval)
-  blackList.push_back (4);
+  // Block ADDBA request 4 times (== maximum number of MAC frame transmissions in the ADDBA response timeout interval)
   blackList.push_back (5);
   blackList.push_back (6);
+  blackList.push_back (7);
+  blackList.push_back (9);
   apPem->SetList (blackList);
 
   {
     RunSubtest (PointerValue (apPem), PointerValue ());
-    NS_TEST_ASSERT_MSG_EQ (m_failedActionCount, 3, "ADDBA response packets are not failed");
+    NS_TEST_ASSERT_MSG_EQ (m_failedActionCount, 4, "ADDBA response packets are not failed");
     // Similar to subtest 1, we also expect to receive 6 normal MPDU packets and 4 A-MPDU packets.
     NS_TEST_ASSERT_MSG_EQ (m_receivedNormalMpduCount, 6, "Receiving incorrect number of normal MPDU packet on subtest 2");
     NS_TEST_ASSERT_MSG_EQ (m_receivedAmpduCount, 4, "Receiving incorrect number of A-MPDU packet on subtest 2");
@@ -2432,10 +2441,8 @@
     {
       // Disable use of BAR that are sent with the lowest modulation so that we can also reproduce the problem with A-MPDU, i.e. the lack of feedback about SNR change
       Ptr<WifiNetDevice> ap_device = DynamicCast<WifiNetDevice> (apDevice.Get (0));
-      Ptr<RegularWifiMac> ap_mac = DynamicCast<RegularWifiMac> (ap_device->GetMac ());
-      NS_ASSERT (ap_mac);
       PointerValue ptr;
-      ap_mac->GetAttribute ("BE_Txop", ptr);
+      ap_device->GetMac ()->GetAttribute ("BE_Txop", ptr);
       ptr.Get<QosTxop> ()->SetAttribute ("UseExplicitBarAfterMissedBlockAck", BooleanValue (false));
   }
 
@@ -2666,24 +2673,8 @@
 void
 IdealRateManagerChannelWidthTest::ChangeChannelWidth (uint16_t channelWidth)
 {
-  uint16_t frequency;
-  switch (channelWidth)
-    {
-    case 20:
-    default:
-      frequency = 5180;
-      break;
-    case 40:
-      frequency = 5190;
-      break;
-    case 80:
-      frequency = 5210;
-      break;
-    case 160:
-      frequency = 5250;
-      break;
-    }
-  Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/Frequency", UintegerValue (frequency));
+  Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/ChannelSettings",
+               StringValue ("{0, " + std::to_string (channelWidth) + ", BAND_5GHZ, 0}"));
 }
 
 void
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/test/wifi-transmit-mask-test.cc ns-3.36/src/wifi/test/wifi-transmit-mask-test.cc
--- ns-3.35/src/wifi/test/wifi-transmit-mask-test.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/test/wifi-transmit-mask-test.cc	2022-04-30 18:23:58.222735200 -0700
@@ -54,7 +54,7 @@
    * Constructor
    *
    * \param str test reference name
-   * \param standard selected PHY standard
+   * \param standard selected standard
    * \param band selected PHY band
    * \param bw bandwidth
    * \param maskRefsLeft vector of expected power values and corresponding indexes of generated PSD
@@ -63,7 +63,7 @@
    *                      (only start and stop indexes/values given) for right guard bandwidth
    * \param tol tolerance (in dB)
    */
-  WifiOfdmMaskSlopesTestCase (const char* str, WifiPhyStandard standard, WifiPhyBand band, uint8_t bw,
+  WifiOfdmMaskSlopesTestCase (const char* str, WifiStandard standard, WifiPhyBand band, uint8_t bw,
                               IndexPowerVect maskRefsLeft, IndexPowerVect maskRefsRight, double tol);
   virtual ~WifiOfdmMaskSlopesTestCase ();
 
@@ -89,7 +89,7 @@
                                           double tol);
 };
 
-WifiOfdmMaskSlopesTestCase::WifiOfdmMaskSlopesTestCase (const char* str, WifiPhyStandard standard, WifiPhyBand band, uint8_t bw,
+WifiOfdmMaskSlopesTestCase::WifiOfdmMaskSlopesTestCase (const char* str, WifiStandard standard, WifiPhyBand band, uint8_t bw,
                                                         IndexPowerVect maskRefsLeft, IndexPowerVect maskRefsRight, double tol)
   :   TestCase (std::string ("SpectrumValue ") + str)
 {
@@ -102,23 +102,23 @@
 
   switch (standard)
     {
-    case WIFI_PHY_STANDARD_80211p:
+    case WIFI_STANDARD_80211p:
       NS_ASSERT ((bw == 5) || (bw == 10));
       freq = 5860;
       m_actualSpectrum = WifiSpectrumValueHelper::CreateOfdmTxPowerSpectralDensity (freq, bw, refTxPowerW, bw, -20.0, -28.0, outerBandMaximumRejection);
       break;
 
     // 11g and 11a
-    case WIFI_PHY_STANDARD_80211g:
+    case WIFI_STANDARD_80211g:
       freq = 2412;
     // no break on purpose
-    case WIFI_PHY_STANDARD_80211a:
+    case WIFI_STANDARD_80211a:
       NS_ASSERT (bw == 20);
       m_actualSpectrum = WifiSpectrumValueHelper::CreateOfdmTxPowerSpectralDensity (freq, bw, refTxPowerW, bw, -20.0, -28.0, outerBandMaximumRejection);
       break;
 
     // 11n
-    case WIFI_PHY_STANDARD_80211n:
+    case WIFI_STANDARD_80211n:
       if (band == WIFI_PHY_BAND_2_4GHZ)
         {
           freq = 2402 + (bw / 2); //so as to have 2412/2422 for 20/40
@@ -129,13 +129,13 @@
       break;
 
     // 11ac
-    case WIFI_PHY_STANDARD_80211ac:
+    case WIFI_STANDARD_80211ac:
       NS_ASSERT (bw == 20 || bw == 40 || bw == 80 || bw == 160);
       m_actualSpectrum = WifiSpectrumValueHelper::CreateHtOfdmTxPowerSpectralDensity (freq, bw, refTxPowerW, bw, -20.0, -28.0, outerBandMaximumRejection);
       break;
 
     // 11ax
-    case WIFI_PHY_STANDARD_80211ax:
+    case WIFI_STANDARD_80211ax:
       if (band == WIFI_PHY_BAND_2_4GHZ)
         {
           NS_ASSERT (bw != 160); // not enough space in 2.4 GHz bands
@@ -275,7 +275,7 @@
   maskSlopesRight.push_back (std::make_pair (160, -28.000)); // Middle band right (stop)
   maskSlopesRight.push_back (std::make_pair (161, -28.375)); // Outer band right (start)
   maskSlopesRight.push_back (std::make_pair (192, -40.0)); // Outer band right (stop)
-  AddTestCase (new WifiOfdmMaskSlopesTestCase ("11p 5MHz", WIFI_PHY_STANDARD_80211p, WIFI_PHY_BAND_5GHZ,
+  AddTestCase (new WifiOfdmMaskSlopesTestCase ("11p 5MHz", WIFI_STANDARD_80211p, WIFI_PHY_BAND_5GHZ,
                                                5, maskSlopesLeft, maskSlopesRight, tol),
                TestCase::QUICK);
 
@@ -299,7 +299,7 @@
   maskSlopesRight.push_back (std::make_pair (160, -28.000)); // Middle band right (stop)
   maskSlopesRight.push_back (std::make_pair (161, -28.375)); // Outer band right (start)
   maskSlopesRight.push_back (std::make_pair (192, -40.0)); // Outer band right (stop)
-  AddTestCase (new WifiOfdmMaskSlopesTestCase ("11p 10MHz", WIFI_PHY_STANDARD_80211p, WIFI_PHY_BAND_5GHZ,
+  AddTestCase (new WifiOfdmMaskSlopesTestCase ("11p 10MHz", WIFI_STANDARD_80211p, WIFI_PHY_BAND_5GHZ,
                                                10, maskSlopesLeft, maskSlopesRight, tol),
                TestCase::QUICK);
 
@@ -325,14 +325,14 @@
   maskSlopesRight.push_back (std::make_pair (160, -28.000)); // Middle band right (stop)
   maskSlopesRight.push_back (std::make_pair (161, -28.375)); // Outer band right (start)
   maskSlopesRight.push_back (std::make_pair (192, -40.0)); // Outer band right (stop)
-  AddTestCase (new WifiOfdmMaskSlopesTestCase ("11a", WIFI_PHY_STANDARD_80211a, WIFI_PHY_BAND_5GHZ,
+  AddTestCase (new WifiOfdmMaskSlopesTestCase ("11a", WIFI_STANDARD_80211a, WIFI_PHY_BAND_5GHZ,
                                                20, maskSlopesLeft, maskSlopesRight, tol),
                TestCase::QUICK);
 
   // 11g
   NS_LOG_FUNCTION ("Check slopes for 11g");
   // same slppes as 11g
-  AddTestCase (new WifiOfdmMaskSlopesTestCase ("11g", WIFI_PHY_STANDARD_80211g, WIFI_PHY_BAND_2_4GHZ,
+  AddTestCase (new WifiOfdmMaskSlopesTestCase ("11g", WIFI_STANDARD_80211g, WIFI_PHY_BAND_2_4GHZ,
                                                20, maskSlopesLeft, maskSlopesRight, tol),
                TestCase::QUICK);
 
@@ -358,7 +358,7 @@
   maskSlopesRight.push_back (std::make_pair (160, -28.000)); // Middle band right (stop)
   maskSlopesRight.push_back (std::make_pair (161, -28.531)); // Outer band right (start)
   maskSlopesRight.push_back (std::make_pair (192, -45.000)); // Outer band right (stop)
-  AddTestCase (new WifiOfdmMaskSlopesTestCase ("11n_2.4GHz 20MHz", WIFI_PHY_STANDARD_80211n, WIFI_PHY_BAND_2_4GHZ,
+  AddTestCase (new WifiOfdmMaskSlopesTestCase ("11n_2.4GHz 20MHz", WIFI_STANDARD_80211n, WIFI_PHY_BAND_2_4GHZ,
                                                20, maskSlopesLeft, maskSlopesRight, tol),
                TestCase::QUICK);
 
@@ -382,7 +382,7 @@
   maskSlopesRight.push_back (std::make_pair (160, -28.000)); // Middle band right (stop)
   maskSlopesRight.push_back (std::make_pair (161, -28.375)); // Outer band right (start)
   maskSlopesRight.push_back (std::make_pair (192, -40.0)); // Outer band right (stop)
-  AddTestCase (new WifiOfdmMaskSlopesTestCase ("11n_5GHz 20MHz", WIFI_PHY_STANDARD_80211n, WIFI_PHY_BAND_5GHZ,
+  AddTestCase (new WifiOfdmMaskSlopesTestCase ("11n_5GHz 20MHz", WIFI_STANDARD_80211n, WIFI_PHY_BAND_5GHZ,
                                                20, maskSlopesLeft, maskSlopesRight, tol),
                TestCase::QUICK);
 
@@ -406,7 +406,7 @@
   maskSlopesRight.push_back (std::make_pair (320, -28.000)); // Middle band right (stop)
   maskSlopesRight.push_back (std::make_pair (321, -28.266)); // Outer band right (start)
   maskSlopesRight.push_back (std::make_pair (384, -45.000)); // Outer band right (stop)
-  AddTestCase (new WifiOfdmMaskSlopesTestCase ("11n_2.4GHz 40MHz", WIFI_PHY_STANDARD_80211n, WIFI_PHY_BAND_2_4GHZ,
+  AddTestCase (new WifiOfdmMaskSlopesTestCase ("11n_2.4GHz 40MHz", WIFI_STANDARD_80211n, WIFI_PHY_BAND_2_4GHZ,
                                                40, maskSlopesLeft, maskSlopesRight, tol),
                TestCase::QUICK);
 
@@ -430,7 +430,7 @@
   maskSlopesRight.push_back (std::make_pair (320, -28.000)); // Middle band right (stop)
   maskSlopesRight.push_back (std::make_pair (321, -28.188)); // Outer band right (start)
   maskSlopesRight.push_back (std::make_pair (384, -40.0)); // Outer band right (stop)
-  AddTestCase (new WifiOfdmMaskSlopesTestCase ("11n_5GHz 40MHz", WIFI_PHY_STANDARD_80211n, WIFI_PHY_BAND_5GHZ,
+  AddTestCase (new WifiOfdmMaskSlopesTestCase ("11n_5GHz 40MHz", WIFI_STANDARD_80211n, WIFI_PHY_BAND_5GHZ,
                                                40, maskSlopesLeft, maskSlopesRight, tol),
                TestCase::QUICK);
 
@@ -456,7 +456,7 @@
   maskSlopesRight.push_back (std::make_pair (160, -28.000)); // Middle band right (stop)
   maskSlopesRight.push_back (std::make_pair (161, -28.375)); // Outer band right (start)
   maskSlopesRight.push_back (std::make_pair (192, -40.0)); // Outer band right (stop)
-  AddTestCase (new WifiOfdmMaskSlopesTestCase ("11ac 20MHz", WIFI_PHY_STANDARD_80211ac, WIFI_PHY_BAND_5GHZ,
+  AddTestCase (new WifiOfdmMaskSlopesTestCase ("11ac 20MHz", WIFI_STANDARD_80211ac, WIFI_PHY_BAND_5GHZ,
                                                20, maskSlopesLeft, maskSlopesRight, tol),
                TestCase::QUICK);
 
@@ -480,7 +480,7 @@
   maskSlopesRight.push_back (std::make_pair (320, -28.000)); // Middle band right (stop)
   maskSlopesRight.push_back (std::make_pair (321, -28.188)); // Outer band right (start)
   maskSlopesRight.push_back (std::make_pair (384, -40.0)); // Outer band right (stop)
-  AddTestCase (new WifiOfdmMaskSlopesTestCase ("11ac 40MHz", WIFI_PHY_STANDARD_80211ac, WIFI_PHY_BAND_5GHZ,
+  AddTestCase (new WifiOfdmMaskSlopesTestCase ("11ac 40MHz", WIFI_STANDARD_80211ac, WIFI_PHY_BAND_5GHZ,
                                                40, maskSlopesLeft, maskSlopesRight, tol),
                TestCase::QUICK);
 
@@ -504,7 +504,7 @@
   maskSlopesRight.push_back (std::make_pair (640, -28.000)); // Middle band right (stop)
   maskSlopesRight.push_back (std::make_pair (641, -28.094)); // Outer band right (start)
   maskSlopesRight.push_back (std::make_pair (768, -40.0)); // Outer band right (stop)
-  AddTestCase (new WifiOfdmMaskSlopesTestCase ("11ac 80MHz", WIFI_PHY_STANDARD_80211ac, WIFI_PHY_BAND_5GHZ,
+  AddTestCase (new WifiOfdmMaskSlopesTestCase ("11ac 80MHz", WIFI_STANDARD_80211ac, WIFI_PHY_BAND_5GHZ,
                                                80, maskSlopesLeft, maskSlopesRight, tol),
                TestCase::QUICK);
 
@@ -528,7 +528,7 @@
   maskSlopesRight.push_back (std::make_pair (1280, -28.000)); // Middle band right (stop)
   maskSlopesRight.push_back (std::make_pair (1281, -28.047)); // Outer band right (start)
   maskSlopesRight.push_back (std::make_pair (1536, -40.0)); // Outer band right (stop)
-  AddTestCase (new WifiOfdmMaskSlopesTestCase ("11ac 160MHz", WIFI_PHY_STANDARD_80211ac, WIFI_PHY_BAND_5GHZ,
+  AddTestCase (new WifiOfdmMaskSlopesTestCase ("11ac 160MHz", WIFI_STANDARD_80211ac, WIFI_PHY_BAND_5GHZ,
                                                160, maskSlopesLeft, maskSlopesRight, tol),
                TestCase::QUICK);
 
@@ -554,7 +554,7 @@
   maskSlopesRight.push_back (std::make_pair (640, -28.000)); // Middle band right (stop)
   maskSlopesRight.push_back (std::make_pair (641, -28.133)); // Outer band right (start)
   maskSlopesRight.push_back (std::make_pair (768, -45.000)); // Outer band right (stop)
-  AddTestCase (new WifiOfdmMaskSlopesTestCase ("11ax_2.4GHz 20MHz", WIFI_PHY_STANDARD_80211ax, WIFI_PHY_BAND_2_4GHZ,
+  AddTestCase (new WifiOfdmMaskSlopesTestCase ("11ax_2.4GHz 20MHz", WIFI_STANDARD_80211ax, WIFI_PHY_BAND_2_4GHZ,
                                                20, maskSlopesLeft, maskSlopesRight, tol),
                TestCase::QUICK);
 
@@ -578,7 +578,7 @@
   maskSlopesRight.push_back (std::make_pair (640, -28.000)); // Middle band right (stop)
   maskSlopesRight.push_back (std::make_pair (641, -28.094)); // Outer band right (start)
   maskSlopesRight.push_back (std::make_pair (768, -40.0)); // Outer band right (stop)
-  AddTestCase (new WifiOfdmMaskSlopesTestCase ("11ax_5GHz 20MHz", WIFI_PHY_STANDARD_80211ax, WIFI_PHY_BAND_5GHZ,
+  AddTestCase (new WifiOfdmMaskSlopesTestCase ("11ax_5GHz 20MHz", WIFI_STANDARD_80211ax, WIFI_PHY_BAND_5GHZ,
                                                20, maskSlopesLeft, maskSlopesRight, tol),
                TestCase::QUICK);
 
@@ -602,7 +602,7 @@
   maskSlopesRight.push_back (std::make_pair (1280, -28.000)); // Middle band right (stop)
   maskSlopesRight.push_back (std::make_pair (1281, -28.066)); // Outer band right (start)
   maskSlopesRight.push_back (std::make_pair (1536, -45.000)); // Outer band right (stop)
-  AddTestCase (new WifiOfdmMaskSlopesTestCase ("11ax_2.4GHz 40MHz", WIFI_PHY_STANDARD_80211ax, WIFI_PHY_BAND_2_4GHZ,
+  AddTestCase (new WifiOfdmMaskSlopesTestCase ("11ax_2.4GHz 40MHz", WIFI_STANDARD_80211ax, WIFI_PHY_BAND_2_4GHZ,
                                                40, maskSlopesLeft, maskSlopesRight, tol),
                TestCase::QUICK);
 
@@ -626,7 +626,7 @@
   maskSlopesRight.push_back (std::make_pair (1280, -28.000)); // Middle band right (stop)
   maskSlopesRight.push_back (std::make_pair (1281, -28.047)); // Outer band right (start)
   maskSlopesRight.push_back (std::make_pair (1536, -40.0)); // Outer band right (stop)
-  AddTestCase (new WifiOfdmMaskSlopesTestCase ("11ax_5GHz 40MHz", WIFI_PHY_STANDARD_80211ax, WIFI_PHY_BAND_5GHZ,
+  AddTestCase (new WifiOfdmMaskSlopesTestCase ("11ax_5GHz 40MHz", WIFI_STANDARD_80211ax, WIFI_PHY_BAND_5GHZ,
                                                40, maskSlopesLeft, maskSlopesRight, tol),
                TestCase::QUICK);
 
@@ -650,7 +650,7 @@
   maskSlopesRight.push_back (std::make_pair (2560, -28.000)); // Middle band right (stop)
   maskSlopesRight.push_back (std::make_pair (2561, -28.033)); // Outer band right (start)
   maskSlopesRight.push_back (std::make_pair (3072, -45.000)); // Outer band right (stop)
-  AddTestCase (new WifiOfdmMaskSlopesTestCase ("11ax_2.4GHz 80MHz", WIFI_PHY_STANDARD_80211ax, WIFI_PHY_BAND_2_4GHZ,
+  AddTestCase (new WifiOfdmMaskSlopesTestCase ("11ax_2.4GHz 80MHz", WIFI_STANDARD_80211ax, WIFI_PHY_BAND_2_4GHZ,
                                                80, maskSlopesLeft, maskSlopesRight, tol),
                TestCase::QUICK);
 
@@ -674,7 +674,7 @@
   maskSlopesRight.push_back (std::make_pair (2560, -28.000)); // Middle band right (stop)
   maskSlopesRight.push_back (std::make_pair (2561, -28.023)); // Outer band right (start)
   maskSlopesRight.push_back (std::make_pair (3072, -40.0)); // Outer band right (stop)
-  AddTestCase (new WifiOfdmMaskSlopesTestCase ("11ax_5GHz 80MHz", WIFI_PHY_STANDARD_80211ax, WIFI_PHY_BAND_5GHZ,
+  AddTestCase (new WifiOfdmMaskSlopesTestCase ("11ax_5GHz 80MHz", WIFI_STANDARD_80211ax, WIFI_PHY_BAND_5GHZ,
                                                80, maskSlopesLeft, maskSlopesRight, tol),
                TestCase::QUICK);
 
@@ -700,7 +700,7 @@
   maskSlopesRight.push_back (std::make_pair (5120, -28.000)); // Middle band right (stop)
   maskSlopesRight.push_back (std::make_pair (5121, -28.012)); // Outer band right (start)
   maskSlopesRight.push_back (std::make_pair (6144, -40.0)); // Outer band right (stop)
-  AddTestCase (new WifiOfdmMaskSlopesTestCase ("11ax_5GHz 160MHz", WIFI_PHY_STANDARD_80211ax, WIFI_PHY_BAND_5GHZ,
+  AddTestCase (new WifiOfdmMaskSlopesTestCase ("11ax_5GHz 160MHz", WIFI_STANDARD_80211ax, WIFI_PHY_BAND_5GHZ,
                                                160, maskSlopesLeft, maskSlopesRight, tol),
                TestCase::QUICK);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/test/wifi-txop-test.cc ns-3.36/src/wifi/test/wifi-txop-test.cc
--- ns-3.35/src/wifi/test/wifi-txop-test.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/test/wifi-txop-test.cc	2022-04-30 18:23:58.222735200 -0700
@@ -20,6 +20,7 @@
 
 #include "ns3/test.h"
 #include "ns3/string.h"
+#include "ns3/boolean.h"
 #include "ns3/qos-utils.h"
 #include "ns3/packet.h"
 #include "ns3/wifi-net-device.h"
@@ -36,6 +37,7 @@
 #include "ns3/wifi-psdu.h"
 #include "ns3/wifi-ppdu.h"
 #include "ns3/ap-wifi-mac.h"
+#include "ns3/qos-txop.h"
 
 using namespace ns3;
 
@@ -267,14 +269,14 @@
   // The AP does not correctly receive the Ack sent in response to the QoS
   // data frame sent to the first station
   Ptr<ReceiveListErrorModel> apPem = CreateObject<ReceiveListErrorModel> ();
-  apPem->SetList ({6});
+  apPem->SetList ({9});
   dev = DynamicCast<WifiNetDevice> (m_apDevices.Get (0));
   dev->GetMac ()->GetWifiPhy ()->SetPostReceptionErrorModel (apPem);
 
   // The second station does not correctly receive the first QoS
   // data frame sent by the AP
   Ptr<ReceiveListErrorModel> sta2Pem = CreateObject<ReceiveListErrorModel> ();
-  sta2Pem->SetList ({19});
+  sta2Pem->SetList ({24});
   dev = DynamicCast<WifiNetDevice> (m_staDevices.Get (1));
   dev->GetMac ()->GetWifiPhy ()->SetPostReceptionErrorModel (sta2Pem);
 
@@ -353,17 +355,17 @@
    *   To: STA1   [AP]           STA1    AP   [STA2]              STA2    AP    STA3    AP     all
    */
 
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus.size (), 25, "Expected 25 transmitted frames");
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus.size (), 25, "Expected 25 transmitted frames");
 
   // the first frame sent after 400ms is a QoS data frame sent by the AP to STA1
   txopStart = m_txPsdus[0].txStart;
 
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[0].header.IsQosData (), true,
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[0].header.IsQosData (), true,
                          "Expected a QoS data frame");
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[0].header.GetAddr1 (),
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[0].header.GetAddr1 (),
                          DynamicCast<WifiNetDevice> (m_staDevices.Get (0))->GetMac ()->GetAddress (),
                          "Expected a frame sent by the AP to the first station");
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[0].header.GetDuration (),
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[0].header.GetDuration (),
                          RoundDurationId (m_txopLimit - m_txPsdus[0].txDuration),
                          "Duration/ID of the first frame must cover the whole TXOP");
 
@@ -371,13 +373,13 @@
   tEnd = m_txPsdus[0].txStart + m_txPsdus[0].txDuration;
   tStart = m_txPsdus[1].txStart;
 
-  NS_TEST_EXPECT_MSG_LT (tEnd + sifs, tStart, "Ack in response to the first frame sent too early");
-  NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance, "Ack in response to the first frame sent too late");
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[1].header.IsAck (), true, "Expected a Normal Ack");
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[1].header.GetAddr1 (),
+  NS_TEST_ASSERT_MSG_LT (tEnd + sifs, tStart, "Ack in response to the first frame sent too early");
+  NS_TEST_ASSERT_MSG_LT (tStart, tEnd + sifs + tolerance, "Ack in response to the first frame sent too late");
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[1].header.IsAck (), true, "Expected a Normal Ack");
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[1].header.GetAddr1 (),
                          DynamicCast<WifiNetDevice> (m_apDevices.Get (0))->GetMac ()->GetAddress (),
                          "Expected a Normal Ack sent to the AP");
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[1].header.GetDuration (),
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[1].header.GetDuration (),
                          RoundDurationId (m_txPsdus[0].header.GetDuration () - sifs - m_txPsdus[1].txDuration),
                          "Duration/ID of the Ack must be derived from that of the first frame");
 
@@ -389,16 +391,16 @@
   tEnd = m_txPsdus[1].txStart + m_txPsdus[1].txDuration;
   tStart = m_txPsdus[2].txStart;
 
-  NS_TEST_EXPECT_MSG_GT_OR_EQ (tStart - tEnd, sifs + m_aifsn * slot,
+  NS_TEST_ASSERT_MSG_GT_OR_EQ (tStart - tEnd, sifs + m_aifsn * slot,
                                "Less than AIFS elapsed between AckTimeout and the next TXOP start");
-  NS_TEST_EXPECT_MSG_LT_OR_EQ (tStart - tEnd, sifs + m_aifsn * slot + (2 * (m_cwMin + 1) - 1) * slot,
+  NS_TEST_ASSERT_MSG_LT_OR_EQ (tStart - tEnd, sifs + m_aifsn * slot + (2 * (m_cwMin + 1) - 1) * slot,
                                "More than AIFS+BO elapsed between AckTimeout and the next TXOP start");
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[2].header.IsQosData (), true,
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[2].header.IsQosData (), true,
                          "Expected to retransmit a QoS data frame");
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[2].header.GetAddr1 (),
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[2].header.GetAddr1 (),
                          DynamicCast<WifiNetDevice> (m_staDevices.Get (0))->GetMac ()->GetAddress (),
                          "Expected to retransmit a frame to the first station");
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[2].header.GetDuration (),
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[2].header.GetDuration (),
                          RoundDurationId (m_txopLimit - m_txPsdus[2].txDuration),
                          "Duration/ID of the retransmitted frame must cover the whole TXOP");
 
@@ -406,13 +408,13 @@
   tEnd = m_txPsdus[2].txStart + m_txPsdus[2].txDuration;
   tStart = m_txPsdus[3].txStart;
 
-  NS_TEST_EXPECT_MSG_LT (tEnd + sifs, tStart, "Ack in response to the first frame sent too early");
-  NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance, "Ack in response to the first frame sent too late");
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[3].header.IsAck (), true, "Expected a Normal Ack");
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[3].header.GetAddr1 (),
+  NS_TEST_ASSERT_MSG_LT (tEnd + sifs, tStart, "Ack in response to the first frame sent too early");
+  NS_TEST_ASSERT_MSG_LT (tStart, tEnd + sifs + tolerance, "Ack in response to the first frame sent too late");
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[3].header.IsAck (), true, "Expected a Normal Ack");
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[3].header.GetAddr1 (),
                          DynamicCast<WifiNetDevice> (m_apDevices.Get (0))->GetMac ()->GetAddress (),
                          "Expected a Normal Ack sent to the AP");
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[3].header.GetDuration (),
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[3].header.GetDuration (),
                          RoundDurationId (m_txPsdus[2].header.GetDuration () - sifs - m_txPsdus[3].txDuration),
                          "Duration/ID of the Ack must be derived from that of the previous frame");
 
@@ -420,14 +422,14 @@
   tEnd = m_txPsdus[3].txStart + m_txPsdus[3].txDuration;
   tStart = m_txPsdus[4].txStart;
 
-  NS_TEST_EXPECT_MSG_LT (tEnd + sifs, tStart, "Second frame sent too early");
-  NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance, "Second frame sent too late");
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[4].header.IsQosData (), true,
+  NS_TEST_ASSERT_MSG_LT (tEnd + sifs, tStart, "Second frame sent too early");
+  NS_TEST_ASSERT_MSG_LT (tStart, tEnd + sifs + tolerance, "Second frame sent too late");
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[4].header.IsQosData (), true,
                          "Expected a QoS data frame");
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[4].header.GetAddr1 (),
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[4].header.GetAddr1 (),
                          DynamicCast<WifiNetDevice> (m_staDevices.Get (1))->GetMac ()->GetAddress (),
                          "Expected a frame sent by the AP to the second station");
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[4].header.GetDuration (),
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[4].header.GetDuration (),
                          RoundDurationId (m_txopLimit - (m_txPsdus[4].txStart - txopStart) - m_txPsdus[4].txDuration),
                          "Duration/ID of the second frame does not cover the remaining TXOP");
 
@@ -440,21 +442,21 @@
 
   if (m_pifsRecovery)
     {
-      NS_TEST_EXPECT_MSG_EQ (tEnd + sifs + slot, tStart, "Second frame must have been sent after a PIFS");
+      NS_TEST_ASSERT_MSG_EQ (tEnd + sifs + slot, tStart, "Second frame must have been sent after a PIFS");
     }
   else
     {
-      NS_TEST_EXPECT_MSG_GT_OR_EQ (tStart - tEnd, sifs + m_aifsn * slot,
+      NS_TEST_ASSERT_MSG_GT_OR_EQ (tStart - tEnd, sifs + m_aifsn * slot,
                                    "Less than AIFS elapsed between AckTimeout and the next transmission");
-      NS_TEST_EXPECT_MSG_LT_OR_EQ (tStart - tEnd, sifs + m_aifsn * slot + (2 * (m_cwMin + 1) - 1) * slot,
+      NS_TEST_ASSERT_MSG_LT_OR_EQ (tStart - tEnd, sifs + m_aifsn * slot + (2 * (m_cwMin + 1) - 1) * slot,
                                    "More than AIFS+BO elapsed between AckTimeout and the next TXOP start");
     }
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[5].header.IsQosData (), true,
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[5].header.IsQosData (), true,
                          "Expected a QoS data frame");
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[5].header.GetAddr1 (),
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[5].header.GetAddr1 (),
                          DynamicCast<WifiNetDevice> (m_staDevices.Get (1))->GetMac ()->GetAddress (),
                          "Expected a frame sent by the AP to the second station");
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[5].header.GetDuration (),
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[5].header.GetDuration (),
                          RoundDurationId (m_txopLimit - (m_txPsdus[5].txStart - txopStart) - m_txPsdus[5].txDuration),
                          "Duration/ID of the second frame does not cover the remaining TXOP");
 
@@ -462,13 +464,13 @@
   tEnd = m_txPsdus[5].txStart + m_txPsdus[5].txDuration;
   tStart = m_txPsdus[6].txStart;
 
-  NS_TEST_EXPECT_MSG_LT (tEnd + sifs, tStart, "Ack in response to the second frame sent too early");
-  NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance, "Ack in response to the second frame sent too late");
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[6].header.IsAck (), true, "Expected a Normal Ack");
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[6].header.GetAddr1 (),
+  NS_TEST_ASSERT_MSG_LT (tEnd + sifs, tStart, "Ack in response to the second frame sent too early");
+  NS_TEST_ASSERT_MSG_LT (tStart, tEnd + sifs + tolerance, "Ack in response to the second frame sent too late");
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[6].header.IsAck (), true, "Expected a Normal Ack");
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[6].header.GetAddr1 (),
                          DynamicCast<WifiNetDevice> (m_apDevices.Get (0))->GetMac ()->GetAddress (),
                          "Expected a Normal Ack sent to the AP");
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[6].header.GetDuration (),
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[6].header.GetDuration (),
                          RoundDurationId (m_txPsdus[5].header.GetDuration () - sifs - m_txPsdus[6].txDuration),
                          "Duration/ID of the Ack must be derived from that of the previous frame");
 
@@ -476,14 +478,14 @@
   tEnd = m_txPsdus[6].txStart + m_txPsdus[6].txDuration;
   tStart = m_txPsdus[7].txStart;
 
-  NS_TEST_EXPECT_MSG_LT (tEnd + sifs, tStart, "Third frame sent too early");
-  NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance, "Third frame sent too late");
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[7].header.IsQosData (), true,
+  NS_TEST_ASSERT_MSG_LT (tEnd + sifs, tStart, "Third frame sent too early");
+  NS_TEST_ASSERT_MSG_LT (tStart, tEnd + sifs + tolerance, "Third frame sent too late");
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[7].header.IsQosData (), true,
                          "Expected a QoS data frame");
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[7].header.GetAddr1 (),
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[7].header.GetAddr1 (),
                          DynamicCast<WifiNetDevice> (m_staDevices.Get (2))->GetMac ()->GetAddress (),
                          "Expected a frame sent by the AP to the third station");
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[7].header.GetDuration (),
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[7].header.GetDuration (),
                          RoundDurationId (m_txopLimit - (m_txPsdus[7].txStart - txopStart) - m_txPsdus[7].txDuration),
                          "Duration/ID of the third frame does not cover the remaining TXOP");
 
@@ -491,13 +493,13 @@
   tEnd = m_txPsdus[7].txStart + m_txPsdus[7].txDuration;
   tStart = m_txPsdus[8].txStart;
 
-  NS_TEST_EXPECT_MSG_LT (tEnd + sifs, tStart, "Ack in response to the third frame sent too early");
-  NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance, "Ack in response to the third frame sent too late");
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[8].header.IsAck (), true, "Expected a Normal Ack");
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[8].header.GetAddr1 (),
+  NS_TEST_ASSERT_MSG_LT (tEnd + sifs, tStart, "Ack in response to the third frame sent too early");
+  NS_TEST_ASSERT_MSG_LT (tStart, tEnd + sifs + tolerance, "Ack in response to the third frame sent too late");
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[8].header.IsAck (), true, "Expected a Normal Ack");
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[8].header.GetAddr1 (),
                          DynamicCast<WifiNetDevice> (m_apDevices.Get (0))->GetMac ()->GetAddress (),
                          "Expected a Normal Ack sent to the AP");
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[8].header.GetDuration (),
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[8].header.GetDuration (),
                          RoundDurationId (m_txPsdus[7].header.GetDuration () - sifs - m_txPsdus[8].txDuration),
                          "Duration/ID of the Ack must be derived from that of the previous frame");
 
@@ -505,26 +507,26 @@
   tEnd = m_txPsdus[8].txStart + m_txPsdus[8].txDuration;
   tStart = m_txPsdus[9].txStart;
 
-  NS_TEST_EXPECT_MSG_LT (tEnd + sifs, tStart, "CF-End sent too early");
-  NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance, "CF-End sent too late");
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[9].header.IsCfEnd (), true, "Expected a CF-End frame");
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[9].header.GetDuration (), Seconds (0),
+  NS_TEST_ASSERT_MSG_LT (tEnd + sifs, tStart, "CF-End sent too early");
+  NS_TEST_ASSERT_MSG_LT (tStart, tEnd + sifs + tolerance, "CF-End sent too late");
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[9].header.IsCfEnd (), true, "Expected a CF-End frame");
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[9].header.GetDuration (), Seconds (0),
                         "Duration/ID must be set to 0 for CF-End frames");
 
   // the CF-End frame resets the NAV on STA1, which can now transmit
   tEnd = m_txPsdus[9].txStart + m_txPsdus[9].txDuration;
   tStart = m_txPsdus[10].txStart;
 
-  NS_TEST_EXPECT_MSG_GT_OR_EQ (tStart - tEnd, sifs + m_aifsn * slot,
+  NS_TEST_ASSERT_MSG_GT_OR_EQ (tStart - tEnd, sifs + m_aifsn * slot,
                                "Less than AIFS elapsed between two TXOPs");
-  NS_TEST_EXPECT_MSG_LT_OR_EQ (tStart - tEnd, sifs + m_aifsn * slot + m_cwMin * slot + tolerance,
+  NS_TEST_ASSERT_MSG_LT_OR_EQ (tStart - tEnd, sifs + m_aifsn * slot + m_cwMin * slot + tolerance,
                                "More than AIFS+BO elapsed between two TXOPs");
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[10].header.IsQosData (), true,
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[10].header.IsQosData (), true,
                          "Expected a QoS data frame");
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[10].header.GetAddr1 (),
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[10].header.GetAddr1 (),
                          DynamicCast<WifiNetDevice> (m_apDevices.Get (0))->GetMac ()->GetAddress (),
                          "Expected a frame sent by the first station to the AP");
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[10].header.GetDuration (),
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[10].header.GetDuration (),
                          RoundDurationId (m_txopLimit - m_txPsdus[10].txDuration),
                          "Duration/ID of the frame sent by the first station does not cover the remaining TXOP");
 
@@ -532,13 +534,13 @@
   tEnd = m_txPsdus[10].txStart + m_txPsdus[10].txDuration;
   tStart = m_txPsdus[11].txStart;
 
-  NS_TEST_EXPECT_MSG_LT (tEnd + sifs, tStart, "Ack sent too early");
-  NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance, "Ack sent too late");
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[11].header.IsAck (), true, "Expected a Normal Ack");
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[11].header.GetAddr1 (),
+  NS_TEST_ASSERT_MSG_LT (tEnd + sifs, tStart, "Ack sent too early");
+  NS_TEST_ASSERT_MSG_LT (tStart, tEnd + sifs + tolerance, "Ack sent too late");
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[11].header.IsAck (), true, "Expected a Normal Ack");
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[11].header.GetAddr1 (),
                          DynamicCast<WifiNetDevice> (m_staDevices.Get (0))->GetMac ()->GetAddress (),
                          "Expected a Normal Ack sent to the first station");
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[11].header.GetDuration (),
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[11].header.GetDuration (),
                          RoundDurationId (m_txPsdus[10].header.GetDuration () - sifs - m_txPsdus[11].txDuration),
                          "Duration/ID of the Ack must be derived from that of the previous frame");
 
@@ -546,10 +548,10 @@
   tEnd = m_txPsdus[11].txStart + m_txPsdus[11].txDuration;
   tStart = m_txPsdus[12].txStart;
 
-  NS_TEST_EXPECT_MSG_LT (tEnd + sifs, tStart, "CF-End sent too early");
-  NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance, "CF-End sent too late");
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[12].header.IsCfEnd (), true, "Expected a CF-End frame");
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[12].header.GetDuration (), Seconds (0),
+  NS_TEST_ASSERT_MSG_LT (tEnd + sifs, tStart, "CF-End sent too early");
+  NS_TEST_ASSERT_MSG_LT (tStart, tEnd + sifs + tolerance, "CF-End sent too late");
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[12].header.IsCfEnd (), true, "Expected a CF-End frame");
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[12].header.GetDuration (), Seconds (0),
                         "Duration/ID must be set to 0 for CF-End frames");
 
 
@@ -580,12 +582,12 @@
   // the first frame is an RTS frame sent by the AP to STA1
   txopStart = m_txPsdus[13].txStart;
 
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[13].header.IsRts (), true,
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[13].header.IsRts (), true,
                          "Expected an RTS frame");
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[13].header.GetAddr1 (),
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[13].header.GetAddr1 (),
                          DynamicCast<WifiNetDevice> (m_staDevices.Get (0))->GetMac ()->GetAddress (),
                          "Expected an RTS frame sent by the AP to the first station");
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[13].header.GetDuration (),
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[13].header.GetDuration (),
                          RoundDurationId (m_txopLimit - m_txPsdus[13].txDuration),
                          "Duration/ID of the first RTS frame must cover the whole TXOP");
 
@@ -593,13 +595,13 @@
   tEnd = m_txPsdus[13].txStart + m_txPsdus[13].txDuration;
   tStart = m_txPsdus[14].txStart;
 
-  NS_TEST_EXPECT_MSG_LT (tEnd + sifs, tStart, "CTS in response to the first RTS frame sent too early");
-  NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance, "CTS in response to the first RTS frame sent too late");
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[14].header.IsCts (), true, "Expected a CTS");
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[14].header.GetAddr1 (),
+  NS_TEST_ASSERT_MSG_LT (tEnd + sifs, tStart, "CTS in response to the first RTS frame sent too early");
+  NS_TEST_ASSERT_MSG_LT (tStart, tEnd + sifs + tolerance, "CTS in response to the first RTS frame sent too late");
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[14].header.IsCts (), true, "Expected a CTS");
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[14].header.GetAddr1 (),
                          DynamicCast<WifiNetDevice> (m_apDevices.Get (0))->GetMac ()->GetAddress (),
                          "Expected a CTS frame sent to the AP");
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[14].header.GetDuration (),
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[14].header.GetDuration (),
                          RoundDurationId (m_txPsdus[13].header.GetDuration () - sifs - m_txPsdus[14].txDuration),
                          "Duration/ID of the CTS frame must be derived from that of the RTS frame");
 
@@ -607,14 +609,14 @@
   tEnd = m_txPsdus[14].txStart + m_txPsdus[14].txDuration;
   tStart = m_txPsdus[15].txStart;
 
-  NS_TEST_EXPECT_MSG_LT (tEnd + sifs, tStart, "First QoS data frame sent too early");
-  NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance, "First QoS data frame sent too late");
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[15].header.IsQosData (), true,
+  NS_TEST_ASSERT_MSG_LT (tEnd + sifs, tStart, "First QoS data frame sent too early");
+  NS_TEST_ASSERT_MSG_LT (tStart, tEnd + sifs + tolerance, "First QoS data frame sent too late");
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[15].header.IsQosData (), true,
                          "Expected a QoS data frame");
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[15].header.GetAddr1 (),
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[15].header.GetAddr1 (),
                          DynamicCast<WifiNetDevice> (m_staDevices.Get (0))->GetMac ()->GetAddress (),
                          "Expected a frame sent by the AP to the first station");
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[15].header.GetDuration (),
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[15].header.GetDuration (),
                          RoundDurationId (m_txopLimit - (m_txPsdus[15].txStart - txopStart) - m_txPsdus[15].txDuration),
                          "Duration/ID of the first QoS data frame does not cover the remaining TXOP");
 
@@ -622,13 +624,13 @@
   tEnd = m_txPsdus[15].txStart + m_txPsdus[15].txDuration;
   tStart = m_txPsdus[16].txStart;
 
-  NS_TEST_EXPECT_MSG_LT (tEnd + sifs, tStart, "Ack in response to the first QoS data frame sent too early");
-  NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance, "Ack in response to the first QoS data frame sent too late");
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[16].header.IsAck (), true, "Expected a Normal Ack");
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[16].header.GetAddr1 (),
+  NS_TEST_ASSERT_MSG_LT (tEnd + sifs, tStart, "Ack in response to the first QoS data frame sent too early");
+  NS_TEST_ASSERT_MSG_LT (tStart, tEnd + sifs + tolerance, "Ack in response to the first QoS data frame sent too late");
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[16].header.IsAck (), true, "Expected a Normal Ack");
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[16].header.GetAddr1 (),
                          DynamicCast<WifiNetDevice> (m_apDevices.Get (0))->GetMac ()->GetAddress (),
                          "Expected a Normal Ack sent to the AP");
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[16].header.GetDuration (),
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[16].header.GetDuration (),
                          RoundDurationId (m_txPsdus[15].header.GetDuration () - sifs - m_txPsdus[16].txDuration),
                          "Duration/ID of the Ack must be derived from that of the previous frame");
 
@@ -636,14 +638,14 @@
   tEnd = m_txPsdus[16].txStart + m_txPsdus[16].txDuration;
   tStart = m_txPsdus[17].txStart;
 
-  NS_TEST_EXPECT_MSG_LT (tEnd + sifs, tStart, "Second RTS frame sent too early");
-  NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance, "Second RTS frame sent too late");
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[17].header.IsRts (), true,
+  NS_TEST_ASSERT_MSG_LT (tEnd + sifs, tStart, "Second RTS frame sent too early");
+  NS_TEST_ASSERT_MSG_LT (tStart, tEnd + sifs + tolerance, "Second RTS frame sent too late");
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[17].header.IsRts (), true,
                          "Expected an RTS frame");
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[17].header.GetAddr1 (),
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[17].header.GetAddr1 (),
                          DynamicCast<WifiNetDevice> (m_staDevices.Get (1))->GetMac ()->GetAddress (),
                          "Expected an RTS frame sent by the AP to the second station");
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[17].header.GetDuration (),
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[17].header.GetDuration (),
                          RoundDurationId (m_txopLimit - (m_txPsdus[17].txStart - txopStart) - m_txPsdus[17].txDuration),
                          "Duration/ID of the second RTS frame must cover the whole TXOP");
 
@@ -651,13 +653,13 @@
   tEnd = m_txPsdus[17].txStart + m_txPsdus[17].txDuration;
   tStart = m_txPsdus[18].txStart;
 
-  NS_TEST_EXPECT_MSG_LT (tEnd + sifs, tStart, "CTS in response to the second RTS frame sent too early");
-  NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance, "CTS in response to the second RTS frame sent too late");
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[18].header.IsCts (), true, "Expected a CTS");
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[18].header.GetAddr1 (),
+  NS_TEST_ASSERT_MSG_LT (tEnd + sifs, tStart, "CTS in response to the second RTS frame sent too early");
+  NS_TEST_ASSERT_MSG_LT (tStart, tEnd + sifs + tolerance, "CTS in response to the second RTS frame sent too late");
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[18].header.IsCts (), true, "Expected a CTS");
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[18].header.GetAddr1 (),
                          DynamicCast<WifiNetDevice> (m_apDevices.Get (0))->GetMac ()->GetAddress (),
                          "Expected a CTS frame sent to the AP");
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[18].header.GetDuration (),
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[18].header.GetDuration (),
                          RoundDurationId (m_txPsdus[17].header.GetDuration () - sifs - m_txPsdus[18].txDuration),
                          "Duration/ID of the CTS frame must be derived from that of the RTS frame");
 
@@ -665,14 +667,14 @@
   tEnd = m_txPsdus[18].txStart + m_txPsdus[18].txDuration;
   tStart = m_txPsdus[19].txStart;
 
-  NS_TEST_EXPECT_MSG_LT (tEnd + sifs, tStart, "Second QoS data frame sent too early");
-  NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance, "Second QoS data frame sent too late");
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[19].header.IsQosData (), true,
+  NS_TEST_ASSERT_MSG_LT (tEnd + sifs, tStart, "Second QoS data frame sent too early");
+  NS_TEST_ASSERT_MSG_LT (tStart, tEnd + sifs + tolerance, "Second QoS data frame sent too late");
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[19].header.IsQosData (), true,
                          "Expected a QoS data frame");
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[19].header.GetAddr1 (),
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[19].header.GetAddr1 (),
                          DynamicCast<WifiNetDevice> (m_staDevices.Get (1))->GetMac ()->GetAddress (),
                          "Expected a frame sent by the AP to the second station");
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[19].header.GetDuration (),
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[19].header.GetDuration (),
                          RoundDurationId (m_txopLimit - (m_txPsdus[19].txStart - txopStart) - m_txPsdus[19].txDuration),
                          "Duration/ID of the second QoS data frame does not cover the remaining TXOP");
 
@@ -680,13 +682,13 @@
   tEnd = m_txPsdus[19].txStart + m_txPsdus[19].txDuration;
   tStart = m_txPsdus[20].txStart;
 
-  NS_TEST_EXPECT_MSG_LT (tEnd + sifs, tStart, "Ack in response to the second QoS data frame sent too early");
-  NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance, "Ack in response to the second QoS data frame sent too late");
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[20].header.IsAck (), true, "Expected a Normal Ack");
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[20].header.GetAddr1 (),
+  NS_TEST_ASSERT_MSG_LT (tEnd + sifs, tStart, "Ack in response to the second QoS data frame sent too early");
+  NS_TEST_ASSERT_MSG_LT (tStart, tEnd + sifs + tolerance, "Ack in response to the second QoS data frame sent too late");
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[20].header.IsAck (), true, "Expected a Normal Ack");
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[20].header.GetAddr1 (),
                          DynamicCast<WifiNetDevice> (m_apDevices.Get (0))->GetMac ()->GetAddress (),
                          "Expected a Normal Ack sent to the AP");
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[20].header.GetDuration (),
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[20].header.GetDuration (),
                          RoundDurationId (m_txPsdus[19].header.GetDuration () - sifs - m_txPsdus[20].txDuration),
                          "Duration/ID of the Ack must be derived from that of the previous frame");
 
@@ -694,14 +696,14 @@
   tEnd = m_txPsdus[20].txStart + m_txPsdus[20].txDuration;
   tStart = m_txPsdus[21].txStart;
 
-  NS_TEST_EXPECT_MSG_LT (tEnd + sifs, tStart, "Third RTS frame sent too early");
-  NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance, "Third RTS frame sent too late");
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[21].header.IsRts (), true,
+  NS_TEST_ASSERT_MSG_LT (tEnd + sifs, tStart, "Third RTS frame sent too early");
+  NS_TEST_ASSERT_MSG_LT (tStart, tEnd + sifs + tolerance, "Third RTS frame sent too late");
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[21].header.IsRts (), true,
                          "Expected an RTS frame");
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[21].header.GetAddr1 (),
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[21].header.GetAddr1 (),
                          DynamicCast<WifiNetDevice> (m_staDevices.Get (2))->GetMac ()->GetAddress (),
                          "Expected an RTS frame sent by the AP to the third station");
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[21].header.GetDuration (),
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[21].header.GetDuration (),
                          RoundDurationId (m_txopLimit - (m_txPsdus[21].txStart - txopStart) - m_txPsdus[21].txDuration),
                          "Duration/ID of the third RTS frame must cover the whole TXOP");
 
@@ -709,13 +711,13 @@
   tEnd = m_txPsdus[21].txStart + m_txPsdus[21].txDuration;
   tStart = m_txPsdus[22].txStart;
 
-  NS_TEST_EXPECT_MSG_LT (tEnd + sifs, tStart, "CTS in response to the third RTS frame sent too early");
-  NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance, "CTS in response to the third RTS frame sent too late");
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[22].header.IsCts (), true, "Expected a CTS");
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[22].header.GetAddr1 (),
+  NS_TEST_ASSERT_MSG_LT (tEnd + sifs, tStart, "CTS in response to the third RTS frame sent too early");
+  NS_TEST_ASSERT_MSG_LT (tStart, tEnd + sifs + tolerance, "CTS in response to the third RTS frame sent too late");
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[22].header.IsCts (), true, "Expected a CTS");
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[22].header.GetAddr1 (),
                          DynamicCast<WifiNetDevice> (m_apDevices.Get (0))->GetMac ()->GetAddress (),
                          "Expected a CTS frame sent to the AP");
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[22].header.GetDuration (),
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[22].header.GetDuration (),
                          RoundDurationId (m_txPsdus[21].header.GetDuration () - sifs - m_txPsdus[22].txDuration),
                          "Duration/ID of the CTS frame must be derived from that of the RTS frame");
 
@@ -723,14 +725,14 @@
   tEnd = m_txPsdus[22].txStart + m_txPsdus[22].txDuration;
   tStart = m_txPsdus[23].txStart;
 
-  NS_TEST_EXPECT_MSG_LT (tEnd + sifs, tStart, "Third QoS data frame sent too early");
-  NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance, "Third QoS data frame sent too late");
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[23].header.IsQosData (), true,
+  NS_TEST_ASSERT_MSG_LT (tEnd + sifs, tStart, "Third QoS data frame sent too early");
+  NS_TEST_ASSERT_MSG_LT (tStart, tEnd + sifs + tolerance, "Third QoS data frame sent too late");
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[23].header.IsQosData (), true,
                          "Expected a QoS data frame");
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[23].header.GetAddr1 (),
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[23].header.GetAddr1 (),
                          DynamicCast<WifiNetDevice> (m_staDevices.Get (2))->GetMac ()->GetAddress (),
                          "Expected a frame sent by the AP to the third station");
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[23].header.GetDuration (),
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[23].header.GetDuration (),
                          RoundDurationId (m_txopLimit - (m_txPsdus[23].txStart - txopStart) - m_txPsdus[23].txDuration),
                          "Duration/ID of the third QoS data frame does not cover the remaining TXOP");
 
@@ -738,13 +740,13 @@
   tEnd = m_txPsdus[23].txStart + m_txPsdus[23].txDuration;
   tStart = m_txPsdus[24].txStart;
 
-  NS_TEST_EXPECT_MSG_LT (tEnd + sifs, tStart, "Ack in response to the third QoS data frame sent too early");
-  NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance, "Ack in response to the third QoS data frame sent too late");
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[24].header.IsAck (), true, "Expected a Normal Ack");
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[24].header.GetAddr1 (),
+  NS_TEST_ASSERT_MSG_LT (tEnd + sifs, tStart, "Ack in response to the third QoS data frame sent too early");
+  NS_TEST_ASSERT_MSG_LT (tStart, tEnd + sifs + tolerance, "Ack in response to the third QoS data frame sent too late");
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[24].header.IsAck (), true, "Expected a Normal Ack");
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[24].header.GetAddr1 (),
                          DynamicCast<WifiNetDevice> (m_apDevices.Get (0))->GetMac ()->GetAddress (),
                          "Expected a Normal Ack sent to the AP");
-  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[24].header.GetDuration (),
+  NS_TEST_ASSERT_MSG_EQ (m_txPsdus[24].header.GetDuration (),
                          RoundDurationId (m_txPsdus[23].header.GetDuration () - sifs - m_txPsdus[24].txDuration),
                          "Duration/ID of the Ack must be derived from that of the previous frame");
 
@@ -752,7 +754,7 @@
   // that 25 frames are transmitted (done at the beginning of this method)
 
   // 3 DL packets (without RTS/CTS), 1 UL packet and 3 DL packets (with RTS/CTS)
-  NS_TEST_EXPECT_MSG_EQ (m_received, 7, "Unexpected number of packets received");
+  NS_TEST_ASSERT_MSG_EQ (m_received, 7, "Unexpected number of packets received");
 }
 
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wifi/wscript ns-3.36/src/wifi/wscript
--- ns-3.35/src/wifi/wscript	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wifi/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,318 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    obj = bld.create_ns3_module('wifi', ['network', 'propagation', 'energy', 'spectrum', 'antenna', 'mobility'])
-    obj.source = [
-        'model/wifi-utils.cc',
-        'model/wifi-information-element.cc',
-        'model/wifi-information-element-vector.cc',
-        'model/wifi-mode.cc',
-        'model/ssid.cc',
-        'model/wifi-phy.cc',
-        'model/wifi-phy-operating-channel.cc',
-        'model/wifi-phy-state-helper.cc',
-        'model/error-rate-model.cc',
-        'model/yans-error-rate-model.cc',
-        'model/nist-error-rate-model.cc',
-        'model/non-ht/dsss-error-rate-model.cc',
-        'model/table-based-error-rate-model.cc',
-        'model/interference-helper.cc',
-        'model/wifi-phy-common.cc',
-        'model/yans-wifi-phy.cc',
-        'model/yans-wifi-channel.cc',
-        'model/spectrum-wifi-phy.cc',
-        'model/wifi-spectrum-phy-interface.cc',
-        'model/wifi-spectrum-signal-parameters.cc',
-        'model/wifi-mac-header.cc',
-        'model/wifi-mac-trailer.cc',
-        'model/wifi-tx-timer.cc',
-        'model/wifi-protection.cc',
-        'model/wifi-acknowledgment.cc',
-        'model/wifi-tx-parameters.cc',
-        'model/wifi-protection-manager.cc',
-        'model/wifi-default-protection-manager.cc',
-        'model/wifi-ack-manager.cc',
-        'model/wifi-default-ack-manager.cc',
-        'model/frame-exchange-manager.cc',
-        'model/qos-frame-exchange-manager.cc',
-        'model/ht/ht-frame-exchange-manager.cc',
-        'model/vht/vht-frame-exchange-manager.cc',
-        'model/he/he-frame-exchange-manager.cc',
-        'model/he/multi-user-scheduler.cc',
-        'model/he/rr-multi-user-scheduler.cc',
-        'model/wifi-mac-queue.cc',
-        'model/mac-tx-middle.cc',
-        'model/mac-rx-middle.cc',
-        'model/txop.cc',
-        'model/supported-rates.cc',
-        'model/capability-information.cc',
-        'model/status-code.cc',
-        'model/mgt-headers.cc',
-        'model/channel-access-manager.cc',
-        'model/wifi-mac.cc',
-        'model/regular-wifi-mac.cc',
-        'model/wifi-remote-station-info.cc',
-        'model/wifi-remote-station-manager.cc',
-        'model/ap-wifi-mac.cc',
-        'model/sta-wifi-mac.cc',
-        'model/adhoc-wifi-mac.cc',
-        'model/wifi-net-device.cc',
-        'model/rate-control/arf-wifi-manager.cc',
-        'model/rate-control/aarf-wifi-manager.cc',
-        'model/rate-control/ideal-wifi-manager.cc',
-        'model/rate-control/constant-rate-wifi-manager.cc',
-        'model/rate-control/amrr-wifi-manager.cc',
-        'model/rate-control/onoe-wifi-manager.cc',
-        'model/rate-control/rraa-wifi-manager.cc',
-        'model/rate-control/aarfcd-wifi-manager.cc',
-        'model/rate-control/cara-wifi-manager.cc',
-        'model/rate-control/minstrel-wifi-manager.cc',
-        'model/rate-control/minstrel-ht-wifi-manager.cc',
-        'model/qos-utils.cc',
-        'model/qos-txop.cc',
-        'model/msdu-aggregator.cc',
-        'model/amsdu-subframe-header.cc',
-        'model/originator-block-ack-agreement.cc',
-        'model/recipient-block-ack-agreement.cc',
-        'model/ctrl-headers.cc',
-        'model/qos-blocked-destinations.cc',
-        'model/block-ack-agreement.cc',
-        'model/block-ack-manager.cc',
-        'model/block-ack-window.cc',
-        'model/block-ack-type.cc',
-        'model/snr-tag.cc',
-        'model/he/mu-snr-tag.cc',
-        'model/ht/ht-capabilities.cc',
-        'model/wifi-tx-vector.cc',
-        'model/rate-control/parf-wifi-manager.cc',
-        'model/rate-control/aparf-wifi-manager.cc',
-        'model/rate-control/rrpaa-wifi-manager.cc',
-        'model/rate-control/thompson-sampling-wifi-manager.cc',
-        'model/ampdu-subframe-header.cc',
-        'model/mpdu-aggregator.cc',
-        'model/ampdu-tag.cc',
-        'model/wifi-radio-energy-model.cc',
-        'model/wifi-tx-current-model.cc',
-        'model/vht/vht-capabilities.cc',
-        'model/non-ht/erp-information.cc',
-        'model/ht/ht-operation.cc',
-        'model/vht/vht-operation.cc',
-        'model/non-ht/dsss-parameter-set.cc',
-        'model/edca-parameter-set.cc',
-        'model/he/mu-edca-parameter-set.cc',
-        'model/he/he-capabilities.cc',
-        'model/frame-capture-model.cc',
-        'model/simple-frame-capture-model.cc',
-        'model/preamble-detection-model.cc',
-        'model/threshold-preamble-detection-model.cc',
-        'model/he/he-operation.cc',
-        'model/he/he-configuration.cc',
-        'model/extended-capabilities.cc',
-        'model/wifi-mac-queue-item.cc',
-        'model/wifi-psdu.cc',
-        'model/wifi-ppdu.cc',
-        'model/non-ht/dsss-ppdu.cc',
-        'model/non-ht/ofdm-ppdu.cc',
-        'model/non-ht/erp-ofdm-ppdu.cc',
-        'model/ht/ht-ppdu.cc',
-        'model/vht/vht-ppdu.cc',
-        'model/he/he-ppdu.cc',
-        'model/ht/ht-configuration.cc',
-        'model/vht/vht-configuration.cc',
-        'model/he/obss-pd-algorithm.cc',
-        'model/he/constant-obss-pd-algorithm.cc',
-        'model/he/he-ru.cc',
-        'model/phy-entity.cc',
-        'model/non-ht/dsss-phy.cc',
-        'model/non-ht/ofdm-phy.cc',
-        'model/non-ht/erp-ofdm-phy.cc',
-        'model/ht/ht-phy.cc',
-        'model/vht/vht-phy.cc',
-        'model/he/he-phy.cc',
-        'helper/wifi-radio-energy-model-helper.cc',
-        'helper/athstats-helper.cc',
-        'helper/wifi-helper.cc',
-        'helper/yans-wifi-helper.cc',
-        'helper/spectrum-wifi-helper.cc',
-        'helper/wifi-mac-helper.cc',
-        ]
-
-    obj_test = bld.create_ns3_module_test_library('wifi')
-    obj_test.source = [
-        'test/block-ack-test-suite.cc',
-        'test/channel-access-manager-test.cc',
-        'test/tx-duration-test.cc',
-        'test/power-rate-adaptation-test.cc',
-        'test/wifi-test.cc',
-        'test/wifi-txop-test.cc',
-        'test/spectrum-wifi-phy-test.cc',
-        'test/wifi-primary-channels-test.cc',
-        'test/wifi-aggregation-test.cc',
-        'test/wifi-error-rate-models-test.cc',
-        'test/wifi-transmit-mask-test.cc',
-        'test/wifi-phy-thresholds-test.cc',
-        'test/wifi-phy-reception-test.cc',
-        'test/inter-bss-test-suite.cc',
-        'test/wifi-mac-ofdma-test.cc',
-        'test/wifi-phy-ofdma-test.cc',
-        'test/wifi-mac-queue-test.cc',
-        ]
-
-    # Tests encapsulating example programs should be listed here
-    if (bld.env['ENABLE_EXAMPLES']):
-        obj_test.source.extend([
-        #   'test/wifi-examples-test-suite.cc',
-            ])
-    
-    headers = bld(features='ns3header')
-    headers.module = 'wifi'
-    headers.source = [
-        'model/wifi-utils.h',
-        'model/wifi-information-element.h',
-        'model/wifi-information-element-vector.h',
-        'model/wifi-net-device.h',
-        'model/wifi-mode.h',
-        'model/ssid.h',
-        'model/wifi-phy-common.h',
-        'model/wifi-phy-band.h',
-        'model/wifi-standards.h',
-        'model/yans-wifi-phy.h',
-        'model/spectrum-wifi-phy.h',
-        'model/yans-wifi-channel.h',
-        'model/wifi-phy.h',
-        'model/wifi-phy-operating-channel.h',
-        'model/wifi-spectrum-phy-interface.h',
-        'model/wifi-spectrum-signal-parameters.h',
-        'model/interference-helper.h',
-        'model/wifi-remote-station-info.h',
-        'model/wifi-remote-station-manager.h',
-        'model/ap-wifi-mac.h',
-        'model/sta-wifi-mac.h',
-        'model/adhoc-wifi-mac.h',
-        'model/rate-control/arf-wifi-manager.h',
-        'model/rate-control/aarf-wifi-manager.h',
-        'model/rate-control/ideal-wifi-manager.h',
-        'model/rate-control/constant-rate-wifi-manager.h',
-        'model/rate-control/amrr-wifi-manager.h',
-        'model/rate-control/onoe-wifi-manager.h',
-        'model/rate-control/rraa-wifi-manager.h',
-        'model/rate-control/aarfcd-wifi-manager.h',
-        'model/rate-control/cara-wifi-manager.h',
-        'model/rate-control/minstrel-wifi-manager.h',
-        'model/rate-control/minstrel-ht-wifi-manager.h',
-        'model/rate-control/thompson-sampling-wifi-manager.h',
-        'model/wifi-mac.h',
-        'model/regular-wifi-mac.h',
-        'model/supported-rates.h',
-        'model/error-rate-model.h',
-        'model/yans-error-rate-model.h',
-        'model/nist-error-rate-model.h',
-        'model/non-ht/dsss-error-rate-model.h',
-        'model/table-based-error-rate-model.h',
-        'model/wifi-mac-queue.h',
-        'model/txop.h',
-        'model/wifi-mac-header.h',
-        'model/wifi-mac-trailer.h',
-        'model/wifi-phy-state-helper.h',
-        'model/qos-utils.h',
-        'model/qos-txop.h',
-        'model/msdu-aggregator.h',
-        'model/amsdu-subframe-header.h',
-        'model/mgt-headers.h',
-        'model/status-code.h',
-        'model/capability-information.h',
-        'model/channel-access-manager.h',
-        'model/mac-tx-middle.h', 
-        'model/mac-rx-middle.h', 
-        'model/wifi-tx-timer.h',
-        'model/wifi-protection.h',
-        'model/wifi-acknowledgment.h',
-        'model/wifi-tx-parameters.h',
-        'model/wifi-protection-manager.h',
-        'model/wifi-default-protection-manager.h',
-        'model/wifi-ack-manager.h',
-        'model/wifi-default-ack-manager.h',
-        'model/frame-exchange-manager.h',
-        'model/qos-frame-exchange-manager.h',
-        'model/ht/ht-frame-exchange-manager.h',
-        'model/vht/vht-frame-exchange-manager.h',
-        'model/he/he-frame-exchange-manager.h',
-        'model/he/multi-user-scheduler.h',
-        'model/he/rr-multi-user-scheduler.h',
-        'model/originator-block-ack-agreement.h',
-        'model/recipient-block-ack-agreement.h',
-        'model/ctrl-headers.h',
-        'model/block-ack-agreement.h',
-        'model/block-ack-manager.h',
-        'model/block-ack-window.h',
-        'model/snr-tag.h',
-        'model/he/mu-snr-tag.h',
-        'model/ht/ht-capabilities.h',
-        'model/rate-control/parf-wifi-manager.h',
-        'model/rate-control/aparf-wifi-manager.h',
-        'model/rate-control/rrpaa-wifi-manager.h',
-        'model/wifi-tx-vector.h',
-        'model/ampdu-subframe-header.h',
-        'model/mpdu-aggregator.h',
-        'model/ampdu-tag.h',
-        'model/wifi-radio-energy-model.h',
-        'model/wifi-tx-current-model.h',
-        'model/vht/vht-capabilities.h',
-        'model/non-ht/erp-information.h',
-        'model/ht/ht-operation.h',
-        'model/vht/vht-operation.h',
-        'model/non-ht/dsss-parameter-set.h',
-        'model/edca-parameter-set.h',
-        'model/he/mu-edca-parameter-set.h',
-        'model/he/he-capabilities.h',
-        'model/frame-capture-model.h',
-        'model/simple-frame-capture-model.h',
-        'model/preamble-detection-model.h',
-        'model/threshold-preamble-detection-model.h',
-        'model/qos-blocked-destinations.h',
-        'model/he/he-operation.h',
-        'model/he/he-configuration.h',
-        'model/extended-capabilities.h',
-        'model/wifi-mac-queue-item.h',
-        'model/wifi-psdu.h',
-        'model/wifi-ppdu.h',
-        'model/non-ht/dsss-ppdu.h',
-        'model/non-ht/erp-ofdm-ppdu.h',
-        'model/non-ht/ofdm-ppdu.h',
-        'model/ht/ht-ppdu.h',
-        'model/vht/vht-ppdu.h',
-        'model/he/he-ppdu.h',
-        'model/wifi-phy-state.h',
-        'model/wifi-phy-listener.h',
-        'model/block-ack-type.h',
-        'model/wifi-mpdu-type.h',
-        'model/ht/ht-configuration.h',
-        'model/vht/vht-configuration.h',
-        'model/he/obss-pd-algorithm.h',
-        'model/he/constant-obss-pd-algorithm.h',
-        'model/he/he-ru.h',
-        'model/reference/error-rate-tables.h',
-        'model/phy-entity.h',
-        'model/non-ht/dsss-phy.h',
-        'model/non-ht/ofdm-phy.h',
-        'model/non-ht/erp-ofdm-phy.h',
-        'model/ht/ht-phy.h',
-        'model/vht/vht-phy.h',
-        'model/he/he-phy.h',
-        'helper/wifi-radio-energy-model-helper.h',
-        'helper/athstats-helper.h',
-        'helper/wifi-helper.h',
-        'helper/yans-wifi-helper.h',
-        'helper/spectrum-wifi-helper.h',
-        'helper/wifi-mac-helper.h',
-        ]
-
-    if bld.env['ENABLE_GSL']:
-        obj.use.extend(['GSL', 'GSLCBLAS', 'M'])
-        obj_test.use.extend(['GSL', 'GSLCBLAS', 'M'])
-
-    if (bld.env['ENABLE_EXAMPLES']):
-        bld.recurse('examples')
-
-    bld.ns3_python_bindings()
-
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wimax/bindings/callbacks_list.py ns-3.36/src/wimax/bindings/callbacks_list.py
--- ns-3.35/src/wimax/bindings/callbacks_list.py	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wimax/bindings/callbacks_list.py	2022-04-30 18:23:58.222735200 -0700
@@ -3,6 +3,8 @@
     ['void', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['bool', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'const ns3::Address &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['bool', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'const ns3::Address &', 'const ns3::Address &', 'ns3::NetDevice::PacketType', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'const ns3::Address &', 'const ns3::Address &', 'ns3::NetDevice::PacketType', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::PacketBurst>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'bool', 'unsigned long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
@@ -11,6 +13,4 @@
     ['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::Mac48Address', 'const ns3::Cid &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::Mac48Address', 'ns3::Cid', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<ns3::PacketBurst>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'const ns3::Address &', 'const ns3::Address &', 'ns3::NetDevice::PacketType', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
 ]
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wimax/bindings/modulegen__gcc_ILP32.py ns-3.36/src/wimax/bindings/modulegen__gcc_ILP32.py
--- ns-3.35/src/wimax/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wimax/bindings/modulegen__gcc_ILP32.py	2022-04-30 18:23:58.222735200 -0700
@@ -91,6 +91,8 @@
     module.add_class('DlFramePrefixIe')
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'], import_from_module='ns.core')
     ## hash.h (module 'core'): ns3::Hasher [class]
     module.add_class('Hasher', import_from_module='ns.core')
     ## ipcs-classifier-record.h (module 'wimax'): ns3::IpcsClassifierRecord [class]
@@ -356,25 +358,25 @@
     module.add_class('SfVectorTlvValue', parent=root_module['ns3::VectorTlvValue'])
     ## wimax-tlv.h (module 'wimax'): ns3::SfVectorTlvValue::Type [enumeration]
     module.add_enum('Type', ['SFID', 'CID', 'Service_Class_Name', 'reserved1', 'QoS_Parameter_Set_Type', 'Traffic_Priority', 'Maximum_Sustained_Traffic_Rate', 'Maximum_Traffic_Burst', 'Minimum_Reserved_Traffic_Rate', 'Minimum_Tolerable_Traffic_Rate', 'Service_Flow_Scheduling_Type', 'Request_Transmission_Policy', 'Tolerated_Jitter', 'Maximum_Latency', 'Fixed_length_versus_Variable_length_SDU_Indicator', 'SDU_Size', 'Target_SAID', 'ARQ_Enable', 'ARQ_WINDOW_SIZE', 'ARQ_RETRY_TIMEOUT_Transmitter_Delay', 'ARQ_RETRY_TIMEOUT_Receiver_Delay', 'ARQ_BLOCK_LIFETIME', 'ARQ_SYNC_LOSS', 'ARQ_DELIVER_IN_ORDER', 'ARQ_PURGE_TIMEOUT', 'ARQ_BLOCK_SIZE', 'reserved2', 'CS_Specification', 'IPV4_CS_Parameters'], outer_class=root_module['ns3::SfVectorTlvValue'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::OutputStreamWrapper', 'ns3::empty', 'ns3::DefaultDeleter<ns3::OutputStreamWrapper>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
     ## ss-service-flow-manager.h (module 'wimax'): ns3::SsServiceFlowManager [class]
     module.add_class('SsServiceFlowManager', parent=root_module['ns3::ServiceFlowManager'])
@@ -656,7 +658,7 @@
     typehandlers.add_type_alias('ns3::Callback< void, std::basic_string< char >, ns3::Ptr< ns3::Packet const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::SubscriberStationNetDevice::AsciiTraceCallback')
     typehandlers.add_type_alias('ns3::Callback< void, std::basic_string< char >, ns3::Ptr< ns3::Packet const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::SubscriberStationNetDevice::AsciiTraceCallback*')
     typehandlers.add_type_alias('ns3::Callback< void, std::basic_string< char >, ns3::Ptr< ns3::Packet const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::SubscriberStationNetDevice::AsciiTraceCallback&')
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     module.add_container('std::vector< ns3::ServiceFlow * >', 'ns3::ServiceFlow *', container_type='vector')
     module.add_container('std::vector< bool >', 'bool', container_type='vector')
     module.add_container('ns3::bvec', 'bool', container_type='vector')
@@ -2974,6 +2976,8 @@
     cls.add_constructor([param('ns3::ObjectFactory const &', 'arg0')])
     ## object-factory.h (module 'core'): ns3::ObjectFactory::ObjectFactory() [constructor]
     cls.add_constructor([])
+    ## object-factory.h (module 'core'): ns3::ObjectFactory::ObjectFactory(std::string const & typeId) [constructor]
+    cls.add_constructor([param('std::string const &', 'typeId')])
     ## object-factory.h (module 'core'): ns3::Ptr<ns3::Object> ns3::ObjectFactory::Create() const [member function]
     cls.add_method('Create', 
                    'ns3::Ptr< ns3::Object >', 
@@ -3895,7 +3899,7 @@
                    'ns3::WimaxNetDevice::RangingStatus', 
                    [], 
                    is_const=True)
-    ## ss-record.h (module 'wimax'): std::vector<ns3::ServiceFlow *, std::allocator<ns3::ServiceFlow *> > ns3::SSRecord::GetServiceFlows(ns3::ServiceFlow::SchedulingType schedulingType) const [member function]
+    ## ss-record.h (module 'wimax'): std::vector<ns3::ServiceFlow *, std::allocator<ns3::ServiceFlow *>> ns3::SSRecord::GetServiceFlows(ns3::ServiceFlow::SchedulingType schedulingType) const [member function]
     cls.add_method('GetServiceFlows', 
                    'std::vector< ns3::ServiceFlow * >', 
                    [param('ns3::ServiceFlow::SchedulingType', 'schedulingType')], 
@@ -5035,8 +5039,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -5555,14 +5559,14 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('>=')
     cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_unary_numeric_operator('-')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
     cls.add_constructor([])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(double const value) [constructor]
@@ -5581,6 +5585,8 @@
     cls.add_constructor([param('long unsigned int const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int const v) [constructor]
     cls.add_constructor([param('long long unsigned int const', 'v')])
+    ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int128_t const v) [constructor]
+    cls.add_constructor([param('int128_t const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t const hi, uint64_t const lo) [constructor]
     cls.add_constructor([param('int64_t const', 'hi'), param('uint64_t const', 'lo')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [constructor]
@@ -6051,7 +6057,7 @@
                    'uint8_t', 
                    [], 
                    is_const=True)
-    ## ofdm-downlink-frame-prefix.h (module 'wimax'): std::vector<ns3::DlFramePrefixIe, std::allocator<ns3::DlFramePrefixIe> > ns3::OfdmDownlinkFramePrefix::GetDlFramePrefixElements() const [member function]
+    ## ofdm-downlink-frame-prefix.h (module 'wimax'): std::vector<ns3::DlFramePrefixIe, std::allocator<ns3::DlFramePrefixIe>> ns3::OfdmDownlinkFramePrefix::GetDlFramePrefixElements() const [member function]
     cls.add_method('GetDlFramePrefixElements', 
                    'std::vector< ns3::DlFramePrefixIe >', 
                    [], 
@@ -6180,7 +6186,7 @@
     cls.add_method('AddPacket', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet >', 'packet')])
-    ## packet-burst.h (module 'network'): std::list<ns3::Ptr<ns3::Packet>, std::allocator<ns3::Ptr<ns3::Packet> > >::const_iterator ns3::PacketBurst::Begin() const [member function]
+    ## packet-burst.h (module 'network'): std::list<ns3::Ptr<ns3::Packet>, std::allocator<ns3::Ptr<ns3::Packet>>>::const_iterator ns3::PacketBurst::Begin() const [member function]
     cls.add_method('Begin', 
                    'std::list< ns3::Ptr< ns3::Packet > > const_iterator', 
                    [], 
@@ -6190,7 +6196,7 @@
                    'ns3::Ptr< ns3::PacketBurst >', 
                    [], 
                    is_const=True)
-    ## packet-burst.h (module 'network'): std::list<ns3::Ptr<ns3::Packet>, std::allocator<ns3::Ptr<ns3::Packet> > >::const_iterator ns3::PacketBurst::End() const [member function]
+    ## packet-burst.h (module 'network'): std::list<ns3::Ptr<ns3::Packet>, std::allocator<ns3::Ptr<ns3::Packet>>>::const_iterator ns3::PacketBurst::End() const [member function]
     cls.add_method('End', 
                    'std::list< ns3::Ptr< ns3::Packet > > const_iterator', 
                    [], 
@@ -6200,7 +6206,7 @@
                    'uint32_t', 
                    [], 
                    is_const=True)
-    ## packet-burst.h (module 'network'): std::list<ns3::Ptr<ns3::Packet>, std::allocator<ns3::Ptr<ns3::Packet> > > ns3::PacketBurst::GetPackets() const [member function]
+    ## packet-burst.h (module 'network'): std::list<ns3::Ptr<ns3::Packet>, std::allocator<ns3::Ptr<ns3::Packet>>> ns3::PacketBurst::GetPackets() const [member function]
     cls.add_method('GetPackets', 
                    'std::list< ns3::Ptr< ns3::Packet > >', 
                    [], 
@@ -6402,16 +6408,16 @@
     cls.add_method('AssignStreams', 
                    'int64_t', 
                    [param('int64_t', 'stream')])
+    ## propagation-loss-model.h (module 'propagation'): int64_t ns3::PropagationLossModel::DoAssignStreams(int64_t stream) [member function]
+    cls.add_method('DoAssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')], 
+                   is_pure_virtual=True, is_virtual=True, visibility='protected')
     ## propagation-loss-model.h (module 'propagation'): double ns3::PropagationLossModel::DoCalcRxPower(double txPowerDbm, ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
     cls.add_method('DoCalcRxPower', 
                    'double', 
                    [param('double', 'txPowerDbm'), param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
                    is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
-    ## propagation-loss-model.h (module 'propagation'): int64_t ns3::PropagationLossModel::DoAssignStreams(int64_t stream) [member function]
-    cls.add_method('DoAssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'stream')], 
-                   is_pure_virtual=True, is_virtual=True, visibility='private')
     return
 
 def register_Ns3ProtocolTlvValue_methods(root_module, cls):
@@ -6818,7 +6824,7 @@
                    'ns3::SSRecord *', 
                    [param('ns3::Cid', 'cid')], 
                    is_const=True)
-    ## ss-manager.h (module 'wimax'): std::vector<ns3::SSRecord *, std::allocator<ns3::SSRecord *> > * ns3::SSManager::GetSSRecords() const [member function]
+    ## ss-manager.h (module 'wimax'): std::vector<ns3::SSRecord *, std::allocator<ns3::SSRecord *>> * ns3::SSManager::GetSSRecords() const [member function]
     cls.add_method('GetSSRecords', 
                    'std::vector< ns3::SSRecord * > *', 
                    [], 
@@ -6893,11 +6899,11 @@
     cls.add_method('AreServiceFlowsAllocated', 
                    'bool', 
                    [])
-    ## service-flow-manager.h (module 'wimax'): bool ns3::ServiceFlowManager::AreServiceFlowsAllocated(std::vector<ns3::ServiceFlow *, std::allocator<ns3::ServiceFlow *> > * serviceFlows) [member function]
+    ## service-flow-manager.h (module 'wimax'): bool ns3::ServiceFlowManager::AreServiceFlowsAllocated(std::vector<ns3::ServiceFlow *, std::allocator<ns3::ServiceFlow *>> * serviceFlows) [member function]
     cls.add_method('AreServiceFlowsAllocated', 
                    'bool', 
                    [param('std::vector< ns3::ServiceFlow * > *', 'serviceFlows')])
-    ## service-flow-manager.h (module 'wimax'): bool ns3::ServiceFlowManager::AreServiceFlowsAllocated(std::vector<ns3::ServiceFlow *, std::allocator<ns3::ServiceFlow *> > serviceFlows) [member function]
+    ## service-flow-manager.h (module 'wimax'): bool ns3::ServiceFlowManager::AreServiceFlowsAllocated(std::vector<ns3::ServiceFlow *, std::allocator<ns3::ServiceFlow *>> serviceFlows) [member function]
     cls.add_method('AreServiceFlowsAllocated', 
                    'bool', 
                    [param('std::vector< ns3::ServiceFlow * >', 'serviceFlows')])
@@ -6930,7 +6936,7 @@
                    'ns3::ServiceFlow *', 
                    [param('ns3::Cid', 'cid')], 
                    is_const=True)
-    ## service-flow-manager.h (module 'wimax'): std::vector<ns3::ServiceFlow *, std::allocator<ns3::ServiceFlow *> > ns3::ServiceFlowManager::GetServiceFlows(ns3::ServiceFlow::SchedulingType schedulingType) const [member function]
+    ## service-flow-manager.h (module 'wimax'): std::vector<ns3::ServiceFlow *, std::allocator<ns3::ServiceFlow *>> ns3::ServiceFlowManager::GetServiceFlows(ns3::ServiceFlow::SchedulingType schedulingType) const [member function]
     cls.add_method('GetServiceFlows', 
                    'std::vector< ns3::ServiceFlow * >', 
                    [param('ns3::ServiceFlow::SchedulingType', 'schedulingType')], 
@@ -6960,72 +6966,72 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3OutputStreamWrapper_Ns3Empty_Ns3DefaultDeleter__lt__ns3OutputStreamWrapper__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter< ns3::OutputStreamWrapper > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
@@ -7409,7 +7415,7 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## ul-mac-messages.h (module 'wimax'): std::vector<ns3::OfdmUlBurstProfile, std::allocator<ns3::OfdmUlBurstProfile> > ns3::Ucd::GetUlBurstProfiles() const [member function]
+    ## ul-mac-messages.h (module 'wimax'): std::vector<ns3::OfdmUlBurstProfile, std::allocator<ns3::OfdmUlBurstProfile>> ns3::Ucd::GetUlBurstProfiles() const [member function]
     cls.add_method('GetUlBurstProfiles', 
                    'std::vector< ns3::OfdmUlBurstProfile >', 
                    [], 
@@ -7570,7 +7576,7 @@
                    'uint8_t', 
                    [], 
                    is_const=True)
-    ## ul-mac-messages.h (module 'wimax'): std::list<ns3::OfdmUlMapIe, std::allocator<ns3::OfdmUlMapIe> > ns3::UlMap::GetUlMapElements() const [member function]
+    ## ul-mac-messages.h (module 'wimax'): std::list<ns3::OfdmUlMapIe, std::allocator<ns3::OfdmUlMapIe>> ns3::UlMap::GetUlMapElements() const [member function]
     cls.add_method('GetUlMapElements', 
                    'std::list< ns3::OfdmUlMapIe >', 
                    [], 
@@ -7700,7 +7706,7 @@
                    'ns3::Time', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## bs-uplink-scheduler.h (module 'wimax'): std::list<ns3::OfdmUlMapIe, std::allocator<ns3::OfdmUlMapIe> > ns3::UplinkScheduler::GetUplinkAllocations() const [member function]
+    ## bs-uplink-scheduler.h (module 'wimax'): std::list<ns3::OfdmUlMapIe, std::allocator<ns3::OfdmUlMapIe>> ns3::UplinkScheduler::GetUplinkAllocations() const [member function]
     cls.add_method('GetUplinkAllocations', 
                    'std::list< ns3::OfdmUlMapIe >', 
                    [], 
@@ -7816,7 +7822,7 @@
     cls.add_method('CountSymbolsJobs', 
                    'uint32_t', 
                    [param('ns3::Ptr< ns3::UlJob >', 'job')])
-    ## bs-uplink-scheduler-mbqos.h (module 'wimax'): uint32_t ns3::UplinkSchedulerMBQoS::CountSymbolsQueue(std::list<ns3::Ptr<ns3::UlJob>, std::allocator<ns3::Ptr<ns3::UlJob> > > jobs) [member function]
+    ## bs-uplink-scheduler-mbqos.h (module 'wimax'): uint32_t ns3::UplinkSchedulerMBQoS::CountSymbolsQueue(std::list<ns3::Ptr<ns3::UlJob>, std::allocator<ns3::Ptr<ns3::UlJob>>> jobs) [member function]
     cls.add_method('CountSymbolsQueue', 
                    'uint32_t', 
                    [param('std::list< ns3::Ptr< ns3::UlJob > >', 'jobs')])
@@ -7850,7 +7856,7 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## bs-uplink-scheduler-mbqos.h (module 'wimax'): std::list<ns3::OfdmUlMapIe, std::allocator<ns3::OfdmUlMapIe> > ns3::UplinkSchedulerMBQoS::GetUplinkAllocations() const [member function]
+    ## bs-uplink-scheduler-mbqos.h (module 'wimax'): std::list<ns3::OfdmUlMapIe, std::allocator<ns3::OfdmUlMapIe>> ns3::UplinkSchedulerMBQoS::GetUplinkAllocations() const [member function]
     cls.add_method('GetUplinkAllocations', 
                    'std::list< ns3::OfdmUlMapIe >', 
                    [], 
@@ -7937,7 +7943,7 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## bs-uplink-scheduler-rtps.h (module 'wimax'): std::list<ns3::OfdmUlMapIe, std::allocator<ns3::OfdmUlMapIe> > ns3::UplinkSchedulerRtps::GetUplinkAllocations() const [member function]
+    ## bs-uplink-scheduler-rtps.h (module 'wimax'): std::list<ns3::OfdmUlMapIe, std::allocator<ns3::OfdmUlMapIe>> ns3::UplinkSchedulerRtps::GetUplinkAllocations() const [member function]
     cls.add_method('GetUplinkAllocations', 
                    'std::list< ns3::OfdmUlMapIe >', 
                    [], 
@@ -8020,7 +8026,7 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## bs-uplink-scheduler-simple.h (module 'wimax'): std::list<ns3::OfdmUlMapIe, std::allocator<ns3::OfdmUlMapIe> > ns3::UplinkSchedulerSimple::GetUplinkAllocations() const [member function]
+    ## bs-uplink-scheduler-simple.h (module 'wimax'): std::list<ns3::OfdmUlMapIe, std::allocator<ns3::OfdmUlMapIe>> ns3::UplinkSchedulerSimple::GetUplinkAllocations() const [member function]
     cls.add_method('GetUplinkAllocations', 
                    'std::list< ns3::OfdmUlMapIe >', 
                    [], 
@@ -8929,7 +8935,7 @@
                    'ns3::Ptr< ns3::BaseStationNetDevice >', 
                    [], 
                    is_virtual=True)
-    ## bs-scheduler.h (module 'wimax'): std::list<std::pair<ns3::OfdmDlMapIe *, ns3::Ptr<ns3::PacketBurst> >, std::allocator<std::pair<ns3::OfdmDlMapIe *, ns3::Ptr<ns3::PacketBurst> > > > * ns3::BSScheduler::GetDownlinkBursts() const [member function]
+    ## bs-scheduler.h (module 'wimax'): std::list<std::pair<ns3::OfdmDlMapIe *, ns3::Ptr<ns3::PacketBurst>>, std::allocator<std::pair<ns3::OfdmDlMapIe *, ns3::Ptr<ns3::PacketBurst>>>> * ns3::BSScheduler::GetDownlinkBursts() const [member function]
     cls.add_method('GetDownlinkBursts', 
                    'std::list< std::pair< ns3::OfdmDlMapIe *, ns3::Ptr< ns3::PacketBurst > > > *', 
                    [], 
@@ -9005,7 +9011,7 @@
                    'ns3::Ptr< ns3::PacketBurst >', 
                    [param('ns3::ServiceFlow *', 'serviceFlow'), param('ns3::WimaxPhy::ModulationType', 'modulationType'), param('uint32_t', 'availableSymbols')], 
                    is_virtual=True)
-    ## bs-scheduler-rtps.h (module 'wimax'): std::list<std::pair<ns3::OfdmDlMapIe *, ns3::Ptr<ns3::PacketBurst> >, std::allocator<std::pair<ns3::OfdmDlMapIe *, ns3::Ptr<ns3::PacketBurst> > > > * ns3::BSSchedulerRtps::GetDownlinkBursts() const [member function]
+    ## bs-scheduler-rtps.h (module 'wimax'): std::list<std::pair<ns3::OfdmDlMapIe *, ns3::Ptr<ns3::PacketBurst>>, std::allocator<std::pair<ns3::OfdmDlMapIe *, ns3::Ptr<ns3::PacketBurst>>>> * ns3::BSSchedulerRtps::GetDownlinkBursts() const [member function]
     cls.add_method('GetDownlinkBursts', 
                    'std::list< std::pair< ns3::OfdmDlMapIe *, ns3::Ptr< ns3::PacketBurst > > > *', 
                    [], 
@@ -9068,7 +9074,7 @@
                    'ns3::Ptr< ns3::PacketBurst >', 
                    [param('ns3::ServiceFlow *', 'serviceFlow'), param('ns3::WimaxPhy::ModulationType', 'modulationType'), param('uint32_t', 'availableSymbols')], 
                    is_virtual=True)
-    ## bs-scheduler-simple.h (module 'wimax'): std::list<std::pair<ns3::OfdmDlMapIe *, ns3::Ptr<ns3::PacketBurst> >, std::allocator<std::pair<ns3::OfdmDlMapIe *, ns3::Ptr<ns3::PacketBurst> > > > * ns3::BSSchedulerSimple::GetDownlinkBursts() const [member function]
+    ## bs-scheduler-simple.h (module 'wimax'): std::list<std::pair<ns3::OfdmDlMapIe *, ns3::Ptr<ns3::PacketBurst>>, std::allocator<std::pair<ns3::OfdmDlMapIe *, ns3::Ptr<ns3::PacketBurst>>>> * ns3::BSSchedulerSimple::GetDownlinkBursts() const [member function]
     cls.add_method('GetDownlinkBursts', 
                    'std::list< std::pair< ns3::OfdmDlMapIe *, ns3::Ptr< ns3::PacketBurst > > > *', 
                    [], 
@@ -9228,7 +9234,7 @@
                    'ns3::ServiceFlow *', 
                    [param('ns3::Cid', 'cid')], 
                    is_const=True)
-    ## bs-service-flow-manager.h (module 'wimax'): std::vector<ns3::ServiceFlow *, std::allocator<ns3::ServiceFlow *> > ns3::BsServiceFlowManager::GetServiceFlows(ns3::ServiceFlow::SchedulingType schedulingType) const [member function]
+    ## bs-service-flow-manager.h (module 'wimax'): std::vector<ns3::ServiceFlow *, std::allocator<ns3::ServiceFlow *>> ns3::BsServiceFlowManager::GetServiceFlows(ns3::ServiceFlow::SchedulingType schedulingType) const [member function]
     cls.add_method('GetServiceFlows', 
                    'std::vector< ns3::ServiceFlow * >', 
                    [param('ns3::ServiceFlow::SchedulingType', 'schedulingType')], 
@@ -9293,67 +9299,67 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::Packet const> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::NetDevice> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::PacketBurst const> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::Packet const> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['bool'], visibility='protected')
+                   is_static=True, template_parameters=['unsigned short'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['unsigned long long'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Address const&'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Mac48Address const&'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::NetDevice::PacketType'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Mac48Address'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::PacketBurst const> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Cid const&'], visibility='protected')
+                   is_static=True, template_parameters=['bool'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Cid'], visibility='protected')
+                   is_static=True, template_parameters=['unsigned long long'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::PacketBurst> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Mac48Address const&'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::NetDevice> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Mac48Address'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['unsigned short'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Cid const&'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Address const&'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Cid'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::NetDevice::PacketType'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::PacketBurst> '], visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -9437,7 +9443,7 @@
     cls.add_method('GetConnection', 
                    'ns3::Ptr< ns3::WimaxConnection >', 
                    [param('ns3::Cid', 'cid')])
-    ## connection-manager.h (module 'wimax'): std::vector<ns3::Ptr<ns3::WimaxConnection>, std::allocator<ns3::Ptr<ns3::WimaxConnection> > > ns3::ConnectionManager::GetConnections(ns3::Cid::Type type) const [member function]
+    ## connection-manager.h (module 'wimax'): std::vector<ns3::Ptr<ns3::WimaxConnection>, std::allocator<ns3::Ptr<ns3::WimaxConnection>>> ns3::ConnectionManager::GetConnections(ns3::Cid::Type type) const [member function]
     cls.add_method('GetConnections', 
                    'std::vector< ns3::Ptr< ns3::WimaxConnection > >', 
                    [param('ns3::Cid::Type', 'type')], 
@@ -9520,7 +9526,7 @@
                    'uint8_t', 
                    [], 
                    is_const=True)
-    ## dl-mac-messages.h (module 'wimax'): std::vector<ns3::OfdmDlBurstProfile, std::allocator<ns3::OfdmDlBurstProfile> > ns3::Dcd::GetDlBurstProfiles() const [member function]
+    ## dl-mac-messages.h (module 'wimax'): std::vector<ns3::OfdmDlBurstProfile, std::allocator<ns3::OfdmDlBurstProfile>> ns3::Dcd::GetDlBurstProfiles() const [member function]
     cls.add_method('GetDlBurstProfiles', 
                    'std::vector< ns3::OfdmDlBurstProfile >', 
                    [], 
@@ -9622,7 +9628,7 @@
                    'uint8_t', 
                    [], 
                    is_const=True)
-    ## dl-mac-messages.h (module 'wimax'): std::list<ns3::OfdmDlMapIe, std::allocator<ns3::OfdmDlMapIe> > ns3::DlMap::GetDlMapElements() const [member function]
+    ## dl-mac-messages.h (module 'wimax'): std::list<ns3::OfdmDlMapIe, std::allocator<ns3::OfdmDlMapIe>> ns3::DlMap::GetDlMapElements() const [member function]
     cls.add_method('GetDlMapElements', 
                    'std::list< ns3::OfdmDlMapIe >', 
                    [], 
@@ -10965,10 +10971,16 @@
     cls.add_method('ExtractNeighborIndex', 
                    'uint32_t', 
                    [param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetEpoch() const [member function]
+    cls.add_method('GetEpoch', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() const [member function]
     cls.add_method('GetRemainingBits', 
                    'uint32_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -10979,6 +10991,10 @@
                    'uint32_t', 
                    [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
+    ## nix-vector.h (module 'network'): void ns3::NixVector::SetEpoch(uint32_t epoch) [member function]
+    cls.add_method('SetEpoch', 
+                   'void', 
+                   [param('uint32_t', 'epoch')])
     return
 
 def register_Ns3Node_methods(root_module, cls):
@@ -11355,10 +11371,11 @@
                    'uint32_t', 
                    [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) const [member function]
     cls.add_method('SetNixVector', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')], 
+                   is_const=True)
     ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
     cls.add_method('ToString', 
                    'std::string', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wimax/bindings/modulegen__gcc_LP64.py ns-3.36/src/wimax/bindings/modulegen__gcc_LP64.py
--- ns-3.35/src/wimax/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wimax/bindings/modulegen__gcc_LP64.py	2022-04-30 18:23:58.222735200 -0700
@@ -91,6 +91,8 @@
     module.add_class('DlFramePrefixIe')
     ## event-id.h (module 'core'): ns3::EventId [class]
     module.add_class('EventId', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId::UID [enumeration]
+    module.add_enum('UID', ['INVALID', 'NOW', 'DESTROY', 'RESERVED', 'VALID'], outer_class=root_module['ns3::EventId'], import_from_module='ns.core')
     ## hash.h (module 'core'): ns3::Hasher [class]
     module.add_class('Hasher', import_from_module='ns.core')
     ## ipcs-classifier-record.h (module 'wimax'): ns3::IpcsClassifierRecord [class]
@@ -356,25 +358,25 @@
     module.add_class('SfVectorTlvValue', parent=root_module['ns3::VectorTlvValue'])
     ## wimax-tlv.h (module 'wimax'): ns3::SfVectorTlvValue::Type [enumeration]
     module.add_enum('Type', ['SFID', 'CID', 'Service_Class_Name', 'reserved1', 'QoS_Parameter_Set_Type', 'Traffic_Priority', 'Maximum_Sustained_Traffic_Rate', 'Maximum_Traffic_Burst', 'Minimum_Reserved_Traffic_Rate', 'Minimum_Tolerable_Traffic_Rate', 'Service_Flow_Scheduling_Type', 'Request_Transmission_Policy', 'Tolerated_Jitter', 'Maximum_Latency', 'Fixed_length_versus_Variable_length_SDU_Indicator', 'SDU_Size', 'Target_SAID', 'ARQ_Enable', 'ARQ_WINDOW_SIZE', 'ARQ_RETRY_TIMEOUT_Transmitter_Delay', 'ARQ_RETRY_TIMEOUT_Receiver_Delay', 'ARQ_BLOCK_LIFETIME', 'ARQ_SYNC_LOSS', 'ARQ_DELIVER_IN_ORDER', 'ARQ_PURGE_TIMEOUT', 'ARQ_BLOCK_SIZE', 'reserved2', 'CS_Specification', 'IPV4_CS_Parameters'], outer_class=root_module['ns3::SfVectorTlvValue'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::OutputStreamWrapper', 'ns3::empty', 'ns3::DefaultDeleter<ns3::OutputStreamWrapper>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
     ## ss-service-flow-manager.h (module 'wimax'): ns3::SsServiceFlowManager [class]
     module.add_class('SsServiceFlowManager', parent=root_module['ns3::ServiceFlowManager'])
@@ -656,7 +658,7 @@
     typehandlers.add_type_alias('ns3::Callback< void, std::basic_string< char >, ns3::Ptr< ns3::Packet const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::SubscriberStationNetDevice::AsciiTraceCallback')
     typehandlers.add_type_alias('ns3::Callback< void, std::basic_string< char >, ns3::Ptr< ns3::Packet const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::SubscriberStationNetDevice::AsciiTraceCallback*')
     typehandlers.add_type_alias('ns3::Callback< void, std::basic_string< char >, ns3::Ptr< ns3::Packet const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::SubscriberStationNetDevice::AsciiTraceCallback&')
-    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::basic_string< char, std::char_traits< char >, std::allocator< char > >', 'ns3::LogComponent *'), container_type='map')
     module.add_container('std::vector< ns3::ServiceFlow * >', 'ns3::ServiceFlow *', container_type='vector')
     module.add_container('std::vector< bool >', 'bool', container_type='vector')
     module.add_container('ns3::bvec', 'bool', container_type='vector')
@@ -2974,6 +2976,8 @@
     cls.add_constructor([param('ns3::ObjectFactory const &', 'arg0')])
     ## object-factory.h (module 'core'): ns3::ObjectFactory::ObjectFactory() [constructor]
     cls.add_constructor([])
+    ## object-factory.h (module 'core'): ns3::ObjectFactory::ObjectFactory(std::string const & typeId) [constructor]
+    cls.add_constructor([param('std::string const &', 'typeId')])
     ## object-factory.h (module 'core'): ns3::Ptr<ns3::Object> ns3::ObjectFactory::Create() const [member function]
     cls.add_method('Create', 
                    'ns3::Ptr< ns3::Object >', 
@@ -3895,7 +3899,7 @@
                    'ns3::WimaxNetDevice::RangingStatus', 
                    [], 
                    is_const=True)
-    ## ss-record.h (module 'wimax'): std::vector<ns3::ServiceFlow *, std::allocator<ns3::ServiceFlow *> > ns3::SSRecord::GetServiceFlows(ns3::ServiceFlow::SchedulingType schedulingType) const [member function]
+    ## ss-record.h (module 'wimax'): std::vector<ns3::ServiceFlow *, std::allocator<ns3::ServiceFlow *>> ns3::SSRecord::GetServiceFlows(ns3::ServiceFlow::SchedulingType schedulingType) const [member function]
     cls.add_method('GetServiceFlows', 
                    'std::vector< ns3::ServiceFlow * >', 
                    [param('ns3::ServiceFlow::SchedulingType', 'schedulingType')], 
@@ -5035,8 +5039,8 @@
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
-    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
-    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(std::string const & name) [constructor]
+    cls.add_constructor([param('std::string const &', 'name')])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
     cls.add_constructor([])
     ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [constructor]
@@ -5555,14 +5559,14 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('>=')
     cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_unary_numeric_operator('-')
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
     cls.add_constructor([])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(double const value) [constructor]
@@ -5581,6 +5585,8 @@
     cls.add_constructor([param('long unsigned int const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int const v) [constructor]
     cls.add_constructor([param('long long unsigned int const', 'v')])
+    ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int128_t const v) [constructor]
+    cls.add_constructor([param('int128_t const', 'v')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t const hi, uint64_t const lo) [constructor]
     cls.add_constructor([param('int64_t const', 'hi'), param('uint64_t const', 'lo')])
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [constructor]
@@ -6051,7 +6057,7 @@
                    'uint8_t', 
                    [], 
                    is_const=True)
-    ## ofdm-downlink-frame-prefix.h (module 'wimax'): std::vector<ns3::DlFramePrefixIe, std::allocator<ns3::DlFramePrefixIe> > ns3::OfdmDownlinkFramePrefix::GetDlFramePrefixElements() const [member function]
+    ## ofdm-downlink-frame-prefix.h (module 'wimax'): std::vector<ns3::DlFramePrefixIe, std::allocator<ns3::DlFramePrefixIe>> ns3::OfdmDownlinkFramePrefix::GetDlFramePrefixElements() const [member function]
     cls.add_method('GetDlFramePrefixElements', 
                    'std::vector< ns3::DlFramePrefixIe >', 
                    [], 
@@ -6180,7 +6186,7 @@
     cls.add_method('AddPacket', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet >', 'packet')])
-    ## packet-burst.h (module 'network'): std::list<ns3::Ptr<ns3::Packet>, std::allocator<ns3::Ptr<ns3::Packet> > >::const_iterator ns3::PacketBurst::Begin() const [member function]
+    ## packet-burst.h (module 'network'): std::list<ns3::Ptr<ns3::Packet>, std::allocator<ns3::Ptr<ns3::Packet>>>::const_iterator ns3::PacketBurst::Begin() const [member function]
     cls.add_method('Begin', 
                    'std::list< ns3::Ptr< ns3::Packet > > const_iterator', 
                    [], 
@@ -6190,7 +6196,7 @@
                    'ns3::Ptr< ns3::PacketBurst >', 
                    [], 
                    is_const=True)
-    ## packet-burst.h (module 'network'): std::list<ns3::Ptr<ns3::Packet>, std::allocator<ns3::Ptr<ns3::Packet> > >::const_iterator ns3::PacketBurst::End() const [member function]
+    ## packet-burst.h (module 'network'): std::list<ns3::Ptr<ns3::Packet>, std::allocator<ns3::Ptr<ns3::Packet>>>::const_iterator ns3::PacketBurst::End() const [member function]
     cls.add_method('End', 
                    'std::list< ns3::Ptr< ns3::Packet > > const_iterator', 
                    [], 
@@ -6200,7 +6206,7 @@
                    'uint32_t', 
                    [], 
                    is_const=True)
-    ## packet-burst.h (module 'network'): std::list<ns3::Ptr<ns3::Packet>, std::allocator<ns3::Ptr<ns3::Packet> > > ns3::PacketBurst::GetPackets() const [member function]
+    ## packet-burst.h (module 'network'): std::list<ns3::Ptr<ns3::Packet>, std::allocator<ns3::Ptr<ns3::Packet>>> ns3::PacketBurst::GetPackets() const [member function]
     cls.add_method('GetPackets', 
                    'std::list< ns3::Ptr< ns3::Packet > >', 
                    [], 
@@ -6402,16 +6408,16 @@
     cls.add_method('AssignStreams', 
                    'int64_t', 
                    [param('int64_t', 'stream')])
+    ## propagation-loss-model.h (module 'propagation'): int64_t ns3::PropagationLossModel::DoAssignStreams(int64_t stream) [member function]
+    cls.add_method('DoAssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')], 
+                   is_pure_virtual=True, is_virtual=True, visibility='protected')
     ## propagation-loss-model.h (module 'propagation'): double ns3::PropagationLossModel::DoCalcRxPower(double txPowerDbm, ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
     cls.add_method('DoCalcRxPower', 
                    'double', 
                    [param('double', 'txPowerDbm'), param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
                    is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
-    ## propagation-loss-model.h (module 'propagation'): int64_t ns3::PropagationLossModel::DoAssignStreams(int64_t stream) [member function]
-    cls.add_method('DoAssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'stream')], 
-                   is_pure_virtual=True, is_virtual=True, visibility='private')
     return
 
 def register_Ns3ProtocolTlvValue_methods(root_module, cls):
@@ -6818,7 +6824,7 @@
                    'ns3::SSRecord *', 
                    [param('ns3::Cid', 'cid')], 
                    is_const=True)
-    ## ss-manager.h (module 'wimax'): std::vector<ns3::SSRecord *, std::allocator<ns3::SSRecord *> > * ns3::SSManager::GetSSRecords() const [member function]
+    ## ss-manager.h (module 'wimax'): std::vector<ns3::SSRecord *, std::allocator<ns3::SSRecord *>> * ns3::SSManager::GetSSRecords() const [member function]
     cls.add_method('GetSSRecords', 
                    'std::vector< ns3::SSRecord * > *', 
                    [], 
@@ -6893,11 +6899,11 @@
     cls.add_method('AreServiceFlowsAllocated', 
                    'bool', 
                    [])
-    ## service-flow-manager.h (module 'wimax'): bool ns3::ServiceFlowManager::AreServiceFlowsAllocated(std::vector<ns3::ServiceFlow *, std::allocator<ns3::ServiceFlow *> > * serviceFlows) [member function]
+    ## service-flow-manager.h (module 'wimax'): bool ns3::ServiceFlowManager::AreServiceFlowsAllocated(std::vector<ns3::ServiceFlow *, std::allocator<ns3::ServiceFlow *>> * serviceFlows) [member function]
     cls.add_method('AreServiceFlowsAllocated', 
                    'bool', 
                    [param('std::vector< ns3::ServiceFlow * > *', 'serviceFlows')])
-    ## service-flow-manager.h (module 'wimax'): bool ns3::ServiceFlowManager::AreServiceFlowsAllocated(std::vector<ns3::ServiceFlow *, std::allocator<ns3::ServiceFlow *> > serviceFlows) [member function]
+    ## service-flow-manager.h (module 'wimax'): bool ns3::ServiceFlowManager::AreServiceFlowsAllocated(std::vector<ns3::ServiceFlow *, std::allocator<ns3::ServiceFlow *>> serviceFlows) [member function]
     cls.add_method('AreServiceFlowsAllocated', 
                    'bool', 
                    [param('std::vector< ns3::ServiceFlow * >', 'serviceFlows')])
@@ -6930,7 +6936,7 @@
                    'ns3::ServiceFlow *', 
                    [param('ns3::Cid', 'cid')], 
                    is_const=True)
-    ## service-flow-manager.h (module 'wimax'): std::vector<ns3::ServiceFlow *, std::allocator<ns3::ServiceFlow *> > ns3::ServiceFlowManager::GetServiceFlows(ns3::ServiceFlow::SchedulingType schedulingType) const [member function]
+    ## service-flow-manager.h (module 'wimax'): std::vector<ns3::ServiceFlow *, std::allocator<ns3::ServiceFlow *>> ns3::ServiceFlowManager::GetServiceFlows(ns3::ServiceFlow::SchedulingType schedulingType) const [member function]
     cls.add_method('GetServiceFlows', 
                    'std::vector< ns3::ServiceFlow * >', 
                    [param('ns3::ServiceFlow::SchedulingType', 'schedulingType')], 
@@ -6960,72 +6966,72 @@
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>>::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>>::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>>::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>>::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3OutputStreamWrapper_Ns3Empty_Ns3DefaultDeleter__lt__ns3OutputStreamWrapper__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>>::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter< ns3::OutputStreamWrapper > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>>::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
 def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount() [constructor]
     cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [constructor]
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>>::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor>> const & o) [constructor]
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
@@ -7409,7 +7415,7 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## ul-mac-messages.h (module 'wimax'): std::vector<ns3::OfdmUlBurstProfile, std::allocator<ns3::OfdmUlBurstProfile> > ns3::Ucd::GetUlBurstProfiles() const [member function]
+    ## ul-mac-messages.h (module 'wimax'): std::vector<ns3::OfdmUlBurstProfile, std::allocator<ns3::OfdmUlBurstProfile>> ns3::Ucd::GetUlBurstProfiles() const [member function]
     cls.add_method('GetUlBurstProfiles', 
                    'std::vector< ns3::OfdmUlBurstProfile >', 
                    [], 
@@ -7570,7 +7576,7 @@
                    'uint8_t', 
                    [], 
                    is_const=True)
-    ## ul-mac-messages.h (module 'wimax'): std::list<ns3::OfdmUlMapIe, std::allocator<ns3::OfdmUlMapIe> > ns3::UlMap::GetUlMapElements() const [member function]
+    ## ul-mac-messages.h (module 'wimax'): std::list<ns3::OfdmUlMapIe, std::allocator<ns3::OfdmUlMapIe>> ns3::UlMap::GetUlMapElements() const [member function]
     cls.add_method('GetUlMapElements', 
                    'std::list< ns3::OfdmUlMapIe >', 
                    [], 
@@ -7700,7 +7706,7 @@
                    'ns3::Time', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## bs-uplink-scheduler.h (module 'wimax'): std::list<ns3::OfdmUlMapIe, std::allocator<ns3::OfdmUlMapIe> > ns3::UplinkScheduler::GetUplinkAllocations() const [member function]
+    ## bs-uplink-scheduler.h (module 'wimax'): std::list<ns3::OfdmUlMapIe, std::allocator<ns3::OfdmUlMapIe>> ns3::UplinkScheduler::GetUplinkAllocations() const [member function]
     cls.add_method('GetUplinkAllocations', 
                    'std::list< ns3::OfdmUlMapIe >', 
                    [], 
@@ -7816,7 +7822,7 @@
     cls.add_method('CountSymbolsJobs', 
                    'uint32_t', 
                    [param('ns3::Ptr< ns3::UlJob >', 'job')])
-    ## bs-uplink-scheduler-mbqos.h (module 'wimax'): uint32_t ns3::UplinkSchedulerMBQoS::CountSymbolsQueue(std::list<ns3::Ptr<ns3::UlJob>, std::allocator<ns3::Ptr<ns3::UlJob> > > jobs) [member function]
+    ## bs-uplink-scheduler-mbqos.h (module 'wimax'): uint32_t ns3::UplinkSchedulerMBQoS::CountSymbolsQueue(std::list<ns3::Ptr<ns3::UlJob>, std::allocator<ns3::Ptr<ns3::UlJob>>> jobs) [member function]
     cls.add_method('CountSymbolsQueue', 
                    'uint32_t', 
                    [param('std::list< ns3::Ptr< ns3::UlJob > >', 'jobs')])
@@ -7850,7 +7856,7 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## bs-uplink-scheduler-mbqos.h (module 'wimax'): std::list<ns3::OfdmUlMapIe, std::allocator<ns3::OfdmUlMapIe> > ns3::UplinkSchedulerMBQoS::GetUplinkAllocations() const [member function]
+    ## bs-uplink-scheduler-mbqos.h (module 'wimax'): std::list<ns3::OfdmUlMapIe, std::allocator<ns3::OfdmUlMapIe>> ns3::UplinkSchedulerMBQoS::GetUplinkAllocations() const [member function]
     cls.add_method('GetUplinkAllocations', 
                    'std::list< ns3::OfdmUlMapIe >', 
                    [], 
@@ -7937,7 +7943,7 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## bs-uplink-scheduler-rtps.h (module 'wimax'): std::list<ns3::OfdmUlMapIe, std::allocator<ns3::OfdmUlMapIe> > ns3::UplinkSchedulerRtps::GetUplinkAllocations() const [member function]
+    ## bs-uplink-scheduler-rtps.h (module 'wimax'): std::list<ns3::OfdmUlMapIe, std::allocator<ns3::OfdmUlMapIe>> ns3::UplinkSchedulerRtps::GetUplinkAllocations() const [member function]
     cls.add_method('GetUplinkAllocations', 
                    'std::list< ns3::OfdmUlMapIe >', 
                    [], 
@@ -8020,7 +8026,7 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## bs-uplink-scheduler-simple.h (module 'wimax'): std::list<ns3::OfdmUlMapIe, std::allocator<ns3::OfdmUlMapIe> > ns3::UplinkSchedulerSimple::GetUplinkAllocations() const [member function]
+    ## bs-uplink-scheduler-simple.h (module 'wimax'): std::list<ns3::OfdmUlMapIe, std::allocator<ns3::OfdmUlMapIe>> ns3::UplinkSchedulerSimple::GetUplinkAllocations() const [member function]
     cls.add_method('GetUplinkAllocations', 
                    'std::list< ns3::OfdmUlMapIe >', 
                    [], 
@@ -8929,7 +8935,7 @@
                    'ns3::Ptr< ns3::BaseStationNetDevice >', 
                    [], 
                    is_virtual=True)
-    ## bs-scheduler.h (module 'wimax'): std::list<std::pair<ns3::OfdmDlMapIe *, ns3::Ptr<ns3::PacketBurst> >, std::allocator<std::pair<ns3::OfdmDlMapIe *, ns3::Ptr<ns3::PacketBurst> > > > * ns3::BSScheduler::GetDownlinkBursts() const [member function]
+    ## bs-scheduler.h (module 'wimax'): std::list<std::pair<ns3::OfdmDlMapIe *, ns3::Ptr<ns3::PacketBurst>>, std::allocator<std::pair<ns3::OfdmDlMapIe *, ns3::Ptr<ns3::PacketBurst>>>> * ns3::BSScheduler::GetDownlinkBursts() const [member function]
     cls.add_method('GetDownlinkBursts', 
                    'std::list< std::pair< ns3::OfdmDlMapIe *, ns3::Ptr< ns3::PacketBurst > > > *', 
                    [], 
@@ -9005,7 +9011,7 @@
                    'ns3::Ptr< ns3::PacketBurst >', 
                    [param('ns3::ServiceFlow *', 'serviceFlow'), param('ns3::WimaxPhy::ModulationType', 'modulationType'), param('uint32_t', 'availableSymbols')], 
                    is_virtual=True)
-    ## bs-scheduler-rtps.h (module 'wimax'): std::list<std::pair<ns3::OfdmDlMapIe *, ns3::Ptr<ns3::PacketBurst> >, std::allocator<std::pair<ns3::OfdmDlMapIe *, ns3::Ptr<ns3::PacketBurst> > > > * ns3::BSSchedulerRtps::GetDownlinkBursts() const [member function]
+    ## bs-scheduler-rtps.h (module 'wimax'): std::list<std::pair<ns3::OfdmDlMapIe *, ns3::Ptr<ns3::PacketBurst>>, std::allocator<std::pair<ns3::OfdmDlMapIe *, ns3::Ptr<ns3::PacketBurst>>>> * ns3::BSSchedulerRtps::GetDownlinkBursts() const [member function]
     cls.add_method('GetDownlinkBursts', 
                    'std::list< std::pair< ns3::OfdmDlMapIe *, ns3::Ptr< ns3::PacketBurst > > > *', 
                    [], 
@@ -9068,7 +9074,7 @@
                    'ns3::Ptr< ns3::PacketBurst >', 
                    [param('ns3::ServiceFlow *', 'serviceFlow'), param('ns3::WimaxPhy::ModulationType', 'modulationType'), param('uint32_t', 'availableSymbols')], 
                    is_virtual=True)
-    ## bs-scheduler-simple.h (module 'wimax'): std::list<std::pair<ns3::OfdmDlMapIe *, ns3::Ptr<ns3::PacketBurst> >, std::allocator<std::pair<ns3::OfdmDlMapIe *, ns3::Ptr<ns3::PacketBurst> > > > * ns3::BSSchedulerSimple::GetDownlinkBursts() const [member function]
+    ## bs-scheduler-simple.h (module 'wimax'): std::list<std::pair<ns3::OfdmDlMapIe *, ns3::Ptr<ns3::PacketBurst>>, std::allocator<std::pair<ns3::OfdmDlMapIe *, ns3::Ptr<ns3::PacketBurst>>>> * ns3::BSSchedulerSimple::GetDownlinkBursts() const [member function]
     cls.add_method('GetDownlinkBursts', 
                    'std::list< std::pair< ns3::OfdmDlMapIe *, ns3::Ptr< ns3::PacketBurst > > > *', 
                    [], 
@@ -9228,7 +9234,7 @@
                    'ns3::ServiceFlow *', 
                    [param('ns3::Cid', 'cid')], 
                    is_const=True)
-    ## bs-service-flow-manager.h (module 'wimax'): std::vector<ns3::ServiceFlow *, std::allocator<ns3::ServiceFlow *> > ns3::BsServiceFlowManager::GetServiceFlows(ns3::ServiceFlow::SchedulingType schedulingType) const [member function]
+    ## bs-service-flow-manager.h (module 'wimax'): std::vector<ns3::ServiceFlow *, std::allocator<ns3::ServiceFlow *>> ns3::BsServiceFlowManager::GetServiceFlows(ns3::ServiceFlow::SchedulingType schedulingType) const [member function]
     cls.add_method('GetServiceFlows', 
                    'std::vector< ns3::ServiceFlow * >', 
                    [param('ns3::ServiceFlow::SchedulingType', 'schedulingType')], 
@@ -9293,67 +9299,67 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::Packet const> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::NetDevice> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::PacketBurst const> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::Packet const> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['bool'], visibility='protected')
+                   is_static=True, template_parameters=['unsigned short'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['unsigned long'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Address const&'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Mac48Address const&'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::NetDevice::PacketType'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Mac48Address'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::PacketBurst const> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Cid const&'], visibility='protected')
+                   is_static=True, template_parameters=['bool'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Cid'], visibility='protected')
+                   is_static=True, template_parameters=['unsigned long'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::PacketBurst> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Mac48Address const&'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::NetDevice> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Mac48Address'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['unsigned short'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Cid const&'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Address const&'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Cid'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::NetDevice::PacketType'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::PacketBurst> '], visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -9437,7 +9443,7 @@
     cls.add_method('GetConnection', 
                    'ns3::Ptr< ns3::WimaxConnection >', 
                    [param('ns3::Cid', 'cid')])
-    ## connection-manager.h (module 'wimax'): std::vector<ns3::Ptr<ns3::WimaxConnection>, std::allocator<ns3::Ptr<ns3::WimaxConnection> > > ns3::ConnectionManager::GetConnections(ns3::Cid::Type type) const [member function]
+    ## connection-manager.h (module 'wimax'): std::vector<ns3::Ptr<ns3::WimaxConnection>, std::allocator<ns3::Ptr<ns3::WimaxConnection>>> ns3::ConnectionManager::GetConnections(ns3::Cid::Type type) const [member function]
     cls.add_method('GetConnections', 
                    'std::vector< ns3::Ptr< ns3::WimaxConnection > >', 
                    [param('ns3::Cid::Type', 'type')], 
@@ -9520,7 +9526,7 @@
                    'uint8_t', 
                    [], 
                    is_const=True)
-    ## dl-mac-messages.h (module 'wimax'): std::vector<ns3::OfdmDlBurstProfile, std::allocator<ns3::OfdmDlBurstProfile> > ns3::Dcd::GetDlBurstProfiles() const [member function]
+    ## dl-mac-messages.h (module 'wimax'): std::vector<ns3::OfdmDlBurstProfile, std::allocator<ns3::OfdmDlBurstProfile>> ns3::Dcd::GetDlBurstProfiles() const [member function]
     cls.add_method('GetDlBurstProfiles', 
                    'std::vector< ns3::OfdmDlBurstProfile >', 
                    [], 
@@ -9622,7 +9628,7 @@
                    'uint8_t', 
                    [], 
                    is_const=True)
-    ## dl-mac-messages.h (module 'wimax'): std::list<ns3::OfdmDlMapIe, std::allocator<ns3::OfdmDlMapIe> > ns3::DlMap::GetDlMapElements() const [member function]
+    ## dl-mac-messages.h (module 'wimax'): std::list<ns3::OfdmDlMapIe, std::allocator<ns3::OfdmDlMapIe>> ns3::DlMap::GetDlMapElements() const [member function]
     cls.add_method('GetDlMapElements', 
                    'std::list< ns3::OfdmDlMapIe >', 
                    [], 
@@ -10965,10 +10971,16 @@
     cls.add_method('ExtractNeighborIndex', 
                    'uint32_t', 
                    [param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetEpoch() const [member function]
+    cls.add_method('GetEpoch', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() const [member function]
     cls.add_method('GetRemainingBits', 
                    'uint32_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -10979,6 +10991,10 @@
                    'uint32_t', 
                    [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
+    ## nix-vector.h (module 'network'): void ns3::NixVector::SetEpoch(uint32_t epoch) [member function]
+    cls.add_method('SetEpoch', 
+                   'void', 
+                   [param('uint32_t', 'epoch')])
     return
 
 def register_Ns3Node_methods(root_module, cls):
@@ -11355,10 +11371,11 @@
                    'uint32_t', 
                    [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) const [member function]
     cls.add_method('SetNixVector', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')], 
+                   is_const=True)
     ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
     cls.add_method('ToString', 
                    'std::string', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wimax/CMakeLists.txt ns-3.36/src/wimax/CMakeLists.txt
--- ns-3.35/src/wimax/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/wimax/CMakeLists.txt	2022-04-30 18:23:58.222735200 -0700
@@ -0,0 +1,116 @@
+set(source_files
+    helper/wimax-helper.cc
+    model/cid.cc
+    model/cid-factory.cc
+    model/wimax-net-device.cc
+    model/bs-net-device.cc
+    model/ss-net-device.cc
+    model/wimax-mac-header.cc
+    model/wimax-phy.cc
+    model/wimax-channel.cc
+    model/ofdm-downlink-frame-prefix.cc
+    model/wimax-connection.cc
+    model/ss-record.cc
+    model/mac-messages.cc
+    model/dl-mac-messages.cc
+    model/ul-mac-messages.cc
+    model/simple-ofdm-wimax-phy.cc
+    model/simple-ofdm-wimax-channel.cc
+    model/send-params.cc
+    model/ss-manager.cc
+    model/connection-manager.cc
+    model/bs-uplink-scheduler.cc
+    model/bs-uplink-scheduler-simple.cc
+    model/bs-uplink-scheduler-mbqos.cc
+    model/bs-uplink-scheduler-rtps.cc
+    model/bs-scheduler.cc
+    model/bs-scheduler-simple.cc
+    model/bs-scheduler-rtps.cc
+    model/wimax-mac-queue.cc
+    model/burst-profile-manager.cc
+    model/ss-scheduler.cc
+    model/service-flow.cc
+    model/service-flow-manager.cc
+    model/service-flow-record.cc
+    model/ss-link-manager.cc
+    model/bs-link-manager.cc
+    model/bandwidth-manager.cc
+    model/crc8.cc
+    model/ul-job.cc
+    model/snr-to-block-error-rate-record.cc
+    model/snr-to-block-error-rate-manager.cc
+    model/simple-ofdm-send-param.cc
+    model/ss-service-flow-manager.cc
+    model/bs-service-flow-manager.cc
+    model/ipcs-classifier.cc
+    model/ipcs-classifier-record.cc
+    model/wimax-tlv.cc
+    model/cs-parameters.cc
+    model/wimax-mac-to-mac-header.cc
+)
+
+set(header_files
+    helper/wimax-helper.h
+    model/wimax-channel.h
+    model/wimax-net-device.h
+    model/bs-net-device.h
+    model/ss-net-device.h
+    model/cid.h
+    model/cid-factory.h
+    model/ofdm-downlink-frame-prefix.h
+    model/wimax-connection.h
+    model/ss-record.h
+    model/mac-messages.h
+    model/dl-mac-messages.h
+    model/ul-mac-messages.h
+    model/wimax-phy.h
+    model/simple-ofdm-wimax-phy.h
+    model/simple-ofdm-wimax-channel.h
+    model/send-params.h
+    model/service-flow.h
+    model/ss-manager.h
+    model/connection-manager.h
+    model/wimax-mac-header.h
+    model/wimax-mac-queue.h
+    model/crc8.h
+    model/service-flow-manager.h
+    model/bs-uplink-scheduler.h
+    model/bs-uplink-scheduler-simple.h
+    model/bs-uplink-scheduler-mbqos.h
+    model/bs-uplink-scheduler-rtps.h
+    model/ul-job.h
+    model/bs-scheduler.h
+    model/bs-scheduler-simple.h
+    model/bs-scheduler-rtps.h
+    model/service-flow-record.h
+    model/snr-to-block-error-rate-record.h
+    model/snr-to-block-error-rate-manager.h
+    model/simple-ofdm-send-param.h
+    model/ss-service-flow-manager.h
+    model/bs-service-flow-manager.h
+    model/cs-parameters.h
+    model/ipcs-classifier-record.h
+    model/wimax-tlv.h
+    model/ipcs-classifier.h
+    model/bvec.h
+    model/wimax-mac-to-mac-header.h
+)
+
+build_lib(
+  LIBNAME wimax
+  SOURCE_FILES ${source_files}
+  HEADER_FILES ${header_files}
+  LIBRARIES_TO_LINK
+    ${libnetwork}
+    ${libinternet}
+    ${libpropagation}
+    ${libmobility}
+  TEST_SOURCES
+    test/mac-messages-test.cc
+    test/phy-test.cc
+    test/qos-test.cc
+    test/ss-mac-test.cc
+    test/wimax-fragmentation-test.cc
+    test/wimax-service-flow-test.cc
+    test/wimax-tlv-test.cc
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wimax/examples/CMakeLists.txt ns-3.36/src/wimax/examples/CMakeLists.txt
--- ns-3.35/src/wimax/examples/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/src/wimax/examples/CMakeLists.txt	2022-04-30 18:23:58.222735200 -0700
@@ -0,0 +1,30 @@
+build_lib_example(
+  NAME wimax-ipv4
+  SOURCE_FILES wimax-ipv4.cc
+  LIBRARIES_TO_LINK
+    ${libwimax}
+    ${libinternet}
+    ${libmobility}
+    ${libcsma}
+    ${libapplications}
+)
+
+build_lib_example(
+  NAME wimax-multicast
+  SOURCE_FILES wimax-multicast.cc
+  LIBRARIES_TO_LINK
+    ${libwimax}
+    ${libinternet}
+    ${libcsma}
+    ${libapplications}
+)
+
+build_lib_example(
+  NAME wimax-simple
+  SOURCE_FILES wimax-simple.cc
+  LIBRARIES_TO_LINK
+    ${libwimax}
+    ${libinternet}
+    ${libmobility}
+    ${libapplications}
+)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wimax/examples/wscript ns-3.36/src/wimax/examples/wscript
--- ns-3.35/src/wimax/examples/wscript	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wimax/examples/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,11 +0,0 @@
-7## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    obj = bld.create_ns3_program( 'wimax-ipv4', ['wimax', 'internet', 'mobility', 'csma', 'applications'])
-    obj.source = 'wimax-ipv4.cc'
-
-    obj = bld.create_ns3_program( 'wimax-multicast', ['wimax', 'internet', 'csma', 'applications'])
-    obj.source = 'wimax-multicast.cc'
-        
-    obj = bld.create_ns3_program( 'wimax-simple', ['wimax', 'internet', 'mobility', 'applications'])
-    obj.source = 'wimax-simple.cc'
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wimax/model/bs-link-manager.h ns-3.36/src/wimax/model/bs-link-manager.h
--- ns-3.35/src/wimax/model/bs-link-manager.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wimax/model/bs-link-manager.h	2022-04-30 18:23:58.226735400 -0700
@@ -34,6 +34,8 @@
 
 /**
  * \ingroup wimax
+ * 
+ * BaseStation Link Manager
  */
 class BSLinkManager : public Object
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wimax/model/bs-net-device.h ns-3.36/src/wimax/model/bs-net-device.h
--- ns-3.35/src/wimax/model/bs-net-device.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wimax/model/bs-net-device.h	2022-04-30 18:23:58.226735400 -0700
@@ -46,6 +46,8 @@
 
 /**
  * \ingroup wimax
+ * 
+ * BaseStation NetDevice
  */
 class BaseStationNetDevice : public WimaxNetDevice
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wimax/model/bs-scheduler.h ns-3.36/src/wimax/model/bs-scheduler.h
--- ns-3.35/src/wimax/model/bs-scheduler.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wimax/model/bs-scheduler.h	2022-04-30 18:23:58.226735400 -0700
@@ -39,6 +39,8 @@
 
 /**
  * \ingroup wimax
+ * 
+ * BaseStation Scheduler
  */
 class BSScheduler : public Object
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wimax/model/bs-scheduler-simple.h ns-3.36/src/wimax/model/bs-scheduler-simple.h
--- ns-3.35/src/wimax/model/bs-scheduler-simple.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wimax/model/bs-scheduler-simple.h	2022-04-30 18:23:58.226735400 -0700
@@ -39,6 +39,8 @@
 
 /**
  * \ingroup wimax
+ * 
+ * BaseStation Scheduler - simplified
  */
 class BSSchedulerSimple : public BSScheduler
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wimax/model/bs-uplink-scheduler-simple.h ns-3.36/src/wimax/model/bs-uplink-scheduler-simple.h
--- ns-3.35/src/wimax/model/bs-uplink-scheduler-simple.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wimax/model/bs-uplink-scheduler-simple.h	2022-04-30 18:23:58.226735400 -0700
@@ -36,6 +36,8 @@
 
 /**
  * \ingroup wimax
+ * 
+ * Uplink Scheduler - simplified
  */
 class UplinkSchedulerSimple : public UplinkScheduler
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wimax/model/burst-profile-manager.h ns-3.36/src/wimax/model/burst-profile-manager.h
--- ns-3.35/src/wimax/model/burst-profile-manager.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wimax/model/burst-profile-manager.h	2022-04-30 18:23:58.226735400 -0700
@@ -33,6 +33,8 @@
 
 /**
  * \ingroup wimax
+ * 
+ * Profile manager for burst communications
  */
 class BurstProfileManager : public Object
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wimax/model/ipcs-classifier.h ns-3.36/src/wimax/model/ipcs-classifier.h
--- ns-3.35/src/wimax/model/ipcs-classifier.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wimax/model/ipcs-classifier.h	2022-04-30 18:23:58.230735300 -0700
@@ -33,6 +33,8 @@
 
 /**
  * \ingroup wimax
+ * 
+ * IPCS classifier
  */
 class IpcsClassifier : public Object
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wimax/model/wimax-phy.h ns-3.36/src/wimax/model/wimax-phy.h
--- ns-3.35/src/wimax/model/wimax-phy.h	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wimax/model/wimax-phy.h	2022-04-30 18:23:58.230735300 -0700
@@ -41,6 +41,8 @@
 
 /**
  * \ingroup wimax
+ * 
+ * WiMAX PHY entity
  */
 class WimaxPhy : public Object
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wimax/wscript ns-3.36/src/wimax/wscript
--- ns-3.35/src/wimax/wscript	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wimax/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,126 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-def build(bld):
-    obj = bld.create_ns3_module('wimax', ['network', 'internet', 'propagation', 'mobility'])
-    obj.source = [
-            'model/cid.cc',
-            'model/cid-factory.cc',
-            'model/wimax-net-device.cc',
-            'model/bs-net-device.cc',
-            'model/ss-net-device.cc',
-            'model/wimax-mac-header.cc',
-            'model/wimax-phy.cc',
-            'model/wimax-channel.cc',
-            'model/ofdm-downlink-frame-prefix.cc',
-            'model/wimax-connection.cc',
-            'model/ss-record.cc',
-            'model/mac-messages.cc',
-            'model/dl-mac-messages.cc',
-            'model/ul-mac-messages.cc',
-            'model/simple-ofdm-wimax-phy.cc',
-            'model/simple-ofdm-wimax-channel.cc',
-            'model/send-params.cc',
-            'model/ss-manager.cc',
-            'model/connection-manager.cc',
-            'model/bs-uplink-scheduler.cc',
-            'model/bs-uplink-scheduler-simple.cc',
-            'model/bs-uplink-scheduler-mbqos.cc',
-            'model/bs-uplink-scheduler-rtps.cc',
-            'model/bs-scheduler.cc',
-            'model/bs-scheduler-simple.cc',
-            'model/bs-scheduler-rtps.cc',
-            'model/wimax-mac-queue.cc',
-            'model/burst-profile-manager.cc',
-            'model/ss-scheduler.cc',
-            'model/service-flow.cc',
-            'model/service-flow-manager.cc',
-            'model/service-flow-record.cc',
-            'model/ss-link-manager.cc',
-            'model/bs-link-manager.cc',
-            'model/bandwidth-manager.cc',
-            'model/crc8.cc',
-            'model/ul-job.cc',
-            'model/snr-to-block-error-rate-record.cc',
-            'model/snr-to-block-error-rate-manager.cc',
-            'model/simple-ofdm-send-param.cc',
-            'model/ss-service-flow-manager.cc',
-            'model/bs-service-flow-manager.cc',
-            'model/ipcs-classifier.cc',
-            'model/ipcs-classifier-record.cc',
-            'model/wimax-tlv.cc',
-            'model/cs-parameters.cc',
-            'model/wimax-mac-to-mac-header.cc',
-            'helper/wimax-helper.cc',
-        ]
-
-
-    obj_test = bld.create_ns3_module_test_library('wimax')
-    obj_test.source = [
-            'test/wimax-tlv-test.cc',
-            'test/mac-messages-test.cc',
-            'test/wimax-service-flow-test.cc',
-            'test/ss-mac-test.cc',
-            'test/phy-test.cc',
-            'test/qos-test.cc',
-            'test/wimax-fragmentation-test.cc',
-        ]
-
-    # Tests encapsulating example programs should be listed here
-    if (bld.env['ENABLE_EXAMPLES']):
-        obj_test.source.extend([
-        #   'test/wimax-examples-test-suite.cc',
-            ])
-    
-    headers = bld(features='ns3header')
-    headers.module = 'wimax'
-    headers.source = [
-            'model/wimax-channel.h',
-            'model/wimax-net-device.h',
-            'model/bs-net-device.h',
-            'model/ss-net-device.h',
-            'model/cid.h',
-            'model/cid-factory.h',
-            'model/ofdm-downlink-frame-prefix.h',
-            'model/wimax-connection.h',
-            'model/ss-record.h',
-            'model/mac-messages.h',
-            'model/dl-mac-messages.h',
-            'model/ul-mac-messages.h',
-            'model/wimax-phy.h',
-            'model/simple-ofdm-wimax-phy.h',
-            'model/simple-ofdm-wimax-channel.h',          
-            'model/send-params.h',
-            'model/service-flow.h',
-            'model/ss-manager.h',
-            'model/connection-manager.h',
-            'model/wimax-mac-header.h',
-            'model/wimax-mac-queue.h',
-            'model/crc8.h',
-            'model/service-flow-manager.h',
-            'model/bs-uplink-scheduler.h',
-            'model/bs-uplink-scheduler-simple.h',
-            'model/bs-uplink-scheduler-mbqos.h',
-            'model/bs-uplink-scheduler-rtps.h',
-            'model/ul-job.h',
-            'model/bs-scheduler.h',
-            'model/bs-scheduler-simple.h',
-            'model/bs-scheduler-rtps.h',
-            'model/service-flow-record.h',
-            'model/snr-to-block-error-rate-record.h',
-            'model/snr-to-block-error-rate-manager.h',
-            'model/simple-ofdm-send-param.h',
-            'model/ss-service-flow-manager.h',
-            'model/bs-service-flow-manager.h',
-            'model/cs-parameters.h',
-            'model/ipcs-classifier-record.h',
-            'model/wimax-tlv.h',
-            'model/ipcs-classifier.h',
-            'model/bvec.h',
-            'model/wimax-mac-to-mac-header.h',
-            'helper/wimax-helper.h',
-        ]
-
-
-    if bld.env['ENABLE_EXAMPLES']:
-        bld.recurse('examples')
-
-    bld.ns3_python_bindings()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/src/wscript ns-3.36/src/wscript
--- ns-3.35/src/wscript	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/src/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,747 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-from __future__ import print_function
-import os, os.path
-import sys
-import shutil
-import types
-import warnings
-
-from waflib import TaskGen, Task, Options, Build, Utils, Context
-from waflib.Errors import WafError
-import wutils
-
-try:
-    set
-except NameError:
-    from sets import Set as set # Python 2.3 fallback
-
-
-
-all_modules = []
-for dirname in os.listdir('src'):
-    if dirname.startswith('.') or dirname == 'CVS':
-        continue
-    path = os.path.join('src', dirname)
-    if not os.path.isdir(path):
-        continue
-    if os.path.exists(os.path.join(path, 'wscript')):
-        all_modules.append(dirname)
-all_modules.sort()
-
-def get_required_boost_libs(conf):
-    for module in all_modules:
-        conf.recurse (module, name="required_boost_libs", mandatory=False)
-
-def options(opt):
-    opt.add_option('--enable-rpath',
-                   help=("Link programs with rpath"
-                         " (normally not needed, see "
-                         " --run and --shell; moreover, only works in some"
-                         " specific platforms, such as Linux and Solaris)"),
-                   action="store_true", dest='enable_rpath', default=False)
-
-    opt.add_option('--enable-modules',
-                   help=("Build only these modules (and dependencies)"),
-                   dest='enable_modules')
-
-
-    for module in all_modules:
-        opt.recurse(module, mandatory=False)
-
-def configure(conf):
-    # Append blddir to the module path before recursing into modules
-    blddir = os.path.abspath(os.path.join(conf.bldnode.abspath(), conf.variant))
-    conf.env.append_value('NS3_MODULE_PATH', blddir + "/lib")
-
-    for module in all_modules:
-        conf.recurse(module, mandatory=False)
-
-    # Remove duplicate path items
-    conf.env['NS3_MODULE_PATH'] = wutils.uniquify_list(conf.env['NS3_MODULE_PATH'])
-
-    if Options.options.enable_rpath:
-        conf.env.append_value('RPATH', '-Wl,-rpath,%s' % (os.path.join(blddir),))
-
-    ## Used to link the 'test-runner' program with all of ns-3 code
-    conf.env['NS3_MODULES'] = ['ns3-' + module.split('/')[-1] for module in all_modules]
-
-
-
-# we need the 'ns3module' waf "feature" to be created because code
-# elsewhere looks for it to find the ns3 module objects.
-@TaskGen.feature('ns3module')
-def _add_test_code(module):
-    pass
-
-def create_ns3_module(bld, name, dependencies=(), test=False):
-    static = bool(bld.env.ENABLE_STATIC_NS3)
-    # Create a separate library for this module.
-    if static:
-        module = bld(features='cxx cxxstlib ns3module')
-    else:
-        module = bld(features='cxx cxxshlib ns3module')
-    module.target = '%s/lib/ns%s-%s%s' % (bld.srcnode.path_from(module.path), wutils.VERSION,
-                                       name, bld.env.BUILD_SUFFIX)
-    linkflags = []
-    cxxflags = []
-    ccflags = []
-    if not static:
-        cxxflags = module.env['shlib_CXXFLAGS']
-        ccflags = module.env['shlib_CXXFLAGS']
-        # Turn on the link flags for shared libraries if we have the
-        # proper compiler and platform.
-        if module.env['CXX_NAME'] in ['gcc', 'icc'] and module.env['WL_SONAME_SUPPORTED']:
-            # Get the module library name without any relative paths
-            # at its beginning because all of the libraries will end
-            # up in the same directory.
-            module_library_name = module.env.cshlib_PATTERN % (os.path.basename(module.target),)
-            linkflags = '-Wl,--soname=' + module_library_name
-    cxxdefines = ["NS3_MODULE_COMPILATION"]
-    ccdefines = ["NS3_MODULE_COMPILATION"]
-
-    module.env.append_value('CXXFLAGS', cxxflags)
-    module.env.append_value('CCFLAGS', ccflags)
-    module.env.append_value('LINKFLAGS', linkflags)
-    module.env.append_value('CXXDEFINES', cxxdefines)
-    module.env.append_value('CCDEFINES', ccdefines)
-
-    module.is_static = static
-    module.vnum = wutils.VNUM
-    # Add the proper path to the module's name.
-    # Set the libraries this module depends on.
-    module.module_deps = list(dependencies)
-
-    module.install_path = "${LIBDIR}"
-
-    module.name = "ns3-" + name
-    module.dependencies = dependencies
-    # Initially create an empty value for this because the pcfile
-    # writing task assumes every module has a uselib attribute.
-    module.uselib = ''
-    module.use = ['ns3-' + dep for dep in dependencies]
-    module.test = test
-    module.is_ns3_module = True
-    module.ns3_dir_location = bld.path.path_from(bld.srcnode)
-
-    module.env.append_value("INCLUDES", Context.out_dir)
-
-    module.pcfilegen = bld(features='ns3pcfile')
-    module.pcfilegen.module = module.name
-
-    return module
-
-@TaskGen.feature("ns3testlib")
-@TaskGen.before_method("apply_incpaths")
-def apply_incpaths_ns3testlib(self):
-    if not self.source:
-        return
-    testdir = self.to_nodes(self.source[-1])[0].parent.path_from(self.bld.srcnode)
-    self.env.append_value("DEFINES", 'NS_TEST_SOURCEDIR="%s"' % (testdir,))
-
-
-def create_ns3_module_test_library(bld, name):
-    # Create an ns3 module for the test library that depends only on
-    # the module being tested.
-    library_name = name + "-test"
-    library = bld.create_ns3_module(library_name, [name], test=True)
-    library.features += " ns3testlib"
-
-    # Modify attributes for the test library that are different from a
-    # normal module.
-    del library.is_ns3_module
-    library.is_ns3_module_test_library = True
-    library.module_name = 'ns3-' + name
-
-    # Add this module and test library to the list.
-    bld.env.append_value('NS3_MODULES_WITH_TEST_LIBRARIES', [(library.module_name, library.name)])
-
-    # Set the include path from the build directory to modules.
-    relative_path_from_build_to_here = bld.path.path_from(bld.bldnode)
-    include_flag = '-I' + relative_path_from_build_to_here
-    library.env.append_value('CXXFLAGS', include_flag)
-    library.env.append_value('CCFLAGS',  include_flag)
-
-    return library
-
-def create_obj(bld, *args):
-    warnings.warn("(in %s) Use bld(...) call now, instead of bld.create_obj(...)" % str(bld.path),
-                  DeprecationWarning, stacklevel=2)
-    return bld(*args)
-
-
-def ns3_python_bindings(bld):
-
-    # this method is called from a module wscript, so remember bld.path is not bindings/python!
-    module_abs_src_path = bld.path.abspath()
-    module = os.path.basename(module_abs_src_path)
-    env = bld.env
-    env.append_value("MODULAR_BINDINGS_MODULES", "ns3-"+module)
-
-    if Options.options.apiscan:
-        return
-
-    if not env['ENABLE_PYTHON_BINDINGS']:
-        return
-
-    bindings_dir = bld.path.find_dir("bindings")
-    if bindings_dir is None or not os.path.exists(bindings_dir.abspath()):
-        warnings.warn("(in %s) Requested to build modular python bindings, but apidefs dir not found "
-                      "=> skipped the bindings." % str(bld.path),
-                      Warning, stacklevel=2)
-        return
-
-    env.append_value('PYTHON_MODULES_BUILT', module)
-    try:
-        apidefs = env['PYTHON_BINDINGS_APIDEFS'].replace("-", "_")
-    except AttributeError:
-        # we likely got an empty list for env['PYTHON_BINDINGS_APIDEFS']
-        return
-
-    #debug = ('PYBINDGEN_DEBUG' in os.environ)
-    debug = True # XXX
-    source = [bld.srcnode.find_resource('bindings/python/ns3modulegen-modular.py'),
-              bld.path.find_resource("bindings/modulegen__%s.py" % apidefs)]
-
-    modulegen_customizations = bindings_dir.find_resource("modulegen_customizations.py")
-    if modulegen_customizations is not None:
-        source.append(modulegen_customizations)
-
-    modulegen_local = bld.path.find_resource("bindings/modulegen_local.py")
-    # the local customization file may or not exist
-    if modulegen_local is not None:
-        source.append("bindings/modulegen_local.py")
-
-    module_py_name = module.replace('-', '_')
-    module_target_dir = bld.srcnode.find_dir("bindings/python/ns").path_from(bld.path)
-
-    # if bindings/<module>.py exists, it becomes the module frontend, and the C extension befomes _<module>
-    if bld.path.find_resource("bindings/%s.py" % (module_py_name,)) is not None:
-        bld(features='copy',
-            source=("bindings/%s.py" % (module_py_name,)),
-            target=('%s/%s.py' % (module_target_dir, module_py_name)))
-        extension_name = '_%s' % (module_py_name,)
-        bld.install_files('${PYTHONARCHDIR}/ns', ["bindings/%s.py" % (module_py_name,)])
-    else:
-        extension_name = module_py_name
-
-    target = ['bindings/ns3module.cc', 'bindings/ns3module.h', 'bindings/ns3modulegen.log']
-    #if not debug:
-    #    target.append('ns3modulegen.log')
-
-    argv = ['NS3_ENABLED_FEATURES=${FEATURES}',
-            'GCC_RTTI_ABI_COMPLETE=${GCC_RTTI_ABI_COMPLETE}',
-            '${PYTHON}']
-    #if debug:
-    #    argv.extend(["-m", "pdb"])
-
-    argv.extend(['${SRC[0]}', module_abs_src_path, apidefs, extension_name, '${TGT[0]}'])
-
-    argv.extend(['2>', '${TGT[2]}']) # 2> ns3modulegen.log
-
-    features = []
-    for (name, caption, was_enabled, reason_not_enabled) in env['NS3_OPTIONAL_FEATURES']:
-        if was_enabled:
-            features.append(name)
-
-    bindgen = bld(features='command', source=source, target=target, command=argv)
-    bindgen.env['FEATURES'] = ','.join(features)
-    bindgen.dep_vars = ['FEATURES', "GCC_RTTI_ABI_COMPLETE"]
-    bindgen.name = "pybindgen(ns3 module %s)" % module
-    bindgen.module = module
-    bindgen.install_path = None
-
-    # Retrieve the module dependencies
-    module_obj = bld.get_tgen_by_name('ns3-' + module)
-    module_deps = module_obj.use.copy()
-    module_deps.append('ns3-' + module)
-
-    # generate the extension module
-    pymod = bld(features='cxx cxxshlib pyext')
-    pymod.source = ['bindings/ns3module.cc']
-    pymod.target = '%s/%s' % (module_target_dir, extension_name)
-    pymod.name = 'ns3module_%s' % module
-    pymod.module= module
-    pymod.use =  module_deps #  Should be '"ns3-"+module', but see bug 1117
-    if pymod.env['ENABLE_STATIC_NS3']:
-        if sys.platform == 'darwin':
-            pymod.env.append_value('LINKFLAGS', '-Wl,-all_load')
-            for mod in pymod.usel:
-                #mod = mod.split("--lib")[0]
-                pymod.env.append_value('LINKFLAGS', '-l' + mod)
-        else:
-            pymod.env.append_value('LINKFLAGS', '-Wl,--whole-archive,-Bstatic')
-            for mod in pymod.use:
-                #mod = mod.split("--lib")[0]
-                pymod.env.append_value('LINKFLAGS', '-l' + mod)
-            pymod.env.append_value('LINKFLAGS', '-Wl,-Bdynamic,--no-whole-archive')
-    defines = list(pymod.env['DEFINES'])
-    defines.extend(['NS_DEPRECATED=', 'NS3_DEPRECATED_H'])
-    defines.extend(['NS_DEPRECATED_3_35=', 'NS3_DEPRECATED_H'])
-    defines.extend(['NS_DEPRECATED_3_34=', 'NS3_DEPRECATED_H'])
-    if Utils.unversioned_sys_platform()== 'win32':
-        try:
-            defines.remove('_DEBUG') # causes undefined symbols on win32
-        except ValueError:
-            pass
-    pymod.env['DEFINES'] = defines
-    # The following string should lead to includes of
-    # '-I.', '-Isrc/core/bindings' when compiling module_helpers.cc
-    pymod.includes = Context.out_dir + ' ' + Context.out_dir + '/src/core/bindings'
-    pymod.install_path = '${PYTHONARCHDIR}/ns'
-
-    return pymod
-
-
-def build(bld):
-    bld.create_ns3_module = types.MethodType(create_ns3_module, bld)
-    bld.create_ns3_module_test_library = types.MethodType(create_ns3_module_test_library, bld)
-    bld.create_obj = types.MethodType(create_obj, bld)
-    bld.ns3_python_bindings = types.MethodType(ns3_python_bindings, bld)
-
-    # Remove these modules from the list of all modules.
-    for not_built in bld.env['MODULES_NOT_BUILT']:
-
-        # XXX Because these modules are located in subdirectories of
-        # test, their names in the all_modules list include the extra
-        # relative path "test/".  If these modules are moved into the
-        # src directory, then this if block should be removed.
-        if not_built == 'ns3tcp' or not_built == 'ns3wifi':
-            not_built = 'test/' + not_built
-
-        if not_built in all_modules:
-            all_modules.remove(not_built)
-
-    bld.recurse(list(all_modules))
-
-    for module in all_modules:
-        modheader = bld(features='ns3moduleheader')
-        modheader.module = module.split('/')[-1]
-
-class ns3pcfile(Task.Task):
-    after = ['cxxprogram', 'cxxshlib', 'cxxstlib']
-
-    def __str__(self):
-        "string to display to the user"
-        tgt_str = ' '.join([a.bldpath() for a in self.outputs])
-        return 'pcfile: %s' % (tgt_str)
-
-    def runnable_status(self):
-        return super(ns3pcfile, self).runnable_status()
-
-    def _self_libs(self, env, name, libdir):
-        if env['ENABLE_STATIC_NS3']:
-            path_st = 'STLIBPATH_ST'
-            lib_st = 'STLIB_ST'
-            lib_marker = 'STLIB_MARKER'
-        else:
-            path_st = 'LIBPATH_ST'
-            lib_st = 'LIB_ST'
-            lib_marker = 'SHLIB_MARKER'
-        retval = [env[path_st] % libdir]
-        if env[lib_marker]:
-            retval.append(env[lib_marker])
-        retval.append(env[lib_st] % name)
-        return retval
-
-    def _lib(self, env, dep):
-        libpath = env['LIBPATH_%s' % dep]
-        linkflags = env['LINKFLAGS_%s' % dep]
-        libs = env['LIB_%s' % dep]
-        retval = []
-        for path in libpath:
-            retval.append(env['LIBPATH_ST'] % path)
-            retval = retval + linkflags
-        for lib in libs:
-            retval.append(env['LIB_ST'] % lib)
-        return retval
-
-    def _listify(self, v):
-        if isinstance(v, list):
-            return v
-        else:
-            return [v]
-
-    def _cflags(self, dep):
-        flags = self.env['CFLAGS_%s' % dep]
-        return self._listify(flags)
-
-    def _cxxflags(self, dep):
-        return self._listify(self.env['CXXFLAGS_%s' % dep])
-
-    def _defines(self, dep):
-        return [self.env['DEFINES_ST'] % define for define in self.env['DEFINES_%s' % dep]]
-
-    def _includes(self, dep):
-        includes = self.env['INCLUDES_%s' % dep]
-        return [self.env['CPPPATH_ST'] % include for include in Utils.to_list(includes)]
-
-    def _generate_pcfile(self, name, use, env, outfilename, module):
-        prefix = env.PREFIX
-        includedir = Utils.subst_vars('${INCLUDEDIR}/%s%s' % (wutils.APPNAME, wutils.VERSION), env)
-        libdir = env.LIBDIR
-        libs = self._self_libs(env, "%s%s-%s%s" % (wutils.APPNAME, wutils.VERSION, name[4:], env.BUILD_SUFFIX), '${libdir}')
-        for dep in use:
-            libs += self._lib(env, dep)
-        for dep in env.LIBS:
-            libs += self.env['LIB_ST'] % dep
-        cflags = [self.env['CPPPATH_ST'] % '${includedir}']
-
-        if getattr(module, 'export_includes', None):
-            for include in module.to_incnodes(module.export_includes):
-                cflags += [self.env['CPPPATH_ST'] % include.abspath()]
-        requires = []
-        for dep in use:
-            cflags = cflags + self._cflags(dep) + self._cxxflags(dep) + \
-                self._defines(dep) + self._includes(dep)
-            if dep.startswith('ns3-'):
-                dep_name = dep[4:]
-                requires.append("libns%s-%s%s" % (wutils.VERSION, dep_name, env.BUILD_SUFFIX))
-
-        with open(outfilename, 'wt') as outfile:
-            print("""\
-prefix=%s
-libdir=%s
-includedir=%s
-
-Name: lib%s
-Description: ns-3 module %s
-Version: %s
-Libs: %s
-Cflags: %s
-Requires: %s\
-""" % (prefix, libdir, includedir,
-       name, name, wutils.VERSION, ' '.join(libs), ' '.join(cflags), ' '.join(requires)), file=outfile)
-
-    def run(self):
-        output_filename = self.outputs[0].abspath()
-        self._generate_pcfile(self.module.name,
-                              self.module.to_list(self.module.use),
-                              self.env, output_filename, self.module)
-
-
-@TaskGen.feature('ns3pcfile')
-@TaskGen.after_method('process_rule')
-def apply(self):
-    module = self.bld.find_ns3_module(self.module)
-    output_filename = 'lib%s.pc' % os.path.basename(module.target)
-    output_node = self.path.find_or_declare(output_filename)
-    assert output_node is not None, str(self)
-    task = self.create_task('ns3pcfile')
-    self.bld.install_files('${LIBDIR}/pkgconfig', output_node)
-    task.set_outputs([output_node])
-    task.module = module
-
-
-
-@TaskGen.feature('ns3header')
-@TaskGen.after_method('process_rule')
-def apply_ns3header(self):
-    if self.module is None:
-        raise WafError("'module' missing on ns3headers object %s" % self)
-    ns3_dir_node = self.bld.path.find_or_declare("ns3")
-    headers_to_process = set(self.to_list(self.source))
-    if hasattr(self, 'deprecated'):
-        headers_to_process.update(set(self.to_list(self.deprecated)))
-    for filename in headers_to_process:
-        src_node = self.path.find_resource(filename)
-        if src_node is None:
-            raise WafError("source ns3 header file %s not found" % (filename,))
-        dst_node = ns3_dir_node.find_or_declare(src_node.name)
-        assert dst_node is not None
-        task = self.create_task('ns3header')
-        task.mode = getattr(self, 'mode', 'install')
-        if task.mode == 'install':
-            self.bld.install_files('${INCLUDEDIR}/%s%s/ns3' % (wutils.APPNAME, wutils.VERSION), [src_node])
-            task.set_inputs([src_node])
-            task.set_outputs([dst_node])
-        else:
-            task.header_to_remove = dst_node
-    self.headers = set(self.to_list(self.source))
-    self.source = '' # tell WAF not to process these files further
-    if hasattr(self, 'deprecated'):
-        self.deprecated = '' # tell WAF not to process these files further
-
-
-
-class ns3header(Task.Task):
-    before = ['cxxprogram', 'cxxshlib', 'cxxstlib', 'gen_ns3_module_header']
-    color = 'BLUE'
-
-    def __str__(self):
-        "string to display to the user"
-        env = self.env
-        src_str = ' '.join([a.bldpath() for a in self.inputs])
-        tgt_str = ' '.join([a.bldpath() for a in self.outputs])
-        if self.outputs: sep = ' -> '
-        else: sep = ''
-        if self.mode == 'remove':
-            return 'rm-ns3-header %s' % (self.header_to_remove.abspath(),)
-        return 'install-ns3-header: %s' % (tgt_str)
-
-    def __repr__(self):
-        return str(self)
-
-    def uid(self):
-        try:
-            return self.uid_
-        except AttributeError:
-            m = Utils.md5()
-            up = m.update
-            up(self.__class__.__name__.encode())
-            for x in self.inputs + self.outputs:
-                up(x.abspath().encode())
-            up(self.mode.encode())
-            if self.mode == 'remove':
-                up(self.header_to_remove.abspath().encode())
-            self.uid_ = m.digest()
-            return self.uid_
-
-    def runnable_status(self):
-        if self.mode == 'remove':
-            if os.path.exists(self.header_to_remove.abspath()):
-                return Task.RUN_ME
-            else:
-                return Task.SKIP_ME
-        else:
-            return super(ns3header, self).runnable_status()
-
-    def run(self):
-        if self.mode == 'install':
-            assert len(self.inputs) == len(self.outputs)
-            inputs = [node.abspath() for node in self.inputs]
-            outputs = [node.abspath() for node in self.outputs]
-            for src, dst in zip(inputs, outputs):
-                try:
-                    os.chmod(dst, 0o600)
-                except OSError:
-                    pass
-                shutil.copy2(src, dst)
-                ## make the headers in builddir read-only, to prevent
-                ## accidental modification
-                os.chmod(dst, 0o400)
-            return 0
-        else:
-            assert len(self.inputs) == 0
-            assert len(self.outputs) == 0
-            out_file_name = self.header_to_remove.abspath()
-            try:
-                os.unlink(out_file_name)
-            except OSError as ex:
-                if ex.errno != 2:
-                    raise
-            return 0
-
-
-@TaskGen.feature('ns3privateheader')
-@TaskGen.after_method('process_rule')
-def apply_ns3privateheader(self):
-    if self.module is None:
-        raise WafError("'module' missing on ns3headers object %s" % self)
-    ns3_dir_node = self.bld.path.find_or_declare("ns3/private")
-    for filename in set(self.to_list(self.source)):
-        src_node = self.path.find_resource(filename)
-        if src_node is None:
-            raise WafError("source ns3 header file %s not found" % (filename,))
-        dst_node = ns3_dir_node.find_or_declare(src_node.name)
-        assert dst_node is not None
-        task = self.create_task('ns3privateheader')
-        task.mode = getattr(self, 'mode', 'install')
-        if task.mode == 'install':
-            task.set_inputs([src_node])
-            task.set_outputs([dst_node])
-        else:
-            task.header_to_remove = dst_node
-    self.headers = set(self.to_list(self.source))
-    self.source = '' # tell WAF not to process these files further
-
-class ns3privateheader(Task.Task):
-    before = ['cxxprogram', 'cxxshlib', 'cxxstlib', 'gen_ns3_module_header']
-    after = 'ns3header'
-    color = 'BLUE'
-
-    def __str__(self):
-        "string to display to the user"
-        env = self.env
-        src_str = ' '.join([a.bldpath() for a in self.inputs])
-        tgt_str = ' '.join([a.bldpath() for a in self.outputs])
-        if self.outputs: sep = ' -> '
-        else: sep = ''
-        if self.mode == 'remove':
-            return 'rm-ns3-header %s' % (self.header_to_remove.abspath(),)
-        return 'install-ns3-header: %s' % (tgt_str)
-
-    def __repr__(self):
-        return str(self)
-
-    def uid(self):
-        try:
-            return self.uid_
-        except AttributeError:
-            m = Utils.md5()
-            up = m.update
-            up(self.__class__.__name__.encode())
-            for x in self.inputs + self.outputs:
-                up(x.abspath().encode())
-            up(self.mode.encode())
-            if self.mode == 'remove':
-                up(self.header_to_remove.abspath().encode())
-            self.uid_ = m.digest()
-            return self.uid_
-
-    def runnable_status(self):
-        if self.mode == 'remove':
-            if os.path.exists(self.header_to_remove.abspath()):
-                return Task.RUN_ME
-            else:
-                return Task.SKIP_ME
-        else:
-            return super(ns3privateheader, self).runnable_status()
-
-    def run(self):
-        if self.mode == 'install':
-            assert len(self.inputs) == len(self.outputs)
-            inputs = [node.abspath() for node in self.inputs]
-            outputs = [node.abspath() for node in self.outputs]
-            for src, dst in zip(inputs, outputs):
-                try:
-                    os.chmod(dst, 0o600)
-                except OSError:
-                    pass
-                shutil.copy2(src, dst)
-                ## make the headers in builddir read-only, to prevent
-                ## accidental modification
-                os.chmod(dst, 0o400)
-            return 0
-        else:
-            assert len(self.inputs) == 0
-            assert len(self.outputs) == 0
-            out_file_name = self.header_to_remove.abspath()
-            try:
-                os.unlink(out_file_name)
-            except OSError as ex:
-                if ex.errno != 2:
-                    raise
-            return 0
-
-class gen_ns3_module_header(Task.Task):
-    before = ['cxxprogram', 'cxxshlib', 'cxxstlib']
-    after = 'ns3header'
-    color = 'BLUE'
-
-    def runnable_status(self):
-        if self.mode == 'remove':
-            if os.path.exists(self.header_to_remove.abspath()):
-                return Task.RUN_ME
-            else:
-                return Task.SKIP_ME
-        else:
-            return super(gen_ns3_module_header, self).runnable_status()
-
-    def __str__(self):
-        "string to display to the user"
-        env = self.env
-        src_str = ' '.join([a.bldpath() for a in self.inputs])
-        tgt_str = ' '.join([a.bldpath() for a in self.outputs])
-        if self.outputs: sep = ' -> '
-        else: sep = ''
-        if self.mode == 'remove':
-            return 'rm-module-header %s' % (self.header_to_remove.abspath(),)
-        return 'gen-module-header: %s' % (tgt_str)
-
-    def run(self):
-        if self.mode == 'remove':
-            assert len(self.inputs) == 0
-            assert len(self.outputs) == 0
-            out_file_name = self.header_to_remove.abspath()
-            try:
-                os.unlink(out_file_name)
-            except OSError as ex:
-                if ex.errno != 2:
-                    raise
-            return 0
-        assert len(self.outputs) == 1
-        out_file_name = self.outputs[0].get_bld().abspath()#self.env)
-        header_files = [os.path.basename(node.abspath()) for node in self.inputs]
-        header_files.sort()
-
-        with open(out_file_name, "w") as outfile:
-            print("""
-#ifdef NS3_MODULE_COMPILATION
-# error "Do not include ns3 module aggregator headers from other modules; these are meant only for end user scripts."
-#endif
-
-#ifndef NS3_MODULE_%s
-    """ % (self.module.upper().replace('-', '_'),), file=outfile)
-
-    #     if self.module_deps:
-    #         print >> outfile, "// Module dependencies:"
-    #     for dep in self.module_deps:
-    #         print >> outfile, "#include \"%s-module.h\"" % dep
-
-            print(file=outfile)
-            print("// Module headers:", file=outfile)
-            for header in header_files:
-                print("#include \"%s\"" % (header,), file=outfile)
-
-            print("#endif", file=outfile)
-
-        return 0
-
-    def sig_explicit_deps(self):
-        self.m.update('\n'.join(sorted([node.abspath() for node in self.inputs])).encode('utf-8'))
-        return self.m.digest()
-
-    def unique_id(self):
-        try:
-            return self.uid
-        except AttributeError:
-            "this is not a real hot zone, but we want to avoid surprizes here"
-            m = Utils.md5()
-            m.update("ns-3-module-header-%s" % self.module)
-            self.uid = m.digest()
-            return self.uid
-
-
-# Generates a 'ns3/foo-module.h' header file that includes all public
-# ns3 headers of a certain module.
-@TaskGen.feature('ns3moduleheader')
-@TaskGen.after_method('process_rule')
-def apply_ns3moduleheader(self):
-    ## get all of the ns3 headers
-    ns3_dir_node = self.bld.path.find_or_declare("ns3")
-    all_headers_inputs = []
-    found_the_module = False
-    for ns3headers in self.bld.all_task_gen:
-        if 'ns3header' in getattr(ns3headers, "features", []):
-            if ns3headers.module != self.module:
-                continue
-            found_the_module = True
-            for source in sorted(ns3headers.headers):
-                source = os.path.basename(source)
-                node = ns3_dir_node.find_or_declare(os.path.basename(source))
-                if node is None:
-                    fatal("missing header file %s" % (source,))
-                all_headers_inputs.append(node)
-    if not found_the_module:
-        raise WafError("error finding headers for module %s" % self.module)
-    if not all_headers_inputs:
-        return
-
-    try:
-        module_obj = self.bld.get_tgen_by_name("ns3-" + self.module)
-    except WafError: # maybe the module was disabled, and therefore removed
-        return
-
-    all_headers_outputs = [ns3_dir_node.find_or_declare("%s-module.h" % self.module)]
-    task = self.create_task('gen_ns3_module_header')
-    task.module = self.module
-    task.mode = getattr(self, "mode", "install")
-    if task.mode == 'install':
-        assert module_obj is not None, self.module
-        self.bld.install_files('${INCLUDEDIR}/%s%s/ns3' % (wutils.APPNAME, wutils.VERSION),
-                               ns3_dir_node.find_or_declare("%s-module.h" % self.module))
-        task.set_inputs(all_headers_inputs)
-        task.set_outputs(all_headers_outputs)
-        task.module_deps = module_obj.module_deps
-    else:
-        task.header_to_remove = all_headers_outputs[0]
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/test.py ns-3.36/test.py
--- ns-3.35/test.py	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/test.py	2022-04-30 18:23:58.234735300 -0700
@@ -47,20 +47,19 @@
 except ImportError:
     import Queue as queue
 #
-# XXX This should really be part of a waf command to list the configuration
+# XXX This should really be part of a ns3 command to list the configuration
 # items relative to optional ns-3 pieces.
 #
-# A list of interesting configuration items in the waf configuration
+# A list of interesting configuration items in the ns3 configuration
 # cache which we may be interested in when deciding on which examples
-# to run and how to run them.  These are set by waf during the
+# to run and how to run them.  These are set by ns3 during the
 # configuration phase and the corresponding assignments are usually
-# found in the associated subdirectory wscript files.
+# found in the associated subdirectory CMakeLists.txt files.
 #
 interesting_config_items = [
     "NS3_ENABLED_MODULES",
     "NS3_ENABLED_CONTRIBUTED_MODULES",
     "NS3_MODULE_PATH",
-    "NSC_ENABLED",
     "ENABLE_REAL_TIME",
     "ENABLE_THREADING",
     "ENABLE_EXAMPLES",
@@ -77,7 +76,6 @@
     "VALGRIND_FOUND",
 ]
 
-NSC_ENABLED = False
 ENABLE_REAL_TIME = False
 ENABLE_THREADING = False
 ENABLE_EXAMPLES = True
@@ -94,25 +92,21 @@
 VALGRIND_FOUND = True
 
 #
-# This will be given a prefix and a suffix when the waf config file is
+# This will be given a prefix and a suffix when the ns3 config file is
 # read.
 #
 test_runner_name = "test-runner"
 
 #
-# If the user has constrained us to run certain kinds of tests, we can tell waf
+# If the user has constrained us to run certain kinds of tests, we can tell ns3
 # to only build
 #
 core_kinds = ["core", "performance", "system", "unit"]
 
 #
-# There are some special cases for test suites that kill valgrind.  This is
-# because NSC causes illegal instruction crashes when run under valgrind.
+# Exclude tests that are problematic for valgrind.
 #
 core_valgrind_skip_tests = [
-    "ns3-tcp-cwnd",
-    "nsc-tcp-loss",
-    "ns3-tcp-interoperability",
     "routing-click",
     "lte-rr-ff-mac-scheduler",
     "lte-tdmt-ff-mac-scheduler",
@@ -127,16 +121,6 @@
 ]
 
 #
-# There are some special cases for test suites that fail when NSC is
-# missing.
-#
-core_nsc_missing_skip_tests = [
-    "ns3-tcp-cwnd",
-    "nsc-tcp-loss",
-    "ns3-tcp-interoperability",
-]
-
-#
 # Parse the examples-to-run file if it exists.
 #
 # This function adds any C++ examples or Python examples that are to be run
@@ -164,7 +148,8 @@
         # some tests when they are run under valgrind.
         #
         # Note that the two conditions are Python statements that
-        # can depend on waf configuration variables.  For example,
+        # can depend on ns3 configuration variables.  For example,
+        # when NSC was in the codebase, we could write:
         #
         #     ("tcp-nsc-lfn", "NSC_ENABLED == True", "NSC_ENABLED == False"),
         #
@@ -182,7 +167,7 @@
                 example_arguments = example_name_parts[1]
 
             # Add the proper prefix and suffix to the example name to
-            # match what is done in the wscript file.
+            # match what is done in the CMakeLists.txt file.
             example_path = "%s%s-%s%s" % (APPNAME, VERSION, example_name, BUILD_PROFILE_SUFFIX)
 
             # Set the full path for the example.
@@ -210,7 +195,7 @@
         # do_run is a condition under which to run the example.
         #
         # Note that the condition is a Python statement that can
-        # depend on waf configuration variables.  For example,
+        # depend on ns3 configuration variables.  For example,
         #
         #     ("realtime-udp-echo.py", "ENABLE_REAL_TIME == True"),
         #
@@ -593,31 +578,29 @@
 
 #
 # In general, the build process itself naturally takes care of figuring out
-# which tests are built into the test runner.  For example, if waf configure
+# which tests are built into the test runner.  For example, if ns3 configure
 # determines that ENABLE_EMU is false due to some missing dependency,
 # the tests for the emu net device simply will not be built and will
 # therefore not be included in the built test runner.
 #
 # Examples, however, are a different story.  In that case, we are just given
 # a list of examples that could be run.  Instead of just failing, for example,
-# nsc-tcp-zoo if NSC is not present, we look into the waf saved configuration
-# for relevant configuration items.
+# an example if its library support is not present, we look into the ns3
+# saved configuration for relevant configuration items.
 #
-# XXX This function pokes around in the waf internal state file.  To be a
-# little less hacky, we should add a command to waf to return this info
+# XXX This function pokes around in the ns3 internal state file.  To be a
+# little less hacky, we should add a command to ns3 to return this info
 # and use that result.
 #
-def read_waf_config():
+def read_ns3_config():
+    lock_filename = ".lock-ns3_%s_build" % sys.platform
     f = None
     try:
         # sys.platform reports linux2 for python2 and linux for python3
-        f = open(".lock-waf_" + sys.platform + "_build", "rt")
+        f = open(lock_filename, "rt")
     except FileNotFoundError:
-        try:
-            f = open(".lock-waf_linux2_build", "rt")
-        except FileNotFoundError:
-            print('The .lock-waf ... directory was not found.  You must do waf build before running test.py.', file=sys.stderr)
-            sys.exit(2)
+        print('The .lock-ns3 file was not found.  You must configure before running test.py.', file=sys.stderr)
+        sys.exit(2)
 
     for line in f:
         if line.startswith("top_dir ="):
@@ -634,7 +617,7 @@
     global NS3_BUILDDIR
     NS3_BUILDDIR = out_dir
 
-    with open("%s/c4che/_cache.py" % out_dir) as f:
+    with open(lock_filename) as f:
         for line in f.readlines():
             for item in interesting_config_items:
                 if line.startswith(item):
@@ -645,9 +628,9 @@
             print("%s ==" % item, eval(item))
 
 #
-# It seems pointless to fork a process to run waf to fork a process to run
+# It seems pointless to fork a process to run ns3 to fork a process to run
 # the test runner, so we just run the test runner directly.  The main thing
-# that waf would do for us would be to sort out the shared library path but
+# that ns3 would do for us would be to sort out the shared library path but
 # we can deal with that easily and do here.
 #
 # There can be many different ns-3 repositories on a system, and each has
@@ -1057,12 +1040,12 @@
 #
 def run_tests():
     #
-    # Pull some interesting configuration information out of waf, primarily
+    # Pull some interesting configuration information out of ns3, primarily
     # so we can know where executables can be found, but also to tell us what
     # pieces of the system have been built.  This will tell us what examples
     # are runnable.
     #
-    read_waf_config()
+    read_ns3_config()
 
     #
     # Set the proper suffix.
@@ -1075,17 +1058,17 @@
 
     #
     # Add the proper prefix and suffix to the test-runner name to
-    # match what is done in the wscript file.
+    # match what is done in the CMakeLists.txt file.
     #
     test_runner_name = "%s%s-%s%s" % (APPNAME, VERSION, "test-runner", BUILD_PROFILE_SUFFIX)
 
     #
-    # Run waf to make sure that everything is built, configured and ready to go
+    # Run ns3 to make sure that everything is built, configured and ready to go
     # unless we are explicitly told not to.  We want to be careful about causing
     # our users pain while waiting for extraneous stuff to compile and link, so
-    # we allow users that know what they''re doing to not invoke waf at all.
+    # we allow users that know what they're doing to not invoke ns3 at all.
     #
-    if not options.nowaf:
+    if not options.no_build:
 
         #
         # If the user is running the "kinds" or "list" options, there is an
@@ -1094,7 +1077,7 @@
         # options, so if we see them, we can safely only build the test-runner.
         #
         # If the user has constrained us to running only a particular type of
-        # file, we can only ask waf to build what we know will be necessary.
+        # file, we can only ask ns3 to build what we know will be necessary.
         # For example, if the user only wants to run BVT tests, we only have
         # to build the test-runner and can ignore all of the examples.
         #
@@ -1105,28 +1088,21 @@
         # user wants to run everything.
         #
         if options.kinds or options.list or (len(options.constrain) and options.constrain in core_kinds):
-            if sys.platform == "win32":
-                waf_cmd = "./waf --target=test-runner"
-            else:
-                waf_cmd = "./waf --target=test-runner"
+            build_cmd = "./ns3 build test-runner"
         elif len(options.example):
-            if sys.platform == "win32": #Modify for windows
-                waf_cmd = "./waf --target=%s" % os.path.basename(options.example)
-            else:
-                waf_cmd = "./waf --target=%s" % os.path.basename(options.example)
+            build_cmd = "./ns3 build %s" % os.path.basename(options.example)
         else:
-            if sys.platform == "win32": #Modify for windows
-                waf_cmd = "./waf"
-            else:
-                waf_cmd = "./waf"
+            build_cmd = "./ns3"
+
+        if sys.platform == "win32":
+            build_cmd = sys.executable + " " + build_cmd
 
         if options.verbose:
-            print("Building: %s" % waf_cmd)
+            print("Building: %s" % build_cmd)
 
-        proc = subprocess.Popen(waf_cmd, shell = True)
-        proc.communicate()
+        proc = subprocess.run(build_cmd, shell=True)
         if proc.returncode:
-            print("Waf died. Not running tests", file=sys.stderr)
+            print("ns3 died. Not running tests", file=sys.stderr)
             return proc.returncode
 
 
@@ -1138,12 +1114,13 @@
     #
     # Get the information from the build status file.
     #
-    build_status_file = os.path.join(NS3_BUILDDIR, 'build-status.py')
-    if os.path.exists(build_status_file):
-        ns3_runnable_programs = get_list_from_file(build_status_file, "ns3_runnable_programs")
-        ns3_runnable_scripts = get_list_from_file(build_status_file, "ns3_runnable_scripts")
+    lock_filename = ".lock-ns3_%s_build" % sys.platform
+    if os.path.exists(lock_filename):
+        ns3_runnable_programs = get_list_from_file(lock_filename, "ns3_runnable_programs")
+        ns3_runnable_scripts = get_list_from_file(lock_filename, "ns3_runnable_scripts")
+        ns3_runnable_scripts = [os.path.basename(script) for script in ns3_runnable_scripts]
     else:
-        print('The build status file was not found.  You must do waf build before running test.py.', file=sys.stderr)
+        print('The build status file was not found.  You must configure before running test.py.', file=sys.stderr)
         sys.exit(2)
 
     #
@@ -1244,7 +1221,7 @@
         if rc != 0:
             # This is usually a sign that ns-3 crashed or exited uncleanly
             print(('test.py error:  test-runner return code returned {}'.format(rc)))
-            print(('To debug, try running {}\n'.format('\'./waf --run \"test-runner --print-test-name-list\"\'')))
+            print(('To debug, try running {}\n'.format('\'./ns3 run \"test-runner --print-test-name-list\"\'')))
             return
         if isinstance(standard_out, bytes):
             standard_out = standard_out.decode()
@@ -1476,11 +1453,6 @@
                 job.set_is_skip(True)
                 job.set_skip_reason("crashes valgrind")
 
-            # Skip tests that will fail if NSC is missing.
-            if not NSC_ENABLED and test in core_nsc_missing_skip_tests:
-                job.set_is_skip(True)
-                job.set_skip_reason("requires NSC")
-
             if options.verbose:
                 print("Queue %s" % test)
 
@@ -1494,14 +1466,7 @@
     # the example programs it makes sense to try and run.  Each example will
     # have a condition associated with it that must evaluate to true for us
     # to try and execute it.  This is used to determine if the example has
-    # a dependency that is not satisfied.  For example, if an example depends
-    # on NSC being configured by waf, that example should have a condition
-    # that evaluates to true if NSC is enabled.  For example,
-    #
-    #      ("tcp-nsc-zoo", "NSC_ENABLED == True"),
-    #
-    # In this case, the example "tcp-nsc-zoo" will only be run if we find the
-    # waf configuration variable "NSC_ENABLED" to be True.
+    # a dependency that is not satisfied.
     #
     # We don't care at all how the trace files come out, so we just write them
     # to a single temporary directory.
@@ -1562,7 +1527,7 @@
 
     elif len(options.example):
         # Add the proper prefix and suffix to the example name to
-        # match what is done in the wscript file.
+        # match what is done in the CMakeLists.txt file.
         example_name = "%s%s-%s%s" % (APPNAME, VERSION, options.example, BUILD_PROFILE_SUFFIX)
 
         key_list = []
@@ -1917,11 +1882,11 @@
         print()
         if not ENABLE_TESTS:
             print('***  Note: ns-3 tests are currently disabled. Enable them by adding')
-            print('***  "--enable-tests" to ./waf configure or modifying your .ns3rc file.')
+            print('***  "--enable-tests" to ./ns3 configure or modifying your .ns3rc file.')
             print()
         if not ENABLE_EXAMPLES:
             print('***  Note: ns-3 examples are currently disabled. Enable them by adding')
-            print('***  "--enable-examples" to ./waf configure or modifying your .ns3rc file.')
+            print('***  "--enable-examples" to ./ns3 configure or modifying your .ns3rc file.')
             print()
 
     #
@@ -1984,8 +1949,8 @@
     parser.add_option("-m", "--multiple", action="store_true", dest="multiple", default=False,
                       help="report multiple failures from test suites and test cases")
 
-    parser.add_option("-n", "--nowaf", action="store_true", dest="nowaf", default=False,
-                      help="do not run waf before starting testing")
+    parser.add_option("-n", "--no-build", action="store_true", dest="no_build", default=False,
+                      help="do not build before starting testing")
 
     parser.add_option("-p", "--pyexample", action="store", type="string", dest="pyexample", default="",
                       metavar="PYEXAMPLE",
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/utils/bench-packets.cc ns-3.36/utils/bench-packets.cc
--- ns-3.35/utils/bench-packets.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/utils/bench-packets.cc	2022-04-30 18:23:58.234735300 -0700
@@ -20,7 +20,7 @@
 
 // This program can be used to benchmark packet serialization/deserialization
 // operations using Headers and Tags, for various numbers of packets 'n'
-// Sample usage:  ./waf --run 'bench-packets --n=10000'
+// Sample usage:  ./ns3 run 'bench-packets --n=10000'
 
 #include "ns3/command-line.h"
 #include "ns3/system-wall-clock-ms.h"
@@ -94,7 +94,7 @@
 TypeId 
 BenchHeader<N>::GetTypeId (void)
 {
-  static TypeId tid = TypeId (GetTypeName ().c_str ())
+  static TypeId tid = TypeId (GetTypeName ())
     .SetParent<Header> ()
     .SetGroupName ("Utils")
     .HideFromDocumentation ()
@@ -161,7 +161,7 @@
    * \return The TypeId.
    */
   static TypeId GetTypeId (void) {
-    static TypeId tid = TypeId (GetName ().c_str ())
+    static TypeId tid = TypeId (GetName ())
       .SetParent<Tag> ()
       .SetGroupName ("Utils")
       .HideFromDocumentation ()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/utils/check-style.py ns-3.36/utils/check-style.py
--- ns-3.35/utils/check-style.py	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/utils/check-style.py	2022-04-30 18:23:58.234735300 -0700
@@ -159,7 +159,6 @@
     def __init__(self):
         """! Initializer
         @param self The current class
-        @return none
         """
         self.__type = 0
         self.__line = ''
@@ -244,7 +243,6 @@
         @param self:  this object
         @param src_pos: source position
         @param dst_pos: destination position
-        @return none
         """
         self.__lines = []
         self.__src_pos = int(src_pos)
@@ -316,7 +314,6 @@
     def __init__(self):
         """! Initializer
         @param self The current class
-        @return none
         """
         self.__src = ''
         self.__dst = ''
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/utils/CMakeLists.txt ns-3.36/utils/CMakeLists.txt
--- ns-3.35/utils/CMakeLists.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/utils/CMakeLists.txt	2022-04-30 18:23:58.234735300 -0700
@@ -0,0 +1,49 @@
+if(${ENABLE_TESTS} AND (test IN_LIST libs_to_build))
+  add_executable(test-runner $<TARGET_OBJECTS:${libtest}> test-runner.cc)
+
+  if(${NS3_MONOLIB})
+    target_link_libraries(
+      test-runner ${LIB_AS_NEEDED_PRE} ${ns3-libs-tests} ${LIB_AS_NEEDED_POST}
+      ${lib-ns3-monolib} ${ns3-contrib-libs}
+    )
+  else()
+    target_link_libraries(
+      test-runner ${LIB_AS_NEEDED_PRE} ${ns3-libs-tests} ${LIB_AS_NEEDED_POST}
+      ${ns3-libs} ${ns3-contrib-libs}
+    )
+  endif()
+  set_runtime_outputdirectory(
+    test-runner ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/utils/ ""
+  )
+  add_dependencies(all-test-targets test-runner)
+endif()
+
+add_executable(bench-simulator bench-simulator.cc)
+target_link_libraries(bench-simulator ${libcore})
+set_runtime_outputdirectory(
+  bench-simulator ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/utils/ ""
+)
+
+if(network IN_LIST libs_to_build)
+  add_executable(bench-packets bench-packets.cc)
+  target_link_libraries(bench-packets ${libnetwork})
+  set_runtime_outputdirectory(
+    bench-packets ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/utils/ ""
+  )
+
+  add_executable(print-introspected-doxygen print-introspected-doxygen.cc)
+  target_link_libraries(
+    print-introspected-doxygen
+    PRIVATE ${LIB_AS_NEEDED_PRE} ${ns3-libs} ${ns3-contrib-libs}
+            ${LIB_AS_NEEDED_POST}
+  )
+  set_runtime_outputdirectory(
+    print-introspected-doxygen ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/utils/ ""
+  )
+endif()
+
+if(core IN_LIST ns3-all-enabled-modules)
+  add_executable(perf-io perf/perf-io.cc)
+  target_link_libraries(perf-io PRIVATE ${libcore})
+  set_runtime_outputdirectory(perf-io ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/utils/perf/ "")
+endif()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/utils/coverity-report.sh ns-3.36/utils/coverity-report.sh
--- ns-3.35/utils/coverity-report.sh	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/utils/coverity-report.sh	2022-04-30 18:23:58.234735300 -0700
@@ -49,14 +49,14 @@
 say $(date)
 blank
 
-doo ./waf clean
+doo ./ns3 clean
 blank
 
-doo ./waf configure $NS3CONFIG
+doo ./ns3 configure $NS3CONFIG
 blank
 
 cov=coverity/cov-int
-doo cov-build --dir $cov ./waf build
+doo cov-build --dir $cov ./ns3 build
 blank
 
 tarf=coverity/ns-3.tgz
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/utils/create-module.py ns-3.36/utils/create-module.py
--- ns-3.35/utils/create-module.py	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/utils/create-module.py	2022-04-30 18:23:58.234735300 -0700
@@ -7,47 +7,33 @@
 
 from pathlib import Path
 
-WSCRIPT_TEMPLATE = '''# -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-# def options(opt):
-#     pass
-
-# def configure(conf):
-#     conf.check_nonfatal(header_name='stdint.h', define_name='HAVE_STDINT_H')
-
-def build(bld):
-    module = bld.create_ns3_module({MODULE!r}, ['core'])
-    module.source = [
-        'model/{MODULE}.cc',
-        'helper/{MODULE}-helper.cc',
-        ]
-
-    module_test = bld.create_ns3_module_test_library('{MODULE}')
-    module_test.source = [
-        'test/{MODULE}-test-suite.cc',
-        ]
-    # Tests encapsulating example programs should be listed here
-    if (bld.env['ENABLE_EXAMPLES']):
-        module_test.source.extend([
-        #    'test/{MODULE}-examples-test-suite.cc',
-             ])
-
-    headers = bld(features='ns3header')
-    headers.module = {MODULE!r}
-    headers.source = [
-        'model/{MODULE}.h',
-        'helper/{MODULE}-helper.h',
-        ]
-
-    if bld.env.ENABLE_EXAMPLES:
-        bld.recurse('examples')
-
-    # bld.ns3_python_bindings()
-
+CMAKELISTS_TEMPLATE = '''\
+check_include_file_cxx(stdint.h HAVE_STDINT_H)
+if(HAVE_STDINT_H)
+    add_definitions(-DHAVE_STDINT_H)
+endif()
+
+set(examples_as_tests_sources)
+if(${{ENABLE_EXAMPLES}})
+    set(examples_as_tests_sources    
+        #test/{MODULE}-examples-test-suite.cc
+        )
+endif()    
+
+build_lib(
+    LIBNAME {MODULE}
+    SOURCE_FILES model/{MODULE}.cc
+                 helper/{MODULE}-helper.cc 
+    HEADER_FILES model/{MODULE}.h
+                 helper/{MODULE}-helper.h
+    LIBRARIES_TO_LINK ${{libcore}}
+    TEST_SOURCES test/{MODULE}-test-suite.cc
+                 ${{examples_as_tests_sources}}
+)
+    
 '''
 
 
-
 MODEL_CC_TEMPLATE = '''/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 
 #include "{MODULE}.h"
@@ -111,11 +97,12 @@
 '''
 
 
-EXAMPLES_WSCRIPT_TEMPLATE = '''# -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    obj = bld.create_ns3_program('{MODULE}-example', [{MODULE!r}])
-    obj.source = '{MODULE}-example.cc'
+EXAMPLES_CMAKELISTS_TEMPLATE = '''\
+build_lib_example(
+    NAME {MODULE}-example
+    SOURCE_FILES {MODULE}-example.cc
+    LIBRARIES_TO_LINK ${{lib{MODULE}}}
+)
 
 '''
 
@@ -326,12 +313,15 @@
     with artifact_path.open("wt") as f:
         f.write(template.format(**kwargs))
 
-def make_wscript(moduledir, modname):
-    path = Path(moduledir, 'wscript')
-    create_file(path, WSCRIPT_TEMPLATE, MODULE=modname)
+
+def make_cmakelists(moduledir, modname):
+    path = Path(moduledir, 'CMakeLists.txt')
+    macro = "build_lib"
+    create_file(path, CMAKELISTS_TEMPLATE, MODULE=modname)
 
     return True 
 
+
 def make_model(moduledir, modname):
     modelpath = Path(moduledir, "model")
     modelpath.mkdir(parents=True)
@@ -379,8 +369,8 @@
     examplespath = Path(moduledir, "examples")
     examplespath.mkdir(parents=True)
 
-    wscriptpath = Path(examplespath, 'wscript')
-    create_file(wscriptpath, EXAMPLES_WSCRIPT_TEMPLATE, MODULE=modname)
+    cmakelistspath = Path(examplespath, 'CMakeLists.txt')
+    create_file(cmakelistspath, EXAMPLES_CMAKELISTS_TEMPLATE, MODULE=modname)
 
     examplesfile_path = examplespath.joinpath(modname+'-example').with_suffix('.cc')
     create_file(examplesfile_path, EXAMPLE_CC_TEMPLATE, MODULE=modname)
@@ -398,11 +388,11 @@
 
     file_name = '{}.rst'.format(modname)
     file_path = Path(docpath, file_name)
-    create_file(file_path, DOC_RST_TEMPLATE, MODULE=modname,
-                MODULE_DIR=mod_relpath)
+    create_file(file_path, DOC_RST_TEMPLATE, MODULE=modname, MODULE_DIR=mod_relpath)
 
     return True 
 
+
 def make_module(modpath, modname):
     modulepath = Path(modpath, modname)
 
@@ -412,7 +402,7 @@
 
     print("Creating module {}".format(modulepath))
 
-    functions = (make_wscript, make_model, make_test, 
+    functions = (make_cmakelists, make_model, make_test,
                  make_helper, make_examples, make_doc)
 
     try:
@@ -438,17 +428,17 @@
 
 Generates the directory structure and skeleton files required for an ns-3
 module.  All of the generated files are valid C/C++ and will compile successfully
-out of the box.  waf configure must be run after creating new modules in order
+out of the box.  ns3 configure must be run after creating new modules in order
 to integrate them into the ns-3 build system.
 
 The following directory structure is generated under the contrib directory:
 <modname>
- |-- wscript
+ |-- CMakeLists.txt
  |-- doc
      |-- <modname>.rst
  |-- examples
      |-- <modname>-example.cc
-     |-- wscript
+     |-- CMakeLists.txt
  |-- helper
      |-- <modname>-helper.cc
      |-- <modname>-helper.h
@@ -622,7 +612,7 @@
     if all(make_module(*module) for module in modules):
         print()
         print("Successfully created new modules")
-        print("Run './waf configure' to include them in the build")
+        print("Run './ns3 configure' to include them in the build")
         
     return 0
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/utils/grid.py ns-3.36/utils/grid.py
--- ns-3.35/utils/grid.py	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/utils/grid.py	2022-04-30 18:23:58.234735300 -0700
@@ -21,7 +21,6 @@
         @param start start
         @param end end
         @param value value
-        @return none
         """
         self.start = start
         self.end = end
@@ -37,7 +36,6 @@
         @param self this object
         @param at you
         @param value value
-        @return none
         """
         self.at = at
         self.value = value
@@ -52,7 +50,6 @@
         @param self this object
         @param at you
         @param value value
-        @return none
         """
         self.at = at
         self.value = value
@@ -67,7 +64,6 @@
         @param self this object
         @param at you
         @param value value
-        @return none
         """
         self.at = at
         self.value = value
@@ -97,7 +93,6 @@
         """! Initializer
         @param self this object
         @param name name
-        @return none
         """
         self.name = name
         self.ranges = []
@@ -194,7 +189,6 @@
         """! Get ranges bounds
         @param self this object
         @param name name
-        @return none
         """
         self.name = name
         self.events = []
@@ -275,7 +269,6 @@
         """! Initializer
         @param self this object
         @param name name
-        @return none
         """
         self.ranges = []
         self.event_str = []
@@ -447,7 +440,6 @@
         @param r: red
         @param g: green
         @param b: blue
-        @return none
         """
         self.r = r
         self.g = g
@@ -475,7 +467,6 @@
     def __init__(self):
         """! Initializer
         @param self this object
-        @return none
         """
         self.__colors = {}
     def add(self, name, color):
@@ -511,7 +502,6 @@
     def __init__(self):
         """! Initializer
         @param self this object
-        @return none
         """
         self.__padding = 10
     def set_padding(self, padding):
@@ -627,7 +617,6 @@
     def __init__(self):
         """! Initializer
         @param self this object
-        @return none
         """
         self.padding = 10
         return
@@ -863,7 +852,6 @@
     def __init__(self):
         """! Initializer
         @param self this object
-        @return none
         """
         self.__top = 0
         return
@@ -1007,7 +995,6 @@
         @param self this object
         @param start start
         @param end end
-        @return none
         """
         self.__start = float(start)
         self.__end = float(end)
@@ -1301,7 +1288,6 @@
         """! Initializer
         @param self this object
         @param data data
-        @return none
         """
         super(GtkGraphicRenderer, self).__init__()
         self.__data = data
@@ -1542,7 +1528,6 @@
     def __init__(self):
         """! Initializer
         @param self this object
-        @return none
         """
         return
     def run(self, graphic):
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/utils/perf/perf-io.cc ns-3.36/utils/perf/perf-io.cc
--- ns-3.35/utils/perf/perf-io.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/utils/perf/perf-io.cc	2022-04-30 18:23:58.234735300 -0700
@@ -0,0 +1,146 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#include <chrono>
+
+#include <cstdio>
+#include <cstdlib>
+
+#include <iostream>
+#include <fstream>
+
+#include "ns3/core-module.h"
+
+using namespace ns3;
+
+/**
+ * \ingroup system-tests-perf
+ * 
+ * Check the performance of writing to file.
+ * 
+ * \param file The file to write to.
+ * \param n The number of writes to perform.
+ * \param buffer The buffer to write.
+ * \param size The buffer size.
+ */
+void
+PerfFile (FILE *file, uint32_t n, const char *buffer, uint32_t size)
+{
+  for (uint32_t i = 0; i < n; ++i)
+    {
+      if (std::fwrite (buffer, 1, size, file) !=  size)
+        {
+          NS_ABORT_MSG ("PerfFile():  fwrite error");
+        }
+    }
+}
+
+/**
+ * \ingroup system-tests-perf
+ * 
+ * Check the performance of writing to an output stream.
+ * 
+ * \param stream The output stream to write to.
+ * \param n The number of writes to perform.
+ * \param buffer The buffer to write.
+ * \param size The buffer size.
+ */
+void
+PerfStream (std::ostream &stream, uint32_t n, const char *buffer, uint32_t size)
+{
+  for (uint32_t i = 0; i < n; ++i)
+    {
+      stream.write (buffer, size);
+    }
+}
+
+int 
+main (int argc, char *argv[])
+{
+  uint32_t n = 100000;
+  uint32_t iter = 50;
+  bool doStream = false;
+  bool binmode = true;
+
+  CommandLine cmd (__FILE__);
+  cmd.AddValue ("n", "How many times to write (defaults to 100000", n);
+  cmd.AddValue ("iter", "How many times to run the test looking for a min (defaults to 50)", iter);
+  cmd.AddValue ("doStream", "Run the C++ I/O benchmark otherwise the C I/O ", doStream);
+  cmd.AddValue ("binmode", "Select binary mode for the C++ I/O benchmark (defaults to true)", binmode);
+  cmd.Parse (argc, argv);
+
+  auto minResultNs = std::chrono::duration_cast<std::chrono::nanoseconds> (
+    std::chrono::nanoseconds::max ());
+
+  char buffer[1024];
+
+  if (doStream)
+    {
+      //
+      // This will probably run on a machine doing other things.  Run it some
+      // relatively large number of times and try to find a minimum, which
+      // will hopefully represent a time when it runs free of interference.
+      //
+      for (uint32_t i = 0; i < iter; ++i)
+        {
+          std::ofstream stream;
+          if (binmode)
+            {
+              stream.open ("streamtest", std::ios_base::binary | std::ios_base::out);
+            }
+          else
+            {
+              stream.open ("streamtest", std::ios_base::out);
+            }
+
+          auto start = std::chrono::steady_clock::now ();
+          PerfStream (stream, n, buffer, 1024);
+          auto end = std::chrono::steady_clock::now ();
+          auto resultNs = std::chrono::duration_cast<std::chrono::nanoseconds> (end - start);
+          resultNs = std::min (resultNs, minResultNs);
+          stream.close ();
+          std::cout << "."; std::cout.flush ();
+        }
+
+      std::cout << std::endl;
+    }
+  else
+    {
+      //
+      // This will probably run on a machine doing other things.  Run it some
+      // relatively large number of times and try to find a minimum, which
+      // will hopefully represent a time when it runs free of interference.
+      //
+      for (uint32_t i = 0; i < iter; ++i)
+        {
+          FILE *file = fopen ("filetest", "w");
+
+          auto start = std::chrono::steady_clock::now ();
+          PerfFile (file, n, buffer, 1024);
+          auto end = std::chrono::steady_clock::now ();
+          auto resultNs = std::chrono::duration_cast<std::chrono::nanoseconds> (end - start);
+          resultNs = std::min (resultNs, minResultNs);
+          fclose (file);
+          file = 0;
+          std::cout << "."; std::cout.flush ();
+        }
+      std::cout << std::endl;
+    }
+
+  std::cout << argv[0] << ": " << minResultNs.count () << "ns" << std::endl;
+
+  return 0;
+}
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/utils/print-introspected-doxygen.cc ns-3.36/utils/print-introspected-doxygen.cc
--- ns-3.35/utils/print-introspected-doxygen.cc	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/utils/print-introspected-doxygen.cc	2022-04-30 18:23:58.234735300 -0700
@@ -1052,8 +1052,8 @@
   NS_LOG_FUNCTION_NOARGS ();
   os << commentStart << page << "AttributeList All Attributes\n"
      << std::endl;
-  os << "This is a list of all" << reference << "ns3::Attributes by class.  "
-     << "For more information see the" << reference << "ns3:Attributes "
+  os << "This is a list of all" << reference << "attributes classes.  "
+     << "For more information see the" << reference << "attributes "
      << "section of this API documentation and the Attributes sections "
      << "in the Tutorial and Manual.\n"
      << std::endl;
@@ -1263,7 +1263,7 @@
  *
  * In doxygen form this will print a comment block with
  * \verbatim
- *   \ingroup attribute
+ *   \ingroup attributes
  *   \defgroup attribute_<name>Value <name>Value
  * \endverbatim
  *
@@ -1279,12 +1279,12 @@
   NS_LOG_FUNCTION (name);
   std::string section = "attribute_" + name;
 
-  // \ingroup attribute
+  // \ingroup attributes
   // \defgroup attribute_<name>Value <name> Attribute
-  os << commentStart << sectionStart << "attribute\n"
+  os << commentStart << sectionStart << "attributes\n"
      <<   subSectionStart << "attribute_" << name << " "
      <<     name << " Attribute\n"
-     <<     "Attribute implementation for " << name << "\n";
+     <<     "AttributeValue implementation for " << name << "\n";
   if (seeBase)
     {
       // Some classes don't live in ns3::.  Yuck
@@ -1524,11 +1524,13 @@
       { "OrganizationIdentifier",
                           "OrganizationIdentifier",
                                             true,  "vendor-specific-action.h" },
+      { "Priomap",        "Priomap",        true,  "prio-queue-disc.h"  },
+      { "QueueSize",      "QueueSize",      true,  "queue-size.h"       },
       { "Rectangle",      "Rectangle",      true,  "rectangle.h"        },
       { "Ssid",           "Ssid",           true,  "ssid.h"             },
       { "TypeId",         "TypeId",         true,  "type-id.h"          },
       { "UanModesList",   "UanModesList",   true,  "uan-tx-mode.h"      },
-      // { "ValueClassTest", "ValueClassTest", false, "" /* outside ns3 */ },
+      { "ValueClassTest", "ValueClassTest", false, "attribute-test-suite.cc" /* core/test/ */  },
       { "Vector",         "Vector",         true,  "vector.h"           },
       { "Vector2D",       "Vector2D",       true,  "vector.h"           },
       { "Vector3D",       "Vector3D",       true,  "vector.h"           },
@@ -1576,8 +1578,13 @@
   PrintAttributeValueWithName (os, "Pair", "std::pair<A, B>", "pair.h");
   PrintMakeChecker            (os, "Pair",  "pair.h");
   
-  PrintAttributeValueSection  (os, "AttributeContainer", false);
-  PrintAttributeValueWithName (os, "AttributeContainer", "AttributeContainer", "attribute-container.h");
+  PrintAttributeValueSection  (os, "Tuple", false);
+  PrintAttributeValueWithName (os, "Tuple", "std::tuple<Args...>", "tuple.h");
+  PrintMakeChecker            (os, "Tuple", "tuple.h");
+
+  // AttributeContainer is already documented.
+  // PrintAttributeValueSection  (os, "AttributeContainer", false);
+  // PrintAttributeValueWithName (os, "AttributeContainer", "AttributeContainer", "attribute-container.h");
   PrintMakeChecker            (os, "AttributeContainer",  "attribute-container.h");
 }  // PrintAttributeImplementations ()
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/utils/python-unit-tests.py ns-3.36/utils/python-unit-tests.py
--- ns-3.35/utils/python-unit-tests.py	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/utils/python-unit-tests.py	2022-04-30 18:23:58.234735300 -0700
@@ -1,3 +1,5 @@
+#! /usr/bin/env python3
+
 # Copyright (C) 2008-2011 INESC Porto
 
 # This program is free software; you can redistribute it and/or modify
@@ -25,6 +27,8 @@
 import ns.csma
 import ns.applications
 
+UINT32_MAX = 0xFFFFFFFF
+
 
 ## TestSimulator class
 class TestSimulator(unittest.TestCase):
@@ -170,7 +174,7 @@
             @return none
             """
             assert self._received_packet is None
-            self._received_packet = socket.Recv()
+            self._received_packet = socket.Recv(maxSize=UINT32_MAX, flags=0)
 
         sink = ns.network.Socket.CreateSocket(node, ns.core.TypeId.LookupByName("ns3::UdpSocketFactory"))
         sink.Bind(ns.network.InetSocketAddress(ns.network.Ipv4Address.GetAny(), 80))
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/utils/run-examples-with-full-logging.sh ns-3.36/utils/run-examples-with-full-logging.sh
--- ns-3.35/utils/run-examples-with-full-logging.sh	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/utils/run-examples-with-full-logging.sh	2022-04-30 18:23:58.234735300 -0700
@@ -33,7 +33,7 @@
   if [[ "$line" == example* ]]
     then
       name=${line#example      }
-      NS_LOG="*" ./waf --run "$name" >& /dev/null
+      NS_LOG="*" ./ns3 --run "$name" >& /dev/null
       status="$?"
       echo "program $name status $status"
   fi
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/utils/tests/gitlab-ci-clang.yml ns-3.36/utils/tests/gitlab-ci-clang.yml
--- ns-3.35/utils/tests/gitlab-ci-clang.yml	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/utils/tests/gitlab-ci-clang.yml	2022-04-30 18:23:58.234735300 -0700
@@ -4,7 +4,7 @@
 # "RELEASE", that has a value "weekly". Also, a variable "CLANG" should be set
 # to True.
 
-# We support CLANG 8 - 11
+# We support CLANG 6, 8 - 11
 # The test is done under Linux.
 
 .weekly-build-clang:
@@ -16,36 +16,52 @@
       - $CLANG_BUILD_ENABLE == "True"
   before_script:
     - apt-get --quiet update --yes
-    - apt-get --quiet install gcc g++ python python-dev qt5-default openmpi-bin openmpi-common openmpi-doc libopenmpi-dev gsl-bin libgsl-dev ccache flex bison libfl-dev sqlite sqlite3 libsqlite3-dev libxml2 libxml2-dev libgtk2.0-0 libgtk2.0-dev libboost-all-dev libgsl23 --yes
+    - apt-get --quiet install cmake ninja-build gsl-bin libgsl-dev ccache sqlite3 libsqlite3-dev libxml2 libxml2-dev libgtk-3-0 libgtk-3-dev libboost-all-dev libgsl23 ssh --yes
     - apt-get --quiet install software-properties-common gnupg wget --yes
     - echo -en "deb http://apt.llvm.org/bionic/ llvm-toolchain-bionic-$CLANG main \n deb-src http://apt.llvm.org/bionic/ llvm-toolchain-bionic-$CLANG main" > /etc/apt/sources.list.d/llvm.list
     - wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | apt-key add -
     - apt-get --quiet update --yes
-    - apt-get --quiet install ca-certificates build-essential clang-$CLANG clang-tools-$CLANG clang-format-$CLANG libfuzzer-$CLANG-dev lldb-$CLANG lld-$CLANG $EXTRA --yes
+    - apt-get --quiet install ca-certificates build-essential clang-$CLANG --yes
   variables:
     COMPILER: clang++-$CLANG
 
+# CLANG 6
+weekly-build-clang-6-debug:
+  extends: .weekly-build-clang
+  variables:
+    CLANG: "6.0"
+    MODE: debug
+
+weekly-build-clang-6-release:
+  extends: .weekly-build-clang
+  variables:
+    CLANG: "6.0"
+    MODE: release
+
+weekly-build-clang-6-optimized:
+  extends: .weekly-build-clang
+  variables:
+    CLANG: "6.0"
+    MODE: optimized
+
 # CLANG 8
 weekly-build-clang-8-debug:
   extends: .weekly-build-clang
   variables:
     CLANG: 8
     MODE: debug
-    EXTRA: libc++-$CLANG-dev libc++abi-$CLANG-dev libomp-$CLANG-dev python-clang-$CLANG
 
 weekly-build-clang-8-release:
   extends: .weekly-build-clang
   variables:
     CLANG: 8
     MODE: release
-    EXTRA: libc++-$CLANG-dev libc++abi-$CLANG-dev libomp-$CLANG-dev python-clang-$CLANG
 
 weekly-build-clang-8-optimized:
   extends: .weekly-build-clang
   variables:
     CLANG: 8
     MODE: optimized
-    EXTRA: libc++-$CLANG-dev libc++abi-$CLANG-dev libomp-$CLANG-dev python-clang-$CLANG
 
 # CLANG 9
 weekly-build-clang-9-debug:
@@ -53,21 +69,18 @@
   variables:
     CLANG: 9
     MODE: debug
-    EXTRA: libc++-$CLANG-dev libc++abi-$CLANG-dev libomp-$CLANG-dev python-clang-$CLANG
 
 weekly-build-clang-9-release:
   extends: .weekly-build-clang
   variables:
     CLANG: 9
     MODE: release
-    EXTRA: libc++-$CLANG-dev libc++abi-$CLANG-dev libomp-$CLANG-dev python-clang-$CLANG
 
 weekly-build-clang-9-optimized:
   extends: .weekly-build-clang
   variables:
     CLANG: 9
     MODE: optimized
-    EXTRA: libc++-$CLANG-dev libc++abi-$CLANG-dev libomp-$CLANG-dev python-clang-$CLANG
 
 # CLANG 10
 weekly-build-clang-10-debug:
@@ -75,21 +88,18 @@
   variables:
     CLANG: 10
     MODE: debug
-    EXTRA: libc++-$CLANG-dev libc++abi-$CLANG-dev libomp-$CLANG-dev python3-clang-$CLANG
 
 weekly-build-clang-10-release:
   extends: .weekly-build-clang
   variables:
     CLANG: 10
     MODE: release
-    EXTRA: libc++-$CLANG-dev libc++abi-$CLANG-dev libomp-$CLANG-dev python3-clang-$CLANG
 
 weekly-build-clang-10-optimized:
   extends: .weekly-build-clang
   variables:
     CLANG: 10
     MODE: optimized
-    EXTRA: libc++-$CLANG-dev libc++abi-$CLANG-dev libomp-$CLANG-dev python3-clang-$CLANG
 
 # CLANG 11
 weekly-build-clang-11-debug:
@@ -97,19 +107,16 @@
   variables:
     CLANG: 11
     MODE: debug
-    EXTRA: libc++-$CLANG-dev libc++abi-$CLANG-dev libomp-$CLANG-dev python3-clang-$CLANG
 
 weekly-build-clang-11-release:
   extends: .weekly-build-clang
   variables:
     CLANG: 11
     MODE: release
-    EXTRA: libc++-$CLANG-dev libc++abi-$CLANG-dev libomp-$CLANG-dev python3-clang-$CLANG
 
 weekly-build-clang-11-optimized:
   extends: .weekly-build-clang
   variables:
     CLANG: 11
     MODE: optimized
-    EXTRA: libc++-$CLANG-dev libc++abi-$CLANG-dev libomp-$CLANG-dev python3-clang-$CLANG
     
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/utils/tests/gitlab-ci-doc.yml ns-3.36/utils/tests/gitlab-ci-doc.yml
--- ns-3.35/utils/tests/gitlab-ci-doc.yml	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/utils/tests/gitlab-ci-doc.yml	2022-04-30 18:23:58.234735300 -0700
@@ -5,7 +5,7 @@
   stage: documentation
   before_script:
     - pacman -Syu --noconfirm
-    - pacman -Sy base-devel python ccache gsl libgcrypt gtk3 boost --noconfirm
+    - pacman -Sy base-devel ninja cmake python ccache gsl gtk3 boost --noconfirm
     - pacman -Sy git doxygen graphviz imagemagick dia texlive-core texlive-bin texlive-latexextra python-sphinx --noconfirm
     # no policy is a good policy.
     - mv /etc/ImageMagick-7/policy.xml /etc/ImageMagick-7/policy.xml.bak
@@ -23,19 +23,16 @@
     - mkdir -p $CCACHE_BASEDIR_VALUE
     - export CCACHE_BASEDIR=${PWD}
     - export CCACHE_DIR=${PWD}/$CCACHE_BASEDIR_VALUE
-    - CXX="ccache $COMPILER" ./waf configure --enable-examples --enable-tests --enable-asserts -d release
-    - ./waf
+    - CXX=$COMPILER ./ns3 configure --enable-examples --enable-tests --enable-asserts -d release
+    - ./ns3 build
 #    - mkdir -p public/doxygen
-    - git remote add ns-3-origin https://gitlab.com/nsnam/ns-3-dev.git || true
-    - git fetch ns-3-origin
-#    - doc/doxygen.warnings.report.sh -f "$(git diff --name-only ns-3-origin/master --diff-filter=d | tr '\n' ' ' | sed 's/ $//g;s/ /\\\|/g')"
-    - export CHANGED_FILES=$(git diff --name-only ns-3-origin/master --diff-filter=d | tr '\n' ' ' | sed 's/ $//g;s/ /\\\|/g')
-    - doc/doxygen.warnings.report.sh -f "$CHANGED_FILES"
-#    - doc/doxygen.warnings.report.sh -f "$CHANGED_FILES" || EXIT_CODE=$?
-#    - if [ -z $EXIT_CODE ]; then export EXIT_CODE=0; fi;
-#    - if [ $EXIT_CODE -ne 0 ]; then if [ -z $CHANGED_FILES ]; then exit 0; fi; fi;
-#    - exit $EXIT_CODE
-
+# The following four lines were needed when ns-3 had warnings, and
+# it was necessary to have a filter to check only the files tocuhed by a MR.
+#    - git remote add ns-3-origin https://gitlab.com/nsnam/ns-3-dev.git || true
+#    - git fetch ns-3-origin
+#    - export CHANGED_FILES=$(git diff --name-only ns-3-origin/master --diff-filter=d | tr '\n' ' ' | sed 's/ $//g;s/ /\\\|/g')
+#    - doc/doxygen.warnings.report.sh -f "$CHANGED_FILES"
+    - doc/doxygen.warnings.report.sh
 #    - doxygen doc/doxygen.conf
 #    - mv doc/html/ public/doxygen
   cache:
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/utils/tests/gitlab-ci-fedora.yml ns-3.36/utils/tests/gitlab-ci-fedora.yml
--- ns-3.35/utils/tests/gitlab-ci-fedora.yml	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/utils/tests/gitlab-ci-fedora.yml	2022-04-30 18:23:58.234735300 -0700
@@ -14,82 +14,66 @@
       - $RELEASE == "weekly"
       - $FEDORA == "True"
   before_script:
-    - dnf install gcc gcc-c++ python python-devel ccache gsl gsl-devel libgcrypt gtk3 gtk3-devel sqlite sqlite-devel libxml2 libxml2-devel openmpi openmpi-devel boost-devel pygobject3-devel python3-gobject gobject-introspection-devel goocanvas2-devel graphviz-devel graphviz ipython --assumeyes
+    - dnf update --assumeyes
+    - dnf install gcc gcc-c++ cmake ninja-build python python-devel ccache gsl gsl-devel gtk3 gtk3-devel sqlite sqlite-devel libxml2 libxml2-devel openmpi openmpi-devel boost-devel pygobject3-devel python3-gobject gobject-introspection-devel goocanvas2-devel graphviz-devel graphviz ipython --assumeyes
+    - source /etc/profile.d/modules.sh
+    - module load mpi/openmpi-x86_64
   variables:
     COMPILER: g++
 
-# Fedora 31
-weekly-build-fedora-31-debug:
-  extends: .weekly-build-fedora
-  image: fedora:31
-  variables:
-    MODE: debug
-
-weekly-build-fedora-31-release:
-  extends: .weekly-build-fedora
-  image: fedora:31
-  variables:
-    MODE: release
-
-weekly-build-fedora-31-optimized:
-  extends: .weekly-build-fedora
-  image: fedora:31
-  variables:
-    MODE: optimized
-
-# Fedora 32
-weekly-build-fedora-32-debug:
-  extends: .weekly-build-fedora
-  image: fedora:32
-  variables:
-    MODE: debug
-
-weekly-build-fedora-32-release:
-  extends: .weekly-build-fedora
-  image: fedora:32
-  variables:
-    MODE: release
+# # Fedora 33
+# weekly-build-fedora-33-debug:
+#   extends: .weekly-build-fedora
+#   image: fedora:33
+#   variables:
+#     MODE: debug
+
+# weekly-build-fedora-33-release:
+#   extends: .weekly-build-fedora
+#   image: fedora:33
+#   variables:
+#     MODE: release
+
+# weekly-build-fedora-33-optimized:
+#   extends: .weekly-build-fedora
+#   image: fedora:33
+#   variables:
+#     MODE: optimized
 
-weekly-build-fedora-32-optimized:
-  extends: .weekly-build-fedora
-  image: fedora:32
-  variables:
-    MODE: optimized
-
-# Fedora 33
-weekly-build-fedora-33-debug:
+# Fedora 34
+weekly-build-fedora-34-debug:
   extends: .weekly-build-fedora
-  image: fedora:33
+  image: fedora:34
   variables:
     MODE: debug
 
-weekly-build-fedora-33-release:
+weekly-build-fedora-34-release:
   extends: .weekly-build-fedora
-  image: fedora:33
+  image: fedora:34
   variables:
     MODE: release
 
-weekly-build-fedora-33-optimized:
+weekly-build-fedora-34-optimized:
   extends: .weekly-build-fedora
-  image: fedora:33
+  image: fedora:34
   variables:
     MODE: optimized
 
-# Fedora 34
-weekly-build-fedora-34-debug:
+# Fedora 35
+weekly-build-fedora-35-debug:
   extends: .weekly-build-fedora
-  image: fedora:34
+  image: fedora:35
   variables:
     MODE: debug
 
-weekly-build-fedora-34-release:
+weekly-build-fedora-35-release:
   extends: .weekly-build-fedora
-  image: fedora:34
+  image: fedora:35
   variables:
     MODE: release
 
-weekly-build-fedora-34-optimized:
+weekly-build-fedora-35-optimized:
   extends: .weekly-build-fedora
-  image: fedora:34
+  image: fedora:35
   variables:
     MODE: optimized
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/utils/tests/gitlab-ci-gcc.yml ns-3.36/utils/tests/gitlab-ci-gcc.yml
--- ns-3.35/utils/tests/gitlab-ci-gcc.yml	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/utils/tests/gitlab-ci-gcc.yml	2022-04-30 18:23:58.234735300 -0700
@@ -4,7 +4,7 @@
 # "RELEASE", that has a value "weekly". Also, a variable "GCC" should be set
 # to True.
 
-# We support from 4.9.2 to the latest version. Check if everything builds fine
+# We support from 8 to the latest version. Check if everything builds fine
 # under debug, release, and optimized, on Linux.
 
 .weekly-build-gcc:
@@ -16,86 +16,30 @@
   before_script:
     - apt-get --quiet update --yes
     - update-alternatives --install /usr/bin/gfortran gfortran /usr/local/bin/gfortran 999
-    - apt-get --quiet install gcc g++ python python3 python-dev qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools openmpi-bin openmpi-common openmpi-doc libopenmpi-dev ccache flex bison libfl-dev sqlite3 libsqlite3-dev libxml2 libxml2-dev libgtk-3-dev libboost-all-dev gsl-bin libgsl0-dev --yes
+    - apt-get --quiet install gcc g++ cmake ninja-build python3 python3-dev qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools openmpi-bin openmpi-common openmpi-doc libopenmpi-dev ccache flex bison libfl-dev sqlite3 libsqlite3-dev libxml2 libxml2-dev libgtk-3-dev libboost-all-dev gsl-bin libgsl0-dev ssh --yes
   variables:
     COMPILER: g++
+    ENABLE_MPI: --enable-mpi
 
-# # GCC 5
-# weekly-build-gcc-5-debug:
-#   extends: .weekly-build-gcc
-#   image: gcc:5
-#   variables:
-#     MODE: debug
-# 
-# weekly-build-gcc-5-release:
-#   extends: .weekly-build-gcc
-#   image: gcc:5
-#   variables:
-#     MODE: release
-# 
-# weekly-build-gcc-5-optimized:
-#   extends: .weekly-build-gcc
-#   image: gcc:5
-#   variables:
-#     MODE: optimized
-# 
-# # GCC 6
-# weekly-build-gcc-6-debug:
+# GCC 8
+# weekly-build-gcc-8-debug:
 #   extends: .weekly-build-gcc
-#   image: gcc:6
+#   image: gcc:8
 #   variables:
 #     MODE: debug
-# 
-# weekly-build-gcc-6-release:
+
+# weekly-build-gcc-8-release:
 #   extends: .weekly-build-gcc
-#   image: gcc:6
+#   image: gcc:8
 #   variables:
 #     MODE: release
-# 
-# weekly-build-gcc-6-optimized:
+
+# weekly-build-gcc-8-optimized:
 #   extends: .weekly-build-gcc
-#   image: gcc:6
+#   image: gcc:8
 #   variables:
 #     MODE: optimized
 
-# GCC 7
-weekly-build-gcc-7-debug:
-  extends: .weekly-build-gcc
-  image: gcc:7
-  variables:
-    MODE: debug
-
-weekly-build-gcc-7-release:
-  extends: .weekly-build-gcc
-  image: gcc:7
-  variables:
-    MODE: release
-
-weekly-build-gcc-7-optimized:
-  extends: .weekly-build-gcc
-  image: gcc:7
-  variables:
-    MODE: optimized
-
-# GCC 8
-weekly-build-gcc-8-debug:
-  extends: .weekly-build-gcc
-  image: gcc:8
-  variables:
-    MODE: debug
-
-weekly-build-gcc-8-release:
-  extends: .weekly-build-gcc
-  image: gcc:8
-  variables:
-    MODE: release
-
-weekly-build-gcc-8-optimized:
-  extends: .weekly-build-gcc
-  image: gcc:8
-  variables:
-    MODE: optimized
-
 # GCC 9
 weekly-build-gcc-9-debug:
   extends: .weekly-build-gcc
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/utils/tests/gitlab-ci-pybindgen.yml ns-3.36/utils/tests/gitlab-ci-pybindgen.yml
--- ns-3.35/utils/tests/gitlab-ci-pybindgen.yml	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/utils/tests/gitlab-ci-pybindgen.yml	2022-04-30 18:23:58.234735300 -0700
@@ -1,24 +1,95 @@
-pybindgen:
-  stage: build
-  image: archlinux
+pybindgen-21.04:
+  image: ubuntu:21.04 # python 3.9
   only:
     variables:
-      - $PYBINDGEN == "True"
+      - $RELEASE == "weekly"
+  tags:
+    - nsnam
+    - linux
   before_script:
-    - pacman -Syu --noconfirm
-    - pacman -Sy base-devel python ccache gsl libgcrypt gtk3 boost wget git --noconfirm
-    - wget --no-check-certificate https://nat.onthewifi.net/ns3/castxml-git-0.3.4.r19.g8625aed-1-x86_64.pkg.tar
-    - wget --no-check-certificate https://nat.onthewifi.net/ns3/python-pybindgen-0.21.0-1-x86_64.pkg.tar
-    - wget --no-check-certificate https://nat.onthewifi.net/ns3/python-pygccxml-git-1.9.0.r104.g84be336-1-any.pkg.tar
-    - pacman -U --noconfirm python-pygccxml-git-1.9.0.r104.g84be336-1-any.pkg.tar python-pybindgen-0.21.0-1-x86_64.pkg.tar castxml-git-0.3.4.r19.g8625aed-1-x86_64.pkg.tar
+    - apt-get update
+    - DEBIAN_FRONTEND=noninteractive apt-get install -y g++ cmake ninja-build ccache libgsl-dev libgtk-3-dev libboost-dev wget git python3 python3-pip
+    - pip install cxxfilt pygccxml pybindgen castxml
   script:
-    - git clone https://github.com/afq984/python-cxxfilt.git
-    - mv python-cxxfilt/cxxfilt bindings/python
-    - CXX="g++" ./waf configure --disable-examples --disable-tests -d debug
-    - ./waf --apiscan=$MODULE
-    - git diff src > pybindgen_new.patch
+    - ./ns3 configure -G Ninja -- -DNS3_SCAN_PYTHON_BINDINGS=ON
+    - ./ns3 build apiscan-all
+    - ./ns3 configure --enable-python-bindings
+    - ./ns3 build
+    - ./ns3 run first.py
+    - ./ns3 run second.py
+    - ./ns3 run third.py
+    - ./ns3 run ./utils/python-unit-tests.py
+    - git diff src > pybindgen_new2104.patch
   artifacts:
     paths:
-      - pybindgen_new.patch
+      - pybindgen_new2104.patch
   timeout: 9h
 
+
+pybindgen-20.04:
+  image: ubuntu:20.04 # python 3.8
+  only:
+    variables:
+      - $RELEASE == "manual"
+  tags:
+    - nsnam
+    - linux
+  before_script:
+    - apt-get update
+    - DEBIAN_FRONTEND=noninteractive apt-get install -y g++ cmake ninja-build ccache libgsl-dev libgtk-3-dev libboost-dev wget git python3 python3-pip
+    - pip install cxxfilt pygccxml pybindgen castxml
+  script:
+    - ./ns3 configure -G Ninja -- -DNS3_SCAN_PYTHON_BINDINGS=ON
+    - ./ns3 build apiscan-all
+    - ./ns3 configure --enable-python-bindings
+    - ./ns3 build
+    - ./ns3 run first.py
+    - ./ns3 run second.py
+    - ./ns3 run third.py
+    - ./ns3 run ./utils/python-unit-tests.py
+    - git diff src > pybindgen_new2004.patch
+  artifacts:
+    paths:
+      - pybindgen_new2004.patch
+  timeout: 9h
+
+pybindgen-18.04:
+  image: ubuntu:18.04 # python 3.6
+  only:
+    variables:
+      - $RELEASE == "manual"
+  tags:
+    - nsnam
+    - linux
+  before_script:
+    - apt-get update
+    - apt-get install -y software-properties-common
+    - add-apt-repository ppa:ubuntu-toolchain-r/test --yes
+    - apt-get update
+    - DEBIAN_FRONTEND=noninteractive apt-get install -y cmake ninja-build ccache libgsl-dev libgtk-3-dev libboost-dev wget git g++-9 gcc-9 python3 python3-pip llvm-dev libclang-dev
+    - update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 800 --slave /usr/bin/g++ g++ /usr/bin/g++-9
+    - pip3 install setuptools distro requests cxxfilt
+    - git clone https://gitlab.com/nsnam/bake.git
+    - export PATH=$PATH:`pwd`/bake/build/bin
+    - export PYTHONPATH=$PYTHONPATH:`pwd`/bake/build/lib
+    - export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:`pwd`/bake/build/lib
+    - cd bake
+    - mkdir -p build/lib
+    - ./bake.py configure -e pygccxml -e pybindgen
+    - ./bake.py download
+    - ./bake.py build
+    - cd ..
+  script:
+    - CXX=g++-9 ./ns3 configure -G Ninja -- -DNS3_SCAN_PYTHON_BINDINGS=ON
+    - ./ns3 build apiscan-all
+    - ./ns3 configure --enable-python-bindings
+    - ./ns3 build
+    - ./ns3 run first.py
+    - ./ns3 run second.py
+    - ./ns3 run third.py
+    - ./ns3 run ./utils/python-unit-tests.py
+    - git diff src > pybindgen_new1804.patch
+  artifacts:
+    paths:
+      - pybindgen_new1804.patch
+  timeout: 9h
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/utils/tests/gitlab-ci-test.yml ns-3.36/utils/tests/gitlab-ci-test.yml
--- ns-3.35/utils/tests/gitlab-ci-test.yml	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/utils/tests/gitlab-ci-test.yml	2022-04-30 18:23:58.234735300 -0700
@@ -11,9 +11,10 @@
     - mkdir -p $CCACHE_BASEDIR_VALUE
     - export CCACHE_BASEDIR=${PWD}
     - export CCACHE_DIR=${PWD}/$CCACHE_BASEDIR_VALUE
-    - CXX="ccache $COMPILER" ./waf configure --enable-examples --enable-tests --disable-gtk --disable-python -d $MODE
-    - ./waf
-    - ./test.py --nowaf $VALGRIND_FLAG $FULLNESS
+    # missing the flag --disable-python
+    - ./ns3 configure -d $MODE -GNinja --enable-examples --enable-tests --disable-gtk
+    - ./ns3 build
+    - ./test.py -n $VALGRIND_FLAG $FULLNESS
   cache:
     key: "$CI_JOB_NAME-$CI_COMMIT_REF_SLUG"
     paths:
@@ -38,7 +39,7 @@
     - linux
   before_script:
     - pacman -Syu --noconfirm
-    - pacman -Sy base-devel python ccache gsl libgcrypt gtk3 boost valgrind --noconfirm
+    - pacman -Sy base-devel python ccache gsl gtk3 boost valgrind ninja cmake --noconfirm
 
 # Run the test.py script with files compiled in release mode
 daily-test-release:
@@ -52,7 +53,7 @@
       - $RELEASE == "daily"
   before_script:
     - pacman -Syu --noconfirm
-    - pacman -Sy base-devel python ccache gsl libgcrypt gtk3 boost valgrind --noconfirm
+    - pacman -Sy base-devel python ccache gsl gtk3 boost valgrind ninja cmake --noconfirm
 
 # Run the test.py script with files compiled in optimized mode
 daily-test-optimized:
@@ -66,7 +67,7 @@
       - $RELEASE == "daily"
   before_script:
     - pacman -Syu --noconfirm
-    - pacman -Sy base-devel python ccache gsl libgcrypt gtk3 boost valgrind --noconfirm
+    - pacman -Sy base-devel python ccache gsl gtk3 boost valgrind ninja cmake --noconfirm
 
 ### Valgrind tests
 # Run the test.py script with files compiled in optimized mode + valgrind (daily)
@@ -85,7 +86,7 @@
     - linux
   before_script:
     - pacman -Syu --noconfirm
-    - pacman -Sy base-devel python ccache gsl libgcrypt gtk3 boost valgrind --noconfirm
+    - pacman -Sy base-devel python ccache gsl gtk3 boost valgrind ninja cmake --noconfirm
 
 # Run the test.py script with files compiled in debug mode
 weekly-test-debug-valgrind:
@@ -103,7 +104,7 @@
     - linux
   before_script:
     - pacman -Syu --noconfirm
-    - pacman -Sy base-devel python ccache gsl libgcrypt gtk3 boost valgrind --noconfirm
+    - pacman -Sy base-devel python ccache gsl gtk3 boost valgrind ninja cmake --noconfirm
 
 # Run the test.py script with files compiled in release mode
 weekly-test-release-valgrind:
@@ -121,7 +122,7 @@
     - linux
   before_script:
     - pacman -Syu --noconfirm
-    - pacman -Sy base-devel python ccache gsl libgcrypt gtk3 boost valgrind --noconfirm
+    - pacman -Sy base-devel python ccache gsl gtk3 boost valgrind ninja cmake --noconfirm
 
 # Run the test.py script with files compiled in optimized mode
 weekly-test-optimized-valgrind:
@@ -139,7 +140,7 @@
     - linux
   before_script:
     - pacman -Syu --noconfirm
-    - pacman -Sy base-devel python ccache gsl libgcrypt gtk3 boost valgrind --noconfirm
+    - pacman -Sy base-devel python ccache gsl gtk3 boost valgrind ninja cmake --noconfirm
 
 # Do a check for the TAKES_FOREVER jobs, only in optimized mode
 weekly-test-takes-forever-optimized:
@@ -157,4 +158,4 @@
     - linux
   before_script:
     - pacman -Syu --noconfirm
-    - pacman -Sy base-devel python ccache gsl libgcrypt gtk3 boost valgrind --noconfirm
+    - pacman -Sy base-devel python ccache gsl gtk3 boost valgrind ninja cmake --noconfirm
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/utils/tests/gitlab-ci-ubuntu.yml ns-3.36/utils/tests/gitlab-ci-ubuntu.yml
--- ns-3.35/utils/tests/gitlab-ci-ubuntu.yml	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/utils/tests/gitlab-ci-ubuntu.yml	2022-04-30 18:23:58.234735300 -0700
@@ -15,38 +15,26 @@
       - $UBUNTU == "True"
   before_script:
     - apt-get --quiet update --yes
+    - apt-get --quiet upgrade --yes
     - DEBIAN_FRONTEND=noninteractive apt-get install -y tzdata
-#    - apt-get --quiet install gcc g++ python python3 python-dev qt5-default openmpi-bin openmpi-common openmpi-doc libopenmpi-dev gsl-bin libgsl-dev ccache flex bison libfl-dev sqlite sqlite3 libsqlite3-dev libxml2 libxml2-dev libgtk-3-dev libboost-all-dev $LIBGSL --yes
-    - apt-get --quiet install gcc g++ python python3 python-dev qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools openmpi-bin openmpi-common openmpi-doc libopenmpi-dev gsl-bin libgsl-dev ccache flex bison libfl-dev sqlite3 libsqlite3-dev libxml2 libxml2-dev libgtk-3-dev libboost-all-dev $LIBGSL --yes
+    - apt-get --quiet install gcc g++ cmake ninja-build python3 python3-dev qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools openmpi-bin openmpi-common openmpi-doc libopenmpi-dev gsl-bin libgsl-dev ccache flex bison libfl-dev sqlite3 libsqlite3-dev libxml2 libxml2-dev libgtk-3-dev libboost-all-dev $LIBGSL ssh --yes
   variables:
     COMPILER: g++
 
-#Â # Ubuntu 16.04 (Until April 2021)
-#Â weekly-build-ubuntu-16.04-debug:
-#Â   extends: .weekly-build-ubuntu
-#Â   image: ubuntu:16.04
-#Â   variables:
-#Â     MODE: debug
-#Â     LIBGSL: libgsl2
-#Â 
-#Â weekly-build-ubuntu-16.04-release:
-#Â   extends: .weekly-build-ubuntu
-#Â   image: ubuntu:16.04
-#Â   variables:
-#Â     MODE: release
-#Â     LIBGSL: libgsl2
-#Â 
-#Â weekly-build-ubuntu-16.04-optimized:
-#Â   extends: .weekly-build-ubuntu
-#Â   image: ubuntu:16.04
-#Â   variables:
-#Â     MODE: optimized
-#Â     LIBGSL: libgsl2
-
 # Ubuntu 18.04 (Until April 2023)
 weekly-build-ubuntu-18.04-debug:
   extends: .weekly-build-ubuntu
   image: ubuntu:18.04
+  before_script:
+    - apt-get --quiet update --yes
+    - apt-get --quiet upgrade --yes
+    - apt-get --quiet install software-properties-common --yes
+    - add-apt-repository ppa:ubuntu-toolchain-r/test --yes
+    - apt-get --quiet update --yes
+    - DEBIAN_FRONTEND=noninteractive apt-get install -y tzdata
+    - apt-get --quiet install gcc-9 g++-9 cmake ninja-build python3 python3-dev qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools openmpi-bin openmpi-common openmpi-doc libopenmpi-dev gsl-bin libgsl-dev ccache flex bison libfl-dev sqlite3 libsqlite3-dev libxml2 libxml2-dev libgtk-3-dev libboost-all-dev $LIBGSL ssh --yes
+    - update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 700 --slave /usr/bin/g++ g++ /usr/bin/g++-7
+    - update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 800 --slave /usr/bin/g++ g++ /usr/bin/g++-9
   variables:
     MODE: debug
     LIBGSL: libgsl23
@@ -54,6 +42,15 @@
 weekly-build-ubuntu-18.04-release:
   extends: .weekly-build-ubuntu
   image: ubuntu:18.04
+  before_script:
+    - apt-get --quiet update --yes
+    - apt-get --quiet install software-properties-common --yes
+    - add-apt-repository ppa:ubuntu-toolchain-r/test --yes
+    - apt-get --quiet update --yes
+    - DEBIAN_FRONTEND=noninteractive apt-get install -y tzdata
+    - apt-get --quiet install gcc-9 g++-9 cmake ninja-build python3 python3-dev qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools openmpi-bin openmpi-common openmpi-doc libopenmpi-dev gsl-bin libgsl-dev ccache flex bison libfl-dev sqlite3 libsqlite3-dev libxml2 libxml2-dev libgtk-3-dev libboost-all-dev $LIBGSL ssh --yes
+    - update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 700 --slave /usr/bin/g++ g++ /usr/bin/g++-7
+    - update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 800 --slave /usr/bin/g++ g++ /usr/bin/g++-9
   variables:
     MODE: release
     LIBGSL: libgsl23
@@ -61,72 +58,103 @@
 weekly-build-ubuntu-18.04-optimized:
   extends: .weekly-build-ubuntu
   image: ubuntu:18.04
+  before_script:
+    - apt-get --quiet update --yes
+    - apt-get --quiet install software-properties-common --yes
+    - add-apt-repository ppa:ubuntu-toolchain-r/test --yes
+    - apt-get --quiet update --yes
+    - DEBIAN_FRONTEND=noninteractive apt-get install -y tzdata
+    - apt-get --quiet install gcc-9 g++-9 cmake ninja-build python3 python3-dev qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools openmpi-bin openmpi-common openmpi-doc libopenmpi-dev gsl-bin libgsl-dev ccache flex bison libfl-dev sqlite3 libsqlite3-dev libxml2 libxml2-dev libgtk-3-dev libboost-all-dev $LIBGSL ssh --yes
+    - update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 700 --slave /usr/bin/g++ g++ /usr/bin/g++-7
+    - update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 800 --slave /usr/bin/g++ g++ /usr/bin/g++-9
   variables:
     MODE: optimized
     LIBGSL: libgsl23
 
-# Ubuntu 20.04 (Until April 2025)
-weekly-build-ubuntu-20.04-debug:
-  extends: .weekly-build-ubuntu
-  image: ubuntu:20.04
-  variables:
-    MODE: debug
-    LIBGSL: libgsl23
-
-weekly-build-ubuntu-20.04-release:
-  extends: .weekly-build-ubuntu
-  image: ubuntu:20.04
-  variables:
-    MODE: release
-    LIBGSL: libgsl23
-
-weekly-build-ubuntu-20.04-optimized:
-  extends: .weekly-build-ubuntu
-  image: ubuntu:20.04
-  variables:
-    MODE: optimized
-    LIBGSL: libgsl23
+# # Ubuntu 20.04 (Until April 2025)
+# weekly-build-ubuntu-20.04-debug:
+#   extends: .weekly-build-ubuntu
+#   image: ubuntu:20.04
+#   variables:
+#     MODE: debug
+#     LIBGSL: libgsl23
+
+# weekly-build-ubuntu-20.04-release:
+#   extends: .weekly-build-ubuntu
+#   image: ubuntu:20.04
+#   variables:
+#     MODE: release
+#     LIBGSL: libgsl23
+
+# weekly-build-ubuntu-20.04-optimized:
+#   extends: .weekly-build-ubuntu
+#   image: ubuntu:20.04
+#   variables:
+#     MODE: optimized
+#     LIBGSL: libgsl23
+
+# # Ubuntu 21.04 (Until January 2022)
+# weekly-build-ubuntu-21.04-debug:
+#   extends: .weekly-build-ubuntu
+#   image: ubuntu:21.04
+#   variables:
+#     MODE: debug
+#     LIBGSL: libgsl25
+
+# weekly-build-ubuntu-21.04-release:
+#   extends: .weekly-build-ubuntu
+#   image: ubuntu:21.04
+#   variables:
+#     MODE: release
+#     LIBGSL: libgsl25
+
+# weekly-build-ubuntu-21.04-optimized:
+#   extends: .weekly-build-ubuntu
+#   image: ubuntu:21.04
+#   variables:
+#     MODE: optimized
+#     LIBGSL: libgsl25
 
-# Ubuntu 21.04 (Until January 2022)
-weekly-build-ubuntu-21.04-debug:
+# Ubuntu 22.04 (Until January 2032)
+weekly-build-ubuntu-22.04-debug:
   extends: .weekly-build-ubuntu
-  image: ubuntu:21.04
+  image: ubuntu:22.04
   variables:
     MODE: debug
-    LIBGSL: libgsl25
+    LIBGSL: libgsl27
 
-weekly-build-ubuntu-21.04-release:
+weekly-build-ubuntu-22.04-release:
   extends: .weekly-build-ubuntu
-  image: ubuntu:21.04
+  image: ubuntu:22.04
   variables:
     MODE: release
-    LIBGSL: libgsl25
+    LIBGSL: libgsl27
 
-weekly-build-ubuntu-21.04-optimized:
+weekly-build-ubuntu-22.04-optimized:
   extends: .weekly-build-ubuntu
-  image: ubuntu:21.04
+  image: ubuntu:22.04
   variables:
     MODE: optimized
-    LIBGSL: libgsl25
+    LIBGSL: libgsl27
 
 # Ubuntu Rolling
-weekly-build-ubuntu-rolling-debug:
-  extends: .weekly-build-ubuntu
-  image: ubuntu:rolling
-  variables:
-    MODE: debug
-    LIBGSL: libgsl25
-
-weekly-build-ubuntu-rolling-release:
-  extends: .weekly-build-ubuntu
-  image: ubuntu:rolling
-  variables:
-    MODE: release
-    LIBGSL: libgsl25
-
-weekly-build-ubuntu-rolling-optimized:
-  extends: .weekly-build-ubuntu
-  image: ubuntu:rolling
-  variables:
-    MODE: optimized
-    LIBGSL: libgsl25
+# weekly-build-ubuntu-rolling-debug:
+#   extends: .weekly-build-ubuntu
+#   image: ubuntu:rolling
+#   variables:
+#     MODE: debug
+#     LIBGSL: libgsl27
+
+# weekly-build-ubuntu-rolling-release:
+#   extends: .weekly-build-ubuntu
+#   image: ubuntu:rolling
+#   variables:
+#     MODE: release
+#     LIBGSL: libgsl27
+
+# weekly-build-ubuntu-rolling-optimized:
+#   extends: .weekly-build-ubuntu
+#   image: ubuntu:rolling
+#   variables:
+#     MODE: optimized
+#     LIBGSL: libgsl27
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/utils/tests/gitlab-ci.yml ns-3.36/utils/tests/gitlab-ci.yml
--- ns-3.35/utils/tests/gitlab-ci.yml	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/utils/tests/gitlab-ci.yml	2022-04-30 18:23:58.234735300 -0700
@@ -37,9 +37,10 @@
     - mkdir -p $CCACHE_BASEDIR_VALUE
     - export CCACHE_BASEDIR=${PWD}
     - export CCACHE_DIR=${PWD}/$CCACHE_BASEDIR_VALUE
-    - CXX="ccache $COMPILER" ./waf configure --enable-examples --enable-tests --enable-asserts -d $MODE
-    - ./waf
-    - if [ "$MODE" != "debug" ]; then ./test.py --nowaf; fi
+    - export MPI_CI=1
+    - CXX=$COMPILER ./ns3 configure -d $MODE -GNinja --enable-examples --enable-tests --enable-asserts $ENABLE_MPI
+    - ./ns3 build
+    - if [ "$MODE" != "debug" ]; then ./test.py -n; fi
   cache:
     # Use separate key for each (debug/optimized/release) jobs because
     # they run in parallel and will otherwise overwrite each other
@@ -70,7 +71,7 @@
     MODE: debug
   before_script:
     - pacman -Syu --noconfirm
-    - pacman -Sy base-devel python ccache gsl libgcrypt gtk3 boost --noconfirm
+    - pacman -Sy base-devel python ccache gsl gtk3 boost ninja cmake --noconfirm
 
 per-commit-compile-release:
   extends: .base-build
@@ -85,7 +86,7 @@
     MODE: release
   before_script:
     - pacman -Syu --noconfirm
-    - pacman -Sy base-devel python ccache gsl libgcrypt gtk3 boost --noconfirm
+    - pacman -Sy base-devel python ccache gsl gtk3 boost ninja cmake --noconfirm
 
 per-commit-compile-optimized:
   extends: .base-build
@@ -100,7 +101,7 @@
     MODE: optimized
   before_script:
     - pacman -Syu --noconfirm
-    - pacman -Sy base-devel python ccache gsl libgcrypt gtk3 boost --noconfirm
+    - pacman -Sy base-devel python ccache gsl gtk3 boost ninja cmake --noconfirm
 
 # Weekly jobs for other distribution and compilers
 include:
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/utils/tests/TestBase.py ns-3.36/utils/tests/TestBase.py
--- ns-3.35/utils/tests/TestBase.py	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/utils/tests/TestBase.py	2022-04-30 18:23:58.234735300 -0700
@@ -42,7 +42,7 @@
 
 def set_workdir():
     dir_files = [ f for f in os.listdir('.') if os.path.exists(f) ]
-    if not 'VERSION' in dir_files and not 'waf' in dir_files:
+    if not 'VERSION' in dir_files and not 'ns3' in dir_files:
         if os.path.split(os.path.abspath('.'))[1] == 'tests' and os.path.split(os.path.abspath(os.pardir))[1] == 'utils':
                 os.chdir('../../')
         else:
@@ -70,7 +70,6 @@
         @param argv argument list
         @param desc description
         @param mode test mode
-        @return none
         """
         self.my_env = os.environ
         set_workdir()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/utils/tests/test-ns3.py ns-3.36/utils/tests/test-ns3.py
--- ns-3.35/utils/tests/test-ns3.py	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.36/utils/tests/test-ns3.py	2022-04-30 18:23:58.234735300 -0700
@@ -0,0 +1,2080 @@
+#! /usr/bin/env python3
+# -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
+#
+# Copyright (c) 2021 Universidade de BrasÃ­lia
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 as
+# published by the Free Software Foundation;
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+# Author: Gabriel Ferreira <gabrielcarvfer@gmail.com>
+
+"""!
+Test suite for the ns3 wrapper script
+"""
+
+import glob
+import os
+import re
+import shutil
+import subprocess
+import sys
+import unittest
+from functools import partial
+
+# Get path containing ns3
+ns3_path = os.path.dirname(os.path.abspath(os.sep.join([__file__, "../../"])))
+ns3_lock_filename = os.path.join(ns3_path, ".lock-ns3_%s_build" % sys.platform)
+ns3_script = os.sep.join([ns3_path, "ns3"])
+ns3rc_script = os.sep.join([ns3_path, ".ns3rc"])
+usual_outdir = os.sep.join([ns3_path, "build"])
+usual_lib_outdir = os.sep.join([usual_outdir, "lib"])
+
+# Move the current working directory to the ns-3-dev folder
+os.chdir(ns3_path)
+
+# Cmake commands
+cmake_build_project_command = "cmake --build . -j".format(ns3_path=ns3_path)
+cmake_build_target_command = partial("cmake --build . -j {jobs} --target {target}".format,
+                                     jobs=max(1, os.cpu_count() - 1)
+                                     )
+
+
+def run_ns3(args, env=None):
+    """!
+    Runs the ns3 wrapper script with arguments
+    @param args: string containing arguments that will get split before calling ns3
+    @param env: environment variables dictionary
+    @return tuple containing (error code, stdout and stderr)
+    """
+    if "clean" in args:
+        possible_leftovers = ["contrib/borked", "contrib/calibre"]
+        for leftover in possible_leftovers:
+            if os.path.exists(leftover):
+                shutil.rmtree(leftover, ignore_errors=True)
+    return run_program(ns3_script, args, python=True, env=env)
+
+
+# Adapted from https://github.com/metabrainz/picard/blob/master/picard/util/__init__.py
+def run_program(program, args, python=False, cwd=ns3_path, env=None):
+    """!
+    Runs a program with the given arguments and returns a tuple containing (error code, stdout and stderr)
+    @param program: program to execute (or python script)
+    @param args: string containing arguments that will get split before calling the program
+    @param python: flag indicating whether the program is a python script
+    @param cwd: the working directory used that will be the root folder for the execution
+    @param env: environment variables dictionary
+    @return tuple containing (error code, stdout and stderr)
+    """
+    if type(args) != str:
+        raise Exception("args should be a string")
+
+    # Include python interpreter if running a python script
+    if python:
+        arguments = [sys.executable, program]
+    else:
+        arguments = [program]
+
+    if args != "":
+        arguments.extend(re.findall("(?:\".*?\"|\S)+", args))
+
+    for i in range(len(arguments)):
+        arguments[i] = arguments[i].replace("\"", "")
+
+    # Forward environment variables used by the ns3 script
+    current_env = os.environ.copy()
+
+    # Add different environment variables
+    if env:
+        current_env.update(env)
+
+    # Call program with arguments
+    ret = subprocess.run(
+        arguments,
+        stdin=subprocess.DEVNULL,
+        stdout=subprocess.PIPE,
+        stderr=subprocess.PIPE,
+        cwd=cwd,  # run process from the ns-3-dev path
+        env=current_env
+    )
+    # Return (error code, stdout and stderr)
+    return ret.returncode, ret.stdout.decode(sys.stdout.encoding), ret.stderr.decode(sys.stderr.encoding)
+
+
+def get_programs_list():
+    """!
+    Extracts the programs list from .lock-ns3
+    @return list of programs.
+    """
+    values = {}
+    with open(ns3_lock_filename) as f:
+        exec(f.read(), globals(), values)
+    return values["ns3_runnable_programs"]
+
+
+def get_libraries_list(lib_outdir=usual_lib_outdir):
+    """!
+    Gets a list of built libraries
+    @param lib_outdir: path containing libraries
+    @return list of built libraries.
+    """
+    return glob.glob(lib_outdir + '/*', recursive=True)
+
+
+def get_headers_list(outdir=usual_outdir):
+    """!
+    Gets a list of header files
+    @param outdir: path containing headers
+    @return list of headers.
+    """
+    return glob.glob(outdir + '/**/*.h', recursive=True)
+
+
+def read_lock_entry(entry):
+    """!
+    Read interesting entries from the .lock-ns3 file
+    @param entry: entry to read from .lock-ns3
+    @return value of the requested entry.
+    """
+    values = {}
+    with open(ns3_lock_filename) as f:
+        exec(f.read(), globals(), values)
+    return values.get(entry, None)
+
+
+def get_test_enabled():
+    """!
+    Check if tests are enabled in the .lock-ns3
+    @return bool.
+    """
+    return read_lock_entry("ENABLE_TESTS")
+
+
+def get_enabled_modules():
+    """
+    Check if tests are enabled in the .lock-ns3
+    @return list of enabled modules (prefixed with 'ns3-').
+    """
+    return read_lock_entry("NS3_ENABLED_MODULES")
+
+
+class NS3UnusedSourcesTestCase(unittest.TestCase):
+    """!
+    ns-3 tests related to checking if source files were left behind, not being used by CMake
+    """
+
+    ## dictionary containing directories with .cc source files
+    directory_and_files = {}
+
+    def setUp(self):
+        """!
+        Scan all C++ source files and add them to a list based on their path
+        @return None
+        """
+        for root, dirs, files in os.walk(ns3_path):
+            if "gitlab-ci-local" in root:
+                continue
+            for name in files:
+                if name.endswith(".cc"):
+                    path = os.path.join(root, name)
+                    directory = os.path.dirname(path)
+                    if directory not in self.directory_and_files:
+                        self.directory_and_files[directory] = []
+                    self.directory_and_files[directory].append(path)
+
+    def test_01_UnusedExampleSources(self):
+        """!
+        Test if all example source files are being used in their respective CMakeLists.txt
+        @return None
+        """
+        unused_sources = set()
+        for example_directory in self.directory_and_files.keys():
+            # Skip non-example directories
+            if os.sep + "examples" not in example_directory:
+                continue
+
+            # Open the examples CMakeLists.txt and read it
+            with open(os.path.join(example_directory, "CMakeLists.txt"), "r") as f:
+                cmake_contents = f.read()
+
+            # For each file, check if it is in the CMake contents
+            for file in self.directory_and_files[example_directory]:
+                # We remove the .cc because some examples sources can be written as ${example_name}.cc
+                if os.path.basename(file).replace(".cc", "") not in cmake_contents:
+                    unused_sources.add(file)
+
+        self.assertListEqual([], list(unused_sources))
+
+    def test_02_UnusedModuleSources(self):
+        """!
+        Test if all module source files are being used in their respective CMakeLists.txt
+        @return None
+        """
+        unused_sources = set()
+        for directory in self.directory_and_files.keys():
+            # Skip examples and bindings directories
+            is_not_module = not ("src" in directory or "contrib" in directory)
+            is_example = os.sep + "examples" in directory
+            is_bindings = os.sep + "bindings" in directory
+
+            if is_not_module or is_bindings or is_example:
+                continue
+
+            # We can be in one of the module subdirectories (helper, model, test, bindings, etc)
+            # Navigate upwards until we hit a CMakeLists.txt
+            cmake_path = os.path.join(directory, "CMakeLists.txt")
+            while not os.path.exists(cmake_path):
+                parent_directory = os.path.dirname(os.path.dirname(cmake_path))
+                cmake_path = os.path.join(parent_directory, os.path.basename(cmake_path))
+
+            # Open the module CMakeLists.txt and read it
+            with open(cmake_path, "r") as f:
+                cmake_contents = f.read()
+
+            # For each file, check if it is in the CMake contents
+            for file in self.directory_and_files[directory]:
+                if os.path.basename(file) not in cmake_contents:
+                    unused_sources.add(file)
+
+        # Remove temporary exceptions
+        exceptions = ["win32-system-wall-clock-ms.cc",  # Should be removed with MR784
+                      ]
+        for exception in exceptions:
+            for unused_source in unused_sources:
+                if os.path.basename(unused_source) == exception:
+                    unused_sources.remove(unused_source)
+                    break
+
+        self.assertListEqual([], list(unused_sources))
+
+    def test_03_UnusedUtilsSources(self):
+        """!
+        Test if all utils source files are being used in their respective CMakeLists.txt
+        @return None
+        """
+        unused_sources = set()
+        for directory in self.directory_and_files.keys():
+            # Skip directories that are not utils
+            is_module = "src" in directory or "contrib" in directory
+            if os.sep + "utils" not in directory or is_module:
+                continue
+
+            # We can be in one of the module subdirectories (helper, model, test, bindings, etc)
+            # Navigate upwards until we hit a CMakeLists.txt
+            cmake_path = os.path.join(directory, "CMakeLists.txt")
+            while not os.path.exists(cmake_path):
+                parent_directory = os.path.dirname(os.path.dirname(cmake_path))
+                cmake_path = os.path.join(parent_directory, os.path.basename(cmake_path))
+
+            # Open the module CMakeLists.txt and read it
+            with open(cmake_path, "r") as f:
+                cmake_contents = f.read()
+
+            # For each file, check if it is in the CMake contents
+            for file in self.directory_and_files[directory]:
+                if os.path.basename(file) not in cmake_contents:
+                    unused_sources.add(file)
+
+        self.assertListEqual([], list(unused_sources))
+
+
+class NS3CommonSettingsTestCase(unittest.TestCase):
+    """!
+    ns3 tests related to generic options
+    """
+
+    def setUp(self):
+        """!
+        Clean configuration/build artifacts before common commands
+        @return None
+        """
+        super().setUp()
+        # No special setup for common test cases other than making sure we are working on a clean directory.
+        run_ns3("clean")
+
+    def test_01_NoOption(self):
+        """!
+        Test not passing any arguments to
+        @return None
+        """
+        return_code, stdout, stderr = run_ns3("")
+        self.assertEqual(return_code, 1)
+        self.assertIn("You need to configure ns-3 first: try ./ns3 configure", stdout)
+
+    def test_02_NoTaskLines(self):
+        """!
+        Test only passing --quiet argument to ns3
+        @return None
+        """
+        return_code, stdout, stderr = run_ns3("--quiet")
+        self.assertEqual(return_code, 1)
+        self.assertIn("You need to configure ns-3 first: try ./ns3 configure", stdout)
+
+    def test_03_CheckConfig(self):
+        """!
+        Test only passing 'show config' argument to ns3
+        @return None
+        """
+        return_code, stdout, stderr = run_ns3("show config")
+        self.assertEqual(return_code, 1)
+        self.assertIn("You need to configure ns-3 first: try ./ns3 configure", stdout)
+
+    def test_04_CheckProfile(self):
+        """!
+        Test only passing 'show profile' argument to ns3
+        @return None
+        """
+        return_code, stdout, stderr = run_ns3("show profile")
+        self.assertEqual(return_code, 1)
+        self.assertIn("You need to configure ns-3 first: try ./ns3 configure", stdout)
+
+    def test_05_CheckVersion(self):
+        """!
+        Test only passing 'show version' argument to ns3
+        @return None
+        """
+        return_code, stdout, stderr = run_ns3("show version")
+        self.assertEqual(return_code, 1)
+        self.assertIn("You need to configure ns-3 first: try ./ns3 configure", stdout)
+
+
+class NS3ConfigureBuildProfileTestCase(unittest.TestCase):
+    """!
+    ns3 tests related to build profiles
+    """
+
+    def setUp(self):
+        """!
+        Clean configuration/build artifacts before testing configuration settings
+        @return None
+        """
+        super().setUp()
+        # No special setup for common test cases other than making sure we are working on a clean directory.
+        run_ns3("clean")
+
+    def test_01_Debug(self):
+        """!
+        Test the debug build
+        @return None
+        """
+        return_code, stdout, stderr = run_ns3("configure -G \"Unix Makefiles\" -d debug --enable-verbose")
+        self.assertEqual(return_code, 0)
+        self.assertIn("Build profile                 : debug", stdout)
+        self.assertIn("Build files have been written to", stdout)
+
+        # Build core to check if profile suffixes match the expected.
+        return_code, stdout, stderr = run_ns3("build core")
+        self.assertEqual(return_code, 0)
+        self.assertIn("Built target libcore", stdout)
+
+        libraries = get_libraries_list()
+        self.assertGreater(len(libraries), 0)
+        self.assertIn("core-debug", libraries[0])
+
+    def test_02_Release(self):
+        """!
+        Test the release build
+        @return None
+        """
+        return_code, stdout, stderr = run_ns3("configure -G \"Unix Makefiles\" -d release")
+        self.assertEqual(return_code, 0)
+        self.assertIn("Build profile                 : release", stdout)
+        self.assertIn("Build files have been written to", stdout)
+
+    def test_03_Optimized(self):
+        """!
+        Test the optimized build
+        @return None
+        """
+        return_code, stdout, stderr = run_ns3("configure -G \"Unix Makefiles\" -d optimized --enable-verbose")
+        self.assertEqual(return_code, 0)
+        self.assertIn("Build profile                 : optimized", stdout)
+        self.assertIn("Build files have been written to", stdout)
+
+        # Build core to check if profile suffixes match the expected
+        return_code, stdout, stderr = run_ns3("build core")
+        self.assertEqual(return_code, 0)
+        self.assertIn("Built target libcore", stdout)
+
+        libraries = get_libraries_list()
+        self.assertGreater(len(libraries), 0)
+        self.assertIn("core-optimized", libraries[0])
+
+    def test_04_Typo(self):
+        """!
+        Test a build type with a typo
+        @return None
+        """
+        return_code, stdout, stderr = run_ns3("configure -G \"Unix Makefiles\" -d Optimized")
+        self.assertEqual(return_code, 2)
+        self.assertIn("invalid choice: 'Optimized'", stderr)
+
+    def test_05_TYPO(self):
+        """!
+        Test a build type with another typo
+        @return None
+        """
+        return_code, stdout, stderr = run_ns3("configure -G \"Unix Makefiles\" -d OPTIMIZED")
+        self.assertEqual(return_code, 2)
+        self.assertIn("invalid choice: 'OPTIMIZED'", stderr)
+
+
+class NS3BaseTestCase(unittest.TestCase):
+    """!
+    Generic test case with basic function inherited by more complex tests.
+    """
+
+    ## when cleaned_once is False, clean up build artifacts and reconfigure
+    cleaned_once = False
+
+    def config_ok(self, return_code, stdout):
+        """!
+        Check if configuration for release mode worked normally
+        @param return_code: return code from CMake
+        @param stdout: output from CMake.
+        @return None
+        """
+        self.assertEqual(return_code, 0)
+        self.assertIn("Build profile                 : release", stdout)
+        self.assertIn("Build files have been written to", stdout)
+
+    def setUp(self):
+        """!
+        Clean configuration/build artifacts before testing configuration and build settings
+        After configuring the build as release,
+        check if configuration worked and check expected output files.
+        @return None
+        """
+        super().setUp()
+
+        if os.path.exists(ns3rc_script):
+            os.remove(ns3rc_script)
+
+        # We only clear it once and then update the settings by changing flags or consuming ns3rc.
+        if not NS3BaseTestCase.cleaned_once:
+            NS3BaseTestCase.cleaned_once = True
+            run_ns3("clean")
+            return_code, stdout, stderr = run_ns3("configure -G \"Unix Makefiles\" -d release --enable-verbose")
+            self.config_ok(return_code, stdout)
+
+        # Check if .lock-ns3 exists, then read to get list of executables.
+        self.assertTrue(os.path.exists(ns3_lock_filename))
+        ## ns3_executables holds a list of executables in .lock-ns3
+        self.ns3_executables = get_programs_list()
+
+        # Check if .lock-ns3 exists than read to get the list of enabled modules.
+        self.assertTrue(os.path.exists(ns3_lock_filename))
+        ## ns3_modules holds a list to the modules enabled stored in .lock-ns3
+        self.ns3_modules = get_enabled_modules()
+
+
+class NS3ConfigureTestCase(NS3BaseTestCase):
+    """!
+    Test ns3 configuration options
+    """
+
+    ## when cleaned_once is False, clean up build artifacts and reconfigure
+    cleaned_once = False
+
+    def setUp(self):
+        """!
+        Reuse cleaning/release configuration from NS3BaseTestCase if flag is cleaned
+        @return None
+        """
+        if not NS3ConfigureTestCase.cleaned_once:
+            NS3ConfigureTestCase.cleaned_once = True
+            NS3BaseTestCase.cleaned_once = False
+        super().setUp()
+
+    def test_01_Examples(self):
+        """!
+        Test enabling and disabling examples
+        @return None
+        """
+        return_code, stdout, stderr = run_ns3("configure -G \"Unix Makefiles\" --enable-examples")
+
+        # This just tests if we didn't break anything, not that we actually have enabled anything.
+        self.config_ok(return_code, stdout)
+
+        # If nothing went wrong, we should have more executables in the list after enabling the examples.
+        self.assertGreater(len(get_programs_list()), len(self.ns3_executables))
+
+        # Now we disabled them back.
+        return_code, stdout, stderr = run_ns3("configure -G \"Unix Makefiles\" --disable-examples")
+
+        # This just tests if we didn't break anything, not that we actually have enabled anything.
+        self.config_ok(return_code, stdout)
+
+        # Then check if they went back to the original list.
+        self.assertEqual(len(get_programs_list()), len(self.ns3_executables))
+
+    def test_02_Tests(self):
+        """!
+        Test enabling and disabling tests
+        @return None
+        """
+        # Try enabling tests
+        return_code, stdout, stderr = run_ns3("configure -G \"Unix Makefiles\" --enable-tests")
+        self.config_ok(return_code, stdout)
+
+        # Then try building the libcore test
+        return_code, stdout, stderr = run_ns3("build core-test")
+
+        # If nothing went wrong, this should have worked
+        self.assertEqual(return_code, 0)
+        self.assertIn("Built target libcore-test", stdout)
+
+        # Now we disabled the tests
+        return_code, stdout, stderr = run_ns3("configure -G \"Unix Makefiles\" --disable-tests")
+        self.config_ok(return_code, stdout)
+
+        # Now building the library test should fail
+        return_code, stdout, stderr = run_ns3("build core-test")
+
+        # Then check if they went back to the original list
+        self.assertEqual(return_code, 1)
+        self.assertIn("Target to build does not exist: core-test", stdout)
+
+    def test_03_EnableModules(self):
+        """!
+        Test enabling specific modules
+        @return None
+        """
+        # Try filtering enabled modules to network+Wi-Fi and their dependencies
+        return_code, stdout, stderr = run_ns3("configure -G \"Unix Makefiles\" --enable-modules='network;wifi'")
+        self.config_ok(return_code, stdout)
+
+        # At this point we should have fewer modules
+        enabled_modules = get_enabled_modules()
+        self.assertLess(len(get_enabled_modules()), len(self.ns3_modules))
+        self.assertIn("ns3-network", enabled_modules)
+        self.assertIn("ns3-wifi", enabled_modules)
+
+        # Try enabling only core
+        return_code, stdout, stderr = run_ns3("configure -G \"Unix Makefiles\" --enable-modules='core' --enable-python-bindings")
+        self.config_ok(return_code, stdout)
+        self.assertIn("ns3-core", get_enabled_modules())
+
+        # Try cleaning the list of enabled modules to reset to the normal configuration.
+        return_code, stdout, stderr = run_ns3("configure -G \"Unix Makefiles\" --enable-modules='' --disable-python-bindings")
+        self.config_ok(return_code, stdout)
+
+        # At this point we should have the same amount of modules that we had when we started.
+        self.assertEqual(len(get_enabled_modules()), len(self.ns3_modules))
+
+    def test_04_DisableModules(self):
+        """!
+        Test disabling specific modules
+        @return None
+        """
+        # Try filtering disabled modules to disable lte and modules that depend on it.
+        return_code, stdout, stderr = run_ns3("configure -G \"Unix Makefiles\" --disable-modules='lte;wimax'")
+        self.config_ok(return_code, stdout)
+
+        # At this point we should have fewer modules.
+        enabled_modules = get_enabled_modules()
+        self.assertLess(len(enabled_modules), len(self.ns3_modules))
+        self.assertNotIn("ns3-lte", enabled_modules)
+        self.assertNotIn("ns3-wimax", enabled_modules)
+
+        # Try cleaning the list of enabled modules to reset to the normal configuration.
+        return_code, stdout, stderr = run_ns3("configure -G \"Unix Makefiles\" --disable-modules=''")
+        self.config_ok(return_code, stdout)
+
+        # At this point we should have the same amount of modules that we had when we started.
+        self.assertEqual(len(get_enabled_modules()), len(self.ns3_modules))
+
+    def test_05_EnableModulesComma(self):
+        """!
+        Test enabling comma-separated (waf-style) examples
+        @return None
+        """
+        # Try filtering enabled modules to network+Wi-Fi and their dependencies.
+        return_code, stdout, stderr = run_ns3("configure -G \"Unix Makefiles\" --enable-modules='network,wifi'")
+        self.config_ok(return_code, stdout)
+
+        # At this point we should have fewer modules.
+        enabled_modules = get_enabled_modules()
+        self.assertLess(len(get_enabled_modules()), len(self.ns3_modules))
+        self.assertIn("ns3-network", enabled_modules)
+        self.assertIn("ns3-wifi", enabled_modules)
+
+        # Try cleaning the list of enabled modules to reset to the normal configuration.
+        return_code, stdout, stderr = run_ns3("configure -G \"Unix Makefiles\" --enable-modules=''")
+        self.config_ok(return_code, stdout)
+
+        # At this point we should have the same amount of modules that we had when we started.
+        self.assertEqual(len(get_enabled_modules()), len(self.ns3_modules))
+
+    def test_06_DisableModulesComma(self):
+        """!
+        Test disabling comma-separated (waf-style) examples
+        @return None
+        """
+        # Try filtering disabled modules to disable lte and modules that depend on it.
+        return_code, stdout, stderr = run_ns3("configure -G \"Unix Makefiles\" --disable-modules='lte,mpi'")
+        self.config_ok(return_code, stdout)
+
+        # At this point we should have fewer modules.
+        enabled_modules = get_enabled_modules()
+        self.assertLess(len(enabled_modules), len(self.ns3_modules))
+        self.assertNotIn("ns3-lte", enabled_modules)
+        self.assertNotIn("ns3-mpi", enabled_modules)
+
+        # Try cleaning the list of enabled modules to reset to the normal configuration.
+        return_code, stdout, stderr = run_ns3("configure -G \"Unix Makefiles\" --disable-modules=''")
+        self.config_ok(return_code, stdout)
+
+        # At this point we should have the same amount of modules that we had when we started.
+        self.assertEqual(len(get_enabled_modules()), len(self.ns3_modules))
+
+    def test_07_Ns3rc(self):
+        """!
+        Test loading settings from the ns3rc config file
+        @return None
+        """
+        ns3rc_template = "# ! /usr/bin/env python\
+                          \
+                          # A list of the modules that will be enabled when ns-3 is run.\
+                          # Modules that depend on the listed modules will be enabled also.\
+                          #\
+                          # All modules can be enabled by choosing 'all_modules'.\
+                          modules_enabled = [{modules}]\
+                          \
+                          # Set this equal to true if you want examples to be run.\
+                          examples_enabled = {examples}\
+                          \
+                          # Set this equal to true if you want tests to be run.\
+                          tests_enabled = {tests}\
+                          "
+
+        # Now we repeat the command line tests but with the ns3rc file.
+        with open(ns3rc_script, "w") as f:
+            f.write(ns3rc_template.format(modules="'lte'", examples="False", tests="True"))
+
+        # Reconfigure.
+        return_code, stdout, stderr = run_ns3("configure -G \"Unix Makefiles\"")
+        self.config_ok(return_code, stdout)
+
+        # Check.
+        enabled_modules = get_enabled_modules()
+        self.assertLess(len(get_enabled_modules()), len(self.ns3_modules))
+        self.assertIn("ns3-lte", enabled_modules)
+        self.assertTrue(get_test_enabled())
+        self.assertEqual(len(get_programs_list()), len(self.ns3_executables))
+
+        # Replace the ns3rc file
+        with open(ns3rc_script, "w") as f:
+            f.write(ns3rc_template.format(modules="'wifi'", examples="True", tests="False"))
+
+        # Reconfigure
+        return_code, stdout, stderr = run_ns3("configure -G \"Unix Makefiles\"")
+        self.config_ok(return_code, stdout)
+
+        # Check
+        enabled_modules = get_enabled_modules()
+        self.assertLess(len(get_enabled_modules()), len(self.ns3_modules))
+        self.assertIn("ns3-wifi", enabled_modules)
+        self.assertFalse(get_test_enabled())
+        self.assertGreater(len(get_programs_list()), len(self.ns3_executables))
+
+        # Then we roll back by removing the ns3rc config file
+        os.remove(ns3rc_script)
+
+        # Reconfigure
+        return_code, stdout, stderr = run_ns3("configure -G \"Unix Makefiles\"")
+        self.config_ok(return_code, stdout)
+
+        # Check
+        self.assertEqual(len(get_enabled_modules()), len(self.ns3_modules))
+        self.assertFalse(get_test_enabled())
+        self.assertEqual(len(get_programs_list()), len(self.ns3_executables))
+
+    def test_08_DryRun(self):
+        """!
+        Test dry-run (printing commands to be executed instead of running them)
+        @return None
+        """
+        run_ns3("clean")
+
+        # Try dry-run before and after the positional commands (outputs should match)
+        for positional_command in ["configure", "build", "clean"]:
+            return_code, stdout, stderr = run_ns3("--dry-run %s" % positional_command)
+            return_code1, stdout1, stderr1 = run_ns3("%s --dry-run" % positional_command)
+
+            self.assertEqual(return_code, return_code1)
+            self.assertEqual(stdout, stdout1)
+            self.assertEqual(stderr, stderr1)
+
+        run_ns3("clean")
+
+        # Build target before using below
+        run_ns3("configure -G \"Unix Makefiles\" -d release --enable-verbose")
+        run_ns3("build scratch-simulator")
+
+        # Run all cases and then check outputs
+        return_code0, stdout0, stderr0 = run_ns3("--dry-run run scratch-simulator")
+        return_code1, stdout1, stderr1 = run_ns3("run scratch-simulator")
+        return_code2, stdout2, stderr2 = run_ns3("--dry-run run scratch-simulator --no-build")
+        return_code3, stdout3, stderr3 = run_ns3("run scratch-simulator --no-build")
+
+        # Return code and stderr should be the same for all of them.
+        self.assertEqual(sum([return_code0, return_code1, return_code2, return_code3]), 0)
+        self.assertEqual([stderr0, stderr1, stderr2, stderr3], [""] * 4)
+
+        scratch_path = None
+        for program in get_programs_list():
+            if "scratch-simulator" in program and "subdir" not in program:
+                scratch_path = program
+                break
+
+        # Scratches currently have a 'scratch_' prefix in their CMake targets
+        # Case 0: dry-run + run (should print commands to build target and then run)
+        self.assertIn(cmake_build_target_command(target="scratch_scratch-simulator"), stdout0)
+        self.assertIn(scratch_path, stdout0)
+
+        # Case 1: run (should print only make build message)
+        self.assertNotIn(cmake_build_target_command(target="scratch_scratch-simulator"), stdout1)
+        self.assertIn("Built target", stdout1)
+        self.assertNotIn(scratch_path, stdout1)
+
+        # Case 2: dry-run + run-no-build (should print commands to run the target)
+        self.assertIn("The following commands would be executed:", stdout2)
+        self.assertIn(scratch_path, stdout2)
+
+        # Case 3: run-no-build (should print the target output only)
+        self.assertNotIn("Finished executing the following commands:", stdout3)
+        self.assertNotIn(scratch_path, stdout3)
+
+    def test_09_PropagationOfReturnCode(self):
+        """!
+        Test if ns3 is propagating back the return code from the executables called with the run command
+        @return None
+        """
+        # From this point forward we are reconfiguring in debug mode
+        return_code, _, _ = run_ns3("clean")
+        self.assertEqual(return_code, 0)
+
+        return_code, _, _ = run_ns3("configure -G \"Unix Makefiles\" --enable-examples --enable-tests")
+        self.assertEqual(return_code, 0)
+
+        # Build necessary executables
+        return_code, stdout, stderr = run_ns3("build command-line-example test-runner")
+        self.assertEqual(return_code, 0)
+
+        # Now some tests will succeed normally
+        return_code, stdout, stderr = run_ns3("run \"test-runner --test-name=command-line\" --no-build")
+        self.assertEqual(return_code, 0)
+
+        # Now some tests will fail during NS_COMMANDLINE_INTROSPECTION
+        return_code, stdout, stderr = run_ns3("run \"test-runner --test-name=command-line\" --no-build",
+                                              env={"NS_COMMANDLINE_INTROSPECTION": ".."}
+                                              )
+        self.assertNotEqual(return_code, 0)
+
+        # Cause a sigsegv
+        sigsegv_example = os.path.join(ns3_path, "scratch", "sigsegv.cc")
+        with open(sigsegv_example, "w") as f:
+            f.write("""
+                    int main (int argc, char *argv[])
+                    {
+                      char *s = "hello world"; *s = 'H';
+                      return 0;
+                    }
+                    """)
+        return_code, stdout, stderr = run_ns3("run sigsegv")
+        self.assertEqual(return_code, 245)
+        self.assertIn("sigsegv-default' died with <Signals.SIGSEGV: 11>", stdout)
+
+        # Cause an abort
+        abort_example = os.path.join(ns3_path, "scratch", "abort.cc")
+        with open(abort_example, "w") as f:
+            f.write("""
+                    #include "ns3/core-module.h"
+
+                    using namespace ns3;
+                    int main (int argc, char *argv[])
+                    {
+                      NS_ABORT_IF(true);
+                      return 0;
+                    }
+                    """)
+        return_code, stdout, stderr = run_ns3("run abort")
+        self.assertEqual(return_code, 250)
+        self.assertIn("abort-default' died with <Signals.SIGABRT: 6>", stdout)
+
+        os.remove(sigsegv_example)
+        os.remove(abort_example)
+
+    def test_10_CheckConfig(self):
+        """!
+        Test passing 'show config' argument to ns3 to get the configuration table
+        @return None
+        """
+        return_code, stdout, stderr = run_ns3("show config")
+        self.assertEqual(return_code, 0)
+        self.assertIn("Summary of optional NS-3 features", stdout)
+
+    def test_11_CheckProfile(self):
+        """!
+        Test passing 'show profile' argument to ns3 to get the build profile
+        @return None
+        """
+        return_code, stdout, stderr = run_ns3("show profile")
+        self.assertEqual(return_code, 0)
+        self.assertIn("Build profile: default", stdout)
+
+    def test_12_CheckVersion(self):
+        """!
+        Test passing 'show version' argument to ns3 to get the build version
+        @return None
+        """
+        return_code, _, _ = run_ns3("configure -G \"Unix Makefiles\" --enable-build-version")
+        self.assertEqual(return_code, 0)
+
+        return_code, stdout, stderr = run_ns3("show version")
+        self.assertEqual(return_code, 0)
+        self.assertIn("ns-3 version:", stdout)
+
+    def test_13_Scratches(self):
+        """!
+        Test if CMake target names for scratches and ns3 shortcuts
+        are working correctly
+        @return None
+        """
+
+        test_files = ["scratch/main.cc",
+                      "scratch/empty.cc",
+                      "scratch/subdir1/main.cc",
+                      "scratch/subdir2/main.cc"]
+
+        # Create test scratch files
+        for path in test_files:
+            filepath = os.path.join(ns3_path, path)
+            os.makedirs(os.path.dirname(filepath), exist_ok=True)
+            with open(filepath, "w") as f:
+                if "main" in path:
+                    f.write("int main (int argc, char *argv[]){}")
+                else:
+                    # no main function will prevent this target from
+                    # being created, we should skip it and continue
+                    # processing without crashing
+                    f.write("")
+
+        # Reload the cmake cache to pick them up
+        return_code, stdout, stderr = run_ns3("configure -G \"Unix Makefiles\"")
+        self.assertEqual(return_code, 0)
+
+        # Try to build them with ns3 and cmake
+        for path in test_files:
+            path = path.replace(".cc", "")
+            return_code1, stdout1, stderr1 = run_program("cmake", "--build . --target %s"
+                                                         % path.replace("/", "_"),
+                                                         cwd=os.path.join(ns3_path, "cmake-cache"))
+            return_code2, stdout2, stderr2 = run_ns3("build %s" % path)
+            if "main" in path:
+                self.assertEqual(return_code1, 0)
+                self.assertEqual(return_code2, 0)
+            else:
+                self.assertEqual(return_code1, 2)
+                self.assertEqual(return_code2, 1)
+
+        # Try to run them
+        for path in test_files:
+            path = path.replace(".cc", "")
+            return_code, stdout, stderr = run_ns3("run %s --no-build" % path)
+            if "main" in path:
+                self.assertEqual(return_code, 0)
+            else:
+                self.assertEqual(return_code, 1)
+
+        # Delete the test files and reconfigure to clean them up
+        for path in test_files:
+            source_absolute_path = os.path.join(ns3_path, path)
+            os.remove(source_absolute_path)
+            if "empty" in path:
+                continue
+            filename = os.path.basename(path).replace(".cc", "")
+            executable_absolute_path = os.path.dirname(os.path.join(ns3_path, "build", path))
+            executable_name = list(filter(lambda x: filename in x,
+                                          os.listdir(executable_absolute_path)
+                                          )
+                                   )[0]
+
+            os.remove(os.path.join(executable_absolute_path, executable_name))
+            if path not in ["scratch/main.cc", "scratch/empty.cc"]:
+                os.rmdir(os.path.dirname(source_absolute_path))
+
+        return_code, stdout, stderr = run_ns3("configure -G \"Unix Makefiles\"")
+        self.assertEqual(return_code, 0)
+
+    def test_14_MpiCommandTemplate(self):
+        """!
+        Test if ns3 is inserting additional arguments by MPICH and OpenMPI to run on the CI
+        @return None
+        """
+        # Skip test if mpi is not installed
+        if shutil.which("mpiexec") is None:
+            return
+
+        # Ensure sample simulator was built
+        return_code, stdout, stderr = run_ns3("build sample-simulator")
+        self.assertEqual(return_code, 0)
+
+        # Get executable path
+        sample_simulator_path = list(filter(lambda x: "sample-simulator" in x, self.ns3_executables))[0]
+
+        mpi_command = "--dry-run run sample-simulator --command-template=\"mpiexec -np 2 %s\""
+        non_mpi_command = "--dry-run run sample-simulator --command-template=\"echo %s\""
+
+        # Get the commands to run sample-simulator in two processes with mpi
+        return_code, stdout, stderr = run_ns3(mpi_command)
+        self.assertEqual(return_code, 0)
+        self.assertIn("mpiexec -np 2 %s" % sample_simulator_path, stdout)
+
+        # Get the commands to run sample-simulator in two processes with mpi, now with the environment variable
+        return_code, stdout, stderr = run_ns3(mpi_command, env={"MPI_CI": "1"})
+        self.assertEqual(return_code, 0)
+        if shutil.which("ompi_info"):
+            self.assertIn("mpiexec --allow-run-as-root --oversubscribe -np 2 %s" % sample_simulator_path, stdout)
+        else:
+            self.assertIn("mpiexec --allow-run-as-root -np 2 %s" % sample_simulator_path, stdout)
+
+        # Now we repeat for the non-mpi command
+        return_code, stdout, stderr = run_ns3(non_mpi_command)
+        self.assertEqual(return_code, 0)
+        self.assertIn("echo %s" % sample_simulator_path, stdout)
+
+        # Again the non-mpi command, with the MPI_CI environment variable set
+        return_code, stdout, stderr = run_ns3(non_mpi_command, env={"MPI_CI": "1"})
+        self.assertEqual(return_code, 0)
+        self.assertIn("echo %s" % sample_simulator_path, stdout)
+
+    def test_15_InvalidLibrariesToLink(self):
+        """!
+        Test if CMake and ns3 fail in the expected ways when:
+        - examples from modules or general examples fail if they depend on a
+        library with a name shorter than 4 characters or are disabled when
+        a library is non-existant
+        - a module library passes the configuration but fails to build due to
+        a missing library
+        @return None
+        """
+        os.makedirs("contrib/borked", exist_ok=True)
+        os.makedirs("contrib/borked/examples", exist_ok=True)
+
+        # Test if configuration succeeds and building the module library fails
+        with open("contrib/borked/examples/CMakeLists.txt", "w") as f:
+            f.write("")
+        for invalid_or_non_existant_library in ["", "gsd", "lib", "libfi", "calibre"]:
+            with open("contrib/borked/CMakeLists.txt", "w") as f:
+                f.write("""
+                        build_lib(
+                            LIBNAME borked
+                            SOURCE_FILES ${PROJECT_SOURCE_DIR}/build-support/empty.cc
+                            LIBRARIES_TO_LINK ${libcore} %s
+                        )
+                        """ % invalid_or_non_existant_library)
+
+            return_code, stdout, stderr = run_ns3("configure -G \"Unix Makefiles\" --enable-examples")
+            if invalid_or_non_existant_library in ["", "gsd", "libfi", "calibre"]:
+                self.assertEqual(return_code, 0)
+            elif invalid_or_non_existant_library in ["lib"]:
+                self.assertEqual(return_code, 1)
+                self.assertIn("Invalid library name: %s" % invalid_or_non_existant_library, stderr)
+            else:
+                pass
+
+            return_code, stdout, stderr = run_ns3("build borked")
+            if invalid_or_non_existant_library in [""]:
+                self.assertEqual(return_code, 0)
+            elif invalid_or_non_existant_library in ["lib"]:
+                self.assertEqual(return_code, 2)  # should fail due to invalid library name
+                self.assertIn("Invalid library name: %s" % invalid_or_non_existant_library, stderr)
+            elif invalid_or_non_existant_library in ["gsd", "libfi", "calibre"]:
+                self.assertEqual(return_code, 2)  # should fail due to missing library
+                self.assertIn("cannot find -l%s" % invalid_or_non_existant_library, stderr)
+            else:
+                pass
+
+        # Now test if the example can be built with:
+        # - no additional library (should work)
+        # - invalid library names (should fail to configure)
+        # - valid library names but inexistent libraries (should not create a target)
+        with open("contrib/borked/CMakeLists.txt", "w") as f:
+            f.write("""
+                    build_lib(
+                        LIBNAME borked
+                        SOURCE_FILES ${PROJECT_SOURCE_DIR}/build-support/empty.cc
+                        LIBRARIES_TO_LINK ${libcore}
+                    )
+                    """)
+        for invalid_or_non_existant_library in ["", "gsd", "lib", "libfi", "calibre"]:
+            with open("contrib/borked/examples/CMakeLists.txt", "w") as f:
+                f.write("""
+                        build_lib_example(
+                            NAME borked-example
+                            SOURCE_FILES ${PROJECT_SOURCE_DIR}/build-support/empty-main.cc
+                            LIBRARIES_TO_LINK ${libborked} %s
+                        )
+                        """ % invalid_or_non_existant_library)
+
+            return_code, stdout, stderr = run_ns3("configure -G \"Unix Makefiles\"")
+            if invalid_or_non_existant_library in ["", "gsd", "libfi", "calibre"]:
+                self.assertEqual(return_code, 0)  # should be able to configure
+            elif invalid_or_non_existant_library in ["lib"]:
+                self.assertEqual(return_code, 1)  # should fail to even configure
+                self.assertIn("Invalid library name: %s" % invalid_or_non_existant_library, stderr)
+            else:
+                pass
+
+            return_code, stdout, stderr = run_ns3("build borked-example")
+            if invalid_or_non_existant_library in [""]:
+                self.assertEqual(return_code, 0)  # should be able to build
+            elif invalid_or_non_existant_library in ["libf"]:
+                self.assertEqual(return_code, 2)  # should fail due to missing configuration
+                self.assertIn("Invalid library name: %s" % invalid_or_non_existant_library, stderr)
+            elif invalid_or_non_existant_library in ["gsd", "libfi", "calibre"]:
+                self.assertEqual(return_code, 1)  # should fail to find target
+                self.assertIn("Target to build does not exist: borked-example", stdout)
+            else:
+                pass
+
+        shutil.rmtree("contrib/borked", ignore_errors=True)
+
+    def test_16_LibrariesContainingLib(self):
+        """!
+        Test if CMake can properly handle modules containing "lib",
+        which is used internally as a prefix for module libraries
+        @return None
+        """
+
+        os.makedirs("contrib/calibre", exist_ok=True)
+        os.makedirs("contrib/calibre/examples", exist_ok=True)
+
+        # Now test if we can have a library with "lib" in it
+        with open("contrib/calibre/examples/CMakeLists.txt", "w") as f:
+            f.write("")
+        with open("contrib/calibre/CMakeLists.txt", "w") as f:
+            f.write("""
+                build_lib(
+                    LIBNAME calibre
+                    SOURCE_FILES ${PROJECT_SOURCE_DIR}/build-support/empty.cc
+                    LIBRARIES_TO_LINK ${libcore}
+                )
+                """)
+
+        return_code, stdout, stderr = run_ns3("configure -G \"Unix Makefiles\"")
+
+        # This only checks if configuration passes
+        self.assertEqual(return_code, 0)
+
+        # This checks if the contrib modules were printed correctly
+        self.assertIn("calibre", stdout)
+
+        # This checks not only if "lib" from "calibre" was incorrectly removed,
+        # but also if the pkgconfig file was generated with the correct name
+        self.assertNotIn("care", stdout)
+        self.assertTrue(os.path.exists(os.path.join(ns3_path, "cmake-cache", "pkgconfig", "ns3-calibre.pc")))
+
+        # Check if we can build this library
+        return_code, stdout, stderr = run_ns3("build calibre")
+        self.assertEqual(return_code, 0)
+        self.assertIn(cmake_build_target_command(target="libcalibre"), stdout)
+
+        shutil.rmtree("contrib/calibre", ignore_errors=True)
+
+    def test_17_CMakePerformanceTracing(self):
+        """!
+        Test if CMake performance tracing works and produces the
+        cmake_performance_trace.log file
+        @return None
+        """
+        return_code, stdout, stderr = run_ns3("configure --trace-performance")
+        self.assertEqual(return_code, 0)
+        self.assertIn("--profiling-format=google-trace --profiling-output=../cmake_performance_trace.log", stdout)
+        self.assertTrue(os.path.exists(os.path.join(ns3_path, "cmake_performance_trace.log")))
+
+
+class NS3BuildBaseTestCase(NS3BaseTestCase):
+    """!
+    Tests ns3 regarding building the project
+    """
+
+    ## when cleaned_once is False, clean up build artifacts and reconfigure
+    cleaned_once = False
+
+    def setUp(self):
+        """!
+        Reuse cleaning/release configuration from NS3BaseTestCase if flag is cleaned
+        @return None
+        """
+        if not NS3BuildBaseTestCase.cleaned_once:
+            NS3BuildBaseTestCase.cleaned_once = True
+            NS3BaseTestCase.cleaned_once = False
+        super().setUp()
+
+        self.ns3_libraries = get_libraries_list()
+
+    def test_01_BuildExistingTargets(self):
+        """!
+        Try building the core library
+        @return None
+        """
+        return_code, stdout, stderr = run_ns3("build core")
+        self.assertEqual(return_code, 0)
+        self.assertIn("Built target libcore", stdout)
+
+    def test_02_BuildNonExistingTargets(self):
+        """!
+        Try building core-test library without tests enabled
+        @return None
+        """
+        # tests are not enabled, so the target isn't available
+        return_code, stdout, stderr = run_ns3("build core-test")
+        self.assertEqual(return_code, 1)
+        self.assertIn("Target to build does not exist: core-test", stdout)
+
+    def test_03_BuildProject(self):
+        """!
+        Try building the project:
+        @return None
+        """
+        return_code, stdout, stderr = run_ns3("build")
+        self.assertEqual(return_code, 0)
+        self.assertIn("Built target", stdout)
+        for program in get_programs_list():
+            self.assertTrue(os.path.exists(program))
+        self.assertIn(cmake_build_project_command, stdout)
+
+    def test_04_BuildProjectNoTaskLines(self):
+        """!
+        Try hiding task lines
+        @return None
+        """
+        return_code, stdout, stderr = run_ns3("--quiet build")
+        self.assertEqual(return_code, 0)
+        self.assertIn(cmake_build_project_command, stdout)
+
+    def test_05_BreakBuild(self):
+        """!
+        Try removing an essential file to break the build
+        @return None
+        """
+        # change an essential file to break the build.
+        attribute_cc_path = os.sep.join([ns3_path, "src", "core", "model", "attribute.cc"])
+        attribute_cc_bak_path = attribute_cc_path + ".bak"
+        shutil.move(attribute_cc_path, attribute_cc_bak_path)
+
+        # build should break.
+        return_code, stdout, stderr = run_ns3("build")
+        self.assertNotEqual(return_code, 0)
+
+        # move file back.
+        shutil.move(attribute_cc_bak_path, attribute_cc_path)
+
+        # build should work again.
+        return_code, stdout, stderr = run_ns3("build")
+        self.assertEqual(return_code, 0)
+
+    def test_06_TestVersionFile(self):
+        """!
+        Test if changing the version file affects the library names
+        @return None
+        """
+        version_file = os.sep.join([ns3_path, "VERSION"])
+        with open(version_file, "w") as f:
+            f.write("3-00\n")
+
+        # Reconfigure.
+        return_code, stdout, stderr = run_ns3("configure -G \"Unix Makefiles\"")
+        self.config_ok(return_code, stdout)
+
+        # Build.
+        return_code, stdout, stderr = run_ns3("build")
+        self.assertEqual(return_code, 0)
+        self.assertIn("Built target", stdout)
+
+        # Programs with new versions.
+        new_programs = get_programs_list()
+
+        # Check if they exist.
+        for program in new_programs:
+            self.assertTrue(os.path.exists(program))
+
+        # Check if we still have the same number of binaries.
+        self.assertEqual(len(new_programs), len(self.ns3_executables))
+
+        # Check if versions changed from 3-dev to 3-00.
+        libraries = get_libraries_list()
+        new_libraries = list(set(libraries).difference(set(self.ns3_libraries)))
+        self.assertEqual(len(new_libraries), len(self.ns3_libraries))
+        for library in new_libraries:
+            self.assertNotIn("libns3-dev", library)
+            self.assertIn("libns3-00", library)
+            self.assertTrue(os.path.exists(library))
+
+        # Restore version file.
+        with open(version_file, "w") as f:
+            f.write("3-dev\n")
+
+        # Reset flag to let it clean the build.
+        NS3BuildBaseTestCase.cleaned_once = False
+
+    def test_07_OutputDirectory(self):
+        """!
+        Try setting a different output directory and if everything is
+        in the right place and still working correctly
+        @return None
+        """
+        # Re-build to return to the original state.
+        run_ns3("build")
+
+        ## ns3_libraries holds a list of built module libraries
+        self.ns3_libraries = get_libraries_list()
+
+        ## ns3_executables holds a list of executables in .lock-ns3
+        self.ns3_executables = get_programs_list()
+
+        # Delete built programs and libraries to check if they were restored later.
+        for program in self.ns3_executables:
+            os.remove(program)
+        for library in self.ns3_libraries:
+            os.remove(library)
+
+        # Reconfigure setting the output folder to ns-3-dev/build/release (both as an absolute path or relative).
+        absolute_path = os.sep.join([ns3_path, "build", "release"])
+        relative_path = os.sep.join(["build", "release"])
+        for different_out_dir in [absolute_path, relative_path]:
+            return_code, stdout, stderr = run_ns3("configure -G \"Unix Makefiles\" --out=%s" % different_out_dir)
+            self.config_ok(return_code, stdout)
+            self.assertIn("Build directory               : %s" % absolute_path, stdout)
+
+            # Build
+            run_ns3("build")
+
+            # Check if we have the same number of binaries and that they were built correctly.
+            new_programs = get_programs_list()
+            self.assertEqual(len(new_programs), len(self.ns3_executables))
+            for program in new_programs:
+                self.assertTrue(os.path.exists(program))
+
+            # Check if we have the same number of libraries and that they were built correctly.
+            libraries = get_libraries_list(os.sep.join([absolute_path, "lib"]))
+            new_libraries = list(set(libraries).difference(set(self.ns3_libraries)))
+            self.assertEqual(len(new_libraries), len(self.ns3_libraries))
+            for library in new_libraries:
+                self.assertTrue(os.path.exists(library))
+
+            # Remove files in the different output dir.
+            shutil.rmtree(absolute_path)
+
+        # Restore original output directory.
+        return_code, stdout, stderr = run_ns3("configure -G \"Unix Makefiles\" --out=''")
+        self.config_ok(return_code, stdout)
+        self.assertIn("Build directory               : %s" % usual_outdir, stdout)
+
+        # Try re-building.
+        run_ns3("build")
+
+        # Check if we have the same binaries we had at the beginning.
+        new_programs = get_programs_list()
+        self.assertEqual(len(new_programs), len(self.ns3_executables))
+        for program in new_programs:
+            self.assertTrue(os.path.exists(program))
+
+        # Check if we have the same libraries we had at the beginning.
+        libraries = get_libraries_list()
+        self.assertEqual(len(libraries), len(self.ns3_libraries))
+        for library in libraries:
+            self.assertTrue(os.path.exists(library))
+
+    def test_08_InstallationAndUninstallation(self):
+        """!
+        Tries setting a ns3 version, then installing it.
+        After that, tries searching for ns-3 with CMake's find_package(ns3).
+        Finally, tries using core library in a 3rd-party project
+        @return None
+        """
+        # Remove existing libraries from the previous step.
+        libraries = get_libraries_list()
+        for library in libraries:
+            os.remove(library)
+
+        # 3-dev version format is not supported by CMake, so we use 3.01.
+        version_file = os.sep.join([ns3_path, "VERSION"])
+        with open(version_file, "w") as f:
+            f.write("3-01\n")
+
+        # Reconfigure setting the installation folder to ns-3-dev/build/install.
+        install_prefix = os.sep.join([ns3_path, "build", "install"])
+        return_code, stdout, stderr = run_ns3("configure -G \"Unix Makefiles\" --prefix=%s" % install_prefix)
+        self.config_ok(return_code, stdout)
+
+        # Build.
+        run_ns3("build")
+        libraries = get_libraries_list()
+        headers = get_headers_list()
+
+        # Install.
+        run_ns3("install")
+
+        # Find out if libraries were installed to lib or lib64 (Fedora thing).
+        lib64 = os.path.exists(os.sep.join([install_prefix, "lib64"]))
+        installed_libdir = os.sep.join([install_prefix, ("lib64" if lib64 else "lib")])
+
+        # Make sure all libraries were installed.
+        installed_libraries = get_libraries_list(installed_libdir)
+        installed_libraries_list = ";".join(installed_libraries)
+        for library in libraries:
+            library_name = os.path.basename(library)
+            self.assertIn(library_name, installed_libraries_list)
+
+        # Make sure all headers were installed.
+        installed_headers = get_headers_list(install_prefix)
+        missing_headers = list(set([os.path.basename(x) for x in headers])
+                               - (set([os.path.basename(x) for x in installed_headers]))
+                               )
+        self.assertEqual(len(missing_headers), 0)
+
+        # Now create a test CMake project and try to find_package ns-3.
+        test_main_file = os.sep.join([install_prefix, "main.cpp"])
+        with open(test_main_file, "w") as f:
+            f.write("""
+            #include <ns3/core-module.h>
+            using namespace ns3;
+            int main ()
+            {
+                Simulator::Stop (Seconds (1.0));
+                Simulator::Run ();
+                Simulator::Destroy ();
+                return 0;
+            }
+            """)
+
+        # We try to use this library without specifying a version,
+        # specifying ns3-01 (text version with 'dev' is not supported)
+        # and specifying ns3-00 (a wrong version)
+        for version in ["", "3.01", "3.00"]:
+            find_package_import = """
+                                  list(APPEND CMAKE_PREFIX_PATH ./{lib}/cmake/ns3)
+                                  find_package(ns3 {version} COMPONENTS libcore)
+                                  target_link_libraries(test PRIVATE ns3::libcore)
+                                  """.format(lib=("lib64" if lib64 else "lib"), version=version)
+            pkgconfig_import = """
+                               list(APPEND CMAKE_PREFIX_PATH ./)
+                               include(FindPkgConfig)
+                               pkg_check_modules(ns3 REQUIRED IMPORTED_TARGET ns3-core{version})
+                               target_link_libraries(test PUBLIC PkgConfig::ns3)
+                               """.format(lib=("lib64" if lib64 else "lib"),
+                                          version="=" + version if version else ""
+                                          )
+
+            for import_type in [pkgconfig_import, find_package_import]:
+                test_cmake_project = """
+                                     cmake_minimum_required(VERSION 3.10..3.10)
+                                     project(ns3_consumer CXX)
+                                     add_executable(test main.cpp)
+                                     """ + import_type
+
+                test_cmake_project_file = os.sep.join([install_prefix, "CMakeLists.txt"])
+                with open(test_cmake_project_file, "w") as f:
+                    f.write(test_cmake_project)
+
+                # Configure the test project
+                cmake = shutil.which("cmake")
+                return_code, stdout, stderr = run_program(cmake,
+                                                          "-DCMAKE_BUILD_TYPE=debug .",
+                                                          cwd=install_prefix)
+                if version == "3.00":
+                    self.assertEqual(return_code, 1)
+                    if import_type == find_package_import:
+                        self.assertIn('Could not find a configuration file for package "ns3" that is compatible',
+                                      stderr.replace("\n", ""))
+                    elif import_type == pkgconfig_import:
+                        self.assertIn('A required package was not found',
+                                      stderr.replace("\n", ""))
+                    else:
+                        raise Exception("Unknown import type")
+                else:
+                    self.assertEqual(return_code, 0)
+                    self.assertIn("Build files", stdout)
+
+                # Build the test project making use of import ns-3
+                return_code, stdout, stderr = run_program("cmake", "--build .", cwd=install_prefix)
+
+                if version == "3.00":
+                    self.assertEqual(return_code, 2)
+                    self.assertGreater(len(stderr), 0)
+                else:
+                    self.assertEqual(return_code, 0)
+                    self.assertIn("Built target", stdout)
+
+                    # Try running the test program that imports ns-3
+                    return_code, stdout, stderr = run_program("./test", "", cwd=install_prefix)
+                    self.assertEqual(return_code, 0)
+
+        # Uninstall
+        return_code, stdout, stderr = run_ns3("uninstall")
+        self.assertIn("Built target uninstall", stdout)
+
+        # Restore 3-dev version file
+        with open(version_file, "w") as f:
+            f.write("3-dev\n")
+
+        # Reset flag to let it clean the build
+        NS3BuildBaseTestCase.cleaned_once = False
+
+    def test_09_Scratches(self):
+        """!
+        Tries to build scratch-simulator and subdir/scratch-simulator-subdir
+        @return None
+        """
+        # Build.
+        targets = {"scratch/scratch-simulator": "scratch-simulator",
+                   "scratch/scratch-simulator.cc": "scratch-simulator",
+                   "scratch-simulator": "scratch-simulator",
+                   "scratch/subdir/scratch-simulator-subdir": "subdir_scratch-simulator-subdir",
+                   "subdir/scratch-simulator-subdir": "subdir_scratch-simulator-subdir",
+                   "scratch-simulator-subdir": "subdir_scratch-simulator-subdir",
+                   }
+        for (target_to_run, target_cmake) in targets.items():
+            # Test if build is working.
+            build_line = "target scratch_%s" % target_cmake
+            return_code, stdout, stderr = run_ns3("build %s" % target_to_run)
+            self.assertEqual(return_code, 0)
+            self.assertIn(build_line, stdout)
+
+            # Test if run is working
+            return_code, stdout, stderr = run_ns3("run %s --verbose" % target_to_run)
+            self.assertEqual(return_code, 0)
+            self.assertIn(build_line, stdout)
+            stdout = stdout.replace("scratch_%s" % target_cmake, "")  # remove build lines
+            self.assertIn(target_to_run.split("/")[-1].replace(".cc", ""), stdout)
+
+        NS3BuildBaseTestCase.cleaned_once = False
+
+    def test_10_PybindgenBindings(self):
+        """!
+        Test if cmake is calling pybindgen through modulegen to generate
+        the bindings source files correctly
+        @return None
+        """
+
+        # Skip this test if pybindgen is not available
+        try:
+            import pybindgen
+        except Exception:
+            self.skipTest("Pybindgen is not available")
+
+        # Check if the number of runnable python scripts is equal to 0
+        python_scripts = read_lock_entry("ns3_runnable_scripts")
+        self.assertEqual(len(python_scripts), 0)
+
+        # First we enable python bindings
+        return_code, stdout, stderr = run_ns3("configure -G \"Unix Makefiles\" --enable-examples --enable-tests --enable-python-bindings")
+        self.assertEqual(return_code, 0)
+
+        # Then look for python bindings sources
+        core_bindings_generated_sources_path = os.path.join(ns3_path, "build", "src", "core", "bindings")
+        core_bindings_sources_path = os.path.join(ns3_path, "src", "core", "bindings")
+        core_bindings_path = os.path.join(ns3_path, "build", "bindings", "python", "ns")
+        core_bindings_header = os.path.join(core_bindings_generated_sources_path, "ns3module.h")
+        core_bindings_source = os.path.join(core_bindings_generated_sources_path, "ns3module.cc")
+        self.assertTrue(os.path.exists(core_bindings_header))
+        self.assertTrue(os.path.exists(core_bindings_source))
+
+        # Then try to build the bindings for the core module
+        return_code, stdout, stderr = run_ns3("build core-bindings")
+        self.assertEqual(return_code, 0)
+
+        # Then check if it was built
+        self.assertGreater(len(list(filter(lambda x: "_core" in x, os.listdir(core_bindings_path)))), 0)
+
+        # Now enable python bindings scanning
+        return_code, stdout, stderr = run_ns3("configure -G \"Unix Makefiles\" -- -DNS3_SCAN_PYTHON_BINDINGS=ON")
+        self.assertEqual(return_code, 0)
+
+        # Get the file status for the current scanned bindings
+        bindings_sources = os.listdir(core_bindings_sources_path)
+        bindings_sources = [os.path.join(core_bindings_sources_path, y) for y in bindings_sources]
+        timestamps = {}
+        [timestamps.update({x: os.stat(x)}) for x in bindings_sources]
+
+        # Try to scan the bindings for the core module
+        return_code, stdout, stderr = run_ns3("build core-apiscan")
+        self.assertEqual(return_code, 0)
+
+        # Check if they exist, are not empty and have a different timestamp
+        generated_python_files = ["callbacks_list.py", "modulegen__gcc_LP64.py"]
+        for binding_file in timestamps.keys():
+            if os.path.basename(binding_file) in generated_python_files:
+                self.assertTrue(os.path.exists(binding_file))
+                self.assertGreater(os.stat(binding_file).st_size, 0)
+                new_fstat = os.stat(binding_file)
+                self.assertNotEqual(timestamps[binding_file].st_mtime, new_fstat.st_mtime)
+
+        # Then delete the old bindings sources
+        for f in os.listdir(core_bindings_generated_sources_path):
+            os.remove(os.path.join(core_bindings_generated_sources_path, f))
+
+        # Reconfigure to recreate the source files
+        return_code, stdout, stderr = run_ns3("configure -G \"Unix Makefiles\"")
+        self.assertEqual(return_code, 0)
+
+        # Check again if they exist
+        self.assertTrue(os.path.exists(core_bindings_header))
+        self.assertTrue(os.path.exists(core_bindings_source))
+
+        # Build the core bindings again
+        return_code, stdout, stderr = run_ns3("build core-bindings")
+        self.assertEqual(return_code, 0)
+
+        # Then check if it was built
+        self.assertGreater(len(list(filter(lambda x: "_core" in x, os.listdir(core_bindings_path)))), 0)
+
+        # We are on python anyway, so we can just try to load it from here
+        sys.path.insert(0, os.path.join(core_bindings_path, ".."))
+        try:
+            from ns import core
+        except ImportError:
+            self.assertTrue(True)
+
+        # Check if ns3 can find and run the python example
+        return_code, stdout, stderr = run_ns3("run sample-simulator.py")
+        self.assertEqual(return_code, 0)
+
+        # Check if test.py can find and run the python example
+        return_code, stdout, stderr = run_program("./test.py", "-p src/core/examples/sample-simulator.py", python=True)
+        self.assertEqual(return_code, 0)
+
+        # Since python examples do not require recompilation,
+        # test if we still can run the python examples after disabling examples
+        return_code, stdout, stderr = run_ns3("configure -G \"Unix Makefiles\" --disable-examples")
+        self.assertEqual(return_code, 0)
+
+        # Check if the lock file has python runnable python scripts (it should)
+        python_scripts = read_lock_entry("ns3_runnable_scripts")
+        self.assertGreater(len(python_scripts), 0)
+
+        # Try to run an example
+        return_code, stdout, stderr = run_ns3("run sample-simulator.py")
+        self.assertEqual(return_code, 0)
+
+        NS3BuildBaseTestCase.cleaned_once = False
+
+    def test_11_AmbiguityCheck(self):
+        """!
+        Test if ns3 can alert correctly in case a shortcut collision happens
+        @return None
+        """
+
+        # First enable examples
+        return_code, stdout, stderr = run_ns3("configure -G \"Unix Makefiles\" --enable-examples")
+        self.assertEqual(return_code, 0)
+
+        # Copy second.cc from the tutorial examples to the scratch folder
+        shutil.copy("./examples/tutorial/second.cc", "./scratch/second.cc")
+
+        # Reconfigure to re-scan the scratches
+        return_code, stdout, stderr = run_ns3("configure -G \"Unix Makefiles\" --enable-examples")
+        self.assertEqual(return_code, 0)
+
+        # Try to run second and collide
+        return_code, stdout, stderr = run_ns3("build second")
+        self.assertEqual(return_code, 1)
+        self.assertIn(
+            'Build target "second" is ambiguous. Try one of these: "scratch/second", "examples/tutorial/second"',
+            stdout
+        )
+
+        # Try to run scratch/second and succeed
+        return_code, stdout, stderr = run_ns3("build scratch/second")
+        self.assertEqual(return_code, 0)
+        self.assertIn(cmake_build_target_command(target="scratch_second"), stdout)
+
+        # Try to run scratch/second and succeed
+        return_code, stdout, stderr = run_ns3("build tutorial/second")
+        self.assertEqual(return_code, 0)
+        self.assertIn(cmake_build_target_command(target="second"), stdout)
+
+        # Try to run second and collide
+        return_code, stdout, stderr = run_ns3("run second")
+        self.assertEqual(return_code, 1)
+        self.assertIn(
+            'Run target "second" is ambiguous. Try one of these: "scratch/second", "examples/tutorial/second"',
+            stdout
+        )
+
+        # Try to run scratch/second and succeed
+        return_code, stdout, stderr = run_ns3("run scratch/second")
+        self.assertEqual(return_code, 0)
+
+        # Try to run scratch/second and succeed
+        return_code, stdout, stderr = run_ns3("run tutorial/second")
+        self.assertEqual(return_code, 0)
+
+        # Remove second
+        os.remove("./scratch/second.cc")
+
+
+class NS3ExpectedUseTestCase(NS3BaseTestCase):
+    """!
+    Tests ns3 usage in more realistic scenarios
+    """
+
+    ## when cleaned_once is False, clean up build artifacts and reconfigure
+    cleaned_once = False
+
+    def setUp(self):
+        """!
+        Reuse cleaning/release configuration from NS3BaseTestCase if flag is cleaned
+        Here examples, tests and documentation are also enabled.
+        @return None
+        """
+        if not NS3ExpectedUseTestCase.cleaned_once:
+            NS3ExpectedUseTestCase.cleaned_once = True
+            NS3BaseTestCase.cleaned_once = False
+            super().setUp()
+
+            # On top of the release build configured by NS3ConfigureTestCase, also enable examples, tests and docs.
+            return_code, stdout, stderr = run_ns3("configure -G \"Unix Makefiles\" --enable-examples --enable-tests")
+            self.config_ok(return_code, stdout)
+
+        # Check if .lock-ns3 exists, then read to get list of executables.
+        self.assertTrue(os.path.exists(ns3_lock_filename))
+
+        ## ns3_executables holds a list of executables in .lock-ns3
+        self.ns3_executables = get_programs_list()
+
+        # Check if .lock-ns3 exists than read to get the list of enabled modules.
+        self.assertTrue(os.path.exists(ns3_lock_filename))
+
+        ## ns3_modules holds a list to the modules enabled stored in .lock-ns3
+        self.ns3_modules = get_enabled_modules()
+
+    def test_01_BuildProject(self):
+        """!
+        Try to build the project
+        @return None
+        """
+        return_code, stdout, stderr = run_ns3("build")
+        self.assertEqual(return_code, 0)
+        self.assertIn("Built target", stdout)
+        for program in get_programs_list():
+            self.assertTrue(os.path.exists(program))
+        libraries = get_libraries_list()
+        for module in get_enabled_modules():
+            self.assertIn(module.replace("ns3-", ""), ";".join(libraries))
+        self.assertIn(cmake_build_project_command, stdout)
+
+    def test_02_BuildAndRunExistingExecutableTarget(self):
+        """!
+        Try to build and run test-runner
+        @return None
+        """
+        return_code, stdout, stderr = run_ns3('run "test-runner --list" --verbose')
+        self.assertEqual(return_code, 0)
+        self.assertIn("Built target test-runner", stdout)
+        self.assertIn(cmake_build_target_command(target="test-runner"), stdout)
+
+    def test_03_BuildAndRunExistingLibraryTarget(self):
+        """!
+        Try to build and run a library
+        @return None
+        """
+        return_code, stdout, stderr = run_ns3("run core")  # this should not work
+        self.assertEqual(return_code, 1)
+        self.assertIn("Couldn't find the specified program: core", stderr)
+
+    def test_04_BuildAndRunNonExistingTarget(self):
+        """!
+        Try to build and run an unknown target
+        @return None
+        """
+        return_code, stdout, stderr = run_ns3("run nonsense")  # this should not work
+        self.assertEqual(return_code, 1)
+        self.assertIn("Couldn't find the specified program: nonsense", stderr)
+
+    def test_05_RunNoBuildExistingExecutableTarget(self):
+        """!
+        Try to run test-runner without building
+        @return None
+        """
+        return_code, stdout, stderr = run_ns3('run "test-runner --list" --no-build --verbose')
+        self.assertEqual(return_code, 0)
+        self.assertNotIn("Built target test-runner", stdout)
+        self.assertNotIn(cmake_build_target_command(target="test-runner"), stdout)
+
+    def test_06_RunNoBuildExistingLibraryTarget(self):
+        """!
+        Test ns3 fails to run a library
+        @return None
+        """
+        return_code, stdout, stderr = run_ns3("run core --no-build")  # this should not work
+        self.assertEqual(return_code, 1)
+        self.assertIn("Couldn't find the specified program: core", stderr)
+
+    def test_07_RunNoBuildNonExistingExecutableTarget(self):
+        """!
+        Test ns3 fails to run an unknown program
+        @return None
+        """
+        return_code, stdout, stderr = run_ns3("run nonsense --no-build")  # this should not work
+        self.assertEqual(return_code, 1)
+        self.assertIn("Couldn't find the specified program: nonsense", stderr)
+
+    def test_08_RunNoBuildGdb(self):
+        """!
+        Test if scratch simulator is executed through gdb and lldb
+        @return None
+        """
+        if shutil.which("gdb") is None:
+            self.skipTest("Missing gdb")
+
+        return_code, stdout, stderr = run_ns3("run scratch-simulator --gdb --verbose --no-build")
+        self.assertEqual(return_code, 0)
+        self.assertIn("scratch-simulator", stdout)
+        self.assertIn("No debugging symbols found", stdout)
+
+    def test_09_RunNoBuildValgrind(self):
+        """!
+        Test if scratch simulator is executed through valgrind
+        @return None
+        """
+        if shutil.which("valgrind") is None:
+            self.skipTest("Missing valgrind")
+
+        return_code, stdout, stderr = run_ns3("run scratch-simulator --valgrind --verbose --no-build")
+        self.assertEqual(return_code, 0)
+        self.assertIn("scratch-simulator", stderr)
+        self.assertIn("Memcheck", stderr)
+
+    def test_10_DoxygenWithBuild(self):
+        """!
+        Test the doxygen target that does trigger a full build
+        @return None
+        """
+        if shutil.which("doxygen") is None:
+            self.skipTest("Missing doxygen")
+
+        doc_folder = os.path.abspath(os.sep.join([".", "doc"]))
+
+        doxygen_files = ["introspected-command-line.h", "introspected-doxygen.h"]
+        for filename in doxygen_files:
+            file_path = os.sep.join([doc_folder, filename])
+            if os.path.exists(file_path):
+                os.remove(file_path)
+
+        # Rebuilding dot images is super slow, so not removing doxygen products
+        # doxygen_build_folder = os.sep.join([doc_folder, "html"])
+        # if os.path.exists(doxygen_build_folder):
+        #     shutil.rmtree(doxygen_build_folder)
+
+        return_code, stdout, stderr = run_ns3("docs doxygen")
+        self.assertEqual(return_code, 0)
+        self.assertIn(cmake_build_target_command(target="doxygen"), stdout)
+        self.assertIn("Built target doxygen", stdout)
+
+    def test_11_DoxygenWithoutBuild(self):
+        """!
+        Test the doxygen target that doesn't trigger a full build
+        @return None
+        """
+        if shutil.which("doxygen") is None:
+            self.skipTest("Missing doxygen")
+
+        # Rebuilding dot images is super slow, so not removing doxygen products
+        # doc_folder = os.path.abspath(os.sep.join([".", "doc"]))
+        # doxygen_build_folder = os.sep.join([doc_folder, "html"])
+        # if os.path.exists(doxygen_build_folder):
+        #     shutil.rmtree(doxygen_build_folder)
+
+        return_code, stdout, stderr = run_ns3("docs doxygen-no-build")
+        self.assertEqual(return_code, 0)
+        self.assertIn(cmake_build_target_command(target="doxygen-no-build"), stdout)
+        self.assertIn("Built target doxygen-no-build", stdout)
+
+    def test_12_SphinxDocumentation(self):
+        """!
+        Test every individual target for Sphinx-based documentation
+        @return None
+        """
+        if shutil.which("sphinx-build") is None:
+            self.skipTest("Missing sphinx")
+
+        doc_folder = os.path.abspath(os.sep.join([".", "doc"]))
+
+        # For each sphinx doc target.
+        for target in ["contributing", "manual", "models", "tutorial"]:
+            # First we need to clean old docs, or it will not make any sense.
+            doc_build_folder = os.sep.join([doc_folder, target, "build"])
+            doc_temp_folder = os.sep.join([doc_folder, target, "source-temp"])
+            if os.path.exists(doc_build_folder):
+                shutil.rmtree(doc_build_folder)
+            if os.path.exists(doc_temp_folder):
+                shutil.rmtree(doc_temp_folder)
+
+            # Build
+            return_code, stdout, stderr = run_ns3("docs %s" % target)
+            self.assertEqual(return_code, 0)
+            self.assertIn(cmake_build_target_command(target="sphinx_%s" % target), stdout)
+            self.assertIn("Built target sphinx_%s" % target, stdout)
+
+            # Check if the docs output folder exists
+            doc_build_folder = os.sep.join([doc_folder, target, "build"])
+            self.assertTrue(os.path.exists(doc_build_folder))
+
+            # Check if the all the different types are in place (latex, split HTML and single page HTML)
+            for build_type in ["latex", "html", "singlehtml"]:
+                self.assertTrue(os.path.exists(os.sep.join([doc_build_folder, build_type])))
+
+    def test_13_Documentation(self):
+        """!
+        Test the documentation target that builds
+        both doxygen and sphinx based documentation
+        @return None
+        """
+        if shutil.which("doxygen") is None:
+            self.skipTest("Missing doxygen")
+        if shutil.which("sphinx-build") is None:
+            self.skipTest("Missing sphinx")
+
+        doc_folder = os.path.abspath(os.sep.join([".", "doc"]))
+
+        # First we need to clean old docs, or it will not make any sense.
+
+        # Rebuilding dot images is super slow, so not removing doxygen products
+        # doxygen_build_folder = os.sep.join([doc_folder, "html"])
+        # if os.path.exists(doxygen_build_folder):
+        #     shutil.rmtree(doxygen_build_folder)
+
+        for target in ["manual", "models", "tutorial"]:
+            doc_build_folder = os.sep.join([doc_folder, target, "build"])
+            if os.path.exists(doc_build_folder):
+                shutil.rmtree(doc_build_folder)
+
+        return_code, stdout, stderr = run_ns3("docs all")
+        self.assertEqual(return_code, 0)
+        self.assertIn(cmake_build_target_command(target="sphinx"), stdout)
+        self.assertIn("Built target sphinx", stdout)
+        self.assertIn(cmake_build_target_command(target="doxygen"), stdout)
+        self.assertIn("Built target doxygen", stdout)
+
+    def test_14_EnableSudo(self):
+        """!
+        Try to set ownership of scratch-simulator from current user to root,
+        and change execution permissions
+        @return None
+        """
+
+        # Test will be skipped if not defined
+        sudo_password = os.getenv("SUDO_PASSWORD", None)
+
+        # Skip test if variable containing sudo password is the default value
+        if sudo_password is None:
+            self.skipTest("SUDO_PASSWORD environment variable was not specified")
+
+        enable_sudo = read_lock_entry("ENABLE_SUDO")
+        self.assertFalse(enable_sudo is True)
+
+        # First we run to ensure the program was built
+        return_code, stdout, stderr = run_ns3('run scratch-simulator')
+        self.assertEqual(return_code, 0)
+        self.assertIn("Built target scratch_scratch-simulator", stdout)
+        self.assertIn(cmake_build_target_command(target="scratch_scratch-simulator"), stdout)
+        scratch_simulator_path = list(filter(lambda x: x if "scratch-simulator" in x else None,
+                                             self.ns3_executables
+                                             )
+                                      )[-1]
+        prev_fstat = os.stat(scratch_simulator_path)  # we get the permissions before enabling sudo
+
+        # Now try setting the sudo bits from the run subparser
+        return_code, stdout, stderr = run_ns3('run scratch-simulator --enable-sudo',
+                                              env={"SUDO_PASSWORD": sudo_password})
+        self.assertEqual(return_code, 0)
+        self.assertIn("Built target scratch_scratch-simulator", stdout)
+        self.assertIn(cmake_build_target_command(target="scratch_scratch-simulator"), stdout)
+        fstat = os.stat(scratch_simulator_path)
+
+        import stat
+        # If we are on Windows, these permissions mean absolutely nothing,
+        # and on Fuse builds they might not make any sense, so we need to skip before failing
+        likely_fuse_mount = ((prev_fstat.st_mode & stat.S_ISUID) == (fstat.st_mode & stat.S_ISUID)) and \
+                            prev_fstat.st_uid == 0
+
+        if sys.platform == "win32" or likely_fuse_mount:
+            self.skipTest("Windows or likely a FUSE mount")
+
+        # If this is a valid platform, we can continue
+        self.assertEqual(fstat.st_uid, 0)  # check the file was correctly chown'ed by root
+        self.assertEqual(fstat.st_mode & stat.S_ISUID, stat.S_ISUID)  # check if normal users can run as sudo
+
+        # Now try setting the sudo bits as a post-build step (as set by configure subparser)
+        return_code, stdout, stderr = run_ns3('configure --enable-sudo')
+        self.assertEqual(return_code, 0)
+
+        # Check if it was properly set in the buildstatus file
+        enable_sudo = read_lock_entry("ENABLE_SUDO")
+        self.assertTrue(enable_sudo)
+
+        # Remove old executables
+        for executable in self.ns3_executables:
+            if os.path.exists(executable):
+                os.remove(executable)
+
+        # Try to build and then set sudo bits as a post-build step
+        return_code, stdout, stderr = run_ns3('build', env={"SUDO_PASSWORD": sudo_password})
+        self.assertEqual(return_code, 0)
+
+        # Check if commands are being printed for every target
+        self.assertIn("chown root", stdout)
+        self.assertIn("chmod u+s", stdout)
+        for executable in self.ns3_executables:
+            self.assertIn(os.path.basename(executable), stdout)
+
+        # Check scratch simulator yet again
+        fstat = os.stat(scratch_simulator_path)
+        self.assertEqual(fstat.st_uid, 0)  # check the file was correctly chown'ed by root
+        self.assertEqual(fstat.st_mode & stat.S_ISUID, stat.S_ISUID)  # check if normal users can run as sudo
+
+    def test_15_CommandTemplate(self):
+        """!
+        Check if command template is working
+        @return None
+        """
+
+        # Command templates that are empty or do not have a '%s' should fail
+        return_code0, stdout0, stderr0 = run_ns3('run sample-simulator --command-template')
+        self.assertEqual(return_code0, 2)
+        self.assertIn("argument --command-template: expected one argument", stderr0)
+
+        return_code1, stdout1, stderr1 = run_ns3('run sample-simulator --command-template=" "')
+        return_code2, stdout2, stderr2 = run_ns3('run sample-simulator --command-template " "')
+        return_code3, stdout3, stderr3 = run_ns3('run sample-simulator --command-template "echo "')
+        self.assertEqual((return_code1, return_code2, return_code3), (1, 1, 1))
+        self.assertIn("not all arguments converted during string formatting", stderr1)
+        self.assertEqual(stderr1, stderr2)
+        self.assertEqual(stderr2, stderr3)
+
+        # Command templates with %s should at least continue and try to run the target
+        return_code4, stdout4, _ = run_ns3('run sample-simulator --command-template "%s --PrintVersion" --verbose')
+        return_code5, stdout5, _ = run_ns3('run sample-simulator --command-template="%s --PrintVersion" --verbose')
+        self.assertEqual((return_code4, return_code5), (0, 0))
+        self.assertIn("sample-simulator --PrintVersion", stdout4)
+        self.assertIn("sample-simulator --PrintVersion", stdout5)
+
+    def test_16_ForwardArgumentsToRunTargets(self):
+        """!
+        Check if all flavors of different argument passing to
+        executable targets are working
+        @return None
+        """
+
+        # Test if all argument passing flavors are working
+        return_code0, stdout0, stderr0 = run_ns3('run "sample-simulator --help" --verbose')
+        return_code1, stdout1, stderr1 = run_ns3('run sample-simulator --command-template="%s --help" --verbose')
+        return_code2, stdout2, stderr2 = run_ns3('run sample-simulator --verbose -- --help')
+
+        self.assertEqual((return_code0, return_code1, return_code2), (0, 0, 0))
+        self.assertIn("sample-simulator --help", stdout0)
+        self.assertIn("sample-simulator --help", stdout1)
+        self.assertIn("sample-simulator --help", stdout2)
+
+        # Test if the same thing happens with an additional run argument (e.g. --no-build)
+        return_code0, stdout0, stderr0 = run_ns3('run "sample-simulator --help" --no-build')
+        return_code1, stdout1, stderr1 = run_ns3('run sample-simulator --command-template="%s --help" --no-build')
+        return_code2, stdout2, stderr2 = run_ns3('run sample-simulator --no-build -- --help')
+        self.assertEqual((return_code0, return_code1, return_code2), (0, 0, 0))
+        self.assertEqual(stdout0, stdout1)
+        self.assertEqual(stdout1, stdout2)
+        self.assertEqual(stderr0, stderr1)
+        self.assertEqual(stderr1, stderr2)
+
+        # Now collect results for each argument individually
+        return_code0, stdout0, stderr0 = run_ns3('run "sample-simulator --PrintGlobals" --verbose')
+        return_code1, stdout1, stderr1 = run_ns3('run "sample-simulator --PrintGroups" --verbose')
+        return_code2, stdout2, stderr2 = run_ns3('run "sample-simulator --PrintTypeIds" --verbose')
+
+        self.assertEqual((return_code0, return_code1, return_code2), (0, 0, 0))
+        self.assertIn("sample-simulator --PrintGlobals", stdout0)
+        self.assertIn("sample-simulator --PrintGroups", stdout1)
+        self.assertIn("sample-simulator --PrintTypeIds", stdout2)
+
+        # Then check if all the arguments are correctly merged by checking the outputs
+        cmd = 'run "sample-simulator --PrintGlobals" --command-template="%s --PrintGroups" --verbose -- --PrintTypeIds'
+        return_code, stdout, stderr = run_ns3(cmd)
+        self.assertEqual(return_code, 0)
+
+        # The order of the arguments is command template,
+        # arguments passed with the target itself
+        # and forwarded arguments after the -- separator
+        self.assertIn("sample-simulator --PrintGroups --PrintGlobals --PrintTypeIds", stdout)
+
+        # Check if it complains about the missing -- separator
+        cmd0 = 'run sample-simulator --command-template="%s " --PrintTypeIds'
+        cmd1 = 'run sample-simulator --PrintTypeIds'
+
+        return_code0, stdout0, stderr0 = run_ns3(cmd0)
+        return_code1, stdout1, stderr1 = run_ns3(cmd1)
+        self.assertEqual((return_code0, return_code1), (1, 1))
+        self.assertIn("To forward configuration or runtime options, put them after '--'", stderr0)
+        self.assertIn("To forward configuration or runtime options, put them after '--'", stderr1)
+
+    def test_17_RunNoBuildLldb(self):
+        """!
+        Test if scratch simulator is executed through lldb
+        @return None
+        """
+        if shutil.which("lldb") is None:
+            self.skipTest("Missing lldb")
+
+        return_code, stdout, stderr = run_ns3("run scratch-simulator --lldb --verbose --no-build")
+        self.assertEqual(return_code, 0)
+        self.assertIn("scratch-simulator", stdout)
+        self.assertIn("(lldb) target create", stdout)
+
+
+if __name__ == '__main__':
+    loader = unittest.TestLoader()
+    suite = unittest.TestSuite()
+
+    # Put tests cases in order
+    suite.addTests(loader.loadTestsFromTestCase(NS3UnusedSourcesTestCase))
+    suite.addTests(loader.loadTestsFromTestCase(NS3CommonSettingsTestCase))
+    suite.addTests(loader.loadTestsFromTestCase(NS3ConfigureBuildProfileTestCase))
+    suite.addTests(loader.loadTestsFromTestCase(NS3ConfigureTestCase))
+    suite.addTests(loader.loadTestsFromTestCase(NS3BuildBaseTestCase))
+    suite.addTests(loader.loadTestsFromTestCase(NS3ExpectedUseTestCase))
+
+    # Generate a dictionary of test names and their objects
+    tests = dict(map(lambda x: (x._testMethodName, x), suite._tests))
+
+    # Filter tests by name
+    # name_to_search = ""
+    # tests_to_run = set(map(lambda x: x if name_to_search in x else None, tests.keys()))
+    # tests_to_remove = set(tests) - set(tests_to_run)
+    # for test_to_remove in tests_to_remove:
+    #     suite._tests.remove(tests[test_to_remove])
+
+    # Before running, check if ns3rc exists and save it
+    ns3rc_script_bak = ns3rc_script + ".bak"
+    if os.path.exists(ns3rc_script) and not os.path.exists(ns3rc_script_bak):
+        shutil.move(ns3rc_script, ns3rc_script_bak)
+
+    # Run tests and fail as fast as possible
+    runner = unittest.TextTestRunner(failfast=True)
+    result = runner.run(suite)
+
+    # After completing the tests successfully, restore the ns3rc file
+    if os.path.exists(ns3rc_script_bak):
+        shutil.move(ns3rc_script_bak, ns3rc_script)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/utils/tests/test-test.py ns-3.36/utils/tests/test-test.py
--- ns-3.35/utils/tests/test-test.py	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/utils/tests/test-test.py	2022-04-30 18:23:58.234735300 -0700
@@ -45,7 +45,7 @@
 #   -l, --list            print the list of known tests
 #   -m, --multiple        report multiple failures from test suites and test
 #                         cases
-#   -n, --nowaf           do not run waf before starting testing
+#   -n, --no-build           do not run ns3 before starting testing
 #   -p PYEXAMPLE, --pyexample=PYEXAMPLE
 #                         specify a single python example to run (with relative
 #                         path)
@@ -93,7 +93,7 @@
       '-m',
       '--multiple',
       '-n',
-      '--nowaf',
+      '--no-build',
       '-p first',
       '--pyexample=first',
       '-r',
@@ -111,8 +111,8 @@
       '--xml=t_opt.xml && rm -rf t_opt.xml',
     ]
 
-    configure_string = sys.executable + ' waf configure --enable-tests --enable-examples'
-    clean_string = sys.executable + ' waf clean'
+    configure_string = sys.executable + ' ns3 configure --enable-tests --enable-examples'
+    clean_string = sys.executable + ' ns3 clean'
     cmd_execute_list = [ '%s && %s test.py %s && %s' % (configure_string, sys.executable, option, clean_string) for option in test_cases]
     runner = TestBaseClass(argv[1:], "Test suite for the ns-3 unit test runner" , 'test-py')
     return runner.runtests(cmd_execute_list)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/utils/tests/test-waf.py ns-3.36/utils/tests/test-waf.py
--- ns-3.35/utils/tests/test-waf.py	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/utils/tests/test-waf.py	1969-12-31 16:00:00.000000000 -0800
@@ -1,194 +0,0 @@
-#! /usr/bin/env python3
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-#
-# Copyright (c) 2014 Siddharth Santurkar
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License version 2 as
-# published by the Free Software Foundation;
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-#
-
-# NOTE: Run this script with the Python3 interpreter if the python3 compatibility 
-#       of the ns-3 unit test runner needs to be tested.
-
-#   The following options of waf are being tested for poratability by this script.
-#   To see the options supported by this script, run with the -h option on the command line
-#
-#  build    : executes the build  (pre: configure, post: clean)
-#  check    : run the equivalent of the old ns-3 unit tests using test.py
-#  clean    : cleans the project
-#  configure: configures the project (pore: None, post: distclean)
-#  dist     : makes a tarball for redistributing the sources (pre:none )
-#  distcheck: checks if the project compiles (tarball from 'dist') (pre: dist, post: rm -rf ns-3*.tar.bz2)
-#  docs     : build all the documentation: doxygen, manual, tutorial, models (pre: configure; post: distclean)
-#  doxygen  : do a full build, generate the introspected doxygen and then the doxygen
-#  install  : installs the targets on the system (pre: configure, post: uninstall )
-#  list     : lists the targets to execute (pre: configure)
-#  shell    : run a shell with an environment suitably modified to run locally built programs (pre:configure)
-#  sphinx   : build the Sphinx documentation: manual, tutorial, models 
-#  step     : executes tasks in a step-by-step fashion, for debugging (pre: configure)
-#  uninstall: removes the targets installed (pre: install, post uninstall)
-#  *update   : updates the plugins from the *waflib/extras* directory
-
-
-
-
-from __future__ import print_function
-from TestBase import TestBaseClass
-import sys
-
-def replace(pre, post, main_cmd_list):
-    if pre:
-        pre = pre + ' && '
-    else:
-        pre = ''
-    if post:
-        post = ' && ' + post
-    else:
-        post = ''
-    return [ pre + main_cmd + post for main_cmd in main_cmd_list ]
-
-def main(argv):
-    """
-        Prepares test cases and executes
-    """
-    runner = TestBaseClass(argv[1:], "Test suite for the ns-3 Waf build system", 'waf')
-    in_cmds = runner.override_cmds()
-    if in_cmds:
-        cmds = in_cmds.split(',')
-    else:
-        cmds = ['basic', 'build', 'configure', 'step', 'clean', 'dist', 'list']
-
-    config_test_cases = [
-        "--enable-gcov",
-        "--enable-sudo",
-        "--enable-sudo",
-        "--enable-tests",
-        "--disable-tests",
-        "--enable-examples",
-        "--disable-examples",
-        "--doxygen-no-build",
-        "--enable-static",
-        "--enable-mpi",
-        "--enable-rpath",
-        "--enable-modules=build/utils/test-runner.cc.1.o",
-        "--boost-static",
-        "--boost-mt",
-        "--boost-linkage_autodetect",
-        "--boost-python=33",
-        "--disable-gtk",
-        "--int64x64=cairo",
-        "--disable-pthread",
-        "--force-planetlab",
-        "--nopyc",
-        "--nopyo",
-        "--disable-python",
-        "--apiscan=all",
-        "--with-python=/usr/bin/python2.7",
-        "-o test_out && rm -rf test_out",
-        "--out=test_out && rm -rf test_out",
-        "-t test_top && rm -rf test_top",
-        "--top=test_top && rm -rf test_top",
-        "--download",    
-        "--check-c-compiler=gc",
-        "--check-cxx-compiler=g++",       
-    ]
-
-    basic_test_cases = [
-        "--version",
-        "-h",
-        "--help",
-    ]
-
-    build_test_cases = [
-        "-j10",
-        "--jobs=10",
-        "-d optimized",
-        "-d debug",
-        "-d release",
-        "--build-profile optimized",
-        "--build-profile debug",
-        "--build-profile release",
-        "-p",
-        "--progress",
-    ]
-
-    step_test_cases = [
-        "--files=\"*/main.c,*/test/main.o\"",
-    ]
-
-    install_test_cases = [
-        "-f",
-        "--force",
-        "--prefix=./test-prefix && rm -rf ./test-prefix",
-        "--exec-prefix=.",
-        "--bindir=./test-prefix/bin --sbindir=./test-prefix/sbin --libexecdir=./test-prefix/libexec --sysconfdir=./test-prefix/etc --sharedstatedir=./test-prefix/com --localstatedir=./test-prefix/var --libdir=./test-prefix/lib --includedir=./test-prefix/include --oldincludedir=./test-prefix/usr/include --datarootdir=./test-prefix/share --datadir=./test-prefix/share_root --infodir=./test-prefix/info --localedir=./test-prefix/locale --mandir=./test-prefix/man --docdir=./test-prefix/doc/package --htmldir=./test-prefix/doc --dvidir=./test-prefix/doc --pdfdir=./test-prefix/doc --psdir=./test-prefix/doc && rm -rf ./test-prefix",
-    ]
-
-    common_test_cases = [
-        "",
-        "-k",
-        "--keep",
-        "-v",
-        "--verbose",
-        "--nocache",
-        "--zones=task_gen",
-        "--zones=deps",
-        "--zones=tasks",
-        "--no-task-lines",
-    ]
-
-    test_case_mappings = {
-        'basic' : basic_test_cases,
-        'configure' : config_test_cases,
-        'build' : build_test_cases,
-        'step' : step_test_cases,
-        'install' : install_test_cases,
-    }
-
-    waf_string = sys.executable + ' waf'
-    cmd_execute_list = []
-    for cmd in cmds:
-        if cmd == 'basic':
-            cmd_list = []
-        else:
-            cmd_list = ['%s %s %s' % (waf_string, cmd, option) for option in common_test_cases ]
-        if cmd in test_case_mappings:
-            cmd_list += ['%s %s %s' % (waf_string, cmd, option)  for option in test_case_mappings[cmd] ]
-        if cmd == 'basic':
-            cmd_list.append('%s configure && %s build && %s --run scratch/myfirst' % tuple([waf_string]*3))
-            cmd_list.append('%s configure && %s build && %s --pyrun scratch/myfirst.py' % tuple([waf_string]*3))
-        if cmd == 'build':
-            cmd_list = replace(waf_string+' configure', waf_string+' clean', cmd_list)
-            cmd_list.append('%s configure --enable-gcov && %s build --lcov-report && %s clean' % tuple([waf_string]*3))
-        elif cmd == 'configure':
-            cmd_list = replace(None, waf_string+' distclean', cmd_list)
-        elif cmd == 'distcheck':
-            cmd_list = replace(waf_string+' dist', 'rm -rf ns-3*.tar.bz2', cmd_list)
-        elif cmd == 'docs':
-            cmd_list = replace(waf_string+' configure', waf_string+' distclean', cmd_list)
-        elif cmd == 'install':
-            cmd_list = replace(waf_string+' configure', waf_string+' uninstall', cmd_list)
-        elif cmd == 'list':
-            cmd_list = replace(waf_string+' configure', waf_string +' distclean', cmd_list)
-        elif cmd == 'shell':
-            cmd_list = replace(waf_string+' configure', waf_string+' distclean', cmd_list)
-        elif cmd == 'step':
-            cmd_list = replace(waf_string+' configure', waf_string+' distclean', cmd_list)
-        elif cmd == 'uninstall':
-            cmd_list = replace(waf_string+' install', None, cmd_list)
-        cmd_execute_list += cmd_list
-
-    return runner.runtests(cmd_execute_list)
-
-if __name__ == '__main__':
-    sys.exit(main(sys.argv))
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/utils/wscript ns-3.36/utils/wscript
--- ns-3.35/utils/wscript	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/utils/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,34 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-import os.path
-
-def build(bld):
-    env = bld.env
-
-    test_runner = bld.create_ns3_program('test-runner', ['core'])
-    test_runner.install_path = None # do not install
-    test_runner.source = 'test-runner.cc'
-
-    # Set the libraries the testrunner depends on equal to the list of
-    # enabled modules plus the list of enabled module test libraries.
-    test_runner.use = [mod for mod in (env['NS3_ENABLED_MODULES'] + env['NS3_ENABLED_MODULE_TEST_LIBRARIES'])]
-    
-    obj = bld.create_ns3_program('bench-simulator', ['core'])
-    obj.source = 'bench-simulator.cc'
-
-    # Because the list of enabled modules must be set before
-    # test-runner can be built, this diretory is parsed by the top
-    # level wscript file after all of the other program module
-    # dependencies have been handled.
-    #
-    # So, make sure that the network module is enabled before building
-    # these programs.
-    if 'ns3-network' in env['NS3_ENABLED_MODULES']:
-        obj = bld.create_ns3_program('bench-packets', ['network'])
-        obj.source = 'bench-packets.cc'
-
-        # Make sure that the csma module is enabled before building
-        # this program.
-        # if 'ns3-csma' in env['NS3_ENABLED_MODULES']:
-        obj = bld.create_ns3_program('print-introspected-doxygen', ['network'])
-        obj.source = 'print-introspected-doxygen.cc'
-        obj.use = [mod for mod in env['NS3_ENABLED_MODULES']]
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/utils.py ns-3.36/utils.py
--- ns-3.35/utils.py	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/utils.py	2022-04-30 18:23:58.234735300 -0700
@@ -1,6 +1,6 @@
 #! /usr/bin/env python3
 
-# These methods are used by test.py and waf to look for and read the
+# These methods are used by test.py to look for and read the
 # .ns3rc configuration file, which is used to specify the modules that
 # should be enabled
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/VERSION ns-3.36/VERSION
--- ns-3.35/VERSION	2021-10-01 13:27:51.000000000 -0700
+++ ns-3.36/VERSION	2022-04-30 18:27:14.427631600 -0700
@@ -1 +1 @@
-3.35
+3.36
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/waf ns-3.36/waf
--- ns-3.35/waf	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/waf	1969-12-31 16:00:00.000000000 -0800
@@ -1,174 +0,0 @@
-#!/usr/bin/env python3
-# encoding: latin-1
-# Thomas Nagy, 2005-2018
-#
-# Modified for ns-3 (git development version waf-2.0.21-6-g60e3f5f4,
-# with a change of the shebang statement to avoid possible use of python2)
-"""
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-
-1. Redistributions of source code must retain the above copyright
-   notice, this list of conditions and the following disclaimer.
-
-2. Redistributions in binary form must reproduce the above copyright
-   notice, this list of conditions and the following disclaimer in the
-   documentation and/or other materials provided with the distribution.
-
-3. The name of the author may not be used to endorse or promote products
-   derived from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
-IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
-INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
-STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
-IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGE.
-"""
-
-import os, sys, inspect
-
-VERSION="2.0.21"
-REVISION="c6c9a875365426e5928462b9b74d40b5"
-GIT="60e3f5f488dc88ff50984f51be7f7293b9a0b0fb"
-INSTALL=''
-C1='#-'
-C2='#,'
-C3='#&'
-cwd = os.getcwd()
-join = os.path.join
-
-
-WAF='waf'
-def b(x):
-	return x
-if sys.hexversion>0x300000f:
-	WAF='waf3'
-	def b(x):
-		return x.encode()
-
-def err(m):
-	print(('\033[91mError: %s\033[0m' % m))
-	sys.exit(1)
-
-def unpack_wafdir(dir, src):
-	f = open(src,'rb')
-	c = 'corrupt archive (%d)'
-	while 1:
-		line = f.readline()
-		if not line: err('run waf-light from a folder containing waflib')
-		if line == b('#==>\n'):
-			txt = f.readline()
-			if not txt: err(c % 1)
-			if f.readline() != b('#<==\n'): err(c % 2)
-			break
-	if not txt: err(c % 3)
-	txt = txt[1:-1].replace(b(C1), b('\n')).replace(b(C2), b('\r')).replace(b(C3), b('\x00'))
-
-	import shutil, tarfile
-	try: shutil.rmtree(dir)
-	except OSError: pass
-	try:
-		for x in ('Tools', 'extras'):
-			os.makedirs(join(dir, 'waflib', x))
-	except OSError:
-		err("Cannot unpack waf lib into %s\nMove waf in a writable directory" % dir)
-
-	os.chdir(dir)
-	tmp = 't.bz2'
-	t = open(tmp,'wb')
-	try: t.write(txt)
-	finally: t.close()
-
-	try:
-		t = tarfile.open(tmp)
-	except:
-		try:
-			os.system('bunzip2 t.bz2')
-			t = tarfile.open('t')
-			tmp = 't'
-		except:
-			os.chdir(cwd)
-			try: shutil.rmtree(dir)
-			except OSError: pass
-			err("Waf cannot be unpacked, check that bzip2 support is present")
-
-	try:
-		for x in t: t.extract(x)
-	finally:
-		t.close()
-
-	for x in ('Tools', 'extras'):
-		os.chmod(join('waflib',x), 493)
-
-	if sys.hexversion<0x300000f:
-		sys.path = [join(dir, 'waflib')] + sys.path
-		import fixpy2
-		fixpy2.fixdir(dir)
-
-	os.remove(tmp)
-	os.chdir(cwd)
-
-	try: dir = unicode(dir, 'mbcs')
-	except: pass
-	try:
-		from ctypes import windll
-		windll.kernel32.SetFileAttributesW(dir, 2)
-	except:
-		pass
-
-def test(dir):
-	try:
-		os.stat(join(dir, 'waflib'))
-		return os.path.abspath(dir)
-	except OSError:
-		pass
-
-def find_lib():
-	src = os.path.abspath(inspect.getfile(inspect.getmodule(err)))
-	base, name = os.path.split(src)
-
-	#devs use $WAFDIR
-	w=test(os.environ.get('WAFDIR', ''))
-	if w: return w
-
-	#waf-light
-	if name.endswith('waf-light'):
-		w = test(base)
-		if w: return w
-		for dir in sys.path:
-			if test(dir):
-				return dir
-		err('waf-light requires waflib -> export WAFDIR=/folder')
-
-	dirname = '%s-%s-%s' % (WAF, VERSION, REVISION)
-	for i in (INSTALL,'/usr','/usr/local','/opt'):
-		w = test(i + '/lib/' + dirname)
-		if w: return w
-
-	#waf-local
-	dir = join(base, (sys.platform != 'win32' and '.' or '') + dirname)
-	w = test(dir)
-	if w: return w
-
-	#unpack
-	unpack_wafdir(dir, src)
-	return dir
-
-wafdir = find_lib()
-sys.path.insert(0, wafdir)
-
-if __name__ == '__main__':
-
-	from waflib import Scripting
-	Scripting.waf_entry_point(cwd, VERSION, wafdir)
-
-#==>
-#BZh91AY&SY-®^ñÿÿ°dPÿÿÿÿÿÿÿÿÿÿÿe ¨Â,#&40�E0m b¼÷{¾Þè€#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&ÕßMs%GÝÇk hÅZZK³®]½·iºÎØ[:÷zõ¶eŠ¦ú;¾ö÷³>²Ž¦2»§vú{¦“¯}7Ó:}z÷fÛ#ª:î¶î“�Üõå]:q[{f½æ÷-�lQtß7ºz²‹ÎëÏ¦çÃ®åhbb‡'­Þ¹Þú÷·‡v]ã}®›o7¸=‡­3Æ#&#&#&#&(ç°#&G :pûÙ@ñGVmÛ0t#,;–w6�Ð]w×ŽÒÙªÐ IoræígièÐâ€ fÀS"ºÕ½³opPÀ)R¤ {T€Q$P  z‘P)¶ô=Ú	ß<ÞÞîbì;IwÙî/všîÕ¨³:â’Nl´Õ+lí×WÜôå£×t€77ÙvØ×>ÝÞìðÝÎµï{†¤�¹»¬^û»Þùíï]o�¶îWv�¯_w»}s“9ÜúñÞ&s¤(uKj­@‚¤Šë%íœÝtÖ'½�ì{Ýîæ÷¼çXöÑB†—25†ŒRH¨¯x°p#&%•I#&§¡ç è=¸ª§£ÙgTw°ííÞƒ)p;{ÚïŽ÷›ÛÛz£l¨£ìÊ6Yôè²À	wØÙ›ÝóÛ�h{s¨ï��ñÝÎ„½>ï_†ûVO¸õq×§@7…÷Þ<VÖÓÝŽaZí™ök:Ýë—È÷/·W:îŽí×K¾¸ž{¾½½åv½™ÍÇrÝÝÞîä=ïx]é»}n®ùÔ»ZÔ¦™aõ¸Ziõ¯wqvxŒ»f§,(töÆ«¹×=ív|ú”–Ë^Íž±É¾{šíÝÍ�·vî÷h™uÖÜL{ÝÖJûÝÑ/WÖJôqz^iÁ»h3Míë½¼O`÷Vž½ÛÐ}¾÷u7x^ç¡S£E#&©(©*`¯Z[ºg±—4¥ímº;ì«r®{ÙÓ@ÝfænÚ·Ez¯)ºPÝ¶j{x÷š)w<ÞÒ4 î¶²kÙ�à#&#,×.ìÀ#&=Þ®\Žï;O³<¤fÖ}»zó¼ëS®®�Ë¦úºYÔTî·-CcÖWFƒç°}D5Tßp�fˆƒ¾Üz™ä£›|÷N7s�W€R­÷eowwwO{z�»ƒ^äóU{(zìë§µ=6c�»Ë�í,�Õ;ˆfÅã›¶co}îê¶Þnël>!Ó¬ö7n9ž´1�XZ2‡¢öt+×vžºõ°æíÔîàæ'‡¬ézÓI¸vÙÓ½{¤çg´#&ÀSg£…1MÚÛ­Žìtî»½Ú;‹Œ%v›µ«£¶íß@r]íÎšukîÌÝ…ï_vûo7ÍëZr»#&õÒ�ë!B†ÞaY¹£€¶ÝÝ¡îìF´q®ÜãßO»#&¾ðà@hdrÍ«`î#&:8yW�ºûá¡�€(S@ #-{×·…{»YvŽ÷ºÞ;¼®L]@ÆõÎª¬¾÷Om¥ã¶Üì#-’…»k©Ö¢¡V«³[Ãzõï#-¬û©»m™mJä¯;=í›ã�sæßwH6û©ßÓ#- É¦óîñìlÞpHá»{³-×n}ÝïFè/3ç³ï»l[5ÝöåÙñu}æ·�ç£–¯™¾;CM#&@ÐhhFš14O ÓÉO%š�S�#&P<¡±‚S@„�#&@$õOSÓL¦OTõ?H 4bh@#& #&#&#&�HH"44ž¦˜š5=M)êo*y=)í)úHõ=5(ä@z€#&@#&#&OT¤ˆIé#&#Ÿ¥”ô(ÓõFG¦“@#&õÔ#,4$=@#&#&#&#&#&$„#& ÓF„bhŠmO�ÓQ€�#h#&ƒBMDA#&	‘ SL˜LIè§Š~©äÍSÔi Ø¡µ#,#&#&#&#&#&|¿þ“üú«JçúqÊµ;µÛóUiæi3PgÆ«NÄ…1&¨ÈÀ TJ€#-€(ù¬Dü¿òü üWæ9¼U?çNî[�\ÍL:,—¬65,²ïsù½r>pÖ¦RóúßqþÊ_ROÞ	ï¶úZÔZÝZ·o”³,TdØÈ¢ÅŠ)/“ÁçfsvsÒ¯žºcWRjá¬ÓÖù.öN<ÉË¹»½s|Ë9—™TœÉU{ÖìÑ~ëwÖB¸TŠ°R1W+µZmmcV³6¶�ml@²#-p‚¢ÔP�'IedI#£C#-ˆ¨9E,DFÄ#&HD÷À"¥„E ¨*î‹b±W´ÚŠµª­ï¶Ö¶©™2J35#,3M‘4`‘IQ¶‰™¨D±�	©J4¢›i6LÐ&I ”dµ5£`Ð¶ŒÒY4‘%¢Ôb‘6”ÐH´jXÐÀÓTÚ4E&ÉhµBRËJim1-!³A0e™ŒjHÔj-A’h4¦Èa&¦4”	†‹,´Œ`E)´ji²%´Ûk-[F™‰,fdÌ„Ñ`Ë&Úm´ÓhRQ²’Ó[jm³6RÒd™ˆ ¨‹5¦&‹%È£dHÚ#-‹4�¢“¢¢AÅ%L#4¨ˆ*Sƒb…ˆ’ÄC"2HÚ‘2¥ˆ‚fhd‘1J0Ì‚–VX31"’ÈÄRÉ¬›,Q0©Hd²�‘£iM0M‰)2(Ê$Ñ“CI“#-’�"QI²#-lh’,E2–�E3ØÖHfÄIŠhfl­&À$²°„X$¤ØÔDIi( ¤‰*!$J4H¢`ŠÃ!Œ’˜F(L¤”š‹3cF°‘¤Ô‘$Ä"Ò› HD‘d¶ $Å–e�™%e26"fÄÈŠQ›#0Lªi‰!R�Ù¨°H4ÓCc•’ÉJ)	‘M$ÄR0Ù¦@±¤Ä!$Ô’Ê2ƒ�&iESMMj€ÄË(4–FB1d¤Èš	¦R%FŒÂfÒ…&5Á™H$$Rf0"HÆ‚%’a1A$Ê™š³m”¶%3!©Ä)›+)¢¤Š(Á™$Ù#ÉSHÔÍ,FRB“3–FVm0•ˆŒII¦¦M3 ¤1”E!³DTØ¢ÍJ”¤¦ŠCddÆLŠm!E’1J2’ˆ¢ÅQI&$“JmMF‘"†˜Ø�Ê�4È›A£c0e�šL£cH™2 ”Ù)LRˆ„,Ó!-fÍ�¬–$†’ÉŒ†¨ªA"k#-D™lf$FPjK‹4‰DÑˆµ)¥‹S#,	3)1D†Y6De0H¥š4¦0† Ð–L¤D†‰U¦¶´`™BjfŒ¦F&”RLÈˆ­¥6À¥š,Å&‘”%–TÙ¢-L¬-”bBŠlD)DM"¤%6¿;k¢¦©aˆÍ¢ŒlVÅlTl™Ji¨¥I4hiiQ°�’j6²##,CLÆQ’6S*H¶D‰™¦[%´Q‰IKQµ…£&˜MMf,XXÔ‚™ifL™RmFÊ´�6PŠÙ2ÈªU,•0¦ÍŒÆf­�DVÉ¦VD©–Sk%Yl¥)¦E¶F€ÉHÚ‹ÖX’Ò)j-PUF$5´d¨(ªÉ¬”mQX¨©�hš"d�±b-±Z�†Z6±°“&`ª€Ó(¤FŒd-2M+Kb-�LMcÉ6Ñ­Tµ¬±PÈL¦jZÉ¢J‘‰šm#bÉµ*Í±ŠSiT²•2Ë#-ÔÒ"5´ªY)jjhØ…´$¦SYbÃe“YYd+e˜¡ ¡•H�±¢,Xf“"D6ƒBc¥´j„ BTPÉj+$ÓFÉ“IE‘Ùb‘M”�£dEe�H¦2™‰B’�šf�ˆ(´Zd„ÈÍ¦ÒbˆÆØÙ#-aÓ bBŒh¤¢ÃLI5ˆÄ†ÈA�“5h’™£Ae”#,P•0F�&4ÂR¦l�š‹FB£3j2”lÊI(È2†,¥±L6“DcRl–Ad‹,!FKE#,ŠC1&�e*e%,¥f+Af‹$lC‘j5FÍhÍPÑ©JM†˜©clÊKQ HÈI�&2#,16$©*L¡EJi�’B“5„¥5ƒlÃf’É±šM6b&šQ’Ó#jÈ�4*fˆK#-$I6Q˜"4U4�Š4@Öi6Jb&"i)! ´Z-„¨Ôj(ÅcŒËa¤ÃI&…&FÆ)D±FÀ–‚³M‹!™D#d¥”•2"Ú6€�cTj‰4P™f¨ ±Aš“Tj˜b�R”6±´SL²Q¢Hªd–ˆ#TX‹”­²*QTkLMLÊ¥†d¢J›ˆ™V¢5`ÑS"Å’£hÂ˜³J-“%bÚÒb’²›dKdØÚ%I)�e*, H666J6Mb1d‰#,E$ÌjÌ˜4¨Ò›3bb)¬jŠ™Y5™BšI¨ Š(¢iµ%bÙI,l˜Š4PF“IZ‘-,´mµZ-QV2”m&¶Dª6Æ¤¢Å"š"™‘˜ÓR#†¦l“5¢6*’Å´jJ–U“Z&mH¶5Q±±’*¢™TÒ¬mFÆÛ¶¤Ìe(„³YX–£‹4¨ÚˆÚT¨¥+J3Í!”#,,%F“lkeI¤­‹&ÙI•£F±#,1h¤Æ�£VÛ-«‰•#-‰‰(ŒT0�Ñ£bšIµ0ÆI¶�±m‹LÕ´cZËISC-l¥“mMM²ÔšjÄÑ”Q£#i%#,f¤ÔÌÍ–TEbI2’dFF#!d¶‹2Û1üzþ“[ê{¿€kÛ½¼ÿ-{Iÿ3GK#,°”aË%!ÿ)7Ôå?„]�”ÏïEéPhÒlú'=vßÒó±½9¿‹øºô&ƒ*–’¨ÿ‚ù2âÃû'úþeÈjÃ¿B�žéÎ`¤Á¢ƒÇG±.0R*‚ª¨	&#- âpùö´N‚©êÿHgÿO¾Ö�ú	%#-zdÆ{¬3Ô–1Þæ˜–Å·8{%ZM‡Ìï÷â9¿…s†2¡‘ü,<³V-;brW,]¾hfÆ¤¤PÙ'6ää±ž·léÄ»ÊÂ±„df0$ŽÒí‘6c&5Ñ>Ó\òrhë²w�Ò×.ôô«Ô¼k–s¹eüN¼ú�fsE"¨ŒŠëP¦"W‹4LªvcK™@¥Ja)"’DŒP›Ý·AŠ•Ó5%ëáÖå^<ëµ¾-Ë#7¦æ�ÉJ/^zò½/]Ôï—šã•ÿ±e‡ö°#,Ü!Ã2˜ÁE‚‘Ý¡\×É¯&�°¾Ïk”–Äc(#ðÿeåâÎç‹Ó5 �®­ˆ¢˜aM¡H²wòÉVcýM,Æ•ëµ(dR8ÍÈœè’œ?*ñAþÁ‡j''t-�C‚Qo/æ|äWmlÇŠx-›2K¾îJ½¾XƒZµ²ÈÆ&Úz–Bƒi¸åÑwÊæÝ,†¢®mÓÎâ$ØØŸvëå5¼m" ×äî§Öëöâür)•ñr-±©)ÿc(�ö¸m)”©ôáÎÂV(éÓ ù´òeˆŒÛ1é§dCm6…õØ‘£—.ˆH# ±ª)ÃH,ç[iOWwk•ïíÞKÅs{«š5]r»ÎìnQÒ¹s%uÝ$‹M1�ì²IƒõÏófÉDÙ(V)BŠ‘¦†xmŒ¸Ñ9µbÁ_m£ìI§ïhÆ•·iuô{3!£ÅJÿ¡E&ètÓªÀTqPÿJ@úâQ³úVá%.x×ßˆs@ÇGìÐÃg-±ædÈÝWT-…Ÿ…Jë½Ëí¯Êæ8W×§ðç‰ÓGÅ¯–½¯~C»Uá�Û^?ªË=ÇèÂœŽNîZhâ2““«;SFNl’ù×²ëƒ2†ecž7óÚóµwÐ‡É”‚œšŠSá×ï¿G=/�ƒÞ�»µºrkéP¤ˆª6�)	ÈYS¹7LèÔš4hW’bÊS«-¦ÈøÐUéCÇBËfX²˜�Tú)b#Œó¼}ïÏ:«–Eë­&#-ªŸn.àÒR4›O$WæÊù„Óìë"lr–ÿÇuö}vôÅ¹ÓÂëÉŠ_>ºûýP²1ÐøÐX†ù­±+W¢#cÁR…Q4iÑ—ŠE¡Uˆ9h1åR¯m+›+_#-þžÊ2ºÒ…A@P²›&£xÚ¹¶¿Ñýä£Oºêf×²+Æ‚†+ÃÇù¬;3DR5A)�AX§×øÿeæ×¦²ŒbSQIðîÑ„Û€#-#,AÆ(ÆÏ�€Q›g›4È½¥ÏeÁ(¹®Z+bõß‹zõy2•d¨{]ËŠý©n½Ý�Å×ª(Mõº÷øzÞ)ïÝÑ×1±¨Ù6úe¼cPi-ø#-‹#ªv^‚ìWŽ›Y€d÷¥LT)’š`qÖ¤´:‡.eÄÍkf¬üROJR³ñ;>®¶ì¡‘¬›ö;€ÙÚèZI\÷²ðÑ$XS†­²XŽ2#,7/±3Ú!yx-Ÿd>NÛ¥ÊIuV”ìÒ×}ZÈßÙV§†….þ”äå—§u–XEFœ#-(SfŽ+8ãÆ(ø½&!’Ð£ú"�Z#Ø´Õ¯Å)wQ6{áð0ž<P¬U‰Õ‡›-b#ÉK£¥9!Gƒºå{Ñ®›³Ž#ìŽ`ÛJl&×.÷\â«!ðþ˜}Yæ¢=Uç¨Æ¼H]bÃ’oßµ£Õ ãFš5Þ”Øs0£24¦ü]ÌÇÝïiæ›®¨Á¦'þ¦oáöû@7æw©å†?ªHúj™J*�B#ÞÔDàÒš×ßT~Îî]¸>£ˆô²²•ÏÃ7ðÉ@ÈM+ckt¨1>2’\‰crF�ÓD³ça÷å» Â#,·c…d?à›Æ¥Óa�|\»!£H0˜ÊköÑ³�¨ðªu)Ò«Â‡‡¶ç'#-'&�½)$Œˆø­k]Ì´1#-s"”¢ÞÁo 3Ò±ržâ¹/šuBÌç‰<5œÉðót�¿N3ZH<ü1d-XF{’Á	æÃW¼ø0´–ÉµÂ‡ä{Dò3T·è$nÅêÊ±õÒ<xC™“gRbKä�(q<åÅî¹’üþœê÷Œ:5À—»#urFq—£nzkG¶Þò¨ò~uHÐþùŽÈõãxûûÜ`oPªµ})IÓ¾­vT9¥	0àD*�Óô»íLÈ3rWçb©QžqƒÁ½B’B�Ô3rYïPç®d4÷iïÓ%ìùYY(¦ÇQ¨¤Õ5ï£›3ÁÝrækÝÖ˜Œ7òrÀnHcÂ2¸œ„züùLiÈ,¨Ó õ¨¾Yá™ŸsGá—òÚ¦pÆ)ãË«�`NßÒ—qÒI–OtBç­“G–(6­<0RÏ£#-YªpÁXzÔ¡ÝºÅñÛ¸áÚÖ«ƒ¾ÉÓ#[“mŽ=@Ž/.5ñvî„ca¹dö;Ú¶ÏŸhcmŽ~ÍÓêh×P÷k¿¶Ö›ó1×d$’DX ~~¡S×º”�Ö£Zmçðf�ÃK˜Òû`é­2~²¢=9zC}Nýez×žùLHöïótÉqÝÂç¨c¼T˜ì˜í§	`o�«Ÿ2Ñé¥§w:V<ÊÖÜkóè¾6cm‡&Çß¾«,‚c2-—óþ1~viýÛôw‡{:šÔñ¯�25Ÿ†/·!²¢*nÆÿ4ŸwŸo¯]ìß»±T�^ZD¤Aîu¢û9E/¥Ä7+¯]Ôù·}ž®¦´„Þë¢ôëÛñy¼ûÎŽî;®ÿQŠQR>Wýë¯ÉüçºÚ|ÿ.ëÇT•ø5÷°ú·ŒO�Û~^»ÄI‚ˆ©ø{s~bnxñ{SK\¨hÌ�Uå!ÌGÆNÁÉ÷nVIüšÛ¬(vná%Ûˆã÷ÒwI$`@bX+»„ù»\}ce2™Ê`mk4µ“OÃ-nö†™ŸªXiô?mÃC¶•çEF}•µÉ÷'WÌ5›eZ3ôLUwŠ÷÷ºâ_ÍB>4\‡ò’‘ˆÌ´ùÅAÚêï½i	�ÏÁÊEE�4dfýš\|è¤Eàf¬XÅ‰´š#=%¿'+"Ü§Û¹£øöuOÃ~Ù¾4H¿užMA”ëÏœ0hLZu>Ïv.Ãº£³¦õ¶üÞkÏEµÛX)�	§ëq6œN¹ÚfAuóð“á]!¶P“ A—Ùj]©°û#2&Ïãj4ëž^^°ð;„C²ø¼Ò4Ì²ž¸üŒäsGšöÑHðf·#-zvmsÉ/lX^´[T–uázFiTYL*¢P[oeU!àÍÌÀ¤uNíÌG¹“ç×–FÅ¹ëzt}§‹2C=!ZªÌ|.\WN<®Á›¹º¦›Úái¢/ÛO!ù^ÖjŒƒh~±†•úÜ:j•"#�H´W_LråYÑ8Ùþ­hñáPÐm�Ô‰lðaK–R‚±7gFTaóŒuòÐ¼6ÊÆ¶& �:F‘÷ÁcÏ}Ù–�Âk2Ð¨F7§éOó¹æ]L³v?¶ßëg‡¼pÿ£C;*wd}ÔåÍöÉü¬¥òvÌâÑG’òc•ìˆçÕêgd$™”¸rkhÖììz	ÿë8^�×;¼ë�øæ[(/ËÂc#¤ÎMýÿv¼Ý!3|lç¾*–Ø×ØU:„éé1äŒ:¤*!šãûË=çÇC–#-EP�¹µùk›q~Íæ·¥y²ÅNë­ôÑ `‚5zXF|)é§#-'ÂW_œ ¹T-íV÷ÍË‚ðÂìÂ¤X¤˜Ó¡Rú ¸ý�òûPö&|8tîçãÆÜÉÓw–^[åÝþY”“§~öí}=ä«Ô7cëGëp‹†n&¯Å+5ÝÊŽ6PeÉÏ7Î©f²»ëµðÇ-ó“J)ø;]M›àPRxoAyðœõ¡í�Ñ+yq°-Ó~9�ÉéaP½è'}{bQK�Ü!4GhaÑûã™ª�ºÅH…”ö7;–*^ó‚«ðçp»¦POa¥Âò*õãRWLz/ã—1Ùüù˜×‘•Ç»ˆ$K»™ îœw%^#-›4ûÔ¢"ñÆ=Ø”ÏçþyÖ÷�ûžN3Ûˆ,Ôò¯{�ÿ§–'DXeu«»°Ý†ù¯¦¼<:sÔw.àúÎØÊ†|gi;ù3¥HK)ð8 §\Ÿ!ÖºUpCÀû9yöuÐ�\âT	[Q‹ÉôðÏ@LÕ#&²qý4ìé]i4i�T*åÒTD#-Õ£k*ÏT:é�q#,ÛU«Ž±·È¥Õ½Œûµ«¬¥¿…Sçí¤ó�C&7ý¼°aC7rr‰Ìs§RëÖŠ¯ÚÉ¶)Ö†Û�¬†<û «L^÷ôØ÷Êù28mD{XÆó-Ëòž¸½ÜÀ}æ^Ô´Ý�¿ž}—è±´7Kª†ZR´ƒïêáº¤‘è­Ìx@xŽc½Ì/I€á÷ˆÓÂ	YMh=‰¿UH¤äéÍ'–ëˆ�¢t%W˜.7¹-�J`^!;(#,.mü3çsx±-�¼kÁÈ##ÜÒlëËJÖñ‚†#-½sRõþJúàò4£Å™‚£"Ïçé›{©ÙLåa$7{%‰Ž�ó Ò _e`x&‘Qµ\#,¨‡Õ9!ø÷VÌÔñÖ‹Oõ¡w­þçG:Å¦²X‘§Ä³(ô(AÃ>j£Ì#-ð{P—Ù’p›ù‰‡—Õ×éßÊÌ¾ý¤Ê#,Ðé¦]¯‡%á‚?“Œõ€ŒK¡[@ì{É+ù¢ËÖò„|Qû%µóÛc¥CAûœu‰pá….é~×nS–q;jT0j×6Š»j'è¥)üµ¤Ú°-½ôæa�ìÜ1˜8ëRA¹|@¢m1DYêžºrÍKû-ÇßP»ªþ$Afv2b>6{ðúèý>úhíxÙžij§q”s’Â‹cÌ3µgÎF9P(&#-‚·¨°›FˆÎ­7ðuÙü =ÛÌëkŠ^	éÙ×wv; æ´•àÕ  ì®Élßj9×éîÛm!üo#-WÉ}ÛÇ^ž“t¼WRLa•ýIŒ©­µ„\bÅ¸«¡G»5:¥3yÁ¢šfXüMtæéÓ7<’hÂÆ#-º’&vb£Em¤MÉé#LÇÍ’6YM7r$^ÛDõT&ANÿ'?‚hAá˜WÓãRëz-sÅŸºúåÐ£$ìãý„ÆcùMf"6½ò.µ¡ËúÙ^E¤J6(™¨~O£¾…†Ž®ŠøÓXKa i†±å›C«Bâ|àÉûBQÓ·ÛZÅCŒÆèï]ÆGŸ¹U&°TTM2`½)àÔ‰ÍI#,ÚTèÌg‰.êË­P2‘š’…*‰BÅxûqKŠ%ER€A„Õã·væñ;\Š\u]ruÖÎE�V(ÂZÓ²‹ý?g}žƒ�êð›ù¸àî(R¡ÓRÃÃ­‰'ÆT’K’Dr”:¯~qöò&oômÿ¹�ÁC¤ö�?£·s!Fìciýï#&I€#,Pïã•Ãp%éŽâ6'¿%ƒÐ¹B¡ËFîÿ§çþ6æå©â£IóéZüR-çºö3øTœÓ8¦a9Ä—²k†¬�÷¤Õ’ugÅ#,Þ.¬½+D£\Ù~UÕÛÊ2¥1²lÛà�“B#,Ÿeã¹52)Â´LÙpSºJcU›¹ôVrº™¦’—6PÀîgêË\4©£ºE%U¶——£²sª tÁeF£ Ôd‘#&Ô«ãèd¡8¯­‘`¢X*ZQˆqLˆy)e‹8«|Êãý®®#&úžÁ®ù”}F0ÄÛ#&Íæ¸å'E<¬�åÐ�¤`4—Š*€aú=·?^•º­Ê�#,0qˆ¯m€|42eoèmÚàù>÷UÇË¦.òËdÔ}&Ýªˆ%”côõB±Û=Šò«<©Ô÷œw?þat¨âQ‹U~ƒ¥Hãú\0ˆþÎ! ö­-K#ö>Ê!w0¸�CU‘íûæv±ÀI ¹w¡ÏªëÜb +èí©¸Þ.¹«Ftª!oâðyN6OC8™Ý8?ûQBše]páŽû`{aQ	¼s‰a­$cníÂŒ»‚”)ýÜ�i	,¾ßï·ž¡mi¥Ò%fßÆæ<9i#òZ�€ÛŽ!ºÛ�i�0Û;ö~æºiw“òÜ|˜ÑX\_‹Ör2Op“œ¼˜N‚Ò7Ëì¦mÃªKªb³ñ�M@ÁJÁY¥m7¯Ù¥ãNêàì™cµkßJ–”�ž‘‰Ñá•É¨iP%á˜‡÷~ïÜ	:!C)9-fªË®UFZNtM…uäöìöÐíuâ‘¿‹&?m(ò~®Üø�°Ì¸q:zÏ¡sÄø‰81…ÍR‡½°AKœ»VÚr)s³Æ‘°cu‘yïq³>É’[(—ž3¹-Ö.6-sÊØá0ç(;Õ1Ä`]‹˜@%�‘ #&ó"‘,	‹O’#-;µµ¸\¼øÜ×þ{•ž´eÈ¿#,ö¶n‹{ß6ˆó,·=µ!ŠPŠç¹¼!”tÐv‹2Ù»—-‡8ë×¤IIÓ,—��.¬Á6>¤m«ê×Y×;Œp·�]pïãÊÆ-ÝRûQÿŒ@{@3#,£oéövÙI;:g+{-à•ÚÞ	ï]F7ëp!„¾Î­/?©¹´RÇÅ‡S”yAoùîÓ-#,Õ¶Ôò­rÁ·+~Žûà¥OœÉ��ñ Kÿ®ŽÏFvTëŽ‰?è‚º¨xÈBMN’Ã’„‡ñðã¶œ¹ñ%^í?Ô�2u³r#,mQ€c@¤ÛDÐðXéß1Ý€›Ç¢¢pX#-€Ù} oæ£¦±•´¾ä‰¾péœËìÒÒ%ŸtŸþ ÈŒŸ\t<ã;í/úA=;'^nc«¶.ÑÊùˆÒÁÏy•Ýö])ÛÏÇ­`—zó}¸jÂv-ÓJ#ß|×•F~šå5n‹íµÅÏC£�1´¯©)ì£wíê»Ú?BÃ(ðËs¸Ph8? ÛLÝV³Kž]'²90xÝôßºê,~ùÙ¢Sr9TbOlÓ¦Q/ÿ—ßk¨Ä3Af•nhÊ3Ó+@½4ÉC«Ö1`íÃ…1Ø íåò,‹QÉ[‘ÍeÛU¬"p#-”A™Xçùœ¶ºsk6éPÎ#&‡fž­Ø÷Æ¯]‚�ê–X8Có”³¸AÝ¼jçþ:×?©†§Q_òe !1¿w #-¿õÄkù.ÇêÝ—ŒŒÍBpJ§‘ËæÄGþP"›ÈÕ#,;¿ñ7lKœD^Ùâ`+ŽSÝWgûwEÇ_²u£Çíça³Ó™‘º‡uó#-¯x#uˆ~=÷ß�¼#&oøÀ�rEÈ$:~�ðàÁM3#,¿ßãöð„Ï×ÒžþN1^ÕTE¥’$Sd’<]¶ò£�(òøE“ô§Xùù¹Æ½6Ñ"Üsn£Ã×«ËêöÔtúµ�¨þEC%^ïŠ—Ä{Juýzµ»¦Ã€uàƒr¨$(°!`gÑùâ3#&LëA°!	#&A$ø¿Ç¿Óý;„Kg»ÐØ>£÷âéw^»å	#,ƒk¢À¢ ÐD×Ì@ÿwÇêI¹þ¬Æú)ˆñ0óG÷-ä¯÷9¬]ÿsx’v"$ØÅÎê¡2(ŠAúJ›Œ˜#&¯ËO2i©:Yð6Œ/ãüK?wÛ�Æf�Ð~ö’ë.�¿3»�N�{e¼ ­X=Àg›ý6ºD¬#ñžïMËüçÜQ®õ²\�tTD—{8±èaÝ˜=¹Ž4)/r×#,ž”â^8ª	IB¥�šŸv)3)ØˆÇ–Û}¿[žU‡ÕŸý„¹�oíü2ýŸŽ›øìÙŽŸôþå?êÌO“PÅGX«¶‰½Ù�\ëoUÇ5à‰³JÍÏeL±Y|SÜÜ�™#ú¿É?o±|¬f«ý¿û¦a¸0×?²X³¥[GTrÕÔ§ÏÙ»cî×úþsGeÍÌÇöyúŸO»Í†ëlÈvfü<ØTÐz3s”G}©vnÐF°èï�ìº(úJÈìýÙ�üÃ¤0¦º?e›lz=üw]¶ú‡|£ùA÷ß¿™Fp¯£¡øÞ�ß»Òç$�5µ¯AMà".Ï#&æ€³·§¦sìÜ¥×,Xj"@ïkò*°N^›ïwÊÌ˜#,E#,¸}§éÇÉá8p-c&ÉDUCÄ÷'_©×~ˆ^Û¥tSþ�}oöôgS³wÓ>¬XB§<ˆIÁM•mGý—øuaÕ9º»Î}œíýÙÙ{eˆ1ˆ0m2HY£P´Ÿ¯#ß¬ž þÏæëü_gÈß§?ä?^íÚyK¢ªW#,ºB`¦¦Lîì>…úä²dCàæÌGÌC"5íFSMÁ¾Î5a&n»kÃˆ¥Èc�EVvÙm�Š"^Qˆ@�))¬„Á£w®ao‘œÈ²ãï2�InÿÒò�0…¶xÌ­­œBdr{Ø‘ãå¡Óá›1X Â˜²<’•~nþš‡@n†F)èÞ]�îý÷-#-!ÍÊrfžûìŒá'ð÷rúºLÈ§­Ëj¤ˆŽ¤çsûº—0†òö¼“àƒî2`L-zÙ­Ãæ ½µd˜šÛ>±TÆoí¬X[0ùéîïv�º˜ÿ&_FígÁÚH0ÚR»éÌ¹÷)þu¬q;3æDc]g=×ÆÐ2I[Ÿ'áSáÚ|ñ'±1tÃO�O®#,Ö½2ÚG(zØ mÔœã¬†0°ÐÃýôu’Áp'H¥tKEh“R×[8Øª,UH	B’[¿�³À ªãƒ„ßg;�ð½ÈˆØã¼]p¬|òK�Æ‘Ð›h=iŽÊR’:ù›Û‡éa=^¼šë!ê}ähƒ\r>ìí~gŒÁéÉ“è³È,Ò8)€5øª@I¯vyJŠÜ‡€ºïŽÎ¡wF!m#-Ÿ˜#&qQi@•#&@™ðÑ¤Ø?3)}ø·ûI½½9§Ê¯1ˆPV~¿•ßè±¡’b�ãÐÛœS{Ó½VZµ@U3žwåñÈ½—�}<pfy~þ2#,î5M©UM(x‚X"Æ£�0Dj«í#,ïÝ>ºoKÏPõ!Ãi^á3´oôjBI/–p|¼¶–e\åÆòä«ÎˆG^Ù÷ï_ÊõÆzï•ºˆÝ#-=0ú¼=Î-=“,8Ñ(”ºR�K¼Žœ­Êø/ú·mÌ¬oÖ$“�ÛÛá±Le`ttG��Y%qßÄ7Tå!‚¡OÁö_‡È#,Ã}_g÷ó‹Ž%z‘”“X@�·BÎ	q$Õ#-m„ÎÐè»Wº�Hì8€•!öá¬œÇz€øáëZX`�¼PN*"]‹‚™&¡`E[¦{_Önžøß}ˆ6NÈFˆþ—Ö¹t=¢¸Ô	Œi°2÷ ¾7š}>sLøÁ(‰¢§´aMFp�¡Å!w)Œ…DË.îqß6,¶¨ˆ²Äô©��¼° ÆÒƒ•ÇLk1žú£ŒG�T>‘n¿�0Jf=1Ž«Šm…wˆÆTˆ°Š²O´6Æ˜Ú±Ôá�‘¢»µázl_wîÿ8hx”MöX0,ìÉ@¼û5E:>EÄy¿¢‹{”]£ˆnÌ�x®)ž¨ÁSÝ +°5Æ¤��°D$Ä€#8¬>Û€þC-õ?�·Ç}þ_#-r{£ÙäÐ¤ívT|1a{ÃË†€õ@#+Ú$8£œª/Â‘m(?µZI.3©Ku-(T:åE˜ZX¡2�}uØ!;v\Øæïz]ïU~˜g�a“=åhÕ);ãxuØÖ±é˜ƒz�9×™UþƒáJ7oQ÷HR"Ñs‘ö :ó]"”ÁØP(¡Aè#ÄC�¦¨ ¡K=ØÃÆÉ§;B¶2Z!(ŒÀ­læÁêNEäªé¹ö Õf˜ÚRË4¦¢¤áhE6-óFÜòQb=#§JŠª4w}Ñ¹æfuCBePGá|XµNçxœ±uz#,bƒn=>´{Ë—L9„phr39z„)‡9FëaX”=U™S,[øõs….Ü¨¼`¨é“Ññë„±Ö½.z1»DR�‘Å+‡GàÞ¥<#-ØÛÍ£ŒU$2ÖåsåÓß£Éz`;%åÖî™²½yª�O8«,›}YEÏŒ½¯^$Ç«<'è8&ab£½#,pÕßèØ$Lˆ‚"Ê„Í÷q«	|Á–`ÚôZ«ÝGºzÖs2ã34¬#&b¹ï}†péèzkp7mšç|ˆŸ×G÷°×Ž,-�Þ.è m@B³eÍ¼ë£‰zî×wžeÚîî´ñÙŒhæé›rÑP€– ÉµEñÊ‚"«tÑÎ‡*3÷Úx¹ï:šä³‘±‡i€i¢4&Új"’#,ƒTÅf0‚1FTm3ÛžÜDÁ¥BâF0cqÆ#&Ø€= NÄ188Ö÷#,A³ëôó®Iª½üÃÆÌqtÑ¢@’6#xlùT`qé(¤í$Á(v:ÿR½¢îlû² ñ­»ï©V©~\Âš�‡5àä\=E²¸Ûà¾ÛäÜÝ©wš¢C÷©K.Ç)oÇžh¸`áPP¦E ß8Uã&B®¨)à†ò"àdÄeˆì/mû¬c·L5¡¡C*a Á‡t……"}š~|ü"ò–XˆD2gZhP{Ç’=ýaŽÆUmô“kTçjÚ<gß×ÎrRÓ°8k•ývO‡¿¡kÊ¶Øgâºó}¸ÃRf¼¼yÂ³‡í÷U¤cý³C€ü4/ûn¶DuKF›Õ’¦,h!x£Eã>iBg%ÎmŽ¶b–Š†æ˜¦Àé˜JÞ(c’ö%Ö…hÛÇRÇÜÒ4&Ž#,D5ÓPå1¬aX£@Ã¦Ñ¤K"ŒÀ4V—M,KX�™²…ÖX2�1"'Ó½Ø¼¼®:¦_vHã¶º#-9aÖŠø­¹£%âºjôÅ«ë«Ï~Ûrli‘F,MAdÊ"Œ–ÁdPËê‰ªpŠØõÝT±¡dã¢E`V(Õc`b¤(ˆ°�4ãSlt­|§O~§-±Ä#,^ÌöY/Û­˜ŠÑY‹\DŒ!VÒ¼ë<ò–Š)�X,_C À[ReºÕHö õÇˆ¾xcjk!ŠéY+¼3ÊÀpäzÏ‚y÷›öX~G?‡Íþýykïâùm¨w»tDèáƒ¥´{c^#	DÊ#,äß£Pþ\{›”€³¢Ñ7`š•-Ñ¯óHzè¶Ñù¼–èßB¾AÅìÓÚÁÅ;âËÚSÔž(;|¶Ópô,Èà¸åK¡´«©±Ö6YRÄ7d—Þ¦#,}›uÏO_ã©tÚÔã‘2¼%–®õ@!“¤˜‘öKY¾#¥ö’ZÔŸ~Ìì‚w¬9§¸Ýô[7æ· ¶Âðþ¨3A�‰´g…ß”±äú¾3œ;ƒï‡?iN…„^®ØÂtÔËºpÒmxMÔŒ,'mIâÐÉH€Ûõ·ÊŸU�ë‚ WH(‡£káB‘¨Ù%]3¨p#&†¾†³>3)$”7]-¢à~�ÍV’§éœ5ÍóðáYËÈkhMj’ˆ,T‰A�E`ßsáœÁwœÖÜG�æ"/ÞEü�Ç÷û¢Txk¹ïÁ/só	ÇTcùÐ#-Ü#Ø– Œ’Ùî?´æc¹'£Ç—èÓüùc³±÷_BwB";³Ú)å¡HÏó¾a¶�{aŠFâ¹VàÛûÖ71§È¼¨�súúäÚAŒÐÚc" Äro'™5dEd4éLÔÄC"Âª]"k$¡‘f@“³­ÐœYÀÖJEéQÁo2@CeI7PÃÝ¿Æè\	©²ÉE!²]´�@Â¥$š´�åÛ¥"›QDF4¬Y#-0š7ÌX™–•&ƒjÐÛ‘€ÝC¦UˆÇ¦a¢A‰±!ˆbÓ%Ù†òýß>_ãÔ9¡%ZúŠ¿uãº[¾iböí#-û�»;-}ûw[�öß®¢˜Ò<K‚†•Â4�	vg‡åÁ£²m›œV$~®èñâÊFÍq“+Êåq³‘z”š~÷*EÑñ´äS0Í?yõL£Óõzð±žïÃU¶‘ÜdRË¬´®á®ƒ[BÁnÑdssSƒÆ|°ß.|á˜áŽlÜR!“cÍ�K‘úôQ·ÞqÁ¹BK¨`’vírÃ[ÔyžvbžOS%,)0Sp#,Ã‘J×û^¸ÓàÑ„Èø>(d§#øv®"“cŸ(|¸ôzR«0«ñCµÊKÖI¤‹R×7‰ÙåÉ¸¸5±]!K–n.,4=Èó%l‹(Æ`°�jI"ëêv›ƒÜäæ5Tt^OüñôíºL˜ðÁ§™$&	ÙñNlÈ»q!X<ìE©¿ ÷þŒ¶�´×AÑKÄžÆÄZ6XZnFX•«D¶+]1t‹•ˆªtÃ£¢>w”½v}›ü«n‡h¹Ñ¸ZÓ1²r>r�!ÀT‹šNVß&är®Ù- ·;ÜðÕ³0­�	˜85ýv®«&U¤ˆÅ+5PÅ1zõ«xk.ió'[0ä!÷=²¨ÜL#Ó‚sÛoì×lç>‘áFö|ŽW¾U=Ø£‘?{°#-›þ~`Ú à!x”)e¶b——¦?âù_´Áõá#&dÇØ¬B>ÄÓMsWï‚„ÌKK,Þº:¹¬	76›BYÐä¶ù©Ækm… ›ñé©MôÊEÉ&\\^¤D‘L›Q†[šµÒÉ¹·M$‚Ô¢*DƒT“"Z®”TÁ‘Ò«d<Ø*�öiÁlÁ°8Ô¡’×Ûš“¯é™µ¨d38 7…ÊÔ¼1Z~/ØrŽÈ9Æ§?hR{�qì	ã¤#&OÌ€”#&[Ã Þ…µ�¼áÛ˜(r¯û›~Ðï«‚ë„Ù±êö¶¾�6à3åôùÔ»!Ô¡ÃP7F‚Á‰ XÏÛwìØ?ÃñÓ££­›TÒÛô*\G:yâ-=öQáÄÑÈ%ú¡»ÉÏÇG¿§ˆ×å¨¯�v.°ûÌ~-  ÔõOrfÄ•c)Á_ùLÚû˜cø`â~5ÍæüÙ^B}oY%ñŸ�ò¯$_ËqøË|:VìnSÏt8®3|ô+‚”2¹ð<ÑáÜû!å±[ºC›’ý#&�ë%£:@–]ð_¿û£Ë·á¼uj#&Q!�’^ñ¿Åû6»Åe’fç¶î¾‹§Sð¯¾·þŽÏ³Ã/ª`oø­Ó#,çøØÃÏñìÚ~Ï»gEk¶ñdÏ×F0O‹S�bø:•�p`âä„w²ISË°o»ÕÌ=$ú%×ß;­�w¯ób &¦Â�+¨‚QÌHG2©F`ÈÅúGý#-1Aéù~Ÿ£<%Ú(ìh·‚C„˜ÔqKHæóÙW“9K¬¦Ý{Š¶Z’¶å…°ýßïûÿB#&Gx¡óÿtÍ/ç³mšyÿ7Ç¶\#&çE„ T¥Ü»úmºÃÇ`OØ~ÉG×ÏÞüu<½åzä4:á÷GÑu»þvô²,*[ž§V‚)›RY4IˆÙRÄ¢ýw‰£MŠ¿˜½·j(Ö[¹×e#&¤#Rþä¡@Ò_îà57Ám_¯ù‹ÀûœÛž³pà™pþ§òå–á’š‹«M·ÂìA.ž–7éóìù½”jñ ‹›w][¡’R¤Î®è^Ä×ìëÊÿÉ©«÷ÊÁEÊBSºmþzj#&Â·‡Õý\OMò~5ˆL¡ŽY›²)ŠüL!)°ï{�¿Î–M„ŒÈÁw�IÉz¢ƒ(,Ðkz•tCmé$mt«ðÊ¶AÄQ8*Šªd"‡œ"~žÌƒùÏ»#ñp¼ÎÚ¨ÛMˆÄãK0…Í5@¬E  |ôn‹ØÚÛþ^¾�yá0ÿD‹Û	÷TÿÇW§ù÷›Ñ–i~-:—ø�ë‹÷©Jfx>ƒý#,.£®0¹ ame’ø¶*Ûw°ôðµÍjÀ7Ø ?Àí€ŠÁ¹ãä=¥•Áèáçä¸œHã¨uEšÇËì£€Î=<o}ÿ]ð¹ÊÃ"–vÙGˆbÍ,ª£›8Lr°¡0¿t?ÚKQˆ*¡cT+�÷ýõÉâüÑð	@ýò¡C`uÉ¦õ†Eš‰|Û‚Ã]=*ñAÙWþ@Å¯G}µXÏ§z“b�=¨ŸÄ„ýM¤7vt¢°�¨mI „ÃX"OÒ”€[6çþ}œ4P~Ë){~pþYË§îþÙ>Z‡èý>‡Ð~~ÜßµâÞñ§éú…}�Kää™ÓÖz -[O¯G@Ó[û¹�ð»ÑDÒÏsÔÿ¹túoŒƒº\<|¤jøñˆ¾“ùÍ˜-§>p¼aôU¿Fåx~9÷¨è*Eº,{¿º. €äAÂ`‘€uíê]7©YÏšÅŒ�9sˆ™_.‰žÛ¡í’�¾{;:o7%èX×k½âz,ýQ¹—iÒåŒÝýú|Qñn“j¤mwã�êü³�¥¼+¡‡mì‚FêïˆÃPÞNT�Œà©×ôî¹!üTEüÓ<(G}ê^õ®Ó†­öÝmçsQŽ^R€�4ˆeA@tžöÅ9ËC=w –SP’(pÉ¾ë)c´9ÎçÓGü}3KåN£¢ýgå8É÷ãŸ)v�×…!Uñ0p˜Ì[‘éºT‹·‘Ž#ê?º‹‘XìQùˆaëÚçÁ%8ãÿp=ëû`�‡L¨ùA÷g?qGâhòÙ°@�Ò¤z/òWÐØƒ¼¸¨2&O. ŽÓ®ÝûÈÅìÕŠÈÔhåƒy„M´ì"Nxö�ß5+Œ–Fq`OcdÓ/•%MB°ñgJÆ	“)æU v%ª& yu‡5TÑYƒj!@“‚“šž¦ÏBýÝª$'ï²¡ïP?#&ØbHp�2¿†W•fB¼¨$¡;J=?©†›~Vúæ-Š¹1"vþ	Þú`ÒñAüŠž	¯#,fSw#ýÚ£R_¯ø{Ÿ>€BbÁ/ê@;†ÐíÄ9� å^eäÃT“„ú÷ùQ\F™Z Ó¡ ˜Hl4š¼¿µBïUWÀ%Ç;—¯É± S��ð4²ÂÀbGût°J	ÎÈ†%}#-Ä�z¢X�‹ÖçÖ0'óô=?>Å\¡Å"…>#&7I@´$ƒº… ZFŠŠˆö¤çÄôò}øúuíà?äFÏF–�äþµ8tC¤«œ,–‰P´Bˆ5,¤Þ˜u).‹x©_vy¦y§fËè$ouÎÆÈ}~ÓõL¡³³?åÙ�GW¿Åôð—«èú-?†Þ]pUAìôóû�Š™iM7Õe•áÃÌGé¯©³Ÿ¢Ö#-õÛ¤iòÌi)mt_�Ë–»;êdY{{ÿsx½GöðÝ}¶?Eº{¾Îýƒ~ßŽ\·Ø!kÊôÃÏ~8EDµUí¯ú?]�Ráä>nåèã&÷ß#-8ëpboÙŸŸC�ìvè¯¹ZSyŽ·jû·G÷ðökîôèÏÊm‡y²åžŸðé÷¸î�ÓeÁEÂÀ2wgŸSëÕ=<þ¶ƒÏN‹qÀx=†þ�	!÷§«ùËÝ}Èä s$“â·í~^ÝêèÇe%=¦"Ëù¡é¿�õ<s)²BZd9Ç›¥“åºÙCuÜëe;7Å´ãÎö½öl¹“¦�z|ï›f²�Öv¦_5iëõkúÍ®æêÉ9ðéþs¶1†ª¶¿™ãT�Ï¡å¯fˆÝkè4ÇkßÍ€¶õ´ïG:t«wF´.ÙwCW¦Z|äè‘chæûô{[oîÂë­Ù[ï”�¸(y¥¯¿;)Q/&žÖ<l4ÓDj=áSœñ=<b\ÁbæÄàó"ç;­\Óý·=ê4óYž<Ú¤î>Ž\qÛo�‡,<›øyÎídÝ,w»ÌD½_	]ªëû©=üÍŽíš#-tCÍdîãÒ±�ßÆ–�‘èéÕW‘!ÇÃ¨g§ŠJÄHÐþ¾*…†Ÿú�aŽîÿ³[â9+5ôS­ü#Ýú|cgjïµã›�ÒhÏÏèê^ÿ´ÓÝèôk³aÏ�Ñ¶úN#3'p¦±�‘wí�¾ÈmEWÕ]÷Y_Ï£Éªû:t¿Å¨[VÂÙ³½~aé_N>˜éÙÂV÷jHdºŸôÌ¾Ãj€ÊÑCÑ�1ðúdáŠªjß�ñîŽÙK{{HŽTû<“¿Í¶Ü(£›÷(‘JüµN|Wêù÷êá—þc§!{l7þŽÄòÿ?o¾3Ðëíü56½§N1�¥çò#-îµÝw¢þÜ{Z=ÀxLaúý³œÙ„{5Žo�¯ùpÑ#-¡ÖƒïÐŠð!ÌW£³7Â¿^©†Í2_bÚ>m|]ó>x;Ž—6pù:¤ß9�Žžjüï÷³ºñ“b�#&¨<±½«ä•é÷´7ý¹èG42*rPðÌ…ymŒõYîöÙÙõZ9öç‚|ä~Aûø»Ov�•»” áNÇÿ†~¯M{­·ù�pý�EÖV¹Ý:�	y[&—o•¿�ß©©ûýß¹	Aî#™s”J…uýüïô€óé{/æì#-‘IldPÞ Ìhä€Pa¦!ý|¼�!ø|¢æ±E (Zb�˜Ã¯C¹?ðúµs¨:>Ïˆ'îî©çé|5þŸ}¼¯æÐ}ïŸÕÙŸp—Ü,fm}ýc¶ì|óÔýGwÞoÓénÜ¸Ä[lêÙ²ÕÙ·ól¿£ÎjBíÔ‰Ëï^ôåŽ®Ë?§-#ÇâøçÛÙùk¸aõ÷ûG¸~¡Äu�>þ_ ü…ËpêmŸ¢fywßç`?n­Ö #-ñ_¢Ÿºä›ücÌ>kG@û6‡áøáN«tþjæá¤pù¹š·~>»ãQ¬Tlô§xïúópÁÛ5v›‡L>Ÿ/Î¾�³Ž”ùGã¨Py?‹Ç¼K@‚�´COÃ£›o=ãöý‡Ö–§xñy8ŽnPåVˆQô•ñ½€ë?„†Æ~Þ#,0üF‚˜wóækÏáÌ|j»%ñ-þ—Ñê±Õ»îÙôŸ¿«½x‹¶óôÿ}Ñù‹ýmÅØƒæ³¿™[G'þSßX“%ú�ŽvÓÉ4Qõ<ŸË÷ádE	pòx¡Oz¨ÇIÃÂbû¿>Ä7ß>=|’:Ÿ¾#["I¶XTS×¢@æm,#&(ÇyPœ™¾ŠÆª’ö0alµK¤®C2J2A7º�%lÄ	#&¢ãUâŽhÜ,’Î„NGI]’±�tÁôM+Ñ�#,3®7�k¹½×»<ð§MÜü]pâ•#,µJ‘ÖÁ€ÒúíŽR#×Çíã4¶L¹¨â+¹x;.©™À’Xê%äs‘¸KPüé·öpÓ·Ë=??¨'�Ïõoýbÿov˜q°š÷t°x-ÆÇKk°¼4Švƒ/,Á®ùV´¢+‡9âdãÑ�ºÖ°VŽèŸNmYå”F™B²ˆ¨œòòÙÄQ9\èÝÜµÊÊl,mŒKÌPŠÔÇùgµæï:êûÔ_GÏNµtiÃ�ž<››÷ŸÀvóLÙ0ÍÒ.25ë“ÄÒ²#,“ÝH×«›Õ(ÆÅ´Û{,³ã#-êY¸~ßSÆ¬÷$¬Ó�é	kž)nAuèA�Ñ¬]¼[y½8Q¢Xá¢qxŠ¹4yð¯{ÆŸŒQãàG¡¼¶ßs¬øä™BBRwB‰{Ÿ<UX¡Î°3ÐP70cs•¥X#-¹úøÈR(ù˜Ñ^Þ‹!€xÓÄ{�´‚2ÇåÑ^§þa¿ŸXìöÚ,8ôŠ'¯CÇŠt­‘]¡»¬¥_3T¿œ*}5„�)8ó‘Îõ:ÄÐèI¿æŸc¯�ÃQ×§H¿UšyôvÛ+ëª¿ÙØvãs—éýM*G.×pÝQ«~©Ð´O>dÉ™ýå�ï–öl7·ÅÎÓîú8‡t“˜lpL9…ë·ÅC¨þ}�±‡”ó;Ëü7.—QKÊÿw/K?æÏçÐ›®å¢ï< {ìSµ$›¶¾žÜPúoê¤ìd"v“Ý‡º¶:Ù�)^›£õº¶|Xá'SÇüa«×Q£Ô3#,ào’õ½„:T’W–#‡õíšTOÜÉT§,†$xý;ïÄ:¢d”ò�—áñëä”s#&Ãž[pj#,¥ñØJÞ-:'þ??ÐFá›'Á§ø•�fFf\ÈÚ–7a+,ƒ�DpaSø=ª1­A£J Ûb¤pDx&¥(“vÄh†‡1¸°�UV”n!tÙýz]Å�À¬ÕÝÊjÌ³5QÑ¡L0„m…„v)lv5‚…�c#,2J`B#,YCCt!I± ÕŠØ"²¸äca>¬5MÎØ,m¡´»&6)";~í-âí¨th‰{E¡>8­2m:ÄÿÝ|­èó‘Ë�f3°”oðö�Õaü…3Òk2Öx³_òC5%uÞýÎ‚w!aàlar(ÆÒe„aŒÁû—ì÷oý/S÷Týæ�œ#¯#±E4DC»::P#5˜¼hZMêd)TI‘²Õ¨,M±¦Ù…¤’© ÿçH‚P´Y¶Ï˜èúô&S�¿¾nYšsü‰¢þ±?Õ‡Ë.“}ì�ýý8Òø$2p´iŸY²Í2Æs�ªÝu×âÏ–û|ßÇG–Í•åì®½�“Õ´KÌ=#-¶~ŸÑéÎã°cøôÃ§Ÿ^ÿ¬xâ›Å1NïÃøàûs³èÇög#ü="à!¯VÇ}·çõé1‹�ÝçYVÊ¬šã®ÊßóÏdsøk†amÕa”û�Q‘$ƒ‡C¾²ëª>Ñçì÷~ÏÁ>¯f�^®ò‰i ‚¿`áÅÀ#,@&ª¦ß�ƒ€¶Ó«ÕÎ)�ê…œ7ôuçœ…‘'ZþUþ÷#œ®r½•òsXZyzm7óëÂaSZ–êwÇø·»îè×åÙüm×ÇUÜI§Ú‰»+?ýÚ{æ-’È	…übûBßç<ã¯Ð¬#-)£¤‹Þ\p?½ñ_×íÖØÄÑ›^†+rEµh‘[J%cµÃÝ`¨Öð2Žtõu¼^´yçœÛÆ9ÍfRÉ²PQR¶¸aa‰F$7@+9²ã—"ˆƒPm�¢b•Š"ŽÂ×ÐÑ\�YJËgø=ª4a…%kœÑ�¨È)j•ª!l¨Z-ˆPÐ¶#-2A�n�¤Þnç£0)×Ž‚Q7"‚¦#-Qƒ!70aF�˜L‰ÃÅÖují²S@ØÆ:¢HÆ%™9˜Vvª-!òÓ¸èêYKk™ÂHZo®RQ-­”i¯î:Îí`4ó´mÎuoføo"�#,ŒLY"L¨p©ÄH÷`cô¨Ž�šL‰áh%´±&Ñ\Èªr#AÕDaWzeF8×Y)Æ6Ox1\ìý«®¸ø!U†$‚’IsJCÙõC‹D´&é½’ôAŒô»/øº£'|F`2Â_õÜ�e¿¨ÈÔŠ#-Åíå#-[<tÃõ/¿Ô�Ç´k�Î¨¥ºtæ½x|>È§ªïƒ´x?#&HÎª˜Dð<ßÑCï³4VþkU××õ^Ž}1A1ßÆ[ö�šÚ�ðÿt7µwLéÑŽe¾ÉþZŸ¦»»šgŒîÌ<Ö=a{î_”¾?#,‰²""tèò/\õÓ‹z²×aŸŽß‡K€pšË-Nq7³ñüS›äÿ5Cúž¢È#-žÇ0Ã¡‡9 ¹_À§qúbG°~}|¦¤q€ó7kË‰�ß=!ã_Ãõ8#,R«wUU|þ´^“_`ZHK6XžŽâB>˜â‡èþ“—3è—åð^B!øü´ÑëžY÷TÕ¿§+>ŸÓë!‰æª£#-»G(:žQî;‰íÏpñ²}?G+ßêk}·PYNÍ“:1�è%÷ÖCê‘‘nÎ…™¶ñu–ä¶#,ôtkî©Š®ç<’müEkÓ¯GÉÇŒ0±zä`ÛŸ!°O««nÍüÔx–‰U.áB³÷k*¢¿ÏVÚ1Ydld„q�V!¨÷X­€OòeÓy¶‚´‹QQHPK*+(bˆÈÖÙçõËùüØûü–|}c¯û?ØªëÚvïõúÿ>ŸžMÎ¶²è…	R,FÆzë›DÌˆ£˜æQeû(­¿A3§�1¡‰hp‘´¸kvé½�¢šÁpf'­T-à+™c0‚O5+4Ç«]øÑVƒ!XA‘¥^HÃ9T‡S3´(4ŠŒ™Ej,¯¥ÍG-/%ï±‰¯ºLˆ{¦ñ�#�[Q}³S&ÿ	!°YÆÚkÜ!4¿˜Œ†hŒ5`£yTòeLzDm,Ý¹ÃdX1ÈHÈ»¾.K,AÙU¡óU›z´ïkU·Ûp²&Jkw¶âfÆ¤Å±›¢††cM£aÆP6ÏÚØ´y.Ó;0'hn‡i:ÚvËÁ�ñMÕ€º¢Ù6Ò…QÇ›?¹þL™2‘ß0Ö²óE#-*ŠÃ-ŒŒl„�³ÕÃ 71¥‰=²Vß¥ÑOœFñ™�ç®FÉ…NTVHKŸÚ=2¯8T¥#&!#-To]Û¹r|\!»¸£Æú¯´TéÒßöèè8‰(B–™L�ã"12ß¬?Ð˜-äÂ	Gð(qS‰Ç¥R¿äý>Zcê#©þ_|¸œmP·c�(žŽQïÍ¨<Þ O¤ûÇŠº1ÕË_£”éô‡úF§	ÞÝ@>ÓXñäDe…�FØ£,-*ª~ºUQœ`¿=Þ-È®‘©"åÆŽ-(Æ‘*tûçÕ¥‚«$ºu"8¤	$n¦æ`ïÝcU½$NÑ ÚhM$¯ÏNQC¿�Æ_ˆt5³…‡ŽÒÅ“MéÐ¡Ê‚;B+äõz5� #,%¢éäZ ÑA8Š�#,¸67˜æb±¹Í«¥Uhª#-œ¶òþ,�šíwt�m¾c‰)P”k–Ø$Hd0?#,[ÿÌ?{Ïíë¿o«Ì:.\Ð|qwÉ×¤]–¯É>|G‹Õü¼%^ê°!‚*uÔ‡A7OÏ6~‰4.šVƒ#qn¨ÇGiæc¹Âes,d�S#-	EoõHlj21´ÃìHÇ‹½0� óF‡âG[q·º¨ÊO®‹» ÿ¥��Å��Ÿ¨Ä[UQHÔiÄWFã�…/nˆ–7�#-,°4'×mæyÙ˜Ò&ÍRç%ÜZ8LÊ,°¡+&°,”Ê�pF´Ã~”¬|C7Õ2•(¦š€¢U#,"ÊQB_zf$«¦E¶°æ#-±±õ!¡Êžo…m´½8MD¬’dnŽ’`»4f’[z±¤Ær#,ƒÝ^„O�Äˆ‰âøh4jq…cLîPË’1‘µàìe&E½À¬vÅ`j0t¡E&Y": —…™†‡¸…2.'ûãJ?þŸ³>#,wÐ¢ÌFvn9€Öò„À¸h{šŽøÁ£á)IÏŠ”â�4Å—†}Nœ�I??ßàÆØaWdÝ¸Ÿ*gB�ƒ?yeV&Qß½lê�ÉC±mUkºã’b~5Sa«³Öìç²¶šDÉ#,ôYO#³–^@/$T‡Dj�m¤Y.¹ã#Ô‹ëw¥¸Õuço½›mŒcõŠ/!¼ç�öf£nMÉ*íKqŒ{±µZ$Â-àLd"m�Z®Iàëàô»Î˜é{æeõîÛÆ‹ß1®›c6Å;"h§&“6ä)’‡0Û8ÌR()ò¬#-ùªŒá5FvÄ(_¹Bñ/ƒcýbÍXR#,Š§Ón¾è¸{Ê#/¹¶Æj Ë…	†ßRŠYÂ¡ÄM^ó8Iå‹DXe£C"g(ÈDf¼ÈQ±G�ÔGpá®ó¿´·ÂÃn8ÛË:’O;#,1³‘Õ¯oÁáÀÎê·=ŽpZsÀMC%sñ?c°¡‰mÎ&�MðXß)ÈÞn‹TRí¼qe2øõÎ×�Ú1Ö5­ßW�¹hM~:îÔº†î¼«dë‹ÔªÞAåj«[É•P]ÃK¦gJG±ã†ïÊ»Nêçs¶˜ápq2[ò[p£9NCµè/2´ôwÆîåÜë›Mx]µÒ¹Qt’ƒ[�#,Á¢<#-:26#,Š^m;ÐëÀQ¶ÔuvwPVMæ%’±Ü*78Ø(æòÙÝ6øìŠ]qq�¬û¨5‹#,À€Ûk[írã£ÕÒ+V;B'F)ºêèã9““;6TÊ[^‰l`��"ZÈã]\ë�]™Äwf¸ŸT8ÜäÆ´*l9¾®I9ÆÈ%„¹¹­ÖîØ§PÆ#,Ž]¶ØÉËH'’mjMˆ0Úy›Æ_g¸åcbkÃ Õ�oÓ:Ù›D$âoªûIW‹�tôJÀç—²mwNš“'“®T”)x‡*b-¨žõ§t½=»Ëm9`ÝkŠ8‘‡º=Öäâ0„b#%To¯,Ú¶¼5ô4•ÿšã#pp·�Ì-{'IÏqÇšïîç|Ôô[.äþM®k~~\oP·y–LNMÿ^õåûGo]B¤š÷(ÂÝqÔC©K+&!ˆ‚&2ÙSn—Ž<cKXZHÞàŠ£HS¨|R^Ö†×2ïÖ¥u5ÁÝ÷ê—Z'wƒgÇVüçjÐVÇ;¹é“&‡û�4�\ð×Ç6ŒÅ	§¨e(nÅ&·ýê”ª¨…ñ|L+šIá‚ÚÉ&–)»Lã#-å‹è?WZ×U¥´ìŸ	æ#,¡èDÜ³·8¬üjGÛ&¯ü.>òˆ‡Ãï14©,¨Þ# è‹Rl&–Gî¹íÑ!7×<X	Y¯NÛ¾E¬�òÃ·]©În¦Õfòs“Æãzm¯›Ë,º'Æ®É¦wz+È^ì¥›euäÆá\tRæß´M¶ˆázN“?M™Úz{v42¡L(ÅÂS)™º†�<ô‡–tíÀêsœ!êë;³©0xÖn˜Ú”=·­*òÃoVF#EŠ°î÷Wwey¶ðy›ý_bí'ÂKÅ<žÉžÍá	Ð:fð˜ËJp„Ô•6ÚÖ­‚SPÏ¯#-ÿ˜dÅGß¨rt‡5:Ú'Ü¡£ƒ``+EPI¼+Ù·èZ�ãÀéñ…#�óº Ç¼e"Ÿ�¥ÃºÒ†bvÝs(¥N4a"Û£ YÆ@ƒ²g%‘›KQ~"ŽÏ©»¶;N©=‘ÀC­fàÁu§�ÎõKî4ö	¤HQUO( ³!’jPWynïåK\p{�Ô�ª,W«,z	Ç×Ÿ¥F»5<R}#ÄçoQ :#&,ž�¯Âøþ+"3ÔPg­�‡¯ÄZW(Ý‹Ž¯#è®…É°>#áµÙ¯#&Ïƒ-ÞX��úŸå1­$¼I2ÄÞä�ÁÉ¡­D�ÝÕ‹ ½ªrò á%ò&Ñ�ºæcE¶Œ³éö||Kž2ïÇ÷/€¦Xø…” ©–e²r†Aƒ(#&ŸŽwßw~WôÔ»,½/¼âða�pO#,îˆÒ#-5€ñÃºB;íQBx‚ùØöí¤f*“™WbZÀ÷±(3‡7lX±¸tW®Cú‹r²Ê�ÎA—AŸXröDÁâ)>Pv?pçiå½Œ›¾<ÉÇ)x1öšÕSú#&9ÕÏèl¼.¶„£ór#á’.VM§¶ ©-ÁàI6ÌÓ‰§¶d)J¨{Ï¿F`?w‡±ÉNÂ®rîÿFáÈá"¼àí[ñùâÀ”ÑD¼#-:ð8Á2f*Ÿ)�×Ë(~¾x"”•nÉeÁrä(AFÓ«ðÛŒ[&-‡™¡h­Kr“íiÇ�œVzžÎ>ØîúYôÝÔ)2LD¼xbæ#&~DÛãVf(x;é?rFªÙV%ñWíuÒJB$*dÙYdè•ˆô‹„ãÍ±°«·Z‰ðn›‡€+½ÀƒÛEIýEb§—VÙðd)X…öy-âŽ×Ûi�ÒxT±�E¤màâÙ¼ÿ¿úT7bÍw}ç¡uo='vèÎ}”9n:N‡¸ÊðQÓÒ³DÜ Ê$âÂð™$ÔÞxÖ]—D›�d{z>éÞMzƒÓ%$ôÕz ³bŽÌ8°�½SÕØt$ÌÍœš3é=ë¯3­ßÂÍÚšé'ôômèFìPø¿ØËiðŽ³�˜¾ƒÈ¡¦¦ž]†jR5Ÿ*Šå²½i¬“ý9é�”Ð©Ÿ=Ë¥ÙvÕ{Ößrk¶ÔüÄÑß¬xQ¼¸4÷ÍüR÷óÝŒ×AÇ‡á{4lK!¸vŽ¥4ÉÌètöÖ-xæN§·¸?Ù›Ø¡ød�u8!� „sÈü¢pm<(þåÀndöÁœ·¬ëÃœ²iøm¥¤ÄŽm…&‘a$ÇuÊÌæÊ°êÂôÛ|°<3R˜tZ€üõÁ{‘Ç^}ü½Ë¯MèEBidüÖæmŽ?ÖFTÎ[Ñ¢›áX^‘i8#Ì¢¹î!C&C^ÔÃÙ`²HAÐGÇäg�$H!¡º¥î%è~ŸñÚ$#,cÂÐûShas‘âÃÙo·»s‘ïžœ1ß¹iêcÍ¡st–Õ	m£§Z=ÝWžÄ¾”ìc”’Oø9uævžË£C˜7Ù“Ä4ÆçO¿áešÇ½#,6µî7èw­3LuGY¶ü>S„�!Œ•âwµ0·Nõ3\JÜ˜rSs t Uþ).>­ÄvrrýO7oØáÜ»x‹º‹)kÇÄü„yQêÍ'ÞqþéÆû©:%Ñ0mrƒ¢ªyµ}¯X(óP"*>˜Äm�‚¢ôqÃÛ³Ú2Œ#-·5÷Îµ¨{ÑÑU{Íåï*×oÝ<5òëÃpSÊ{Ò„êD;L43¡ÊØF§ÄW9g÷Î3[ËüH|¿—L™ïcšÈ+YQ_ÀFéuž-Î6Q^¨Áâ"¶fÆÞÞF‰GØ>\Ge¡ÑÍŒ•l#±H%˜n+©î€ÏÈ©ßA¯f ~«®ˆ{NT‚0 •’¹ÀVŽK|u}uÑJÅ B”êÓ”§¼}ÑU$BO3ã:²_Dí˜—š�ßŽI#-µÕóCªÕ¼2Mõ¬½ìu¶÷¦ta>y6œ­¡™û5œÍNîQâ¸V§$t7Idl¸,ÌêC.¥÷*EdÌn2,Y—(è¿‹�Ç¥|•m¿”tÎ áß�&×J/OÒK3mäô)�²¤ííÙ‘sÑË¿ˆ &„Õ¶º³¥ßTx¸ñÛÄ†­ûbíü7çºª‘mÈŽƒñÞfN­¿HÑâb‘%YÉ¥ÚÌJÒ˜2ReW6d”¤æw5ó86[@BåjåÞ”!æa�·íÔÐáN›Ä`JcaG´."ƒDæˆ‚Š¢Õ°7ˆÇ$b©ƒ»ñTŽ³åì�:µÈœðÏu4‡¼^ò}[õ­À//gq1$7jÂScSù¯(˜×%“Ñèæµã·I-Ó>s†xÞâ%©µ�B»"ÛgÉ�5âÎÖº/s‹É¾ÄQ«Çƒ™è¸­›Ñ§q|ÍÌ˜m¶Iö0ŠRûÖO…ÞúNÝÆÎløH@¡Áå›¢¦ƒ›{‘Á8ÃS(—!Új4_h»cž®{Øÿd¦ IRåEéÔÚ.Í¥‘À¼ÅCÔ“IîW‚f!âP�½eS”,<ìÿÎ|æîr—Ë~›çÑ¿œçVÝŽ(;‡ªàç¶é×äÚRá£^e'SÓ­Rú#-OÎçPPz²26ŠºTiÛìÒ<‘âYEüëMöÆ‡:6pw¯×#-ãÒÛ�n!ÞÊ¨Áôsº›=ŽhŠq?ò—Ã¥±µ	}¨Æm‡Éi¹Á�ölíÄí§´þ§ÅÈ¦0Éá{mæË¨=áfF�{=žXbQÙ&žAÁÂ#,íêçCÑ¯¶˜³Dãñ{6ìè-=¼.‘²öár–ë–*e2Šê/Ì…,e=ü¼ÍŠÛ;ædM,žûHðämå-!–¶Oã3ãŠo¯ß·Lo£	˜D¹ˆäáR·tK22¶ÜÚßC—–!&ô¡×_Ò×ú F†ÇG!ÿrˆž8é¿5mËEn£Â0‰¨¾ò›t>áÁ÷è‡^öòaút-Žb¾O$LÐ\u÷õ£§ZEŒ®Ë5ÎhJ`^cPÃlRòÑíEuvwq&•³äÍÖ½åã[<:Á›�j˜=´8D´'Û£À`¼¯'±‡“Øâ}ØÉãÙÊ°~»H„šÑÙò¥©ì,‚f\æ#,\SSgóføþžÅ»á;]MGôË«t¹þ½§!D�sTaöy•"G“öQ£fÅÓv:®²`u�#'<uþÑ*=ä$­5ÇUgO–tÀ¹Vç-¥ê­cëÔiH�ktÞÒÍØzZ·'W³]¡p�Â‰zÜÆšnD…c×FóÜÏå¦ê ÓsT»f«øW#-­/ã9=jÑ´S½e˜Ž‡IãŒôk‡“@„�µbë›£•­Xœ˜Lm…'ëz:;`»òt)”E<PXí]Rå†×¨e¿û|¶¤¬Ú(à³ç¬7ážÑ9¹ÙVÜ•;b¸_k¢»Ì3òVMq‹Š«îÓu‹<ÿu]~p6œáLqi1Þdì2r¸Øû&ùÃ›ðŽŠ¬ÍRÆ	Å%w<q¬qôùë¯9þ½ÛÈ£sØVKeœøq¶£¥‘{ßuˆì{ÃœfÕ„W”¥rÝ�­õ¹òKÐÚíÃg…]‚�¸S<r‹K$„öƒöÉ„Tž¦ú]ÇØþrþ=·jk:ð|¯¯Ž°eppyoÎñÎä(ÏÂÙs­-ùÑÉÖÝ>ÓžkdZµHýîç³á¼yWMÏ½oŸ×Z¼ÀýzÀ•<¤¦TvZ§•H¤[cƒôÃînéÎB>Ümtdçmz‘ìá‹åd2›Ý¢#&r„ #-#,«eùÙ(ÊÂéYµô×æI�|ÖÒÄ\®uºýzÌ¸‘lLÔÓÊÞ¡-«ƒk·^ßu ñÕh&•I0£5‹ºûp²�uÙØ$ :ÖÅòx”¡çÅ�ÒúpñkŽ5˜a•áFn aiEuú·d$*dë0.yÐ°~›CV#&¬•u=ØâÌó¦ÁûF×>ç¢§‚�+Qý…îCzëÎ�¯-%´ÍK>qn‡AåôÂZW\e'(æe]tÝ²Œr™/zØCŠ“ÔNmÝ•/£I—nd'òX2^Â†VÌ¡n¥Ù�‚Ž‹Ä•.‚ˆ•ˆÕ¬�×®)t–hVvºIÞ¢-ï×ò}g¥�1ž…¶K#-�¯uÌÍ+«­ æ¸ÔØçÓ˜9Lß:¹áêÙx°æŒto¾B�¥�º¤ýf\�!mËñÓMª;äð^ïãxmÿ}•ÌîÁîE´=á‘M4,¬²`FCEëý¦. •#&R:îLq°rˆ¿Å+] Þnîa¤îpZëmäÛ}ÏH†&WWy¸myí�g°Öó�÷Þ¤µt@�w¾'àŒ¥ÍÓqŸsyí[RÕEžG~¨8\½ï§M]†^EÒêâäßÓãGŽß—Ë©E…}ÉõSÝß	|¨±ï:®|ôa—]ÇÛ½“{ñŸ¥—¤çîÄ	í÷˜8ªgtvœn•’|bË+IvÒWFŒê ªÆê°›Êh�R0y¹ö\÷›Ü+nsÙGJ��ÎÕ–~Y¸ºYRûU×Ìâ È™yòPäÃ~ÖWsôF4ŸoO-ì\éùöbü"#,ma»qX×'Úëú�dÞ*æ›Ûfv	AMóWL‰#–×ÁËeÚV-Š¨!yŒ¼ô¼è¶Q{ó,ûÔiá.xÌ<\	ÇÒ @§&˜jÕQI¤–;21Ö1æÑ*ªñ¼|wÎˆä–âuÅÂdœéW)ã'@™Á�Öö¥Ý�qŸJŒIØ:#-  Q,ˆÝa¿-PØáûéœà2kl!í™¨®‹0«á‹hÙ£¼Ûp›äíØFÅ-f®å•ƒ#&Âµ¥cdÙ4•qP÷»¥h(ë}"‘�¨R"GYh’²¾*ÛJëp|–JBÖNaâß¢×á`ÎVŒj¶7­ñ³dC|&ÑråÁ¥Hµ�ˆh-œôÌI-¥_T>Yöåk¶�-Gµ’­Úî»C–®c”ÂË"Â:Is|÷]ç%×·ßã~;{ó·ZÙrN‰ØKïj¦’b«é�U7.Á�‘o_=n%”ˆ’$a¾Œ¡\º4a‰¼Ç˜º† ¼fP¨Š#˜¶èit7Ë#,NmøÒÇˆÌ-LV¨XFÊe¹î¶<Æî0Ûit^ûö\û!yœ´`æ‹¼#-†r�encéÉ±­ÚÓ]5F-ôºƒ‰²gbÆ­¯äsÓ=TtèÕ…¥áùŠoÆ#&ààÍA^–³8ÆÀl˜�!Ê.±o7Bù[8d±v¡øû˜7ðjšÉ>±¸vy©P9é2dëðÄš³˜ÇkÛMš`øË¨Œ)*RÁˆa õ±€Ù¨­aKsQaÚuì™Ž8'·Û—�ëóçä£,Væ î/@X[Cœ"edpÃª S¸¤$¬óÚZ«ý9æí†2!’J Þ²µ(¢#šœœ)-aƒEùnX=«(P¦Ã�×šŠ¥×öõñ»-Õª†êCzÃ›§úã•<Cî¹ÚšøüöÂB(HT{/Óz+ƒOáµÇ[Ûä�„Rû?ã¾‘i#îwiø#§2Éâö¨†¹vì÷]um*�zC�S™üq‚poàCO7OÉÉnŸˆñŽ&±6|ž§gÁ{õ~yrÿ§õ}W<{¦g[ÇÎ1«¨\8û}‘Ó®ŠÌW§Æ6—¼jS…;TÇ§O]æÜu�G<Ÿ�±©38z†ßí{_½Ü¦g2ÓžJ#h�#,æe0ÿw'EÅz`"_ëÁ:•ŸF’<¨:sˆã®6ë;{£ŽƒŸ(Ù>#(‰e!w‘º¨¦±–‚ºé{�6(Œ€Šã’ëOZÏ_}ÍÓy)1L6ðéšP¾·«>ºß¦vÙ’ôY4Ê=WÁZ¾»FÕ/˜-/A4¥Vðîº¨°ó-áMœ÷~ú££ßÄôÚLuÌ¤û¡º]rsa×HR1€ÖTÕ	Û¥Áâè*açu®|b¶ž—µïçw8É	‰&ö#-5&*4TZ*àjÃiuUF£¤+BG‰MßÖô�öû)å�Ž¿�ÀÆûc*/Gööj“;gRÔ”FÍ±s})¤YŒ´½åðmå,à´.{ç,%©©Y2Å–¸S†Ç¬˜ð�®K ¯r±qx~žÆ¬¦ºÜ‡œ‰	Èb2;ÚžºÃc¦P	GØB¼¸—Ã+{MªZPäE	Žœ�KJá½cfªŽ§ñÆø/|þåš=7¿0Ç¯ƒ4@øõË«t:ëQË	1�œ�QÇJ§^ŒÅ®Rv@0�<e2<Ž3·¥Ù�#-  hî¾îŒ·FIÌSä¹@ãg"Ä ÀÝ:9Òâ»UÝNmúÆ§¾|÷[6æ5#-O;šº&Ñx]�l½KÜ=Wå¤#&ªRƒsû¦,šªo_0#¡Áf‹f½�ö#,‡ëÄÿŽÞ«Ç�îCÚo,�E(ÖÏ²†?Ehr�#£”´|F³ão0Ó`œþ¯1.ÇGÝ?Þº�…´AF£I’_Øú8WPK6gb¥^eatGV©¢QÛwÚÀ8n8IhuÁÇ½]Bœ�K’É'#&Mó3„ž°W´àyä'Ž6‰sÊ«)‡¹†ìk¤âé¥‰Bî�sQ)Ê°sGM­3`À_ÑÝ[¬ˆIØ Sut*�äme  —çs²¶#&°uðÔÜµo‚û<£gŒÏ=Éon¹£3ü›ûy÷k;Xä5¯Øë•âøÍÃºRsÌ—�WàëâuZÐŠÉ°_nQ±÷A�;\¤VŒv�óg½Z’`ÔÛr{xÁ²óGÛ#-WÓÝF"»\ÀYÊw:$ƒ†Áæ½À=ëZ×ûð�'	&ih�mzÞñX9ÜË,,uA�U³rˆ#,ïåX<B“s\aå•Ø{½kÛYRg…l·‹è‰ZÁW­TƒŒ»ÊÞík(a19Å‚‘Îáë<¥ÓñsÈPï;¢§££|›ÓZrãBgÖ¦Ê*UBPúžû»µß9À!+Árg×êu¿ÕuR2%êz·Hø�\…Ð;|²ÑÒkI•+ïs’g¹‚�ÈöEƒ%¥0(ÿ¦óãP„ è‹O4m)e‚rDcœ™ç˜SÍÐý%ä€VÅT ÷ljñ’éräëïí|µ‰+šãN˜x®GµÅÝuk/è³¹tjlšÅP—”>ù·Fµžæ•êZ’&´ÕŸÌú�Ã¯$E‚»Î­ í†O£Ù(îÐºa›ü¼ø5RÒ‚ðÈ*PZ\äO�w�Èä7*(”³	(ã—›,EÒF�:EiNžHÍ™t;©ù!#JºñmiÇ¾þ˜¿L¿Ûfb¢®Ñ¼J³&œëâùËúáØÓûæ6¦­œ‘O†¯•ßs$õÞ<p¶¯ÀQÁ‰`´±ÁÎxÈê<_IvÆ]4ÓQ9)#QÕªÌ–8Ê7‘J®'@)e’s¢Òx™t<UÌˆµF‚J.¼�j›…ÔªÚ”�d“7â¶J¢®wnÔsAP>4½Ì”ÿTOZ�Ìlé¬|°úi_	xæÙÍ¬Æòu$Áb[ŒøÝ¾“Ó9‹m€�Ï”ßŽ3çZ4°�3ñƒ:=ñ�n�…3Ò´yÑÌž±_Ã<�“®‘r³äš¿#,TÁWI¬øÍÛµÃÑŠå{ùKz{òEøz7ÖºN<&¹škGL,…RŽ³<zÛxô_89SÃ9˜ãbKn_ÊgHÖ5ÅÃÆ­åÏšéæ9ž·€Þ-¢lhAº·bTsAþ#bØ7f6Ó�|Ýø·ø’YÛEÍÜ<E�á³Eûñ�Êí�êK‘­/|3Y³¿!áÝ8»êÃ¦éïÒ$HLŽ•»Ÿ¡°ŒN¼Þ±ÐçŠf¢éÍî]x:‡[�úÁÂ½?E#-õ¹WÉ�ââŸ$lSÆU­Ý‡„›4åOò�Ì?d	÷‡ÇðéÃ\+óë\\Mæ*=ZWŒG¥á|«�±éää*Á1‡E-øÁ„×ëé™ûNv�ž`ƒÞŽ#Îk¨cdÛ£Ç½SHdIZ©Vám�…ÊA„‚9ÛW (üC·É7Æ#-ÏZóí~ßf"ÍZ†n#-Úçºs™©IÝó×Úé‡ÆaÓƒ¡ÑÀþóçï�#ƒ5í·âù!íÎªÅf0RÚ5Ö½¸ë3ÆáØ…3|�hk}ÝÆø’íQ0DÁ#Þ¨Ã³Çª:£G]›Ñ8q}.¾±B;pÐçFäW®C¾ƒ=ð‘–a£T31œÜÈaE³ÉŸhV›>^-Wc'O©×†Ø4à›dÃøîÝ	f:‹.�"Q¿[—éWT½¸$¹ˆ	Êéá±-�è¼/³9Ÿóúß†7Avˆå}œÁ¡„Zw#-xoj•¦Cµ;Æ1æÅÝùÞ‰±#²ÎNæI-ÉU#&¦$Ô�'šãÆ·=¶wX™�&[aÒ¬béS�.×•Ò}}û—ª±—N�{  (R	œ–çKœ jGÏNQdÓ8ßë^tæ†@“;Œè#&Š…ìÅ êÔÿ§@ÜxÆ�ˆ7ÿ=Û:n@öýL(ƒ¯ÃUgX¦]j‚hBv›ÀÅ4‰s"––†´�ïË‚öŽ�Ýê&�}l�±å7¼d#&$óB¾uSÅS²¡¤’Ñn[f÷ìùq°kÒ>F½ÐêåñÏò#,—hàÊÕ=öä…!�Ÿ�=½«Ém³{Ä‡öïTU pï²|Gn–ÌbªGmŠÚ”�?´òEò£¢¦ñ¬Zö¾Ü	–œá]­áý‡?¬JÝÎ·Ä#,IáÞq’î§ó~§IŒ;ÌÙÕWÝm�Æ/Â›TÆ—Q�®±(äã¦Þ¡ÚüC¢¤–ô�žàjÉhY›Ê:#-HEzø´ÑÚD3ÐÖ ¤E<š9hKt>F‰%�ptg([û�,@$¡vÂÃ�+5PçšTM„ ‚ÏÙén+çó1Â7_êáôâ¹|¾{ë÷÷x“¾'ÛÍÕøOšRÒ¾.\Å#&>¥#&r}ÿPh®{#,ƒ”×pæ©BRaZ9ÚŠ‡CÕäÆ²XI	6!zP‚Œýî§Ûñ«¼¶C%þ'8ÃñÿYÚþù+�w-‰-'áí•ûÔlJE©6É±�mÕ×WÇó|kõ±9-#- |ô Ë6p+ú¼¬r‰¹Â[†-Ÿ<ùl_×„ÐúI–ÎfñxÉ$‹ E"ƒ²ÐMS¯2õzu8]¶)L-&O§ÀÌw§jÎ-œ»-½<Ù‘ýhfÍ…js’ez–¯t#-ûß:L¾ðþ�ÍåôŽ7”joGßt/}„ˆ~zàðü‘ÎþäæÌD0Áˆ$ª$¬È­ãøOè•ICŠB£IQ¹]ôOgùøœ¿7÷êÎ8¸—�îfïÏ_îËzû«úÁyk§ÁÎ•$NIÉe¢–ù|ïAÚžÉ}±—ø¾.ùð‡È¥¡ÔŽõÕ¼rmz8.»k€[¸#tÁ¹#,ÇòawÝædý?H6º©ë½¸“ZFèé©µ$4ô¥6.Ö�çô3ƒŠ\ª#&±|Ì#|Àý#-BóS’4ÔÍ#-�°‡X@£§e‰Ž2`vIô}ŠšÒ¢ Ôº—§!Ööø°™ààXüˆñ9C">ýwz'‰´êZ+Ôª³-âˆ4k¿_Ô¿fŸoÜJ¹ž‰V„¦Ä°�s«'%è	zþweœ}[¢ã(íø¿c;•¢ s=F£&È^ã.ŽAÕ,d¡fnÐ³ýo©0õ¿	Ï0�¶öåÁ¡-mú·'b¨D BŒ(#-Q!¯ÝSšÕ�ý¯Õ?'ªe)�Êèxþ¿í¶È#&N³:^� {6R�å;äÄ¥k8—5@¨Ï‹"™`/Ž•‡LÐ´ž,¤†åÔ“&$ÖƒŒNgP”–z–ÉgZ;ÈÞÚ¥ƒÝo�#&ú&P#,±¿¯¦ÃÃq“¹ÒÅ„þ¸C¶ÄžŸêÍ�Ó}c<hË>�••n~”V:–íB•¯«Ú	AÕ&Þ~#-óñˆ�v=fšîa»@‘Á¥„Lƒ‹’ø$qýv4ºa‹çM)Â¾¼rsQ'¯#-$ÕÛºŽ¨ãÄé©•�„‹•]ƒ{UP ¼’�e„’`+Ir²ÐB¥&XDàI-ÊŽ2‡µT#¦˜s³¡Í(`L$¼}�C³¿åWR{±€¿kÕŸ½ÝøÌ Fâ,´�Kí@|ïè¿‡î¦QÞö’A<|þ8ùO\v­(ªzšH‡x”·¡h#Óßw �’„!#-!»ÎÂß§úWBÊ�]K™UµÓ:µ‚‡ÛT“ÖT¥…©XSRý�ÎçxÍ°hŠ7(÷"žmïAÏÏF±‚÷l€ì„€>J©˜aI\öñ¾«{àš]V™8ã†6ßá2†³8ƒ‡¸m4ƒÊf5­j[¸ü6EŠ�I›0—t:ÕQHÄŽÔ“k¨g(H%ÃE8G|Sžyó¾ßQýfí/Ä‡ÇRò<N˜#-‚aÅÞÀ�f¡NÈW]²/Õ«v½»8Ëï•”àì“Jí5ðû�ºe#®Û$ã[Ð¬ ðß¦ˆƒäù:˜?•¶°òÁß€ “káÃ®ï�Ý4pa99/z½øò3ñª”‘KŽÒM$ñ¤*#&ú"¡PXíÙ®i¶2(°ç½CzçFêv6…²ª�ÄH¢ØnÛ(Ê,"—ãô´8&‚JLœm· ~#,éÑñÄ€|Ð9WØc'‰ŸKš³’T¢�©Ö¨„°ˆ ‹Í´s(f~œ`[èÓÄ_~Ûºqœ|¾Â©ú6síÒÏ§Ý4Ð�ì…¥Ñ^ú¢/>·Zú#eä„Š¨@È±Žq`æá|RÏ]¢.#&¨�’ÝßÓA€˜ÁÜyå*q'#-žÏKåAá#/ÎŠbSK–jB6¶wdÂáÒvØ×A|TÈ\µQÛË÷°h3'ÓÐ¡¶ñÔ|žDïÕwðôžP>oì>G„1}™Í#&x¹íæ‰Kšnøðœ¾÷“="<^O,³t´#-“âu?ÚûÿaßÀ)Gy–$ýðã_vÕp¼Ï˜iÍé0ìó|ˆ3²6ó:F¬f,Iú.}Ë„àó¯–ó‡ÃÝŠúÌàB�l#-`˜MÞ…¿"«—?Õ¬ÞoŠMÿ)D#-ERÓ	äÆÅ&ä[Ý¶Ðùž#&ŽÆœœULfžÐi#w)T�[Ç“¼èYr~¿•¹ÏØµzÒ ã=K@Œ+	q:Exk5Ë#—0Åü_3HWZpúäBË{8Î;ôÁxÉX;%=7Ò÷«�‹sp+&Ø—�ã`KH²µ6ÑàC’AÝ�²‚ÖQ"Ê<š/pp~Ž{Ü»a®;p¨x›öÔy^"#,Huu¯r#- tìaprsÔxÞ-w�ŠÚ“³6Jq˜‡}†ùfLí€‘`wdÃ@à�’†ƒ¥å5¹§<Æ³Ôü%~¹é \:m­ÍyÓxóÀ<"(^år†Å[‰#,±˜Hi‡s¬qmln¹ú+xÇs_|Œ»3_¹untÏLŽñX¸ï/l¿³ç{ÏŸŒAïß†åÆv±–âZÙQñíœä’àÁk"ƒíL«‹v<	9&jò¹•‹Ç?7%:1}Ù…È’Zák®1ç°ƒ¸E@:J½e#-Ð¼?­ØŠq{°Óß%–&â’’ÑþdWƒ–Šy6‡õR½À'qúÃšãÇ‹ÁÛFRçå‰»8ZˆgÓK6L²8ª1‚o�'š\8¸`À-€ #!C<×® lˆá2ô×8¿¬=ê6¶±†­œë“ó¹J¬jUˆ¼‡Ú•áÖ"Hi7ž·Üu�g¬f¡z·Ÿœ	‘åµ~#,À»o–'Áød¦aQ#ô¥†•`œt„Wƒ›¹ÓÚ80:øEH¥êkØ\S™ÑiåV‚öñÝØ;µÓOD/ò­.§o¹1ìÉ"�mKjOO©GÍˆúÆa‚\P)›5¼Õ#-ZÞ:Ç&­÷íH#Ñs[9•ûïÛÔ”ƒdÄ“ÅXoòR�„¬[©Z€Ä;·³ÓQ”õrÍŠNÓ"©�ËÏ”à=Øtlc&i^N`5�’¢Ã6¶�Ù�X­ê2_0 ‰oa!3Ö=+{bëhû¥ï=LH©Ý½«ªþ+Ø#âfñãò…‚íðØB”pc={qq%�~~aDÙbëyˆqÒN6#�\‹º6páZ9Ú’M‡•Ž@^©ŽÈ”Îg·”öx/ª¹1Dn§ðLzÓáC	½ÐrMÛåI>mªN•¾ž|4[äoëpq¦•`¬ÁŠoK®O³~¼¼Kö@§Ï~FþéfÕ#,™5©�SWÌð1ºj¶ôm#4&ðÜ¾ßÛDµ¯0I#°È¯fŠØ“Å€7ÛLg;0t •¼o)WÑ†aåqOð¾—ÔŸ1§C•/ŽkLàš¾)>™vdäQk„M1f‹uhXì{Ž9÷óƒÊécoÛ¨³Ý˜zz>›3ÒgpAïÚ=¼eX»8æ˜ìÂ¯‰Ó³ÚRPÆ*lÒ‹I¦ÆÚtî×çÄWË:c	ºðk“;ˆ´öà,p¾Kî›¦¦7(¶ä	2 éÙÙ|Ò”“žÂ&jˆWQ\n–‡Òü>)‰LgÈÂ9#-âGÖÐÐŒx9Óßt) ª™z3}Š´$§©öT’šÏ:Êè¤A½?ž¼v¹Z.³„C1i@•*§Ñ•îÂãJa)U�ý¿âÿ/½ðÚ¦™ä”¯öx<²ë‹öÕCúà‡ùy#-¨²€•è>–Iøú¼k,á3ñ ª§Ã@ÿlCäà>þÃÝ£×¸ý^Ïl0‡úR{>9ö`EŠŠª@ÂOìC¢�ŸÐ0“3úh!4ýGÝ÷&û€·Ð$žÏ?™ž8ø2¥àr”·È<óèT*øœ¶”�Hóuìâ@&¹UÎ^4ºç#&¥-Lªl†!ù°¢-¬ñB‚û(ÀEàÊAsÝ]k‹¦åºYú8úÝìyhæ;=›,O•zÈ‰Õ0ýÌ{j¦‰Pég¯»Ç;Ž{�l¾¾ËW@ÀÄâ*’²¨ßJš!ÚqîïTSlÄc«fªV…›yá8ö·»ù7æ©�Íû,7 ‚U:ÑÃÏÎ[#{°ÍzO‡u¯q¸^¥Ïc84–”*:ñ²b;xˆ X#&QúÆù	mÊºP†²<~ÏÙ9Šš¥êÞºi6ãm—²0÷~›:Ï<ÉkŠìH‚Iï˜2,€ïzY»·ÎªQú<¬�gN��òÀ´äPØ#&ô²#&{ã&ÝÇõ4¡ûn`Iš¹‹ÿŠ/„8+ðBb—ó;BË–kÄfS¡’£Q#&rPÈ\€	Ü Xt@Ã¤BÌ=ÌTL ‡dG&û9f–#&	·0"Ð;!``aºõBà@‚`66RÀ,}pVÉ•M…%Œˆ© —K”ŽŠ7J Dbƒ™C@—T1Ù¾Âüœ°†5¥6MR�7¼],fV3wE‚1,8H–U1·%)f°#-2 Ðd¢:žÜ¡PC8«ýP¶Ïtð�Ø‹û?#-§ýï_?Ï¯ì?[8ðøÃ¢,ì“=§u*	bwóy‰îËú7¬oúhØp>²à¹#,ÿÆ…ý‹q§øtx$–š¼ Ó€È†Ò*lcgÔÀ!Û^¢swåÒßºzè¦Zê…ïiŒŒÆò›3…µÓÎõGø³FœúPûyk¬ê<"i	]ê)÷º§´/ÐæÙÎ£:kxþ\3�M��¹ û’öÛt®|É•½µ}»$øSLÍË£)ìÌ/A Ø1¦†ÁJd¢UX‚Åº	Á¶spˆ›ÇÙ­Ül!„†hE"ÑÆeÎ®Ýáü{Ã`^c÷ï·!q×WôÉÅòE/�Ä…ÖŒÈùÂ³³'¹,â£€ßfÅGŒÃV#ÊJÜ¢VíA3\\[(0”•U—#Þ2ê¡ºs4f¨ÕeWûî<êŸ˜º�D–xbÃ¶vWCÒa°e°ñxê¨ªèý²ó¾0ü¬¢tîº­&¦>B~(x3Ü<èô-i¡}¦9ŸÚð‡Oq¶¶Ð¾Á–mãàæÔ®¿A	d²Ìžììòn1,x¿ÉZ2h¨A�c%‘VJf•,Ö™’˜¢÷·Øz�r,r4UU1¤”UBÎÝ}ºÊ#,ÚOsrx#\C9í#,�¸9.S³p˜5¡‹+q™¶ßC"B^úEJˆÁ„�Ü�ÏFHEŠ|‹"¿8šZlßÏ6íßQSÔñ»4“v1’�¦†Ç#kŠgÒ‡MGÑÛ#-ÝÄ}¨´&Ñ7—ÆJ’Ó©ž6ç¸Æ¢ètuÂàá&Èˆâ�#,ha´¡ ö(lUeY¤V H…ƒ¶·“aØ©FvtÙG#,…m7[¡Ùé¾Ìãî�Ri�ÍÄê98r¦î2VCÆt±®uÈ�oØr�§'ŒŽiÖò�„ž„z]Ì÷Ä3„ˆXv‰­dC™ÒgùôM*Ýy{zVF,O´ë¨&Å0ñœ“¹<ït²'ö(v²¢(#-H¤-ì·5²V±«|eY-lU®[W6ÉV¹UÒÚ½Y�wßyÝëÖºåUô|úX)4`¯HÅÑI²³ÊâdMñøWÎ^mc¤Ø1^<è*KT”ÛZ0àálìü±_>K7ïÀôrÆÔµJ�¦|Íù;:‚ÇD‹ƒÏ¹7ŸÊøñ·‘#-:5ô¨PÎò—Ã±ÀZŸl¬xÐt3Â}ž7S¤›éZM“hÖÆÌÛE_[âIpðH|Îù)š¸e=|t›OâÉä}}$}#Y ‹[¹4hõC¥pjªJYI’Io<U$¤µð¨RdœÌŒä·ùV°uì¯Ãb‚"Nò™„vfÇÂóX@“ï§-¥q(C`eE€´YÅBTlîµ½öÚóûkÜlXÐ¡#,¡‚UHJ‘!Ý{ƒ¿{¡Ôªãô¢qÓ_~ÉÛÔý´…UkÃ³Š°¹6©ä£!Õ’Ä<†ø2‹‚ ³2¥çˆgŽ�u:íß)�³œÑŒdPóQ”1’:Å4Á1g?fî0×>Íµããî{ì#,uï:!ÀI*såÑoÉ‹1¬J:ò¤´¡eÔ’Z&�#&¼}~ÍØé¿žªW@Þ#&›éÔxÆ1$�Ÿ!±ÞA¾Ò‘è0LðÉ1#-sV*u×+Ã4öÑ€åR˜RÉ-‰@ÁÎþ”t«:dÑ.ˆS"²(MÍPB0ÝÏ–w@Né‘–ÿ-“»,VÀseT‡ŒÞÁä	ÅåÒ£Rõ›´Q�€s3ósä£¬{%öÁ¿-ðƒï‘À¤!$a+Dñø ¢<� ªô1‹¤#-).¥Ã=yy¸ë³UÝÒ’X‚ènc/]¨Ô÷û›á‚µ>ÝÏERŽUÛÌˆªXîÔ`ÙÏu‡°K>ôê¡ÎÞw«-‰–ÃÖä;åÉQ¸OFÚvÔ(�ÞFæÚÉôTÑ+éRJ!¬Yåœ¬2/	Øõ½Ø&I hØîD0Îî§Åå�ÃNzédè`³og@–nÍ��ôgKŽ¶˜*q)•½@îï#áŒì»!2†Ë+)½ûþ3a]»-Qãáù·N;ÝC†Ó¥Õñôg»¥53…JÖK�a«_Ÿ·¥ô|áÐ(*Áu#`c4¢]¾;4ä�¢Õqlzg 6tÐÆj£uY`¬Ä(±jC‹tßWNµ€N4ºQÊ«îÃmó‹ÜÙqÚpkµ™`ò7op8	@…¶…#,ð´ÐM�6umã>.CŠíµ�Ë�@„ç@.œô0üwló…{9d×N’7#ŽFHÙ>èá=ª÷XÝf±©¥”ùö¸¤¯˜EwWÝÆGž¼ç‘”}#,o=ø=žÆóç6ÞHí¦vwéÄsÉ¾�v†Â}?W.m”õªwE�êõ‘½´™	:>Ž�YßC¥5E´%4�¢…£x�—‹&`e@ŠÁx{Ž(#,<h(ÕÉ{›&³=ð‚w,Ñ Ç†±‡Óš?#,4<Òó|x~½®työä¯$wB×-ïöºÝéÝ�OQ<aê“:b±pÑF‰Ú·ÇºÒ[_‰èc�pR‚ƒTX.FEpcDRH	u5×ŒµiÛkÅÎÐõ£§U›žÊîm”{ã¼ðŒßfm4Â�¹Õs®«h/l·¾q{ï.6ãâœ]Óä½+Š†žV�½OhLÁÉÐÏœ°ÒÈ$I‰lèÀ	Ðù0[’©Ô‡>ÌßZß™D•Á‚€¾’JD*€1Åž(ðA´0Ó½xÁ†ï±ŸuªÖº§4•ýóˆîø”—Ö+ÏA?·Š¶{7Ò}�…á’u@ì'|ldêB�Ò#"TtÎGR¦âd�uB­l´?îÊ�óÓ’$X²á�IÂ·Y†QÝ|Áì9Õ&ÃÖ	¢kŽ%}é³²xé][lâoUµˆ�(ç‚ PÊ1‡½»!²|v<Li—(SÄK<9(@§¸ÐRÝ‰€9_PPžPehqjh]²å�rîÄm[Þ™°¹¾Û#«í±¥¹2k­�^¸i#,„¸ãÈË©]ÅMâ±{‡v9)@á²ú¯Å»Í�¤uÙ@ºÛD?WN—« Šq?jé']þ±iþylˆ6Çq²¦ðÎ«t”¬õ9KGq{L�xÛƒ"Þ}]ì#,Ð¡œõð-1g^Úñò•<¦fÒƒÀ€ò~G¼ãuÜr�œ¨!Î+Ô11›ixhôì…Ä�¨ü+9;ºNô\ˆí"HK06!Ì¢÷§nN…�„R‡uÚ¹iDÑi<[¶É¤ˆÄ]Bh¬Rd;ƒF‘¶é¤‡t‰£‰�xmqÐ„†9“sbXd�'ICP#,ÎÔ$Ì'‡†:eY³ƒ;âÔV’ó8ôÅ;Å?#-ï²�a<z#&x#á@$CN<ì´ï©Þ²T£gº«òs¨É»#-ÅU)Ñ¡�)ä©ÔèNˆpõ_Wë±F¯¯¿—ô,IšÆö»�9€#,ˆß¤#ö˜’®qœ”¿›å„.›#8%�¨x7ñ÷çÄ¤ýº–Ÿâ~\'±ÎÆÌ¡äÃÕVCG˜TDŽÉkÅû(ø¢%&¡#& |ò€ËáÍ£_è˜í£ÊÏíÁÚ9'Þ•¡AêÈ|qDÐikt­ÇË8²«âK<wêÐ32¢|¬O³†ÏÏSÌ2È7=¶_(g¸ò¢Öçæ#&�¸Ç#&§:¬É¬L~È)G=#ñ#&bi´Çµì“¶ ü`xa<É Ïó¿/dÃ3#whžÎ£—ÄÂð™IPMßøŸŽ%Œœ�ku�^UËÚ€™Húã%ª“¼fÃT—Xf#&Ÿwòr•ù¿ÆZß®S€E_âþaÒD¨#-Œ�R"å…¦}•ýßïùÝÿ£ü7Âx§/þx¶¬¶çD°þC±ŸàêÂ�ß­C…iüªå¦ç,ž…q|Þ&öW¢Dô6;À~°~ò^h›Žo"&è1DO‹ñÿ7—öúþÿéûeøÈþK2åÿÚÿn-îwÛ<f=&#<DÊß75xsó\Oú»ëjö~z¶Ìís×¼÷zO§°…ÓýB± ¨ÿÔ#&�L»óË>÷JÍ´P/ét<u½³5¬}•´™M¹NC«�jêêÝZ†¬éÉ3:íü_ J|ê‰TB¡#,ãðC÷þ¯·�TøfçTûye¾c9ÿ{‘Ìé†«2i	›ŸŸèó:só¿•+Wçwœ�ð$æ’™	ý£%	‘HÁ]Oò6#r…¤¥|¿¢ûÌaŸÈQŒögûŸ¯†OÖŒr&Ó¹ý÷,lÿ?ó�)vŽßB¥©6­Ýx¢‹â1BüÊ¥3U,X†^jÛÄgÈLôÆº¢s¾!/¸:�â6« Š:èS.‘öö#,B›54Ò¨1*7uÝŽ™Ã7úy×›ý='ý@ïˆ—g¹$.ì,¡æZmë¼9q·=ø6^µÛ�õ×§ÞÚf~À:u€%¶LÛ ‰<õ,Ö€Ò&#,xGO£HFÏ�‘­Ü^¯üO™ç:;}l,BÏec­åÁQÉTfRXQêÖ<îûkBz@Õ�ìªcPì”{üý»}ÖZ|(g¨ª�´½þX\yn�á(‰th	$b2%BÿÐéþ¿ŸOLôzWJòf|™ü™çhòœ¾µÚý4WiÖÁ£QÆ™¨M¥<¡é‰™/3y»_°Ëý“ú#Â&èel?|4½HÇ¶š ÈÈ¹Äþ³†þ^ìþËr•UÙ-ÇfÛ±vIÀ�btjÖÂ²hœœo§gX»ènóp·Åù	`3Í/Ã˜"hÌqDõO“X7@j¤tgÞ®Ý\ÎçèÚ<wù½åÁ·ø®õwÛ	^TÏN-èYJˆ0|¨²‚¹ýæR²ö•ÎŸÌB�;Mˆ€V%÷ff|V³+ø5­yoÚÞJ�Þ„ñú= {ÇËß´~É¡¸¨fUÝwh_%}§äDÃ¼Ÿ‚‚H!’Œ/Þ‹üiû8æ´#&‡µ#-hDgöÇ§¸tô/kIÝq{‰r³£Ð4ùöTtDäâ|�6¹s¼zkõ×ºQ[@£ïÔ4&L<Á<v.¬_­^­ßíÜ÷ö�Ü?úŠ:îíäôwîÜ!ñ¹¢½œ8ÓÍ[cä'øHö./ˆñËC“Ö¦.€@3A«›å‚"xKù¶¢WŸ¥º,DYYÝg»ž]|:#DuHòè{Ô2¶s:5À‚[»ñäÍàwàÌ>Ûžþï¸û>ï›¶jª?«Íç÷iú9v^mçœÍ¼°D@#8¼=DvG‰Ý¦ùŽ‚Òåµ@ÜÔ~ò�õKáêáÇL‡Æ1±=Jýwmµ¬ðGDµàÇê€pâ®hûmfqx.D_š#-”HßÛ\).ñ‰¦iÅ¦¬ŽÜ ¥³ý=ŸÍÎüà7‹9¹uiÍäù$ÀÈZØS3§S?S¡a‡C¨ªí‹ü×ˆçÍ°‰]’Aý·Ã;òžVEîf HVß›§{8a!•–�Š$U¬†®‡uF‘n¥Y:Pƒ!��LêMHšÆADâªÂöxûxÌ&0ÙVîl¦�257²\Ã=ÒŽo·_»àgÙ|Ê„‚ˆ¤B¬R�?/¯žEÊxsåµ˜>õ8ACÝ6HˆÑFa°;Ëè²Ûf«V²ÙIaÚú¢LbµÊ\T+w¯áÔ�„•>Oà}ß‘êÏ32ïè¤ÓL»BGãDû#&°û_0@ÄhÐ"kæ±Ž:ö=øÎ~�P–˜ð×5PµNÓkïÚPz�á¦›8¦†Â#-Î6Á�Ý!®¾t Ÿ¬­Ê)+m`çRò)ÿ;lÌ«’ºf�™˜ |7�Ò÷Œø»U�*~iUúD|’ý­p•þ #&A@ÅêÀù`6kwaúõwúéêáºad@ËÌ¨­ ~cª·yïÏ*íÒçCfQ#&8‰RÍ8_}(Èšµ#&¡ïÃf¼xõ(ŸèÚßÃW¸0ót»â#&—{�ºƒæ)3æ}H¹\óúh£ã}\%$P…¶¾6}l3œ¦äÁ©ExôÞ<Ã#&ó9ê—®á®»X¿»ú~eŒØÿ[©DKž)Í8ñzò¾sz$ÓáªÝC<ÉÂl¤ŒKá£èsq!YdT£|û$Ð;cUã¾ç1ÚGg<bö“ûT-Í¶ŠKž‘rðð£Úûîÿ=î0·æ wŠ.'|xfª«½>«‚¶±›þ¹3ÄÒS+ËPhÅu·¯SßßZ!%²Ÿ´º)$y#¥êó‹ªO×Úôè¯ÛÖ³—êøÞ`Ì¢ûKCHî!Ñ¥à´ZkV<—Ö½±Ÿç!èg1³�¡ÖÏ¹å|MÜÚb+Åý¶âL¦DU½1U¬’\~]ïx‰7=á°šR›`® e;xó@<‡Š³G‚­Ï#,ú´Eë|9Ÿ{¸Y>˜q©mVbAÐª9XBOén½I4²ÉÑ¹>“p’ò:�)¦Ç>LBª2#,dB¼¯ITÄ¹”	/ìQÊ�,¾!ö…�4P¨t&”îð:#è”c•Ã>‡à~^o=…ÍáÈŸçìxOx°uÑqUôÃ¯qcÁ´§’?ÇeVÆˆ‡ÖÌšOú=…¬3ƒš€Câðqñ#7_.ðÚ/QöšM¿Š„ˆ{Ž.{ÄñÐ¶j®¢öãÓg-?íxL­ÒÊßÜôÕ—ÊÅpñI¤Hš™ý»\odtözA0¹”TIKƒ)»K ‹¶vUîZ4‚¬"Óu’¸°Æâ·	¯ÒË#&h¢ù\l²è—HI4>Á$¶5êŸ[–Ý7.ûtQ<dú(÷áá¨{ÌA;•¦Ú\†tR»ô»!W]çÃN(3™Ë»­�Ô‚Â®”Þ}‡w�gFcË'²¸3ézgmœœúEz91;¾!ëí¬Ç^’è¹A®–xÂéÙ“å< é½^Â8°ði<À0ä]	eœÊ`ðòÔ‡%<G”z¦÷Z¿Ö¿\±a”búkf†µ'	^™/ÓMN»”ª«£ØÝõÞÇ•yÔ´l'ü“¨—o§”¶½,õyšâÍ$ÃõE{^@Ã#-wT=6ûNêÖ­}Ü5ÁÃZ¨0‰cš°7ÌSn�=(�Qª|‹Ó:)$wÛ(#ÀxW0!Y&ìÿ½ìô�E©I:)é—ÕÍB�[¦Úr¢}‘ö�³ß¿²\ÙØLSˆáÍé×ë4qON¹¨i”SšgÄž±ˆh¥±¨œÞUtÌVU¤/›Lš"‰uö§b)ëi|Q:ý°}‘>ºæÊ©Ëè–~ŸG>é%ü!U4ìÛ?–û›;õvJ"ælCÓ¼¥ä³ðDÇMeØƒØCÂC:‡t!¶ýozÃ‹ž8­øÛ>¢ØëN°áBt(Ž’Nï¤¼gBF2þ÷qM´{¢§Þ]Óº-Ït%nOf~æ±Í¸Ãà”äøM>×­Ó=Uâ‹iAaŽ(�Š)M6³ç�—­àY8qòJÛ»É÷xnÝn{ÌzõµÑ�ËßÇ—Ð Žv‚‡*2#,f{ÞsŸÂß,¥®ÔzëÔ¹ÊXÇç€WáÙÍ¢*jNÕˆ#ÕÌ¹^öÞ»!ƒÖW=—:|ç6MAÙH3…,.ëåÔ×¾Á5GQêŒFÅj½ñ!èRÍotÆ(Yðý4S‹64k½/Øç�~‘udâ�:|ý/áÃƒ·t¯cƒ�`PÙ¬T¦�¿pö%OðE)ðü.d—´NÝ÷.¾Üw+=þØxÉnï™�/”¦Ïõìë¢÷�ƒKZyí‡%oÖ'·Õ•�AGG|žèƒwöÕQó«6ç¹iûY'.þ×Æ	äo¤(¦äh³ä\ŠjdäW¹MØ£Çè£Ó<i>g¥�t°‰‚1ˆ>WW´W\ßiÑÄTøƒÞÈäÚü­®Ü¥ÜM ýVÑ*û"<½"‚Ï!Ùá’Aú&Á#,!€ç¼qö]àS�OËáëòzzû°¸¤HdÜ]¡@O¿ëð†'y�gÆ¢~ÁãœÓ¡ðï|æA©Ö6&eÞ*ãêŠ#,6YÕ:½‚ìª�!$#Ž†e£4œ0€p&~ A-Ü;Çv>ÛÄ¸,‰aÌ8.ÐW¡SY@Ïö4�X"%vªÑ{.ˆ6 t‹)z1G²>æÚšŽA#áDxÀ�-Œ}&}¯ÇÍå�BâiÍHB8®ÏÌáÐ–_ïMå÷1$7	®ÿ«ÝwŒCãð×�Ä*	Æ]Õ·ªŒ‰²#P©.Ãö½Y‘83ª[I»€Â•ö²ŸÕŒ£éˆå:ø	˜µ§ŸŸèWNÎC²~¤Dq¨èûC%—q2ñî³Öc—#,±ÙÀciä�øQÇeÓ$ÎŒ4E…T(— ¸ðàý-àFŠ,~Õ�õBXÐyøÃ»¼±,a�¯Õõ\6Ã“ôš%	ÓÊè¿Î÷Ü¯vö÷s.¡w™çåÚúàÎýª'E?¼ƒÛáÉo)Í&Ô%sÎÑÊt7àîrìøLŸ½©Yâ0¿f#-óë·ô—Â0ìk[m¶×ôÐ›£�)qt½è/ª+öCÃ*\¤^öoöQ[÷}øÙ;´ëg½#,OMo|UE…Bîr®´Od4YäqßÉ‘¦:OjN~…ü•xEÄwÛÔî¾�‹žI�Ã3iW*=WI#&fF€°1@ì‚iUVù¦…Ëó¬ïOÑ-CI”–GÊÝ!ñÍêRsO±‡£/!G$;çPäP«4¹=¬Ã<Øx9MIíBðQI€l$¡!"]°ô:‘q7r·z”2”W™GXÊ¥‘»¼È°°88óNý˜ì8]ÊDy»ÄÙTS#,]D;¢€q‰sl‚#&é€Y€º#’$ƒW¤@¨øE^ñªjU¢ê˜‚Ž#‚7ˆAWZ¬@LCª¨¼È'*¼tÛwi,ƒg­Í:Ä)ëòÊ¯³›Ã+Ê?!R�ºábÌ�Âî¨+ï—;œ+�*óšºƒs2ÜbDÏBZEáâHO2ÎC}»í$ð}ó^zb"Ák×¡ñ ˆ¨¸(¼#&OéŽŒôþõW›5«‡ö'Ã<aYœ	ð±Ä´Pœè´êÛ_ÞùaC‰¼{ùÿ&#,¿�»÷’`™=<�ßÍÞjAûµŒ	¦áý¶sÿ“’qÈ¤Xñ)?y#&…„Sôõ÷ýÏ–C·ó:SEcó*cø…©_Z•œ]²RèúÕ�Ÿ×¡Â#ó�”4‚gÕÎ µ]å"Ø“´õ`J%¾?ôŸ´ÿy³,áoú#,ÖP=$n}Ô•g?ÙÓë‡#&>hdÒ#-û‘C 1R¼‚ŸñÛ«ù+ÿxñé<þtÿ.tÕÜ!Ô1mõ/7Ñµé?écÔ6v+Ÿo×ú¾^ÞŒÇ`)$ô‹ÜÄtt†#-í:G„Q¾ã©õsç¦rÎ?Û^kX÷çl^?´ù§ÑûSú}åf8P`ŠcW0áGµn±mª�\}�úb4‚I ©{"#DýßxH'çêî�yó9  3#, ~¥íÐýb:(àçIÐ·×C¼H#,#ë}N!ò—Â„”ñ°Â÷ý>ç«;æ^°5~mÂCî–�vë.’žò	�áT÷„ $J–$[EÉÞ÷›§s¯.5º}¦~€?l“L‹ØCHnúoŒéçÀ¸`: Á÷]«j‘‰\Œ	ºM`tÀ¨'«³U$�ß}4ì„?V#,Ø¼ÏÏæ¨;Ù†¥@v¯åÛÔ3•#-FqÙ-åËˆRƒ ™ŒÇh¶¹BD”è"Bjƒ+1�&=ÿÃÝJ¼N:æ.æ ¸ %#&#&°ö²å±*#-zü°¸€5)>ì�=$ké½oCÃÏðŒÊ#&üõ(RƒÂÁ”x�k…òÚ«ìR|ÇÏ³ä73 ° ¹P!DAR&‚NŽ0#-±ƒzY*¥MtÛ ìt²5”ØX"èÏ•ÎÎeÕ.ÄŸÊœ€-„âoYâM~(¦Ú˜ó |t¢qêînmý#&œ›Ì÷U\Cä½q#-w;¥¤òª#-ÌÌÕJXG‚éæš‰+Àšëï{³à–Ke(Ö½#-¦±©0½Q,+*ÚJùúÛaB2ÁÃ97Ã¼7)Ýùþ<YA¤}Vs{Ú¡ß†á¸šfÙeq5à¤ñ>Ã)Øpã8ì®§â}dˆcšˆ®„‡Ó‘ÔŒwáá#ŒÂ,p†“ët‡Aè•5+ÝldèwäÕÒzòã;CòÀÈcö€ü¶Ê(J“ w>hço-qf�ž�;Ô¾)28à M´#,”ÛÖ¨:ßLú<FÀ¦j›CiDp¿Ë›Ãª¡§Òš¹é9�Sr³€ëÜ-ÇpvädŠ#,yûyçÍÇXmsÀˆ_¶v?T_"'(PwVR«6ó$¾ZgŽˆöWE÷#,7A=GãTP‘)þbˆTÏË­Jùy¿ÛÎ�AM*€Oe<ª,Ë‡ÌsºÚ×\DD…0!CÂôkT£¹þ(VY�]ó÷…ÈoX¢(u®šÖƒÇ#ýüã,)-ým�WôýÊ<rY�V“†ôù~1éÓ¸ûÈë^­¹‰»ïesÁH  !þÒ½qdRl/E°ódÂAÆr·#-+óÁ…G�æ$ÏùõI·sú!9®3‘vt…Œ¯Ó%ñtÎÅOËðMaî­z´•„Ã�C»qùÉû§!úáü-¹Æ×Òw³î]TÁÌ!L„®»E.øˆ¶4+ƒÌ§qºH¼cÎË[aÒdÐéRòðã‚·m�rs¦ó-†Å”¦�3„ ‰Œ¨v„ÇÇ¤óÓ–,íú÷á.ñGeœ)»ÓÚ<¢è–ˆË 3G¡så{�”„$ru{7|s†EmÎ×ŒMoÝ”½ìCÊN‚AX>¯D|sy3&ßK�U²Énwð¯KuÂq<×Þ,ì´n6æHãÈ&˜i+™˜ƒÌFó�K‚ÃV:Žžy¢%ðTY_&†€„!&—õDs~5ZÿXç†|ÑA~¸{#ŸK©²-]@jX(–Öv§³–²´ÄšbÐhŒ†©O=rj=—Iœ«¹·–Ï{ª_GÜøâid&ó�†oO·’ÝkràpÎœDiü�óÑ§ÃÕ‚É#e85â¹½C7SýÐpõÈÊS¬pÙž™Ý)ÒÖgR©¼ÞqZK	ÙÃ_…ú{¥ÉççÕIÅç	WDß|t²û{WãÄ’LÕÙuDuÏh{Ùûñ–÷W‡Nr,aü<!*ÜE�Û‘"cƒ¬†*û¼Àà ¢¸'9˜%ôKm¦E(SÂà&#,÷›K#&é}�¢}ÊŽ½EGCfºåæÛÜ]qèç[îÑÈˆV›óm�ûYñvã4×_¿à<#��åƒd`sÓ÷àÙ6vù<3ò¢ÞÇ¨ú�æa[V2°æo†,— pþÏÊÚm?NÿÑ,ø;S§Mh?š%KvW%QúsÃw;U«àÞõÖMYöÿ—é¹<·-zTŸÁùZßQN¤|"† áùû;N“¤7L9éõ{ZCkNØipä©žcÆ.›s/öêâ\B-áB´s´Áâ�‡{sl±©ŸÔú1ÁâãpÉÔ:ùŽ82°÷ONÝTCô/ÕÚ~]Ùû«á#Q$t’“4‹^ÝL¹µr¯©aRÎ˜õ!³ýJèm’êybêö–óìäÎÝ¹`2F#-äMÅj#-h {½4¾§ç–·�Ìëq@ Ø îyîf4ÈZm½«ê­ãÕº§‘bÕ\¶Ü,ˆù>_Nž¬¯¥2P.Eµ/shÂâýP#-å?cšJõEˆÑ›„…ïM;õ5gñ*Ð%U@Äœ0€%9#,,ÉrKÕNäòyµ]ªIVÖAßl8D&¹<¿^¢�¬#&Û=Ï…ƒÀIj(‰FBz7£œ A8¤yæç½â#&Œ;Qä�JI<¬¹ #&‚p¥£ºIäêñlÛœ[rèµÚHAÅÜùÿ)‰6Þ»zö8—àõF¤@™k§J?+?äÓ¡mW‘i•Z¢‰ Gœê­Ÿ1uá&(�Ô×_q”Då²g˜[“$g¶a:ìñk¦Ô½á6Hdû!†êR [€�mâñË)	 aÁ�6@h[4Åw¯‰§ðÚÈNà+Ûbv‘“‹¨êìdì—ŽZ�Aª$-]ÛðÝŸ"üfÕÃûœ8Á"‚¦atv÷´ª¤M"Ü�uX²—Tá!‹¢ð¨¤	Å%kÃ�’…Ôü#¦°t½àôÚ­‹ú89ù%sÏ'_†b#,öË'iÐG5«„«g~i3šâîÚžÐDÄ³F­£Ä?½FØï1˜]�wIÏ)æ.Ì€f,”¡Ñ�—‘ê–‡kµcºð5¯ÒýÆ�{i�ùéÜÒXŒ3ÄIÍffQ+%…3Q*d0~bb˜#&Ìå"¢eDŠ�y”ÙíALL›Ðêf7j;µA=Ã£á­W§¬+i:öµKˆ€ÒÃ22…•#,²³3võp‰LŒF{…7ƒ#&ò-®�³œ]…âRkß ×øðŒ‘çFÒtŒ‚Ô÷¯­FÙl×­¬õúdë–7âÎ‡èÙ-3Xlqƒâ<Z2jˆ³#,Yl{Ž5Af² ¥Ä#,Mk�êá)»üÑ´äê`l.ÍËµrIG)Ø‘z?‡½ÌÖ_ÈB'Íi¹à|¯ÚIR¤ìÛBŸÂ®¾È†¿%0ñÈ&³|Ã�HÀà.{ÑX[YBB#-#,TŠsrèA=åz¢§Žu{Îþ�Sé5MÀ‹õ*(]s#,çÅó;ö1�GrZoú<�b(}¼š ¤‡4Ùìy›žÏæ4?Æ2³%êÐ6�ùô*–/a—n�vŽ×iêÛ�J¸duÖc²"øÝßpjÛÉ¦AcÝYü;a¼:Óh‹Ýçí+ƒZÐ Á‘C[úDWæwÎ‚{»G…�êC•‰ÒÀ„¡L�³á±Ú÷e2}ƒ[c’ëEˆ(+Ù>¬{ì¢>‹v-„œçé("­‚:$ZÑjˆ€ø=@Óªƒ�úpMP…¸E:D¦NŠÎ.NbäFI¶ôá¡£lU9›�I#,�?<;°5¢Ð6ãeâò¦ÉÞ-@¸#&�õnDJÙu;›Ï€yÛ°ÛrÛÖ�ƒÔdGGSìFØµï²QÅöã·KÚÅÆÝ†jÁóT+RÝq¾q1]ÒžEh1Õ Î¯Ûœf½Ë×Óz‘mèCªA¸Ë|;&ðŒBÊ²gÉDËk÷cÄëa ÉFNÎÞ1^->0Î”"oê<~ÿÒæ¥é¢Ap»•ð)+\ÜÕ¤ qè6€kö×#,#§G±·1p%´�a#&¤ý#,±#&x·s ”ñ‰Æ‘yn5§;F<¡Âí÷‚§0yvv“Y<€D¤”ÖøõBïË÷–-Åºy~éoÖ“îU�ÆÌ˜Èyo­"#y˜#˜‰Ë /ÊZ”ï5‹æØ¯ÀEë~#-Ð¸:{a _4Òá -p#--¶Œl>MË8Ù#&ÂðÄQ&5Ç–“…mÆ¶¤r<Q¯mˆ¡”“ÇWUÔMc‚‹öëƒ¸_©Fºõ¸;H:€`E¡¦‡XÐ-1	Ž²‚Ø‰B±�X4v½-€|žT^ßˆ¿·Æœá#-Ej¸#,pÀC	áÀ<)Mg†¹pÖxEáÃšüf£Ø¨·#&<*&ùÜÐA@n~~~·á<8œ,¼[ l#-È·²"{çvÊŠÎSÇ¯ªá«Ú¼.Z¨JjY»¿{’[ê]Mt™oÓ«š—|VÝ¤øÎ<Ô¼;âæ#&”Ùüþý[>ÿ°{üÃÝù´ÈèAÎßK—êŸÐ#-!¢�Í¡Q"#-Ée¡÷��'ÊÂ‰[M8�	!FXŸ‡gbÒ¨Y*·e#-4Î<IÇcã‘jh‘#,àÀöü�AwŸ5-¼ZûñÄOáóVÔò9Îf¡»“#&|'Û¹yyBÌ#,Õ�£N'Òe:ïÍŸ£ò^¿Ý½|¹¿ñÏðò)Øz%ˆË(#&.Þ00?y¸}°´7‚Úégƒ=ˆŸ´h@ƒöœ0ÀêÁè�¤À­C#‡÷{ÙØéÏáôàVª³·óeý§!öûïøÜ›hNÒ©D'2•9cYm¹Ÿ#-ýéål‡-ÿ�7Çù&„ŸÜ‡ù‡ö¨*ƒ#&Ã5ö23�¹Ÿíí#,$j7þUP©þç÷’êYE¿úv+é‚ãa#´^!¨Ø”Xáªrb,#&Ñÿ%¡0;uÏù™ýe¼óØ÷÷Xâ}p»s¿BÃo÷NM‹pÿm@£õ†n`x#˜à2éÚŒ/¿¯Àà*j ™¡´îK�xƒ.îÞB¼wšTÄòìƒšï<µ‡Ž%#-«&|;á1ŽP•âÉô©F#-†ÓmÙ�-uTy‡üÜÃ;ª§hy5Ô£Ú=èîNÐ`pz{Ã³ª0ú>§ ú—Û÷ Ž†°Èö£¶+Q_õÅRÈ¾!Ýî"v	¢Yi^åÏè»ýá|ÓaC˜ÓØÛh\þgÙ’#&äl(j$ �gWêÚÜÍ=î^ƒ±ùòD�ù¿‰v=ÝöºœªÉãˆ	~Èø¿òêØUÙüî/Žœó,Õ!nÿ@zÀ\À%ñ+ÎyÎ-ÆeÉ$#}3`¯W²$_Ùxˆâ—, #&R°#,e#-Êò:5Ãìþ�ù=?œ¯ÛmÄåé`ÖÛGwj‡a&sÙýß/Cã÷…éu> Å|§Î=¼1Ü÷v‚ƒA¤)ÙlÄû 8Í#Èû#,[¢_:Zƒì+[ÿÉ§i'ií@¸[�{�½÷�ƒ\iä>(n¯È8uÿ)pwumœ6µQhÐ,BÌ—)Ïøá&ÚFïP°#&ý#,’�Úka¬('ÞŠq!ÇÃb`Ó˜Z’FBMn½	‡Y)?©ë)#,»#Jxr�¹³ÐA¸ÀÏ†•*¸Ü´>ùþ>aäëñ�u½ÉÜuÉx]í»Á7-ŸÞI¡´vmItÌ| söÛ?oqÂöžVÆÈ¨7RÂXÆ.ÈÈ’(H0µ˜q½ p{Ë‚îx­)F,�=¾ÒÙ²"�AÕs!9¯C¿×QÊxkÁpá6˜V9'tÃï+L”�VØìƒø$¨Tû«ÎõtÒ’~o¸/rxŸŠÈb¬¨J°6Û»Ð^±8k ]B .q@Æ¥�1�Á_ä-®_ðC×Ñë#&ºwZÁÀH“_¦6£�áû,¯ðwé£èÃ IOÂm�´ÙÃ×Ãáä÷„”±ÿ‚ã(Ï†ì;ô6,#,ùÖ,Ä‡¤{dx`¿·ÿG�aR†³¡¤¨3ÎU¼Ò‰DZMm¬@�x|¤ Î#,H¬’	ùç×çÜœÏJV=ÿG®€öÊ¯¢ßF)¨¯ÒÇùkvÚ9uÏ—Ð~×ÑL�ÑÑ†ÚÅ¦j²’~of›Xe×ÚC¨"	eaÝg¿ù{ñtÖöLæ÷ã™÷/òx2Ï¿`gl¤:¾ãa�–f§C)(Ï·%îH‡—+X¤dŸ@Ò{üŽÝ‡1†Ÿ�ó†Ö²Û�~0)K~‘çO ’©„J€—^—=¦æ÷;Bªi@;#-pÿ¦\5sÈ³aÛ¶¿–o¹	ÂøÜ¢µ¿«kOà‹o>¹¯ïòÛíÙF³ƒ<cì’X)#-ª©Ý$’HW‡{bWéëÃ6HôÛŒqâãˆSb>÷g‡úq—¥3à îpêFA„#,ù‡^†FPÚt:Œ×H;Ýþ½5f©fÙ8Ì’ÅÚ¢›eé‡Gð/»åë¨³ö™Wä„$ë7KÀ�áþ>z½xûŽgi#-‘ƒû’†_2ÂÐV]O¶p_ç›÷ëP4KÏ¥ÙF/_ñ#Ù>¼U^ ƒaáÿ½2p~Ÿ0¥ß˜‰Cƒ�XŒgþ‡‡çúÀ�®•ÄOpØÑm#-gSS®a”’ØŒÛÀ¨à0UÙÜøg²Ý!—[¸@¸Pd03ÿD¢¾åŸvs‰¥_n61°bcC„2æ²Ë�f‡0®}ƒaÃ‹ Ø8E�„ˆmh4~¾#&»wïD‰‘ÁÍàQñôI¡ÑGS!6>¡#-ÿ7æÿwD6ý¯Ý×ÞA ÑCLŠõv)¸ÞŸ,Õ{g4;;ˆá,¹Éj/µ°P„ øÜ;C$”W—²#&#,B‡÷Bç°Àq‘N3¥÷ÙP~ä¥L#,o‹»8«È½²d-‡€’áÈÈ‹7Bšh!65#-a 29jSFja‡@&ff¨´Ø;"�¢úz•÷†¦±�‡á>é•@XSQ#-D×[ŸíðUõ#,fçëå	;Â9‡{×i Ñ:‡¨ÁPÏ-†oX[FEÔÃ� l$‘2�þ¿Àû»ù®[¾ô~x¹‡õþŒØ\ä¤Ÿ»m¸•#-û>‹ÞDô6þ»‡éë×jMèÉI—®Ý³ØÆÁ°~îùd–¿ñ‚æ#sË%¥Þ£p‹LÑ+¬�¬Ñ¬ÓÖµ#-œƒd;@ÇÝš|Ü–ÐÕ9Sw#e™\¥",ÔŽ¼’I$ÍTi¬Rb¦]jjKK[m<Í\Õ–³WÓ+00Ž¼eÔ1×¬ `èñ=ZóZ#,X††µ½Ó7K¬2=æ;0Ü0dK•¤Ê±Ÿßd£8ëôü$;1¨	ËFÔZ·Ûkoäÿ+ãµå&#&Æ	õ0	˜ƒ" ý€¾Ô	ªä°oçášty97@ê¬BxŽ«þ—÷o¯oU¶_ÁÁ™¥ 'Üî#-¶Ä®…ªI>uzšºDc<òï2R_¯¯Úº·Š@!ßãîO±Ú'*xñ±%¡÷éãhKdD9öT²jœÐŠ)	~Ç�úr×ëô÷ÿ"Ë¶Ì‡Ä"b;MCi	¥;ê-‘:]êË5ƒ‘B–Ê#-M£ãL“§ývãXÎM%oqp’I6Ä0<l<(œYIMgn‰•ï™—‰Dø>ˆÅÀ©šÂST•åÐÊ‚Ô.À*oŠÔr(€¨RŸÃ~í]bøšƒç.^—Ã%7	éßáX³c�ÖúÌãtç¾”ÁÝ½81I$I0¬Àýä®œfíJnP*e ÄTB_åÙÝvv~øâ�¦ßSô+`ú˜êpûÿ,Œlíˆžžîæ�WwÌ­hÄþ�amûXÅ´\bûD…Óé·#þMMùÏ@#c)Ÿh	_yÔùç²Yåö•RŠ’”¤Q×Šd&Ý z¦¬·Rl¸…³#,ñ#&/vlK*Šƒ”’YÒ•#éú�Ùók�oi]Ú#,Ö‚öÄâa~gã9E|„… ¢†�ÆöIŠP´þÆBØ¤<À¢b€ÒpA¸L^žà½d‰�ynV#&×xw]À/’‚êŠ!�°‚¸³õmã…N?:ˆŽa#&'xŽ¿(,›\{¼„®E¼.Þ?ˆú­¸QÚ>J°™DŸ#-©'Õ®-{[Öö¥ŸM-TKî7"z,s0}™,þq=0}?k±ÇÆOz;N`rùÅ°zÆÀYa#,n ±�ð:$>¶ƒÃõ¹œ·>'#&û çÂÑ±�9áÛû™Ú}A#,µNqv±�ýÓô�îvíñOÀà!Ñ<@#à)Ü@‘«£À#,Ï—r‚L¦IFÁûÃÎÁ‚ z¸uu×“Àô'{F±éõšsÜ­C8ñ§ŒðäSi*—w ôŽ­ö÷D<…‚É„Y(‡Ôò	¯°,ìWøŽ ¸‚‚{ÌŠ6ùësÁ9>_~†÷‡ 3PGÐTè�h3yÃ·’ÐÕ?0*>Î¢ÿŸ/qd+ä?ÏGÞÛû	ö±öIAÖ¯´½UA#&°+BŠhÈ96BcO”„MÞqî�ï°#, |¤5�Œ>bª¿4Š§ }�¨ñê!V+ ]°4d€>¯?Ö¯à‘I>}¨§lv…jkÐ{áOyÏì”vzš 'F¯ß¡­Fœ¨ÆND-feîÎÙ�‚4£n•!rxè'Š#&…yýžÎíŒ+•}§¶¤¬Péô†œ=½ù…ÈAŽÖÖ=åWêŒñ:ØÉ'×HÐÁâ¼®Âó ¹À§L˜,NAbÃÔZ‡>ƒ»ÄåùÎnfEr†EÛ�z…àòÒ�ûÌ•dBõV¢#J�””p2nDƒ,ý�K‰µU4¢pá±¬*èn²ˆTmùêHCn“C:J%Ñ¨yy}*a@Ä<ÕDc ’*‰RqÕëÏ›¶ÐÌ£Å®±nFÚ=lpa.x=eu&÷ÙÇØ›z¹¹‘LÂ*ñÜyk3ÆAdV@úzÂ„’ÑkB­ûy'QÜolX…‰H”Pý�‡qˆŸ8�Vôb�•JÁ­øN|À>(Ã§­ì=ˆž@tO#@úó{Úƒ»‡Ô+æ«Þn6wF?Š[G˜fO›UJ/sËáõ¼Ÿá}õú²øu…KæòÄÃ‹ÜXÝj,žù-îô¿ñ0ãq¢&‡$þü¨£Ê¤¡_ûN$46ƒ-¼4±LgM¤á‹€7±Q¥J�j¤­Ù€áü^>�Äô_7Ýw“öŸ}ª`s‰É4§ì½aî=H•ÊÉV·ÑÝUVÕ#”UÌÁ3÷;Ñàjø#,¾ùB§¸#-&’3æÈN¢râqü3—3ê�s w‚ž‚,Z©B$*#&Ó©òSÉ9Ÿp~l‘s¡ÂàwÔ§oØLÓÓõi'Y^:ÞØ¯–G…ÞF�uü~¼?›u�>üåx<P1,Œ#-}çÎƒƒø‚ŸÂaB”¡`¡P´qö°`Æ~ld»¸XÎ°ÓD{þaç×§ðš b�ëåßÉŸiØ4{™åf\ÏÁÊGßY4ÁwfpfåÊð0Þ¢Þ´‰sô£¦u+P#&mVV¦LàZ\BaÖÞÈv´©Và0Ð{hJ±d4bÝ=W¬šõåXµ~5¶öZ3d‚#ˆ”U Ds]Š	›Þ§$8€�tM€CV¥¯ÐðÃ´>¯‡Y§Ð%¡Ïvhÿ+îÔÎ¥h,PMa`N¢ÅPn#&)k)$S®û�Øž übS»q¢™…­KÉAIÔA�¨ÐYƒˆGõÿ+úú“¦ák¨÷¤åj½R'8a´=^ú¾v‘ï¢ªÂ˜gëxjƒ­²+"*F‰LÊ#7Ë¼Úù(×*½+†éµÓ#,•	ˆ+-J¢î%B#,”Sl-a(b”çÀô}ž¯·9pS€óƒ,û}Ì=¯«yí  à¾WGO{0dÌ�	kÒ|¥œßg¡èŒ6;R9€w˜í7?^ Sd?`4‚lw!b	Š¥�#‘D(€Ì‚`ÎœjC!Àê†í¢ _J9)ak1<”¼�è”mxóvðHIG£#¨ãyÛ�=â8ßÂ‹HÒóÈRº7pNÍéúçÛE$å\`³‡pfãª‡¤@#,§‡ŽÂ@/·qFîè…om'N€ísÑž~ÉÝn«}¶Úæ6æ‹¸È8�›i#-� ÃÑ}l£Ô{ÉÛÝƒ;$ë�>Ò³)1%Ïy$OÞ8n–—	LPQEýë%Oë÷{£}âÒ´^ÿC·>?Ùtúãüj$+lÛê/«èóosÛR¡ù¿(6Ïî¢lüE¡V–™˜Þ™0ÃR‹ÂoaG°²J²I#ísÑƒë¾MÐÌááÙ­H` aÅÀÅ]C{ÙpKÂHQA®Š©öœ9Ÿ.TRQnöQÓ$Ž¥Ï,œ�¾}Ÿ½z£ BDnÕ 8P‡×B#Ú‘ì»ÙïýHu•%¤fðíÝ±aÚx!’Lvtìê‰K¾Š;ÂHB;R~0ú‚®=œþ]êžÞ¯òÂG”¸ÒžAd##-ë£ F r2søƒ"²1Š#-K;™ê†02¸’(½þýÑ³Cq†ÎE>’øŸpÖp5WÅÑ¿#&o½BYÈþ¸ÿÝög0Äý„)ÿ'¸õæqN³n!š¢Š ŠJUZ*�1Þ1œ(2ú°§*>ûóÙPd_ˆÂ¿B{µA1æ•€ÅŒÒ`9½…&KñNÎIÇ¨H“Š«^í”‚!ƒù+ù$EÃñ Aõ¸Ó®ƒØuü‚¼;ß½-—?’�”›Ui¥‚È!qpb~#&ï�3|"À¸õB§˜� �Ø;®'×§=ýæÞô ßŸ{ƒîzB¤°oÓöY.	S#-	žŠêz{Ny)Ö>ÍÞ�ƒÚ§`vhqzànçS�¤Œ’ðŠ´²È8Ø#,›MØ8�Ù¼¤æ8�–I#¦ÀJä0ß£EDQVæc,°ßí‡?gòÊ=~4ôþ?¯íøéÅñïU#-&Î'³�e�U	B&ž¬K‹7æàÐå„à��˜°FJ•’/"<ægÚCâ¾dNr_„ž‘ÒRƒQŠòøôêðâJ6Ä™ÈŠ¹Pê�Ì‰a‡-Š1×^¸-ðÅÜóÌ	D�—ó­ÏÝ•5�3ˆÛ&ŒynîYÔX"¡Ê¥R~’lŽ(®‰òª-)Ñ©bzÔ6Ðm—Ó¸GR£˜-Fpðõ—´–>æÇ—ä#,ç�ƒÅãÏË³yÀÆO½$Uâpê·b}Mœ‰á‚’@°Þ#-ójŽ¦€}xÍ&´ºžB„ÈWÄ ðºõåÕNÔN¸¬‚;Rá™õé×i¨y[Š„öÑöe@w‰l¸ƒôN`rÜ˜óGá¶ÛyÚfŽ»B/P9ªPüÈ©°èpn4ŒHGB#,^6‚)aˆÂ@Àæp½u[‘ôÂ{ƒÐôPïðæN´,õvAÄ»‘‘ •Y•TKH¶s/ÎG.S£Ý´í5Fw„xÅÈùîËuPnÉ)=#&/¹Ú…ÏFuãÅS(‹‰â1}ƒé£êD�?¨xÌ•Ëä�l‚ÁE.^Ø�Û‰‡Syžè ¡>îßW£éî-:}ßè@h[¦Àùe·ßýD‚"Ê*#,ï¸W'�óµHO°˜Ü/Äß#9þ:xxçÃÕýiïWäÕÊŸÇR¡ðûh¼åµ‚Á1­üPØ¢cŸs}e;}Çß@AÌæ«{š3—ú÷û0lìë+�ìáõŒà9aú«¶wþÙÖü~7½é¯ƒkzJ‘wÞC~Ê—§8#&ÔI$@uŠ„",„AQ#&“ 4Ã™†½£é#,÷—µ!`‡ Ó’#,!òÃh±âàÐHY�Øª”?ž>ÿ^âîêfíüènAcùâ²gÆ „‹,ˆþþ°À;#&º¢÷¦åæ�O>ôËÂ‡0,‚d% ¯x�A°lô‡'V¹´Õú·îp>ÍFÉë]”t«„'¾gB½7%œjªd�Ó¡‘?${JóÜV¡Þ‡}�6±x#,ÕMù!BYÈÁa°mn7ä^€ö‡Â9„îLÀÐ¹p´4#-ú½^Ï„ƒV}ï�5.Øª»ÏJ’‘&Þú]×o;u°­E�ÿˆûÞ�âºe·pŒGû<ûìÝd#,àWoW.÷°Î”fÜ$;t@íÛ›á¼nÙv‹{%mÿ@~?xyXÑü©¤F¾4G4ôBÖ†¬6—kÙ(PÃâŠØÓIåñµzÌUcC4Q^ÿc\û=r·wP½3Ï<"2‹!³wqŠ¯o—¤}0ôJëµ‡ÕzFžêx\Ì}1€º |’ÉÜ�óÖ}AÄâŒÔ#&Ø?Da5_nßnàxœS0m¿è8Õé£g†Ò¡!&æ$…uxßˆì¶;'¬#×àîÒcè¿ý&¦ãÔt[j(#Ö­µUbE¶¡EUTC¯Ð¹W®*H¥â§üJþ­&%±(CT÷Q˜LLålØúé/ˆ¹¹×x±#,¬"ÓC4sXiê%x¯<íæ®ézîÒfSo—[Ö¨	°’s4ýGOùIýø±Àï#&éÓÆ¡) î.§«õá¢DGä‘ã˜H¿žoŸ	î6Q*—ÊŽy5n×�hç)ÊrYÈú½Ïbœ>®W“î”!Js·Ïõ‘åãý�¦P›~Œà?ã€9xk–×ºH½ucÝW¥È	ƒ¯¦«“!Ù	~g¹ç�—w~§yÆ¯üºœOaMffT3 à{]?«^ÓdrU5¥ÑöCÚ•¯K¢ÁÛÆðá+@ú!p°©>9/S%F4ˆTIàQRsó*(#- ,p,‡�Y#,r¤½@v=¶þøu�UÖ%ˆ»ýþQbM@Ö|ÿ‘ü£õœzTÏc!þ™ˆ#,x³à3í¡[D IÁ¹ê=Àt¹í]áhDƒ,#-ñÝ}ðzVaµü÷¹,Î§©9Ÿ?š]ƒŽ€<ß´=*Ÿ×³¨¹|ãú+€—4_år£v„1ùd<��þ¿×a\ÿ†ib$Á«„¢$)€Æ_:é™lžR�ç›nØFÞ^'y	L2©l‡ä2dAX!Q2¶…jOqØ—Žhq9"ºT"Õ#-+èAá©…¤©˜¥q„¬«#Óþ±6§õýŒÐÍHB�ý&gô„ÙR5³xƒQ�ûaü›˜ ´Äðª *ÅÉ®’cKäõ`§–¬ç0\M}‡î«Z\ê#,ðèÅ_¨p`æ‚1'±«E¶²îVäûL±5�ïÀÒë” ÍàH@9Š�=aPüÿboñÃû|,m™°âDöe|…†Åêë»çO¿P~&Ã´õªŒUŠ0BA_Þá÷ËâPÄÈs$��s•JÁ&Ÿêfsl·ðpM†ùw}Ÿ8…¸Ôaøß…®G{‡ÌI#&¨$#J#0´‹4ãS5ÙÛÙ’íšÕüo�ï~Sìÿ:‹G<¸ôñ/ïù›ùPyvÎ¹ÞÚf59zøÈd¼¢Üü\ÜVÜB­ñ¿Zß›ÛYŒ”	¦XC™ïf!ˆñæ´þL~��ÏÌ„l"uÓãÓÂü„y£Q–PG"¨ÐQH`0?–å(@ŽÐÈï_Ž#-ûÜ—øöO‰CK L ˆÂŒÂ”Â(výÃñâ¡2›!$¤‚ÏÙÁÎ1$Fê¾^7¢züÑlù\n†�zÓÔ¡�”-Á;ŽÕPHN_ä(™Kë`»4Ôg9ƒÀÔL@p¶VìÑÃMî„3Äêé®Ž…Ã¡¸?ŸôR‡™/«è,Ÿ:5¼OÈbhÍÑ2É2åÝ1‡¿#,yl›ãÝàÈ†DÄ!Pàá±ßëÏß'‘Ç¬·«üÚErØl~‚û“ºÎA&öÅ›`¶€{g÷ñž�þÃ¿5î�sô¸¸Ñ­û©¤2YsÅ&l.’<¨{ŽÙ‹xvqŒ¹”Dß!“P‘üˆ“,ëX�'Ï¼m//¨S@y~Íz$;RÓéÙ•%�õ”<#-óuÏõ•áR›¢õcdCxUÑå(8fáœGzîC]ÁDÅVÂƒù'„/3Á�ô)#&ðÁë#-8J�òùcã“ú]ñ,%@!0=Ñ÷F…ÿéþÍ�Håá¦Öó³ï¥°CÕŠCô“”Ýnï·½²2ü¸*…ÅÃI�UGH 	Cc ÌìkOƒb 9ÑáüJ½­ÚŠpÉên.¿–óAÞJî„îæ‰�NFËýƒvþn +¨g»XÅ‰¶×*‚¥—Àìsí˜÷â7UH{m+¬ƒ ~œ‚É¥1q7¾!Ú`¾¾xî>q ÖÿÑÈ>"}³±û�lýó=bQÏ¶Mý`£ütpåò=7ÒÁ“FÜ£f¬¶Ý½â6gÖâˆÇ�æJ‚Uéº¨ƒ{ŸçG3å.ðu¶ÎßzÚ¡þçyŽèH±èù#Ìí0¢(ºCÄ·º'çŸÁ¿”’ŽŽ7(��Ê$ïÎS‹îýkèæÁ\Ù\Áx„µ”9ù_çG#,SPÁíôH4•ïT9TéXYzÚ%Òz²XêþËÕ7V÷üí<%-5uùÈj#,Ü2UFf±/k¯Ö;tN®É~g�Ž±îe±»10(7Vl�Ç-*™ºß5Áîš:�™z¸:V³«´Q…r¼:r�P¥V#,<u'p€–¥Œ_rÖç*twdÃZÔ›1ó©·m=Mµ½Lú»ö3†…º\Ëb#&xiG·gÒõÅÅôyd˜×«ôœFˆ¿jßF»uÌw¬S›¾Ý�ºbà¨îƒ™qusÙ»‚GjÌ7°¯ÂÛÊóãÛŽ06˜»˜†á4.ŽæîÛ,Odå:ð!tËôÎ,Óf^Z�ótÏcžmjpªž¨r[¡‚€‚Å3F‚×Ç«¦Ù©*-õºÍí†ìøfk3“•k#,.µ¨éËu†äžš+u'Þm˜PE!“�ø*Ð¶Ã~�Ž+ƒÀÌë´˜[«þi #& äü<Ÿú¿L½9pGA‘ˆ¨³-�¤å­cnŽ²CœÐÔ®mkQ~"4œüfo|d"GcåuÓÍ>§òÕS±÷#®ï�6³Q¶¦2ˆ·tO×Ô•æë˜ËõÐù<Ï—7ŸÎîs®ŸP¨ÏY³0õô½ã­»%þ–:{ù-ts—g÷ˆµÞ»LÓ»Ï–!&ü�À…A#bœVÂˆ›u(‘ý7]1}<_¦øÒå·U˜¤uL:Ú€ÝrŽËã~iÛs.pMìÎqa?(Ô[Ä£³Æ�^(ÇK`ÿŠŸøuPü¿Îû»a[»Õü< qÙp—°ôÜo·�¿=¶£�û·yÁ�f^½O:öXÊ1J?Œz��añ�ê3Ó¥haÌùiF<h9š#&û=	ˆ„\ÎPêDÌß�ú¢PEåH#-P#&¥…9xý`ŒGÚ�€Ï#,\ÕÂ‚ü—Xëˆf1æ0áHˆTìÛôyHè~¼yVø'°Û¾yÄžÙ©na›Ž‰\‹ÚŒ£Š?FÙ"�0½óøwxéŒpÜc…Û·0aL²:À4„� ”mÙÏ}‹•ž©Èz<½_Ü›;%¦†€óÌÈK¸yîÒ@uLÍqÃÌ÷ÛÓ'C}cå…ˆ”WËöAÎü›D±œ»wD[µ4;ÉnÆÌ#ÜáGoF|ã98µ¡ßt^ßMzû5eˆÒ/Ca%BsqeˆÝÏQØhHÉT‹ÚÜÌ.«$y¹Äb×£¢b®	¿\†#,‹Zd˜Ž›K©ƒ¨å=“FÌ?†L…«ø6Óû§Ãås+EŠ,ñ=$@‘O­�ø½ê�¡òŸãéíþÏóVœ· M#-B½ïú“�øÿª¸·nKÏê�0ý0N«ÿ_áìì8ë¡¡Ì¥þØ#&~%ç|*Wáñ·c–‘dDÍ”w†R}õú¶¸~?œ'0ýß‡ØœB8 ¼oA@%ÉˆHÀ·ªªªÃþcÖÀº˜0ŸÑ˜ÃjîÀ6;MÐ"ÃóÐX#,¼ï<·ànÇ,nÜè?´–ýŽ&ÒˆÓHIH‘Šÿ{¹?®ËÄ<÷yÍ�š£‡‘¦¶*ã'“·:�si#&!‚Œã¢Â‡Æ’K`ó^lz³zä–�×@dZ;Þ€Ö\‰Å¸7\·W¨ªòõ&ì‚ BéËÁÿIÅ¸už  ñê:ù@Ü×•ø÷^ƒ¿Á¥9CØ¨oTÈ”Ð5™æfCS+f|Øï8 ØÒ#`ôð»Vêî—#rÂY�ì—Aï=´êùº;�€à…7½åÖÃ\`ëwÂP�3ÝüÉ_wÛo#-ýèYÈÈŠor€b8„'QÑÝ·Á’FoÚw8#-:º�vÑoŒ¢™mc¿ÈÈ†áŽQäySÍ*µ)=»’VÃ ŽBé;blƒ£sg¨‡…5T"j§Hë;¿w!Ä˜`Ãƒ1†ƒPÖ#bhF# .£gM@;H'0|L¤3À‘D	š/V7axg!b+Q™a\Uç‘z'±±|8;Œè�Gž×|Œõ{6xmU‰ZCDìç{m9‹Ã§�­Ïë~Ùï=¤þ(ÏÆ­¸ú·y 8íÑ÷’ëÏ»“Y;/¿ÛÕ{¥¸zOåEü5Dj~úÝÝû8œ»ü9}þÁò,Ö‹H¨~‘=OLJa8!$EhÙÆ”ZÉÆ£mÂ•¦6É–‰QƒA ÷#-ÔC.2êÿ#&$Ì¼gê(�ªd¥�#-þk’Ñˆ¯+÷ÿÉþk{K5™ Ú,_ÊÞ÷X^V6³÷üèi¼èŽº¿{]ÓÍe¿Où§(}B¤Ÿ8¨‡ÅF"ÕÝ·fÛžP�àw†£|}ïóhˆ)N2ƒScÓN³@šœÙÓ¿´Ößæ,?Ýùvga²ò*¢±!	ºÛæ¬ýO>…�ps¼�[!šÒæXÐ0ÎëFÎÇAÕ`Û0EaÒÈHâ‡Å|±[jÄÇ”…=K£ükÇÖðÉ 6�fq¡Üh»–7Ê’TäœÌ…£‰ É²}Î:–ñ„bMÖ€ÉmÙ�;[ I‰‹È©ïíˆÃñ4Æƒi¨4CùÈ¬úšÃb&�ïÄññ×ºÛ½ƒÝâîCmû9U—ÔKÐf²S°-Æ96·vÛ°›xšÃ]%­+»‹ê+ÊTîÑp*r!Ë…ä`uô˜.3£Ð¶ýYÊÙ#&u#,p²pOìå�;ÒÂª×ç…Mç(CAMÆwY2!ƒ°²vÒ¯'CR=Is±ÞâfRPi^TI'kå}½w¹³Á…bó‘N:Þ#qÛ™�É¼ˆ66:°¤è0ÝÍ¼óíQò<;öwéo]®#®ìsº)JÒf�Su­ç[Æò¥8â—NÖ–Z³S$†ÙÞÌ&ùzÍHÝŽ'%®XÚæf±!#-„>Ã Ûd�÷›¸hBì×ýåe*Zmµnz:m™9+À¡æÂˆ=ë{¹¦}Ñ�g€p{øÈl^š†h±ŠŠŠS×Ù´Huf‰#&y-¡´69`%Èjx—WµÌÜÂÂhv#,ÜÕ�õÕ4lïöûõ3ìÜK2™Ü#,ž³$¹˜uyà%I!Ÿ¾<óïñ×Ç~ßRBóBÂ"$Á’!Ú}ŒÅˆ_g^O§ÝØÛËb“ìe™�c™›z)Eåâ%<f&Ø5=O@í#,âjkÔ(€i7aEzlÔ“¢ÄÎkNóeˆ$R×`õAçÁ­d–]¼ã°#b`‡_žÞ¸�@Š¦ýe×f5‚Ï -Î)5æÓD&Ëaœã®;Ú-��á)9D®FÁ³®’´r(‡'eöÝCh{ýðô½~€±&¢m57=PKGÒxÕ�KÙFÙ2}Ž»—3c#,4/I„„#,½áea¨ØÃJT�åž-äGCÔ«1¢‡<«Ño~Å¢TBˆ#,³^Å6�ˆˆï÷,Ø¡Íz°�¡Ôf°v^Ø·M©™pÜÀÓ�ö�tC“®@0äPT® Ø<xqB3;C·z«ºlÀF#ÏgñÕD#,È¸ Tì{�ðÉJ&ó�É¼£ÁºmèÃ´X[‚—º)¹bZº�Û’š…¶EÀâD<Qï8šÛctÜ»‘’Ëà±‰I¹¹cÇÙÀk”Ù‘gNî€NRÎó„ì×-™ók9¥EX"ÉI›ié®—Ò°�Æ8<*Í]-½Sv—{¤O#FˆEŽaÔøñ�›Ó%ÜMÈmb†‡J¹Z6É ¡^«ð'«å·­ïºmÝ£YÆÕL‘ƒP*'-[5f²rg3¤¢ìli‡*�H­ÄƒÐqº¦Gy77)¶!¹[›–¹:™¬d¦�¤$Š4œ˜Uª‘¡i^…fzò‡-S¡Î�#‡p×ÃèôÖe1–Å^f\y™“.ffe�³Ê³,Ì’UŽÙžäzw/èÕmkáu´6@âÃ]qŽ´T¹\š¡¨F(,�X 0ö‘±´®7Ñ¦¥ƒX´þ~íûMY^lô‘Û#&!zl�à~¬·qnzûº¶9w•ˆç›£­JPQTTãÊ�IR=.¼õ¬çŸLLG“Ñé´Ni™×’uÑ=â�kdÌøUŒ‡†h�š!#,·ÍºÑ¤×iZoÆ¼œ·ôT sêjt&0vv"ØŠQè®Ý¹’„ÒˆÑ;>}Â’î1` %QBKªYbÑQD	’Øƒ¥´®ý�Ÿh+wºdjÏ'+R5(°„ÈÔ¸…‹3:IlKéÍ#ÙœÙñ¬<|åŽÃmôþl÷ÕSb*µÆ™`»ºðzzÃY4ä�ð3Òh¥ZÛÝÐÞzNÂ‚Ä¿÷#&!A9Î“Ž¨¨«G…y‰¿­ÕTÝjxÅiò�pú²8à×»ý7Á´#,Š½6’ƒÅÜ8FçYoeT1#&¨¡U0á*\S½,�ª=<}’ç†zÕVÚÐ•|wî5äŸÊðÚ'=~j»¡O!	e‡Œ=;àZõëwö(Ó[‰¡Ó,ìYÎò`']ÑL„Âª5m²Ý3ã}´YÐ6”„€…Êädíø‰Mž.�j›ŽÈ±	#&‰�8"wïc›cË.\‹,X}\Óð\i‘}$c(÷›–„Ðà£J(‹ÐâHk�2fdçqªºDôòGhmä‹¡8BHÌß&!8ˆ-#,fz¾1C#-³·õ~¬=#&ëáï’ÖÀt„d¦4Øw&Å²äÀ”™’C42Í+êQ'C¢©2º!Ï&|À‘Òƒ×ƒG.óâˆhm"-#-0Éàá.ÆNàs„ÁÝ?!šì”0¡¿©»Œ^~¨Ü$•$ ”™9<¶¡‘PÚ#	&E=†qõuî½—œ�þ?¯tÈý‹{òižã¶U�ÉP#Çtâ{$�Ølìöƒ\1SŽ_lš�³™§§"Ï]áò?¾‹×ØëÐbë‡TÉ6{b…p5/,„çšX¥†T2QRíB‰ÑŠhƒ	ï§­´Òm$6ÎŒga¬ÖÉ¸j(pärGÔXÐ!™DøTšLÓF#,&2QÉƒÐðÒcHs-5­^á¯›;�£]{:£U47à4½<}î`"ü_Î¦µ¨ÕDF¹â“»ãUéÐûŽÀ!ÛÀ�÷=¯WÊï¢Œ¥,–6‰¦ÍS"‚3Rll#Äí.Àï&MÕ&]¬èªù;C#àuW2šû=’ZÝ‘œÍœô@àG­ì,+Ú÷™ÑÛÞ†EÍ†FÂ†ÒW³µ”¯aro¥s“´8…œ<ƒ'jÊUs.T\“M6•%’ï³E{§Æàiié³¤±sÊø0çSÔaº¥úC×Ï³}Ñ,î�Lû}šÙX£†EPÄVï#&ïçÞèlÍÍ0‚¡ÒlÚ˜#-R^JþÎ/�dø^¯Ûé«—Zy½!�!¡ˆ`¸Áb#&c½CA-Á~è 7�nl«$›I€–á¸ �RÅA'ìëFì�©€sÿ§¹Mu#&†I|E>íÊö…L¾,ÂKaP[Õz¡¥�1wmèu‹“—¬÷E‘2†Ã[êaÊ^~>³f´çÓwm’éW3Ät„ôD‘"¡ç^/ƒŸC´‡h‚$Lê¿Ì�à@˜Œ�K…ðìÆzßÅz1æ}¨oð.äÒÐé¶tîû/ˆÓV¸N{ïïðÏbP´­%!Ýç´0ëyì»Ú/ÊË-” Y'±‰	ràyR={GÍ#-#Fïø§<%QD¤©ÉAb¤,R4Ùðø=8§—{‚±Ï)-Î`ç§ø‘êÿ$?óûfY‡úÿ×8t­Ed·rñ�(ƒVŠJ_³	moÉûÖ§ä©ê]¥(¶fÉ”gZ¿}¶Î¿àõy€õ’�¨mõ!ãÙgð"ûŽ Zt¿P}Þªý¹¥)5Ki“T¤LJqT�ô�ZHÅ�DbSÇi�J89J¥Ï/3ÕUÊ¡pÀ�•hÛ•Âí´SDŸ�åÞ÷®Z±lV|)r[Jˆ®´ÓT*ck(%™¯vxwsèHCª ]ñ$„„”µíWÞ’�E€„ûÀÿ�nÕ¤‚H£å¶„@3z<Ó‹kåc�€oÒñ;_<—ûÕrÎòIë°à>	àÉIOH¥Ô5”³öŠDA™—`¢6$-’Ù&€MŸ–ÇÈED�ÌùOd¹Mó‹©`DÑŠ@D7ªp£ ÷RˆÀŠ$F#&{ƒ€‚Àùð¿Ì1#,JÎ—§ÔÓ£R�ŽÚÙxt˜¼ó¾×«\fwV.ˆ1]š@jTÌ†å@Ã$Qb$.ÊF°gÓ	™�ÿ3dEº;{Î0ó•¡¥Ý>ë?Xv“SŠ@œN]T_ã˜¬;‡ÆèxE¯´!ERvù…À±#&�H1©³3°%„_¶Ÿd$Í•>‚#&'nñ „Üp5oMw²á¾ ×õ2Ê|ô¯„(¹¾Œ�#,;#&mÓ^{C¼þ…ÒAuÌpàD< b€në™=m·Ò¬m\´U-%›J’d}¡�ï#„@î‚ûâ 2"’#&€HŠÄˆ£D"#&,F#-q1ÉüC!‡lì¾ëép¸Ì=d£âÂ„m¥ªŠ'À--Y³‰Tue¹‹–0—"ÂpƒvÅD>7•åž¾E�O˜¦Wô&½B/ôT¤“õwo›noSz›šìJ7wh$¼:ê5ËwøÞy·‹›¦;¹ÕÍË%ewhä—Ë¤cpÝ`(1áÿ¥¯�„°à�¬¬ýûç&È4	²C][~€ìînq#&žù’#,?ã”6Ì±¼ëTñUcØ×È9“Û…û>süY;~ò¹5E2M´á*‹(i.¨±§·ƒg^ÒüÓ�w�<÷4ÅŒ¿Ì0^‘ð-ó8fá|ß™5Ó+a=§áâãÇË~ÿçž<NÓÆsçñ#-EL6V#,_=�ÅZéòß4Ûþzx6€91EM «r¶åµ�>Æ³Ö2šf5e4ú²9Ðågûâò¯†9‰nÐõ�ü¥T�¬Öwžšù–õáÌÁ»ªyÐ¹—*6»‚Âíˆ(`BØò®q…M™šëáíJI�’"³”0¡¥´4ßJœÒÂ’ã`,?ÒÅ#&ÄˆeÙhî›ŒÞên×y¹ýÅIØ;[ú¬·÷|—=ºSÓSôr›ÃH�›ý>ƒe»Þ~8Ÿ¤,6ð68ªûêêÃÒtÅæâ'¨byGË¥ª7;}%ó#,ŽŠ( ¯ˆxð>3Ã^™xæÈPóòå­ÌÓ®d´®M[q©³Ê'ôMÃ^±¶8•=lìY½^KŽp[J²A6ƒ?žI‰aÛw1LÐvE”ÂŽO€4Ãæ~ä’~>ê¦©¢¡çÛõ_ây4QA(ì6§®“Z^î©èr{ #,b#&|!#¼Yš«"¾¥N‚ô2•ô”�Q±z©$Må³ªhIÛP�0.£‚ó_Ã¾µÙwllMƒ?6g¦ñf3$mwE\ª†šáçÃ.¸<´ú~Ð…,Œ¦%Dt´Dx@›ÃÏµiJ€þˆ£ð„�$ŒU ¶Ù*Ñl”FÍXÒM”IQŠÅeeµbi¶KI+cZKk#*4ÙŒ#&H"�cY=gåøòúú.%¤µN–û%•]pêà"zPçdHª2#&È ö{ú „˜â�Ùùl¹¿¤g>k^vEº¬oµ�6‡?m¹�¡€ðÐØëŠ£ªˆ5ŒhXdi½û�#, «,Š_Æ#&&ƒ›”é’i�kŽÜ¢÷Öˆý1HªcQÎ$�ÊÉ¡’màšDÓ¥}*nhi(È´CZL±_P/¥dÌ“5^]'^õºðEO|TQwoT ´QÜ#-ò�¯0œ÷¤êáFM5»PH¶ÔºpÙ@•ˆUŠ½‘mï°t‚û|ÇŸ:#,rƒ¬©#&Bšd9œ9t¨‘¨ˆ(&¼À,$éžC¢Š)#-„HÉ:D…!ŒIj+W6æÉ\Öå3aJ™ES0j*Mlm!¦¢"#-ŠO®gã<Á ‡csLšÈ€ã@#&�!‘rU;€#&ÕG�öq}C÷^ûýgçõâÜé¦ŽÒqp‰¿ä �OSÐƒÆ½ˆ�àø]ŠH#÷À6äT#Hq´úd=§ýžÿú?»÷þ¯OúÛµT=}�JOŒ`,’Îï;<x¨,SP#T%âãD#&-$Ã:ƒ©ÕÑAˆ„VD}U�‰º÷¾ó¸êêçc%Ö&²¡N�(^(mŸêŠ”Gõ’oÛ¦—QO›?²¼:¨ÊhÎ¸È–‚üàuÎX`!\˜ü»-A§¶ŒÔHù¿äˆöø?£Ôÿ@8’~ÚEw03!¹‹LA�T3áí9Œ{e"@åÊË¿†ƒäj�m»S d+Â)CU8/ƒ �³PÔ÷X ’§Õl#-“’Ì£Ÿ¸©h½3Ý½¤é5Ü6@A4i6%ÛMýt:“°ú{N¿ºŽð‚îàP¢šNH™#-C.²º'B¬ØÅë^eO·:¡ü£ˆ	3±$�µòu{=¯Ãƒø@äy„;—ü�#,œ_u#,Ò)ÏÊZý)ºžCÈâuè¥y­¶~»ïÒÕƒ»‰6$Ú7?&À	#-„O¢lÁÌøTË±ÁWà¢PÑÍß‹\ü+ÇN$ð<ä6;é˜îßâK•}ÙspÃä#&ÿ#-ííìš�q‘w:¡÷sÃq†ˆYƒ¼ê…(�›lÊSiý.ysñ2»Íuðí7Í‰È…·ÇŒbwiÆ˜ÔƒÎ=cÐæŠQÂ©Í¯—vk:Î.Ø!ŸB)2œÄz8;!XâçS3”'ŸJT�gÍÜ0M AA=å%ECØ>açGˆw¿#&WLÐú)OD6ös:Vb¶ïþ/ñQó?¼¿½ü^Ê÷åu|�ÝvœNÉE?z¨ûú wóŠDd_0*ªH*#-EX2‰Õêý­Â ™ªEbyæ€øòñ“Úù|4îíÕT5Ø ±†/kÍûäu�Af1�øM_kK ƒ‡¬ˆ§ðúÕ�ô@Ú#,åÎ¦ôt1ÌP4RªÅêYÎ’@Ó˜8ûl™º¿ÁÕë®ùjú+îµ@a»S[”`³&î»Þ‡µC¬ƒÃ2†!ÄUÝñÅ]i YY±h,#-½˜å}�d©a¼\®ï~\Ç	½kc‰†72‰ò¯)è¼MùòÑáaó#-âöÞÍXJ`¼¾“É´‹Á@#,n—r:<V¥ù® 9ƒÂµ�ÑâôqÒÛŽ�«²éãÇXí®y\9ÇQŽÚ³/qöiu¶J„a\£·¶|uÏZèÆóÒ‚Ù±•âò/hŠŠatoüm³\d\‘Km�®=4	¼e°p_MÎ¶uäÛ;PiµpäpÞý‚½ÁNÍŒ¿L[›wÏ¶-NÔbf�AXí[±e)èŽ[ZÌ5©Þ‹Q¢aH$ì£h8ŠâæfÑ#-eÑ—Aí� ´Å�ÚDÆíÑt ÷UÚ¬à,L€êyA˜Ð!®cîq¯gŒ˜õÃÿœæîº(„'>[wŽGgº€¨xQ{Cßí#-G_=¦#&!+R¨Ï¢VAH©JÙé¼~^ºŸ§DòÄ,‹¹2<*ýAx?‚ rÎ`v<Æ]+e“;Ó�?6šdN#,ZlB¤zHE×††|áƒÙ¿š‡çNHœ¯ˆäl½Â6ªèìCèó‘­šóÛ´m?ŸnçãCØb�Çz2<þ=�žÐbŠR M�•Ñ*»Nþ'åõ|ÌÈ;èÜvíÕºŒØ·´AíîlKr#Tš,®àµäÉz³ä–¶~ÒÁ×~¯õ8 ›â›ŠÖábuN¾<ÇEÜm2"m£Ÿcd³i¯>Ó˜_CÈ¡Pí”79)×‘ª¥KD†C³³Æ}Ü÷É8Žf#,(¤Sò¹~m¤Æ†4úqÂl¤ŽÈ3î™‹ïûû™èz¢€¥ÎÜ™È‚0ÃcÒê«™ÙŒ¼ë¼û'Nòà:s-bC2âÄ’N=#h ÌCHrÛÓ&ú¤';�ÁÓ�ž»36àüìK°ÁvuOG|MyôU$"W·qÀ'´ïÓ?YWSN8¼½ iF#-¨z_$:¤“¨ÕÉ©©GéáèÈ�^D‰8¡¾º_	*wçx�%'šßŠò×–�Udaq`M¦Ó“ ~ÿ^ÝÂ×êã—³³zõgQ ¾aÙNÏvMlÞ jœÀðõ �á;«G¹¨�ÂÍ¬,º ƒ �nªæ)dhfÉmt¹²“ºº›9%Š´ÒÚíõyrÝÍBB ¬Œ À®X*2*ÇAFP´”Ü²Rì8ö·s"8\ÆÊ3apïÛ�Y,‚iEb„tnÈbùè´55Šf¬Ê-¶‘7?²wÀ9Ÿ"�¬)³—ZcJÎ×Ÿ#,Æ×Ý¿Ò¾ÚÚý~Ú¿näü¼Q#-%* ø¥ ŠDA~t²šÍ·áºêü*„“çc¢ò¡#&* €1¶A}Aò8¨Móô!ôÙ÷½éâíWXŒ“–Â‘1Æ�É1gm`ò#,2Y§šM;kg{kE1Ž#-…#-œÐ¦hœî­[dm÷(§ÃõNØF×�9êü�’ ¤wlC0‚Ù_·®#&ÅA=PÞT�D·*Íî«nÓÝ¦šòÜyîÁ œÐŸ,Jìû›ò¬ò÷è]<3ÃwZ5\×UL–#-"ˆD‰R‘Œ�4HÜu²R’ A¡iP‰aJ,|ÍÚNjÚ)˜§„‡aöÔÏ‚À’ºõ_jûs+#,»®Õcj+BwOyD1‹–§(–—"Z|peçµ•Ž9†òHLwø¿Zúë[TíMŸjÏÚÝUtw=u�²_“÷âoð0)“®"(âYÔ¦çìN‘5Ë[¼Ä¯Ù$ÚRÆ¶ÄÍªª©òoQƒ¸ŠH‘ #&wã�W[ð�wöÖNÙD{ž7rvc)´ôÛ‹­¨Ã0(…D…� •ë/Cd€Í­oRi“²XLÃÓt/á	q¡µÕ›k4RDÍü-øm4ëdÆ˜ªd…Îï/§×æwø›õDBƒ²Ý#,°ÝT{O¯¿¹êÓ¼ªø�ÓÀè´r˜¢‰ý=vúc‘³!¢mbÄD,´P‰s<ÎŒc5yÕÒW*˜ªtÜéÄC>¯¡ÇA$„jMe¥k-FÈ€œD¡¾¢NOæiºÓœï'^šÀÌÀukè+³<G¾ÏŠtòö^ö¼…»¡I¨)íQ½x;Þ»¾Ñ-´›Â(�S§rçÁ²éE>ÝLl›‰ø3I#&´¤ã¦ÉœÓ-¶þÍÚä”êÈ¦«^Y³1Èä`v\ãã@—ºª¤øÇ…÷T†xç:˜¨4†íÕ¶á „Ú^e¯!!hl5ë©Vê¡2”¸_³J@È"‘„ÉÔ Ðº XX)tC‚ înÍ@Ôd„#,tV�	s—…@Qa�AâHÈ‹ûœÞì¯WÃƒ>4Dg‚�1 •Ö$®ñÌ°$‹Ø#&Ô#-‚­A¥ÙÖVj#-l‹´h6ìÞ]ŒFT�R�hF!D#zÈÒ+©††˜2&(@¸³ÞikDpžè¶0ôf„Î&åŒ�¥¤¾ÄƒÆÅ †°0ÊS‹u#I¨†SemòººÛ]åÆ£]JXaá²Ý�Aåú¹Îx9ã¶xDöÃ×pJüÔ¦|™$)Þ^²¦Q båp<ïéQ‹çÓ"ûYF×}ÐA;´gVÇ–�¬ÙÖÆFI¸	îaD&È½!Œæ:Ãß"‚SÊi"Å‘fú½”ßÈâ}Æ#,=LMWd…ÙÇ¦ûOÂi@,òIÆÎÖÅW	#,¼��Ü²K†EŒ9WÚ÷ùlòžÞä}‚ä¾Ý†¦ÎI`ÝÅ’þ5Õïâ±!!1134SŽå�ãÒÏ(� vq"`´›P*¥P£CºzûÏîH€„�¨=j§Z+QÛÇÉD¹Ö ‚[!åå�RÉÔrNø9†{D¨#&Ð£×öóvîî_VòËæãÎ/0™"ÕU` �b�ŠeKÁLsÙ©¸uuýŒ=´J‹QQ,,`¤‚uÂò…Â‘º"È"~¤ UX]5ËEÌKò¼âÓ]	p%ÄF#&ÉFB„dº“Â•ÒbÄœý–"(˜€SWŸ;Æ@4‹L]‘B$x=§>£�v¼êHµYºT…Ñ�zÊÕo<šÉòP9#,ÛE1¹TR£ðß&P®wf¥:T‰o&¢‡€<�zèÙR#,Îr³ëÒ; ]„¢ûL#&$ïüª›#-&MMAa×Ê^)	»©+ŽµV€ô[ã7öÔ�#,1)†øºœ6“t�*øÇka¶²Ž<øÉfY’]*1ùèÚ3«‘%P½1f#È}/4#,Pq2“ÑSÕBÏ•'…®1ÕÁg£u”_ØÉ$1À®è†¶»Øò³ˆ*ioU”�¬�ly#:#-œ«›Ò†ÌF=†­¢‘R( éCóyÙéœäÕ=íÍñÚÍÍ2äÁE��œ¸Í#-2¯‚!FNÔ'QMc÷25!=“Ï5êSQ¶6²ÆÈS€ÀcHÍÍ¼îÏÏ8Tƒc£)èÃ�cot¢,{)á��0X�ø”7#k°ÞÂºw«£#&Æ­$óŸÏã5Ý�–��2[¼%šµ$/D3×ƒt%�X‰§U0H�zq"LYq…†�?Õµ›’÷¯;©¥D—	öt‚aãiŒÑ×gƒ‹]a�‘ÎÂBTïºts˜»nlÔ×øÚè3�ƒ^¾Ý„æÖ-vØxiƒ´".ò(l°ÒD�%UBˆ“"bá$js+WÖÒâ©¾™rVRŽKUx(b;–6Ò}é‹†‹ÛØT‚aUK”aÊ&aÈ¹g":ÄÉÂƒh3)†"RÕ£sA¤š�#-!ºhÛL!I$ÔBl“M›gLLb<XCË¼všÃ›itÝå#ï…Ùœk±’´œ •QJ‚l!„´™¦¤LÒU)hn†Ž8T4-‹"X#,#,ÓÂÈ­[&fVî�£ß÷IÞ]·sÝŽsºš™3šjG7¨%$Fùy3¶+:ƒµÍÐë1�r5Ž„l ãN(¡Ùˆ2àjõ°ÎÊÁÑˆw0rºÒºÉÇBå*Ø%1!²`æ‚P&Ô¸pH4ý*€6l;aËèÍ(„=¼×Ÿ/AÓÐ°ò’8l†#,<"DhPk×ÔˆH‹»Ê�#,¾%´ØŽ±9FSJ#&¥¯«à@Çip[6‰6w2g7¼G«Àõ‰/õdHÿO=ŒQ3©lã�­¹¯m\Lšè§¶ð–é	••/ž4�vY¦d’V�„ÛÂ%±²Ö#-Ê|RhV\ÅI×MYõQ—l~Û†¦|¼ŸkáÇf:T<aù“šÑÍ>OFü6Õ,>aÍ«tjZ�Ü4ËlŒ_{fr‘!¾Ž“µ’äX{‰`hB:öÝÀâoøýðì’Ùì œ¾;Íúu™ggÇ¨hA°dN(æß�§°œÑôm+f¦Ãµ¢†@%¢XˆP¢ë#,"Äç¢Ð“ùþT¥Pîn X3njÞæ”Ù.±¥GBñ5½UT«‚V"`€UˆØÃÇYíiÙš›,#&!3#&”ó˜,(ÖÖêg�7­«˜º–šU$¯–·†r2@”7ìæÜr˜E¤¼Ø¦F	©%@ùäÛç;¬*…�¿äË1›ñ»²þ$íI:c:ëÇîÉ×Pë‡ß#,æÈÑl©îj”ÞKÅ»ú©‡9#sÍ$!2[/œ0nRq÷ìC‡¢Oð•p4ÈðÏä4SJ¦Ú™^™ŸCÐÿo�@�d!$Fç|í,¡8#,gëöükô´R¦­~%ÏÜA`V�­Eµâ£W6­±­mEoÆÕW�mãm‹U�ªè$(h]ÇË`÷zeÄè@Bþ.0QMX½QÛ'q¾Þ*¹T�0#-#&ýQ™œx�K<ƒ<¦›œ+¦�õ—axˆÆ#-""ÁQ�JdÌ¦iZe™%)4Å&¨´™¨?§u&Ö�ÁŠ‰¦¥”Ñ…¥�{öåšÒbÉ(”ÊÙ¡L˜™¦dŒÀ£B*Š”¢h}=ÔDm%‘B‘)ŠIIe5A2Pj-*4QÊafŒdÉZbšÅHL¢h2RÔJŒÄh4Í¦1`ˆ0PEšhî)Ü“y³ÛSˆò©ïf`„Íïmñ`™µù²µU}La‡ÝM|¿>YýE0vï`rØ²BY)˜>&ë^%VV	iQÓ–2;7Ki„°ß¿vÙBDÁ el›íq¹.ÁG\Î}nÄíàÞ©E#-Êcûh>†:œ¹Ë8KyÐà³�CÉÌÂÎZ«µËŽÝ-	*ßUI‘�B#üð·VV2¬«•Î±„œ¹æãTÉ`�cÛê÷#~ùBß–+˜Èè6&ÛpÀÈÊ¦AÜ±eä_B‰™…zÓº„ddXš#-26k%b¢ˆÙ6‘#TDF#"{¸ëÙ×¿ÃÌÌÄÅî¬Ø6E„Í)úk#O°¾“ËL¯žiXía¤¦p‘OñÏV¦ªH¦CAlìÍ�nôOí~;›ç/c¸zƒ¯ä$0'yêGÒÕÔïÚzºÓå¹‡ŒóÏS™á’íP�*‹+¡|ÎàÉ ÒV_³ãfåÄw¦}z^¶åŠK8=‘#,Ù&ûëÑÙD!ÛUVmdjQJA(�U$I#&‹Ü™1ë®	³³í¸�F²ÆöÉVqŽ÷<¹nÒÌñ{œCˆ’°šÒ–ŒcïÉJˆÌxÇ·5ƒE»ôw‡bec�¬û|ÿ�ógCîÖ“ùµ« ªIm¦û{ûá¦‘£õ%ˆx'FreÓ¶‰^+²žw~ãá­[¡B?;ç#-cguVÖË¬!çM®PÓŠ#-Ú+G0Âèš}“wŽûïG8 ápI5óXÜÚ¾#,o“¨%È`P±àæÂ“l2´îsIDðÎV©C)¨"�ò#Œu-Í4î'¼Ñ®éthcdµàg’Œ ®„Ä©OSß¾k’÷Ã™xIJÃÚqšflÛ³l%ÍÇÂ'dêpÚNB"T]³Lù�2“álÕ#-jÚïc´Lî†Ê|Ú×S).-»32÷†[i"mG£Üu we…õúæ¶?w=šÏFîíÙáÌ™¶’ç¿âNÆ­óÕÔOezûÎÙÛcëõùŒ.4�Ûó®W¿ì:­'ZB¤†xâøG…IÅ\³Â›ÓqÓ¿oÛ×õe´Çíµ—ç×AÂÈ:²´úK±(ñ;Þ®ÉéÓc�=	¨%lô'Ã·}½“‰ƒÅSðÒ‚Ø,Í]£À>�âvvÇ°��Êùä¬3UI_VÒÇ€‹½DÑÙƒ¨ÊÎ|ö&d#,tÍIÖGpo6ã‘ã33!G…qo–\Ñ]:þùìÍ�°�² vÔ	\#&�kö ÏrŒ°¼<#,›|Ò:È$‚ƒ�UýÎs‡—üŠ”ÝDÛ"O'ÞÑÆÆµ#o+2ÞÐÛ2jŠXR„W#-2tEÚ“‰[ÔÈ“#Ó2\Â£¤KJON”yÍGš†™–¶Ù§—«¦t5.…’°ÎM5TÔ£R˜¹šÖ"E”"Âãx[isµ“0¦ÕÕ“PæÖß3s˜û<n˜´¤æ~¼Ö²\œÃéº^Xf+×s÷Jo{c¬¢ýï&¬‡gá¦ø Á2¦8©?GVõÀ–ÜÖf.ÄÖÌ3Ñ³X*ÛLŸ=L|Ý|I¼<£z�ÓðCµt}§j#,.Sˆ0¶6{P#—IÒžåàÍNVK¼Î£Qb³l�ÃQ9;„ƒ5h’FªÙ#,ì­Ô¹Ç<Eñ±"\�7ïN‚…àÆ©-æ/Ô@ehzÐÄõvvÓÏfª7†ÕN�ø7hágTÕYshÀùâHwš`“g¥#Â@C^ÌìËºUŽ¬2ÏGPÓC	¢ne¤vCîlom™;T™|é'£?ðÖ.ÑºŒsÁ×}Á#-3¶ÓÄkZô³™g´üæ)¶4ÓRP±âäÖ ]-o¶ ¹‡ûÝ¼\¢8#,–’xˆöïM4Í]d«–-#,w})N¦Õ4bÑ†›I¨Žý#çŸ™>5�³|(ˆ�ØØãNUåãe—QoDJÍÞÙ¬ÎLâôbº>*u½n)Ðâg@:wC¶ÆÖ‡ªËü–Ù²„o‰ãÓmcXÚGãƒ|6ä'àFv(„ýn$é=àJL%‡Ùfµ©ÏLwÅglhpI	£S˜Ïn+ƒ4�G`7�îæ)¬RãžW¾_<ã0Ý®È^¯P•Üd�>ÃÜllg:�ðÆíq’‡Ö#‹¨á÷iy$‚rô©(	‘²I“æ:ÂÅ¸q­¤ÕÆlÑ5¶¯œ0–�´¶±,1#1Âa�÷x ;XÐÚìD×#L‰k\2L‘/f�ò.šX]ÔG¡‚Œ(¸Ô9L,~4Ô)¨˜ÂE¤�6•KøV90Ä¢¥b¬+|ÜEY7Ã¾ê¶½‘”À�„&XÅ5W3×Ë<útkgéÞÈo×.æJû§–]%•õª4(K—6œ¤ã‹i�33r†ƒÒÄë¦(E&â`¬½F:P™6ûDÄ>id›cRNL¼Ü¢îâÊ7L:àë˜8FM©ÉFÙk}º;ëG§¥¨éÃ‹™gx«b2$%Éƒ~€âFšøÌ§]bT† .n $­1éf™­xÙ­DÍØû8#&o\7�©÷·f¼ºg<CÍšlñ[½bÕ�á ìð®éç”Ù&#,©ÛÀ²Ù¥D†Ï¦—aa±£771ÃGM9Z};jt4&ëE ¹Æòê›1§L1œ#-óS\ÛS	ªýSÎvÃ®>R“í³C«C7)dF²;o­8˜§®œ³·Sœá´•:e[¤FŽNú9âMþŠ7£|5ƒå/7i	¤Ë§?ƒ%ÂFB÷;£5mvÁ¸G©5Wðó#,'Œ5ÏS~Ín=³ÞôÝÎ˜ÌÆ1�ôœå´û·1ƒVÝf›ïÃu³U·6wu†blå…ÏÚï}Î�ÎÖWaN\ÌÌbbo3Î¡ß'[µŒ¯€Öò¬tã6æCmžt¶h››Ç2TóbŠ©�BÍ”‹”Kº€ªJâRz˜„T#-¨”žaå�Ò‹wé‰‰ŒCÏ†³Æ58Q˜æz‘E¹¼<ÎeD)›ˆ£¼´ÖQ²´�=ŸÉ[ÒY[•óç§Æ]íŒ±Q™xBI¢ª,eU"[SD¶.c1#&ÖY›$ ëÓu¸73/±”+£˜™8ÉŽs57Vä�ŽO)&PmV†ÌåÖº.¶=2Ù¬Íë2kXò:«,2˜ÅŽ`ì…¦‹šÑ¬ìõ¦FÙ�»Õ“Àš=Ò²îÁC.|î®pª¤,á‚pÓ²h\Ô7D‚ÇuZN©ØÏ‹Ë°ö³µkG˜lÛÖ·œ	tŠ(”Ù#,¸=¾kã†Œ5:a‡[Ü®<�x5ú$L)ãe|Š82…	!;H=¼êÔ½˜*mBpàE8PI©š�–�3L#Iv9…FõñXtm\1Ü&ÖÌÔ¯Å©cQ¢4Ñ".�¦(¹T„�	ËU,5ÓLÄ°üˆòÑní,×õ1{/îÛs¥kmó=°&BI­aÉÚ R›…»Õ#&º¡$È 0½Ë,>-Q÷ÙÞÜét�«Cõ©#,Àvfò<~Ub#,NØB�4‹lš%R¦TìÎÄm•�œ@Ž#&aå‹OÑ¡Q¬OP…/¦#-¿#,·L¡ß	2�^§áv‹2;6“ï(†çSáŽ8ç»ñpÈƒ«#&dDwÀ6èEáè¶ÆRÅFÑéP¤Y"ÏÍJi�Ã80´ì;2gÎ¢1m Û³Ï|™š\ÔF‹ªàÌ&V¨™`3pMY2š™ ¶dD�14 –ÉLÚ©H¹wf�•®”àIB…ˆéE3w-¼ÚHŒ´0!l'=kLÔÙ%$0±]“’KH¶”Ã|ÖÉæäL¹:TœY‡ƒ8&#,YzÔ§Fj�£VÓ	\k›82hp¡ëS–Á�uŒªÄð¹ˆ0¡:Û›<Z ´ZcH$©ÙÂ&p˜U»™AœØÎ=F{ó.S6¡Â DÆ0ÙƒiÕÉ©±‡Ï;àÌª˜›ldªHEhÁB‘kHW-N,—XãeÙÀXS.Q¡¸Ú¯8Ù˜Óî9|Î–Èsc‚rÐ±MÅÈÐÎP@ÛÁ­�²jÂr–v•dÀ­œFu¦ã¬c†_uÄ¿E‘š‡”/ ðY:ãU‹´45±›�0¬5š¥¦ÏÉÊÏA©×aA¦WðÉ„†&vqŠ	™ÝÙÄÖˆCQPôOjï|"Ç­Ìïž†ÔmÔê]“yaÅÀd®,A*ÌÂMN¢iŽ]Ås›¯—ªj…0‹#,20’b+`ÄaQ­1 ÀÒKjC<«¢JCŽ�	568’¡“z‡05ªÅÕ"*…U "šIÃ�ëõÏP¶\«cKYÿ”©3Ä›CC”é]½#,ƒ09jJ+¥o4ÒäP4:†�gÐÜÏ5ƒAÀnT3°£BQª–Î%±iwÇ�1#,´<vì“a€¡6‘’80åfù°ÐÔÒËmå…Ö¸©HˆurŽ˜f"F9]~ç� ` 7p)2yš5Û¡iRˆ!•T3ØáÄ¨`ƒÂhÍ#&Î–f§J3×�VI‚0\L4†cwHsC9£8Áf:&¡6ˆhE�ÛRZ¨àDÂpLˆ°Îl�Û0Y3'zRJI¤#ƒPØ1ÊLÍ¦@Óµ¹˜ì7.eÐØ:.†Ü„ÉÈÕpdfÓ&©HàGLîšlÊLïÄªÈØâ.¶v›M0Ã‹µÈ[ér÷#&ÅC´0<#&#Þ©á‹r@`4¬™£&jÍ[ƒ-uµ;éºßÜÁH@DÙMàÌï¥MÂ›#-(�½)b‚5þ?‡š�Ÿ�|zœ”C`w®ü;ªàhÕŒ0KRªZýGìæ2Æ	:#-#DNØu�Ù´þn¯¸Ü5)k|TêºÝWc`1†³H€0¨€#&¤Ùiç1äŸB[@™ P‡ë…‚IïNÙUI‡Ã>”îw‰Zmîí81úE‘ÃéÇáö!ð�©³%r”ÍhÞ2nþºÊ(¼aÞ­tümqÄä4˜¦/6êcûªI>ðG:r¤uÒ9�Ük§’Û8ñú-ž£a±ÅÄ#,á°ŒŒ#-ý»Îa»‘Ì»´3f›ËU�ð„2T9¦í�à	§;€yì7–ÔþiHT¡ÍWŒƒÎXŸê¹ÂäUu»tãNæ¹©–×Ô™ª°�ˆˆ@±šˆPÙ‡¦)@YP9[L,Q1H_³Ï­"d&bøôFÆúˆ¨-#-£¸ï¯zH!µ”> 6d‡Šý0õEº›º|³Nå_¤"ª€ÿ–õ Ål*ª*Tf5ºîÌ¹ºéº µÍ’¿œ¼BXýMS	t�@ûÝ‡ªŠƒÇ°y’À¡Cü/Eÿ!Ò˜íUõ#&q?n#&9‰ù¼�è¿!Êrë(`ÎDZµEzÌ(àŠ|¼°'ð�ú Ï/Ü�Ãë^8§Y2.¨þÃ0Vè<ÜŸ¹²¾ìÜ}?9nìËä#l‰í»�#•dÞ�ï�DiQ‘€6Y8íM¤(Þ.Á,¡x::ÄM(™3ý:M#‚#	YHbÞ¢UJhtÁqkHÃê#‘	pÁ¾PL�Xðîœ²3H,ðhA(†Á£ÄüX™ˆ)ØoÊÞ^Arå‰z¸oPL@ø³Fa[4áÈú:?&h)šÅQ¬hÔVÑµcQ$Ø3LËF ¤�dd#,º ’!B£¶Ñ>#ÃÜãËJÑS¼JìSŽÞ¿É2—�tu; 	°ßÌ�òðƒ(`þ7v"&¼-Y,DbiŽ³$±�#&¬D‘¨í #D§(ƒh9Rf7	äêñ;üÝ]B##,2xÎú-}]dþ›¸æÞí(9’b¬Th‹óµ"¤Š¹Ÿš°ÞIë#&NzìƒNÂ€S‘Óm‹i-ÁŒ[iC½e…3Pa“-ÂG�Ê�oøNQ¤Æ–:Û^w\³ßµŽ^šÕÊºU|›z†4±¶6€i‚¬EÙ1‹fR–@l@ÓE`›Œ+K�fˆF,`5þáÌ¤LØÇr»•¬C�_8Œý‡zZ*çÑÜXÓÓ¬;­Í_ëzî­Á&«÷Rß>sÔ�å3IãË™ý=±=/RÒ�®rLŒ›ÙµqV†CCz!ÄÈ}½<x×ìŽ�¡¶A¨9!R:{Õ)r=hrn In"QH�…º+Pjñ4u–†Æ/Fpa¶Ó3P1äÎENS\º£­0€—‚’ Þ)ˆŽ±,™#-ì‘šåyÕ‹eåúýÉ#&ó(=Ç™MÊ.É"¬ƒZ	H“#-b"F#&cM*¿”;7‚0]i?9µ„B —‚¯Ñ`7DÌU	#,‰,Ëð€·?EUª³¾žëjßlÌnŒ»9¶‘µŽ“öJŠ6Á­3ön âŽc}¢èaVæú:+hŒŒ&EÏÃ(øõß&~%)§$S	Ó»îtüM¢´¦ðÊˆïŸJk#,Ý¢èˆÒ"+½Dv„xÑ¦}¹ èhÚÕóÅ¥¥jÖAì"¿žá$á‡2k³B¨TLí³H�#-_�›"�Î¬uŽº¸W®`gŽ…fÝ61îQzkX à>Á'ƒ3©=î976²­Ã+F(-GòÒpÍ0~lŒå&Ly"÷˜Y"„ìw›n­�N(hÓaä'OCZ×Fž®àkb:{5kÌ+£"�¬:°¬P}I¼¸,Ú—nÌ5®³Ñs4nˆæg^’]ÛÉ²³5“·y¦lñÒ‹\s#,Å²#,[éŒK"#)£(Ýº»Xd‰±Ñ²Ð<E€61¦DÉ60è†àtpÐD:ÀÕ@U,$˜: ]Ñ�µ×“c=A(Õ™¡�Zú(Þ¨GŽÍÁ`3õ‡myGÌªFßÁ{Õý�ÊiÅ"‹Ù@Áê?Ð­ÒƒÄ�ú%ÅÏA?Nt6+ãOka×vµµ—Ýjÿ¼Á¹ˆ#-=2#,üb#-ë3®ÔÄÀŒ‡½«îdŠ&	’I#^€ŠÑþVE�Qµ“mXµ´›V¯ÖÚ’A$HHzŸ3CëPÌôz6bUQ•ë£ÊR¹r>ÇÂ|Öò‡¯¡þ#,-h¥óâ¸šß-�¼/òqª²¶£ª³{QËaÊ´’¹6Mìé§#,gx•²i—“*ÕLÀèÊ•.)e¬Êu¬½ææìÙ&èd­ñv5-zÔbŠºRˆš±S‰¤�"é”¼špxÖÞ�6ÙGÂÜÍä˜e9†mš±·ªÝOgS5%ËW%íÓÃíÉJÅ4äD™æ\5&è‰¼Ãz ¢6áØçŽžj„Eá(ÑŒïju¾ŽL‘Ú7éLzÍž=.˜ÑÏÐËNôíŽNãšàÈå‡�Ë­µáÀÆi>=�æ)1jnÀI™Ž‘®$ÌÜC#:¨y�>ÑˆU#,7¾–6Þ¦Ó\I®§E}M>ÙJgXüLòÉ�o´W$ÈV\†<1È»ç‘¡:L¢’<ŠD„=éT¾N�“bŠf¶¢�PË¸ÓàÑ�ÖæÂPa€,#"j;Œq�1½jÝ)A`D‘#&IL•`I¤‰%¤hùë·Ò6©q´±Ø.\¯¯Y®=W�ržn¦·©yåzšÚòó‹ësm§[¶¨iˆ²+sP³š]#-¥W ‰«ùCM#-PìÚ(c©{²?íHž°>²ƒÔƒ„FÕkÏ�s’»¸ª»C�±DÑ“`7$cyJÕŒ²TÉ„"–AÑÜÊØ2cBƒCQ¢èUÕ®Òké]×]ÜRoË^»\™iÚyºï2¯&ÄÆ•ºšÜ65Új6�%KÌçüº)8p¥Ú6j@ÂÔ€­¢É”¶™T’RdMšÆØÖš‘L×R×JÒÊZdÖ–eMU}ùyá5¨0X©š-[BTm³JL¤!À··ÐfóAÐWê��u”¶RÚ u°QI‘v™#-q½´)v%)ë‚€È=ÂÁ#,ñ_DGqõçºÁëÏÖB0ºÏ^¿±…,;¹dYMCg¼Ýöf;>,@ïGi½�ä„€¾ Ÿ$fXN‹3�—„âÃã¯],l#,LX·è1žžñ‹II©c&«M´œsLU<Žìï937'xb—‰ŠTäŸsøÙ;”¸Å*UR�	F$4Š¿ÞD€­6„S¨F;#&**H»v›è­Óv%Ùmz±Àº:F­¿sN¼,¿Ó¬ØBÎu?$ 	¦´Ö¥ÈìÌaDUÂÖ¦S"¾0;Ñ TÈ’$­Ãg#,=Ÿ½á»žÀÚïaÖG�p&9êe^£EË…G†î½]¦ãñc'PýR{0Þû°¯uPÈEÐ€Š°.8Ý'T¯÷z)¾b	|±`-TîŠ!“lÉ*èRìçèÙ#,�•¯|ö(\ÑtÃ†õÑ®—DYÔèK¥80K	”m�ÿM‚VŽÇÌåx-õ�Åê/ÙlV¯; Ó}¸x(}ªÃ"#-‘P�_Åóö}lk©øwYµ¼“Äãe®*¶øÌ£g·÷h`(TÛõ•R<„	lÚˆš�¨€þuF¬‘x»#-%¤™Tbd“s[\‹(e¢k$Æ·¾íZäÓi´e-¤ÙFÅ¤E4Ë%”ÉJ¢˜¥– RŒú—XSjÊf6†cLI´Q¶©­SDôâŠÈ­JîºmB_N×kv¯nÝ�13[iFkJkRZÄš1©Uû�UÖ¾³‘,j÷îÙ&È¢Ö6JÖÛ"IlÚÖåÖ–�&U$Ô¶ÞyÞØ›M¦Ê0©«#,¶–Í¤ÞÎÕj[c¨�tVl·�]yÜ’•i“C\·Vj’¼Y«ÅvÄ¦&ÛBFÛÂk²b²ÖÓ#,ü+Ë†8|æ*Í8àz/•%`ucË9`æ+K(ç—¶ÏÓú~‰ø|ºôo±Ô�Âc¡>Ì’aMú1aÅ&#,P{zµ}paáÊbªbCÚÉm4è�% V[rÅˆˆÀRL¦¼h#&“RH* ëT1 �d!#-H¨@„@ n±G–Í,§l@3ZB"Û4­šm¯vÚ®›i6.8˜&†U4¥ÞA « DdáJ!e"¦aÖ‚šSaMw¢™)E‚ÔP(²ZÒÙ¨ÙŠZfb[H¡(´¤Õ)m­6Í3k&¶SE*SoŠÜ¡…e¨¬ª&ÒPJ2�4¤…M²”Ò&¤Í#,3F(,F2¶QM�“$–F…�I«jR¨**SeJS%RVŠJ¤´‘µ(†ÔZÍ¦…�¡%&,™I„¦I¦J–j¦Ø�QdHÚŠX™µ&Im­K5“&�)%¥6ÙemIZµïª×v­¥e¶›Ie©#,%½åµ®›6mjSUd­Z5^Í^löUsZõš¬[m¥-‚Ú�«H•ZTµV5¯·¾?‚~0âìë?~6æò7Øz%åÊ€m%o{¡ß2ß›·Žfzë�-D÷4	€ÃÙ;öôÎYJ&¦O”8ë.ò"'“†›QO<é%I‘æž�0¤yÆäoÑÛRÕB^zoü>B+Yï_ŒOäöc	ì‡î�l$1gÉÞaž>]]][:ë»Í›k(&cÑ¥ÑÙ´ÐÉrd‚í%.A)]¦%Ý}È5ô¯§Ç¥Ÿæè8ÉñÒû1Åìë”:P£ù›Ya%á�¡„†ò<�N§Ré‘Æ†4Æ&lk‚„b¨‚£]}=ÀÂw=ð•üE½`-ÕB\Šƒë7ks…s`m‚tè¨¢Š•û¼JPO-™Á6Ç(}dn ‹Œü(Áƒ_×’ðp(‘LTÄ`w¦C³Ž;¶Úvk�à—®…]¦¥c{v&)tÓÌ8.X9Â†êm‰Sõ#îó+ç/±’•q#,ˆUt?gØËŸoŽ…Úâc¨T™Â ¨¿²¡õT¹?*§D¥§ñ•n¡��	ùm�g#,¬M¶ðJÎpnä)'›QE�Uãp�Ç;[õ>6Ç«eŠ8š7Õf°GàH™ÙMCC2Ö¡õ#-FÊî"¹`‡êé}w¿­··iÀ*@�åÜ#&#&+ØÕQ‚IÄ@ª(#-Ep4®Z„ç#&�Y…Å¸'¬ ¤ŒˆH5‘;:Rè¼�–²»ê»±VUÆD`ýWú	"dé[ž&ya–&\T•CA¸œ4í’FT1�†ŠUI©ªk0'ãKˆI„#-žVÎÄ#&õh‹§7Ã¯¹v­év�çOscÑ]›¼iLcÞ›Qê €fççkTí�&�ïú?ÃÀ«–‚Îx…#-(,))~ÌUÄ¸ÞZ”�Ã"°BèY.Êü?ÉvôÂµ½ÊËbŒm¡•”‘"ŒcFŒêª&��cD2LŒ#l#-Ðh{ÄQšªÎ—¶Œd`Ž[I†b$¦áu'6ÑÍC#,cŠ±¬Œ‚h½0Š±³Ž5#,»KTŠ3«¨(ˆÁm-Æ.Ç±Q–è†0ÒÂª¤Pk¥Ò@É‚¥«CÅ"“#-˜þ:…!®)ô©5A`×@c¥éßAG[‹œïF²�%‘ø€†º…ó”B)Å6Z5=z �ÈAº>(pÝTh†%j=Å#F©+À§«Gë`�-G½¥#,ýàž5çóæk±—°ù'ŒÁÜæ" k;Ž°óÔ_5ô/&#±¨w>¡M2S�"6‚PVÐRû;«~�ölVÑ{ukªX‰ˆ?gÖ:ŽµQébæþ;·6áõõO˜wÝ–|[¡e1û&—¬�KxöC¦1x‚®y$�i˜W’¶âÓåÖªÅ¾·ÑfðÀ¯Uñj[êÚä×&Ó£ˆ“ÚÍ8Cj�PØÅ#,njßRY²’VTÊ�Á[õÉá3$…c0¶ö+ìXmA™5(FûºÈ/o—X¥cçÛ0Á÷ªÑ1ð!Ì<Ãþ1¤2M¤.	”àƒPWÎ‹±@©_.{W\_;÷¤8RúRœ H"–•,o$û[“’`^Ô/ƒòùJØš×#-’­¥�D¶ÖRƒC’H1¤˜Ð@i©IIêÑîÔEd47	¨�F2eÓo8N-¡÷0ëÓ:õ}™› ²í²´€À`®#-¡‘e#<§€õ‹^7Œy˜•,«�	×º£œX[CNù­²V4Z5$&N2sF`Ú�Ðâc8ç=fŠsJÒÓ~úN§Ý~ò ª1°ôäxFQ*©z²¢	@œ^Y•q™ëTéÆïÊV>%B DT 9™<‚ÖØÊ,Ý¬Ö˜�6VeF#œ�‹†Aå—`7ë�Oãáàƒäwü:Õ#â”9fþ‘Ô\.¨¢<‘âXóN#-X0dSÀuÈƒ*©Íä'ußÉ¥ytqó-L¤7Ó„Ë8–¸Ö3"1¢qMÍÛ]´B;DvˆÇ,öÌjœ7vçïÄ&ä29mÐ�Úšˆˆ5§$k1«»Çªc[¶†¶Øª�‹‘(Ø‹­€2P¾ðèõÐÍÒHÄUô¢•xBz—¨°Ó´á�Ýfò¶g’¡q§yÝ	›žt`7ÁÏ°zR%EŠR5Ä1E…	a(¤*ÚºèÙëvÑLGÙ;@ÛCi: ˆÚ@}Ë||¢ÑD(o.ôã(ü@]û‰:Õàµèn(DN‘×H…’4ªœ† PEx`±PŠXšÕ1c0IEw	‹„ \]ç|TåÇ«NzîÆs�zîLYuEUb3+8¦7š§×}ÍI�æÁH—Ç¹¾,u/«¾ñkÝrÍ³r>p]5„‘¦†Úí¬O¦¹Q3»ºéyÝ„e<ís›‰�.W[rY¥Ï<ëAâxñŸ‘½&YÛE#&I ÙÆµƒtbR Œý=·k½TQ¢S#,u‡Zs!¼˜³Ó°Ð={Di+Ý<¤àzïÃ	ÒKQ€Íó"¤;ö"l¾3Þ½â=öÝ#,ýyöôëÝå[ò	Ã¬G^@²p)œY¯,R…^[‰6†ëÚH^¥VieM­Ý¢Xþ_�bb(z¸&¡Æ”pœwyzsëªŽ˜ÆaìÄéíÈõ‡ZWƒØ)¼PNÎM;²�‡À{p‰ÄÝŒã<ô’L@Á²A„ôì2Øé*Zý:Z.jH8ª‰$‹ãó¹‘0t‰®0ñD(YzwÜ°À—€jN,0â©‚eìº’E„@ÃIe%[(“Á•‘3(��ëÍzµzÕÒMŒQ$#-I"HÆ:A(ÒLcqžÝå/;·„ÕË˜¥ì�K‰àË±’’]–Q@21@xìë­¦XrH‡P£¾+ï.¦ÿ#,t]º=&cêû7r’0.Ï#,†Ë’yö<9GªHY•+Œó±"�­vÐ1c¥Sä&Ñ5÷—Y�Íš-¿«tù._+Ò-_½­z´jÉµVFaýéÁP:U2dwÆy¶ÛÅEouM4m(¢Ö«”eSM&ššë¢æÝLId›‹hÛõÕnF,EhÖ¾4¢ªô½/RÖ¼n‚0bÿOõÕ¢¬ ŠE` —€4R4-Q¾%Ã.s@a;_,Pæ…™O†4°™uÚÌà&YB(Kd¤¨…‘–œLgLlê‰ŸzAšÎü`$ ËHDŒ/‚ÞŠ¬3#&ºhÄ¢e†l-&©%]Ù˜CAÜ¯M~[v&Ïf¦Á¸Aaw–#-Áâo48;o\“ß%#,T_ôrØ-)CÊÂÙ$RÐ¨6ØTþ*¥Q–ªÏJ#-…],’jóÊeÉ‹"‡‰±fÇ§‡¦Œ‡luT(�5si¦»®ØÚdTi6Š‰”*´#&›»|¯1ÐÀÂ5ÆFÈåƒ°›Æ\³r>5Ç]ð±[Ôz¢P‡RA2¬ ÛÓo¢|¹>Ðàð',l�þ$Y0J…#&‚  OÀ±¸µž�’~;¸ŠgLü±÷Ã#&]Î‘6À¹Ðº “§»âmÆ2D ”„MA¿òXrW#mŸ}¼e¤4£¡6ÉØ5²B(Ò	"£ösÑ>�» ‚dk!µù¸þœ�J}ZÌ·Wæÿ-èŽ!ø³¤�%Â: —†b®É·ÎÐž‹âÃÌ;ºÆxŠž@¯hsOîñûˆäEAÏ,öàCƒ®®}f\^¾ˆo¯™G\3ñèÄT,¨?Ëô�º‡pbÈB? �! ]#, çÂÕØƒåæCÁ_§Òú‚/øŽõÀ‡o¤Ð@$�Nâ#&¤ªR ªAU�E„#-Š•‘@†hðFÅ˜"ŠTVD$B ¹­5g¾Ý#-e²#{åÇûÐÁû8Ü`Ì•Ñ‚±Ai¤±`§X�¢Þ»õŽ¹„r;Î¤ê>ÛkÚ¦§å÷î^{•ˆb$ù�Dƒrz“Ü”hu„äñ5•œŠËûáÐ9É$	$â"	ÊÞ%²Æ÷²Z¤P´”Šá¥äQ!Ûöö>'Ï0»Å*ŒLV~^¾|¸°œ,Q3–X{�…~/3Öt.ÐVÎùômiã»Çê‰è;K[²Ò¾RýTHö…†œ²îË�×áG­?"w‘P;r$„‘©@ŒÍ4î%zô°ò¥mTY*¥6È.j§ô3,?C0“M÷—íuCFª ±QT*¤ÏòÝ¸¦Š&X�y*˜ÊXKÙ+#&´0ËB‡ì@ÃGZ?ä%íý7*ëU`J’##,�X�9M�†a#&ºîWŽYåáŠ’eb•mqÆøÛ0ÂÝÑ!ª1,Â#-2dAZí&k-®%�ŒÒ82a„w¨`(²QMJ¬Dl¡FBÚ¬ÞThÈi�¡±ŒÊÉZiHÔ+5„YlàÊ@n¡)�CD¤va[T#-B“,…Y¸KM™)Æ(/ì4…ŒP8Ö”¼AÊ%EIá�{7�“jñco]­zUéræu•ËÚ°`ŒÆ«Ù¦Æ-µƒ1••´7HÚ­ |!27’Æñá„ÙaXc0­&õPõ•`N×Y%ÛG}C[‰*ÛM…‘9k–¹smJî‹ËslW-ËàÞ1&5ë»ÒãCË®ÛâÙ4ÛhŒcÎ¨¸Î–¡³´‚ã1«Nñ,f0˜A¤èÎä^?Ï¬ÃL°‘¦øâ\kV&4yÈ7Œò†‘<Dº|c`mÉcŒMÑ¨ZÚ••‡–©ªzà«g"B�`*<ZÞg¦ûÐÿ":úW¨CF­ t#  e—àî¡óê¥¶Ù=&.h›Ë‹±�ßµò�òªXF}‘¤²š©5˜Þ;U»ÎÝy2Ýf�h`V'ÇòÇõRSÇLƒ4O^Vâråîz¾-áá£ >h(õ…¦Ðª	í#,çð�×?4!ftUí#5ÿ’>PÓº5—•±©RÉh²«ªŒiQ&KÅºJ¨ÂÆ±EËUu+±FÛsu¶H‘™%ƒYPu7V-J’ ’*?‰dÞ}‰ü��äXw"j@QHXÄHE¤·�â~g·¡`5?l"RÎ²»~5cÚ:²‹79}¾ƒ5É#,F !ˆB’*´QB5*¥E#-D’~6	r¢…"N_×f0 Ð…Â©tÄJ$=×WÇ[ŒÄ%9žÐ<\¶Ž<ÂALƒë›˜Ÿ¾9A¼oUQ	E_�V#-hBón[—ÅyK%l›yÛ©J–Us\ÖñµõÛkË2"‹d­a²Qêk+ªî¨µé«Ú™FÆdLDhÍ¨bh*�#-,ÄÂ’[RjÔ™¥¦3[ˆm°#,4ƒL$€QD�Œ dyÎËR±ûúuC©¢æ"ÖÌeðXt‚;`ÔR UÂ¿$Œª)rHêš#&EÀ�G0’Ä\E,IÉ%Œ _DXÓ^ðY‚rY�nHè\w?„§@¥!�ˆ^�?¶q4xLµeèÞ°ä¶)"ØOrûä€;4K�‡fgŸ�;L@ò¶¢ôÓ?´û¹1k™Êª†ÈJÆ�ÿ/‡CovÔˆÃÖŽÊ¡8�Fì.1Ì3ÚM¦`—,9–rÎº“ç®#-TT4úC#&ÛEüƒä}¼âpp5s!ì#&J¡³Ž½è»@îD<Ð‡¼l¥x°KJ•nÛ¸¤£JZR¦«PÍ¦½åvÆš¬ÓYORº�¢¢ÅÁaDQ’TBþ˜�™�7Ü¼,ˆF«ºtomú?©@¢‚ãÃ`L'�‡×à‘°}_2q:BðüH�Ýåaú´g	ÓæÍ§}iáÑòaƒ$9ïÓªLM$×{¤ÃZk9»?l«Òeë®jï¤q#•mñÚ(j”Ã}õÆÑÒá½×	"D`•”µ¢†ZÖ81†Ø<]QbiˆãƒÜ˜‘ž~#&Œ(t¶ˆ7ã‚ Yˆä>+ÃÞ žIé{;à«°’I$HI =QUÛ™9ÓÐy·§=22öþ{ëÍìÙ6[DÆ#,�6ò\«êX²ËÂ¥9Ad#,a†¢ÓR¶dÿ×‘·9+6Üè çô/C<0gQÒUÉ³šb?uŽ51º’GÛïÀ#�vµÈIþ“¶#©NÖlÃ@,×äÀßf›&ä0ÄLOõµÐ£Hš@Ê&ÀÒ„�%#,.Á…šq­Š��SDô#-!�ºm¿ðæhüu&H‰¬Ð8	®�� t£äÙ×ƒ*Žï¥„ÌßžW)ÆviŸ»öèbI¡£¡k”×F!ÔÃ'„qn‡g#,v>…Ù­/ñ&ñ|<~pø�Öû“]#&ç\v(|¾!¬â€‘¨ñÛ[‡žÔh¶¬E²ƒRRd³LÅµ5´µ&Æ´dc)¯Ö•Ñš&TËK?CVåµ3-M‘h¡fk­˜ªbXÛeª•¦Öi–³-²Ä–±iDU6¦blÕf‰¦©¶*ª-€�-m6{ê¾Wò÷moÓÙ5ü;�­²rßpÛ-�4p+�#×ãü‰RZÜÛEk]NUj-¬ZêkZæ·fðUæ6ýÝ¦½26ÂA'"v§YáÙÇ@N €n£lGš¹ÌZÜØ¢’ê_ŠÒÞÕWd„�OÐAvÄ"ôH¯·ud$C"¨R1¦�,ª=Œ)>2�\`ô8'Ó‘3„ãÀçdzà¸(íÞ]´Rñ!F�@ˆxàSÓäŸætæ0å$¢)P#&÷D#,jsCh##&2=Åü˜–½‰WM¾êÛÆÚÚår¯ÔÚä/j[¤R q¥OjÌ/g;ÄXÍx#,Ðüzçàç‰6¢ ˆx:ª˜²>³¿Ê¥§m©#,±¹%ÉèFI¶éMà\Ë°¹”Òõ™™ƒÄá¿\¸«€ÏñRÂÀÐº…®D+‰ò½¾�b©Ä‰Þ#,#<ÏXé“°“ÂD¡(ìguÕÝÚŒš°Áº}ãP9=}ª¼;È³q»¼±”˜&òðÀ);ùQCraÁÄ	i.¨áÍgó½XOXŠÖ0†¢-„ƒTÑK0D¿çœé‰“vè¢‹n,M…Êž/õ÷>qJ=¨}ÿ‘u¾iXü5eS0æ¡40ßŽ>NÏö;ü´ACtsæLD1a4÷ áîv¿ÕÌ5Ã€NÜWÖ õæá®¿£‘ÑŠ�Q$%ïü5áÇ<nßâ~ÅçE/6•ô#&nsuÜiiâ7I6Ieø‰º üßg²€¤š¤(Fœd,RRÊJÐ`€²aO�ÙàiŽ»V¡óMÉu"‡¢(Ë+Ê“¾ã¯Xõy/•ÕH†ýxƒoMt#&‡Oúo,€Š*Y�th?Ã[[k–HDŒg•Ô#Kd„i¦;A…$m¦Eò÷û¾¸4a›¢…3Ÿ,L	t¨¥0rÐ#¦åDzv@®È‰#j¼bXÊÃID0Á(Ø^H>æ%¤„¸£Á5«O¢âÞw>Ròj³&{*´†_#&ÁÝél–$L¡LŠDeCxF(5ØZýõ"ƒ¬q1ºÖ4s#D‰>Ø€i‚‘>`	³L`)ª–¨õ¨ôö½~�.ºê^Ô–\¸^ùÛã;o7�#,®Œ¸šHQ¨4G˜v.b�&L³u:§ ¬J‰Œô*Æ›‹›0æ‹²Ÿä¶Nç‰åéÖÄƒ!¸ sò�(¹#QD)(lS@Ñ°‘Y˜ª¤æÐYÁ@�`'šˆgf“×éò¥épMŠŽƒ°ïó32íëWÖîïó"xÕQ# 9¦IÀr*¢Ú<&µŠª<i=ÉúS<¼ï0æ�¸Ø7¦!	d9¢ü™�#&ý¬Þ\3c·t×ECžn¥’„í¡NÑ}öÛ{x×¤m\5&+&É°¦,ƒ¦¤a®Í¿·3¿ì�ÉQBsd)�H7T‡›(d–V%È¤ ª+ßwÊó=oz%.xé7—)’�»Ï<¡·Ùt‘^—wvËQDº3†¨~ÙE‘Cæ×$D0ú#-¡H)Eë;eÝ­šgm˜qK³™“T#-ˆ Ø¢yF#’‰­4PÝ#lSš4œït“.ß� â#,gˆw4ÎÄ´ÄO°§"·wI_x!PøYKóDE\xhm•#,¥råK+‘@%°ÛÎcå¥èf°#-õ�*¤<ÌÚÙý	ÅûÞ*�¸��1Ë�ÉOÃ§ÎMa¸Käÿ)Ú‘	$áçÈ�–&M›eÖ”je 5–WE·[Ñ$F¥”´ŽÂB°ƒNÄr�Í{$p­ÝØ±?„™½p	†8¬§¢g–pìCTíSh}TEÜžºÈ£Eí²ôgTxéÅÑÙôƒ�³ðR$oIKŸÇ�¼(Ð#4öû½*ÔïªŠw9.µJÛš¡7¼½5_ÑVšë:¼¡��=´ÇÓ8_<.é´ÙVi£\îoÆ/²‘ÆÏ÷ý¬±×ÓÏeÈ·ÍiÜk±#-"²1*©ê`°#&’#&AI#&ÄIE¨[%–Â€‡D±d²*@‰¼Æ°­Àñï(<µ¦AOq#&,ÀP]¼=S³íW˜p7o¡ò"óþž‹Þ€#&¯ë_n¸Ãu<OÔhòdÃ�;šóú™8€2#&²ˆ!Éå¡GP�œQHtÐ¾�M €Ü²Ž‡K-Ò-#&{Áq�Äu_”ß…³³³×¹#,wp;ôÌšï´íÏœM¤Eö?[®ÉžIéTöyJ`z$èÁjíÕëªôSÙm/;s\‹`Ô-A+‰MŒi!¤&0m´²ñä£Zyµ¼»]/7mÉX�AŸ«ö|�‘ä„£bÿ4óé;¡‹Õ‰m TäOAÂF€Cö¿ÂÛ?½á1Q�FX—d4>E[2ÚAC#-Æ �jDÄû2gÈµüûÂ›w{o]åcwEÂÓ.�cTbïFaS*ejKUÍ¼¼v®–ø/UÝc›ÅA0å­,¶f«(E¶ªmE¡ƒ"ÒPP‰i/{&Ø„Ã §O”&µLXêk6@¬¡Ô‡N6ÓÈKwL;<yŒÛ#hÔH„�$lÉx aÆ°Kú¶­46¶ôlJòV¦wn%ÝÍ²9PÃ±(¼˜†m–ÌG0Ö]ÁF›×Û§9ÉNã’™ùš¤„ÆÛ%ˆî*‚Et	¦Îzzjyú~ÚÏÃ]À»ùbréôRÒç*ØÝîõzEì�ðX—MCPUÀWöi\*²È‰«C¬j0¯	Ì_(>tB�_yW°´j¿"¶ûí¯2³IeF²VÄËFÉi5lj”Ä>ÆH#¢ ï¶ËbÂÙ%!P*#$ˆ}Ýãà�^?—�ØÃª6=,%7u¶©ƒ‰õ-ÊªÃÕÝk5d*DÔ9”§.³Ÿ.i§Ã,²ä*À§Î5íŸIEv¶?ZH/la2Ô2.ó}œãÕùuÊõòëþn×�k|m£SŠ¯è~å‘m—«å>,5'¢Öû™­ÆÓ	&É²¨0ƒ~Ï)”×ùûçÐ™c‡¤àðÛ›íC+œM€u-z¨€š7 r:ðœqI‹ÛiqÇãƒ�„Fd�™2m±‰óéÈ9ŒXÅŠ3ÑY¼…áØLHšC™Ü;p‚ZÃ²*<àv#-’¶æ›÷¼é™‚Ú)–‰fiMA=§¹Kß.öú¶Å¹ñ6�H_¿¾;ïm×ñ#sµzx’Õv:EîaµSIžÿÂ_8SÓúýúûñÇ"Ñ�úõê–«`½ÚMvõž~ãÉCfÄGÐy*£ïÁN�¸wÞÿºáï‹Ê'q˜T?1Ê2b¦†–Åz‰MÅÖ‡öSc3hiô|Óg~}	yi:Æu¦µzèƒ‰Õe‹¼SZ£ sûR,Ÿe#-ÌjjíÎýGzS'O}]Ÿ¯e;tnÞé¯#,ÎÃqâ‰÷qgèd;C$3VÄuBžlP˜#-¥B~¶B^Î#FÍþÞÙØeìX	–çi�ÏV÷»*%Ž^"AÐˆ{ZÁD;¸T™ -]Ú„X#-*¦%0Qã’äÍQ-aPa"£oAKA’Cw»[ß¬£êßªˆ�¸ ¿aå.üF"§ÿ/õ—ìÂ´¬�F0MÇ;�ÖÑ`±b!A1ÖL’Œ±$‚Aƒuƒb€�ŠG#…\"ÑF˜ Þ ”DDø�V/@„VÄ¸Ê&¦Tƒ�Æ§ÊõÐáƒÄë;!s¦]Go­:YÍÙ©eX~ßê¸^wÉEª¬ZÅ­[U±IÁj/¿z|sH§Ë~Þ}¹ì9»O~Ç¥NÏ(†¿QóhiÑ¦î‚`†Ì5bË„ �)É#-Lµ‰‘:WFÏ<Xaîàµ�D#,4viÂ7qt<„–¶µ%¼ƒ„MõSå+	\¹ä¢¹/b7÷¡Ú'Ë‘¨„±ßëøî	#&B_Óa¡£¸HšzƒÆzå4Œ(¦¡¬±f¢¥7'R¢´I6Ñ€ˆF‰b�ÚšjÊm´íÛWRlM­³Kjº­�ÊeâååÝ¥o+[èË(ØR¥VÊÕX¶Õ÷<›äÜú§�‰D1íóÕ)ZkÔ¥1¨féÊÝLæ²äVH$p×ßQ`RM±ì½Ú#,1t>úáø¸ÏÅ®Éƒ­óñ´�#$*Ö{.�È[ãƒrî#,Ã0�¾Óv”ºï”±¨+j“è�8–Ã<?Çp¶<h6ØÐkQ#C8“PÈ˜F�Xl=ý“ÀjÎæ$RÈYJcO ×<è>Ñèˆ�­ˆpS-¯vàMÙ”dnÐL¯OzÆ�³³‹âoW&VBŸx6@æ{g/…x7 Db*“Ò\à�±¿XÉ»'?fÀ·žÉ_¯MÌcˆI:ßÃÉày��'­·ö�}9_úõØÑTF†ÚÇ?*.ÝC³U‡íß\K­Œï+|I�†?D×¤ï[»™7œúM¶päÑšõŸñ~ßÇû_ÞßžÀ-OäBP¥‰Î¨×6¢Ø2‘“¢âà‘rÈ!ßø÷ÒZ¤(MÊ:e­][µ¡a²"6­±0¼È*CõËâÑ!T‹d‘3%Wã*§"G"]ÒJ^‚À9±np9·bÈ!L7¨¸<AuöáêpåµÉ…-Ï¹ºÔ$ÈT‹N	8nê¢ß6Ž~§Î�×Œò]˜³±à=F´°O× 8�‡¢WÅÚ�VâžÝ¥Xy•E4Uþ¿ÝÖwÁû-$’òfÐ[2Áá‰#,™–ümQºC^Wë¨5Ñ08˜lÈÍÕš\~S"y†à³Á#&t„a.xÐmW0!ÓÍã“›@M‹ÆÐÞ?›„Fáw/N–ÛºM!p<Ë¡1¸JL#-3Ü(™Ã© “¥j^RÁ—Vk�mH}ÍÏ"ñ¢B#-›@ü>#,T>™óÌ(Ge3=g¼íë�=NLÂòM9IËïÌy–pÒ†æÿlkG}êWBÆCG¹÷cHgM‰a�rdæ7ñÙémÖ³Áõ$�ž0Ø–ƒˆ¯�lDó£0""q©ãª'n¦±ƒA§Íõ¢ó"¡P•|n¼µV^!Ô2AÌRËøð+«ç¹óÙ—¬~dF#&ì€‰^ª¨B<Î”sÏ.jf¢kSöî¸ä)Õ	vÕsk§Ül^6‹V+Qm¬V£h´jÛ6É�RkF²XÚÅm^*Û›cmsJ›Xe‘Újf=<~ÛuÞåuTi.D%©,T‚0¥Ó�ÃrªôX]æÐBÒA€yöî8�m¸]¿†ÈMäD–px>ÂÅ7Nú÷™#-bŠMŠÏVªÜ>ã–7ÏóQ·w[:þ©ëõ¸AõSö®šºÃ!¿}¨Âm²A™rÍ±°Õ5�Îf1’e0—î^…ü»“àvi6�ñ¯Õî#&H¡##,OB¾�Ù‡ 7bBDBò@ð`ÃØ#'ÀwçÇå¨ûƒÛ–�ÇÝ�"TúÈÈéøÒé@ÜfS»vWÒÝ1¡†@;$¡Ðs�M‹_B‘ªPôÐöVâ¢�ßÌ0„!¶ÛVb£9µHLÈcãQ Y´&©ªVÍ,[þM¯]tÁ(L:‘„+w=GÐ XÇ‰ü7_c±š{hP¨;à•�ªê’ª¤ ôQó$�Ÿ�^½éw3<Y8¥�h*.‘qá<áˆ¥¥LÒ²%–Å#-eq}k—4(#ÕÌ�,	#&A?åTŠ´m+i°(3¬?_]Ö¾S3€]!7#&‰Õ8Œä7†$d‚2ªA4Uj…@sÃ?OÝòwâÊ}®}_sûÖ1ÍzbÄÒ @q°‘ÈUL`U,FBj�ŠÚžµîÎ0_)ˆd�3ªýOn#-ì©”;äwŸ‘­ª\Z§Æz;r·Ò­‰�Ië!G#,á™èPîª§´Éßí¬ãã=6dX´#&Ì_'ì°;W, TrcÉßIž}{¨/¬ÿ’Úõ×nÃËì÷ƒö|B÷Ú>j^—I»�CD'°÷�ÐÛìÚ]Nï‰ã6­–¦¥¾ËôL2b¨UEfºÑ³mk,Ñ�¦B™*¨X°@!ø;´®™Iõ ÙMIÁ�j7¹H#,&7ƒQ1°u…H„U5 “‚ƒL#,Ýv”�©™šÅCE£]q±c@:þCÙPo@²‹7†6Õ	1’YhˆÆD%�á­AÔ¡CC#�Áš¶Ž=P(ÒÑ•1*0‰‘DÆ´ÄK �Êi#,iž"�­ù7Žì5}éŸ¶[AºôŠDÆØÆ	´#&�5Ò®oœÜÈ³d«JUÎ“#<Ýu“*B”ZW|üòy“ÔÛ¾=zñD¬Æž·[³Aå×fˆX^ãziP¶ˆ ¨ÌÝZ@Œë²Ä0Âí�DA#&*#,JÙJÍ¦61jI"Êm62Y¶fI‘¶ÊV^»·—jäÓ»—6ä‚Í×\¶æ�»{ËšóyÞDÑB¥¨f7-õ½w³Ù›šf¡á…,¥Ò¦’óâŠ#%XuÓ#,�aºÎSm&5X<'#,Z´ i"ƒ@ì±âzz³ÆÝjwNÉ†µi±¸ÐÔhè`kðªµŒ$X-¼ŒhÛVÑ'Ó�“Ï�G2m6”�7#™ª`Ä£[ß#&e–a‹Mx#-Yƒy»V*‚Bµëk¥R1­R Œ†©(G!c†œÙ™dµX¶ÝÖjŠ²SB1),…  e‰‹Y¸d‰XípÑ�È	HP3f6šaÛM´lâ$©Vex¬ˆ¬(ÚLCFãÚXÉf6ZIY\ ä¢À±¬%F³ ˆŠH�ÕAÌÇmLa›øåÎq¨ÃÃÊÝ†R7ceÃ3 ÓS�9›#-»qå+RÚRâh+ƒ™po>6¶6µ!’/¹¨ôÿL“aB#,žÎ%ö7eªg—9ÎZ"®4¾Äõjîz 8‚{ÚÒXÖ0õ÷LbÉî¡ˆ¼#,8ŸKÉ³skhÁÇgzF—¬i¤\6¬Æ–Ù�íê¨1*›=1#-XƒP§ÚXÌ{ŠÍÐ0Ø. q´7ï=Ë3ü#,JspÓ¨¡°†ÓC?\ò€	Ü}�æ®E¶â5�› $²àxOÌ÷X_¥‹®¦_›ÛÃ×åŽ•Ñó[|ÐØ´Õ›o'L+¦B¾ÌVCÂhÃ<Ê‚ÛH0Äd&m’\U-4Öit=S|æjINNk$4$Ã¾t«P‹FÍ¬4¨jáQËb¥èµ4sga3‡6�ñvý9óú¾S³[s€«jJ�ND Äâñ¦Æ-16Q'*VábX&.ZÝÒ/R-iAçV<²ãT3	YŠQ@1¢Òˆ�(4!­î¼ÔmtÕ›yvòš•ëj�‰ˆ0�Žƒ:Bˆ 4&*†5KiÑ0”BIq)¿ï18ž'È<Yôà‚q ü²|ÿ-Ý±#-§òp&ÿ‘í¿;Õ·ª-XqŽ,CùÌ¦�Ù#E#-¦°|>É¦4Lšö×vëzµõiFMŸÖÒ±B{ü#-m(Jh´…ÝFUGäë«�R©hžïB’¨–wD÷I’Ry\SËÁéZ¸¦Pí”ë²xSpT`VR›¨š—¨”ˆ��ìððÓ1#-]àÂ“Ë®‡¦‡~ÛVÆimûžÍÝŠ3	$9nffÜ�FÍåEuÏFÜ$Â1Þ#-B#-ùUÓ±Ældïu„o©«Î#,¨°*°ƒ&cŽxi":z]Ÿèm�z×À·/:µsOƒÃs;øûLA¿=EÑA¢�vÚÁ„›Ãâú± L(þC“¢$†L}æáppz)»øÚŒWÛÕ��y&çŽ…ypÁpÌÔ$–¹«~Û9„aç=JnÊˆ™hm²Â$S/³¯8`®üêý,¦ûÊ�r%MšN–Çôü_Œë–6u#&Ÿ¥¾SŒ­Ò÷cˆðÉ™Ï¨Ú°ˆž·í˜õ2ãêC�ú€ÖúE£l%R·Ê¿=¬kmžÓ.#ahK¨Ù,ó�"#-jÙR?*A/F�ˆ(Ÿ"Ž©G#dR6�ÐóÍäò·Ž•ÅWfÖáµºmRm]ã¢ÅXµç\ºjímÍ»·2êñµðË%‹H´ŒT©«œwUÝÚ±­JÓ[$ØK�FP�*J.å±B,„–’#&Á4¶„”!ë¡¥ù1m…õäŠKóÅ:ŸFYÄ‘Z@AFPbŠ0…#-Ó#&)v#&?I˜#&À IÒ2äM�u®÷-#,^!9­v½¶¼™¢IÂ@1¢–úe#,b¡)¥Ûi]kÙ­DTj¥)jEýZŠl¢Ö+13M*-�±¨ÔÌTlj-E±µ™X4hÆ™ªM’Ì¢fLJ¦Š#jfM�#"ÂHÀº€P³²”#-"*@æ}|3$ËC@ü?"(ÄT2…àU‚2#&¡X)!r}ç~§õ{qéÝï‰»3KÏËì’Oøß å{py£cd+æ"9L^g@Þ[çG'¬Q ÈùÄ"E´”ÊÑ¾nožõu4j£ñMoÀ­nkÅ®Ÿ·ÕÔ�)æî¢6Ó»³®ÚîÒRÖÜÅEU�%·5ËšÎ®ÓvukJÖW®ÝšÍEª»i·n¿©óDš“™ÏKš`é©ó(öªûá@Ì4è&‰$Ä ª!ÐØ¸“uÝ„ÒI#&‘DHhFE£ˆUn;zrj”#Š#,ÅuLC@]Ä	™píì¦¹–o#,‹bIé}’?µ>�Øûû%|>¬OvK8.O¡˜þ5çED.`*ëD†TE„úf›#&‡àxÀÙ°óª�ñ³‡&mÆ#,íS3�ÏÊËÆWs$ÓP˜�cLR+mM7Gša™#Î;“o³´ÊrJ;]æ#,ÂR<ý»Íóåð÷ï¸Æ6·ÚVŽá1«cFº={ÎOsèÉaÏ8#-§u„Xò ÖÈrO´®’ìl¾.÷�ãF†«Ë³&l:‡¾‡9„K¯ZvSía	wl²¹ã94gÂËm£µÑ-#š™axNã2–L4Ä»½žç‚i#-¿Ë'mF0d^Ñá�x%Î\‹óÔ+	ðšÕåp;MªlÎ6[?^6áãCþÕcÃHrb¬[é3,§T­ª•ŠÈ&Ãì6¢�|´Bëí#,4N0O¦0ŠÂ,•£T–ß*}¥jé©1¤×ðd”‹•é;¢+œTnM £b‚EQ#&‘d€²$XQ|ý×œ€×/<UÊÓñW�qÆî”\gÕH�†"¯ÎÍþ%@8øÂööKÝRä$P¢)®ÓÛ‹¶36«¦Õão%k<f Ø#‚4Dhƒˆ_*Y�U8†\ÈÀŸ�`.EÌºî�‚ÛfIŒlš¶®i¬_l•^wUÄOeÞ*í"#is]äâžäŽ)ÂUŒ$Œd"	'ZÍÜ+i±ÚØÛdfPB£m­£lÕ©Jq#-¶ÐD3VkT…ƒchTÂ…I%TB…B…b±‹�è2£¦#&Òf!oU‡ï€DdÐ¢0)pX4.�lðž!ö[;¹Fð#-BpiŒb(0öÊœŸáßçÎ÷ó‘œ¸ÆÇòÙôÆXú°Ï©mS�†µY¸6ÚÒc<g§jÅÛ0wnÚnžf#&Õ åÆca-FíÚ{øg¿D£»¨#-*œÈ"Uµõ^#&‘*Þ­_‚¯VØq $E7þžàòÓ?™ñ!¨*‡Ö?šŒíFGã§û?`yBÙŠkì†p¹óex±6›(Ÿî#&‚ˆ¼Žs?±�¦ôU"U0õªºJÖÎß–œOÂ^–4äû¤�'ðï²ÕÓë>NÍûÍœ—‰ÛíG#,v:kÁº�þF]ÂÙrñ�Š‹8oÃ†Wõ‚àñŠ¯núÎöÖÌ€¿¦™#,ÁD2É˜- b2î3±–P!§ˆh:Òú*í�•~MVðÈÃÖ¨ªÞšJ#,¬áE#&Ø»"•Põ)ZE2H€!pòµ‘„Òˆä™.Mƒ"Áçø*%âýá#&#,�pæW§^sºxÃÓïó Qù¾GwÇÖ©ô>Ê›&áò‡6»#m›Ñ£ø•Nœâ3„“½*z€QCùƒ-µ#&‡Ÿ�0xDJªh¦H  °©X4LŒC©(b!VÏùn”!Qjäw¦3åû¬ù\x#-eä%n«º®;[a2³²µÙ�Ù¯7”'Cøq“ìbÈ²cA»²5uAIBÄå«†”uÝâòœÜËÍÅfË"i$l&Ê–£ÆÛ´Û&‹S60xÜMæÜ®UÍ�Üw^s/&ã®»eè\®îÝ"¹x·�%QÍ6[Éæ[«—sY–4;w›T«FG�¶×7-tÚ²[F¥,Vu¹M™dÙ<VîîèÝ9«»3¦¹"–ŒçUÛ.uš‹FŽV¢×m6Ü£MV�óY²#&Û€¥…@ö§²a¸Gl¨�D4€nï_#&h {ƒ´õÁlCÎ€ô»¼<!x °b5@@�J¹ˆ–ÄW—Ü¡ä¨§ëÍCËøgïNáÁê)à‡Œ	‚Ä–o®=þPžÀ¯Uö›}ö¾&• —Ú!éÏÀR~j(?/†ôý=ÇQ¸ì=èX*¯§U�f`�ZŒ¦f—Ö›•Aí‚%F@R¨,ÿ¬¹güq�c#&Lç_¿•…ÄA‘@B#-‚AX�šA‡Ø|ÙŽ‡Ê«K_]£+–íÎÕ8ë»©ebÆ»kÔµâ¼“}ï7˜‰¤#,ù„5w!,9"U ^ß ‚t;ÓVåºSÎ¶øLH§§L™&h6"÷Zµõ»n¹Z÷õU½WG›t{nô£I…ô½-ªð„ˆ#EJE›"Ø	‚P- Ó�F*†§\þmë˜™)ôˆ¥g^ˆQ?¿‰í¯ÊÅ#&)Œ4"B#¬Rˆ`úåþI©í¬ oê#,‰œ^ÕU}ö­Šš¬­K6[Y¦@€�,<ÄDÝ—Ô\GC°ˆ 9ˆè«„X¡		F Hª„‘D$«Ðy±ŒNkU¦ùß§ì{ê(¤Ô–™Œ&”þÕBF"I#&ŒEb¹pÆñù`é™²ÔÎêyM‘v€zâ¤�9ÅM–(S@î¤ð#,ƒRI6†¥¿‡KêÇ¨ÝÕêïú7oØþÌ"|—ïd`ŸB3?A/{õ|+ôßeâ@»tÀ8ƒ,9„ÔþVy*m1ƒƒdHÉ4	;Y×P4¤'åh»°4ù�îŒlD‘HI'dR´çc®>v£©Ö@ü¨?Y,ìêÓ²9;ŽàA¥ùáhyÇÉ…¬pØ‘ŒL@Ô‘,u’Z(ñ@‰`¤¤#-DÚ‚Fä¯+³q-cÙíê½/+Y6ŸÙ¶–2À¡�4m’)3¥BQ²³R¢º#&V°kƒ1[¶T#La¹rÐ¸KAI"ÛÚÀ-zUÊ’Ü½ìÛZñVÛÉ¬RÒ‰'~‡Ó£m¶ûÚ]fË®:k_d›�÷œÁTÌc3p~“” H\U3‚Ô#m.Ç…Þ €ôòÉ+×ò#-Ô4×«z½�nG�±¤ñŠæ»ÊQÅ³.ZZA‘�#&$TFâ¥B‚$	Ž¡ôäšD#,M¹&ytUØRoß¼6…Âhü(Gõ&þ¢˜('ŠTqXÓèwÑÖ~rÙiSÂ�wbDXT+	šnÔ#,*9XŠF–¨[£tµ�<½4íaõ müÐÑø@AäHÆ@Ü±æ©Ù¾#,#&%- X#&± Ñ*@tS˜JÚþZÛ^ëb4¯»Í+·«NÌA¨ YƒdjT’N¨v1#Z@š ·:×ŒöÀÞ§¡:œaAbŸaOùÅ6¼yÃéü÷XLÑµÕKRR‰‹h„6­ÒqŸÙ†ƒ_l«îaµÂ(t8Ï¸vC0Èâ#L`�¢6›MÖDÛy	dÉ1ÁBHÓ#-ë1àÔxÔÌm»$"¥t#¿Ó#-ÅþÖClÒÐV†tyðäkËéÞ¸>‘¨…YzUm¸™ZÅËM>ãqÍy¼hvlÓõ†ˆx„E>Ð¦“ÄóØâ�àûPtÁPOàÐœv£u|¥DÓõÕ�Útà#-&ðÓd#&�¤‚‚Oe#,0UXûeH �ñ+QëT{Â¶h³™sJl¯ß#&qo¸SˆKƒçãÿãƒn»»PÿFÿ½&GsÙ¯ëéI4`Ò#-™£OÑ„ú`+	¹³çÄÔù*)¨_³¯r�¹ýx7e˜ûŠýŸub�Z”üJUŽ‹íî¯c¿öôSÞá,¬»z.™cÌ0kè„„åÓgëW£p´†‰PEG€¶ÅÊÛA½¿èhÕ2™bQ«pv\DÆêvÂ½¹ª…1b?K^ƒG�OBC¹“ŠjÅ˜•‹žVÆØºy$LdUC#,žxY‰L©m@ÒâRgpp¤ˆŒÂÉ�2"ZBÇË0/ñ#,ç#,íŠ'yŽ‘Ï÷­½˜$û�4Z‚˜ ø!�ß_3Ž¯¯¾4¶Ì‘öÒ¸<”HçÍæ7í0»Î:ÄíŒz˜ÞÓ–æŠ£ÊI„a÷vG#-ªsf`I÷üUÁ(Gñ}ðío_Ñ$Å1ö²Í«n¶„-î9ÈöK¬â¾,¿Ÿl¦Ñ¦@` ÀFÜb§&†0�>Ù!#–A³OÆ1Œ’¹à�ƒi#,ê·6´E³ZÄcii�DšM©¥àü'–C"ÉÕ ìŸ£Ç„½[úXæ�Ñ»Þ‰…‰'mz}e°&f´R‹˜ƒÖyiÚÎ”óK×ù=iæÙ°y/Þu+‰`Ç„z’n�à}˜>ŽÁh%÷²på–¯o3ë¶ÁNP4oL×Mã~ýeu yà[xÖq¯~LNïëüÞKšçM�A`ˆÒÒðÌé-MâCvß†CaˆìÞ8<µ†çÑ{2�ØÎÙéPŸÂb*)¼��T»¨Ì¿’ìt8–Ú¡<ˆé¸NÐ#D"‘„hx•*Gâ©b!,³bšÞAKÕÓ¿¡ä=§°òdý©ý!ÄïöUývŸðªŒÀï§ñò#&Lá¹‘êƒ˜xõöuîÓ0%OÜYé®Ä.YÁÔW/nmò/ÈkÄä½Ä|Í©š`zRPDÚAmÞ!"0/¦óI†¾	&C!@íŸó=8QtY&ah#Ã†H{üéõ€S0B1½µ¤ˆ†i´èQÃ¯};­|‚4†„Ïìr{¨Ü»mn¿s~ìåÐûXx:°Vf¨Gó`~ö¹òœ’VÉ$Öõªþ�²bÜÄ4JIö¶ÅÃâª!0$D–’2´Ï–4¤mœr²æ®Þ–®ñe?yîþ‘.GzJHf°ª¦ŽÄ"ÎøÎ³œ=¼¶••ÿ~/‹ÓãD~Ä»ù?_{Tž4šòŽ…¶¼’xª•;Ð5ÎÞëçgÊoh�Žùï¥Æ=t	œ­ c@–0E/jFDì.Ð4b˜�„t£*ßÇ×™Ö¾GÍÜ´Ï\Õe®,<ˆåüÔ÷¦á4·ŠiÜ'žgÅãw»¡G!à¤gƒîô§[™ÉQìa:_žÝã¢qUBfNv{obšï3œ¹£[#¯·cZFO4U(Zjy‹Ëôï=š$Å$“WÃ—ìHqã°ºHõÿðé†ÁRŠMî#,(BfÝ—8í¾€kîÁ€Ð3Œ½¿Óô~Zbm©öÊ‹õØ1 ’/ÔDÀI#&|R${ÿ}@?Ô+ï‘$D„$H(wï/WAÚ©ôpç‚¤{kÀüÕê=I�ÌÍôSŠ¦îÓ‹ô v�íÇÚ|º\@>£Ôoa¨[ˆyDÈë¾e¸"èzÎ¾bãš<>\³yü¦¡cèœŒw‡x¼ÜE#&ñ²¶Òi�Va+lmkM±&C“&ŒYôMDW‘@¢Ã¤AÊù"ƒ§�@‡xwP¨ª“lÿ#-úõJìéÐâr„Ï»š"Þ”z7Á^”{lšúús·+ZQös;§CžUŸÌYÊ±PÆâ|mŽåE1‡¢°0*$Ô=�†÷)ãP¶Æ{78ê$Ôu�_µÆn4xƒ�l<¥¡#&c¬$tºÅ­~°þÿ¡™RÊ©ágë,ÃÞˆŠÉ.?¶[µÒ�‘Ð~¶ù@ˆ4ƒU":1@,¡¨ò„i¼øP˜ ŽÈ'ˆÄçüó#,¶Å‚éÄ#É%øG²#-*f~ªgi-A›ou?¨¯FU��M4?ðt¾Fd)Ø„a#,KÍ`U†Ñ<"”Ü/·’~ÛÅÛ\&vš¤/¶#&ýåÄHéxø]ÿ+ú»«‡¼%&Þû£¼å%i‹-#-‚WD¿øu^.ÉoIÚü.Ø�)ÚÚŠ¬ìð. mídƒ(/bÁàZ\uX1‘xÂŸV½×)3õ[ú>{«rŽz#ný¬?NC‘ð‰ýyù_Ñî/EBFÁþç#-¬U1¸Î’HêD¿6]bSÊðÓ¼o+œ%Ë�4!0téÁ#&½g›G‚C>Wéõ©,8ƒøáŸ5¿ìÄx(I ìèh·ÙQEùíòîYò]2cïj´ï]Ú&Åˆ@“:å—†Ï…"ŠGJT¥ÞÔš¶D4�³¶¶¡#Ùûrè’wœxnËõ¼bTdàŠ�r$¾ƒêßú¦�›°Û\ÓÉÌr¹WtýUvªMÄ[l¶k4Õ,Ö%¥+U‘@‹;wí²÷�j’D7¡Ñs‘“O[›}þ'ä‘º(Š´CÙR­#&X±Wò?kç½z“øÿ‡™#&›FeRDhÌš(&›D¢j"““%ˆÓJ‘’‰¡HI³dÑPTEŒT‡è“—Ýž0~C&Ìž’n‚>ÄÍö&Û»›}.¼�Î)I&Í»fPncl5;‡I°â!Lj#8±¬]^uÐŠ€b�É�˜_níÕÇÜ~Òz,˜e�Š•6`¥·mŸ@™@¨…{jE#R«5sQƒ.=kcõ÷bøäêšÆ%‘µÒD�Y!‹áÃ»mfcz\/Ç#,€¶ºi5U9|ÝQIé¹> 7a20<6\›ÓWmé;*—i5õ¡2ÌÄ7šƒ/uìkv©ÏðöT3tg-Ç#�Dz¿ê)¿8r•IP8�$°ÏVÒÅ@ò/æ„™à±žs¸ügR¤Ó}Z#&Œ'ö@Ñk-‰TÆJR¶ÓN4£€#(dT–£BºÆ™$@zë5Ëª6Ü³ºä¥r¶íwK›«­tŽö¼ï!µ™­¸�{xƒYåÄC#-Û1�&Ú1�<¤Œ`¡|PÄÁJß•] aIª£n‰Õ*É#&#WöÌi$ØÚB¬jMi•x«�W.—,î”bJ#:qŸ0ûu±W;^ŒÊƒ!Yˆ·l²�\¤ÑtŠ³#ªÀÂå	.ÖÝÄãl‘¹õj'F\Æ\1HM3MÃ¦üßÐ^çyƒÈF\M£�.šÀÞ	„¸P’£‘òœžˆÕI!×\ÑJâŒ&‰#-¦­\U�¹êØüE±MƒÍ•cðk‡#,”VÍÇP…0‹!i#&ÄIÞUÈYš ÊWœvD"xï6ÝË(ºíã[íŒ’"@#)ïÚ£`Ò3D“J„INŠi¡TBÑPL6›rÅXË-µ4Ú›q4ÌcÄAiM1±¬MÂH”5`VT6'¡¹,Pj¨�rªÓ¥%Ê;0�²ºÛX!†ØE\Z¬(•uH£r$*Â²»F4ãhm7Zl¥#,•-æª0ÕLx7…V#,*j†Á€j·—&Á¼ìæ=Ä©¥X¢î°r¢íM]ÜKKµ¨0jŒXðš{Ì[fY‘m]èÏ¦fhL•µvCg ¨Œ0ibá­)¤‡bë)JÁV«�Vƒ,�!Y$vS êÆ¨œ1öÌ1šzXIàöí/G^¤y]¦&*M„¢‚ÎUÖ“áÞ¸¸‡¢ôCMSLŽ–bÈ¡8ÖÔY=nÓ!lÞÉ"ó&µ%àÇ!JŽmÌKH'…p�¶A¥ZÀiz¨ÁHî£˜ @îÑ„f#,ôœ°%«IÆ¨ÀÐÈ&•è\ÑEv:#,D(A3cJjª#,AàÂùÑxc Ð†/ßóD#-.l§5‰¤wMVÓQ©Ô­lE,ˆÒí&qV�¤¦#-¹Ö¡‘“"L«"†[##,4ÍÂAT0�)„bi£,H+Bd€2Â�#-¦“‘ ÁcF÷uTù²éép¶*úHãÅˆmõ&œà�Á6*š&…H"&ÐÒËrÍâ”m½1Av‡ÖÑ�f l%7k¡b:Q›•7�!õCRÆiüi—´ÙLØXi±è¨Êh¤"¸÷2ŠÈôò··Hv0&AGÈ§¾F·"#,ND­õìaµzQ‰²]ô~´ÞâXP¯¶lDKJsóèÐv#{�ëˆª�‰#,cÎÍÚ¯.Ù±�VV(jË`�¦DM1ž�Rqbòéßq1lTI$´B6&™ÜÂš" ‘¤´ Q%Ô0B…#, ¢BÄ•FEIƒ#&i´–n@$RD2#&p´Ñù“TŠ	ûy‡oZJDªR˜¤«Z¥eUKGù®¼ºbÔdµÞºº[õuÄõr;§rV;å|-ôWÛÚJj-¶(‚b‘‹„AØ­T²ˆ~Ú)û‡ÃÕéMû¦†¢º�;‘Û^_«�úÀ2‚,P¨ˆ„‹áœÙ ;ð#-ê~ü±oºõQGáŠSÑ=tQ³ë’«2à›‡Ñ#mIª¤´V¦™¬Û]|mS½"…ËlÒö¹ ûêRTC‘×^–#�ïšéõ³Œ4¨,ÀÈT"ÉøN‘+ð`YÏ/5Q‚\¡¦a•–H%7^.é×“÷UzõÜX»»b1±­Ñ#,!-"`Û’#,Ðh@Ï‚�£CPl2˜Ú­@c™K�ƒÜ#A­T£f(Sðd‡ì²ÂP�AÃ±ÎÌÓÓ™¦A¬×aDGp{ê\õØüÂÞãâà|ÌÍ­.s"“#,‹u¿†ˆ½'~ëzøîU¹á	v	0|½xZÖ9&jZ¨[VG‚|P 2õGl¸ƒâÚÉ{ÔŽí1}#ÀO¥´èr}zøè•ëJÜ>µgÏøâ*H³q 'sò3Ú`¤äb\µÊ"g	;F7rt$¬øž<Õ1;ÏÇ³sß¡áÆö,/T1%Ê.UìÞ–�Ùiºp¦»Nu>]›;Pþ3äS g³²ïéGí;2ï<(ýßÖí`€eÝ¤’xlñvÞvXèã+‡Jœ}—æ‚Øçð–ü5âÛõéô�±wÀ‚îâ¯ßZc?SÚ ÄD%C†h÷ w*JŠ¡P€…x}iÚ&NzH|ÛÚn‘N¨`ç(œâw%¶¨÷ªÀÙ`Tìu±Sg�CÙ#&J‚¦ö.ú×a²²Ýc™Bñêú‹ã‰TìÎÛ$b„h°9qÐÍ…†–|m/c£Yüímæ½·ì¯³Á ØÃî‘k¯©•Ti}Îw�dZª²Ä"n!§Ïa™Hjæ¨¤0À—mE„ûecq­ÍN7P—s¾2ÉÐÈ‘�ùË^ãù½ÕéÝÊùõ®É.UtŠªJP‰ŸÓah)�!"$‚“)-Ø–åÝÕ·îË\6¼UÆŽnVéµ·MY#,cnm&Úæ²k—-µÍ�Þír,m“jQª+—‹;«¯æM¼zkÝ[�ÓA¸Ü×0|Ó“3~!‹LaÌtÓeðÌÄ¬ÃØ›½Áé2BöWyÆt#,Ô‘¡¾"ˆÑ0U¦ô¡î—‘.ÒFÿ#,ü*¹þ9¾ƒZO#-¨ó‹ÌøJ? W?ÁþB(Ð3M€|gõRJ~±Bè6½6&À$ÂÑøúåÜh‰µ»4µÜmºîãµÒm:îë]þÂ¼è´¸F1@ñA²CURDDQHE�I")D"É �«h·‘.Ü¨Rd%ÛÝæT]ñ"ª½"�‰Œ!"Hª°€,ˆ1ä}`¢#,GPë¡û`	ë#&MŸ¢!èë¤ì·QF-P¬Ò8d4�>4Ta¦Ÿ†.Ú²{¨ò@t#&ïÉ™~x‚Ï�bDðõ’²n‡C¦#-ùÔ�Ò‡¡íÔ3`ð:@�FDL¢Sæ¨P¡ûÆŒb¤’”(,bÒÉhÒllÐÚ’ŠÅ�”¤¤”É´hR¶Ñ¨«c[Q­©iZe©hÔÊ•‚RE�F0—ð1íµ²ªˆEm¬È²�#,Ç�"6W"Dü×2‚2#-ç¯+×—NtŽUÎ�ztxÀ‰— À(»¦Æ£Ê’B¦”I�<�Œt„˜“p¨¬M‰²62#-Ä¤‰�Ik	Pª	bˆ``JZˆQJÀ#DQ”4€Å¢Š" E®ÃB‹ä*#&-@¥Œ³íþìwö×‰SÆ—FÝ57wNìÆáÂOT#-KÁ ½S-("!b"IfjÐƒ-<€ëˆ9 à„ž¶sÕØM¼Õ‡�?	¯Ó>µ¥Ï-R¨¥{#&ú€©"@‡´/nÕ±²#74=ÍSô(y6ƒŒ�œ+©ÅÕ×éÖåËG–‰z‹Ë”`nA1�†ZäåÄ0#@ð�¿N`B�!ªpýž¾u—u˜ö1CHÀ„20Pb_[`@šÕ#„n=éÅ;šü;kíä…Îk¥¸w�3y+­å—R¥3(_¥wªÕËFÖÄ‚ÀTJ˜	RX„ò÷ÌÂÎðýÚÑ=8Qþe``©ŒU&•]î3)P¦Q÷#,6¬æ³„:â¶gÊëD4µà%§ïíþâ�Ï”Jœ»6T¥´ÇôãìŠéŒss=¢nž„Ê_Z´ô?=Z#IRò]B„¼)«4UJ`o“VOÊZwìí‰ä†¡o¿ás¿Ž	ìµ‘ÍÜv—ˆx~a S#ßiuÄøY9Ü©çU¹¶:!ñÁ+ßD[~n¸ŽÇìÙ|übžx_;€êƒÔ]x‹ŒIótÿ6–uzõ¢ð@`È:ÐK¤KŠaã¢•O<UçæíM‹†7EEG‚Û³=¢ª^)€uOê�)¥Àg>{øXÍ†˜¦ãÙjÌª–mê_GWÛq€ƒ	Ãyw;j�uÖ=3*£\q*4]pýÕtÀÌþ>88ÄØ-,¦bIN7.ÚžÚ{d	ÖÛ?1íöÍuvñ�Û4·Dáãš †d)âULµHöªÚúIv„æ¦zú=ËZá¸j“>U&à—L„?Yå†ßwgD¢a÷yóöÌ¤Í‰í«°HN"D�h}u¥¹81K²‰ôZŠ•#,ÌÒ:@$¹¶”Ýmr`WOù6›P8‹JXô|8Þ1T�…¶Ê‡PÉã`6•q3`´…�#-£lgõà"f�P0ÚÂ]…A¸Øw�íÑAy.N¾¥6»mf%®®&’0Æ.3KÇ) ÂÕœÊ5q®ÙIåH•#-ŠX…Jáî:*nè¬„µŽ§„•/yÀo#ß£½Þ%™&‡s©X½*77/²cMž±Ár�Ì{«¯N™Æî’I¨Ÿ�F¼­�ÂQÅtâ‹c]K=²üdèúÆ‡èhe3²ßÃŒðwYâ\Û[NDÊn+š•ÇË}´ðÛbÙ¬dÂH:&f#mø�«ŽðôÖúDäw~Ý‚S#<C4³tqåK¡ÛtÓˆOO	$’ÝÀ'Ìó;•U›�#¾øQaÐ"Ç#,è`—c¼rmLÅ1:-ØÛszh´±i´JigÞ!„Ehää¬¹tRtÎëáÄƒ¿8´ Éêð¢uáž-£1Y—¥˜fÕ>ùZñ�ÑJíÝmÒvm§ŽÏ;ÿ«é[§Ûëz8Üí	É%ä’yxÌÓFñÅ4šÓâ^’¾Ù¨ñÆ"D:]|\gR²ÖÖ“œQ{î‹½>TqdL”¨ÆíµO5¶ uwŒÛø'“RéZ:>ì¶–ÊüùŸœúf+¯ŽÒµê)¢º^`Úqqž$®Ýa·wÛ)�s¯ÒpPëNw—‘ÝÄý=‰ïÓÒ1„ª:õy^6®aÖ¥AÍ‚ZæÓ(Ê–VxÂ˜«­¶®œ§|Å‰t·Doª½žœ.ï>3ÛJto®¯*¨ºÞžöÆz!òüq³Ñ¹�¹,3\^�ïÁÍL&Æïrï¯îf!y£Åy “/f˜õ¬í_ƒÊW>Ùòäìè�±ÊÊÙ^“ñ‹ôõÇ¯¡£ÇÀ7ïL"YÆaâ/ƒ=_9¹G–0„l–1·ZqFXÎ&F4é’¥ÞbÏ¤Ìï¹®¶â#,Q…ë9O":ŽaŒ›e1Ð¦õSs³Ê�ØHîÕMŽ\¡D¡¥½eñZèc~$Ì•u%ÀË½S$éçí£fóqóÊ£`|q‰=Å±LÁ|ñØ³�Ø¡¬PYË*RàíFánáÇ—hDe«¯$¼!ˆ#,QÙ¦Ê†Æ3ƒg#„RcÄnñÝx’b3x0óš˜ñ^xc7ñ§cÁ±t5Õwï]D�Ò…Tnh”×Ÿx†i£ÞsÛí¥ÚKÀ%ä1ŒÃ#&§L¤ÍŒ)FþïvÀÌ0>á[dìÁ�ãƒ·:x:J~ª“Ãœ§[tÏiÅzáÔ6-rìÓˆRK‚e·­tªwÞ#,Ãqö…p’$‘�0ˆ#ßŒCùªõ#&€@>|#-@@Fn6aPŒRÔŽ\øÆŠG3 ·N5Û»·,³ÒÅ#»C¡BÔ³t€Ò¬HçÀÆFî2§V‰]†Å4:`Ã5€¡ \ó—¹ž¸á¿DÊÊ„­¥ÐK™—UomÌ9¼¡²r…�U¯¢2	²H )!(@PR uë¢k/.òqÙhÊÂ Æ›v«·<ÎîBÃ±¯­�Y{§�úT#-dáï0™È0¯•*g•œûs‚íÈòÛ.“°q®tÚçQ´ºX~PíÞ}'‹y3´s=QSóÌÇEKJOcË‚~±ÍE¢ªm(Š©©§#~1X©ûmÎ&Ë‡b²Ùm= ÷.Èà‡µ®½+j7Žääã£e~ÏB`§8èúÒ^ÓÑí7*útÚBT<Ö3ÐÂE—ö9£[F÷È7Ï�Ñp²9–žfª7 ­Zæ0ÙºÞÝCë¡ãÉMkE§m¢HÕ1Ï~e-�lZ~ï´ªÅ«ê£‡±C3ÎüK�zlÑºÒ¬Ö¢Zds|>òæ-Ìq:f‰ã‹Ø¼¶R±¯£µ“4D>"ˆìtËFvŒ�›•Ù¸°ëëÓÏwÃŒ¡e+y³'�†j1!ÀTF"ü#&œIÄ‹ç„‘9Tû›èœ¯[–ãÐÇ4v4n s©¿xöÑÏ+èÝ2¿…¹ã.nïÅö�TÃtè×ã.–ñœ¾m°\¨îfübfM’ßº�Þª|œ17—yöñÁ7”â=�Çw‰å›îº�î9ßA‘ÑÝÎÒ¶­P®5=ÆTa£çõŸ4)bR»wLÕ#&#æF°Ê‚ž12‚¨†–ï˜³ay£ê9ä¦«�Ñd�n/)Â 6wƒ8NarD@b¡¡5‚»`^få™#,õÊÁ¡ÑçÀÐôQ¸úY«	Óp8jsåA�aá˜…+^vÏõDÚž›ôM¨sÌ,!Ü½ätâ\°0†w,ÚåÏ‘w�¸(aK›2âáîvÙ˜5Ò…ÍpÜnP¿jX,¸Œg	¢(Ô¹\†=;–Ê¤j®¡PÁ¯E´öq3¤:f,÷Ò­&Á¹äÜ5SEà…”à™5À ØÄ,¸w�S:B+¬”ñ˜²NUÈÁÐè¯Nðì:MWbÂÀ9Î—#&×"PxzIÚ_|ñ›MÕÁ�$™#&D±ÔÔ#-yü¯æ)×ØnôVfFE.)ó-ÄBÖ]»ƒpÂ…"Ù÷q-È	oa�ÁÃ�qÈ‚Bx!¤ò~À g6{zYm»?‚'qŒbÍû}õé&Ä1ðêCÇÜé<ËÉÛ_î†Bš¥Z.¾åd×¿Â±¾÷�#-9qö	Çµ9¢zbp&ÁßÎ\Û£î+JY#-šý—#-ÆÆ«ófüÅ/)!F‘%˜|.ó[E„[&‡¡·­'M¶Å¡Æ"Q²Ø”¤cT! Û4L�*y�Q¦À#²ŒrbCed •P$ˆ)�!"±j\ÄFÑVˆDIÀFÐ£BÁ#-1	„f°‡ze"ÈŠv°XÚk¨±Q”4¢¢(˜TQ”©A Œ>„#ãé¾³ÝœßÚuç¹_}¢¥#-ÑÀýþaž^…V¸0¸ù}}´$fúwÂ!}\p¯Mãor.M�iU­~E´jÚ-Z)#&�#&0Ê@(Ê]¾«T˜ÓåFÙ�Ûû<ZZ×côC5ùî±ã–ËS ¥¼ê*Æ1�ƒK+udˆ×O­¨ÒÁí¸i¶;k›Ã7Z1Ò¨tlÅ¢Ev`Êâdã4ª|{°#gmiÆŒIVb9=5Ž®0 R–kÓ1äÐK	#-AŠº¤9bePDiôãOR;Ì»¦ñ¬Â$KÈ‘`B­&n­1ƒn9²Q5M¦ÒÆ¤ŠXKºŠÆÄÓLh†	\´T{”þóÌg`Ôã�›‘§…*Žv4Þ¸í5+‘Z3x#�¢Ù7T@ÚX\BÔxbM˜íÜ¸1LÔ­Æ&àc±�ºö2öÔ¦™Z;ó­¬³{‘šš(ÓD$5k›ZÖ©�nË�$ïa­Xõ;bë5l­ñ“m¤&4ID×Æ5ª…€‹4Í«8\£¬¸bm¨5fÈ¶Ã$ÎÒ×îß5©×Y<7hÓaYÎ“¼•�ú"G7Y5¤÷òžÞWjn—MÖNr`Ñ�v<UÖ1jçŠ!j 40ƒìãn²‡j‘/Aµ•Nµs+}¡¥dÉJÖ]ëcÆ7	—R‰ŒÞ›°Ý ±Ç·Þ+\ÚR$ì‰ØFéÆŽvÔqëÃçT™ÆF<é±ÞŒ"rrãÞ»iëI±©È‚ô£�5.¨CZF“LáØd¬q¨Ô"Ú7*ª#-”*Ã Ñ¸”Ðá¤0m0m15+‹–�¼Ü[y2Yevöëa›[	¹túÐC 2´CdT¨£]Þ&0:ÜEZÙ*é#,h�Fe¡›±—mÝF?sæj�1šh;š‚ÓŸíž†ÛïÝ“ŠöèžÕ…�¦ˆêj§îÈÛlh®HòKÅFù+½�"`M,eE7¬¦ÐœŒi�¤WµßlPË`‘¶œrHåéÂ¥…(V›UÖ‘‚ÇZ1ŒÐµ¢t3LèÅ=ú&gVÕ3rã<ÀÊ5Š±íå;yÅFó£y¤:Vwºm¶Ýb æˆ[§Å?«z(ö‚µjó1öe”}‚‹”{‘hÂG[²˜(ºóM=X�Á¬:1Ì¦‡� üœÑ AN=6ñalÊSœ…Ù 4ÃV3<¦ÚZ.îÂµpe�Œv4ÏGp‘�ëâ–lì=ÓP®¦DÇ·†MP1#BÌðCV#-æebkw�:"Û­hDF²T13ZœÒ†¹…clŒó° xr#,)r)b°oÆ³šaôb FØ$ÄäYr!¥vªŠe§w˜ª÷g•ULí™Ó½ËÓî˜úåSDX0�ÈL$9àAìd’[|xVè¾xùgý!ü»u¥2dÛ,›§åÚ¿NÊMq9¥-%@©	"µÓë6B‡€¡ÝÂyZ¢�ýFRð*vª�Õc65«p#,!Š”Æ[v!Ä ÂEUD#-ÈÿR•}ì)êi¯Éú\n¬¬YtéŒÃ†&E_¬ò#-ÏÔ�ð(�¿êôké@ÅPYÊ³Š’�R`CcíîòíÐž kåÁ(ÀæMþ¾5XáÙ;°¤§	­öœšÁ�›Kˆ?–Cõyßð¨×\U�¢ƒeª•Áå˜ó>®f÷=ûp1¼$ch{ºNîäÂ"ý[ºÉÉÝ»3ª™ožøÂKÞU×½çÌz—Ó(õ�Ìî`�®ðG’B¶×kó„Hãƒ�‘Hý÷üÇ_dl;¨Ô�ƒ×ÆyÐ-GÀ!½è:Õí«îjW¡¹�mÙ¶’’®Õ2–­/.¹«ÚºoÕ¼¸(Š¤WèC\¿ùhk4óèD|¿g#}úWÝéXÇoÀV#-E)#&`#-Á‰	°£HÉŒbc@´J’…ªeX¦–Å²ZKjÅ%bJÉ£BŠl¨Ú1ÚÓR4¤Ù%4¤„•¡�6ˆÔJD´d…3EJlŠU4ai&a†Ì"R„“µ‚#-¡þw–§#,<‹ú¦jÕ™î:F¨d)î‹F],þ¹ÞÎ›ÏÂh.µè¹ ?#&¯Öós6~O2HHÎ>�D8©ÙÇÆÚìÄ®fïeÊIß.­ –ŒO"¨>Ì€#,¶ƒ¨4Ð^HgqT4“C1¶ÅîÂb[pÝÌ”‚�Ù0eô}0~W¦»7?r]ø¢ƒ! ,dˆðåÌÆdMåv�[»Ã£r¦Q„„³ÓÈ7^*¦$ã…ß¼úü}ÚÂúïâs�þŒCLª”�q	Û£/ßQ£~š5b–»ÂÔê�SGó+òZ·ßmFª$¶É´DVÄj’Ö4}…«\ÚljP¤ÔhÅlF}»µs*Ë,PªU#íK	a]ùï¼EDƒÊ!GåíÈ¶fÁe0}õ‚Ý=¥Á°gÒ¸”*#°¢Ô4ÌFŸ–]¬h‡Úâìñ¨v¨£ƒ%bš’9IˆŠ-´ÀÕTR ¡wNP+4l�-¡!Z´ƒcÄæZ’Æ‚±bLAuô1WŽ›Ýywn„�œ×·�^fŒe5Ù·´¯)7‹š%fVå¹çãèé™¨(à]†0€Vâðï!”`ŠÐ¡GLŒŠÄˆÄ½—cçÞ×�ò Ôi>n&}ˆNLêbàlËH• N˜�¢ÄÁÁ–¬‚ÉL%EAÅI#-QçR™Â�ìÀl@ÍÛ6#­z¼mæäb•H�dX|Hh[Ð!Æ"s˜HBbñ��õ„87V@ŒÜÔ‘µ¶‹ ØÛ[µ¤A"Àpä#-K†Hä[Í’D’I#�UŒTCÛÃ¦ù09€&š&A”®:7´ô¬$#&#-õ÷6SÔýøß�Žâ€û~ø3ááÌzàgüiQ=2†Ìë½Y�¿ß‹û_Í‘2u…„®ª¶o£Ð�XÜcàŽ”H#,U›îX.1ÐÒ$SÈ©©*L$až5$»¨íî#,uø"}@ÁéÓ‰[‘“˜KÚ‹CÇåËÃô¼%W¥ÊbUÛÃ.³òðñÆUo¿[52UQJ–m¯ZÔÆÊJ#-}Ëñ*G[õ�&¦�¥„uÒsjÛD½‚Ø<FeŒ	šßÞdˆúÑøÅ’ÚCàK%…Œdz²¸¹s­èÓcgA´6†Í´!©DnÅá-Ï¢ì¯$yÚsµ´"û=g¶Á¬N¿0õr]ªm¯±9§;\”ké>	EtÉ£Êz#-,„ˆ2{þ“†œú�­öù®Ç¯å&õÚÕM&C>²·z”¹ˆDñJd�‚U#-œ�S^¤ÿ�3bžf#,‡Ö ÷<;Ý¡oû$ ”š3ÐžÎ°S–1àQ©¯#-±çˆÐpÂl"Ðµû¾“ÝØ:Õ&£“ÃÍ�¶#&Q-á„‡¼ëŠ@dˆ²Hˆˆ*¦#,>èô/}RŽâb_cõÖì[ âGÌùX|p”Âß«ñþWµÄ�ÓœÎ4“Á.�±Ó\?‹î�šëÁßª–B«¦‹d†mn®3’t€‡btk?4�¦ ÂjVwú�`\Êw²snÚ#& §.¶Å »Ú“‹ÞPH%óŠºK�<ì¥+Ö"VG¡NhŠ\þwÁÎc¯š�R3¦BÁ¹‘mÝ½šÉb2Fˆ[�œ¥BHÙ#-ßyp®îÒ-®áaŸl"R�ØC¨Š«¢&é‰Ê¼ñ©ž‚£f†F˜Â^¡#- (F@n™‘0pP#,@ŸÌnªÁ`È%þ¨�Q¡š‡Ì»2É–vÜ‹wª.ÍH`T54³ŠF¥"DÝ#,ä‘²�Ú²ñ`Li IeœsÀFîÃPŒÙyš@ÂËÒp8€e�¨ÏêFfÇ¥›�m…#,bæZ¤Rª�2¨VÅ³†þÇ³®D²u¾˜ai†É»Zô²ÎIÉ!ºM‚kÊˆŠ"¡µJ‘ƒcÐý¦f™3T#€†û±ÍZEyHûsÎÖÎ¶3¡%D—2ayiQé�¬Ô#-F*^)š#-@�`�^îãP‘#%…ß#,¸éÛ“ÇPºïRŽŒ4ÀMŽ[ÓPíf©ÐÈ!	ˆ,‹Ô2�ox¯.õëÆûsÊä�õƒ$_'YúfáÚL#-FïpaÈL‹äÞjuÌÄ´‘Q2�9&e�±³ý¢r¶Ûˆ–ÎªfWLnL¦gNƒà,8$¼µ·aIŽIóð#,ù%ƒ�ºNµtJ(7f¶)ädÓÁâú'�£Ï§cH8¹È4A©#-H2#&ë¸ïšµ‹#&Ñ�¤½	X#-ÉŠHÂ	žÊÄ�™Ž-¹š5@·Iå¥lgÆëÔ¬Ç�üu^nÝ­Šœfóõ¼ÑíÊÊøi™BL¹Çg{ÓyÌ«‰4�yEŒ�÷ÌGYÙ¬<«²#-Þ@�a>—�FÇMl}yï8‰pÁ›ñÇLÚw¶cH�o!Ù G©µ�aÇŽ¾d�™ƒ6³³B¯iè1@'JkMžn§Æ£6™‰ØJL�í¶ÛK1r=I tW:Š1–”•¾cvLª4f\±ÖzmÃdÉ½>ñ¡9²ä˜ŽY˜v8”×´†“J{åÆƒ +UÓb6A:NÍe;m±µÓK¹L#Î`%¢�l¦‰Ä–;&v—.]=êË­Ÿ¶Ú`Û˜¶o1‘šg!­äkýnØ]¦6·í'65*·Nà„æãÂ®;D‹uƒŽÑ[[›âiŠ¡÷xèdÅ4Z›;»ÈûG3*ÈÌœ˜gRÙ£žªq5ƒí;u‚¬ãßÑqæUïMbšæ]8š\îÄá®›Á>¸€å^.dÜM"zN�Ú•®:N¤0-0†¬¼!eÊåqë­k¾ön,Bãí9©HfJ*8±ÀÓ‘ïÍTC‘oÈµµæ#-Í�ø§•»;]³½À÷½uÎQÈ«¡É®“H@±XŠj7f$m“6CŠÈÐÛ™ç�ÓZ¼º`iRâæu³ƒŽ`�ÖÌŠúÐoPÝ8˜Ëƒ†ý éà¦¼Úb$#gäøÊŽïÊÃ‹E¤xC`áB!"qIµH.ZKU‚cf(i®»@;MX#-ÄRP…F#&�'xX§�5¡‹Su…p/M`ƒòct´‘tWI„œùß#-;Î³Yä¶m›Zv5O(i£:Ð˜×Û#&ßQ3d	 ;ž‚ãŒ±§4ülÔ?nŠMÖÏB€fŠ$ÕY'¿BÐòv7´Ú.mùÒî¿8Ã™¨—KFÖpÖçAu3i"OÊÿ_ºQm—2àé²)r×–&šOËÏ'+o+ ’ÉBL6kãS»ºŽ€4ëàëW×zÀ†fº‚ÊÏ³WM¨}1)ïÙDË³çQ³ÊÙe<#Z�¨›úqä™8^ï�³=¦·Þm]æû‹e…Õ’“Z‚°bSü·ÖûæÖ¸òÔ0+ÅÉ±úsWííº4š‰‚ŒDÚ] «°ÑNÐ¡0'¹ëßÄ¶¾ôÑlïêÎñôö¾u®Š•!“y‹ß¹Ú´a"qBJéJ¡iÛŽ$4Ë;d­Vòž*€˜i�¦‘F¢a�÷âðc°š-9‚‡hvX˜›jš,²àOLC[|*d#-¹‚]Î«dgìF¥DL!ÓÁS»&À, zx)òfGNNZº"¹zBÃ·.­C@@™ûGn�¯($Îõ,T³°ã÷uÜÎ4›¤ýÐ˜pë{vM4ßœ–ÝŒf`&…5iÊíS"Â[eÚ³#,|´~H[hßÎÉ�Œ2	#,›"GªÁzÑ›QH‘Bk	sC­Ð.Pngt‘‰‰™údŽd‘A¶¢„HúfHà‹Â‚Œ4�EqT¡ªk&§xýÛ3Åå�Å­³¦q#]q; Ñ²_=Áˆ#,œi6¹‡Y‚6#,ÃaKb ÐA‚A#,Í	w5aZ¦„×¼Ì!pÈJ%‚#&Ä#,»ÆMd4œ#,–h¤Eu]1¦Ì,¹4m´¢¼†¬lÌËQ(ÁÀ¥…Ssa ˆ\0H	J”!JÁÏmLªã¢á	x£(Ð² ØŠ)áÏ;èfÅÂ6#- §sf`#I¦öDL;%#,øò«#$#V‘UÓm�@4¡A`—.;#&³#a„ÜÑU¢V B�,5p‘l¯hˆ˜ŽÆr�¡˜4Eçœ:ë�üÈ´ê`ˆ�G!›¡,J*¹Ä$*.©™P°¸Âq™¡0È`3´ÑQH¤Xˆ"O¸ž^}'ØcÚÚÇ(ÕP2Š*",5é£Ãœ!¼9l|<ì%†¡Ÿ»´@¡ª"Â$$Ø*¡PE„]ß#&ÜÕs#&HË¡^ÜT. j!µ™A^¨ðÈýž#,cUÃí5¼–…jÑõ1Áq±•n ·s,½†òñ¨âÙàm&-£™×B¸kNÌ?	 ndfh&ü[:Xd�ÇµQK—`ðfÄ¶wþ4U?gÓñ@ß�æH�ƒ'ò$9±M\MB¾•	"€UéJv�fIMìÐN¬:ØÃ�]¬ÑóÛ½4ÉÀx4ªá*$îJŒÈï.T‰Ã•ÀÊ#-DÈÒ*µAøÙdšcºìÉO)ZE÷ÈšdÉç£ÅÛ“ÕZhõìîxgîsJêF9ÌTÍ@Z¿PTV(/!Se÷êªÖè+ÐämÎüÃnhûÞ÷=ÖqºÎ6b(².nô¼‘¾ú¼¡â“ìì¯òGÖ(‰OuqâüO©N£ž\$L«3¥õÛô>#&lüÑu�ß“—Cã¦KÌ )ðZU|Q¾N�Ý¶>âò¼ë4�º$‰Á�@˜vùEåâÔRònà;T­^¥®6õkµêðåÝ­æ’$ÅXÐ9dª‘#,´˜ØJL±&:A„q²–HRŽá€�ª¦�Pn$jÍ!‚Ðá¤	F‡áI™#&@÷Ã>±gvCt§¦”kœÞ3¯†Z°ÅsWˆÑ«—m#-ÎBì’O‰´žœ$ˆàhá==�³¹÷wù„>0Ç‰á®ÍâÒZBw¤!Ûà@¹¡êÄKÔüƒ7E%3z1IõÝ­´bxF 1:HñÜÃY™Ð«CEbWd‰ˆd¦áô°2ÜTÍ¡Éh¢N®"Po(OW@›æràÈ)½ŽÔx2ÓÁîŽòIãc$ÊQÆH3mIº,¤ŸF’/êùMï!®‚'>¿‰4J¨XyŠÖ,äX‚[²Ã#-œ—œš›o–céÎÍ£˜û2”Ê­‘K1#-…æ#âá¾ÔÔü™S2mÊ2nå†áâˆ‚œa:R"Ÿ`ÓÔ‚˜êÛ»šîI{p®hm9Rèá¦±ô\mð�`Ág(™çðçÑ5›†›#&×W�å“i²±db±'µ(ö™»/øøQƒWÐ>P¦$÷Å;Qa­~u¶íj)(µ›ZÒ�•©¾ÇRm“[dÚ�µ½ˆ‹-Ø‹.4#-!r#iQö1`  Ù"-Â†#- ,‰°ê€Ðžü½9QHR¤.™·€{€DÐÛã•nï5`q‰ÓK›Ý±YƒaD	B[ßËÇâù‡SíSUV,oÇ3@ý¢Á‚€H#&"¤Š�³»å–ýÿ1SË•5ó¾‘ÆÝ½A¸]%2ë°ÔnŒÜžlTu<°ëÇòINTÝµŽ�š!(¡Â�p0dY c"f0«M…d¹Uh¢H£¨‘26âi‰È1(ãŠ°#l†KA(Á˜�“³M×jÅæZå©æí­¶'%:ÎÝC,Ìë �5*;1’™ õ,-"m¹‘f™¥­?2‚wr�Öô=\ž¤² ‹š³éáûÏ¶£¨hÌä›“Jáµ,‚0ïJ2öP‡û§J•[›ŒÅbŽž¡ëäÐÇA·qžer@1@!wN[r#,ä/MH]ó(üZ–|Uo¡�kˆÑu!"€£­B˜JŠ12É#-§–ÀÈG…ªCvª­Né°Äp#&âÐ�•J!E$ù~=4|É1ãkh Wä§Å˜~W¨b¼HtK^2­æBŒÚihQ¥&•#-‹C8Ùj£Q+ÄW]è€XâPÄ@) /#-›Æ²'í¸1ˆH£MZí´BðŽ±i•Yóöí„ˆ"l>Ø(�P€A¦š µ c=ð†Í„½ý„.I~#,�«?b}§¨ïWá½#²zÅËËÕè4Ökh¦m&¤––Zc’R‚ªØµ˜›BlH¢¦´ÅV“oÜh­\Œ¨”IDbÅ(w¼#,ÓÍ=qÅŠ®y�³¿b6#-!Äðêœ<æ®c¢Þ}(hnõöu¨®~�bv¹îç‡#&›`’,€¹³ê#dõà_]AÛ´oä€žåNá=çÂê‰‘æKÅŸF{:¡$‡Q×ëòãÎ-ï·o�Ïl>Ç{ÃGÂc.x"[RÒõÄß>úm¢½u9#,6R–Új‡F0ìî$‘Hƒqç|5#&ÃStÒtÜPd�jÊW.ä±>´DÙA«�…\äAèÒé¬a¶!ò;¼í±`Ë*à�£i®yËã`z[·lMÐu€l´‚“BJBàÔ¶ÎDQˆkÊz%p"µbVúÞõ¶Rá�¶§fˆÜ€¤#&lUª4«‚%*Aèƒ}£‚§ëØðwú¢§ÅPõÀŒˆ@a'xZÔàÃj´e2²,ƒ›±Q­ÿ‰ZÐÁbÌZ­aÃi~‚Àgïf¶LeŒ‹ìeaN�×—#-¤±	Àv÷zÞ°l–|#-æ³Ã©#-P]ÿR‚]PGö¨,‰B#ÞCÇ™„ëù:º±|—L¯#-‰Ð6‰ä$`D`C¨bæ( ÅSsÕ—KÇDøúJ#-óæpõÀ¼IÅ@í†E¦ç°	FqY¢™D¯³£Ùä#,ü2†"€Òˆä2�t#-ž!o~ñÂ•ááBÒTA-�R$ÊEÂ@<×6B%B„°‚ZÊd·½ÃóŸyFï£áõøqžê¬Î”}k.+ùý™#&½â{€';wßþr.OY*4OÏµS€ªr3€0.=ô–l×Äÿ=#,næ9¯¨-÷”T<�¸ÐÕÚ@ÌvE�w‚÷P\¹xynBÎ  ±UXÌfG‹¨ØˆÑ¤Ëºº	#,‘¦WÏ¼Ãô÷mr®ns×›Ï=wÎ&QM�ÔQED¼›¹®�^E“chÛx¹®[ˆcÝÛÅ¼ò»JÒTlÂ/ê„"Td!Úª~ÔŠm	‘§.?ŸÜzû((ªü#-ü>–{L˜¸üƒÔZÍS	è4ú¯¤õ(;C¯¬$#&!$F*ÆAŠ1R]GÈÞ=ˆ!—Y Ä´ØÈTT¤lmHÒÊJ¦Í«êü‘¨ßcUû›æi!Šš�¢¨ÚSLÆÛ_~ÔíRö·�~ÜÛÓRjÑ?¶–¶žÁŽEÑ…Ôò"6Ý-oŸ"[ëÏÊ¢¯„¯Znë›"›ÂÖjÅ6db±•Š™E²Á‰ëÎñ¶ÒkT(@Š'e(Š^#-4{rDMçóþ	«ÕÞO{éùfaÙ‘$ñWÄ ›6£'¼}'ŸËmL}y•5¹#-ý›n³ƒèdÅ¼;D|	î#,pP3œÐ\ó˜ÈIÄõ*z3{¨ªò·å{Ø,E Œ„ƒÁ¦|Çû·B	âfçšL	�ä*`,F)`7Ô‡HqîáóÀR@Âö­Sb„Ó�#,"aêOzµBAz…*)Nci«AD‰A%SRkTÛRiIª[NÓ–ê÷ÔÙ#"€ÜÕ¶Í¤À ƒý™HjD¡X¥Âò¥>*È°öÚÌ²÷je×í8÷Uíg·Ã;ŠAðÕž7F¯ÄÁœ·-f`&âcÄ´L�üÔ-ž©hëm!ÏÊ„âGKõ1¡æÁ6›DV€ç�«Ú [é�y,`ÿÕrÞÐéÒ^¼#cÕIsb>d˜2‡Üš…ÂÇÁ~„=_Æ¯ùÀƒÍ]R|nÉ¢Ø¥4Ä©6F¢–Æ*LˆÚ¤ÛaKFýfÛêjñ6+EI¦QU‘D“¿¸õèöYÙ,ÒB6ÀP¨LŒ!êSB®�ñ› ,a¡R4Š12aG¦Šhšwl#&%!Ãb©òŸdsà»¶ËÁßwUH(ÿp‘ Åµ¶ƒjPÕ¬ØE„P ,`�ˆO°”yœ1Ó×©¿Í�ÛÛJ¬²R@þS_v?c>¨P�h‡ûU¦#ëŒ1KŠL5VÊå˜F¸SPÝ×Êƒ_ “ìðI‘VÚ#-ÒŽÙü/D²ÙÛ3"‹*bc<êÖ†ÓÃý:0;Mkè¥»EwUÓxë|–ë4šš)RÞ³a]´îË]Ý•ã^o+]Sh²kzUÉQo7u™»3*ºæí¨«�¨$¶E›W—v4Ñ6»º»ºÚM•$#,1±ƒI´+ *†‹+	TáJ°�ÁÀ¤Dj1Q±ª4!¦Ø^›×—j”ÒÙMI–UéZêÞuuç�j¼lm(ÊfÛ-”µçw-ÚîÝXÊÙt×H�©NK7LŽÞ ª-P¦¾´ØCH`&ÍOà5ãUY¡t¤X²nq|(È["£A2Adc€U �)ñÉPÆÖEé2–Ñš)CóI”`ÛaUí£ß9Í$—F	Qâ¶J�ì°hm: Yé¦%ÈîEÛûÜ¿Šâ…ÃìEÄE{†yü·‡Ù˜z1èXÏo»†Ó7°ÎtÁ�J”Û:£XØîÞ[‰q!në|ôô>ßØZdbLz‘45U*qv¾“³;Å¼#-k4ÓLQŒ-õñ30õÈS°ÃïÛÊ ÉQÅrŠFq/ƒ}z“ÅË_¶öI0t†L;¨`MI4qïÌÆÕdEÝ÷,?³)%ý¤tf†»¯ÞFµ}Ÿ9+.ë¥Ié­ìcòE±ƒ�(\�AçB†RÕ!®*F<¿Hrg´š¼={h_sH>CZ­"5¡f•ï*v>&¡œ(€|ìkÐæRk~£eèdI\0IÓ_Ã¿¥¤»4Ø%Ÿ³Dä·Š§ó–fŽÇƒ—Gí>iDâÌ	ç7(6ÈÖ˜µc©$ÁVÄ/Yí!Ä4¶´^á±4=ÉÚ&ä@ÑÕ„A.|#��BðMÙ,Ï§¾q¯Hr,_#-ºBà"‘1A&Sh É`Â…(DTr¹–ÿ¨á>@?Â1‡â�qŠâ´�½ƒƒbNØ»§V	eÎ5A1ü~.`µ¤><�îË/)‰ca°Ó¡«©—ƒƒÌé67@¿ß@”KÆ¡ÄéüËœ#‰1ï¨¾Üï{´È6R1Ã'ðd¹j"*í¨²v+åV¶ómA´âƒKûÐmc°‹È4•ÒˆŽ/R6ãt[F¡Wo<ÅG~êŒn#,lpâ#,0�(ßs¹Ÿ‰|ºv\àvD#DF)äì§X…·eˆ¡�Þ–E%2‹D×# �Hî{Ør×c3�ƒ8?Ç26A€(6>ó&ýÜVÚŸ‰ê!G‘Œx$å`�‘ï5/¸^‡YÈzÈ†AÁð…œÎóÏá¡‘ƒ™YÖu{p+qî†äge¿'¿ï÷ÛO0ÓfÈŸuÀÉTI÷b!hAAübgñÈ &™P[×Jˆå4†ñ#-B=3'Ì�…¶Þ}ðÁH	V•s¼ï‡�_¨mß·cÈøÖµ3’Ffl2f`Wýp#&úèÿñÿü=Ÿîÿ‡ÓùÛÿjÿîÿgõÿkýÿëâÿüú¿þïùßûüZ¿7·éÿf�£äÿd÷‡³ý×ÿ·åÿw‡ÿÌGûÿÝþ¯øÿ‡ýßûÿáþÿù|¿ìÿýÿ‡ü7aûÿãÿ/ùz=?þÿ.¿¯ôý‘ý#-€�è§ý11ÿˆþ¬Ï·ýçöŠd‚e<Â�°Lƒ2®ßþ"œTäEÃƒYsÅþáL@­r½Uý<^õ¿�ªüa#,‹÷½E»Ïê¯âÏì;�ÝD’™™óÖù[(^Í ”GLùä$»=š�‚ðÓh£ñ4(³#-k1eƒû¬ðã{…e�´ÙÃ†äÈtÜP\Öà-ºžA¾Ü�{?ÐSÕ“ýD�pÎ<Šð’H!Ð¯�Ù„ÓÌÌ°º�G‘4%*ãþ}•Êlñ´§ú%ÿ’2¹~?¿»Íñä{Ú‡K¶=>(|øŒ^e[WŸ÷¡¹£B‚‹Öä†&ˆ�–uñ�ñÿÃW-Êx6ànc~4¿÷Öë(Âtù–´Ç1Ò·Yä­™ŸÕË°0#,íJš’!¿Á‘¯žë4ÆÆ·f‚Ghl´€èyôJ˜1†?Ÿ�ŠeTóhÞ¶ñ_Zi/ì`Mâ¡#&��ÑºhWµ—RKe±‚TK,>-<Ù”Þ¨v ã¯¤ññÇ¶nM4@·ØåPf¢£¬9x³®öµ¦†Ð þ}x—F÷$$0™­Co«Ï«ÁV-9¼R6ws�C[$lðë Ã§ÆxÉ½Mõ¨ìÙU:�rqšf´Øå».Xl¡\TÌXH;Ä’,‘ˆÅ®{bò#&c.4£’Ã7æf}úaá”ëÚSVõ®åúðnë¨ŒëN‘±£\-˜ÑNàRØ«"urÓ_L§½Çûˆ�ßì h3‡¢/Q”†$ò8îú0±Û£Yª˜®ô—0Nˆ ±1óx"&ÁŸFî�à²*å.2P=#,‹¨A<Äfa’Q\nSß§nxÝq£sz…Œì™ E`ª®(‚Â¡~ºp¸¦cá»a˜ÌÊ2	³s¾\6¹‰¤U¡ˆ >"È!<ŽÑ(¿]¥’U€Á‰ *	§¡�Ù:/^%¸J1°æ—Ö0üßŽ\Ffqÿí‹Ý¤ÐÌ/×`é“¼Ë��ûdˆÁBLsÙJ†ö¡ÃCioªØ'T!#&¨ÔHD¶”‰�Bñ¸š‰CPm�k4¦khÚ�²UšH˜°¢2*kçvÕÛU_èDéCËGé>$S8ûˆ‡ü û*¥¨«y‚Á-‹'CÛ(¸”Ô‘ˆ¡ðëú@‡££õö$a¤ç-è·Ók‰óvl0hgcþÖ53ŸxýÍznUSˆ¢1û«ÇÏ«£¯ýCy6Ä+E×Iæ‰„8uîKºƒxvtÿÝ¿º†Ù÷Ï8íÎ˜ä\ñ÷ÊO¦ôW}*¾’Zñ#&8Ç 9éS¦ú�êfW+¡ûû·ÛÜF‰IÍ2›â®´`eãLßg…@6ÍGa!÷1a¨„û.(÷«8hod\BE¸’¼�e¯ž›Óâl¶Œ¥)½“|÷Ç¾•hÑo‹mõ›²Æ¼V’#,o´×1±hø6ÜÚÆ+ÆÛzQ«ÙjÞ¦‹Tš6‚Õ{æµÀMVùhVƒuÙÜ,•Xz<‚iLŒ“å�ÿQÃ+*r’€7™:…;]]Ö.x·T,Â„2*wrä.1ä&�Æ¸UpX±û%IG0 õ¿ûÇˆz¯Ýu^4$‹ 3xæ)_ö~Ùßáö²�N�R;ÑÕ÷sÏ™Fÿ#&®J‘úv#-úb2(±b�¹ÜŽó¿Th’…*lÖÖKjfk¦·V®ËWÒ±6jMz¾�V¿,Š6ŠÒ–Ö÷ÃÝðøæz>À?ëûTÖ)£Ã«ÕÕ<|¥tË.feò²Ó÷½g0@Âfóx�÷°ü[*xþoÄ?GÇÿàÄOÿ]ÿ¢&Ìm=�D’EOýÞ@P‹_öÍ¸s]9ÿœªOþ?ør(öƒâ!ˆ	”'¿ÿ›cÿ°-éþ}·ót‹<A.Zþþ7öÿùú?Öí>uøxCä.ÃO	Ê½QË‰:]×OxïÃ®…=žg'¼'ÊB=“ÊYáù¾ÿ·ÒyÉå™Õäúkÿßsóô�¿û ~¨ýÐ´q„ÃþÝ.øŸ¦^#&g#&£ôbÏ�fNÏúô«{›iÕ‹LQXá=|û~Ó_Oæ.ªÏè»_þ^B_Fœ+? N#,þú”ò¢Öp:WoŠ¢)œ|µ\.2Î`ÔÃ¾Gøùí:vÑ:¬¬~¼å‰¼#pÅå°–7áá'×•´æ/ÇåÃ0rV&HK}+^Fö\"‰P½{õGl¶BZ†!?Ý¾gÃ_§þZÈñ)è£91Co©�lµV1û>açZºŸíªzÇ¼\!ìú>�€ OÿâîH§#- µÀ`
-#<==
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/waf.bat ns-3.36/waf.bat
--- ns-3.35/waf.bat	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/waf.bat	1969-12-31 16:00:00.000000000 -0800
@@ -1 +0,0 @@
-@python -x waf %* & exit /b
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/waf-tools/boost.py ns-3.36/waf-tools/boost.py
--- ns-3.35/waf-tools/boost.py	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/waf-tools/boost.py	1969-12-31 16:00:00.000000000 -0800
@@ -1,413 +0,0 @@
-#!/usr/bin/env python3
-# encoding: utf-8
-#
-# partially based on boost.py written by Gernot Vormayr
-# written by Ruediger Sonderfeld <ruediger@c-plusplus.de>, 2008
-# modified by Bjoern Michaelsen, 2008
-# modified by Luca Fossati, 2008
-# rewritten for waf 1.5.1, Thomas Nagy, 2008
-# rewritten for waf 1.6.2, Sylvain Rouquette, 2011
-
-'''
-
-This is an extra tool, not bundled with the default waf binary.
-To add the boost tool to the waf file:
-$ ./waf-light --tools=compat15,boost
-	or, if you have waf >= 1.6.2
-$ ./waf update --files=boost
-
-When using this tool, the wscript will look like:
-
-	def options(opt):
-		opt.load('compiler_cxx boost')
-
-	def configure(conf):
-		conf.load('compiler_cxx boost')
-		conf.check_boost(lib='system filesystem')
-
-	def build(bld):
-		bld(source='main.cpp', target='app', use='BOOST')
-
-Options are generated, in order to specify the location of boost includes/libraries.
-The `check_boost` configuration function allows to specify the used boost libraries.
-It can also provide default arguments to the --boost-mt command-line arguments.
-Everything will be packaged together in a BOOST component that you can use.
-
-When using MSVC, a lot of compilation flags need to match your BOOST build configuration:
- - you may have to add /EHsc to your CXXFLAGS or define boost::throw_exception if BOOST_NO_EXCEPTIONS is defined.
-   Errors: C4530
- - boost libraries will try to be smart and use the (pretty but often not useful) auto-linking feature of MSVC
-   So before calling `conf.check_boost` you might want to disabling by adding
-		conf.env.DEFINES_BOOST += ['BOOST_ALL_NO_LIB']
-   Errors:
- - boost might also be compiled with /MT, which links the runtime statically.
-   If you have problems with redefined symbols,
-		self.env['DEFINES_%s' % var] += ['BOOST_ALL_NO_LIB']
-		self.env['CXXFLAGS_%s' % var] += ['/MD', '/EHsc']
-Passing `--boost-linkage_autodetect` might help ensuring having a correct linkage in some basic cases.
-
-'''
-
-import sys
-import re
-from waflib import Utils, Logs, Errors
-from waflib.Configure import conf
-from waflib.TaskGen import feature, after_method
-
-BOOST_LIBS = ['/usr/lib/x86_64-linux-gnu', '/usr/lib/i386-linux-gnu', '/usr/lib', '/usr/local/lib', '/opt/local/lib', '/sw/lib', '/lib']
-BOOST_INCLUDES = ['/usr/include', '/usr/local/include', '/opt/local/include', '/sw/include']
-BOOST_VERSION_FILE = 'boost/version.hpp'
-BOOST_VERSION_CODE = '''
-#include <iostream>
-#include <boost/version.hpp>
-int main() { std::cout << BOOST_LIB_VERSION << std::endl; }
-'''
-
-BOOST_ERROR_CODE = '''
-#include <boost/system/error_code.hpp>
-int main() { boost::system::error_code c; }
-'''
-
-BOOST_THREAD_CODE = '''
-#include <boost/thread.hpp>
-int main() { boost::thread t; }
-'''
-
-# toolsets from {boost_dir}/tools/build/v2/tools/common.jam
-PLATFORM = Utils.unversioned_sys_platform()
-detect_intel = lambda env: (PLATFORM == 'win32') and 'iw' or 'il'
-detect_clang = lambda env: (PLATFORM == 'darwin') and 'clang-darwin' or 'clang'
-detect_mingw = lambda env: (re.search('MinGW', env.CXX[0])) and 'mgw' or 'gcc'
-BOOST_TOOLSETS = {
-	'borland':  'bcb',
-	'clang':	detect_clang,
-	'como':	 'como',
-	'cw':	   'cw',
-	'darwin':   'xgcc',
-	'edg':	  'edg',
-	'g++':	  detect_mingw,
-	'gcc':	  detect_mingw,
-	'icpc':	 detect_intel,
-	'intel':	detect_intel,
-	'kcc':	  'kcc',
-	'kylix':	'bck',
-	'mipspro':  'mp',
-	'mingw':	'mgw',
-	'msvc':	 'vc',
-	'qcc':	  'qcc',
-	'sun':	  'sw',
-	'sunc++':   'sw',
-	'tru64cxx': 'tru',
-	'vacpp':	'xlc'
-}
-
-
-def options(opt):
-	opt.add_option('--boost-includes', type='string',
-				   default='', dest='boost_includes',
-				   help='''path to the boost includes root (~boost root)
-				   e.g. /path/to/boost_1_47_0''')
-	opt.add_option('--boost-libs', type='string',
-				   default='', dest='boost_libs',
-				   help='''path to the directory where the boost libs are
-				   e.g. /path/to/boost_1_47_0/stage/lib''')
-	opt.add_option('--boost-mt', action='store_true',
-				   default=False, dest='boost_mt',
-				   help='select multi-threaded libraries')
-	opt.add_option('--boost-abi', type='string', default='', dest='boost_abi',
-				   help='''select libraries with tags (gd for debug, static is automatically added),
-				   see doc Boost, Getting Started, chapter 6.1''')
-	opt.add_option('--boost-linkage_autodetect', action="store_true", dest='boost_linkage_autodetect',
-				   help="auto-detect boost linkage options (don't get used to it / might break other stuff)")
-	opt.add_option('--boost-toolset', type='string',
-				   default='', dest='boost_toolset',
-				   help='force a toolset e.g. msvc, vc90, \
-						gcc, mingw, mgw45 (default: auto)')
-	py_version = '%d%d' % (sys.version_info[0], sys.version_info[1])
-	opt.add_option('--boost-python', type='string',
-				   default=py_version, dest='boost_python',
-				   help='select the lib python with this version \
-						(default: %s)' % py_version)
-
-
-@conf
-def __boost_get_version_file(self, d):
-	if not d:
-		return None
-	dnode = self.root.find_dir(d)
-	if dnode:
-		return dnode.find_node(BOOST_VERSION_FILE)
-	return None
-
-@conf
-def boost_get_version(self, d):
-	"""silently retrieve the boost version number"""
-	node = self.__boost_get_version_file(d)
-	if node:
-		try:
-			txt = node.read()
-		except EnvironmentError:
-			Logs.error("Could not read the file %r" % node.abspath())
-		else:
-			re_but = re.compile('^#define\\s+BOOST_LIB_VERSION\\s+"(.*)"', re.M)
-			m = re_but.search(txt)
-			if m:
-				return m.group(1)
-	return self.check_cxx(fragment=BOOST_VERSION_CODE, includes=[d], execute=True, define_ret=True)
-
-@conf
-def boost_get_includes(self, *k, **kw):
-	includes = k and k[0] or kw.get('includes', None)
-	if includes and self.__boost_get_version_file(includes):
-		return includes
-	for d in self.environ.get('INCLUDE', '').split(';') + BOOST_INCLUDES:
-		if self.__boost_get_version_file(d):
-			return d
-	if includes:
-		self.end_msg('headers not found in %s' % includes)
-		self.fatal('The configuration failed')
-	else:
-		self.end_msg('headers not found, please provide a --boost-includes argument (see help)')
-		self.fatal('The configuration failed')
-
-
-@conf
-def boost_get_toolset(self, cc):
-	toolset = cc
-	if not cc:
-		build_platform = Utils.unversioned_sys_platform()
-		if build_platform in BOOST_TOOLSETS:
-			cc = build_platform
-		else:
-			cc = self.env.CXX_NAME
-	if cc in BOOST_TOOLSETS:
-		toolset = BOOST_TOOLSETS[cc]
-	return isinstance(toolset, str) and toolset or toolset(self.env)
-
-
-@conf
-def __boost_get_libs_path(self, *k, **kw):
-	''' return the lib path and all the files in it '''
-	if 'files' in kw:
-		return self.root.find_dir('.'), Utils.to_list(kw['files'])
-	libs = k and k[0] or kw.get('libs', None)
-	if libs:
-		path = self.root.find_dir(libs)
-		files = path.ant_glob('*boost_*')
-	if not libs or not files:
-		for d in self.environ.get('LIB', '').split(';') + BOOST_LIBS:
-			if not d:
-				continue
-			path = self.root.find_dir(d)
-			if path:
-				files = path.ant_glob('*boost_*')
-				if files:
-					break
-			path = self.root.find_dir(d + '64')
-			if path:
-				files = path.ant_glob('*boost_*')
-				if files:
-					break
-	if not path:
-		if libs:
-			self.end_msg('libs not found in %s' % libs)
-		else:
-			self.end_msg('libs not found, please provide a --boost-libs argument (see help)')
-		if kw.get('required', True):
-			self.fatal('The configuration failed')
-
-	self.to_log('Found the boost path in %r with the libraries:' % path)
-	for x in files:
-		self.to_log('    %r' % x)
-	return path, files
-
-@conf
-def boost_get_libs(self, *k, **kw):
-	'''
-	return the lib path and the required libs
-	according to the parameters
-	'''
-	path, files = self.__boost_get_libs_path(**kw)
-	files = sorted(files, key=lambda f: (len(f.name), f.name), reverse=True)
-	toolset = self.boost_get_toolset(kw.get('toolset', ''))
-	toolset_pat = '(-%s[0-9]{0,3})' % toolset
-	version = '-%s' % self.env.BOOST_VERSION
-
-	def find_lib(re_lib, files):
-		for file in files:
-			if re_lib.search(file.name):
-				self.to_log('Found boost lib %s' % file)
-				return file
-		return None
-
-	def format_lib_name(name):
-		if name.startswith('lib') and self.env.CC_NAME != 'msvc':
-			name = name[3:]
-		return name[:name.rfind('.')]
-
-	def match_libs(lib_names, is_static):
-		libs = []
-		lib_names = Utils.to_list(lib_names)
-		if not lib_names:
-			return libs
-		t = []
-		if kw.get('mt', False):
-			t.append('-mt')
-		if kw.get('abi', None):
-			t.append('%s%s' % (is_static and '-s' or '-', kw['abi']))
-		elif is_static:
-			t.append('-s')
-		tags_pat = t and ''.join(t) or ''
-		ext = is_static and self.env.cxxstlib_PATTERN or self.env.cxxshlib_PATTERN
-		ext = ext.partition('%s')[2] # remove '%s' or 'lib%s' from PATTERN
-
-		for lib in lib_names:
-			if lib == 'python':
-				# for instance, with python='27',
-				# accepts '-py27', '-py2', '27' and '2'
-				# but will reject '-py3', '-py26', '26' and '3'
-				tags = '({0})?((-py{2})|(-py{1}(?=[^0-9]))|({2})|({1}(?=[^0-9]))|(?=[^0-9])(?!-py))'.format(tags_pat, kw['python'][0], kw['python'])
-			else:
-				tags = tags_pat
-			# Trying libraries, from most strict match to least one
-			for pattern in ['boost_%s%s%s%s%s$' % (lib, toolset_pat, tags, version, ext),
-							'boost_%s%s%s%s$' % (lib, tags, version, ext),
-							# Give up trying to find the right version
-							'boost_%s%s%s%s$' % (lib, toolset_pat, tags, ext),
-							'boost_%s%s%s$' % (lib, tags, ext),
-							'boost_%s%s$' % (lib, ext),
-							'boost_%s' % lib]:
-				self.to_log('Trying pattern %s' % pattern)
-				file = find_lib(re.compile(pattern), files)
-				if file:
-					libs.append(format_lib_name(file.name))
-					break
-			else:
-				self.to_log('Failed looking for boost lib %s' % lib)
-				if kw.get('required', True):
-					self.end_msg('lib %s not found in %s' % (lib, path.abspath()))
-					self.fatal('The configuration failed')
-		return libs
-
-	return  path.abspath(), match_libs(kw.get('lib', None), False), match_libs(kw.get('stlib', None), True)
-
-
-@conf
-def check_boost(self, *k, **kw):
-	"""
-	Initialize boost libraries to be used.
-
-	Keywords: you can pass the same parameters as with the command line (without "--boost-").
-	Note that the command line has the priority, and should preferably be used.
-	"""
-	if not self.env['CXX']:
-		self.fatal('load a c++ compiler first, conf.load("compiler_cxx")')
-
-	params = {
-		'lib': k and k[0] or kw.get('lib', None),
-		'stlib': kw.get('stlib', None),
-		'required': kw.get('required', True)
-	}
-	for key, value in self.options.__dict__.items():
-		if not key.startswith('boost_'):
-			continue
-		key = key[len('boost_'):]
-		params[key] = value and value or kw.get(key, '')
-
-	var = kw.get('uselib_store', 'BOOST')
-
-	self.start_msg('Checking boost includes')
-	self.env['INCLUDES_%s' % var] = inc = self.boost_get_includes(**params)
-	self.env.BOOST_VERSION = self.boost_get_version(inc)
-	self.end_msg(self.env.BOOST_VERSION + ' ' + inc)
-	if Logs.verbose:
-		Logs.pprint('CYAN', '	path : %s' % self.env['INCLUDES_%s' % var])
-
-	if not params['lib'] and not params['stlib']:
-		return
-	if 'static' in kw or 'static' in params:
-		Logs.warn('boost: static parameter is deprecated, use stlib instead.')
-	self.start_msg('Checking boost libs')
-	path, libs, stlibs = self.boost_get_libs(**params)
-	self.env['LIBPATH_%s' % var] = [path]
-	self.env['STLIBPATH_%s' % var] = [path]
-	self.env['LIB_%s' % var] = libs
-	self.env['STLIB_%s' % var] = stlibs
-	self.end_msg('ok' + ' ' + path)
-	if Logs.verbose:
-		Logs.pprint('CYAN', '	path : %s' % path)
-		Logs.pprint('CYAN', '	shared libs : %s' % libs)
-		Logs.pprint('CYAN', '	static libs : %s' % stlibs)
-
-
-	def try_link():
-		if (params['lib'] and 'system' in params['lib']) or \
-			params['stlib'] and 'system' in params['stlib']:
-			self.check_cxx(fragment=BOOST_ERROR_CODE, use=var, execute=False)
-		if (params['lib'] and 'thread' in params['lib']) or \
-			params['stlib'] and 'thread' in params['stlib']:
-			self.check_cxx(fragment=BOOST_THREAD_CODE, use=var, execute=False)
-
-	if params.get('linkage_autodetect', False):
-		self.start_msg("Attempting to detect boost linkage flags")
-		toolset = self.boost_get_toolset(kw.get('toolset', ''))
-		if toolset in ('vc',):
-			# disable auto-linking feature, causing error LNK1181
-			# because the code wants to be linked against
-			self.env['DEFINES_%s' % var] += ['BOOST_ALL_NO_LIB']
-
-			# if no dlls are present, we guess the .lib files are not stubs
-			has_dlls = False
-			for x in Utils.listdir(path):
-				if x.endswith(self.env.cxxshlib_PATTERN % ''):
-					has_dlls = True
-					break
-			if not has_dlls:
-				self.env['STLIBPATH_%s' % var] = [path]
-				self.env['STLIB_%s' % var] = libs
-				del self.env['LIB_%s' % var]
-				del self.env['LIBPATH_%s' % var]
-
-			# we attempt to play with some known-to-work CXXFLAGS combinations
-			for cxxflags in (['/MD', '/EHsc'], []):
-				self.env.stash()
-				self.env["CXXFLAGS_%s" % var] += cxxflags
-				try:
-					try_link()
-					self.end_msg("ok: winning cxxflags combination: %s" % (self.env["CXXFLAGS_%s" % var]))
-					exc = None
-					break
-				except Errors.ConfigurationError as e:
-					self.env.revert()
-					exc = e
-
-			if exc is not None:
-				self.end_msg("Could not auto-detect boost linking flags combination, you may report it to boost.py author", ex=exc)
-				self.fatal('The configuration failed')
-		else:
-			self.end_msg("Boost linkage flags auto-detection not implemented (needed ?) for this toolchain")
-			self.fatal('The configuration failed')
-	else:
-		self.start_msg('Checking for boost linkage')
-		try:
-			try_link()
-		except Errors.ConfigurationError as e:
-			self.end_msg("Could not link against boost libraries using supplied options")
-			self.fatal('The configuration failed')
-		self.end_msg('ok')
-
-
-@feature('cxx')
-@after_method('apply_link')
-def install_boost(self):
-	if install_boost.done or not Utils.is_win32 or not self.bld.cmd.startswith('install'):
-		return
-	install_boost.done = True
-	inst_to = getattr(self, 'install_path', '${BINDIR}')
-	for lib in self.env.LIB_BOOST:
-		try:
-			file = self.bld.find_file(self.env.cxxshlib_PATTERN % lib, self.env.LIBPATH_BOOST)
-			self.bld.install_files(inst_to, self.bld.root.find_node(file))
-		except:
-			continue
-install_boost.done = False
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/waf-tools/cflags.py ns-3.36/waf-tools/cflags.py
--- ns-3.35/waf-tools/cflags.py	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/waf-tools/cflags.py	1969-12-31 16:00:00.000000000 -0800
@@ -1,203 +0,0 @@
-from waflib import Logs, Options, Utils
-
-
-class CompilerTraits(object):
-	def get_warnings_flags(self, level):
-		"""get_warnings_flags(level) -> list of cflags"""
-		raise NotImplementedError
-
-	def get_optimization_flags(self, level):
-		"""get_optimization_flags(level) -> list of cflags"""
-		raise NotImplementedError
-
-	def get_debug_flags(self, level):
-		"""get_debug_flags(level) -> (list of cflags, list of cppdefines)"""
-		raise NotImplementedError
-
-
-class GccTraits(CompilerTraits):
-	def __init__(self):
-		super(GccTraits, self).__init__()
-		# cumulative list of warnings per level
-		self.warnings_flags = [['-Wall'], ['-Werror'], ['-Wextra']]
-
-	def get_warnings_flags(self, level):
-		warnings = []
-		for l in range(level):
-			if l < len(self.warnings_flags):
-				warnings.extend(self.warnings_flags[l])
-			else:
-				break
-		return warnings
-
-	def get_optimization_flags(self, level):
-		if level == 0:
-			return ['-O0']
-		elif level == 1:
-			return ['-O']
-		elif level == 2:
-			return ['-O2']
-		elif level == 3:
-			return ['-O3']
-
-	def get_debug_flags(self, level):
-		if level == 0:
-			return (['-g0'], ['NDEBUG'])
-		elif level == 1:
-			return (['-g'], [])
-		elif level >= 2:
-			return (['-ggdb', '-g3'], ['_DEBUG'])
-		
-
-class IccTraits(CompilerTraits):
-	def __init__(self):
-		super(IccTraits, self).__init__()
-		# cumulative list of warnings per level
-		# icc is _very_ verbose with -Wall, -Werror is barely achievable
-		self.warnings_flags = [[], [], ['-Wall']]
-		
-	def get_warnings_flags(self, level):
-		warnings = []
-		for l in range(level):
-			if l < len(self.warnings_flags):
-				warnings.extend(self.warnings_flags[l])
-			else:
-				break
-		return warnings
-
-	def get_optimization_flags(self, level):
-		if level == 0:
-			return ['-O0']
-		elif level == 1:
-			return ['-O']
-		elif level == 2:
-			return ['-O2']
-		elif level == 3:
-			return ['-O3']
-
-	def get_debug_flags(self, level):
-		if level == 0:
-			return (['-g0'], ['NDEBUG'])
-		elif level == 1:
-			return (['-g'], [])
-		elif level >= 2:
-			return (['-ggdb', '-g3'], ['_DEBUG'])
-		
-
-
-class MsvcTraits(CompilerTraits):
-	def __init__(self):
-		super(MsvcTraits, self).__init__()
-		# cumulative list of warnings per level
-		self.warnings_flags = [['/W2'], ['/WX'], ['/Wall']]
-
-	def get_warnings_flags(self, level):
-		warnings = []
-		for l in range(level):
-			if l < len(self.warnings_flags):
-				warnings.extend(self.warnings_flags[l])
-			else:
-				break
-		return warnings
-
-	def get_optimization_flags(self, level):
-		if level == 0:
-			return ['/Od']
-		elif level == 1:
-			return []
-		elif level == 2:
-			return ['/O2']
-		elif level == 3:
-			return ['/Ox']
-
-	def get_debug_flags(self, level):
-		if level == 0:
-			return ([], ['NDEBUG'])
-		elif level == 1:
-			return (['/ZI', '/RTC1'], [])
-		elif level >= 2:
-			return (['/ZI', '/RTC1'], ['_DEBUG'])
-
-
-
-gcc = GccTraits()
-icc = IccTraits()
-msvc = MsvcTraits()
-
-# how to map env['COMPILER_CC'] or env['COMPILER_CXX'] into a traits object
-compiler_mapping = {
-	'gcc': gcc,
-	'g++': gcc,
-	'msvc': msvc,
-	'icc': icc,
-	'icpc': icc,
-	'clang': gcc,
-	'clang++': gcc,
-}
-
-profiles = {
-	# profile name: [optimization_level, warnings_level, debug_level]
-	'default': [2, 1, 1],
-	'debug': [0, 2, 3],
-	'release': [3, 1, 0],
-	}
-
-default_profile = 'default'
-
-def options(opt):
-	assert default_profile in profiles
-	opt.add_option('-d', '--build-profile',
-		       action='store',
-		       default=default_profile,
-		       help=("Specify the build profile.  "
-			     "Build profiles control the default compilation flags"
-			     " used for C/C++ programs, if CCFLAGS/CXXFLAGS are not"
-			     " set in the environment. [Allowed Values: %s]"
-			     % ", ".join([repr(p) for p in list(profiles.keys())])),
-		       choices=list(profiles.keys()),
-		       dest='build_profile')
-	opt.add_option('--check-profile',
-		       help=('print out current build profile'),
-		       default=False, dest='check_profile', action="store_true")
-	opt.add_option('--disable-werror',
-		       help=('disable -Werror flag (warnings treated as errors, e.g., deprecated functions)'),
-		       default=False, dest='disable_werror', action="store_true")
-def configure(conf):
-	cc = conf.env['COMPILER_CC'] or None
-	cxx = conf.env['COMPILER_CXX'] or None
-	if not (cc or cxx):
-		raise Utils.WafError("neither COMPILER_CC nor COMPILER_CXX are defined; "
-				     "maybe the compiler_cc or compiler_cxx tool has not been configured yet?")
-	
-	try:
-		compiler = compiler_mapping[cc]
-	except KeyError:
-		try:
-			compiler = compiler_mapping[cxx]
-		except KeyError:
-			Logs.warn("No compiler flags support for compiler %r or %r"
-				  % (cc, cxx))
-			return
-
-	opt_level, warn_level, dbg_level = profiles[Options.options.build_profile]
-
-	optimizations = compiler.get_optimization_flags(opt_level)
-	debug, debug_defs = compiler.get_debug_flags(dbg_level)
-	warnings = compiler.get_warnings_flags(warn_level)
-
-	if Options.options.disable_werror:
-		try:
-			warnings.remove ('-Werror')
-		except ValueError:
-			pass
-	
-	if cc and not conf.env['CCFLAGS']:
-		conf.env.append_value('CCFLAGS', optimizations)
-		conf.env.append_value('CCFLAGS', debug)
-		conf.env.append_value('CCFLAGS', warnings)
-		conf.env.append_value('CCDEFINES', debug_defs)
-	if cxx and not conf.env['CXXFLAGS']:
-		conf.env.append_value('CXXFLAGS', optimizations)
-		conf.env.append_value('CXXFLAGS', debug)
-		conf.env.append_value('CXXFLAGS', warnings)
-		conf.env.append_value('CXXDEFINES', debug_defs)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/waf-tools/clang_compilation_database.py ns-3.36/waf-tools/clang_compilation_database.py
--- ns-3.35/waf-tools/clang_compilation_database.py	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/waf-tools/clang_compilation_database.py	1969-12-31 16:00:00.000000000 -0800
@@ -1,68 +0,0 @@
-#!/usr/bin/env python3
-# encoding: utf-8
-# Christoph Koke, 2013
-
-"""
-Writes the c and cpp compile commands into build/compile_commands.json
-see http://clang.llvm.org/docs/JSONCompilationDatabase.html
-
-Usage:
-
-    def configure(conf):
-        conf.load('compiler_cxx')
-        ...
-        conf.load('clang_compilation_database')
-"""
-
-import sys, os, json, shlex, pipes
-from waflib import Logs, TaskGen, Task
-from waflib.Tools import c, cxx
-
-Task.TaskBase.keep_last_cmd = True
-
-if sys.hexversion >= 0x3030000:
-	quote = shlex.quote
-else:
-	quote = pipes.quote
-
-@TaskGen.feature('*')
-@TaskGen.after_method('process_use')
-def collect_compilation_db_tasks(self):
-	"Add a compilation database entry for compiled tasks"
-	try:
-		clang_db = self.bld.clang_compilation_database_tasks
-	except AttributeError:
-		clang_db = self.bld.clang_compilation_database_tasks = []
-		self.bld.add_post_fun(write_compilation_database)
-
-	for task in getattr(self, 'compiled_tasks', []):
-		if isinstance(task, (c.c, cxx.cxx)):
-			clang_db.append(task)
-
-def write_compilation_database(ctx):
-	"Write the clang compilation database as JSON"
-	database_file = ctx.bldnode.make_node('compile_commands.json')
-	Logs.info("Build commands will be stored in %s" % database_file.path_from(ctx.path))
-	try:
-		root = json.load(database_file)
-	except IOError:
-		root = []
-	clang_db = dict((x["file"], x) for x in root)
-	for task in getattr(ctx, 'clang_compilation_database_tasks', []):
-		try:
-			cmd = task.last_cmd
-		except AttributeError:
-			continue
-		directory = getattr(task, 'cwd', ctx.variant_dir)
-		f_node = task.inputs[0]
-		filename = os.path.relpath(f_node.abspath(), directory)
-		cmd = " ".join(map(quote, cmd))
-		entry = {
-			"directory": directory,
-			"command": cmd,
-			"file": filename,
-		}
-		clang_db[filename] = entry
-	root = list(clang_db.values())
-	database_file.write(json.dumps(root, indent=2))
-
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/waf-tools/command.py ns-3.36/waf-tools/command.py
--- ns-3.35/waf-tools/command.py	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/waf-tools/command.py	1969-12-31 16:00:00.000000000 -0800
@@ -1,131 +0,0 @@
-import re
-import subprocess
-
-# import feature, taskgen_method, before_method, task_gen
-from waflib import TaskGen, Node, Task, Utils, Build, Options, Logs, Task
-debug = Logs.debug
-error = Logs.error
-
-import shellcmd
-#shellcmd.subprocess = pproc # the WAF version of the subprocess module is supposedly less buggy
-shellcmd.debug = debug
-
-
-arg_rx = re.compile(r"(?P<dollar>\$\$)|(?P<subst>\$\{(?P<var>\w+)(?P<code>.*?)\})", re.M)
-
-class command(Task.Task):
-	color = "BLUE"
-	def __init__(self, env, generator):
-		Task.Task.__init__(self, env=env, normal=1, generator=generator)
-
-	def __str__(self):
-		"string to display to the user"
-		env = self.env
-		src_str = ' '.join([a.bldpath() for a in self.inputs])
-		tgt_str = ' '.join([a.bldpath() for a in self.outputs])
-		if self.outputs:
-			sep = ' -> '
-		else:
-			sep = ''
-
-		pipeline = shellcmd.Pipeline()
-		pipeline.parse(self.generator.command)
-		cmd = pipeline.get_abbreviated_command()
-		return 'command (%s): %s%s%s' % (cmd, src_str, sep, tgt_str)
-
-	def _subst_arg(self, arg, direction, namespace):
-		"""
-		@param arg: the command argument (or stdin/stdout/stderr) to substitute
-		@param direction: direction of the argument: 'in', 'out', or None
-		"""
-		def repl(match):
-			if match.group('dollar'):
-				return "$"
-			elif match.group('subst'):
-				var = match.group('var')
-				code = match.group('code')
-				result = eval(var+code, namespace)
-				if isinstance(result, Node.Node):
-					if var == 'TGT':
-						return result.get_bld().abspath()
-					elif var == 'SRC':
-						return result.srcpath()
-					else:
-						raise ValueError("Bad subst variable %r" % var)
-				elif result is self.inputs:
-					if len(self.inputs) == 1:
-						return result[0].srcpath()
-					else:
-						raise ValueError("${SRC} requested but have multiple sources; which one?")
-				elif result is self.outputs:
-					if len(self.outputs) == 1:
-						return result[0].get_bld().abspath()
-					else:
-						raise ValueError("${TGT} requested but have multiple targets; which one?")
-				elif isinstance(result, list):
-					assert len(result) == 1
-					return result[0]
-				else:
-					return result
-			return None
-
-		return arg_rx.sub(repl, arg)
-
-	def run(self):
-		pipeline = shellcmd.Pipeline()
-		pipeline.parse(self.generator.command)
-		namespace = self.env.get_merged_dict()
-		if self.generator.variables is not None:
-			namespace.update(self.generator.variables)
-		namespace.update(env=self.env, SRC=self.inputs, TGT=self.outputs)
-		for cmd in pipeline.pipeline:
-			if isinstance(cmd, shellcmd.Command):
-				if isinstance(cmd.stdin, str):
-					cmd.stdin = self._subst_arg(cmd.stdin, 'in', namespace)
-				if isinstance(cmd.stdout, str):
-					cmd.stdout = self._subst_arg(cmd.stdout, 'out', namespace)
-				if isinstance(cmd.stderr, str):
-					cmd.stderr = self._subst_arg(cmd.stderr, 'out', namespace)
-				for argI in range(len(cmd.argv)):
-					cmd.argv[argI] = self._subst_arg(cmd.argv[argI], None, namespace)
-				if cmd.env_vars is not None:
-					env_vars = dict()
-					for name, value in cmd.env_vars.items():
-						env_vars[name] = self._subst_arg(value, None, namespace)
-					cmd.env_vars = env_vars
-			elif isinstance(cmd, shellcmd.Chdir):
-				cmd.dir = self._subst_arg(cmd.dir, None, namespace)
-		return pipeline.run(verbose=(Options.options.verbose > 0))
-
-@TaskGen.taskgen_method
-@TaskGen.feature('command')
-def init_command(self):
-	Utils.def_attrs(self,
-					# other variables that can be used in the command: ${VARIABLE}
-					variables = None,
-					rule='')
-
-
-
-@TaskGen.feature('command')
-@TaskGen.after_method('process_rule')
-def apply_command(self):
-	#self.meths.remove('apply_core')
-	# create the task
-	task = self.create_task('command')
-	setattr(task, "dep_vars", getattr(self, "dep_vars", None))
-	# process the sources
-	inputs = []
-	for node in self.source:
-		inputs.append(node)
-	task.set_inputs(inputs)
-	task.set_outputs([self.path.find_or_declare(tgt) for tgt in self.to_list(self.target)])
-	self.source = ''
-	#Task.file_deps = Task.extract_deps
-
-
-
-# class command_taskgen(task_gen):
-# 	def __init__(self, *k, **kw):
-# 		task_gen.__init__(self, *k, **kw)
-# 		self.features.append('command')
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/waf-tools/misc.py ns-3.36/waf-tools/misc.py
--- ns-3.35/waf-tools/misc.py	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/waf-tools/misc.py	1969-12-31 16:00:00.000000000 -0800
@@ -1,413 +0,0 @@
-#!/usr/bin/env python3
-# encoding: utf-8
-# Thomas Nagy, 2006-2010 (ita)
-
-"""
-This tool is totally deprecated
-
-Try using:
-	.pc.in files for .pc files
-	the feature intltool_in - see demos/intltool
-	make-like rules
-"""
-
-import shutil, re, os
-from waflib import TaskGen, Node, Task, Utils, Build, Errors
-from waflib.TaskGen import feature, after_method, before_method
-from waflib.Logs import debug
-
-def copy_attrs(orig, dest, names, only_if_set=False):
-	"""
-	copy class attributes from an object to another
-	"""
-	for a in Utils.to_list(names):
-		u = getattr(orig, a, ())
-		if u or not only_if_set:
-			setattr(dest, a, u)
-
-def copy_func(tsk):
-	"Make a file copy. This might be used to make other kinds of file processing (even calling a compiler is possible)"
-	env = tsk.env
-	infile = tsk.inputs[0].abspath()
-	outfile = tsk.outputs[0].abspath()
-	try:
-		shutil.copy2(infile, outfile)
-	except EnvironmentError:
-		return 1
-	else:
-		if tsk.chmod: os.chmod(outfile, tsk.chmod)
-		return 0
-
-def action_process_file_func(tsk):
-	"Ask the function attached to the task to process it"
-	if not tsk.fun: raise Errors.WafError('task must have a function attached to it for copy_func to work!')
-	return tsk.fun(tsk)
-
-@feature('cmd')
-def apply_cmd(self):
-	"call a command every time"
-	if not self.fun: raise Errors.WafError('cmdobj needs a function!')
-	tsk = Task.TaskBase()
-	tsk.fun = self.fun
-	tsk.env = self.env
-	self.tasks.append(tsk)
-	tsk.install_path = self.install_path
-
-@feature('copy')
-@before_method('process_source')
-def apply_copy(self):
-	Utils.def_attrs(self, fun=copy_func)
-	self.default_install_path = 0
-
-	lst = self.to_list(self.source)
-	self.meths.remove('process_source')
-
-	for filename in lst:
-		node = self.path.find_resource(filename)
-		if not node: raise Errors.WafError('cannot find input file %s for processing' % filename)
-
-		target = self.target
-		if not target or len(lst)>1: target = node.name
-
-		# TODO the file path may be incorrect
-		newnode = self.path.find_or_declare(target)
-
-		tsk = self.create_task('copy', node, newnode)
-		tsk.fun = self.fun
-		tsk.chmod = getattr(self, 'chmod', Utils.O644)
-
-		if not tsk.env:
-			tsk.debug()
-			raise Errors.WafError('task without an environment')
-
-def subst_func(tsk):
-	"Substitutes variables in a .in file"
-
-	m4_re = re.compile('@(\w+)@', re.M)
-
-	code = tsk.inputs[0].read() #Utils.readf(infile)
-
-	# replace all % by %% to prevent errors by % signs in the input file while string formatting
-	code = code.replace('%', '%%')
-
-	s = m4_re.sub(r'%(\1)s', code)
-
-	env = tsk.env
-	di = getattr(tsk, 'dict', {}) or getattr(tsk.generator, 'dict', {})
-	if not di:
-		names = m4_re.findall(code)
-		for i in names:
-			di[i] = env.get_flat(i) or env.get_flat(i.upper())
-
-	tsk.outputs[0].write(s % di)
-
-@feature('subst')
-@before_method('process_source')
-def apply_subst(self):
-	Utils.def_attrs(self, fun=subst_func)
-	lst = self.to_list(self.source)
-	self.meths.remove('process_source')
-
-	self.dict = getattr(self, 'dict', {})
-
-	for filename in lst:
-		node = self.path.find_resource(filename)
-		if not node: raise Errors.WafError('cannot find input file %s for processing' % filename)
-
-		if self.target:
-			newnode = self.path.find_or_declare(self.target)
-		else:
-			newnode = node.change_ext('')
-
-		try:
-			self.dict = self.dict.get_merged_dict()
-		except AttributeError:
-			pass
-
-		if self.dict and not self.env['DICT_HASH']:
-			self.env = self.env.derive()
-			keys = list(self.dict.keys())
-			keys.sort()
-			lst = [self.dict[x] for x in keys]
-			self.env['DICT_HASH'] = str(Utils.h_list(lst))
-
-		tsk = self.create_task('copy', node, newnode)
-		tsk.fun = self.fun
-		tsk.dict = self.dict
-		tsk.dep_vars = ['DICT_HASH']
-		tsk.chmod = getattr(self, 'chmod', Utils.O644)
-
-		if not tsk.env:
-			tsk.debug()
-			raise Errors.WafError('task without an environment')
-
-####################
-## command-output ####
-####################
-
-class cmd_arg(object):
-	"""command-output arguments for representing files or folders"""
-	def __init__(self, name, template='%s'):
-		self.name = name
-		self.template = template
-		self.node = None
-
-class input_file(cmd_arg):
-	def find_node(self, base_path):
-		assert isinstance(base_path, Node.Node)
-		self.node = base_path.find_resource(self.name)
-		if self.node is None:
-			raise Errors.WafError("Input file %s not found in " % (self.name, base_path))
-
-	def get_path(self, env, absolute):
-		if absolute:
-			return self.template % self.node.abspath()
-		else:
-			return self.template % self.node.srcpath()
-
-class output_file(cmd_arg):
-	def find_node(self, base_path):
-		assert isinstance(base_path, Node.Node)
-		self.node = base_path.find_or_declare(self.name)
-		if self.node is None:
-			raise Errors.WafError("Output file %s not found in " % (self.name, base_path))
-
-	def get_path(self, env, absolute):
-		if absolute:
-			return self.template % self.node.abspath()
-		else:
-			return self.template % self.node.bldpath()
-
-class cmd_dir_arg(cmd_arg):
-	def find_node(self, base_path):
-		assert isinstance(base_path, Node.Node)
-		self.node = base_path.find_dir(self.name)
-		if self.node is None:
-			raise Errors.WafError("Directory %s not found in " % (self.name, base_path))
-
-class input_dir(cmd_dir_arg):
-	def get_path(self, dummy_env, dummy_absolute):
-		return self.template % self.node.abspath()
-
-class output_dir(cmd_dir_arg):
-	def get_path(self, env, dummy_absolute):
-		return self.template % self.node.abspath()
-
-
-class command_output(Task.Task):
-	color = "BLUE"
-	def __init__(self, env, command, command_node, command_args, stdin, stdout, cwd, os_env, stderr):
-		Task.Task.__init__(self, env=env)
-		assert isinstance(command, (str, Node.Node))
-		self.command = command
-		self.command_args = command_args
-		self.stdin = stdin
-		self.stdout = stdout
-		self.cwd = cwd
-		self.os_env = os_env
-		self.stderr = stderr
-
-		if command_node is not None: self.dep_nodes = [command_node]
-		self.dep_vars = [] # additional environment variables to look
-
-	def run(self):
-		task = self
-		#assert len(task.inputs) > 0
-
-		def input_path(node, template):
-			if task.cwd is None:
-				return template % node.bldpath()
-			else:
-				return template % node.abspath()
-		def output_path(node, template):
-			fun = node.abspath
-			if task.cwd is None: fun = node.bldpath
-			return template % fun()
-
-		if isinstance(task.command, Node.Node):
-			argv = [input_path(task.command, '%s')]
-		else:
-			argv = [task.command]
-
-		for arg in task.command_args:
-			if isinstance(arg, str):
-				argv.append(arg)
-			else:
-				assert isinstance(arg, cmd_arg)
-				argv.append(arg.get_path(task.env, (task.cwd is not None)))
-
-		if task.stdin:
-			stdin = open(input_path(task.stdin, '%s'))
-		else:
-			stdin = None
-
-		if task.stdout:
-			stdout = open(output_path(task.stdout, '%s'), "w")
-		else:
-			stdout = None
-
-		if task.stderr:
-			stderr = open(output_path(task.stderr, '%s'), "w")
-		else:
-			stderr = None
-
-		if task.cwd is None:
-			cwd = ('None (actually %r)' % os.getcwd())
-		else:
-			cwd = repr(task.cwd)
-		debug("command-output: cwd=%s, stdin=%r, stdout=%r, argv=%r" %
-			     (cwd, stdin, stdout, argv))
-
-		if task.os_env is None:
-			os_env = os.environ
-		else:
-			os_env = task.os_env
-		command = Utils.subprocess.Popen(argv, stdin=stdin, stdout=stdout, stderr=stderr, cwd=task.cwd, env=os_env)
-		return command.wait()
-
-@feature('command-output')
-def init_cmd_output(self):
-	Utils.def_attrs(self,
-		stdin = None,
-		stdout = None,
-		stderr = None,
-		# the command to execute
-		command = None,
-
-		# whether it is an external command; otherwise it is assumed
-		# to be an executable binary or script that lives in the
-		# source or build tree.
-		command_is_external = False,
-
-		# extra parameters (argv) to pass to the command (excluding
-		# the command itself)
-		argv = [],
-
-		# dependencies to other objects -> this is probably not what you want (ita)
-		# values must be 'task_gen' instances (not names!)
-		dependencies = [],
-
-		# dependencies on env variable contents
-		dep_vars = [],
-
-		# input files that are implicit, i.e. they are not
-		# stdin, nor are they mentioned explicitly in argv
-		hidden_inputs = [],
-
-		# output files that are implicit, i.e. they are not
-		# stdout, nor are they mentioned explicitly in argv
-		hidden_outputs = [],
-
-		# change the subprocess to this cwd (must use obj.input_dir() or output_dir() here)
-		cwd = None,
-
-		# OS environment variables to pass to the subprocess
-		# if None, use the default environment variables unchanged
-		os_env = None)
-
-@feature('command-output')
-@after_method('init_cmd_output')
-def apply_cmd_output(self):
-	if self.command is None:
-		raise Errors.WafError("command-output missing command")
-	if self.command_is_external:
-		cmd = self.command
-		cmd_node = None
-	else:
-		cmd_node = self.path.find_resource(self.command)
-		assert cmd_node is not None, ('''Could not find command '%s' in source tree.
-Hint: if this is an external command,
-use command_is_external=True''') % (self.command,)
-		cmd = cmd_node
-
-	if self.cwd is None:
-		cwd = None
-
-	args = []
-	inputs = []
-	outputs = []
-
-	for arg in self.argv:
-		if isinstance(arg, cmd_arg):
-			arg.find_node(self.path)
-			if isinstance(arg, input_file):
-				inputs.append(arg.node)
-			if isinstance(arg, output_file):
-				outputs.append(arg.node)
-
-	if self.stdout is None:
-		stdout = None
-	else:
-		assert isinstance(self.stdout, str)
-		stdout = self.path.find_or_declare(self.stdout)
-		if stdout is None:
-			raise Errors.WafError("File %s not found" % (self.stdout,))
-		outputs.append(stdout)
-
-	if self.stderr is None:
-		stderr = None
-	else:
-		assert isinstance(self.stderr, str)
-		stderr = self.path.find_or_declare(self.stderr)
-		if stderr is None:
-			raise Errors.WafError("File %s not found" % (self.stderr,))
-		outputs.append(stderr)
-
-	if self.stdin is None:
-		stdin = None
-	else:
-		assert isinstance(self.stdin, str)
-		stdin = self.path.find_resource(self.stdin)
-		if stdin is None:
-			raise Errors.WafError("File %s not found" % (self.stdin,))
-		inputs.append(stdin)
-
-	for hidden_input in self.to_list(self.hidden_inputs):
-		node = self.path.find_resource(hidden_input)
-		if node is None:
-			raise Errors.WafError("File %s not found in dir %s" % (hidden_input, self.path))
-		inputs.append(node)
-
-	for hidden_output in self.to_list(self.hidden_outputs):
-		node = self.path.find_or_declare(hidden_output)
-		if node is None:
-			raise Errors.WafError("File %s not found in dir %s" % (hidden_output, self.path))
-		outputs.append(node)
-
-	if not (inputs or getattr(self, 'no_inputs', None)):
-		raise Errors.WafError('command-output objects must have at least one input file or give self.no_inputs')
-	if not (outputs or getattr(self, 'no_outputs', None)):
-		raise Errors.WafError('command-output objects must have at least one output file or give self.no_outputs')
-
-	cwd = self.bld.variant_dir
-	task = command_output(self.env, cmd, cmd_node, self.argv, stdin, stdout, cwd, self.os_env, stderr)
-	task.generator = self
-	copy_attrs(self, task, 'before after ext_in ext_out', only_if_set=True)
-	self.tasks.append(task)
-
-	task.inputs = inputs
-	task.outputs = outputs
-	task.dep_vars = self.to_list(self.dep_vars)
-
-	for dep in self.dependencies:
-		assert dep is not self
-		dep.post()
-		for dep_task in dep.tasks:
-			task.set_run_after(dep_task)
-
-	if not task.inputs:
-		# the case for svnversion, always run, and update the output nodes
-		task.runnable_status = type(Task.TaskBase.run)(runnable_status, task, task.__class__) # always run
-		task.post_run = type(Task.TaskBase.run)(post_run, task, task.__class__)
-
-	# TODO the case with no outputs?
-
-def post_run(self):
-	for x in self.outputs:
-		x.sig = Utils.h_file(x.abspath())
-
-def runnable_status(self):
-	return self.RUN_ME
-
-Task.task_factory('copy', vars=[], func=action_process_file_func)
-
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/waf-tools/relocation.py ns-3.36/waf-tools/relocation.py
--- ns-3.35/waf-tools/relocation.py	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/waf-tools/relocation.py	1969-12-31 16:00:00.000000000 -0800
@@ -1,85 +0,0 @@
-#! /usr/bin/env python3
-# encoding: utf-8
-
-"""
-Waf 1.6
-
-Try to detect if the project directory was relocated, and if it was,
-change the node representing the project directory. Just call:
-
- waf configure build
-
-Note that if the project directory name changes, the signatures for the tasks using
-files in that directory will change, causing a partial build.
-"""
-from __future__ import print_function
-import os
-from waflib import Build, ConfigSet, Task, Utils, Errors
-from waflib.TaskGen import feature, before_method, after_method
-
-EXTRA_LOCK = '.old_srcdir'
-
-old1 = Build.BuildContext.store
-def store(self):
-	old1(self)
-	db = os.path.join(self.variant_dir, EXTRA_LOCK)
-	env = ConfigSet.ConfigSet()
-	env.SRCDIR = self.srcnode.abspath()
-	env.store(db)
-Build.BuildContext.store = store
-
-old2 = Build.BuildContext.init_dirs
-def init_dirs(self):
-
-	if not (os.path.isabs(self.top_dir) and os.path.isabs(self.out_dir)):
-		raise Errors.WafError('The project was not configured: run "waf configure" first!')
-
-	srcdir = None
-	db = os.path.join(self.variant_dir, EXTRA_LOCK)
-	env = ConfigSet.ConfigSet()
-	try:
-		env.load(db)
-		srcdir = env.SRCDIR
-	except:
-		pass
-
-	if srcdir:
-		d = self.root.find_node(srcdir)
-		if d and srcdir != self.top_dir and getattr(d, 'children', ''):
-			srcnode = self.root.make_node(self.top_dir)
-			print(("relocating the source directory %r -> %r" % (srcdir, self.top_dir)))
-			srcnode.children = {}
-
-			for (k, v) in list(d.children.items()):
-				srcnode.children[k] = v
-				v.parent = srcnode
-			d.children = {}
-
-	old2(self)
-
-Build.BuildContext.init_dirs = init_dirs
-
-
-def uid(self):
-	try:
-		return self.uid_
-	except AttributeError:
-		# this is not a real hot zone, but we want to avoid surprises here
-		m = Utils.md5()
-		up = m.update
-		up(self.__class__.__name__.encode())
-		for x in self.inputs + self.outputs:
-			up(x.path_from(x.ctx.srcnode).encode())
-		self.uid_ = m.digest()
-		return self.uid_
-Task.Task.uid = uid
-
-@feature('c', 'cxx', 'd', 'go', 'asm', 'fc', 'includes')
-@after_method('propagate_uselib_vars', 'process_source')
-def apply_incpaths(self):
-	lst = self.to_incnodes(self.to_list(getattr(self, 'includes', [])) + self.env['INCLUDES'])
-	self.includes_nodes = lst
-	bld = self.bld
-	self.env['INCPATHS'] = [x.is_child_of(bld.srcnode) and x.path_from(bld.bldnode) or x.abspath() for x in lst]
-
-
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/waf-tools/shellcmd.py ns-3.36/waf-tools/shellcmd.py
--- ns-3.35/waf-tools/shellcmd.py	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/waf-tools/shellcmd.py	1969-12-31 16:00:00.000000000 -0800
@@ -1,357 +0,0 @@
-# Copyright (C) 2008 Gustavo J. A. M. Carneiro  <gjcarneiro@gmail.com>
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-
-from __future__ import print_function
-import shlex
-import subprocess
-import sys
-import re
-import os
-
-env_var_rx = re.compile(r"^([a-zA-Z0-9_]+)=(\S+)$")
-
-def debug(message):
-    print(message, file=sys.stderr)
-
-
-if sys.platform == 'win32':
-    dev_null = open("NUL:", "w")
-else:
-    dev_null = open("/dev/null", "w")
-
-fcntl = fd = fl = None
-try:
-    import fcntl
-except ImportError:
-    pass
-else:
-    fd = dev_null.fileno()
-    fl = fcntl.fcntl(fd, fcntl.F_GETFD)
-    fcntl.fcntl(fd, fcntl.F_SETFD, fl | fcntl.FD_CLOEXEC)
-del fcntl, fd, fl
-
-def _open_out_file(filename):
-    if filename in ['NUL:', '/dev/null']:
-        return dev_null
-    else:
-        return open(filename, 'wb')
-
-
-class Node(object):
-    pass
-
-class Op(Node):
-    pass
-
-class Pipe(Op):
-    pass
-
-class And(Op):
-    pass
-
-class Or(Op):
-    pass
-
-class Command(Node):
-    class PIPE(object):
-        pass # PIPE is a constant
-    class STDOUT(object):
-        pass # PIPE is a constant
-
-    def __init__(self, name):
-        super(Command, self).__init__()
-        self.name = name # command name
-        self.argv = [name] # command argv
-        self.stdin = None
-        self.stdout = None
-        self.stderr = None
-        self.env_vars = None
-
-    def __repr__(self):
-        return "Command(%r, argv=%r, stdin=%r, stdout=%r, stderr=%r)" \
-            % (self.name, self.argv, self.stdin, self.stdout, self.stderr)
-
-class Chdir(Node):
-    def __init__(self):
-        super(Chdir, self).__init__()
-        self.dir = None
-
-    def __repr__(self):
-        return "Chdir(%r)" \
-            % (self.dir)
-
-class Pipeline(object):
-    def __init__(self):
-        self.current_command = None
-        self.pipeline = []
-
-    def _commit_command(self):
-        assert self.current_command is not None
-        self.pipeline.append(self.current_command)
-        self.current_command = None
-
-    def get_abbreviated_command(self):
-        l = []
-        for node in self.pipeline:
-            if isinstance(node, Command):
-                l.append(node.name)
-            if isinstance(node, Chdir):
-                l.append('cd %s' % node.dir)
-            elif isinstance(node, Pipe):
-                l.append('|')
-            elif isinstance(node, And):
-                l.append('&&')
-            elif isinstance(node, And):
-                l.append('||')
-        return ' '.join(l)
-
-    def parse(self, command):
-        self.current_command = None
-        self.pipeline = []
-
-        if isinstance(command, list):
-            tokens = list(command)
-        else:
-            tokens = shlex.split(command)
-        debug("command: shlex: %r" % (tokens,))
-
-        BEGIN, COMMAND, CHDIR, STDERR, STDOUT, STDIN = list(range(6))
-        state = BEGIN
-        self.current_command = None
-        env_vars = dict()
-
-        while tokens:
-            token = tokens.pop(0)
-            if state == BEGIN:
-                env_var_match = env_var_rx.match(token)
-                if env_var_match is not None:
-                    env_vars[env_var_match.group(1)] = env_var_match.group(2)
-                else:
-                    assert self.current_command is None
-                    if token == 'cd':
-                        self.current_command = Chdir()
-                        assert not env_vars
-                        state = CHDIR
-                    else:
-                        self.current_command = Command(token)
-                        if env_vars:
-                            self.current_command.env_vars = env_vars
-                            env_vars = dict()
-                        state = COMMAND
-            elif state == COMMAND:
-                if token == '>':
-                    state = STDOUT
-                elif token == '2>':
-                    state = STDERR
-                elif token == '2>&1':
-                    assert self.current_command.stderr is None
-                    self.current_command.stderr = Command.STDOUT
-                elif token == '<':
-                    state = STDIN
-                elif token == '|':
-                    assert self.current_command.stdout is None
-                    self.current_command.stdout = Command.PIPE
-                    self._commit_command()
-                    self.pipeline.append(Pipe())
-                    state = BEGIN
-                elif token == '&&':
-                    self._commit_command()
-                    self.pipeline.append(And())
-                    state = BEGIN
-                elif token == '||':
-                    self._commit_command()
-                    self.pipeline.append(Or())
-                    state = BEGIN
-                else:
-                    self.current_command.argv.append(token)
-            elif state == CHDIR:
-                if token == '&&':
-                    self._commit_command()
-                    self.pipeline.append(And())
-                    state = BEGIN
-                else:
-                    assert self.current_command.dir is None
-                    self.current_command.dir = token
-            elif state == STDOUT:
-                assert self.current_command.stdout is None
-                self.current_command.stdout = token
-                state = COMMAND
-            elif state == STDERR:
-                assert self.current_command.stderr is None
-                self.current_command.stderr = token
-                state = COMMAND
-            elif state == STDIN:
-                assert self.current_command.stdin is None
-                self.current_command.stdin = token
-                state = COMMAND
-        self._commit_command()
-        return self.pipeline
-
-    def _exec_piped_commands(self, commands):
-        retvals = []
-        for cmd in commands:
-            retvals.append(cmd.wait())
-        retval = 0
-        for r in retvals:
-            if r:
-                retval = retvals[-1]
-                break
-        return retval
-
-    def run(self, verbose=False):
-        pipeline = list(self.pipeline)
-        files_to_close = []
-        piped_commands = []
-        piped_commands_display = []
-        BEGIN, PIPE = list(range(2))
-        state = BEGIN
-        cwd = '.'
-        while pipeline:
-            node = pipeline.pop(0)
-
-            if isinstance(node, Chdir):
-                next_op = pipeline.pop(0)
-                assert isinstance(next_op, And)
-                cwd = os.path.join(cwd, node.dir)
-                if verbose:
-                    piped_commands_display.append("cd %s &&" % node.dir)
-                continue
-            
-            assert isinstance(node, (Command, Chdir))
-            cmd = node
-            if verbose:
-                if cmd.env_vars:
-                    env_vars_str = ' '.join(['%s=%s' % (key, val) for key, val in cmd.env_vars.items()])
-                    piped_commands_display.append("%s %s" % (env_vars_str, ' '.join(cmd.argv)))
-                else:
-                    piped_commands_display.append(' '.join(cmd.argv))
-
-            if state == PIPE:
-                stdin = piped_commands[-1].stdout
-            elif cmd.stdin is not None:
-                stdin = open(cmd.stdin, "r")
-                if verbose:
-                    piped_commands_display.append('< %s' % cmd.stdin)
-                files_to_close.append(stdin)
-            else:
-                stdin = None
-
-            if cmd.stdout is None:
-                stdout = None
-            elif cmd.stdout is Command.PIPE:
-                stdout = subprocess.PIPE
-            else:
-                stdout = _open_out_file(cmd.stdout)
-                files_to_close.append(stdout)
-                if verbose:
-                    piped_commands_display.append('> %s' % cmd.stdout)
-
-            if cmd.stderr is None:
-                stderr = None
-            elif cmd.stderr is Command.PIPE:
-                stderr = subprocess.PIPE
-            elif cmd.stderr is Command.STDOUT:
-                stderr = subprocess.STDOUT
-                if verbose:
-                    piped_commands_display.append('2>&1')
-            else:
-                stderr = _open_out_file(cmd.stderr)
-                files_to_close.append(stderr)
-                if verbose:
-                    piped_commands_display.append('2> %s' % cmd.stderr)
-
-            if cmd.env_vars:
-                env = dict(os.environ)
-                env.update(cmd.env_vars)
-            else:
-                env = None
-
-            if cwd == '.':
-                proc_cwd = None
-            else:
-                proc_cwd = cwd
-
-            debug("command: subprocess.Popen(argv=%r, stdin=%r, stdout=%r, stderr=%r, env_vars=%r, cwd=%r)"
-                  % (cmd.argv, stdin, stdout, stderr, cmd.env_vars, proc_cwd))
-            proc = subprocess.Popen(cmd.argv, stdin=stdin, stdout=stdout, stderr=stderr, env=env, cwd=proc_cwd)
-            del stdin, stdout, stderr
-            piped_commands.append(proc)
-
-            try:
-                next_node = pipeline.pop(0)
-            except IndexError:
-                try:
-                    retval = self._exec_piped_commands(piped_commands)
-                    if verbose:
-                        print("%s: exit code %i" % (' '.join(piped_commands_display), retval))
-                finally:
-                    for f in files_to_close:
-                        if f is not dev_null:
-                            f.close()
-                    files_to_close = []
-                return retval
-            else:
-
-                if isinstance(next_node, Pipe):
-                    state = PIPE
-                    piped_commands_display.append('|')
-
-                elif isinstance(next_node, Or):
-                    try:
-                        this_retval = self._exec_piped_commands(piped_commands)
-                    finally:
-                        for f in files_to_close:
-                            if f is not dev_null:
-                                f.close()
-                        files_to_close = []
-                    if this_retval == 0:
-                        if verbose:
-                            print("%s: exit code %i (|| is short-circuited)" % (' '.join(piped_commands_display), retval))
-                        return this_retval
-                    if verbose:
-                        print("%s: exit code %i (|| proceeds)" % (' '.join(piped_commands_display), retval))
-                    state = BEGIN
-                    piped_commands = []
-                    piped_commands_display = []
-
-                elif isinstance(next_node, And):
-                    try:
-                        this_retval = self._exec_piped_commands(piped_commands)
-                    finally:
-                        for f in files_to_close:
-                            if f is not dev_null:
-                                f.close()
-                        files_to_close = []
-                    if this_retval != 0:
-                        if verbose:
-                            print("%s: exit code %i (&& is short-circuited)" % (' '.join(piped_commands_display), retval))
-                        return this_retval
-                    if verbose:
-                        print("%s: exit code %i (&& proceeds)" % (' '.join(piped_commands_display), retval))
-                    state = BEGIN
-                    piped_commands = []
-                    piped_commands_display = []
-
-
-
-def _main():
-    pipeline = Pipeline()
-    pipeline.parse('./foo.py 2>&1 < xxx | cat && ls')
-    print(pipeline.run())
-
-if __name__ == '__main__':
-    _main()
-
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/waf-tools/versioning.py ns-3.36/waf-tools/versioning.py
--- ns-3.35/waf-tools/versioning.py	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/waf-tools/versioning.py	1969-12-31 16:00:00.000000000 -0800
@@ -1,262 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-import re
-
-from waflib import ConfigSet, Configure, Context, Options, Task, TaskGen
-
-CACHE_FILE = 'version.cache'
-
-class ns3_version_info(Task.Task):
-    '''Base task which implements functionality common to all inherited tasks
-
-       This class handles parsing the ns-3 version tag into component parts
-       as well as saving the version fields to a cache file
-
-       All version fields should be stored in the fields property
-
-       Derived classes should override _find_closest_tag() and 
-       _find_closest_ns3_tag()
-    '''
-
-    def __init__(self, *args, **kwargs):
-        self._fields = ConfigSet.ConfigSet()
-
-        super(ns3_version_info, self).__init__(*args, **kwargs)
-
-    @property
-    def fields(self):
-        return self._fields
-
-    def _find_closest_tag(self, ctx):
-        """Override in derived classes"""
-        pass
-
-    def _find_closest_ns3_tag(self, ctx):
-        """Override in derived classes"""
-        pass
-
-    def _parse_version_tag(self, ctx, tag):
-        safe_tag = tag.strip()
-        matches = re.match("ns-(\d+)\.(\d+)(?:.(\d+))?(?:-(RC.+))?.*", safe_tag)
-          
-        if not matches:
-            return False
-
-        self.fields['VERSION_TAG'] = '"{}"'.format(safe_tag)
-        self.fields['VERSION_MAJOR'] = matches.group(1)
-        self.fields['VERSION_MINOR'] = matches.group(2)
-
-        patch = matches.group(3)
-
-        if not patch:
-            patch = '0'
-
-        self.fields['VERSION_PATCH'] = patch 
-
-        release_candidate = matches.group(4)
-
-        if not release_candidate:
-            release_candidate = ''
-
-        self.fields['VERSION_RELEASE_CANDIDATE'] = '"{}"'.format(release_candidate)
-
-        return True
-
-    def run(self):
-        ctx = self.generator.bld
-
-        try:
-            self._find_closest_tag(ctx)
-
-            if 'VERSION_TAG' not in self.fields:
-                self._find_closest_ns3_tag(ctx)
-
-            #Generate the path where the cache file will be stored
-            base_path = self.generator.path.make_node('model')
-            cache_path = base_path.make_node(CACHE_FILE)
-
-            #Write the version information out to the cache file 
-            #The cache file is used to populate the version fields when a git 
-            #repository can not be found 
-            self.fields.store(cache_path.abspath())
-
-            #merge version info into main configset
-            ctx.env.update(self.fields)
-
-        except Exception as e:
-            ctx.to_log("Extracting version information from tags failed: {}\n".format(e)) 
-            return 1
-    
-        return 0
-
-class git_ns3_version_info(ns3_version_info):
-    '''Task to generate version fields from an ns-3 git repository'''
-    always_run = True 
-
-    def _find_closest_tag(self, ctx):
-        cmd = [
-            'git',
-            'describe',
-            '--tags',
-            '--dirty',
-            '--long'
-        ]
-    
-        try:
-            out = ctx.cmd_and_log(cmd, 
-                                  output=Context.STDOUT,
-                                  quiet=Context.BOTH)
-        except Exception as e:
-            raise Exception(e.stderr.strip())
-   
-        matches = re.match('(.+)-(\d+)-(g[a-fA-F0-9]+)(?:-(dirty))?', out)
-
-        if not matches:
-            raise ValueError("Closest tag found in git log"
-                             "does not match the expected format (tag='{}')"
-                             .format(out))
-
-        tag = matches.group(1)
-
-        self.fields['CLOSEST_TAG'] = '"{}"'.format(tag)
-        self.fields['VERSION_TAG_DISTANCE'] = matches.group(2)
-        self.fields['VERSION_COMMIT_HASH'] = '"{}"'.format(matches.group(3))
-        self.fields['VERSION_DIRTY_FLAG'] = '1' if matches.group(4) else '0'
-        
-        self._parse_version_tag(ctx, tag) 
-
-    def _find_closest_ns3_tag(self, ctx):
-        cmd = [
-            'git',
-            'describe',
-            '--tags',
-            '--abbrev=0',
-            '--match',
-            'ns-3*',
-            'HEAD'
-        ]
-    
-        try:
-            out = ctx.cmd_and_log(cmd, 
-                                  output=Context.STDOUT,
-                                  quiet=Context.BOTH)
-        except Exception as e:
-            raise Exception(e.stderr.strip())
-
-        tag = out.strip() 
-
-        result = self._parse_version_tag(ctx, tag)
-
-        if not result:
-            raise ValueError("Closest ns3 tag found in git log"
-                             " does not match the expected format (tag='{}')"
-                             .format(tag))
-
-@TaskGen.feature('version-defines')
-def generate_version_defines(self):
-
-    #Create a substitution task to generate version-defines.h
-    #from fields stored in env 
-    subst_task = self.create_task('subst', self.source, self.target)
-
-    if self.env['HAVE_NS3_REPO']:
-        #if a git repo is present, run the version task first to
-        #populate the appropriate fields with data from the git repo
-        version_task = self.create_task('git_ns3_version_info')
-        subst_task.set_run_after(version_task)
-
-@Configure.conf
-def check_git_repo(self):
-    '''Determine if a git repository is present'''
-
-    root = False
-    cmd = [
-            'git',
-            'rev-parse',
-            '--show-toplevel'
-    ]
-
-    try:
-        #determine if the current directory is part of a git repository 
-        self.find_program('git')
-    
-        out = self.cmd_and_log(cmd, output=Context.STDOUT, quiet=Context.BOTH)
-    
-        root = out.strip() 
-    except Exception:
-        root = False
-    
-    self.msg('Checking for local git repository', root)
-    
-    return bool(root) 
-
-@Configure.conf
-def check_git_repo_has_ns3_tags(self):
-    '''Determine if the git repository is an ns-3 repository
-
-       A repository is considered an ns-3 repository if it has at least one 
-       tag that matches the regex ns-3*
-    '''
-
-    tag = False
-
-    cmd = [
-        'git',
-        'describe',
-        '--tags',
-        '--abbrev=0',
-        '--match',
-        'ns-3.[0-9]*'
-    ]
-
-    try:
-        out = self.cmd_and_log(cmd, output=Context.STDOUT, quiet=Context.BOTH)
-
-        tag = out.strip()
-
-    except Exception:
-        tag = False
-
-    self.msg('Checking local git repository for ns3 tags', tag)
-
-    return bool(tag) 
-
-def configure(ctx):
-
-    has_git_repo = False
-    has_ns3_tags = False
-
-    if not Options.options.enable_build_version:
-        return
-
-    if ctx.check_git_repo():
-        has_git_repo = True
-        has_ns3_tags = ctx.check_git_repo_has_ns3_tags()
-
-    ctx.env['HAVE_GIT_REPO'] = has_git_repo
-    ctx.env['HAVE_NS3_REPO'] = has_ns3_tags
-
-    if not has_ns3_tags:
-        version_cache = ConfigSet.ConfigSet ()
-
-        #no ns-3 repository, look for a cache file containing the version info
-        ctx.start_msg('Searching for file {}'.format(CACHE_FILE))
-
-        glob_pattern = '**/{}'.format(CACHE_FILE)
-        cache_path = ctx.path.ant_glob(glob_pattern)
-
-        if len(cache_path) > 0:
-            #Found cache file
-            #Load it and merge the information into the main context environment
-            src_path = cache_path[0].srcpath()
-            ctx.end_msg(src_path)
-
-            version_cache.load (src_path)
-        else:
-            ctx.end_msg(False)
-
-            ctx.fatal('Unable to find ns3 git repository or version.cache file '
-                        'containing version information')
-
-        ctx.env.update(version_cache)
-
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/wscript ns-3.36/wscript
--- ns-3.35/wscript	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/wscript	1969-12-31 16:00:00.000000000 -0800
@@ -1,1754 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-# python lib modules
-from __future__ import print_function
-import sys
-import shutil
-import types
-import optparse
-import os.path
-import re
-import shlex
-import subprocess
-import textwrap
-import fileinput
-import glob
-
-from utils import read_config_file
-
-
-# WAF modules
-from waflib import Utils, Scripting, Configure, Build, Options, TaskGen, Context, Task, Logs, Errors
-from waflib.Errors import WafError
-
-
-# local modules
-import wutils
-
-
-# By default, all modules will be enabled, examples will be disabled,
-# and tests will be disabled.
-modules_enabled  = ['all_modules']
-examples_enabled = False
-tests_enabled    = False
-
-# GCC minimum version requirements for C++17 support
-gcc_min_version = (7, 0, 0)
-
-# Bug 2181:  clang warnings about unused local typedefs and potentially
-# evaluated expressions affecting darwin clang/LLVM version 7.0.0 (Xcode 7)
-# or clang/LLVM version 3.6 or greater.  We must make this platform-specific.
-darwin_clang_version_warn_unused_local_typedefs = (7, 0, 0)
-darwin_clang_version_warn_potentially_evaluated = (7, 0, 0)
-clang_version_warn_unused_local_typedefs = (3, 6, 0)
-clang_version_warn_potentially_evaluated = (3, 6, 0)
-
-# Get the information out of the NS-3 configuration file.
-config_file_exists = False
-(config_file_exists, modules_enabled, examples_enabled, tests_enabled) = read_config_file()
-
-sys.path.insert(0, os.path.abspath('waf-tools'))
-try:
-    import cflags # override the build profiles from waf
-finally:
-    sys.path.pop(0)
-
-cflags.profiles = {
-    # profile name: [optimization_level, warnings_level, debug_level]
-    'debug':     [0, 2, 3],
-    'optimized': [3, 2, 1],
-    'release':   [3, 2, 0],
-    }
-cflags.default_profile = 'debug'
-
-Configure.autoconfig = 0
-
-# the following two variables are used by the target "waf dist"
-with open("VERSION", "rt") as f:
-    VERSION = f.read().strip()
-APPNAME = 'ns'
-
-wutils.VERSION = VERSION
-wutils.APPNAME = APPNAME
-
-# we don't use VNUM anymore (see bug #1327 for details)
-wutils.VNUM = None
-
-# these variables are mandatory ('/' are converted automatically)
-top = '.'
-out = 'build'
-
-def load_env():
-    bld_cls = getattr(Utils.g_module, 'build_context', Utils.Context)
-    bld_ctx = bld_cls()
-    bld_ctx.load_dirs(os.path.abspath(os.path.join (srcdir,'..')),
-                      os.path.abspath(os.path.join (srcdir,'..', blddir)))
-    bld_ctx.load_envs()
-    env = bld_ctx.get_env()
-    return env
-
-def get_files(base_dir):
-    retval = []
-    reference=os.path.dirname(base_dir)
-    for root, dirs, files in os.walk(base_dir):
-        if root.find('.hg') != -1:
-            continue
-        for file in files:
-            if file.find('.hg') != -1:
-                continue
-            fullname = os.path.join(root,file)
-            # we can't use os.path.relpath because it's new in python 2.6
-            relname = fullname.replace(reference + '/','')
-            retval.append([fullname,relname])
-    return retval
-
-
-def dist_hook():
-    import tarfile
-    shutil.rmtree("doc/html", True)
-    shutil.rmtree("doc/latex", True)
-    shutil.rmtree("nsc", True)
-
-# Print the sorted list of module names in columns.
-def print_module_names(names):
-    """Print the list of module names in 3 columns."""
-    for i, name in enumerate(sorted(names)):
-        if i % 3 == 2 or i == len(names) - 1:
-          print(name)
-        else:
-          print(name.ljust(25), end=' ')
-
-# return types of some APIs differ in Python 2/3 (type string vs class bytes)
-# This method will decode('utf-8') a byte object in Python 3,
-# and do nothing in Python 2
-def maybe_decode(input):
-    if sys.version_info < (3,):
-        return input
-    else:
-        try:
-            return input.decode('utf-8')
-        except:
-            sys.exc_clear()
-            return input
-
-def options(opt):
-    # options provided by the modules
-    opt.load('md5_tstamp')
-    opt.load('compiler_c')
-    opt.load('compiler_cxx')
-    opt.load('cflags')
-    opt.load('gnu_dirs')
-    opt.load('boost', tooldir=['waf-tools'])
-
-    opt.add_option('--check-config',
-                   help=('Print the current configuration.'),
-                   action="store_true", default=False,
-                   dest="check_config")
-
-    opt.add_option('--cwd',
-                   help=('Set the working directory for a program.'),
-                   action="store", type="string", default=None,
-                   dest='cwd_launch')
-
-    opt.add_option('--enable-gcov',
-                   help=('Enable code coverage analysis.'
-                         ' WARNING: this option only has effect '
-                         'with the configure command.'),
-                   action="store_true", default=False,
-                   dest='enable_gcov')
-
-    opt.add_option('--no-task-lines',
-                   help=("Don't print task lines, i.e. messages saying which tasks are being executed by WAF."
-                         "  Coupled with a single -v will cause WAF to output only the executed commands,"
-                         " just like 'make' does by default."),
-                   action="store_true", default=False,
-                   dest='no_task_lines')
-
-    opt.add_option('--lcov-report',
-                   help=('Generate a code coverage report '
-                         '(use this option after configuring with --enable-gcov and running a program)'),
-                   action="store_true", default=False,
-                   dest='lcov_report')
-
-    opt.add_option('--lcov-zerocounters',
-                   help=('Zero the lcov counters'
-                         '(use this option before rerunning a program, when generating repeated lcov reports)'),
-                   action="store_true", default=False,
-                   dest='lcov_zerocounters')
-
-    opt.add_option('--run',
-                   help=('Run a locally built program; argument can be a program name,'
-                         ' or a command starting with the program name.'),
-                   type="string", default='', dest='run')
-    opt.add_option('--run-no-build',
-                   help=('Run a locally built program without rebuilding the project; argument can be a program name,'
-                         ' or a command starting with the program name.'),
-                   type="string", default='', dest='run_no_build')
-    opt.add_option('--visualize',
-                   help=('Modify --run arguments to enable the visualizer'),
-                   action="store_true", default=False, dest='visualize')
-    opt.add_option('--command-template',
-                   help=('Template of the command used to run the program given by --run;'
-                         ' It should be a shell command string containing %s inside,'
-                         ' which will be replaced by the actual program.'),
-                   type="string", default=None, dest='command_template')
-    opt.add_option('--pyrun',
-                   help=('Run a python program using locally built ns3 python module;'
-                         ' argument is the path to the python program, optionally followed'
-                         ' by command-line options that are passed to the program.'),
-                   type="string", default='', dest='pyrun')
-    opt.add_option('--pyrun-no-build',
-                   help=('Run a python program using locally built ns3 python module without rebuilding the project;'
-                         ' argument is the path to the python program, optionally followed'
-                         ' by command-line options that are passed to the program.'),
-                   type="string", default='', dest='pyrun_no_build')
-    opt.add_option('--gdb',
-                   help=('Change the default command template to run programs and unit tests with gdb'),
-                   action="store_true", default=False,
-                   dest='gdb')
-    opt.add_option('--valgrind',
-                   help=('Change the default command template to run programs and unit tests with valgrind'),
-                   action="store_true", default=False,
-                   dest='valgrind')
-    opt.add_option('--shell',
-                   help=('DEPRECATED (run ./waf shell)'),
-                   action="store_true", default=False,
-                   dest='shell')
-    opt.add_option('--enable-sudo',
-                   help=('Use sudo to setup suid bits on ns3 executables.'),
-                   dest='enable_sudo', action='store_true',
-                   default=False)
-    opt.add_option('--enable-tests',
-                   help=('Build the ns-3 tests.'),
-                   dest='enable_tests', action='store_true',
-                   default=False)
-    opt.add_option('--disable-tests',
-                   help=('Do not build the ns-3 tests.'),
-                   dest='disable_tests', action='store_true',
-                   default=False)
-    opt.add_option('--enable-examples',
-                   help=('Build the ns-3 examples.'),
-                   dest='enable_examples', action='store_true',
-                   default=False)
-    opt.add_option('--disable-examples',
-                   help=('Do not build the ns-3 examples.'),
-                   dest='disable_examples', action='store_true',
-                   default=False)
-    opt.add_option('--check',
-                   help=('DEPRECATED (run ./test.py)'),
-                   default=False, dest='check', action="store_true")
-    opt.add_option('--enable-static',
-                   help=('Compile NS-3 statically: works only on linux, without python'),
-                   dest='enable_static', action='store_true',
-                   default=False)
-    opt.add_option('--enable-mpi',
-                   help=('Compile NS-3 with MPI and distributed simulation support'),
-                   dest='enable_mpi', action='store_true',
-                   default=False)
-    opt.add_option('--doxygen-no-build',
-                   help=('Run doxygen to generate html documentation from source comments, '
-                         'but do not wait for ns-3 to finish the full build.'),
-                   action="store_true", default=False,
-                   dest='doxygen_no_build')
-    opt.add_option('--docset',
-                   help=('Create Docset, without building. This requires the docsetutil tool from Xcode 9.2 or earlier. See Bugzilla 2196 for more details.'),
-                   action="store_true", default=False,
-                   dest="docset_build")
-    opt.add_option('--enable-des-metrics',
-                   help=('Log all events in a json file with the name of the executable (which must call CommandLine::Parse(argc, argv)'),
-                   action="store_true", default=False,
-                   dest='enable_desmetrics')
-    opt.add_option('--cxx-standard',
-                   help=('Compile NS-3 with the given C++ standard'),
-                   type='string', dest='cxx_standard')
-    opt.add_option('--enable-asserts',
-                   help=('Enable the asserts regardless of the compile mode'),
-                   action="store_true", default=False,
-                   dest='enable_asserts')
-    opt.add_option('--enable-logs',
-                   help=('Enable the logs regardless of the compile mode'),
-                   action="store_true", default=False,
-                   dest='enable_logs')
-
-    # options provided in subdirectories
-    opt.recurse('src')
-    opt.recurse('bindings/python')
-    opt.recurse('src/internet')
-    opt.recurse('contrib')
-
-def _check_compilation_flag(conf, flag, mode='cxx', linkflags=None):
-    """
-    Checks if the C++ compiler accepts a certain compilation flag or flags
-    flag: can be a string or a list of strings
-    """
-    l = []
-    if flag:
-        l.append(flag)
-    if isinstance(linkflags, list):
-        l.extend(linkflags)
-    else:
-        if linkflags:
-            l.append(linkflags)
-    if len(l) > 1:
-        flag_str = 'flags ' + ' '.join(l)
-    else:
-        flag_str = 'flag ' + ' '.join(l)
-    if len(flag_str) > 28:
-        flag_str = flag_str[:28] + "..."
-
-    conf.start_msg('Checking for compilation %s support' % (flag_str,))
-    env = conf.env.derive()
-
-    retval = False
-    if mode == 'cc':
-        mode = 'c'
-
-    if mode == 'cxx':
-        env.append_value('CXXFLAGS', flag)
-    else:
-        env.append_value('CFLAGS', flag)
-
-    if linkflags is not None:
-        env.append_value("LINKFLAGS", linkflags)
-
-    try:
-        retval = conf.check(compiler=mode, fragment='int main() { return 0; }', features='c', env=env)
-    except Errors.ConfigurationError:
-        ok = False
-    else:
-        ok = (retval == True)
-    conf.end_msg(ok)
-    return ok
-
-
-def report_optional_feature(conf, name, caption, was_enabled, reason_not_enabled):
-    conf.env.append_value('NS3_OPTIONAL_FEATURES', [(name, caption, was_enabled, reason_not_enabled)])
-
-
-def check_optional_feature(conf, name):
-    for (name1, caption, was_enabled, reason_not_enabled) in conf.env.NS3_OPTIONAL_FEATURES:
-        if name1 == name:
-            return was_enabled
-    raise KeyError("Feature %r not declared yet" % (name,))
-
-
-# starting with waf 1.6, conf.check() becomes fatal by default if the
-# test fails, this alternative method makes the test non-fatal, as it
-# was in waf <= 1.5
-def _check_nonfatal(conf, *args, **kwargs):
-    try:
-        return conf.check(*args, **kwargs)
-    except conf.errors.ConfigurationError:
-        return None
-
-# Write a summary of optional features status
-def print_config(env, phase='configure'):
-    if phase == 'configure':
-        profile = get_build_profile(env)
-    else:
-        profile = get_build_profile()
-
-    print("---- Summary of optional NS-3 features:")
-    print("%-30s: %s%s%s" % ("Build profile", Logs.colors('GREEN'),
-                             profile, Logs.colors('NORMAL')))
-    bld = wutils.bld
-    print("%-30s: %s%s%s" % ("Build directory", Logs.colors('GREEN'),
-                             Options.options.out, Logs.colors('NORMAL')))
-
-
-    for (name, caption, was_enabled, reason_not_enabled) in sorted(env['NS3_OPTIONAL_FEATURES'], key=lambda s : s[1]):
-        if was_enabled:
-            status = 'enabled'
-            color = 'GREEN'
-        else:
-            status = 'not enabled (%s)' % reason_not_enabled
-            color = 'RED'
-        print("%-30s: %s%s%s" % (caption, Logs.colors(color), status, Logs.colors('NORMAL')))
-
-#  Checking for boost headers and libraries
-#
-#  There are four cases:
-#    A.  Only need headers, and they are required
-#    B.  Also need compiled libraries, and they are required
-#    C.  Only use headers, but they are not required
-#    D.  Use compiled libraries, but they are not required
-#
-#  A.  If you only need includes there are just two steps:
-#
-#    A1.  Add this in your module wscript configure function:
-#
-#        if not conf.require_boost_incs('my-module', 'my module caption'):
-#            return
-#
-#    A2.  Do step FINAL below.
-#
-#  B.  If you also need some compiled boost libraries there are 
-#      three steps (instead of the above):
-#
-#    B1.  Declare the libraries you need by adding to your module wscript:
-#
-#        REQUIRED_BOOST_LIBS = ['lib1', 'lib2'...]
-#
-#        def required_boost_libs(conf):
-#            conf.env['REQUIRED_BOOST_LIBS'] += REQUIRED_BOOST_LIBS
-#
-#    B2.  Check that the libs are present in your module wscript configure function:
-#      
-#        if conf.missing_boost_libs('my-module', 'my module caption', REQUIRED_BOOST_LIBS):
-#            return
-#
-#    B3.  Do step FINAL below.
-#
-#  Finally,
-#
-#    FINAL.  Add boost to your module wscript build function:
-#
-#        # Assuming you have
-#        #  module = bld.create_ns3_module('my-module')
-#        module.use.append('BOOST')
-#
-#  If your use of boost is optional it's even simpler.
-#
-#  C.  For optional headers only, the two steps above are modified a little:
-#
-#    C1.  Add this to your module wscript configure function:
-#
-#        conf.require_boost_incs('my-module', 'my module caption', required=False)
-#        # Continue with config, adjusting for missing boost
-#
-#    C2.  Modify step FINAL as follows
-#
-#        if bld.env['INCLUDES_BOOST']:
-#            module.use.append('BOOST')
-#
-#  D.  For compiled boost libraries
-#
-#    D1.  Do B1 above to declare the libraries you would like to use
-#
-#    D2.  If you need to take action at configure time, 
-#         add to your module wscript configure function:
-#
-#        missing_boost_libs = conf.missing_boost_libs('my-module', 'my module caption', REQUIRED_BOOST_LIBS, required=False)
-#        # Continue with config, adjusting for missing boost libs
-#
-#         At this point you can inspect missing_boost_libs to see 
-#         what libs were found and do the right thing.  
-#         See below for preprocessor symbols which will be available 
-#         in your source files.
-#
-#    D3.  If any of your libraries are present add to your 
-#         module wscript build function:
-#
-#        missing_boost_libs = bld.missing_boost_libs('lib-opt', REQUIRED_BOOST_LIBS)
-#        # Continue with build, adjusting for missing boost libs
-#  
-#         At this point you can inspect missing_boost_libs to see 
-#         what libs were found and do the right thing.  
-#
-#  In all cases you can test for boost in your code with
-#
-#      #ifdef HAVE_BOOST
-#
-#  Each boost compiled library will be indicated with a 'HAVE_BOOST_<lib>' 
-#  preprocessor symbol, which you can test.  For example, for the boost 
-#  Signals2 library:
-#
-#      #ifdef HAVE_BOOST_SIGNALS2
-#
-
-def require_boost_incs(conf, module, caption, required=True):
-
-    conf.to_log('boost: %s wants incs, required: %s' % (module, required))
-    if conf.env['INCLUDES_BOOST']:
-        conf.to_log('boost: %s: have boost' % module)
-        return True
-    elif not required:
-        conf.to_log('boost: %s: no boost, but not required' % module)
-        return False
-    else:
-        conf.to_log('boost: %s: no boost, but required' % module)
-        conf.report_optional_feature(module, caption, False,
-                                     "boost headers required but not found")
-
-        # Add this module to the list of modules that won't be built
-        # if they are enabled.
-        conf.env['MODULES_NOT_BUILT'].append(module)
-        return False
-
-#  Report any required boost libs which are missing
-#  Return values of truthy are bad; falsey is good:
-#    If all are present return False (non missing)
-#    If boost not present, or no libs return True
-#    If some libs present, return the list of missing libs
-def conf_missing_boost_libs(conf, module, caption, libs, required= True):
-    conf.to_log('boost: %s wants %s, required: %s' % (module, libs, required))
-
-    if not conf.require_boost_incs(module, caption, required):
-        # No headers found, so the libs aren't there either
-        return libs
-
-    missing_boost_libs = [lib for lib in libs if lib not in conf.boost_libs]
-
-    if required and missing_boost_libs:
-        if not conf.env['LIB_BOOST']:
-            conf.to_log('boost: %s requires libs, but none found' % module)
-            conf.report_optional_feature(module, caption, False,
-                                         "No boost libraries were found")
-        else:
-            conf.to_log('boost: %s requires libs, but missing %s' % (module, missing_boost_libs))
-            conf.report_optional_feature(module, caption, False,
-                                         "Required boost libraries not found, missing: %s" % missing_boost_libs)
-
-        # Add this module to the list of modules that won't be built
-        # if they are enabled.
-        conf.env['MODULES_NOT_BUILT'].append(module)
-        return missing_boost_libs
-
-    # Required libraries were found, or are not required
-    return missing_boost_libs
-
-def get_boost_libs(libs):
-    names = set()
-    for lib in libs:
-        if lib.startswith("boost_"):
-            lib = lib[6:]
-        if lib.endswith("-mt"):
-            lib = lib[:-3]
-        names.add(lib)
-    return names
-
-def configure_boost(conf):
-    conf.to_log('boost: loading conf')
-    conf.load('boost')
-
-    # Find Boost libraries by modules
-    conf.to_log('boost: scanning for required libs')
-    conf.env['REQUIRED_BOOST_LIBS'] = []
-    for modules_dir in ['src', 'contrib']:
-        conf.recurse (modules_dir, name="get_required_boost_libs", mandatory=False)
-    # Check for any required boost libraries
-    if conf.env['REQUIRED_BOOST_LIBS'] is not []:
-        conf.env['REQUIRED_BOOST_LIBS'] = list(set(conf.env['REQUIRED_BOOST_LIBS']))
-        conf.to_log("boost: libs required: %s" % conf.env['REQUIRED_BOOST_LIBS'])
-        conf.check_boost(lib=' '.join (conf.env['REQUIRED_BOOST_LIBS']), mandatory=False, required=False)
-        if not conf.env['LIB_BOOST']:
-            conf.env['LIB_BOOST'] = []
-    else:
-        # Check with no libs, so we find the includes
-        conf.check_boost(mandatory=False, required=False)
-
-    conf.to_log('boost: checking if we should define HAVE_BOOST')
-    if conf.env['INCLUDES_BOOST']:
-        conf.to_log('boost: defining HAVE_BOOST')
-        conf.env.append_value ('CPPFLAGS', '-DHAVE_BOOST')
-
-    # Some boost libraries may have been found.  
-    # Add preprocessor symbols for them
-    conf.to_log('boost: checking which libs are present')
-    if conf.env['LIB_BOOST']:
-        conf.boost_libs = get_boost_libs(conf.env['LIB_BOOST'])
-        for lib in conf.boost_libs:
-            msg='boost: lib present: ' + lib
-            if lib in conf.env['REQUIRED_BOOST_LIBS']:
-                have = '-DHAVE_BOOST_' + lib.upper()
-                conf.to_log('%s, requested, adding %s' % (msg, have))
-                conf.env.append_value('CPPFLAGS', have)
-            else:
-                conf.to_log('%s, not required, ignoring' % msg)
-
-    boost_libs_missing = [lib for lib in conf.env['REQUIRED_BOOST_LIBS'] if lib not in conf.boost_libs]
-    for lib in boost_libs_missing:
-        conf.to_log('boost: lib missing: %s' % lib)
-
-def bld_missing_boost_libs (bld, module, libs):
-    missing_boost_libs = [lib for lib in libs if lib not in bld.boost_libs]
-    return missing_boost_libs
-
-def configure(conf):
-    # Waf does not work correctly if the absolute path contains whitespaces
-    if (re.search(r"\s", os.getcwd ())):
-        conf.fatal('Waf does not support whitespace in the path to current working directory: %s' % os.getcwd())
-
-    conf.load('relocation', tooldir=['waf-tools'])
-
-    # attach some extra methods
-    conf.check_nonfatal = types.MethodType(_check_nonfatal, conf)
-    conf.check_compilation_flag = types.MethodType(_check_compilation_flag, conf)
-    conf.report_optional_feature = types.MethodType(report_optional_feature, conf)
-    conf.check_optional_feature = types.MethodType(check_optional_feature, conf)
-    conf.require_boost_incs = types.MethodType(require_boost_incs, conf)
-    conf.missing_boost_libs = types.MethodType(conf_missing_boost_libs, conf)
-    conf.boost_libs = set()
-    conf.env['NS3_OPTIONAL_FEATURES'] = []
-
-    conf.load('compiler_c')
-    cc_string = '.'.join(conf.env['CC_VERSION'])
-    conf.msg('Checking for cc version',cc_string,'GREEN')
-    conf.load('compiler_cxx')
-    conf.load('cflags', tooldir=['waf-tools'])
-    conf.load('command', tooldir=['waf-tools'])
-    conf.load('gnu_dirs')
-    conf.load('clang_compilation_database', tooldir=['waf-tools'])
-
-    env = conf.env
-
-    if Options.options.enable_gcov:
-        env['GCOV_ENABLED'] = True
-        env.append_value('CCFLAGS', '-fprofile-arcs')
-        env.append_value('CCFLAGS', '-ftest-coverage')
-        env.append_value('CXXFLAGS', '-fprofile-arcs')
-        env.append_value('CXXFLAGS', '-ftest-coverage')
-        env.append_value('LINKFLAGS', '-lgcov')
-        env.append_value('LINKFLAGS', '-coverage')
-
-    if Options.options.build_profile == 'debug':
-        env.append_value('DEFINES', 'NS3_BUILD_PROFILE_DEBUG')
-        env.append_value('DEFINES', 'NS3_ASSERT_ENABLE')
-        env.append_value('DEFINES', 'NS3_LOG_ENABLE')
-
-    if Options.options.build_profile == 'release':
-        env.append_value('DEFINES', 'NS3_BUILD_PROFILE_RELEASE')
-
-    if Options.options.build_profile == 'optimized':
-        env.append_value('DEFINES', 'NS3_BUILD_PROFILE_OPTIMIZED')
-
-    if Options.options.enable_logs:
-        env.append_unique('DEFINES', 'NS3_LOG_ENABLE')
-    if Options.options.enable_asserts:
-        env.append_unique('DEFINES', 'NS3_ASSERT_ENABLE')
-
-    env['PLATFORM'] = sys.platform
-    env['BUILD_PROFILE'] = Options.options.build_profile
-    if Options.options.build_profile == "release":
-        env['BUILD_SUFFIX'] = ''
-    else:
-        env['BUILD_SUFFIX'] = '-'+Options.options.build_profile
-
-    env['APPNAME'] = wutils.APPNAME
-    env['VERSION'] = wutils.VERSION
-
-    if conf.env['CXX_NAME'] in ['gcc']:
-        if tuple(map(int, conf.env['CC_VERSION'])) < gcc_min_version:
-            conf.fatal('gcc version %s older than minimum supported version %s' %
-                       ('.'.join(conf.env['CC_VERSION']), '.'.join(map(str, gcc_min_version))))
-
-    if conf.env['CXX_NAME'] in ['gcc', 'icc']:
-        if Options.options.build_profile == 'release':
-            env.append_value('CXXFLAGS', '-fomit-frame-pointer')
-        if Options.options.build_profile == 'optimized':
-            if conf.check_compilation_flag('-march=native'):
-                env.append_value('CXXFLAGS', '-march=native')
-            env.append_value('CXXFLAGS', '-fstrict-overflow')
-            if conf.env['CXX_NAME'] in ['gcc']:
-                env.append_value('CXXFLAGS', '-Wstrict-overflow=2')
-
-        if sys.platform == 'win32':
-            env.append_value("LINKFLAGS", "-Wl,--enable-runtime-pseudo-reloc")
-        elif sys.platform == 'cygwin':
-            env.append_value("LINKFLAGS", "-Wl,--enable-auto-import")
-
-        cxx = env['CXX']
-        cxx_check_libstdcxx = cxx + ['-print-file-name=libstdc++.so']
-        p = subprocess.Popen(cxx_check_libstdcxx, stdout=subprocess.PIPE)
-        libstdcxx_output = maybe_decode(p.stdout.read().strip())
-        libstdcxx_location = os.path.dirname(libstdcxx_output)
-        p.wait()
-        if libstdcxx_location:
-            conf.env.append_value('NS3_MODULE_PATH', libstdcxx_location)
-
-        if Utils.unversioned_sys_platform() in ['linux']:
-            if conf.check_compilation_flag('-Wl,--soname=foo'):
-                env['WL_SONAME_SUPPORTED'] = True
-
-    # bug 2181 on clang warning suppressions
-    if conf.env['CXX_NAME'] in ['clang']:
-        if Utils.unversioned_sys_platform() == 'darwin':
-            if tuple(map(int, conf.env['CC_VERSION'])) >= darwin_clang_version_warn_unused_local_typedefs:
-                env.append_value('CXXFLAGS', '-Wno-unused-local-typedefs')
-
-            if tuple(map(int, conf.env['CC_VERSION'])) >= darwin_clang_version_warn_potentially_evaluated:
-
-                env.append_value('CXXFLAGS', '-Wno-potentially-evaluated-expression')
-
-        else:
-            if tuple(map(int, conf.env['CC_VERSION'])) >= clang_version_warn_unused_local_typedefs:
-
-                env.append_value('CXXFLAGS', '-Wno-unused-local-typedefs')
-
-            if tuple(map(int, conf.env['CC_VERSION'])) >= clang_version_warn_potentially_evaluated:
-                env.append_value('CXXFLAGS', '-Wno-potentially-evaluated-expression')
-
-    env['ENABLE_STATIC_NS3'] = False
-    if Options.options.enable_static:
-        if Utils.unversioned_sys_platform() == 'darwin':
-            if conf.check_compilation_flag(flag=[], linkflags=['-Wl,-all_load']):
-                conf.report_optional_feature("static", "Static build", True, '')
-                env['ENABLE_STATIC_NS3'] = True
-            else:
-                conf.report_optional_feature("static", "Static build", False,
-                                             "Link flag -Wl,-all_load does not work")
-        else:
-            if conf.check_compilation_flag(flag=[], linkflags=['-Wl,--whole-archive,-Bstatic', '-Wl,-Bdynamic,--no-whole-archive']):
-                conf.report_optional_feature("static", "Static build", True, '')
-                env['ENABLE_STATIC_NS3'] = True
-            else:
-                conf.report_optional_feature("static", "Static build", False,
-                                             "Link flag -Wl,--whole-archive,-Bstatic does not work")
-
-    # Checks if environment variable specifies the C++ language standard and/or
-    # if the user has specified the standard via the -cxx-standard argument
-    # to 'waf configure'.  The following precedence and behavior is implemented:
-    # 1) if user does not specify anything, Waf will use the default standard
-    #    configured for ns-3, which is configured below
-    # 2) if user specifies the '-cxx-standard' option, it will be used instead
-    #    of the default.
-    #    Example:  ./waf configure --cxx-standard=-std=c++14
-    # 3) if user specifies the C++ standard via the CXXFLAGS environment
-    #    variable, it will be used instead of the default.
-    #    Example: CXXFLAGS="-std=c++14" ./waf configure
-    # 4) if user specifies both the CXXFLAGS environment variable and the
-    #    -cxx-standard argument, the latter will take precedence and a warning
-    #    will be emitted in the configure output if there were conflicting
-    #    standards between the two.
-    #    Example: CXXFLAGS="-std=c++14" ./waf configure --cxx-standard=-std=c++17
-    #    (in the above scenario, Waf will use c++17 but warn about it)
-    # Note: If the C++ standard is not recognized, configuration will error exit
-    cxx_standard = ""
-    cxx_standard_env = ""
-    for flag in env['CXXFLAGS']:
-        if flag[:5] == "-std=":
-            cxx_standard_env = flag
-
-    if not cxx_standard_env and Options.options.cxx_standard:
-        cxx_standard = Options.options.cxx_standard
-        env.append_value('CXXFLAGS', cxx_standard)
-    elif cxx_standard_env and not Options.options.cxx_standard:
-        cxx_standard = cxx_standard_env
-        # No need to change CXXFLAGS
-    elif cxx_standard_env and Options.options.cxx_standard and cxx_standard_env != Options.options.cxx_standard:
-        Logs.warn("user-specified --cxx-standard (" + 
-            Options.options.cxx_standard + ") does not match the value in CXXFLAGS (" + cxx_standard_env + "); Waf will use the --cxx-standard value")
-        cxx_standard = Options.options.cxx_standard
-        env['CXXFLAGS'].remove(cxx_standard_env)
-        env.append_value('CXXFLAGS', cxx_standard)
-    elif cxx_standard_env and Options.options.cxx_standard and cxx_standard_env == Options.options.cxx_standard:
-        cxx_standard = Options.options.cxx_standard
-        # No need to change CXXFLAGS
-    elif not cxx_standard and not Options.options.cxx_standard:
-        cxx_standard = "-std=c++17"
-        env.append_value('CXXFLAGS', cxx_standard)
-
-    if not conf.check_compilation_flag(cxx_standard):
-        raise Errors.ConfigurationError("Exiting because C++ standard value " + cxx_standard + " is not recognized")
-
-    # Handle boost
-    configure_boost(conf)
-
-    # Set this so that the lists won't be printed at the end of this
-    # configure command.
-    conf.env['PRINT_BUILT_MODULES_AT_END'] = False
-
-    conf.env['MODULES_NOT_BUILT'] = []
-
-    conf.recurse('bindings/python')
-
-    conf.recurse('src')
-    conf.recurse('contrib')
-
-    # Set the list of enabled modules.
-    if Options.options.enable_modules:
-        # Use the modules explicitly enabled.
-        _enabled_mods = []
-        _enabled_contrib_mods = []
-        for mod in Options.options.enable_modules.split(','):
-            if mod in conf.env['NS3_MODULES'] and mod.startswith('ns3-'):
-                _enabled_mods.append(mod)
-            elif 'ns3-' + mod in conf.env['NS3_MODULES']:
-                _enabled_mods.append('ns3-' + mod)
-            elif mod in conf.env['NS3_CONTRIBUTED_MODULES'] and mod.startswith('ns3-'):
-                _enabled_contrib_mods.append(mod)
-            elif 'ns3-' + mod in conf.env['NS3_CONTRIBUTED_MODULES']:
-                _enabled_contrib_mods.append('ns3-' + mod)
-        conf.env['NS3_ENABLED_MODULES'] = _enabled_mods
-        conf.env['NS3_ENABLED_CONTRIBUTED_MODULES'] = _enabled_contrib_mods
-
-    else:
-        # Use the enabled modules list from the ns3 configuration file.
-        if modules_enabled[0] == 'all_modules':
-            # Enable all modules if requested.
-            conf.env['NS3_ENABLED_MODULES'] = conf.env['NS3_MODULES']
-            conf.env['NS3_ENABLED_CONTRIBUTED_MODULES'] = conf.env['NS3_CONTRIBUTED_MODULES']
-        else:
-            # Enable the modules from the list.
-            _enabled_mods = []
-            _enabled_contrib_mods = []
-            for mod in modules_enabled:
-                if mod in conf.env['NS3_MODULES'] and mod.startswith('ns3-'):
-                    _enabled_mods.append(mod)
-                elif 'ns3-' + mod in conf.env['NS3_MODULES']:
-                    _enabled_mods.append('ns3-' + mod)
-                elif mod in conf.env['NS3_CONTRIBUTED_MODULES'] and mod.startswith('ns3-'):
-                    _enabled_contrib_mods.append(mod)
-                elif 'ns3-' + mod in conf.env['NS3_CONTRIBUTED_MODULES']:
-                    _enabled_contrib_mods.append('ns3-' + mod)
-            conf.env['NS3_ENABLED_MODULES'] = _enabled_mods
-            conf.env['NS3_ENABLED_CONTRIBUTED_MODULES'] = _enabled_contrib_mods
-
-    # Add the template module to the list of enabled modules that
-    # should not be built if this is a static build on Darwin.  They
-    # don't work there for the template module, and this is probably
-    # because the template module has no source files.
-    if conf.env['ENABLE_STATIC_NS3'] and sys.platform == 'darwin':
-        conf.env['MODULES_NOT_BUILT'].append('template')
-
-    # Remove these modules from the list of enabled modules.
-    for not_built in conf.env['MODULES_NOT_BUILT']:
-        not_built_name = 'ns3-' + not_built
-        if not_built_name in conf.env['NS3_ENABLED_MODULES']:
-            conf.env['NS3_ENABLED_MODULES'].remove(not_built_name)
-            if not conf.env['NS3_ENABLED_MODULES']:
-                raise WafError('Exiting because the ' + not_built + ' module can not be built and it was the only one enabled.')
-        elif not_built_name in conf.env['NS3_ENABLED_CONTRIBUTED_MODULES']:
-            conf.env['NS3_ENABLED_CONTRIBUTED_MODULES'].remove(not_built_name)
-
-    # for suid bits
-    try:
-        conf.find_program('sudo', var='SUDO')
-    except WafError:
-        pass
-
-    why_not_sudo = "because we like it"
-    if Options.options.enable_sudo and conf.env['SUDO']:
-        env['ENABLE_SUDO'] = True
-    else:
-        env['ENABLE_SUDO'] = False
-        if Options.options.enable_sudo:
-            why_not_sudo = "program sudo not found"
-        else:
-            why_not_sudo = "option --enable-sudo not selected"
-
-    conf.report_optional_feature("ENABLE_SUDO", "Use sudo to set suid bit", env['ENABLE_SUDO'], why_not_sudo)
-
-    # Decide if tests will be built or not.
-    if Options.options.enable_tests:
-        # Tests were explicitly enabled.
-        env['ENABLE_TESTS'] = True
-        why_not_tests = "option --enable-tests selected"
-    elif Options.options.disable_tests:
-        # Tests were explicitly disabled.
-        env['ENABLE_TESTS'] = False
-        why_not_tests = "option --disable-tests selected"
-    else:
-        # Enable tests based on the ns3 configuration file.
-        env['ENABLE_TESTS'] = tests_enabled
-        if config_file_exists:
-            why_not_tests = "based on configuration file"
-        elif tests_enabled:
-            why_not_tests = "defaults to enabled"
-        else:
-            why_not_tests = "defaults to disabled"
-
-    conf.report_optional_feature("ENABLE_TESTS", "Tests", env['ENABLE_TESTS'], why_not_tests)
-
-    # Decide if examples will be built or not.
-    if Options.options.enable_examples:
-        # Examples were explicitly enabled.
-        env['ENABLE_EXAMPLES'] = True
-        why_not_examples = "option --enable-examples selected"
-    elif Options.options.disable_examples:
-        # Examples were explicitly disabled.
-        env['ENABLE_EXAMPLES'] = False
-        why_not_examples = "option --disable-examples selected"
-    else:
-        # Enable examples based on the ns3 configuration file.
-        env['ENABLE_EXAMPLES'] = examples_enabled
-        if config_file_exists:
-            why_not_examples = "based on configuration file"
-        elif examples_enabled:
-            why_not_examples = "defaults to enabled"
-        else:
-            why_not_examples = "defaults to disabled"
-
-    conf.report_optional_feature("ENABLE_EXAMPLES", "Examples", env['ENABLE_EXAMPLES'],
-                                 why_not_examples)
-    try:
-        for dir in os.listdir('examples'):
-            if dir.startswith('.') or dir == 'CVS':
-                continue
-            conf.env.append_value('EXAMPLE_DIRECTORIES', dir)
-    except OSError:
-        return
-
-    env['VALGRIND_FOUND'] = False
-    try:
-        conf.find_program('valgrind', var='VALGRIND')
-        env['VALGRIND_FOUND'] = True
-    except WafError:
-        pass
-
-    # These flags are used for the implicitly dependent modules.
-    if env['ENABLE_STATIC_NS3']:
-        if sys.platform == 'darwin':
-            env.STLIB_MARKER = '-Wl,-all_load'
-        else:
-            env.STLIB_MARKER = '-Wl,--whole-archive,-Bstatic'
-            env.SHLIB_MARKER = '-Wl,-Bdynamic,--no-whole-archive'
-
-
-    have_gsl = conf.check_cfg(package='gsl', args=['--cflags', '--libs'],
-                              uselib_store='GSL', mandatory=False)
-    conf.env['ENABLE_GSL'] = have_gsl
-    conf.report_optional_feature("GSL", "GNU Scientific Library (GSL)",
-                                 conf.env['ENABLE_GSL'],
-                                 "GSL not found")
-
-    conf.find_program('libgcrypt-config', var='LIBGCRYPT_CONFIG', msg="libgcrypt-config", mandatory=False)
-    if env.LIBGCRYPT_CONFIG:
-        conf.check_cfg(path=env.LIBGCRYPT_CONFIG, msg="Checking for libgcrypt", args='--cflags --libs', package='',
-                                     define_name="HAVE_GCRYPT", global_define=True, uselib_store='GCRYPT', mandatory=False)
-    conf.report_optional_feature("libgcrypt", "Gcrypt library",
-                                 conf.env.HAVE_GCRYPT, "libgcrypt not found: you can use libgcrypt-config to find its location.")
-
-    why_not_desmetrics = "defaults to disabled"
-    if Options.options.enable_desmetrics:
-        conf.env['ENABLE_DES_METRICS'] = True
-        env.append_value('DEFINES', 'ENABLE_DES_METRICS')
-        why_not_desmetrics = "option --enable-des-metrics selected"
-    conf.report_optional_feature("DES Metrics", "DES Metrics event collection", conf.env['ENABLE_DES_METRICS'], why_not_desmetrics)
-
-
-    # for compiling C code, copy over the CXX* flags
-    conf.env.append_value('CCFLAGS', conf.env['CXXFLAGS'])
-
-    def add_gcc_flag(flag):
-        if env['COMPILER_CXX'] == 'g++' and 'CXXFLAGS' not in os.environ:
-            if conf.check_compilation_flag(flag, mode='cxx'):
-                env.append_value('CXXFLAGS', flag)
-        if env['COMPILER_CC'] == 'gcc' and 'CCFLAGS' not in os.environ:
-            if conf.check_compilation_flag(flag, mode='cc'):
-                env.append_value('CCFLAGS', flag)
-
-    add_gcc_flag('-fstrict-aliasing')
-    add_gcc_flag('-Wstrict-aliasing')
-
-    try:
-        conf.find_program('doxygen', var='DOXYGEN')
-    except WafError:
-        pass
-
-    # append user defined flags after all our ones
-    for (confvar, envvar) in [['CCFLAGS', 'CCFLAGS_EXTRA'],
-                              ['CXXFLAGS', 'CXXFLAGS_EXTRA'],
-                              ['LINKFLAGS', 'LINKFLAGS_EXTRA'],
-                              ['LINKFLAGS', 'LDFLAGS_EXTRA']]:
-        if envvar in os.environ:
-            value = shlex.split(os.environ[envvar])
-            conf.env.append_value(confvar, value)
-
-    print_config(env)
-
-
-class SuidBuild_task(Task.Task):
-    """task that makes a binary Suid
-    """
-    after = ['cxxprogram', 'cxxshlib', 'cxxstlib']
-    def __init__(self, *args, **kwargs):
-        super(SuidBuild_task, self).__init__(*args, **kwargs)
-        self.m_display = 'build-suid'
-        try:
-            program_obj = wutils.find_program(self.generator.name, self.generator.env)
-        except ValueError as ex:
-            raise WafError(str(ex))
-        program_node = program_obj.path.find_or_declare(program_obj.target)
-        self.filename = program_node.get_bld().abspath()
-
-
-    def run(self):
-        print('setting suid bit on executable ' + self.filename, file=sys.stderr)
-        if subprocess.Popen(['sudo', 'chown', 'root', self.filename]).wait():
-            return 1
-        if subprocess.Popen(['sudo', 'chmod', 'u+s', self.filename]).wait():
-            return 1
-        return 0
-
-    def runnable_status(self):
-        "RUN_ME SKIP_ME or ASK_LATER"
-        try:
-            st = os.stat(self.filename)
-        except OSError:
-            return Task.ASK_LATER
-        if st.st_uid == 0:
-            return Task.SKIP_ME
-        else:
-            return Task.RUN_ME
-
-def create_suid_program(bld, name):
-    grp = bld.current_group
-    bld.add_group() # this to make sure no two sudo tasks run at the same time
-    program = bld(features='cxx cxxprogram')
-    program.is_ns3_program = True
-    program.module_deps = list()
-    program.name = name
-    program.target = "%s%s-%s%s" % (wutils.APPNAME, wutils.VERSION, name, bld.env.BUILD_SUFFIX)
-
-    if bld.env['ENABLE_SUDO']:
-        program.create_task("SuidBuild_task")
-
-    bld.set_group(grp)
-
-    return program
-
-def create_ns3_program(bld, name, dependencies=('core',)):
-    program = bld(features='cxx cxxprogram')
-
-    program.is_ns3_program = True
-    program.name = name
-    program.target = "%s%s-%s%s" % (wutils.APPNAME, wutils.VERSION, name, bld.env.BUILD_SUFFIX)
-    # Each of the modules this program depends on has its own library.
-    program.ns3_module_dependencies = ['ns3-'+dep for dep in dependencies]
-    program.includes = Context.out_dir
-    #make a copy here to prevent additions to program.use from polluting program.ns3_module_dependencies
-    program.use = program.ns3_module_dependencies.copy()
-    if program.env['ENABLE_STATIC_NS3']:
-        if sys.platform == 'darwin':
-            program.env.STLIB_MARKER = '-Wl,-all_load'
-        else:
-            program.env.STLIB_MARKER = '-Wl,-Bstatic,--whole-archive'
-            program.env.SHLIB_MARKER = '-Wl,-Bdynamic,--no-whole-archive'
-    else:
-        if program.env.DEST_BINFMT == 'elf':
-            # All ELF platforms are impacted but only the gcc compiler has a flag to fix it.
-            if 'gcc' in (program.env.CXX_NAME, program.env.CC_NAME):
-                program.env.append_value ('SHLIB_MARKER', '-Wl,--no-as-needed')
-
-    return program
-
-def register_ns3_script(bld, name, dependencies=('core',)):
-    ns3_module_dependencies = ['ns3-'+dep for dep in dependencies]
-    bld.env.append_value('NS3_SCRIPT_DEPENDENCIES', [(name, ns3_module_dependencies)])
-
-def add_examples_programs(bld):
-    env = bld.env
-    if env['ENABLE_EXAMPLES']:
-        # Add a define, so this is testable from code
-        env.append_value('DEFINES', 'NS3_ENABLE_EXAMPLES')
-
-        try:
-            for dir in os.listdir('examples'):
-                if dir.startswith('.') or dir == 'CVS':
-                    continue
-                if os.path.isdir(os.path.join('examples', dir)):
-                    bld.recurse(os.path.join('examples', dir))
-        except OSError:
-            return
-
-def add_scratch_programs(bld):
-    all_modules = [mod[len("ns3-"):] for mod in bld.env['NS3_ENABLED_MODULES'] + bld.env['NS3_ENABLED_CONTRIBUTED_MODULES']]
-
-    try:
-        for filename in os.listdir("scratch"):
-            if filename.startswith('.') or filename == 'CVS':
-                continue
-            if os.path.isdir(os.path.join("scratch", filename)):
-                obj = bld.create_ns3_program(filename, all_modules)
-                obj.path = obj.path.find_dir('scratch').find_dir(filename)
-                obj.source = obj.path.ant_glob('*.cc')
-                obj.target = filename
-                obj.name = obj.target
-                obj.install_path = None
-            elif filename.endswith(".cc"):
-                name = filename[:-len(".cc")]
-                obj = bld.create_ns3_program(name, all_modules)
-                obj.path = obj.path.find_dir('scratch')
-                obj.source = filename
-                obj.target = name
-                obj.name = obj.target
-                obj.install_path = None
-    except OSError:
-        return
-
-def _get_all_task_gen(self):
-    for group in self.groups:
-        for taskgen in group:
-            yield taskgen
-
-
-# ok, so WAF does not provide an API to prevent an
-# arbitrary taskgen from running; we have to muck around with
-# WAF internal state, something that might stop working if
-# WAF is upgraded...
-def _exclude_taskgen(self, taskgen):
-    for group in self.groups:
-        for tg1 in group:
-            if tg1 is taskgen:
-                group.remove(tg1)
-                break
-        else:
-            continue
-        break
-
-
-def _find_ns3_module(self, name):
-    for obj in _get_all_task_gen(self):
-        # disable the modules themselves
-        if hasattr(obj, "is_ns3_module") and obj.name == name:
-            return obj
-    raise KeyError(name)
-
-# Parse the waf lockfile generated by latest 'configure' operation
-def get_build_profile(env=None):
-    if env:
-        return Options.options.build_profile
-
-    lockfile = os.environ.get('WAFLOCK', '.lock-waf_%s_build' % sys.platform)
-    with open(lockfile, "r") as f:
-        for line in f:
-            if line.startswith("options ="):
-                _, val = line.split('=', 1)
-                for x in val.split(','):
-                    optkey, optval = x.split(':')
-                    if (optkey.lstrip() == '\'build_profile\''):
-                        return str(optval.lstrip()).replace("'","")
-
-    return "not found"
-
-def build(bld):
-    env = bld.env
-
-    if Options.options.check_config:
-        print_config(env, 'build')
-    else:
-        if Options.options.check_profile:
-            profile = get_build_profile()
-            print("Build profile: %s" % profile)
-
-    if Options.options.check_profile or Options.options.check_config:
-        raise SystemExit(0)
-        return
-
-    # If --enabled-modules option was given, then print a warning
-    # message and exit this function.
-    if Options.options.enable_modules:
-        Logs.warn("No modules were built.  Use waf configure --enable-modules to enable modules.")
-        return
-
-    bld.env['NS3_MODULES_WITH_TEST_LIBRARIES'] = []
-    bld.env['NS3_ENABLED_MODULE_TEST_LIBRARIES'] = []
-    bld.env['NS3_SCRIPT_DEPENDENCIES'] = []
-    bld.env['NS3_RUNNABLE_PROGRAMS'] = []
-    bld.env['NS3_RUNNABLE_SCRIPTS'] = []
-
-    wutils.bld = bld
-    if Options.options.no_task_lines:
-        from waflib import Runner
-        def null_printout(s):
-            pass
-        Runner.printout = null_printout
-
-    Options.cwd_launch = bld.path.abspath()
-    bld.create_ns3_program = types.MethodType(create_ns3_program, bld)
-    bld.register_ns3_script = types.MethodType(register_ns3_script, bld)
-    bld.create_suid_program = types.MethodType(create_suid_program, bld)
-    bld.__class__.all_task_gen = property(_get_all_task_gen)
-    bld.exclude_taskgen = types.MethodType(_exclude_taskgen, bld)
-    bld.find_ns3_module = types.MethodType(_find_ns3_module, bld)
-    bld.missing_boost_libs = types.MethodType(bld_missing_boost_libs, bld)
-
-    # Clean documentation build directories; other cleaning happens later
-    if bld.cmd == 'clean':
-        _cleandocs()
-
-    # Cache available boost lib names
-    bld.boost_libs = set()
-    if bld.env['LIB_BOOST']:
-        bld.boost_libs = get_boost_libs(bld.env['LIB_BOOST'])
-
-
-    # process subfolders from here
-    bld.recurse('src')
-    bld.recurse('contrib')
-
-    # If modules have been enabled, then set lists of enabled modules
-    # and enabled module test libraries.
-    if env['NS3_ENABLED_MODULES'] or env['NS3_ENABLED_CONTRIBUTED_MODULES']:
-
-        modules = env['NS3_ENABLED_MODULES']
-        contribModules = env['NS3_ENABLED_CONTRIBUTED_MODULES']
-
-        # Find out about additional modules that need to be enabled
-        # due to dependency constraints.
-        changed = True
-        while changed:
-            changed = False
-            for module in modules + contribModules:
-                module_obj = bld.get_tgen_by_name(module)
-                if module_obj is None:
-                    raise ValueError("module %s not found" % module)
-                # Each enabled module has its own library.
-                for dep in module_obj.use:
-                    if not dep.startswith('ns3-'):
-                        continue
-                    if dep not in modules and dep not in contribModules:
-                        if dep in env['NS3_MODULES']:
-                            modules.append(dep)
-                            changed = True
-                        elif dep in env['NS3_CONTRIBUTED_MODULES']:
-                            contribModules.append(dep)
-                            changed = True
-                        else:
-                            Logs.error("Error:  Cannot find dependency \'" + dep[4:] + "\' of module \'"
-                                       + module[4:] + "\'; check the module wscript for errors.")
-                            raise SystemExit(1)
-
-        env['NS3_ENABLED_MODULES'] = modules
-
-        env['NS3_ENABLED_CONTRIBUTED_MODULES'] = contribModules
-
-        # If tests are being built, then set the list of the enabled
-        # module test libraries.
-        if env['ENABLE_TESTS']:
-            for (mod, testlib) in bld.env['NS3_MODULES_WITH_TEST_LIBRARIES']:
-                if mod in bld.env['NS3_ENABLED_MODULES'] or mod in bld.env['NS3_ENABLED_CONTRIBUTED_MODULES']:
-                    bld.env.append_value('NS3_ENABLED_MODULE_TEST_LIBRARIES', testlib)
-
-    add_examples_programs(bld)
-    add_scratch_programs(bld)
-
-    if env['NS3_ENABLED_MODULES'] or env['NS3_ENABLED_CONTRIBUTED_MODULES']:
-        modules = env['NS3_ENABLED_MODULES']
-        contribModules = env['NS3_ENABLED_CONTRIBUTED_MODULES']
-
-        # Exclude the programs other misc task gens that depend on disabled modules
-        for obj in list(bld.all_task_gen):
-
-            # check for ns3moduleheader_taskgen
-            if 'ns3moduleheader' in getattr(obj, "features", []):
-                if ("ns3-%s" % obj.module) not in modules and ("ns3-%s" % obj.module) not in contribModules:
-                    obj.mode = 'remove' # tell it to remove headers instead of installing
-
-            # check for programs
-            if hasattr(obj, 'ns3_module_dependencies'):
-                # this is an NS-3 program (bld.create_ns3_program)
-                program_built = True
-                for dep in obj.ns3_module_dependencies:
-                    if dep not in modules and dep not in contribModules: # prog. depends on a module that isn't enabled?
-                        bld.exclude_taskgen(obj)
-                        program_built = False
-                        break
-
-                # Add this program to the list if all of its
-                # dependencies will be built.
-                if program_built:
-                    object_name = "%s%s-%s%s" % (wutils.APPNAME, wutils.VERSION,
-                                                  obj.name, bld.env.BUILD_SUFFIX)
-
-                    # Get the relative path to the program from the
-                    # launch directory.
-                    launch_dir = os.path.abspath(Context.launch_dir)
-                    object_relative_path = os.path.join(
-                        wutils.relpath(obj.path.get_bld().abspath(), launch_dir),
-                        object_name)
-
-                    bld.env.append_value('NS3_RUNNABLE_PROGRAMS', object_relative_path)
-
-            # disable the modules themselves
-            if hasattr(obj, "is_ns3_module") and obj.name not in modules and obj.name not in contribModules:
-                bld.exclude_taskgen(obj) # kill the module
-
-            # disable the module test libraries
-            if hasattr(obj, "is_ns3_module_test_library"):
-                if not env['ENABLE_TESTS'] or ((obj.module_name not in modules) and (obj.module_name not in contribModules)) :
-                    bld.exclude_taskgen(obj) # kill the module test library
-
-            # disable the ns3header_taskgen
-            if 'ns3header' in getattr(obj, "features", []):
-                if ("ns3-%s" % obj.module) not in modules and ("ns3-%s" % obj.module) not in contribModules:
-                    obj.mode = 'remove' # tell it to remove headers instead of installing
-
-            # disable the ns3privateheader_taskgen
-            if 'ns3privateheader' in getattr(obj, "features", []):
-                if ("ns3-%s" % obj.module) not in modules and ("ns3-%s" % obj.module) not in contribModules:
-
-                    obj.mode = 'remove' # tell it to remove headers instead of installing
-
-            # disable pcfile taskgens for disabled modules
-            if 'ns3pcfile' in getattr(obj, "features", []):
-                if obj.module not in bld.env.NS3_ENABLED_MODULES and obj.module not in bld.env.NS3_ENABLED_CONTRIBUTED_MODULES:
-                    bld.exclude_taskgen(obj)
-
-            # disable python bindings for disabled modules
-            if 'pybindgen' in obj.name:
-                if ("ns3-%s" % obj.module) not in modules and ("ns3-%s" % obj.module) not in contribModules:
-                    bld.exclude_taskgen(obj)
-            if 'pyext' in getattr(obj, "features", []):
-                if ("ns3-%s" % obj.module) not in modules and ("ns3-%s" % obj.module) not in contribModules:
-                    bld.exclude_taskgen(obj)
-
-
-    if env['NS3_ENABLED_MODULES']:
-        env['NS3_ENABLED_MODULES'] = list(modules)
-
-    if env['NS3_ENABLED_CONTRIBUTED_MODULES']:
-        env['NS3_ENABLED_CONTRIBUTED_MODULES'] = list(contribModules)
-
-    # Determine which scripts will be runnable.
-    for (script, dependencies) in bld.env['NS3_SCRIPT_DEPENDENCIES']:
-        script_runnable = True
-        for dep in dependencies:
-            if dep not in modules and dep not in contribModules:
-                script_runnable = False
-                break
-
-        # Add this script to the list if all of its dependencies will
-        # be built.
-        if script_runnable:
-            bld.env.append_value('NS3_RUNNABLE_SCRIPTS', script)
-
-    bld.recurse('bindings/python')
-
-    # Process this subfolder here after the lists of enabled modules
-    # and module test libraries have been set.
-    bld.recurse('utils')
-
-    # Set this so that the lists will be printed at the end of this
-    # build command.
-    bld.env['PRINT_BUILT_MODULES_AT_END'] = True
-
-    # Do not print the modules built if build command was "clean"
-    if bld.cmd == 'clean':
-        bld.env['PRINT_BUILT_MODULES_AT_END'] = False
-
-    if Options.options.run:
-        # Check that the requested program name is valid
-        program_name, dummy_program_argv = wutils.get_run_program(Options.options.run, wutils.get_command_template(env))
-
-        # When --run'ing a program, tell WAF to only build that program,
-        # nothing more; this greatly speeds up compilation when all you
-        # want to do is run a test program.
-        Options.options.targets += ',' + os.path.basename(program_name)
-        if getattr(Options.options, "visualize", False):
-            program_obj = wutils.find_program(program_name, bld.env)
-            program_obj.use.append('ns3-visualizer')
-        for gen in bld.all_task_gen:
-            if type(gen).__name__ in ['ns3header_taskgen', 'ns3privateheader_taskgen', 'ns3moduleheader_taskgen']:
-                gen.post()
-
-    if Options.options.run or Options.options.pyrun:
-        bld.env['PRINT_BUILT_MODULES_AT_END'] = False
-
-    if Options.options.doxygen_no_build:
-        _doxygen(bld, skip_pid=True)
-        raise SystemExit(0)
-
-    if Options.options.run_no_build:
-        # Check that the requested program name is valid
-        program_name, dummy_program_argv = wutils.get_run_program(Options.options.run_no_build, wutils.get_command_template(bld.env))
-        # Run the program
-        wutils.run_program(Options.options.run_no_build, bld.env, wutils.get_command_template(bld.env), visualize=Options.options.visualize)
-        raise SystemExit(0)
-
-    if Options.options.pyrun_no_build:
-        wutils.run_python_program(Options.options.pyrun_no_build, bld.env,
-                                  visualize=Options.options.visualize)
-        raise SystemExit(0)
-
-def _cleandir(name):
-    try:
-        shutil.rmtree(name)
-    except:
-        pass
-
-def _cleandocs():
-    _cleandir('doc/html')
-    _cleandir('doc/html-warn')
-    _cleandir('doc/manual/build')
-    _cleandir('doc/manual/source-temp')
-    _cleandir('doc/tutorial/build')
-    _cleandir('doc/models/build')
-    _cleandir('doc/models/source-temp')
-
-# 'distclean' typically only cleans out build/ directory
-# Here we clean out any build or documentation artifacts not in build/
-def distclean(ctx):
-    _cleandocs()
-    # Now call waf's normal distclean
-    Scripting.distclean(ctx)
-
-def shutdown(ctx):
-    bld = wutils.bld
-    if wutils.bld is None:
-        return
-    env = bld.env
-
-    # Only print the lists if a build was done.
-    if (env['PRINT_BUILT_MODULES_AT_END']):
-
-        # Print the list of built modules.
-        print()
-        print('Modules built:')
-        names_without_prefix = []
-        for name in env['NS3_ENABLED_MODULES'] + env['NS3_ENABLED_CONTRIBUTED_MODULES']:
-            name1 = name[len('ns3-'):]
-            if name not in env.MODULAR_BINDINGS_MODULES:
-                name1 += " (no Python)"
-            names_without_prefix.append(name1)
-        print_module_names(names_without_prefix)
-        print()
-
-        # Print the list of enabled modules that were not built.
-        if env['MODULES_NOT_BUILT']:
-            print('Modules not built (see ns-3 tutorial for explanation):')
-            print_module_names(env['MODULES_NOT_BUILT'])
-            print()
-
-        # Set this so that the lists won't be printed until the next
-        # build is done.
-        bld.env['PRINT_BUILT_MODULES_AT_END'] = False
-
-    # Write the build status file.
-    build_status_file = os.path.join(bld.out_dir, 'build-status.py')
-    with open(build_status_file, 'w') as out:
-        out.write('#! /usr/bin/env python3\n')
-        out.write('\n')
-        out.write('# Programs that are runnable.\n')
-        out.write('ns3_runnable_programs = ' + str(env['NS3_RUNNABLE_PROGRAMS']) + '\n')
-        out.write('\n')
-        out.write('# Scripts that are runnable.\n')
-        out.write('ns3_runnable_scripts = ' + str(env['NS3_RUNNABLE_SCRIPTS']) + '\n')
-        out.write('\n')
-
-    if Options.options.lcov_report:
-        lcov_report(bld)
-
-    if Options.options.lcov_zerocounters:
-        lcov_zerocounters(bld)
-
-    if Options.options.run:
-        wutils.run_program(Options.options.run, env, wutils.get_command_template(env),
-                           visualize=Options.options.visualize)
-        raise SystemExit(0)
-
-    if Options.options.pyrun:
-        wutils.run_python_program(Options.options.pyrun, env,
-                                  visualize=Options.options.visualize)
-        raise SystemExit(0)
-
-    if Options.options.shell:
-        raise WafError("Please run `./waf shell' now, instead of `./waf --shell'")
-
-    if Options.options.check:
-        raise WafError("Please run `./test.py' now, instead of `./waf --check'")
-
-    check_shell(bld)
-
-
-
-class CheckContext(Context.Context):
-    """run the equivalent of the old ns-3 unit tests using test.py"""
-    cmd = 'check'
-    def execute(self):
-        # first we execute the build
-        bld = Context.create_context("build")
-        bld.options = Options.options # provided for convenience
-        bld.cmd = "build"
-        bld.execute()
-
-        wutils.bld = bld
-        wutils.run_python_program("test.py -n -c core", bld.env)
-
-def check_shell(bld):
-    if ('NS3_MODULE_PATH' not in os.environ) or ('NS3_EXECUTABLE_PATH' not in os.environ):
-        return
-    env = bld.env
-    correct_modpath = os.pathsep.join(env['NS3_MODULE_PATH'])
-    found_modpath = os.environ['NS3_MODULE_PATH']
-    correct_execpath = os.pathsep.join(env['NS3_EXECUTABLE_PATH'])
-    found_execpath = os.environ['NS3_EXECUTABLE_PATH']
-    if (found_modpath != correct_modpath) or (correct_execpath != found_execpath):
-        msg = ("Detected shell (./waf shell) with incorrect configuration\n"
-               "=========================================================\n"
-               "Possible reasons for this problem:\n"
-               "  1. You switched to another ns-3 tree from inside this shell\n"
-               "  2. You switched ns-3 debug level (waf configure --debug)\n"
-               "  3. You modified the list of built ns-3 modules\n"
-               "You should correct this situation before running any program.  Possible solutions:\n"
-               "  1. Exit this shell, and start a new one\n"
-               "  2. Run a new nested shell")
-        raise WafError(msg)
-
-
-class Ns3ShellContext(Context.Context):
-    """run a shell with an environment suitably modified to run locally built programs"""
-    cmd = 'shell'
-
-    def execute(self):
-        # first we execute the build
-        bld = Context.create_context("build")
-        bld.options = Options.options # provided for convenience
-        bld.cmd = "build"
-        bld.execute()
-
-        # Set this so that the lists won't be printed when the user
-        # exits the shell.
-        bld.env['PRINT_BUILT_MODULES_AT_END'] = False
-
-        if sys.platform == 'win32':
-            shell = os.environ.get("COMSPEC", "cmd.exe")
-        else:
-            shell = os.environ.get("SHELL", "/bin/sh")
-
-        env = bld.env
-        os_env = {
-            'NS3_MODULE_PATH': os.pathsep.join(env['NS3_MODULE_PATH']),
-            'NS3_EXECUTABLE_PATH': os.pathsep.join(env['NS3_EXECUTABLE_PATH']),
-            }
-        wutils.run_argv([shell], env, os_env)
-
-
-def _print_introspected_doxygen(bld):
-    env = wutils.bld.env
-    proc_env = wutils.get_proc_env()
-    try:
-        program_obj = wutils.find_program('print-introspected-doxygen', env)
-    except ValueError:
-        Logs.warn("print-introspected-doxygen does not exist")
-        raise SystemExit(1)
-        return
-
-    prog = program_obj.path.find_or_declare(program_obj.target).get_bld().abspath()
-
-    if not os.path.exists(prog):
-        Logs.error("print-introspected-doxygen has not been built yet."
-                   " You need to build ns-3 at least once before "
-                   "generating doxygen docs...")
-        raise SystemExit(1)
-
-    Logs.info("Running print-introspected-doxygen")
-
-    # Create a header file with the introspected information.
-    with open(os.path.join('doc', 'introspected-doxygen.h'), 'w') as doxygen_out:
-        if subprocess.Popen([prog], stdout=doxygen_out, env=proc_env).wait():
-            raise SystemExit(1)
-
-    # Create a text file with the introspected information.
-    with open(os.path.join('doc', 'ns3-object.txt'), 'w') as text_out:
-        if subprocess.Popen([prog, '--output-text'], stdout=text_out, env=proc_env).wait():
-            raise SystemExit(1)
-
-    # Gather the CommandLine doxy
-    # test.py appears not to create or keep the output directory
-    # if no real tests are run, so we just stuff all the
-    # .command-line output files into testpy-output/
-    # NS_COMMANDLINE_INTROSPECTION=".." test.py --nowaf --constrain=example
-    Logs.info("Running CommandLine introspection")
-    proc_env['NS_COMMANDLINE_INTROSPECTION'] = '..'
-    subprocess.run(["./test.py", "--nowaf", "--constrain=example"],
-                   env=proc_env, stdout=subprocess.DEVNULL)
-
-    doxygen_out = os.path.join('doc', 'introspected-command-line.h')
-    try:
-        os.remove(doxygen_out)
-    except OSError as e:
-        pass
-
-    with open(doxygen_out, 'w') as out_file:
-        lines="""
-/* This file is automatically generated by
-CommandLine::PrintDoxygenUsage() from the CommandLine configuration
-in various example programs.  Do not edit this file!  Edit the
-CommandLine configuration in those files instead.
-*/\n
-"""
-        out_file.write(lines)
-
-    with open(doxygen_out,'a') as outfile:
-        for in_file in glob.glob('testpy-output/*.command-line'):
-            with open(in_file,'r') as infile:
-                outfile.write(infile.read())
-
-def _doxygen(bld, skip_pid=False):
-    env = wutils.bld.env
-    proc_env = wutils.get_proc_env()
-
-    if not env['DOXYGEN']:
-        Logs.error("waf configure did not detect doxygen in the system -> cannot build api docs.")
-        raise SystemExit(1)
-        return
-
-    if not skip_pid:
-        _print_introspected_doxygen(bld)
-
-    _getVersion()
-    doxygen_config = os.path.join('doc', 'doxygen.conf')
-    if subprocess.Popen(env['DOXYGEN'] + [doxygen_config]).wait():
-        Logs.error("Doxygen build returned an error.")
-        raise SystemExit(1)
-
-def _docset(bld):
-    # Get the doxygen config
-    doxyfile = os.path.join('doc', 'doxygen.conf')
-    Logs.info("docset: reading " + doxyfile)
-    with open(doxyfile, 'r') as doxygen_config:
-        doxygen_config_contents = doxygen_config.read()
-
-    # Create the output directory
-    docset_path = os.path.join('doc', 'docset')
-    Logs.info("docset: checking for output directory " + docset_path)
-    if not os.path.exists(docset_path):
-        Logs.info("docset: creating output directory " + docset_path)
-        os.mkdir(docset_path)
-
-    doxyfile = os.path.join('doc', 'doxygen.docset.conf')
-    with open(doxyfile, 'w') as doxygen_config:
-        Logs.info("docset: writing doxygen conf " + doxyfile)
-        doxygen_config.write(doxygen_config_contents)
-        doxygen_config.write(
-            """
-            HAVE_DOT = NO
-            GENERATE_DOCSET = YES
-            DISABLE_INDEX = YES
-            SEARCHENGINE = NO
-            GENERATE_TREEVIEW = NO
-            OUTPUT_DIRECTORY=""" + docset_path + "\n"
-            )
-
-    # Run Doxygen manually, so as to avoid build
-    Logs.info("docset: running doxygen")
-    env = wutils.bld.env
-    _getVersion()
-    if subprocess.Popen(env['DOXYGEN'] + [doxyfile]).wait():
-        Logs.error("Doxygen docset build returned an error.")
-        raise SystemExit(1)
-
-    # Build docset
-    docset_path = os.path.join(docset_path, 'html')
-    Logs.info("docset: Running docset Make")
-    if subprocess.Popen(["make"], cwd=docset_path).wait():
-        Logs.error("Docset make returned and error.")
-        raise SystemExit(1)
-
-    # Additional steps from
-    #   https://github.com/Kapeli/Dash-User-Contributions/tree/master/docsets/ns-3
-    docset_out = os.path.join(docset_path, 'org.nsnam.ns3.docset')
-    icons = os.path.join('doc', 'ns3_html_theme', 'static')
-    shutil.copy(os.path.join(icons, 'ns-3-bars-16x16.png'),
-                os.path.join(docset_out, 'icon.png'))
-    shutil.copy(os.path.join(icons, 'ns-3-bars-32x32.png'),
-                os.path.join(docset_out, 'icon@x2.png'))
-    shutil.copy(os.path.join(docset_path, 'Info.plist'),
-                os.path.join(docset_out, 'Contents'))
-    shutil.move(docset_out, os.path.join('doc', 'ns-3.docset'))
-
-    print("Docset built successfully.")
-
-
-def _getVersion():
-    """update the ns3_version.js file, when building documentation"""
-
-    prog = "doc/ns3_html_theme/get_version.sh"
-    if subprocess.Popen([prog]).wait() :
-        Logs.error(prog + " returned an error")
-        raise SystemExit(1)
-
-class Ns3DoxygenContext(Context.Context):
-    """do a full build, generate the introspected doxygen and then the doxygen"""
-    cmd = 'doxygen'
-    def execute(self):
-        # first we execute the build
-        bld = Context.create_context("build")
-        bld.options = Options.options # provided for convenience
-        bld.cmd = "build"
-        bld.execute()
-        _doxygen(bld)
-
-class Ns3SphinxContext(Context.Context):
-    """build the Sphinx documentation: manual, tutorial, models"""
-
-    cmd = 'sphinx'
-
-    def sphinx_build(self, path):
-        print()
-        print("[waf] Building sphinx docs for " + path)
-        if subprocess.Popen(["make", "SPHINXOPTS=-N", "-k",
-                             "html", "singlehtml", "latexpdf" ],
-                            cwd=path).wait() :
-            Logs.error("Sphinx build of " + path + " returned an error.")
-            raise SystemExit(1)
-
-    def execute(self):
-        _getVersion()
-        for sphinxdir in ["manual", "models", "tutorial"] :
-            self.sphinx_build(os.path.join("doc", sphinxdir))
-
-
-class Ns3DocContext(Context.Context):
-    """build all the documentation: doxygen, manual, tutorial, models"""
-
-    cmd = 'docs'
-
-    def execute(self):
-        steps = ['doxygen', 'sphinx']
-        Options.commands = steps + Options.commands
-
-
-def lcov_report(bld):
-    env = bld.env
-
-    if not env['GCOV_ENABLED']:
-        raise WafError("project not configured for code coverage;"
-                       " reconfigure with --enable-gcov")
-    try:
-        subprocess.call(["lcov", "--help"], stdout=subprocess.DEVNULL)
-    except OSError as e:
-        if e.errno == os.errno.ENOENT:
-            raise WafError("Error: lcov program not found")
-        else:
-            raise
-    try:
-        subprocess.call(["genhtml", "--help"], stdout=subprocess.DEVNULL)
-    except OSError as e:
-        if e.errno == os.errno.ENOENT:
-            raise WafError("Error: genhtml program not found")
-        else:
-            raise
-    os.chdir(out)
-    try:
-        lcov_report_dir = 'lcov-report'
-        create_dir_command = "rm -rf " + lcov_report_dir
-        create_dir_command += " && mkdir " + lcov_report_dir + ";"
-
-        if subprocess.Popen(create_dir_command, shell=True).wait():
-            raise SystemExit(1)
-
-        info_file = os.path.join(lcov_report_dir, 'report.info')
-        lcov_command = "lcov -c -d . -o " + info_file
-        lcov_command += " -b " + os.getcwd()
-        if subprocess.Popen(lcov_command, shell=True).wait():
-            raise SystemExit(1)
-
-        genhtml_command = "genhtml -o " + lcov_report_dir
-        genhtml_command += " " + info_file
-        if subprocess.Popen(genhtml_command, shell=True).wait():
-            raise SystemExit(1)
-    finally:
-        os.chdir("..")
-
-def lcov_zerocounters(bld):
-    env = bld.env
-
-    if not env['GCOV_ENABLED']:
-        raise WafError("project not configured for code coverage;"
-                       " reconfigure with --enable-gcov")
-    try:
-        subprocess.call(["lcov", "--help"], stdout=subprocess.DEVNULL)
-    except OSError as e:
-        if e.errno == os.errno.ENOENT:
-            raise WafError("Error: lcov program not found")
-        else:
-            raise
-
-    os.chdir(out)
-    lcov_clear_command = "lcov -d . --zerocounters"
-    if subprocess.Popen(lcov_clear_command, shell=True).wait():
-        raise SystemExit(1)
-    os.chdir("..")
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.35/wutils.py ns-3.36/wutils.py
--- ns-3.35/wutils.py	2021-10-01 13:26:48.000000000 -0700
+++ ns-3.36/wutils.py	1969-12-31 16:00:00.000000000 -0800
@@ -1,260 +0,0 @@
-import os
-import os.path
-import re
-import sys
-import subprocess
-import shlex
-
-# WAF modules
-from waflib import Options, Utils, Logs, TaskGen, Build, Context
-from waflib.Errors import WafError
-
-# these are set from the main wscript file
-APPNAME=None
-VERSION=None
-bld=None
-
-
-
-def get_command_template(env, arguments=()):
-    cmd = Options.options.command_template or '%s'
-    for arg in arguments:
-        cmd = cmd + " " + arg
-    return cmd
-
-
-if hasattr(os.path, "relpath"):
-    relpath = os.path.relpath # since Python 2.6
-else:
-    def relpath(path, start=os.path.curdir):
-        """Return a relative version of a path"""
-
-        if not path:
-            raise ValueError("no path specified")
-
-        start_list = os.path.abspath(start).split(os.path.sep)
-        path_list = os.path.abspath(path).split(os.path.sep)
-
-        # Work out how much of the filepath is shared by start and path.
-        i = len(os.path.commonprefix([start_list, path_list]))
-
-        rel_list = [os.path.pardir] * (len(start_list)-i) + path_list[i:]
-        if not rel_list:
-            return os.path.curdir
-        return os.path.join(*rel_list)
-
-
-def find_program(program_name, env):
-    launch_dir = os.path.abspath(Context.launch_dir)
-    #top_dir = os.path.abspath(Options.cwd_launch)
-    found_programs = []
-    for obj in bld.all_task_gen:
-        if not getattr(obj, 'is_ns3_program', False):
-            continue
-
-        ## filter out programs not in the subtree starting at the launch dir
-        if not (obj.path.abspath().startswith(launch_dir)
-                or obj.path.get_bld().abspath().startswith(launch_dir)):
-            continue
-        
-        name1 = obj.name
-        name2 = os.path.join(relpath(obj.path.abspath(), launch_dir), obj.name)
-        names = [name1, name2]
-        found_programs.extend(names)
-        if program_name in names:
-            return obj
-    raise ValueError("program '%s' not found; available programs are: %r"
-                     % (program_name, found_programs))
-
-def get_proc_env(os_env=None):
-    env = bld.env
-    if sys.platform == 'linux2' or sys.platform == 'linux':
-        pathvar = 'LD_LIBRARY_PATH'
-    elif sys.platform == 'darwin':
-        pathvar = 'DYLD_LIBRARY_PATH'
-    elif sys.platform == 'win32':
-        pathvar = 'PATH'
-    elif sys.platform == 'cygwin':
-        pathvar = 'PATH'
-    elif sys.platform.startswith('freebsd'):
-        pathvar = 'LD_LIBRARY_PATH'
-    else:
-        Logs.warn(("Don't know how to configure "
-                        "dynamic library path for the platform %r;"
-                        " assuming it's LD_LIBRARY_PATH.") % (sys.platform,))
-        pathvar = 'LD_LIBRARY_PATH'        
-
-    proc_env = dict(os.environ)
-    if os_env is not None:
-        proc_env.update(os_env)
-
-    if pathvar is not None:
-        if pathvar in proc_env:
-            proc_env[pathvar] = os.pathsep.join(list(env['NS3_MODULE_PATH']) + [proc_env[pathvar]])
-        else:
-            proc_env[pathvar] = os.pathsep.join(list(env['NS3_MODULE_PATH']))
-
-    pymoddir = bld.path.find_dir('bindings/python').get_bld().abspath()
-    pyvizdir = bld.path.find_dir('src/visualizer').abspath()
-    if 'PYTHONPATH' in proc_env:
-        proc_env['PYTHONPATH'] = os.pathsep.join([pymoddir, pyvizdir] + [proc_env['PYTHONPATH']])
-    else:
-        proc_env['PYTHONPATH'] = os.pathsep.join([pymoddir, pyvizdir])
-
-    if 'PATH' in proc_env:
-        proc_env['PATH'] = os.pathsep.join(list(env['NS3_EXECUTABLE_PATH']) + [proc_env['PATH']])
-    else:
-        proc_env['PATH'] = os.pathsep.join(list(env['NS3_EXECUTABLE_PATH']))
-
-    return proc_env
-
-def run_argv(argv, env, os_env=None, cwd=None, force_no_valgrind=False):
-    proc_env = get_proc_env(os_env)
-
-    if Options.options.valgrind and Options.options.command_template:
-        raise WafError("Options --command-template and --valgrind are conflicting")
-    if Options.options.gdb and Options.options.command_template:
-        raise WafError("Options --command-template and --gdb are conflicting")
-    if Options.options.gdb and Options.options.valgrind:
-        raise WafError("Options --valgrind and --gdb are conflicting")
-
-    if Options.options.gdb:
-        argv = ["gdb", "--args"] + argv
-        proc = subprocess.Popen(argv, env=proc_env, cwd=cwd)
-        retval = proc.wait()
-        return retval
-    elif Options.options.valgrind and not force_no_valgrind:
-        if not env['VALGRIND']:
-            raise WafError("valgrind is not installed")
-        # Use the first program found in the env['VALGRIND'] list
-        argv = [env['VALGRIND'][0], "--leak-check=full", "--show-reachable=yes", "--error-exitcode=1"] + argv
-        proc = subprocess.Popen(argv, env=proc_env, cwd=cwd, stderr=subprocess.PIPE)
-        stderrdata = proc.communicate()[1]
-        stderrdata = stderrdata.decode('utf-8')
-        error = False
-        for line in stderrdata:
-            sys.stderr.write(line)
-            if "== LEAK SUMMARY" in line:
-                error = True
-        retval = proc.wait()
-        if retval == 0 and error:
-            retval = 1
-    else:
-        try:
-            WindowsError
-        except NameError:
-            retval = subprocess.Popen(argv, env=proc_env, cwd=cwd).wait()
-        else:
-            try:
-                retval = subprocess.Popen(argv, env=proc_env, cwd=cwd).wait()
-            except WindowsError as ex:
-                raise WafError("Command %s raised exception %s" % (argv, ex))
-    if retval:
-        signame = None
-        if retval < 0: # signal?
-            import signal
-            for name, val in vars(signal).items():
-                if len(name) > 3 and name[:3] == 'SIG' and name[3] != '_':
-                    if val == -retval:
-                        signame = name
-                        break
-        if signame:
-            raise WafError("Command %s terminated with signal %s."
-                                 " Run it under a debugger to get more information "
-                                 "(./waf --run <program> --gdb\")." % (argv, signame))
-        else:
-            raise WafError("Command %s exited with code %i" % (argv, retval))
-    return retval
-
-def get_run_program(program_string, command_template=None):
-    """
-    Return the program name and argv of the process that would be executed by
-    run_program(program_string, command_template).
-    """
-    #print "get_run_program_argv(program_string=%r, command_template=%r)" % (program_string, command_template)
-    env = bld.env
-
-    if command_template in (None, '%s'):
-        argv = shlex.split(program_string)
-        #print "%r ==shlex.split==> %r" % (program_string, argv)
-        program_name = argv[0]
-        
-        # if the script name ends with .cc - strip it
-        if program_name.endswith('.cc'):
-            program_name = program_name.rsplit('.', 1)[0]
-
-        try:
-            program_obj = find_program(program_name, env)
-        except ValueError as ex:
-            raise WafError(str(ex))
-
-        program_node = program_obj.path.find_or_declare(program_obj.target)
-        #try:
-        #    program_node = program_obj.path.find_build(ccroot.get_target_name(program_obj))
-        #except AttributeError:
-        #    raise Utils.WafError("%s does not appear to be a program" % (program_name,))
-
-        execvec = [program_node.abspath()] + argv[1:]
-
-    else:
-
-        program_name = program_string
-        
-        # if the script name ends with .cc - strip it
-        if program_name.endswith('.cc'):
-            program_name = program_name.rsplit('.', 1)[0]
-
-        try:
-            program_obj = find_program(program_name, env)
-        except ValueError as ex:
-            raise WafError(str(ex))
-
-        program_node = program_obj.path.find_or_declare(program_obj.target)
-        #try:
-        #    program_node = program_obj.path.find_build(ccroot.get_target_name(program_obj))
-        #except AttributeError:
-        #    raise Utils.WafError("%s does not appear to be a program" % (program_name,))
-
-        tmpl = command_template % (program_node.abspath(),)
-        execvec = shlex.split(tmpl.replace('\\', '\\\\'))
-        #print "%r ==shlex.split==> %r" % (command_template % (program_node.abspath(env),), execvec)
-    return program_name, execvec
-
-def run_program(program_string, env, command_template=None, cwd=None, visualize=False):
-    """
-    if command_template is not None, then program_string == program
-    name and argv is given by command_template with %s replaced by the
-    full path to the program.  Else, program_string is interpreted as
-    a shell command with first name being the program name.
-    """
-    dummy_program_name, execvec = get_run_program(program_string, command_template)
-    if cwd is None:
-        if (Options.options.cwd_launch):
-            cwd = Options.options.cwd_launch
-        else:
-            cwd = Options.cwd_launch
-    if visualize:
-        execvec.append("--SimulatorImplementationType=ns3::VisualSimulatorImpl")
-    return run_argv(execvec, env, cwd=cwd)
-
-
-
-def run_python_program(program_string, env, visualize=False):
-    env = bld.env
-    execvec = shlex.split(program_string)
-    if (Options.options.cwd_launch):
-        cwd = Options.options.cwd_launch
-    else:
-        cwd = Options.cwd_launch
-    if visualize:
-        execvec.append("--SimulatorImplementationType=ns3::VisualSimulatorImpl")
-    return run_argv([env['PYTHON'][0]] + execvec, env, cwd=cwd)
-
-
-def uniquify_list(seq):
-    """Remove duplicates while preserving order
-       From Dave Kirby http://www.peterbe.com/plog/uniqifiers-benchmark
-    """
-    seen = set()
-    return [ x for x in seq if x not in seen and not seen.add(x)]
-
